简单介绍一下Linux中ELF格式文件

合集下载

elf文件格式

elf文件格式

第1章文件格式1.1 Executable and Linking Format (ELF)1.1.1整体结构ELF对象格式用于目标文件(.o扩展名)和执行文件. 有些信息只出现在目标文件或执行文件中.ELF文件由下列部件构成. ELF header必须放在文件的开始;其他部件可以随便排放(ELF header给出了其他部件的偏移量).1.1.2ELF头[ELF Header]ELF头包含目标文件的一般信息;具有如下结构(from elf.h):#define EI_NIDENT 16typedef struct {unsigned char e_ident[EI_NIDENT];Elf32_Half e_e_type;Elf32_Half e_machine;Elf32_Word e_version;Elf32_Addr e_entry;Elf32_Off e_phoff;Elf32_Off e_shoff;Elf32_Word e_flags;Elf32_Half e_ehsize;Elf32_Half e_phentsize;Elf32_Half e_phnum;Elf32_Half e_shentsize;Elf32_Half e_shnum;Elf32_Half e_shstrndx;};ELF头域描述:1.1.3程序头[Program Header]程序头为一结构数组,每个元素描述执行文件的一个可载入段.元素结构如下(from elf.h):typedef struct {Elf32_Word p_type;Elf32_Off p_offset;Elf32_Addr p_vaddr;Elf32_Addr p_paddr;Elf32_Word p_filesz;Elf32_Word p_memsz;Elf32_Word p_flags;Elf32_Word p_align;} Elf32_Phdr;1.1.4Section HeadersELF文件中的每个section的都有激励[incitation]头; Section个数由ELF Header中的e_shnum域指明. Section headers结构如下(from elf.h):typedef struct {Elf32_Word sh_name;Elf32_Word sh_type;Elf32_Word sh_flags;Elf32_Addr sh_addr;Elf32_Off sh_offset;Elf32_Word sh_size;Elf32_Word sh_link;Elf32_Word sh_info;Elf32_Word sh_addralign;Elf32_Word sh_entsize;} Elf32_Shdr;1.1.5Special Sections1.1.6重定位信息[Relocation Information]重定位信息section包含关于非确定引用[unresolved references]的信息.因为编译器[compilers]和汇编器[assemblers]不知道符号将分配的绝对内存地址,和别的文件的符号定义;所以对符号的每个引用都将创建一个重定位条目. 该条目指向地址(where the reference is being made), 和指向包含被引用符号的符号表. 连接器[linker]给所有符号分配地址之后, 将使用重定位信息添入正确的地址. 执行文件没有重定位section.例如: 汇编表示符号加上偏移:move.l var+16,d0偏移量存储在r_addend域,这样,符号真实地址加上该地址域将产生一个正确的引用.重定位条目有如下结构(from elf.h):typedef struct {Elf32_Addr r_offset;Elf32_Word r_info;Elf32_Sword r_addend;} Elf32_Rel;1.1.7符号表符号表section .symtab为一数组,数组元素包含关于被ELF文件引用的符号的信息.符号表条目有如下结构(from elf.h):typedef struct {ELF32_Word st_name;ELF32_Addr st_value;ELF32_Word st_size;unsigned char st_info;unsigned char st_other;Elf32_Half sth_shndx;} Elf32_Sym;1.1.8串表串表sections( .strtab和.shstrtab)包含符号表中符号名和section名.名都以null结束. 这些符号通过偏移指向[point into]串表. 串表的第一字节总是零, 其后所有串顺序存放.。

linux elf执行流程

linux elf执行流程

linux elf执行流程Linux ELF 执行流程ELF(Executable and Linkable Format)是Linux系统中可执行文件的一种格式。

在Linux下,当我们执行一个可执行文件时,操作系统会按照一定的流程解析和执行该文件。

本文将介绍Linux ELF 的执行流程。

1. ELF文件格式ELF文件由多个段(section)组成,每个段都有特定的作用。

常见的段包括.text段(包含程序的指令)、.data段(包含程序的全局变量和静态变量)、.bss段(包含未初始化的全局变量和静态变量)等。

2. 加载可执行文件当用户在终端输入可执行文件名并按下回车键时,操作系统会通过解析文件头判断该文件是否为有效的ELF文件。

如果是有效的ELF 文件,操作系统会为该进程分配一块内存空间,并将ELF文件中的各个段加载到相应的内存地址上。

3. 解析程序入口操作系统会根据ELF文件中的程序入口地址(Entry Point)来确定程序的入口点。

程序入口地址通常位于.text段的起始位置。

操作系统将程序计数器(PC)设置为程序入口地址,从而开始执行程序。

4. 执行程序指令程序从程序入口地址开始执行,按照顺序执行.text段中的指令。

每条指令都会被解码和执行,直到程序结束或者遇到跳转指令。

5. 解析跳转指令在程序执行过程中,可能会遇到跳转指令(如条件跳转、无条件跳转、函数调用等)。

当遇到跳转指令时,操作系统会根据指令中的目标地址重新设置程序计数器,从而改变程序的执行流程。

6. 处理函数调用当程序执行到函数调用指令时,操作系统会将函数的返回地址和参数等信息保存到栈中,并跳转到函数的入口地址执行。

