gpt4 book ai didi

c - 链接、加载和虚拟内存

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:44 27 4
gpt4 key购买 nike

我知道以前有人问过这些问题 - 但我仍然无法将所有内容协调成一个整体。

  1. 静态库与动态库
    • 静态库将它们的代码复制并链接到生成的可执行文件中
    • 静态库只将所需的模块复制并链接到可执行文件中,而不是整个库实现
    • 静态库不需要编译为 PIC,因为它们是生成的可执行文件的一部分
    • 动态库在描述如何在运行时加载/链接(?)函数实现的 stub 中复制和链接
    • 动态库可以是 PIC 或可重定位的
    • 为什么有单独的静态库和动态库?以上所有内容似乎都是静态或动态链接器的工作。为什么我需要 2 个实现 scanf 的库?
    • (bonus #1)共享库指的是什么?我听说它被用作 (1) 总括性术语,与库同义,(2) 直接指向动态库,(3) 使用虚拟内存将库的相同物理内存映射到多个地址空间。你能只用动态库来做到这一点吗? (4) 内存中存在同一个动态库的不同版本。
    • (bonus #2) 默认情况下,标准库(libc、libc++、stdlibc++、..)是动态链接还是静态链接?我永远不需要 dlopen()..
  2. 静态与动态链接
    • 这与静态库和动态库有何不同?我不明白为什么不只有 1 个库,而且我们使用静态或动态链接器(PIC 问题除外)。我们是否应该讨论更一般的静态和动态链接,而不是讨论静态库与动态库?
    • 两者的符号解析是否仍在编译时执行?
  3. 静态加载与动态加载
    • 静态加载是指在执行之前将完整的可执行文件复制到 MM 中
    • 动态加载意味着只有可执行文件头在执行前复制到 MM 中,其他功能在请求时加载到 MM 中。这与分页有何不同?
    • 如果可执行文件是动态链接的,为什么不能动态加载它?
    • 静态加载和动态加载都可能执行也可能不执行重定位

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

最佳答案

为什么要加载两种类型的库

  • 动态节省空间(您不会在所有使用 foo.lib 的二进制文件中拥有数百个相同代码的副本
  • 动态允许 foo.lib 供应商发布新版本的库,现有代码可以利用它
  • static 使依赖管理更容易——理论上一个二进制文件可以是一个文件

什么是“共享库”

  • 动态库的 unix 名称。 Windows 称之为 DLL

标准库是静态的还是动态的

  • 取决于平台。在某些上,您可以选择为您选择的其他人。例如,在 windwos 上有编译器开关来说明您是想要静态运行时还是动态运行时。不要将动态库的使用与 dlopen 混淆 - 稍后查看

“为什么我们谈论两种不同类型的图书馆”

通常静态库的格式与动态库不同。通常,静态库就像任何其他编译单元一样输入到链接器。动态库通常由链接器输出。尽管它们都向您的应用程序提供相同的代码块,但它们的使用方式不同

符号解析在加载 DLL 时完成

完全动态加载。这就是dlopen的境界。这是您要在编译时可能不存在的库中调用入口点的地方。用例:

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

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

要在 unix 上使用 .so,您不需要使用 dlopen。您可以为您加载它(在 Windows 上相同)。要真正动态加载共享库/dll,您需要 dlopen 或 LoadLibrary

关于c - 链接、加载和虚拟内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26744514/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com