Sto imparando il montaggio con NASM
per una lezione che ho al college. Vorrei collegare la libreria di runtime C con ld
, ma non riesco proprio a spiegarmi. Ho una macchina 64 bit
con Linux Mint
installata.Come collegare la libreria di runtime C con 'ld'?
Il motivo per cui sono confuso è che, per quanto ne so, invece di collegare il runtime C, gcc
copia le cose che ti servono nel tuo programma. Potrei sbagliarti, quindi non esitare a correggermi su questo, per favore.
Quello che ho fatto fino a questo punto è di collegarlo usando gcc
. Ciò produce un pasticcio di un codice macchina che non riesco a seguire, anche per un programma di piccole dimensioni come lo scambio rax
con rbx
, che non è eccezionale per scopi di apprendimento. (Si prega di notare che il programma funziona.)
io non sono sicuro se è rilevante, ma questi sono i comandi che sto usando per compilare e link:
# compilation
nasm -f elf64 swap.asm
# gcc
gcc -o swap swap.o
# ld, no c runtime
ld -s -o swap swap.o
Grazie in anticipo!
Conclusione:
Ora che ho una risposta adeguata alla domanda, qui ci sono alcune cose che vorrei menzionare. Il collegamento glibc
dinamicamente può essere eseguito come nella risposta Z boson (per sistemi a 64 bit). Se vuoi farlo staticamente, do follow this link (che sto postando dalla risposta Z boson).
Ecco un articolo che Jester pubblicato, circa how programs start in linux.
Per vedere cosa gcc
collega al proprio .o
-s, provare questo comando: gcc -v -o swap swap.o
. Nota che 'v' sta per 'verbose'.
Inoltre, you should read this se si è interessati al montaggio a 64 bit.
Grazie si per le vostre risposte e utile insight! Fine del discorso
Risposta breve: no. Sfortunatamente la libc include non solo la libreria dinamica, ma una serie di oggetti statici necessari per l'inizializzazione e l'arresto. Se vuoi davvero farlo, usa 'gcc -v' per vedere quali sono le parti necessarie. Potresti essere interessato a questo [articolo fantastico sull'avvio del programma] (http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html). – Jester
'gcc -o swap swap.o' collega il runtime. 'ld -o swap.o' non lo fa. Il collegamento include la copia di parti di grandi dimensioni del runtime sull'eseguibile. Qual è il problema esattamente? –
@Jester Lo esaminerò subito! – mrDudePerson