学习晚点原子《【晚点原子】I.MX6U 嵌入式 Linux 驱动开发指南 V1.5.2.pdf》集体笔记
罕用操作 & 相干常识
压缩解压
解压.tar.bz2
tar -vxjf linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2
压缩.tar.bz2
tar -vcjf alientek_uboot.tar.bz2 alientek_uboot
https://www.doc88.com/p-91399…
编译
将后面编译进去的 led.o 文件链接到 0X87800000 这个地址,应用如下命令:
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
上述命令中 -Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名,这里咱们命名为 led.elf。上述命令执行完当前就会在工程目录下多一个 led.elf 文件
led.elf 文件也不是咱们最终烧写到 SD 卡中的可执行文件,咱们要烧写的.bin 文件,因而还须要将 led.elf 文件转换为.bin 文件,这里咱们就须要用到 arm-linux-gnueabihf-objcopy 这个工具了。
arm-linux-gnueabihf-objcopy 更像一个格局转换工具,咱们须要用它将 led.elf 文件转换为 led.bin 文件,命令如下:
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
上述命令中,“-O”选项指定以什么格局输入,前面的“binary”示意以二进制格局输入,选项“-S”示意不要复制源文件中的重定位信息和符号信息,“-g”示意不复制源文件中的调试信息。
大多数状况下咱们都是用 C 语言写试验例程的,有时候须要查看其汇编代码来调试代码,因而就须要进行反汇编,个别能够将 elf 文件反汇编,比方如下命令:
arm-linux-gnueabihf-objdump -D led.elf > led.dis
上述代码中的“-D”选项示意反汇编所有的段,反汇编实现当前就会在当前目录下呈现一个名为 led.dis 文件
能够关上 led.dis 文件看一下,看看是不是汇编代码
从图 能够看出 led.dis 外面是汇编代码,而且还能够看到内存分配情况。在 0X87800000 处就是全局标号_start,也就是程序开始的中央。通过 led.dis 这个反汇编文件能够显著的看出咱们的代码曾经链接到了以 0X87800000 为起始地址的区域。
makefile
objs := start.o main.o
https://www.doc88.com/p-91399…
ledc.bin:$(objs)
arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
%.o:%.s
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
%.o:%.S
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
%.o:%.c
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
clean:
rm -rf *.o ledc.bin ledc.elf ledc.dis
https://www.doc88.com/p-91399…
第 1 行定义了一个变量 objs,objs 蕴含着要生成 ledc.bin 所需的资料:start.o 和 main.o,也就是以后工程下的 start.s 和 main.c 这两个文件编译后的.o 文件。这里要留神 start.o 肯定要放到最后面!因为在前面链接的时候 start.o 要在最后面,因为 start.o 是最先要执行的文件!
第 3 行就是默认指标,目标是生成最终的可执行文件 ledc.bin,ledc.bin 依赖 start.o 和 main.o 如果以后工程没有 start.o 和 main.o 的时候就会找到相应的规定去生成 start.o 和 main.o。比方 start.o 是 start.s 文件编译生成的,因而会执行第 8 行的规定。
第 4 行是应用 arm-linux-gnueabihf-ld 进行链接,链接起始地址是 0X87800000,然而这一行用到了主动变量“$^”,“$^”的意思是所有依赖文件的汇合,在这里就是 objs 这个变量的值:start.o 和 main.o。链接的时候 start.o 要链接到最后面,因为第一行代码就是 start.o 外面的,因而这一行就相当于:
arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf start.o main.o
第 5 行应用 arm-linux-gnueabihf-objcopy 来将 ledc.elf 文件转为 ledc.bin,本行也用到了主动变量“$@”,“$@”的意思是指标汇合,在这里就是“ledc.bin”,那么本行就相当于:
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf ledc.bin
第 6 行应用 arm-linux-gnueabihf-objdump 来反汇编,生成 ledc.dis 文件。
第 8~15 行就是针对不同的文件类型将其编译成对应的.o 文件,其实就是汇编.s(.S)和.c 文件,比方 start.s 就会应用第 8 行的规定来生成对应的 start.o 文件。第 9 行就是具体的命令,这行也用到了主动变量“$@”和“$<”,其中“$<”的意思是依赖指标汇合的第一个文件。比方 start.s 要编译成 start.o 的话第 8 行和第 9 行就相当于:
start.o:start.s
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o start.o start.s
1
2
第 17 行就是工程清理规定,通过命令“make clean”就能够清理工程。