强制 .so 模块使用 libc 函数以防重复函数

发布于 2024-12-05 10:22:24 字数 344 浏览 3 评论 0原文

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

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

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

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

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

如果加载程序中存在相同的函数,是否可以强制 .so 模块使用 libc 版本的 malloc (或任何其他函数)?

任何帮助将不胜感激。

I'm have .so file that being loaded into binary program address space using LD_PRELOAD mechanism.

The binray program (which is not mine) has it's own implementation for malloc function.

Since my module is being loaded into that program, it uses the program's malloc instead of libc malloc which results crash.

I've complied the binary program myself (it's opensource) and I saw that changing the malloc function to mymalloc function fixes the problem.

Since in production environment I can't change the binary program I want to find other solution.

Is it possible to force .so module to use libc version of malloc (or any other function) in cases where the same function exist in the loading program?

Any help will be very appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情绪少女 2024-12-12 10:22:24

您可以尝试使用 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,另一个模块<代码>免费。如果您的 so 因 malloc 程序而崩溃,那么以下两种情况之一:您的 so 已损坏;或者程序坏了。如果是第二个,那么链接的任何其他模块也会崩溃。所以也许你应该检查你的代码......

You can try using ELF symbol versioning. Look at your libc malloc definition:

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

So if you link your .so file using a linking script such as:

GLIBC_2.0 { malloc; };

You may get what you want. Assuming, of course that the executable version of malloc is not versioned with the same name (not likely).

CORRECTION: unfortunately, it does not work! The version is used when defining the symbol. When you use it, it get the version from the exported table. But the one in the executable takes precedence....

NOTE: But note that this behavior is by design of the ELF standard. This is to ensure that all the modules in the same process use the same malloc function, and so, they can share memory, that is, one module malloc, another module free. If your so crashes with the program malloc then one of two: your so is broken; or the program is broken. If it is the second, then any other module that gets linked would also crash. So maybe you should check your code...

九命猫 2024-12-12 10:22:24

您可以使用 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() 以及您正在使用的其他任何东西执行相同的操作。

You can fetch a pointer to malloc() explicitly with dlsym().

#define __USE_GNU 1 /* needed for RTLD_NEXT */
#include <dlfcn.h>

void* (*mymalloc)(size_t a);

mymalloc = (void* (*)(size_t)) dlsym (RTLD_NEXT, "malloc");

Naturally you must do the same for free(), realloc() and whatever else you're using.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文