转:https://blog.csdn.net/kwuwei/article/details/24721281
转:https://blog.csdn.net/buaa_shang/article/details/8929077
ldd介绍
ldd本身不是一个程序,而仅是一个shell脚本
$ file /usr/bin/ldd
/usr/bin/ldd: Bourne-Again shell script text executable
ldd命令其实是依靠设置一些环境变量而实现的(也就是说ldd的作用只是设置一些环境变量的值)
如:LD_TRACE_LOADED_OBJECTS
只要设置其值非空即可。
$ export LD_TRACE_LOADED_OBJECTS=1
$ ls /usr
linux-gate.so.1 => (0xb7fac000)
/lib/ld-linux.so.2 (0xb7fad000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7df0000)
撤销该环境变量,ls即又可以恢复正常使用:
$ unset LD_TRACE_LOADED_OBJECTS
$ ls /usr/
bin games include lib lib32 lib64 local sbin share src X11R6
例如: 执行ldd /bin/ls
ldd 在执行的时候,首先是设置LD_TRACE_LOADED_OBJECTS 环境变量,然后调用ld-linux.so.2链接器,去输出ls文件的依赖
如果我们直接运行 /lib/ld-linux.so.2 /bin/ls
可以发现ls是执行成功的。
也就是说当执行ld-linux.so.2时候,它会先判断LD_TRACE_LOADED_OBJECTS有没有被设置,如果有,就输出依赖关系,如果没有,就执行命令本身
问题
如果我们更换一个链接器,让链接器不对LD_TRACE_LOADED_OBJECTS环境变量做判断,无论什么时候都执行命令本身,那么此时的ldd命令就有很大的风险了
具体例子看这个:https://blog.csdn.net/buaa_shang/article/details/8929077
更换链接器
-Wl,–dynamic-linker,$L/lib/ld-uClibc.so.0 — 指定一个新的装载器。
linux@Ubuntu1:~/app/test$ mips-linux-gnu-gcc test.c -Wl,--dynamic-linker,/mylib/ld-hello.so
linux@Ubuntu1:~/app/test$ mips-linux-gnu-ldd a.out
checking sub-depends for 'not found'libc.so.6 => not found (0x00000000)/mylib/ld-hello.so => /mylib/ld-hello.so (0x00000000)
linux@Ubuntu1:~/app/test$
观察到,elf文件的链接器已经变了