4

mem_malloc()とmem_free()を定義していて、それらを使用してmalloc()とfree()を置き換え、その結果、C++のnewとdeleteを置き換えたいと考えています。

私はそれらを次のように定義します:

extern "C" {

extern void *mem_malloc(size_t);
extern void mem_free(void *);

void *
malloc(size_t size) {
  return mem_malloc(size);
}

void
free(void *memory) {
  mem_free(memory);
}
}

ただし、2つのリンクエラーが発生します。

[user@machine test]$ g++ -m32 -pthread main.cpp -static  libmemnmf-O.a
/usr/lib/../lib/libc.a(malloc.o): In function `free':
(.text+0x153c): multiple definition of `free'
/tmp/ccD2Mgln.o:main.cpp:(.text+0x842): first defined here
/usr/lib/../lib/libc.a(malloc.o): In function `malloc':
(.text+0x3084): multiple definition of `malloc'
/tmp/ccD2Mgln.o:main.cpp:(.text+0x856): first defined here
libmemnmf-O.a(mem_debug.o): In function `mem_init_debug_routines':
mem_debug.c:(.text+0x83c): undefined reference to `dlopen'
mem_debug.c:(.text+0x89d): undefined reference to `dlsym'
mem_debug.c:(.text+0xa03): undefined reference to `dlclose'
mem_debug.c:(.text+0xa24): undefined reference to `dlclose'
mem_debug.c:(.text+0xa2e): undefined reference to `dlerror'
collect2: ld returned 1 exit status

1)複数定義されたmalloc()およびfree()エラーを取り除き、組み込みの定義ではなく、自分の定義を取得するにはどうすればよいですか?

2)どのライブラリがdlopen()とその友達を提供しますか?これが組み込まれていると思いますが、未定義です。

4

5 に答える 5

4

コンパイルしようとする main.cpp ファイルで malloc と free を定義し、mem_alloc と mem_free が libmemnmf-0.a にあると仮定します。

おそらく起こっていることは、main.cpp の一部の参照が glibc からのオブジェクトを必要とすることです。具体的には、何かが動的にライブラリをロードしています (dlopen)。このコードは glibc に含まれています (質問 2 に答えるために)。リンカが glibc からのオブジェクトをインクルードし、これらのオブジェクトが malloc/free シンボルを必要とすることを発見すると、glibc ライブラリから直接 malloc/free をインクルードしようとします。-static リンカー フラグにより​​、libmemnf-0.a ライブラリ全体が実行可能ファイルに静的に含まれます。これにより、実行可能ファイルに別の malloc および free オブジェクトが明らかに含まれます。

malloc ルーチンと free ルーチンを別の .o ファイルに入れ、そのファイルをリンク コマンドのどこかに、できれば最後に追加する必要があります (その行で特別な方法で標準ライブラリを指定しない場合)。.o ファイルはすべてのシンボル要求を満たし、glibc ライブラリは、dlopen または他のオブジェクトが必要とするたびに、これらの一致が解決されたことを検出します。違いは、libmnef-0.a ファイルはライブラリであり、リンカーはライブラリを単純なオブジェクトとは異なる方法で処理することです (これは、ライブラリ内のオブジェクトによって要求されたシンボルを解決するためにライブラリを通過する回数に関係しています)。または、-static フラグを削除することもできます。これにより、問題も解決されると思われますが、最初にそのフラグを含めるのには十分な理由があると思われます。

new および delete の動作をオーバーライドする場合は、クラス固有の割り当て方法またはメモリ プールを提供するために、クラスの演算子 new および演算子 delete のオーバーロードを調べることもできます。

于 2010-12-06T09:18:21.050 に答える
2

試す:

#define free mem_free
#define malloc mem_alloc

含めたstdlib.h

2.)dlopen()とその仲間たち:

#include <dlfcn.h>

リンカーフラグ:-ldl

dlopen(3)のマニュアルページを参照してください。

于 2010-12-06T09:01:51.427 に答える
1

デフォルトでmallocを定義するlibcにリンクしているので、#defineを使用して名前を変更してみてください。dlopenなどはldで定義されています。

于 2010-12-06T09:04:19.353 に答える
1

LD_LIBRARY_PATHandLD_PRELOAD環境変数を使用して、ライブラリに優先順位を付けることができます。

これにより、libc が提供するものよりも優勢なカスタム ライブラリと動的ライブラリを提供できmallocます。freeこれは、#defineベースのソリューションよりも望ましいと思います。

于 2010-12-06T09:09:15.493 に答える
0

私はこの答えを探していました。最後に、自分に合うものを見つけました。リンカーには、使用できる --wrap=symbol オプションがあります。

走る

man ld

詳細については、「ラップ」を検索してください。

誰かがこの質問を見つけたが、私の場合と同じように、答えが見つからない場合に備えて投稿しました。

于 2015-07-25T18:42:30.087 に答える