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 память

и запустить его в lldb, я получаю эту ошибку:

  • поток №1: tid = 0xb3b4b, 0x0000000000000001, причина остановки = EXC_BAD_ACCESS (код=1, адрес=0x1) кадр №0: 0x00000000000000001 ошибка: ошибка чтения данных из раздела __PAGEZERO

В lldb я запустил «разделы дампа целевых модулей» и вижу, что его сегмент __PAGEZERO определяется следующим образом:

[0x0000000000000000-0x0000000000001000) --- память.__PAGEZERO

Я посмотрел на обычный бинарный файл Mach-O, созданный с помощью clang, и сегмент __PAGEZERO выглядит так:

[0x0000000000000000-0x0000000100000000) --- тест.__PAGEZERO

Затем я заметил, что именно компоновщик создает сегмент PAGEZERO. Я полагаю, что clang использует специальный компоновщик под названием «lld». Мой вопрос:

  1. Действительно ли моя ошибка вызвана чтением из PAGEZERO.
  2. Если да, могу ли я указать своему компоновщику (ld) определить PAGEZERO в правильном размере?

person Jex_and_Izzy    schedule 08.11.2016    source источник


Ответы (1)


РЕШЕНО: я изменил команду ссылки на:

ld memory.o -macosx_version_min 10.12 -lSystem -o память

Это не меняет размер PAGEZERO, поэтому я не знаю, как это исправить, но теперь это работает.

person Jex_and_Izzy    schedule 09.11.2016
comment
Вы можете проверить оба выходных двоичных файла с помощью MachoView, чтобы увидеть, что именно происходит внутри. - person Kamil.S; 11.03.2017