函数执行完毕后,操作系统会从栈中恢复返回地址,继续执行函数调用指令后面的指令。

7. 处理系统调用程序中可能会包含系统调用指令,用于请求操作系统提供各种服务。

当遇到系统调用指令时,操作系统会切换到内核态,执行相应的系统调用处理程序,并返回结果给用户程序。

了解在Linux下可执行文件格式

了解在Linux下可执行文件格式

了解在Linux下可执行文件格式
Linux下面,目标文件、共享对象文件、可执行文件都是使用ELF文件格式来存储的。

程序经过编译之后会输出目标文件,然后经过链接可以产生可执行文件或者共享对象文件。

linux下面使用的ELF文件和Windows操作系统使用的PE文件都是从Unix 系统的COFF文件格式演化来的。

我们先来了解一些基本的想法。

首先,最重要的思路是一个程序从人能读懂的格式转换为供操作系统执行的二进制格式之后,代码和数据是分开存放的,之所以这样设计有这么几个原因:
1、程序执行之后,代码和数据可以被映射到不同属性的虚拟内存中。

因为代码一般是只读的,而数据是可读可写的;
2、现代CPU有强大的缓存体系。

程序和代码分离可以提高程序的局部性,增加缓存命中的概率;
3、还有最重要的一个原因是当有多个程序副本在运行的时候,只读部分可以只在内存中保留一份,这样大大节省了内存。

在ELF的定义中,把他们分开存放的地方称为一个Section ,就是一个段。

一个ELF文件中重要的段包括:
.text 段:存储只读程序
.data 段:存储已经初始化的全局变量和静态变量
.bss 段:存储未初始化的全局变量和静态变量,因为这些变量的值为0,所以这个段在文件当中不占据空间
.rodata 段:存储只读数据,比如字符串常量
我们用一个例子来看一下ELF文件的格式到底是什么。

首先,在Linux下编写一个C程序:SimpleSecTIon.c
[cpp] view plain copy
int printf(const char *format, ... );。

可执行文件(ELF)格式的理解=.

可执行文件(ELF)格式的理解=.

可执行文件(ELF)格式的理解ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。

它自最早在System V 系统上出现后,被xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。

可以说,ELF是构成众多xNIX系统的基础之一,所以作为嵌入式Linux系统乃至内核驱动程序开发人员,你最好熟悉并掌握它。

其实,关于ELF这个主题,网络上已经有相当多的文章存在,但是其介绍的内容比较分散,使得初学者不太容易从中得到一个系统性的认识。

为了帮助大家学习,我这里打算写一系列连贯的文章来介绍ELF以及相关的应用。

这是这个系列中的第一篇文章,主要是通过不同工具的使用来熟悉ELF文件的内部结构以及相关的基本概念。

后面的文章,我们会介绍很多高级的概念和应用,比方动态链接和加载,动态库的开发,C语言Main函数是被谁以及如何被调用的,ELF格式在内核中的支持,Linux内核中对ELF section的扩展使用等等。

好的,开始我们的第一篇文章。

在详细进入正题之前,先给大家介绍一点ELF文件格式的参考资料。

在ELF 格式出来之后,TISC(Tool Interface Standard Committee)委员会定义了一套ELF标准。

你可以从这里(/elf/)找到详细的标准文档。

TISC委员会前后出了两个版本,v1.1和v1.2。

两个版本内容上差不多,但就可读性上来讲,我还是推荐你读v1.2的。

因为在v1.2版本中,TISC重新组织原本在v1.1版本中的内容,将它们分成为三个部分(books):a) Book I介绍了通用的适用于所有32位架构处理器的ELF相关内容b) Book II介绍了处理器特定的ELF相关内容,这里是以Intel x86 架构处理器作为例子介绍c) Book III介绍了操作系统特定的ELF相关内容,这里是以运行在x86上面的UNIX System V.4 作为例子介绍值得一说的是,虽然TISC是以x86为例子介绍ELF规范的,但是如果你是想知道非x86下面的ELF实现情况,那也可以在/elf/中找到特定处理器相关的Supplment文档。

elf格式文件解析

elf格式文件解析

ELF可执行文件的解析与加载ELF文件格式简介1.1前言ELF-可执行链接格式最初是由UNIX系统实验室(USL)作为应用程序二进制接口(ABI)开发和发行。

工具接口标准委员会TIS已经将ELF作为运行在Intel32位架构之上的各类型操作系统的可导出对象文件格式标准。

ELF标准为开发者提供了一组横跨多运行环境的二进制接口定义来组织软件开发。

1.2对象文件1.2.1 介绍本部分描述了ABI对象文件格式,也称之为ELF。

有三种主要类型的对象文件:1. 可重组(relocatable)文件包含了适合用来链接其他对象文件的代码和数据,从而创建出可执行或可共享的对象文件;2. 可执行(executable)文件包含了用于执行的程序,该文件规定了exec如何创建一个程序的进程映像;3. 可共享对象(shared object)文件包含了用来在两个上下文之间链接的代码和数据。

首先,链接器ld将该文件和其他的可重组文件或可共享对象文件进行处理后,创建出新对象文件,其次,动态链接器将该新对象文件与可执行文件或共享对象组合,来共同创建一个进程映像;经过汇编器以及链接器创建成的对象文件,其是在处理器上可直接执行的程序的二进制代表。

