Mi piace sapere come funzionano i programmi in modo da renderlo il più semplice possibile. Mi diverto con il montaggio.Perché un programma di assemblaggio funziona solo se collegato a crt1.o crti.o e crtn.o?
Ho appena scoperto come assemblare il codice per x86_64 utilizzando la funzione wprintf (i caratteri wide trovati sono 32 bit). tutto quello che dovevo fare era il collegamento a libc (-lc).
Sto cercando di assemblare il codice per fare a 32 bit la stessa cosa ma sono inciampato un po '. Alla fine ho usato gcc per fare il collegamento (e cambiato il _start: to main :). Allora ho fatto il collegamento io stesso usando ld e ho incluso crt1.o crti.o e crtn.o. Quindi il mio programma ha funzionato (non avrebbe stampato nulla prima) Quindi la mia domanda è, posso fare qualcosa nel mio codice per eliminare la necessità di questi altri 3 file oggetto (e naturalmente tornare a _start: invece di main :) ?
test_lib.S
.section .data
locale:
.string ""
.align 4
printformat:
.long '%','l','c',0
.section .text
.global main
main:
pushl $locale
pushl $6
call setlocale
pushl $12414
pushl $printformat
call wprintf
pushl $2
call exit
e eseguendo i seguenti
as --32 test_lib.S -o test_lib.o
ld -m elf_i386 -L/lib/ -L/usr/lib/ -I/lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o -lc /usr/lib/crtn.o test_lib.o -o test_lib
./test_lib
oh e l'uscita è semplicemente un hiragana giapponese (ma) ま (avviso non v'è alcuna interruzione di linea così esso stampa prima del prompt)
http://stackoverflow.com/questions/3577922/how-to-link-a-gas-assembly-file-as-ac-program-with-ld-without-using-gcc –