【发布时间】:2011-09-09 05:16:20
【问题描述】:
问题几乎就在标题中:就操作系统级别的实现而言,共享对象和 dll 有何不同?
我之所以问这个是因为我最近阅读了this page on extends Python,其中指出:
Unix 和 Windows 使用完全不同的范例来运行时加载代码。在尝试构建可以动态加载的模块之前,请了解您的系统是如何工作的。
在 Unix 中,共享对象 (.so) 文件包含程序要使用的代码,以及它希望在程序中找到的函数和数据的名称。当文件加入程序时,文件代码中对这些函数和数据的所有引用都会更改为指向程序中函数和数据在内存中放置的实际位置。这基本上是一个链接操作。
在 Windows 中,动态链接库 (.dll) 文件没有悬空引用。相反,对函数或数据的访问是通过查找表进行的。因此 DLL 代码不必在运行时固定以引用程序的内存;相反,代码已经使用了 DLL 的查找表,并且查找表在运行时被修改以指向函数和数据。
谁能详细说明一下?具体来说,我不确定我是否理解包含对他们期望找到的内容的引用的共享对象的描述。同样,对我来说,DLL 听起来几乎是相同的机制。
这是对正在发生的事情的完整解释吗?有更好的吗?实际上有什么区别吗?
我知道如何链接到 DLL 或共享对象以及一些用于编写 DLL 的机制(.def 列表、dllexport/dllimport),因此我明确地不寻找这些领域的方法;我对后台发生的事情更感兴趣。
(编辑:另一个明显的观点 - 我知道它们在不同的平台上工作,使用不同的文件类型(ELF 与 PE),与 ABI 不兼容等......)
【问题讨论】:
-
DLL 已关闭,其所有符号均已解析(链接器知道在哪里可以找到它们)。
-
这听起来很奇怪。 DLL 有悬空引用,当然有。它们需要由加载器解决。
-
抱歉,评论发错了,无法编辑。当然,一个 DLL 可以有悬空引用,但 DLL 知道每个指向的位置(指向哪个特定的其他 DLL)。而对于 .so,悬空引用由具有该名称的第一个符号解析,无论它在哪里找到。如果它恰好在可执行文件本身而不是任何其他 .so 中,那也没关系。
标签: windows linux dll operating-system shared-libraries