yasm以x86_64 mach-o格式写入PAGEZERO

时间:2016-11-08 22:18:29

标签: macos linker ld mach-o yasm

我遵循使用yasm汇编程序和ld链接程序的汇编集。我在OSX 10.12上,我正在尝试组装到Mach-O格式。不幸的是,我收到了分段错误。这是原始的.asm文件:

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中运行它,我收到此错误:

  
      
  • 线程#1:tid = 0xb3b4b,0x0000000000000001,停止原因= EXC_BAD_ACCESS(代码= 1,地址= 0x1)   帧#0:0x0000000000000001   错误:从__PAGEZERO
  • 部分读取数据时出错   

在lldb中,我运行了目标模块转储部分',我发现它的__PAGEZERO段定义如下:

  

[0x0000000000000000-0x0000000000001000] ---记忆.__ PAGEZERO

我查看了使用clang构建的普通Mach-O二进制文件,__PAGEZERO段看起来像这样:

  

[0x0000000000000000-0x0000000100000000] --- test .__ PAGEZERO

然后我注意到它实际上是创建PAGEZERO段的链接器。我相信clang使用了一个名为“lld”的特殊链接器。我的问题是:

  1. 我的错误实际上是由于从PAGEZERO读取而造成的。
  2. 如果是这样,我可以告诉我的链接器(ld)以正确的大小定义PAGEZERO吗?

1 个答案:

答案 0 :(得分:1)

已解决:我将链接命令更改为:

  

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

这不会改变PAGEZERO尺寸,因此我不确定它是如何修复的,但现在可以正常工作。