跟踪未定义的引用

Tracing undefined reference

本文关键字:引用 未定义 跟踪      更新时间:2023-10-16

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

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

有标志吗?

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

据我了解,您从库中获得了未定义的引用,因此我尝试重现一个示例:

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

void f2();
int main()
{
    f2();
}

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

无效 F2();

int main() 
{
    f2();
}
int dummy(){}

编译/链接:

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

这导致

objdump -x main.o | grep f2
0000000000000000            *UND*  0000000000000000 f2
000000000000000a R_X86_64_PC32     f2-0x0000000000000004

在这里,您可以看到该符号是在偏移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   

结果偏移量0x0a在函数main() 中。

这可以通过使用找到的对象文件调用 gdb 来完成更简单:

 gdb main.o
 gdb> l *0x0a
 0xa is in main (main.c:5)
如果您没有调试信息:

使用调试信息重新编译:-)如果库中没有调试信息,请检查是否可以将调试符号作为外部文件。操作方法:https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html