返回

深入剖析Android应用程序连接器(一)- ELF文件格式总结

Android

在Android应用程序的构建过程中,连接器发挥着至关重要的作用。它将编译好的目标文件链接在一起,形成最终的可执行文件。而ELF(可执行和可链接格式)是Android应用程序连接器广泛使用的一种文件格式。

ELF文件包含两种视图:文件视图和程序视图。

文件视图

文件视图的主要数据结构就是section,一个elf文件包含多个section,每个section是相对独立的数据。文件使用Section Header table来每一个section的信息,表1给出了部分节头部的关键信息。

段头表
sh_name 段名索引
sh_type 段类型
sh_flags 段标志
sh_addr 段在内存中的虚拟地址
sh_offset 段在文件中的偏移量
sh_size 段的大小
sh_link 链接其他段的索引
sh_info 其他段相关信息
sh_addralign 段在内存中的对齐方式
sh_entsize 段中每个条目的大小

常见的节类型有:

  • .text:包含可执行代码的节。
  • .data:包含已初始化数据的节。
  • .bss:包含未初始化数据的节。
  • .rodata:包含只读数据的节。
  • .strtab:包含字符串表的节。
  • .symtab:包含符号表的节。

程序视图

程序视图将ELF文件划分为多个段(segment),每个段都对应着一个内存区域。程序视图的主要数据结构是Program Header table,它描述了每个段的信息,表2给出了部分程序头部的关键信息。

程序头 描述
p_type 段类型
p_offset 段在文件中的偏移量
p_vaddr 段在内存中的虚拟地址
p_paddr 段在物理内存中的地址
p_filesz 段在文件中的大小
p_memsz 段在内存中的大小
p_flags 段标志
p_align 段在内存中的对齐方式

常见的段类型有:

  • PT_LOAD:可加载段,表示该段将在内存中加载。
  • PT_DYNAMIC:动态段,包含动态链接所需的信息。
  • PT_INTERP:解释器段,包含解释器的信息。
  • PT_NOTE:注释段,包含注释信息。

Relocation

Relocation是将符号地址转换为绝对地址的过程。当连接器将目标文件链接在一起时,它可能会遇到一些符号引用了其他目标文件中的符号的情况。这种情况下,连接器需要将这些符号引用转换为绝对地址,以便程序在运行时能够正确地调用这些符号。

Relocation通常分为两种类型:

  • 绝对重定位:将符号地址直接转换为绝对地址。
  • 相对重定位:将符号地址相对于某个基地址进行转换。

连接器通常会使用一种称为重定位表的数据结构来存储重定位信息。重定位表中包含了需要重定位的符号地址、重定位类型以及重定位值。

在后续的文章中,我们将继续深入探讨Android应用程序连接器的工作原理,并介绍如何使用连接器来构建Android应用程序。