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

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


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值