c++ - 跟踪 undefined reference

标签 c++ linux gcc ld

如何使用 gcc ld 跟踪 undefined reference ?

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

有这个标志吗?

最佳答案

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

据我了解,您从库中获得了 undefined reference ,因此我尝试重现一个示例:

带有未定义的 f1() 的库函数;

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

关于c++ - 跟踪 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28232343/

相关文章:

c++ - CPP 字符串的字符串分词器?

c++ - 无法使用 __gnu_cxx::stdio_filebuf 进行流式传输

c++ - 在 bison/flex 中使用左递归时如何声明持久变量?

PHP 解压缩非常大的文件

linux - 将 tmpfs 视为 grep 的设备

c++ - 如何编译 C++ 代码并将其与已编译的 C 代码链接?

c++ - 在 makefile 中包含 valgrind

linux - 如何使用 #!/bin/sh (POSIX sh) 按名称查找变量?

c - 如何修复 "for loop initial declaration used outside C99 mode"GCC 错误?

c++ - 委托(delegate)模板元编程的问题