如何正确使用` - wrap`选项正确函数

How to wrap functions with the `--wrap` option correctly?

本文关键字:选项 函数 wrap 何正确      更新时间:2023-10-16

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()

的要求。