PE绑定
“GLOBAL”和“NONE”是radare2符号表中“Bind”列的值。正如@blabb 正确描述的那样,每当您通过radare2 查看“导出”时,您都会看到"GLOBAL"分配给的值,ptr->bind并且您会看到"NONE"分配给每个导入的值。问题是,这仅与 PE 文件相关,我将很快对其进行更深入的解释。现在,让我们看一下radare2 中的实现代码。
@blabb 提到你可以很容易地在代码中发现这一点,这是真的。以下bind是 PE出口的实现方式:
if ((symbols = PE_(r_bin_pe_get_exports)(bf->o->bin_obj))) {
for (i = 0; !symbols[i].last; i++) {
if (!(ptr = R_NEW0 (RBinSymbol))) {
break;
}
ptr->name = strdup ((char *)symbols[i].name);
...
ptr->bind = r_str_const ("GLOBAL");
ptr->type = r_str_const ("FUNC");
ptr->size = 0;
...
...
您可以看到ptr->bind无条件分配为“GLOBAL”。
这就是bindPE导入的实现方式:
if ((imports = PE_(r_bin_pe_get_imports)(bf->o->bin_obj))) {
for (i = 0; !imports[i].last; i++) {
if (!(ptr = R_NEW0 (RBinSymbol))) {
break;
}
...
ptr->name = r_str_newf ("imp.%s", imports[i].name);
ptr->bind = r_str_const ("NONE");
ptr->type = r_str_const ("FUNC");
ptr->size = 0;
...
...
同样,它被无条件地分配给“NONE”。
符号绑定
符号绑定是@SYS_V 在这个令人难以置信的好答案中已经彻底回答的主题。
引用他的回答:
链接编辑器 (ld) 必须有一种方法可以在链接时确定符号的范围。换句话说,符号绑定允许链接编辑器区分仅在被链接的特定文件中可见的符号(本地范围)与可以从位于其他文件中的函数中引用的符号(全局范围)。
对于 ELF 文件,GLOBAL 绑定意味着符号在文件外部可见。LOCAL 绑定仅在文件中可见。WEAK 就像全局一样,符号可以被覆盖。
如您在此表中所见,ELF 有更多绑定值:
+------------+-------+
| Name | Value |
+------------+-------+
| STB_LOCAL | 0 |
| STB_GLOBAL | 1 |
| STB_WEAK | 2 |
| STB_LOOS | 10 |
| STB_HIOS | 12 |
| STB_LOPROC | 13 |
| STB_HIPROC | 15 |
+------------+-------+
并且radare2也在以下方面实现了它fill_symbol_bind_and_type:
switch (ELF_ST_BIND(sym->st_info)) {
case STB_LOCAL: s_bind ("LOCAL"); break;
case STB_GLOBAL: s_bind ("GLOBAL"); break;
case STB_WEAK: s_bind ("WEAK"); break;
case STB_NUM: s_bind ("NUM"); break;
case STB_LOOS: s_bind ("LOOS"); break;
case STB_HIOS: s_bind ("HIOS"); break;
case STB_LOPROC: s_bind ("LOPROC"); break;
case STB_HIPROC: s_bind ("HIPROC"); break;
default: s_bind ("UNKNOWN");
}
进一步阅读
我强烈推荐@SYS_V 的答案以获取更多信息。您还可以在此处阅读有关符号解析的更多信息,并且可以在此链接中找到有关符号可见性的更多信息。