【问题标题】:Wrapping a function [duplicate]包装一个函数[重复]
【发布时间】:2019-08-28 17:28:45
【问题描述】:

here 所述,我们可以使用-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

【问题讨论】:

  • 查看关于该问题的第一条评论。其实看看答案。这是完全相同的问题。
  • 如 cmets on 和您链接到的问题的答案中所述,您忽略了“未定义的引用”要求。

标签: c gcc ld


【解决方案1】:

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

【讨论】:

  • 它适用于单个 TU,因为不会调用真正的 f()
  • 是的,我有点急切地希望用户转换到实际的包装(使用__real_f)而不是简单的符号替换。然后还需要一个实际的f
【解决方案2】:

就像您提到的答案一样,您忽略了一个事实,即您需要对f() 有一个未定义的引用

试试这个:

#include <stdio.h>

void __wrap_f()
{
        puts("wrapped");
}

void f();

int main(void)
{
        f();
}

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2017-03-18
    • 2015-10-11
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    相关资源
    最近更新 更多