可以强制可执行文件使用用户定义的'malloc'吗?

时间:2016-12-25 14:43:22

标签: c debugging memory-management compilation linker

我想了解内存跟踪器和检漏仪是如何工作的,所以我想到了这个想法,我有一个可执行文件,我想在执行时强制它使用我自己的内存分配函数而不是通常的系统函数(“ malloc“,”realloc“......)。

我自己的函数存储在一个库(静态或共享)或只是一个目标文件(“.o”)中,大概是这样的:

void *my_own_malloc(unsigned long size) {
     printf("allocate: %lu\n", size);
     return malloc(size);
}

PS:我不必更改可执行源代码(我没有源代码)

PS2:我希望在所有不同平台(Windows,OS X和Linux ......)中实现这一目标。

1 个答案:

答案 0 :(得分:3)

我不了解其他平台,但在GNU / Linux上,您可以使用LD_PRELOAD环境变量预加载一个小型内存跟踪库,其中包含您自己的malloc和{ {1}}已定义。

您自己的free可能希望使用真实malloc函数分配内存,因此这里可能存在递归问题。要解决此问题,dlsym函数可以使用malloc参数来获取指向下一个(即真正的')RTLD_NEXT函数的指针。

对此的一个非常小的测试可能如下所示:

malloc

如果我们调用此文件#define _GNU_SOURCE #include <dlfcn.h> #include <stdio.h> void *malloc(size_t size) { static void *(*real_malloc)(size_t size) = 0; if (!real_malloc) real_malloc = dlsym(RTLD_NEXT, "malloc"); void *result = real_malloc(size); fprintf(stderr, "malloc(%d) = %p\n", (int)size, result); return result; } void free(void *ptr) { static void (*real_free)(void *ptr) = 0; if (!real_free) real_free = dlsym(RTLD_NEXT, "free"); real_free(ptr); fprintf(stderr, "free(%p)\n", ptr); } ,可以使用命令将其编译为fakemalloc.c共享对象

fakemalloc.so

作为测试,要查看调用gcc -fPIC -shared -Wl,-soname,fakemalloc.so -o fakemalloc.so fakemalloc.c -ldl 命令时发生的mallocfree次调用,您需要执行

ls

编辑如评论中所述,在glibc系统上,您可以使用LD_PRELOAD=/path/to/fakemalloc.so ls RTLD_NEXT函数来避免__libc_malloc方法。这将产生以下代码:

__libc_free