7

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

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

  2. 我需要哪些文件,哪些 OpenBSD 包包含它们?

4

4 回答 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,AFAICT 在 Linux 中不可用的标志。

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

于 2010-05-21T01:24:39.263 回答
2

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

不过,您可能必须引入一些依赖项。

于 2010-05-20T20:48:08.013 回答
2

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

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

于 2010-05-20T20:42:27.683 回答
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 例程,就像您使用任何其他模块一样(粗略的示例仅包括 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;
}

对于更系统范围的方法,我真的建议采用共享对象路线。

于 2010-05-21T15:55:09.737 回答