c++ - 如何在Linux中添加自定义的malloc

标签 c++ linux operating-system malloc

我想在 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

关于c++ - 如何在Linux中添加自定义的malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41439065/

相关文章:

c++ - 使用Boost几何找到线段的交点

linux - 在 Linux 中使用仅限 CLI 的工具生成磁盘使用情况图/图表

java - 错误 : could not find libjava. 所以,错误:找不到 Java 2 运行时环境

c - 理解 POSIX - fork()

c++ - 是否可以对所有翻译单元进行定义?

c++ - 编译时间计数/模板参数编号

C++ 在使用 VS2005 的 Windows XP 中使用 new 运算符可以动态分配的最大字节数是多少?

linux - 使用 scp 上传到附加/安装的 EBS 卷?

c - 从 micaz 读取串口

linux - posix_fadvise(WILLNEED) 使 IO 变慢?