一、编译过程
1、预编译:展开头文件和宏定义等。pre-compile;
2、编译:***.c–>***.s,将c文件编译成汇编文件;compile;
3、汇编:***.s–>***.o,将***.s文件转成***.o文件;Assembly;***.o文件可以在linux中通过arm-linux-size 命令来查看.text、.data、.bss各段的大小。
bss段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。
4、链接:***.o+…+***.o–>***,即将多个.o文件链接成一个elf文件。将.text 和.text段链接在一起,.data和.data段链接在一起,.bss和.bss段链接在一起,连接过程通过链接脚本***.lds文件实现。
lds文件实现如下:
链接过程如下:
其中,arm-linux-ld 是链接指令,-T表示链接lds文件,-o myboot表示输出文件,最后两个.o文件是输入文件。
此文件可以在linux系统运行,但是无法在裸板上运行。link;executable link file。
5、转成二进制文件:***–>***.bin,将elf文件中的调试信息等剥离后生成二进制文件。
多看几遍下面的视频,P14节
https://www.bilibili.com/video/BV1s4411t7eT?p=14&spm_id_from=pageDriver
二、使用vi在两个文件中复制(从a.txt复制1-4行内容到b.txt)
1、使用vi打开a.txt,然后将光标移至第一行处;
2、直接输入 “a3yy 回车即可,出现 3 lines yanked 提示复制成功;
3、使用vi打开b.txt,将光标放在要粘贴的位置,直接输入 ”a3p 回车即可,出现 3 more lines 提示粘贴成功。
三、使用arm-linux-objdump 工具,可以查看**.o文件的机器指令**,以及反汇编代码。
objdump -S obj :表示C语言与汇编语言同时显示
1:指令地址;
2:机器代码;
3和4:反汇编指令。
四、arm-linux-objcopy命令将链接后的文件转成bin文件。
arm-linux-objcopy用于复制一个目标文件的内容到另一个文件中,可以使用不同于原目标文件的格式来输出目的文件,即其可以进行格式转换。
在开发中,一般会用其来将ELF格式的可执行文件转换为二进制格式的文件,arm-linux-objcopy的使用格式如下:
arm-linux-objcopy [-F bfdname | –target=bfdname ]
-O bfdname 或–output-target=bfdname
使用指定格式来输出文件,bfdname是BFD库中描述的标准格式名。
arm-linux-objcopy -O binary myboot myboot.bin
表示将myboot文件按照binary格式转换成myboot.bin文件。
五、hexdump -C myboot.bin
表示将myboot.bin文件同时用二进制格式和ASCII码同时打印出来。
六、armv1,armv2,armv3…armv7表示的arm指令集的版本;
arm7和arm9表示的是arm核硬件的版本号。
七、Makefile编写