手把手带你了解链接全过程(二)

本文深入解析了链接过程中的关键概念,包括位置无关代码(PIC)、数据引用、函数引用及库打桩机制等,并介绍了处理目标文件的相关工具。

手把手带你了解链接全过程(二)


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就是动态链接器

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值