跟踪未定义的引用
Tracing undefined reference
如何使用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
相关文章:
- 编译C++时未定义的引用
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 对 Scalar ::Scalar() 的未定义引用
- 已定义函数时出现 G++ "未定义的引用"错误
- 链接 cmake 时出现未定义的引用错误
- 对复制 CTOR 和 CTOR 的未定义引用
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 右值引用未定义的行为
- 对"vtable for DigitalClock"的未定义引用 - 未定义对"DigitalClock::staticMetaObject"的引用 - Qt
- 函数类型到函数类型的引用:未定义的引用
- avcodec_alloc_context引用未定义,但ffmpeg链接顺序正确
- 从c++调用Fortran子程序,链接时引用未定义
- 枚举引用未定义,但位于包含的头文件中