ARM学习笔记10——GNU ARM命令行工具

时间:2024-01-22 09:08:14

一、编译器arm-linux-gcc

  1、用arm-linux-gcc编译一个程序,一般它是要经过如下步骤的:

    1.1、预处理阶段

    编译器把上述代码中stdio.h编译进来,使用GCC的选项-E可以使GCC在预处理结束后停止编译过程,而不继续其他动作了。

    1.2、编译阶段

    首先检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,arm-linux-gcc把代码翻译成汇编语言。用户可以使用-S选项来进行查看,该选项只编译而不进行汇编,生成汇编代码。

    1.3、汇编阶段

    把编译阶段生成.s文件转成目标文件,使用者可使用选项-c就可产生.o文件了

    1.4、链接阶段

    系统把printf等函数的实现都做到名为lib.so.6的库文件中去了(或者采用精通连接时有的.a文件中),在没有特别指定时,arm-linux-gcc会到系统默认的搜索路径下进行查找,也就是链接到lib.so.6库函数中去,这样就能实现函数printf了,而这也是链接的作用

  2、arm-linux-gcc 常用命令行选项

    2.1、-o      表示要求编译器产生所指定文件名的文件,因为默认的可执行文件名是a.out

    2.2、-L 指定链接时

    2.3、-I 指定头文件.h的搜索目录

    2.4、-l 正常链接只会用libc这个函数库,其他函数库需要用这个命令指定链接

    2.5、-S 只建立组合语文件

    2.6、-D 条件编译,搭配#ifdef #define用,如果有定义才编译

    2.7、-c 表示只要求编译器进行编译,而不要进行链接,产生以原始文件的文件命名但把其后缀名由.c变成.o的目标文件

    2.8、-g 要求编译器在编译的时候提供以后对程序进行调试的信息

    2.9、-E 表示编译器只进行编译,而不做汇编和链接

    2.10、-O1/O2/O3 比编译器对程序提供的最优化选项,在编译的时候使用该选项,可以使产生的可执行文件的执行效率提高,编译器会根据CPU的架构编出优化的程序代码,需要多花一点编译时间。-O2比较常用

    2.11、-Wall 指定产出全部的警告信号

二、汇编器arm-linux-as

  汇编器用于将汇编源文件汇编成目标文件,示例用法如下: $arm-linux-as hello.s -o hello.o

三、连接器arm-linux-ld

  连接器用于连接目标文件和系统库中的函数代码(目标代码),示例用法如下:

  $arm-linux-ld test1.o test2.o -lc -o hello.elf hello.o

  将test1.o、test2.o和hello.o一起连接生成可执行文件hello.elf文件

四、文件格式转换arm-linux-objcopy  

  用于文件格式转换,将生成的hello.elf文件转换成二进制文件,示例用法如下: $arm-linux-objcopy -O binary hello.elf hello.bin

五、反汇编arm-linux-objdump

  用于将目标文件或elf格式可执行文件反汇编成汇编代码文件,示例用法如下: $arm-linux-objdump -S hello.o >hello.asm

六、elf格式文件查看:arm-linux-readelf  

  用来查看elf格式的文件的信息,可以输出elf文件额文件头信息,以及段信息,示例用法如下: $arm-linux-readelf -a hello.elf

七、静态库管理 arm-linux-ar  

  静态库管理软件,可以将产生的目标文件“.O”文件生成或添加到库中,也可以查看库中有的目标文件,示例代码如下: $arm-linux-ar rc hello.a hello.o

八、符号表生成指令 arm-linux-nm  

  生成elf文件中的符号,使用示例如下: $arm-linux-nm hello.elf >sym

九、去掉elf文件中不需要的信息和代码 arm-linux-strip  

  用于去掉文件中不使用的一些信息,如调试信息等,以减小目标文件的体积。从而节省存储空间或提高加载、执行效率,使用示例如下: $arm-linux-strip hello.elf