GCC源代碼閱讀

獲取GCC源代碼

閱讀源代碼的第一步是獲取源代碼,巧婦難為無米之炊嘛!

使用以下任意方法均可獲得gcc源代碼:

  1. svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir (摘自http://gcc.gnu.org/svn.html)
  2. git clone git://gcc.gnu.org/git/gcc.git(摘自http://gcc.gnu.org/git/?p=gcc.git;a=summary)

需要注意的是,第二種方法得到的代碼并非是svn的所有歷史鏡像。因為gcc的svn分支不是全部位于svn://gcc.gnu.org/svn/gcc/branches/這一層,其中如redhat或者google等實際起到名字空間的作用,再下一層才是真正的分支內容,然而svn到git轉換的腳本不能識別這種情況,因此所有這類位于第二層的分支都不存在于git鏡像中。

當然對于初學者來說并不重要,我們只要盯住一個版本看就好了,比如4.5.2或者4.4.5(原本想等4.6發布之后再開始這個學習系列,目前看來一半時是等不到了)。由于我之前在4.4.5上有一點積累,因此如沒有特別說明,這一系列的心得都是通過閱讀4.4.5的代碼而來。

使用源代碼交叉索引工具

拿到源代碼之后,建議使用代碼交叉索引工具生成索引,方便閱讀。常用的有etags(或者ctags)和cscope。

etags

gcc的Makefile里有生成TAGS文件的target,可以直接在編譯目錄下生成,如

$ mkdir build
$ cd build
$ ../gcc/configure --enable-languages=c,c++,lto
$ make
$ make -k etags # OR `make -k tags'

在Emacs里加載TAGS文件的方法是:M-x visit-tags-table

cscope

cscope的配置也不復雜,以下是在Ubuntu 10.10下安裝配置步驟

$ sudo apt-get install cscope cscope-el
$ cd gcc
$ gcc-cscope.sh

gcc-cscope.sh腳本內容如下

#!/bin/bashBUILD_DIR=${1:-../build/gcc}
cscope-files.sh libiberty gcc include gcc/config/arm $BUILD_DIR >cscope.files
if [ -f cscope.files ]
thencscope -b -q -k
elseecho "cscope.files not found at $PWD."exit 1
fi

由于gcc的部分代碼是在編譯期生成的,所以除了索引源代碼目錄下的文件,還要索引編譯目錄下的文件(對應于BUILD_DIR這個變量所制訂的目錄,缺省為build/gcc,也可以通過參數使用其它目錄)。

由于gcc支持多種硬件平臺,為避免混淆,我只選擇了自己關心的ARM部分代碼,其它后端代碼忽略。

cscope-files.sh腳本內容如下:

#!/bin/bashfor dir in "$@"
dofind "$dir" -maxdepth 1 -iname "*.[hc]" -type f
done

要想在Emacs里面使用cscope索引結果,需要安裝cscope-el軟件包,并把下面一行代碼加入Emacs配置文件

(require 'xcscope)

具體使用方法可以參見/usr/share/emacs/site-lisp/xcscope.el文件內的注釋。

下載gcc源代碼,編譯通過,測試hello world之后,就可以開始認真閱讀它的實現了。

通常我們閱讀的源代碼,是開發過程中某一時刻的快照,在特定情況下,我們不僅需要理解它的當前實現方式,還要了解它的發展過程和原因。這時,我們可以借助版本管理工具、ChangeLog文件和郵件列表,來了解開發歷史。

取決于獲取源代碼的方式,可以使用的版本管理工具有subversion和git,熟練使用命令行工具或者圖形化客戶端是必須的,如果能和開發環境無縫結合就更完美了。Emacs默認的VC軟件包支持多種版本管理工具,包括subversion和git。VC的操作對象是文件,如果想要了解整個項目的情況,可以安裝psvn和magit。

ChangeLog是個很有趣的東西,我一度對它的作用不太理解。有了版本控制工具,還要ChangeLog做啥?!而且ChangeLog的內容也很枯燥,它只記錄了源代碼的物理變化,比如增加了一個變量,并在哪個函數里使用;刪除一個宏;或者改變函數調用關系等等。它并不記錄做出這些改變的目的或原因。后來經jzhang918介紹,終于明白它對于版本管理工具的補充作用。通常,版本工具的操作對象是文件,因此,如果想知道某個函數(或者某個變量)發生了哪些變化,則相當棘手,ChangeLog的作用便在于此。

僅有歷史版本和ChangeLog還是不夠的,它們缺少了一項非常重要的信息——為什么要做這樣的修改。一般來說,最好能在提交日志上說明,但很少有gcc的開發者這么做,所以,就要靠郵件列表來幫忙了。通常來講,在提交修改之前,都需要把patch發到gcc開發者所用的郵件列表上,供maintainer檢查,通過后才能提交。在郵件里,作者會講一點來龍去脈,不然maintainer一頭霧水,patch就無法通過了。

學習GCC源代碼,離不開各種參考資料,如論文、wiki、手冊和散落在郵件列表里面的討論。

如果沒有理論背景知識,想從GCC源代碼里看出它想要做什么,以及在做什么,是很困難的。因此,學習GCC實現的過程,必然伴隨著不斷地閱讀論文。如果注釋里面提到了參考論文(或書籍)的名字,不妨直接找來看看。另外一個非常重要的內容就是gcc summit,論文下載地址為http://gcc.gnu.org/wiki#GCC_Summit_Proceedings,包括從2003年至今的所有論文。

gcc summit的論文不涉及太多的細節,所以看起來不像其它論文那么頭疼,但是要學習具體的算法和實現,還是要找來相應的論文,啃硬骨頭。論文看多了,如何管理也是個問題,不然看了等于白看,一會兒就還給作者了。嘗試了兩個網站CiteULike和Connotea,都不理想,似乎更像是社會化書簽服務,對于我一地的PDF毫無幫助。最后還是用orgmode記錄,以后再把RefTex集成進來。

要了解GCC的實現細節,還要看手冊,Ubuntu下的安裝方式如下:

sudo apt-get install gcc-doc

其中包括兩個手冊——使用手冊和內部實現手冊,查看方式分別為:

info gcc
info gccint

手冊不適合從頭到尾看下來,需要的時候查找相應內容學習就可以了,最多粗讀一遍獲得大概的印象,依我的經驗,基本就是看了后面忘了前面,反而是遇到問題再來查找更有針對性、更容易理解。由于gccint始終處于不完整狀態,所以也不要期望太多,看代碼是必不可少了。

手冊的在線地址為http://gcc.gnu.org/onlinedocs/。

最后的信息源就是gcc wiki和郵件列表了,由于時效性的問題,上面的內容是否還適用,需要個人自行判斷。郵件列表有多個,我個人關注的是gcc和gcc-patches,


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454069.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nginx 動靜分離

頁面動靜分離 后端 調用tomcat 集群 示例: server { listen 80; server_name www.www2.com ; root /web/www2/htmlloation /img/ {alias /web/www2/html/img/;}location ~ (\.jsp)|(\.do)$ {proxy_pass http:## //serverip:port;proxy_redirect off;// 重定向 指…

Linux 狀態命令之內存狀態 vmstat

語法 vmstat 常見命令格式如下: vmstat [-a] [-n] [-S unit] [delay [ count]] vmstat [-s] [-n] [-S unit] vmstat [-m] [-n] [delay [ count]] vmstat [-d] [-n] [delay [ count]] vmstat [-p disk partition] [-n] [delay [ count]] vmstat [-f] vmstat [-V]命…

使用OpenSSL實現CA證書的搭建過程

個人博客地址:http://www.pojun.tech/ 歡迎訪問 什么是CA CA,Catificate Authority,通俗的理解就是一種認證機制。它的作用就是提供證書(也就是服務端證書,由域名,公司信息,序列號,簽名信息等等組成&#…

最近公共祖先 python_求二叉搜索樹的最近公共祖先

給定一個二叉搜索樹, 找到該樹中兩個指定節點的最近公共祖先。百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節點也可以是它自己的祖先)。”…

gdb使用實例

第一篇 概論我們將學習使用gdb來調試通過一個通過串行線同PC相連的嵌入式系統。Gdb可以調試各種程序,包括C、C、JAVA、PASCAL、FORAN和一些其它的語言。包括GNU所支持的所有微處理器的匯編語言。在gdb的所有可圈可點的特性中,有一點值得注意,…

Linux 監控命令之 netstat

netstat命令用于顯示與IP、TCP、UDP和ICMP協議相關的統計數據,一般用于檢驗本機各端口的網絡連接情況。netstat是在內核中訪問網絡及相關信息的程序,它能提供TCP連接,TCP和UDP監聽,進程內存管理的相關報告。 語法 netstat [-acC…

C#遞歸搜索指定目錄下的文件或目錄

來源:https://www.cnblogs.com/huhangfei/p/5012978.html誠然可以使用現成的Directory類下的GetFiles、GetDirectories、GetFileSystemEntries這幾個方法實現同樣的功能,但請相信我不是蛋疼,原因是這幾個方法在遇上【System Volume Informati…

solr 配置

創建 SolrHome(solrCore) 1.解壓 solr-4.10.4.tgz 到 /usr/local/solr 2.將 solr-4.10.4/example/solr 下所有文件拷貝到 /usr/local/solrhome (此 solrhome 為自己創建的) solrhome 是 solr 運行主目錄,可包含多個 SolrCore 目錄SolrCore 目錄中包含運行 Solr 實例…

mfc程序轉化為qt_10年程序員:我都學過這些語言,2019年開始我再也不是程序員......

為什么學編程2008年,高中畢業的我問一個已經工作兩年的親戚:什么專業工資高?他告訴我:程序員。2008年成都最低工資好像是800元,我的生活費也是800元,據他所說程序員出來的工資是2000,于是開始了…

day 7 引用

1.ba在c語言和python中的區別 c語言:a100 a變量里面放的100 b a b變量里面也放的100 python : a100 內存中有個100 a放的100的內存地址 b a b也放的100的內存地址 相當于給100那一塊內存,貼個便利簽 2.type查看數據類型&…

Dapper逆天入門~強類型,動態類型,多映射,多返回值,增刪改查+存儲過程+事物案例演示...

Dapper的牛逼就不扯蛋了,答應群友做個入門Demo的,現有園友需要,那么公開分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 項:http://www.cnblogs.com/dunitian/p/5221058.html 平臺之大勢何人…

Linux 狀態命令之磁盤狀態 iostat

Linux系統中的iostat是I/O statistics(輸入/輸出統計)的縮寫,iostat工具將對系統的磁盤操作活動進行監視。它的特點是匯報磁盤活動統計情況,同時也會匯報出CPU使用情況。同vmstat一樣,iostat也有一個弱點,就…

GDB十分鐘教程

GDB十分鐘教程 作者: liigo 原文鏈接: http://blog.csdn.net/liigo/archive/2006/01/17/582231.aspx 日期: 2006年1月16日 本文寫給主要工作在Windows操作系統下而又需要開發一些跨平臺軟件的程序員朋友,以及程序愛好者。 GDB是一個由GNU開源組織發布的、UNIX/LI…

課后作業-閱讀任務-閱讀提問-3

1.如果兩個人合作的始終達不到規范階段該怎如何處理? 2. 邏輯和界面設計要注意哪些因素?轉載于:https://www.cnblogs.com/fhycm/p/7866548.html

ride上點擊用例不能顯示edit信息_接口測試平臺代碼實現61: 多接口用例1

終于又序更上了,原諒最近作者幾天事情不斷。按照我們之前的計劃,需要迅速開啟很重要的核心多用例接口。首先,我們要確定,這個功能的大體設計。就放在在我們的頁面 用例庫 中:所以也就是我們很久之前就創建好的P_cases.…

黑客攻防專題八:21種RING的提權方法

好多都沒有成功,還是發來看看,看看思路,呵呵 以下全部是本人提權時候的總結 很多方法至今沒有機會試驗也沒有成功,但是我是的確看見別人成功過的。本人不才,除了第一種方法自己研究的,其他的都是別人的經驗…

Linux 狀態命令之內存狀態 free

簡介 free指令會顯示內存的使用情況&#xff0c;包括實體內存&#xff0c;虛擬的交換文件內存&#xff0c;共享內存區段&#xff0c;以及系統核心使用的緩沖區等。 語法 free [-bkmotV][-s <間隔秒數>]參數說明&#xff1a;-b  以Byte為單位顯示內存使用情況。-k  以…

SpringMVC在使用Jackson2時關于日期類型格式化的問題

*本例程序使用Jackson2.9.0&#xff0c;jackson1.x的處理方式稍稍有些不同。 在基于Spring&SpringMVC的Web項目中&#xff0c;我們常使用Jackson(1.x/2.x)來增加程序對Json格式的數據的支持。 因此&#xff0c;在實際應用中有個常見的需求&#xff1a;日期的格式化。 假設&…

GDB 使用——Linux C編程

簡述 一 列文件清單 二&#xff1a;執行程序 三&#xff1a;顯示數據 四&#xff1a;斷點(breakpoint) 五&#xff0e;斷點的管理 六&#xff0e;變量的檢查和賦值 七. 單步執行 八&#xff0e;函數的調用 九&#xff0e;機器語言工具 …

python撥號_python 撥號代碼(win10 系統親測有效)

# -*- coding: utf-8 -*-import win32rasimport time,osdef Connect(dialname, account, passwd):dial_params (dialname, , , account, passwd, )return win32ras.Dial(None, None, dial_params, None)def DialBroadband():dialname u寬帶連接 #just a nameaccount u059291…