一 GCC的作用和執行機制

2021-08-21 12:37:14 字數 1262 閱讀 8021

gcc是linux下重要的編譯工具,用法這裡就不說了,滿大街都找得到。這裡我重點介紹gcc的運作機制,作為**分析的鋪墊。全篇使用c語言子部件來作分析,因為我對其他語言的編譯沒有研究。

根據編譯原理,語言的編譯分為這麼幾個步驟:詞法分析、語法分析、語義分析、中間語言生成、優化、目標**生成等。然而從編譯器使用的角度來看,要把源**翻譯為可執行檔案要經過編譯和連線兩步,與此對應,乙個完整的編譯系統一定包含編譯器和聯結器兩大功能部件。編譯器要完成編譯原理中提到的那些任務;聯結器要把編譯器生成的**片段拼接成乙個完整的可執行程式。之所以需要聯結器,是因為一般的程式都是多原始檔的,而編譯器一次只編譯乙個原始檔(稱之為翻譯單元translation unit),因此需要聯結器把所有翻譯單元對應的輸出合併成乙個可執行檔案。

如果一切順利,可執行程式就可以正確的生成出來。但是一旦源**存在某些問題,錯誤就會被報告出來。編譯器報告的錯誤一般都是區域性錯誤,它會指明錯誤在哪個檔案第幾行;聯結器報告的錯誤一般都是全域性錯誤,而且絕大多數都是多胳膊少腿的問題,比如函式重定義,無法解決的外部符號等,這些錯誤無法定位到某一行。

gcc就是這裡的編譯器。準確來說,gcc是乙個編譯驅動器,驅動cc1、as和ld三個部件完成編譯、彙編和連線的工作。cc1將c語言原始檔編譯為彙編檔案(.s)。而將彙編**轉換為二進位制指令的工作由as完成,生成大家都很熟悉的物件檔案(.o);生成的這些物件檔案再由ar程式打包成靜態庫(.a),或者由ld程式連線成可執行程式(elf、.so或其他格式)。而ld就是所謂的聯結器。as、ar、ld是屬於另外乙個叫做binutils的軟體包的程式,所以要讓gcc能夠有效運作起來,除了在系統中安裝gcc外,還要安裝binutils才行。

以下是cc1、as、ld各司其責的配合完成乙個編譯過程。

gcc test.c -s -o test.s

as test.s -o test.o

ld test.o -o test

通常所用的「gcc -c」就相當於「gcc -s」 + as,而對於編譯單個原始檔一步到位生成可執行「gcc test.c -o test」相當於上面三個步驟的組合,中間檔案被放置在臨時目錄下。從這一點看來,gcc除去編譯的功能外,更像是個driver,它可以驅動as和ld完成整個的編譯,特別是gcc也接受物件檔案(.o)和靜態庫(.a)作為引數用於生成可執行程式,其實背後就是呼叫的ld,還可以用「-wl,」選項給ld傳遞自定義引數。所以在大多數軟體的makefile裡,你很難找到as和ld的字眼,gcc已經給你包辦了。

gcc源**裡包含的主要就是cc1這部分(還包括一些其他的輔助工具,比如collect2等)。

Mysql 一 mysql執行機制

全面了解mysql的執行機制,從而了解當前系統的瓶頸,找到優化方案。借用一張圖 從上圖可以清晰看出mysql的內部架構,可以清楚的看到mysql是由連線池connection pool,sql介面,解析器,優化器,快取,儲存引擎組成的。connectors 指的是不同語言中與sql的互動 manag...

IOS runtime執行機制詳解(一)

oc執行機制是指,可以執行的時候動態呼叫函式。因為c語言必須在編譯的時候就決定呼叫哪個函式。我們平時寫的oc 它在執行的時候也是轉換成了runtime的方式執行的。任何方法呼叫本質 就是傳送乙個訊息。用runtime傳送訊息,oc底層通過runtime實現 每乙個oc的方法,底層必然有乙個與之對應的...

clearfix的執行機制和進化

話說為什麼要把這個記下來,因為昨天去面試,問了clearfix的原理,當時腦子不清晰,回答得真是想要咬舌自盡。遂,決定,要搞清楚來龍去脈 資料來自網上博主們,1.最初的清除浮動 clear 現在可能還可以在很多老的站點上可以看到這樣的 相當暴力有效的解決浮動的問題。但是這個用法有乙個致命傷,就是每次...