概述
0x00 环境说明:
分析所使用的SDK为锐尔威视的开发板的资料中的Linux-SDK
0x01 脚本分析:
顶层目录下的build.sh:
buildroot/scripts/mkcommon.sh [email protected]
本质上是调用的 buildroot/scripts/mkcommon.sh 并直接把所有的参数传过去
mkcommon.sh前几行:
BR_SCRIPTS_DIR=`dirname $0`
# source shflags
. ${BR_SCRIPTS_DIR}/shflags/shflags
. ${BR_SCRIPTS_DIR}/mkcmd.sh
设置目录,导入相关命令
然后是:
[ -f .buildconfig ] && . .buildconfig
.buildconfig 文件存在时source该文件
往后是:
if [ "x$1" = "xconfig" ] ; then
. ${BR_SCRIPTS_DIR}/mksetup.sh
exit $?
elif [ "x$1" = "xpack" ] ; then
init_defconf
mkpack
exit $?
elif [ "x$1" = "xpack_debug" ] ; then
init_defconf
mkpack -d card0
exit $?
elif [ "x$1" = "xpack_dump" ] ; then
init_defconf
mkpack -m dump
exit $?
elif [ "x$1" = "xpack_prvt" ] ; then
init_defconf
mkpack -f prvt
exit $?
elif [ $# -eq 0 ] ; then
init_defconf
mklichee
exit $?
fi
根据传入的参数进行相关的操作,从上到下判断的参数依次是:
1、config
2、pack
3、pack_debug
4、pack_dump
5、pack_prvt
6、参数为空
step1:“./build.sh config”
按照编译时的操作顺序,首先执行时传入的参数为 config,调用的是 该目录下的 mksetup.sh:
. buildroot/scripts/mkcmd.sh
function mksetup()
{
rm -f .buildconfig
printf "n"
printf "Welcome to mkscript setup progressn"
select_board
init_defconf
}
mksetup
可以知道具体流程如下:
1、导入 buildroot/scripts/mkcmd.sh 中符号(函数)
2、删除配置文件 .buildconfig(顶层目录)
3、打印提示信息
4、执行 mkcmd.sh 中的 select_board
5、执行 mkcmd.sh 中的 init_defconf
在 select_board 中需要用户设置 chip、platform、kernel、board 等配置
在 init_defconf 则主要设置一些编译时所需要的路径信息
最终会在顶层目录的 .buildconfig 文件中生成如下信息(不同的选择会有所差异):
export LICHEE_CHIP=sun8iw5p1
export LICHEE_PLATFORM=dragonboard
export LICHEE_KERN_VER=Linux-3.4
export LICHEE_BOARD=vstar
step2:“cp a33_vstar_defconfig .config”
在 Linux 内核的顶层目录下生成编译配置文件 .config
后续可以通过命令修改配置:
make menuconfig
当然也可以直接进行编辑
step3:“./build.sh ”
编译时直接调用 build.sh,不传入任何参数,在 mkcommon.sh 中执行的是第六条分支:
elif [ $# -eq 0 ] ; then
init_defconf
mklichee
exit $?
fi
其中 init_defconf 确保环境的初始化
编译时主要执行的命令是 mklichee
在 mkcmd.sh 文件中查看 mklichee 的实现:
function mklichee()
{
mk_info "----------------------------------------"
mk_info "build lichee ..."
mk_info "chip: $LICHEE_CHIP"
mk_info "platform: $LICHEE_PLATFORM"
mk_info "kernel: $LICHEE_KERN_VER"
mk_info "board: $LICHEE_BOARD"
mk_info "output: out/${LICHEE_CHIP}/${LICHEE_PLATFORM}/${LICHEE_BOARD}"
mk_info "----------------------------------------"
check_env
mkbr && mkkernel && mkrootfs
[ $? -ne 0 ] && return 1
mk_info "----------------------------------------"
mk_info "build lichee OK."
mk_info "----------------------------------------"
}
其中 mk_info 设置打印字符串的格式:
function mk_info()
{
echo -e "