• ARM裸机开发之交叉工具链和MakeFile工程管理


    一、交叉工具链

      嵌入式Linux开发采用交叉开发,简单来说就是在宿主机(PC机)上面编译出能够在其他硬件平台上面运行的程序。在这个过程中,需要用到许多的交叉工具,这些交叉工具的集合就叫做交叉工具链。下面列举嵌入式开发中常用的交叉工具。

      1、交叉编译器    arm-linux-gcc

      交叉编译器的命名十分有特色,前面两个字符串表明了他们可以使用的平台。例如:arm-linux-gcc说明用来编译出用于ARM平台的程序。

      用法:arm-linux-gcc hello.c -o hello 

      2、交叉链接器    arm-linux-ld

      用法:arm-linux-ld  -Tled.lds  -o  led.elf  led.o  

      它可以将一个或者多个 .o 文件链接成一个 .eld 文件,其中 led.lds 是链接器脚本。

      应用:如果不用交叉编译器直接编译出.eld文件,用 arm-linux-gcc -g -c  + 文件名(参数 -c 的意思是只编译不链接)编译出来.o文件,这个时候交叉链接器就派上用场了。

      3、交叉elf文件工具    arm-linux-readelf

      用法:arm-linux-readelf  -a  led.elf      查看.elf文件

      如果交叉编译出来的文件不能在的硬件平台运行,检查两点。

      (1)用file +文件名查看文件运行的平台是否正确,例如:

      (2)查看大小端是否正确(大多数处理器是小端的处理器)

      用 arm-linux-readelf  -a  led.elf 也可以查看文件运行的平台,例如这里Machine:  ARM。参数 -a 的意思是all。

      4、交叉转换器    arm-linux-objcopy

      用法:arm-linux-objdump -O binary led.elf ledbin

      -O binary 表示输出的文件是2进制文件,led.elf 是输入文件,ledbin 是输出文件。

      在硬件平台上能直接执行的都是二进制文件,所以需要用交叉转换器进行文件格式转换。

      5、交叉反汇编器    arm-linux-objdump

      用法:arm-linux-objdump -D -S hello 

      拓展:arm-linux-objdump -D -S hello >dump   将hello反汇编生成的代码生成一个文件dump,可以直接用 vi dump 查看。 

      在用arm-linux-gcc编译的时候加上-g参数,arm-linux-gcc -g hello.c -o hello,这样反汇编的时候得到的代码简单些。

    二、MakeFile工程管理

      1、为什么需要MakeFile?

      如下图,一个源文件led.S生成的一个可执行的led.bin需要进行交叉编译,交叉链接,交叉转换,采用MakeFile就是让这个过程更有效率的执行,使整个程序的编译,链接用一个命令完成。能起到一劳永逸的作用。

      2、Make 的工作主要依赖于一个叫Makefile的文件,Makefile文件描述了整个程序的编译,连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译,如何最后产生我们想要得可执行文件。

      3、MakeFile的构成

      两部分:规则和变量

      (1)规则

      MakeFile中最重要的组成部分就是规则,那什么是规则?

      打开一个MakeFile文件。如图,一个版块就是一个规则,MakeFile就是由一个或者多个规则构成的。

      

      一条规则格式:

      目标:依赖

      tab   命令

      伪目标:上图中,蓝色标注的目标 clean 只有命令,没有依赖,这样的目标称为伪目标。通常用一个关键字 .PHONY 标识出来。从上面可以看出,伪目标用来清除一些文件。

      最终目标:第一条规则中的目标

      (2)变量

      在MakeFile中,变量是没有类型的,不用去定义它,直接赋值就可以了。

      应用举例:  

      使用变量前:

    1 app1: app1.o func1.o func2.o
    2   gcc app1.o func1.o func2.o -o app1
    3   app2: app2.o func1.o func2.o
    4   gcc app2.o func1.o func2.o -o app2

      使用变量后:

    1 obj=func1.o func2.o
    2   app1: app1.o $(obj)
    3   gcc app1.o $(obj) -o app1
    4   app2: app2.o $(obj)
    5   gcc app2.o $(obj) -o app2

      注意:等号两边不能有空格!

      在makefile中,用户除了可以自己定义变量外,还可以使用系统已经定义好的默认变量。

      $^:代表所有的依赖文件
      $@:代表目标
      $<:代表第一个依赖文件

      使用前:

    1 led.o : led.S
    2     arm-linux-gcc -g –o led.o -c led.S

      使用后:

    1 led.o : led.S
    2     arm-linux-gcc -g –o $@ -c $^

      拓展:当一个makefile中有许多类似的规则时,可以将这些规则合并为一条通用规则。例如在一个makefile中,有如下规则;

    1 led.o : led.S
    2     arm-linux-gcc -g –o $@ -c $^
    3 
    4 main.o : main.S
    5     arm-linux-gcc -g –o $@ -c $^
    6 
    7 fun.o : fun.S
    8     arm-linux-gcc -g –o $@ -c $^

      可以合并为一条:

    1 %.o : %.S
    2     arm-linux-gcc -g –o $@ -c $^

    4、MakeFile的使用规则

      如果用户没有指定执行某一条规则,make会默认执行makefile中的第1条规则,而这条规则中的目标称之为:最终目标。如果想单独执行某一条规则:make + 该条规则的目标名,例如:make led.bin

    5、MakeFile的使用技巧

      (1)去回显

      在指令前面加一个@,例如: 

    1 hello: hello.c
    2     @gcc hello.c –o hello

      Makefile中“#”字符后的内容被视作注释。

      PS:使用GNU Make 工具来管理程序是每个Linux工程师必须掌握的技能!

      (2)修改makefile名

      方法1:mv Makefile makefile,这样修改使用的时候可以直接make + 目标名;

      方法2:mv Makefile file,这样修改使用的时候不可以直接make + 目标;得用make -f file + 目标名。

      

  • 相关阅读:
    爱迪生从事过300+个行业,并且硕果累累,诀窍不过以下3点……
    【转载】这些都是套路,但对标题党吸睛100%有用……
    【转载】有人出天价买他的一个文案标题,今天10min教会你……
    一张图看懂开源许可协议
    Git高级用法
    时频域,从傅里叶变换谈起
    【转载】数字图像处理
    摄影入门
    人像摄影
    C++语法
  • 原文地址:https://www.cnblogs.com/Pual623548198/p/6807542.html
Copyright © 2020-2023  润新知