7

glibcではなくDebianlennyデスクトップで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

Googleには、 http://code.google.com/p/google-perftools/wiki/GooglePerformanceToolsに独自のmalloc置換ライブラリがあり、その 使用方法が記載されています。彼らはあなたがする必要があるのはそれを使うために(標準バージョンがリンクされる前に)それをリンクすることだけだと言います。

これを妨げるOpenBSDバージョンについて何か特別なことがあるかどうかはわかりません。それがmallocと他のいくつかの標準ライブラリのものを一緒にした場合、それはおそらくもっと難しいでしょう。

于 2010-05-20T20:42:27.683 に答える
2

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

ただし、いくつかの依存関係を持ち込む必要があるかもしれません。

于 2010-05-20T20:48:08.013 に答える
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()ライブラリに対して(静的または動的に)リンクします。

2番目の例では、 /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 に答える