gpt4 book ai didi

c++ - LD_PRELOAD 仅适用于 malloc,不是免费的

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:19:55 24 4
gpt4 key购买 nike

我正在尝试通过 LD_PRELOAD 将 malloc/free/calloc/realloc 等插入到一些插入器中。在我的小测试中,似乎只有 malloc 被插入,即使 free 被检测到(见输出)。

我希望输出包含一行“NANO: free(x)”——但缺少这一行。

给定

// compile with: gcc test.cc
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]) {

void* p = malloc(123);
printf("HOST p=%p\n", p);
free(p);
}

// compile with:  g++ -O2 -Wall -fPIC -ldl -o libnano.so -shared main.cc
#include <stdio.h>
#include <dlfcn.h>

typedef void *(*MallocFunc)(size_t size);
typedef void (*FreeFunc)(void*);

// Original functions
static MallocFunc real_malloc = NULL;
static FreeFunc real_free = NULL;

static void __nano_init(void) {
// Override original functions
real_malloc = (MallocFunc)dlsym(RTLD_NEXT, "malloc");
if (NULL == real_malloc) {
fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());
} else {
fprintf(stderr, "NANO: malloc() replaced @%p\n", real_malloc);
}

real_free = (FreeFunc)dlsym(RTLD_NEXT, "free");
if (NULL == real_free) {
fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());
} else {
fprintf(stderr, "NANO: free() replaced @%p\n", real_free);
}
}

// replacement functions
void *malloc(size_t size) {
if(real_malloc==NULL) __nano_init();

void *p = NULL;
fprintf(stderr, "NANO: malloc(%lu) = ", size);
p = real_malloc(size);
fprintf(stderr, "%p\n", p);

return p;
}

void free(void* ptr) {
if(real_free==NULL) __nano_init();

fprintf(stderr, "NANO: free(%p)\n", ptr);
real_free(ptr);

return;
}

实际输出为:

% ./a.out
NANO: malloc() replaced @0x3b36274dc0
NANO: free() replaced @0x3b36272870
NANO: malloc(123) = 0x601010
HOST p=0x601010

最佳答案

您正在编译 C++;这意味着(默认情况下)函数经过名称修改以适应 C++ ABI。不幸的是,您尝试 Hook 的函数没有名称错误,因此您最终 Hook 了错误的(不存在的)函数。

解决方法是 a) 在 extern "C" { } 中定义包装器 block 或 a) 确保包含函数的标题 - 如 #include <cstdlib> .这将引入 malloc 的声明。和 freeextern "C"包装器,告诉编译器不要命名。

原因malloc作品可能是因为<stdio.h><dlfcn.h>拉入 malloc 的声明但不是 free .因此,malloc未损坏,但是 free被破坏了。

另请注意:如果您使用的是 glibc,则应使用 malloc hooks Hook 内存分配函数。 glibc 用符号版本控制做了一些非常奇怪的事情,否则可能会干扰你的钩子(Hook)。如何使用它的示例在链接的文档中 - 不要忘记 extern "C"不过,如果您使用的是 C++!

关于c++ - LD_PRELOAD 仅适用于 malloc,不是免费的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811656/

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