编译自定义 malloc

标签 c linker malloc dynamic-linking

我已经编写了一个使用标准 C 原型(prototype)实现 malloc/calloc/realloc/free 的自定义库,并且我想出了如何将它编译成 so。我想通过链接标准应用程序来测试库吗?这样做的好方法是什么?一旦我有了一个工作库,我假设我可以用 LD_PRELOAD 加载它,但是我如何让我的函数与系统库共存但优先于系统库?我的函数需要调用 malloc 才能让内存运行,所以我不能完全放弃 stdlib...求助?

最佳答案

您尝试替换的函数是标准 C 函数,不是宏,也不是系统调用。因此,您必须简单地为您的函数指定相同的名称并将它们编译到一个共享库中。

然后,使用 LD_PRELOAD 在二进制文件启动之前预加载您的库。由于所有地址都被解析一次,链接器将找出您的函数的地址并记住它们的名称,以后不会在标准库中查找它们。

如果您的程序静态链接到标准运行时,则此方法可能不起作用。此外,它不适用于 Mac OS X,因为还有另一个用于插值的 API。

例如,在 Linux 中,为了让您的函数共存(即如果您想在您自己的 malloc 实现中使用系统 malloc),您必须使用 dlopen 手动打开标准库,使用 dlsym 查找您需要的函数,稍后通过地址调用它们。

关于编译自定义 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5822788/

相关文章:

C: fork 新进程失败

linux - ld 找不到文件

可以从编译时未知的其他地方修改 const 变量吗

c++ - 当同一个库动态和静态链接到 C++ 程序时会发生什么?

c - 当我想将数组写入文件时内存损坏

c - 在 C 中从字符串转换为整数时出现内存泄漏(?)

c++ - 在 C 代码中为 Matlab/LabView 接口(interface)创建 DLL 包装器

c - 释放 getline() 缓冲区后丢失的字节

c - 一个求字符串长度的程序

c - 写入动态内存