curl - Rendre une boucle autonome entraîne une erreur de segmentation



gcc segmentation-fault (1)

Je voudrais construire une version autonome de `curl sans aucune dépendance de bibliothèque (même libc) pour un système embarqué avec une très ancienne version de libc.

À partir de github curl actuel, je configure la compilation avec cette commande:

./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

Puis, pendant la phase de make , j'obtiens les avertissements suivants:

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

Je peux continuer et exécuter make install pour obtenir le binaire final.

Le binaire n'a aucune dépendance:

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

Mais le binaire ne fonctionne pas du tout:

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

Avez-vous une idée de la cause de la cause?

EDIT 1: sortie 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

Peut-être que le problème vient de W :

W Le symbole est un symbole faible qui n'a pas été spécifiquement identifié comme un symbole d'objet faible. Lorsqu'un symbole défini faible est lié à un symbole défini normal, le symbole défini normal est utilisé sans erreur. Lorsqu'un symbole faible non défini est lié et que le symbole n'est pas défini, la valeur du symbole faible devient nulle sans erreur.

EDIT 3: Si je supprime le lien SSL j'ai reçu le même avertissement pour getpwuid mais le binaire fonctionne:

./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

Mais j'ai besoin d'ajouter le protocole SSL pour le support HTTPS, donc le problème est toujours ouvert.

EDIT 4: Le problème est directement lié à nss . Le point étrange est que ./configure --prefix=/tmp/curl --disable-shared --enable-static-nss LDFLAGS='-static -static-libgcc -Wl,-Bstatic' LIBS='-ls' produit un exécutable autonome mais sans SSL. Les problèmes nss sont dus à la liaison SSL.


Tirez dans la version de développement source de openssl https://www.openssl.org/ et recompilez-le pour le lien statique (se termine par un '.a' au lieu d'un '.so'). Recréez ensuite curl en créant une liaison avec la bibliothèque statique openssl que vous avez créée.

Vous savez que libssl vous donne des problèmes, mais ce n'est peut-être pas la seule bibliothèque qui soit. Lorsque vous trouvez la prochaine librairie qui vous pose problème, faites la même chose: récupérez la version de développement source et reconstruisez-la pour la liaison statique.





ldd