Как скомпилировать используя nasm на MacOSX

Я пытаюсь скомпилировать и связать мою первую программу на Ассемблере. Я пытаюсь скомпилировать следующий код:

; %include "stud_io.inc"    
global _main     

section .text
_main: 
    xor eax, eax
again:
    ; PRINT "Hello"
    ; PUTCHAR 10
    inc eax     
    cmp eax, 5
    jl again

Под консольной командой для компиляции и компоновки программы:

-bash-3.2$ nasm -f macho main.asm -o main.o  && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o

Но результат:

ld: warning: ignoring file main.o, file was built for i386 which is not the architecture being linked (x86_64): main.o
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     -u command line option
ld: symbol(s) not found for architecture x86_64

Я думаю, что необходимо скомпилировать файл main.asm для x86_64. Как правильно скомпилировать программы для моей системы?

2 ответа

Я бы порекомендовал сначала обновить ваш NASM.

После этого попробуйте запустить это:

nasm -f macho64 main.asm -o main.o  && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o -lSystem

Обратите внимание, что новая команда добавляет предложение JasonD выше (macho64), но также добавляет -lSystem к ld команда, чтобы остановить ld от выдачи следующей ошибки:

ld: dynamic main executables must link with libSystem.dylib for architecture x86_64

Я заметил, что в большинстве примеров показаны автономные программы сборки, но, возможно, чаще всего сборка вызывается из C. Я создал простую программу на C, которая использует минимальную функцию, собранную из nasm:

extern unsigned cpuid(unsigned n);

/* ... */
        unsigned n = cpuid(1);

Сборка выглядит так:

section .text
    global _cpuid

_cpuid:
    push rbp
    mov rbp, rsp
    mov rax, rdi
    cpuid
    mov rax, rcx
    leave
    ret

Вы можете увидеть все это, в том числе параметры CLI NASM в make-файле, здесь:

https://github.com/ecashin/low/tree/master/cpuid

Он делает что-то мягко полезное, распечатывая наличие некоторых специфичных для процессора функций. (Но он делает это с помощью CPUID, не проверяя, доступен ли он. Если процессор Intel и новее, чем i486, это нормально.)

Пример протестирован на Mac OS X Snow Leopard с носом из коллекции портов. Удаление префикса подчеркивания - единственное изменение, необходимое для портирования на Linux x86_64.

Может попробовать статическое связывание?

ld -macosx_version_min 10.13 -e _main -static main.o
Другие вопросы по тегам