C++ 跟踪未定义的引用

C++ 跟踪未定义的引用,c++,linux,gcc,ld,C++,Linux,Gcc,Ld,如何使用gcc ld跟踪未定义的引用 我尝试了-Wl,-trace symbol=some_ref,但它没有显示从何处调用符号。我想得到某种调用堆栈,它显示了为什么首先调用符号。简而言之,我需要从上到下追踪该符号的所有引用 这里有旗帜吗 因为这个问题对我来说不清楚,只有评论给了我一个想法,所以我试着给你一些提示: 据我所知,您从库中获得了一个未定义的引用,因此我尝试复制一个示例: 具有未定义f1()的lib函数 main,调用f2(),它调用未定义的f1() 空f2() 编译/链接: gcc l

如何使用
gcc ld
跟踪未定义的引用

我尝试了
-Wl
-trace symbol=some_ref
,但它没有显示从何处调用符号。我想得到某种调用堆栈,它显示了为什么首先调用符号。简而言之,我需要从上到下追踪该符号的所有引用


这里有旗帜吗

因为这个问题对我来说不清楚,只有评论给了我一个想法,所以我试着给你一些提示:

据我所知,您从库中获得了一个未定义的引用,因此我尝试复制一个示例:

具有未定义f1()的lib函数

main,调用f2(),它调用未定义的f1()

空f2()

编译/链接:

gcc lib.c -g -c
gcc main.c -g -c
gcc main.o lib.o
结果还将显示一条带有问题源的消息:

lib.o: In function `f2':   
lib.c:(.text+0x5): undefined reference to `f1()'
如果您现在想知道调用f2的来源,要了解调用树的起点在哪里,请尝试:

objdump -x <files which potentially call f2()> | grep f2
在这里,您可以看到符号在偏移量0xa处被引用

找出有哪些功能:

objdump -d main.o

0000000000000000 <main>:
0:   55                      push   %rbp
1:   48 89 e5                mov    %rsp,%rbp
4:   b8 00 00 00 00          mov    $0x0,%eax
9:   e8 00 00 00 00          callq  e <main+0xe>
e:   5d                      pop    %rbp
f:   c3                      retq   

0000000000000010 <dummy>:
10:   55                      push   %rbp
11:   48 89 e5                mov    %rsp,%rbp
14:   5d                      pop    %rbp
15:   c3                      retq   

如果没有调试信息:使用调试信息重新编译:-)如果库中没有调试信息,请检查是否可以将调试符号作为外部文件。如何:

你真正的问题是什么?如果我有一个未定义的引用,我会得到一个包含源代码行的信息,如下所示:
main.cpp:5:undefined reference to _example
无法编译发出
未定义引用的源代码,因此无需“跟踪”。除非你的字面意思是,跟踪gcc发出错误的地方?(这听起来像是一个离谱的解决方案。)在发布的错误行附近的源代码中找到一个简单的文本应该足够了。。这可能会有帮助吗?它是否被实际调用并不重要,它只需要在某个地方按名称引用(甚至在“死”代码中),就有必要进行定义。问题是未定义的引用在newlib中是_sbrk。我不应该得到这个系统调用的未定义引用,因为我没有使用任何动态分配(以前链接的所有内容都很好)。因此,我希望跟踪引用并查看来自我的应用程序的调用的完整路径(即是什么代码导致它包含在最终图像中)。
objdump -x <files which potentially call f2()> | grep f2
objdump -x main.o | grep f2
0000000000000000            *UND*  0000000000000000 f2
000000000000000a R_X86_64_PC32     f2-0x0000000000000004
objdump -d main.o

0000000000000000 <main>:
0:   55                      push   %rbp
1:   48 89 e5                mov    %rsp,%rbp
4:   b8 00 00 00 00          mov    $0x0,%eax
9:   e8 00 00 00 00          callq  e <main+0xe>
e:   5d                      pop    %rbp
f:   c3                      retq   

0000000000000010 <dummy>:
10:   55                      push   %rbp
11:   48 89 e5                mov    %rsp,%rbp
14:   5d                      pop    %rbp
15:   c3                      retq   
 gdb main.o
 gdb> l *0x0a
 0xa is in main (main.c:5)