可執行檔案格式詳述,ABI和loader

2021-08-29 04:32:54 字數 1523 閱讀 8206

上回書說到可執行檔案的格式,這一節詳細描述一下。

可執行檔案是由頭和體組成的。這跟別的複雜一點的檔案一樣。它的體分成一些叫做節(section)的東西,這是它的特色。另外比較有特色的東西是:我們一般把可執行檔案叫做程式的影像(image)。唔,這個叫法也不賴。可執行檔案的價值在於執行,執行的程式也就是活著的程式叫做程式的影像。呵呵,這個概念打通了檔案和程序的通道,以前說過的loader。一般情況下,可執行檔案放在永久性的儲存裝置上,程序放在速度較快的主存上——一般是半導體儲存裝置,易失性的。loader幹的主要的活之一就是把可執行檔案從速度較慢的喲耐久性儲存裝置轉移到速度較快的主存上。這個轉移有什麼難處呢?有一定的難點。最主要的就是:由於程式被轉移(又叫做裝載)到主存的以後,這個程式就要執行了,照常理想來,乙個程式要施展其手腳,總得先準備出場地。是的,要準備其場地的。可以想象的到,其中最主要的是要操作的資料。但是別忘了,資料難道不包括在可執行檔案影像裡面?確實,有一種資料不包括在裡面。就是那種沒有初始值的資料。沒有初始值的資料,包括在image裡面也是沒有價值的,是吧。所以,需要在主存中開闢這麼一塊地方,用來存放這種資料。是不是這就完了?不是,參見我寫的關於物件生命週期和記憶體模型的概念就知道,我們還要準備好棧空間,以供程式執行的時候使用,準備好堆空間,以供程式執行的時候使用。是不是就完了?不是,還不是,還有別的。

有乙個叫做重定位的概念需要在這兒引入。程式中需要運算元據,這個大家都知道,但是怎麼用來指定那個資料呢?比如:程式中說,要把a和b相加的和賦值給c,怎麼表達呢?用a b c物件的名字來表達?不是。呵呵,用的是a b c物件的位址。位址!這是乙個關鍵的概念。好,我們現在看看會導致什麼問題。c = a + b會演化成,load data from address of a,load data from address of b,add these data,store the result to address of c。我們不關心別的,就關注:address of ,它們怎麼來的,我們在程式中可沒有給它們位址啊。呵呵,肯定是中間某個環節給出來的了。我們看看有可能是那個環節。compiler?嗯,很有可能,compiler給出各個物件乙個唯一的位址。linker,對,linker給它們分配位址也很正常。那loader呢?loader給出位址也很合理。其實,這些環節都曾經給出了這些物件的位址。是的,都給出過。這裡面會涉及到乙個相對位址和絕對位址的問題。絕對位址就是指在執行環境中給準備的位址空間中指定其一。比如:執行環境給準備了4g的位址空間,你說你的某個物件使用3038m139k那個地方的空間。這就是絕對位址。絕對位址不好。原因很簡單。你得自己保證物件的位址不衝突,而且,強迫你依賴於執行環境。那麼相對位址呢?嗯,它在linker的運作下基本上是乙個基本要求。 compiler生成相對位址,linker把它們(模組們)聯合起來,放入同乙個位址空間中,loader把image裝入主存時,很有可能重新定位 image中各個物件的位址。

好的。重定位解釋完了。是不是loader的活也幹完了呢?哦,no,還有點。這牽扯到外部物件引用的問題。想一想,對聯結器面對的各個模組來說,別的模組中的物件也算是外部物件。所以,外部物件的引用問題也不是很難,當然,也不很簡單。

好了,說了這些東西以後,我們的可執行檔案究竟以什麼格式存在呢?且看……

可執行檔案格式

測試平台 在windows下使用gcc編譯c檔案。gcc的幾個用法 每一步單獨處理 gcc e main.c o main.i 將main.c預處理 gcc s main.i o main.s 將預處理的main.i檔案轉換成彙編檔案main.s gcc c main.s o main.o 將彙編檔...

可執行檔案格式elf和bin

常用的可執行檔案包含兩類 原始二進位制檔案 bin 和可載入執行的二進位制檔案,在linux中可載入執行的二進位制檔案為elf檔案。在linux os上,為了執行可執行檔案,他們是遵循elf格式的,通常gcc o test test.c,生成的test檔案就是elf格式的。執行elf檔案時核心會使用...

可執行檔案格式elf和bin

常用的可執行檔案包含兩類 原始二進位制檔案 bin 和可載入執行的二進位制檔案,在linux中可載入執行的二進位制檔案為elf檔案。在linux os上,為了執行可執行檔案,他們是遵循elf格式的,通常gcc o test test.c,生成的test檔案就是elf格式的。執行elf檔案時核心會使用...