コンパイル時に、コンパイラは各グローバル シンボルをストロングまたはウィークとしてアセンブラにエクスポートし、アセンブラはこの情報を再配置可能オブジェクト ファイルのシンボル テーブルに暗黙的にエンコードします。関数と初期化されたグローバル変数は強いシンボルを取得します。初期化されていないグローバル変数は弱いシンボルを取得します。
この強いシンボルと弱いシンボルの概念を考慮して、Unix リンカは次の規則を使用して複数定義されたシンボルを処理します。
ルール 1:複数のストロング シンボルは許可されません。
ルール 2:強いシンボルと複数の弱いシンボルが与えられた場合、強いシンボルを選択します。
ルール 3:複数の弱いシンボルが与えられた場合、弱いシンボルのいずれかを選択します。
コード A1.c は次のとおりです。
int i=0; // Strong Symbol
void main() {}
A2.c:
int i=0; // Strong symbol
void func() {}
ルール 1により、これは許可されません。
詳細情報: http://www.geeksforgeeks.org/how-linkers-resolve-multiply-defined-global-symbols/