]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - keystone-rtos/ibl.git/blob - src/interp/elf/elf32.h
.gitignore: update to ignore all make created files
[keystone-rtos/ibl.git] / src / interp / elf / elf32.h
1 /*
2 * elf32.h
3 *
4 * Basic Data Structures for 32-bit ELF Object Format Files
5 *
6 * The data structures in this file come primarily from this specification:
7 *
8 *    Tool Interface Standard (TIS)
9 *    Executable and Linking Format (ELF) Specification
10 *    Version 1.2
11 *
12 *    TIS Committee
13 *    May 1995
14 *
15 * Additions and enhancements from this specification are also included:
16 *
17 *    System V Application Binary Interface
18 *    DRAFT 17
19 *    December 2003
20 *
21 *    http://sco.com/developers/gabi/2003-12-17/contents.html
22 *
23 *
24 * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
25  * 
26  *  Redistribution and use in source and binary forms, with or without 
27  *  modification, are permitted provided that the following conditions 
28  *  are met:
29  *
30  *    Redistributions of source code must retain the above copyright 
31  *    notice, this list of conditions and the following disclaimer.
32  *
33  *    Redistributions in binary form must reproduce the above copyright
34  *    notice, this list of conditions and the following disclaimer in the 
35  *    documentation and/or other materials provided with the   
36  *    distribution.
37  *
38  *    Neither the name of Texas Instruments Incorporated nor the names of
39  *    its contributors may be used to endorse or promote products derived
40  *    from this software without specific prior written permission.
41  *
42  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
43  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
44  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
46  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
47  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
48  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
51  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
52  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53  *
54 */
56 #ifndef ELF32_H
57 #define ELF32_H
59 #include <inttypes.h>
61 /*---------------------------------------------------------------------------*/
62 /* 32-Bit Data Types (Figure 1-2, page 1-2)                                  */
63 /*---------------------------------------------------------------------------*/
64 typedef uint32_t Elf32_Addr;
65 typedef uint16_t Elf32_Half;
66 typedef uint32_t Elf32_Off;
67 typedef  int32_t Elf32_Sword;
68 typedef uint32_t Elf32_Word;
71 /*****************************************************************************/
72 /* ELF Header                                                                */
73 /* PP. 1-4                                                                   */
74 /*****************************************************************************/
76 /*---------------------------------------------------------------------------*/
77 /* ELF Identification Indexes (indexes into Elf32_Ehdr.e_ident[] below)      */
78 /*---------------------------------------------------------------------------*/
79 enum
80 {
81    EI_MAG0       = 0,   /* File identification          */
82    EI_MAG1       = 1,   /* File identification          */
83    EI_MAG2       = 2,   /* File identification          */
84    EI_MAG3       = 3,   /* File identification          */
85    EI_CLASS      = 4,   /* File class                   */
86    EI_DATA       = 5,   /* Data encoding                */
87    EI_VERSION    = 6,   /* File version                 */
88    EI_OSABI      = 7,   /* Operating system / ABI       */
89    EI_ABIVERSION = 8,   /* ABI version                  */
90    EI_PAD        = 9,   /* Start of padding bytes       */
91    EI_NIDENT     = 16   /* Size of Elf32_Ehdr.e_ident[] */
92 };
95 /*---------------------------------------------------------------------------*/
96 /* ELF Header Data Structure                                                 */
97 /*---------------------------------------------------------------------------*/
98 struct Elf32_Ehdr
99 {
100    uint8_t     e_ident[EI_NIDENT];   /* ELF Magic Number                     */
101    Elf32_Half  e_type;               /* Object File Type                     */
102    Elf32_Half  e_machine;            /* Target Processor                     */
103    Elf32_Word  e_version;            /* Object File Version                  */
104    Elf32_Addr  e_entry;              /* Entry Point                          */
105    Elf32_Off   e_phoff;              /* Program Header Table Offset          */
106    Elf32_Off   e_shoff;              /* Section Header Table Offset          */
107    Elf32_Word  e_flags;              /* Processor-Specific Flags             */
108    Elf32_Half  e_ehsize;             /* Size of ELF header                   */
109    Elf32_Half  e_phentsize;          /* Size of a Program Header             */
110    Elf32_Half  e_phnum;              /* # Entries in Program Header Table    */
111    Elf32_Half  e_shentsize;          /* Size of a Section Header             */
112    Elf32_Half  e_shnum;              /* # Entries in Section Header Table    */
113    Elf32_Half  e_shstrndx;           /* Section Name String Table Section    */
114 };
117 /*---------------------------------------------------------------------------*/
118 /* Object File Types (value of "e_type")                                     */
119 /*---------------------------------------------------------------------------*/
120 enum
122    ET_NONE   = 0,       /* No file type                   */
123    ET_REL    = 1,       /* Relocatable file               */
124    ET_EXEC   = 2,       /* Executable file                */
125    ET_DYN    = 3,       /* Shared object file             */
126    ET_CORE   = 4,       /* Core file                      */
127    ET_LOOS   = 0xfe00,  /* First OS-specific value        */
128    ET_HIPS   = 0xfeff,  /* Last  OS-specific value        */
129    ET_LOPROC = 0xff00,  /* First processor-specific value */
130    ET_HIPROC = 0xffff   /* Last  processor-specific value */
131 };
134 /*---------------------------------------------------------------------------*/
135 /* Target Processors (value of "e_machine")                                  */
136 /*---------------------------------------------------------------------------*/
137 enum
139    EM_NONE        =   0,  /* No machine                                      */
140    EM_M32         =   1,  /* AT&T WE 32100                                   */
141    EM_SPARC       =   2,  /* SPARC                                           */
142    EM_386         =   3,  /* Intel 80386                                     */
143    EM_68K         =   4,  /* Motorola 68000                                  */
144    EM_88K         =   5,  /* Motorola 88000                                  */
145    EM_860         =   7,  /* Intel 80860                                     */
146    EM_MIPS        =   8,  /* MIPS I Architecture                             */
147    EM_S370        =   9,  /* IBM System/370 Processor                        */
148    EM_MIPS_RS3_LE =  10,  /* MIPS RS3000 Little-endian                       */
149    EM_PARISC      =  15,  /* Hewlett-Packard PA-RISC                         */
150    EM_VPP500      =  17,  /* Fujitsu VPP500                                  */
151    EM_SPARC32PLUS =  18,  /* Enhanced instruction set SPARC                  */
152    EM_960         =  19,  /* Intel 80960                                     */
153    EM_PPC         =  20,  /* PowerPC                                         */
154    EM_PPC64       =  21,  /* 64-bit PowerPC                                  */
155    EM_S390        =  22,  /* IBM System/390 Processor                        */
156    EM_V800        =  36,  /* NEC V800                                        */
157    EM_FR20        =  37,  /* Fujitsu FR20                                    */
158    EM_RH32        =  38,  /* TRW RH-32                                       */
159    EM_RCE         =  39,  /* Motorola RCE                                    */
160    EM_ARM         =  40,  /* Advanced RISC Machines ARM                      */
161    EM_ALPHA       =  41,  /* Digital Alpha                                   */
162    EM_SH          =  42,  /* Hitachi SH                                      */
163    EM_SPARCV9     =  43,  /* SPARC Version 9                                 */
164    EM_TRICORE     =  44,  /* Siemens TriCore embedded processor              */
165    EM_ARC         =  45,  /* "Argonaut RISC Core, Argonaut Technologies Inc. */
166    EM_H8_300      =  46,  /* Hitachi H8/300                                  */
167    EM_H8_300H     =  47,  /* Hitachi H8/300H                                 */
168    EM_H8S         =  48,  /* Hitachi H8S                                     */
169    EM_H8_500      =  49,  /* Hitachi H8/500                                  */
170    EM_IA_64       =  50,  /* Intel IA-64 processor architecture              */
171    EM_MIPS_X      =  51,  /* Stanford MIPS-X                                 */
172    EM_COLDFIRE    =  52,  /* Motorola ColdFire                               */
173    EM_68HC12      =  53,  /* Motorola M68HC12                                */
174    EM_MMA         =  54,  /* Fujitsu MMA Multimedia Accelerator              */
175    EM_PCP         =  55,  /* Siemens PCP                                     */
176    EM_NCPU        =  56,  /* Sony nCPU embedded RISC processor               */
177    EM_NDR1        =  57,  /* Denso NDR1 microprocessor                       */
178    EM_STARCORE    =  58,  /* Motorola Star*Core processor                    */
179    EM_ME16        =  59,  /* Toyota ME16 processor                           */
180    EM_ST100       =  60,  /* STMicroelectronics ST100 processor              */
181    EM_TINYJ       =  61,  /* Advanced Logic Corp. TinyJ embedded processor f */
182    EM_X86_64      =  62,  /* AMD x86-64 architecture                         */
183    EM_PDSP        =  63,  /* Sony DSP Processor                              */
184    EM_PDP10       =  64,  /* Digital Equipment Corp. PDP-10                  */
185    EM_PDP11       =  65,  /* Digital Equipment Corp. PDP-11                  */
186    EM_FX66        =  66,  /* Siemens FX66 microcontroller                    */
187    EM_ST9PLUS     =  67,  /* STMicroelectronics ST9+ 8/16 bit microcontrolle */
188    EM_ST7         =  68,  /* STMicroelectronics ST7 8-bit microcontroller    */
189    EM_68HC16      =  69,  /* Motorola MC68HC16 Microcontroller               */
190    EM_68HC11      =  70,  /* Motorola MC68HC11 Microcontroller               */
191    EM_68HC08      =  71,  /* Motorola MC68HC08 Microcontroller               */
192    EM_68HC05      =  72,  /* Motorola MC68HC05 Microcontroller               */
193    EM_SVX         =  73,  /* Silicon Graphics SVx                            */
194    EM_ST19        =  74,  /* STMicroelectronics ST19 8-bit microcontroller   */
195    EM_VAX         =  75,  /* Digital VAX                                     */
196    EM_CRIS        =  76,  /* Axis Communications 32-bit embedded processor   */
197    EM_JAVELIN     =  77,  /* Infineon Technologies 32-bit embedded processor */
198    EM_FIREPATH    =  78,  /* Element 14 64-bit DSP Processor                 */
199    EM_ZSP         =  79,  /* LSI Logic 16-bit DSP Processor                  */
200    EM_MMIX        =  80,  /* Donald Knuth's educational 64-bit processor     */
201    EM_HUANY       =  81,  /* Harvard University machine-independent object f */
202    EM_PRISM       =  82,  /* SiTera Prism                                    */
203    EM_AVR         =  83,  /* Atmel AVR 8-bit microcontroller                 */
204    EM_FR30        =  84,  /* Fujitsu FR30                                    */
205    EM_D10V        =  85,  /* Mitsubishi D10V                                 */
206    EM_D30V        =  86,  /* Mitsubishi D30V                                 */
207    EM_V850        =  87,  /* NEC v850                                        */
208    EM_M32R        =  88,  /* Mitsubishi M32R                                 */
209    EM_MN10300     =  89,  /* Matsushita MN10300                              */
210    EM_MN10200     =  90,  /* Matsushita MN10200                              */
211    EM_PJ          =  91,  /* picoJava                                        */
212    EM_OPENRISC    =  92,  /* OpenRISC 32-bit embedded processor              */
213    EM_ARC_A5      =  93,  /* ARC Cores Tangent-A5                            */
214    EM_XTENSA      =  94,  /* Tensilica Xtensa Architecture                   */
215    EM_VIDEOCORE   =  95,  /* Alphamosaic VideoCore processor                 */
216    EM_TMM_GPP     =  96,  /* Thompson Multimedia General Purpose Processor   */
217    EM_NS32K       =  97,  /* National Semiconductor 32000 series             */
218    EM_TPC         =  98,  /* Tenor Network TPC processor                     */
219    EM_SNP1K       =  99,  /* Trebia SNP 1000 processor                       */
220    EM_ST200       = 100,  /* STMicroelectronics (www.st.com) ST200 microcont */
221    EM_IP2K        = 101,  /* Ubicom IP2xxx microcontroller family            */
222    EM_MAX         = 102,  /* MAX Processor                                   */
223    EM_CR          = 103,  /* National Semiconductor CompactRISC microprocess */
224    EM_F2MC16      = 104,  /* Fujitsu F2MC16                                  */
225    EM_MSP430      = 105,  /* Texas Instruments embedded microcontroller msp4 */
226    EM_BLACKFIN    = 106,  /* Analog Devices Blackfin (DSP) processor         */
227    EM_SE_C33      = 107,  /* S1C33 Family of Seiko Epson processors          */
228    EM_SEP         = 108,  /* Sharp embedded microprocessor                   */
229    EM_ARCA        = 109,  /* Arca RISC Microprocessor                        */
230    EM_UNICORE     = 110,  /* Microprocessor series from PKU-Unity Ltd. and M */
232    /*------------------------------------------------------------------------*/
233    /* ELF Magic Numbers Reserved For Texas Instruments                       */
234    /*                                                                        */
235    /*   The magic numbers 140-159 were reserved through SCO to be included   */
236    /*   in the official ELF specification.  Please see Don Darling           */
237    /*   regarding any changes or allocation of the numbers below.            */
238    /*                                                                        */
239    /*   When we allocate a number for use, SCO needs to be notified so they  */
240    /*   can update the ELF specification accordingly.                        */
241    /*------------------------------------------------------------------------*/
242    EM_TI_C6000    = 140,  /* Reserved for Texas Instruments; unused          */
243    EM_TI_UNUSED02 = 141,  /* Reserved for Texas Instruments; unused          */
244    EM_TI_UNUSED03 = 142,  /* Reserved for Texas Instruments; unused          */
245    EM_TI_UNUSED04 = 143,  /* Reserved for Texas Instruments; unused          */
246    EM_TI_UNUSED05 = 144,  /* Reserved for Texas Instruments; unused          */
247    EM_TI_UNUSED06 = 145,  /* Reserved for Texas Instruments; unused          */
248    EM_TI_UNUSED07 = 146,  /* Reserved for Texas Instruments; unused          */
249    EM_TI_UNUSED08 = 147,  /* Reserved for Texas Instruments; unused          */
250    EM_TI_UNUSED09 = 148,  /* Reserved for Texas Instruments; unused          */
251    EM_TI_UNUSED10 = 149,  /* Reserved for Texas Instruments; unused          */
252    EM_TI_UNUSED11 = 150,  /* Reserved for Texas Instruments; unused          */
253    EM_TI_UNUSED12 = 151,  /* Reserved for Texas Instruments; unused          */
254    EM_TI_UNUSED13 = 152,  /* Reserved for Texas Instruments; unused          */
255    EM_TI_UNUSED14 = 153,  /* Reserved for Texas Instruments; unused          */
256    EM_TI_UNUSED15 = 154,  /* Reserved for Texas Instruments; unused          */
257    EM_TI_UNUSED16 = 155,  /* Reserved for Texas Instruments; unused          */
258    EM_TI_UNUSED17 = 156,  /* Reserved for Texas Instruments; unused          */
259    EM_TI_UNUSED18 = 157,  /* Reserved for Texas Instruments; unused          */
260    EM_TI_UNUSED19 = 158,  /* Reserved for Texas Instruments; unused          */
261    EM_TI_UNUSED20 = 159   /* Reserved for Texas Instruments; unused          */
262 };
265 /*---------------------------------------------------------------------------*/
266 /* Object File Version (value of "e_version")                                */
267 /*---------------------------------------------------------------------------*/
268 enum
270    EV_NONE    = 0,  /* Invalid version */
271    EV_CURRENT = 1   /* Current version */
272 };
275 /*****************************************************************************/
276 /* ELF Identification                                                        */
277 /* PP. 1-6                                                                   */
278 /*****************************************************************************/
280 /*---------------------------------------------------------------------------*/
281 /* Identification Values for ELF Files                                       */
282 /*---------------------------------------------------------------------------*/
284 /* EI_MAG0 to EI_MAG3 */
285 enum
287    ELFMAG0 = 0x7f,  /* e_ident[EI_MAG0] */
288    ELFMAG1 = 'E',   /* e_ident[EI_MAG1] */
289    ELFMAG2 = 'L',   /* e_ident[EI_MAG2] */
290    ELFMAG3 = 'F'    /* e_ident[EI_MAG3] */
291 };
293 /* EI_CLASS */
294 enum
296    ELFCLASSNONE = 0,  /* Invalid class  */
297    ELFCLASS32   = 1,  /* 32-bit objects */
298    ELFCLASS64   = 2   /* 64-bit objects */
299 };
301 /* EI_DATA */
302 enum
304    ELFDATANONE = 0,  /* Invalid data encoding */
305    ELFDATA2LSB = 1,  /* Little-endian data    */
306    ELFDATA2MSB = 2   /* Big-endian data       */
307 };
309 /* EI_OSABI */
310 enum
312    ELFOSABI_NONE       = 0,   /* No extensions or unspecified       */
313    ELFOSABI_HPUX       = 1,   /* Hewlett-Packard HP-UX              */
314    ELFOSABI_NETBSD     = 2,   /* NetBSD                             */
315    ELFOSABI_LINUX      = 3,   /* Linux                              */
316    ELFOSABI_SOLARIS    = 6,   /* Sun Solaris                        */
317    ELFOSABI_AIX        = 7,   /* AIX                                */
318    ELFOSABI_IRIX       = 8,   /* IRIX                               */
319    ELFOSABI_FREEBSD    = 9,   /* FreeBSD                            */
320    ELFOSABI_TRU64      = 10,  /* Compaq TRU64 UNIX                  */
321    ELFOSABI_MODESTO    = 11,  /* Novell Modesto                     */
322    ELFOSABI_OPENBSD    = 12,  /* Open BSD                           */
323    ELFOSABI_OPENVMS    = 13,  /* Open VMS                           */
324    ELFOSABI_NSK        = 14,  /* Hewlett-Packard Non-Stop Kernel    */
325    ELFOSABI_AROS       = 15   /* Amiga Research OS                  */
326 };
328 /*****************************************************************************/
329 /* Program Header                                                            */
330 /* PP. 2-2                                                                   */
331 /*****************************************************************************/
333 /*---------------------------------------------------------------------------*/
334 /* Program Header Data Structure                                             */
335 /*---------------------------------------------------------------------------*/
336 struct Elf32_Phdr
338    Elf32_Word  p_type;    /* Segment type              */
339    Elf32_Off   p_offset;  /* Segment file offset       */
340    Elf32_Addr  p_vaddr;   /* Segment virtual address   */
341    Elf32_Addr  p_paddr;   /* Segment physical address  */
342    Elf32_Word  p_filesz;  /* Segment file image size   */
343    Elf32_Word  p_memsz;   /* Segment memory image size */
344    Elf32_Word  p_flags;   /* Segment flags             */
345    Elf32_Word  p_align;   /* Segment alignment         */
346 };
348 /*---------------------------------------------------------------------------*/
349 /* Segment Types (value of "p_type")                                         */
350 /*---------------------------------------------------------------------------*/
351 enum
353    PT_NULL    = 0,           /* Unused table entry                           */
354    PT_LOAD    = 1,           /* Loadable segment                             */
355    PT_DYNAMIC = 2,           /* Dynamic linking information                  */
356    PT_INTERP  = 3,           /* Interpreter path string location             */
357    PT_NOTE    = 4,           /* Location and size of auxiliary information   */
358    PT_SHLIB   = 5,           /* Shared library information                   */
359    PT_PHDR    = 6,           /* Location and size of program header table    */
360    PT_TLS     = 7,           /* Specifies the Thread-Local Storage template  */
361    PT_LOOS    = 0x60000000,  /* First OS-specific value                      */
362    PT_HIOS    = 0x6fffffff,  /* Last  OS-specific value                      */
363    PT_LOPROC  = 0x70000000,  /* First processor-specific value               */
364    PT_HIPROC  = 0x7fffffff   /* Last  processor-specific value               */
365 };
367 /*---------------------------------------------------------------------------*/
368 /* Segment Permissions (value of "p_flags")                                  */
369 /*---------------------------------------------------------------------------*/
370 enum
372    PF_X        = 0x1,         /* Execute                 */
373    PF_W        = 0x2,         /* Write                   */
374    PF_R        = 0x4,         /* Read                    */
375    PF_MASKOS   = 0x0ff00000,  /* OS-specific mask        */
376    PF_MASKPROC = 0xf0000000   /* Processor-specific mask */
377 };
379 /*****************************************************************************/
380 /* Sections                                                                  */
381 /* PP. 1-9                                                                   */
382 /*****************************************************************************/
384 /*---------------------------------------------------------------------------*/
385 /* Section Header Data Structure                                             */
386 /*---------------------------------------------------------------------------*/
387 struct Elf32_Shdr
389    Elf32_Word  sh_name;       /* Section name (offset into string section)   */
390    Elf32_Word  sh_type;       /* Section type                                */
391    Elf32_Word  sh_flags;      /* Section flags                               */
392    Elf32_Addr  sh_addr;       /* Address in memory image                     */
393    Elf32_Off   sh_offset;     /* File offset of section data                 */
394    Elf32_Word  sh_size;       /* Size of the section in bytes                */
395    Elf32_Word  sh_link;       /* Link to the section header table            */
396    Elf32_Word  sh_info;       /* Extra information depending on section type */
397    Elf32_Word  sh_addralign;  /* Address alignment constraints               */
398    Elf32_Word  sh_entsize;    /* Size of fixed-size entries in section       */
399 };
401 /*---------------------------------------------------------------------------*/
402 /* Special Section Indexes                                                   */
403 /*---------------------------------------------------------------------------*/
404 enum
406    SHN_UNDEF     = 0,       /* Referenced by undefined values          */
407    SHN_LORESERVE = 0xff00,  /* First reserved index                    */
408    SHN_LOPROC    = 0xff00,  /* First processor-specific index          */
409    SHN_HIPROC    = 0xff1f,  /* Last  processor-specific index          */
410    SHN_LOOS      = 0xff20,  /* First OS-specific index                 */
411    SHN_HIOS      = 0xff3f,  /* Last  OS-specific index                 */
412    SHN_ABS       = 0xfff1,  /* Referenced by absolute values           */
413    SHN_COMMON    = 0xfff2,  /* Referenced by common values             */
414    SHN_XINDEX    = 0xffff,  /* Indirect index reference (escape value) */
415    SHN_HIRESERVE = 0xffff   /* Last reserved index                     */
416 };
418 /*---------------------------------------------------------------------------*/
419 /* Section Types (value of "sh_type")                                        */
420 /*---------------------------------------------------------------------------*/
421 enum
423    SHT_NULL          = 0,           /* Inactive section                      */
424    SHT_PROGBITS      = 1,           /* Application-specific information      */
425    SHT_SYMTAB        = 2,           /* Symbol table                          */
426    SHT_STRTAB        = 3,           /* String table                          */
427    SHT_RELA          = 4,           /* Relocation entries (explicit addends) */
428    SHT_HASH          = 5,           /* Symbol hash table                     */
429    SHT_DYNAMIC       = 6,           /* Dynamic linking information           */
430    SHT_NOTE          = 7,           /* Miscellaneous information             */
431    SHT_NOBITS        = 8,           /* Contains no data in file              */
432    SHT_REL           = 9,           /* Relocation entries (no expl. addends) */
433    SHT_SHLIB         = 10,          /* Shared library                        */
434    SHT_DYNSYM        = 11,          /* Dynamic symbol table                  */
435    SHT_INIT_ARRAY    = 14,          /* Pointers to initialization functions  */
436    SHT_FINI_ARRAY    = 15,          /* Pointers to termination functions     */
437    SHT_PREINIT_ARRAY = 16,          /* Pointers to pre-init functions        */
438    SHT_GROUP         = 17,          /* Section group                         */
439    SHT_SYMTAB_SHNDX  = 18,          /* Section indexes for SHN_XINDEX refs.  */
440    SHT_LOOS          = 0x60000000,  /* First OS-specific type                */
441    SHT_HIOS          = 0x6fffffff,  /* Last  OS-specific type                */
442    SHT_LOPROC        = 0x70000000,  /* First processor-specific type         */
443    SHT_HIPROC        = 0x7fffffff,  /* Last  processor-specific type         */
444    SHT_LOUSER        = 0x80000000,  /* First application-specific type       */
445    SHT_HIUSER        = 0xffffffff   /* Last  application-specific type       */
446 };
448 /*---------------------------------------------------------------------------*/
449 /* Section Attribute Flags (value of "sh_flags")                             */
450 /*---------------------------------------------------------------------------*/
451 enum
453    SHF_WRITE            = 0x1,         /* Writable during process execution  */
454    SHF_ALLOC            = 0x2,         /* Loaded into processor memory       */
455    SHF_EXECINSTR        = 0x4,         /* Contains executable instructions   */
456    SHF_MERGE            = 0x10,        /* Can be merged                      */
457    SHF_STRINGS          = 0x20,        /* Contains null-terminated strings   */
458    SHF_INFO_LINK        = 0x40,        /* sh_info contains a section index   */
459    SHF_LINK_ORDER       = 0x80,        /* Maintain section ordering          */
460    SHF_OS_NONCONFORMING = 0x100,       /* OS-specific processing required    */
461    SHF_GROUP            = 0x200,       /* Member of a section group          */
462    SHF_TLS              = 0x400,       /* Contains Thread-Local Storage      */
463    SHF_MASKOS           = 0x0ff00000,  /* Mask of OS-specific flags          */
464    SHF_MASKPROC         = 0xf0000000   /* Mask for processor-specific flags  */
465 };
467 /*---------------------------------------------------------------------------*/
468 /* Section Group Flags                                                       */
469 /*---------------------------------------------------------------------------*/
470 enum
472    GRP_COMDAT   = 0x1,         /* Common data; only one is kept by linker */
473    GRP_MASKOS   = 0x0ff00000,  /* Mask for OS-specific group flags        */
474    GRP_MASKPROC = 0xf0000000   /* Mask for processor-specific group flags */
475 };
478 /*****************************************************************************/
479 /* Symbol Table                                                              */
480 /* PP. 1-18                                                                  */
481 /*****************************************************************************/
483 /*---------------------------------------------------------------------------*/
484 /* Symbol Table Entry Data Structure                                         */
485 /*---------------------------------------------------------------------------*/
486 struct Elf32_Sym
488    Elf32_Word  st_name;   /* String table offset for symbol name */
489    Elf32_Addr  st_value;  /* Symbol value                        */
490    Elf32_Word  st_size;   /* Symbol size                         */
491    uint8_t     st_info;   /* Symbol type and binding             */
492    uint8_t     st_other;  /* Symbol visibility                   */
493    Elf32_Half  st_shndx;  /* Symbol type / defining section      */
494 };
496 /*---------------------------------------------------------------------------*/
497 /* Undefined Symbol Index                                                    */
498 /*---------------------------------------------------------------------------*/
499 enum
501    STN_UNDEF = 0   /* First symbol table entry is always undefined */
502 };
504 /*---------------------------------------------------------------------------*/
505 /* Symbol Binding and Type Utility Functions.                                */
506 /*---------------------------------------------------------------------------*/
507 static inline uint8_t ELF32_ST_BIND(uint8_t i)       { return (i >> 4);      }
508 static inline uint8_t ELF32_ST_TYPE(uint8_t i)       { return (i & 0xf);     }
509 static inline uint8_t ELF32_ST_INFO(uint8_t b, uint8_t t) 
510                                             { return ((b << 4) + (t & 0xf)); }
511 static inline uint8_t ELF32_ST_VISIBILITY(uint8_t o) { return (o & 0x3);     }
514 /*---------------------------------------------------------------------------*/
515 /* Symbol Binding (value returned by ELF32_ST_BIND())                        */
516 /*---------------------------------------------------------------------------*/
517 enum
519    STB_LOCAL  = 0,   /* Symbol does not have external linkage */
520    STB_GLOBAL = 1,   /* Symbol has external linkage           */
521    STB_WEAK   = 2,   /* Symbol has weak external linkage      */
522    STB_LOOS   = 10,  /* First OS-specific binding             */
523    STB_HIOS   = 12,  /* Last  OS-specific binding             */
524    STB_LOPROC = 13,  /* First processor-specific binding      */
525    STB_HIPROC = 15   /* Last  processor-specific binding      */
526 };
528 /*---------------------------------------------------------------------------*/
529 /* Symbol Types (value returned by ELF32_ST_TYPE())                          */
530 /*---------------------------------------------------------------------------*/
531 enum
533    STT_NOTYPE  = 0,   /* Unspecified type                        */
534    STT_OBJECT  = 1,   /* Associated with a data object           */
535    STT_FUNC    = 2,   /* Associated with executable code         */
536    STT_SECTION = 3,   /* Associated with a section               */
537    STT_FILE    = 4,   /* Associated with a source file           */
538    STT_COMMON  = 5,   /* Labels an uninitialized common block    */
539    STT_TLS     = 6,   /* Specifies a thread-local storage entity */
540    STT_LOOS    = 10,  /* First OS-specific type                  */
541    STT_HIOS    = 12,  /* Last  OS-specific type                  */
542    STT_LOPROC  = 13,  /* First processor-specific type           */
543    STT_HIPROC  = 15   /* Last  processor-specific type           */
544 };
546 /*---------------------------------------------------------------------------*/
547 /* Symbol Visibility (value returned by ELF32_ST_VISIBILITY())               */
548 /*---------------------------------------------------------------------------*/
549 enum
551    STV_DEFAULT   = 0,  /* Visibility specified by binding type               */
552    STV_INTERNAL  = 1,  /* Like STV_HIDDEN, with processor-specific semantics */
553    STV_HIDDEN    = 2,  /* Not visible to other components                    */
554    STV_PROTECTED = 3   /* Visible in other components but not preemptable    */
555 };
557 /*****************************************************************************/
558 /* Relocation                                                                */
559 /* PP. 1-22                                                                  */
560 /*****************************************************************************/
562 /*---------------------------------------------------------------------------*/
563 /* Relocation Entries Data Structures                                        */
564 /*---------------------------------------------------------------------------*/
565 struct Elf32_Rel
567    Elf32_Addr  r_offset;  /* Offset of the relocatable value in the section */
568    Elf32_Word  r_info;    /* Symbol table index and relocation type         */
569 };
571 struct Elf32_Rela
573    Elf32_Addr  r_offset;  /* Offset of the relocatable value in the section */
574    Elf32_Word  r_info;    /* Symbol table index and relocation type         */
575    Elf32_Sword r_addend;  /* Constant addend used to compute new value      */
576 };
578 /*---------------------------------------------------------------------------*/
579 /* Relocation Symbol and Type Utility Functions.                             */
580 /*---------------------------------------------------------------------------*/
581 static inline uint32_t ELF32_R_SYM(uint32_t i)  { return (i >> 8);            }
582 static inline uint8_t  ELF32_R_TYPE(uint32_t i) { return (i & 0xFF);          }
583 static inline uint32_t ELF32_R_INFO(uint32_t s, uint8_t t) 
584                                                 { return ((s << 8) + t);      }
587 /*****************************************************************************/
588 /* Dynamic Section                                                           */
589 /* PP. 2-8                                                                   */
590 /*****************************************************************************/
591 struct Elf32_Dyn
593    Elf32_Sword  d_tag;
594    union
595    {
596       Elf32_Word  d_val;
597       Elf32_Addr  d_ptr;
598    } d_un;
599 };
601 /* Name                 Value           d_un        Executable  Shared Obj. */
602 /* ----                 -----           ----        ----------  ----------- */
603 enum
605    DT_NULL            = 0,           /* ignored     mandatory   mandatory   */
606    DT_NEEDED          = 1,           /* d_val       optional    optional    */
607    DT_PLTRELSZ        = 2,           /* d_val       optional    optional    */
608    DT_PLTGOT          = 3,           /* d_ptr       optional    optional    */
609    DT_HASH            = 4,           /* d_ptr       mandatory   mandatory   */
610    DT_STRTAB          = 5,           /* d_ptr       mandatory   mandatory   */
611    DT_SYMTAB          = 6,           /* d_ptr       mandatory   mandatory   */
612    DT_RELA            = 7,           /* d_ptr       mandatory   optional    */
613    DT_RELASZ          = 8,           /* d_val       mandatory   optional    */
614    DT_RELAENT         = 9,           /* d_val       mandatory   optional    */
615    DT_STRSZ           = 10,          /* d_val       mandatory   mandatory   */
616    DT_SYMENT          = 11,          /* d_val       mandatory   mandatory   */
617    DT_INIT            = 12,          /* d_ptr       optional    optional    */
618    DT_FINI            = 13,          /* d_ptr       optional    optional    */
619    DT_SONAME          = 14,          /* d_val       ignored     optional    */
620    DT_RPATH           = 15,          /* d_val       optional    ignored     */
621    DT_SYMBOLIC        = 16,          /* ignored     ignored     optional    */
622    DT_REL             = 17,          /* d_ptr       mandatory   optional    */
623    DT_RELSZ           = 18,          /* d_val       mandatory   optional    */
624    DT_RELENT          = 19,          /* d_val       mandatory   optional    */
625    DT_PLTREL          = 20,          /* d_val       optional    optional    */
626    DT_DEBUG           = 21,          /* d_ptr       optional    ignored     */
627    DT_TEXTREL         = 22,          /* ignored     optional    optional    */
628    DT_JMPREL          = 23,          /* d_ptr       optional    optional    */
629    DT_BIND_NOW        = 24,          /* ignored     optional    optional    */
630    DT_INIT_ARRAY      = 25,          /* d_ptr       optional    optional    */
631    DT_FINI_ARRAY      = 26,          /* d_ptr       optional    optional    */
632    DT_INIT_ARRAYSZ    = 27,          /* d_val       optional    optional    */
633    DT_FINI_ARRAYSZ    = 28,          /* d_val       optional    optional    */
634    DT_RUNPATH         = 29,          /* d_val       optional    optional    */
635    DT_FLAGS           = 30,          /* d_val       optional    optional    */
636    DT_ENCODING        = 32,          /* unspecified unspecified unspecified */
637    DT_PREINIT_ARRAY   = 32,          /* d_ptr       optional    ignored     */
638    DT_PREINIT_ARRAYSZ = 33,          /* d_val       optional    ignored     */
639    DT_LOOS            = 0x60000000,  /* unspecified unspecified unspecified */
640    DT_HIOS            = 0x6ffff000,  /* unspecified unspecified unspecified */
641    DT_LOPROC          = 0x70000000,  /* unspecified unspecified unspecified */
642    DT_HIPROC          = 0x7fffffff   /* unspecified unspecified unspecified */
643 }; 
646 /*---------------------------------------------------------------------------*/
647 /* DT_FLAGS values.                                                          */
648 /*---------------------------------------------------------------------------*/
649 enum
651   DF_ORIGIN     = 0x01, /* loaded object may reference $ORIGIN subst. string */
652   DF_SYMBOLIC   = 0x02, /* changes dynamic linker symbol resolution          */
653   DF_TEXTREL    = 0x04, /* do not allow relocation of non-writable segments  */
654   DF_BIND_NOW   = 0x08, /* don't use lazy binding                            */
655   DF_STATIC_TLS = 0x10, /* do not load this file dynamically                 */
656   DF_DIRECT_DEPENDENT = 0x20, /* limit global sym lookup to dependent list   */
657   DF_WORLD      = 0x40  /* Linux style global sym lookup, breadth-first      */
658 };
661 /*---------------------------------------------------------------------------*/
662 /* Dynamic Tag Database.                                                     */
663 /*---------------------------------------------------------------------------*/
665 /* Specifiers for which d_un union member to use                             */
667 enum
669    EDYN_UNTYPE_IGNORED,
670    EDYN_UNTYPE_VAL,
671    EDYN_UNTYPE_PTR,
672    EDYN_UNTYPE_UNSPECIFIED
673 };
676 /* Specifiers for executable/shared object file requirements                 */
678 enum
680    EDYN_TAGREQ_IGNORED,
681    EDYN_TAGREQ_MANDATORY,
682    EDYN_TAGREQ_OPTIONAL,
683    EDYN_TAGREQ_UNSPECIFIED
684 };
687 /* Data structure for one dynamic tag database entry                         */
689 struct EDYN_TAG
691    const char* d_tag_name;   /* tag name string                     */
692    Elf32_Sword d_tag_value;  /* DT_* tag value                      */
693    Elf32_Word  d_untype;     /* which d_un union member to use      */
694    Elf32_Word  d_exec_req;   /* requirement for executable files    */
695    Elf32_Word  d_shared_req; /* requirement for shared object files */
696 };
698 extern const struct EDYN_TAG EDYN_TAG_DB[];
700 /*****************************************************************************/
701 /* Special Section Database                                                  */
702 /*****************************************************************************/
704 /*---------------------------------------------------------------------------*/
705 /* Special Section Names                                                     */
706 /*---------------------------------------------------------------------------*/
707 #define ESCN_BSS_name            ".bss"
708 #define ESCN_COMMENT_name        ".comment"
709 #define ESCN_DATA1_name          ".data1"
710 #define ESCN_DATA_name           ".data"
711 #define ESCN_DEBUG_name          ".debug"
712 #define ESCN_DYNAMIC_name        ".dynamic"
713 #define ESCN_DYNSTR_name         ".dynstr"
714 #define ESCN_DYNSYM_name         ".dynsym"
715 #define ESCN_FINI_ARRAY_name     ".fini_array"
716 #define ESCN_FINI_name           ".fini"
717 #define ESCN_GOT_name            ".got"
718 #define ESCN_HASH_name           ".hash"
719 #define ESCN_INIT_ARRAY_name     ".init_array"
720 #define ESCN_INIT_name           ".init"
721 #define ESCN_INTERP_name         ".interp"
722 #define ESCN_LINE_name           ".line"
723 #define ESCN_NOTE_name           ".note"
724 #define ESCN_PLT_name            ".plt"
725 #define ESCN_PREINIT_ARRAY_name  ".preinit_array"
726 #define ESCN_RELA_name           ".rela"
727 #define ESCN_REL_name            ".rel"
728 #define ESCN_RODATA1_name        ".rodata1"
729 #define ESCN_RODATA_name         ".rodata"
730 #define ESCN_SHSTRTAB_name       ".shstrtab"
731 #define ESCN_STRTAB_name         ".strtab"
732 #define ESCN_SYMTAB_SHNDX_name   ".symtab_shndx"
733 #define ESCN_SYMTAB_name         ".symtab"
734 #define ESCN_TBSS_name           ".tbss"
735 #define ESCN_TDATA1_name         ".tdata1"
736 #define ESCN_TDATA_name          ".tdata"
737 #define ESCN_TEXT_name           ".text"
738 #define ESCN_ATTRIBUTES_name     "__TI_build_attributes"
739 #define ESCN_ICODE_name          "__TI_ICODE"
740 #define ESCN_XREF_name           "__TI_XREF"
742 /*---------------------------------------------------------------------------*/
743 /* Special Section Information Data Structure.                               */
744 /*---------------------------------------------------------------------------*/
745 struct ESCN
747    const char *name;
748    Elf32_Word  sh_type;
749    Elf32_Word  sh_entsize;
750    Elf32_Word  sh_flags;
751 };
753 extern const struct ESCN ESCN_DB[];
755 #endif /* ELF32_H */