Domanda

Sono sempre stato confuso su come funziona il linker, ed è un argomento difficile da cercare.

Per dimostrare la mia domanda e fornire un quadro per una risposta, metterò giù quello che so (o penso di sapere) finora. Potrei sbagliarmi molto. :)

Innanzitutto, ogni file .cpp è incorporato in un file intermedio (credo .o per Posix / ELF e .obj per Win / PE). Questo file intermedio contiene tutti i simboli definiti dal .cpp da cui è stato creato e contiene istruzioni per i collegamenti esterni di cui ha bisogno per essere adeguatamente risolto. Come estensione a questo, i sistemi Posix ti consentono di combinare i file .o in un file .a (che non sembra fare altro che combinare? Quale comando fa questo?). .Lib è l'equivalente Win / PE del file Posa .a?

Successivamente, i file intermedi sono collegati insieme, le dipendenze esterne sono state risolte e il tuo eseguibile. Mi manca qualche passaggio?

Grazie!

È stato utile?

Soluzione

Ecco alcuni pezzi del puzzle:

  • ar (1) è usato per creare file .a. Sono simili ai file tar (1) o zip (possibilmente con un indice per cercare un file oggetto in base al nome del simbolo)
  • Il linker copia insieme le sezioni dei file oggetto (testo, dati, bss). Per GNU ld, la copia precisa delle sezioni può essere controllata con uno script di linker (ad esempio, copiare tutte le sezioni dai file .o contenenti "quot" testo "nei loro nomi in un'unica sezione di testo)
  • Il linker esegue anche i trasferimenti: istruzioni di patching (salto e caricamento dei dati) con i rispettivi indirizzi di destinazione, una volta noto il valore di un simbolo. In alcuni casi, ciò non può essere fatto al momento del collegamento, quindi il linker copia / regola i record di rilocazione dai file .o nell'eseguibile finale.
  • Windows .lib ha due scopi: una libreria statica (.lib) è simile alle librerie .a. Una libreria di importazione (.lib) non contiene il codice effettivo, ma solo elenchi di simboli. Il linker può risolvere i simboli dalla libreria di importazione, ma poi sa che deve inserire un riferimento al DLL corrispondente nell'eseguibile. Su Unix / ELF, il file .so ha sia il codice che la tabella dei simboli.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top