2016-11-08 60 views
0

我遵循使用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'的特殊鏈接器。我的問題是:

  1. 我的錯誤實際上是由PAGEZERO讀取引起的。
  2. 如果是這樣,我可以告訴我的鏈接器(ld)以正確的大小定義PAGEZERO嗎?

回答

1

解決:我改變了鏈接命令:

ld memory.o -macosx_version_min 10.12 -lSystem -o memory

這不會改變PAGEZERO大小,所以我不知道它是如何固定的,但它現在的作品。

+0

你可以用MachoView檢查兩個輸出二進制文件,看看裏面究竟發生了什麼。 –