diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/tools/llvm-objcopy/Object.cpp | 24 | ||||
| -rw-r--r-- | llvm/tools/llvm-objcopy/Object.h | 15 |
2 files changed, 21 insertions, 18 deletions
diff --git a/llvm/tools/llvm-objcopy/Object.cpp b/llvm/tools/llvm-objcopy/Object.cpp index bb79e4269d4..2bd3aa16f0b 100644 --- a/llvm/tools/llvm-objcopy/Object.cpp +++ b/llvm/tools/llvm-objcopy/Object.cpp @@ -289,11 +289,14 @@ bool SectionWithStrTab::classof(const SectionBase *S) { } void SectionWithStrTab::initialize(SectionTableRef SecTable) { - setStrTab(SecTable.getSectionOfType<StringTableSection>( - Link, - "Link field value " + Twine(Link) + " in section " + Name + " is invalid", - "Link field value " + Twine(Link) + " in section " + Name + - " is not a string table")); + auto StrTab = SecTable.getSection(Link, + "Link field value " + Twine(Link) + + " in section " + Name + " is invalid"); + if (StrTab->Type != SHT_STRTAB) { + error("Link field value " + Twine(Link) + " in section " + Name + + " is not a string table"); + } + setStrTab(StrTab); } void SectionWithStrTab::finalize() { this->Link = StrTab->Index; } @@ -535,15 +538,6 @@ SectionTableRef Object<ELFT>::readSectionHeaders(const ELFFile<ELFT> &ElfFile) { initRelocations(RelSec, SymbolTable, unwrapOrError(ElfFile.relas(Shdr))); } - - if (auto Sec = dyn_cast<SectionWithStrTab>(Section.get())) { - Sec->setStrTab(SecTable.getSectionOfType<StringTableSection>( - Sec->Link, - "Link field value " + Twine(Sec->Link) + " in section " + Sec->Name + - " is invalid", - "Link field value " + Twine(Sec->Link) + " in section " + Sec->Name + - " is not a string table")); - } } return SecTable; @@ -621,7 +615,7 @@ void Object<ELFT>::writeSectionHeaders(FileOutputBuffer &Out) const { template <class ELFT> void Object<ELFT>::writeSectionData(FileOutputBuffer &Out) const { for (auto &Section : Sections) - Section->writeSection(Out); + Section->writeSection(Out); } template <class ELFT> diff --git a/llvm/tools/llvm-objcopy/Object.h b/llvm/tools/llvm-objcopy/Object.h index 3def0930a94..391465db65e 100644 --- a/llvm/tools/llvm-objcopy/Object.h +++ b/llvm/tools/llvm-objcopy/Object.h @@ -114,7 +114,14 @@ public: void writeSection(llvm::FileOutputBuffer &Out) const override; }; -// This is just a wraper around a StringTableBuilder that implements SectionBase +// There are two types of string tables that can exist, dynamic and not dynamic. +// In the dynamic case the string table is allocated. Changing a dynamic string +// table would mean altering virtual addresses and thus the memory image. So +// dynamic string tables should not have an interface to modify them or +// reconstruct them. This type lets us reconstruct a string table. To avoid +// this class being used for dynamic string tables (which has happened) the +// classof method checks that the particular instance is not allocated. This +// then agrees with the makeSection method used to construct most sections. class StringTableSection : public SectionBase { private: llvm::StringTableBuilder StrTabBuilder; @@ -129,6 +136,8 @@ public: void finalize() override; void writeSection(llvm::FileOutputBuffer &Out) const override; static bool classof(const SectionBase *S) { + if (S->Flags & llvm::ELF::SHF_ALLOC) + return false; return S->Type == llvm::ELF::SHT_STRTAB; } }; @@ -259,11 +268,11 @@ public: class SectionWithStrTab : public Section { private: - StringTableSection *StrTab = nullptr; + const SectionBase *StrTab = nullptr; public: SectionWithStrTab(llvm::ArrayRef<uint8_t> Data) : Section(Data) {} - void setStrTab(StringTableSection *StringTable) { StrTab = StringTable; } + void setStrTab(const SectionBase *StringTable) { StrTab = StringTable; } void removeSectionReferences(const SectionBase *Sec) override; void initialize(SectionTableRef SecTable) override; void finalize() override; |

