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
の使い方は?
。
foo()
に__wrap_foo()
と__real_foo()
にfoo()
をリンクするリンカーのrequierementです**未定義の参照」を持っている。しかし、あなたは、単一の翻訳単位を持っている、と 'foo'が存在しているので、 'foo'は' foo'への**未定義のリファレンス**ではありません。 – StoryTellerこの例の出力は私には間違っています。 'foo()'は '' foo''を出力します。私は間違って何をしていますか? – eDeviser
"未定義の参照" **要件**を無視しています。 – StoryTeller