Home | History | Annotate | Download | only in libelf
      1 /* This file defines generic ELF types, structures, and macros.
      2    Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005, 2007 Red Hat, Inc.
      3    This file is part of elfutils.
      4 
      5    This file is free software; you can redistribute it and/or modify
      6    it under the terms of either
      7 
      8      * the GNU Lesser General Public License as published by the Free
      9        Software Foundation; either version 3 of the License, or (at
     10        your option) any later version
     11 
     12    or
     13 
     14      * the GNU General Public License as published by the Free
     15        Software Foundation; either version 2 of the License, or (at
     16        your option) any later version
     17 
     18    or both in parallel, as here.
     19 
     20    elfutils is distributed in the hope that it will be useful, but
     21    WITHOUT ANY WARRANTY; without even the implied warranty of
     22    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     23    General Public License for more details.
     24 
     25    You should have received copies of the GNU General Public License and
     26    the GNU Lesser General Public License along with this program.  If
     27    not, see <http://www.gnu.org/licenses/>.  */
     28 
     29 #ifndef _GELF_H
     30 #define	_GELF_H 1
     31 
     32 #include <libelf.h>
     33 
     34 
     35 #ifdef __cplusplus
     36 extern "C" {
     37 #endif
     38 
     39 /* Class independent type definitions.  Correctly speaking this is not
     40    true.  We assume that 64-bit binaries are the largest class and
     41    therefore all other classes can be represented without loss.  */
     42 
     43 /* Type for a 16-bit quantity.  */
     44 typedef Elf64_Half GElf_Half;
     45 
     46 /* Types for signed and unsigned 32-bit quantities.  */
     47 typedef Elf64_Word GElf_Word;
     48 typedef	Elf64_Sword GElf_Sword;
     49 
     50 /* Types for signed and unsigned 64-bit quantities.  */
     51 typedef Elf64_Xword GElf_Xword;
     52 typedef	Elf64_Sxword GElf_Sxword;
     53 
     54 /* Type of addresses.  */
     55 typedef Elf64_Addr GElf_Addr;
     56 
     57 /* Type of file offsets.  */
     58 typedef Elf64_Off GElf_Off;
     59 
     60 
     61 /* The ELF file header.  This appears at the start of every ELF file.  */
     62 typedef Elf64_Ehdr GElf_Ehdr;
     63 
     64 /* Section header.  */
     65 typedef Elf64_Shdr GElf_Shdr;
     66 
     67 /* Section index.  */
     68 /* XXX This should probably be a larger type in preparation of times when
     69    regular section indices can be larger.  */
     70 typedef Elf64_Section GElf_Section;
     71 
     72 /* Symbol table entry.  */
     73 typedef Elf64_Sym GElf_Sym;
     74 
     75 /* The syminfo section if available contains additional information about
     76    every dynamic symbol.  */
     77 typedef Elf64_Syminfo GElf_Syminfo;
     78 
     79 /* Relocation table entry without addend (in section of type SHT_REL).  */
     80 typedef Elf64_Rel GElf_Rel;
     81 
     82 /* Relocation table entry with addend (in section of type SHT_RELA).  */
     83 typedef Elf64_Rela GElf_Rela;
     84 
     85 /* Program segment header.  */
     86 typedef Elf64_Phdr GElf_Phdr;
     87 
     88 /* Dynamic section entry.  */
     89 typedef Elf64_Dyn GElf_Dyn;
     90 
     91 
     92 /* Version definition sections.  */
     93 typedef Elf64_Verdef GElf_Verdef;
     94 
     95 /* Auxialiary version information.  */
     96 typedef Elf64_Verdaux GElf_Verdaux;
     97 
     98 /* Version dependency section.  */
     99 typedef Elf64_Verneed GElf_Verneed;
    100 
    101 /* Auxiliary needed version information.  */
    102 typedef Elf64_Vernaux GElf_Vernaux;
    103 
    104 
    105 /* Type for version symbol information.  */
    106 typedef Elf64_Versym GElf_Versym;
    107 
    108 
    109 /* Auxiliary vector.  */
    110 typedef Elf64_auxv_t GElf_auxv_t;
    111 
    112 
    113 /* Note section contents.  */
    114 typedef Elf64_Nhdr GElf_Nhdr;
    115 
    116 
    117 /* Move structure.  */
    118 typedef Elf64_Move GElf_Move;
    119 
    120 
    121 /* Library list structure.  */
    122 typedef Elf64_Lib GElf_Lib;
    123 
    124 
    125 /* How to extract and insert information held in the st_info field.  */
    126 
    127 #define GELF_ST_BIND(val)		ELF64_ST_BIND (val)
    128 #define GELF_ST_TYPE(val)		ELF64_ST_TYPE (val)
    129 #define GELF_ST_INFO(bind, type)	ELF64_ST_INFO (bind, type)
    130 
    131 /* How to extract information held in the st_other field.  */
    132 
    133 #define GELF_ST_VISIBILITY(val)		ELF64_ST_VISIBILITY (val)
    134 
    135 
    136 /* How to extract and insert information held in the r_info field.  */
    137 
    138 #define GELF_R_SYM(info)		ELF64_R_SYM (info)
    139 #define GELF_R_TYPE(info)		ELF64_R_TYPE (info)
    140 #define GELF_R_INFO(sym, type)		ELF64_R_INFO (sym, type)
    141 
    142 
    143 /* How to extract and insert information held in the m_info field.  */
    144 #define GELF_M_SYM(info)		ELF64_M_SYM (info)
    145 #define GELF_M_SIZE(info)		ELF64_M_SIZE (info)
    146 #define GELF_M_INFO(sym, size)		ELF64_M_INFO (sym, size)
    147 
    148 
    149 /* Get class of the file associated with ELF.  */
    150 extern int gelf_getclass (Elf *__elf);
    151 
    152 
    153 /* Return size of array of COUNT elements of the type denoted by TYPE
    154    in the external representation.  The binary class is taken from ELF.
    155    The result is based on version VERSION of the ELF standard.  */
    156 extern size_t gelf_fsize (Elf *__elf, Elf_Type __type, size_t __count,
    157 			  unsigned int __version);
    158 
    159 /* Retrieve object file header.  */
    160 extern GElf_Ehdr *gelf_getehdr (Elf *__elf, GElf_Ehdr *__dest);
    161 
    162 /* Update the ELF header.  */
    163 extern int gelf_update_ehdr (Elf *__elf, GElf_Ehdr *__src);
    164 
    165 /* Create new ELF header if none exists.  */
    166 extern unsigned long int gelf_newehdr (Elf *__elf, int __class);
    167 
    168 /* Get section at OFFSET.  */
    169 extern Elf_Scn *gelf_offscn (Elf *__elf, GElf_Off __offset);
    170 
    171 /* Retrieve section header.  */
    172 extern GElf_Shdr *gelf_getshdr (Elf_Scn *__scn, GElf_Shdr *__dst);
    173 
    174 /* Update section header.  */
    175 extern int gelf_update_shdr (Elf_Scn *__scn, GElf_Shdr *__src);
    176 
    177 /* Retrieve program header table entry.  */
    178 extern GElf_Phdr *gelf_getphdr (Elf *__elf, int __ndx, GElf_Phdr *__dst);
    179 
    180 /* Update the program header.  */
    181 extern int gelf_update_phdr (Elf *__elf, int __ndx, GElf_Phdr *__src);
    182 
    183 /* Create new program header with PHNUM entries.  */
    184 extern unsigned long int gelf_newphdr (Elf *__elf, size_t __phnum);
    185 
    186 
    187 /* Convert data structure from the representation in the file represented
    188    by ELF to their memory representation.  */
    189 extern Elf_Data *gelf_xlatetom (Elf *__elf, Elf_Data *__dest,
    190 				const Elf_Data *__src, unsigned int __encode);
    191 
    192 /* Convert data structure from to the representation in memory
    193    represented by ELF file representation.  */
    194 extern Elf_Data *gelf_xlatetof (Elf *__elf, Elf_Data *__dest,
    195 				const Elf_Data *__src, unsigned int __encode);
    196 
    197 
    198 /* Retrieve REL relocation info at the given index.  */
    199 extern GElf_Rel *gelf_getrel (Elf_Data *__data, int __ndx, GElf_Rel *__dst);
    200 
    201 /* Retrieve RELA relocation info at the given index.  */
    202 extern GElf_Rela *gelf_getrela (Elf_Data *__data, int __ndx, GElf_Rela *__dst);
    203 
    204 /* Update REL relocation information at given index.  */
    205 extern int gelf_update_rel (Elf_Data *__dst, int __ndx, GElf_Rel *__src);
    206 
    207 /* Update RELA relocation information at given index.  */
    208 extern int gelf_update_rela (Elf_Data *__dst, int __ndx, GElf_Rela *__src);
    209 
    210 
    211 /* Retrieve symbol information from the symbol table at the given index.  */
    212 extern GElf_Sym *gelf_getsym (Elf_Data *__data, int __ndx, GElf_Sym *__dst);
    213 
    214 /* Update symbol information in the symbol table at the given index.  */
    215 extern int gelf_update_sym (Elf_Data *__data, int __ndx, GElf_Sym *__src);
    216 
    217 
    218 /* Retrieve symbol information and separate section index from the
    219    symbol table at the given index.  */
    220 extern GElf_Sym *gelf_getsymshndx (Elf_Data *__symdata, Elf_Data *__shndxdata,
    221 				   int __ndx, GElf_Sym *__sym,
    222 				   Elf32_Word *__xshndx);
    223 
    224 /* Update symbol information and separate section index in the symbol
    225    table at the given index.  */
    226 extern int gelf_update_symshndx (Elf_Data *__symdata, Elf_Data *__shndxdata,
    227 				 int __ndx, GElf_Sym *__sym,
    228 				 Elf32_Word __xshndx);
    229 
    230 
    231 /* Retrieve additional symbol information from the symbol table at the
    232    given index.  */
    233 extern GElf_Syminfo *gelf_getsyminfo (Elf_Data *__data, int __ndx,
    234 				      GElf_Syminfo *__dst);
    235 
    236 /* Update additional symbol information in the symbol table at the
    237    given index.  */
    238 extern int gelf_update_syminfo (Elf_Data *__data, int __ndx,
    239 				GElf_Syminfo *__src);
    240 
    241 
    242 /* Get information from dynamic table at the given index.  */
    243 extern GElf_Dyn *gelf_getdyn (Elf_Data *__data, int __ndx, GElf_Dyn *__dst);
    244 
    245 /* Update information in dynamic table at the given index.  */
    246 extern int gelf_update_dyn (Elf_Data *__dst, int __ndx, GElf_Dyn *__src);
    247 
    248 
    249 /* Get move structure at the given index.  */
    250 extern GElf_Move *gelf_getmove (Elf_Data *__data, int __ndx, GElf_Move *__dst);
    251 
    252 /* Update move structure at the given index.  */
    253 extern int gelf_update_move (Elf_Data *__data, int __ndx,
    254 			     GElf_Move *__src);
    255 
    256 
    257 /* Get library from table at the given index.  */
    258 extern GElf_Lib *gelf_getlib (Elf_Data *__data, int __ndx, GElf_Lib *__dst);
    259 
    260 /* Update library in table at the given index.  */
    261 extern int gelf_update_lib (Elf_Data *__data, int __ndx, GElf_Lib *__src);
    262 
    263 
    264 
    265 /* Retrieve symbol version information at given index.  */
    266 extern GElf_Versym *gelf_getversym (Elf_Data *__data, int __ndx,
    267 				    GElf_Versym *__dst);
    268 
    269 /* Update symbol version information.  */
    270 extern int gelf_update_versym (Elf_Data *__data, int __ndx,
    271 			       GElf_Versym *__src);
    272 
    273 
    274 /* Retrieve required symbol version information at given offset.  */
    275 extern GElf_Verneed *gelf_getverneed (Elf_Data *__data, int __offset,
    276 				      GElf_Verneed *__dst);
    277 
    278 /* Update required symbol version information.  */
    279 extern int gelf_update_verneed (Elf_Data *__data, int __offset,
    280 				GElf_Verneed *__src);
    281 
    282 /* Retrieve additional required symbol version information at given offset.  */
    283 extern GElf_Vernaux *gelf_getvernaux (Elf_Data *__data, int __offset,
    284 				      GElf_Vernaux *__dst);
    285 
    286 /* Update additional required symbol version information.  */
    287 extern int gelf_update_vernaux (Elf_Data *__data, int __offset,
    288 				GElf_Vernaux *__src);
    289 
    290 
    291 /* Retrieve symbol version definition information at given offset.  */
    292 extern GElf_Verdef *gelf_getverdef (Elf_Data *__data, int __offset,
    293 				    GElf_Verdef *__dst);
    294 
    295 /* Update symbol version definition information.  */
    296 extern int gelf_update_verdef (Elf_Data *__data, int __offset,
    297 			       GElf_Verdef *__src);
    298 
    299 /* Retrieve additional symbol version definition information at given
    300    offset.  */
    301 extern GElf_Verdaux *gelf_getverdaux (Elf_Data *__data, int __offset,
    302 				      GElf_Verdaux *__dst);
    303 
    304 /* Update additional symbol version definition information.  */
    305 extern int gelf_update_verdaux (Elf_Data *__data, int __offset,
    306 				GElf_Verdaux *__src);
    307 
    308 
    309 /* Get auxv entry at the given index.  */
    310 extern GElf_auxv_t *gelf_getauxv (Elf_Data *__data, int __ndx,
    311 				  GElf_auxv_t *__dst);
    312 
    313 /* Update auxv entry at the given index.  */
    314 extern int gelf_update_auxv (Elf_Data *__data, int __ndx, GElf_auxv_t *__src);
    315 
    316 
    317 /* Get note header at the given offset into the data, and the offsets of
    318    the note's name and descriptor data.  Returns the offset of the next
    319    note header, or 0 for an invalid offset or corrupt note header.  */
    320 extern size_t gelf_getnote (Elf_Data *__data, size_t __offset,
    321 			    GElf_Nhdr *__result,
    322 			    size_t *__name_offset, size_t *__desc_offset);
    323 
    324 
    325 /* Compute simple checksum from permanent parts of the ELF file.  */
    326 extern long int gelf_checksum (Elf *__elf);
    327 
    328 #ifdef __cplusplus
    329 }
    330 #endif
    331 
    332 #endif	/* gelf.h */
    333