forked from OSchip/llvm-project
[ELF] Never allocate content to weak symbols as they may be merged away.
This is done by creating a new non-weak anonymous symbol and creating an atom with content for that symbol. This is added after the weak symbol so that they have the same address. llvm-svn: 172553
This commit is contained in:
parent
842885e06e
commit
8b3898af26
|
@ -215,6 +215,22 @@ public:
|
||||||
: (*(si + 1))->st_value - (*si)->st_value;
|
: (*(si + 1))->st_value - (*si)->st_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Don't allocate content to a weak symbol, as they may be merged away.
|
||||||
|
// Create an anonymous atom to hold the data.
|
||||||
|
ELFDefinedAtom<ELFT> *anonAtom = nullptr;
|
||||||
|
if ((*si)->getBinding() == llvm::ELF::STB_WEAK && contentSize != 0) {
|
||||||
|
// Create a new non-weak ELF symbol.
|
||||||
|
auto sym = new (_readerStorage.Allocate<Elf_Sym>()) Elf_Sym;
|
||||||
|
*sym = **si;
|
||||||
|
sym->setBinding(llvm::ELF::STB_GLOBAL);
|
||||||
|
anonAtom = createDefinedAtomAndAssignRelocations(
|
||||||
|
"", sectionName, sym, i.first,
|
||||||
|
ArrayRef<uint8_t>(
|
||||||
|
(uint8_t *)sectionContents.data() + (*si)->st_value, contentSize));
|
||||||
|
contentSize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
ArrayRef<uint8_t> symbolData = ArrayRef<uint8_t>(
|
ArrayRef<uint8_t> symbolData = ArrayRef<uint8_t>(
|
||||||
(uint8_t *)sectionContents.data() + (*si)->st_value, contentSize);
|
(uint8_t *)sectionContents.data() + (*si)->st_value, contentSize);
|
||||||
|
|
||||||
|
@ -223,6 +239,8 @@ public:
|
||||||
|
|
||||||
_definedAtoms._atoms.push_back(newAtom);
|
_definedAtoms._atoms.push_back(newAtom);
|
||||||
_symbolToAtomMapping.insert(std::make_pair((*si), newAtom));
|
_symbolToAtomMapping.insert(std::make_pair((*si), newAtom));
|
||||||
|
if (anonAtom)
|
||||||
|
_definedAtoms._atoms.push_back(anonAtom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,9 +13,9 @@ ELF-i386: 00, E8, FC, FF, FF, FF, C9, C3 ]
|
||||||
|
|
||||||
ELF-i386: - name: weak_func
|
ELF-i386: - name: weak_func
|
||||||
ELF-i386: scope: global
|
ELF-i386: scope: global
|
||||||
ELF-i386: content: [ 55, 89, E5, 83, EC, 18, C7, 04, 24, 0E, 00, 00,
|
|
||||||
ELF-i386: 00, E8, FC, FF, FF, FF, C9, C3 ]
|
|
||||||
ELF-i386: merge: as-weak
|
ELF-i386: merge: as-weak
|
||||||
|
ELF-i386: content: [ 55, 89, E5, 83, EC, 18, C7, 04, 24, 0E, 00, 00,
|
||||||
|
ELF-i386: 00, E8, FC, FF, FF, FF, C9, C3 ]
|
||||||
|
|
||||||
ELF-i386: - name: hidden_func
|
ELF-i386: - name: hidden_func
|
||||||
ELF-i386: scope: hidden
|
ELF-i386: scope: hidden
|
||||||
|
@ -65,9 +65,9 @@ ELF-hexagon: 00, C0, 00, 5A, 1E, C0, 1E, 96 ]
|
||||||
|
|
||||||
ELF-hexagon: - name: weak_func
|
ELF-hexagon: - name: weak_func
|
||||||
ELF-hexagon: scope: global
|
ELF-hexagon: scope: global
|
||||||
ELF-hexagon: content: [ 00, C0, 9D, A0, 00, 40, 00, 00, 00, C0, 00, 78,
|
|
||||||
ELF-hexagon: 00, C0, 00, 5A, 1E, C0, 1E, 96 ]
|
|
||||||
ELF-hexagon: merge: as-weak
|
ELF-hexagon: merge: as-weak
|
||||||
|
ELF-hexagon: content: [ 00, C0, 9D, A0, 00, 40, 00, 00, 00, C0, 00, 78,
|
||||||
|
ELF-hexagon: 00, C0, 00, 5A, 1E, C0, 1E, 96 ]
|
||||||
|
|
||||||
ELF-hexagon: - name: hidden_func
|
ELF-hexagon: - name: hidden_func
|
||||||
ELF-hexagon: scope: hidden
|
ELF-hexagon: scope: hidden
|
||||||
|
|
Loading…
Reference in New Issue