aboutsummaryrefslogtreecommitdiffhomepage
path: root/elf.h
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2023-06-17 23:26:45 +0200
committerlemon <lsof@mailbox.org>2023-06-17 23:26:45 +0200
commit962ad175aee634274b408ead38b13e6bc90e2fe7 (patch)
treecfda733adf56ed12e829f594e0b6d66f0a1a7a70 /elf.h
parentec28e9057e84b92acabb7ebf9122af59738917ad (diff)
basic ELF output
Diffstat (limited to 'elf.h')
-rw-r--r--elf.h149
1 files changed, 149 insertions, 0 deletions
diff --git a/elf.h b/elf.h
new file mode 100644
index 0000000..273b2fa
--- /dev/null
+++ b/elf.h
@@ -0,0 +1,149 @@
+#include "common.h"
+
+#define ELFMAG "\177ELF"
+enum {
+ ELFCLASS32 = 1,
+ ELFCLASS64 = 2,
+
+ ELFDATA2LSB = 1,
+ ELFDATA2MSB = 2,
+
+ ELFVERSION = 1,
+
+ ELFOSABI_SYSV = 0,
+ ELFOSABI_ARM = 97,
+ ELFOSABI_STANDALONE = 255,
+
+ ET_NONE = 0,
+ ET_REL, ET_EXEC, ET_DYN, ET_CORE,
+
+ EM_NONE = 0,
+ EM_386 = 3,
+ EM_486 = 6,
+ EM_MIPS = 8,
+ EM_MIPS_RS4_BE = 0xA,
+ EM_ARM = 0x28,
+ EM_X86_64 = 0x3E,
+ EM_ARM64 = 0xB7,
+};
+
+struct elfhdr {
+ uchar i_mag[4],
+ i_class,
+ i_data,
+ i_version,
+ i_osabi,
+ i_abiversion,
+ i_pad[7];
+ ushort type,
+ machine;
+ uint version;
+ uvlong entry,
+ phoff,
+ shoff;
+ uint flags;
+ ushort ehsize,
+ phentsize,
+ phnum,
+ shentsize,
+ shnum,
+ shstrndx;
+};
+
+enum {
+ SHT_NULL = 0x0,
+ SHT_PROGBITS = 0x1,
+ SHT_SYMTAB = 0x2,
+ SHT_STRTAB = 0x3,
+ SHT_RELA = 0x4,
+ SHT_HASH = 0x5,
+ SHT_DYNAMIC = 0x6,
+ SHT_NOTE = 0x7,
+ SHT_NOBITS = 0x8,
+ SHT_REL = 0x9,
+ SHT_SHLIB = 0xA,
+ SHT_DYNSYM = 0xB,
+ SHT_INIT_ARRAY = 0xE,
+ SHT_FINI_ARRAY = 0xF,
+ SHT_PREINIT_ARRAY = 0x10,
+ SHT_GROUP = 0x12,
+ SHT_SYMTAB_SHNDX = 0x13,
+};
+
+enum {
+ SHF_WRITE = 0x1,
+ SHF_ALLOC = 0x2,
+ SHF_EXECINSTR = 0x4,
+ SHF_MERGE = 0x10,
+ SHF_STRINGS = 0x20,
+ SHF_INFO_LINK = 0x40,
+ SHF_LINK_ORDER = 0x80,
+ SHF_OS_NONCONFORMING = 0x100,
+ SHF_GROUP = 0x200,
+ SHF_TLS = 0x400,
+};
+
+struct elfshdr {
+ uint name,
+ type;
+ uvlong flags,
+ addr,
+ offset,
+ size;
+ uint link,
+ info;
+ uvlong addralign,
+ entsize;
+};
+
+enum {
+ STB_LOCAL,
+ STB_GLOBAL,
+ STB_WEAK
+};
+
+enum {
+ STT_NOTYPE,
+ STT_OBJECT,
+ STT_FUNC,
+ STT_SECTION,
+ STT_FILE,
+};
+
+enum {
+ SHN_UND = 0,
+ SHN_ABS = 0xFFF1,
+};
+
+#define ELF_S_INFO(b,t) ((b) << 4 | (t))
+struct elfsym {
+ uint name;
+ uchar info,
+ other;
+ ushort shndx;
+ uvlong value,
+ size;
+};
+
+#define ELF_R_INFO(s,t) ((uvlong) (s) << 32 | (t))
+struct elfrel {
+ uvlong offset, info;
+};
+
+struct elfrela {
+ uvlong offset, info;
+ vlong addend;
+};
+
+struct elfphdr {
+ uint type,
+ flags;
+ uvlong offset,
+ vaddr,
+ paddr,
+ filesz,
+ memsz,
+ align;
+};
+
+/* vim:set ts=3 sw=3 expandtab: */