Even when whitespace isn't semantically important, it's still important. That's not how you write assembly.
Now, on to what you care about. Your
ld(1) incantation is wrong. It's easier to use
cc(1) to do the linking for you.
I fixed your
main.asm:
Code:
section .note.openbsd.ident
align 2
dd 8,4,1
db 'OpenBSD',0
dd 0
align 2
extern SDL_Init
section .text
global main
main:
mov edi,0x20 ; SDL_Init takes a uint32_t, not a uint64_t
call SDL_Init wrt ..plt ; -fPIC
mov eax,1 ; Originally an xor eax,eax | inc al combo
xor edi,edi ; You need a sane return code (otherwise it's 0x20)
syscall
Then run:
Code:
$ nasm -f elf64 main.asm -o main.o
$ cc -L/usr/local/lib -L/usr/X11R6/lib -R/usr/X11R6/lib -o main main.o -lSDL2
Note that every line except for labels begins with a tab, labels are on their own lines, there is always a tab between the operator and the operands, there is no space before or after commas in the operand list, and comments are preceded by at least one tab. The sole exception to this is
SDL_Init wrt ..plt but that is a limitation of the syntax (the equivalent AT&T syntax is
SDL_Init@PLT, which doesn't exhibit this problem).
As an aside, I find Intel assembly syntax to be horrific. Unless there's a reason for you to be using nasm (and there are plenty, unfortunately) you might be better served learning AT&T assembly syntax and using
as(1) as your assembler.