当前位置: 首页 > news >正文

免费网站服务器安全软件下载团员电子档案查询系统

免费网站服务器安全软件下载,团员电子档案查询系统,本地的番禺网站建设,网站开发合同ELF文件结构 前文结尾说到编译器编译源代码后生成的文件叫做目标文件#xff0c;而目标文件经过编译器链接之后得到的就是可执行文件。那么目标文件到底是什么#xff1f;它和可执行文件又有什么区别#xff1f;链接到底又做了什么呢#xff1f;接下来#xff0c;我们将探…ELF文件结构 前文结尾说到编译器编译源代码后生成的文件叫做目标文件而目标文件经过编译器链接之后得到的就是可执行文件。那么目标文件到底是什么它和可执行文件又有什么区别链接到底又做了什么呢接下来我们将探索一下目标文件的本质。 目标文件的格式 目前PC平台流行的 可执行文件格式Executable 主要包含如下两种它们都是 COFFCommon File Format 格式的变种。 Windows下的 PEPortable ExecutableLinux下的 ELFExecutable Linkable Format 目标文件就是源代码经过编译后但未进行链接的那些中间文件Windows的.obj和Linux的.o它与可执行文件的格式非常相似所以一般跟可执行文件格式一起采用同一种格式存储。在Windows下采用PE-COFF文件格式Linux下采用ELF文件格式。 事实上除了可执行文件外动态链接库DDLDynamic Linking Library、静态链接库Static Linking Library 均采用可执行文件格式存储。它们在Window下均按照PE-COFF格式存储Linux下均按照ELF格式存储。只是文件名后缀不同而已。 动态链接库Windows的.dll、Linux的.so静态链接库Windows的.lib、Linux的.a 下面我们将以ELF文件为例进行介绍。 ELF文件结构 注意段Segment与节Section的区别。很多地方对两者有所混淆。段是程序执行的必要组成当多个目标文件链接成一个可执行文件时会将相同权限的节合并到一个段中。相比而言节的粒度更小。 如图所示为ELF文件的基本结构其主要由四部分组成 ELF HeaderELF Program Header Table (或称Program Headers、程序头)ELF Section Header Table (或称Section Headers、节头表)ELF Sections 从图中我们就能看出它们各自的数据结构以及相互之间的索引关系。下面我们依次进行介绍。 ELF Header 我们可以使用readelf工具来查看ELF Header。 $ readelf -h hello.oELF Header:Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00Class: ELF64Data: 2s complement, little endianVersion: 1 (current)OS/ABI: UNIX - System VABI Version: 0Type: REL (Relocatable file)Machine: Advanced Micro Devices X86-64Version: 0x1Entry point address: 0x0Start of program headers: 0 (bytes into file)Start of section headers: 672 (bytes into file)Flags: 0x0Size of this header: 64 (bytes)Size of program headers: 0 (bytes)Number of program headers: 0Size of section headers: 64 (bytes)Number of section headers: 13Section header string table index: 10ELF文件结构示意图中定义的Elf_Ehdr的各个成员的含义与readelf具有对应关系。如下表所示 成员含义e_identMagic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00Class: ELF32Data: 2’s complement, little endVersion: 1(current)OS/ABI: UNIX - System VABI Version: 0e_typeType: REL (Relocatable file)ELF文件类型e_machineMachine: Advanced Micro Devices X86-64ELF文件的CPI平台属性e_versionVersion: 0x1ELF版本号。一般为常数1e_entryEntry point address: 0x0入口地址规定ELF程序的入口虚拟地址操作系统在加载完该程序后从这个地址开始执行进程的指令。可重定位指令一般没有入口地址则该值为0e_phoffStart of program headers: 0(bytes into file)e_shoffStart of section headers: 672 (bytes into file)Section Header Table 在文件中的偏移e_wordFlags: 0x0ELF标志位用来标识一些ELF文件平台相关的属性。e_ehsizeSize of this header: 64 (bytes)ELF Header本身的大小e_phentsizeSize of program headers: 0 (bytes)e_phnumNumber of program headers: 0e_shentsizeSize of section headers: 64 (bytes)单个Section Header大小e_shnumNumber of section headers: 13Section Header的数量e_shstrndxSection header string table index: 10Section Header字符串表在Section Header Table中的索引 ELF魔数 每种可执行文件的格式的开头几个字节都是很特殊的特别是开头4个字节通常被称为魔数Magic Number。通过对魔数的判断可以确定文件的格式和类型。如ELF的可执行文件格式的头4个字节为0x7F、e、l、fJava的可执行文件格式的头4个字节为c、a、f、e如果被执行的是Shell脚本或perl、python等解释型语言的脚本那么它的第一行往往是#!/bin/sh或#!/usr/bin/perl或#!/usr/bin/python此时前两个字节#和!就构成了魔数系统一旦判断到这两个字节就对后面的字符串进行解析以确定具体的解释程序路径。 ELF文件类型 ELF文件主要有三种类型可以通过ELF Header中的e_type成员进行区分。 可重定位文件Relocatable FileETL_REL。一般为.o文件。可以被链接成可执行文件或共享目标文件。静态链接库属于可重定位文件。 可执行文件Executable FileET_EXEC。可以直接执行的程序。 共享目标文件Shared Object File ET_DYN。一般为 .so文件。有两种情况可以使用。 链接器将其与其他可重定位文件、共享目标文件链接成新的目标文件动态链接器将其与其他共享目标文件、结合一个可执行文件创建进程映像。 ELF Section Header Table ELF 节头表是一个节头数组。每一个节头都描述了其所对应的节的信息如节名、节大小、在文件中的偏移、读写权限等。编译器、链接器、装载器都是通过节头表来定位和访问各个节的属性的。 我们可以使用readelf工具来查看节头表。 $ readelf -S hello.oThere are 13 section headers, starting at offset 0x2a0:Section Headers:[Nr] Name Type Address OffsetSize EntSize Flags Link Info Align[ 0] NULL 0000000000000000 000000000000000000000000 0000000000000000 0 0 0[ 1] .text PROGBITS 0000000000000000 000000400000000000000015 0000000000000000 AX 0 0 1[ 2] .rela.text RELA 0000000000000000 000001f00000000000000030 0000000000000018 I 11 1 8[ 3] .data PROGBITS 0000000000000000 000000550000000000000000 0000000000000000 WA 0 0 1[ 4] .bss NOBITS 0000000000000000 000000550000000000000000 0000000000000000 WA 0 0 1[ 5] .rodata PROGBITS 0000000000000000 00000055000000000000000d 0000000000000000 A 0 0 1[ 6] .comment PROGBITS 0000000000000000 000000620000000000000035 0000000000000001 MS 0 0 1[ 7] .note.GNU-stack PROGBITS 0000000000000000 000000970000000000000000 0000000000000000 0 0 1[ 8] .eh_frame PROGBITS 0000000000000000 000000980000000000000038 0000000000000000 A 0 0 8[ 9] .rela.eh_frame RELA 0000000000000000 000002200000000000000018 0000000000000018 I 11 8 8[10] .shstrtab STRTAB 0000000000000000 000002380000000000000061 0000000000000000 0 0 1[11] .symtab SYMTAB 0000000000000000 000000d00000000000000108 0000000000000018 12 9 8[12] .strtab STRTAB 0000000000000000 000001d80000000000000013 0000000000000000 0 0 1 Key to Flags:W (write), A (alloc), X (execute), M (merge), S (strings), l (large)I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)O (extra OS processing required) o (OS specific), p (processor specific)ELF文件结构示意图中定义的Elf_Shdr的各个成员的含义与readelf具有对应关系。如下表所示 成员含义sh_name节名节名是一个字符串保存在一个名为.shstrtab的字符串表可通过Section Header索引到。sh_name的值实际上是其节名字符串在.shstrtab中的偏移值sh_type节类型sh_flags节标志位sh_addr节地址节的虚拟地址如果该节可以被加载则sh_addr为该节被加载后在进程地址空间中的虚拟地址否则sh_addr为0sh_offset节偏移如果该节存在于文件中则表示该节在文件中的偏移否则无意义如sh_offset对于BSS 节来说是没有意义的sh_size节大小sh_link、sh_info节链接信息sh_addralign节地址对齐方式sh_entsize节项大小有些节包含了一些固定大小的项如符号表其包含的每个符号所在的大小都一样的对于这种节sh_entsize表示每个项的大小。如果为0则表示该节不包含固定大小的项。 节类型sh_type 节名是一个字符串只是在链接和编译过程中有意义但它并不能真正地表示节的类型。对于编译器和链接器来说主要决定节的属性是节的类型sh_type和节的标志位sh_flags。 节的类型相关常量以SHT_开头上述readelf -S命令执行的结果省略了该前缀。常见的节类型如下表所示 常量值含义SHT_NULL0无效节SHT_PROGBITS1程序节。代码节、数据节都是这种类型。SHT_SYMTAB2符号表SHT_STRTAB3字符串表SHT_RELA4重定位表。该节包含了重定位信息。SHT_HASH5符号表的哈希表SHT_DYNAMIC6动态链接信息SHT_NOTE7提示性信息SHT_NOBITS8表示该节在文件中没有内容。如.bss节SHT_REL9该节包含了重定位信息SHT_SHLIB10保留SHT_DNYSYM11动态链接的符号表 节标志位sh_flag 节标志位表示该节在进程虚拟地址空间中的属性。如是否可写、是否可执行等。相关常量以SHF_开头。常见的节标志位如下表所示 常量值含义SHF_WRITE1表示该节在进程空间中可写SHF_ALLOC2表示该节在进程空间中需要分配空间。有些包含指示或控制信息的节不需要在进程空间中分配空间就不会有这个标志。SHF_EXECINSTR4表示该节在进程空间中可以被执行 节链接信息sh_link、sh_info 如果节的类型是与链接相关的无论是动态链接还是静态链接如**重定位表、符号表、**等则sh_link、sh_info两个成员所包含的意义如下所示。其他类型的节这两个成员没有意义。 sh_typesh_linksh_infoSHT_DYNAMIC该节所使用的字符串表在节头表中的下标0SHT_HASH该节所使用的符号表在节头表中的下标0SHT_REL该节所使用的相应符号表在节头表中的下标该重定位表所作用的节在节头表中的下标SHT_RELA该节所使用的相应符号表在节头表中的下标该重定位表所作用的节在节头表中的下标SHT_SYMTAB操作系统相关操作系统相关SHT_DYNSYM操作系统相关操作系统相关otherSHN_UNDEF0 ELF Sections 节的分类 上述ELF Section Header Table部分已经简单介绍了节类型。接下来我们来介绍详细一些比较重要的节。 .text节 .text节是保存了程序代码指令的代码节。一段可执行程序如果存在Phdr则.text节就会存在于text段中。由于.text节保存了程序代码所以节类型为SHT_PROGBITS。 .rodata节 rodata节保存了只读的数据如一行C语言代码中的字符串。由于.rodata节是只读的所以只能存在于一个可执行文件的只读段中。因此只能在text段不是data段中找到.rodata节。由于.rodata节是只读的所以节类型为SHT_PROGBITS。 .plt节过程链接表 .plt节也称为过程链接表Procedure Linkage Table其包含了动态链接器调用从共享库导入的函数所必需的相关代码。由于.plt节保存了代码所以节类型为SHT_PROGBITS。 .data节 .data节存在于data段中其保存了初始化的全局变量等数据。由于.data节保存了程序的变量数据所以节类型为SHT_PROGBITS。 .bss节 .bss节存在于data段中占用空间不超过4字节仅表示这个节本省的空间。.bss节保存了未进行初始化的全局数据。程序加载时数据被初始化为0在程序执行期间可以进行赋值。由于.bss节未保存实际的数据所以节类型为SHT_NOBITS。 .got.plt节全局偏移表-过程链接表 .got节保存了全局偏移表。.got节和.plt节一起提供了对导入的共享库函数的访问入口由动态链接器在运行时进行修改。由于.got.plt节与程序执行有关所以节类型为SHT_PROGBITS。 .dynsym节动态链接符号表 .dynsym节保存在text段中。其保存了从共享库导入的动态符号表。节类型为SHT_DYNSYM。 .dynstr节动态链接字符串表 .dynstr保存了动态链接字符串表表中存放了一系列字符串这些字符串代表了符号名称以空字符作为终止符。 .rel.*节重定位表 重定位表保存了重定位相关的信息这些信息描述了如何在链接或运行时对ELF目标文件的某部分或者进程镜像进行补充或修改。由于重定位表保存了重定位相关的数据所以节类型为SHT_REL。 .hash节 .hash节也称为.gnu.hash其保存了一个用于查找符号的散列表。 .symtab节符号表 .symtab节是一个ElfN_Sym的数组保存了符号信息。节类型为SHT_SYMTAB。 .strtab节字符串表 .strtab节保存的是符号字符串表表中的内容会被.symtab的ElfN_Sym结构中的st_name引用。节类型为SHT_STRTAB。 .ctors节和.dtors节 .ctors构造器节和.dtors析构器节分别保存了指向构造函数和析构函数的函数指针构造函数是在main函数执行之前需要执行的代码析构函数是在main函数之后需要执行的代码。 符号表 节的分类中我们介绍了.dynsym节和.symtab节两者都是符号表。那么它们到底有什么区别呢存在什么关系呢 符号是对某些类型的数据或代码如全局变量或函数的符号引用函数名或变量名就是符号名。例如printf()函数会在动态链接符号表.dynsym中存有一个指向该函数的符号项以Elf_Sym数据结构表示。在大多数共享库和动态链接可执行文件中存在两个符号表。即.dynsym和.symtab。 .dynsym保存了引用来自外部文件符号的全局符号。如printf库函数。.dynsym保存的符号是.symtab所保存符合的子集.symtab中还保存了可执行文件的本地符号。如全局变量代码中定义的本地函数等。 既然.dynsym是.symtab的子集那为何要同时存在两个符号表呢 通过readelf -S命令可以查看可执行文件的输出一部分节标志位sh_flags被标记为了AALLOC、WAWRITE/ALLOC、AXALLOC/EXEC。其中.dynsym被标记为ALLOC而.symtab则没有标记。 ALLOC表示有该标记的节会在运行时分配并装载进入内存而.symtab不是在运行时必需的因此不会被装载到内存中。.dynsym保存的符号只能在运行时被解析因此是运行时动态链接器所需的唯一符号。.dynsym对于动态链接可执行文件的执行是必需的而.symtab只是用来进行调试和链接的。 上图所示为通过符号表索引字符串表的示意图。符号表中的每一项都是一个Elf_Sym结构对应可以在字符串表中索引得到一个字符串。该数据结构中成员的含义如下表所示 成员含义st_name符号名。该值为该符号名在字符串表中的偏移地址。st_value符号对应的值。存放符号的值可能是地址或位置偏移量。st_size符号的大小。st_other0st_shndx符号所在的节st_info符号类型及绑定属性 使用readelf工具我们也能够看到符号表的相关信息。 $ readelf -s hello.oSymbol table .symtab contains 11 entries:Num: Value Size Type Bind Vis Ndx Name0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND1: 0000000000000000 0 FILE LOCAL DEFAULT ABS hello.c2: 0000000000000000 0 SECTION LOCAL DEFAULT 13: 0000000000000000 0 SECTION LOCAL DEFAULT 34: 0000000000000000 0 SECTION LOCAL DEFAULT 45: 0000000000000000 0 SECTION LOCAL DEFAULT 56: 0000000000000000 0 SECTION LOCAL DEFAULT 77: 0000000000000000 0 SECTION LOCAL DEFAULT 88: 0000000000000000 0 SECTION LOCAL DEFAULT 69: 0000000000000000 21 FUNC GLOBAL DEFAULT 1 main10: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND puts字符串表 类似于符号表在大多数共享库和动态链接可执行文件中也存在两个字符串表。即.dynstr和.strtab分别对应于.dynsym和symtab。此外还有一个.shstrtab的节头字符串表用于保存节头表中用到的字符串可通过sh_name进行索引。 ELF文件中所有字符表的结构基本一致如上图所示。 重定位表 重定位就是将符号定义和符号引用进行连接的过程。可重定位文件需要包含描述如何修改节内容的相关信息从而使可执行文件和共享目标文件能够保存进程的程序镜像所需要的正确信息。 重定位表是进行重定位的重要依据。我们可以使用objdump工具查看目标文件的重定位表 $ objdump -r hello.ohello.o: file format elf64-x86-64RELOCATION RECORDS FOR [.text]: OFFSET TYPE VALUE 0000000000000005 R_X86_64_32 .rodata 000000000000000a R_X86_64_PC32 puts-0x0000000000000004RELOCATION RECORDS FOR [.eh_frame]: OFFSET TYPE VALUE 0000000000000020 R_X86_64_PC32 .text重定位表是一个Elf_Rel类型的数组结构每一项对应一个需要进行重定位的项。 其成员含义如下表所示 成员含义r_offset重定位入口的偏移。对于可重定位文件来说这个值是该重定位入口所要修正的位置的第一个字节相对于节起始的偏移对于可执行文件或共享对象文件来说这个值是该重定位入口所要修正的位置的第一个字节的虚拟地址r_info重定位入口的类型和符号因为不同处理器的指令系统不一样所以重定位所要修正的指令地址格式也不一样。每种处理器都有自己的一套重定位入口的类型。对于可执行文件和共享目标文件来说它们的重定位入口是动态链接类型的。 重定位是目标文件链接成为可执行文件的关键。我们将在后面的进行介绍。 参考 Executable and Linkable Format (ELF)《Linux 二进制分析》《深入理解计算机系统》《程序员的自我修养——链接、装载与库》 | | 对于可执行文件或共享对象文件来说这个值是该重定位入口所要修正的位置的第一个字节的虚拟地址 | | r_info | 重定位入口的类型和符号 | | | 因为不同处理器的指令系统不一样所以重定位所要修正的指令地址格式也不一样。每种处理器都有自己的一套重定位入口的类型。 | | | 对于可执行文件和共享目标文件来说它们的重定位入口是动态链接类型的。 | 重定位是目标文件链接成为可执行文件的关键。我们将在后面的进行介绍。 参考 Executable and Linkable Format (ELF)《Linux 二进制分析》《深入理解计算机系统》《程序员的自我修养——链接、装载与库》Executable and Linkable Format
http://www.hkea.cn/news/14411953/

