| Index: src/IceELFSection.h
|
| diff --git a/src/IceELFSection.h b/src/IceELFSection.h
|
| index 0bfccca650a78b488bee7ce427e4a1a0a18d83e8..c2ef9bf4d3be82eca5f5a912043137f81a3a49b5 100644
|
| --- a/src/IceELFSection.h
|
| +++ b/src/IceELFSection.h
|
| @@ -163,7 +163,11 @@ class ELFSymbolTableSection : public ELFSection {
|
| ELFSymbolTableSection &operator=(const ELFSymbolTableSection &) = delete;
|
|
|
| public:
|
| - using ELFSection::ELFSection;
|
| + ELFSymbolTableSection(const IceString &Name, Elf64_Word ShType,
|
| + Elf64_Xword ShFlags, Elf64_Xword ShAddralign,
|
| + Elf64_Xword ShEntsize)
|
| + : ELFSection(Name, ShType, ShFlags, ShAddralign, ShEntsize),
|
| + NullSymbol(nullptr) {}
|
|
|
| // Create initial entry for a symbol when it is defined.
|
| // Each entry should only be defined once.
|
| @@ -179,6 +183,9 @@ public:
|
|
|
| const ELFSym *findSymbol(const IceString &Name) const;
|
|
|
| + void createNullSymbol(ELFSection *NullSection);
|
| + const ELFSym *getNullSymbol() const { return NullSymbol; }
|
| +
|
| size_t getSectionDataSize() const {
|
| return (LocalSymbols.size() + GlobalSymbols.size()) * Header.sh_entsize;
|
| }
|
| @@ -198,6 +205,7 @@ private:
|
| template <bool IsELF64>
|
| void writeSymbolMap(ELFStreamer &Str, const SymMap &Map);
|
|
|
| + const ELFSym *NullSymbol;
|
| // Keep Local and Global symbols separate, since the sh_info needs to
|
| // know the index of the last LOCAL.
|
| SymMap LocalSymbols;
|
| @@ -211,7 +219,11 @@ class ELFRelocationSection : public ELFSection {
|
| ELFRelocationSection &operator=(const ELFRelocationSection &) = delete;
|
|
|
| public:
|
| - using ELFSection::ELFSection;
|
| + ELFRelocationSection(const IceString &Name, Elf64_Word ShType,
|
| + Elf64_Xword ShFlags, Elf64_Xword ShAddralign,
|
| + Elf64_Xword ShEntsize)
|
| + : ELFSection(Name, ShType, ShFlags, ShAddralign, ShEntsize),
|
| + RelatedSection(nullptr) {}
|
|
|
| const ELFSection *getRelatedSection() const { return RelatedSection; }
|
| void setRelatedSection(const ELFSection *Section) {
|
| @@ -340,7 +352,11 @@ template <bool IsELF64>
|
| void ELFRelocationSection::writeData(const GlobalContext &Ctx, ELFStreamer &Str,
|
| const ELFSymbolTableSection *SymTab) {
|
| for (const AssemblerFixup &Fixup : Fixups) {
|
| - const ELFSym *Symbol = SymTab->findSymbol(Fixup.symbol(&Ctx));
|
| + const ELFSym *Symbol;
|
| + if (Fixup.isNullSymbol())
|
| + Symbol = SymTab->getNullSymbol();
|
| + else
|
| + Symbol = SymTab->findSymbol(Fixup.symbol(&Ctx));
|
| if (!Symbol)
|
| llvm::report_fatal_error("Missing symbol mentioned in reloc");
|
|
|
|
|