Il caricatore DLL NT carica le DLL nell'ordine della sezione di importazione dell'eseguibile?

2011-06-17 windows dll loader ntdll

Se si dispone di un eseguibile su Windows, è possibile visualizzare la relativa sezione di importazione con l'utilità DUMPBIN (inclusa ad esempio in Visual Studio).

Per ottenere un elenco di tutte le DLL importate è possibile eseguire qualcosa del genere (solo un esempio arbitrario):

C:\Programme\GIMP-2.0\bin>dumpbin /IMPORTS gimp-2.4.exe | grep -i \.dll
    libgimpcolor-2.0-0.dll
    libgimpmath-2.0-0.dll
    libgimpmodule-2.0-0.dll
    libgimpthumb-2.0-0.dll
    libgimpwidgets-2.0-0.dll
    libart_lgpl_2-2.dll
    libfontconfig-1.dll
    freetype6.dll
    libgdk-win32-2.0-0.dll
    libgdk_pixbuf-2.0-0.dll
    libglib-2.0-0.dll
    libgobject-2.0-0.dll
    libgthread-2.0-0.dll
    libgtk-win32-2.0-0.dll
    intl.dll
    libpango-1.0-0.dll
    libpangoft2-1.0-0.dll
    libgimpbase-2.0-0.dll
    libgimpconfig-2.0-0.dll
    KERNEL32.dll
    msvcrt.dll
    msvcrt.dll
    USER32.dll

Ho ora ipotizzato in un'altra domanda che, per DLL indipendenti, il Caricatore (il componente che mappa le DLL nello spazio degli indirizzi e chiama la loro funzione DllMain) caricherà le DLL nell'ordine in cui appaiono nella sezione di importazione.

Nota : questo può ovviamente applicarsi solo a DLL indipendenti poiché il caricatore dovrà risolvere le dipendenze, quindi qualsiasi DLL che dipende da qualsiasi altra sarà sempre caricatrice dopo l'altra. Quindi questa domanda può applicarsi solo a DLL indipendenti (non di sistema).

Per rimanere con il mio esempio (scelto arbitrariamente) sopra,

C:\Programme\GIMP-2.0\bin>dumpbin /IMPORTS libgimpcolor-2.0-0.dll | grep -i \.dll
Dump of file libgimpcolor-2.0-0.dll
    libglib-2.0-0.dll
    libgobject-2.0-0.dll
    msvcrt.dll

C:\Programme\GIMP-2.0\bin>dumpbin /IMPORTS libgimpmath-2.0-0.dll | grep -i \.dll
Dump of file libgimpmath-2.0-0.dll
    libglib-2.0-0.dll
    libgobject-2.0-0.dll
    msvcrt.dll

C:\Programme\GIMP-2.0\bin>dumpbin /IMPORTS libgobject-2.0-0.dll | grep -i \.dll
Dump of file libgobject-2.0-0.dll
    libglib-2.0-0.dll
    KERNEL32.dll
    msvcrt.dll

C:\Programme\GIMP-2.0\bin>dumpbin /IMPORTS libglib-2.0-0.dll | grep -i \.dll
Dump of file libglib-2.0-0.dll
    iconv.dll
    intl.dll
    ADVAPI32.DLL
    KERNEL32.dll
    msvcrt.dll
    msvcrt.dll
    OLE32.dll
    SHELL32.DLL
    USER32.dll
    WS2_32.DLL

libgimpmath e libgimpcolor sono DLL indipendenti in questo senso. Quindi qui la domanda sarebbe: Loader caricherà sempre libgimpcolor prima di libgimpmath perché viene prima nella sezione di importazione?

Answers

Per le DLL indipendenti, l'ordine di caricamento è effettivamente lo stesso dell'ordine di IAT.

Dal blog MSDN di Michael Grier

L'implementazione è lineare / sequenziale. Pertanto, anche l'ordine delle importazioni nelle tabelle di importazione statica è importante. [...] Se per qualche motivo il linker inverte l'ordine delle importazioni statiche, vedrai il contrario.

Related