解析一个符号是什么意思

What does it mean to resolve a symbol?

本文关键字:一个 符号 是什么 意思      更新时间:2023-10-16

linux的手册页。So指的是解析符号,但不解释这个概念。

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

我认为这个短语在linux和linux之外也被使用。

解析符号是什么意思?这个短语我见过很多次,但我从来没见过它的定义。

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

强制动态链接库中静态变量的初始化

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

这个术语既用于编译时的静态库链接,也用于运行时的动态库链接。

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

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

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

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

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

声明(例如在头文件中)但未实现(编译器不知道函数的作用)的函数将在库中进行处理。这就是"解析符号"的意思。"符号"是lib导出的函数的名称。每当在代码或任何导入的库中找不到函数的实现时,链接器将"解析符号失败"。