我已经编写了一个使用标准 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/