Handle section vs global name conflict.

This is a fix for PR26941.

When there is both a section and a global definition with the same
name, the global wins.

Section symbols are not added to the symbol table; section references
are left undefined and fixed up in the object writer unless they've
been satisfied by some other definition.

llvm-svn: 264649
This commit is contained in:
Evgeniy Stepanov
2016-03-28 20:36:28 +00:00
parent cc8ee8e3a2
commit a023f79db1
5 changed files with 164 additions and 22 deletions

View File

@@ -375,9 +375,24 @@ uint64_t ELFObjectWriter::SymbolValue(const MCSymbol &Sym,
void ELFObjectWriter::executePostLayoutBinding(MCAssembler &Asm,
const MCAsmLayout &Layout) {
// Section symbols are used as definitions for undefined symbols with matching
// names. If there are multiple sections with the same name, the first one is
// used.
for (const MCSection &Sec : Asm) {
const MCSymbol *Begin = Sec.getBeginSymbol();
if (!Begin)
continue;
const MCSymbol *Alias = Asm.getContext().lookupSymbol(Begin->getName());
if (!Alias || !Alias->isUndefined())
continue;
Renames.insert(
std::make_pair(cast<MCSymbolELF>(Alias), cast<MCSymbolELF>(Begin)));
}
// The presence of symbol versions causes undefined symbols and
// versions declared with @@@ to be renamed.
for (const MCSymbol &A : Asm.symbols()) {
const auto &Alias = cast<MCSymbolELF>(A);
// Not an alias.