【链接、装载与库】动态链接相关结构

前言

本文对动态链接中比较重要的几个段进行分析。

正文

“.interp”段

Linux系统在执行一个可执行文件之前,要先启动动态链接器对其完成一些动态链接相关工作,动态链接器的路径则在.interp段中,以【链接、装载与库】动态链接初体验一文中的例子为分析对象。
输入如下指令:

objdump -s Program1

objdump用于查看可执行文件或目标文件的内容结构,-s表示打印出目标文件的所有内容
在这里插入图片描述
对Program1打印的结果中,.interp段内容如下:
在这里插入图片描述
可以看到其内容是一段字符串,表示动态链接器的路径
/lib64/ld-linux-x86-64.so.2.
通过./Program1指令运行Program1时,会首先启动该动态链接器完成动态链接。

“.dynamic”段

这个段保存了动态链接器在进行动态链接时所需要的基本信息,如依赖哪些共享对象、动态链接符号表的位置等。
继续对Program1可执行文件进行分析,输入如下指令:

readelf -d Program1

即可打印Program1的".dynamic"段,打印内容如下:
在这里插入图片描述
内容含义如下
在这里插入图片描述

其中的

0x0000000000000001 (NEEDED) 共享库:[./Lib.so]

表示用到了在【链接、装载与库】动态链接初体验中生成的共享对象Lib.so
在这里插入图片描述

0x0000000000000005 (STRTAB) 0x470
0x0000000000000006 (SYMTAB) 0x3c8

表示动态链接符号表的地址为(.dynsym)为0x470,动态链接字符串表(.dynstr)的地址为0x3c8
查看objdump -s Program1打印的内容
在这里插入图片描述

.dynsym段和.dynstr段的起始地址都可以对应上。

动态链接符号表

Program1用到了Lib.so中的foobar()函数,foobar()是Program1的导入函数,foobar()是Lib.so的导出函数
表示动态链接这些模块之间导入导出关系的表叫做动态符号表,“.dynsym”。
存放动态链接相关符号名的字符串表叫做动态符号字符串表,“.dynstr”。
以Lib.so为例,输入如下指令:

objdump -s Lib.so

打印Lib.so的二进制内容,其中
.dynsym段内容为:
在这里插入图片描述
.dynstr段内容为:
在这里插入图片描述
可以看到.dynstr段中包含字符串foobar,导出函数。
.dynsym段二进制内容不容易看,可以输入以下指令:

readelf -s Lib.so

可以看到输出.dynsym段内容如下:
在这里插入图片描述
其中第7行用于表示foobar
其中的1119表示函数的起始地址,40表示该函数的长度。
输入如下指令得到Lib.so的反汇编内容:

objdump -S Lib2.so

其中foobar函数部分为:
在这里插入图片描述
刚好可以对应上。

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《程序员的自我修养:链接,装载》是一本由林锐、郭晓东、郑蕾等人合著的计算机技术书籍,在该书中,作者从程序员的视角出发,对链接装载等概念进行了深入的阐述和解析。 在计算机编程中,链接是指将各个源文件中的代码模块组合成一个可执行的程序的过程。链接可以分为静态链接动态链接两种方式。静态链接是在编译时将所有代码模块合并成一个独立的可执行文件,而动态链接是在运行时根据需要加载相应的代码模块。 装载是指将一个程序从磁盘上加载到内存中准备执行的过程。在装载过程中,操作系统会为程序分配内存空间,并将程序中的各个模块加载到相应的内存地址上。装载过程中还包括解析模块之间的引用关系,以及进行地址重定位等操作。 是指一组可重用的代码模块,通过链接装载的方式被程序调用。可以分为静态和动态。静态是在编译时将的代码链接到程序中,使程序与的代码合并为一个可执行文件。动态则是在运行时通过动态链接的方式加载并调用。 《程序员的自我修养:链接,装载》对于理解链接装载的原理和机制具有极大的帮助。通过学习这些概念,程序员可以更好地优化代码结构和组织,提高程序的性能和可维护性。同时,了解链接装载的工作原理也对于进行调试和故障排除具有重要意义。 总之,链接装载是计算机编程中的重要概念,对于程序员来说掌握这些知识是非常必要的。《程序员的自我修养:链接,装载》这本书提供了深入浅出的解释和实例,对于想要学习和掌握这些知识的程序员来说是一本非常有价值的参考书籍。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值