C - Dynami c соединение успешно, но Stati c не будет - PullRequest
1 голос
/ 30 марта 2020

Я компилирую пример для IUP графический инструментарий на Linux Debian 10. Я скачал пример и сохранил его под main.c. Как вы можете видеть, если перейти по ссылке #include директивы препроцессора выглядят так:

#include <stdlib.h>
#include <stdio.h>
#include <iup.h>

Я написал make-файл, который используется для создания динамически связанного исполняемого или статически связанного исполняемого файла:

#############################################################################################################

dynamic:

    gcc -liup -o dynamic.elf main.c

#############################################################################################################

static: static.o

    ld -e main -o static.elf static.o \
        -l:libiup.a \
        -lgtk-3 \
        -lgdk-3 \
        -lpangocairo-1.0 \
        -lX11 \
        -lcairo \
        -lgdk_pixbuf-2.0 \
        -lm \
        -lpango-1.0 \
        -lgobject-2.0 \
        -lglib-2.0 \
        -lpthread \
        -lc

static.o: main.c

    gcc -c -Wall -Wpedantic -o static.o main.c

#############################################################################################################

Теперь, если я запускаю make, используя make dynamic, исполняемый файл компилируется и работает без проблем. Он связан со многими общими библиотеками:

ziga@ziga-laptop:2020-03-26--example-a$ ldd dynamic.elf 
    linux-vdso.so.1 (0x00007ffd413cf000)
    libiup.so => /lib/libiup.so (0x00007f4ecb4be000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4ecb2fd000)
    libgtk-3.so.0 => /lib/x86_64-linux-gnu/libgtk-3.so.0 (0x00007f4ecac0c000)
    libgdk-3.so.0 => /lib/x86_64-linux-gnu/libgdk-3.so.0 (0x00007f4ecab10000)
    libpangocairo-1.0.so.0 => /lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007f4ecab00000)
    libcairo.so.2 => /lib/x86_64-linux-gnu/libcairo.so.2 (0x00007f4eca9e0000)
    libgdk_pixbuf-2.0.so.0 => /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007f4eca9b8000)
    libpango-1.0.so.0 => /lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f4eca96d000)
    libgobject-2.0.so.0 => /lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f4eca918000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f4eca7f9000)
    libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007f4eca6b8000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4eca535000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f4ecb85f000)
    libgmodule-2.0.so.0 => /lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f4eca52d000)
    libXi.so.6 => /lib/x86_64-linux-gnu/libXi.so.6 (0x00007f4eca31d000)
    libXcomposite.so.1 => /lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007f4eca11a000)
    libXdamage.so.1 => /lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f4eca115000)
    libXfixes.so.3 => /lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f4ec9f0f000)
    libcairo-gobject.so.2 => /lib/x86_64-linux-gnu/libcairo-gobject.so.2 (0x00007f4ec9f03000)
    libatk-1.0.so.0 => /lib/x86_64-linux-gnu/libatk-1.0.so.0 (0x00007f4ec9ed8000)
    libatk-bridge-2.0.so.0 => /lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0 (0x00007f4ec9ea3000)
    libxkbcommon.so.0 => /lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007f4ec9e61000)
    libwayland-cursor.so.0 => /lib/x86_64-linux-gnu/libwayland-cursor.so.0 (0x00007f4ec9e57000)
    libwayland-egl.so.1 => /lib/x86_64-linux-gnu/libwayland-egl.so.1 (0x00007f4ec9e52000)
    libwayland-client.so.0 => /lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007f4ec9e41000)
    libepoxy.so.0 => /lib/x86_64-linux-gnu/libepoxy.so.0 (0x00007f4ec9d0d000)
    libgio-2.0.so.0 => /lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007f4ec9b4f000)
    libharfbuzz.so.0 => /lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f4ec9a54000)
    libpangoft2-1.0.so.0 => /lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007f4ec9a3b000)
    libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f4ec99f5000)
    libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f4ec9939000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4ec9916000)
    libXinerama.so.1 => /lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f4ec9911000)
    libXrandr.so.2 => /lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f4ec9706000)
    libXcursor.so.1 => /lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f4ec96f9000)
    libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x00007f4ec94e7000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f4ec94db000)
    libpixman-1.so.0 => /lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007f4ec9435000)
    libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f4ec93fc000)
    libxcb-shm.so.0 => /lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f4ec93f7000)
    libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f4ec93cd000)
    libxcb-render.so.0 => /lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f4ec93be000)
    libXrender.so.1 => /lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f4ec91b2000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f4ec8f94000)
    libthai.so.0 => /lib/x86_64-linux-gnu/libthai.so.0 (0x00007f4ec8f89000)
    libfribidi.so.0 => /lib/x86_64-linux-gnu/libfribidi.so.0 (0x00007f4ec8f6c000)
    libffi.so.6 => /lib/x86_64-linux-gnu/libffi.so.6 (0x00007f4ec8f62000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f4ec8eec000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4ec8ee7000)
    libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f4ec8e94000)
    libatspi.so.0 => /lib/x86_64-linux-gnu/libatspi.so.0 (0x00007f4ec8e60000)
    libmount.so.1 => /lib/x86_64-linux-gnu/libmount.so.1 (0x00007f4ec8e01000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f4ec8bd7000)
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f4ec8bbd000)
    libgraphite2.so.3 => /lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f4ec8b90000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f4ec8b53000)
    libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f4ec8b4a000)
    libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007f4ec8944000)
    libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f4ec873e000)
    libdatrie.so.1 => /lib/x86_64-linux-gnu/libdatrie.so.1 (0x00007f4ec8734000)
    libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f4ec8693000)
    libblkid.so.1 => /lib/x86_64-linux-gnu/libblkid.so.1 (0x00007f4ec863e000)
    libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f4ec8622000)
    liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f4ec85fa000)
    liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f4ec85db000)
    libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f4ec84bd000)
    libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f4ec849a000)

