g ++/clang覆盖特定函数的链接器

Mar*_*ork 2 c++ linker g++ clang

是否有一种简单的方法来指定要使用的替代功能(链接器)而不是标准功能?

我有一个打开/关闭/读/写系统函数的包装器.我可以相对容易地测试这些函数的良好路径的功能.

但是测试潜在的错误更难.为此,我需要打开/关闭/读/写以生成每个测试的特定错误代码.有没有办法在这些函数的替代版本中链接,然后我可以编程以在返回之前设置适当的errno值?

Mik*_*han 5

链接器选项--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_openprog; 只是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.但是既然你想要敲除系统调用,你就可以避免复杂化.