[英]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.