2016-11-08 15 views
0

Я следую сборке, в которой используется ассемблер yasm и ld-компоновщик. Я на OSX 10.12, и я пытаюсь собрать формат Mach-O. К сожалению, я получаю ошибку сегментации. Это оригинальный .asm файл:yasm пишут PAGEZERO в формате x86_64 mach-o

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, я получаю эту ошибку:

  • thread #1: tid = 0xb3b4b, 0x0000000000000001, stop reason = EXC_BAD_ACCESS (code=1, address=0x1) frame #0: 0x0000000000000001 error: error reading data from section __PAGEZERO

В lldb я запустил разделы целевых модулей сбрасывания, и я видеть, что это __PAGEZERO сегмент определяется как так:

[0x0000000000000000-0x0000000000001000) --- memory.__PAGEZERO

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

[0x0000000000000000-0x0000000100000000) --- test.__PAGEZERO

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

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

ответ

1

РЕШИТЬ: Я изменил команду ссылка:

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

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

+0

Вы можете проверить оба выходных двоичных файла с помощью MachoView, чтобы узнать, что именно происходит внутри. –