86

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

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

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

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

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

4

3 回答 3

111
objdump -s -j .rodata exefile

提供该部分内容的并排十六进制/可打印 ASCII 转储,rodata例如:

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

看起来那里没有任何东西可以控制格式,但这是一个开始。我想您总是可以取消转储十六进制并将其提供给 od :)

于 2009-11-06T04:58:13.393 回答
37
readelf -x .rodata hello_world.o

给出:

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

您应该readelf尽可能选择,因为objdump根本不显示以下部分.symtab为什么 objdump 不显示 .bss、.shstratab、.symtab 和 .strtab 部分?

您还可以使用以下提到的技术提取原始字节:How do you extract only the contents of an ELF section and as described by ysdx

于 2015-05-26T07:42:04.043 回答
16

您可以通过以下方式获取 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它来强制标准输出成为管道。/dev/stdout如果 stdout 是一个文件,可能会意外工作。.text=-不发送到标准输出,而是发送到-文件。

但是objcopy 和 objdump 有一些不足(因为它们是基于抽象了不同可执行格式的 BFD)。

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

于 2015-08-21T11:17:50.650 回答