我希望在我的Debian lenny桌面上使用OpenBSD的malloc,realloc和free实现,而不是glibc的。
它们是否只是可以直接替换:它们能在我的Linux桌面上工作吗?
我需要哪些文件以及哪个OpenBSD包含它们?
从技术上讲,它完全可移植,因为它使用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中不可用。
线程代码当然需要完全替换。
这里是:http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/malloc.c
。
你可能需要引入一些依赖项。
您可以像使用 其他 (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;
}
如果想要更系统化的方法,我真的建议采用共享对象路线。