使用LD_PRELOAD预加载读取系统调用时,Chrome无法启动

时间:2018-05-28 02:43:45

标签: c++ linux ld-preload function-interposition

我正在开发一个项目,需要包装libc系统调用,特别是文件i / o调用,如open,read,write,close等。我打算将它用作文件操作的监视服务。

当我尝试使用gedit打开文本文件时,我已经成功包装了所有调用,并且包装器工作正常。但问题是,当预装包装器时,我无法启动谷歌浏览器和其他一些应用程序。特别是谷歌Chrome转向无限纳秒级循环。你可以看到下面的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;
}

0 个答案:

没有答案