linux – 为什么gdb显示的函数地址与nm的函数地址不同?
发布时间:2020-12-14 00:53:20 所属栏目:Linux 来源:网络整理
导读:今天,当我在 linux上调试我的代码时,我突然发现gdb中的函数地址与nm显示的不同. (可执行文件是静态链接的.) 我认为他们显示的地址应该是相同的,因为它们都是逻辑地址.但今天的发现让我感到困惑. 有人知道他们与众不同的原因吗? 我写了下面这个简单的程序来
今天,当我在
linux上调试我的代码时,我突然发现gdb中的函数地址与nm显示的不同. (可执行文件是静态链接的.)
我认为他们显示的地址应该是相同的,因为它们都是逻辑地址.但今天的发现让我感到困惑. 有人知道他们与众不同的原因吗? 我写了下面这个简单的程序来说明我遇到的情况. void fo() { return ; } void foo() { fo(); } int add(int a,int b) { foo(); return a + b; } int main() { int a = 1; int b = 2; add(a,b); return 0; } nm的输出是: 0000000000400584 T _Z2fov 0000000000400595 T _Z3addii 000000000040058a T _Z3foov 00000000004005b3 T main 但是当我使用gdb来调试已编译的可执行文件时,将断点放在第3行. (gdb) bt #0 fo () at test.cpp:4 #1 0x0000000000400593 in foo () at test.cpp:9 #2 0x00000000004005a8 in add (a=1,b=2) at test.cpp:14 #3 0x00000000004005d8 in main () at test.cpp:22 你可以看到gdb的输出与nm的输出不同. 解决方法
因为nm显示了函数开始的地址,而gdb stacktrace显示了函数内部执行的确切位置.确切地说,它应该是堆栈帧中的返回地址,即当堆栈中它上面的函数返回时,指向要在函数中执行的下一条指令的指针.
注意,如果你只是通过评估函数指针表达式来询问gdb的函数指针,它应该给出与nm相同的地址. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |