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

时间:2009-11-06 04:52:46

标签: linux elf objdump object-code

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

有时间接跳转存储在rodata(只读数据)部分的跳转表。

如何让objdump或任何其他工具向我展示此数据部分的内容?

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

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

3 个答案:

答案 0 :(得分:80)

objdump -s -j .rodata exefile

给出了rodata部分内容的并排十六进制/可打印ASCII转储,如:

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

看起来没有什么可以控制格式化,但它是一个开始。您可以随时取消六角形并将其输入od,我想:)

答案 1 :(得分:18)

readelf -x .rodata hello_world.o

给出:

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

如果可能,您应该更喜欢readelf,因为objdump根本没有显示某些部分,例如.symtabWhy does objdump not show .bss, .shstratab, .symtab and .strtab sections?

您还可以使用上面提到的技术提取原始字节:How do you extract only the contents of an ELF section和提及by ysdx

答案 2 :(得分:10)

您可以使用以下命令获取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强制stdout成为管道。如果stdout是文件,/dev/stdout可能会意外地工作。 .text=-不会发送到stdout而是发送到-文件。

然而objcopy and objdump have some deficiencies(因为它们基于提取不同可执行格式的BFD)。

更新:我写了tool来执行此操作,不依赖于BFD。