相信大家在學習c語言的時候都是從經典的示例程式 hello world!開始的,相信大家都能隨手寫出乙個這樣的程式來。這樣的程式都滾瓜爛熟了。下面給出**:
/*************hello.c***************/
#include
int mian(int argc ,char ** argv)
printf("hello world!\r\n");
return 0;
**寫好後,很自然的大家就開始對**進行編譯了:
在linux 是這樣的:
gcc hello.c
./a.out
螢幕輸出一行 hello world!
windows 下是這樣的:
建立乙個vc專案工程,然後直接編譯,直接點執行,彈出乙個dos執行介面,輸出一行hello world!
一切都是那麼的自然,我們也重來沒有懷疑過這些操作步驟,按照這個步驟做下去一般程式都能執行成功,就這樣我們就可以進行程式開發了。
忽然有一天,我們開始思考:
1、程式為什麼要通過編譯才能執行呢?
2、編譯器對我們的**做了什麼呢?
3、編譯我們的**後生成的檔案內容又是什麼呢?
4、程式是怎麼執行起來的呢?
5、hello world 為什麼能輸出呢?
6、如果沒有作業系統,我們的程式還能執行嗎?
這些謎團伴隨著我....讓我一步步進入了c/c++語言的深入學習。
●目標檔案裡有什麼
目標檔案的格式與作業系統有著直接的聯絡,但是大都是基於coff標準的變種。目標檔案中除了有可供計算機cpu直接識別執行的機器碼之外,還包括了連線時所需要的一些其它資訊。一般以節(section)或段(segmation)的形式儲存,在一般情況下,目標檔案都存在以下結構:
1 檔案頭
2 段表
3 符號表
4 除錯資訊
在不同作業系統中有不同的目標檔案格式標準,在windows下為pe檔案格式,在linux下為elf檔案格式,在unix下為a.out檔案格式。
在linux系統中分析elf檔案格式有很多命令,主要有objdump,binutils,readelf,size等。
下面以linux elf標準進行分析
一elf檔案頭
elf檔案頭在檔案中主要儲存了乙個結構體,其結構體成員主要有以下幾個變數:
e_ident[16] 魔數;
e_type elf檔案型別
e_machine elf檔案cpu平台
e_version elf檔案版本
e_entry 入口位址
e_phoff
e_shoff 段表檔案中的偏移
e_word elf標誌位,用來標誌一些平台相關的東西
e_ehsize elf檔案大小
e_phentsize
e_phnum
e_shentsize 段描述符大小
e_shnum 段描述符數量
e_shstrndx 段表字串在段表中的下標
C語言深入學習一
之前學過c語言不過比較淺顯,好多功能都不知道為什麼是這麼得到的,機緣巧合之下,找到了關於c語言深入學習的資源。很是開心。今天就分享給大家。希望大家能有所收穫。c語言中的資料型別 主要分為整形,浮點型,字元型。其對應為int等,float等,char等。typedef 是給某種功能另外叫乙個名字。可以...
C語言深入學習之指標
一 指標是什麼?c語言裡,變數都是存放在記憶體裡,而記憶體其實就是一組有序位元組組成的陣列,每個位元組都有唯一的記憶體位址。cpu 通過記憶體定址對儲存在記憶體中的某個指定資料物件的位址進行定位。這裡,資料物件是指儲存在記憶體中的乙個指定資料型別的數值或字串,它們都有乙個自己的位址,而指標便是儲存這...
C語言 陣列的深入學習
深入學習一下陣列 單元是依次相連線的。而且這多個變數必須單獨訪問,不可以一起訪問的。因為他們的位址彼此相連,所以使用指標 訪問這些變數就很容易了。這個位址在編譯器中決定具體數值,具體數值和變數名繫結,變數型別決定了這個位址的延續長度。3 陣列中幾個關鍵符號 a a 0 a a 0 的理解 1 a就是...