gpt4 book ai didi

c++ - 在运行时使用 LD_PRELOAD 链接函数

转载 作者:IT王子 更新时间:2023-10-29 00:45:15 25 4
gpt4 key购买 nike

我正在编写一个库,通过使用 LD_PRELOAD=mylib myexe 运行程序,在运行时拦截对 mallocfree 的调用。

mallocfree 的调用可以正常拦截。我的问题是 mylib 中还有另一个函数,我也想在使用 LD_PRELOAD 时拦截它,我无法弄清楚为什么它不像对 malloc 的调用那样“正常工作” > 和免费

在 mylib.c 中:

void* malloc(size_t s)
{
return doMyMalloc();
}

void free(void* p)
{
doMyFree(p);
}

void otherThing(size_t)
{
doThing();
}

在 myexe.cpp 中:

#include <malloc.h>

extern "C" void otherThing(size_t); // Compile with -Wl,--unresolved-symbols=ignore-all

int main(int argc, char* argv[])
{
void* x = malloc(1000); // Successfully intercepted.
free(x); // Successfully intercepted.
otherThing(1); // Segfault.
}

我设法让它工作的一种方法是:

typedef void (*FUNC)(size_t);
FUNC otherThing = NULL;

int main(int argc, char* argv[])
{
otherThing = (FUNC)dlsym(RTLD_NEXT, "otherThing");
otherThing(1); // Successfully calls mylib's otherThing().
}

但我不想写所有这些代码;对于 mallocfree,我不必这样做。如果缺少 LD_PRELOAD 前缀程序崩溃也没关系。

最佳答案

我觉得您正在应用一个解决方案 (LD_PRELOAD) 来解决两个不同的问题。首先,您要修补 malloc()free()。你有那个工作 - 太棒了。接下来,您希望拥有一个运行时“插件”系统,在该系统中您不在构建时链接任何库,而仅在运行时链接。这通常是使用 dlopen()dlsym() 完成的,我建议您使用它们。

这个想法是您不想在构建时指定 otherThing() 的特定实现,但您确实需要在运行时有一些实现(或者您正确地期望崩溃) .因此,让我们明确说明并使用 dlsym() 在运行时解析函数名称,当然还有错误检测以防找不到它。

至于在哪里定义otherThing(),可以在给dlopen()的完全独立的文件中,也可以在mylib中(在这种情况下,将 NULL 作为文件名传递给 dlopen())。

关于c++ - 在运行时使用 LD_PRELOAD 链接函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16126931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com