ARM体系结构(6)-ARM GNU工具链编译流程

ARM GNU工具链编译流程

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

常用参数:

样例:

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


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

参数:

样例:

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


本文由晓亮Albert原创,欢迎关注,带你一起长知识!

展开阅读全文

页面更新:2024-04-24

标签:流程   工具   体系结构   脚本   内存   完整   位置   目标   代码   链接   文件

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top