diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/elf/symbols.c | 60 | ||||
-rw-r--r-- | plugins/pychrysa/format/symbol.c | 36 |
2 files changed, 72 insertions, 24 deletions
diff --git a/plugins/elf/symbols.c b/plugins/elf/symbols.c index 292913b..b5dc2b8 100644 --- a/plugins/elf/symbols.c +++ b/plugins/elf/symbols.c @@ -521,6 +521,8 @@ static bool do_elf_internal_symbol_loading(GElfLoading *loading, GElfFormat *for { bool result; /* Bilan à retourner */ elf_sym sym; /* Symbole aux infos visées */ + SymbolStatus status; /* Visibilité du symbole */ + vmpa2t addr; /* Localisation d'un symbole */ virt_t virt; /* Adresse virtuelle */ const elf_shdr *section; /* Groupe de sections trouvées */ bool use_virt; /* Choix de construction de nom*/ @@ -529,7 +531,6 @@ static bool do_elf_internal_symbol_loading(GElfLoading *loading, GElfFormat *for phys_t first; /* Position du premier élément */ const char *name; /* Nom du symbole trouvé */ GBinFormat *base; /* Version basique du format */ - vmpa2t addr; /* Localisation d'une routine */ GBinSymbol *symbol; /* Nouveau symbole construit */ char alt_name[6 + VMPA_MAX_LEN]; /* Nom abstrait de substitution*/ virt_t final_virt; /* Adresse virtuelle retenue */ @@ -539,23 +540,23 @@ static bool do_elf_internal_symbol_loading(GElfLoading *loading, GElfFormat *for result = read_elf_symbol(format, iter, &sym); if (!result) goto geslp_done; - /* On rejette les symboles qui ne sont pas définis au sein du binaire */ - - if (ELF_SYM(format, sym, st_shndx) == 0) goto geslp_done; - - /* Résolution précise d'adresse */ - - virt = ELF_SYM(format, sym, st_value); - if (virt == 0) goto geslp_done; + /* Nature de la visibilité et adresse associée */ + if (ELF_SYM(format, sym, st_shndx) == 0) + { + status = SSS_IMPORTED; + init_vmpa(&addr, VMPA_NO_PHYSICAL, VMPA_NO_VIRTUAL); - /* TODO */ - - //init_vmpa(&addr, VMPA_NO_PHYSICAL, ELF_SYM(format, sym, st_value)); + } + else + { + status = SSS_EXPORTED; - //init_mrange(&range, &addr, 0); + virt = ELF_SYM(format, sym, st_value); + if (virt == 0) goto geslp_done; + } /* Première ébauche de nom */ @@ -611,18 +612,25 @@ static bool do_elf_internal_symbol_loading(GElfLoading *loading, GElfFormat *for /* Ajustement de la position */ - if (ELF_HDR(format, format->header, e_machine) == EM_ARM) - final_virt = virt & ~0x1; - else - final_virt = virt; + if (status == SSS_IMPORTED) + init_mrange(&range, &addr, 0); - if (!g_exe_format_translate_address_into_vmpa(G_EXE_FORMAT(format), final_virt, &addr)) + else { - symbol = NULL; - break; - } + if (ELF_HDR(format, format->header, e_machine) == EM_ARM) + final_virt = virt & ~0x1; + else + final_virt = virt; + + if (!g_exe_format_translate_address_into_vmpa(G_EXE_FORMAT(format), final_virt, &addr)) + { + symbol = NULL; + break; + } + + init_mrange(&range, &addr, ELF_SYM(format, sym, st_size)); - init_mrange(&range, &addr, ELF_SYM(format, sym, st_size)); + } /* Création d'un nom unique ? */ @@ -644,8 +652,6 @@ static bool do_elf_internal_symbol_loading(GElfLoading *loading, GElfFormat *for routine = try_to_demangle_routine(name); symbol = G_BIN_SYMBOL(routine); - g_binary_symbol_set_range(symbol, &range); - /* Comptabilisation pour le désassemblage brut */ g_binary_format_register_code_point(G_BIN_FORMAT(format), virt, false); @@ -659,8 +665,14 @@ static bool do_elf_internal_symbol_loading(GElfLoading *loading, GElfFormat *for } if (symbol != NULL) + { + g_binary_symbol_set_range(symbol, &range); + g_binary_symbol_set_status(symbol, status); + g_binary_format_add_symbol(base, symbol); + } + geslp_done: return result; diff --git a/plugins/pychrysa/format/symbol.c b/plugins/pychrysa/format/symbol.c index b9ac13c..736a8d2 100644 --- a/plugins/pychrysa/format/symbol.c +++ b/plugins/pychrysa/format/symbol.c @@ -57,6 +57,9 @@ static PyObject *py_binary_symbol_get_label(PyObject *, void *); /* Fournit l'emplacement où se situe un symbole. */ static PyObject *py_binary_symbol_get_range(PyObject *, void *); +/* Fournit la visibilité du symbole. */ +static PyObject *py_binary_symbol_get_status(PyObject *, void *); + /* Définit les constantes pour les symboles binaires. */ static bool py_binary_symbol_define_constants(PyTypeObject *); @@ -285,6 +288,35 @@ static PyObject *py_binary_symbol_get_range(PyObject *self, void *closure) /****************************************************************************** * * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit la visibilité du symbole. * +* * +* Retour : Etat de la visibilité du symbole représenté. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_binary_symbol_get_status(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GBinSymbol *symbol; /* Elément à consulter */ + SymbolStatus status; /* Visibilité du symbole fourni*/ + + symbol = G_BIN_SYMBOL(pygobject_get(self)); + status = g_binary_symbol_get_status(symbol); + + result = PyLong_FromLong(status); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : obj_type = type dont le dictionnaire est à compléter. * * * * Description : Définit les constantes pour les symboles binaires. * @@ -351,6 +383,10 @@ PyTypeObject *get_python_binary_symbol_type(void) "range", py_binary_symbol_get_range, NULL, "Range covered by the symbol.", NULL }, + { + "status", py_binary_symbol_get_status, NULL, + "Status of the symbol's visibility.", NULL + }, { NULL } }; |