本部分主要描述文件格式以及其如何用来构建程序。

后一部分也描述了对象文件,集中在程序执行所必须的信息上。

1.2.1.1 文件格式在程序链接和程序执行过程都涉及到对象文件。

出于方便和效率,对象文件格式图从链接和运行两个视角来展示文件的内容。

ELF header位于文件的开始处,其用来描述文件的组织结构。

Section包含了大量的对象文件信息,从链接的视角来看就是指令、数据、符号表、重组信息等等。

Segment和Program是从程序执行视角来观看的,这将在下部分讲解。

如果存在Program Header table的话,其将告诉操作系统如何创建进程映像。

用来创建进程映像(执行程序)的文件必须包含program header table。

ELF文件格式

ELF文件格式

ELF文件格式在介绍ELF格式之前,先简单说明一下可执行文件的生成流程:1)编写C源文件,或汇编源文件;2)准备共享库格式的目标文件(shared object file),如数学库、标准库;2)用编译器(compiler)将C编译成可重定位格式的目标文件(relocatable object file),用汇编器(assembler)将汇编源文件编译成可重定位格式的目标文件;3)用连接器(linker)将第二步的共享个库文件和第三步生成的目标文件链接生成可执行文件(executable file)。

ELF(excutable and linking format)是一种可执行可链接格式的二进制文件,它可以用来表示relocatable file、executable file或者shared object file,这三者都是目标文件(object file)。

所谓“可执行”指可以被调入内存供CPU直接运行;“可链接”指多个ELF格式的目标文件可以被链接在一起形成一个可执行文件。

下图左边是可链接格式的ELF文件格式,右边是可执行格式的ELF文件格式。

无论是linking view还是execution view的ELF文件,他们都包含一个ELF Header,它包含文件的基本信息。

ELF自定义了一些类型,并强制规定了他们所占的字节个数,以实现跨平台,如Elf32_Half占2字节、Elf32_Word占4字节、Elf32_Off占4字节等。

1typedef struct2{3unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ 4Elf32_Half e_type; /*目标文件类型 */5Elf32_Half e_machine; /*Architecture */6Elf32_Word e_version; /* Object file version */7Elf32_Addr e_entry; /*入口地址 */8Elf32_Off e_phoff; /* Program header table文件偏移 */ 9Elf32_Off e_shoff; /* Section header table 文件偏移 */ 10Elf32_Word e_flags; /* Processor-specific flags */11Elf32_Half e_ehsize; /* ELF header 大小 */12Elf32_Half e_phentsize; /*每个Program header大小 */13Elf32_Half e_phnum; /*一共多少个Program header */14Elf32_Half e_shentsize; /* 每个Section header大小 */15Elf32_Half e_shnum; /*一共多少个 Section header */16Elf32_Half e_shstrndx; /*Section的字符表在section header table的索引值 */17} Elf32_Ehdr;18e_ident[EI_NIDENT]是一个有16个字节的数组,e_ident[0]=0x7f,e_ident[1]=”E”,e_ident[2]=”L”,e_ident[3]=”F”,e_ident[4]指示ELFCLASS(0:ELFCLASSNONE;1:ELFCLASS32;2:ELFCLASS64),e_ident[5]指示程序中的数据格式(0:无效;1:小端;2:大端),e_ident[6]指示版本固定为0x1,e_ident[7]到e_ident[14]固定为0,e_ident[15]固定为16用于指示e_ident[]数组有16个元素。

elf函数

elf函数

elf函数ELF是英文Executable and Linkable Format的缩写,即可执行和可链接格式。

它是一种通用的二进制文件格式,常用于Linux和UNIX类操作系统以及其他一些嵌入式系统中。

对于Linux来说,ELF格式的可执行文件是Linux系统下常见的一种可执行文件格式。

ELF文件由多个节(Section)组成。

每个节都有一个唯一的名称,用来描述程序中的一种特定类型的数据。

主要的节类型包括.text、.data、.bss以及.symtab等。

每种节类型都有自己的作用和特定的内容。

.text节是可执行文件中最重要的节,它包含了程序的代码。

在Linux系统中,函数的执行是由.text节中的代码驱动的。

.data节用于存储一些静态的全局变量,.bss节则用于存储一些未初始化的全局变量。

.symtab节是符号表,用于记录程序中的所有符号,包括函数和变量等等。

在ELF文件中,函数的定义和调用是通过符号表来实现的。

符号表中记录了所有的符号信息,包括符号名称、符号类型、符号值等等。

函数被定义时,在符号表中会被记录一个符号类型为函数的符号。

而函数被调用时,程序会在符号表中查找该函数的符号信息,并跳转到该函数的代码地址开始执行。

在ELF文件中,具体的函数实现是由函数的代码段来实现的。

函数的执行流程是先把函数的参数压入栈中,然后通过调用指令跳转到函数代码段的入口处开始执行。

在函数执行过程中,栈用于存储函数的局部变量、临时变量以及一些返回值等等。

函数的返回是通过返回指令来实现的。

在函数执行完成后,程序会使用返回指令返回到函数调用点的下一条指令处。

如果函数有返回值,那么返回值也会存储在寄存器或者栈中,并在返回时传递给函数调用点。

