2011-11-04 3 views
6

다음은 내가 가지고있는 시나리오입니다.chroot는 동적 연결에 어떤 영향을 줍니까?

debootstrap 우분투 (64 비트) 환경을 만들었습니다. 나는 우분투 (64 비트) 명쾌한 시스템에 /env/mav/에 그것을 배치했다. 나는 chroot/env/mav에 넣을 수 있으며 완벽한 시스템을 완벽하게 활용할 수 있습니다.

심지어 chrooted 환경 밖에서 명쾌한 프로그램을 사용할 수 있습니다. 즉 /env/mav/bin/ls이 실행됩니다.

그러나, 나는 LD_LIBRARY_PATH를 수정하면 될 것으로 나타났습니다 /env/mav/lib [1] [2] 나는 즉시 충돌합니다 실행

모든 단일 프로그램 (맑은와 코디 모두). (예 : ls로 인해 segfault가 발생 함). kern.log 보여줍니다 : 그러나

segfault at 7fece284aa18 ip 00007fece284aa18 sp 00007fff32028158 error 15 

, 모든 프로그램이 잘 실행되고 명확 I chroot/env/mav로합니다. 그리고 모든 도서관이 투옥 된 도서관에서 읽히지 않고 있습니까 (/env/mav) /lib? 이 문맥에서 과 수정하는 사람 LD_LIBRARY_PATH의 차이점은 무엇입니까? 내가 경우

또한, :

mount -B /env /env/mav/env 

다음 chroot /env 다음 설정 LD_LIBRARY_PATH/env/mav/lib로, 모든 여전히 잘 실행됩니다.

나는 내부적으로 어떤 일이 벌어지고 있는지를 놓치고 있습니다. 어떤 ld 내부가 어딘가에 저장되어 있습니까? chroot는 마술 같은 것을합니까?

[1] 유즈넷 환경의 프로그램을 독립 실행 형 감옥 외부의 독립 라이브러리에 동적으로 링크하는 사용 사례가 있습니다.

[2] 이것은 단지 간략한 예입니다. 실제로는 /usr/lib 등이 모두 포함됩니다. 각별한 환경/lib에 "독극물"을 포함한 모든 것; 다른 독립 라이브러리 디렉토리를 사용하는 데 문제가 없습니다.

답변

6

LD_LIBRARY_PATH는 프로그램/라이브러리 ld-linux.so의 옵션입니다. 이 라이브러리는 다이나믹 링커입니다. 그것은 경로 "/lib/ld-linux.so.2"은 (거의) 우분투의 ELF 헤더 (INTREP 필드)의 모든 동적 링크 된 프로그램에 하드 코드되어 있습니다. 나는 리눅스 커널이 바이너리 파일을 실행할 때, LD_LIBRARY_PATH의 특별한 의미에 대해 아무것도 모른다는 것을 의미한다.

그래서, 당신은

LD_LIBRARY_PATH=/env/mav/ /env/mav/bin/ls 

실행할 때 루트 시스템의를 /lib/ld-linux.so.2이 사용되며 다음은 무엇 $LD_LIBRARY_PATH ENV 변수가 (당신이 볼 수 사용하여 동적 라이브러리를 해결하기 위해 노력할 것입니다 LD_DEBUG=all env 변수를 사용하여 goind)

chroot를 수행 할 때, maverick의 /lib/ld-linux.so.2이 사용됩니다. 내가 생각

는 사이에 호환성에있을 수 있습니다 호스트 시스템의 ld-linux 및 게스트 (코디) 시스템의 libc.so (LD-리눅스는 glibc에/eglibc 패키지의 일부이며이 libc.so에서 뭔가를 사용하기 때문에).(INTREP 하드 코드 된 경로를 덮어하기 위해, 예,이를 내가 직접 손님의 LD-리눅스를 시작하려고 여기

LD_LIBRARY_PATH=/env/mav/ /env/mav/lib/ld-linux.so.2 /env/mav/bin/ls 

:

는 실행 (ENV 변수 설정의 bash는 구문을) 시도, 내 가정을 테스트하려면 .so 라이브러리를 실행하는 것은 다소 드문 것처럼 보이지만이 라이브러리는 매우 특별한 경우이며이 구문을 허용합니다. 이 명령을 사용하면 제 가정이 잘 수행 될 수 있습니다. 그렇지 않은 경우 가능한 다른 설명이 있습니다.

+0

리눅스 연결 시스템이 어떻게 작동하는지에 대한 설명 주셔서 감사합니다. 완벽하게 일했습니다. – UsAaR33

+4

libpthread.so를 libc.so에 링크 할 때 (LD_DEBUG를 사용하여) 충돌이 발생합니다. ld.so --list에 의해 오는 미래의 사람들에게 주목해라. 이것은 당신이 다른 링커들과 함께 ldd를 할 수있게 해준다. – UsAaR33

관련 문제