Index: lld/COFF/SymbolTable.cpp =================================================================== --- lld/COFF/SymbolTable.cpp +++ lld/COFF/SymbolTable.cpp @@ -591,7 +591,10 @@ s->isUsedInRegularObj = true; if (wasInserted || isa(s) || s->isLazy()) replaceSymbol(s, n, sym); - else if (!isa(s)) + else if (auto *da = dyn_cast(s)) { + if (!da->isEqual(sym)) + reportDuplicate(s, nullptr); + } else if (!isa(s)) reportDuplicate(s, nullptr); return s; } @@ -603,7 +606,10 @@ s->isUsedInRegularObj = true; if (wasInserted || isa(s) || s->isLazy()) replaceSymbol(s, n, va); - else if (!isa(s)) + else if (auto *da = dyn_cast(s)) { + if (!da->isEqual(va)) + reportDuplicate(s, nullptr); + } else if (!isa(s)) reportDuplicate(s, nullptr); return s; } Index: lld/COFF/Symbols.h =================================================================== --- lld/COFF/Symbols.h +++ lld/COFF/Symbols.h @@ -229,6 +229,14 @@ uint64_t getRVA() { return va - config->imageBase; } void setVA(uint64_t v) { va = v; } + bool isEqual(COFFSymbolRef s) const { + return va == s.getValue(); + } + + bool isEqual(uint64_t otherVa) const { + return va == otherVa; + } + // Section index relocations against absolute symbols resolve to // this 16 bit number, and it is the largest valid section index // plus one. This variable keeps it. Index: lld/test/COFF/duplicate-absolute-same.s =================================================================== --- /dev/null +++ lld/test/COFF/duplicate-absolute-same.s @@ -0,0 +1,14 @@ +// REQUIRES: x86 +// RUN: llvm-mc -triple x86_64-windows-msvc -filetype obj -o %t.obj %s +// RUN: echo -e ".globl myabsolute\nmyabsolute = 0" > %t.dupl.s +// RUN: llvm-mc -triple x86_64-windows-msvc -filetype obj -o %t.dupl.obj %t.dupl.s +// RUN: lld-link /out:%t.exe %t.obj %t.dupl.obj -subsystem:console -entry:entry 2>&1 | FileCheck --allow-empty %s + +// CHECK-NOT: error: duplicate symbol: myabsolute + +.globl myabsolute +myabsolute = 0 + +.globl entry +entry: + ret Index: lld/test/COFF/duplicate-absolute.s =================================================================== --- lld/test/COFF/duplicate-absolute.s +++ lld/test/COFF/duplicate-absolute.s @@ -1,6 +1,6 @@ // REQUIRES: x86 // RUN: llvm-mc -triple x86_64-windows-msvc -filetype obj -o %t.obj %s -// RUN: echo -e ".globl myabsolute\nmyabsolute = 0" > %t.dupl.s +// RUN: echo -e ".globl myabsolute\nmyabsolute = 1" > %t.dupl.s // RUN: llvm-mc -triple x86_64-windows-msvc -filetype obj -o %t.dupl.obj %t.dupl.s // RUN: not lld-link /out:%t.exe %t.obj %t.dupl.obj 2>&1 | FileCheck %s