如何正确使用` - 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("foon");
return 0;
}
int __wrap_foo() {
printf("wrap foon");
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
?
正如讲故事的人告诉我,我忽略了我已经在上面发布的"未定义的参考"要求:
...任何未定义的参考将符号解析为" __wrap_symbol"。任何未定义的参考 to" __real_symbol"将解决为符号。
要使用--wrap
选项,我重新安排了我的代码示例:
main.c:
#include <stdio.h>
extern int foo();
extern int __real_foo();
int __wrap_foo() {
printf("wrap foon");
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("foon");
return 0;
}
然后编译:
gcc main.c foo.c -Wl,--wrap=foo -o main
运行./main
之后的惊人输出:
foo:wrap foo
wrapfoo:wrap foo
realfoo:foo
诀窍是(如果我错了,请纠正我),foo()
和__real_foo()
的引用未在编译时定义。I. E.他们有**未定义的参考",这是链接器链接到foo()
与__wrap_foo()
和__real_foo()
链接到foo()
。
相关文章:
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板
- 有没有选项不自动所有前导下划线 _ 以导出 emscripten 中的函数?
- C++,当函子不是一个选项时,我如何编写带有自定义函数调用的模板化 RAII 包装器?
- C++将选项(子集)传递给函数的优雅方式
- C++ ld 链接器 --wrap 选项不适用于内部函数调用
- 如何确定函数的返回值在编译时选择可能的选项
- 什么是clang 选项,以便在GDB中我可以使用std :: cout作为函数参数
- 获取提升程序选项以在函数范围之后保留
- C++11 cmake O3 选项<没有用于初始化 'std::thread' 的匹配构造函数>
- 如何正确使用` - wrap`选项正确函数
- 我如何正确使用选项和标志来更改OpenMesh中的read_mesh和write_mesh函数
- C# 选项,以最好地使用具有 1000 个函数的 C++ DLL
- C++设计:具有布尔选项的函数
- 如何将命令行参数与c++中的选项一起传递给函数
- 使用分析工具的函数调用图选项时出现日食 CDT 错误
- C++选项定价函数..单独工作很好,但对于股票价格的范围(向量)来说不行
- 获得快速的k对独立散列函数的选项是什么
- 是否有任何选项可以推迟对可变参数模板中函数调用的评估
- 复制构造函数和赋值运算符实现选项 -