【问题标题】:How does linking to external DLL work?链接到外部 DLL 是如何工作的?
【发布时间】:2011-03-06 22:05:23
【问题描述】:

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

据我了解,
调用内部函数,实际上是由编译器转换为方法的地址。
doSomething(); 被(排序)转换为jmp 00102356
我知道这过于简化了,因为它实际上是一个 call 指令。
但想法是,IP 被告知去哪里jmp,因为我们知道该方法的地址。

外部 dll 中的方法会发生什么情况?
是否总是假定它们位于内存中特定的固定位置,我们称之为?

非常感谢:)

【问题讨论】:

  • 您想要通用答案还是特定于 Windows 的答案?

标签: assembly linker


【解决方案1】:

对于 DLL 的调用,有一个 DLL 中所有函数地址的表。该代码生成对该表的查找,然后间接调用已加载函数的正确地址。函数并不总是在内存中特定的、固定的位置;想想函数指针(动态加载模块时使用的指针)。更多解释请参见the Wikipedia page on DLLs

【讨论】:

  • 更不用说 Portable Executable 上的页面了。
【解决方案2】:

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

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

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

当一切都加载完毕后,它在 CPU 看来就像一个单一的机器语言程序。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多