ОК, просматривая ваши образцы, я предполагаю, что вы использовали универсальное руководство по сборке nasm или linux.
Первое, о чем вам нужно позаботиться, это двоичный формат, созданный nasm.
Ваше сообщение гласит:
ld: warning: ignoring file program.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
Это результат параметра ' -f elf ' , который сообщает nasm, что вы хотите 32-битный объект ELF (что, например, относится к linux),Но поскольку вы работаете в OSX, вам нужен объект Mach-O.
Попробуйте выполнить следующее:
nasm -f macho64 -o program.o main.asm
gcc -o program program.o
Или, если вы не хотите создавать 32-разрядный двоичный файл:
nasm -f macho32 -o program.o main.asm
gcc -m32 -o program program.o
Относительно _start символ - если вы не хотите создавать простую программу, которая сможет использовать предоставленные системные функции libc, вам не следует использовать _start в al.Это точка входа по умолчанию ld будет искать, и обычно она предоставляется в вашей libc / libsystem.
Я предлагаю вам попробовать заменить _start в вашем коде на что-тонапример '_ main' и связать его, как в приведенном выше примере.
Общий шаблон сборки на основе libc для nasm может выглядеть следующим образом:
;---------------------------------------------------
.section text
;---------------------------------------------------
use32 ; use64 if you create 64bit code
global _main ; export the symbol so ld can find it
_main:
push ebp
mov ebp, esp ; create a basic stack frame
[your code here]
pop ebp ; restore original stack
mov eax, 0 ; store the return code for main in eax
ret ; exit the program
В дополнение к этому я должен упомянуть, что при любых вызовах , которые вы делаете в OSX, необходимо использовать выровненный кадр стека, иначе ваш код просто рухнет.
Есть также несколько хороших руководств по этому вопросу.- попробуйте поискать руководство по сборке OSX.