Когда я запускаю make static, он компилируется, но во время выполнения программа говорит:

ziga@ziga-laptop:2020-03-26--example-a$ ./static.elf 
bash: ./static.elf: No such file or directory

Пока программа есть и имеет +x Права:

ziga@ziga-laptop:2020-03-26--example-a$ ls -la | grep static.elf
-rwxr-xr-x 1 ziga ziga 1072080 Mar 30 22:36 static.elf

Так программа static.elf связана с общими объектами (libiup.so больше не присутствует, так как мы связались со стати c версия libiup.a) :

ziga@ziga-laptop:2020-03-26--example-a$ ldd static.elf 
    linux-vdso.so.1 (0x00007ffc73500000)
    libgtk-3.so.0 => /lib/x86_64-linux-gnu/libgtk-3.so.0 (0x00007f17f7e4d000)
    libgdk-3.so.0 => /lib/x86_64-linux-gnu/libgdk-3.so.0 (0x00007f17f7d51000)
    libpangocairo-1.0.so.0 => /lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007f17f7d41000)
    libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007f17f7c00000)
    libcairo.so.2 => /lib/x86_64-linux-gnu/libcairo.so.2 (0x00007f17f7ae0000)
    libgdk_pixbuf-2.0.so.0 => /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007f17f7aba000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f17f7935000)
    libpango-1.0.so.0 => /lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f17f78ea000)
    libgobject-2.0.so.0 => /lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f17f7895000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f17f7776000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f17f7755000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f17f7594000)
    libgmodule-2.0.so.0 => /lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f17f758c000)
    libXi.so.6 => /lib/x86_64-linux-gnu/libXi.so.6 (0x00007f17f737c000)
    libXcomposite.so.1 => /lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007f17f7179000)
    libXdamage.so.1 => /lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f17f7174000)
    libXfixes.so.3 => /lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f17f6f6e000)
    libcairo-gobject.so.2 => /lib/x86_64-linux-gnu/libcairo-gobject.so.2 (0x00007f17f6f62000)
    libatk-1.0.so.0 => /lib/x86_64-linux-gnu/libatk-1.0.so.0 (0x00007f17f6f37000)
    libatk-bridge-2.0.so.0 => /lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0 (0x00007f17f6f02000)
    libxkbcommon.so.0 => /lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007f17f6ec0000)
    libwayland-cursor.so.0 => /lib/x86_64-linux-gnu/libwayland-cursor.so.0 (0x00007f17f6eb6000)
    libwayland-egl.so.1 => /lib/x86_64-linux-gnu/libwayland-egl.so.1 (0x00007f17f6eb1000)
    libwayland-client.so.0 => /lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007f17f6ea0000)
    libepoxy.so.0 => /lib/x86_64-linux-gnu/libepoxy.so.0 (0x00007f17f6d6c000)
    libgio-2.0.so.0 => /lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007f17f6bae000)
    libharfbuzz.so.0 => /lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f17f6ab3000)
    libpangoft2-1.0.so.0 => /lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007f17f6a9a000)
    libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f17f6a54000)
    libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f17f6998000)
    libXinerama.so.1 => /lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f17f6991000)
    libXrandr.so.2 => /lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f17f6786000)
    libXcursor.so.1 => /lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f17f6779000)
    libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x00007f17f6567000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f17f655d000)
    libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f17f6531000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f17f652c000)
    libpixman-1.so.0 => /lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007f17f6486000)
    libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f17f644d000)
    libxcb-shm.so.0 => /lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f17f6448000)
    libxcb-render.so.0 => /lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f17f6439000)
    libXrender.so.1 => /lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f17f622d000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f17f600f000)
    /lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x00007f17f8576000)
    libthai.so.0 => /lib/x86_64-linux-gnu/libthai.so.0 (0x00007f17f6004000)
    libfribidi.so.0 => /lib/x86_64-linux-gnu/libfribidi.so.0 (0x00007f17f5fe7000)
    libffi.so.6 => /lib/x86_64-linux-gnu/libffi.so.6 (0x00007f17f5fdd000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f17f5f67000)
    libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f17f5f14000)
    libatspi.so.0 => /lib/x86_64-linux-gnu/libatspi.so.0 (0x00007f17f5ee0000)
    libmount.so.1 => /lib/x86_64-linux-gnu/libmount.so.1 (0x00007f17f5e81000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f17f5c59000)
    libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f17f5c3d000)
    libgraphite2.so.3 => /lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f17f5c10000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f17f5bd3000)
    libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f17f5bca000)
    libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007f17f59c6000)
    libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f17f57be000)
    libdatrie.so.1 => /lib/x86_64-linux-gnu/libdatrie.so.1 (0x00007f17f57b4000)
    libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f17f5713000)
    libblkid.so.1 => /lib/x86_64-linux-gnu/libblkid.so.1 (0x00007f17f56be000)
    libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f17f56a4000)
    liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f17f567a000)
    liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f17f565b000)
    libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f17f553d000)
    libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f17f551a000)

