我真的很想了解联动机制 具体来说,我想了解dll如何链接工作。
据我了解,
调用内部函数,实际上是由编译器转换为方法的地址
那是doSomething();
(sortof)转换为jmp 00102356
我知道这已经过度简化,因为它实际上是一个call
指令
但我们的想法是,IP
被告知jmp
的位置,因为我们知道方法的地址。
来自外部dll的方法会发生什么? 它们总是被假定在记忆中的特定固定位置,我们称之为吗?
非常感谢:)
答案 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>