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