programing

-static-libgcc -static-libstdc++를 사용하여 컴파일해도 여전히 libc.so 에 대한 동적 종속성이 발생합니다.

yellowcard 2023. 11. 1. 22:15
반응형

-static-libgcc -static-libstdc++를 사용하여 컴파일해도 여전히 libc.so 에 대한 동적 종속성이 발생합니다.

가능한 한 휴대가 가능한 실행 파일을 만들려고 합니다.몇 가지 종속성을 제거한 후, 다른 시스템에서 바이너리를 실행할 때 다음을 보게 되었습니다.

/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by foob)

나는 내 바이너리가 사용자에게 libc 버전을 업그레이드할 필요가 없기를 원하므로 이 의존성도 제거하고 싶습니다.

위의 바이너리를 생성한 링커 플래그는 이미 포함되어 있습니다.-static-libgcc -static-libstdc++. 공유 libc.so .6에서 바이너리가 여전히 요구하는 이유는 무엇입니까?

제가 추가를 해봤습니다.-static플래그도 마찬가지입니다. 하지만 이 이진을 실행하려고 하면 결과가 매우 이상합니다.

$ ls -l foob
-rwxr-xr-x 1 claudiu claudiu 13278191 Oct 10 13:03 foob
$ ./foob
bash: ./foob: No such file or directory

무엇을 해야 하나?

편집:

$ file foob
foob: ELF 64-bit LSB  executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=5adee9a598b9261a29f1c7b0ffdadcfc72197cd7, not stripped
$ strace -f ./foob
execve("./foob", ["./foob"], [/* 64 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1)                           = ?
+++ exited with 1 +++

흥미롭게도, 만약 내가ldd없는 버전 -static, 버전보다 두 개 적은 엔트리를 가지고 있습니다.-static, 즉,

libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4f420c1000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4f41636000)

GNU libc는 정적으로 연결되도록 설계되지 않았습니다.중요한 기능, 예를 들어.gethostbyname그리고.iconv, 정적 이진에서 오작동하거나 전혀 작동하지 않습니다.비록 정적 연결의 요점이 그러한 의존성을 피하는 것이지만, 어떤 상황에서는 정적 바이너리가 동적으로 열리고 사용하려고 시도할 것입니다.

대신 uClibcmusllibc에 대한 프로그램을 컴파일해야 합니다.

(이것은 적어도 15년 동안 사실이었습니다.)

먼저 libc가 커널 버전과 같은 시스템의 다른 부분에 의존할 수 있기 때문에 libc의 정적 링크가 프로그램의 이식성을 향상시키지 못할 수 있음을 유의해야 합니다.

-static을 사용하여 완전한 정적 링크를 시도하려면 트릭을 사용해야 합니다.사용한 모든 라이브러리의 정적 버전이 설치되어 있는 경우.

다음을 사용하여 프로그램에 링크된 정적 라이브러리만 있는지 확인할 수 있습니다.

ldd binary_name

편집:

이 문제를 디버깅하는 데 유용한 정보를 제공하는 또 다른 방법은 링커 플래그에 --verbose를 추가하는 것입니다.

언급URL : https://stackoverflow.com/questions/26304531/compiling-with-static-libgcc-static-libstdc-still-results-in-dynamic-depende

반응형