功能地址在nm输出和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已完成其工作后,您将看到进程’代码段内的符号地址.

Here is是IBM关于共享库的一篇好文章,another one是关于Procedure Linkage Table和Global Offset Table的一篇文章.

上一篇:CentOS 8.0网络配置


下一篇:hadoop豆知识