我一直在使用objdump
来查看Linux ELF二进制文件中的汇编代码。
有时间接跳转存储在rodata
(只读数据)部分的跳转表。
如何让objdump
或任何其他工具向我展示此数据部分的内容?
我可以执行程序并检查调试器中的相关地址,但我不想这样做,因为它必须以交互方式完成。
理想的答案将确定一个工具,它不仅会向我显示内容,还会让我控制显示格式,就像od
一样。
答案 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
根本没有显示某些部分,例如.symtab
:Why 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。