Как скомпилировать используя 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