1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - ELF Loader
3   File:     elf_loader.h
4 
5   Copyright 2006-2009 Nintendo. All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law. They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date:: 2009-06-04#$
14   $Rev: 10698 $
15   $Author: okubata_ryoma $
16  *---------------------------------------------------------------------------*/
17 #ifndef _ELF_LOADER_H_
18 #define _ELF_LOADER_H_
19 
20 
21 
22 
23 #ifdef SDK_TWL
24 #include <twl.h>
25 #else
26 #include <nitro.h>
27 #endif
28 //#include <stdio.h>
29 #include "elf.h"
30 #include <twl/el.h>
31 
32 
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 
39 /*------------------------------------------------------
40   Extended section header (support for load addresses and so on)
41  -----------------------------------------------------*/
42 typedef struct {
43   void*         next;
44   u16           index;
45   u16           debug_flag;    /*0: Not debugging information; 1: Debugging information*/
46   u32           loaded_adr;
47   u32           alloc_adr;
48   u32           loaded_size;
49   Elf32_Shdr    Shdr;
50 }ELShdrEx;
51 
52 
53 /*------------------------------------------------------
54   Extended symbol entry (support for load addresses and so on)
55  -----------------------------------------------------*/
56 typedef struct {
57   void*      next;
58   u16        debug_flag;       /*0: Not debugging information; 1: Debugging information*/
59   u16        thumb_flag;
60   u32        relocation_val;
61   Elf32_Sym  Sym;
62 }ELSymEx;
63 
64 
65 /*------------------------------------------------------
66   Linked list of veneers (used by ELi_DoRelocate)
67  -----------------------------------------------------*/
68 typedef struct {
69   void* next;
70   u32   adr;     /* Starting address of veneer code */
71   u32   data;    /* Jump destination address stored in a veneer's literal pool */
72 }ELVeneer;
73 
74 
75 /*------------------------------------------------------
76   Table with relocation data to use for importing
77 
78   If the address table is accessed later, addresses will be resolved as follows.
79   S_ = AdrEntry.adr;
80   T_ = (u32)(AdrEntry.thumb_flag);
81  -----------------------------------------------------*/
82 typedef struct {
83   void*       next;             /*Next entry*/
84   char*       sym_str;          /*Name of an unresolved external symbol reference*/
85   u32         r_type;           /*Relocation type ( ELF32_R_TYPE(Rela.r_info) )*/
86   u32         S_;               /*Address of an unresolved external symbol reference*/
87   s32         A_;               /*Resolved*/
88   u32         P_;               /*Resolved*/
89   u32         T_;               /*ARM or Thumb flag for an unresolved external symbol reference*/
90   u32         sh_type;          /*SHT_REL or SHT_RELA*/
91   struct ELObject*   Dlld;      /*Object with the imported entry when it is resolved. NULL when it is unresolved*/
92 }ELImportEntry;
93 
94 
95 
96 /* Process value for ELDesc */
97 typedef enum ELProcess {
98   EL_PROC_NOTHING      = 0,
99   EL_PROC_INITIALIZED = 0x5A,
100   EL_PROC_COPIED      = 0xF0,
101   EL_PROC_RELOCATED
102 } ELProcess;
103 
104 
105 /*------------------------------------------------------
106   Individual ELF object management
107  -----------------------------------------------------*/
108 typedef struct {
109   void*          next;                   /* Next object entry */
110   void*          lib_start;              /* Address relocated as a library */
111   u32            lib_size;               /* Size after being made into a library */
112   u32            buf_limit_addr;         /* The last address in the buffer given for relocation, incremented by 1 */
113   void*          buf_current;            /* Buffer pointer */
114   ELAdrEntry*    ExportAdrEnt;           /* Export information */
115   ELAdrEntry*    HiddenAdrEnt;           /* Location to store export information when unlinking */
116   ELImportEntry* ResolvedImportAdrEnt;   /* Resolved import information */
117   ELImportEntry* UnresolvedImportAdrEnt; /* Unresolved import information */
118   ELVeneer*      ELVenEntStart;          /* Linked list of veneers */
119   ELVeneer*      ELV4tVenEntStart;       /* Linked list of v4t veneers */
120   u32            stat;                   /* Status */
121   u32            file_id;                /* File ID when a DLL was placed through a ROM */
122   u32            process;                /* Cast the ELProcess type and save */
123   u32            result;                 /* Cast the ELResult type and save */
124 }ELObject;
125 
126 
127 /*------------------------------------------------------
128   Overall ELF object management
129  -----------------------------------------------------*/
130 typedef BOOL (*ELi_ReadFunc)( void* buf, void* file_struct, u32 file_base, u32 file_offset, u32 size);
131 typedef struct {
132   void*         ar_head;        /* Starting address for the AR or ELF file */
133   void*         elf_offset;     /* Offset to the start of the ELF object */
134 
135   u16           reserve;
136   u16           shentsize;      /* Size of a section header */
137   u32           process;        /* Cast the ELProcess type and save */
138   u32           result;         /* Cast the ELResult type and save */
139 
140   ELShdrEx*     ShdrEx;         /* Start of the ShdrEx list */
141 
142   Elf32_Ehdr    CurrentEhdr;    /* ELF header */
143 
144   Elf32_Rel     Rel;            /* Relocation entry */
145   Elf32_Rela    Rela;
146   Elf32_Sym     Sym;            /* Symbol entry */
147   Elf32_Shdr    SymShdr;
148 
149   ELSymEx*      SymEx;          /* Start of the SymEx list (connect only non-debugging symbols) */
150   ELSymEx**     SymExTbl;       /* SymEx address table (for all symbols)*/
151   u32           SymExTarget;    /* Number of the symbol section that created the SymEx list */
152 
153   ELi_ReadFunc  i_elReadStub;   /* Read stub function */
154   void*         FileStruct;     /* File structure */
155 
156   u32           entry_adr;      /* Entry address */
157 
158   ELObject*     ELObjectStart;  /* Linked list of objects */
159   ELObject*     ELStaticObj;    /* Pointer to the static structure connected to the linked list */
160 }ELDesc;
161 
162 
163 /*---------------------------------------------------------
164  Find size of the ELF object
165  --------------------------------------------------------*/
166 u32 EL_GetElfSize( const void* buf);
167 
168 /*---------------------------------------------------------
169  Find the size of the linked library
170  --------------------------------------------------------*/
171 u32 EL_GetLibSize( ELDlld my_dlld);
172 
173 
174 /*------------------------------------------------------
175   Initialize the dynamic link system
176  -----------------------------------------------------*/
177 #if 0
178 //#ifndef SDK_TWL
179 void ELi_Init( void);
180 #else
181 void ELi_Init( ELAlloc alloc, ELFree free);
182 void* ELi_Malloc( ELDesc* elElfDesc, ELObject* MYObject, size_t size);
183 #endif
184 
185 /*------------------------------------------------------
186   Initialize the ELDesc structure
187  -----------------------------------------------------*/
188 BOOL ELi_InitDesc( ELDesc* elElfDesc);
189 
190 /*------------------------------------------------------
191   Relocates an ELF object or its archive from a file into a buffer
192  -----------------------------------------------------*/
193 ELDlld EL_LoadLibraryfromFile( ELDesc* elElfDesc, const char* FilePath, void* buf, u32 buf_size);
194 
195 /*------------------------------------------------------
196   Relocates an ELF object or its archive through the user read API
197  -----------------------------------------------------*/
198 ELDlld EL_LoadLibrary( ELDesc* elElfDesc, ELReadImage readfunc, u32 len, void* buf, u32 buf_size);
199 
200 /*------------------------------------------------------
201   Relocates an ELF object or its archive from memory into a buffer
202  -----------------------------------------------------*/
203 ELDlld EL_LoadLibraryfromMem( ELDesc* elElfDesc, void* obj_image, u32 obj_len, void* buf, u32 buf_size);
204 
205 /*------------------------------------------------------
206   Uses the address table to resolve unresolved symbols
207  -----------------------------------------------------*/
208 ELProcess ELi_ResolveAllLibrary( ELDesc* elElfDesc);
209 
210 
211 /*------------------------------------------------------
212   Add entry from application to address table
213  -----------------------------------------------------*/
214 BOOL ELi_Export( ELDesc* elElfDesc, ELAdrEntry* AdrEnt);
215 
216 /*------------------------------------------------------
217   Add entry of static side to address table
218   (This is defined as a weak symbol in the ELF library, and will be overwritten by the definition in files created by makelst)
219 
220  -----------------------------------------------------*/
221 void EL_AddStaticSym( void);
222 
223 
224 /*------------------------------------------------------
225   Return address corresponding to specified string in address table
226  -----------------------------------------------------*/
227 void* ELi_GetGlobalAdr( ELDesc* elElfDesc, ELDlld my_dlld, const char* ent_name);
228 
229 
230 /*------------------------------------------------------
231   Unlink the object
232  -----------------------------------------------------*/
233 BOOL ELi_Unlink( ELDesc* elElfDesc, ELDlld my_dlld);
234 
235 
236 /*------------------------------------------------------
237   Check whether there are unresolved external references remaining in the object
238  -----------------------------------------------------*/
239 BOOL EL_IsResolved( ELDlld my_dlld);
240 
241 
242 /*------------------------------------------------------
243   Set of error codes/process codes
244  -----------------------------------------------------*/
245 void ELi_SetResultCode( ELDesc* elElfDesc, ELObject* MYObject, ELResult result);
246 void ELi_SetProcCode( ELDesc* elElfDesc, ELObject* MYObject, ELProcess process);
247 
248 
249 /*------------------------------------------------------
250   Allocates the heap
251  -----------------------------------------------------*/
252 void* ELi_Malloc( ELDesc* elElfDesc, ELObject* MYObject, size_t size);
253 
254 
255 #ifdef __cplusplus
256 }    /* extern "C" */
257 #endif
258 
259 
260 #endif    /*_ELF_LOADER_H_*/
261