2014-11-04 34 views
0

我知道这些问题之前已经被问到 - 但我仍然无法将所有内容协调到一个整体画面。链接,加载和虚拟内存

  1. 静态VS动态库
    • 静态库有自己的代码复制并链接到生成的可执行文件
    • 静态库只复制所需的模块链接到可执行文件,而不是整个库实现
    • 静态库不需要编译为PIC,因为它们是生成的可执行文件的一部分
    • 动态库在描述h的存根中复制和链接负载/链接(?)运行时的功能实现
    • 动态库可以是PIC或可重定位的
    • 为什么存在单独的静态和动态库?以上所有内容似乎都是静态或动态链接器的工作。为什么我需要2个实现scanf的库?
    • 奖金#1共享库是指什么?我听说它被用作(1)总括术语,与库的同义词,(2)直接用于动态库,(3)使用虚拟内存将库的相同物理内存映射到多个地址空间。你只能用动态库来做到这一点吗? (4)在内存中具有相同动态库的不同版本。
    • (奖金#2)是默认情况下动态或静态链接的标准库(libc,libC++,stdlibC++,..)吗?我从来不需要dlopen() ..
  2. 静态VS动态链接
    • 这怎么比静态VS动态库有什么不同?我不明白为什么不只有一个库,我们使用静态或动态链接器(PIC问题除外)。我们是否应该讨论更一般的静态动态链接,而不是谈论静态库和动态库?
    • 是仍然在编译时为两者执行的符号分辨率?
  3. 静态VS动态加载
    • 静态加载装置执行它之前复制完整的可执行到MM
    • 动态加载意味着仅可执行标头执行前复制到MM,附加功能被装入MM请求时。这与分页有什么不同?
    • 如果可执行文件是动态链接的,为什么不能动态加载?
    • 静态负载和动态加载可能会或可能不会进行拆迁

我知道有很多事情我感到困惑在这里 - 我没有必要找人来解决每个问题。我希望通过列出所有令我困惑的事情,理解这一点的人会看到我理解中的失误在广泛的层面上,并且能够描绘出这些事物如何协作的更大的图片。

+0

如果在Linux上,请阅读[Drepper的论文:*如何编写共享库*](http://people.redhat.com/drepper/dsohowto.pdf)。这是一篇很长的论文,但它回答了你的大部分问题。 – 2014-11-04 20:45:32

+0

@BasileStarynkevitch谢谢你的论文 - 我会读它!操作系统的概念差异很大吗? – user167524 2014-11-04 20:48:32

+0

另请参见[Levine的书:*链接器和加载器*](http://www.iecc.com/linker/) – 2014-11-04 20:49:12

回答

2

为什么2种LIB加载的

  • 动态节省空间(你不使用foo.lib有数以百计的所有二进制文件相同的代码拷贝
  • 动态允许foo.lib供应商可以出货的新版本库和现有代码利用它
  • 静态使依赖管理更容易 - 在t heory二进制可以是一个文件

什么是 '共享库'

  • UNIX名称为动态库。 Windows调用DLL它

是否标准库静态或动态

  • 取决于平台。在某些情况下,您可以选择其他人为您选择。例如在windwos上有编译器开关来说明你是否想要静态或动态运行时。不是不混淆使用dlopen动态库的使用 - 见后面

“为什么我们谈论2不同类型库的”

通常为静态库是从一个动态的一个不同的格式。通常,一个静态库就像任何其他编译单元一样被输入到链接器。动态库通常由链接器输出。它们被用于不同的,即使他们都提供相同的代码块到您的应用

符号解析在加载时敲定的DLL

全动态加载。这是dlopen的境界。这是您想要调用库中的入口点的地方,这些入口点在编译时可能甚至不存在。使用案例:

  • 插件符合众所周知的接口,但可以有许多实现(PAM和NSS是很好的例子)。应用程序选择在运行时从指定文件加载一个或多个实现

  • 应用程序需要加载库并调用任意函数。想象一下,例如,一个脚本语言如何加载并调用任意方法

要使用你不需要使用的dlopen在UNIX上一个.so。你可以为它加载(相同的窗口)。要真正动态加载共享lib/dll,您需要dlopen或LoadLibrary

0

请注意,静态链接库的加载速度更快,因为所有运行时库文件的磁盘搜索量都较少。如果这些库很小,并且非常不寻常,那么最好是静态链接。如果有像MFC这样严重的版本依赖/功能差异,这些DLL需要不同的名称。

+1

我不确定这一点,至少在Linux上。 Linux上常用的共享库(例如'libc.so.6'或'libX11.so.6')已经在RAM中进行了mmap编辑。如果它是静态链接的,则需要从每个可执行文件获取并从中获取它。 – 2014-11-05 01:47:03