【问题标题】:How can I convert only one file or one function of an elf file to assembly?如何仅将 elf 文件的一个文件或一个函数转换为程序集?
【发布时间】:2018-01-20 05:37:31
【问题描述】:

我有一个非常大的代码库(内核)的 elf 文件。我想将其转换为汇编代码。我有函数的基地址和指令的偏移量。使用这些信息,我想得到具体的指令。我使用“objdump -b binary -m i386 -D file.elf”从 elf 文件中获取汇编代码,但它正在生成 4GB 的数据。我也提到了这个Can I give objdump an address and have it disassemble the containing function?,但它也不适合我。

【问题讨论】:

  • 为什么这个标签是 linux-kernel?如果您尝试查看的是二进制内核,您应该这样说,并具体说明哪种格式(因为它通常大部分是压缩的,因此 objdump 无法理解)。如果不是,请删除不适用的标签。

标签: linux-kernel elf disassembly


【解决方案1】:

您可以使用 --start-address--stop-address 选项限制 objdump 输出。

对于仅用于单个函数的进程代码,这些选项的值可以从readelf -s 输出中获取,其中包含函数在节中的起始地址和函数的大小,从readelf -S 输出中获取,其中包含地址具有功能的部分:

--start-address=<section_start + function_start>
--stop-address=<section_start + function_start + function_size>

【讨论】:

  • 我试过了,但我收到了这个错误:objdump: --start-address: bad number: ffff000008081891
  • 你不是忘了在十六进制值前加上0x吗?
  • 是的...添加 0x 后它没有给出错误的数字错误...谢谢...但是现在..我仍然没有得到输出...这是命令:- objdump -b binary -m i386 --start-address=0xffff000008081890 --stop-address=0xffff000008081bf4 elf_file,输出为elf_file:文件格式二进制
  • 确保你传递了正确的--start-address。请注意,它应该是部分的起始地址(函数通常包含在 .text 部分中)和该部分中函数的偏移量的总和(这是 readelf - s 显示的内容)。
【解决方案2】:

我想把它转换成汇编代码。

gdb -q ./elf_file
(gdb) set height 0    # prevent pagination
(gdb) set logging on  # output will be mirrored in gdb.txt
(gdb) disassemble 0xffff000008081890 0xffff000008081bf5
(gdb) quit

享受吧!

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 1970-01-01
    • 2022-01-05
    • 2011-09-04
    • 1970-01-01
    • 2015-11-07
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多