blob: 356c6f42f0de66ab1f89fb16262bc4b3a4ebaad6 [file] [log] [blame]
// 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 */