###### 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/)