13

すべて。

malloc()関数を呼び出すライブラリをリンクしたい。ただし、ターゲット環境は異なり malloc()、インライン関数として提供されます。

malloc()ターゲット環境のmalloc()ルーチンに転送するためにライブラリを呼び出すにはどうすればよいですか?

エクスポートされた関数名を変更する方法はありますか?もしそうなら、私はmy_malloc()最初にコーディングしてそれをとしてエクスポートしmalloc()、ライブラリをそのライブラリにリンクすることができます:

#include <my_environment.h>  // malloc() is inline function declared there 
void my_malloc (void) {
   malloc (void);             
}

具体的には、ライブラリはlinuxディストリビューションのものであるため、libcに依存します。malloc()しかし、私の環境は組み込み環境であり、libcライブラリがなく、、、free()...はカスタム実装されています。一部はインライン関数であり、一部はライブラリ関数です。

4

3 に答える 3

39

GNUリンカ(ld)は--wrap=functionnameパラメータをサポートします。必要なことを正確に実行する必要がある例が含まれているため、manページからドキュメントを引用します。

--wrap=symbolシンボルのラッパー関数を使用します。シンボルへの未定義の参照は、「__wrap_symbol」に解決されます。「__real_symbol」への未定義の参照はすべてsymbolに解決されます。

これは、システム関数のラッパーを提供するために使用できます。ラッパー関数は「__wrap_symbol」と呼ばれる必要があります。システム関数を呼び出したい場合は、「__real_symbol」を呼び出す必要があります。

簡単な例を次に示します。

void *
__wrap_malloc (size_t c)
{
    printf ("malloc called with %zu\n", c);
    return __real_malloc (c);
}

を使用して他のコードをこのファイルにリンクすると、「」--wrap mallocへのすべての呼び出しは代わりに「malloc関数」を呼び出します。 「」の「」への呼び出しは実際の「」関数を呼び出します。"__wrap_malloc__real_malloc__wrap_mallocmalloc

__real_mallocオプションのないリンク--wrapが成功するように、「」関数も提供することをお勧めします。これを行う場合は、「」の定義を「__real_malloc」と同じファイルに入れないでください__wrap_malloc。そうした場合、リンカが呼び出しを " malloc"にラップする前に、アセンブラが呼び出しを解決する可能性があります。

于 2012-08-29T07:49:18.420 に答える
4

alias属性があなたの問題を解決するかもしれないと思います:

alias ("target")
    The alias attribute causes the declaration to be emitted as an alias for another symbol, which must be specified. For instance,

              void __f () { /* Do something. */; }
              void f () __attribute__ ((weak, alias ("__f")));


    defines `f' to be a weak alias for `__f'. In C++, the mangled name for the target must be used. It is an error if `__f' is not defined in the same translation unit.

    Not all target machines support this attribute.

http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

于 2012-08-29T07:41:46.837 に答える
-1

どうですか:

#define malloc my_malloc
#include <my_environment.h>
#undef malloc

int malloc(size_t sz)
{
   return my_malloc(sz);
}

#define malloc my_malloc
// use your malloc here
于 2012-08-29T07:52:09.350 に答える