ELF文件不仅可以包含可执行代码,还可以包含动态链接库和静态链接库。

动态链接库在程序运行时才会被加载,而静态链接库是在编译时被链接到程序中的。

使用静态链接库可以使程序的可执行文件更小,但动态链接库可以使多个程序共享库中的代码,从而减少程序运行时的内存占用。

ELF文件格式分析

ELF文件格式分析

ELF文件格式分析ELF(Executable and Linkable Format)是一种常见的可执行文件格式,用于在UNIX和类UNIX系统上存储和执行程序。

在本文中,我们将详细分析ELF文件格式的结构和各个部分的作用。

首先是标识部分,它占据ELF文件的最开始位置,有以下几个字段:1. Magic Number:ELF文件的前四个字节,用于识别文件类型。

对于32位系统,它的值是0x7F、'E'、'L'和'F';对于64位系统,它的值是0x7F、'E'、'L'和'F'以及0x022.类型:指定了ELF文件的类型,比如可执行文件、目标文件、共享库等等。

3.类型机器:指定了目标机器的体系结构,如x86、ARM等等。

4.版本:指定了ELF文件的版本号。

5.入口点:对于可执行文件,指定程序的入口点。

6.程序头表和节头表的偏移地址和大小。

接下来是文件头部分,它描述了ELF文件的整体结构和布局:1.类型:表示ELF文件的类型,如可重定位文件、可执行文件、共享目标文件等。

2.目标机器:标识目标机器的类型。

3.版本:指定了ELF文件的版本号。

4.入口点:指定程序的入口点。

5.程序头表偏移地址和节头表偏移地址。

6.程序头表项的大小、数量和节头表项的大小、数量。

7.字符串表索引,用于找到文件中的字符串。

最后是节头表部分,它包含了所有节(Section)的相关信息,比如代码段、数据段等等。

每个节头表项包含以下字段:1.节的名称:用于标识节的名称。

2.节的类型:描述节的属性,如代码段、数据段、符号表等。

3.节的标志:描述节的属性,如可写、可执行等。

4.节的虚拟地址:指定节在内存中的虚拟地址。

5.节的文件偏移地址:指定节在文件中的偏移地址。

6.节的大小:指定节的大小。

7.链接和信息:用于指定其他与节相关的信息。

通过分析ELF文件的结构,我们可以获得有关程序入口点、机器类型、节的信息等重要的元数据。

ELF文件详解—初步认识

ELF文件详解—初步认识

ELF⽂件详解—初步认识⼀、引⾔在讲解ELF⽂件格式之前,我们来回顾⼀下,⼀个⽤C语⾔编写的⾼级语⾔程序是从编写到打包、再到编译执⾏的基本过程,我们知道在CPU上执⾏的是低级别的机器语⾔,从⾼级语⾔到低级别的机器语⾔肯定是要经过翻译过程,这个过程⼤体的过程如下图所⽰:在Unix系统中,从源⽂件到可执⾏⽬标⽂件是由编译驱动程序完成的,如⼤名⿍⿍的gcc,翻译过程包括图中的是个阶段;Ø 预处理阶段预处理器(cpp)根据以字符#开头的命令修给原始的C程序,结果得到另⼀个C程序,通常以.i作为⽂件扩展名。

主要是进⾏⽂本替换、宏展开、删除注释这类简单⼯作。

对应的命令:linux> gcc -E hello.c hello.iØ 编译阶段编译器将⽂本⽂件hello.i翻译成hello.s,包含相应的汇编语⾔程序对应的命令:linux> gcc -S hello.c hello.sØ 汇编阶段将.s⽂件翻译成机器语⾔指令,把这些指令打包成⼀种叫做可重定位⽬标程序的格式,并将结果保存在⽬标⽂件.o中(把汇编语⾔翻译成机器语⾔的过程)。

把⼀个源程序翻译成⽬标程序的⼯作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码⽣成;代码优化;⽬标代码⽣成。

主要是进⾏词法分析和语法分析,⼜称为源程序分析,分析过程中发现有语法错误,给出提⽰信息。

对应的命令:linux> gcc -c hello.c hello.oØ 链接阶段此时hello程序调⽤了printf函数。

printf函数存在于⼀个名为printf.o的单独的预编译⽬标⽂件中。

链接器(ld)就负责处理把这个⽂件并⼊到hello.o程序中,结果得到hello⽂件,⼀个可执⾏⽂件。

最后可执⾏⽂件加载到储存器后由系统负责执⾏, 函数库⼀般分为静态库和动态库两种。

静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件⽐较⼤,但在运⾏时也就不再需要库⽂件了。

elf 标准

elf 标准

ELF(Executable and Linkable Format)是一种通用的二进制文件格式,用于在Unix和类Unix系统上存储可执行文件、共享库、核心转储文件等。

它由System V发布,并被广泛使用于许多不同的操作系统中。

ELF标准定义了一种文件结构,该结构包含可执行代码、数据、符号表、动态链接和加载信息等。

同时,ELF还提供了一种动态重定位机制,可以在程序加载时动态解析和调整地址等。

ELF标准的设计目标是为了提供一个可移植、可扩展和可维护的二进制文件格式。

它具有很高的灵活性,可以适应不同操作系统和硬件平台的要求。

