Chroot
除了 ldd 和 /proc/<pid>/maps 之外,調試“chroot: failed to load command ‘<executable_name>’”
嘗試在Raspberry Pi Zero 上的環境
rngd
中執行。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
任何關於如何調試的建議都值得讚賞
TL;博士;
rngd
當您執行執行檔時,需要*/lib/arm-linux-gnueabihf/ld-linux.so.3*(程序解釋器)存在於這個確切的位置,不像ldd
它不會將其解析為*/lib/ld-linux-armhf。所以.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-linux)。假設庫搜尋是由ld-linux完成的,如果**ld-linux不在確切位置(在我的情況下是*/lib/arm-linux-gnueabihf/ld-linux.so.3* ),它本身就無法找到它是有道理的.
不知道為什麼
ldd
不將此報告為失去的庫。我猜這是ldd
.此外,如果我們比較 和的
ldd
輸出:bash``rng
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
它沒有左側部分,它只是顯示程序解釋器的實際本地路徑。我想這與連結執行檔的方式有關。
如果有人更深入地了解究竟發生了什麼以及這兩種程序解釋器連結的正確術語是什麼,請將其作為答案或評論發布(我將在此處添加)。