gpt4 book ai didi

c++ - 如何使用 `--wrap` 选项正确包装函数?

转载 作者:太空狗 更新时间:2023-10-29 21:12:45 25 4
gpt4 key购买 nike

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 告诉我的那样,我忽略了我已经在上面发布的“未定义引用”要求:

... Any undefined reference to symbol will be resolved to "__wrap_symbol". Any undefined reference to "__real_symbol" will be resolved to symbol.

为了使用 --wrap 选项,我重新安排了我的代码示例,如下所示:

主.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”,这是链接器将 foo() 链接到 __wrap_foo()__real_foo()foo()

关于c++ - 如何使用 `--wrap` 选项正确包装函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46444052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com