目標檔案中包含了編譯後的機器指令**、資料和連線時所需的資訊,如符號表、除錯資訊、字串等。一般情況下,目標檔案都將這些資訊按不同的屬性,以節(section)或段(segment)的形式進行儲存。
程式源**編譯後的機器指令經常被放在**段(code section)中,**段的常見名有.code或.text。定義時即被賦值的全域性變數和區域性靜態變數放在資料段(data section)中,如果定義的時候,只有申明,沒有賦初值的,則被放在bss段中。
見圖3-1,elf檔案的開頭是乙個「檔案頭」,它描述了整個檔案的檔案屬性,比如是否可執行、是靜態連線還是動態連線以及入口位址(如果是可執行檔案)、目標硬體、目標作業系統等。檔案頭還包括乙個段表(section table),其實段表是乙個描述各個段資訊的陣列,從段表裡可以得到每個段的所有資訊。檔案段的後面就是個段的資訊。
一般c語言的編譯後執行語句都被編譯成機器**,然後放到.text段,也就是**段中。已初始化的全域性變數和靜態區域性變數都被放置在.data段中。未初始化的全域性變數和靜態區域性變數被放置在bss段中。bss段只是為未初始化的全域性變數和靜態區域性變數預留位置,它並沒有內容,所以他在檔案中並不佔據空間。
總體來說,程式源**被編譯後,要分為兩種:程式指令和程式資料。程式指令包含**段,程式資料報含資料段和bbs段。將程式資料和程式指令分開有很多好處,主要有如下幾個方面:
1、當程式裝載後,資料和指令被對映到兩個虛擬儲存區域;由於資料區域是可讀寫的,而指令區域是唯讀的,所以這兩個虛擬儲存區域的許可權分別被設定成可讀寫和唯讀的,這樣可以防止程式指令被有意或無意的修改。
2、另一方面是由於現代的cpu來說,他們都有著極大的快取體系;由於快取體系在現代計算機體系中佔據著非常重要的作用,所以程式必須提高快取的命中率。指令區和資料區分離,有利於提高程式的區域性性。現代計算機一般都被設計成資料快取和指令快取分離,所以程式的指令和資料被分開存放有利於提高計算機的快取命中率。
3、最重要的原因,就是當時系統中執行著多個改程式的副本時,他們的指令都是一樣的,所以記憶體中必須儲存乙份改程式的指令部分。對於指令這種唯讀的資料來說是這樣,對於其他唯讀的資料來說也是這樣。當然,每個副本程序的資料區域是不一樣的,他們是程序私有的。不要小看指令共享這個概念,他在現代的作業系統裡面佔據了及其重要的作用,特別是有動態連線的系統中,可以節省大量的記憶體。
程式設計師的自我修養 目標檔案
1.檔案頭 描述整個檔案的檔案的檔案屬性,包括檔案是否可執 行 是靜態鏈結還是動態鏈結及入口位址 可執行檔案 目標硬體 目標作業系統等資訊,檔案頭還包括乙個段表。段表其實就是乙個描述檔案中各個段的陣列,描述段在檔案中的偏移位置及段的屬性等。2.text段 編譯後執行語句都編譯成機器 儲存在該段。3....
程式設計師的自我修養 3 目標檔案有什麼》
目標檔案的型別 可重定位檔案,可執行檔案,共享目標檔案,核心轉儲檔案。test 儲存的就是程式的 部分,除了資料段,bss段,堆疊段等一般是存放在 段中。data 儲存的是那些已經初始化了的全域性靜態變數和區域性靜態變數。rodata段存放的是唯讀資料,一般是程式裡面的唯讀變數 如const修飾的變...
程式設計師的自我修養 目標檔案裡有什麼
這一章主要講述目標檔案有哪幾個部分組成以及介紹組成部分。elf格式檔案有檔案頭和各個段組成。2.段 section sections 是在elf檔案裡頭,用以裝載內容資料的最小容器。在elf檔案裡面,每乙個 sections 內都裝載了性質屬性都一樣的內容。例如 1 text section 裡裝載...