同时,ELF还允许程序使用共享库来共享代码和数据,以减少内存占用和提高执行效率。

ELF标准的实现涉及很多方面,包括编译器、连接器、加载器和调试器等工具。

这些工具可以将源代码编译成ELF格式的可执行文件,并在运行时进行动态链接和加载,从而实现程序的执行。

总的来说,ELF标准是一种通用的二进制文件格式,用于存储和执行可执行文件、共享库等。

它具有可移植性、灵活性和可扩展性,被广泛应用于许多不同的操作系统中。

linux可执行文件格式

linux可执行文件格式
(3)EM86(在fs/binfmt_em86.c中):允许在A的本地二进制文件。
(4) Java(在fs/binfmt_java.c中):可以不必每次都定义Java字节码的解释程序就可以执行Java的.class文件。这种机制和脚本中使用的机制类似,通过把.class文件的文件名作为参数传递,处理程序返回执行整型字节码的解释程序。从用户的观点来看,Java二进制文件是作为本地可执行文件处理的。
(5)misc(在fs/binfmt_misc.c中):这是最明智地使用二进制处理程序的方法,这个处理程序通过内嵌的特征数字或者文件名后缀可以识别出各种二进制格式,不过最优秀的特性是它可以在运行期配置,而不是只能在编译期配置。因此,只要遵循其规则,就可以快速的增加对新二进制文件的支持,而不用重新编译内核,也无须重新启动机器。Linux源程序文件中的注释建议最终使用它来取代Java和EM86二进制处理程序。
(6)脚本(在fs/binfmt_script.c中):对于shell脚本、Perl脚本等提供支持。宽松一点地说,所有前面两个字符是“#!”的可执行文件,都归由这个二进制处理程序进行处理。
这些Linux支持的二进制格式,可以在内核编译链接的时候直接建立在内核之中,也可以在内核运行的时候作为模块来加载。内核保存了支持的二进制格式解释程序的列表,当试图执行一个文件的时候,每一个二进制格式都会被依次尝试,直到判断出可识别的对应的二进制格式为止。
linux可执行文件格式
.
分类: operation system 2008-09-06 12:44 2159人阅读 评论(0) 收藏 举报
linuxjava脚本perlshell
可执行文件可以是具有不同格式的二进制文件,也可以是一个文本的脚本。可执行文件映像中包含了进程执行的代码和数据,同时也包含了操作系统用来将映像正确装入内存并执行的信息。在Linux中,当前的“本地”(系统默认的)可执行文件格式是ELF[15] (Executable and Linking Format)可执行链接格式。由于先前的a.out格式难于实现共享库,不能适用于动态链接,所以目前已经全部被ELF所替换。不过,Linux仍然为 a.out保留了一个二进制处理程序,但通常是使用ELF。

linux elfedit 使用方式

linux elfedit 使用方式

linux elfedit 使用方式Linux ELFedit是一个用于编辑ELF(Executable and Linkable Format,可执行与可链接格式)文件的工具。

ELF文件是在Linux 系统中用于存储可执行文件、共享库和目标文件的一种文件格式。

ELFedit工具可以用于修改ELF文件的各种属性和内容,如修改ELF 文件的版本、修改ELF文件的符号表、修改ELF文件的节表等。

使用Linux ELFedit工具进行ELF文件的编辑非常简单,只需要按照以下步骤进行操作即可:1. 查看ELF文件的基本信息:可以使用命令"readelf -h <filename>"来查看ELF文件的头部信息。

ELF文件的头部信息包含了ELF文件的基本属性,如ELF文件的类型、机器架构、入口地址、程序头表偏移量、节头表偏移量等。

通过查看ELF文件的头部信息,可以了解ELF文件的基本结构和属性。

2. 修改ELF文件的属性:可以使用命令"elfedit --set-<attribute> <value> <filename>"来修改ELF文件的属性。

其中,<attribute>表示要修改的属性,<value>表示要修改的属性值,<filename>表示要修改的ELF文件名。

可以根据需要修改的属性来替换<attribute>和<value>,如要修改ELF文件的版本属性,可以使用命令"elfedit --set-version <version> <filename>"来修改ELF 文件的版本属性。

3. 修改ELF文件的符号表:可以使用命令"elfedit --rename-symbol <oldname>=<newname> <filename>"来修改ELF文件的符号表。

ELF文件结构描述

ELF文件结构描述

ELF⽂件结构描述ELF⽬标⽂件格式最前部ELF⽂件头(ELF Header),它包含了描述了整个⽂件的基本属性,⽐如ELF⽂件版本、⽬标机器型号、程序⼊⼝地址等。

其中ELF⽂件与段有关的重要结构就是段表(Section Header Table)ELF⽂件格式1. 可重定向⽂件:⽂件保存着代码和适当的数据,⽤来和其他的⽬标⽂件⼀起来创建⼀个可执⾏⽂件或者是⼀个共享⽬标⽂件。

(⽬标⽂件或者静态库⽂件,即linux通常后缀为.a和.o的⽂件)2. 可执⾏⽂件:⽂件保存着⼀个⽤来执⾏的程序。

(例如bash,gcc等)3. 共享⽬标⽂件:共享库。

