第二章第四节 编译U-Boot模板
U-Boot支持将编译生成的文件与源码文件分开放置,可以通过两种方式指定生成文件的目录。 1) 在命令行参数添加中添加“O =”。 liqiang@liqiang-virtual-machine:~/work/forbook/u-boot-2013.04-rc1$ make O=build 2) 给环境参数变量BUILD_DIR赋值,这个值就是我们期望中间文件存放的位置。 liqiang@liqiang-virtual-machine:~/work/forbook/u-boot-2013.04-rc1$ export BUILD_DIR=./build liqiang@liqiang-virtual-machine:~/work/forbook/u-boot-2013.04-rc1$ make 为了保持源代码目录的干净,推荐用以上方式将编译生成的文件输出到一个外部目录。如果没有指定生成文件的目录,则默认为源码顶层目录。 liqiang@liqiang-virtual-machine:~/work/forbook/u-boot-2013.04-rc1$ make O=../build smdk6410_config liqiang@liqiang-virtual-machine:~/work/forbook/u-boot-2013.04-rc1$ make O=../build 输入命令行,编译后提示错误,打印出以下错误信息。 arm-linux-ld:/home/liqiang/work/forbook/build/u-boot.lds:19: syntax error make: *** [/home/liqiang/work/forbook/build/u-boot] 错误 1 事实上,这是源码出现的第一个bug,u-boot.lds链接脚本的语法有误。u-boot.lds是在编译的时候临时生成的链接脚本,它生成的依据之一是u-boot-nand.lds链接文件,该文的位置为board/samsung/smdk6410。打开u-boot-nand.lds,发现内存4的倍数对齐的描述与书写有误,必须大写。 51 . = align(4); 52 .u_boot_list : { 53 #include 54 } 55 56 . = align(4); 修改为: 51 . = ALIGN(4); 52 .u_boot_list : { 53 #include 54 } 55 56 . = ALIGN (4); 继续输入make O=../build编译,出现错误提示信息: start.o: In function `cpu_init_crit': /home/liqiang/work/forbook/build/nand_spl/board/samsung/smdk6410/start.S:227: undefined reference to `_main' make[1]: *** [/home/liqiang/work/forbook/build/nand_spl/u-boot-spl] 错误 1 make[1]:正在离开目录 `/home/liqiang/work/forbook/u-boot-2013.04-rc1/nand_spl/board/samsung/smdk6410' make: *** [nand_spl] 错误 2 事实上,这是源码出现的第二个bug,修改方法如下: 打开Makefile(nand_spl/board/samsung/smdk6410),添加crt0.S(arch/arm/lib/)文件编译。 40 SOBJS = start.o cpu_init.o lowlevel_init.o crt0.o ... 69 $(obj)start.S: 70 @rm -f $@ 71 @ln -s $(TOPDIR)/arch/arm/cpu/arm1176/start.S $@ 72 $(obj)crt0.S: 73 @rm -f $@ 74 @ln -s $(TOPDIR)/arch/arm/lib/crt0.S $@ 继续编译又出现下面的错误提示信息: /home/liqiang/work/forbook/build/nand_spl/board/samsung/smdk6410/crt0.S:153: undefined reference to `coloured_LED_init' /home/liqiang/work/forbook/build/nand_spl/board/samsung/smdk6410/crt0.S:154: undefined reference to `red_led_on' make[1]: *** [/home/liqiang/work/forbook/build/nand_spl/u-boot-spl] 错误 1 make[1]:正在离开目录 `/home/liqiang/work/forbook/u-boot-2013.04-rc1/nand_spl/board/samsung/smdk6410' make: *** [nand_spl] 错误 2 这是源码的第三个bug,打开arch/arm/lib/crt0.S文件,增加条件编译。 152 #ifndef CONFIG_NAND_SPL 153 bl coloured_LED_init 154 bl red_led_on 155 #endif 终于编译过程顺利通过,一个简单的框架搭建完成。用ls命令列出build目录中的所有文件,内容如下所示。 api examples net u-boot.bin arch fs post u-boot.lds board include System.map u-boot.map commoninclude2 test u-boot-nand.bin disk lib tools u-boot.srec drivers nand_spl u-boot 第一个bug是链接脚本语法有误,很容易理解。第二、三个bug出现的原因与nand_spl机制有关,将会在后文详细介绍。尽管目前已经到了U-Boot编译生成的u-boot.bin和u-boot-nand.bin二进制文件。单板并没有配置可以直接存储和运行程序的NOR Flash,到目前为止我们依然无法验证移植是否成功。为了加深对U-Boot移植要点的理解,本书移植U-Boot不借助第三方已经移植好的BootLoader烧写程序,所有驱动程序自行编写。事实上,要实现把编译好的代码在单板上运行试验必须利用2.3.2小节的SD卡启动方法。在此之前我们先分析一下U-Boot的启动流程,为后续内容打好基础。
|