强制 .so 模块使用 libc 函数以防重复函数
我有 .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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以尝试使用 ELF 符号版本控制。查看您的 libc malloc 定义:
因此,如果您使用链接脚本链接您的 .so 文件,例如:
您可能会得到您想要的。当然,假设
malloc
的可执行版本没有使用相同的名称进行版本控制(不太可能)。更正:不幸的是,它不起作用!定义符号时使用版本。当您使用它时,它会从导出的表中获取版本。但可执行文件中的优先......
注意:但请注意,此行为是 ELF 标准设计的。这是为了确保同一进程中的所有模块都使用相同的
malloc
函数,因此它们可以共享内存,即一个模块malloc
,另一个模块<代码>免费。如果您的 so 因malloc
程序而崩溃,那么以下两种情况之一:您的 so 已损坏;或者程序坏了。如果是第二个,那么链接的任何其他模块也会崩溃。所以也许你应该检查你的代码......You can try using ELF symbol versioning. Look at your libc malloc definition:
So if you link your .so file using a linking script such as:
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 modulemalloc
, another modulefree
. If your so crashes with the programmalloc
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...您可以使用
dlsym()
显式获取指向malloc()
的指针。当然,您必须对
free()
、realloc()
以及您正在使用的其他任何东西执行相同的操作。You can fetch a pointer to
malloc()
explicitly withdlsym()
.Naturally you must do the same for
free()
,realloc()
and whatever else you're using.