diff options
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/elf/e_elf.c | 39 | ||||
-rw-r--r-- | src/format/elf/e_elf.h | 6 | ||||
-rw-r--r-- | src/format/exe_format-int.h | 5 | ||||
-rw-r--r-- | src/format/exe_format.c | 22 | ||||
-rw-r--r-- | src/format/exe_format.h | 10 |
5 files changed, 81 insertions, 1 deletions
diff --git a/src/format/elf/e_elf.c b/src/format/elf/e_elf.c index a6399ab..0493df8 100644 --- a/src/format/elf/e_elf.c +++ b/src/format/elf/e_elf.c @@ -59,6 +59,7 @@ elf_format *load_elf(const uint8_t *content, off_t length) EXE_FORMAT(result)->length = length; EXE_FORMAT(result)->find_section = (find_section_fc)find_elf_section; + EXE_FORMAT(result)->get_symbols = (get_symbols_fc)get_elf_symbols; memcpy(&result->header, content, sizeof(Elf32_Ehdr)); @@ -75,3 +76,41 @@ elf_format *load_elf(const uint8_t *content, off_t length) return result; } + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* labels = liste des commentaires à insérer. [OUT] * +* types = type des symboles listés. [OUT] * +* offsets = liste des indices des commentaires. [OUT] * +* * +* Description : Récupère tous les symboles présents dans le contenu binaire. * +* * +* Retour : Nombre d'éléments mis en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +size_t get_elf_symbols(const elf_format *format, char ***labels, SymbolType **types, uint64_t **offsets) +{ + size_t result; /* Quantité à retourner */ + size_t i; /* Boucle de parcours */ + + result = format->sym_count; + + *labels = (char **)calloc(result, sizeof(char *)); + *types = (SymbolType *)calloc(result, sizeof(SymbolType)); + *offsets = (uint64_t *)calloc(result, sizeof(uint64_t)); + + for (i = 0; i < format->sym_count; i++) + { + (*labels)[i] = strdup(format->symbols[i].name); + (*types)[i] = STP_SECTION; + (*offsets)[i] = format->symbols[i].address; + } + + return result; + +} diff --git a/src/format/elf/e_elf.h b/src/format/elf/e_elf.h index fabee77..d4bf39b 100644 --- a/src/format/elf/e_elf.h +++ b/src/format/elf/e_elf.h @@ -30,6 +30,9 @@ #include <sys/types.h> +#include "../exe_format.h" + + /* Description du format ELF */ typedef struct _elf_format elf_format; @@ -39,7 +42,8 @@ typedef struct _elf_format elf_format; /* Prend en charge un nouvel ELF. */ elf_format *load_elf(const uint8_t *, off_t); - +/* Récupère tous les symboles présents dans le contenu binaire. */ +size_t get_elf_symbols(const elf_format *, char ***, SymbolType **, uint64_t **); diff --git a/src/format/exe_format-int.h b/src/format/exe_format-int.h index a8333de..b437087 100644 --- a/src/format/exe_format-int.h +++ b/src/format/exe_format-int.h @@ -32,6 +32,10 @@ /* Recherche une section donnée au sein de binaire. */ typedef bool (* find_section_fc) (const exe_format *, const char *, off_t *, off_t *, uint64_t *); +/* Récupère tous les symboles présents dans le contenu binaire. */ +typedef size_t (* get_symbols_fc) (const exe_format *, char ***, SymbolType **, uint64_t **); + + /* Support générique d'un format d'exécutable */ @@ -41,6 +45,7 @@ struct _exe_format off_t length; /* Taille de ce contenu */ find_section_fc find_section; /* Recherche d'une section */ + get_symbols_fc get_symbols; /* Liste des symboles présents */ }; diff --git a/src/format/exe_format.c b/src/format/exe_format.c index 48a4d4c..5cbaba5 100644 --- a/src/format/exe_format.c +++ b/src/format/exe_format.c @@ -51,3 +51,25 @@ bool find_exe_section(const exe_format *format, const char *target, off_t *offse return format->find_section(format, target, offset, size, voffset); } + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* labels = liste des commentaires à insérer. [OUT] * +* types = type des symboles listés. [OUT] * +* offsets = liste des indices des commentaires. [OUT] * +* * +* Description : Récupère tous les symboles présents dans le contenu binaire. * +* * +* Retour : Nombre d'éléments mis en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +size_t get_exe_symbols(const exe_format *format, char ***labels, SymbolType **types, uint64_t **offsets) +{ + return format->get_symbols(format, labels, types, offsets); + +} diff --git a/src/format/exe_format.h b/src/format/exe_format.h index 0ec727b..3dab5a7 100644 --- a/src/format/exe_format.h +++ b/src/format/exe_format.h @@ -35,11 +35,21 @@ typedef struct _exe_format exe_format; +/* Types de symbole */ +typedef enum _SymbolType +{ + STP_SECTION /* Simple morceau de code */ + +} SymbolType; + /* Recherche une section donnée au sein de binaire. */ bool find_exe_section(const exe_format *, const char *, off_t *, off_t *, uint64_t *); +/* Récupère tous les symboles présents dans le contenu binaire. */ +size_t get_exe_symbols(const exe_format *, char ***, SymbolType **, uint64_t **); + |