: (*(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>(
(uint8_t *)sectionContents.data() + (*si)->st_value, contentSize);
_definedAtoms._atoms.push_back(newAtom);
_symbolToAtomMapping.insert(std::make_pair((*si), newAtom));
+ if (anonAtom)
+ _definedAtoms._atoms.push_back(anonAtom);
}
}
ELF-i386: - name: weak_func
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: 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: scope: hidden
ELF-hexagon: - name: weak_func
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: 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: scope: hidden