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

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

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

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

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

有帮助吗?

解决方案

objdump -s -j .rodata exefile

给出了一个并排的十六进制/可打印的ASCII的rodata部等的内容转储:

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

这看起来不像有什么事,在那里控制的格式,但它是一个开始。你总是可以undump的十六进制和喂它OD,我想:)

其他提示

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 部分?

您还可以使用以下提到的技术提取原始字节: 如何只提取 ELF 部分的内容 正如所提到的 通过 ysdx.

你可以把原(未转储-ed)精灵部分:

# 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是一个管道。 /dev/stdout 可能会工作意外如果stdout是一个文件。 .text=- 没有发送到stdout但是对的 - 文件。

然而 objcopy和objdump有一些不足之处 (因为它们是根据报其中摘要不同的可执行格式)。

更新: 我写了一个 工具 要做到这一其不依赖于报.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top