目標(biāo)文件有三種形式:
1.可重定位目標(biāo)文件,由編譯器產(chǎn)生
2.可執(zhí)行目標(biāo)文件,二進(jìn)制代碼和數(shù)據(jù),可以直接拷貝到內(nèi)存中執(zhí)行,由鏈接器產(chǎn)生
3.共享目標(biāo)文件,特殊的可重定位目標(biāo)文件,可在運行時進(jìn)行鏈接
根據(jù)目標(biāo)文件形式的不同,對elf的解讀不同

ObjFileFmt.epsi.gif
1.對于可重定位文件,由ELF header和sections組成,各個section在文件中的位置由Section Header Table來指定。
2.可執(zhí)行目標(biāo)文件和共享目標(biāo)文件由segments和ELF header組成,segment由sections組成,方便在運行時成塊的加載如虛擬內(nèi)存空間
可重定位目標(biāo)文件##
編譯器在編譯時會將不同可重定位文件的data和text section進(jìn)行合并,并分配虛擬內(nèi)存地址,同時將重定位section中entry分配實際的地址。如果有使用動態(tài)鏈接庫,那么?
可執(zhí)行目標(biāo)文件##
如果有使用動態(tài)鏈接庫,會在加載數(shù)據(jù)和代碼segment之后讀取interpret segment里的dynamic linker(本身也是so,通常為ld.so),將執(zhí)行轉(zhuǎn)交給dynamic linker,dynamic linker會根據(jù)dynamic節(jié)中的needed entry將依賴so都加載到虛擬地址空間中,并進(jìn)行符號重定向。