1#include "../../../cmd/dev/config.h"
2
3#include "elfutil.h"
4
5#ifndef ELF_NOT_SUPPORTED
6void
7out_elf_header(FILE *fp, uintptr_t entry, int phnum, int shnum, int flags, uintptr_t shoff)
8{
9 Elf64_Ehdr ehdr = {
10 .e_ident =
11 {ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, ELFCLASS64, ELFDATA2LSB, EV_CURRENT, ELFOSABI_SYSV},
12 .e_type = phnum > 0 ? ET_EXEC : ET_REL,
13 .e_machine = MACHINE_TYPE,
14 .e_version = EV_CURRENT,
15 .e_entry = entry,
16 .e_phoff = phnum > 0 ? sizeof(Elf64_Ehdr) : 0,
17 .e_shoff = shoff,
18 .e_flags = flags,
19 .e_ehsize = sizeof(Elf64_Ehdr),
20 .e_phentsize = phnum > 0 ? sizeof(Elf64_Phdr) : 0,
21 .e_phnum = phnum,
22 .e_shentsize = shnum > 0 ? sizeof(Elf64_Shdr) : 0,
23 .e_shnum = shnum,
24 .e_shstrndx = shnum > 0 ? shnum - 1 : SHN_UNDEF, /* shstrndx is last */
25 };
26
27 fwrite(&ehdr, sizeof(Elf64_Ehdr), 1, fp);
28}
29
30void
31out_program_header(
32 FILE *fp,
33 int type,
34 uintptr_t offset,
35 uintptr_t vaddr,
36 size_t filesz,
37 size_t memsz,
38 int flags,
39 size_t align
40)
41{
42 Elf64_Phdr phdr = {
43 .p_type = type,
44 .p_offset = offset,
45 .p_vaddr = vaddr,
46 .p_paddr = vaddr,
47 .p_filesz = filesz,
48 .p_memsz = memsz,
49 .p_flags = flags,
50 .p_align = align,
51 };
52
53 fwrite(&phdr, sizeof(Elf64_Phdr), 1, fp);
54}
55#endif /* !ELF_NOT_SUPPORTED */