返回
深入剖析Android应用程序连接器(一)- ELF文件格式总结
Android
2023-10-17 07:47:59
在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应用程序。