【问题标题】:Does the NT DLL Loader load DLLs in the order of the import section of the executable?NT DLL Loader 是否按照可执行文件的导入部分的顺序加载 DLL?
【发布时间】:2011-09-16 23:24:24
【问题描述】:

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

继续我上面的(任意选择的)示例,

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。所以这里的问题是:加载器是否总是在libgimpmath 之前加载libgimpcolor,因为它位于导入部分的第一位?

【问题讨论】:

  • 啊!我多么喜欢那些匿名投票者......

标签: windows dll loader ntdll


【解决方案1】:

对于独立的DLL,加载顺序确实和IAT的顺序一样。

来自Michael Grier's MSDN Blog

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

【讨论】:

  • 优秀的文章/链接。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
相关资源
最近更新 更多