Prima modifica _printf
a printf
e il _start
simbolo a main
, quindi utilizza gcc
per collegare il file oggetto, che lo collegherà automaticamente a libc
, devi farlo perché AFAIK non puoi collegarti a libc senza un main
. Inoltre dovresti usare elf32 non elf64 durante l'assemblaggio perché il codice ha istruzioni a 32 bit:
bits 32
extern printf
global main
section .data
message db "Hello world!!", 10, 0
section .text
main:
pushad
push dword message
call printf
add esp, 4
popad
ret
E costruisci con:
nasm -f elf32 vaja4.asm
gcc -m32 vaja4.o -o vaja4
$./test
$Hello world!!
Modifica:
Poiché ora stai compilando codice a 32 bit su un sistema a 64 bit, dovrai installare la versione a 32 bit delle librerie
apt-get install ia32-libs
Su Ubuntu 12.10, devi prima installare i pacchetti di sviluppo
sudo apt-get update
sudo apt-get install libc6-dev-i386
per
gcc -m32 vaja4.o -o vaja4
lavorare.
Dubito che l'errore che vedi sia dovuto a un problema a 32/64 bit. L'errore che vedi, ad esempio
vaja4.asm:(.text+0x7): undefined reference to `_printf'
ti dice chiaramente che il simbolo _printf non è definito, il che significa che la libreria per la funzione printf non è collegata.
il tuo passaggio di collegamento, ad esempio
ld vaja4.o -o vaja4
non include alcuna libreria. Devi collegare il tuo programma con una libreria che può fornire la definizione della funzione printf. Credo che ld dovrebbe scegliere la libreria da sola senza disturbarti con questi messaggi, ma poiché non è in grado di trovare una libreria C adatta per questa funzione, immagino che tu non abbia le librerie richieste, ovvero manca la libreria a 32 bit o 64.
Ad ogni modo, prova la seguente sequenza di comandi per assemblare e collegare il tuo programma:
nasm -f elf vaja4.asm
ld -m elf_i386 vaja4.o vaja4
./vaja4