//===- lib/ReaderWriter/ELF/FileCommon.h ----------------------------------===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLD_READER_WRITER_ELF_FILE_COMMON_H #define LLD_READER_WRITER_ELF_FILE_COMMON_H #include "lld/ReaderWriter/ELFLinkingContext.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/ELF.h" namespace lld { namespace elf { template std::error_code checkCompatibility(unsigned char size, unsigned char endian); template std::error_code isCompatible(MemoryBufferRef mb, ELFLinkingContext &ctx) { typedef llvm::object::Elf_Ehdr_Impl Elf_Ehdr; if (uintptr_t(mb.getBufferStart()) & 1) return make_dynamic_error_code("invalid alignment"); auto *hdr = reinterpret_cast(mb.getBuffer().data()); if (hdr->e_machine != ctx.getMachineType()) return make_dynamic_error_code("incompatible machine type"); unsigned char size; unsigned char endian; std::tie(size, endian) = llvm::object::getElfArchType(mb.getBuffer()); if (std::error_code ec = checkCompatibility(size, endian)) return ec; return std::error_code(); } } // end namespace elf } // end namespace lld #endif