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