ld鏈接器筆記
1. 首先編寫一段匯編代碼
這里的匯編語法時 AT&T語法,是gcc原生支持的語法,底層使用 gas(gnu assembler) 完成匯編,相較于 Intel x86語法, AT&T 語法要更加古老,因此大多數人更加偏向于使用 Intel 的語法. nasm 編譯器支持x86語法.自從2.10版本,Intel語法可以通過使用.intel_syntax指令增加支持
.global _start.text
_start:mov $1,%eax # 將立即數1放到eax寄存器中mov $2,%ebx # 將立即數2放到 ebx 寄存器中add %ebx,%eax # 將 ebx 與 eax相加,結果放到 eax 中
loop:jmp loop # 循環
2. 使用 gcc 命令進行編譯
Makefile 文件內容:
main.o: main.sgcc -m32 -c $< -o $@
# -m32 編譯為32位代碼
# -c 執行編譯和匯編,但不執行鏈接
# -o 指定輸出文件名稱
# -E 執行預處理,但不執行編譯,匯編和鏈接
# -S 只執行編譯,但不執行匯編和鏈接
# -shared 創建一個共享庫,格式.so
3. 使用 ld 執行鏈接
main: main.old -m elf_i386 main.o
# -m elf_i386 指定鏈接格式,這里指定為 elf 格式(linux中二進制格式)
# -o 指定輸出文件名稱
# ld 可以指定配置文件 map.lds,按照規格進行配置可以
4. 使用 gdb 執行輸出
gdb main
# 開啟圖形界面
tui enable
# 打開匯編窗口
lay asm
# 打開寄存器窗口
lay reg
# 開始執行程序
starti
# 步進執行程序
si
# 之后可以通過回車執行上一步執行的命令
ld鏈接器筆記
1. 首先編寫一段匯編代碼
這里的匯編語法時 AT&T語法,是gcc原生支持的語法,底層使用 gas(gnu assembler) 完成匯編,相較于 Intel x86語法, AT&T 語法要更加古老,因此大多數人更加偏向于使用 Intel 的語法. nasm 編譯器支持x86語法.自從2.10版本,Intel語法可以通過使用.intel_syntax指令使用
.global _start.text
_start:mov $1,%eax # 將立即數1放到eax寄存器中mov $2,%ebx # 將立即數2放到 ebx 寄存器中add %ebx,%eax # 將 ebx 與 eax相加,結果放到 eax 中
loop:jmp loop # 循環
2. 使用 gcc 命令進行編譯
Makefile 文件內容:
main.o: main.sgcc -m32 -c $< -o $@
# -m32 編譯為32位代碼
# -c 執行編譯和匯編,但不執行鏈接
# -o 指定輸出文件名稱
# -E 執行預處理,但不執行編譯,匯編和鏈接
# -S 只執行編譯,但不執行匯編和鏈接
# -shared 創建一個共享庫,格式.so
3. 使用 ld 執行鏈接
Makefile 文件內容:
main: main.old -m elf_i386 main.o
# -m elf_i386 指定鏈接格式,這里指定為 elf 格式(linux中二進制格式)
# -o 指定輸出文件名稱
# ld 可以指定配置文件 map.lds,按照規格進行配置可以
4. 使用 gdb 執行輸出
gdb main
# 開啟圖形界面
tui enable
# 打開匯編窗口
lay asm
# 打開寄存器窗口
lay reg
# 開始執行程序
starti
# 步進執行程序
si
# 之后可以通過回車執行上一步執行的命令
參考資料
xv6操作系統實踐