| //===- 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<uint64_t>(Val); | |
| else | |
| W.write<uint32_t>(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<uint16_t>(ET_REL); | |
| W.write<uint16_t>(EMachine); | |
| W.write<uint32_t>(EV_CURRENT); | |
| writeWord(W, Is64Bit, 0); // e_entry | |
| writeWord(W, Is64Bit, 0); // e_phoff | |
| writeWord(W, Is64Bit, SHOff); | |
| W.write<uint32_t>(EFlags); | |
| W.write<uint16_t>(Is64Bit ? sizeof(Elf64_Ehdr) : sizeof(Elf32_Ehdr)); | |
| W.write<uint16_t>(0); // e_phentsize | |
| W.write<uint16_t>(0); // e_phnum | |
| W.write<uint16_t>(Is64Bit ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr)); | |
| W.write<uint16_t>(SHNum); | |
| W.write<uint16_t>(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<uint32_t>(Name); | |
| W.write<uint32_t>(Type); | |
| writeWord(W, Is64Bit, Flags); | |
| writeWord(W, Is64Bit, Address); | |
| writeWord(W, Is64Bit, Offset); | |
| writeWord(W, Is64Bit, Size); | |
| W.write<uint32_t>(Link); | |
| W.write<uint32_t>(Info); | |
| writeWord(W, Is64Bit, Alignment); | |
| writeWord(W, Is64Bit, EntrySize); | |
| } |