《深度探索 Linux 操作系统 系统构建和原理解析》 读书笔记 一

Linux下的二进制文件包括可执行文件、静态库和动态库,均采用ELF格式存储。目标文件格式也采用ELE格式存储。

32位ELF文件:

  对于32位的ELF文件,其最前部是文件头部信息,描述了整个文件的属性,除了包括该文件在什么操作系统中、运行在什么硬件体系结构上、程序入口地址是什么基本信息外,最重要记录了两个表格的相关信息,如表格所在的位置、其中包括的条目数等。其中这两个表格一个是Section Header Table,主要是供编译时链接使用,表格中定义了各个段的位置、长度、属性等信息;另外一个表是Program Header Table,主要是供内核和动态加载器从磁盘加载ELF文件到内存使用。对于目标文件,由于其只是编译过程的中间产物,不涉及装载和运行,目标文件不会创建Program Header Table。

  文件头信息后,就是各个段数据。ELF文件可以看作是段的组合。
 段数据可分为两类:代码段和数据段。
 代码段:存储指令 数据段:存储数据
 数据段又可细分为,已经初始化的全局数据存放在".data"段中,未初始化的数据存放子啊".bss"段中。".data"和".bss"本质上没有什么不同,当时因为未初始化的变量不包含数据,所以在ELF文件中不需要占用空间,程序装载时内存中即时分配。所以,为了节省存储器空间,人为地将存储数据的部分划分为两个段。除了最重要的代码段和数据段外,汇编器还在目标文件中创建辅助链接段,存储如符号表、重定位表等。
在这里插入图片描述

汇编

汇编过程的产物是目标文件,目标文件格式复杂,其中包含链接所需的信息。

可以通过gcc工具产生目标文件,使用readelf -h name.o 查看ELF头信息。
在这里插入图片描述

查看目标文件的Section Header Table : readelf -S name.o
在这里插入图片描述

  • “.text"段存储在文件0x34,占据0x9a个字节。不要将”.text"段和进程中的代码段混淆,进程的代码段不仅包括".text"段,在后面链接时,包括 .init、.fini 等段存储代码都属于代码段。这些段都被映射到Program Header Table中的一个段,在ELF加载时,统一作为进程的代码段。
  • ".data"段存储在文件0xd0字节处,占据0个字节(由于当前程序中没有初始化的变量)
  • “.bss"段在文件中只占据Section Header Table 中的一个Section Header,而并没有相应的段。在加载程序时,加载器将依据”.bss"段的section header 中的信息,在内存中为其分配空间。
    在这里插入图片描述从上图可以看出由于".bss"和".comment"的偏移地址都为0x001018,所以.bss在磁盘文件中并未占据任何空间,".bss"段的size只是告诉程序加载器在加载程序时,在内存中为该段分配的内存空间的大小。
  • “.symtab"段记录的是符号表。因为符号的名字字串长度可变,所以目标文件将符号的名字字符串剥离出来,记录在另外一个段中”.strtab"中,符号表使用符号名字的索引在段".strtab"中的偏移来确定符号的名字。
  • 同理,".shstrtab"中记录的时段的名字(sh – section header)
  • 以"rel"开头的,".rel.text"、".rel.eh_frame",记录的是段中需要重定位的符号。
  • ".eh_frame"段中记录的是调试和异常处理时用到的信息。
  • “.comment”、".note.GNU-stack"等段如其名字所示,都是一些comment和note。

在这里插入图片描述

链接

链接是编译过程的最后一个阶段,链接器将一个或者多个目标文件和库,包括动态库和静态库,链接为一个单独的文件(通常为可执行文件、动态库或者静态库)
 两个阶段

  • 第一个阶段是将多个文件合并为一个单独的文件。对于可执行文件,还需要为指令及符号分配运行时地址
  • 第二阶段进行符号重定位。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值