相关文章:

  • 制作网站高手与动漫有关的专业
  • 温州网站建设公司排名江苏城乡建设部网站
  • 东莞常平网站设计ppt制作最常用软件
  • 做环评工作的常用网站html创建站点的步骤
  • 网站模板 酒类一般网站设计多大宽度
  • 室内设计网站排行榜前十名有哪些怎样推广广告
  • 广东省网站备案要多久德国著名的外贸公司地址
  • 做众筹网站品牌型网站开发
  • 网站seo和sem是什么意思深圳福田区是富人区吗
  • 网站建设的缺陷如何验证网站
  • 大型网站过程绍兴市交通建设检测中心网站
  • 网站后台怎么管理大型购物网站
  • 宜春市住房和城乡建设局网站化妆品购物网站排名
  • 做网站用什么字体最明显织梦网站搜索页点击返回首页没有反应
  • 网站建设感悟做网站宽度
  • 建设工程中标通知书查询网站百度seo网站优化怎么做
  • 做网站怎么和广告公司合作二次元网站开发的意义
  • 如何做商城网站小程序安徽易企建站
  • 网站团队建设沈阳网站建设小工作室
  • 大兴快速网站建设哪家好手工制作网站
  • 云南建设网官方网站北京seo产品
  • 在家帮别人做网站赚钱网站平台建设调研报告
  • 做非法网站的有没有微信推送怎么做购物网站
  • 建设银行网站调用支付源码武进建设银行网站首页
  • 做网站 做app电商图片助手
  • .vip域名的网站排名网址推广主要做些什么内容
  • wordpress 局域网访问英文seo优化包年费用
  • 南京网站推广移动端网页界面设计
  • 深圳微商城网站设计费用tk注册网站
  • 适合前端做项目的网站网站开发子账号