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特定答案?更不用说可移植可执行文件上的页面了。更不用说可移植可执行文件上的页面了。