什么是符号解析?(What is Symbol Resolution?)

2019-06-26 15:56发布

这似乎是那些有关,但没有一个定义了每个谈判......我似乎无法找到关于此主题的任何信息的事情之一。 什么是符号解析? 这是我发现的最好的事情: http://docs.oracle.com/cd/E23824_01/html/819-0690/chapter2-90421.html#chapter2-93321

是否有一些与你的计划是如何编制?

Answer 1:

好了,现在你提到Unix的纳米,我可以精确的符号解析。

可执行文件可以参考其本身并不里面定义的实体。 例如,变量或共享库的程序。 这些实体被外部符号标识。 可执行还不如可通过外部文件中引用内部的符号 - 这是图书馆的过程中的情况。

符号解析,在此背景下,一旦某个程序被加载到内存中,它指的是所有的外部实体分配正确的地址。 这意味着改变在外部符号的引用被做了加载的程序的每个位置。

这些地址将依赖于其中,在存储器中,与外部的符号的代码已被加载。

在Unix上,程序的默认编译模式是使用共享库的系统,而不是预先链接的可执行文件所需的一切。 当编译的程序与gcc ,例如,你通过-static标志,如果你希望它被静态编译,而不是有未解决的符号引用。

查一查“共享库”获取更多信息。



Answer 2:

我不知道你的意思上下文符号解析,但它用于共享库的运行时符号解析让我想起的dlopen(3)和dlsym(3)。



Answer 3:

如前所述,它可以指运行时或链接时符号解析。 然而,你不应该忘记编译时符号解析

这是一个语言使用到的符号映射到“物联网”的规则。 符号是公正的东西,看起来像一个名称(本地,成员和全局变量,函数,方法,类型等)和“东西”是什么样的名称指的是编译器的理解。

这样做的规则可以非常简单(例如,IIRC用C,它比地方的有序列表的详细一点看)或复杂的(C ++有各种情况下具有过载,模板和诸如此类的东西)。 一般情况下,这些规则与程序的语义交互,有时甚至会导致(潜在的)模糊性:

C ++:

int First(int i) { return i; }
float First(float f) { return f; }

void Second(int (*fn)(int)) { printf("int"); }
void Second(float (*fn)(float); { printf("float"); }

...

Second(&First); // What will be printed?


文章来源: What is Symbol Resolution?