Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux ls上的LD_预加载?_Linux_Ld Preload - Fatal编程技术网

Linux ls上的LD_预加载?

Linux ls上的LD_预加载?,linux,ld-preload,Linux,Ld Preload,我正在使用下面的作为系统上open()系统调用的包装器。。。我已经把它编译成一个.so文件。。。。并将其放入/etc/ld.so.preload。它似乎工作得很好 int open(__const char *pathname, int flags, mode_t mode) { printf("in open %s\n ", pathname); //other stuff } 它适用于所有二进制文件。。。vim、touch、cat、less、head等。。。。除了“ls”命

我正在使用下面的作为系统上open()系统调用的包装器。。。我已经把它编译成一个.so文件。。。。并将其放入/etc/ld.so.preload。它似乎工作得很好

int open(__const char *pathname, int flags, mode_t mode)
{
    printf("in open %s\n ", pathname);
    //other stuff
}
它适用于所有二进制文件。。。vim、touch、cat、less、head等。。。。除了“ls”命令

我不明白为什么

如果我使用“sudols”,它将再次正确地使用包装器

那么“ls”有什么特别之处,以至于共享库加载器决定它可以跳过我的open()包装函数

vagrant@vagrant-ubuntu-trusty-64:/vagrant$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fffacbcd000)
    /usr/lib/x86_64-linux-gnu/libtracing.so (0x00007f09b0bce000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f09b09ab000)
    libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f09b07a3000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f09b03de000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f09b01da000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f09aff9c000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f09b0dd0000)
    libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f09afd97000)
我可以看到它是链接的(我的so是第二个名为libtracing.so的)

无论我是否运行sudo,其他任何命令都不会发生这种情况,它们似乎都能工作


这是因为libselinux的缘故吗?有人有什么想法吗

你运行的Linux发行版和版本是什么?ubuntu 14.04。看看这个答案。。。他说:“根据库的链接方式以及使用的优化和内联级别,您想要拦截的调用可能无法可靠地被拦截。”我想知道是否是系统调用内联的情况,这使得无法插入。我不知道你可以内联系统调用,这样LD_PRELOAD就不能工作了