鏈接器如何解析多重定義的全局符號(強弱符號)------深入理解計算機系統
阿新 • • 發佈:2018-12-30
定義 位置 -- csharp oid 錯誤 lin 地址 深入理解
鏈接器如何解析多重定義的全局符號(不過我在vs2015 c++ 下發現並沒有區分強弱符號,反正符號就是不能重定義。)
- 不允許有多個同名的強符號
- 如果有一個強符號和多個弱符號,那麽選擇強符號
- 如果有多個弱符號,那麽從這些弱符號中任選一個
//aa.c int x=1000;//強符號 //bb.c int a;//弱符號 所以此時選aa.c的強符號 //cc.c int c; //dd.c int c; 所以此時任選。
規則2,3可能會造成一些問題,尤其是如果重復定義的符號定義還有不同的類型時。eg x在一個模塊中定義為int,在另一個模塊中定義為double
//aa.c int y=1; int x=456; //bb.c double x;
void a()
{
x=-0.0;
x86-64/linux上,double是8個字節,int 是4個字節。所以在我們系統中,x的地址是0x601020,y的地址是0x601024。(棧頂在上,方向向低地址)。因此,bb.c中的賦值x=-0.0將用負0的雙精度浮點表示覆蓋內存中x和y的位置。
使用GCC-fno-common 標誌,在遇到多重定義的全局符號時,觸發一個錯誤。
使用-Werror 標誌。會把所有的警告變成錯誤。
鏈接器如何解析多重定義的全局符號(強弱符號)------深入理解計算機系統