我遵循使用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检查两个输出二进制文件,看看里面究竟发生了什么。 –