在发布时使用dladdr

McB*_*Bob 5 c c++ xcode gcc clang

我为我的应用程序编写了一个分析工具,我使用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 ); }
Run Code Online (Sandbox Code Playgroud)

我尝试了多个编译器标志,我将其传递给C/C++标志:-export-dynamic -fPIC以及-Wl, - export-dynamic没有任何作用...有没有办法仍然使用优化进行编译并保留函数地址 - > dladdr的名称翻译功能?

Mic*_*tch 7

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

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

有关gcc链接器选项的更多信息,请参见此处