6

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

4

3 答案 3

4

您尝试替换的函数是标准 C 函数,而不是宏,也不是系统调用。所以你必须简单地给你的函数起相同的名字并将它们编译到一个共享库中。

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

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

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

于 2011-04-28T17:48:36.127 回答
2

不要写你malloc()malloc()- 使用sbrk直接从操作系统获取内存的写它。

于 2011-04-28T17:49:17.973 回答
1

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

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

#define malloc newCoolMalloc
#define free   newCoolFree

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

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

someThing = mallocPlaceHolder( nbytes );

然后你的定义看起来更像这样:

#define mallocPlaceHolder myCoolMalloc

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

于 2011-04-28T17:46:06.997 回答