我在C中调用类似write()
的系统调用,另一方面,我使用write()
以这种方式调用dlsym()
:
ssize_t original_write(int fd, const void *buf, size_t count)
{
typedef ssize_t (*orig_write_type)(int, const void *, size_t);
static orig_write_type orig_write;
if (!orig_write)
orig_write = (orig_write_type) dlsym(RTLD_NEXT, "write");
ssize_t ret = orig_write(fd, buf, count);
return ret;
}
我很好奇哪条路更快?当我致电write()
时,它还会隐式调用dlsym()
来获取其地址?请指正。非常感谢你的时间。
答案 0 :(得分:1)
当谈到“哪个更快”的问题时,请使用分析器并自行计算代码。
话虽这么说,静态呼叫总是比第一次呼叫的动态呼叫更快。一旦动态加载了该函数,这两个函数应该以接近的速度运行。显示的动态方法使用了一些额外的指令来检查static
变量,因此动态调用不会像静态调用一样快 。
您可以通过完全删除static
变量来避免这种情况。编写一个存根函数并声明一个指向该存根的函数指针变量。让存根加载实际函数,更新变量以指向它,然后调用它。然后,您可以使用函数指针进行所有调用。第一次调用存根,后续每次都会直接调用实际函数。