Index: llvm/include/llvm/Object/MutableELFObject.h =================================================================== --- llvm/include/llvm/Object/MutableELFObject.h +++ llvm/include/llvm/Object/MutableELFObject.h @@ -216,13 +216,12 @@ using MutableSymbolTable = MutableTable>; + Elf_Ehdr FileHeader; MutableTable> Sections; MutableSymbolTable Symbols; MutableSymbolTable DynSymbols; - const Elf_Ehdr &getHeader() const { - return *reinterpret_cast(this->base()); - } + const Elf_Ehdr &getHeader() const { return FileHeader; } /// Many getSection* methods in ELFObjectFile use getSection to get the /// the header associated with that section. This override returns a valid @@ -259,6 +258,7 @@ public: explicit MutableELFObject(ELFObjectFile &&B) : ELFObjectFile(std::move(B)), + FileHeader(*reinterpret_cast(this->base())), Sections(ArrayRef(reinterpret_cast( this->base() + getHeader().e_shoff), getHeader().e_shnum)), @@ -376,6 +376,8 @@ /// Removes a section. void removeSection(section_iterator Sec) { removeSection(*Sec); } + + Elf_Ehdr &getHeader() { return FileHeader; } }; template Index: llvm/unittests/Object/MutableELFObjectTest.cpp =================================================================== --- llvm/unittests/Object/MutableELFObjectTest.cpp +++ llvm/unittests/Object/MutableELFObjectTest.cpp @@ -563,3 +563,24 @@ ASSERT_THAT_EXPECTED(NameOrErr, Succeeded()); EXPECT_EQ(*NameOrErr, "newsym"); } + +TEST(MutableELFObject, UpdateHeader) { + SmallString<0> Storage; + Expected> ErrOrObj = yaml2ObjectFile(Storage, R"( +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64)"); + + ASSERT_THAT_EXPECTED(ErrOrObj, Succeeded()); + auto *ELFObjFile = dyn_cast>(ErrOrObj->get()); + ASSERT_TRUE(ELFObjFile); + MutableELFObject MutableObject(std::move(*ELFObjFile)); + + Elf_Ehdr_Impl &Header = MutableObject.getHeader(); + EXPECT_EQ(Header.e_type, ELF::ET_REL); + Header.e_type = ELF::ET_EXEC; + EXPECT_EQ(MutableObject.getHeader().e_type, ELF::ET_EXEC); +}