【ARM 嵌入式 编译系列 2.8 -- GCC 编译优化参数 位置无关码】
请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】
文章目录
-
- ARM GCC 位置无关码
-
- -fpic 编译选项
- 无位置相关码(PIC)
- 为什么使用 PIC?
- 代码示例
-
- 编译为目标文件
- 链接为共享库
- 使用共享库
- ARM 汇编中位置无关码
-
- 编译为目标文件
- 链接为共享库
- 使用共享库
- 详细解释
ARM GCC 位置无关码
位置无关码(PIC)是一种编写和编译技术,生成的机器代码可以在内存中的任何位置执行而无需进行重定位。PIC 主要用于共享库,这使得它们可以被多个程序共享,节省内存并减少程序的磁盘占用。
-fpic 编译选项
-fpic
(或 -fPIC
)选项用于生成位置无关代码(Position-Independent Code,PIC)。位置无关代码是一种编译生成的机器代码,这种代码可以在内存中的任何位置执行而不需要修改。使用 -fpic
选项编译的代码特别适用于共享库,因为共享库在加载时未必会被映射到同一内存地址。
无位置相关码(PIC)
无位置相关码(PIC)是一种编译技术,生成的机器代码可以在内存中的任何位置执行而无需进行重定位。PIC 主要用于共享库(shared libraries)和动态链接库(dynamic link libraries, DLLs),这使得它们可以被多个程序共享,节省内存并减少程序的磁盘占用。
PIC 的主要特点是使用相对地址而非绝对地址来访问数据和函数。这种技术依靠 CPU 指令集和编译器的支持,使得代码不依赖于特定的内存地址,从而实现了其通用性和灵活性。
为什么使用 PIC?
- 共享库:共享库可以被多个程序同时使用,而不需要为每个程序复制一份库代码。这大大减少了内存使用和磁盘空间。
- 安全性:位置无关代码有助于实现地址空间布局随机化(ASLR),这是一种安全技术,通过随机化内存地址来防止某些形式的攻击。
- 动态加载:PIC 使得库可以在运行时动态加载到内存中的任何位置,这对于插件系统和模块化设计非常有用。
代码示例
假设我们有以下源代码文件 math.c
:
// math.c
int add(int a