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

什么是链接(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. 解决win7 64位中 魔方与TortoiseSVN的冲突解决【2014-02-10】

    原文地址:http://www.cnblogs.com/hbbbs/p/3542479.html 现象 启动后弹出SendRpt:Error的提示框,然后变成soap1.2 fault.关闭后,又会自 ...

  2. innodb 变量

    http://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html

  3. JVM剖析

    JVM剖析 这篇文章详细解释了Java虚拟机的内部架构.以下这幅图展示了Java虚拟机里面的关键组件(是依据Java SE 7版本的Java虚拟机). 这些组件将在下面的两个章节一一展开.第一章节涵盖 ...

  4. spring jdbctemplate源码跟踪

    闲着没事,看看源码也是一种乐趣! java操作数据库的基本步骤都是类似的: 1. 建立数据库连接 2. 创建Connection 3. 创建statement或者preparedStateement ...

  5. LeetCode9 Palindrome Number

    题意: Determine whether an integer is a palindrome. Do this without extra space.  (Easy) 分析: 自己考虑的方法是利 ...

  6. iOS (UIButton封装)仿糯米首页缩放“按钮”效果

    前言 过年期间,少不了各种聚会,当下聚会大多数情况下自然是团购,然后就是用各种APP...使用度娘糯米时(不是广告,不是广告,不是广告!),偶然注意到了它的首页中一个有意思的效果,就是那些“按钮”点击 ...

  7. Python练习题 026:求100以内的素数

    [Python练习题 026] 求100以内的素数. ------------------------------------------------- 奇怪,求解素数的题,之前不是做过了吗?难道是想 ...

  8. 1.7.4.3 Parsers

    Parsers 除了主查询解析器外,还有一些其他的查询解析器可以使用或者和主查询解析器连合使用.这部分描述了其他查询解析器的细节,并且给出了一些例子: 大多数的解析器都可以使用局部查询参数的方式来表达 ...

  9. Solr的检索运算符 (转载)

    1. “:” 指定字段查指定值,如返回所有值*:*2. “?” 表示单个任意字符的通配3. “*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)4. “~” 表示模糊检索,如检索拼写类 ...

  10. [Arduino] 外部中断

    原文:http://www.arduino.cn/thread-2421-1-1.html 1.什么是中断? 试想一下,你正在家里吃饭,这时传来了敲门声,虽然你巨饿,虽然面前全是山珍海味,但此时你不得 ...