链接器选项--wrap就是为此目的.
一些代码调用open: -
main.c中
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#define N 32
int main(int argc, char *argv[])
{
char buf[N] = {0};
int fd = open(argv[1],O_RDONLY);
read(fd,buf,N - 1);
puts(buf);
close(fd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为简单起见,这是一个程序,但它不一定是.
使用真实open:
$ gcc -Wall -c main.c
$ gcc -o prog main.o
$ echo "Hello world" > hw.txt
$ ./prog hw.txt
Hello world
Run Code Online (Sandbox Code Playgroud)
open必须调用您的替代方案,如果需要,__wrap_open必须引用真实open,如下所示__real_open:
dbg_open.c
#include <stdio.h>
extern int __real_open(const char *path, int oflag);
int __wrap_open(const char *path, int oflag)
{
printf("In tester %s\n",__FUNCTION__);
return __real_open(path,oflag);
}
Run Code Online (Sandbox Code Playgroud)
有没有必要重新编译main.c,以取代open与__wrap_open中prog; 只是main.o在不同的链接中重用prog
$ gcc -Wall -c dbg_open.c
$ gcc -o prog main.o dbg_open.o -Wl,--wrap=open
$ ./prog hw.txt
In tester __wrap_open
Hello world
Run Code Online (Sandbox Code Playgroud)
如果您的__wrap_foo替代方案需要淘汰C++函数,
foo那么您需要获取foo在链接选项中指定的修改--wrap=mangled-foo.但是既然你想要敲除系统调用,你就可以避免复杂化.