在发布时使用dladdr

时间:2014-09-19 02:56:38

标签: c++ c xcode gcc clang

我正在为我的App编写一个分析工具,我正在使用dladdr将函数指针转换为name。只要Im在调试中,一切正常,但是一旦我在发布中编译(使用XCode 5.1),所有名称转换都会失败并返回NULL ex:

#include <dlfcn.h>
int main( int argc, char **argv )
{
    Dl_info info;

    if( dladdr( main, &info ) != 0 )
    { fprintf( stderr, "%s\n", info.dli_sname ); }

我尝试了多个编译器标志,我将其传递给C / C ++标志:-export-dynamic -fPIC以及-Wl, - export-dynamic没有任何作用...有没有办法继续编译优化和保留功能地址 - &gt; dladdr的名称翻译功能?

1 个答案:

答案 0 :(得分:7)

clang和gcc支持-rdynamic选项作为链接器选项。这应该使dladdr能够在发布模式下按预期运行。 -rdynamic定义为:

  

<强> -rdynamic   将标志-export-dynamic传递给支持它的目标上的ELF链接器。这指示链接器将所有符号(不仅是已使用的符号)添加到动态符号表中。 dlopen的某些用途需要此选项,或允许从程序中获取回溯。

可以找到有关gcc链接器选项的更多信息here