Home | History | Annotate | Download | only in ArmShellCmdRunAxf
      1 /** @file
      2 Ported ELF include files from FreeBSD
      3 
      4 Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 
     14 **/
     15 /*-
     16  * Copyright (c) 1996-1998 John D. Polstra.
     17  * All rights reserved.
     18  *
     19  * Redistribution and use in source and binary forms, with or without
     20  * modification, are permitted provided that the following conditions
     21  * are met:
     22  * 1. Redistributions of source code must retain the above copyright
     23  *    notice, this list of conditions and the following disclaimer.
     24  * 2. Redistributions in binary form must reproduce the above copyright
     25  *    notice, this list of conditions and the following disclaimer in the
     26  *    documentation and/or other materials provided with the distribution.
     27  *
     28  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     29  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     32  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     37  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     38  * SUCH DAMAGE.
     39  *
     40  * $FreeBSD: src/sys/sys/elf32.h,v 1.8.14.2 2007/12/03 21:30:36 marius Exp $
     41  */
     42 
     43 #ifndef _SYS_ELF32_H_
     44 #define _SYS_ELF32_H_ 1
     45 
     46 
     47 /*
     48  * ELF definitions common to all 32-bit architectures.
     49  */
     50 
     51 typedef UINT32  Elf32_Addr;
     52 typedef UINT16  Elf32_Half;
     53 typedef UINT32  Elf32_Off;
     54 typedef INT32   Elf32_Sword;
     55 typedef UINT32  Elf32_Word;
     56 typedef UINT64  Elf32_Lword;
     57 
     58 typedef Elf32_Word      Elf32_Hashelt;
     59 
     60 /* Non-standard class-dependent datatype used for abstraction. */
     61 typedef Elf32_Word      Elf32_Size;
     62 typedef Elf32_Sword     Elf32_Ssize;
     63 
     64 /*
     65  * ELF header.
     66  */
     67 
     68 typedef struct {
     69   unsigned char   e_ident[EI_NIDENT]; /* File identification. */
     70   Elf32_Half      e_type;             /* File type. */
     71   Elf32_Half      e_machine;          /* Machine architecture. */
     72   Elf32_Word      e_version;          /* ELF format version. */
     73   Elf32_Addr      e_entry;            /* Entry point. */
     74   Elf32_Off       e_phoff;            /* Program header file offset. */
     75   Elf32_Off       e_shoff;            /* Section header file offset. */
     76   Elf32_Word      e_flags;            /* Architecture-specific flags. */
     77   Elf32_Half      e_ehsize;           /* Size of ELF header in bytes. */
     78   Elf32_Half      e_phentsize;        /* Size of program header entry. */
     79   Elf32_Half      e_phnum;            /* Number of program header entries. */
     80   Elf32_Half      e_shentsize;        /* Size of section header entry. */
     81   Elf32_Half      e_shnum;            /* Number of section header entries. */
     82   Elf32_Half      e_shstrndx;         /* Section name strings section. */
     83 } Elf32_Ehdr;
     84 
     85 /*
     86  * Section header.
     87  */
     88 
     89 typedef struct {
     90   Elf32_Word      sh_name;        /* Section name (index into the
     91                                      section header string table). */
     92   Elf32_Word      sh_type;        /* Section type. */
     93   Elf32_Word      sh_flags;       /* Section flags. */
     94   Elf32_Addr      sh_addr;        /* Address in memory image. */
     95   Elf32_Off       sh_offset;      /* Offset in file. */
     96   Elf32_Word      sh_size;        /* Size in bytes. */
     97   Elf32_Word      sh_link;        /* Index of a related section. */
     98   Elf32_Word      sh_info;        /* Depends on section type. */
     99   Elf32_Word      sh_addralign;   /* Alignment in bytes. */
    100   Elf32_Word      sh_entsize;     /* Size of each entry in section. */
    101 } Elf32_Shdr;
    102 
    103 /*
    104  * Program header.
    105  */
    106 
    107 typedef struct {
    108   Elf32_Word      p_type;         /* Entry type. */
    109   Elf32_Off       p_offset;       /* File offset of contents. */
    110   Elf32_Addr      p_vaddr;        /* Virtual address in memory image. */
    111   Elf32_Addr      p_paddr;        /* Physical address (not used). */
    112   Elf32_Word      p_filesz;       /* Size of contents in file. */
    113   Elf32_Word      p_memsz;        /* Size of contents in memory. */
    114   Elf32_Word      p_flags;        /* Access permission flags. */
    115   Elf32_Word      p_align;        /* Alignment in memory and file. */
    116 } Elf32_Phdr;
    117 
    118 /*
    119  * Dynamic structure.  The ".dynamic" section contains an array of them.
    120  */
    121 
    122 typedef struct {
    123   Elf32_Sword     d_tag;          /* Entry type. */
    124   union {
    125     Elf32_Word      d_val;  /* Integer value. */
    126     Elf32_Addr      d_ptr;  /* Address value. */
    127   } d_un;
    128 } Elf32_Dyn;
    129 
    130 /*
    131  * Relocation entries.
    132  */
    133 
    134 /* Relocations that don't need an addend field. */
    135 typedef struct {
    136   Elf32_Addr      r_offset;       /* Location to be relocated. */
    137   Elf32_Word      r_info;         /* Relocation type and symbol index. */
    138 } Elf32_Rel;
    139 
    140 /* Relocations that need an addend field. */
    141 typedef struct {
    142   Elf32_Addr      r_offset;       /* Location to be relocated. */
    143   Elf32_Word      r_info;         /* Relocation type and symbol index. */
    144   Elf32_Sword     r_addend;       /* Addend. */
    145 } Elf32_Rela;
    146 
    147 /* Macros for accessing the fields of r_info. */
    148 #define ELF32_R_SYM(info)       ((info) >> 8)
    149 #define ELF32_R_TYPE(info)      ((unsigned char)(info))
    150 
    151 /* Macro for constructing r_info from field values. */
    152 #define ELF32_R_INFO(sym, type) (((sym) << 8) + (unsigned char)(type))
    153 
    154 /*
    155  *      Note entry header
    156  */
    157 typedef Elf_Note Elf32_Nhdr;
    158 
    159 /*
    160  *      Move entry
    161  */
    162 typedef struct {
    163   Elf32_Lword     m_value;        /* symbol value */
    164   Elf32_Word      m_info;         /* size + index */
    165   Elf32_Word      m_poffset;      /* symbol offset */
    166   Elf32_Half      m_repeat;       /* repeat count */
    167   Elf32_Half      m_stride;       /* stride info */
    168 } Elf32_Move;
    169 
    170 /*
    171  *      The macros compose and decompose values for Move.r_info
    172  *
    173  *      sym = ELF32_M_SYM(M.m_info)
    174  *      size = ELF32_M_SIZE(M.m_info)
    175  *      M.m_info = ELF32_M_INFO(sym, size)
    176  */
    177 #define ELF32_M_SYM(info)       ((info)>>8)
    178 #define ELF32_M_SIZE(info)      ((unsigned char)(info))
    179 #define ELF32_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size))
    180 
    181 /*
    182  *      Hardware/Software capabilities entry
    183  */
    184 typedef struct {
    185   Elf32_Word      c_tag;          /* how to interpret value */
    186   union {
    187     Elf32_Word      c_val;
    188     Elf32_Addr      c_ptr;
    189   } c_un;
    190 } Elf32_Cap;
    191 
    192 /*
    193  * Symbol table entries.
    194  */
    195 
    196 typedef struct {
    197   Elf32_Word      st_name;        /* String table index of name. */
    198   Elf32_Addr      st_value;       /* Symbol value. */
    199   Elf32_Word      st_size;        /* Size of associated object. */
    200   unsigned char   st_info;        /* Type and binding information. */
    201   unsigned char   st_other;       /* Reserved (not used). */
    202   Elf32_Half      st_shndx;       /* Section index of symbol. */
    203 } Elf32_Sym;
    204 
    205 /* Macros for accessing the fields of st_info. */
    206 #define ELF32_ST_BIND(info)             ((info) >> 4)
    207 #define ELF32_ST_TYPE(info)             ((info) & 0xf)
    208 
    209 /* Macro for constructing st_info from field values. */
    210 #define ELF32_ST_INFO(bind, type)       (((bind) << 4) + ((type) & 0xf))
    211 
    212 /* Macro for accessing the fields of st_other. */
    213 #define ELF32_ST_VISIBILITY(oth)        ((oth) & 0x3)
    214 
    215 /* Structures used by Sun & GNU symbol versioning. */
    216 typedef struct
    217 {
    218   Elf32_Half      vd_version;
    219   Elf32_Half      vd_flags;
    220   Elf32_Half      vd_ndx;
    221   Elf32_Half      vd_cnt;
    222   Elf32_Word      vd_hash;
    223   Elf32_Word      vd_aux;
    224   Elf32_Word      vd_next;
    225 } Elf32_Verdef;
    226 
    227 typedef struct
    228 {
    229   Elf32_Word      vda_name;
    230   Elf32_Word      vda_next;
    231 } Elf32_Verdaux;
    232 
    233 typedef struct
    234 {
    235   Elf32_Half      vn_version;
    236   Elf32_Half      vn_cnt;
    237   Elf32_Word      vn_file;
    238   Elf32_Word      vn_aux;
    239   Elf32_Word      vn_next;
    240 } Elf32_Verneed;
    241 
    242 typedef struct
    243 {
    244   Elf32_Word      vna_hash;
    245   Elf32_Half      vna_flags;
    246   Elf32_Half      vna_other;
    247   Elf32_Word      vna_name;
    248   Elf32_Word      vna_next;
    249 } Elf32_Vernaux;
    250 
    251 typedef Elf32_Half Elf32_Versym;
    252 
    253 typedef struct {
    254   Elf32_Half      si_boundto;     /* direct bindings - symbol bound to */
    255   Elf32_Half      si_flags;       /* per symbol flags */
    256 } Elf32_Syminfo;
    257 
    258 #endif /* !_SYS_ELF32_H_ */
    259