2017-09-27 34 views
3

manページは言う:`--wrap`オプションで関数を正しくラップする方法は? GCC 6.3の

:これは私に警告を与えた

gcc main.c -Wl,--wrap=foo -o main 

#include <stdio.h> 

int foo() { 
    printf("foo\n"); 
    return 0; 
} 

int __wrap_foo() { 
    printf("wrap foo\n"); 
    return 0; 
} 

int main() { 
    printf("foo:");foo(); 
    printf("wrapfoo:");__wrap_foo(); 
    printf("realfoo:");__real_foo(); 
    return 0; 
} 

し、それをコンパイル:

--wrap=symbol 
      Use a wrapper function for symbol. Any undefined reference to 
      symbol will be resolved to "__wrap_symbol". Any undefined 
      reference to "__real_symbol" will be resolved to symbol. 
      ... 
      If you link other code with this file using --wrap malloc, then all 
      calls to "malloc" will call the function "__wrap_malloc" instead. 
      The call to "__real_malloc" in "__wrap_malloc" will call the real 
      "malloc" function. 

は、だから私は、簡単な例を作成しました

main.c:18:21: warning: implicit declaration of function ‘__real_foo’ [-Wimplicit-function-declaration] 
    printf("realfoo:");__real_foo(); 
        ^~~~~~~~~~ 

まあまあです。今、私はこのような出力を示唆している。その代わり

foo:wrap foo 
wrapfoo:wrap foo 
realfoo:foo 

を私はこれを取得:

foo:foo 
wrapfoo:wrap foo 
realfoo:foo 

私は事は明らかであると思います。私は警告について混乱しています。通常、__real関数は、リンカーによってfoo()にリンクされている必要があります。さらにfoo()への電話は__wrap_fooにリンクする必要があります。しかし出力は、foo()が代わりに実行されていることを示しています。

--wrapの使い方は?

+4

foo()__wrap_foo()__real_foo()foo()をリンクするリンカーのrequierementです**未定義の参照」を持っている。しかし、あなたは、単一の翻訳単位を持っている、と 'foo'が存在しているので、 'foo'は' foo'への**未定義のリファレンス**ではありません。 – StoryTeller

+0

この例の出力は私には間違っています。 'foo()'は '' foo''を出力します。私は間違って何をしていますか? – eDeviser

+2

"未定義の参照" **要件**を無視しています。 – StoryTeller

答えて

2

落語は、私はすでに上に掲載、「未定義の参照」の要件を無視、私に言ったよう:

を...シンボルにどれ未定義の参照は「__wrap_symbol」に解決されます。任意定義されていない参照〜 "__real_symbol"はシンボルに解決されます。

私はこのように私のコード例を再配置--wrapオプションを使用するには:

のmain.c:

#include <stdio.h> 
extern int foo(); 
extern int __real_foo(); 

int __wrap_foo() { 
    printf("wrap foo\n"); 
    return 0; 
} 

int main() { 
    printf("foo:");foo(); 
    printf("wrapfoo:");__wrap_foo(); 
    printf("realfoo:");__real_foo(); 
    return 0; 
} 

のfoo.c:

#include <stdio.h> 
int foo() { 
    printf("foo\n"); 
    return 0; 
} 

次にコンパイルします。

gcc main.c foo.c -Wl,--wrap=foo -o main 

と驚くほど出力./mainを実行した後、:

foo:wrap foo 
wrapfoo:wrap foo 
realfoo:foo 

トリックfoo()__real_foo()の参照はコンパイル時に定義されていないこと(私が間違っているなら、私を修正)です。 、通話をIEは、彼らはそれが仕事をした

関連する問題