编译自定义malloc

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

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

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

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

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

不要用malloc()编写malloc() – 使用sbrk编写它,它直接从操作系统获取内存。

如果您可以控制使用此库的源代码,那么这是一种可能性。 使用不同的函数名称:例如,将其称为newCoolMalloc,而不是malloc。 此方法有时更简单,不依赖于特殊的链接器选项。

然后在您的代码中,使用#define使代码调用所需的函数集。 你可以#define malloc是不同的东西。 例如:

 #define malloc newCoolMalloc #define free newCoolFree 

但是,如果你这样做,你必须非常小心地将它包括在内。 否则你冒着在一个地方使用stdlib malloc的风险,然后在另一个地方使用你自己的免费导致混乱的bug。 帮助缓解这种情况的一种方法是(如果可能)在您自己的代码中使用自定义名称进行分配和自由function。 然后更容易确保调用正确的一个。 您可以为自己的malloc函数甚至原始的stdlib malloc函数定义各种自定义名称。

例如,您可以使用mallocPlaceHolder作为代码中的实际名称:

 someThing = mallocPlaceHolder( nbytes ); 

那么你的定义看起来会更像这样:

 #define mallocPlaceHolder myCoolMalloc 

如果实际上不存在mallocPlaceHolder(和相关的free)forms的函数,则它避免混合不同的库。