2014年1月2日

Chap-4 Section 4.2 符号解析和重定位

摘要: 在完成空间和地址的分配步骤后,链接器进入了符号解析与重定位的步骤,这也是静态链接的核心内容。首先看一下目标文件a.o中怎么使用两个外部符号shared和swap的。用objdump -d a.o查看反汇编后的结果,如图4.2.1:***图4.2.1***可以很清楚的看到a.o的反汇编结果中,a.o共定义了一个函数main,这个函数占用0x2b个字节,共12条指令,最左边那列是每条指令的偏移量,每行代表一条指令,有的指令很长,例如偏移量为0x09和0x11的两条指令,对于变量shared引用的是偏移为0x11的movl指令,这条指令共计8个字节,作用是将shared的地址赋值给esp寄存器+4的 阅读全文

posted @ 2014-01-02 23:47 Persistence 阅读(543) 评论(0) 推荐(0)

Chap-4 Section 4.1 静态链接介绍

摘要: 当我们又两个目标文件时,如何将他们链接起来形成一个可执行文件?这个过程发生了什么?这基本上就是链接的核心:静态链接。在本章中,将会用一下两个源文件a.c和b.c做为例子说明://a.cextern int shared;int main() { int a = 100; swap(&a, &shared); return 0;}//b.cint shared = 1;void swap(int* a, int* b) { *a ^= *b ^= *a ^= *b;}4.1 空间与地址分配对于多个输入目标文件,链接器如何将它们的各个段合并到输出文件?或者说,输出文件中的空间如何分 阅读全文

posted @ 2014-01-02 23:44 Persistence 阅读(252) 评论(0) 推荐(0)

Chap-3 Section 3.6 符号修饰和函数签名

摘要: C++符号修饰C++拥有类、继承、虚机制、重载、名称空间这些特性,使得符号管理更加复杂。例如:针对如下两个函数fun(int)和fun(double),函数名字相同,但是参数不同,这是C++里面函数重载的最简单的一种情况,那么编译器和链接器在链接过程中是怎样区分这两个函数呢?为此,C++引入了符号修饰(Name Decoration)和符号改编(Name Mangling)。比如有如下代码://nameDe.cint func(int);float func(float);class C { int func(int); class C2 { int func(int); };};names. 阅读全文

posted @ 2014-01-02 23:41 Persistence 阅读(224) 评论(0) 推荐(0)

Chap-3 Section 3.5 弱符号与强符号

摘要: 链接器解析符号的方法是将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义联系起来。对那些和引用定义在相同模块中的本地符号引用,符号解析很直接。编译器只允许每个模块中每个本地符号只有一个定义。不过对于全局符号的引用就稍微麻烦一些,当编译器遇到一个不是在当前模块中定义的符号(变量或者函数名)时,它会假设该符号是在其他某个模块中定义的,生成一个链接器符号表条目,并把它交给链接器处理。如果链接器在它的任何输入模块 中找不到这个被引用的符号,它就输出一条错误信息并且终止。 在编译时,编译器向汇编器输出每个全局符号,或者是强(strong)或者是弱(weak),而汇编器把这个信息隐含地编码 阅读全文

posted @ 2014-01-02 23:39 Persistence 阅读(274) 评论(0) 推荐(0)

Chap-3 Section 3.5 ELF符号表结构

摘要: ELF文件中的符号表往往是文件中的一个段,段名叫".strtab"。符号表的结构是由Elf32_Sym结构体构成的数组,每个Elf32_Sym结构对应一个符号。数组的第一个元素,也就是下标为0的元素为无效的“未定义”符号。typedef struct { Elf32_Word st_name; //该符号名在字符串表中的下标。 Elf32_Addr st_value; //符号相对应的值。 Elf32_Word st_size; //符号大小。对于包含数据的符号,这个值是该数据类型的大小 unsigned char st_info; //符号类型和绑定信息。 u... 阅读全文

posted @ 2014-01-02 23:36 Persistence 阅读(613) 评论(0) 推荐(0)

Chap-3 Section 3.4 段表

摘要: ELF文件中又各式各样的段,段表(Section Header Table)就是保存这些段的基本属性的结构。段表是ELF文件中除了文件头之外最重要的结构,它描述了ELF的各个段的信息,比如每个段的段名、段的长度、在文件中的偏移、读写权限以及段的其他属性。可以用readelf -S *.o来查看可执行文件中的各个段,段表的结构比较简单,它是以“Elf32_Shdr”结构体为元素的数组,数组元素的个数等于段的个数,每个“Elf32_Shdr”结构体对应一个段,该结构体又称为段描述符(Section Descriptor).ELF段表的这个数组第一个元素是无效的段描述符,它的类型为NULL.ELF_ 阅读全文

posted @ 2014-01-02 23:34 Persistence 阅读(228) 评论(0) 推荐(0)

Chap-3 Section 3.3 ELF文件头

摘要: ELF目标文件格式的最前部是ELF文件头(ELF Header),它包含了描述整个文件的基本属性,比如ELF文件版本、目标机器类型、程序入口地址等,紧接着是ELF文件各个段。ELF文件中与段最有关的数据结构就是段表(Section Header Table),该表描述了ELF文件包含的所有段的信息,比如每个段的段名、段的长度、在文件中的偏移、读写权限以及段的其他属性。3.2.1 ELF文件头 ELF文件头定义了ELF魔数、文件机器字节长度、数据存储方式、版本、运行平台、ABI版本、ELF重定位类型、硬件平台、硬件平台版本、入口地址、程序头入口和长度、段表的位置和长度、段的数量等。 ELF文件. 阅读全文

posted @ 2014-01-02 23:33 Persistence 阅读(349) 评论(0) 推荐(0)

Chap-3 Section 3.2 ELF文件结构描述

摘要: ELF目标文件格式的最前部是ELF文件头(ELF Header),它包含了描述整个文件的基本属性,比如ELF文件版本、目标机器类型、程序入口地址等,紧接着是ELF文件各个段。ELF文件中与段最有关的数据结构就是段表(Section Header Table),该表描述了ELF文件包含的所有段的信息,比如每个段的段名、段的长度、在文件中的偏移、读写权限以及段的其他属性。 阅读全文

posted @ 2014-01-02 23:31 Persistence 阅读(214) 评论(0) 推荐(0)

Chap-3 Section 3.1 目标文件格式

摘要: 现在PC平台流行的可执行文件格式(Executable)主要是Windows下的PE(Portable Executable)和Linux下的ELF(Executable Linkable Format),它们都是COFF(Common File Format)格式的变种。目标文件就是源代码编译后但未进行链接的那些中间文件(Windows下的.obj和Linux下的.o文件),它跟可执行文件的格式很相似,因此一般跟可执行文件一起采用一个格式存储。不光是可执行文件(Windows下的.exe和Linux下的ELF可执行文件)按照可执行文件格式存储。动态链接库(Windows下的.dll和Linu 阅读全文

posted @ 2014-01-02 23:30 Persistence 阅读(190) 评论(0) 推荐(0)

导航