ELF文件格式是一個開發標準,各種UNIX系統的可執行文件都採用ELF格式,它有三種不同的類型: 可重定位的目標文件 可執行文件 共用庫 現在分析一下上一篇文章中經過彙編之後生成的目標文件max.o和鏈接之後生成的可執行文件max的格式,從而理解彙編、鏈接和載入執行的過程。 一、目標文件 ELF文件 ...
ELF文件格式是一個開發標準,各種UNIX系統的可執行文件都採用ELF格式,它有三種不同的類型:
- 可重定位的目標文件
- 可執行文件
- 共用庫
現在分析一下上一篇文章中經過彙編之後生成的目標文件max.o和鏈接之後生成的可執行文件max的格式,從而理解彙編、鏈接和載入執行的過程。
一、目標文件
ELF文件格式提供了兩種不同的視角,在彙編器和鏈接器看來,ELF文件是由Section Header Table描述的一系列Section的集合,而執行一個ELF文件時,在載入器看來它是由Program Header Table描述的一系列Segment的集合,如下圖所示:
左邊是從彙編器和鏈接器的視角來看這個文件,開頭的ELF Header描述了體繫結構和操作系統等基本信息,並指出Section Header Table和Program Header Table在文件中的什麼位置,Program Header Table在彙編和鏈接過程中沒有用到,所以是可有可無的,Section Header Table中保存了所有Section的描述信息。右邊是從載入器的視角來看這個文件,開頭是ELF Header,Program Header Table中保存了所有Segment的描述信息,Section Header Table在載入過程中沒有用到,所以是可有可無的。註意Section Header Table和Program Header並不一定要位於文件開頭和結尾的,其位置由ELF Header指出。
我們在彙編程式中用.section聲明的Section會成為目標文件中的Section,此外彙編器還會自動添加一些Section(比如符號表)。Segment是指程式運行時載入到記憶體的具有相同屬性的區域,由一個或多個Section組成,比如有兩個Section都要求載入到記憶體後可讀可寫,就屬於同一個Segment。有些Section只對彙編器和鏈接器有意義,在運行時用不到,也不需要載入到記憶體,那麼句不屬於任何Segment。
目標文件需要連接器做進一步處理,所以一定有Section Header Table;可執行文件需要載入運行,所以一定有Program Header Table;而共用庫既要載入運行,又要在載入時做動態鏈接,所以既有Section Header Table又有Program Header Table。
下麵用readelf工具讀出目標文件max.o的ELF Header和Section Header Table,然後我們逐段分析。