如何检查Linux上的ELF文件的数据部分的内容?

我一直在使用objdump来查看Linux ELF二进制文件中的汇编代码。

有时会通过存储在rodata (只读数据)部分中的跳转表进行间接跳转。

如何让objdump或其他工具向我显示这个数据部分的内容?

我可以执行程序并在debugging器中检查相关的地址,但是我不想这样做,因为它必须以交互方式完成。

理想的答案将会确定一个工具,它不仅能显示内容,还能让我控制显示格式,就像od一样。

 objdump -s -j .rodata exefile 

给出了rodata节内容的并排hex/可打印ASCII转储,如下所示:

 Contents of section .rodata: 0000 67452301 efcdab89 67452301 efcdab89 gE#.....gE#..... 0010 64636261 68676665 64636261 68676665 dcbahgfedcbahgfe 

看起来好像没有什么东西可以控制格式,但这是一个开始。 你可以随时取消这个hex,并把它提供给od,我想:)

 readelf -x .rodata hello_world.o 

得到:

 Hex dump of section '.rodata': 0x00000000 48656c6c 6f20776f 726c6421 0a Hello world!. 

你应该更喜欢readelf ,因为objdump根本不显示一些像.symtab这样的.symtab : 为什么objdump不显示.bss,.shstratab,.symtab和.strtab部分?

您还可以使用以下提到的技术提取原始字节: 如何仅提取ELF部分的内容,如ysdx所述 。

你可以得到RAW(不是hexdump-ed)ELF部分:

 # To a file: objcopy file /dev/null --dump-section .text=text.data # To stdout: objcopy file /dev/null --dump-section .text=/dev/stdout | cat 

在这里我使用| cat | cat为了强制stdout成为一个pipe道。 如果stdout是一个文件, /dev/stdout可能会意外地工作。 .text=-不发送到标准输出,而是发送到文件。

然而objcopy和objdump有一些不足之处 (因为它们基于抽象不同可执行格式的BFD)。

更新:我写了一个工具来做到这一点,不依赖于BFD。