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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值