summaryrefslogtreecommitdiff
path: root/src/format
diff options
context:
space:
mode:
Diffstat (limited to 'src/format')
-rw-r--r--src/format/elf/e_elf.c46
-rw-r--r--src/format/elf/e_elf.h2
-rw-r--r--src/format/exe_format-int.h3
-rw-r--r--src/format/exe_format.c22
-rw-r--r--src/format/exe_format.h2
5 files changed, 75 insertions, 0 deletions
diff --git a/src/format/elf/e_elf.c b/src/format/elf/e_elf.c
index 0493df8..f716846 100644
--- a/src/format/elf/e_elf.c
+++ b/src/format/elf/e_elf.c
@@ -60,6 +60,7 @@ elf_format *load_elf(const uint8_t *content, off_t length)
EXE_FORMAT(result)->find_section = (find_section_fc)find_elf_section;
EXE_FORMAT(result)->get_symbols = (get_symbols_fc)get_elf_symbols;
+ EXE_FORMAT(result)->resolve_symbol = (resolve_symbol_fc)resolve_elf_symbol;
memcpy(&result->header, content, sizeof(Elf32_Ehdr));
@@ -114,3 +115,48 @@ size_t get_elf_symbols(const elf_format *format, char ***labels, SymbolType **ty
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = informations chargées à consulter. *
+* label = étiquette du symbole si trouvé. [OUT] *
+* type = type du symbole trouvé. [OUT] *
+* offset = adresse à cibler, puis décallage final. [OUT] *
+* *
+* Description : Recherche le symbole correspondant à une adresse. *
+* *
+* Retour : true si l'opération a été un succès, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool resolve_elf_symbol(const elf_format *format, char **label, SymbolType *type, uint64_t *offset)
+{
+ bool result; /* Bilan à retourner */
+ size_t best_index; /* Meilleur symbole trouvé */
+ uint64_t best_addr; /* Meilleure adresse trouvée */
+ size_t i; /* Boucle de parcours */
+
+ best_addr = UINT64_MAX;
+
+ for (i = 0; i < format->sym_count; i++)
+ if (format->symbols[i].address <= *offset && (*offset - format->symbols[i].address) < best_addr)
+ {
+ best_index = i;
+ best_addr = *offset - format->symbols[i].address;
+ }
+
+ result = (best_addr != UINT64_MAX);
+
+ if (result)
+ {
+ *label = strdup(format->symbols[best_index].name);
+ *type = STP_SECTION;
+ *offset -= format->symbols[best_index].address;
+ }
+
+ return result;
+
+}
diff --git a/src/format/elf/e_elf.h b/src/format/elf/e_elf.h
index d4bf39b..e101fc6 100644
--- a/src/format/elf/e_elf.h
+++ b/src/format/elf/e_elf.h
@@ -45,6 +45,8 @@ 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 **);
+/* Recherche le symbole correspondant à une adresse. */
+bool resolve_elf_symbol(const elf_format *, char **, SymbolType *, uint64_t *);
diff --git a/src/format/exe_format-int.h b/src/format/exe_format-int.h
index b437087..d1f9381 100644
--- a/src/format/exe_format-int.h
+++ b/src/format/exe_format-int.h
@@ -35,6 +35,8 @@ typedef bool (* find_section_fc) (const exe_format *, const char *, off_t *, off
/* 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 **);
+/* Recherche le symbole correspondant à une adresse. */
+typedef bool (* resolve_symbol_fc) (const exe_format *, char **, SymbolType *, uint64_t *);
@@ -46,6 +48,7 @@ struct _exe_format
find_section_fc find_section; /* Recherche d'une section */
get_symbols_fc get_symbols; /* Liste des symboles présents */
+ resolve_symbol_fc resolve_symbol; /* Recherche de symboles */
};
diff --git a/src/format/exe_format.c b/src/format/exe_format.c
index 5cbaba5..1481d22 100644
--- a/src/format/exe_format.c
+++ b/src/format/exe_format.c
@@ -73,3 +73,25 @@ size_t get_exe_symbols(const exe_format *format, char ***labels, SymbolType **ty
return format->get_symbols(format, labels, types, offsets);
}
+
+
+/******************************************************************************
+* *
+* Paramètres : format = informations chargées à consulter. *
+* label = étiquette du symbole si trouvé. [OUT] *
+* type = type du symbole trouvé. [OUT] *
+* offset = adresse à cibler, puis décallage final. [OUT] *
+* *
+* Description : Recherche le symbole correspondant à une adresse. *
+* *
+* Retour : true si l'opération a été un succès, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool resolve_exe_symbol(const exe_format *format, char **label, SymbolType *type, uint64_t *offset)
+{
+ return format->resolve_symbol(format, label, type, offset);
+
+}
diff --git a/src/format/exe_format.h b/src/format/exe_format.h
index 3dab5a7..f859e13 100644
--- a/src/format/exe_format.h
+++ b/src/format/exe_format.h
@@ -50,6 +50,8 @@ bool find_exe_section(const exe_format *, const char *, off_t *, off_t *, uint64
/* Récupère tous les symboles présents dans le contenu binaire. */
size_t get_exe_symbols(const exe_format *, char ***, SymbolType **, uint64_t **);
+/* Recherche le symbole correspondant à une adresse. */
+bool resolve_exe_symbol(const exe_format *, char **, SymbolType *, uint64_t *);