2015-07-12 58 views
5

Sto usando Kali linux 64 bit e sto provando ad eseguire i seguenti programmi dal sito web del Dr. Paul Carter. Il comando gcc sta dando errori. Cosa dovrei usare nel comando gcc?impossibile compilare assembly:/usr/bin/ld: l'architettura i386 del file di input `array1.o 'non è compatibile con i386: x86-64 output

nasm -f elf32 array1.asm 
[email protected]:assembly# gcc -o array1 array1.o array1c.c 
array1c.c:9:1: warning: ‘cdecl’ attribute ignored [-Wattributes] 
array1c.c:10:1: warning: ‘cdecl’ attribute ignored [-Wattributes] 
/usr/bin/ld: i386 architecture of input file `array1.o' is incompatible with i386:x86-64 output 
collect2: error: ld returned 1 exit status 
+0

La sperimentazione di linguaggio assembly come root è una pessima idea. http://apple.stackexchange.com/a/192422/118588 ha una grande spiegazione delle insidie ​​dell'utilizzo di root per tutto, che si applica a tutti i sistemi operativi Unix, non solo a OS X. È ancora peggio quando si sperimenta con ASM, dal momento che potrebbe accidentalmente effettuare una chiamata di sistema indesiderata che riavvia il sistema o, peggio. –

+0

Vedere anche http://stackoverflow.com/questions/36861903/assembling-32-bit-binaries-on-a-64-bit-system-gnu-toolchain/36901649#36901649 per una guida più completa ai vari modi di creazione di file binari a 32 o 64 bit dalla sorgente ASM, con o senza libc. –

risposta

5

Si sta tentando di collegare un file oggetto a 32 bit i386 ad un file eseguibile a 64 bit (i386:x86-64). Aggiungi -m32 alla riga di compilazione gcc per creare un eseguibile a 32 bit.

+0

l'aggiunta di -m32 non ha funzionato .. gcc -m32 array1.o -o array1 /usr/bin/ld: impossibile trovare crt1.o: nessun file o directory /usr/bin/ld: impossibile trovare crti.o : Nessun file o directory /usr/bin/ld: saltare incompatibile /usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc.a durante la ricerca di -lgcc /usr/bin/ld: impossibile trovare - lgcc /usr/bin/ld: saltando incompatibile /usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc_s.so durante la ricerca di -lgcc_s /usr/bin/ld: impossibile trovare -lgcc_s /usr/bin/ld: impossibile trovare -lc ..... –

+2

È necessario installare file di sviluppo glibc a 32 bit per gcc con cui collegarsi. –

1

(ops, ho scremato solo la questione, ed ho pensato che stavano facendo un eseguibile standalone con un solo ld. Vedere la risposta di cad per gcc -m32, per quando si vuole collegare con libc e tutto ciò che, piuttosto che provare qualche piccola sperimentare come standalone.)

Devi dire a ld a quale macchina vuoi che l'uscita sia. Il valore predefinito è il tipo nativo.

nasm -f elf32 array1.asm # or yasm 
ld -m elf_i386 array1.o -o 32bit-array1 

Sfortunatamente, molte guide/risorse asm hanno ancora esempi con codice x86 a 32 bit.

+0

Ciao, grazie, ma sto ricevendo un mucchio di problemi completamente nuovi –

+0

ld: avviso: impossibile trovare il simbolo della voce _start; inadempiente a 0000000008048080 array1.o: In funzione 'init_loop ': array1.asm :(testo + 0x1d):. undefined reference to' puts' array1.o: In funzione 'Prompt_loop ': array1.asm :(. testo + 0x37): riferimento non definito a 'printf ' array1.asm :(. testo + 0x46): riferimento non definito a' scanf' array1.asm :(. testo + 0x53): riferimento non definito a 'dump_line ' array1. o: nella funzione 'InputOK ': array1.asm :(. testo + 0x6a): riferimento non definito a' printf' array1.asm :(. testo + 0x77): riferimento non definito a 'puts ' array1.o: In function 'print_loop ': –

+0

Il tuo codice definisce' main', non '_start', e usa le funzioni di libreria, quindi devi solo usare gcc. La mia risposta è utile solo se stai scrivendo un programma standalone che fa direttamente le sue chiamate di sistema. –

2

Prima installare questo:

sudo apt-get install gcc-multilib g++-multilib 

poi Assemeble e il collegamento in questo modo:

nasm -f elf array1.asm -o array1.o 

E finalmente,

gcc -m32 array1.o -o array1.out 

e correre,

./array1.out 

Questo dovrebbe funzionare ......

2
nasm -f elf64 array1.asm 

poi

ld -s -o array1 array1.o