programing

getaddrinfo를 사용하여 정적으로 연결된 이진을 생성하시겠습니까?

oldcodes 2023. 8. 2. 09:22
반응형

getaddrinfo를 사용하여 정적으로 연결된 이진을 생성하시겠습니까?

헤더를 포함했습니다.netdb.h,어디에getaddrinfo에 포함되지만 gcc는 다음 경고를 표시합니다.

warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

gcc -m32 -static -s -O2 -std=c99 -D_POSIX_C_SOURCE=200112L myprogram.c

누락된 파일을 정적으로 컴파일하려면 어떻게 해야 합니까?

가능한 해결책:

  1. glibc 설치에 정적 컴파일에 필요한 해당 개체 파일이 없을 수 있습니다.그런 경우 해당 개체 파일을 생성하고 컴파일 시 연결합니다.

  2. glibc 대신 EGLIBC를 사용해 보십시오.

  3. 나는 오류 없이 컴파일된 dietlibc로 프로그램을 성공적으로 컴파일했고 결과 이진수는 glibc가 만드는 것보다 훨씬 작았습니다.

glibc는 libnss를 사용하여 주소 확인 서비스를 위한 여러 공급자를 지원합니다.로컬 시스템의 구성에 따라 로드되는 공급자가 정확히 다르기 때문에 libnss를 정적으로 연결할 수 없습니다.

musl 라이브러리를 사용하여 glibc를 대체할 수 있습니다.musl을 사용하려면 musl-gcc를 사용하여 소프트웨어를 설치하고 빌드하거나 musl을 사용하는 Linux 배포판을 사용할 수 있습니다.Alpine Linux.

저의 경우 시간을 절약하기 위해 Alpine Linux를 선택하여 프로그램을 구축했습니다(https://github.com/zhanxw/rvtests), 은 여러 컴파일러(gcc, g++ 및 gfortran)를 구축하고 싶지 않기 때문입니다.

특정 기능은 런타임에 문제를 해결하기 위해 동적 로더에 의존한다고 생각합니다.안타깝게도 정적 링크는 더 이상 실용적이지 않습니다. http://people.redhat.com/drepper/no_static_linking.html

또 다른 해결책은 누락된 파일을 찾아 해당 파일이 누락된 디렉터리에 대한 심볼 링크를 사용하는 것입니다.예를 들어.

제 특정 시나리오에서, 저는 실종되었습니다./usr/lib/x86_64-linux-gnu/libm-2.31.a하지만 우리는 그 파일들이 실제로 위치하고 있다는 것을 발견했습니다./usr/x86_64-linux-gnu/lib/libm-2.31.a대신에 (그lib이동됨).누락된 파일에 대한 심볼 링크를 만드는 것이 효과적이었습니다.

ln -s /usr/x86_64-linux-gnu/lib/* /usr/lib/x86_64-linux-gnu/

언급URL : https://stackoverflow.com/questions/2725255/create-statically-linked-binary-that-uses-getaddrinfo

반응형