Home | History | Annotate | Download | only in libelf
      1 /* Abstract description of component ELF types.
      2    Copyright (C) 1998, 1999, 2000, 2002, 2004 Red Hat, Inc.
      3    Written by Ulrich Drepper <drepper (at) redhat.com>, 1998.
      4 
      5    This program is free software; you can redistribute it and/or modify
      6    it under the terms of the GNU General Public License as published by
      7    the Free Software Foundation, version 2.
      8 
      9    This program is distributed in the hope that it will be useful,
     10    but WITHOUT ANY WARRANTY; without even the implied warranty of
     11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12    GNU General Public License for more details.
     13 
     14    You should have received a copy of the GNU General Public License
     15    along with this program; if not, write to the Free Software Foundation,
     16    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
     17 
     18 /* ELF header.  */
     19 #define Ehdr(Bits, Ext) \
     20 START (Bits, Ehdr, Ext##Ehdr)						      \
     21   TYPE_EXTRA (unsigned char e_ident[EI_NIDENT];)			      \
     22   TYPE_XLATE (memmove (tdest->e_ident, tsrc->e_ident, EI_NIDENT);)	      \
     23   TYPE_NAME (ElfW2(Bits, Ext##Half), e_type)				      \
     24   TYPE_NAME (ElfW2(Bits, Ext##Half), e_machine)				      \
     25   TYPE_NAME (ElfW2(Bits, Ext##Word), e_version)				      \
     26   TYPE_NAME (ElfW2(Bits, Ext##Addr), e_entry)				      \
     27   TYPE_NAME (ElfW2(Bits, Ext##Off), e_phoff)				      \
     28   TYPE_NAME (ElfW2(Bits, Ext##Off), e_shoff)				      \
     29   TYPE_NAME (ElfW2(Bits, Ext##Word), e_flags)				      \
     30   TYPE_NAME (ElfW2(Bits, Ext##Half), e_ehsize)				      \
     31   TYPE_NAME (ElfW2(Bits, Ext##Half), e_phentsize)			      \
     32   TYPE_NAME (ElfW2(Bits, Ext##Half), e_phnum)				      \
     33   TYPE_NAME (ElfW2(Bits, Ext##Half), e_shentsize)			      \
     34   TYPE_NAME (ElfW2(Bits, Ext##Half), e_shnum)				      \
     35   TYPE_NAME (ElfW2(Bits, Ext##Half), e_shstrndx)			      \
     36 END (Bits, Ext##Ehdr)
     37 
     38 #define Ehdr32(Ext) \
     39   Ehdr(32, Ext)
     40 #define Ehdr64(Ext) \
     41   Ehdr(64, Ext)
     42 
     43 
     44 /* Program header.  */
     45 #define Phdr32(Ext) \
     46 START (32, Phdr, Ext##Phdr)						      \
     47   TYPE_NAME (ElfW2(32, Ext##Word), p_type)				      \
     48   TYPE_NAME (ElfW2(32, Ext##Off), p_offset)				      \
     49   TYPE_NAME (ElfW2(32, Ext##Addr), p_vaddr)				      \
     50   TYPE_NAME (ElfW2(32, Ext##Addr), p_paddr)				      \
     51   TYPE_NAME (ElfW2(32, Ext##Word), p_filesz)				      \
     52   TYPE_NAME (ElfW2(32, Ext##Word), p_memsz)				      \
     53   TYPE_NAME (ElfW2(32, Ext##Word), p_flags)				      \
     54   TYPE_NAME (ElfW2(32, Ext##Word), p_align)				      \
     55 END (32, Ext##Phdr)
     56 #define Phdr64(Ext) \
     57 START (64, Phdr, Ext##Phdr)						      \
     58   TYPE_NAME (ElfW2(64, Ext##Word), p_type)				      \
     59   TYPE_NAME (ElfW2(64, Ext##Word), p_flags)				      \
     60   TYPE_NAME (ElfW2(64, Ext##Off), p_offset)				      \
     61   TYPE_NAME (ElfW2(64, Ext##Addr), p_vaddr)				      \
     62   TYPE_NAME (ElfW2(64, Ext##Addr), p_paddr)				      \
     63   TYPE_NAME (ElfW2(64, Ext##Xword), p_filesz)				      \
     64   TYPE_NAME (ElfW2(64, Ext##Xword), p_memsz)				      \
     65   TYPE_NAME (ElfW2(64, Ext##Xword), p_align)				      \
     66 END (64, Ext##Phdr)
     67 
     68 
     69 /* Section header.  */
     70 #define Shdr32(Ext) \
     71 START (32, Shdr, Ext##Shdr)						      \
     72   TYPE_NAME (ElfW2(32, Ext##Word), sh_name)				      \
     73   TYPE_NAME (ElfW2(32, Ext##Word), sh_type)				      \
     74   TYPE_NAME (ElfW2(32, Ext##Word), sh_flags)				      \
     75   TYPE_NAME (ElfW2(32, Ext##Addr), sh_addr)				      \
     76   TYPE_NAME (ElfW2(32, Ext##Off), sh_offset)				      \
     77   TYPE_NAME (ElfW2(32, Ext##Word), sh_size)				      \
     78   TYPE_NAME (ElfW2(32, Ext##Word), sh_link)				      \
     79   TYPE_NAME (ElfW2(32, Ext##Word), sh_info)				      \
     80   TYPE_NAME (ElfW2(32, Ext##Word), sh_addralign)			      \
     81   TYPE_NAME (ElfW2(32, Ext##Word), sh_entsize)				      \
     82 END (32, Ext##Shdr)
     83 #define Shdr64(Ext) \
     84 START (64, Shdr, Ext##Shdr)						      \
     85   TYPE_NAME (ElfW2(64, Ext##Word), sh_name)				      \
     86   TYPE_NAME (ElfW2(64, Ext##Word), sh_type)				      \
     87   TYPE_NAME (ElfW2(64, Ext##Xword), sh_flags)				      \
     88   TYPE_NAME (ElfW2(64, Ext##Addr), sh_addr)				      \
     89   TYPE_NAME (ElfW2(64, Ext##Off), sh_offset)				      \
     90   TYPE_NAME (ElfW2(64, Ext##Xword), sh_size)				      \
     91   TYPE_NAME (ElfW2(64, Ext##Word), sh_link)				      \
     92   TYPE_NAME (ElfW2(64, Ext##Word), sh_info)				      \
     93   TYPE_NAME (ElfW2(64, Ext##Xword), sh_addralign)			      \
     94   TYPE_NAME (ElfW2(64, Ext##Xword), sh_entsize)				      \
     95 END (64, Ext##Shdr)
     96 
     97 
     98 /* Symbol table.  */
     99 #define Sym32(Ext) \
    100 START (32, Sym, Ext##Sym)						      \
    101   TYPE_NAME (ElfW2(32, Ext##Word), st_name)				      \
    102   TYPE_NAME (ElfW2(32, Ext##Addr), st_value)				      \
    103   TYPE_NAME (ElfW2(32, Ext##Word), st_size)				      \
    104   TYPE_EXTRA (unsigned char st_info;)					      \
    105   TYPE_XLATE (tdest->st_info = tsrc->st_info;)				      \
    106   TYPE_EXTRA (unsigned char st_other;)					      \
    107   TYPE_XLATE (tdest->st_other = tsrc->st_other;)			      \
    108   TYPE_NAME (ElfW2(32, Ext##Half), st_shndx)				      \
    109 END (32, Ext##Sym)
    110 #define Sym64(Ext) \
    111 START (64, Sym, Ext##Sym)						      \
    112   TYPE_NAME (ElfW2(64, Ext##Word), st_name)				      \
    113   TYPE_EXTRA (unsigned char st_info;)					      \
    114   TYPE_XLATE (tdest->st_info = tsrc->st_info;)				      \
    115   TYPE_EXTRA (unsigned char st_other;)					      \
    116   TYPE_XLATE (tdest->st_other = tsrc->st_other;)			      \
    117   TYPE_NAME (ElfW2(64, Ext##Half), st_shndx)				      \
    118   TYPE_NAME (ElfW2(64, Ext##Addr), st_value)				      \
    119   TYPE_NAME (ElfW2(64, Ext##Xword), st_size)				      \
    120 END (64, Ext##Sym)
    121 
    122 
    123 /* Relocation.  */
    124 #define Rel32(Ext) \
    125 START (32, Rel, Ext##Rel)						      \
    126   TYPE_NAME (ElfW2(32, Ext##Addr), r_offset)				      \
    127   TYPE_NAME (ElfW2(32, Ext##Word), r_info)				      \
    128 END (32, Ext##Rel)
    129 #define Rel64(Ext) \
    130 START (64, Rel, Ext##Rel)						      \
    131   TYPE_NAME (ElfW2(64, Ext##Addr), r_offset)				      \
    132   TYPE_NAME (ElfW2(64, Ext##Xword), r_info)				      \
    133 END (64, Ext##Rel)
    134 
    135 #define Rela32(Ext) \
    136 START (32, Rela, Ext##Rela)						      \
    137   TYPE_NAME (ElfW2(32, Ext##Addr), r_offset)				      \
    138   TYPE_NAME (ElfW2(32, Ext##Word), r_info)				      \
    139   TYPE_NAME (ElfW2(32, Ext##Sword), r_addend)				      \
    140 END (32, Ext##Rela)
    141 #define Rela64(Ext) \
    142 START (64, Rela, Ext##Rela)						      \
    143   TYPE_NAME (ElfW2(64, Ext##Addr), r_offset)				      \
    144   TYPE_NAME (ElfW2(64, Ext##Xword), r_info)				      \
    145   TYPE_NAME (ElfW2(64, Ext##Sxword), r_addend)				      \
    146 END (64, Ext##Rela)
    147 
    148 
    149 /* Note entry header.  */
    150 #define Note(Bits, Ext) \
    151 START (Bits, Nhdr, Ext##Nhdr)						      \
    152   TYPE_NAME (ElfW2(Bits, Ext##Word), n_namesz)				      \
    153   TYPE_NAME (ElfW2(Bits, Ext##Word), n_descsz)				      \
    154   TYPE_NAME (ElfW2(Bits, Ext##Word), n_type)				      \
    155 END (Bits, Ext##Nhdr)
    156 
    157 #define Note32(Ext) \
    158   Note (32, Ext)
    159 #define Note64(Ext) \
    160   Note (64, Ext)
    161 
    162 
    163 /* Dynamic section data.  */
    164 #define Dyn32(Ext) \
    165 START (32, Dyn, Ext##Dyn)						      \
    166   TYPE_NAME (ElfW2(32, Ext##Sword), d_tag)				      \
    167   TYPE_EXTRA (union {)							      \
    168   TYPE_EXTRA (ElfW2(32, Ext##Word) d_val;)				      \
    169   TYPE_EXTRA (ElfW2(32, Ext##Addr) d_ptr;)				      \
    170   TYPE_XLATE (Elf32_cvt_Addr1 (&tdest->d_un.d_val, &tsrc->d_un.d_val);)	      \
    171   TYPE_EXTRA (ElfW2(32, Ext##Off) d_off;)				      \
    172   TYPE_EXTRA (} d_un;)							      \
    173 END (32, Ext##Dyn)
    174 #define Dyn64(Ext) \
    175 START (64, Dyn, Ext##Dyn)						      \
    176   TYPE_NAME (ElfW2(64, Ext##Xword), d_tag)				      \
    177   TYPE_EXTRA (union {)							      \
    178   TYPE_EXTRA (ElfW2(64, Ext##Xword) d_val;)				      \
    179   TYPE_EXTRA (ElfW2(64, Ext##Addr) d_ptr;)				      \
    180   TYPE_XLATE (Elf64_cvt_Addr1 (&tdest->d_un.d_val, &tsrc->d_un.d_val);)	      \
    181   TYPE_EXTRA (} d_un;)							      \
    182 END (64, Ext##Dyn)
    183 
    184 
    185 #ifndef GENERATE_CONVERSION
    186 /* Version definitions.  */
    187 # define Verdef(Bits, Ext) \
    188 START (Bits, Verdef, Ext##Verdef)					      \
    189   TYPE_NAME (ElfW2(Bits, Ext##Half), vd_version)			      \
    190   TYPE_NAME (ElfW2(Bits, Ext##Half), vd_flags)				      \
    191   TYPE_NAME (ElfW2(Bits, Ext##Half), vd_ndx)				      \
    192   TYPE_NAME (ElfW2(Bits, Ext##Half), vd_cnt)				      \
    193   TYPE_NAME (ElfW2(Bits, Ext##Word), vd_hash)				      \
    194   TYPE_NAME (ElfW2(Bits, Ext##Word), vd_aux)				      \
    195   TYPE_NAME (ElfW2(Bits, Ext##Word), vd_next)				      \
    196 END (Bits, Ext##Verdef)
    197 
    198 # define Verdef32(Ext) \
    199   Verdef (32, Ext)
    200 # define Verdef64(Ext) \
    201   Verdef (64, Ext)
    202 
    203 # define Verdaux(Bits, Ext) \
    204 START (Bits, Verdaux, Ext##Verdaux)					      \
    205   TYPE_NAME (ElfW2(Bits, Ext##Word), vda_name)				      \
    206   TYPE_NAME (ElfW2(Bits, Ext##Word), vda_next)				      \
    207 END (Bits, Ext##Verdaux)
    208 
    209 # define Verdaux32(Ext) \
    210   Verdaux (32, Ext)
    211 # define Verdaux64(Ext) \
    212   Verdaux (64, Ext)
    213 
    214 /* Required versions.  */
    215 # define Verneed(Bits, Ext) \
    216 START (Bits, Verneed, Ext##Verneed)					      \
    217   TYPE_NAME (ElfW2(Bits, Ext##Half), vn_version)			      \
    218   TYPE_NAME (ElfW2(Bits, Ext##Half), vn_cnt)				      \
    219   TYPE_NAME (ElfW2(Bits, Ext##Word), vn_file)				      \
    220   TYPE_NAME (ElfW2(Bits, Ext##Word), vn_aux)				      \
    221   TYPE_NAME (ElfW2(Bits, Ext##Word), vn_next)				      \
    222 END (Bits, Ext##Verneed)
    223 
    224 # define Verneed32(Ext) \
    225   Verneed (32, Ext)
    226 # define Verneed64(Ext) \
    227   Verneed (64, Ext)
    228 
    229 # define Vernaux(Bits, Ext) \
    230 START (Bits, Vernaux, Ext##Vernaux)					      \
    231   TYPE_NAME (ElfW2(Bits, Ext##Word), vna_hash)				      \
    232   TYPE_NAME (ElfW2(Bits, Ext##Half), vna_flags)				      \
    233   TYPE_NAME (ElfW2(Bits, Ext##Half), vna_other)				      \
    234   TYPE_NAME (ElfW2(Bits, Ext##Word), vna_name)				      \
    235   TYPE_NAME (ElfW2(Bits, Ext##Word), vna_next)				      \
    236 END (Bits, Ext##Vernaux)
    237 
    238 # define Vernaux32(Ext) \
    239   Vernaux (32, Ext)
    240 # define Vernaux64(Ext) \
    241   Vernaux (64, Ext)
    242 #endif
    243 
    244 /* Symbol information.  */
    245 #define Syminfo(Bits, Ext) \
    246 START (Bits, Syminfo, Ext##Syminfo)					      \
    247   TYPE_NAME (ElfW2(Bits, Ext##Half), si_boundto)			      \
    248   TYPE_NAME (ElfW2(Bits, Ext##Half), si_flags)				      \
    249 END (Bits, Ext##Syminfo)
    250 
    251 #define Syminfo32(Ext) \
    252   Syminfo (32, Ext)
    253 #define Syminfo64(Ext) \
    254   Syminfo (64, Ext)
    255 
    256 /* Move information.  */
    257 #define Move(Bits, Ext) \
    258 START (Bits, Move, Ext##Move)						      \
    259   TYPE_NAME (ElfW2(Bits, Ext##Xword), m_value)				      \
    260   TYPE_NAME (ElfW2(Bits, Ext##Xword), m_info)				      \
    261   TYPE_NAME (ElfW2(Bits, Ext##Xword), m_poffset)			      \
    262   TYPE_NAME (ElfW2(Bits, Ext##Half), m_repeat)				      \
    263   TYPE_NAME (ElfW2(Bits, Ext##Half), m_stride)				      \
    264 END (Bits, Ext##Move)
    265 
    266 #define Move32(Ext) \
    267   Move (32, Ext)
    268 #define Move64(Ext) \
    269   Move (64, Ext)
    270 
    271 #define Lib(Bits, Ext) \
    272 START (Bits, Lib, Ext##Lib)						      \
    273   TYPE_NAME (ElfW2(Bits, Ext##Word), l_name)				      \
    274   TYPE_NAME (ElfW2(Bits, Ext##Word), l_time_stamp)			      \
    275   TYPE_NAME (ElfW2(Bits, Ext##Word), l_checksum)			      \
    276   TYPE_NAME (ElfW2(Bits, Ext##Word), l_version)				      \
    277   TYPE_NAME (ElfW2(Bits, Ext##Word), l_flags)				      \
    278 END (Bits, Ext##Lib)
    279 
    280 #define Lib32(Ext) \
    281   Lib (32, Ext)
    282 #define Lib64(Ext) \
    283   Lib (64, Ext)
    284