当前位置: 首页 > news >正文

网站二级目录搜索引擎优化文献

网站二级目录,搜索引擎优化文献,商贸行业网站建设,手机百度助手U-Boot源码分析1—Makefile 1 分析思路2 u-boot源码目录结构3 Makefile源码3.1 版本号3.2 环境变量3.3 Beautify output3.4 输出文件的目录设置、PHONY目标3.6 目录信息3.5 Source Code Checker3.7 设置单独编译模块、PHONY目标3.8 获取宿主机的架构和系统3.9 设置交叉编译工具… U-Boot源码分析1—Makefile 1 分析思路2 u-boot源码目录结构3 Makefile源码3.1 版本号3.2 环境变量3.3 Beautify output3.4 输出文件的目录设置、PHONY目标3.6 目录信息3.5 Source Code Checker3.7 设置单独编译模块、PHONY目标3.8 获取宿主机的架构和系统3.9 设置交叉编译工具链前缀3.10 设置配置文件3.11 定义变量3.12 include文件3.13 设置交叉编译工具链3.14 PHONY scripts_basic3.15 PHONY outputmakefile3.16 config相关变量3.17 ifeq ($(mixed-targets),1)3.18 ifeq ($(config-targets),1)3.19 PHONY scripts3.20 ifeq ($(dot-config),1)3.21 一些include和变量3.22 libs-y u-boot-init u-boot-main3.23 Add GCC lib3.24 LDPPFLAGS3.25 BOARD_SIZE_CHECK3.26 DO_STATIC_RELA3.27 ALL-y3.28 LDFLAGS_u-boot3.29 quiet_cmd和cmd3.30 all3.31 PHONY dtbs3.32 u-boot.bin 1 分析思路 上一章中完成了u-boot-2017.11源码的编译、烧写和运行本章对U-Boot源码进行分析根据README文件中的描述一方面从Makefile源码入手另一方面将U-Boot编译过程的输出保存下来辅助分析 make CROSS_COMPILEaarch64-linux-gnu- V1set -e; : CHK include/config/uboot.release; mkdir -p include/config/; echo 2017.11$(/bin/bash ./scripts/setlocalversion .) include/config/auto.conf include/config/uboot.release.tmp; if [ -r include/config/uboot.release ] cmp -s include/config/uboot.release include/config/uboot.release.tmp; then rm -f include/config/uboot.release.tmp; else : UPD include/config/uboot.release; mv -f include/config/uboot.release.tmp include/config/uboot.release; fi set -e; : CHK include/generated/version_autogenerated.h; mkdir -p include/generated/; (echo \#define PLAIN_VERSION \2017.11\; echo \#define U_BOOT_VERSION \U-Boot \ PLAIN_VERSION; echo \#define CC_VERSION_STRING \$(LC_ALLC aarch64-linux-gnu-gcc --version | head -n 1)\; echo \#define LD_VERSION_STRING \$(LC_ALLC aarch64-linux-gnu-ld.bfd --version | head -n 1)\; ) include/config/uboot.release include/generated/version_autogenerated.h.tmp; if [ -r include/generated/version_autogenerated.h ] cmp -s include/generated/version_autogenerated.h include/generated/version_autogenerated.h.tmp; then rm -f include/generated/version_autogenerated.h.tmp; else : UPD include/generated/version_autogenerated.h; mv -f include/generated/version_autogenerated.h.tmp include/generated/version_autogenerated.h; fi set -e; : CHK include/generated/timestamp_autogenerated.h; mkdir -p include/generated/; (if test -n ${SOURCE_DATE_EPOCH}; then SOURCE_DATE${SOURCE_DATE_EPOCH}; DATE; for date in gdate date.gnu date; do ${date} -u -d ${SOURCE_DATE} /dev/null 21 DATE${date}; done; if test -n ${DATE}; then LC_ALLC ${DATE} -u -d ${SOURCE_DATE} #define U_BOOT_DATE %b %d %C%y; LC_ALLC ${DATE} -u -d ${SOURCE_DATE} #define U_BOOT_TIME %T; LC_ALLC ${DATE} -u -d ${SOURCE_DATE} #define U_BOOT_TZ %z; LC_ALLC ${DATE} -u -d ${SOURCE_DATE} #define U_BOOT_DMI_DATE %m/%d/%Y; LC_ALLC ${DATE} -u -d ${SOURCE_DATE} #define U_BOOT_BUILD_DATE 0x%Y%m%d; else return 42; fi; else LC_ALLC date #define U_BOOT_DATE %b %d %C%y; LC_ALLC date #define U_BOOT_TIME %T; LC_ALLC date #define U_BOOT_TZ %z; LC_ALLC date #define U_BOOT_DMI_DATE %m/%d/%Y; LC_ALLC date #define U_BOOT_BUILD_DATE 0x%Y%m%d; fi) Makefile include/generated/timestamp_autogenerated.h.tmp; if [ -r include/generated/timestamp_autogenerated.h ] cmp -s include/generated/timestamp_autogenerated.h include/generated/timestamp_autogenerated.h.tmp; then rm -f include/generated/timestamp_autogenerated.h.tmp; else : UPD include/generated/timestamp_autogenerated.h; mv -f include/generated/timestamp_autogenerated.h.tmp include/generated/timestamp_autogenerated.h; fi make -f ./scripts/Makefile.build objscripts/basic rm -f .tmp_quiet_recordmcount make -f ./scripts/Makefile.build obj. mkdir -p lib/aarch64-linux-gnu-gcc -Wp,-MD,lib/.asm-offsets.s.d -nostdinc -isystem /usr/lib/gcc-cross/aarch64-linux-gnu/11/include -Iinclude -I./arch/arm/include -include ./include/linux/kconfig.h -D__KERNEL__ -D__UBOOT__ -Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -fshort-wchar -Os -fno-stack-protector -fno-delete-null-pointer-checks -g -fstack-usage -Wno-format-nonliteral -Werrordate-time -D__ARM__ -fno-pic -mstrict-align -ffunction-sections -fdata-sections -fno-common -ffixed-r9 -fno-common -ffixed-x18 -pipe -marcharmv8-a -D__LINUX_ARM_ARCH__8 -I./arch/arm/mach-sunxi/include -DDO_DEPS_ONLY -DKBUILD_STR(s)#s -DKBUILD_BASENAMEKBUILD_STR(asm_offsets) -DKBUILD_MODNAMEKBUILD_STR(asm_offsets) -fverbose-asm -S -o lib/asm-offsets.s lib/asm-offsets.c ....2 u-boot源码目录结构 U-Boot源码目录结构如下 根据u-boot-2017.11根目录下README文件的说明各目录内容如下 目录/文件 名称描述/archArchitecture specific files/arch/armFiles generic to ARM architecture/apiMachine/arch independent API for external apps/boardBoard dependent files/cmdU-Boot commands functions/commonMisc architecture independent functions/configsBoard default configuration files/diskCode for disk drive partition handling/docDocumentation (don’t expect too much)/driversCommonly used device drivers/dtsContains Makefile for building internal U-Boot fdt/examplesExample code for standalone applications, etc/fsFilesystem code (cramfs, ext2, jffs2, etc.)/includeHeader Files/libLibrary routines generic to all architecturesLicensesVarious license files/netNetworking code/postPower On Self Test/scriptsVarious build scripts and Makefiles/testVarious unit test files/toolsTools to build S-Record or U-Boot images, etc.config.mkThis file is included from ./Makefile and spl/MakefileKbuildGenerate generic-asm-offsets.h, asm-offsets.hMAINTAINERSMaintainers ListMakefile顶层Makefile 3 Makefile源码 以u-boot-2017.11源码根目录下Makefile为例逐行分析。考虑行号对应使用截图显示代码 3.1 版本号 第5行~9行是u-boot版本号 VSERION为主版本号PATCHLEVEL为补丁版本SUBLEVEL为子版本号EXTRAVERSION为附加版本信息NAME为名字。 从2008年10月之后U-Boot中VSERION表示发布年份PATCHLEVEL为月份EXTRAVERSION表示候选版本其它基本不用。 3.2 环境变量 第20行~29行是一些环境变量的定义 在Makefile中通过export关键字将变量传递到下层Makefile中或者通过unexport关键字不让某些变量传递到下层Makefile。但SHELL和MAKEFLAGS两个变量不论是否export总会传递到下层Makefile 第20行在MAKEFLAGS变量后追加 -rR --include-dir$(CURDIR)-r表示禁止make使用任何隐含规则-R表示禁止make使用任何作用于变量上的隐含规则–include-dir dir 或者-I dir 用于指定一个被包含makefile的搜索目标。可以使用多个-I参数来指定多个目录$(CURDIR)表示当前目录 第23行~29行不传递LC_ALL、GREP_OPTIONS变量并将LC_COLLATE、LC_NUMERIC变量均赋值为C并进行传递。LC_COLLATE、LC_NUMERIC是有关区域支持的规则变量。 变量说明LC_COLLATE字符串排序顺序LC_CTYPE字符分类什么是一个字符它的大写形式是否等效LC_MESSAGES消息使用的语言Language of messagesLC_MONETARY货币数量使用的格式LC_NUMERIC数字的格式LC_TIME日期和时间的格式 区域支持指的是应用遵守文化偏好的问题包括字母表、排序、数字格式等。如果你想让系统表现得象没有区域支持那么使用特殊的区域名C或者等效的POSIX。使用 locale -a可以查看所有支持区域的列表 3.3 Beautify output 第73行~101行对编译过程中的信息输出进行控制。U-Boot的顶层Makefile中可以根据命令行参数控制编译过程中的信息输出如V1等。 这里使用origin函数此函数不操作变量的值返回变量的来源比如来源于命令行、环境变量等 $(origin varible)origin函数返回值说明undefined从来没有定义过default默认变量environment环境变量且当Makefile被执行时-e参数没有被打开file被定义在Makefile中command line命令行override变量是被override指示符重新定义的automatic自动化变量 第73行~86行使用origin函数判断变量V的来源如果来源于命令行则将KBUILD_VERBOSE赋值为V的值否则为0后续对KBUILD_VERBOSE的值进行判断如果KBUILD_VERBOSE1则变量quiet和Q均为空否则quietquiet_Q 并将KBUILD_VERBOSE、quiet和Q传递到下层Makefile第101行。 第91行~99行使用filter函数判断make版本filter函数以 pattern 模式过滤 text 字符串中的单词保留符合模式 pattern 的单词可以有多个模式返回符合 pattern 的字符串 $(filter pattern...,text)则91行语句 ifneq ($(filter 4.%,$(MAKE_VERSION)),)即使用filter函数获取MAKE_VERSION中类似4.%模式的字符串在终端中查看make版本可知为4.3即filter函数返回值为4.3。因此这条语句即为判断filter返回值是否不等于空值很明显满足判断条件执行下一行语句 第92行 ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)这里与上一行语句类似不过使用了firstword函数获取MAKEFLAGS变量的第一个单词 如果不为空则继续向下执行quiet变量赋值为silent_ 这里在Makefile中增加几行代码图中103行~108行看看变量MAKEFLAGS以及firstword输出的值注意echo必须以tab开头后续编译U-Boot时记得删除这几行代码 因此当使用默认参数编译时quietquiet_Q编译信息输出较少 tzwtzw-virtual-machine:~/arm/u-boot/u-boot-2017.11$ make CROSS_COMPILEaarch64-linux-gnu- MAKEFLAGSrR -I/home/tzw/arm/u-boot/u-boot-2017.11 --no-print-directory -- CROSS_COMPILEaarch64-linux-gnu- firstwordxrR quietquiet_ Q KBUILD_VERBOSE0增加-s静默编译时quietsilent_Q此时不输出信息 tzwtzw-virtual-machine:~/arm/u-boot/u-boot-2017.11$ make CROSS_COMPILEaarch64-linux-gnu- -s MAKEFLAGSrRs -I/home/tzw/arm/u-boot/u-boot-2017.11 --no-print-directory -- CROSS_COMPILEaarch64-linux-gnu- firstwordxrRs quietsilent_ Q KBUILD_VERBOSE0增加V1显示所有编译过程输出信息时quiet和Q均为空此时输出完整信息 tzwtzw-virtual-machine:~/arm/u-boot/u-boot-2017.11$ make CROSS_COMPILEaarch64-linux-gnu- V1 MAKEFLAGSrR -I/home/tzw/arm/u-boot/u-boot-2017.11 --no-print-directory -- V1 CROSS_COMPILEaarch64-linux-gnu- firstwordxrR quiet Q KBUILD_VERBOSE1通过变量quiet和Q的值对输出信息进行控制通常make会把其要执行的命令行在命令执行前进行输出当在make命令前使用字符则不会输出显示 $(Q)$(MAKE) XXX对于quiet变量的使用则不同通常相同的命令有两种版本quiet_cmd_xxx输出信息少cmd_xxx则输出完整的信息如果变量quiet为空的话整个命令都会输出如果变量quiet为“quiet_”的话仅输出信息少的版本如果变量quiet为“silent_”的话整个命令都不会输出。 quiet_cmd_clean CLEAN $(obj)cmd_clean rm -f $(__clean-files)3.4 输出文件的目录设置、PHONY目标 第120行~156行用于设置编译输出文件保存的目录这个功能一般很少使用 第120行判断KBUILD_SRC是否为空满足条件每次执行总是空执行后续代码 第124行使用origin函数判断O的来源是否为命令行如果是那么将KBUILD_OUTPUT赋值为O的值即可以通过 make O/xxx/xxx/xxx指定KBUILD_OUTPUT输出目录output_dir/xxx/xxx/xxx 第129行指定PHONY目标依赖于_all而_all下为空 这里补充一下Makefile的规则格式其中targets为目标这里是_all冒号后接目标的必要条件依赖文件这里没有下一行为命令必须以tab开头这里也为空 targets: prerequisitescommand一个简单的Makefile如下第一行的All即为make的默认目标这里同时是伪目标即不会生成All文件但是All的依赖文件将会生成而All的依赖文件如何生成呢在第6行可以找到hello依赖于hello.o并且第7行以tab开头给出生成hello这个目标所需执行的命令即gcc hello.o -o hello同理第3行给出了hello.o目标的规则即依赖于hello.c通过执行命令gcc -c hello.c -o hello.o来生成hello.o All: hellohello.o: hello.cgcc -c hello.c -o hello.ohello: hello.ogcc hello.o -o helloclean:rm -rf hello hello.o而第9行的clean目标没有依赖文件仅有执行的命令即rm -rf hello hello.o删除生成的所有文件这里clean不是默认目标因此执行时须通过指定目标即make clean指定执行的目标为clean才会执行 因此第129行为Makefile中首次出现目标即PHONY为其默认目标此时对应的依赖文件为_all而_all为空 第133行是一个特殊的语法它被用于取消Makefile默认的隐含规则。这个语句的作用是阻止Make命令在当前目录下自动查找和使用默认的隐含规则来构建目标 一般来说Makefile: 这个目标是用来制定如何创建或更新名为 “Makefile” 的目标的规则。当在命令行运行 “make” 命令或者 “make Makefile” 命令时这个目标就会被构建。 然而在$(CURDIR)/Makefile Makefile: ;这条规则中“Makefile:” 后面并没有跟随任何命令因此这实际上是一个空规则用途在于取消 Make 的隐含规则而没有指向具体的构建方法。 特别地如果对一个项目使用 “make” 命令而该项目的 Makefile 中包含了类似你给出的规则那么 “make” 命令就不会尝试寻找并运行任何默认的或者隐含的规则去构建名为 “Makefile” 的目标。 这样就避免了可能存在的由默认或隐含规则产生的意外构建行为 说白了直接在Makefile文件所在的目录运行命令make时如果命中了 make Makefile就会调用一条空命令什么都不做 第135行~140行首先判断KBUILD_OUTPUT是否不为空即如果通过O/xxx/xxx/xxx指定了输出目录路径则将路径保存到saved-output变量中后续用于信息输出然后使用shell函数执行mkdir和cd并将创建成功后的绝对路径赋值给KBUILD_OUTPUT然后进入此目录 shell函数也不像其它的函数。顾名思义它的参数应该就是操作系统Shell的命令。它和反引号是相同的功能。这就是说shell函数把执行操作系统命令后的输出作为函数返回 注意这个函数会新生成一个Shell程序来执行命令所以需要注意其运行性能如果Makefile中有一些比较复杂的规则并大量使用了这个函数那么对于系统性能是有害的。特别是Makefile的隐晦的规则可能会让shell函数执行的次数比想像的多得多 /bin/pwd --helpUsage: /bin/pwd [OPTION]... Print the full filename of the current working directory.-L, --logical use PWD from environment, even if it contains symlinks-P, --physical avoid all symlinks--help display this help and exit--version output version information and exitIf no option is specified, -P is assumed.NOTE: your shell may have its own version of pwd, which usually supersedes the version described here. Please refer to your shells documentation for details about the options it supports.GNU coreutils online help: https://www.gnu.org/software/coreutils/ Full documentation https://www.gnu.org/software/coreutils/pwd or available locally via: info (coreutils) pwd invocation 第141行如果创建不成功则输出相关错误信息 第144~147行在伪目标后添加$ (MAKECMDGOALS)和sub-make伪目标这里MAKECMDGOALS为空可以使用echo输出查看然后使用反过滤函数filter-out返回$ (MAKECMDGOALS)中去除_all、sub-make、$(CURDIR)/Makefile的内容 make的环境变量叫MAKECMDGOALS 这个变量中会存放指定的最终目标的列表如果在命令行上没有指定目标那么这个变量是空值。 第149~151行确定sub-make的规则即 $(Q)$(MAKE) -C output_dir KBUILD_SRCpwd -f pwd/Makefile [Targets]其中pwd为当前目录绝对路径即~/arm/u-boot/u-boot-2017.11。即指定输出目录output_dir/xxx/xxx/xxx进行make 第154行将skip-makefile的值覆盖为1此时根据第159行的判断skip-makefile的值不为空不满足条件第159行~1699行的内容不会执行Makefile将提前结束 这一段的功能一般很少使用因此后续继续执行第159行~1699行的内容。则PHONY的依赖文件依旧只有_all all 3.6 目录信息 第164行在MAKEFLAGS变量后增加--no-print-directory选项在编译过程中不会输出Entering directory ...之类的信息 3.5 Source Code Checker 第156行~181行是否启用代码检查功能 首先还是通过origin函数判断是否从命令行输入C参数即make C1或者make C2 如果有的话将C的值赋值给KBUILD_CHECKSRC然后判断是否定义了KBUILD_CHECKSRC否则将KBUILD_CHECKSRC的值赋为0 这里根据166行~174行的注释可知C1时仅检查重新编译的文件C2时对所有源文件进行检查 3.7 设置单独编译模块、PHONY目标 第186行~223行设置单独的模块编译并设置一些变量 第186行~188行判断是否定义了SUBDIRS如果定义了SUBDIRS变量KBUILD_EXTMODSUBDIRS这里是为了支持老语法make SUBIDRSdir 第190行~192行同样使用origin函数判断命令行是否输入参数M所有则将KBUILD_EXTMOD赋值为M的值即使用make M/dir方式定义所需编译的模块 第196行添加all为PHONY的依赖文件则此时PHONY依赖文件为_all all 第197行~201行判断KBUILD_EXTMOD是否为空即是否定义了需要编译的模块若无则_all规则依赖于all因此将先编译all否则将_all规则依赖modules进行模块编译。模块编译一般很少用因此会编译all 第203行~213行判断KBUILD_SRC是否为空若为空则将当前位置的srctree值赋值为.即当前目录否则根据KBUILD_SRC值对srctree进行赋值这里KBUILD_SRC为空srctree值赋值为. 第214行~216行设置src和obj的值均为当前目录. 第218行由于KBUILD_EXTMOD为空因此VPATH的值为srctree的值即当前目录. 第220行传递srctree objtree VPATH三个变量的值 第223行不传递CDPATH的值 3.8 获取宿主机的架构和系统 第227行~240行获取宿主机架构和系统 首先介绍几个命令 获取主机的架构uname -m 或uname --machine获取主机系统uname -s或者uname --kernel-name sed是linux的一个流编辑器每次从输入中读取一行数据根据所提供的编辑器命令匹配数据并返回新的数据或输出到STDOUT。其中s命令如下 sed s/pattern/replacement/flags即使用replacement替换数据中的pattern 而-e选项用于多个sed指令的情况 tr命令将输入的数据中SET1全部转换为SET2而[:lower:]表示所有小写字母[:upper:]表示所有大写字母 tr [option] SET1 SET2因此对于第227行~235行首先通过uname -m 命令获取宿主机系统架构这里为x86_64并通过sed命令将其中的i.86替换为x86其它行同理这里最终结果仍为HOSTARCHx86_64 第237行~238行首先通过uname -s命令获取宿主机系统名称这里为Linux然后通过tr命令将其转变为小写后续的sed命令因没有匹配的数据则不执行最终结果为HOSTOSlinux 第240行传递HOSTARCH和HOSTOS变量 3.9 设置交叉编译工具链前缀 第245行~247行设置交叉编译工具链 这里首先对Makefile的几种赋值方式进行说明 赋值方式说明直接赋值与位置无关系统将自动推导将最终的赋值作为该变量的值:覆盖式赋值只能推导该符号位置之前的值追加赋值旧值保持不变将新值增加到旧值后面?当某变量前面已经定义赋值过则不执行本次定义赋值否则执行本次赋值 这里第245行判断HOSTARCH与ARCH是否相等肯定不相等因此对CROSS_COMPILE进行赋值即执行make命令时总是需要指定交叉编译工具链否则CROSS_COMPILE为空后续执行将报错 make CROSS_COMPILEaarch64-linux-gnu-3.10 设置配置文件 第249行~255行设置配置文件、设置所使用的shell 第249行~250行将KCONFIG_CONFIG的值设置为.config即通过make xxx_defconfig在u-boot-2017.11根目录下生成的配置文件 第253行~255行使用shell函数通过if -x FILE判断FILE 存在且是可执行的则为真这里CONFIG_SHELL最终为/bin/bash可以使用echo输出查看 3.11 定义变量 第257行~261行定义HOSTCC、HOSTCXX、HOSTCFLAGS、HOSTCXXFLAGS4个变量 后续第263行~295行判断HOSTOS是否为cygwin或者darwin将对上述变量值进行修改这里HOSTOSlinux因此上述变量值不变最终为 HOSTCC cc HOSTCXX c HOSTCFLAGS -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer HOSTCXXFLAGS -O2第300行~326行对KBUILD_MODULES、KBUILD_BUILTIN、KBUILD_CHECKSRC、KBUILD_SRC、KBUILD_EXTMOD变量进行赋值 结合前述分析最终值为 KBUILD_MODULES KBUILD_BUILTIN 1 KBUILD_CHECKSRC 0 KBUILD_SRC KBUILD_EXTMOD 3.12 include文件 第329行~330行调用scripts/Kbuild.include引入其中定义的变量 3.13 设置交叉编译工具链 第334行~391行设置交叉编译工具链以及一些变量值并传递相关变量 第334行~348行定义所需的交叉编译工具链 其中第336行用到一个特殊的设备/dev/null是一个空设备文件向其写入的东西将被丢弃 这里首先使用shell函数新生成一个shell执行后续命令即执行 aarch64-linux-gnu-ld.bfd -v 2 /dev/null其中aarch64-linux-gnu-ld.bfd -v表示取aarch64-linux-gnu-ld.bfd的版本号后续的2意为将标准错误输出stderr重定向至/dev/null即丢弃所有错误输出2为stderr的文件描述符stdout文件描述符为1stdin文件描述符为0 因此336行语句意为检查aarch64-linux-gnu-ld.bfd的版本如果报错则将所有错误信息丢弃因此会返回空值。也就是通过检查版本判断系统是否有aarch64-linux-gnu-ld.bfd如果有则将LD的赋值为aarch64-linux-gnu-ld.bfd 第349行~368行定义一些工具和变量 这里编辑Makefile文件将关心的变量进行输出然后通过make CROSS_COMPILEaarch64-linux-gnu- PrintInfo命令将Target指定为PrintInfo仅输出需要的打印信息 这些变量在顶层Makefile中没有定义因此必定在其它文件中定义然后在Makefile中使用后续结合具体的make编译过程进行分析 3.14 PHONY scripts_basic 第397行~403行在PHONY后添加scripts_basic依赖项此时PHONY依赖项为_all all scripts_basic 对于scripts_basic的执行语句根据前述分析这里Q的值为空或者build的值在Makefile中没有出现应该在其它文件中有定义。根据名称来看大概率在scripts目录下执行搜索匹配其中-r表示在所有子目录下递归搜索-w表示全字匹配 grep -rw build从结果中可以看到在/scripts/Kbuild.include中对build进行了赋值根据3.12节可知顶层Makefile确实引用了这个文件查看其内容第181行将build赋值为build : -f $(srctree)/scripts/Makefile.build obj 由3.7节中的分析可知srctree的值为. 因此这里scripts_basic的执行语句最终为 scripts_basic:make -f ./scripts/Makefile.build objscripts/basicrm -f .tmp_quiet_recordmcount3.15 PHONY outputmakefile 第405行~414行在PHONY后添加outputmakefile依赖项此时PHONY依赖项为_all all scripts_basic outputmakefile 由于未定义KBUILD_SRC的值因此outputmakefile执行命令为空 3.16 config相关变量 第424行~448行定义一些变量 include/generated/version_autogenerated.h和include/generated/timestamp_autogenerated.h两个文件是自动生成的文件包含版本信息和时间信息 第435行~448行根据make的输入目标对config-targets、mixed-targets、dot-config三个变量的值进行修改 当执行make xxx_defconfig时 config-targets 1 mixed-targets 0 dot-config 1当执行make CROSS_COMPILEaarch64-linux-gnu-时 config-targets 0 mixed-targets 0 dot-config 13.17 ifeq ($(mixed-targets),1) 第450行根据上述分析不满足条件因此执行else后面的语句 3.18 ifeq ($(config-targets),1) 第467行根据上述分析当执行make xxx_defconfig时满足条件因此继续执行472行~479行 当执行make CROSS_COMPILEaarch64-linux-gnu-时不满足条件因此执行else分支后续的语句 3.19 PHONY scripts 第489行~491行在PHONY后添加scripts依赖项此时PHONY依赖项为_all all scripts_basic outputmakefile scripts scripts依赖项为scripts_basic include/config/auto.confscripts_basic在前已经分析过include/config/auto.conf文件是执行make xxx_defconfig时自动生成的保存了各个配置内容 scripts执行语句如下$()表示规则中的目标文件集 make -f ./scripts/Makefile.build obj$()3.20 ifeq ($(dot-config),1) 第493行根据上述分析满足条件因此执行后续语句 3.21 一些include和变量 第495行~524行 include/config/auto.conf文件是执行make xxx_defconfig时自动生成的保存了各个配置内容 include/config/auto.conf.cmd文件中保存了所有Kconfig文件的路径Kconfig文件主要是各种配置界面的源文件 KCONFIG_CONFIG变量的值在前面分析过为.config include/autoconf.mk文件中保存了各项配置内容 include/autoconf.mk.dep文件中保存了所有需要的头文件的路径 config.mk文件保存了与ARCH、CPU、BOARD等相关的参数 第530行~578行 其中EFI_LDS、EFI_CRT0、EFI_RELOC在/arch/arm/cpu/armv8/config.mk中定义CFLAGS_EFI、CFLAGS_NON_EFI在arch/arm/config.mk中定义 EFI_LDSelf_aarch64_efi.lds EFI_CRT0crt0_aarch64_efi.o EFI_RELOCreloc_aarch64_efi.o CFLAGS_EFI-fpic -fshort-wchar CFLAGS_NON_EFI-fno-pic -ffixed-r9 -ffunction-sections -fdata-sections EFI_TARGET LDSCRIPT./arch/arm/cpu/armv8/u-boot.lds BOARDDIRsunxi CPUDIRarch/arm/cpu/armv8 ARCHarm第584行判断未定义CONFIG_XTENSA因此满足条件LDPPFLAGS -ansi 第588行~624行 这里KBUILD_CFLAGS在前面已经进行了赋值588行前其值为 KBUILD_CFLAGS -Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -fshort-wchar查看是否有CONFIG_CC_OPTIMIZE_FOR_SIZE的定义 因此执行KBUILD_CFLAGS -Os 随后继续在后添加-fno-stack-protector、-fno-delete-null-pointer-checks、-g选项 第603行满足条件 因此添加-fstack-usage选项 随后添加-Wno-format-nonliteral、-Werrordate-time选项 因此最终KBUILD_CFLAGS的值为-Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -fshort-wchar -Os -fno-stack-protector -fno-delete-null-pointer-checks -g -fstack-usage -Wno-format-nonliteral -Werrordate-time 第628行~643行 UBOOTINCLUDE -Iinclude -I./arch/arm/include -include ./include/linux/kconfig.h NOSTDINC_FLAGS -nostdinc -isystem /usr/lib/gcc-cross/aarch64-linux-gnu/11/include CHECKFLAGS -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise -Wno-return-void -D__CHECK_ENDIAN__ -nostdinc -isystem /usr/lib/gcc-cross/aarch64-linux-gnu/11/include cpp_flags -D__KERNEL__ -D__UBOOT__ -D__ARM__ -fno-pic -mstrict-align -ffunction-sections -fdata-sections -fno-common -ffixed-r9 -fno-common -ffixed-x18 -pipe -marcharmv8-a -D__LINUX_ARM_ARCH__8 -I./arch/arm/mach-sunxi/include -Iinclude -I./arch/arm/include -include ./include/linux/kconfig.h -nostdinc -isystem /usr/lib/gcc-cross/aarch64-linux-gnu/11/include c_flags -Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -fshort-wchar -Os -fno-stack-protector -fno-delete-null-pointer-checks -g -fstack-usage -Wno-format-nonliteral -Werrordate-time -D__KERNEL__ -D__UBOOT__ -D__ARM__ -fno-pic -mstrict-align -ffunction-sections -fdata-sections -fno-common -ffixed-r9 -fno-common -ffixed-x18 -pipe -marcharmv8-a -D__LINUX_ARM_ARCH__8 -I./arch/arm/mach-sunxi/include -Iinclude -I./arch/arm/include -include ./include/linux/kconfig.h -nostdinc -isystem /usr/lib/gcc-cross/aarch64-linux-gnu/11/include3.22 libs-y u-boot-init u-boot-main 第648行~713行主要为获取配置的libs-y的值 这里有一个巧妙的用法libs-$(CONFIG_CMD_NAND)其中CONFIG_CMD_NAND一般在XXXconfig文件中定义CONFIG_CMD_NANDy因此若配置的时候定义了那么libs-$(CONFIG_CMD_NAND)的值即为libs-y 根据配置将所有用到的库路径保存在libs-y中然后第704行通过sort函数按照字母顺序升序排序第710行通过patsubst函数将libs-y末尾的/替换成/built-in.o 各值如下 libs-y arch/arm/cpu/built-in.o arch/arm/cpu/armv8/built-in.o arch/arm/lib/built-in.o arch/arm/mach-sunxi/built-in.o board/sunxi/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/pci/built-in.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/domain/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/common/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o env/built-in.o fs/built-in.o lib/built-in.o net/built-in.o test/built-in.o test/dm/built-in.ou-boot-dirs arch/arm/cpu arch/arm/cpu/armv8 arch/arm/lib arch/arm/mach-sunxi board/sunxi cmd common disk drivers drivers/dma drivers/gpio drivers/i2c drivers/mtd drivers/mtd/onenand drivers/mtd/spi drivers/net drivers/net/phy drivers/pci drivers/power drivers/power/battery drivers/power/domain drivers/power/fuel_gauge drivers/power/mfd drivers/power/pmic drivers/power/regulator drivers/serial drivers/spi drivers/usb/common drivers/usb/dwc3 drivers/usb/emul drivers/usb/eth drivers/usb/gadget drivers/usb/gadget/udc drivers/usb/host drivers/usb/musb-new drivers/usb/musb drivers/usb/phy drivers/usb/ulpi env fs lib net test test/dm tools examplesu-boot-alldirsapi arch/arm/cpu arch/arm/cpu/armv8 arch/arm/lib arch/arm/mach-sunxi board/sunxi cmd common disk drivers drivers/ddr/altera drivers/ddr/fsl drivers/dma drivers/gpio drivers/i2c drivers/mtd drivers/mtd/nand drivers/mtd/onenand drivers/mtd/spi drivers/mtd/ubi drivers/net drivers/net/fm drivers/net/phy drivers/pci drivers/power drivers/power/battery drivers/power/domain drivers/power/fuel_gauge drivers/power/mfd drivers/power/pmic drivers/power/regulator drivers/serial drivers/spi drivers/usb/common drivers/usb/dwc3 drivers/usb/emul drivers/usb/eth drivers/usb/gadget drivers/usb/gadget/udc drivers/usb/host drivers/usb/musb drivers/usb/musb-new drivers/usb/phy drivers/usb/ulpi dts env examples fs lib net post test test/dm test/env test/overlay toolshead-yarch/arm/cpu/armv8/start.ou-boot-initarch/arm/cpu/armv8/start.ou-boot-main arch/arm/cpu/built-in.o arch/arm/cpu/armv8/built-in.o arch/arm/lib/built-in.o arch/arm/mach-sunxi/built-in.o board/sunxi/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/pci/built-in.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/domain/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/common/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o env/built-in.o fs/built-in.o lib/built-in.o net/built-in.o test/built-in.o test/dm/built-in.o3.23 Add GCC lib 第717行~724行 没有定义CONFIG_USE_PRIVATE_LIBGCCy第717行不满足条件因此PLATFORM_LIBGCC -L /usr/lib/gcc-cross/aarch64-linux-gnu/11 -lgccPLATFORM_LIBS -L /usr/lib/gcc-cross/aarch64-linux-gnu/11 -lgcc表示使用GCC的支持库libgcc.a 3.24 LDPPFLAGS 第729行~733行给定LDPPFLAGS的值LDPPFLAGS-ansi -include ./include/u-boot/u-boot.lds.h -DCPUDIRarch/arm/cpu/armv8 3.25 BOARD_SIZE_CHECK 第738行~751行设定BOARD_SIZE_CHECK的值这里为空 3.26 DO_STATIC_RELA **第757行765行**这里CONFIG_STATIC_RELA在./include/autoconfg.mk中定义为y因此DO_STATIC_RELA为760行762行所定义的内容 3.27 ALL-y 第768行~812行定义ALL-y的内容 ALL-y checkarmreloc u-boot.srec u-boot.bin u-boot.sym System.map binary_size_check spl/u-boot-spl.bin u-boot.img u-boot.dtb u-boot-dtb.img u-boot.itb3.28 LDFLAGS_u-boot 第814行~821行设置LDFLAGS_u-boot的值 LDFLAGS_u-boot -pie --gc-sections -Bstatic --no-dynamic-linker -Ttext 0x4a000000 LDFLAGS_FINAL --gc-sections -Bstatic CONFIG_SYS_TEXT_BASE 0x4a0000003.29 quiet_cmd和cmd 第824行~857行定义一些命令 3.30 all 第859行~870行定义all的依赖项 3.31 PHONY dtbs 第872行~876行添加dtbs依赖项此时PHONY依赖项为_all all scripts_basic outputmakefile scripts dtbs 3.32 u-boot.bin 第881行~904行定义一些目标 未定义CONFIG_MULTI_DTB_FIT因此第881行不满足条件进入第895行的判断查找可知在配置的时候定义了CONFIG_OF_SEPARATE因此执行此分支 u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE$(call if_changed,cat)u-boot.bin: u-boot-dtb.bin FORCE$(call if_changed,copy)本章先分析到此处后续根据具体的编译过程进行分析或留待以后补充 完结撒花✿✿ヽ(°▽°)ノ✿
http://www.zqtcl.cn/news/755228/

相关文章:

  • 福州志愿者官方网站怎么做erp管理系统介绍
  • 高端网站建设费用情况广州开发区控股集团有限公司
  • 精湛的网站设计云南网招聘
  • 南昌网站建设公司行情Wordpress添加分页按钮
  • 论坛网站建设流程wordpress速度优化插件
  • PHP套模板做网站建设银行保定分行网站
  • 怎样免费注册网站域名wordpress网站回调域
  • 东莞个人免费建网站乐清网约车事件
  • 备案查询网站网站的登录弹窗怎么做
  • 网站开发 mvc北京建设工程主管部门网站
  • 淮安建设机械网站制作代理公司注册需要多少钱
  • 站长收录茌平建设局网站
  • 如何进行网站开发开发区人才
  • 网站制作 视频网站维护的主要内容包括
  • 快速企业建站深圳网站关键词优化推广
  • 如何开网店详细步骤东莞市网络seo推广
  • 个人可以做哪些有意思的网站网站和网站的app
  • 北京高端网站开发公司网站建设后台实训体会
  • 青岛海川建设集团有限公司网站wordpress 变私有云
  • 网站备案人可以改吗石大网页设计与网站建设客观题
  • 宁波网站优化方案免费关键词挖掘工具
  • 网站制作想法免费做效果图网站
  • 晓风彩票网站建设软件微信上发的链接网站怎么做的
  • 关键词有哪几种台州优秀关键词优化
  • 盐田区住房和建设局网站软件开发文档怎么编写
  • 网站响应式建设seo排名优化怎样
  • 山东 网站备案德清县建设局网站
  • 中英语双语网站咋做提供网站建设设计外包
  • 云网站功能江门网站seo关键词排名优化
  • 潍坊网站建设外贸制作html网站