0

我正在关注一本使用 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 内存.o -o 内存

并在 lldb 中运行它,我收到此错误:

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

在 lldb 中,我运行了“目标模块转储部分”,我看到它的 __PAGEZERO 段定义如下:

[0x0000000000000000-0x0000000000001000) --- 内存.__PAGEZERO

我查看了一个用 clang 构建的普通 Mach-O 二进制文件,__PAGEZERO 段如下所示:

[0x0000000000000000-0x0000000100000000) --- 测试.__PAGEZERO

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

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

1 回答 1

1

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

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

这不会改变 PAGEZERO 的大小,所以我不确定它是如何修复它的,但它现在可以工作了。

于 2016-11-09T16:42:45.507 回答