在我的程序中使用OpenBSD的malloc,realloc和free

时间:2010-05-20 20:25:34

标签: c linux malloc bsd openbsd

我想在我的Debian lenny桌面而不是glibc上使用OpenBSD的malloc,realloc和free实现。

  1. 他们只是简单地替换:他们会在我的Linux桌面上工作吗?

  2. 我需要哪些文件以及哪些OpenBSD软件包包含它们?

4 个答案:

答案 0 :(得分:4)

从技术上讲,它使用mmap(2)非常便携,但你不能只复制和粘贴。

供参考:

文件是:

http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c

http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/arc4random.c

http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/lib/libc/include/thread_private.h

另外还有一对定义:

PGSHIFT,它必须是系统页面大小的log2。而MADV_FREE是AFAICT在Linux中无法使用的标志。

当然,线程代码需要完全替换。

答案 1 :(得分:2)

Google拥有自己的malloc替换库 http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools 有使用说明。他们说你需要做的就是将它链接起来(在链接标准版本之前)使用它。

我不知道OpenBSD版本是否有什么特别之处可以防止这种情况发生。如果它是malloc和其他一些标准库的东西,它可能会更加困难。

答案 2 :(得分:2)

此处: http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c

你可能不得不引入一些依赖。

答案 3 :(得分:1)

您可以像使用other(1)replacement(2)malloc()子系统一样使用它。

在第一个示例中,malloc()通常替换为:

#define malloc(n) GC_malloc(n)
#define calloc(m,n) GC_malloc((m)*(n))
...
#define free(n) GC_free(n)

然后链接新的malloc()库(静态或动态)。

在第二个示例中,LD_PRELOAD用于拦截对malloc() / free()的调用。

我建议你做的是第一个选项,创建一个名为bsdmalloc的静态/共享对象,并根据需要链接它。

您还可以选择使用您的代码构建BSD malloc例程,就像您使用任何其他模块一样(粗略示例仅包括其中malloc为原型的stdlib):

#include <stdlib.h>

#define malloc(n) BSD_malloc(n)

void *BSD_malloc(int n)
{
        return NULL;
}


int main(void)
{
   char *ret;

   ret = (char *) malloc(1024);

   return ret == NULL ? 1 : 0;
}

对于更系统化的方法,我真的建议使用共享对象路由。