/* Copyright 2013-2014 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __ELF_H #define __ELF_H #include /* Generic ELF header */ struct elf_hdr { uint32_t ei_ident; #define ELF_IDENT 0x7F454C46 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]; 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 elf64_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; }; /* 64-bit ELF program header */ struct elf64_phdr { uint32_t p_type; #define ELF_PTYPE_LOAD 1 uint32_t 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; }; /* 64-bit ELF section header */ struct elf64_shdr { uint32_t sh_name; uint32_t sh_type; uint64_t 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; }; /* 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 /* 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 */