###### tags: `組合語言` # 組合語言共筆 4 : 系統執行程式流程 & 記憶體架構 ## 程式執行流程 將 c++ 程式編譯為可執行檔 :::success  ::: <br> ### 1. Compiler : - 用途 : 將程式語言編譯為組合語言 ### 2. Assembler : - 用途 : 將組合語言<font color=red>組譯</font>成機器語言 ( **Object File 目的檔** ) ### 3. Linker : - 用途 : 將組譯後的 Object File 與外部庫 ( Library ) 的其他 Object File 連結為一個**可執行檔(exe)** <br> --- ## Object File Object File 是由二進位機器語言所組成的檔案 存放著程式的資訊,且可以被 Linker 與其他 Object File 連結為可執行檔 :::danger  - **Header** : 放置了 Object File 的基本資訊 ( relocation info、長度、順序... ) - **stack** : 儲存區域變數、函數 - **heap** : 用於動態記憶體配置 - **.bss** : 放置沒有 initialize 變數 - **.data** : 放置以 initialize 變數 - **.text** : 放置 程式指令碼 - **.其他** segment : 其他資料 <br> - Symbol Table : 存放函數、變數名稱與對應的記憶體位置 使 Object File 可以進行連結、Debug ::: <br> ## ELF ( Executable and Linkable File ) 當 Linker 將 Object File 連結後會變為 Executable Object File 現在最常使用的是名為 .ELF 的格式 <br> ## Linking Linker 會將 Object File Linking 在一起成為執行檔 ( .elf ) :::info **Linking 步驟** 1. 將 Object File 之間相同類型的 Segment 合為單一 Segment 2. 將相同的 Symbol reference 分配到同樣位置 address ::: <br> ## Loading Loader 會將可執檔載入到記憶體當中 :::info **Loading 步驟** 1. 讀取 Object File 的 Header 了解 segment 大小 2. 創建虛擬的記憶體位置空間 3. 複製 text 和 初始化資料到記憶體 4. 設定變數、函數、引數...到 Stack 5. 初始化 cpu 的 register 6. 跳到執行開頭,執行 main() ::: <br> ## Reference - [深入理解連結之Object file](https://ithelp.ithome.com.tw/articles/10262798) - [連結器-維基百科](https://zh.wikipedia.org/zh-tw/%E9%93%BE%E6%8E%A5%E5%99%A8) - [目的碼-維基百科](https://zh.wikipedia.org/zh-tw/%E7%9B%AE%E6%A0%87%E4%BB%A3%E7%A0%81) - [gcc與Obj檔,動態連結與ELF檔](http://www.study-area.org/cyril/opentools/opentools/x909.html) - [CS:APP Ch7 Linking 學習筆記](https://haogroot.com/2020/06/15/csapp-ch7-linking-note/)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up