232 lines
4 KiB
C
232 lines
4 KiB
C
// 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 */
|