我正在读一本书它正在谈论 ELF 的。我知道这是可执行文件的文件格式。我在虚拟机上执行了一个命令,但我无法理解它的作用。
objcopy -O binary -j .interp /bin/ls /dev/stdout
我/dev/stdout
在执行后打开该文件,它看起来就像某种日志信息。
答案1
欢迎来到 Unix 和 Linux SE!
ELF 文件具有一个或两个二进制标头,以及许多命名节。如果您有兴趣,维基百科有 ELF 文件结构的描述。
您的命令只是将文件部分objcopy -O binary -j .interp /bin/ls /dev/stdout
的内容完全按原样 ( ) 输出到 "file" 。.interp
/bin/ls
-O binary
/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