2014-09-19 20 views
4

我正在为我的应用程序编写性能分析工具,并使用dladdr将函数指针转换为名称。只要一切正常工作作为即时通讯的调试,但只要我在释放编译(使用的XCode 5.1)的所有名称转换失败并返回NULL例如:在版本中使用dladdr

#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什么都不起作用......有没有一种方法可以继续编译优化并保留函数地址 - > dladdr的名称转换功能?

+1

您是否尝试过加入-rdynamic作为一个连接器选项? – 2014-09-19 03:23:12

+1

Arrgg ...就是这样!我试过-rdynamic,但我把它放在C/C++标志中,而不是连接器... – McBob 2014-09-19 03:40:00

+0

这样做!我已经将我的信息作为正式答案。 – 2014-09-19 03:45:42

回答

6

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

-rdynamic 传递标志-export动态的ELF链接器,支持它的目标。这指示链接器将所有符号(不仅是已使用的符号)添加到动态符号表中。该选项对于dlopen的一些用途或允许从程序内获取回溯是必需的。海合会连接选项

的更多信息,可以发现here

+0

OP声称尝试了类似的东西,但我认为该选项被错误传递。 – 2014-09-19 05:16:26

+0

正确,OP将它作为* compiler *选项传递。我对他的帖子的第一个评论是尝试-rdyanmic作为*链接器*选项。我认为那是OP在他在错误的地方完成了国旗的线索。 – 2014-09-19 05:20:23

相关问题