【问题标题】:Use OpenBSD's malloc, realloc and free in my program在我的程序中使用 OpenBSD 的 malloc、realloc 和 free
【发布时间】:2010-05-20 20:25:33
【问题描述】:

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

  1. 它们只是简单的替换:它们可以在我的 Linux 桌面上工作吗?

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

【问题讨论】:

  • 我知道 OpenBSD 的 malloc 特性,但你有什么理由在 GNU/Linux 中使用它?

标签: c linux malloc bsd openbsd


【解决方案1】:

从技术上讲,它使用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 中不可用的标志。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这很有趣,但这不是我所指的那种特别之处。我指的是依赖关系或包含与 Linux 的 glibc 冲突的事物的版本。如果 OpenBSD 的 malloc 需要从 OpenBSD 的 libc 中获取它的散列函数,但那不在 Linux 的 glibc 中,就会出现问题。如果 glibc 中的某些东西以某种方式依赖于 malloc 以某种方式实现(这将是愚蠢的),那么就会出现问题。如果构建 OpenBSD 的 malloc 库而不使用所有其他 libc 内容(例如 stdio)并不容易,那么可能会出现问题。感谢您的链接。
    • 顺便说一句,我知道我提到的大多数潜在问题可能都不存在。它们只是可能性。
    【解决方案3】:
    【解决方案4】:

    您可以像使用 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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 1970-01-01
      • 2012-02-22
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多