master xplshn/aruu / shared / libtcutil / elf / elfutil.c
 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 */