u-boot的主要功能就是操作系统运行环境的准备和操作系统代码的加载并运行。
不同的产品,其启动过程有其自身的要求,要结合该产品的特性,调整u-boot的BIN文件生成。
因此,了解其链接信息,对于分析u-boot功能也是很重要的。
在uboot的编译中,最终的连接脚本是通过GCC编译器生成的。
原始文件为./arch/arm/cpu/u-boot.lds
arm-linux-gnueabi-gcc -E -Wp,-MD,./.u-boot.lds.d -D__KERNEL__ -D__UBOOT__ -D__ARM__ -marm -mno-thumb-interwork -mabi=aapcs-linux -mword-relocations -fno-pic -mno-unaligned-access -ffunction-sections -fdata-sections -fno-common -ffixed-r9 -msoft-float -pipe -march=armv7-a -D__LINUX_ARM_ARCH__=7 -Iinclude -I./arch/arm/include -include ./include/linux/kconfig.h -nostdinc -isystem /home/dx/tools/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabi/bin/../lib/gcc/arm-linux-gnueabi/4.9.4/include -ansi -include ./include/u-boot/u-boot.lds.h -DCPUDIR=arch/arm/cpu/armv7 -D__ASSEMBLY__ -x assembler-with-cpp -P -o u-boot.lds arch/arm/cpu/u-boot.lds
生成的u-boot.lds在uboot的主目录下。
用compare工具,可以比较两个文件的细节,确定u-boot 文件中包含了哪些功能模块,以及BIN文件的空间分布。
另外,通过u-boot.map 和 System.map,可以详细了解BIN文件中包含的内容,相关的符号信息等。
一些小技巧:
----------------------------------------------
在sections.c中,定义了一些长度为0的数组,并制定了其section属性。
这些变量与lds文件相匹配。
在不实际占用资源的情况下,我们在C语言部分可以使用这些变量的地址,定位BIN文件中相关内容的空间范围。
-----------------------------------------------
sections.h中,定义了标准相关的段信息。
--------------------------------------------
u_boot_list 段与UBOOT的驱动模型有关:
https://www.cnblogs.com/gs1008612/articles/8252845.html
---------------------------------------
efi_runtime 与UEFI驱动模型相关
---------------------------------------------------------
rel_dyn_* 与重定向相关
https://blog.csdn.net/skyflying2012/article/details/37660265
uboot的relocation原理详细分析(1)
---------------------------------------------
https://blog.csdn.net/qq_16777851/article/details/8174907
从零开始之uboot、移植uboot2017.01(六、uboot的自举分析)系列文章。