当尝试用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 关键字