《程序员自我修养》阅读笔记-目标文件里有什么

linux下的目标文件(.o文件)采用ELF格式。目标文件里采用段section的格式存储,比如代码段啊(存代码),数据段啊(初始化了的全局变量和局部静态变量),BSS段啊(未初始化的全局和局部静态变量),只读数据段啊(程序中用到的字符串)等。在所有的段外,有一个重要的结构叫做文件头。所以这里从文件头开始说。

1 文件头主要包含以下内容(没什么用的就不写了):

(1)e_ident:这里面一个重要的内容就是魔数和机器的位数。魔数用来标识文件的类型,比如elf啊,a.out啊,MZ啊等。机器位数就是32或者64.

(2)e_type:有三种,可重定位文件(就是目标文件),可执行文件,共享目标文件(就是动态链接库文件)

(3)e_shoff: 段表在文件中的偏移(接下来会说段表相关内容)

(4)e_ehsize :文件头本身的大小

(5)e_shentsize: 段表描述符的大小。就是段表有很多项,这个是说每一项的大小是多少(接下来会说段表相关内容)

(6)e_shnum: 段表描述符数量(接下来会说段表相关内容)

(7)e_shstrndx: 段表字符串表在段表中的下标。段表字符串表就是存储所有所有段的名字的一个表。一般段表字符串表的名字可能是.shstrtab(接下来会说段表相关内容)

从这里可以知道段表的位置(e_shoff),段表中有多少项(e_shnum),这样就能从段表中解析出所有的段。下面是段表的相关内容。

2 段表。段表有很多项。每一项主要包含以下内容:

(1)sh_name:这个值记录的是段的名字在段表字符串表的下标

(2)sh_type:段的类型。主要的类型有程序段,符号表段,字符串表,重定位表,哈希表,动态链接信息等

(3)sh_flag:段的标志位,有三种:可写,需要分配空间,可执行

(4)sh_addr:段虚拟地址,被加载后在进程空间的地址;

(5)sh_offset:段的偏移

(6)sh_size:段的长度

(7)sh_link,sh_info:段的链接信息。如果段的内容与链接有关,这两个值才有意义。比如动态链接符号表啊,重定位表啊,sh_link表示这些表使用的字符串表或符号表在段表中的下标,sh_info表示重定位表作用的段在段表中的下标。

(8)sh_addralign: 对齐信息

(9)sh_entsize:项的长度。有些段,比如符号表,每个项的大小是相同的,所以需要每个项的大小。

3 重定位表:代码段如果需要重定位,那么就会有针对代码段的重定位段,比如.rel.text;数据段如果需要重定位,那么也需要专门的重定位表,比如.rel.data。每个重定位段是专门的一个段。它的sh_link表示符号表的下标,sh_info表示它作用于哪个段。关于重定位表的详细结构在下一篇阅读笔记中说明。

4 字符串表:字符串表是将用到的字符串都放到一起,然后每个用到字符串的地方只需要给出字符串表的下标即可。一般字符串表存放程序中用到的字符串,而段表字符串表用来存储段表中用到的字符串,比如段名。

5 符号表。符号是进行链接的接口。符号表由很多项组成的。每一项包含的内容如下:

(1)st_name:符号名在字符串表的下标

(2)st_value:简单的说,这个表示符号(函数啊,变量啊)的地址,实际上大多数时候这个值表示的是符号相对于所在段的偏移。在可执行文件中,这个表示符号的虚拟地址(这个对动态链接有用)。

(3)st_size:符号大小,比如double的大小为8个字节

(4)st_info:它的第四位表示符号的绑定信息(局部符号,全局符号,弱引用),高28位表示符号类型(数据啊,函数啊等)

(5)sh_shndx:如果符号定义在本目标文件,这个表示符号所在段的下标。

时间: 2024-10-08 10:02:19

《程序员自我修养》阅读笔记-目标文件里有什么的相关文章

程序员的自我修养:(1)目标文件

程序员的自我修养:(1)目标文件 1.目标文件 1.1 编译与链接 在使用像Visual Studio或Qt Creator等IDE时,通常有一个叫做"构建"的按钮.当编辑完成要运行和测试时点一下它,程序就能跑起来了,所以我们很少关心编译和链接.其实,编译和链接合并在一起就称为 构建(Build).简单的一次按键,实际背后却是异常复杂的过程: 预编译(Preprocessing) 编译(Compilation) 扫描:算法类似有限状态机(FSM),将字符转换成Token. 语法分析:分

《程序员自我修养》阅读笔记-静态链接

静态链接分两步,(1)空间与地址分配,(2)符号解析与重定位. 1 空间与地址分配.空间域地址分配有两个含义,一个是输出的可执行文件的空间,一个是装载后的虚拟地址的空间.在这里我们指的是后者.在将多个目标文件(静态)链接成可执行文件的时候,链接器会将所有的代码段放在一起,会将所有的数据段放在一起.放在一起之后,其实每个符号的地址就确定了.比如说有两个目标文件.第一个目标文件中的代码段有一个符号,它的地址为X,即距离代码段的偏移为X.假设经过链接器合并之后,第一个目标文件的代码段的起始地址为A,那