⽂件保存着代码和合适的数据,⽤来被下连接编辑器和动态链接器链接。

(linux下后缀为.so的⽂件。

)另外的windows下为pe格式的⽂件;ELF视图⾸先,ELF⽂件格式提供了两种视图,分别是链接视图和执⾏视图。

链接视图是以节(section)为单位,执⾏视图是以段(segment)为单位。

链接视图就是在链接时⽤到的视图,⽽执⾏视图则是在执⾏时⽤到的视图。

上图左侧的视⾓是从链接来看的,右侧的视⾓是执⾏来看的。

总个⽂件可以分为四个部分:ELF header:描述整个⽂件的组织。

Program Header Table: 描述⽂件中的各种segments,⽤来告诉系统如何创建进程映像的。

sections 或者 segments:segments是从运⾏的⾓度来描述elf⽂件,sections是从链接的⾓度来描述elf⽂件,也就是说,在链接阶段,我们可以忽略program header table来处理此⽂件,在运⾏阶段可以忽略section header table来处理此程序(所以很多加固⼿段删除了section header table)。

从图中我们也可以看出, segments与sections是包含的关系,⼀个segment包含若⼲个section。

Section Header Table: 包含了⽂件各个segction的属性信息,我们都将结合例⼦来解释。

ELF文件格式分析

ELF文件格式分析

ELF文件格式分析ELF(Executable and Linkable Format)是一种标准的文件格式,用于存储可执行代码,共享库和核心转储文件。

它在UNIX系统中广泛使用,包括Linux和BSD。

ELF文件格式的设计旨在提供一种灵活的格式,以满足各种不同类型的程序和软件库的需要。

在本文中,我们将对ELF文件格式进行详细分析,并深入探讨其结构和各个部分的作用。

1.ELF文件格式概述ELF文件格式由头部(Header)、节区表(Section Table)、节区(Section)、程序头部(Program Header)和数据部分组成,其中头部和节区表是ELF文件的核心组成部分,用于描述整个文件的结构和内容。

程序头部用于描述如何将节区加载到内存中以执行程序。

节区是文件内容的实际载体,包含各种类型的数据和代码。

2. ELF文件头部(Header)- e_ident:ELF头部的标识字段,用于标识文件的类型、字节序及其他相关信息。

- e_type:文件的类型,包括可执行文件、共享库、目标文件等。

- e_machine:目标机器的体系结构,如x86、ARM、MIPS等。

- e_version:文件的版本号。

- e_entry:程序的入口地址,即程序开始执行的地址。

- e_phoff:程序头部表的偏移量。

- e_shoff:节区头部表的偏移量。

- e_flags:标识文件特定属性的标志位。

- e_phentsize:每个程序头部表项的大小。

- e_phnum:程序头部表的项数。

- e_shentsize:每个节区头部表项的大小。

- e_shnum:节区头部表的项数。

头部的格式在不同的ELF文件版本中会有所不同,但一般遵循上述结构。

头部的内容是用于解析和执行ELF文件的关键信息,因此它是整个文件结构中最重要的部分之一3. 节区表(Section Table)节区表包含了描述各个节区的信息,包括名称、偏移量、大小、类型等。

elf文件代码段长度 数据段长度 padding之间的关系-概述说明以及解释

elf文件代码段长度 数据段长度 padding之间的关系-概述说明以及解释

elf文件代码段长度数据段长度padding之间的关系-概述说明以及解释1.引言1.1 概述概述:ELF(Executable and Linkable Format)是一种广泛用于Unix类操作系统的可执行文件格式,它包含了程序在内存中执行所需的所有信息。

在一个ELF文件中,代码段和数据段都是存放程序的关键部分,而Padding 则是用来填充文件空间的字节。

本文将探讨ELF 文件中代码段长度、数据段长度以及Padding 之间的关系,分析它们在程序执行过程中的作用和重要性。

通过深入了解这些概念,我们可以更好地理解可执行文件的结构,从而更好地编写和调试程序,提高软件开发的效率和质量。

文章结构如下:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 ELF文件格式简介2.2 代码段长度与数据段长度的概念2.3 Padding在ELF文件中的作用3. 结论3.1 ELF文件中代码段、数据段和Padding的关系总结3.2 实际应用中的重要性3.3 展望与未来发展方向在文章中,将对ELF文件的结构和内容进行介绍和分析,重点探讨代码段长度、数据段长度以及Padding之间的关系,以及它们在ELF文件中的作用和重要性。

最后展望未来发展方向,指出该研究领域的潜力和前景。

1.3 目的本文旨在探讨ELF 文件中代码段长度、数据段长度以及Padding 之间的关系。

通过深入分析ELF 文件格式的特点,我们将解释代码段和数据段在文件中的表示方式,以及为什么在编译过程中需要适当的Padding 来保证文件的正确性和可执行性。

通过这篇文章,读者将能够更好地理解ELF 文件的组成结构,加深对程序执行过程中内存分配和加载的理解,为日后的软件开发和调试工作提供帮助。

章1.3 目的部分的内容2.正文2.1 ELF文件格式简介:ELF(Executable and Linkable Format)是一种常见的可执行文件格式,它被广泛应用于Linux等操作系统中。

ELF文件格式简介

ELF文件格式简介

