2012-11-01 33 views
9

Ho un programma scritto in linguaggio assembly a 32 bit ... Ora non riesco a compilarlo su sistema operativo a 64 bit. Nella nostra scuola sono specifici e il programma deve essere scritto nella versione a 32 bit. Ecco il mio programma:Compilando 32 bit Assembler su ubuntu a 64 bit

bits 32 
extern _printf 
global _start 

section .data 
    message db "Hello world!!", 10, 0 

section .text 

_start: 
    pushad 
    push dword message 
    call _printf 
    add esp, 4 
    popad 
    ret 

Qualche idea? Ho provato tanti modi per compilarlo. uscita di errore dopo la compilazione:

nasm -f elf64 vaja4.asm 
ld vaja4.o -o vaja4 
./vaja4 

uscita:

vaja4.o: In function `_start': 
vaja4.asm:(.text+0x7): undefined reference to `_printf' 
+0

non dovrebbe essere printf non _printf? – iabdalkader

+0

Stesso errore: vaja4.o: nella funzione 'start ': vaja4.asm :(. Testo + 0x7): riferimento non definito a' printf' – Klemenko

risposta

15

Primo cambio _printf al printf e il _start simbolo per main, quindi utilizzare gcc per collegare il file oggetto, che sarà collegalo automaticamente a libc, , è necessario farlo perché AFAIK non è possibile collegarsi a libc senza main. Inoltre si dovrebbe usare elf32 non elf64 in fase di montaggio perché il codice ha 32 bit istruzioni:

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 costruire con:

nasm -f elf32 vaja4.asm 
gcc -m32 vaja4.o -o vaja4 
$./test 
$Hello world!! 

C'è un bel tutorial qui:

http://jdefr.swippet.com/2012/03/22/using-libc-with-assembly/

Modifica:

Dal momento che si sta ora compilando codice a 32 bit su un sistema a 64 bit, è necessario installare la versione a 32 bit delle librerie

apt-get install ia32-libs 
+1

Sì, questo è il modo giusto. Se vuoi usare libc dovresti usare 'main' come entry point e link usando gcc in modo che le parti corrette di libc vengano tirate dentro e che l'inizializzazione/spegnimento siano prese in considerazione. Inoltre, semplicemente restituendo funziona solo da 'main', se si crea un binario senza libc è necessario utilizzare una chiamata di sistema di uscita. – Jester

+0

Beh, ho provato a modo tuo. Dopo gcc -m32 vaja4.o -o vaja4 mi dà quell'output di errore: http://pastebin.com/jX3N2GSJ – Klemenko

+0

è necessario installare le librerie a 32-bit apt-get install ia32-libs – iabdalkader

1

Sembra a me come ti sei dimenticato di collegarsi verso la libreria C, che è la parte che fornisce la funzione printf (e altri):

ld vaja4.o -o vaja4 -lc 
4

Dubito che l'errore visualizzato sia a causa del problema 32/64 bit. L'errore che si vede cioè

vaja4.asm:(.text+0x7): undefined reference to `_printf' 

è chiaramente dicendo la _printf simbolo non è definito il che significa che la libreria per la funzione printf non viene collegata.

vostro passo che collega cioè

ld vaja4.o -o vaja4 

non include le librerie. È necessario collegare il programma a una libreria in grado di fornire una definizione della funzione printf. Credo che ld dovrebbe scegliere autonomamente la libreria senza preoccuparsi di questi messaggi, ma poiché non è in grado di trovare una libreria C adatta a questa funzione, suppongo che tu non abbia le librerie richieste in cui mancano le librerie a 32 o 64 bit.

In ogni caso, plz provare la seguente sequenza di comandi da montare e collegare il vostro programma:

nasm -f elf vaja4.asm 
ld -m elf_i386 vaja4.o vaja4 
./vaja4 
+0

O anche 'ld -m elf_i386 -I/lib/ld-linux.so .2 -lc vaja4.o -o vaja4' Potrebbe non essere necessario l'opzione '-I' - sicuramente bisogno di' -lc' e '-o' sul nome del file di output. L'etichetta '_start' è saltata, non chiamata. quindi non puoi "ritirare" da esso. Più facile usare 'main' e gcc ... –

+0

o' ld -m elf_i386 -s -o vaja4 vaja4.o' per collegare lo stage. –

7

Su Ubuntu 12.10, è necessario installare i pacchetti di sviluppo primi

sudo apt-get update 
sudo apt-get install libc6-dev-i386 

per

gcc -m32 vaja4.o -o vaja4 

a lavorare.

+0

ha funzionato come un incantesimo. –

Problemi correlati