curl - rizadora - Hacer rizos independientes lleva a segfault
rizador profesional (1)
Me gustaría construir una versión independiente de `curl sin ninguna dependencia de biblioteca (incluso libc) para un sistema incrustado con una versión muy antigua de libc.
Desde curl github actual, configuro la compilación con este comando:
./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
Luego, durante la fase de creación, recibo las siguientes advertencias:
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
Puedo continuar y realizar la make install
para obtener el binario final.
El binario no tiene dependencia:
$ ldd /tmp/curl/bin/curl
not a dynamic executable
$ nm /tmp/curl/bin/curl | grep " U "
$
Pero el binario no funciona en absoluto:
$ /tmp/curl/bin/curl -version
Segmentation fault (core dumped)
¿Tiene alguna idea del problema de la causa raíz?
EDIT 1: salida de GDB:
(gdb) run
Starting program: /tmp/curl/bin/curl
Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
EDICION 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
Tal vez el problema proviene de W
:
W El símbolo es un símbolo débil que no ha sido etiquetado específicamente como un símbolo de objeto débil. Cuando un símbolo definido débil está vinculado con un símbolo definido normal, el símbolo definido normal se utiliza sin error. Cuando un símbolo indefinido débil está vinculado y el símbolo no está definido, el valor del símbolo débil se convierte en cero sin error.
EDIT 3: Si getpwuid
el enlace SSL recibí la misma advertencia para getpwuid
pero el binario está funcionando:
./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
Pero necesito agregar SSL para compatibilidad con HTTPS, por lo que el problema sigue abierto.
EDIT 4: El problema está directamente relacionado con nss
. Un punto extraño es que ./configure --prefix=/tmp/curl --disable-shared --enable-static-nss LDFLAGS=''-static -static-libgcc -Wl,-Bstatic'' LIBS=''-ls''
produce un trabajo independiente ejecutable pero sin SSL. Los problemas nss
se deben a la vinculación SSL.
Ingrese la versión de desarrollo fuente de openssl https://www.openssl.org/ y recompilela para enlaces estáticos (finaliza con ''.a'' en lugar de ''.so''). A continuación, reconstruya Curl, vinculándolo a la biblioteca estática de openssl que ha creado.
Sabes que libssl te está dando problemas, pero puede que no sea la única biblioteca que lo es. Cuando encuentre la siguiente biblioteca que le está dando problemas, haga lo mismo con ella: extraiga la versión de desarrollo fuente y vuelva a generarla para la vinculación estática.