GCC的--wrap
是一个链接器选项,假如我们要编译的源文件为main.c
,编译命令如下:
gcc main.c -Wl,--wrap=func -o main.elf
有以下效果:
- 如果符号
func
没有(在当前源文件)定义,就链接到__wrap_func
- 如果符号
__real_func
没有(在当前源文件)定义,就链接到func
举例如下:
/* a.c */
#include <stdio.h>
extern int foo();
extern int __real_foo();
int __wrap_foo() {
printf("wrap foo\n");
return 0;
}
int main () {
printf("foo:");
foo();
printf("wrapfoo:");
__wrap_foo();
printf("realfoo:");
__real_foo();
return 0;
}
/* b.c */
#include <stdio.h>
int foo() {
printf("foo\n");
return 0;
}
int __real_foo() {
printf("__real_foo\n");
return 0;
}
执行
gcc a.c b.c -Wl,–wrap=foo -o main
./main
输出如下:
foo:wrap foo
wrapfoo:wrap foo
realfoo:foo