Elf
理解書中的 objcopy 命令
我正在讀一本書,它正在談論 ELF。我知道這是一種執行檔的文件格式。我在虛擬機上執行了一個命令,但我無法理解它的作用。
objcopy -O binary -j .interp /bin/ls /dev/stdout
我
/dev/stdout
在執行後打開了文件,它看起來像是某種日誌資訊。
歡迎來到 Unix 和 Linux SE!
一個 ELF 文件有一個或兩個二進制頭,以及許多命名的部分。如果您有興趣,維基百科有一個 ELF 文件結構的描述。
您的
objcopy -O binary -j .interp /bin/ls /dev/stdout
命令只是將.interp
file 部分的內容/bin/ls
完全按原樣 (-O binary
) 輸出到 “file”/dev/stdout
。
/dev/stdout
應該是到目前程序的文件描述符#1 的符號連結,即它的標準輸出流。它基本上只是一種告訴希望將其輸出寫入命名文件的程序改為使用標準輸出的方法。如果您將輸出文件名指定為 just ,某些程序可以做到這一點-
,但顯然objcopy
不遵循該約定。如果您在打開 時看到“某種日誌資訊”
/dev/stdout
,這可能意味著此符號連結已意外替換為已以 root 身份執行的某些程序或腳本。它應該如下所示:$ ls -l /dev/stdout lrwxrwxrwx 1 root root 15 Nov 17 23:25 /dev/stdout -> /proc/self/fd/1
在 64 位 x86 系統上,您的
objcopy
命令應該輸出類似/lib64/ld-linux-x86-64.so.2
. 由於輸出的末尾不包含換行符,因此它可能與下一個命令提示符出現在同一行,因此更難發現:[my command prompt]$ objcopy -O binary -j .interp /bin/ls /dev/stdout /lib64/ld-linux-x86-64.so.2[my command prompt]$
在 32 位 x86 二進製文件上,輸出類似於
/lib/ld-linux.so.2
.輸出是程序解釋器的文件名,也就是應該與檢查的二進製文件一起使用的動態連結器/載入器。
man ld.so
您可以使用系統上的或man ld-linux
命令獲取有關它的更多資訊。