diff --git a/llvm/include/llvm/Object/ELFObjectFile.h b/llvm/include/llvm/Object/ELFObjectFile.h --- a/llvm/include/llvm/Object/ELFObjectFile.h +++ b/llvm/include/llvm/Object/ELFObjectFile.h @@ -968,9 +968,6 @@ template Expected ELFObjectFile::getRelocatedSection(DataRefImpl Sec) const { - if (EF.getHeader().e_type != ELF::ET_REL) - return section_end(); - const Elf_Shdr *EShdr = getSection(Sec); uintX_t Type = EShdr->sh_type; if (Type != ELF::SHT_REL && Type != ELF::SHT_RELA) diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -1682,7 +1682,8 @@ // Try to obtain an already relocated version of this section. // Else use the unrelocated section from the object file. We'll have to // apply relocations ourselves later. - section_iterator RelocatedSection = *SecOrErr; + section_iterator RelocatedSection = + Obj.isRelocatableObject() ? *SecOrErr : Obj.section_end(); if (!L || !L->getLoadedSectionContents(*RelocatedSection, Data)) { Expected E = Section.getContents(); if (E) diff --git a/llvm/unittests/Object/ELFObjectFileTest.cpp b/llvm/unittests/Object/ELFObjectFileTest.cpp --- a/llvm/unittests/Object/ELFObjectFileTest.cpp +++ b/llvm/unittests/Object/ELFObjectFileTest.cpp @@ -7,6 +7,8 @@ //===----------------------------------------------------------------------===// #include "llvm/Object/ELFObjectFile.h" +#include "llvm/Object/ObjectFile.h" +#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/ObjectYAML/yaml2obj.h" #include "llvm/Support/YAMLTraits.h" @@ -590,3 +592,63 @@ DoCheck(OverLimitNumBlocks, "ULEB128 value at offset 0x8 exceeds UINT32_MAX (0x100000000)"); } + +// Test for ObjectFile::getRelocatedSection: check that it returns relocated +// section for executable file. +TEST(ELFObjectFileTest, ExecutableWithRelocs) { + SmallString<0> Storage; + Expected> ElfOrErr = toBinary(Storage, R"( +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + - Name: .rela.text + Type: SHT_RELA + Flags: [ SHF_INFO_LINK ] + Link: .symtab + Info: .text + - Type: SectionHeaderTable + Sections: + - Name: .text + - Name: .rela.text + - Name: .symtab + - Name: .strtab + - Name: .shstrtab +Symbols: + - Name: .text + Type: STT_SECTION + Section: .text +)"); + + ASSERT_THAT_EXPECTED(ElfOrErr, Succeeded()); + const ELFObjectFile &Obj = *ElfOrErr; + + bool FoundText; + bool FoundRela; + + for (SectionRef Sec : Obj.sections()) { + Expected SecNameOrErr = Sec.getName(); + ASSERT_THAT_EXPECTED(SecNameOrErr, Succeeded()); + StringRef SecName = *SecNameOrErr; + if (SecName != ".rela.text") + continue; + FoundRela = true; + Expected RelSecOrErr = Sec.getRelocatedSection(); + ASSERT_THAT_EXPECTED(RelSecOrErr, Succeeded()); + section_iterator RelSec = *RelSecOrErr; + ASSERT_NE(RelSec, Obj.section_end()); + ASSERT_TRUE(RelSec->isText()); + Expected TextSecNameOrErr = RelSec->getName(); + ASSERT_THAT_EXPECTED(TextSecNameOrErr, Succeeded()); + StringRef TextSecName = *TextSecNameOrErr; + ASSERT_EQ(TextSecName, ".text"); + FoundText = true; + } + ASSERT_TRUE(FoundText); + ASSERT_TRUE(FoundRela); +}