NT DLL加载程序是否以可执行文件的导入部分的顺序加载DLL?

问题描述 投票:1回答:1

如果您在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

我现在有speculated in another question用于独立的DLL加载程序(将DLL映射到地址空间并调用其DllMain函数的组件)将按照DLL在导入中出现的顺序来加载DLL。部分。

:显然,这仅适用于独立的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
在这种意义上,

libgimpmathlibgimpcolor是独立的DLL。因此,这里的问题是:加载程序是否总是在libgimpcolor之前加载libgimpmath,因为它首先在导入部分中?

windows dll loader ntdll
1个回答
5
投票

对于独立的DLL,加载顺序的确与IAT的顺序相同。

来自Michael Grier's MSDN Blog

该实现是线性/顺序的。因此,即使静态导入表中的导入顺序也很重要。 [...]如果链接器由于某种原因使静态导入的顺序相反,则会看到相反的结果。

© www.soinside.com 2019 - 2024. All rights reserved.