嵌入式开发(S5PV210)——u-boot的头文件包含问题
前言
uboot和kernel的頭文件包含比一般的程序更復(fù)雜,將頭文件的路徑用鏈接來表示,這樣的用意是為了程序的可移植性。uboot是高度可移植的,不同的配置和編譯指令可以編譯出不同Soc和開發(fā)板的程序,其中源碼是沒有改動(dòng)的。不同的編譯配置指令就是將鏈接指向不同的目錄,將適配的同名頭文件或者同功能的配置文件包含進(jìn)去,從而編譯出不同平臺(tái)的uboot程序。用鏈接來包含頭文件的做法也是有缺點(diǎn)的,不能直觀的知道當(dāng)前包含頭文件的路徑,因?yàn)槁窂绞怯面溄臃?hào)來表示的,而我們并不能一眼看出鏈接指向何處,要分析腳本才知道。
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目錄的,因?yàn)閍sm和proc都不是目錄,而是鏈接符號(hào),在編譯的時(shí)候鏈接符號(hào)對(duì)指向相應(yīng)的目錄,從而將指定目錄下的domain.h包含進(jìn)去。鏈接符號(hào)是在配置階段創(chuàng)建的,我手里的uboot是在頂層的mkconfig中建立的鏈接。
鏈接的生成
#在頂層的mkconfig文件中摘抄,其中$2=armif [ "$SRCTREE" != "$OBJTREE" ] ; thenmkdir -p ${OBJTREE}/includemkdir -p ${OBJTREE}/include2cd ${OBJTREE}/include2rm -f asmln -s ${SRCTREE}/include/asm-$2 asmLNPREFIX="../../include2/asm/"cd ../includerm -rf asm-$2rm -f asmmkdir asm-$2ln -s asm-$2 asmelsecd ./includerm -f asmln -s asm-$2 asm #生成include/asm鏈接符號(hào)指向include/asm-armfiif [ "$2" = "arm" ] ; thenrm -f asm-$2/procln -s ${LNPREFIX}proc-armv asm-$2/proc #創(chuàng)建asm-arm/proc鏈接符號(hào)指向proc-armvfi解析:asm和proc鏈接符號(hào)都是在上面的配置腳本里生成的,用if語句判斷鏈接指向何處。配置指令不同鏈接符號(hào)指向的目錄就不同,從而達(dá)到可移植的目的。
拓展:如果你看到代碼里引用了某個(gè)文件,但是你卻找不到該目錄,可能就是因?yàn)橐迷撐募穆窂绞怯面溄臃?hào)來指定的,需要去分析配置文件才能知道引用的是哪個(gè)路徑下的文件。
總結(jié)
以上是生活随笔為你收集整理的嵌入式开发(S5PV210)——u-boot的头文件包含问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle官网 JDK下载 注册登录公
- 下一篇: 还原0day----覆盖虚函数突破GS