From cfca06d7963fa0909f90483b42a6d7d194d01e08 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sun, 26 Jul 2020 19:36:28 +0000 Subject: Vendor import of llvm-project master 2e10b7a39b9, the last commit before the llvmorg-12-init tag, from which release/11.x was branched. --- llvm/lib/Object/ELF.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) (limited to 'llvm/lib/Object/ELF.cpp') diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp index f17a6da23d7d..2515695095a1 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::getDynamicTagAsString(uint64_t Type) const { template Expected ELFFile::dynamicEntries() const { ArrayRef Dyn; - size_t DynSecSize = 0; auto ProgramHeadersOrError = program_headers(); if (!ProgramHeadersOrError) @@ -510,7 +519,6 @@ Expected ELFFile::dynamicEntries() const { Dyn = makeArrayRef( reinterpret_cast(base() + Phdr.p_offset), Phdr.p_filesz / sizeof(Elf_Dyn)); - DynSecSize = Phdr.p_filesz; break; } } @@ -529,7 +537,6 @@ Expected ELFFile::dynamicEntries() const { if (!DynOrError) return DynOrError.takeError(); Dyn = *DynOrError; - DynSecSize = Sec.sh_size; break; } } @@ -542,10 +549,6 @@ Expected ELFFile::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 ELFFile::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; -- cgit v1.2.3