编译

233 阅读2分钟

重定向

程序指令运行的时候,会需要对相对地址进行计算。每次程序改变都需要进行计算。 汇编语言中用符号的方式来标记跳转,程序会更具符号符号来重新计算要跳转的位置。

链接

模块间的符号引用,来完成模块间的通讯。拼接的过程。

静态链接

主要包含如下步骤:地址和空间分配,符号决议(静态是决议,绑定是动态),重定向。
链接流程如下图所示:

ELF文件格式解析(Executable and Linkable Format,缩写为ELF)

ELF 文件主要有四种类型:

可重定向文件

适用于其他目标文件的链接来创建可执行文件或者共享目标文件的代码和数据

可执行文件

包含于执行的一个程序,此文件规定了exec如何创建一个程序的进程映像

共享目标文件

包含可在两种上下文链接的代码和数据。首先链接编译器可以把它和其他可重定位文件和共享目标文件一起处理,生成另一个目标文件。 其次,动态链接器(Dynamic Linker)可能将它与某个可执行文件以及其它共享目标一起组合,创建进程映像。

链接视图,他是从编译链接的角度来观察一个ELF文件应该包含什么内容。
执行视图,他是从执行的角度(可执行,动态)来观察一个ELF应该包含什么信息。

程序头部表(Program Header Table),如果存在的话,告诉系统如何创建进程镜像。
节区头部表(Section Header Table)包含了描述文件节区的信息,比如大小,偏移等。

ELF文件头(ELF Header)

定义了ELF魔数、硬件平台等、 入口地址、程序头入口和长度、 段表的位置和长度及段的数量、 段表字符串表(.shstrtab)所在的段在段表中的下标。

public class Elf64FileHeader{
    final static int EI_NIDENT=16;  
    bytep[] e_ident=new byte[EI_NIDENT];  
    Elf64_Half e_type;
    Elf64_Half e_machine;
    Elf64_Word e_version;
    Elf64_Addr e_entry;
    Elf64_Off e_phoff;
    Elf64_Off e_shoff;
    Elf64_Word e_flags;
    Elf64_Half e_ehsize;
    Elf64_Half e_phentsize;
    Elf64_Half e_phnum;
    Elf64_Half e_shentsize;
    Elf64_Half e_shnum;
    Elf64_Half e_shstrndx;  
}

前16个字节 e_ident[0-3] 前4个元素构成魔幻数 0x7f E L F
e_ident[4] 1是32位, 2 是64 位
e_ident[5] 1为小端 2为大端 其余为字节对齐用的

e_type 分为7种类型

e_machine 表示elf适用于那种cpu平台