//===- ELFWriter.cpp - Low-level ELF structure writer ---------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/DWP/ELFWriter.h" #include "llvm/BinaryFormat/ELF.h" using namespace llvm; static void writeWord(support::endian::Writer &W, bool Is64Bit, uint64_t Val) { if (Is64Bit) W.write(Val); else W.write(Val); } void ELF::writeHeader(support::endian::Writer &W, bool Is64Bit, uint8_t OSABI, uint8_t ABIVersion, uint16_t EMachine, uint32_t EFlags, uint64_t SHOff, uint16_t SHNum, uint16_t SHStrNdx) { W.OS << ElfMagic; W.OS << char(Is64Bit ? ELFCLASS64 : ELFCLASS32); W.OS << char(W.Endian == llvm::endianness::little ? ELFDATA2LSB : ELFDATA2MSB); W.OS << char(EV_CURRENT); W.OS << char(OSABI); W.OS << char(ABIVersion); W.OS.write_zeros(EI_NIDENT - EI_PAD); W.write(ET_REL); W.write(EMachine); W.write(EV_CURRENT); writeWord(W, Is64Bit, 0); // e_entry writeWord(W, Is64Bit, 0); // e_phoff writeWord(W, Is64Bit, SHOff); W.write(EFlags); W.write(Is64Bit ? sizeof(Elf64_Ehdr) : sizeof(Elf32_Ehdr)); W.write(0); // e_phentsize W.write(0); // e_phnum W.write(Is64Bit ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr)); W.write(SHNum); W.write(SHStrNdx); } void ELF::writeSectionHeader(support::endian::Writer &W, bool Is64Bit, uint32_t Name, uint32_t Type, uint64_t Flags, uint64_t Address, uint64_t Offset, uint64_t Size, uint32_t Link, uint32_t Info, uint64_t Alignment, uint64_t EntrySize) { W.write(Name); W.write(Type); writeWord(W, Is64Bit, Flags); writeWord(W, Is64Bit, Address); writeWord(W, Is64Bit, Offset); writeWord(W, Is64Bit, Size); W.write(Link); W.write(Info); writeWord(W, Is64Bit, Alignment); writeWord(W, Is64Bit, EntrySize); }