diff options
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/elf/elf.c | 55 | ||||
-rw-r--r-- | src/format/executable-int.h | 4 | ||||
-rw-r--r-- | src/format/executable.c | 41 | ||||
-rw-r--r-- | src/format/executable.h | 3 |
4 files changed, 103 insertions, 0 deletions
diff --git a/src/format/elf/elf.c b/src/format/elf/elf.c index 0336ba3..1254e52 100644 --- a/src/format/elf/elf.c +++ b/src/format/elf/elf.c @@ -69,6 +69,9 @@ static SourceEndian g_elf_format_get_endianness(const GElfFormat *); /* Indique le type d'architecture visée par le format. */ static const char *g_elf_format_get_target_machine(const GElfFormat *); +/* Fournit l'adresse principale associée à un format Elf. */ +static bool g_elf_format_get_main_address(GElfFormat *, vmpa2t *); + /* Etend la définition des portions au sein d'un binaire. */ static void g_elf_format_refine_portions(GElfFormat *); @@ -161,6 +164,7 @@ static void g_elf_format_class_init(GElfFormatClass *klass) exe = G_EXE_FORMAT_CLASS(klass); exe->get_machine = (get_target_machine_fc)g_elf_format_get_target_machine; + exe->get_main_addr = (get_main_addr_fc)g_elf_format_get_main_address; exe->refine_portions = (refine_portions_fc)g_elf_format_refine_portions; exe->translate_phys = (translate_phys_fc)g_elf_format_translate_offset_into_vmpa; @@ -397,6 +401,57 @@ static const char *g_elf_format_get_target_machine(const GElfFormat *format) /****************************************************************************** * * +* Paramètres : format = description de l'exécutable à consulter. * +* addr = adresse principale trouvée si possible. [OUT] * +* * +* Description : Fournit l'adresse principale associée à un format Elf. * +* * +* Retour : Bilan des recherches. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_elf_format_get_main_address(GElfFormat *format, vmpa2t *addr) +{ + bool result; /* Bilan à retourner */ + GBinSymbol *symbol; /* Point d'entrée trouvé */ + GBinFormat *base; /* Version d'instance parente */ + const mrange_t *range; /* Emplacement de ce point */ + + result = false; + symbol = NULL; + + base = G_BIN_FORMAT(format); + + if (g_binary_format_find_symbol_by_label(base, "main", &symbol)) + goto done; + + if (g_binary_format_find_symbol_by_label(base, "_start", &symbol)) + goto done; + + if (g_binary_format_find_symbol_by_label(base, "entry_point", &symbol)) + goto done; + + done: + + if (symbol != NULL) + { + result = true; + + range = g_binary_symbol_get_range(symbol); + + copy_vmpa(addr, get_mrange_addr(range)); + + } + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : format = informations chargées à consulter. * * * * Description : Etend la définition des portions au sein d'un binaire. * diff --git a/src/format/executable-int.h b/src/format/executable-int.h index 8a5f197..64050e3 100644 --- a/src/format/executable-int.h +++ b/src/format/executable-int.h @@ -35,6 +35,9 @@ /* Indique le type d'architecture visée par le format. */ typedef const char * (* get_target_machine_fc) (const GExeFormat *); +/* Fournit l'adresse principale associée à un format. */ +typedef bool (* get_main_addr_fc) (GExeFormat *, vmpa2t *); + /* Etend la définition des portions au sein d'un binaire. */ typedef void (* refine_portions_fc) (GExeFormat *); @@ -68,6 +71,7 @@ struct _GExeFormatClass GBinFormatClass parent; /* A laisser en premier */ get_target_machine_fc get_machine; /* Architecture ciblée */ + get_main_addr_fc get_main_addr; /* Obtention d'adresse première*/ refine_portions_fc refine_portions; /* Décrit les portions binaires*/ translate_phys_fc translate_phys; /* Correspondance phys -> vmpa */ diff --git a/src/format/executable.c b/src/format/executable.c index 3d3847c..fe3448d 100644 --- a/src/format/executable.c +++ b/src/format/executable.c @@ -242,6 +242,47 @@ const char *g_exe_format_get_target_machine(const GExeFormat *format) /****************************************************************************** * * +* Paramètres : format = description de l'exécutable à consulter. * +* addr = adresse principale trouvée si possible. [OUT] * +* * +* Description : Fournit l'adresse principale associée à un format. * +* * +* Retour : Bilan des recherches. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_exe_format_get_main_address(GExeFormat *format, vmpa2t *addr) +{ + bool result; /* Bilan à retourner */ + GBinFormat *base; /* Version d'instance parente */ + + result = false; + + if (G_EXE_FORMAT_GET_CLASS(format)->get_main_addr != NULL) + result = G_EXE_FORMAT_GET_CLASS(format)->get_main_addr(format, addr); + + if (!result) + { + base = G_BIN_FORMAT(format); + + g_rw_lock_reader_lock(&base->pt_lock); + + if (base->ep_count > 0) + result = g_exe_format_translate_address_into_vmpa(format, base->entry_points[0], addr); + + g_rw_lock_reader_unlock(&base->pt_lock); + + } + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : format = instance à traiter. * * status = barre de statut à tenir informée. * * * diff --git a/src/format/executable.h b/src/format/executable.h index e6d9abf..985efb2 100644 --- a/src/format/executable.h +++ b/src/format/executable.h @@ -64,6 +64,9 @@ GDbgFormat *g_exe_format_get_debug_info(const GExeFormat *, size_t); /* Indique le type d'architecture visée par le format. */ const char *g_exe_format_get_target_machine(const GExeFormat *); +/* Fournit l'adresse principale associée à un format. */ +bool g_exe_format_get_main_address(GExeFormat *, vmpa2t *); + /* Procède à l'enregistrement d'une portion dans un format. */ void g_exe_format_include_portion(GExeFormat *, GBinPortion *); |