【问题标题】:Objdump not showing complete addressObjdump 未显示完整地址
【发布时间】:2018-11-02 06:59:48
【问题描述】:

有没有办法在 objdump 中获取完整地址? 正在使用的命令是:objdump -d progname

前导零是不正确的。地址应如下所示:

地址中的最后三个值是正确的;但是,我非常希望在 objdump 中显示完整的地址。

【问题讨论】:

  • 这些地址是否从开始?
  • 不,当我在 edb 中运行它时,地址显示为第二张图片。
  • 我想我的第一个问题是,您是在寻找物理地址还是虚拟地址?其次,假设这是一个用户空间应用程序,我认为objdump 不知道内核在运行时会将应用程序放置在哪里,更不可能知道物理地址。
  • 了解如何从命令行调用objdump 会很有用。
  • 是的。 objdump -d progname

标签: linux objdump


【解决方案1】:

在您的应用程序被加载之前,您无法知道它将在内存中的什么位置结束。

试试下面的代码:

#include <stdio.h>
int main()
{
    printf("%p\n", main);
}

gcc test.c 编译并运行几次。

我的结果显示:

0x55f71f8936b0
0x5630ed7ff6b0
0x558a18eea6b0
...

所以你不能确定它会在内存中的什么位置结束。我相信情况并非总是如此,这种行为旨在作为一种安全“事物”。如果旧的内核/加载器在每次运行时都给出相同的地址,我不会感到惊讶。不过,我不确定。

当然objdump会给你相对地址:

00000000000006b0 <main>:

请记住,这个程序的输出并没有给你物理地址,它们仍然是虚拟的。

关键是objdump 转储的地址是链接器 的责任,而每次执行的实际虚拟地址都存在于加载器

【讨论】:

  • 好吧,从那以后就赚了很多。我正在研究一个较旧的内核,最近对一个较新的内核进行了更改。只是没有意识到有那个漂亮的安全功能。我看了一会儿,才低头问道。猜猜我在寻找错误的东西。无论如何,谢谢你的信息。
  • 请记住,无论您使用哪种加载器,objdump 都无法使用符号的最终地址。对于较旧的加载程序,每次运行时此运行时地址可能相同,但我猜这是唯一的区别。
【解决方案2】:

除了接受的答案:

要获得正确的地址,你可以在 gdb 中运行程序,然后输入 start,然后执行“disas functionname”,它现在会显示正确的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多