编译自定义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的函数,则它避免混合不同的库。