【问题标题】:Architecturally what is the difference between a shared object (SO) and a dynamic link library (DLL)?在架构上,共享对象 (SO) 和动态链接库 (DLL) 有什么区别?
【发布时间】: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


【解决方案1】:

Dll 与 .so 或 .dylib (MacOS) 文件使用的机制几乎相同,因此很难准确解释它们之间的区别。

核心区别在于每种类型的文件默认可见的内容。 .so 文件导出语言 (gcc) 级链接 - 这意味着(默认情况下)所有“外部”的 C 和 c++ 符号在 .so 被拉入时都可用于链接。 这也意味着,由于解析 .so 文件本质上是一个链接步骤,加载程序并不关心符号来自哪个 .so 文件。它只是按照 .a 文件遵循的通常链接步骤规则以某种顺序搜索指定的 .so 文件。

另一方面,Dll 文件是操作系统功能,完全独立于语言的链接步骤。 MSVC 使用 .lib 文件来链接静态库和动态库(每个 dll 文件生成一个用于链接的配对 .lib 文件),因此生成的程序在构建后是完全“链接”的(从以语言为中心的角度来看) .

然而,在链接阶段,符号在代表 Dll 的 lib 中被解析,允许链接器在 PE 文件中构建导入表,其中包含显式的 dll 列表和每个 dll 中引用的入口点。在加载时,Windows 不必执行“链接”来解析共享库中的符号:该步骤已经完成 - Windows 加载程序只需加载 dll 并直接连接函数。

【讨论】:

  • 我明白了,我认为这是有道理的。我会把这个问题留一两天,看看它是否会吸引更详细的答案,但我想我可以从中理解。再次感谢。
  • 但是Windows上不可能有多个可互换的DLL(即相同的接口,不同的实现)吗?如果 DLL 中符号的位置被烘焙到可执行文件中,那么两个 DLL 如何在没有这些符号位于同一位置的情况下具有相同的接口?还是他们在同一个位置?或者,这种功能是否只有 loadLibrary 等才能实现?
  • @cheshirekow:对于静态链接的 DLL(由包含库解析的那些),地址已固定 => 替换 DLL 必须为每个导出的函数具有相同的地址。对于动态加载的 DLL(例如 LoadLibraryCOM、...)GetProcAdress() 在运行时解析地址 => 手动!
猜你喜欢
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
相关资源
最近更新 更多