[英]Symbol Resolution for ELF
我对C链接中的符号解析(尤其是elf格式)有疑问。
假设我有两个模块,分为两个单独的文件module1.c和module2.c:
// module1.c
int main() {
return 0;
}
==========================
// module2.c
int main = 3;
int p2() {
return 0;
}
将这两个编译在一起会给我一个链接器错误,因为两个模块中的main都有重复的符号。 我的问题是,链接器为什么不解释一个是函数而一个是变量的事实呢? 该信息肯定存在于两个符号表中:
Symbol table '.symtab' contains 9 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS a.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 2
4: 0000000000000000 0 SECTION LOCAL DEFAULT 3
5: 0000000000000000 0 SECTION LOCAL DEFAULT 5
6: 0000000000000000 0 SECTION LOCAL DEFAULT 6
7: 0000000000000000 0 SECTION LOCAL DEFAULT 4
8: 0000000000000000 11 FUNC GLOBAL DEFAULT 1 main
No version information found in this file.
===================================================================
Symbol table '.symtab' contains 10 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS b.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 2
4: 0000000000000000 0 SECTION LOCAL DEFAULT 3
5: 0000000000000000 0 SECTION LOCAL DEFAULT 5
6: 0000000000000000 0 SECTION LOCAL DEFAULT 6
7: 0000000000000000 0 SECTION LOCAL DEFAULT 4
8: 0000000000000000 4 OBJECT GLOBAL DEFAULT 2 main
9: 0000000000000000 11 FUNC GLOBAL DEFAULT 1 p2
您可以清楚地看到一个是对象,另一个是函数。 我的问题是,是否有任何特定原因导致链接程序不旨在在函数和变量之间进行区分? 这是否意味着在一个由许多模块组成的庞大程序中,您永远无法声明一个与函数同名的全局变量?
这只是C语言的一个规则:函数和对象没有不同的命名空间。
所以是的-您不能同时具有外部链接和相同名称的函数和变量。
请注意,您可以使用static
关键字为文件作用域变量和函数提供静态链接,并且可以在一个文件中具有带有静态链接的函数,而在另一个文件中具有具有静态链接的同名变量。 这减少了大型程序中发生冲突的可能性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.