An In-Depth Look into the Win32 Portable Executable File FormatCome funzionano le librerie di importazione e perché MinGW non ne ha bisogno?
Spiega che il linker ha bisogno di una libreria di importazione perché il compilatore non può distinguere tra chiamate di funzioni normali e chiamate di funzioni API. Ma dicono anche che __declspec (dllimport) specifica una chiamata di funzione per essere una API-Call in modo che il linker rimandi a __imp_[function-name]
. Ma con il compilatore dovrebbe sapere che questa è una chiamata a una funzione API.
Perché il linker necessita ancora di una libreria di importazione? Il compilatore potrebbe contrassegnare questo simbolo come importato anteponendo __imp_
al nome della funzione e potrebbe effettuare una chiamata a un puntatore a funzione (che è ancora un simbolo non risolto) e il linker potrebbe sostituire questo simbolo (poiché vede che questa è una chiamata API) con l'indirizzo della voce IAT.
E perché il minGW-linker utilizza "MinGW-DLL" direttamente ma il linker di Visual-Studio necessita di una libreria di importazione?
Mentre ho letto il post, sono state sollevate anche altre domande. In che modo il "dlltool (o linker)" (a seconda di quale crea la libreria di importazione) conosce la posizione di una voce IAT prima che sia stato effettuato il collegamento con l'eseguibile finale? Ho pensato che le voci IAT sarebbero state costruite in fase di collegamento con l'eseguibile finale. Il post diceva che ogni Call API ha una posizione fissa nella tabella IAT, senza preoccuparsi di quante DLL saranno collegate. Non riesco a immaginare come possa essere raggiunto.
[Questo post] (http://stackoverflow.com/a/3573527/1881610) risponde alla maggior parte delle vostre domande. – Phillip