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, 2015 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 /* Header of a compressed section.  */
     89 typedef Elf64_Chdr GElf_Chdr;
     90 
     91 /* Dynamic section entry.  */
     92 typedef Elf64_Dyn GElf_Dyn;
     93 
     94 
     95 /* Version definition sections.  */
     96 typedef Elf64_Verdef GElf_Verdef;
     97 
     98 /* Auxialiary version information.  */
     99 typedef Elf64_Verdaux GElf_Verdaux;
    100 
    101 /* Version dependency section.  */
    102 typedef Elf64_Verneed GElf_Verneed;
    103 
    104 /* Auxiliary needed version information.  */
    105 typedef Elf64_Vernaux GElf_Vernaux;
    106 
    107 
    108 /* Type for version symbol information.  */
    109 typedef Elf64_Versym GElf_Versym;
    110 
    111 
    112 /* Auxiliary vector.  */
    113 typedef Elf64_auxv_t GElf_auxv_t;
    114 
    115 
    116 /* Note section contents.  */
    117 typedef Elf64_Nhdr GElf_Nhdr;
    118 
    119 
    120 /* Move structure.  */
    121 typedef Elf64_Move GElf_Move;
    122 
    123 
    124 /* Library list structure.  */
    125 typedef Elf64_Lib GElf_Lib;
    126 
    127 
    128 /* How to extract and insert information held in the st_info field.  */
    129 
    130 #define GELF_ST_BIND(val)		ELF64_ST_BIND (val)
    131 #define GELF_ST_TYPE(val)		ELF64_ST_TYPE (val)
    132 #define GELF_ST_INFO(bind, type)	ELF64_ST_INFO (bind, type)
    133 
    134 /* How to extract information held in the st_other field.  */
    135 
    136 #define GELF_ST_VISIBILITY(val)		ELF64_ST_VISIBILITY (val)
    137 
    138 
    139 /* How to extract and insert information held in the r_info field.  */
    140 
    141 #define GELF_R_SYM(info)		ELF64_R_SYM (info)
    142 #define GELF_R_TYPE(info)		ELF64_R_TYPE (info)
    143 #define GELF_R_INFO(sym, type)		ELF64_R_INFO (sym, type)
    144 
    145 
    146 /* How to extract and insert information held in the m_info field.  */
    147 #define GELF_M_SYM(info)		ELF64_M_SYM (info)
    148 #define GELF_M_SIZE(info)		ELF64_M_SIZE (info)
    149 #define GELF_M_INFO(sym, size)		ELF64_M_INFO (sym, size)
    150 
    151 
    152 /* Get class of the file associated with ELF.  */
    153 extern int gelf_getclass (Elf *__elf);
    154 
    155 
    156 /* Return size of array of COUNT elements of the type denoted by TYPE
    157    in the external representation.  The binary class is taken from ELF.
    158    The result is based on version VERSION of the ELF standard.  */
    159 extern size_t gelf_fsize (Elf *__elf, Elf_Type __type, size_t __count,
    160 			  unsigned int __version);
    161 
    162 /* Retrieve object file header.  */
    163 extern GElf_Ehdr *gelf_getehdr (Elf *__elf, GElf_Ehdr *__dest);
    164 
    165 /* Update the ELF header.  */
    166 extern int gelf_update_ehdr (Elf *__elf, GElf_Ehdr *__src);
    167 
    168 /* Create new ELF header if none exists.  */
    169 extern unsigned long int gelf_newehdr (Elf *__elf, int __class);
    170 
    171 /* Get section at OFFSET.  */
    172 extern Elf_Scn *gelf_offscn (Elf *__elf, GElf_Off __offset);
    173 
    174 /* Retrieve section header.  */
    175 extern GElf_Shdr *gelf_getshdr (Elf_Scn *__scn, GElf_Shdr *__dst);
    176 
    177 /* Update section header.  */
    178 extern int gelf_update_shdr (Elf_Scn *__scn, GElf_Shdr *__src);
    179 
    180 /* Retrieve program header table entry.  */
    181 extern GElf_Phdr *gelf_getphdr (Elf *__elf, int __ndx, GElf_Phdr *__dst);
    182 
    183 /* Update the program header.  */
    184 extern int gelf_update_phdr (Elf *__elf, int __ndx, GElf_Phdr *__src);
    185 
    186 /* Create new program header with PHNUM entries.  */
    187 extern unsigned long int gelf_newphdr (Elf *__elf, size_t __phnum);
    188 
    189 /* Get compression header of section if any.  Returns NULL and sets
    190    elf_errno if the section isn't compressed or an error occurred.  */
    191 extern GElf_Chdr *gelf_getchdr (Elf_Scn *__scn, GElf_Chdr *__dst);
    192 
    193 /* Convert data structure from the representation in the file represented
    194    by ELF to their memory representation.  */
    195 extern Elf_Data *gelf_xlatetom (Elf *__elf, Elf_Data *__dest,
    196 				const Elf_Data *__src, unsigned int __encode);
    197 
    198 /* Convert data structure from to the representation in memory
    199    represented by ELF file representation.  */
    200 extern Elf_Data *gelf_xlatetof (Elf *__elf, Elf_Data *__dest,
    201 				const Elf_Data *__src, unsigned int __encode);
    202 
    203 
    204 /* Retrieve REL relocation info at the given index.  */
    205 extern GElf_Rel *gelf_getrel (Elf_Data *__data, int __ndx, GElf_Rel *__dst);
    206 
    207 /* Retrieve RELA relocation info at the given index.  */
    208 extern GElf_Rela *gelf_getrela (Elf_Data *__data, int __ndx, GElf_Rela *__dst);
    209 
    210 /* Update REL relocation information at given index.  */
    211 extern int gelf_update_rel (Elf_Data *__dst, int __ndx, GElf_Rel *__src);
    212 
    213 /* Update RELA relocation information at given index.  */
    214 extern int gelf_update_rela (Elf_Data *__dst, int __ndx, GElf_Rela *__src);
    215 
    216 
    217 /* Retrieve symbol information from the symbol table at the given index.  */
    218 extern GElf_Sym *gelf_getsym (Elf_Data *__data, int __ndx, GElf_Sym *__dst);
    219 
    220 /* Update symbol information in the symbol table at the given index.  */
    221 extern int gelf_update_sym (Elf_Data *__data, int __ndx, GElf_Sym *__src);
    222 
    223 
    224 /* Retrieve symbol information and separate section index from the
    225    symbol table at the given index.  */
    226 extern GElf_Sym *gelf_getsymshndx (Elf_Data *__symdata, Elf_Data *__shndxdata,
    227 				   int __ndx, GElf_Sym *__sym,
    228 				   Elf32_Word *__xshndx);
    229 
    230 /* Update symbol information and separate section index in the symbol
    231    table at the given index.  */
    232 extern int gelf_update_symshndx (Elf_Data *__symdata, Elf_Data *__shndxdata,
    233 				 int __ndx, GElf_Sym *__sym,
    234 				 Elf32_Word __xshndx);
    235 
    236 
    237 /* Retrieve additional symbol information from the symbol table at the
    238    given index.  */
    239 extern GElf_Syminfo *gelf_getsyminfo (Elf_Data *__data, int __ndx,
    240 				      GElf_Syminfo *__dst);
    241 
    242 /* Update additional symbol information in the symbol table at the
    243    given index.  */
    244 extern int gelf_update_syminfo (Elf_Data *__data, int __ndx,
    245 				GElf_Syminfo *__src);
    246 
    247 
    248 /* Get information from dynamic table at the given index.  */
    249 extern GElf_Dyn *gelf_getdyn (Elf_Data *__data, int __ndx, GElf_Dyn *__dst);
    250 
    251 /* Update information in dynamic table at the given index.  */
    252 extern int gelf_update_dyn (Elf_Data *__dst, int __ndx, GElf_Dyn *__src);
    253 
    254 
    255 /* Get move structure at the given index.  */
    256 extern GElf_Move *gelf_getmove (Elf_Data *__data, int __ndx, GElf_Move *__dst);
    257 
    258 /* Update move structure at the given index.  */
    259 extern int gelf_update_move (Elf_Data *__data, int __ndx,
    260 			     GElf_Move *__src);
    261 
    262 
    263 /* Get library from table at the given index.  */
    264 extern GElf_Lib *gelf_getlib (Elf_Data *__data, int __ndx, GElf_Lib *__dst);
    265 
    266 /* Update library in table at the given index.  */
    267 extern int gelf_update_lib (Elf_Data *__data, int __ndx, GElf_Lib *__src);
    268 
    269 
    270 
    271 /* Retrieve symbol version information at given index.  */
    272 extern GElf_Versym *gelf_getversym (Elf_Data *__data, int __ndx,
    273 				    GElf_Versym *__dst);
    274 
    275 /* Update symbol version information.  */
    276 extern int gelf_update_versym (Elf_Data *__data, int __ndx,
    277 			       GElf_Versym *__src);
    278 
    279 
    280 /* Retrieve required symbol version information at given offset.  */
    281 extern GElf_Verneed *gelf_getverneed (Elf_Data *__data, int __offset,
    282 				      GElf_Verneed *__dst);
    283 
    284 /* Update required symbol version information.  */
    285 extern int gelf_update_verneed (Elf_Data *__data, int __offset,
    286 				GElf_Verneed *__src);
    287 
    288 /* Retrieve additional required symbol version information at given offset.  */
    289 extern GElf_Vernaux *gelf_getvernaux (Elf_Data *__data, int __offset,
    290 				      GElf_Vernaux *__dst);
    291 
    292 /* Update additional required symbol version information.  */
    293 extern int gelf_update_vernaux (Elf_Data *__data, int __offset,
    294 				GElf_Vernaux *__src);
    295 
    296 
    297 /* Retrieve symbol version definition information at given offset.  */
    298 extern GElf_Verdef *gelf_getverdef (Elf_Data *__data, int __offset,
    299 				    GElf_Verdef *__dst);
    300 
    301 /* Update symbol version definition information.  */
    302 extern int gelf_update_verdef (Elf_Data *__data, int __offset,
    303 			       GElf_Verdef *__src);
    304 
    305 /* Retrieve additional symbol version definition information at given
    306    offset.  */
    307 extern GElf_Verdaux *gelf_getverdaux (Elf_Data *__data, int __offset,
    308 				      GElf_Verdaux *__dst);
    309 
    310 /* Update additional symbol version definition information.  */
    311 extern int gelf_update_verdaux (Elf_Data *__data, int __offset,
    312 				GElf_Verdaux *__src);
    313 
    314 
    315 /* Get auxv entry at the given index.  */
    316 extern GElf_auxv_t *gelf_getauxv (Elf_Data *__data, int __ndx,
    317 				  GElf_auxv_t *__dst);
    318 
    319 /* Update auxv entry at the given index.  */
    320 extern int gelf_update_auxv (Elf_Data *__data, int __ndx, GElf_auxv_t *__src);
    321 
    322 
    323 /* Get note header at the given offset into the data, and the offsets of
    324    the note's name and descriptor data.  Returns the offset of the next
    325    note header, or 0 for an invalid offset or corrupt note header.  */
    326 extern size_t gelf_getnote (Elf_Data *__data, size_t __offset,
    327 			    GElf_Nhdr *__result,
    328 			    size_t *__name_offset, size_t *__desc_offset);
    329 
    330 
    331 /* Compute simple checksum from permanent parts of the ELF file.  */
    332 extern long int gelf_checksum (Elf *__elf);
    333 
    334 #ifdef __cplusplus
    335 }
    336 #endif
    337 
    338 #endif	/* gelf.h */
    339