1 /****************************************************************************** 2 * Copyright (c) 2004, 2011 IBM Corporation 3 * All rights reserved. 4 * This program and the accompanying materials 5 * are made available under the terms of the BSD License 6 * which accompanies this distribution, and is available at 7 * http://www.opensource.org/licenses/bsd-license.php 8 * 9 * Contributors: 10 * IBM Corporation - initial implementation 11 *****************************************************************************/ 12 13 /* 14 * ELF loader library 15 */ 16 17 #ifndef __LIBELF_H 18 #define __LIBELF_H 19 20 #include <stdint.h> 21 22 /* ELF object file types */ 23 #define ET_NONE 0 /* No file type */ 24 #define ET_REL 1 /* Relocatable file */ 25 #define ET_EXEC 2 /* Executable file */ 26 #define ET_DYN 3 /* Shared object file */ 27 #define ET_CORE 4 /* Core file */ 28 29 /* ELF object endian */ 30 #define ELFDATA2LSB 1 /* 2's complement, little endian */ 31 #define ELFDATA2MSB 2 /* 2's complement, big endian */ 32 33 /* Generic ELF header */ 34 struct ehdr { 35 uint32_t ei_ident; 36 uint8_t ei_class; 37 uint8_t ei_data; 38 uint8_t ei_version; 39 uint8_t ei_pad[9]; 40 uint16_t e_type; 41 uint16_t e_machine; 42 uint32_t e_version; 43 }; 44 45 /* Section types (sh_type) */ 46 #define SHT_NULL 0 /* Unused section header */ 47 #define SHT_PROGBITS 1 /* Information defined by the program */ 48 #define SHT_SYMTAB 2 /* Linker symbol table */ 49 #define SHT_STRTAB 3 /* String table */ 50 #define SHT_RELA 4 /* "Rela" type relocation entries */ 51 #define SHT_HASH 5 /* Symbol hash table */ 52 #define SHT_DYNAMIC 6 /* Dynamic linking tables */ 53 #define SHT_NOTE 7 /* Note information */ 54 #define SHT_NOBITS 8 /* Uninitialized space */ 55 #define SHT_REL 9 /* "Rel" type relocation entries */ 56 #define SHT_SHLIB 10 /* Reserved */ 57 #define SHT_DYNSYM 11 /* Dynamic loader symbol table */ 58 59 /* Section attributs (sh_flags) */ 60 #define SHF_WRITE 0x1 61 #define SHF_ALLOC 0x2 62 #define SHF_EXECINSTR 0x4 63 64 /* Segment types (p_type) */ 65 #define PT_NULL 0 /* Unused entry */ 66 #define PT_LOAD 1 /* Loadable segment */ 67 #define PT_DYNAMIC 2 /* Dynamic linking tables */ 68 #define PT_INTERP 3 /* Program interpreter path name */ 69 #define PT_NOTE 4 /* Note sections */ 70 71 72 int elf_load_file(void *file_addr, unsigned long *entry, 73 int (*pre_load)(void*, long), 74 void (*post_load)(void*, long)); 75 int elf_load_file_to_addr(void *file_addr, void *addr, unsigned long *entry, 76 int (*pre_load)(void*, long), 77 void (*post_load)(void*, long)); 78 79 void elf_byteswap_header32(void *file_addr); 80 void elf_byteswap_header64(void *file_addr); 81 82 unsigned int elf_load_segments32(void *file_addr, signed long offset, 83 int (*pre_load)(void*, long), 84 void (*post_load)(void*, long)); 85 unsigned long elf_load_segments64(void *file_addr, signed long offset, 86 int (*pre_load)(void*, long), 87 void (*post_load)(void*, long)); 88 89 long elf_get_base_addr(void *file_addr); 90 long elf_get_base_addr32(void *file_addr); 91 long elf_get_base_addr64(void *file_addr); 92 uint32_t elf_get_eflags_32(void *file_addr); 93 uint32_t elf_get_eflags_64(void *file_addr); 94 95 void elf_relocate64(void *file_addr, signed long offset); 96 97 int elf_forth_claim(void *addr, long size); 98 99 long elf_get_file_size(const void *buffer, const long buffer_size); 100 long elf_get_file_size32(const void *buffer, const long buffer_size); 101 long elf_get_file_size64(const void *buffer, const long buffer_size); 102 103 #ifdef __BIG_ENDIAN__ 104 #define elf64_to_cpu(x, ehdr) ((ehdr)->ei_data == ELFDATA2MSB ? (x) : bswap_64(x)) 105 #define elf32_to_cpu(x, ehdr) ((ehdr)->ei_data == ELFDATA2MSB ? (x) : bswap_32(x)) 106 #define elf16_to_cpu(x, ehdr) ((ehdr)->ei_data == ELFDATA2MSB ? (x) : bswap_16(x)) 107 #else 108 #define elf64_to_cpu(x, ehdr) ((ehdr)->ei_data == ELFDATA2LSB ? (x) : bswap_64(x)) 109 #define elf32_to_cpu(x, ehdr) ((ehdr)->ei_data == ELFDATA2LSB ? (x) : bswap_32(x)) 110 #define elf16_to_cpu(x, ehdr) ((ehdr)->ei_data == ELFDATA2LSB ? (x) : bswap_16(x)) 111 #endif 112 113 #endif /* __LIBELF_H */ 114