【ARM 嵌入式 编译系列 2.8 -- GCC 编译优化参数 位置无关码】


===> ARM 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?

  1. 共享库:共享库可以被多个程序同时使用,而不需要为每个程序复制一份库代码。这大大减少了内存使用和磁盘空间。
  2. 安全性:位置无关代码有助于实现地址空间布局随机化(ASLR),这是一种安全技术,通过随机化内存地址来防止某些形式的攻击。
  3. 动态加载:PIC 使得库可以在运行时动态加载到内存中的任何位置,这对于插件系统和模块化设计非常有用。

代码示例

假设我们有以下源代码文件 math.c

// math.c

你可能感兴趣的:(#,【ARM,GCC,编译专栏】,arm开发,位置无关码,-fpic,编译选项)