ldd的原理
/lib/ld.so
a.out dynamic linker/loader
/lib/ld-linux.so.{1,2}
ELF dynamic linker/loader
/etc/ld.so.cache
File containing a compiled list of directories in which to search for libraries and an ordered list of candidate libraries.
/etc/ld.so.preload
File containing a whitespace separated list of ELF shared libraries to be loaded before the program.
lib*.so*
shared libraries正是基于以上原理, 我们其实可以非常简单的猜想到ldd命令的内部逻辑, 它只是简单校验命令行参数, 然后将参数最后传递给ld-linux.so文件, 利用链接器读取ELF文件中的so依赖关系而已. 所以在系统中ldd命令真的只是一个shell脚本, 不要惊讶于一个shell脚本有这样强大的功能, 这个脚本只是编译工具,链接工具某一个简单阶段的接口调用而已. 想真正的去了解连接器是如何工作的. 推荐各位仔细研读ELF文件格式. 明白了可读的文本最终如何被编译链接, 并加载启动的流程之后, 所有东西最终都无比明白.
add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
add_env="$add_env LD_LIBRARY_VERSION=\$verify_out"
add_env="$add_env LD_VERBOSE=$verbose"
if test "$unused" = yes; then
add_env="$add_env LD_DEBUG=\"$LD_DEBUG${LD_DEBUG:+,}unused\""
fi
# The following use of cat is needed to make ldd work in SELinux
# environments where the executed program might not have permissions
# to write to the console/tty. But only bash 3.x supports the pipefail
# option, and we don't bother to handle the case for older bash versions.
if set -o pipefail 2> /dev/null; then
try_trace() {
eval $add_env '"$@"' | cat
}
else
try_trace() {
eval $add_env '"$@"'
}
fi一个简单的模仿: 自己export LD_TRACE_LOADED_OBJECTS=1, 然后运行ls命令。。。
389




被折叠的 条评论
为什么被折叠?



