How to compile using nasm on MacOSX
Solution 1
I would recommend first updating your NASM.
After that, try running this:
nasm -f macho64 main.asm -o main.o && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o -lSystem
Notice that the new command adds JasonD's suggestion above (macho64
), but also adds the -lSystem
to the ld
command to stop ld from throwing following error:
ld: dynamic main executables must link with libSystem.dylib for architecture x86_64
Solution 2
I noticed that most examples show standalone assembly programs, but it is perhaps more common for assembly to be called from C. I created a simple C program that uses a minimal nasm-assembled function like this:
extern unsigned cpuid(unsigned n);
/* ... */
unsigned n = cpuid(1);
The assembly looks like this:
section .text
global _cpuid
_cpuid:
push rbp
mov rbp, rsp
mov rax, rdi
cpuid
mov rax, rcx
leave
ret
You can see the whole thing, including nasm CLI options in the makefile, here:
https://github.com/ecashin/low/tree/master/cpuid
It does something mildly useful by printing out the availability of some CPU-specific features. (But it does that by using CPUID without checking whether it's available. If the CPU is Intel and newer than an i486, though, that's fine.)
The example is tested on Mac OS X Snow Leopard with the nasm from the ports collection. Removing the underscore prefix is the only change necessary for porting to Linux x86_64.
Related videos on Youtube
Ilya Lavrenov
Updated on September 16, 2022Comments
-
Ilya Lavrenov over 1 year
I am trying to compile and link my first program on Assembler. I try to compile the following code:
; %include "stud_io.inc" global _main section .text _main: xor eax, eax again: ; PRINT "Hello" ; PUTCHAR 10 inc eax cmp eax, 5 jl again
Below the console command for compiling and linking a program:
-bash-3.2$ nasm -f macho main.asm -o main.o && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o
But the result is:
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
I think its necessary to compile the main.asm file for x86_64.. How to compile programs for my system properly?
-
RageD over 11 yearsThat version of nasm is very outdated. Look at nasm.us/pub/nasm/releasebuilds/2.10
-
-
RageD over 11 yearsThe segfault is a problem with the code execution. After the
jl
instruction, add aret
instruction (since you are using a main). Note that if you are using pure x86 assembly, you need to exit by using the exit system call inint 0x80
(but not in this case). Remember that the PC counter needs to know where to go to continue execution when your code is done. -
Ed Cashin over 10 yearsAlso, I did need to update NASM as the other comments here say before I could use
-fmacho64
. -
Elshan almost 5 years
ld -lSystem my.o -e _main -macosx_version_min 10.14 -o exit
Result - >cannot execute binary file