"chroot: 명령을 로드할 수 없습니다" 디버깅'" ldd 및 /proc/ 제외/지도

"chroot: 명령을 로드할 수 없습니다" 디버깅'" ldd 및 /proc/ 제외/지도

rngdRaspberry Pi Zero 환경에서 실행해 보세요 rng-tools.chroot

ldd동일한 명령을 실행하면 chroot모든 종속성이 충족되는 것으로 표시됩니다.

pi@raspberrypi:~/rngd_chroot $ sudo chroot /home/pi/rngd_chroot/ ldd /sbin/rngd
        libpthread.so.0 => /lib/libpthread.so.0 (0xb6f77000)
        libc.so.6 => /lib/libc.so.6 (0xb6e29000)
        /lib/arm-linux-gnueabihf/ld-linux.so.3 => /lib/ld-linux-armhf.so.3 (0xb6fa1000)

chroot동일한 실행 파일의 비인스턴스를 실행하는 데 사용되는 실제 라이브러리 rngd도 이 chroot폴더 아래에 있습니다.

pi@raspberrypi:~/rngd_chroot $ ps -aux | grep rngd
root       262  0.0  0.3  27640  1432 ?        SLsl 14:05   0:00 /usr/sbin/rngd -r /dev/hwrng
pi@raspberrypi:~/rngd_chroot $ sudo cat /proc/262/maps
00008000-00010000 r-xp 00000000 b3:02 20512      /usr/sbin/rngd
00010000-00011000 rw-p 00008000 b3:02 20512      /usr/sbin/rngd
0197c000-0197d000 rw-p 00000000 00:00 0          [heap]
0197d000-01981000 rw-p 00000000 00:00 0          [heap]
01981000-0199d000 rw-p 00000000 00:00 0          [heap]
b5400000-b5421000 rw-p 00000000 00:00 0
b5421000-b5500000 ---p 00000000 00:00 0
b55c0000-b55c1000 ---p 00000000 00:00 0
b55c1000-b5dc1000 rw-p 00000000 00:00 0
b5dc1000-b5dc2000 ---p 00000000 00:00 0
b5dc2000-b65c2000 rw-p 00000000 00:00 0
b65c2000-b65c3000 ---p 00000000 00:00 0
b65c3000-b6dc3000 rw-p 00000000 00:00 0
b6dc3000-b6efb000 r-xp 00000000 b3:02 5239       /usr/lib/arm-linux-gnueabihf/libc-2.28.so
b6efb000-b6f0b000 ---p 00138000 b3:02 5239       /usr/lib/arm-linux-gnueabihf/libc-2.28.so
b6f0b000-b6f0d000 r--p 00138000 b3:02 5239       /usr/lib/arm-linux-gnueabihf/libc-2.28.so
b6f0d000-b6f0e000 rw-p 0013a000 b3:02 5239       /usr/lib/arm-linux-gnueabihf/libc-2.28.so
b6f0e000-b6f11000 rw-p 00000000 00:00 0
b6f11000-b6f28000 r-xp 00000000 b3:02 5412       /usr/lib/arm-linux-gnueabihf/libpthread-2.28.so
b6f28000-b6f37000 ---p 00017000 b3:02 5412       /usr/lib/arm-linux-gnueabihf/libpthread-2.28.so
b6f37000-b6f38000 r--p 00016000 b3:02 5412       /usr/lib/arm-linux-gnueabihf/libpthread-2.28.so
b6f38000-b6f39000 rw-p 00017000 b3:02 5412       /usr/lib/arm-linux-gnueabihf/libpthread-2.28.so
b6f39000-b6f3b000 rw-p 00000000 00:00 0
b6f3b000-b6f3d000 r-xp 00000000 b3:02 5217       /usr/lib/arm-linux-gnueabihf/libarmmem-v6l.so
b6f3d000-b6f4c000 ---p 00002000 b3:02 5217       /usr/lib/arm-linux-gnueabihf/libarmmem-v6l.so
b6f4c000-b6f4d000 r--p 00001000 b3:02 5217       /usr/lib/arm-linux-gnueabihf/libarmmem-v6l.so
b6f4d000-b6f4e000 rw-p 00002000 b3:02 5217       /usr/lib/arm-linux-gnueabihf/libarmmem-v6l.so
b6f4e000-b6f6e000 r-xp 00000000 b3:02 5130       /usr/lib/arm-linux-gnueabihf/ld-2.28.so
b6f7b000-b6f7d000 rw-p 00000000 00:00 0
b6f7e000-b6f7f000 r--p 00020000 b3:02 5130       /usr/lib/arm-linux-gnueabihf/ld-2.28.so
b6f7f000-b6f80000 rw-p 00021000 b3:02 5130       /usr/lib/arm-linux-gnueabihf/ld-2.28.so
bebb6000-bebd7000 rw-p 00000000 00:00 0          [stack]
becab000-becac000 r-xp 00000000 00:00 0          [sigpage]
ffff0000-ffff1000 r-xp 00000000 00:00 0          [vectors]

