强制.so模块在函数重复的情况下使用libc函数



我有。so文件被加载到二进制程序地址空间使用LD_PRELOAD机制

binray程序(不是我的)有自己的malloc函数实现。

由于我的模块被加载到该程序中,它使用程序的malloc而不是libc malloc,这会导致崩溃。

我自己编译了二进制程序(它是开源的),我看到将malloc函数更改为mymalloc函数可以解决问题。

由于在生产环境中我无法更改二进制程序,所以我想寻找其他解决方案。

是否有可能强制。so模块在加载程序中存在相同函数的情况下使用libc版本的malloc(或任何其他函数)?

您可以尝试使用ELF符号版本控制。看看你的libc malloc定义:

$ objdump -T libc.so | grep malloc
0006fef0 g    DF .text  000001e7  GLIBC_2.0   malloc

所以如果你用链接脚本链接你的。So文件,比如:

GLIBC_2.0 { malloc; };

你可以得到你想要的。当然,假设malloc的可执行版本没有使用相同的名称进行版本控制(不太可能)。

更正:不幸的是,它不工作!版本在定义符号时使用。当您使用它时,它会从导出的表中获取版本。但可执行文件中的优先级为....

注意:但是注意这个行为是由ELF标准设计的。这是为了保证同一进程中的所有模块使用相同的malloc功能,从而使它们可以共享内存,即一个模块malloc,另一个模块free。如果您的so与程序malloc一起崩溃,则以下两种情况之一:您的so损坏了;或者程序坏了。如果是第二个,那么任何其他被链接的模块也会崩溃。也许你应该检查一下你的代码

可以通过dlsym()显式获取指向malloc()的指针。

#define __USE_GNU 1 /* needed for RTLD_NEXT */
#include <dlfcn.h>
void* (*mymalloc)(size_t a);
mymalloc = (void* (*)(size_t)) dlsym (RTLD_NEXT, "malloc");

当然,你必须为free(), realloc()和其他任何你正在使用的做同样的事情。