2010-12-06 12 views
4

私はmem_malloc()とmem_free()を定義していますので、malloc()とfree()を置き換えてC++の新しい削除する。C++での使用のためにLinuxでmalloc()を再定義する方法new

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つのリンクエラーを取得し、:次のように

は、私はそれらを定義

[[email protected] 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()とフレンドを提供するライブラリは何ですか?私はこれが組み込まれていると思うだろうが、それらは未定義である。

+0

新しいと削除mallocを呼び出す必要はありません。 –

答えて

4

私がメインで、いくつかの言及ということです、あなたがコンパイルしようとすると、そのMEM_ALLOCとMEM_FREEがおそらく何が起こっているlibmemnmf-0.a

に配置されているmain.cppをファイルにmallocとfreeを定義すると仮定.cppにはglibcからのオブジェクトが必要です。具体的には、ライブラリ(dlopen)を動的にロードするものがあります。このコードはglibcに含まれています(質問2に答えてください)。 リンカがglibcからのオブジェクトを含み、これらのオブジェクトがmalloc/freeシンボルを必要とすることがわかった場合、glibcライブラリからmalloc/freeを直接インクルードしようとします。 -staticリンカーフラグのため、libmemnmf-0.aライブラリ全体が実行可能ファイルに静的に組み込まれています。これには、明らかに別のmallocとフリーオブジェクトが実行可能ファイルに含まれます。

mallocとフリールーチンを別々の.oファイルに入れ、そのファイルをリンクコマンドのどこかに追加してください(最後に優先的に標準ライブラリを特別な方法で指定しないと仮定します)。その行)。 .oファイルはすべてのシンボル要求を満たし、glibcライブラリは、dlopenや他のオブジェクトがそれらを必要とするときに、これらの一致を解決します。 違いは、libmnef-0.aファイルはライブラリであり、リンカは単純なオブジェクト(ライブラリ内のオブジェクトから要求されたシンボルを解決するためにライブラリを通過する回数と関係があります)とは異なるライブラリを扱うことです。 また、-staticフラグを削除することもできますが、問題を解決することも期待していますが、そのフラグを組み込むのは正当な理由があります。

newとdeleteの動作をオーバーライドする場合は、演算子newと演算子deleteのクラスをオーバーロードして、クラス固有の割り当てメソッドまたはメモリプールを提供することもできます。

2

試してみてください。stdlib.h含む後

#define free mem_free 
#define malloc mem_alloc 

2)のdlopen()や友人:

#include <dlfcn.h> 

リンカフラグ:-ldl

dlopen(3) man-pageを参照してください。

+0

-ldlはdlopen()とフレンドを解決しますが、#define malloc/freeはC++ new/deleteからのmalloc/free呼び出しに影響を与えません。 – WilliamKF

1

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

0

LD_LIBRARY_PATHおよびLD_PRELOAD環境変数を使用して、ライブラリに優先権を与えることができます。

これにより、libcで提供されているものを支配する動的ライブラリにカスタムmallocfreeを指定することができます。私はこれが#defineベースのソリューションよりも好ましいと考えています。

0

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

実行

man ld 

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

誰かがこの質問を見つけたが、私の自己の場合と同じように答えがどれも彼のために働かない場合に、私はこれを投稿した。

関連する問題