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

发布于 2024-10-20 17:21:29 字数 353 浏览 2 评论 0原文

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

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

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

非常感谢:)

I'm really interested in understanding the linkage mechanizm.
Specifically I wish to understand how does dll linking work.

As I understand it,
calling internal function, is actually converted by the compiler to the method's address.
That is doSomething(); is (sortof) converted to jmp 00102356.
I know this is over simplifying, since it's actually a call instruction.
But the idea is, that the IP is told where to jmp, because we know the method's address.

What happens with methods from external dlls?
Are they always assumed to lie in a specific fixed place in memory, to which we call?

Many thanks :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

◇流星雨 2024-10-27 17:21:29

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

For a call into a DLL, there is a table of all addresses of functions in the DLL. The code generates a lookup into that table, then an indirect call to the correct address of the loaded function. Functions are not always at specific, fixed places in memory; think of function pointers (which is what you use when loading modules dynamically). See the Wikipedia page on DLLs for much more explanation.

蹲墙角沉默 2024-10-27 17:21:29

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

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

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

当所有内容都加载完毕后,对于 CPU 来说,它看起来就像是一个单一的机器语言程序。

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

At run-time, external DLL references are also resolved to absolute memory addresses that have been mapped into the executable's address space.

The executable file contains a list of required DLL files and these are loaded or mapped into memory and all the 'call' references in machine language are modified to the correct address for any exported 'dllexport' functions.

Shared DLL's are only loaded once into physical memory, but this code is logically mapped into the address space of any exe that is using them.

When everything's loaded, it looks like one monolithic machine language program to the CPU.

Alternatively, a programmer can use the LoadLibrary Windows API function to load a DLL into the program's address space at runtime and the GetProcAddress API function returns the physical address, which can be used to call DLL functions through a function pointer variable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文