首页 > 解决方案 > 包装一个函数

问题描述

正如这里提到的,我们可以使用-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

标签: cgccld

解决方案


我认为这不适用于单个翻译单元。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

推荐阅读