diff options
Diffstat (limited to 'roms/skiboot/include/elf.h')
-rw-r--r-- | roms/skiboot/include/elf.h | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/roms/skiboot/include/elf.h b/roms/skiboot/include/elf.h new file mode 100644 index 000000000..356c6f42f --- /dev/null +++ b/roms/skiboot/include/elf.h @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later +/* Copyright 2013-2015 IBM Corp. */ + +#ifndef __ELF_H +#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 + uint8_t ei_data; +#define ELF_DATA_LSB 1 +#define ELF_DATA_MSB 2 + uint8_t ei_version; + uint8_t ei_pad[9]; +}; + +#define ELF_MACH_PPC32 0x14 +#define ELF_MACH_PPC64 0x15 + +/* 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 elf64le_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; + __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 elf64le_phdr { + __le32 p_type; +#define ELF_PTYPE_LOAD 1 + __le32 p_flags; +#define ELF_PFLAGS_R 0x4 +#define ELF_PFLAGS_W 0x2 +#define ELF_PFLAGS_X 0x1 + __le64 p_offset; + __le64 p_vaddr; + __le64 p_paddr; + __le64 p_filesz; + __le64 p_memsz; + __le64 p_align; +}; + +/* 64-bit ELF section header */ +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 + __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; +#define DT_NULL 0 +#define DT_RELA 7 +#define DT_RELASZ 8 +#define DT_RELAENT 9 +#define DT_RELACOUNT 0x6ffffff9 + uint64_t d_val; +}; + +struct elf64_rela { + uint64_t r_offset; + uint64_t r_info; +#define ELF64_R_TYPE(info) ((info) & 0xffffffffu) + int64_t r_addend; +}; + +/* relocs we support */ +#define R_PPC64_RELATIVE 22 + + +#endif /* __ELF_H */ |