【发布时间】:2014-10-23 11:37:22
【问题描述】:
正如其他 SO 答案中所提到的,我正在使用 GNU ld 的包装机制来拦截 Linux 上对 malloc 的调用(参见 here 的示例)。
使用的链接器标志是-Wl,--wrap=malloc,并且还定义了相应的void __wrap_malloc(size_t)。
这在所有编译单元都链接到同一个二进制文件的测试应用程序中运行良好。
现在,我需要修改一个通过dlopen() 加载到主程序中的动态链接库。
链接库成功,但将其加载到主程序中失败并显示undefined symbol: __real_malloc。
在库上运行nm 表明__wrap_malloc 已定义但__real_malloc 未定义。
但是,根据man ld 和this SO answer,malloc 应该被替换为__wrap_malloc 和__real_malloc 在使用这种技术时应该指向malloc。
在测试应用程序中,我看到 __real_malloc 在编译的目标文件中未定义,但在链接到可执行文件后被解析。
那么,为什么符号在测试应用程序中被解析,而在动态库中却没有呢?
在这两种情况下,都会执行最终链接步骤,该步骤应解析此符号。
或者是否需要在动态库的链接步骤中添加另一个库才能解析__real_malloc?
以防万一,不能修改通过dlopen加载动态库的目标应用程序。
【问题讨论】:
标签: c++ linux linker dynamic-library dynamic-loading