简体   繁体   English

Clang++ 3.5.0 -rdynamic

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM