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

什么是链接(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. 《UCD火花集1-2》读后感

                                                                      一个多月的时间都没有更新博客了,只因为9月份有了其他的任务,耽搁了一 ...

  2. aspjpeg组件在2008R2下“ActiveX 部件不能创建对象”

    64位要用 C:\Windows\SysWow64下的 regist32注册另外 IIS下要设置应用是32位的

  3. JAVA+FlexPaper+OpenOffice+SWFTools文档预览

    http://blog.csdn.net/core_star/article/details/10148047 1.软件环境: openoffice:启动openoffice服务:soffice.ex ...

  4. mysql主从复制详解

    http://blog.csdn.net/hguisu/article/details/7325124

  5. 在ascx中调用另一个ascx的写法

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  6. 一款基于jQuery底部带缩略图的焦点图

    之前我们已经分享过不少实用的jQuery焦点图插件了,今天我们要介绍的这款jQuery焦点图插件是带有缩略图的,我们只需点击缩略图即可切换至相应的图片,图片切换的时候出现淡入淡出的动画效果. 在线预览 ...

  7. MUI功能列表

    打开App引导页面 - http://www.bcty365.com/content-146-4970-1.html 页面传值   - http://www.bcty365.com/content-1 ...

  8. Java String Class Example--reference

    reference:http://examples.javacodegeeks.com/core-java/lang/string/java-string-class-example/ 1. Intr ...

  9. ES6新特性以及一些规范

    1.let:使变量成为块级变量,类似于C++,java类的变量 b = 2 if (b == 2) { let c = 2; } console.log(c) // 报错,因为c是一个块级变量,只存在 ...

  10. 使用docker-hub

    使用docker hub 需要其账号 基本操作 查找镜像 sudo docker search centos 每个用户有自己的命名空间,如:centos是存仓库中的镜像文件,admln/centos则 ...