diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp --- a/lld/COFF/SymbolTable.cpp +++ b/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; } diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h --- a/lld/COFF/Symbols.h +++ b/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. diff --git a/lld/test/COFF/duplicate-absolute.s b/lld/test/COFF/duplicate-absolute-same.s copy from lld/test/COFF/duplicate-absolute.s copy to lld/test/COFF/duplicate-absolute-same.s --- a/lld/test/COFF/duplicate-absolute.s +++ b/lld/test/COFF/duplicate-absolute-same.s @@ -2,9 +2,9 @@ // 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: not lld-link /out:%t.exe %t.obj %t.dupl.obj 2>&1 | FileCheck %s +// RUN: lld-link /out:%t.exe %t.obj %t.dupl.obj -subsystem:console -entry:entry 2>&1 | FileCheck --allow-empty %s -// CHECK: error: duplicate symbol: myabsolute +// CHECK-NOT: error: duplicate symbol: myabsolute .globl myabsolute myabsolute = 0 diff --git a/lld/test/COFF/duplicate-absolute.s b/lld/test/COFF/duplicate-absolute.s --- a/lld/test/COFF/duplicate-absolute.s +++ b/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