проблема с nasm / gcc на 64-битной Mac OS X Lion - PullRequest
7 голосов
/ 16 февраля 2012

Я читал эту статью, и в какой-то момент она дает мне эту программу для назм:

; tiny.asm
BITS 32
GLOBAL main
SECTION .text
main:
              mov     eax, 42
              ret

И говорит мне выполнить следующие команды:

$ nasm -f elf tiny.asm
$ gcc -Wall -s tiny.o

Я получил следующую ошибку:

ld: warning: option -s is obsolete and being ignored
ld: warning: ignoring file tiny.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Я рискнул предположить, в чем может быть проблема, и изменил строку BITS следующим образом:

 BITS 64

Но потом, когда язапустить nasm -f elf tiny.asm Я получаю:

tiny.asm:2: error: `64' is not a valid segment size; must be 16 or 32

Как изменить код для работы на моей машине?

Редактировать:

Я воспользовался советом Алекса из комментариев искачал более новую версию.Однако

./nasm-2.09.10/nasm -f elf tiny.asm

жалуется

tiny.asm:2: error: elf32 output format does not support 64-bit code

С другой стороны,

./nasm-2.09.10/nasm -f elf64 tiny.asm
gcc -Wall -s tiny.o

жалуется

ld: warning: ignoring file tiny.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Ответы [ 2 ]

14 голосов
/ 16 февраля 2012

Существуют специфичные для OS X настройки, которые необходимо выполнить, чтобы ваш пример работал: основной метод предваряется символом _ компоновщика OS X:

; tiny.asm
BITS 32
GLOBAL _main
SECTION .text
_main:
    mov     eax, 42
    ret

Во-вторых, вынеобходимо использовать формат файла mach:

nasm -f macho tiny.asm

Теперь вы можете связать его (используя -m32 для обозначения 32-битного объектного файла):

gcc -m32 tiny.o
2 голосов
/ 22 апреля 2014

Кажется, вы все еще используете 32-битную версию.Если вы nasm -hf, он должен перечислить macho64.Если нет, вам нужно будет обновить снова.

Вы можете попробовать в консоли brew update.Если это выполняет обновление, то brew search nasm, где должно появиться nasm.Тогда просто brew install nasm.Это должно установить Nasm на ваш компьютер.Обязательно высматривайте место, где оно было установлено.Шахта была установлена ​​на /usr/local/cellar/nasm/2.11.02/bin/.Затем, набрав nasm -hf, вы получите список доступных форматов, которые вы должны увидеть macho64.

...