链接到外部DLL如何工作?

时间:2011-03-06 22:05:24

标签: assembly linker

我真的很想了解联动机制 具体来说,我想了解dll如何链接工作。

据我了解,
 调用内部函数,实际上是由编译器转换为方法的地址 那是doSomething();(sortof)转换为jmp 00102356 我知道这已经过度简化,因为它实际上是一个call指令 但我们的想法是,IP被告知jmp的位置,因为我们知道方法的地址。

来自外部dll的方法会发生什么? 它们总是被假定在记忆中的特定固定位置,我们称之为吗?

非常感谢:)

2 个答案:

答案 0 :(得分:2)

对于DLL的调用,有一个包含DLL中所有函数地址的表。代码生成对该表的查找,然后间接调用加载函数的正确地址。函数并不总是在特定的,固定的位置在内存中;想想函数指针(这是你动态加载模块时使用的)。有关详细说明,请参阅the Wikipedia page on DLLs

答案 1 :(得分:1)

在运行时,外部DLL引用也被解析为已映射到可执行文件地址空间的绝对内存地址。

可执行文件包含所需DLL文件的列表,这些文件被加载或映射到内存中,并且机器语言中的所有“调用”引用都被修改为任何导出的“dllexport”函数的正确地址。

共享DLL仅被加载到物理内存中一次,但此代码在逻辑上映射到使用它们的任何exe的地址空间。

当所有内容都被加载后,它看起来就像CPU的单片机器语言程序。

或者,程序员可以使用LoadLibrary Windows API函数在运行时将DLL加载到程序的地址空间中,GetProcAddress API函数返回物理地址,该地址可用于通过函数指针变量调用DLL函数。 / p>