2016-11-08 36 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检查两个输出二进制文件,看看里面究竟发生了什么。 –