手把手带你了解链接全过程(二)
link
位置无关代码
这是共享库实现的原理.
也就是,可以加载而无需重定位的代码称为位置无关代码(Position-Independent Code PIC),Gcc使用-fpic编译,且编译共享库必须使用
在X86-64系统中,不需要做特殊处理.目标模块中的符号的引用会自动成为PIC
PIC
数据引用
GOT(global offset table)
全局偏移量表
通过上述过程完成对动态库数据的引用
PIC
函数引用
其中PLT(Procedure Linkage Table)
过程链接表
只要目标模块中引用了共享库的任何函数,都会生成一个GOT
和一个PLT
通过上述的过程,可以完成PIC
函数引用
库打桩机制
就是链接器支持截获碎共享库的函数调用取而代之执行自己的代码,可以追踪特殊库函数的调用
- 编译时打桩
- 链接时打桩
- 运行时打桩
有兴趣可以自己取了解
处理目标文件的工具
AR
创建静态库,插入,删除,提取常用STRINGS
列出目标文件中所有可打印字符串NM
列出目标文件中的符号表中定义的符号SIZE
列出目标文件中节的名字和大小READELF
显示目标文件的完整结构OBJDUMP
显示一个目标文件所有信息LDD
可执行文件运行依赖的动态库
例如
ldd aout
linux-vdso.so.1 => (0x00007ffd3ddd1000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fdbef802000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fdbef5ec000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdbef222000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdbeef19000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdbefb84000)
其中ld-linux-x86-64.so
就是动态链接器