Dynamic-Linking

使用 patchelf 0.6 和 0.8 在 ld-linux-x86-64.so.2 中設置 RUNPATH 後無法 chroot bash

  • November 16, 2016

我正在測試動態連結如何與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我會在執行時獲得退出程式碼139segfault?)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

$statusfishshell 中的狀態變數。

只有在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.6libdl.so.2libtinfo.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注入其中時,這會使載入程序發瘋並導致段錯誤。

引用自:https://unix.stackexchange.com/questions/321356