我想在Linux操作系统中添加一个自定义的malloc函数(例如'self_malloc()')和一个选择函数(如'selec_malloc()')。
每当进程需要调用 malloc 进行内存分配时,操作系统都会调用 selec_malloc() 来决定调用原始 malloc 或 self_malloc()
也就是说,我想在调用 malloc 之前添加一个选择函数。那么有没有办法实现这一目标以及我需要做什么?
希望得到您的帮助。
malloc不是Linux的一部分,而是libc的一部分。您可以提供自己的 libc 版本,其中包含不同的 malloc 实现。在这种情况下,您可以通过切换库搜索路径在不同的 malloc 版本之间切换。
另一种选择是使用LD_PRELOAD。这会在启动程序时预加载共享库。通过这种方式,您可以使用预加载库中的版本重载共享库中的函数。您甚至可以使用 dlsym 从代码中调用原始版本,RTLD_NEXT如下所示:
typedef void *(*malloc_ptr)(size_t size);
void *malloc(size_t size) {
malloc_ptr _malloc;
_malloc=(malloc_ptr)dlsym(RTLD_NEXT,"malloc"); // look up original malloc()
return malloc_(size); // and invoke it
}
选择使用哪个 malloc 版本取决于是否存在LD_PRELOAD。如果设置,将使用预加载的malloc,如果未设置,将使用标准版本。
调用程序如下所示:
LD_PRELOAD=libmymalloc.so ./a.out