Come esercizio per imparare più precisamente come funzionano i programmi c e quale livello minimo di contenuto deve esistere affinché un programma sia in grado di usare libc, mi sono assunto il compito di programmare principalmente nell'assemblaggio x86 usando gas e ld .Come collegare un programma di assemblaggio gas che utilizza la libreria standard C con ld senza utilizzare gcc?
Come una piccola sfida divertente, ho assemblato e collegato con successo diversi programmi collegati a diverse librerie dinamiche self-made, ma non sono riuscito a codificare un programma da zero per utilizzare le chiamate della funzione libc senza utilizzare direttamente gcc .
Capisco le convenzioni di chiamata delle singole funzioni della libreria c e ho accuratamente controllato i programmi compilati da gcc tramite l'uso di objdump e readelf, ma non ho ottenuto da nessuna parte per quanto riguarda le informazioni da includere in un file assembly gas e quali parametri invocare in ld per collegarsi correttamente a libc. Qualcuno ha qualche idea su questo?
Sto eseguendo Linux su una macchina x86.
questo è estremamente utile, che chiarisce un sacco di informazioni. dopo averlo applicato al mio codice, ricevo 2 errori, "riferimento non definito a '__libc_csu_fini'" e "riferimento non definito a '__libc_csu_init'" dopo aver eseguito un dump di simboli su tutti i file oggetto, non sono riuscito a trovarli simboli e crt1.o sembra chiamare i simboli. c'è qualcosa che potrebbe avere quei simboli all'interno del loro file oggetto? – Cyro
Questi provengono da una parte non condivisa della libreria C; il collegamento con '-lc' dovrebbe inserire'/usr/lib/libc.so', che in realtà è un frammento di script linker che fa riferimento al file corretto ('/ usr/lib/libc_nonshared.a'). Forse un problema con l'ordine dei link? Sono abbastanza sicuro che tu voglia 'crt1.o' seguito da' crti.o' prima, poi i tuoi oggetti e librerie, quindi 'crtn.o' alla fine - ma forse' -lc' dovrebbe venire dopo i tuoi oggetti (poco prima di 'crtn.o'), non prima. –
Sono andato avanti e semplicemente collegato con /usr/lib/libc_nonshared.a subito dopo aver digitato -lc e l'intera cosa ha funzionato! Grazie mille! – Cyro