SourceInsight 精确导入Linux kernel源码的方法
相信有很多人用 SourceInsight 查看 Linux Kernel 源码,但导入源码时会遇到一些问题。
1、如果把整个源码树都导入进去,查看符号定义的时候,会发现有大量重复定义,很难找到正确的位置
2、如果手动导入只和该硬件平台相关的源码,工作量太大
本帖提供了一个方法,可用脚本生成只和该硬件平台相关的源码的文件列表,然后通过该文件列表,将相应文件导入 SourceInsight 。
以下是步骤,共4步:
1、新建 SourceInsight 项目
先不要导入文件,停在如下界面:
2、完整编译内核,将编译时输出的信息保存到一个文件中
例如:
- make ARCH=arm > build_log.txt
build_log.txt 文件中内容大致如下:
- CC init/main.o
- CHK include/generated/compile.h
- CC init/do_mounts.o
- HOSTCC usr/gen_init_cpio
- CC arch/arm/vfp/vfpmodule.o
- CC arch/arm/kernel/elf.o
- AS arch/arm/kernel/entry-armv.o
- AS arch/arm/vfp/entry.o
- AS arch/arm/kernel/entry-common.o
- CC arch/arm/kernel/irq.o
- AS arch/arm/vfp/vfphw.o
- GEN usr/initramfs_data.cpio
- CC arch/arm/kernel/opcodes.o
3、生成文件列表
下载 帖子 最后面的附件,解压后是 linux shell 脚本。
编辑脚本两个变量,ARCH 和 MACH,MACH是平台的名字。如果你用的平台对应 arch/arm/mach-at91 的话,就改成 MACH=at91,以此类推。
在内核源码目录下执行:
- ./sg.sh build_log.txt file_list.txt
复制代码
这样,SourceInsight 需要的 文件列表 file_list.txt 就生成了。里面的内容大致如下:
4、导入文件列表
回到 SourceInsight,点击窗口右下角 help 按钮上方的 “add from list” 按钮导入生成的 file_list.txt 文件。
到此为止,文件导入完成了。重新打开工程,会提示同步、构建,之后就可以正常的查看源码了。
这样导入的文件和硬件平台是完全对应的。
下面是本帖的核心,就是这个脚本,有兴趣的可以看看:
- #!/bin/sh
- ARCH=arm
- MACH=at91
- FILE_IN=$1
- FILE_OUT=$2
- # .c
- SOURCE_LIST=""
- # generated file list
- FILE_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 includes
- local file
- for file in $1
- do
- if [ ! -e ${file} ]; then
- continue
- fi
- if echo "${FILE_LIST}" | grep -E ${file} > /dev/null; then
- continue
- fi
- 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}"
- fi
- echo ">${NEST_DTPTH}) : ${file}"
- NEST_DTPTH=$((NEST_DTPTH-1))
- done
- }
- # get *.c from kernel build log
- SOURCE_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}
SourceInsight 精确导入Linux kernel源码的方法的更多相关文章
- Linux内核源码分析方法_转
Linux内核源码分析方法 转自:http://www.cnblogs.com/fanzhidongyzby/archive/2013/03/20/2970624.html 一.内核源码之我见 Lin ...
- Linux内核源码分析方法
一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...
- 【转】Linux内核源码分析方法
一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...
- linux kernel 源码安装
有时我们在安装系统后,发现没有安装当前系统的内核源码在/usr/src/kernels目录下,其实我们是少安装了一个rpm包: 当你配置好yum源后: yum install kernel-devel ...
- CentOS 安装 linux kernel 源码
原文链接:https://blog.csdn.net/qaz1qaz1qaz2/article/details/52825389 1.下载系统包yum install rpm-buildyum ins ...
- Linux Kernel源码浏览
https://www.kernel.org/http://lxr.linux.no/
- centos的linux内核源码下载方法
http://vault.centos.org/ http://blog.csdn.net/xiongzhizhu/article/details/51816243
- git获取内核源码的方法
[转]http://www.360doc.com/content/17/0410/16/23107068_644444795.shtml 1. 前言 本文主要讲述ubuntu下通过git下载linux ...
- linux内核源码注解
轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件 ...
随机推荐
- 常用Maven插件介绍
我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...
- php字符串中单引号''和双引号“”的区别
(1)双引号可以解析字符串中的变量,单引号不能 $a = 10; $str = "this a var $a"; //输出this a var 10 (2)在双引号中可以使用转义字 ...
- Objective C类方法load和initialize的区别
Objective C类方法load和initialize的区别 过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method).它们的特别之处,在于 ...
- 团队开发——冲刺1.f
冲刺阶段一(第六天) 1.昨天做了什么? 为解决自己电脑的问题,查找关于C#的资料,后期做准备. 2.今天准备做什么? 把最初版与交予代码书写的同学,进行整合:测试程序. 3.遇到什么困难? 第一次整 ...
- ireport开发报表,Java和JSP端如何集成
Java端: @RequestMapping("/report") public String report() { return "/credit/report/rep ...
- Smart210学习记录-----SD/MMC/SDIO驱动
转自:http://jingpin.jikexueyuan.com/article/23369.html http://blog.csdn.net/evilcode/article/details/7 ...
- WebDriver定位元素方法
如果把页面上的元素看作人的话,在现实世界如何找到某人呢?方法有三: 一.通过人本身的属性,例如他的姓名,手机号,身份证号,性别,这些可区别他人的属性.在web页面上的元素也有这些属性,例如,id.na ...
- java进程性能分析步骤-超越昨天的自己系列(11)
java进程load过高分析步骤: top 查看java进程情况 top -Hp 查看某个进程的具体线程情况 printf 0x%x 确认哪一个线程占用cpu比较多,拿出来转成16进制 ...
- python数据结构与算法——图的最短路径(Dijkstra算法)
# Dijkstra算法——通过边实现松弛 # 指定一个点到其他各顶点的路径——单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, ...
- 或许是 Nginx 上配置 HTTP2 最实在的教程了
导读 从 2015 年 5 月 14 日 HTTP/2 协议正式版的发布到现在已经快有一年了,越来越多的网站部署了 HTTP2,HTTP2 的广泛应用带来了更好的浏览体验,只要是 Modern 浏览器 ...