2016-08-25 9 views
9

매우 오래된 libc 버전의 임베디드 시스템에 대한 라이브러리 의존성이없는 컬 (curl)의 독립형 버전을 빌드하고 싶습니다 (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) 

당신은 근본 원인 문제의 어떤 생각을 가지고 있습니까?

EDIT 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에서 유래 : 기호는이다

W 약한 기호 그쪽으로 t에는 특별히 약한 객체 심볼 인 으로 태그가 지정되지 않았습니다. 약한 정의 기호가 일반 정의 기호와 연결된 경우 오류없이 일반 정의 기호가 사용됩니다. 정의되지 않은 약한 심볼이 링크되고 심볼이 이 아닌 경우 약한 심볼의 값은 오류없이 0이됩니다.

편집 3 : 나는 getpwuid에 대해 동일한 경고를 가지고 있지만 바이너리가 작동 연결하는 SSL 제거하는 경우 :

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

을하지만 문제 때문에 HTTPS 지원을 위해 SSL을 추가해야 아직도 열려 있습니다.

편집 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

오픈 소스 https://www.openssl.org/의 소스 개발 버전을 가져 와서 정적 연결을 위해 다시 컴파일하십시오 ('.so'대신 '.a'로 끝남). 그런 다음 Curl을 다시 빌드하고 빌드 한 openssl 정적 라이브러리에 연결하십시오.

당신은 libssl이 문제를 일으키고 있지만, 그것이 유일한 라이브러리는 아님을 알고 있습니다.문제가되는 다음 라이브러리를 찾으면 소스 개발 버전을 가져 와서 정적 링크를 위해 다시 빌드하십시오.