Если кто-нибудь подскажет, что мне здесь не хватает, чтобы запустить программу, я был бы очень рад. Я хочу использовать ld отдельно.


Как предложено, я добавляю вывод из strace:

ziga@ziga-laptop:2020-03-26--example-a$ strace ./static.elf 
execve("./static.elf", ["./static.elf"], 0x7ffcb3bec860 /* 31 vars */) = -1 ENOENT (No such file or directory)
strace: exec: No such file or directory
+++ exited with 1 +++

и readelf:

ziga@ziga-laptop:2020-03-26--example-a$ readelf -a static.elf | grep interpreter
      [Requesting program interpreter: /lib/ld64.so.1]

Решение - но не совсем то, что я хочу

Рабочий раздел makefile для статической компоновки следующий:

gcc main.c -o static.elf -Wl,-Bstatic -liup -Wl,-Bdynamic \
    -lc \
    -lgtk-3 \
    -lgdk-3 \
    -lpangocairo-1.0 \
    -lX11 \
    -lcairo \
    -lgdk_pixbuf-2.0 \
    -lm \
    -lpango-1.0 \
    -lgobject-2.0 \
    -lglib-2.0 \
    -lpthread

, но он не использует ld, и я хочу чтобы знать, почему ld не может связаться ...

1 Ответ

1 голос
/ 31 марта 2020

Используйте gcc, чтобы связать, и используйте -Wl,-Bstatic, чтобы указать компоновщику, чтобы он предпочитал связываться со стати c библиотеками, а не с общими. Пример:

gcc main.c -o static.elf -Wl,-Bstatic -lgtk-3 -lgdk-3 ...

Статически можно также выборочно ссылаться только на некоторые библиотеки, используя -Wl,-Bdynamic:

gcc main.c -o static.elf -Wl,-Bstatic -lgtk-3 -lgdk-3 -Wl,-Bdynamic -lX11 ...

Это будет ссылаться на общую библиотеку X11, но связывать gtk и gdk статически. Вы можете переключаться между -Wl,-Bstatic и -Wl,-Bdynamic так часто, как хотите.

Наконец, обратите внимание, что если библиотека предоставляет только файл .a, но не .so, то вам на самом деле не нужно использовать -Wl,-Bstatic. Компоновщик автоматически статически связывает файл .a, так как это единственный выбор.

...