[英]Clang++ 3.5.0 -rdynamic
I'm compiling c++ code and I'm trying to add in the -rdynamic option so I can print out a meaningful stack trace for debugging my c++ program, but clang throws back a warning saying "argument unused during compilation: '-rdynamic'".我正在编译 C++ 代码,我正在尝试添加 -rdynamic 选项,以便我可以打印出有意义的堆栈跟踪来调试我的 C++ 程序,但是 clang 抛出一个警告说“编译期间未使用的参数:'-rdynamic' ”。
As a test, on my system I've tried writing a simple c++ program and compiling it with -rdynamic and it worked no problem, but with this project it doesn't seem to go.作为测试,在我的系统上,我尝试编写一个简单的 c++ 程序并使用 -rdynamic 对其进行编译,它没有问题,但是对于这个项目,它似乎没有成功。
Any advice is much appricated任何建议都非常适用
You are likely using the -rdynamic
flag when you are just compiling the source code, not linking it.当您只是编译源代码而不是链接它时,您可能会使用
-rdynamic
标志。 It's a flag for the linker, so you only need it when linking.它是链接器的标志,因此只有在链接时才需要它。 Some versions of clang might not recognize it, in which case you can just instruct clang to pass the proper option to the linker, which commonly is:
某些版本的 clang 可能无法识别它,在这种情况下,您可以指示 clang 将正确的选项传递给链接器,通常是:
-Wl,--export-dynamic
So, eg所以,例如
clang++ -rdynamic test.cpp
or或者
clang++ --Wl,--export-dynamic test.cpp
But if you are compiling and linking separately, only use it at the linking stage:但是如果单独编译和链接,只能在链接阶段使用:
clang++ -c test.cpp
clang++ --Wl,--export-dynamic test.o
(or as the last step: clang++ -rdynamic test.o
) (或作为最后一步:
clang++ -rdynamic test.o
)
The nos's
answer is right ,and help me a lot. nos's
回答是正确的,对我帮助很大。
One little tip, --Wl,--export-dynamic
should be -Wl,--export-dynamic
一个小技巧,--
--Wl,--export-dynamic
应该是--Wl,--export-dynamic
-Wl,--export-dynamic
And there ars some ways to make sure -rdynamic
worked.还有一些方法可以确保
-rdynamic
有效。
Use readelf -s
to see the ELF symbos:使用
readelf -s
查看 ELF 符号:
eg例如
$ cat t.c
#include <stdio.h>
void bar() {}
void baz() {}
void foo() {}
int main() { foo(); printf("test"); return 0; }
$ clang -O0 -o test t.c
$ readelf -s test >test.elf
Symbol table '.dynsym' contains 7 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.17 (2)
3: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND abort@GLIBC_2.17 (2)
5: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable
6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.17 (2)
$ clang -rdynamic -O0 -o test1 t.c
$ readelf -s test1 >test1.elf
Symbol table '.dynsym' contains 24 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTab
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.17 (2)
3: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND abort@GLIBC_2.17 (2)
5: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_registerTMCloneTable
6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.17 (2)
7: 0000000000420038 0 NOTYPE GLOBAL DEFAULT 25 _bss_end__
8: 00000000004009a0 68 FUNC GLOBAL DEFAULT 14 main
9: 0000000000420030 0 NOTYPE GLOBAL DEFAULT 25 __bss_start__
10: 0000000000420030 0 NOTYPE GLOBAL DEFAULT 25 __bss_start
11: 0000000000400994 4 FUNC GLOBAL DEFAULT 14 bar
12: 0000000000400a7c 4 OBJECT GLOBAL DEFAULT 16 _IO_stdin_used
13: 0000000000420038 0 NOTYPE GLOBAL DEFAULT 25 _end
14: 0000000000420038 0 NOTYPE GLOBAL DEFAULT 25 __end__
15: 0000000000420020 0 NOTYPE GLOBAL DEFAULT 24 __data_start
16: 0000000000420030 0 NOTYPE GLOBAL DEFAULT 24 _edata
17: 0000000000400a68 4 FUNC GLOBAL DEFAULT 14 __libc_csu_fini
18: 000000000040099c 4 FUNC GLOBAL DEFAULT 14 foo
19: 00000000004009e8 128 FUNC GLOBAL DEFAULT 14 __libc_csu_init
20: 00000000004008a0 0 FUNC GLOBAL DEFAULT 14 _start
21: 0000000000420020 0 NOTYPE WEAK DEFAULT 24 data_start
22: 0000000000400998 4 FUNC GLOBAL DEFAULT 14 baz
23: 0000000000420038 0 NOTYPE GLOBAL DEFAULT 25 __bss_end__
You will see all symbols in .dynsym
,not only used ones.您将在
.dynsym
看到所有符号,而不仅仅是使用过的符号。
And there are some interesting test about strip
influence in -rdynamic
flag in:还有一些关于
-rdynamic
标志中的strip
影响的有趣测试:
gcc debug symbols (-g flag) vs linker's -rdynamic option gcc 调试符号(-g 标志)与链接器的 -rdynamic 选项
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.