本节书摘来自华章出版社《深入分析GCC 》一书中的第1章,第2.1节,作者 王亚刚 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

第2章

GCC源代码分析工具
代码分析是一件烦琐的事情。在分析GCC源代码时,几乎所有的人都会说:“这么多的代码,怎么看?”是的,面对GCC 4.4.0如此庞大的代码量,原始的、徒手的做法显然是不足以应付的。在阅读GCC代码时,通常遇到的典型问题包括:
(1)如何跟踪函数调用;
(2)如何查看一个变量的定义;
(3)如何查看一个函数被哪些函数调用过;
(4)如何分析函数之间的调用关系;
(5)如何理解某个函数的工作过程。
当然,除了理解这些表面的问题,更深层的问题就是GCC到底是如何设计的?GCC这么庞大的代码是如何组织的?GCC在进行源代码编译的过程中都包括哪些主要的处理阶段,每个阶段完成了哪些工作,这些阶段之间又是如何相互联系起来的?
这些问题的回答,都需要对GCC的代码进行详细分析。笔者认为,没有好的工具作为辅助,分析GCC代码几乎是不可能的!本章主要介绍一些作者在分析GCC 4.4.0代码时所使用的一些常用工具,供大家参考。这部分内容仅仅是点到为止,详细内容请参阅其用户文档。
本书介绍的所有代码分析工具均基于Centos Linux系统。
2.1 vim+ctags代码阅读工具
vim是Linux中应用最广泛的编辑器,也是阅读GCC 4.4.0源代码的首选工具。ctags是一种标签工具,可以配合vim编辑器,帮助用户很方便地实现代码中的符号跟踪。
下面简单介绍使用vim + ctags对GCC 4.4.0源代码分析的过程。为了描述方便,全书使用${GCC_SOURCE}来表示GCC 4.4.0代码所在的顶层目录。
(1)使用yum工具安装ctags程序。
[root@localhost ~]# sudo yum install ctags
(2)使用wget工具从GCC源代码的镜像站点下载GCC 4.4.0的源代码文件。

[GCC@localhost ~]$ wget -c http://mirror1.babylon.network/gcc/releases/gcc-4.4.0/gcc-4.4.0.tar.bz2
--2015-05-19 10:06:52--  http://mirror1.babylon.network/gcc/releases/gcc-4.4.0/gcc-4.4.0.tar.bz2
Resolving mirror1.babylon.network... 5.135.162.176, 2001:41d0:8:e5b0::1
Connecting to mirror1.babylon.network|5.135.162.176|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 62708198 (60M) [application/octet-stream]
Saving to: “gcc-4.4.0.tar.bz2”
100%[======================================>] 62,708,198   211K/s   in 4m 51s
2015-05-19 10:11:45 (210 KB/s) - “gcc-4.4.0.tar.bz2” saved [62708198/62708198]

(3)使用tar工具对源代码进行解压。
[GCC@localhost vim-ctags]$ tar xjvf gcc-4.4.0.tar.bz2
(4)进入gcc-4.4.0目录,运行ctags,生成tags文件。

[GCC@localhost vim-ctags]$ cd gcc-4.4.0
[GCC@localhost gcc-4.4.0]$ ctags -R
[GCC@localhost gcc-4.4.0]$ ls -l tags
-rw-rw-r--. 1 GCC GCC 52296910 May 19 10:14 tags

可以看出,生成的tags文件的大小为52?296?910字节,包含的tags信息非常多,有兴趣的读者可以使用文本工具打开该tags文件,查看其中的内容。
(5)使用vim查看GCC 4.4.0源代码。
在查看源代码时,需要先对代码的结构进行大致了解,从合适的入口开始分析。一般来讲,按照程序的执行流程来分析代码的结构及其运行过程是一个不错的选择,因此,笔者选择从${GCC_SOURCE}/gcc/main.c文件入手,使用vim来查看该文件。
这里需要特别说明的是,执行vim命令时的当前工作目录应该和tags文件所在的目录相同,这样才能在vim中使用tags文件。上面执行ctags命令产生的tags文件在${GCC_SOURCE}目录中,因此,运行vim时,当前工作目录应该切换到${GCC_SOURCE}目录中。

[GCC@localhost vim-ctags]$ cd gcc-4.4.0
[GCC@localhost gcc-4.4.0]$ vim gcc/main.c

系统显示如图2-1所示。
显然,在该文件中,读者感兴趣的是main函数中调用的toplev_main函数的实现。此时,只需要将光标移动到toplev_main函数名称上,并按Ctrl+]组合键,此时vim会根据tags中提供的信息,自动打开函数toplev_main所在的文件gcc/toplev.c,并且让光标停留在该函数的开始,如图2-2所示。
在分析了toplev_main函数的实现过程后,如果需要回到main函数处,只需要按Ctrl+O组合键即可。
当然,对于代码中所有的变量声明、类型声明、函数名称等标签,均可以使用上述方法快速查看其定义及实现,避免了分析源代码中繁重的搜索工作,极大地提高了代码阅读和分析的效率。

 


图2-1 使用vim编辑查看文件      图2-2 vim中利用tags跳转到函数实现

