我正在为我的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的名称翻译功能?
答案 0 :(得分:7)
clang和gcc支持-rdynamic
选项作为链接器选项。这应该使dladdr能够在发布模式下按预期运行。 -rdynamic
定义为:
<强> -rdynamic 强> 将标志-export-dynamic传递给支持它的目标上的ELF链接器。这指示链接器将所有符号(不仅是已使用的符号)添加到动态符号表中。 dlopen的某些用途需要此选项,或允许从程序中获取回溯。
可以找到有关gcc链接器选项的更多信息here