/* OpenIDA - Outil d'analyse de fichiers binaires * elf-int.h - prototypes pour les structures internes du format ELF * * Copyright (C) 2008 Cyrille Bagard * * This file is part of OpenIDA. * * OpenIDA is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * OpenIDA 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 Foobar. If not, see . */ #ifndef _FORMAT_ELF_ELF_INT_H #define _FORMAT_ELF_ELF_INT_H #include #include #include "../exe_format-int.h" /* Chaîne de caractères présente */ typedef struct _elf_string { const char *value; /* Valeur humainement lisible */ size_t len; /* Longueur de la chaîne */ vmpa_t address; /* Adresse de localisation */ } elf_string; /* Symbole trouvé */ typedef struct _elf_symbol { const char *name; /* Désignation du symbole */ uint64_t address; /* Adresse du symbole */ off_t size; /* Taille du code associé */ } elf_symbol; /* Relocalisation trouvée */ typedef struct _elf_relocation { const char *name; /* Désignation du symbole */ vmpa_t address; /* Adresse du symbole */ } elf_relocation; /* Description du format ELF */ struct _elf_format { exe_format dummy; /* A laisser en premier */ Elf32_Ehdr header; /* En-tête du format */ bool is_32b; /* Format du binaire */ char *sec_names; /* Noms des sections */ size_t sec_size; /* Taille de ces définitions */ elf_relocation *relocations; /* Liste des relocalisations */ size_t rel_count; /* Taille de cette liste */ GBinRoutine **routines; /* Liste des routines trouvées */ size_t routines_count; /* Nombre de ces routines */ elf_symbol *symbols; /* Liste des symboles */ size_t sym_count; /* Taille de cette liste */ elf_string *strings; /* Liste des chaînes */ size_t str_count; /* Taille de cette liste */ }; /* En-tête de programme ELF */ typedef union _Elf_Phdr { Elf32_Phdr header32; /* Version 32 bits */ Elf64_Phdr header64; /* Version 64 bits */ } Elf_Phdr; #define ELF_PHDR(fmt, hdr, fld) (fmt->is_32b ? (hdr)->header32.fld : (hdr)->header64.fld) /* Entrée de la table de relocalisation */ typedef union _Elf_Rel { Elf32_Rel rel32; /* Version 32 bits */ Elf64_Rel rel64; /* Version 64 bits */ } Elf_Rel; #define ELF_SIZEOF_REL(fmt) (fmt->is_32b ? sizeof(Elf32_Rel) : sizeof(Elf64_Rel)) #define ELF_REL(fmt, rl, fld) (fmt->is_32b ? rl.rel32.fld : rl.rel64.fld) #define ELF_REL_SYM(fmt, rl) (fmt->is_32b ? ELF32_R_SYM(rl.rel32.r_info) : ELF64_R_SYM(rl.rel64.r_info)) #define ELF_REL_TYPE(fmt, rl) (fmt->is_32b ? ELF32_R_TYPE(rl.rel32.r_info) : ELF64_R_TYPE(rl.rel64.r_info)) /* Information sur un symbole */ typedef union _Elf_Sym { Elf32_Sym sym32; /* Version 32 bits */ Elf64_Sym sym64; /* Version 64 bits */ } Elf_Sym; #define ELF_SIZEOF_SYM(fmt) (fmt->is_32b ? sizeof(Elf32_Sym) : sizeof(Elf64_Sym)) #define ELF_SYM(fmt, sb, fld) (fmt->is_32b ? sb.sym32.fld : sb.sym64.fld) #define ELF_ST_TYPE ELF32_ST_TYPE #endif /* _FORMAT_ELF_ELF_INT_H */