在这里复习一下链接的知识:

什么是链接(linking):把源代码形成的模块独立编译后组装成一个整体的的过程叫做链接。

链接主要过程包括:地址和空间分配(address and storage allocation),符号决议 - 决定使用同名符号中的哪一个(symbol resolution),重定位 -为开始不能决定地址的符号重定位到正确地址(relocation)

ELF基本文件结构:

  

.text段 - 存放程序代码(与程序数据分开,好处1、提高缓存命中;2、保证代码只读防止被以外修改;3、多个程序使用一段代码 - 动态链接库)

.data段 - 存放已初始化的全局数据(因为默认值为0,因此初始化为0的数据被认为是未初始化的)

.bss段  - 存放未初始化的全局数据和局部数据(在ELF文件中不占位置,只提供一个长度为符号表保存的符号占位,这样可以节省磁盘空间)

ELF Header结构:

typedef struct {

unsigned char e_ident[16];      ELF魔数,用于操作系统识别文件

ELF32_Half e_type;          ELF文件类型,有可重定位文件,可执行文件,共享文件

ELF32_Half e_machine;        ELF文件的CPU平台属性

ELF32_Word e_version;        ELF版本号,一般为常数1

ELF32_Addr e_entry;         入口地址,规定ELF程序的入口虚拟地址,可重定位文件一般没有入口地址,该值为0

ELF32_Off e_phoff;          --

ELF32_Off e_shoff;          段表在文件中的偏移               -- 用于程序装载(知道每个段的信息才能装

载程序)

ELF32_Word e_flags;         ELF标志位,用于标识一些ELF文件平台相关属性

ELF32_Half e_ehsize;          文件头大小

ELF32_Half e_phentsize;       --

ELF32_Half e_phnum;         --

ELF32_Half e_shentsize;       段表描述符的大小,一般等于sizeof(ELF32_Shdr)  -- 用于程序装载

ELF32_Half e_shnum;        段表描述符的数量                  -- 用于程序装载

ELF32_Half e_shstrndx;       段表字符串标所在的段在段表中的下标        -- 用于符号识别决议和重定位

} Elf32_Ehdr;

Elf32_Shdr段描述符结构

typedef struct

{

ELF32_Word sh_name;              段名,保存为string table段中偏移

ELF32_Word sh_type;               段类型,

ELF32_Word sh_flags;               段标志位,表示段 SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR

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;

    

ELF符号表结构:

typedef struct {

Elf32_Word st_name;                 符号名,表示在string table中的偏移

Elf32_Addr st_value;                  符号相对应的值,这个值跟符号有关,可能是一个绝对值,也可能是一个地址,不同

的符号所对应的值的含义不同

Elf32_Word st_size;                   符号大小,对于保存数据的符号,该值为数据类型大小

unsigned char st_info;                 符号类型和绑定信息

unsigned char st_other;                 目前为0,不使用

Elf32_Half st_shndx;                  符号所在段

} Elf32_Sym;

这里的st_info包含符号类型和绑定信息

ELF中符号类型包括:

符号类型
宏定义名 注释
STB_LOCAL 0 局部符号,对于外部模块不可见
STB_GLOBAL 1 全局符号,对于外部模块可见
STB_WEAK 2 弱引用符号,可被全局符号定义覆盖

ELF绑定信息包括:

绑定信息
宏定义名 注释
STT_NOTYPE 0 未知符号
STT_OBJECT 1 对象(变量,数组)
STT_FUNC 2 函数
STT_SECTION 3
STT_FILE 4 目标文件名

链接与ELF文件格式的复习的更多相关文章

  1. Linux课程实践四:ELF文件格式分析

    一.ELF文件格式概述 1. ELF文件 ELF:Executable and Linking Format,是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东 ...

  2. 实践2.4 ELF文件格式分析

    实践2.4 ELF文件格式分析 1.ELF文件头 查看/usr/include/elf.h文件: #define EI_NIDENT (16) typedef struct { unsigned ch ...

  3. ELF文件格式

    ELF--Linux下可执行文件格式   1.类型          常见的ELF格式文件包括:                                                     ...

  4. C语言的本质(30)——C语言与汇编之ELF文件格式

    ELF(Executable and Linking Format)文件格式是一个开放标准,各种UNIX系统的可执行文件都采用ELF格式,ELF是一种对象文件的格式,用于定义不同类型的对象文件(Obj ...

  5. C语言的ELF文件格式学习

    最近的lab里面有ELF文件相关的,所以成这个几乎,学点ELF的东西. ELF,是一种文件格式.暂时,只看可执行文件的ELF文件格式. 首先,给出文件的格式的布局图: 光看这个很难理解,所以写一个小的 ...

  6. elf 文件格式探秘——程序运行背后的故事

    摘要:本文主要讲解elf文件格式,通过readelf命令结合底层的相关数据结构,讲解相关内容,分析程序运行的基本原理. 本文来源:elf 文件格式探秘——程序运行背后的故事 http://blog.c ...

  7. ELF文件格式分析--结构篇

    ELF文件格式,全称为Excutable and Linking Format,是一个开放的可执行文件和链接文件格式,在LINUX上很流行,跨平台软件的设计也多以ELF格式作为标准,其结构扩展性兼容性 ...

  8. Linux课题实践四——ELF文件格式分析

    2.4   ELF文件格式分析 20135318 刘浩晨 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...

  9. linux第三次实践:ELF文件格式分析

    linux第三次实践:ELF文件格式分析 标签(空格分隔): 20135328陈都 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文 ...

随机推荐

  1. 清除DataTable中的空行记录

    第一种方法: string filter = ""; ; i < dt.Columns.Count; i++) { ) filter += dt.Columns[i].Col ...

  2. ext2文件系统

    2.1. 总体存储布局 我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的 ...

  3. 实现一个不停发包的Android应用(类似于电脑上的Ping命令)

    代码如下: package com.example.ping; import java.io.BufferedReader; import java.io.IOException; import ja ...

  4. 用PredicateBuilder实现Linq动态拼接查询

    在使用Linq查询的时候,特别是如果你在使用Entiry Framwork,有时会遇到动态查询的情况(客户的查询条件是不固定的拼接查询).我们能想到的第一方案应该是拼接SQL,的确这样是可以达到我们的 ...

  5. C#求所有可能的排列组合

    static System.Collections.Specialized.StringCollection MakeStrings(string[] characters, int finalStr ...

  6. iOS ----Pods-resources.sh Permission denied

    1:执行指令 chmod a+x "路径(Pods-resources.h文件所在的路径)" 2:cd 进如pods文件夹下面 3:执行指令 第一步: sudo chmod 777 ...

  7. [Arduino] Leonardo 中文介绍

    以下内容均翻译自arduino.cc,水平有限,如有错误请大家指正. 概述Arduino Leonardo是基于ATmega32u4一个微控制器板.它有20个数字输入/输出引脚(其中7个可用于PWM输 ...

  8. 【Linux/Ubuntu学习5】Ubuntu 下android 开发,eclipse不能识别手机

    ubuntu下eclipse不能识别手机解决方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 1) 在终端运行 lsusb 会发现结果 ...

  9. django 用imagefiled访问图片

    使用FileField和ImageField时,我们有几个步骤: 在settings.py中设置MEDIA_ROOT和MEDIA_URL MEDIA_ROOT:一个绝对路径,Django根据它知道文件 ...

  10. OC 和 swift 小结

    1 什么是 OC 语言? OC 语言即面向对象语言,它扩展了 ANSI C 语言,将 SmallTalk 式的消息传递机制加入到 ANSI C 中.它是苹果 OS 和 iOS 以及相关的 API,Co ...