Загрузчик NT DLL загружает библиотеки DLL в порядке раздела импорта исполняемого файла? - PullRequest
1 голос
/ 17 июня 2011

Если у вас есть исполняемый файл в Windows, вы можете просмотреть его раздел импорта с помощью утилиты DUMPBIN (включенной, например, в Visual Studio).

Чтобы получить список всех импортированных DLL, вы можете запустить что-то вроде этого (просто произвольный пример):

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

У меня сейчас спекулировано в другом вопросе что, для независимых DLL Загрузчик (компоненткоторый отображает библиотеки DLL в адресное пространство и вызывает их функцию DllMain) загрузит библиотеки DLL в том порядке, в котором они появляются в разделе импорта.

Примечание : Очевидно, что это может применяться только кнезависимые библиотеки DLL, потому что загрузчик должен разрешать зависимости, поэтому любая библиотека DLL, которая зависит от любой другой, всегда будет загрузчиком после другой. Таким образом, этот вопрос может применяться только к независимым (не системным) DLL.

Чтобы остаться в моем (произвольно выбранном) примере выше,

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и libgimpcolor являются независимыми DLL в этом смысле.Итак, вот вопрос: будет ли загрузчик всегда загружать libgimpcolor до libgimpmath, потому что он идет первым в разделе импорта?

1 Ответ

5 голосов
/ 17 июня 2011

Для независимых DLL порядок загрузки действительно совпадает с порядком IAT.

Из Блог MSDN Майкла Гриера

Реализация является линейной / последовательной. Поэтому даже порядок импорта в ваших статических таблицах импорта имеет значение. [...] Если компоновщик по какой-то причине меняет порядок статического импорта, вы увидите обратное.

...