windows - NT DLL 加载器是否按照可执行文件导入部分的顺序加载 DLL?

标签 windows dll loader ntdll

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

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

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,因为它在导入部分中排在第一位?

最佳答案

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

From Michael Grier's MSDN Blog

The implementation is linear/sequential. Therefore even the order of the imports in your static import tables matters. [...] If the linker for some reason reverses the order of the static imports, you'll see the opposite.

关于windows - NT DLL 加载器是否按照可执行文件导入部分的顺序加载 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6382560/

相关文章:

java - 隐藏的 JDialog 在 Windows 10 任务栏预览中仍然可见

c - 如何在没有wmi的情况下用C或asm获取硬盘序列号

Python 绑定(bind);调用 C 代码和性能

c# - 从 C# 可执行文件中扫描 DLL 依赖项

c++ - 在 Windows 中配置 CMake 以从命令行使用 clang 以获得现代 OpenMP 支持

javascript - 三个js-纹理加载-async/await

c++ - 通过 Internet 发送 boolean 值(Windows 和 Linux)

c++ - 我必须在 VS 2008 中使用 "Visual"C++ 吗?

java - 如何将变量传递给 Loader 类中的 loadInBackground()?

java - AsyncTaskLoader 未启动