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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user