【问题标题】:Clang++ 3.5.0 -rdynamicClang++ 3.5.0 -rdynamic
【发布时间】:2014-12-10 14:22:05
【问题描述】:

我正在编译 c++ 代码,我正在尝试添加 -rdynamic 选项,这样我就可以打印出有意义的堆栈跟踪来调试我的 c++ 程序,但是 clang 会抛出一个警告说“编译期间未使用的参数:' -rdynamic'”。

作为测试,在我的系统上,我尝试编写一个简单的 c++ 程序并使用 -rdynamic 编译它,它没有问题,但是对于这个项目,它似乎并没有成功。

任何建议都非常适用

【问题讨论】:

  • --export-dynamic 是一个不受支持的选项,我已经尝试过该帖子上的内容
  • 它是 -Wl,--export-dynamic ,clang++ 应该将它传递给链接器,如果你得到一个错误,它应该来自链接器而不是来自 clang++
  • 逗号把我吓跑了,这次我正确地尝试了这个命令,警告现在是“clang: warning: -Wl,--export-dynamic: 'linker' input used”。这是我从未见过的警告,所以我还没有研究它,这就是我现在要做的。如果我遇到更多麻烦,我很可能会删除这个问题并创建一个新问题。谢谢你让我更近了一步。

标签: c++ ubuntu clang clang++ ubuntu-14.10


【解决方案1】:

当您只是编译源代码而不是链接它时,您可能会使用-rdynamic 标志。 它是链接器的标志,因此仅在链接时才需要它。 某些版本的 clang 可能无法识别它,在这种情况下,您可以指示 clang 将正确的选项传递给链接器,通常是:

 -Wl,--export-dynamic

所以,例如

clang++ -rdynamic test.cpp

clang++ --Wl,--export-dynamic test.cpp

但是如果你是单独编译和链接,只能在链接阶段使用:

clang++ -c test.cpp
clang++ --Wl,--export-dynamic test.o 

(或作为最后一步:clang++ -rdynamic test.o

【讨论】:

    【解决方案2】:

    nos's 的答案是对的,对我有很大帮助。
    一点小提示,--Wl,--export-dynamic 应该是-Wl,--export-dynamic

    还有一些方法可以确保-rdynamic 有效。
    使用 readelf -s 查看 ELF 符号:
    例如

    $ 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__
    

    您将看到 .dynsym 中的所有符号,而不仅仅是使用过的符号。
    还有一些关于strip影响-rdynamic标志的有趣测试:
    gcc debug symbols (-g flag) vs linker's -rdynamic option

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-31
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2016-02-27
      • 2019-12-24
      • 1970-01-01
      相关资源
      最近更新 更多