aboutsummaryrefslogtreecommitdiff
path: root/include/elf.h
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2019-12-08 22:22:47 +1000
committerOliver O'Halloran <oohall@gmail.com>2019-12-16 14:50:56 +1100
commitc47b2ffdd5c5116bd4782df388cfca4d89189dff (patch)
treed72257fd2b2ff9e8b27f8a1d0939decd202a2d44 /include/elf.h
parent789624ffef8b6a90154a120408095333dad0a657 (diff)
downloadskiboot-c47b2ffdd5c5116bd4782df388cfca4d89189dff.zip
skiboot-c47b2ffdd5c5116bd4782df388cfca4d89189dff.tar.gz
skiboot-c47b2ffdd5c5116bd4782df388cfca4d89189dff.tar.bz2
elf: endian conversions
Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
Diffstat (limited to 'include/elf.h')
-rw-r--r--include/elf.h235
1 files changed, 164 insertions, 71 deletions
diff --git a/include/elf.h b/include/elf.h
index 93524bb..f3e071d 100644
--- a/include/elf.h
+++ b/include/elf.h
@@ -5,11 +5,16 @@
#define __ELF_H
#include <stdint.h>
+#include <types.h>
/* Generic ELF header */
struct elf_hdr {
uint32_t ei_ident;
+#if HAVE_BIG_ENDIAN
#define ELF_IDENT 0x7F454C46
+#else
+#define ELF_IDENT 0x464C457F
+#endif
uint8_t ei_class;
#define ELF_CLASS_32 1
#define ELF_CLASS_64 2
@@ -18,68 +23,190 @@ struct elf_hdr {
#define ELF_DATA_MSB 2
uint8_t ei_version;
uint8_t ei_pad[9];
- uint16_t e_type;
- uint16_t e_machine;
+};
+
#define ELF_MACH_PPC32 0x14
#define ELF_MACH_PPC64 0x15
- uint32_t e_version;
+
+/* 64-bit ELF header */
+struct elf64be_hdr {
+ uint32_t ei_ident;
+ uint8_t ei_class;
+ uint8_t ei_data;
+ uint8_t ei_version;
+ uint8_t ei_pad[9];
+ __be16 e_type;
+ __be16 e_machine;
+ __be32 e_version;
+ __be64 e_entry;
+ __be64 e_phoff;
+ __be64 e_shoff;
+ __be32 e_flags;
+ __be16 e_ehsize;
+ __be16 e_phentsize;
+ __be16 e_phnum;
+ __be16 e_shentsize;
+ __be16 e_shnum;
+ __be16 e_shstrndx;
+};
+
+/* 64-bit ELF program header */
+struct elf64be_phdr {
+ __be32 p_type;
+#define ELF_PTYPE_LOAD 1
+ __be32 p_flags;
+#define ELF_PFLAGS_R 0x4
+#define ELF_PFLAGS_W 0x2
+#define ELF_PFLAGS_X 0x1
+ __be64 p_offset;
+ __be64 p_vaddr;
+ __be64 p_paddr;
+ __be64 p_filesz;
+ __be64 p_memsz;
+ __be64 p_align;
+};
+
+/* 64-bit ELF section header */
+struct elf64be_shdr {
+ __be32 sh_name;
+ __be32 sh_type;
+ __be64 sh_flags;
+#define ELF_SFLAGS_X 0x4
+#define ELF_SFLAGS_A 0x2
+#define ELF_SFLAGS_W 0x1
+ __be64 sh_addr;
+ __be64 sh_offset;
+ __be64 sh_size;
+ __be32 sh_link;
+ __be32 sh_info;
+ __be64 sh_addralign;
+ __be64 sh_entsize;
+};
+
+/* 32-bit ELF header */
+struct elf32be_hdr {
+ uint32_t ei_ident;
+ uint8_t ei_class;
+ uint8_t ei_data;
+ uint8_t ei_version;
+ uint8_t ei_pad[9];
+ __be16 e_type;
+ __be16 e_machine;
+ __be32 e_version;
+ __be32 e_entry;
+ __be32 e_phoff;
+ __be32 e_shoff;
+ __be32 e_flags;
+ __be16 e_ehsize;
+ __be16 e_phentsize;
+ __be16 e_phnum;
+ __be16 e_shentsize;
+ __be16 e_shnum;
+ __be16 e_shstrndx;
+};
+
+/* 32-bit ELF program header*/
+struct elf32be_phdr {
+ __be32 p_type;
+ __be32 p_offset;
+ __be32 p_vaddr;
+ __be32 p_paddr;
+ __be32 p_filesz;
+ __be32 p_memsz;
+ __be32 p_flags;
+ __be32 p_align;
};
/* 64-bit ELF header */
-struct elf64_hdr {
+struct elf64le_hdr {
uint32_t ei_ident;
uint8_t ei_class;
uint8_t ei_data;
uint8_t ei_version;
uint8_t ei_pad[9];
- uint16_t e_type;
- uint16_t e_machine;
- uint32_t e_version;
- uint64_t e_entry;
- uint64_t e_phoff;
- uint64_t e_shoff;
- uint32_t e_flags;
- uint16_t e_ehsize;
- uint16_t e_phentsize;
- uint16_t e_phnum;
- uint16_t e_shentsize;
- uint16_t e_shnum;
- uint16_t e_shstrndx;
+ __le16 e_type;
+ __le16 e_machine;
+ __le32 e_version;
+ __le64 e_entry;
+ __le64 e_phoff;
+ __le64 e_shoff;
+ __le32 e_flags;
+ __le16 e_ehsize;
+ __le16 e_phentsize;
+ __le16 e_phnum;
+ __le16 e_shentsize;
+ __le16 e_shnum;
+ __le16 e_shstrndx;
};
/* 64-bit ELF program header */
-struct elf64_phdr {
- uint32_t p_type;
+struct elf64le_phdr {
+ __le32 p_type;
#define ELF_PTYPE_LOAD 1
- uint32_t p_flags;
+ __le32 p_flags;
#define ELF_PFLAGS_R 0x4
#define ELF_PFLAGS_W 0x2
#define ELF_PFLAGS_X 0x1
- uint64_t p_offset;
- uint64_t p_vaddr;
- uint64_t p_paddr;
- uint64_t p_filesz;
- uint64_t p_memsz;
- uint64_t p_align;
+ __le64 p_offset;
+ __le64 p_vaddr;
+ __le64 p_paddr;
+ __le64 p_filesz;
+ __le64 p_memsz;
+ __le64 p_align;
};
/* 64-bit ELF section header */
-struct elf64_shdr {
- uint32_t sh_name;
- uint32_t sh_type;
- uint64_t sh_flags;
+struct elf64le_shdr {
+ __le32 sh_name;
+ __le32 sh_type;
+ __le64 sh_flags;
#define ELF_SFLAGS_X 0x4
#define ELF_SFLAGS_A 0x2
#define ELF_SFLAGS_W 0x1
- uint64_t sh_addr;
- uint64_t sh_offset;
- uint64_t sh_size;
- uint32_t sh_link;
- uint32_t sh_info;
- uint64_t sh_addralign;
- int64_t sh_entsize;
+ __le64 sh_addr;
+ __le64 sh_offset;
+ __le64 sh_size;
+ __le32 sh_link;
+ __le32 sh_info;
+ __le64 sh_addralign;
+ __le64 sh_entsize;
+};
+
+/* 32-bit ELF header */
+struct elf32le_hdr {
+ uint32_t ei_ident;
+ uint8_t ei_class;
+ uint8_t ei_data;
+ uint8_t ei_version;
+ uint8_t ei_pad[9];
+ __le16 e_type;
+ __le16 e_machine;
+ __le32 e_version;
+ __le32 e_entry;
+ __le32 e_phoff;
+ __le32 e_shoff;
+ __le32 e_flags;
+ __le16 e_ehsize;
+ __le16 e_phentsize;
+ __le16 e_phnum;
+ __le16 e_shentsize;
+ __le16 e_shnum;
+ __le16 e_shstrndx;
+};
+
+/* 32-bit ELF program header*/
+struct elf32le_phdr {
+ __le32 p_type;
+ __le32 p_offset;
+ __le32 p_vaddr;
+ __le32 p_paddr;
+ __le32 p_filesz;
+ __le32 p_memsz;
+ __le32 p_flags;
+ __le32 p_align;
};
+
/* Some relocation related stuff used in relocate.c */
struct elf64_dyn {
int64_t d_tag;
@@ -101,39 +228,5 @@ struct elf64_rela {
/* relocs we support */
#define R_PPC64_RELATIVE 22
-/* 32-bit ELF header */
-struct elf32_hdr {
- uint32_t ei_ident;
- uint8_t ei_class;
- uint8_t ei_data;
- uint8_t ei_version;
- uint8_t ei_pad[9];
- uint16_t e_type;
- uint16_t e_machine;
- uint32_t e_version;
- uint32_t e_entry;
- uint32_t e_phoff;
- uint32_t e_shoff;
- uint32_t e_flags;
- uint16_t e_ehsize;
- uint16_t e_phentsize;
- uint16_t e_phnum;
- uint16_t e_shentsize;
- uint16_t e_shnum;
- uint16_t e_shstrndx;
-};
-
-/* 32-bit ELF program header*/
-struct elf32_phdr {
- uint32_t p_type;
- uint32_t p_offset;
- uint32_t p_vaddr;
- uint32_t p_paddr;
- uint32_t p_filesz;
- uint32_t p_memsz;
- uint32_t p_flags;
- uint32_t p_align;
-};
-
#endif /* __ELF_H */