Dynamic-Linking
使用 patchelf 0.6 和 0.8 在 ld-linux-x86-64.so.2 中設置 RUNPATH 後無法 chroot bash
我正在測試動態連結如何與
RUNPATH
變數一起工作,並嘗試bash
在最小chroot
目錄中執行:$ find dir_chroot/ -type f dir_chroot/bin/bash dir_chroot/lib/x86_64-linux-gnu/libc.so.6 dir_chroot/lib/x86_64-linux-gnu/libdl.so.2 dir_chroot/lib/x86_64-linux-gnu/libtinfo.so.5 dir_chroot/lib64/ld-linux-x86-64.so.2
– 這些都是 的依賴項
bash
,它們是實際的二進製文件 (find -type f
),而不是符號連結。他們也沒有RUNPATH
:$ find dir_chroot/ -type f -exec sh -c "readelf -d {} | grep RUNPATH" \; $
chroot
在這個目錄下工作正常:$ sudo chroot dir_chroot /bin/bash bash-4.3# exit exit
但是,如果我複制所有內容並設置
RUNPATH
為$ORIGIN/
inlib64/ld-linux-x86-64.so.2
我會在執行時獲得退出程式碼139
(segfault
?)chroot
:$ cp -R dir_chroot dir_chroot4 $ find dir_chroot4/ -type f -exec sh -c "echo {} `readelf -d {} | grep RUNPATH`" \; dir_chroot4/bin/bash dir_chroot4/lib/x86_64-linux-gnu/libc.so.6 dir_chroot4/lib/x86_64-linux-gnu/libdl.so.2 dir_chroot4/lib/x86_64-linux-gnu/libtinfo.so.5 dir_chroot4/lib64/ld-linux-x86-64.so.2 $ $ patchelf --set-rpath "\$ORIGIN/" dir_chroot4/lib64/ld-linux-x86-64.so.2 $ find dir_chroot4/ -type f -exec sh -c "echo {} `readelf -d {} | grep RUNPATH`" \; dir_chroot4/bin/bash dir_chroot4/lib/x86_64-linux-gnu/libc.so.6 dir_chroot4/lib/x86_64-linux-gnu/libdl.so.2 dir_chroot4/lib/x86_64-linux-gnu/libtinfo.so.5 dir_chroot4/lib64/ld-linux-x86-64.so.2 0x000000000000001d (RUNPATH) Library runpath: [$ORIGIN/] $ $ sudo chroot dir_chroot4 /bin/bash $ $ echo $status 139
–
$status
是fish
shell 中的狀態變數。只有在
ld-linux-x86-64.so.2
打更新檔、其他庫和bash
執行檔可以正常工作時才會發生這種情況RUNPATH
。為什麼會這樣?
顯然,ld-linux-x86-64.so.2是靜態連結的,至少它在我的系統上:
>ldd ld-linux-x86-64.so.2 statically linked
與libc.so.6、libdl.so.2和libtinfo.so.5 不同
>ldd libc.so.6 libdl.so.2 libtinfo.so.5 libc.so.6: /lib64/ld-linux-x86-64.so.2 (0x000056469847a000) linux-vdso.so.1 => (0x00007ffe95185000) libdl.so.2: linux-vdso.so.1 => (0x00007fffc4718000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa1df136000) /lib64/ld-linux-x86-64.so.2 (0x0000558334a9c000) libtinfo.so.5: linux-vdso.so.1 => (0x00007ffe1b7bd000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffa990b9000) /lib64/ld-linux-x86-64.so.2 (0x00005590bfced000)
當您強行將RUNPATH注入其中時,這會使載入程序發瘋並導致段錯誤。