I'm pretty new to x64-assembly on the Mac, so I'm getting confused porting some 32-bit code in 64-bit.
The program should simply print out a message via the printf function from the C standart library.
I've started with this code:
section .data
    msg db 'This is a test', 10, 0    ; something stupid here
section .text
    global _main
    extern _printf
_main:
    push    rbp
    mov     rbp, rsp       
    push    msg
    call    _printf
    mov     rsp, rbp
    pop     rbp
    ret
Compiling it with nasm this way:
$ nasm -f macho64 main.s
Returned following error:
main.s:12: error: Mach-O 64-bit format does not support 32-bit absolute addresses
I've tried to fix that problem byte changing the code to this:
section .data
    msg db 'This is a test', 10, 0    ; something stupid here
section .text
    global _main
    extern _printf
_main:
    push    rbp
    mov     rbp, rsp       
    mov     rax, msg    ; shouldn't rax now contain the address of msg?
    push    rax         ; push the address
    call    _printf
    mov     rsp, rbp
    pop     rbp
    ret
It compiled fine with the nasm command above but now there is a warning while compiling the object file with gcc to actual program:
$ gcc main.o
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not
allowed in code signed PIE, but used in _main from main.o. To fix this warning,
don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
Since it's a warning not an error I've executed the a.out file:
$ ./a.out
Segmentation fault: 11
Hope anyone knows what I'm doing wrong.
 
     
     
     
     
    