2017-08-03 80 views
1

有没有办法在objdump中获得完整的地址? 正在使用的命令是:objdump -d prognameObjdump没有显示完整的地址

enter image description here

的前导零不正确的。该地址应该如下:

enter image description here

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

+0

这些地址是从*零*开始的吗? –

+0

不,当我在edb中运行时,地址显示为第二个图像。 –

+0

我想我的第一个问题是,你正在寻找一个物理或虚拟地址?其次,假设这是一个用户空间应用程序,我不认为'objdump'知道内核将在运行时放置应用程序的位置,甚至不太可能知道物理地址。 –

回答

2

在您的应用程序加载之前,您无法确定它将在内存中结束的位置。

试试下面的代码:

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

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

我的研究结果表明:

0x55f71f8936b0 
0x5630ed7ff6b0 
0x558a18eea6b0 
... 

所以你不能确切地知道它将会在内存结束。我认为情况并非总是如此,而这种行为的目的是作为安全“事情”。如果旧的内核/加载程序在每次运行时给出相同的地址,我不会感到惊讶。不过,我当然不知道。

当然objdump会给你的相对地址:

00000000000006b0 <main>: 

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

的要点是,通过objdump倾倒地址是从每个执行的接头和实际的虚拟地址的责任是有,因为装载机的。

+0

好的,这使得很多。我正在研究一个较老的内核,并且最近做了一个更新的内核。只是没有意识到有这个漂亮的安全功能。我蹲了一会儿,然后问道。猜猜我正在寻找错误的东西。无论如何,感谢您的信息。 –

+0

请记住,无论您使用哪种加载程序,符号的最终地址都不会提供给objdump。使用较旧的加载器时,这个运行时地址在每次运行时可能都是相同的,但这是唯一的区别,我想。 –