我想在我的Debian lenny桌面而不是glibc上使用OpenBSD的malloc,realloc和free实现。
他们只是简单地替换:他们会在我的Linux桌面上工作吗?
我需要哪些文件以及哪些OpenBSD软件包包含它们?
答案 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;
}
对于更系统化的方法,我真的建议使用共享对象路由。