Linux下的ELF文件格式简介1. 概述Executable and linking format(ELF)文件是x86 Linux系统下的一种常用目标文件(object file)格式,有三种主要类型:(1)适于连接的可重定位文件(relocatable file),可与其它目标文件一起创建可执行文件和共享目标文件。

(2)适于执行的可执行文件(executable file),用于提供程序的进程映像,加载的内存执行。

(3)共享目标文件(shared object file),连接器可将它与其它可重定位文件和共享目标文件连接成其它的目标文件,动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。

ELF文件格式比较复杂,本文只是简要介绍它的结构,希望能给想了解ELF文件结构的读者以帮助。

具体详尽的资料请参阅专门的ELF文档。

2. 文件格式为了方便和高效,ELF文件内容有两个平行的视角:一个是程序连接角度,另一个是程序运行角度,如图1所示。

ELF header在文件开始处描述了整个文件的组织,Section提供了目标文件的各项信息(如指令、数据、符号表、重定位信息等),Program header table指出怎样创建进程映像,含有每个program header的入口,Section header table包含每一个section的入口,给出名字、大小等信息。

图13. 数据表示ELF数据编码顺序与机器相关,数据类型有六种,见表1。

4. ELF文件头象bmp、exe等文件一样,ELF的文件头包含整个文件的控制结构。

它的定义如下:其中E_ident的16个字节标明是个ELF文件(7F+'E'+'L'+'F'+class+data+version+pad)。

E_type表示文件类型,2表示可执行文件。

E_machine说明机器类别,3表示386机器,8表示MIPS机器。

ELF文件格式

ELF文件格式

ELF⽂件格式ELF(executable and linkable format)可执⾏可链接格式,是⼀种⽤于⼆进制⽂件、可执⾏⽂件、⽬标代码、共享库和核⼼转储格式⽂件。

1.2.1ELF⽂件类型ELF主要分为3种⽂件类型:1、可重定位⽂件(relocatable file)后缀“.o” “.rel”:⽬标⽂件编译完成,尚未链接。

⼀般多个⽬标⽂件链接成⼀个可执⾏⽂件或共享⽬标⽂件也,也就是下⾯两种⽂件。

2、可执⾏⽂件(executable file)后缀“.exec”:linux中执⾏的程序。

2、共享⽬标⽂件(shared object file)后缀".dyn":也就是库⽂件。

⽤途1:和其他可重定位⽂件以及共享⽬标⽂件链接⽣成新的可重定位⽂件;⽤途2:动态链接时和可执⾏⽂件链接在⼀起运⾏。

还有⼀种ELF⽂件--核⼼转储⽂件(Core Dump file):程序异常终⽌后对地址空间的转储。

可以使⽤gdb读取⽂件查找异常原因。

1.2.2 ELF⽂件的结构⽬标⽂件既有链接阶段⼜有执⾏阶段,在两个阶段规定的⽂件格式有所不同。

如图1。

图1 在链接视⾓程序头表是可选,通过节(section)来划分;在运⾏视⾓节头表是可选,通过段(segment)来划分(段⼤都来⾃链接阶段的节);注意:除ELF Header位置固定外,其他部分位置、⼤⼩通过ELF Header的内容来确定。

节⼀般包含代码节(.text)、数据节(.data)、BSS节(.bss)。

代码节⽤于保存机器指令,数据节保存以初始化全局变量和局部静态变量,BSS节保存未初始化全局变量和局部静态变量。

将数据和指令分开存放有利于安全,设置代码节对进程只读、数据和BSS节可读写。

ELF ⽂件头(ELF Header) ELF⽂件头固定于程序的最开始,⽤于描述ELF⽂件的基本信息,例如⽂件类型、程序⼊⼝等;注意:⽂件头存在魔术字符(7f 45 4c 46),可通过搜索该字符来确定映射地址的位置。

linux可执行文件格式

linux可执行文件格式

Linux可执行文件格式•Elf 也就是“Executable and Linking Format.”•Elf 起源于Unix,经改进应用于FreeBSD和Linux等现有类Unix操作系统。

•微软的PE格式也学习了ELF格式的优点。

•ELF文档服务于在不同的操作系统上目标文件的创建或者执行文件的开发。

它分以下三个部分:•“目标文件”描述了ELF目标文件格式三种主要的类型。

•“程序装载和动态连接”描述了目标文件的信息和系统在创建运行时程序的行为。

•“C 语言库”列出了所有包含在libsys中的符号、标准的ANSIC和libc的运行程序,还有libc运行程序所需的全局的数据符号。

三种主要类型:•一个可重定位文件(relocatable file)保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享文件。

•一个可执行文件(executable file)保存着一个用来执行的程序,该文件指出了exec(BA_OS)如何来创建程序进程映象。

•一个共享目标文件(shared object file)保存着代码和合适的数据,用来被下面的两个链接器链接。

第一个是链接编辑器,可以和其他的重定位和共享目标文件来创建另一个目标文件。

第二个是动态链接器,联合一个可执行文件和其他的共享目标文件来创建一个进程映象。

