关于gcc ld的链接脚本

Xenia ·
更新时间:2024-11-10
· 980 次阅读

arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^ 链接脚本的主要目的是描述输入文件中的段如何被映射到输出文件中,并且控制输出文件中的内存排布。比如我们编译生成的文件一般都包含 text 段、 data 段等等。 SECTIONS{ . = 0X10000000; .text : //代码段 { start.o main.o *(.text) } .rodata ALIGN(4) : {*(.rodata*)} // 常量数据 ro: read only .data ALIGN(4) : { *(.data) } //已被初始化为非零的全局变量 __bss_start = .; .bss ALIGN(4) : { *(.bss) *(COMMON) } //没有被初始化 和 已经被初始化为0 的全局变量 __bss_end = .; } 1、最简单的链接脚本可以只包含一个命令“ SECTIONS”, 我们可以在这一个“ SECTIONS”里面来描述输出文件的内存布局。 2、“ .”在链接脚本里面叫做定位计数器,默认的定位计数器为 0。我们要求代码链接到以 0X10000000 为起始地址的地方,因此这一行给“ .”赋值0X10000000,表示以 0X10000000 开始,后面的文件或者段都会以 0X10000000 为起始地址开始链接。 3、“ .text”是段名,后面的冒号是语法要求,冒号后面的大括号里面可以填上要链接到“ .text”这个段里面的所有文件,“ *(.text)”中的“ *”是通配符,表示所有输入文件的.text段都放到“ .text”中。 4、ALIGN(4)表示 4 字节对齐。也就是说段“ .data”的起始地址要能被 4 整除。 5、设置链接到开始位置的文件为 start.o,因为 start.o 里面包含着第一个要执行的指令,所以一定要链接到最开始的地方。 6、“ __bss_start”和“ __bss_end”是符号,这两个符号用来保存.bss 段的起始地址和结束地址,这两行其实就是对这两个符号进行赋值,其值为定位符“ .”。 7、我们需要手动对.bss 段的变量清零的,因此我们需要知道.bss 段的起始和结束地址,这样我们直接对这段内存赋 0 即可完成清零。通过第 11、 13 行代码, .bss 段的起始地址和结束地址就保存在了“ __bss_start”和“ __bss_end”中,我们就可以直接在汇编或者 C 文件里面使用这两个符号。
作者:River-D



ld gcc 脚本

需要 登录 后方可回复, 如果你还没有账号请 注册新账号