程序员修炼三部曲阅读笔记01

看了程序员的修炼三部曲,感触颇多. 这本书主要分为九章,第一章绪论的部分主要是讲述本身一些结构,以及本书对一般的人的作用.第二章将根据徳雷福斯模型(稍后介绍)将人分为新手到专家的五个阶段.你可以根据描述准确的定为自己所处的阶段.三四五章是将自我认识的部分,主要是正对大脑.第三章讲述的是认识你的大脑,会让你对大脑的工作模式有更好的认识,之后当然是实践的第四章-利用你的右脑.大脑也会范错误,需要我们调试,就是第五章的调试你的大脑.在对大脑有了深刻的认识之后当然是关注如何提高了.后面的几章就是关于提高

一个程序员的奋斗史 阅读笔记

感悟如下: 1.程序员这个职业在业务方面很少有似是而非的内容,是就是,不是就不是.模棱两可是要不得的,打肿脸充胖子更是大忌,不要动不动就写精通 2.优秀的程序员需要不停学习新技术,多看书,多找资料,并在实践在使用自己学到的技术,不吝惜知识的分享 3.环境很重要:大公司学习,只是有深度,小公司学习知识面广,能解决很多基本问题.但公司若想超越对手,则会选择专研度深的程序员.程序员的知识掌握能力应该是金字塔形的 4.英文的重要性,新技术新知识都是先有英文书籍资料(FUCK) 5.应届生提高技术水平是第

《程序员自我修养》阅读笔记-可执行文件装载与进程

1 装载方式:页映射.操作系统将物理内存划分成页(比如每个页大小16K),可执行文件也按照页划分.每次需要哪个页时就将其装载到物理内存中某个空闲页.若没有空闲页,可以采取一定策略将物理内存中某个页换出. 2 可执行文件装载的过程. (1)创建虚拟地址空间.分配页目录.这一步是建立虚拟空间到物理空间的映射关系. (2)读取可执行文件头,建立虚拟空间与可执行文件的映射关系.这个映射关系的作用是以后发生页错误的时候,操作系统能够从这个映射关系中知道缺页在可执行文件中的位置. (3)将cpu的指令寄存器

《程序员自我修养》阅读笔记-动态链接

1.动态链接的含义.动态链接就是将链接时的重定位推迟到加载时.相比于静态链接,动态链接的一个优点是可以节省内存.因为共享文件的代码可以共享.使用动态链接的时候,可执行文件和共享文件都会加载到内存.但是,如果很多可执行文件都使用了同一个动向文件的时候,共享文件的代码部分只需要装载一次,这样就达到了节省内存的目的.在这里,共享文件的数据部分在每个可执行文件中都要保存一份.所以,共享文件中跟自己的数据有关的代码就可能会变化,因为数据的地址不确定.一旦变化,就不能达到代码共享的目的了.所以,在这里,一般

黑马程序员--Java基础学习笔记【文件操作、递归】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 文件操作 文件和目录路径名的抽象表示形式. 成员变量 StringpathSeparator= File.pathSeparator; // 路径分隔符 System.out.println(pathSeparator); // ; Stringseparator= File.separator;// 默认名称分隔符 System.out.println(separator); // \ 构造

程序员修炼三部曲阅读笔记02

积累经验是学习和成长的关键—我们通过实践的方法学习,效果最好.然而,仅仅一开实践并不能保证成功,必须从实践中有所收获,但是面对一些常见的障碍,我们很难做到这点.你又无法强迫它,过度努力的尝试可能和不去尝试一样糟糕. 本章的开头是引用的马克吐温的话:“我们应该小心翼翼的从实践中获得智慧并且视可而止,否则我们就会线不慎坐在热炉子上的猫一样,它在也不会坐在热炉子上—这还好,但是它也不会坐在冷炉子上了”.好精辟的比喻啊,马克吐温不愧是幽默大师,猫的反应其实和人一样,过度的依赖实践,一旦实践中获得的知识是

一、《程序员的自我修养》笔记-前言

引子:在linux上写了三年多的c了,平时遇到一些编译和链接的问题仍然很是头痛,感觉很无力,好基友推荐<程序员的自我修养>,趁着周末,速速围观. 先记录下作者在书中抛出来的问题 1.为啥程序是从main函数开始执行? 2.PE/ELF文件存的是啥? 3.如何写一个直接跑在未安装os裸机上的程序? 4.目标文件是啥?链接是啥? 5.链接为啥报错? 6.句柄到底是啥? 7.普通c/c++代码如何被编译成牧宝文件及程序在目标文件中如何存储? 8.目标文件如何被链接器链接到一起,并形成可执行文件? 9