ELF头•#define EI_NIDENT 16•typedef struct {•unsigned char e_ident[EI_NIDENT];•Elf32_Half e_type;•Elf32_Half e_machine;•Elf32_Word e_version;•Elf32_Addr e_entry;•Elf32_Off e_phoff;•Elf32_Off e_shoff;•Elf32_Word e_flags;•Elf32_Half e_ehsize;•Elf32_Half e_phentsize;•Elf32_Half e_phnum;•Elf32_Half e_shentsize;•Elf32_Half e_shnum;•Elf32_Half e_shstrndx;•} Elf32_Ehdr;节•一个目标文件的节头表可以让我们定位所有的节。

linux elf 符号表

linux elf 符号表

linux elf 符号表摘要:1.介绍Linux和ELF文件格式2.解析ELF文件中的符号表3.符号表的作用和组成4.如何在Linux中查看和解析符号表5.总结符号表在Linux中的重要性正文:Linux是一种广泛应用于服务器和嵌入式系统的开源操作系统。

在Linux 系统中,ELF(Executable and Linkable Format)文件格式是最常见的可执行文件格式。

ELF文件包含了程序的代码、数据和符号信息等,这些信息对于程序的调试和分析具有重要意义。

本文将详细介绍Linux中的ELF符号表。

ELF文件由三部分组成:ELF头部(ELF Header)、程序头部表(Program Header Table)和节(Section)。

其中,ELF头部包含了文件的基本信息,如文件类型、入口地址等;程序头部表则描述了程序中各个段的信息,如段类型、文件偏移、虚拟地址等;而节则包含了程序的实际数据,如代码、数据、符号表等。

符号表是ELF文件中的一个重要组成部分,它包含了程序中所有外部符号的信息。

符号表主要包括两种类型:动态符号表(Dynamic Symbol Table)和静态符号表(Static Symbol Table)。

动态符号表主要用于支持动态链接库的加载和链接,它通常包含了一系列外部符号和它们的地址;静态符号表则包含了程序中所有静态符号的信息,如全局变量、函数等。

在Linux系统中,我们可以使用工具如readelf、nm等来查看和解析符号表。

例如,使用readelf命令可以查看ELF文件的头部信息、程序头部表和符号表等;而使用nm命令则可以列出ELF文件中的所有符号及其地址。

这些工具对于程序调试和分析非常有帮助。

总之,符号表在Linux ELF文件中具有重要意义,它包含了程序中所有外部符号的信息,对于程序的调试和分析至关重要。

elf 结构体详解

elf 结构体详解

elf 结构体详解
"elf"是Executable and Linkable Format的缩写,是一种用
于可执行文件、共享库和核心转储文件的标准文件格式。

它是一种
通用的、可移植的二进制文件格式,用于在不同的操作系统和体系
结构之间共享可执行文件和相关的信息。

在Linux系统中,可执行文件和共享库通常使用ELF格式。

ELF
文件由多个部分组成,其中最重要的部分是ELF头部、节头部表和
节区。

ELF头部包含了文件的基本信息,如文件类型、目标体系结构、入口点地址等。

节头部表包含了每个节区的描述信息,如名称、偏移量、大小等。

而节区则包含了实际的数据和代码。

ELF结构体是用来表示ELF文件格式的数据结构。

在C语言中,可以使用结构体来定义ELF头部、节头部表和节区等部分的数据结构,以便于对ELF文件进行解析和操作。

从技术角度来看,ELF结构体包括了多个字段,每个字段对应
了ELF文件中的一个部分,如ELF头部、节头部表、节区等。

通过
对这些结构体的使用,可以方便地对ELF文件进行解析和操作,如
读取ELF头部信息、遍历节区等。

此外,ELF结构体的定义还可以包括一些辅助函数,用于对ELF
文件进行读取、解析和操作。

这些函数可以实现对ELF文件的加载、重定位、符号解析等功能,从而实现对ELF文件的动态链接和执行。

总的来说,ELF结构体是用来表示ELF文件格式的数据结构,
在对ELF文件进行解析和操作时,可以使用这些结构体和相关的辅
助函数,以实现对ELF文件的读取、解析、加载和执行等功能。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单介绍一下Linux中ELF格式文件
ELF(Executable and Linkable Format)即可执行连接文件格式,是一种比较复杂的文件格式,但其应用广泛。

与linux下的其他可执行文件(a.out,cof)相比,它对节的定义和gnu工具链对它的支持使它十分灵活,它保存的足够了系统相关信息使它能支持不同平台上的交叉编译和交叉链接,可移植性很强.同时它在执行中支持动态链接共享库。

通过本文,可以大致了解Linux系统中ELF格式文件的分类,组成,作用,以及其中包含的内容。

另外后面介绍了几种常用的对elf文件进行操作的工具,并且对其使用进行简单举例,便于对elf文件有一个比较直观的理解。

主要内容:
[描述]
1 ELF文件简介
2 ELF文件格式
3 ELF的特性
[举例]
1 readelf工具
2 objcopy工具
3 objdump工具
4 nm工具
5 ldd工具
[其它]
[描述]
1 ELF文件简介
ELF(Executable and Linkable Format)即可执行连接文件格式,是Linux,SVR4和Solaris2.0默认的目标文件格式,目前标准接口委员会TIS已将ELF标准化为一种可移植的目标文件格式,运行于32-bit Intel体系微机上,可与多种操作系统兼容。

分析elf文件有助于理。

相关文档
最新文档