linux – 为什么gdb显示的函数地址与nm的函数地址不同?

linux – 为什么gdb显示的函数地址与nm的函数地址不同?,第1张

概述今天,当我在 linux上调试我的代码时,我突然发现gdb中的函数地址与nm显示的不同. (可执行文件是静态链接的.) 我认为他们显示的地址应该是相同的,因为它们都是逻辑地址.但今天的发现让我感到困惑. 有人知道他们与众不同的原因吗? 我写了下面这个简单的程序来说明我遇到的情况. void fo() { return 今天,当我在 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 _Z2fov0000000000400595 T _Z3addii000000000040058a T _Z3foov00000000004005b3 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相同的地址.

总结

以上是内存溢出为你收集整理的linux – 为什么gdb显示的函数地址与nm的函数地址不同?全部内容,希望文章能够帮你解决linux – 为什么gdb显示的函数地址与nm的函数地址不同?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/1025141.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存