【问题标题】:objdump and resolving linkage of local function calls?objdump 和解析本地函数调用的链接?
【发布时间】:2012-02-18 01:26:32
【问题描述】:

如果我在 (linux amd64) .o 文件上运行 objdump -d,则会显示函数调用而没有完成链接时间解析。示例:

  90:   66 89 44 24 1c          mov    %ax,0x1c(%rsp)
  95:   44 89 74 24 10          mov    %r14d,0x10(%rsp)
  9a:   e8 00 00 00 00          callq  9f <foo+0x9f>
  9f:   83 f8 ff                cmp    $0xffffffffffffffff,%eax
  a2:   74 5e                   je     102 <foo+0x102>

函数中的一个分支正确显示,但 callq 只是为链接器放入的存根(链接器可使用四个字节的零来放入正确的地址)。

有没有办法在没有实际链接的情况下获得一个已解析函数名称的程序集列表?我不关心最终将使用的地址,只关心函数的名称。该信息必须在 .o 文件中,因为链接器必须使用它才能完成工作。

我问是因为有问题的代码进入的共享库大约是 140Mb,并且它需要一个 long 时间来运行 objdump -d 以获取所有函数调用的 asm 转储解析为他们的真实姓名。

【问题讨论】:

  • 我已经为我的具体问题找到了解决方法。我可以运行 nm 来获取我们巨大的共享库中的函数地址,然后使用该 nm 输出运行带有 --start-address 的 objdump。如果可能的话,我仍然对原始问题的答案感兴趣。

标签: linux objdump


【解决方案1】:

有没有办法在没有实际链接的情况下获得一个已解析函数名称的程序集列表?

是的:使用objdump -dr foo.o

【讨论】:

  • 我喜欢objdump -drwC -Mintel,因为-w-C 也很不错:没有换行,并且对C++ 名称进行解码。 (我在我的外壳中alias disas='objdump -drwC -Mintel'。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-16
相关资源
最近更新 更多