###### 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
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.