ARM GNU工具链编译流程

嵌入式技术

1343人已加入

描述

C语言原文件如何一步一步变成bin文件的?

这其中自然是利用编译工具链生成的,当然不同的编译工具链这个过程还是有做差别的。

这里因为我们写的是ARM汇编程序,编译它我们自然需要采用ARM公司的ARM GNU 编译工具链,在此,我们以他为例,看看到底中间具体流程步骤是怎么样的?

我们看一下下面这张图,比较完整的告诉我们这个编译流程。

二进制

  1. hello.c C语言原文件经过Gcc 工具 预处理 生成预处理文件hello.i,这里主要是做了些预处理工作,比如头文件包含合并,宏定义展开等工作
  2. hello.i 文件经过Gcc工具处理翻译生成hello.s汇编代码,C代码变成汇编代码
  3. hello.s 汇编文件 经过 AS 工具处理变成目标文件hello.o, hello.o属于二进制文件,也就是CPU能够解析执行的程序,但是不完整
  4. hello.o 经过 Ld 工具把目标文件变成完整的二进制文件hello,链接器ld的主要作用就是把一些其它和hello.o相关的目标文件也链接进来,形成完整可执行程序

以上就是整个大概的编译流程步骤。

下面我们来看看上面用到的这些工具命令的具体如何使用。

Gcc

常用参数:

  • -E 输出预处理后的文件 -i
  • -S 输出编译生成的汇编文件 .s
  • -c 输出汇编文件生成目标文件
  • -o 指定输出文件名
  • -g 生成调试信息
  • -On 优化等级,n属于0~3 ,n越大优化越高 -O0,不优化

样例:

arm-none-eabi-gcc start.s -g -c -O0 -o start.o

Ld 链接目标文件生成二进制文件

参数:

  • -T 指定代码段,数据段,bbs段等的地址
  • -Ttext addr 指定代码段在内存运行位置
  • -Tdata addr 指定数据段在内存位置
  • -Tbbs addr 指定bbs段在内存位置

样例:

arm-none-eabi-ld start.o -Ttext 0x40000000 -o start.elf

注意:这里只是指示了代码段运行地址为0x40000000 (没有指明的话就是0x0),没有指明data,bbs段的位置,默认依次放到后面。

如果链接复杂的时候,可以写一个专门链接脚本来具体化负责的链接规则。

-Txxxx.lds 这里xxxx.lds就是为链接脚本的文件名称

关于LDS链接脚本文件的编写语法又是一门新语言,另单独成文介绍。

objcopy 格式转换

-O fdname 指定输出格式

-S 去掉源文件的符号信息和relocation信息

arm-none-eabi-objcopy -O binary -S start.elf start.bin

objdump 反汇编,查看格式

-d 反汇编

-x 以某种分类信息的形式把目标文件的数据组织(被分为几大块)输出

arm-none-eabi-objdump -x -d start.elf > start.dis

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分