嵌入式开发(S5PV210)——u-boot的头文件包含问题

前言

uboot和kernel的头文件包含比一般的程序更复杂,将头文件的路径用链接来表示,这样的用意是为了程序的可移植性。uboot是高度可移植的,不同的配置和编译指令可以编译出不同Soc和开发板的程序,其中源码是没有改动的。不同的编译配置指令就是将链接指向不同的目录,将适配的同名头文件或者同功能的配置文件包含进去,从而编译出不同平台的uboot程序。用链接来包含头文件的做法也是有缺点的,不能直观的知道当前包含头文件的路径,因为路径是用链接符号来表示的,而我们并不能一眼看出链接指向何处,要分析脚本才知道。

start.S中的头文件包含

//start.S中包含的头文件
#include <config.h>
#include <version.h>
#if defined(CONFIG_ENABLE_MMU)
#include <asm/proc/domain.h>
#endif
#include <regs.h>

头文件包含解析

头文件的包含格式上并无特殊,但是按照头文件的路径却找不到该头文件。比如#include <asm/proc/domain.h>,你在原生目录里是找不到include/asm/proc目录的,因为asm和proc都不是目录,而是链接符号,在编译的时候链接符号对指向相应的目录,从而将指定目录下的domain.h包含进去。链接符号是在配置阶段创建的,我手里的uboot是在顶层的mkconfig中建立的链接。

链接的生成

	#在顶层的mkconfig文件中摘抄,其中$2=arm
	if [ "$SRCTREE" != "$OBJTREE" ] ; then
		mkdir -p ${OBJTREE}/include
		mkdir -p ${OBJTREE}/include2
		cd ${OBJTREE}/include2
		rm -f asm
		ln -s ${SRCTREE}/include/asm-$2 asm
		LNPREFIX="../../include2/asm/"
		cd ../include
		rm -rf asm-$2
		rm -f asm
		mkdir asm-$2
		ln -s asm-$2 asm
	else
		cd ./include
		rm -f asm
		ln -s asm-$2 asm #生成include/asm链接符号指向include/asm-arm
	fi
		
	if [ "$2" = "arm" ] ; then
		rm -f asm-$2/proc
		ln -s ${LNPREFIX}proc-armv asm-$2/proc #创建asm-arm/proc链接符号指向proc-armv
	fi

解析:asm和proc链接符号都是在上面的配置脚本里生成的,用if语句判断链接指向何处。配置指令不同链接符号指向的目录就不同,从而达到可移植的目的。
拓展:如果你看到代码里引用了某个文件,但是你却找不到该目录,可能就是因为引用该文件的路径是用链接符号来指定的,需要去分析配置文件才能知道引用的是哪个路径下的文件。

猜你喜欢

转载自blog.csdn.net/weixin_42031299/article/details/120693230