如何使用 `--wrap` 选项正确包装函数?
How to wrap functions with the `--wrap` option correctly?
gcc 6.3 的手册页说:
--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
?
正如 StoryTeller 告诉我的那样,我忽略了上面已发布的 "undefined reference" 要求:
... Any undefined reference to symbol will be resolved to "__wrap_symbol". Any undefined reference to "__real_symbol" will be resolved to 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()
的引用在编译时没有定义。即他们有 **undefined references”,这是 link 到 link foo()
到 __wrap_foo()
和 __real_foo()
到 foo()
的要求。
gcc 6.3 的手册页说:
--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
?
正如 StoryTeller 告诉我的那样,我忽略了上面已发布的 "undefined reference" 要求:
... Any undefined reference to symbol will be resolved to "__wrap_symbol". Any undefined reference to "__real_symbol" will be resolved to 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()
的引用在编译时没有定义。即他们有 **undefined references”,这是 link 到 link foo()
到 __wrap_foo()
和 __real_foo()
到 foo()
的要求。