relocatable檔案,即可重定向檔案,這個檔案是由編譯器彙編源檔案(.c/.s)而成的。直接生成的重定向檔案叫object file,經過封裝的重定向檔案稱為library file。relocatable檔案是一個中間的過渡檔案,其本身也不能被ARM直接執行,需經過第二步轉換,即連結,是以這兩個檔案都是連結器的輸入檔案。
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家講的是嵌入式開發裡的relocatable檔案(object, library)。
前三節課裡,痞子衡都是在給大家介紹嵌入式開發中的input檔案。從今天這節課開始,痞子衡就陸續為大家講output檔案。上一節課工程檔案(.ewp)裡講說到project檔案是一個承前啟後的檔案,今天痞子衡就為大家講project生成的第一類output檔案:relocatable檔案。
檔案關系:源檔案(.c/.h/.s) + 工程檔案(.ewp) -> 可重定向檔案(.o/.a)
relocatable檔案,即可重定向檔案,這個檔案是由編譯器彙編源檔案(.c/.s)而成的。直接生成的重定向檔案叫object file,經過封裝的重定向檔案稱為library file。可重定向檔案屬于ELF檔案的分支,關于ELF檔案的詳細解釋可見第六節課可執行檔案(.out/.elf)。
本文主角object file和library file,僅是一個中間的過渡檔案,其本身也不能被ARM直接執行,需經過第二步轉換,即連結,是以這兩個檔案都是連結器的輸入檔案。讓我們來簡單分析一下這兩個檔案。在開始分析之前我們先回到上一節課工程檔案(.ewp)的最後建立的demo工程上,編譯這個demo工程可以得到如下.o檔案,這些檔案全是object檔案,每一個源檔案都對應一個object檔案,本文以task.o為例講解relocatable檔案。
task.o檔案大小有11683bytes,而從源檔案裡看其僅包含4個變量和3個函數,可見更多的資料是記錄性資料。
分析file header可知task.o是REL類型ELF檔案,其一共含有85個section header,沒有program header。
分析section header可知該task.o裡的各個常見section(.bss, .noinit, .data, .text, .textrw)的大小,各個段的含義詳見第二節課連結檔案(.icf)。
分析symbol list可知我們在task.c裡定義的函數和全局變量的資訊,其中Value表明的是各symbol對象(函數/全局變量)在存儲器中的配置設定位址,由于object檔案并沒有經過連結,是以此處位址資訊是無效的(待配置設定的)。翻看到第六節課可執行檔案(.out/.elf)裡2.2.4一節,便可看到這些symbol對象Value的值開始變得真實有效了。這就解釋了為什麼object檔案是relocatable的。
本質上library檔案跟object檔案是一樣的,都是未經連結器連結的檔案。library檔案的應用場景是,在一些特殊場合,你不想把你的C源代碼開放給别人閱讀和自由修改,但是你又需要分享你的代碼給别人使用,怎麼解決這個問題?library檔案就是解決這個問題的,可以借助編譯器的選項(IAR下是Options->General Options->Output->Output file裡選擇Library(預設是executable)),那麼添加進整個工程的所有源檔案會被彙編封裝成一個.a檔案(即library檔案),這時候你隻需要将該.a檔案以及配套API頭檔案分享給别人即可。别人隻需要添加你的.a檔案以及配套.h檔案進他自己的工程,便可直接調用你的API。
至此,嵌入式開發裡的relocatable檔案(object, library)檔案痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。