嵌入式开发(S5PV210)——u-boot的头文件包含问题
Posted 代二毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式开发(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语句判断链接指向何处。配置指令不同链接符号指向的目录就不同,从而达到可移植的目的。
拓展:如果你看到代码里引用了某个文件,但是你却找不到该目录,可能就是因为引用该文件的路径是用链接符号来指定的,需要去分析配置文件才能知道引用的是哪个路径下的文件。
以上是关于嵌入式开发(S5PV210)——u-boot的头文件包含问题的主要内容,如果未能解决你的问题,请参考以下文章
嵌入式开发(S5PV210)——u-boot的顶层mkconfig文件分析
嵌入式开发(S5PV210)——u-boot中如何确定启动方式
嵌入式开发(S5PV210)——u-boot的不同来源和目录结构