[LLD] [COFF] Don't error out on duplicate absolute symbols with the same value

Both MS link.exe and GNU ld.bfd handle it this way; one can have
multiple object files defining the same absolute symbols, as long
as it defines it to the same value. But if there are multiple absolute
symbols with differing values, it is treated as an error.

Differential Revision: https://reviews.llvm.org/D71981
This commit is contained in:
Martin Storsjö 2019-12-30 00:32:22 +02:00
parent 2306f43ccb
commit 1737cc750c
4 changed files with 31 additions and 3 deletions

View File

@ -591,7 +591,10 @@ Symbol *SymbolTable::addAbsolute(StringRef n, COFFSymbolRef sym) {
s->isUsedInRegularObj = true;
if (wasInserted || isa<Undefined>(s) || s->isLazy())
replaceSymbol<DefinedAbsolute>(s, n, sym);
else if (!isa<DefinedCOFF>(s))
else if (auto *da = dyn_cast<DefinedAbsolute>(s)) {
if (!da->isEqual(sym))
reportDuplicate(s, nullptr);
} else if (!isa<DefinedCOFF>(s))
reportDuplicate(s, nullptr);
return s;
}
@ -603,7 +606,10 @@ Symbol *SymbolTable::addAbsolute(StringRef n, uint64_t va) {
s->isUsedInRegularObj = true;
if (wasInserted || isa<Undefined>(s) || s->isLazy())
replaceSymbol<DefinedAbsolute>(s, n, va);
else if (!isa<DefinedCOFF>(s))
else if (auto *da = dyn_cast<DefinedAbsolute>(s)) {
if (!da->isEqual(va))
reportDuplicate(s, nullptr);
} else if (!isa<DefinedCOFF>(s))
reportDuplicate(s, nullptr);
return s;
}

View File

@ -229,6 +229,14 @@ public:
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.

View File

@ -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

View File

@ -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