c - 包装一个函数
问题描述
正如这里提到的,我们可以使用-Wl,--wrap
开关来包装一个函数。考虑以下程序:
#include <stdio.h>
void __wrap_f()
{
puts("wrapped");
}
void f()
{
puts("original");
}
int main(void)
{
f();
}
该程序被写入a.c
并编译为gcc -Wl,--wrap=f a.c
. 当我运行可执行文件(使用./a.out
)时,我得到original
了输出。
我的期望是在调用f()
时,将调用包装的版本并打印程序wrapped
。请让我知道我在这里缺少什么。
GCC 版本:9.1.0
解决方案
我认为这不适用于单个翻译单元。AFAIK,该f
功能需要在一个单独的文件中。
这对我有用(打印包装):
#!/bin/sh -eu
cat > main.c <<EOF
#include <stdio.h>
void __wrap_f()
{
puts("wrapped");
}
void f();
int main(void)
{
f();
}
EOF
cat > f.c <<EOF
#include <stdio.h>
void f()
{
puts("original");
}
EOF
gcc wrap.c f.c -Wl,--wrap=f && ./a.out
推荐阅读
- jupyter - Jupyter 实验室自动保存间隔
- javascript - React:尝试从子组件获取状态时状态为空
- google-apps-script - 使用 Apps 脚本返回某个单元格并使其在 Google 表格中可编辑
- mysql - 尽管使用了卷,但 Docker mysql 容器不会保留数据。为什么?
- python - Boto3 Glue客户端create_job()模块路径错误`ModuleNotFoundError`
- laravel - 播种错误:DateTime 类的对象无法转换为字符串
- javascript - 用于更新部分的 JavaScript 按钮
- c - C语言中的浮点数很奇怪
- java - 由于 android.webkit,应用在 Playstore 上不兼容
- python - 我有两个模型 Chat 和 Message,我如何使用 Message 的 pub_date 订购 Chat?