跳到主要内容

DLL的导入库中是什么信息

· 阅读需 2 分钟

当DLL被链接时,链接程序要查找关于输出变量,函数,或C++类的信息,并自动生成一个lib文件。该lib文件包含一个DLL输出的符号列表。如果要链接引用该DLL的输出符号的任何可执行模块,该lib文件是必不可少的(使用GetProcAddress除外)。

其实导入库中并不含RVA(每个符号的相对虚拟地址),只是一些符号而已,还有关于这个lib所对应的DLL的名字等。 (这只是我现在的理解)

那当应用程序调用一个DLL的函数时,是怎么进行的呢?(使用lib的情况下)

答案是在进程的主线程开始运行之前,由加载器完成。

加载器根据输入节中DLL的名字按照windows的搜索路径搜索DLL,找到后DLL映射到进程的地址空间,这是DLL中对应于输入节中的各个符号的地址就可以确定了,加载器在这个时候将地址重新填入可执行模块的输入节中,动态连接完成。

这就是使用lib命令就能将def文件生成lib文件的原因。

1)做一个def文件
XX.def :

LIBRARY  
 xujian.dll
EXPORTS
 xujian

////////////////////////////////////////////
2)生成lib文件:
lib /def: XX.def /machine: i386 /out: XX.lib

/////////////////////////////////////////////

3)做一个试验程序:(在工程文件中加入XX.lib)

extern "C" void xujian();

void main()
{
 xujian();
}

编译连接都通过!