linux应用程序开发实践报告范文,【实践报告】Linux实践四

Linux内核分析 实践四——ELF文件格式分析

一、概述

1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序。ELF文件(目标文件)格式主要三种:

可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件。(目标文件或者静态库文件,即linux通常后缀为.a和.o的文件)

可执行文件:文件保存着一个用来执行的程序。(例如bash,gcc等)

共享目标文件:共享库。文件保存着代码和合适的数据,用来被下连接编辑器和动态链接器链接。(linux下后缀为.so的文件。)

目标文件既要参与程序链接又要参与程序执行:

一般的 ELF 文件包括三个索引表:ELF header,Program header table,Section header table。

ELF header:在文件的开始,保存了路线图,描述了该文件的组织情况。

Program header table:告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。

Section header table:包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。

二、分析ELF文件头(ELF header)

进入终端输入:cd /usr/include 进入include文件夹后查看elf.h文件,查看ELF的文件头包含整个文件的控制结构

20180110185656711033.png

20180110185656712010.png

写一个小程序进行编译,生成可执行文件。

使用‘readelf –a Clare’命令,都得到下面的ELF Header头文件的信息,如下图:

20180110185656712986.png

通过上图信息,可以得出Elf Header的Size为64bytes,所以可以使用hexdump工具将头文件的16进制表打开。

如下图使用:‘hexdump –x hello –n 64’命令来查看hello文件头的16进制表(前64bytes)对格式进行分析。

20180110185656714939.png

第一行,对应e_ident[EI_NIDENT]。实际表示内容为7f454c46020101000000000000000000,前四个字节7f454c46(0x45,0x4c,0x46是‘e‘,‘l‘,‘f‘对应的ascii编码)是一个魔数,表示这是一个ELF对象。接下来的一个字节02表示是一个64位对象,接下来的一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的默认都设置为0.

第二行,e_type值为0x0002,表示是一个可执行文件。e_machine值为0x003e,表示是Advanced Micro Devices X86-64处理器体系结构。e_version值为0x00000100,表示是当前版本。e_entry值为0x 004003f0,表示入口点。

第三行,e_phoff值为0x40,表示程序头表。e_shoff值为0x1278,表示段表的偏移地址。

第四行,e_flags值为0x00000000,表示未知处理器特定标志。e_ehsize值为0x0040,表示elf文件头大小(正好是64bytes)。e_phentsize表示一个program header表中的入口的长度,值为0x0038。e_phnum的值为0x0008,给出program header表中的入口数目。e_shentsize值为0x0040表示段头大小为64个字节。e_shnum值为0x001f,表示段表入口有31个。e_shstrndx值为0x001c,表示段名串表的在段表中的索引号。

三、通过文件头找到section header table,理解其内容

file elf1显示生成的目标文件hello的类型

20180110185656715916.png

elf1是一个可执行文件。输入:ls –l hello查看hello的大小:

20180110185656716892.png

如图可知,hello大小为6712字节。

输入:hexdump –x hello来用16进制的数字来显示hello的内容

(其中,第二列是16进制表示的偏移地址)

20180110185656718845.png

输入:objdump –x hello来显示hello中各个段以及符号表的相关信息:

20180110185656719822.png

输入:readelf –a hello来查看各个段信息:

ELF文件头信息:

20180110185656720798.png

段表Section header table:

20180110185656722751.png

符号表 Symbol table:

20180110185656723728.png

四、通过section header table找到各section

在一个ELF文件中有一个section header table,通过它我们可以定位到所有的 section,而 ELF header 中的e_shoff 变量就是保存 section header table 入口对文件头的偏移量。而每个 section 都会对应一个 section header ,所以只要在 section header table 中找到每个 section header,就可以通过 section header 找到你想要的 section。

下面以可执行文件hello为例,以保存代码段的 section 为例来讲解读取某个section 的过程。

使用‘vi /usr/include/elf.h ’命令查看Sections Header的结构体:

20180110185656724704.png

由上面分析可知,section headers table中的每一个section header所占的size均为64字节,ELF header得到了e_shoff变量的值为0X1278,也就是table入口的偏移量,通过看e_shnum值为0x001f,表示段表入口有31个。

所以从0x00001278开始有31个段,每个段占64个字节大小,输入 hexdump elf1查看:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值