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

什么是链接(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. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 2.全局防护Bypass之UrlDecode

    0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.遇到这种情况 ...

  2. tachyon 本地模式安装

    本地模式不用考虑hadoop的版本,所以直接下载 binary 包或者自己编译 1.配置主机名.JDK.关闭防火墙.关闭Selinux.配置hosts ... ... 2.设置本机SSH免密码登陆 . ...

  3. Web Service 之 开发、部署

    一.C#开发WebService 在 VS2010 中新建 ASP.NET Web 应用程序,取名 WebTest. 应用程序下新建项其实最简单的就是建一个网站项目,直接" 添加新项→Web ...

  4. encodeURIComponent() 和 encodeURI()

    encodeURI(URIstring): 该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) . 该方法的目的是对 URI ...

  5. 通过UIBezierPath贝塞尔曲线画圆形、椭圆、矩形

    /**创建椭圆形的贝塞尔曲线*/ UIBezierPath *_ovalPath=[UIBezierPath bezierPathWithOvalInRect:CGRectMake(, , , )]; ...

  6. 【开源项目13】Volley框架 以及 设置request超时时间

    Volley提供了优美的框架,使android程序网络访问更容易.更快. Volley抽象实现了底层的HTTP Client库,我们不需关注HTTP Client细节,专注于写出更加漂亮.干净的RES ...

  7. kindeditor在JavaWeb中的应用

    KindEditor 是一套开源的在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果,开发人员可以用 KindEditor 把传统的多行文本输入框textarea替换为可视化的富文本编辑 ...

  8. Sql Server触发器案例(初学者学习案例)

    万事都是从最简单的一句“hello world”开始,所以我接下里介绍的sql触发器学习案例也从最简单的案例来说明分析: 1.首先创建表,这几张表你们也许很熟,在百度搜触发器案例都是使用这2张表 Cr ...

  9. C#中Invoke和BeginInvoke的区别

    1.Invoke() 调用时,Invoke会阻止当前主线程的运行,等到 Invoke() 方法返回才继续执行后面的代码,表现出“同步”的概念. 2.BeginInvoke() 调用时,当前线程会启用线 ...

  10. VMware系统运维(五)安装SSO vCenter Single Sign-On

    1.前面我们做了很多准备工作,安装了很多需求部件,这时候再安装,必备条件无,这是简单安装,即自动安装,点击"安装". 2.简单安装,提示内存不足,需要4GB以上,加内存,重新安装. ...