我遵循使用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”的特殊链接器。我的问题是:
答案 0 :(得分:1)
已解决:我将链接命令更改为:
ld memory.o -macosx_version_min 10.12 -lSystem -o memory
这不会改变PAGEZERO尺寸,因此我不确定它是如何修复的,但现在可以正常工作。