glibcではなくDebianlennyデスクトップでOpenBSDのmalloc、realloc、freeの実装を使用したいと思います。
それらは単に代替品をドロップするだけですか?それらは私の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
、AFAICTがLinuxで利用できないフラグ。
もちろん、スレッデッドコードは完全に置き換える必要があります。
Googleには、 http://code.google.com/p/google-perftools/wiki/GooglePerformanceToolsに独自のmalloc置換ライブラリがあり、その 使用方法が記載されています。彼らはあなたがする必要があるのはそれを使うために(標準バージョンがリンクされる前に)それをリンクすることだけだと言います。
これを妨げるOpenBSDバージョンについて何か特別なことがあるかどうかはわかりません。それがmallocと他のいくつかの標準ライブラリのものを一緒にした場合、それはおそらくもっと難しいでしょう。
ここで:。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()ライブラリに対して(静的または動的に)リンクします。
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;
}
よりシステム全体のアプローチについては、共有オブジェクトルートを使用することを強くお勧めします。