在我的程序中使用OpenBSD的malloc、realloc和free函数

7

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

  1. 它们是否只是可以直接替换:它们能在我的Linux桌面上工作吗?

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


我知道OpenBSD的malloc功能,但你在GNU/Linux中使用它的原因是什么? - user454322
4个回答

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 是一个标志,在Linux中不可用。

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


2
谷歌有自己的malloc替代库,可以在http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools找到使用说明。他们说只需要链接它(在标准版本之前链接)即可使用。
我不知道OpenBSD版本是否有什么特殊之处会阻止这个。如果它是malloc和其他标准库一起使用,那么可能会更加困难。

1
这很特别-看一下:http://www.openbsd.org/papers/eurobsdcon2009/otto-malloc.pdf - Nikolai Fetissov
这很有趣,但这不是我所指的特殊类型。我指的是依赖项或包含与Linux的glibc冲突的版本的事物。如果OpenBSD的malloc需要从OpenBSD的libc获取其哈希函数,但这不在Linux的glibc中,则会出现问题。如果glibc中的某些内容以某种方式依赖于以某种方式实现malloc(这将是愚蠢的),则会出现问题。如果构建OpenBSD的malloc库而没有所有其他libc内容(例如stdio)不容易,可能会出现问题。感谢提供链接。 - nategoose
顺便说一句,我知道我提到的大多数潜在问题可能不存在。它们只是可能性。 - nategoose

2

1

您可以像使用 其他 (1) 替换 (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例程,就像构建任何其他模块一样(包括只有stdlib的简单示例,其中malloc被原型化):

#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;
}

如果想要更系统化的方法,我真的建议采用共享对象路线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接