pi@raspberrypi:~/rngd_chroot $ sudo find . | grep -v -e "/dev/" -e "/sys/" -e "/proc/"
.
./sbin
./sbin/rngd
./usr
./usr/share
./usr/share/lintian
./usr/share/lintian/overrides
./usr/share/lintian/overrides/rng-tools
./bin
./bin/rngtest
./bin/sh
./bin/bash
./bin/ldd
./lib
./lib/libarmmem-v6l.so
./lib/libpthread.so.0
./lib/ld-linux-armhf.so.3
./lib/ld-2.28.so
./lib/libtinfo.so.6
./lib/libc.so.6
./lib/libc-2.28.so
./lib/libtinfo.so.6.1
./lib/libpthread-2.28.so
./lib/libdl.so.2
./lib/libdl-2.28.so
./sys
./dev
./var
./var/run
./proc

그러나 실행하려고 할 때 다음을 rngd받았습니다 chroot.

pi@raspberrypi:~/rngd_chroot $ sudo chroot /home/pi/rngd_chroot/ /sbin/rngd
chroot: failed to run command ‘/sbin/rngd’: No such file or directory

유효한 실행 파일이 있음을 증명하기 위해 rngd실행하는 데는 다음이 필요하지 않습니다 chroot.

pi@raspberrypi:~/rngd_chroot $ sudo sbin/rngd
can't lock /var/run/rngd.pid, running daemon's pid may be 262

이 문제를 디버깅하는 방법에 대한 제안을 주시면 감사하겠습니다.

답변1

TL;박사 학위
rngd필수/lib/arm-linux-gnueabihf/ld-linux.so.3(프로그램 통역사)는 실행 파일을 실행할 때 정확한 위치에 존재하지만, ldd다음과 같이 해결되지는 않습니다./lib/ld-linux-armhf.so.3


이것좋은 대답프로그램 해석기 메커니즘에 관한 어떤 것이 나에게 올바른 방향을 알려주었습니다.

이 문제를 해결하기 위해 먼저 찾아서 사용해 보았습니다.LD_DEBUG환경 변수:

sudo chroot /home/pi/rngd_chroot/ bash
bash-5.0# LD_DEBUG=libs rngd
bash: /sbin/rngd: No such file or directory

결과를 설정하면 LD_DEBUG출력이 없는데 rng출력이 있어서 bash로딩도 안되는 것 같아요프로그램 통역사도서관(ld-리눅스).

도서관 검색이 다음을 통해 이루어진다고 가정ld-리눅스찾을 수 없다는 것이 당연하다ld-리눅스정확한 위치에 있지 않은 경우(/lib/arm-linux-gnueabihf/ld-linux.so.3나는).

ldd누락된 라이브러리로 보고되지 않은 이유를 잘 모르겠습니다 . 내 생각엔 이것이 버그 기능인 것 같다 ldd.

ldd또한 합계의 출력을 비교하면 다음과 같습니다.bashrng

pi@raspberrypi:~/rngd_chroot $ ldd bin/bash
        ...
        /lib/ld-linux-armhf.so.3 (0xb6f9b000)    
pi@raspberrypi:~/rngd_chroot $ ldd sbin/rngd
        ...
        /lib/arm-linux-gnueabihf/ld-linux.so.3 => /lib/ld-linux-armhf.so.3 (0xb6f10000)

bash왼쪽 부분이 없기 때문에 실제 로컬 경로만 표시됩니다.프로그램 통역사.

실행 파일이 링크되는 방식과 관련이 있는 것 같습니다.

정확히 무슨 일이 일어나고 있는지, 그리고 이 두 가지 유형에 대한 올바른 용어가 무엇인지 더 깊이 이해하고 있는 사람이 있다면프로그램 통역사링크를 답변이나 댓글로 게시해 주세요(여기에 추가하겠습니다).

관련 정보