ELF(Executable and Linkable Format, 可執行與可連結檔案)是一種為可執行檔案、目标檔案、共享連結庫和記憶體轉儲(core dump)準備的标準檔案格式。
一個ELF檔案由以下三個部分組成:
ELF頭:描述檔案的主要特性:類型、CPU架構、入口位址,現有部分的大小和偏移等;
程式頭表:列舉了所有有效的段(segment)和它們的屬性,程式頭表需要加載器将檔案中的節加載到虛拟記憶體段中;
節頭表:包含對節(section)的描述。
被作業系統加載
通過父程序的execve
不斷執行系統調用
在程式内部,對庫函數的使用會去調用作業系統的系統調用
程序管理:fork、execve、exit等
檔案/裝置管理:open、close、read、write
存儲管理:mmap、brk
退出(exit)
——任何一個複雜的應用程式在作業系統中的執行都是按照上述步驟。
一個.c檔案,經過預處理變成.i檔案,編譯變成.s檔案,彙編變成.o檔案,連結變成.out檔案。
cc1-編譯器
as-彙編器
collect2-收集器(收集構造和析構函數的資訊, 合成call_constructors和call_destructors來調用構造和析構函數)
ld-連結
collect2是ld連結器的一個封裝,gcc通過調用collect2調用ld來完成連結工作。collect2主要實作了兩個額外的功能:生成代碼調用全局靜态對象的構造函數和析構函數;支援Cfront的方式生成模闆代碼。