ELF和sectionheadertable(节头表)_一个博客id_新浪博客

回顾一下编译链接的过程:


一、
#include
int main()
{
   printf("hello world \n");
   return 0;
}

预编译:gcc -E hello.c  -o  hello.i    
1.进行文本替换  如头文件,#开头的宏定义  #if  #ifdef 等
2.删除注释
3.添加行号,以便编译时需要产生行号方便调试
4.保留#pragma,因为编译器要用
最终得到的.i文件,实际上还是一个文本文件


编译:gcc -S  hello.i   -o  hello.s
1.词法分析,语法分析
2.语义分析并进行优化
得到汇编代码,还是一种文本文件,mov,add类似文件,cpu还是不能识别


汇编:gcc   hello.c  -o   hello.o
得到可重定位的二进制文件,不可执行,因为符号、数据以及指令的地址都是无效的

链接:gcc   -static    -o main    a.o  b.o
这里是静态链接
1.符号的重定位
2.合并多个.o文件相同属性的节,如text   data等   多个.o文件将被整合到同一虚拟地址空间

链接优点:
1.各个模块分别编译,可以提高效率
2.模块代码可以复用
3.无需包含整个共享库的代码,只需将需要的部分调用即可

ELF和sectionheadertable(节头表)


其中程序表头是记录如何整合到虚拟地址空间的
rodata:记录了常量字符串 printf格式串  只读的switch跳转表
bss     :未初始化的全局、静态  或者初始化为0的全局或者静态
不占任何的磁盘空间,只占了虚拟地址空间的大小,我们仅仅在表头记录了确实有这样一个节(bss),他会占用多大空间,只有在我们映射到内存时,我们才会真正的分配内存
symtab:存放函数名 全局变量的信息
.rel.text/.rel.data:在可执行文件中不会有,会在重定位的中出现,因为它记录text  data等段将如何进行重定位


二、
三种目标文件:
1.可重定位的目标文件:linux上是.o文件  win上是.obj文件   其中的符号  数据  指令的地址都是无效的
2.可执行的目标文件:   linux上默认是a.out    win上是.exe
3.共享的目标文件   :   实际是一种特殊的可重定位的目标问价,是不能执行的,一般在运行的时候别链接使用
                                    linux上是.so    windows 上是.DLL


三、
ELF中有什么内容,节头表又是做什么的。

ELF中:
1.目标文件的类型(.o   .so 等)
2.计算机的大小端
3.操作系统平台
4.程序的入口地址(.o为0  而可执行文件的为有效的地址)
5.节头表的起始位置和长度,一共有多少节(text data为节)

可以使用命令:readelf   -h   maio.o 查看

节头表:
1.节名称
2.节的类型
3.节的属性(读写权限)
4.节在ELF文件中所占的长度
5.节的对齐方式
6.偏移量

查看节表头命令:readelf   -S  main.o



四:
可重定位目标文件和可执行的目标文件有什么细微的差别:

ELF和sectionheadertable(节头表)

从上图可知:
1.可重定位的文件是不可执行的,所有程序的入口地址是0
2.之所以不可执行,是因为还没经过链接的过程,没有进行重定位,所有需要rel文件来帮助进行重定位
3.可执行文件将来使用装载到存储器中,所以程序头表记录着对应的节将来放在哪个存储器中
4.多出的一个init,实际上是一个函数,进行程序执行前的一些初始化工作




  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ELF(Executable and Linkable Format)是一种用于可执行文件、共享库和目标文件的标准文件格式。下面我会用通俗易懂的例子来解释 ELF 头部(ELF Header)、程序头表(Program Header Table)和节头表(Section Header Table)。 想象一下你正在组织一场音乐会。ELF 头部就像是这场音乐会的入口处。它包含了一些重要的信息,比如文件类型、机器架构、入口点地址等。它告诉操作系统如何解释和执行这个文件。 程序头表就像是你制定的演出计划表。它列出了音乐会的各个部分,比如开场曲、主题曲、独奏等。对于可执行文件来说,程序头表描述了程序在内存中的布局,包括各个段(Segment)的起始地址、大小和访问权限等。对于共享库和目标文件来说,程序头表可能是空的或者不需要。 节头表就像是你准备的歌曲列表。它详细描述了每首歌曲的信息,比如歌曲名称、时长、风格等。对于可执行文件来说,节头表记录了各个节(Section)的起始地址、大小和属性等。节通常用于存储代码、数据和其他资源。对于共享库和目标文件来说,节头表也扮演着类似的角色。 总结一下,ELF 头部是文件的入口信息,程序头表描述了程序在内存中的布局,节头表详细描述了文件的各个部分。它们共同组成了 ELF 文件的结构,使操作系统能够正确加载和执行这些文件。希望这个例子能帮助你更好地理解 ELF 文件结构!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值