3
GCC 6.3的手冊頁說:如何正確使用`--wrap`選項來包裝函數?
--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.
所以我創建了一個簡單的例子:
#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;
}
並編譯它:
gcc main.c -Wl,--wrap=foo -o main
這給了我一個警告:
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'存在,通話到'foo'不是一個**未定義的引用**到'foo'。 – StoryTeller
嗯,我不明白。上面的例子的輸出對我來說似乎是錯誤的。'foo()'應該輸出''wrap foo' ! 我究竟做錯了什麼? – eDeviser
您忽略了「未定義參考」**要求**。 – StoryTeller