构建DLL文件时,生成的LIB文件是否包含DLL名称?

2022-01-11 00:00:00 winapi linker c++

在 Visual C++ 中,当我构建一个 dll 时,输出文件是 .dll 和 .lib.

In Visual C++ , when I build a dll , the output files are .dll and .lib.

是 .lib 文件中内置的 dll 的名称.

Is the name of the dll built into the .lib file .

我问这个问题的原因是:当我通过导入这个 dll 构建我的 exe 并运行 exe 时,exe 会尝试定位 dll 以将其加载到进程地址空间中.

The reasson I ask this question is : When I built my exe by importing this dll and run the exe , the exe tries to locate the dll to load it in the process address space .

由于我们只是在项目属性中指定库名称(.lib 文件),exe 是如何知道 dll 的名称的.

As we just specify the library name (.lib file) in the project properties , how does the exe get to know the name of the dll .

注意:我转储了库文件 (.lib),发现它不包含 dll 的名称.

Note : I dumpbin libary file (.lib) and saw that it does not contain the name of the dll .

推荐答案

LIB文件变成EXE中的导入表.这确实包含 DLL 的名称.

The LIB file is turned into an import table in the EXE. This does contain the name of the DLL.

如果您运行 dumpbin/all MyDLL.lib,您可以看到这一点.请注意,dumpbin MyDll.lib 本身并没有显示任何有用的信息:您应该使用 /all.

You can see this if you run dumpbin /all MyDLL.lib. Note that dumpbin MyDll.lib by itself doesn't show anything useful: you should use /all.

这显示了 .LIB 文件中定义的所有部分.您可以忽略任何 .debug 部分,因为它们不会出现在发布版本中.在 .LIB 文件中,有一组 .idata 节.在我刚刚构建的 DLL 项目中,LIB 文件包含一个 .idata$4 部分,该部分定义了要放入 EXE 的导入表中的符号,包括 DLL 名称:

This shows all of the sections defined in the .LIB file. You can ignore any .debug sections, because they wouldn't be present in a Release build. In the .LIB file, there are a collection of .idata sections. In the DLL project that I just built, the LIB file contains a .idata$4 section which defines the symbols to be put in the EXE's import table, including the DLL name:

Archive member name at 83E: MyDll.dll/      
497C3B9F time/date Sun Jan 25 10:14:55 2009
         uid
         gid
       0 mode
      2E size
correct header end

  Version      : 0
  Machine      : 14C (x86)
  TimeDateStamp: 497C3B9F Sun Jan 25 10:14:55 2009
  SizeOfData   : 0000001A
  DLL name     : MyDll.dll
  Symbol name  : ?fnMyDll@@YAHXZ (int __cdecl fnMyDll(void))
  Type         : code
  Name type    : name
  Hint         : 2
  Name         : ?fnMyDll@@YAHXZ

相关文章