Запись yasm в PAGEZERO в формате x86_64 mach-o
Я слежу за сборкой, в которой используются ассемблер 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
Я посмотрел на обычный двоичный файл Mach-O, созданный с помощью clang, и сегмент __PAGEZERO выглядит так:
[0x0000000000000000-0x0000000100000000) --- тест.__PAGEZERO
Затем я заметил, что на самом деле это компоновщик, который создает сегмент PAGEZERO. Я считаю, что Clang использует специальный компоновщик под названием 'lld'. Мой вопрос:
- Моя ошибка на самом деле вызвана чтением из PAGEZERO.
- Если да, могу ли я указать своему компоновщику (ld), чтобы он определил PAGEZERO в правильном размере?
1 ответ
РЕШЕНО: Я изменил команду ссылки на:
ld memory.o -macosx_version_min 10.12 -lSystem -o memory
Это не меняет размер PAGEZERO, поэтому я не уверен, как он это исправил, но теперь это работает.