C++确保我们调用模拟系统调用进行单元测试



当尝试用C++包装系统调用时,例如 lseek,编译的代码将调用实际的系统调用而不是我的模拟。

下面是一个示例:

/* Mock the file operation lseek. */
off_t lseek(int fd, off_t offset, int whence)
{
printf("%s n", __PRETTY_FUNCTION__);
}

如何让编译器调用我的模拟系统调用而不是 unistd.h 中的调用?

我尝试使用 -wl,--wrap=lseek 标志,但这失败了,因为链接器找不到__wrap_lseek符号。

GNU gcc/ld - 包装对符号的调用,调用方和被调用方在同一对象文件中定义

我使用g++ -c 选项进行编译,然后使用 nm 实用程序查看生成的符号的名称。

事实证明,模拟的系统调用名称被C++编译器破坏了。因此,链接器将使用正常的系统调用。

解决方案是用外部"C"包装模拟的系统调用。

以下是关于此关键字的讨论:

如何在 C 语言中正确使用 extern 关键字

最新更新