繁体   English   中英

功能地址在nm输出和gdb中不同

[英]Function address is different in nm output and gdb

让我们只关注Rect_IsEmpty()函数。

nm命令给出了这个输出:

(...)    
00021af0 T Rect_IsEmpty
(...)

另一方面,当我启动gdb并查看此函数的地址时,我得到:

(gdb) info address Rect_IsEmpty
Symbol "Rect_IsEmpty" is at 0x8057c84 in a file compiled without debugging.

请问任何人解释为什么这些地址不一样? gdb从哪里获取此地址?

nm为您提供受损的名称符号表的地址偏移量,而gdb为您提供实际虚拟进程的内存地址,每次运行该进程时都会更改该地址。

nm只是一个工具,可以显示您从代码段的开头偏移。 在你的情况下:

00021af0 T Rect_IsEmpty

简单地意味着,在整个代码段,所有其它功能之外,所述Rect_IsEmpty一个已偏移00021af0从代码段,因此,如果代码段的基重定位到00000000 ,则偏移将是相同的地址, 00021af0

在Linux上运行可执行文件之前,ASLR机制用于随机化地址但不是所有地址,只是段的开始。 因此,在运行可执行文件之前,您无法始终知道或依赖动态符号的地址,您只能从段起始地址获得偏移量。

使用调试器查找函数的地址时,在ASLR已完成其工作后,您将看到进程'代码段内的符号地址。

以下是 IBM关于共享库的一篇好文章, 另一篇关于Procedure Linkage Table和Global Offset Table的文章。

可执行文件将从不同的内存位置开始,使其中的任何分配都不同。 因此,任何函数将具有与其先前执行不同的存储器地址。

关于你的问题,GDB从调试信息中获取地址 - 它将显示绝对内存地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM