diff options
Diffstat (limited to 'llvm/lib/Object/ELF.cpp')
-rw-r--r-- | llvm/lib/Object/ELF.cpp | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp index f17a6da23d7d3..2515695095a1c 100644 --- a/llvm/lib/Object/ELF.cpp +++ b/llvm/lib/Object/ELF.cpp @@ -145,6 +145,13 @@ StringRef llvm::object::getELFRelocationTypeName(uint32_t Machine, break; } break; + case ELF::EM_VE: + switch (Type) { +#include "llvm/BinaryFormat/ELFRelocs/VE.def" + default: + break; + } + break; default: break; } @@ -223,6 +230,9 @@ StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) { STRINGIFY_ENUM_CASE(ELF, SHT_MIPS_ABIFLAGS); } break; + case ELF::EM_RISCV: + switch (Type) { STRINGIFY_ENUM_CASE(ELF, SHT_RISCV_ATTRIBUTES); } + break; default: break; } @@ -499,7 +509,6 @@ std::string ELFFile<ELFT>::getDynamicTagAsString(uint64_t Type) const { template <class ELFT> Expected<typename ELFT::DynRange> ELFFile<ELFT>::dynamicEntries() const { ArrayRef<Elf_Dyn> Dyn; - size_t DynSecSize = 0; auto ProgramHeadersOrError = program_headers(); if (!ProgramHeadersOrError) @@ -510,7 +519,6 @@ Expected<typename ELFT::DynRange> ELFFile<ELFT>::dynamicEntries() const { Dyn = makeArrayRef( reinterpret_cast<const Elf_Dyn *>(base() + Phdr.p_offset), Phdr.p_filesz / sizeof(Elf_Dyn)); - DynSecSize = Phdr.p_filesz; break; } } @@ -529,7 +537,6 @@ Expected<typename ELFT::DynRange> ELFFile<ELFT>::dynamicEntries() const { if (!DynOrError) return DynOrError.takeError(); Dyn = *DynOrError; - DynSecSize = Sec.sh_size; break; } } @@ -542,10 +549,6 @@ Expected<typename ELFT::DynRange> ELFFile<ELFT>::dynamicEntries() const { // TODO: this error is untested. return createError("invalid empty dynamic section"); - if (DynSecSize % sizeof(Elf_Dyn) != 0) - // TODO: this error is untested. - return createError("malformed dynamic section"); - if (Dyn.back().d_tag != ELF::DT_NULL) // TODO: this error is untested. return createError("dynamic sections must be DT_NULL terminated"); @@ -580,7 +583,18 @@ Expected<const uint8_t *> ELFFile<ELFT>::toMappedAddr(uint64_t VAddr) const { if (Delta >= Phdr.p_filesz) return createError("virtual address is not in any segment: 0x" + Twine::utohexstr(VAddr)); - return base() + Phdr.p_offset + Delta; + + uint64_t Offset = Phdr.p_offset + Delta; + if (Offset >= getBufSize()) + return createError("can't map virtual address 0x" + + Twine::utohexstr(VAddr) + " to the segment with index " + + Twine(&Phdr - (*ProgramHeadersOrError).data() + 1) + + ": the segment ends at 0x" + + Twine::utohexstr(Phdr.p_offset + Phdr.p_filesz) + + ", which is greater than the file size (0x" + + Twine::utohexstr(getBufSize()) + ")"); + + return base() + Offset; } template class llvm::object::ELFFile<ELF32LE>; |