在阅读U-boot源码时,同一个函数会有多个定义,这不利于快速理解U-boot。如何唯一定位函数的位置呢?
原理
在我们配置、编译U-boot后,gcc将生成一个map文件。在map文件中,包含函数名以及函数所在文件。我们可以通过通过这个map文件,快速定位我们想要分析函数的位置。为方便手动查找,编写一个脚本,以函数名为参数,输出定义函数的文件和行号,并用vim打开。
脚本名"s", 内容:
#!/bin/bash
uboot_dir="/home/meng/workspace/u-boot-2018.11"
mode="spl"
#mode="u-boot"
func_name=$1
function show_error()
{
echo -e "\033[31m$1\033[0m"
}
function show_usage()
{
echo -e "\033[33mUsage:\033[0m$1"
}
if [ "$1" = "" ]; then
show_usage "s func_name"
exit 1
fi
spl_dir="${uboot_dir}/spl"
uboot_map_file=u-boot.map
spl_map_file=u-boot-spl.map
# get text section
if [ "${mode}" = "spl" ]; then
cd ${spl_dir}
map_file=${spl_map_file}
elif [ "${mode}" = "u-boot" ]; then
cd ${uboot_dir}
map_file=${uboot_map_file}
fi
linenum=$(grep -in "Linker Script" ${map_file} | awk -F: '{printf $1}')
text_section=$(sed -n "$linenum,/^\.rodata/p" ${map_file})
# parse the path
location=$(echo "${text_section}"