经过设置 LD_DEBUG 环境变量,能够观察使用缺省搜索模型及最终绑定的运行时符号搜索编辑器
对于开发调试动态库颇有帮助能够设置为:
-> bindings:显示动态连接的符号绑定过程
-> libs:显示共享库的查找过程
-> versions:显示符号的版本依赖关系
-> reloc:显示重定位过程
-> symbols:显示符号表查找过程
-> statistics:显示动态连接过程当中的各类统计信息
-> all:显示以上全部信息spa
演示一个简单的例子:设计
下面分别是w.c, W.c, x.c, X.c, main.c 5 个文件调试
w.c接口
W.c开发
x.cio
X.ctest
main.c变量
下面是执行的命令.gcc
执行下面命令显示符号搜索绑定过程.
liyl@liyl-X450VC:~/sourse/gcc_option_test$ LD_DEBUG=symbols,bindings ./prog1
缺省搜索模型可能会致使同名符号的实例插入到同名的后续实例上。即便没有任何显式标签,仍然会发生插入,以便从全部引用绑定到同一个符号定义。发生该隐式插入是符号搜索的结果,而不是由于向运行时连接程序发出了任何显式指令。使用直接绑定能够禁用该隐式插入。
虽然直接绑定可以将符号引用直接解析到关联的符号定义,可是显式插入是在任何直接绑定搜索以前处理的。所以,即便是在直接绑定环境内,也能够对插入项进行设计并预期它在任意直接绑定关联上进行插入。可使用下列技术显式定义插入项。
使用 LD_PRELOAD 环境变量。
使用连接编辑器 –z interpose 选项。
singleton 符号定义产生的结果。
LD_PRELOAD 环境变量的插入功能和 –z interpose 选项已经使用了一段时间。请参见运行时插入。由于这些目标文件是显式定义为插入项的,所以运行时连接程序将在处理任何直接绑定以前检查这些目标文件。
为一个共享目标文件创建的插入将应用于该动态目标文件的全部接口。系统使用 LD_PRELOAD 环境变量装入目标文件时,会创建该目标文件插入。在装入已使用 –z interpose 选项生成的目标文件时,也会创建目标文件插入。当使用具备特殊句柄 RTLD_NEXT 的 dlsym(3C) 等技术时,该目标文件模型很重要。插入目标文件应始终具备下一个目标文件的一致视图。
经过LD_PRELOAD 环境变量显示插入符号:
例子中把a,b 的binding 从libw.so 篡改成libx.so
LD_PRELOAD=libx.so LD_DEBUG=symbols,bindings ./prog1