1. 程式人生 > >鏈接器如何解析多重定義的全局符號(強弱符號)------深入理解計算機系統

鏈接器如何解析多重定義的全局符號(強弱符號)------深入理解計算機系統

定義 位置 -- csharp oid 錯誤 lin 地址 深入理解

鏈接器如何解析多重定義的全局符號(不過我在vs2015 c++ 下發現並沒有區分強弱符號,反正符號就是不能重定義。)

  1. 不允許有多個同名的強符號
  2. 如果有一個強符號和多個弱符號,那麽選擇強符號
  3. 如果有多個弱符號,那麽從這些弱符號中任選一個
//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 標誌。會把所有的警告變成錯誤。

鏈接器如何解析多重定義的全局符號(強弱符號)------深入理解計算機系統