Статическая компиляция wget

Я загрузил исходный код wget и попробовал статическую компиляцию. Это следующие шаги:

./configure LDFLAGS=-static 

В конце показан результат:

  Version: 1.17 Host OS: linux-gnu Install prefix: /usr/local Compiler: gcc CFlags: -I/usr/include/p11-kit-1 -DHAVE_LIBGNUTLS -DNDEBUG LDFlags: -static Libs: -lpcre -lgnutls -lz SSL: gnutls Zlib: yes PSL: no Digest: yes NTLM: auto OPIE: yes Debugging: yes Assertions: no Valgrind: Valgrind testing not enabled Metalink: no GPGME: no 

Затем я использовал make . Это выдает длинный список ошибок. Вот выдержка:

 init.o: In function `home_dir': init.c:(.text+0x2bc): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking host.o: In function `getaddrinfo_with_timeout_callback': host.c:(.text+0x495): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/libgnutls.a(gnutls_mpi.o): In function `_gnutls_x509_read_int': (.text+0x6af): undefined reference to `asn1_read_value' /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/libgnutls.a(gnutls_mpi.o): In function `_gnutls_x509_read_int': . . (.text+0x1a7a): undefined reference to `pthread_mutex_lock' /usr/lib/gcc/i686-linux-gnu/4.8/libgcc_eh.a(unwind-dw2-fde-dip.o): In function `_Unwind_Find_FDE': (.text+0x1ac9): undefined reference to `pthread_mutex_unlock' collect2: error: ld returned 1 exit status make[3]: *** [wget] Error 1 make[2]: *** [all] Error 2 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2 

Кто-нибудь сталкивался с подобной проблемой? Если да, отправьте решение. заранее спасибо

Для статической привязки ld не будет выполнять автоматический поиск зависимостей для wget как это магически для общих объектов. Некоторые сценарии пытаются сделать такой список для вас, другие нет. Вы попадаете в последний случай.

Вам нужно самому составить список библиотек и их зависимостей.

Если вы еще не знаете, что такое полный список депов для вашего статического двоичного wget , вам нужно сначала его создать как обычный (общий), а затем получить такой список с помощью ldd /path/to/wget , где /path/to/wget – ваш встроенный двоичный файл wget (он может быть найден внутри исходного дерева, обычно что-то вроде src/wget )

Вам нужно будет получить все статические версии разделяемых библиотек. Они обычно содержатся в пакетах -dev или devel, предоставляемых вашим дистрибутивом.

Каждая библиотека в списке должна быть перегруппирована или добавлена ​​дважды или более раз, потому что ld не пытается искать все статические архивы для определенного символа и ошибок. Итак, ваш libgnutls.a, вероятно, зависит от libtasn1.a для символов asn1_ *. Затем вам нужно добавить это в командную строку: -lgnutls -ltasn1 . Если тогда еще одна библиотека зависит от libtasn1.a, вам нужно добавить ее снова в командную строку ссылки.

Неопределенные символы могут быть разрешены путем поиска в списке символов статической библиотеки с nm /usr/lib/lib.a . Или найти эту библиотеку в определенном каталоге с fgrep -l symbol_name /usr/lib/*.a . Обратите внимание, что такой поиск (с помощью fgrep) покажет обе библиотеки, которые требуют и предоставляют такой символ, поэтому это всего лишь быстрый тест.

Библиотеки могут быть добавлены с помощью LIBS= variable для configure скрипта: LIBS="-lgnutls -ltasn1" .