- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在为我的应用程序编写分析工具,并且我正在使用 dladdr 将函数指针转换为名称。只要我处于调试状态,一切都可以正常工作,但是一旦我在发行版中编译(使用 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 没有任何作用......是否有一种方法仍然可以通过优化和编译保留 dladdr 的函数地址 -> 名称翻译功能?
最佳答案
clang 和 gcc 支持 -rdynamic
选项作为 linker 选项。这应该使 dladdr 能够在 Release模式下按预期运行。 -rdynamic
定义为:
-rdynamic Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of dlopen or to allow obtaining backtraces from within a program.
可以找到有关 gcc 链接器选项的更多信息 here
关于c++ - 在发布中使用 dladdr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25925660/
dladdr()的内存语义是什么? ? #define _GNU_SOURCE #include int dladdr(void *addr, Dl_info *info); typedef str
我已经使用 gcc 的 -finstrument-functions 选项和以下(简化的)代码实现了跟踪行为: void __cyg_profile_func_enter(void *this_fn,
在研究一些库时我发现了这种代码 Dl_info info = { NULL, NULL, NULL, NULL }; if (!dladdr((void*) dirSep, &
我正在为我的应用程序编写分析工具,并且我正在使用 dladdr 将函数指针转换为名称。只要我处于调试状态,一切都可以正常工作,但是一旦我在发行版中编译(使用 XCode 5.1),所有名称转换都会失败
我正在尝试使用 dladdr。它正确定位了库,但未找到函数名称。我可以调用 objdump,做一些数学运算,然后获取我传递给 dladdr 的函数的地址。如果 objdump 可以看到它,为什么 dl
我有一个程序(应用程序,不是共享库): void func() { int RESULT = UNW_ESUCCESS; unw_context_t context; unw_
我使用 dladdr 来获取库的完整路径: Dl_info dl_info; int ret = dladdr((void*)&func, &dl_info); if (ret)
我正在编写一个 C++ 异常类,它必须在抛出站点提供有限的回溯。由于我的应用程序将是多线程的,因此可能会同时抛出异常。我在 Internet 上搜索了这个线程安全问题,但没有找到。 backtrace
我无法获得带有间接函数的 elf 的 gnu 扩展以与 dladdr 一起工作。 在下面的例子中,fabs和sin是libm中的两个动态函数,其中sin也是一个间接函数从其指针查找 fabs 效果很好
希望这是一个相当简单的 C++ 问题(而不是语言律师问题)。 如何在 C++ 中使用 GNU 扩展 dladdr ?通常人们会用 C 编写以下内容: #ifndef _GNU_SOURCE #defi
我想在 Windows 下实现回溯实用程序的模拟,以便将此信息添加到异常中。 我需要捕获返回地址,然后将其转换为符号名称。 我知道 StackWalk64 和 StackWalker project但
我正在处理 LLVM Tutorial ,但我在编译时遇到了麻烦。我写了一个重现该问题的最小示例: #include "llvm/Module.h" #include "llvm/LLVMContex
我是一名优秀的程序员,十分优秀!