1//===- ELFWriter.cpp - Low-level ELF structure writer ---------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/DWP/ELFWriter.h"
10#include "llvm/BinaryFormat/ELF.h"
11
12using namespace llvm;
13
14static void writeWord(support::endian::Writer &W, bool Is64Bit, uint64_t Val) {
15 if (Is64Bit)
16 W.write<uint64_t>(Val);
17 else
18 W.write<uint32_t>(Val);
19}
20
21void ELF::writeHeader(support::endian::Writer &W, bool Is64Bit, uint8_t OSABI,
22 uint8_t ABIVersion, uint16_t EMachine, uint32_t EFlags,
23 uint64_t SHOff, uint16_t SHNum, uint16_t SHStrNdx) {
24 W.OS << ElfMagic;
25 W.OS << char(Is64Bit ? ELFCLASS64 : ELFCLASS32);
26 W.OS << char(W.Endian == llvm::endianness::little ? ELFDATA2LSB
27 : ELFDATA2MSB);
28 W.OS << char(EV_CURRENT);
29 W.OS << char(OSABI);
30 W.OS << char(ABIVersion);
31 W.OS.write_zeros(NumZeros: EI_NIDENT - EI_PAD);
32
33 W.write<uint16_t>(Val: ET_REL);
34 W.write<uint16_t>(Val: EMachine);
35 W.write<uint32_t>(Val: EV_CURRENT);
36 writeWord(W, Is64Bit, Val: 0); // e_entry
37 writeWord(W, Is64Bit, Val: 0); // e_phoff
38 writeWord(W, Is64Bit, Val: SHOff);
39 W.write<uint32_t>(Val: EFlags);
40 W.write<uint16_t>(Val: Is64Bit ? sizeof(Elf64_Ehdr) : sizeof(Elf32_Ehdr));
41 W.write<uint16_t>(Val: 0); // e_phentsize
42 W.write<uint16_t>(Val: 0); // e_phnum
43 W.write<uint16_t>(Val: Is64Bit ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr));
44 W.write<uint16_t>(Val: SHNum);
45 W.write<uint16_t>(Val: SHStrNdx);
46}
47
48void ELF::writeSectionHeader(support::endian::Writer &W, bool Is64Bit,
49 uint32_t Name, uint32_t Type, uint64_t Flags,
50 uint64_t Address, uint64_t Offset, uint64_t Size,
51 uint32_t Link, uint32_t Info, uint64_t Alignment,
52 uint64_t EntrySize) {
53 W.write<uint32_t>(Val: Name);
54 W.write<uint32_t>(Val: Type);
55 writeWord(W, Is64Bit, Val: Flags);
56 writeWord(W, Is64Bit, Val: Address);
57 writeWord(W, Is64Bit, Val: Offset);
58 writeWord(W, Is64Bit, Val: Size);
59 W.write<uint32_t>(Val: Link);
60 W.write<uint32_t>(Val: Info);
61 writeWord(W, Is64Bit, Val: Alignment);
62 writeWord(W, Is64Bit, Val: EntrySize);
63}
64