2016-08-25 3 views
9

Я хотел бы создать автономную версию `curl без какой-либо зависимости библиотеки (даже libc) для встроенной системы с очень старой версией libc.Сделать автономные завитки для segfault

С текущего завитка GitHub, настроить компиляцию с помощью следующей команды:

./configure --disable-shared --enable-static-nss --prefix=/tmp/curl LDFLAGS='-static -static-libgcc -Wl,-Bstatic -lc' LIBS='-lc -lssl -lcrypto -lz -ldl' 
[...] 
curl version:  7.50.2-DEV 
    Host setup:  x86_64-pc-linux-gnu 
    Install prefix: /tmp/curl 
    Compiler:   gcc 
    SSL support:  enabled (OpenSSL) 
    SSH support:  no  (--with-libssh2) 
    zlib support:  enabled 
    GSS-API support: no  (--with-gssapi) 
    TLS-SRP support: enabled 
    resolver:   default (--enable-ares/--enable-threaded-resolver) 
    IPv6 support:  enabled 
    Unix sockets support: enabled 
    IDN support:  no  (--with-{libidn,winidn}) 
    Build libcurl: Shared=no, Static=yes 
    Built-in manual: enabled 
    --libcurl option: enabled (--disable-libcurl-option) 
    Verbose errors: enabled (--disable-verbose) 
    SSPI support:  no  (--enable-sspi) 
    ca cert bundle: /etc/ssl/certs/ca-certificates.crt 
    ca cert path:  no 
    ca fallback:  no 
    LDAP support:  no  (--enable-ldap/--with-ldap-lib/--with-lber-lib) 
    LDAPS support: no  (--enable-ldaps) 
    RTSP support:  enabled 
    RTMP support:  no  (--with-librtmp) 
    metalink support: no  (--with-libmetalink) 
    PSL support:  no  (libpsl not found) 
    HTTP2 support: disabled (--with-nghttp2) 
    Protocols:  DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS POP3 POP3S RTSP SMB SMBS SMTP SMTPS TELNET TFTP 

Затем в течение make фазы, я получаю следующие предупреждения:

curl-tool_homedir.o: In function `homedir': 
tool_homedir.c:(.text+0x60): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
../lib/.libs/libcurl.a(libcurl_la-netrc.o): In function `Curl_parsenetrc': 
netrc.c:(.text+0x3c3): warning: Using 'getpwuid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
../lib/.libs/libcurl.a(libcurl_la-curl_addrinfo.o): In function `Curl_getaddrinfo_ex': 
curl_addrinfo.c:(.text+0x73): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libcrypto.a(fips.o): In function `verify_checksums': 
(.text+0x4e6): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 

Я могу продолжать и выполнять make install для получения окончательного двоичного кода.

Двоичное не имеет зависимости:

$ ldd /tmp/curl/bin/curl 
    not a dynamic executable 
$ nm /tmp/curl/bin/curl | grep " U " 
$ 

Но двоичный файл не работает вообще:

$ /tmp/curl/bin/curl -version 
Segmentation fault (core dumped) 

Есть ли у вас какие-либо идеи о проблеме первопричины?

РЕДАКТИРОВАТЬ 1: GDB выход:

(gdb) run 
Starting program: /tmp/curl/bin/curl 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000000000 in ??() 

EDIT 2:

$ nm /tmp/curl/bin/curl | grep getpwuid 
0000000000655770 T getpwuid 
00000000006558f0 T __getpwuid_r 
00000000006558f0 W getpwuid_r 
00000000006558f0 T __new_getpwuid_r 
0000000000663cf0 T __nscd_getpwuid_r 

Может быть, этот вопрос происходит от W:

Вт Символ является слабый символ tha t не был отмечен как символ слабого объекта. Когда слабый определенный символ связан с нормальным символом , нормальный определенный символ используется без ошибки . Когда связывается слабый неопределенный символ, а символ не равен , значение слабого символа становится равным нулю без ошибок.

EDIT 3: Если удалить SSL, связывающий я получил такое же предупреждение для getpwuid но двоичный работают:

./configure --disable-shared --enable-static-nss --prefix=/tmp/curl LDFLAGS='-static -static-libgcc -Wl,-Bstatic,-lc' 

ldd /tmp/curl/bin/curl 
    not a dynamic executable 
/tmp/curl/bin/curl --version 
curl 7.50.2-DEV (x86_64-pc-linux-gnu) libcurl/7.50.2-DEV zlib/1.2.8 
Protocols: dict file ftp gopher http imap pop3 rtsp smtp telnet tftp 
Features: IPv6 Largefile libz UnixSockets 

nm /tmp/curl/bin/curl | grep getpwuid 
00000000004f52d0 T getpwuid 
00000000004f5450 T __getpwuid_r 
00000000004f5450 W getpwuid_r 
00000000004f5450 T __new_getpwuid_r 
0000000000502cd0 T __nscd_getpwuid_r 

Но мне нужно, чтобы добавить SSL для поддержки HTTPS поэтому вопрос остается открытым.

EDIT 4: вопрос непосредственно связан с nss. Странная точка заключается в том, что ./configure --prefix=/tmp/curl --disable-shared --enable-static-nss LDFLAGS='-static -static-libgcc -Wl,-Bstatic' LIBS='-ls' создает рабочий автономный исполняемый файл, но без SSL. Проблемы с nss связаны с привязкой SSL.

+0

попытайтесь его отладить. У вас будет представление о том, что происходит. –

+0

Ну, я подозреваю, что проблема с ссылкой, но как я могу глубже отлаживаться? – Julio

+0

просто 'gdb/tmp/curl/bin/curl'. Но вы можете быть правы. У вас есть более одного компилятора в вашей системе? –

ответ

1

Потяните в исходную версию версии openssl https://www.openssl.org/ и перекомпилируйте ее для статической связи (заканчивается на .a вместо ".so"). Затем перестройте curl, связавшись со статической библиотекой openssl, которую вы создали.

Вы знаете, что libssl дает вам проблемы, но это может быть не единственная библиотека.Когда вы найдете следующую библиотеку, которая дает вам проблемы, сделайте то же самое для нее: вставьте исходную версию разработки и перестройте ее для статической привязки.

Смежные вопросы