blob: 65fc922a80001916dab28f40b9a508958986b725 (
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
|
/* 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 */
off_t size; /* Taille du code associé */
} 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 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 */
|