我使用下面作为我系统上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”命令!!
我不明白为什么。
如果我使用“sudo ls”,它最终会再次使用包装器正确....
那么“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)
我可以看到它的链接(我的第二个名为libtracing.so)。
这与我运行sudo或不运行的任何其他命令不会发生,它们似乎都有效。
这是因为libselinux的特殊之处吗?有人有什么想法?