【问题标题】:What does it mean to resolve a symbol? [duplicate]解析符号是什么意思? [复制]
【发布时间】:2014-07-27 04:19:57
【问题描述】:

ld-linux.so 的手册页提到了解析符号,但没有解释这个概念。

http://man7.org/linux/man-pages/man8/ld.so.8.html

我认为有问题的短语也在 ld 和 linux 之外使用。

解析符号是什么意思?我经常看到这个短语,但我从未见过定义。

导致这个问题的原因是,我确定解析变量的符号是否会保证变量的构造,或者解析符号是否只是说明变量的存在。这个问题与这个有关:

Force Eager Initialization of Static Variables in Dynamically Linked Libs

【问题讨论】:

  • @Mat 我想将问题重新集中在更具体的问题上,“符号解析是否保证构造?”。由于此问题已正确标记为 dup,我应该编辑此问题还是打开一个新问题?
  • 符号解析不能“保证构造”,你的水平不对。动态或静态链接中的符号解析仅将事物(函数/数据)映射到实际地址,以便程序可以运行。保证构建与否的是您的语言,而不是链接器本身。

标签: c++ ld dynamic-linking


【解决方案1】:

这意味着将“未定义”符号的用法(例如,一段代码调用共享库中的函数的点)与实际符号的位置(例如,共享库文件中的实际函数代码)匹配),根据需要加载库。

该术语用于在编译时链接静态库和在运行时链接动态库。

在 C++ 中,如果共享库尚未加载,则解析共享库中变量的符号应该构造该库中的所有内容。

【讨论】:

    【解决方案2】:

    较大的程序由单独编译的模块组成。您可能会决定将数据库内容放在一个模块中,将打印放在另一个模块中,并将用户界面放在另一个模块中。第一步将每个模块编译成所谓的目标文件。一种中间步骤。

    最后一步是将所有这些对象“链接”在一起,链接器可能会得出这样的结论:一个对象中的符号试图访问另一个对象中的值或函数并发现它不存在.在这种情况下,链接器无法“解析”引用。

    解析的实际“动作”是计算链接器必须放入一个模块中的地址,以便它可以正确访问另一个模块中的某些内容。

    请注意,这通常是在 C、C++ 等编译语言中以及在链接时出现的问题。它出现在最后一个实例中,在所有模块都已转换为对象之后。

    【讨论】:

      【解决方案3】:

      已声明(例如在头文件中)但未实现(编译器不知道该函数的作用)的函数将在库中进行处理。这就是“解析符号”的意思。 “符号”是库导出的函数的名称。只要在代码或任何导入的库中找不到函数的实现,链接器就会“无法解析符号”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-13
        • 2013-01-26
        • 1970-01-01
        • 2012-11-03
        • 2016-10-10
        • 2011-02-27
        • 2014-12-06
        • 2018-01-28
        相关资源
        最近更新 更多