/* This file is part of centaur. * * centaur is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License 2 as * published by the Free Software Foundation. * centaur is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with centaur. If not, see . */ /*! * @file types.h * @brief libelfu's Elfu* types. * * libelfu provides an abstraction of the data in ELF files * to more closely model the dependencies between them, and * thus to facilitate consistent editing. */ #ifndef __LIBELFU_TYPES_H__ #define __LIBELFU_TYPES_H__ #include #include #include /*! * ELFU model of a symbol table entry. */ typedef struct ElfuSym { /*! Offset into linked string table */ GElf_Word name; /*! Explicit value */ GElf_Addr value; /*! Size of object referenced */ GElf_Word size; /*! Binding type (GLOBAL, LOCAL, ...) */ unsigned char bind; /*! Type (FUNC, SECTION, ...) */ unsigned char type; /*! Always 0, currently meaningless (see ELF spec) */ unsigned char other; /*! If non-null, the section referenced. */ struct ElfuScn *scnptr; /*! If scnptr is invalid, then this is ABS, COMMON, or UNDEF. */ int shndx; /*! Entry in a symbol table */ CIRCLEQ_ENTRY(ElfuSym) elem; } ElfuSym; /*! * ELFU model of a symbol table. */ typedef struct ElfuSymtab { /*! All parsed symbols */ CIRCLEQ_HEAD(Syms, ElfuSym) syms; } ElfuSymtab; /*! * ELFU model of a relocation entry. */ typedef struct ElfuRel { /*! Location to patch */ GElf_Addr offset; /*! Symbol to calculate value for */ GElf_Word sym; /*! Relocation type (machine specific) */ unsigned char type; /*! addendUsed == 0: Use addend from relocation destination (REL). * addendUsed != 0: Use explicit addend (RELA). */ int addendUsed; /*! Explicit addend in RELA tables */ GElf_Sword addend; /*! Element in table */ CIRCLEQ_ENTRY(ElfuRel) elem; } ElfuRel; /*! * ELFU model of a relocation table. */ typedef struct ElfuReltab { /*! All parsed relocation entries */ CIRCLEQ_HEAD(Rels, ElfuRel) rels; } ElfuReltab; /*! * ELFU model of an ELF section. * * Several members of the SHDR are repeated in abstract form and take * precedence if present. For example, if linkptr is non-NULL then * it points to another section and the SHDR's numeric sh_link member * is to be ignored and recomputed by the layouter. */ typedef struct ElfuScn { /*! SHDR as per ELF specification. * Several values are ignored or recomputed from other members of * ElfuScn. */ GElf_Shdr shdr; /*! malloc()ed buffer containing this section's flat data backbuffer. * Present for all sections that occupy space in the file. */ char *databuf; /*! Pointer to a section, meaning dependent on sh_type. * Preferred over sh_link if non-null. */ struct ElfuScn *linkptr; /*! Pointer to a section, meaning dependent on sh_type. * Preferred over sh_info if non-null. */ struct ElfuScn *infoptr; /*! If this section is a clone of another section, then this * points to that other section. * Used during code injection to facilitate relocation. */ struct ElfuScn *oldptr; /*! Translated contents of a symbol table. */ struct ElfuSymtab symtab; /*! Translated contents of a relocation table. */ struct ElfuReltab reltab; /*! Element linking this section into an ElfuPhdr's childScnList, * or into an ElfuElf's orphanScnList. */ CIRCLEQ_ENTRY(ElfuScn) elemChildScn; } ElfuScn; /*! * ELFU model of an ELF PHDR. */ typedef struct ElfuPhdr { /*! PHDR as per ELF specification. */ GElf_Phdr phdr; /*! Sections to be shifted in file/memory together with this PHDR */ CIRCLEQ_HEAD(ChildScnList, ElfuScn) childScnList; /*! PHDRs to be shifted in file/memory together with this PHDR */ CIRCLEQ_HEAD(ChildPhdrList, ElfuPhdr) childPhdrList; /*! Element linking this section into an ElfuPhdr's childPhdrList */ CIRCLEQ_ENTRY(ElfuPhdr) elemChildPhdr; /*! Element linking this section into an ElfuElf's phdrList */ CIRCLEQ_ENTRY(ElfuPhdr) elem; } ElfuPhdr; /*! * ELFU model of an ELF file header */ typedef struct { /*! The ELF class -- ELFCLASS32/ELFCLASS64 */ int elfclass; /*! EHDR as per ELF specification */ GElf_Ehdr ehdr; /*! PHDRs that are not dependent on others. * Usually, LOAD and GNU_STACK. */ CIRCLEQ_HEAD(PhdrList, ElfuPhdr) phdrList; /*! Sections not in any PHDR, and thus not loaded at runtime. * Usually .symtab, .strtab, .shstrtab, .debug_*, ... */ CIRCLEQ_HEAD(OrphanScnList, ElfuScn) orphanScnList; /*! Pointer to ElfuScn containing .shstrtab. * Parsed from EHDR for convenience. */ ElfuScn *shstrtab; /*! Pointer to ElfuScn containing .symtab. * Parsed from list of sections for convenience. */ ElfuScn *symtab; } ElfuElf; #endif