Linux ls上的LD_预加载?
我正在使用下面的作为系统上open()系统调用的包装器。。。我已经把它编译成一个.so文件。。。。并将其放入/etc/ld.so.preload。它似乎工作得很好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”命
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就不能工作了