LLVM 23.0.0git
ELFWriter.cpp
Go to the documentation of this file.
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
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
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(EI_NIDENT - EI_PAD);
32
33 W.write<uint16_t>(ET_REL);
34 W.write<uint16_t>(EMachine);
35 W.write<uint32_t>(EV_CURRENT);
36 writeWord(W, Is64Bit, 0); // e_entry
37 writeWord(W, Is64Bit, 0); // e_phoff
38 writeWord(W, Is64Bit, SHOff);
39 W.write<uint32_t>(EFlags);
40 W.write<uint16_t>(Is64Bit ? sizeof(Elf64_Ehdr) : sizeof(Elf32_Ehdr));
41 W.write<uint16_t>(0); // e_phentsize
42 W.write<uint16_t>(0); // e_phnum
43 W.write<uint16_t>(Is64Bit ? sizeof(Elf64_Shdr) : sizeof(Elf32_Shdr));
44 W.write<uint16_t>(SHNum);
45 W.write<uint16_t>(SHStrNdx);
46}
47
49 uint32_t Name, uint32_t Type, uint64_t Flags,
51 uint32_t Link, uint32_t Info, uint64_t Alignment,
52 uint64_t EntrySize) {
53 W.write<uint32_t>(Name);
54 W.write<uint32_t>(Type);
55 writeWord(W, Is64Bit, Flags);
56 writeWord(W, Is64Bit, Address);
57 writeWord(W, Is64Bit, Offset);
58 writeWord(W, Is64Bit, Size);
59 W.write<uint32_t>(Link);
60 W.write<uint32_t>(Info);
61 writeWord(W, Is64Bit, Alignment);
62 writeWord(W, Is64Bit, EntrySize);
63}
static void writeWord(support::endian::Writer &W, bool Is64Bit, uint64_t Val)
Definition ELFWriter.cpp:14
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
@ EV_CURRENT
Definition ELF.h:130
@ EI_PAD
Definition ELF.h:60
@ EI_NIDENT
Definition ELF.h:61
void 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)
Write an ELF file header (Elf32_Ehdr or Elf64_Ehdr) for an ET_REL object.
Definition ELFWriter.cpp:21
static const char ElfMagic[]
Definition ELF.h:47
void 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)
Write a single ELF section header entry (Elf32_Shdr or Elf64_Shdr).
Definition ELFWriter.cpp:48
@ ELFDATA2MSB
Definition ELF.h:341
@ ELFDATA2LSB
Definition ELF.h:340
@ ELFCLASS64
Definition ELF.h:334
@ ELFCLASS32
Definition ELF.h:333
@ ET_REL
Definition ELF.h:119
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:557
Adapter to write values to a stream in a particular byte order.