如何使用gcc ld
跟踪未定义的引用?
我已尝试-Wl
,-trace-symbol=some_ref
,但未显示调用符号的位置。我想得到某种调用堆栈,它显示了为什么首先调用符号。简而言之,我需要从顶层向下跟踪该符号的所有引用。
这是否有旗帜?
答案 0 :(得分:1)
因为这个问题我不清楚,只有评论给我一个想法,我试着给你一些提示:
据我所知,你从库中得到一个未定义的引用,所以我尝试重现一个例子:
lib函数使用未定义的f1();
void f2();
int main()
{
f2();
}
main,调用f2()调用undefined f1()
void 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)
如果您没有调试信息:使用调试信息重新编译:-)如果您的库中没有调试信息,请检查您是否可以将调试符号作为外部文件。 Howto:https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html