我正在开发一个项目,该项目需要包装 libc 系统调用,特别是文件 i/o 调用,如打开、读取、写入、关闭等。我打算将其用作文件操作的监视服务。
我已经成功地包装了所有的调用,当我尝试用 gedit 打开一个文本文件时,包装器工作得很好。但是,问题是当包装器被预加载时,我无法启动谷歌浏览器和其他一些应用程序。特别是谷歌浏览器进入了一个无限的 nanosleep 循环。您可以在下面看到 strace。
调试后我发现是导致问题的读取和关闭系统调用。当我删除用于读取和关闭的包装函数时,一切正常。我可以做的一件事是禁用谷歌浏览器的包装器,但我很想知道是否有人遇到过同样的问题并找到任何解决方法或解决方案。我已经看到了其他包装器实现并尝试了它们,它遇到了同样的问题。我在这里错过了一些非常微不足道的东西吗?
set_tid_address(0x7f140cddad50) = 23827
set_robust_list(0x7f140cddad60, 24) = 0
rt_sigaction(SIGRTMIN, {0x7f140c867b50, [], SA_RESTORER|SA_SIGINFO, 0x7f140c873390}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x7f140c867be0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7f140c873390}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
open("/dev/urandom", O_RDONLY) = 3
futex(0x7f140c8610a8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
nanosleep({0, 2000001}, NULL) = 0
这是我的 read() 包装函数:
ssize_t read(int fd, void *buf, size_t count) {
ssize_t (*libc_read) (int df, void* buf, size_t count);
dlerror();
libc_read = (ssize_t (*) (int df, void* buf, size_t count))
dlsym(RTLD_NEXT, "read");
// If a dynamic link error occurred
if (dlerror() || (libc_read == NULL)) {
return EOF;
}
// Call the system function
size_t bytes_read = libc_read(fd, buf, count);
return bytes_read;
}