符號的定義和引用
鏈接符號的類型
鏈接符號類型舉例
目標文件中的符號表
符號表信息舉例
符號解析(Symbol Resolution)
全局符號的強、弱
鏈接器對符號的解析規則
多重定義符號的處理規則 Rule 1: 強符號不能多次定義 – 強符號只能被定義一次,否則鏈接錯誤 Rule 2: 若一個符號被定義為一次強符號和多次弱符號,則 按強定義為准 – 對弱符號的引用被解析為其強定義符號 Rule 3: 若有多個弱符號定義,則任選其中一個 – 使用命令 gcc –fno-common鏈接時,會告訴鏈接器在 遇到多個弱定義的全局符號時輸出一條警告信息。 符號解析時只能有一個確定的定義(即每個符號僅占一處存儲空間)
多重定義符號的解析舉例
多重定義全局符號的問題
盡量避免使用全局變量
• 一定需要用的話,就按以下規則使用
– 盡量使用本地變量(static)
– 全局變量要賦初值
– 外部全局變量要使用extern
多重定義全局變量會造成一些意想不到的錯誤,而且是默默發生的,編譯系統不會警告,並會在程序執行很久后才能表現出來
,且遠離錯誤引發處。特別是在一個具有幾百個模塊的大型軟件中,這類錯誤很難修正。
大部分程序員並不了解鏈接器如何工作,因而養成良好的編程習慣是非常重要的。