Linux 源码文件太多了,整体导入 source insight 会非常卡慢,Sync 也需要很久。且不同硬件平台又有很多相同的 symbol,需要阅读的时候眼动区分太累了。这个方法就可以精准导入你的平台所需的源码文件。
Linux 源代码:
https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.18.1.tar.xzSource Insight 4 安装文件:
https://assets-sourceinsight.sfo2.digitaloceanspaces.com/v4/release/sourceinsight40148_7177-setup.exeSource Insight 4 免费使用的 patch:
https://github.com/YukiIsait/SourceInsight4Patch/releases/download/v1.0.1/msimg32.dll运行安装 source insight 4,并在安装后将 dll 文件放到 sourceinsight4.exe 同级文件夹中。即可正常使用。
安装编译 Linux 内核所需编译器(我编译是 RISC-V 平台,根据自己的平台选择相应的编译器)
sudo apt install -y gcc-riscv64-linux-gnu安装编译 Linux 内核所需环境
sudo apt install -y build-essential libncurses-dev flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf解压 Linux 源码压缩包
tar Jxvf linux-6.18.1.tar.xz配置编译 config
make ARCH=riscv defconfig编译(将打印重定向到文件中,后续有用)
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- all -j8 > build_log.txt编译时间可能需要十几分钟,由电脑性能决定。期间可以用以下指令查看编译进度
cat build_log.txt | tail编译时我们来准备解析编译 Log 提取文件列表的脚本。可以用 vim 创建脚本
vim sg.sh将以下脚本粘贴进去,注意 ABS_PATH 配置为 Windows 路径,但是斜杠用 Linux 的正斜杠,脚本最后会替换。
#!/bin/shARCH=armMACH=imxFILE_IN=$1FILE_OUT=$2#windows abs pathABS_PATH="D:/Codes/C/linux-6.18.1/"# .cSOURCE_LIST=""# generated file listFILE_LIST=""# nest depth for function get_includes()NEST_DTPTH=0# recursive function, used to get included files from files.# result is stored in FILE_LIST# $1 : file list, e.g. "fs/ext4/file.c fs/ext4/fsync.c"get_includes(){local includeslocal filefor file in$1doif [ ! -e ${file} ]; thencontinuefiifecho"${FILE_LIST}" | grep -E ${file} > /dev/null; thencontinuefi FILE_LIST="${FILE_LIST}${file}" NEST_DTPTH=$((NEST_DTPTH+1))echo"<${NEST_DTPTH} : ${file}" includes=$( \ grep -E -H '^#include'${file} | \ sed -r \ -e 's@^.*<(acpi/.*)>@include/\1@' \ -e 's@^.*<(asm-generic/.*)>@include/\1@'\ -e 's@^.*<(config/.*)>@include/\1@' \ -e 's@^.*<(crypto/.*)>@include/\1@' \ -e 's@^.*<(drm/.*)>@include/\1@' \ -e 's@^.*<(generated/.*)>@include/\1@' \ -e 's@^.*<(keys/.*)>@include/\1@' \ -e 's@^.*<(linux/.*)>@include/\1@' \ -e 's@^.*<(math-emu/.*)>@include/\1@' \ -e 's@^.*<(media/.*)>@include/\1@' \ -e 's@^.*<(misc/.*)>@include/\1@' \ -e 's@^.*<(mtd/.*)>@include/\1@' \ -e 's@^.*<(net/.*)>@include/\1@' \ -e 's@^.*<(pcmcia/.*)>@include/\1@' \ -e 's@^.*<(rdma/.*)>@include/\1@' \ -e 's@^.*<(rxrpc/.*)>@include/\1@' \ -e 's@^.*<(scsi/.*)>@include/\1@' \ -e 's@^.*<(sound/.*)>@include/\1@' \ -e 's@^.*<(target/.*)>@include/\1@' \ -e 's@^.*<(trace/.*)>@include/\1@' \ -e 's@^.*<(uapi/.*)>@include/\1@' \ -e 's@^.*<(video/.*)>@include/\1@' \ -e 's@^.*<(xen/.*)>@include/\1@' \ -e "s@^.*<(asm/.*)>@arch/${ARCH}/include/\1 arch/${ARCH}/include/generated/\1@" \ -e "s@^.*<(mach/.*)>@arch/${ARCH}/mach-${MACH}/include/\1@" \ -e 's@(^.*/)[^/]+\.c.*\"(.*)\"@\1\2@' \ -e 's@/\*.*@@' \ -e 's@^.*\#include.*$@@' \ -e 's@^@ @' | \ sort | \ uniq | \ tr -d '\n' | \ tr -d '\r' \ )if [ -n "${includes}" ]; then get_includes "${includes}"fiecho">${NEST_DTPTH}) : ${file}" NEST_DTPTH=$((NEST_DTPTH-1))done}# get *.c from kernel build logSOURCE_LIST=$( \ grep -E '^\s*CC'${FILE_IN} | \ sed -r \ -e 's/^\s*CC\s*/ /' \ -e 's/\.o/\.c/' | \ tr -d '\n' | \ tr -d '\r' \)echo${SOURCE_LIST}get_includes "${SOURCE_LIST}"FILE_LIST=$(echo"${FILE_LIST}" | sed -r -e 's/\s/\r\n/g' )echo"${FILE_LIST}" > ${FILE_OUT}#sed -i 's///\\/g' ${FILE_OUT}#替换行首为windows路径sed -i "s#^#${ABS_PATH}#g"${FILE_OUT}#替换linux路径符'/'为windows路径符'\'sed -i "s#/#\\\#g"${FILE_OUT}给脚本增加执行权限并解析 build log,输出文件列表到 files_list.txt 中。
chmod +x sg.sh./sg.sh build_log.txt files_list.txt打开 source insight 4 并创建工程,之后依次点击 Progect → Add and Remove Project Files... → Add from list... → files_list.txt → 打开,即可将编译过程中涉及到的文件都导入 source insight 了。
再点击 Synchronize Files... 去建立 symbol 映射关系,之后便可以愉快阅读了。