《深入分析GCC 》——第2章 GCC源代码分析工具2.1 vim+ctags代码阅读工具相关推荐

  1. 使用Vim+Ctags+Cscope阅读源代码

    2019独角兽企业重金招聘Python工程师标准>>> 因为所有设计思想.内部机制都是 以代码的形式实现,所有的资料也都是为了更好的诠释代码.那么一个好的阅读工具,能 够提高阅读的效 ...

  2. vim cscope php,使用Vim+Ctags+Cscope阅读源代码

    因为所有设计思想.内部机制都是 以代码的形式实现,所有的资料也都是为了更好的诠释代码.那么一个好的阅读工具,能 够提高阅读的效率和效果. • "Cscope"[4]为终端下的代码阅 ...

  3. KVM虚拟机源代码分析

    1,KVM结构及工作原理 1.1  KVM结构 KVM基本结构有两部分组成.一个是KVM Driver ,已经成为Linux 内核的一个模块.负责虚拟机的创建,虚拟内存的分配,虚拟CPU寄存器的读写以 ...

  4. 如何以及为什么使用Spoon分析,生成和转换Java代码

    Spoon是分析,生成和转换Java代码的工具. 在本文中,我们将看到通过使用以编程方式处理代码的技术可以实现什么. 我认为这些技术不是很广为人知或使用,这很遗憾,因为它们可能非常有用. 谁知道,即使 ...

  5. spoon java_如何以及为什么使用Spoon分析,生成和转换Java代码

    spoon java Spoon是分析,生成和转换Java代码的工具. 在本文中,我们将看到通过使用以编程方式处理代码的技术可以实现什么. 我认为这些技术不是很为人所知或使用,这很遗憾,因为它们可能非 ...

  6. 《深入分析GCC 》——第3章 GCC总体结构3.1 GCC的目录结构

    本节书摘来自华章出版社<深入分析GCC >一书中的第3章,第3.1节,作者 王亚刚 ,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第3章 GCC总体结构 G ...

  7. GCC源代码分析(1): GCC中的树

    转自:http://blog.chinaunix.net/uid-13800995-id-67956.html 本文分析GCC4.3.1的源代码.如某位牛人所说,我并不打算做"参考手册&qu ...

  8. 《LINUX3.0内核源代码分析》第一章:内存寻址

    https://blog.csdn.net/ekenlinbing/article/details/7613334 摘要:本章主要介绍了LINUX3.0内存寻址方面的内容,重点对follow_page ...

  9. 《LINUX3.0内核源代码分析》第二章:中断和异常 【转】

    转自:http://blog.chinaunix.net/uid-25845340-id-2982887.html 摘要:第二章主要讲述linux如何处理ARM cortex A9多核处理器的中断.异 ...

最新文章

  1. spring整合mybatis(入门级简单教程4)--扫描mapper类
  2. JavaScript碎片—函数闭包(模拟面向对象)
  3. hadoop-0.21.0 在Windows环境下的部署(1)Cygwin 安装
  4. apt-get erro
  5. 一个十年SAP CRM老司机对产品主数据的理解
  6. Java爬取并下载酷狗音乐
  7. python所有的父类_object代表所有类的父类吗??
  8. 使用Asp.net mvc + Linq + mvc_scaffold_gen_setup.exe 生成一个完整的家庭帐册大管家程序 之一...
  9. linux内核分成如下五个子系统,linux内核主要由5个子系统 Linux内核由哪几个子系统组成?...
  10. android分析之Binder 01
  11. 【Matplotlib:隐藏边框,显示单个网格线,设置刻度间隔,隐藏刻度线】
  12. 【网页期末作业】用HTML+CSS做一个漂亮简单的学校官网
  13. gloox1.0使用Emai格式的账号登录
  14. linux安全-用户行为监控
  15. laravel.log could not be opened 解决方法
  16. NO 00004 iOS实现打砖块游戏 一 素材的制作
  17. 我的世界服务器物品怎么上锁,我的世界怎么给箱子上锁_我的世界箱子上锁指令用法及解锁方法_玩游戏网...
  18. python编程求三角形面积公式_python编程 输入三角形的三条边,计算三角形的面积\...
  19. 添加友情链接获取CF币
  20. 微信号名称乱码什么情况_2020最火微信号,微信号改成什么比较好?

热门文章

  1. UP主排名丨飞瓜数据B站平台充电周榜排行榜2022年1月17日-1月23日
  2. ThreeJS 中体渲染,利用噪声模拟烟,云
  3. 华为Camera Kit,赋予你的APP一双善于发现美的眼睛
  4. 11.相关系数计算与热图绘制
  5. 2019MacBook Pro连结Keyboard K380的问题解决
  6. 飞行机器人专栏(八)-- AGX Xavier 通信、控制及视觉应用开发
  7. 居家办公:Mac借助Windows连接公司内网
  8. 王者荣耀服务器微信和qq,王者荣耀:qq和微信区之间的玩家差距太明显,难怪妹子都玩qq区!...
  9. 秒表清零c语言程序,显示的秒表 C语言程序
  10. 同花顺python_我用 Python 预测了股票价格