Assembly 链接到外部DLL是如何工作的?

Assembly 链接到外部DLL是如何工作的?,assembly,linker,Assembly,Linker,我真的很想了解连杆机构。 我特别想了解dll链接是如何工作的 据我所知, 调用内部函数,实际上由编译器转换为方法的地址。 即doSomething()被(sortof)转换为jmp 00102356 我知道这过于简化了,因为它实际上是一个调用指令。 但是想法是,IP被告知在哪里jmp,因为我们知道方法的地址 来自外部DLL的方法会发生什么情况? 它们是否总是被假定在记忆中某个特定的固定位置,我们称之为 非常感谢:)对于对DLL的调用,DLL中有一个包含所有函数地址的表。代码生成对该表的查找,然后

我真的很想了解连杆机构。
我特别想了解dll链接是如何工作的

据我所知,
调用内部函数,实际上由编译器转换为方法的地址。
doSomething()被(sortof)转换为
jmp 00102356

我知道这过于简化了,因为它实际上是一个
调用
指令。
但是想法是,
IP
被告知在哪里
jmp
,因为我们知道方法的地址

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


非常感谢:)

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

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

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

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

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

当所有的东西都被加载时,它看起来就像一个单一的机器语言程序


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

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

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

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

当所有的东西都被加载时,它看起来就像一个单一的机器语言程序


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

您想要通用答案还是Windows特定答案?您想要通用答案还是Windows特定答案?更不用说可移植可执行文件上的页面了。更不用说可移植可执行文件上的页面了。