ELF文件格式学习

本文介绍了ELF文件格式,特别是可执行文件的ELF格式。通过readelf工具解析ELF头,理解魔数、入口地址、程序头和Section表头的作用。探讨了_start函数在程序执行中的角色,说明main函数并非程序执行的第一个函数。此外,详细分析了程序头表和Section表头的含义,以及如何在内存中加载和初始化。文章还讨论了.bss段、.data段和全局变量的初始化过程,强调了符号表和段表在程序执行中的重要性。
摘要由CSDN通过智能技术生成

最近的lab里面有ELF文件相关的,所以成这个机会,学点ELF的东西。

ELF,是一种文件格式。暂时,只看可执行文件的ELF文件格式。

首先,给出文件的格式的布局图:

网上有很多将elf的,但感觉都太概念了,看不太明白,所以我打算写一个小的程序,用readelf来结合的看。通过这种方法学习elf的相关知识应该比较好吧。

程序比较简单:

#include <stdio.h>
#include <stdlib.h>

int data[100] ={0};
int bss[100];

int main()
{
	int i=0;
	for(i=0; i<100; i++)
		bss[i] = i;
	printf("the bss[3]= %d\n", bss[3]);
	return 1;

}

首先,通过readelf -h 命令,来看elf头:

首先,第一个magic,魔数,这个主要是程序用来确认读入的是否是elf文件头,其中,第一个7f是默认的,后面的45,4c,46就是ascii码里面的elf相对于的码值,后面的01,没有实际意义。每次程序在读取elf头文件的时候,都会确认魔数是否正确,以防读入的不是elf文件。

接下来的class,Data,Version,OS/ABI, ABI Version type, machine version 都是一些关于机器,系统还有文件版本的一些信息,不是这次的主要内容,看看就好。

接下来的Entry point address 0x8048330 表示程序的入口地址,即程序载入完成后,第一条指令从这个地方开始,从指令上来说,就是在整个程序建立了进程,将相应的虚拟地址映射载入内存后,做完了所有的准备工作之后,将要开始执行程序了,此时,将eip 置为0x8048330这个值。刚开始学C的时候,很多人都认为,之所以要有main函数,是因为他是程序的入口,程序执行的第一条指令就是main函数。如果是这样,那在0x8048330这个位置的函数就应该是main函数了。

通过程序来看,用objdump将程序反汇编:

可以看到,程序的08048330的部分是一个叫-start的一个函数,并不是我们想当然的main。为什么?来看看<_start>函数的主要内容,扫一眼,就发现,这个函数的主要内容是在要存相关的寄存器,后面跳转到一个叫<_libc_start_main@plt>函数下面去了,也就是说,在程序真正的执行main操作之前,还进行了其他的函数操作,也就是main并不是真正的第一个执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值