我遵循使用yasm彙編器和ld連接器的彙編手冊。我在OSX 10.12上,並且正在嘗試組裝成Mach-O格式。不幸的是,我收到了分段錯誤。這是原始的.asm文件:yasm以x86_64 mach-o格式寫入PAGEZERO
BITS 64
segment .data
a dd 4
segment .bss
g resd 1
segment .text
global start
start:
push rbp
mov rbp, rsp
sub rsp, 16
xor eax, eax
leave
ret
我編譯:
yasm -f macho64 -m amd64 -l memory.lst -o memory.o memory.asm
鏈接它:
ld memory.o -o memory
和LLDB運行它,我收到此錯誤:
- thread #1: tid = 0xb3b4b, 0x0000000000000001, stop reason = EXC_BAD_ACCESS (code=1, address=0x1) frame #0: 0x0000000000000001 error: error reading data from section __PAGEZERO
在lldb中,我運行了'目標模塊轉儲節',而我看到它__PAGEZERO段被定義爲這樣:
[0x0000000000000000-0x0000000000001000) --- memory.__PAGEZERO
我看着鏗鏘建立了一個正常的Mach-O二進制文件,並__PAGEZERO段看起來是這樣的:
[0x0000000000000000-0x0000000100000000) --- test.__PAGEZERO
然後我注意到,它的實際上是創建PAGEZERO段的鏈接器。我相信clang使用了一個叫做'lld'的特殊鏈接器。我的問題是:
- 我的錯誤實際上是由PAGEZERO讀取引起的。
- 如果是這樣,我可以告訴我的鏈接器(ld)以正確的大小定義PAGEZERO嗎?
你可以用MachoView檢查兩個輸出二進制文件,看看裏面究竟發生了什麼。 –