2014-10-05 1 views
1

나는 다음과 같은 내용으로 디렉토리가 있습니다libc.so.2는/usr/lib에 있어야합니까?

bin/busybox 
lib/ld-linux.so.2 
lib/libc.so.6 

를 내가 호출 할 때 :

chroot . bin/busybox sh 

다음과 같은 실패 :

내가 lib 디렉토리/libc의 이동
/bin/busybox: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory 

. usr/lib에 so.6이 있으면 잘 작동합니다.

libc가/usr/lib에 있어야하는 이유는 무엇입니까? 내가 호출 할 때 :

objcdump -p bin/busybox | grep NEEDED 

를 내가 얻을 : 라이브러리 만 불리는이로드는 표준 폴더에서 찾을 수있을 것입니다 슬래시 등없이 사용되는

NEEDED  libc.so.6 

그래서 내가 생각 , 이는/lib 및/usr/lib입니다. 외관상으로는, 이것은 사실이 아니다.

더욱 혼란 문제를하려면 LD-linux.so.2와 그것이는/usr/lib 디렉토리로 이동하면 때문에/lib에 할 것 같다,는 chroot는 실패 :

chroot: failed to run command '/bin/busybox': No such file or directory 

하는 I 배운 것은 실제로는 로더가 발견되지 않고 busybox 바이너리가 아닌 오류입니다.

libc.so.2 배포판과 관련된 문제가 있습니까? 이것이 중요한 경우, 저는 아치 리눅스를 사용하고 있습니다.

+1

컴파일 할 때 LD_RUN_PATH를 설정하거나 실행 전에 LD_LIBRARY_PATH를 내보내 라이브러리 검색 경로를 설정하십시오. – camelccc

+0

또는 ln-s /lib/libc.so.6 /usr/lib/libc.so.6 – yoK0

+0

을 실행 해 주셔서 감사합니다. 이러한 방법으로 문제를 해결할 수 있습니다 (디렉토리에 파일을 보관하여 모든 작업을 수행 할 수 있음). 그러나 원래의 동작을 설명하지는 마십시오. – wujek

답변

3

로더의 위치 (일반적으로 /lib/ld-linux.so 등)는 이진 코드에 하드 코딩되어 있습니다. 이 구성 요소에 대한 검색 프로세스가 없습니다. 찾을 수 없으면 이진이 전혀 실행되지 않습니다.

는 (정확한 경로는. 당신이 사용중인 libc의 및 아키텍처에 따라 그것은 예를 들어, x86_64의에 glibc에 대한 /lib64/ld-linux-x86-64.so.2에 있습니다.)

동적 라이브러리를 검색 할 것입니다 위치는 /etc/ld.so.conf에서 구성 할 수 있습니다. 하지만 chroot에 해당 파일이 없다면 표준 경로 중 일부가 구성되지 않을 수 있습니다!

+0

하드 코드 된 로더가 .interp 헤더 섹션에 저장되어 있습니까? .interp 섹션에 실제로 로더 코드가 있지만. 예, ld.so.conf가 없습니다. 나는/lib와/usr/lib가 기본 기본값이라고 생각했다. 즉, 다른 것이 정의되어 있지 않아도 사용 중이다. – wujek

+0

로더 경로는 로더 코드가 아닌'.interp' 섹션에 저장됩니다. (내 시스템에서는 로더가 디스크에 약 150K로되어있어 모든 바이너리에 포함하기에 다소 크기가 크다.) – duskwuff

+0

필자는 8 ld.so라는 사람의 말에 혼란스러워했다. (...) .interp 섹션 (...)에 저장 됨 링커가 임의의 코드로 대체 될 수 있음을 읽었습니다. 따라서 왜곡되지 않은 바이너리에서 ldd를 호출하면 위험 할 수 있습니다. 그러한 교체가 단지 로더의 위치를 ​​대체합니까? 상대 경로를 수용합니까? – wujek

관련 문제