summaryrefslogtreecommitdiff
path: root/src/format/elf/elf-int.h
blob: 02cc2ddc995ac359b3c8a1919e022d9e230820c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134

/* 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 <http://www.gnu.org/licenses/>.
 */


#ifndef _FORMAT_ELF_ELF_INT_H
#define _FORMAT_ELF_ELF_INT_H



#include <elf.h>
#include <sys/types.h>


#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       */
    uint64_t vaddress;                      /* Adresse de localisation     */

} elf_string;

/* Symbole trouvé */
typedef struct _elf_symbol
{
    const char *name;                       /* Désignation du symbole      */
    uint64_t address;                       /* Adresse du symbole          */

} elf_symbol;



/* 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_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 section ELF */
typedef union _Elf_Shdr
{
    Elf32_Shdr section32;                   /* Version 32 bits             */
    Elf64_Shdr section64;                   /* Version 64 bits             */

} Elf_Shdr;

#define ELF_SHDR(fmt, sec, fld) (fmt->is_32b ? sec.section32.fld : sec.section64.fld)


/* 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)






#endif  /* _FORMAT_ELF_ELF_INT_H */