gpt4 book ai didi

c - ELF 的符号解析

转载 作者:行者123 更新时间:2023-11-30 15:06:01 25 4
gpt4 key购买 nike

我有一个关于 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 关键字为文件范围变量和函数提供静态链接,并且可以在一个文件中拥有具有静态链接的函数和具有相同名称的变量另一个文件中的静态链接。这减少了大型程序中发生冲突的可能性。

关于c - ELF 的符号解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39442263/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com