我正在关注一本使用 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”的特殊链接器。我的问题是:
- 我的错误实际上是由从 PAGEZERO 读取引起的吗?
- 如果是这样,我可以告诉我的链接器(ld)以正确的大小定义 PAGEZERO 吗?