漯河企业网站建设,做网站的原理,汕头h5建站,云南微网站建设的公司有哪些链接和加载(linker and loader)#xff1a;
linker即链接器#xff0c;它负责将多个.c编译生成的.o文件#xff0c;链接成一个可执行文件或者是库文件#xff1b;
loader即加载器#xff0c;它原本的功能很单一只是将可执行文件的段拷贝到编译确定的内存地址即可#x…链接和加载(linker and loader)
linker即链接器它负责将多个.c编译生成的.o文件链接成一个可执行文件或者是库文件
loader即加载器它原本的功能很单一只是将可执行文件的段拷贝到编译确定的内存地址即可但是有了动态链接库以后部分的外部库引用符号在加载的时候才会得到解析所以加载也要处理链接器的相同操作重定位。
重定位原理
符号表(Symbol Table)
符号表就是一张字符符号和地址的对应表符号表的作用就是一个助记符用一个字符串来标示某些抽象的地址它能标示的地址有代码地址和数据地址代码地址包括函数名、跳转标号数据地址包括全局变量。
符号表的组织如下图所示 符号表的作用就是将符号名称和地址进行绑定。而绑定的根本目的就是方便对符号的引用在符号值发生改变的时候不需要去手工改动源代码中对符号引用的地方而这种改动是由链接程序在重新生成执行文件时自动完成的。
重定位表(Relocation)
有了符号表就需要有人对符号表进行引用在程序的执行过程中对全局变量的引用、跳转、调用函数这些都涉及到相应的符号引用。符号和其引用是一对多的关系一个符号可能被代码中多处引用。因为符号值改变的时候也需要对所有引用符号的地方的代码进行修改所以需要还有一张表来记录符号表的引用关系这就是重定位表 从上图可见重定位表项用来记录链接和加载的过程中需要重新定位的位置在各个段位置发生改变而引起符号地址改变时根据重定位表来修改符号引用的值。
GOT表(Global Offset Table)
加载过程中的重定位使用了一种改良的重定位手段即通过两张间接访问表来屏蔽掉重定位带来的对代码的修改访问外部数据使用GOT访问外部程序使用PLT。这样可链接出位置无关代码PICPosition Independent Code需要重定位时只需要修改GOT和PLT的值而不需要去改动可执行代码。 PLT表(Procedure Linkage Table)
加载过程中的重定位为了避免对代码的修改引入了GOT来屏蔽对数据的访问同理对外部代码的访问也是可以用GOT来访问的。但是为了实现动态链接的特性即使用的时候才链接不使用时可以不用链接对外部代码的访问引入了一个新的表项PLT。 elf文件
elf文件格式
Linux环境下三种类型的执行文件都可以使用elf格式来表示可重定位文件即编译生成但是未连接的文件、动态库文件、可执行文件。
Elf文件提供了两种文件解析的视角链接视角和动态加载视角。链接视角使用section的概念来解析文件主要关注链接过程的使用动态加载视角使用segment的概念来解析文件主要关注加载和动态链接的实现。 整个文件的组织框图如上所示ELF头描述了section header table和program header table的起始位置、表项大小和个数。根据section header table来寻址相应的section根据program header table来寻址相应的segment可以看到一般是一个segment包含多个section。
Linux下可以操作elf文件的有以下工具
a.readelf
“readelf –a file“读出elf文件的所有信息。b.nm
“nm file“读出elf文件的符号表信息。c.objdump
“objdump –d file“反汇编出elf文件中包含可执行代码的sectionelf命令中功能最强大的一个。d.objcopy
转换elf文件为bin或者其他格式的文件编译内核的时候会使用到。e.strip
去掉elf文件中符号表和调试信息对elf文件进行减肥。f.addr2line
将绝对地址转换成调试信息中的源文件行号。elf文件中符号表和调试信息对elf文件进行减肥。
f.addr2line 将绝对地址转换成调试信息中的源文件行号。