From 60b70b8701c822eddc65269773621690932a57bd Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 14 Aug 2019 22:53:39 +0200 Subject: Updated the Python bindings for binary symbols. --- plugins/elf/symbols.c | 4 +- plugins/libcsem/exit.c | 2 +- plugins/mobicore/symbols.c | 2 +- plugins/pychrysalide/format/constants.c | 19 +++ plugins/pychrysalide/format/symbol.c | 292 ++++++++++++++++++-------------- src/analysis/binary.c | 2 +- src/analysis/disass/area.c | 2 +- src/analysis/disass/output.c | 2 +- src/analysis/disass/routines.c | 4 +- src/analysis/routine.c | 2 +- src/arch/target.c | 2 +- src/format/strsym.c | 4 +- src/format/symbol-int.h | 2 +- src/format/symbol.c | 12 +- src/format/symbol.h | 4 +- src/gtkext/gtkgraphdisplay.c | 2 +- src/gui/dialogs/gotox.c | 4 +- src/gui/panels/symbols.c | 6 +- src/panels/strings.c | 2 +- tests/format/symbol.py | 44 ++++- 20 files changed, 257 insertions(+), 156 deletions(-) diff --git a/plugins/elf/symbols.c b/plugins/elf/symbols.c index 46e5ff8..20bd898 100644 --- a/plugins/elf/symbols.c +++ b/plugins/elf/symbols.c @@ -209,7 +209,7 @@ static void register_elf_entry_point(GElfFormat *format, virt_t vaddr, phys_t le symbol = G_BIN_SYMBOL(routine); g_binary_symbol_set_range(symbol, &range); - g_binary_symbol_set_target_type(symbol, STP_ENTRY_POINT); + g_binary_symbol_set_stype(symbol, STP_ENTRY_POINT); g_binary_format_add_symbol(base, symbol); @@ -1198,7 +1198,7 @@ static bool do_elf_relocation_renaming(GElfLoading *loading, GElfFormat *format, range = g_binary_symbol_get_range(symbol); - stype = g_binary_symbol_get_target_type(symbol); + stype = g_binary_symbol_get_stype(symbol); if (stype != STP_ROUTINE && stype != STP_CODE_LABEL && stype != STP_ENTRY_POINT) { diff --git a/plugins/libcsem/exit.c b/plugins/libcsem/exit.c index 794369e..73e8e91 100644 --- a/plugins/libcsem/exit.c +++ b/plugins/libcsem/exit.c @@ -61,7 +61,7 @@ static void mark_one_kind_of_exit_as_return(const GLoadedBinary *binary, const c if (!g_binary_format_find_symbol_by_label(format, fname, &symbol)) goto mokoear_exit; - if (g_binary_symbol_get_target_type(symbol) != STP_ROUTINE) + if (g_binary_symbol_get_stype(symbol) != STP_ROUTINE) goto mokoear_done_with_sym; range = g_binary_symbol_get_range(symbol); diff --git a/plugins/mobicore/symbols.c b/plugins/mobicore/symbols.c index df8d62f..91b7284 100644 --- a/plugins/mobicore/symbols.c +++ b/plugins/mobicore/symbols.c @@ -84,7 +84,7 @@ static void register_mclf_entry_point(GMCLFFormat *format, virt_t vaddr, phys_t symbol = G_BIN_SYMBOL(routine); g_binary_symbol_set_range(symbol, &range); - g_binary_symbol_set_target_type(symbol, STP_ENTRY_POINT); + g_binary_symbol_set_stype(symbol, STP_ENTRY_POINT); g_binary_format_add_symbol(base, symbol); diff --git a/plugins/pychrysalide/format/constants.c b/plugins/pychrysalide/format/constants.c index 9e63fdd..ea2aedc 100644 --- a/plugins/pychrysalide/format/constants.c +++ b/plugins/pychrysalide/format/constants.c @@ -51,6 +51,25 @@ bool define_binary_symbol_constants(PyTypeObject *type) values = PyDict_New(); + result = add_const_to_group(values, "DATA", STP_DATA); + if (result) result = add_const_to_group(values, "ROUTINE", STP_ROUTINE); + if (result) result = add_const_to_group(values, "CODE_LABEL", STP_CODE_LABEL); + if (result) result = add_const_to_group(values, "OBJECT", STP_OBJECT); + if (result) result = add_const_to_group(values, "ENTRY_POINT", STP_ENTRY_POINT); + if (result) result = add_const_to_group(values, "RO_STRING", STP_RO_STRING); + if (result) result = add_const_to_group(values, "DYN_STRING", STP_DYN_STRING); + if (result) result = add_const_to_group(values, "COUNT", STP_COUNT); + + if (!result) + { + Py_DECREF(values); + goto exit; + } + + result = attach_constants_group(type, false, "SymbolType", values, "Available values for symbol types."); + + values = PyDict_New(); + result = add_const_to_group(values, "INTERNAL", SSS_INTERNAL); if (result) result = add_const_to_group(values, "EXPORTED", SSS_EXPORTED); if (result) result = add_const_to_group(values, "IMPORTED", SSS_IMPORTED); diff --git a/plugins/pychrysalide/format/symbol.c b/plugins/pychrysalide/format/symbol.c index 932b0fd..86a321c 100644 --- a/plugins/pychrysalide/format/symbol.c +++ b/plugins/pychrysalide/format/symbol.c @@ -50,14 +50,8 @@ /* Effectue une comparaison avec un objet Python 'BinSymbol'. */ static PyObject *py_binary_symbol_richcompare(PyObject *, PyObject *, int); -/* Définit un autre nom pour le symbole. */ -static PyObject *py_binary_symbol_set_alt_label(PyObject *, PyObject *); - -/* Fournit le type du symbole. */ -static PyObject *py_binary_symbol_get_target_type(PyObject *, void *); - -/* Fournit un étiquette pour viser un symbole. */ -static PyObject *py_binary_symbol_get_label(PyObject *, void *); +/* Crée un nouvel objet Python de type 'BinSymbol'. */ +static PyObject *py_binary_symbol_new(PyTypeObject *, PyObject *, PyObject *); /* Fournit l'emplacement où se situe un symbole. */ static PyObject *py_binary_symbol_get_range(PyObject *, void *); @@ -65,11 +59,23 @@ static PyObject *py_binary_symbol_get_range(PyObject *, void *); /* Définit la couverture physique / en mémoire d'un symbole. */ static int py_binary_symbol_set_range(PyObject *, PyObject *, void *); +/* Fournit le type du symbole. */ +static PyObject *py_binary_symbol_get_stype(PyObject *, void *); + +/* Définit le type du symbole. */ +static int py_binary_symbol_set_stype(PyObject *, PyObject *, void *); + +/* Fournit un étiquette pour viser un symbole. */ +static PyObject *py_binary_symbol_get_label(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 *); +/* Définit la visibilité du symbole. */ +static int py_binary_symbol_set_status(PyObject *, PyObject *, void *); + +/* Définit un autre nom pour le symbole. */ +static int py_binary_symbol_set_label(PyObject *, PyObject *, void *); @@ -124,7 +130,7 @@ static PyObject *py_binary_symbol_richcompare(PyObject *a, PyObject *b, int op) * args = arguments fournis à l'appel. * * kwds = arguments de type key=val fournis. * * * -* Description : Crée un nouvel objet Python de type 'DbComment'. * +* Description : Crée un nouvel objet Python de type 'BinSymbol'. * * * * Retour : Instance Python mise en place. * * * @@ -136,12 +142,23 @@ static PyObject *py_binary_symbol_new(PyTypeObject *type, PyObject *args, PyObje { PyObject *result; /* Bilan à retourner */ SymbolType stype; /* Type prévu pour le symbole */ - PyObject *range_obj; /* Objet pour la couverture */ + mrange_t range; /* Version native d'un espace */ int ret; /* Bilan de lecture des args. */ - mrange_t *range; /* Version native d'un espace */ GBinSymbol *symbol; /* Version GLib du symble */ - ret = PyArg_ParseTuple(args, "lO", &stype, &range_obj); +#define BINARY_SYMBOL_DOC \ + "BinSymbol represents all kinds of symbols, such as string, routines or" \ + " objects. If something can be linked to a physical or virtual location," \ + " it can be a symbol." \ + "\n" \ + "Instances can be created using the following constructor:\n" \ + "\n" \ + " BinSymbol(stype, range)" \ + "\n" \ + "Where stype is a pychrysalide.format.BinSymbol.SymbolType value, and" \ + " range a memory space defined by pychrysalide.arch.mrange." \ + + ret = PyArg_ParseTuple(args, "kO&", &stype, convert_any_to_mrange, &range); if (!ret) return NULL; if (stype >= STP_COUNT) @@ -150,16 +167,7 @@ static PyObject *py_binary_symbol_new(PyTypeObject *type, PyObject *args, PyObje return NULL; } - ret = PyObject_IsInstance(range_obj, (PyObject *)get_python_mrange_type()); - if (!ret) - { - PyErr_SetString(PyExc_TypeError, _("The second argument must be an instance of mrange.")); - return NULL; - } - - range = get_internal_mrange(range_obj); - - symbol = g_binary_symbol_new(range, stype); + symbol = g_binary_symbol_new(&range, stype); result = pygobject_new(G_OBJECT(symbol)); g_object_unref(symbol); @@ -171,31 +179,69 @@ static PyObject *py_binary_symbol_new(PyTypeObject *type, PyObject *args, PyObje /****************************************************************************** * * -* Paramètres : self = classe représentant un binaire. * -* args = arguments fournis à l'appel. * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * * * -* Description : Définit un autre nom pour le symbole. * +* Description : Fournit l'emplacement où se situe un symbole. * * * -* Retour : None. * +* Retour : Zone mémoire couverte par le symbole. * * * * Remarques : - * * * ******************************************************************************/ -static PyObject *py_binary_symbol_set_alt_label(PyObject *self, PyObject *args) +static PyObject *py_binary_symbol_get_range(PyObject *self, void *closure) { - const char *alt; /* Etiquette alternative */ - int ret; /* Bilan de lecture des args. */ + PyObject *result; /* Valeur à retourner */ GBinSymbol *symbol; /* Elément à consulter */ + const mrange_t *range; /* Couverture courante */ - ret = PyArg_ParseTuple(args, "s", &alt); - if (!ret) return NULL; +#define BINARY_SYMBOL_RANGE_ATTRIB PYTHON_GETSET_DEF_FULL \ +( \ + range, py_binary_symbol, \ + "Range covered by the symbol." \ +) symbol = G_BIN_SYMBOL(pygobject_get(self)); + range = g_binary_symbol_get_range(symbol); - g_binary_symbol_set_alt_label(symbol, alt); + result = build_from_internal_mrange(range); + + return result; + +} - Py_RETURN_NONE; + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* value = valeur fournie à intégrer ou prendre en compte. * +* closure = adresse non utilisée ici. * +* * +* Description : Définit la couverture physique / en mémoire d'un symbole. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static int py_binary_symbol_set_range(PyObject *self, PyObject *value, void *closure) +{ + int ret; /* Bilan d'analyse */ + mrange_t *range; /* Espace mémoire à manipuler */ + GBinSymbol *symbol; /* Elément à consulter */ + + ret = PyObject_IsInstance(value, (PyObject *)get_python_mrange_type()); + if (!ret) return -1; + + range = get_internal_mrange(value); + + symbol = G_BIN_SYMBOL(pygobject_get(self)); + + g_binary_symbol_set_range(symbol, range); + + return 0; } @@ -213,16 +259,23 @@ static PyObject *py_binary_symbol_set_alt_label(PyObject *self, PyObject *args) * * ******************************************************************************/ -static PyObject *py_binary_symbol_get_target_type(PyObject *self, void *closure) +static PyObject *py_binary_symbol_get_stype(PyObject *self, void *closure) { PyObject *result; /* Valeur à retourner */ GBinSymbol *symbol; /* Elément à consulter */ SymbolType type; /* Type de symbole représenté */ +#define BINARY_SYMBOL_STYPE_ATTRIB PYTHON_GETSET_DEF_FULL \ +( \ + stype, py_binary_symbol, \ + "Type of the current symbol, as a value of type" \ + " pychrysalide.format.BinSymbol.SymbolType." \ +) + symbol = G_BIN_SYMBOL(pygobject_get(self)); - type = g_binary_symbol_get_target_type(symbol); + type = g_binary_symbol_get_stype(symbol); - result = PyLong_FromLong(type); + result = cast_with_constants_group(get_python_binary_symbol_type(), "SymbolType", type); return result; @@ -232,38 +285,31 @@ static PyObject *py_binary_symbol_get_target_type(PyObject *self, void *closure) /****************************************************************************** * * * Paramètres : self = objet Python concerné par l'appel. * -* closure = non utilisé ici. * +* value = valeur fournie à intégrer ou prendre en compte. * +* closure = adresse non utilisée ici. * * * -* Description : Fournit un étiquette pour viser un symbole. * +* Description : Définit le type du symbole. * * * -* Retour : Chaîne de caractères renvoyant au symbole. * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -static PyObject *py_binary_symbol_get_label(PyObject *self, void *closure) +static int py_binary_symbol_set_stype(PyObject *self, PyObject *value, void *closure) { - PyObject *result; /* Valeur à retourner */ GBinSymbol *symbol; /* Elément à consulter */ - char *label; /* Désignation courante */ + SymbolType type; /* Type de symbole à définir */ + + if (!PyLong_Check(value)) + return -1; symbol = G_BIN_SYMBOL(pygobject_get(self)); - label = g_binary_symbol_get_label(symbol); + type = PyLong_AsUnsignedLong(value); - if (label != NULL) - { - result = PyUnicode_FromString(label); - free(label); - } + g_binary_symbol_set_stype(symbol, type); - else - { - result = Py_None; - Py_INCREF(result); - } - - return result; + return 0; } @@ -273,24 +319,31 @@ static PyObject *py_binary_symbol_get_label(PyObject *self, void *closure) * Paramètres : self = objet Python concerné par l'appel. * * closure = non utilisé ici. * * * -* Description : Fournit l'emplacement où se situe un symbole. * +* Description : Fournit la visibilité du symbole. * * * -* Retour : Zone mémoire couverte par le symbole. * +* Retour : Etat de la visibilité du symbole représenté. * * * * Remarques : - * * * ******************************************************************************/ -static PyObject *py_binary_symbol_get_range(PyObject *self, void *closure) +static PyObject *py_binary_symbol_get_status(PyObject *self, void *closure) { PyObject *result; /* Valeur à retourner */ GBinSymbol *symbol; /* Elément à consulter */ - const mrange_t *range; /* Couverture courante */ + SymbolStatus status; /* Visibilité du symbole fourni*/ + +#define BINARY_SYMBOL_STATUS_ATTRIB PYTHON_GETSET_DEF_FULL \ +( \ + status, py_binary_symbol, \ + "Status of the symbol's visibility, as a value of type" \ + " pychrysalide.format.BinSymbol.SymbolStatus." \ +) symbol = G_BIN_SYMBOL(pygobject_get(self)); - range = g_binary_symbol_get_range(symbol); + status = g_binary_symbol_get_status(symbol); - result = build_from_internal_mrange(range); + result = cast_with_constants_group(get_python_binary_symbol_type(), "SymbolStatus", status); return result; @@ -303,28 +356,26 @@ static PyObject *py_binary_symbol_get_range(PyObject *self, void *closure) * value = valeur fournie à intégrer ou prendre en compte. * * closure = adresse non utilisée ici. * * * -* Description : Définit la couverture physique / en mémoire d'un symbole. * +* Description : Définit la visibilité du symbole. * * * -* Retour : - * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -static int py_binary_symbol_set_range(PyObject *self, PyObject *value, void *closure) +static int py_binary_symbol_set_status(PyObject *self, PyObject *value, void *closure) { - int ret; /* Bilan d'analyse */ - mrange_t *range; /* Espace mémoire à manipuler */ GBinSymbol *symbol; /* Elément à consulter */ + SymbolStatus status; /* Visibilité à définir */ - ret = PyObject_IsInstance(value, (PyObject *)get_python_mrange_type()); - if (!ret) return -1; - - range = get_internal_mrange(value); + if (!PyLong_Check(value)) + return -1; symbol = G_BIN_SYMBOL(pygobject_get(self)); + status = PyLong_AsUnsignedLong(value); - g_binary_symbol_set_range(symbol, range); + g_binary_symbol_set_status(symbol, status); return 0; @@ -336,30 +387,39 @@ static int py_binary_symbol_set_range(PyObject *self, PyObject *value, void *clo * Paramètres : self = objet Python concerné par l'appel. * * closure = non utilisé ici. * * * -* Description : Fournit la visibilité du symbole. * +* Description : Fournit un étiquette pour viser un symbole. * * * -* Retour : Etat de la visibilité du symbole représenté. * +* Retour : Chaîne de caractères renvoyant au symbole. * * * * Remarques : - * * * ******************************************************************************/ -static PyObject *py_binary_symbol_get_status(PyObject *self, void *closure) +static PyObject *py_binary_symbol_get_label(PyObject *self, void *closure) { PyObject *result; /* Valeur à retourner */ GBinSymbol *symbol; /* Elément à consulter */ - SymbolStatus status; /* Visibilité du symbole fourni*/ + char *label; /* Désignation courante */ -#define BINARY_SYMBOL_STATUS_ATTRIB PYTHON_GET_DEF_FULL \ -( \ - status, py_binary_symbol, \ - "Status of the symbol's visibility." \ +#define BINARY_SYMBOL_LABEL_ATTRIB PYTHON_GETSET_DEF_FULL \ +( \ + label, py_binary_symbol, \ + "Label of the symbol, provided by the internal component or by the user." \ ) symbol = G_BIN_SYMBOL(pygobject_get(self)); - status = g_binary_symbol_get_status(symbol); + label = g_binary_symbol_get_label(symbol); - result = cast_with_constants_group(get_python_binary_symbol_type(), "SymbolStatus", status); + if (label != NULL) + { + result = PyUnicode_FromString(label); + free(label); + } + else + { + result = Py_None; + Py_INCREF(result); + } return result; @@ -368,37 +428,40 @@ static PyObject *py_binary_symbol_get_status(PyObject *self, void *closure) /****************************************************************************** * * -* Paramètres : obj_type = type dont le dictionnaire est à compléter. * +* Paramètres : self = objet Python concerné par l'appel. * +* value = valeur fournie à intégrer ou prendre en compte. * +* closure = adresse non utilisée ici. * * * -* Description : Définit les constantes pour les symboles binaires. * +* Description : Définit un autre nom pour le symbole. * * * -* Retour : true en cas de succès de l'opération, false sinon. * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -static bool py_binary_symbol_define_constants(PyTypeObject *obj_type) +static int py_binary_symbol_set_label(PyObject *self, PyObject *value, void *closure) { - bool result; /* Bilan à retourner */ + const char *alt; /* Etiquette alternative */ + GBinSymbol *symbol; /* Elément à consulter */ + + if (value == Py_None) + alt = NULL; + + else + { + if (!PyUnicode_Check(value)) + return -1; - result = true; + alt = PyUnicode_DATA(value); - result &= PyDict_AddULongMacro(obj_type, STP_DATA); - result &= PyDict_AddULongMacro(obj_type, STP_ROUTINE); - result &= PyDict_AddULongMacro(obj_type, STP_CODE_LABEL); - result &= PyDict_AddULongMacro(obj_type, STP_OBJECT); - result &= PyDict_AddULongMacro(obj_type, STP_ENTRY_POINT); - result &= PyDict_AddULongMacro(obj_type, STP_RO_STRING); - result &= PyDict_AddULongMacro(obj_type, STP_DYN_STRING); - result &= PyDict_AddULongMacro(obj_type, STP_COUNT); + } - result &= PyDict_AddULongMacro(obj_type, SSS_INTERNAL); - result &= PyDict_AddULongMacro(obj_type, SSS_EXPORTED); - result &= PyDict_AddULongMacro(obj_type, SSS_IMPORTED); - result &= PyDict_AddULongMacro(obj_type, SSS_DYNAMIC); + symbol = G_BIN_SYMBOL(pygobject_get(self)); - return result; + g_binary_symbol_set_alt_label(symbol, alt); + + return 0; } @@ -418,28 +481,14 @@ static bool py_binary_symbol_define_constants(PyTypeObject *obj_type) PyTypeObject *get_python_binary_symbol_type(void) { static PyMethodDef py_bin_symbol_methods[] = { - { - "set_alt_label", py_binary_symbol_set_alt_label, - METH_VARARGS, - "set_alt_label($self, alt, /)\n--\n\nSet an alternative label for the symbol." - }, { NULL } }; static PyGetSetDef py_bin_symbol_getseters[] = { - { - "target_type", py_binary_symbol_get_target_type, NULL, - "Type of the current symbol.", NULL - }, - { - "label", py_binary_symbol_get_label, NULL, - "Label of the symbol, provided by the internal component or by an alternative label.", NULL - }, - { - "range", py_binary_symbol_get_range, py_binary_symbol_set_range, - "Range covered by the symbol.", NULL - }, + BINARY_SYMBOL_RANGE_ATTRIB, + BINARY_SYMBOL_STYPE_ATTRIB, BINARY_SYMBOL_STATUS_ATTRIB, + BINARY_SYMBOL_LABEL_ATTRIB, { NULL } }; @@ -452,7 +501,7 @@ PyTypeObject *get_python_binary_symbol_type(void) .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_doc = "PyChrysalide binary symbol", + .tp_doc = BINARY_SYMBOL_DOC, .tp_richcompare = py_binary_symbol_richcompare, @@ -499,9 +548,6 @@ bool ensure_python_binary_symbol_is_registered(void) if (!register_class_for_pygobject(dict, G_TYPE_BIN_SYMBOL, type, &PyGObject_Type)) return false; - if (!py_binary_symbol_define_constants(type)) - return false; - if (!define_binary_symbol_constants(type)) return false; diff --git a/src/analysis/binary.c b/src/analysis/binary.c index cfb4ea0..80d12d3 100644 --- a/src/analysis/binary.c +++ b/src/analysis/binary.c @@ -1823,7 +1823,7 @@ static void on_binary_processor_changed(GArchProcessor *proc, GArchInstruction * * la fonction print_disassembled_instructions(). */ - stype = g_binary_symbol_get_target_type(symbol); + stype = g_binary_symbol_get_stype(symbol); if (stype == STP_ENTRY_POINT) flags |= BLF_ENTRYPOINT; diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index 9649d6f..5569a11 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -675,7 +675,7 @@ static void update_address_as_routine(GBinFormat *format, const vmpa2t *addr) if (found) { - sym_type = g_binary_symbol_get_target_type(symbol); + sym_type = g_binary_symbol_get_stype(symbol); wrong_type = (sym_type != STP_ROUTINE && sym_type != STP_ENTRY_POINT); } diff --git a/src/analysis/disass/output.c b/src/analysis/disass/output.c index 83a6815..932e9cc 100644 --- a/src/analysis/disass/output.c +++ b/src/analysis/disass/output.c @@ -239,7 +239,7 @@ void print_disassembled_instructions(GBufferCache *cache, GCodingLanguage *lang, { /* Coupure pour une nouvelle routine */ - stype = g_binary_symbol_get_target_type(symbol); + stype = g_binary_symbol_get_stype(symbol); if (stype == STP_ROUTINE || stype == STP_ENTRY_POINT) { diff --git a/src/analysis/disass/routines.c b/src/analysis/disass/routines.c index d7821d0..42eee76 100644 --- a/src/analysis/disass/routines.c +++ b/src/analysis/disass/routines.c @@ -252,7 +252,7 @@ static void g_routines_study_process(GRoutinesStudy *study, GtkStatusStack *stat { symbol = g_binary_format_get_symbol(study->format, i); - type = g_binary_symbol_get_target_type(symbol); + type = g_binary_symbol_get_stype(symbol); if (type == STP_ROUTINE || type == STP_ENTRY_POINT) study->fallback(study, G_BIN_ROUTINE(symbol), i); @@ -302,7 +302,7 @@ void g_routines_study_compute_limits(GRoutinesStudy *study, GBinRoutine *routine * symboles suivants. */ - if (g_binary_symbol_get_target_type(next_symbol) == STP_CODE_LABEL) + if (g_binary_symbol_get_stype(next_symbol) == STP_CODE_LABEL) goto skip_symbol; range = g_binary_symbol_get_range(next_symbol); diff --git a/src/analysis/routine.c b/src/analysis/routine.c index 41e314c..21abe9c 100644 --- a/src/analysis/routine.c +++ b/src/analysis/routine.c @@ -110,7 +110,7 @@ static void g_bin_routine_init(GBinRoutine *routine) symbol = G_BIN_SYMBOL(routine); - g_binary_symbol_set_target_type(symbol, STP_ROUTINE); + g_binary_symbol_set_stype(symbol, STP_ROUTINE); routine->ret_type = NULL; diff --git a/src/arch/target.c b/src/arch/target.c index db4d058..a8acd67 100644 --- a/src/arch/target.c +++ b/src/arch/target.c @@ -412,7 +412,7 @@ static char *g_target_operand_build_tooltip(const GTargetOperand *operand, const if (operand->symbol != NULL && operand->diff == 0) { - stype = g_binary_symbol_get_target_type(operand->symbol); + stype = g_binary_symbol_get_stype(operand->symbol); switch (stype) { diff --git a/src/format/strsym.c b/src/format/strsym.c index ed38a6b..ecfcc55 100644 --- a/src/format/strsym.c +++ b/src/format/strsym.c @@ -255,7 +255,7 @@ GBinSymbol *g_string_symbol_new_read_only(GBinFormat *format, const mrange_t *ra parent = G_BIN_SYMBOL(result); g_binary_symbol_set_range(parent, range); - g_binary_symbol_set_target_type(parent, STP_RO_STRING); + g_binary_symbol_set_stype(parent, STP_RO_STRING); result->encoding = encoding; @@ -296,7 +296,7 @@ GBinSymbol *g_string_symbol_new_dynamic(const char *string, const vmpa2t *addr, init_mrange(&range, addr, strlen(string)); g_binary_symbol_set_range(parent, &range); - g_binary_symbol_set_target_type(parent, STP_DYN_STRING); + g_binary_symbol_set_stype(parent, STP_DYN_STRING); result->encoding = encoding; diff --git a/src/format/symbol-int.h b/src/format/symbol-int.h index 1b8672d..d6717ac 100644 --- a/src/format/symbol-int.h +++ b/src/format/symbol-int.h @@ -40,7 +40,7 @@ struct _GBinSymbol GObject parent; /* A laisser en premier */ mrange_t range; /* Couverture mémoire */ - SymbolType type; /* Type du symbole */ + SymbolType stype; /* Type du symbole */ SymbolStatus status; /* Visibilité du symbole */ char *alt; /* Nom alternatif */ diff --git a/src/format/symbol.c b/src/format/symbol.c index 22403c5..149dd2a 100644 --- a/src/format/symbol.c +++ b/src/format/symbol.c @@ -123,7 +123,7 @@ static void g_binary_symbol_class_init(GBinSymbolClass *klass) static void g_binary_symbol_init(GBinSymbol *symbol) { - g_binary_symbol_set_target_type(symbol, STP_COUNT); + g_binary_symbol_set_stype(symbol, STP_COUNT); g_binary_symbol_set_status(symbol, SSS_INTERNAL); @@ -214,7 +214,7 @@ GBinSymbol *g_binary_symbol_new(const mrange_t *range, SymbolType type) result = g_object_new(G_TYPE_BIN_SYMBOL, NULL); g_binary_symbol_set_range(result, range); - g_binary_symbol_set_target_type(result, type); + g_binary_symbol_set_stype(result, type); return result; @@ -326,9 +326,9 @@ const mrange_t *g_binary_symbol_get_range(const GBinSymbol *symbol) * * ******************************************************************************/ -void g_binary_symbol_set_target_type(GBinSymbol *symbol, SymbolType type) +void g_binary_symbol_set_stype(GBinSymbol *symbol, SymbolType type) { - symbol->type = type; + symbol->stype = type; } @@ -345,9 +345,9 @@ void g_binary_symbol_set_target_type(GBinSymbol *symbol, SymbolType type) * * ******************************************************************************/ -SymbolType g_binary_symbol_get_target_type(const GBinSymbol *symbol) +SymbolType g_binary_symbol_get_stype(const GBinSymbol *symbol) { - return symbol->type; + return symbol->stype; } diff --git a/src/format/symbol.h b/src/format/symbol.h index 577a6a0..14fed23 100644 --- a/src/format/symbol.h +++ b/src/format/symbol.h @@ -98,10 +98,10 @@ void g_binary_symbol_set_range(GBinSymbol *, const mrange_t *); const mrange_t *g_binary_symbol_get_range(const GBinSymbol *); /* Définit le type du symbole. */ -void g_binary_symbol_set_target_type(GBinSymbol *, SymbolType); +void g_binary_symbol_set_stype(GBinSymbol *, SymbolType); /* Fournit le type du symbole. */ -SymbolType g_binary_symbol_get_target_type(const GBinSymbol *); +SymbolType g_binary_symbol_get_stype(const GBinSymbol *); /* Définit la visibilité du symbole. */ void g_binary_symbol_set_status(GBinSymbol *, SymbolStatus); diff --git a/src/gtkext/gtkgraphdisplay.c b/src/gtkext/gtkgraphdisplay.c index aeecc0f..ed3c923 100644 --- a/src/gtkext/gtkgraphdisplay.c +++ b/src/gtkext/gtkgraphdisplay.c @@ -941,7 +941,7 @@ static void gtk_graph_display_prepare_for_cursor(GtkGraphDisplay *display, const if (!found) goto no_symbol_found; - type = g_binary_symbol_get_target_type(symbol); + type = g_binary_symbol_get_stype(symbol); if (type != STP_ROUTINE && type != STP_ENTRY_POINT) goto bad_symbol_type; diff --git a/src/gui/dialogs/gotox.c b/src/gui/dialogs/gotox.c index 97c031e..2993999 100644 --- a/src/gui/dialogs/gotox.c +++ b/src/gui/dialogs/gotox.c @@ -240,7 +240,7 @@ GtkWidget *create_gotox_dialog_for_entry_points(GtkWindow *parent, GLoadedBinary symbol != NULL; symbol = get_symbol_iterator_next(siter)) { - if (g_binary_symbol_get_target_type(symbol) != STP_ENTRY_POINT) + if (g_binary_symbol_get_stype(symbol) != STP_ENTRY_POINT) goto cgdfep_next; copy_vmpa(&addr, get_mrange_addr(g_binary_symbol_get_range(symbol))); @@ -475,7 +475,7 @@ static void add_new_location_to_list(GtkTreeStore *store, GLoadedBinary *binary, filename = NULL; else - switch (g_binary_symbol_get_target_type(symbol)) + switch (g_binary_symbol_get_stype(symbol)) { case STP_ENTRY_POINT: filename = find_pixmap_file("entrypoint.png"); diff --git a/src/gui/panels/symbols.c b/src/gui/panels/symbols.c index 6ea7a72..7901df0 100644 --- a/src/gui/panels/symbols.c +++ b/src/gui/panels/symbols.c @@ -799,7 +799,7 @@ static void reload_symbols_for_new_list_view(const GSymbolsPanel *panel, GtkStat symbol != NULL; symbol = get_symbol_iterator_next(siter)) { - switch (g_binary_symbol_get_target_type(symbol)) + switch (g_binary_symbol_get_stype(symbol)) { case STP_ROUTINE: case STP_ENTRY_POINT: @@ -1080,7 +1080,7 @@ static void reload_symbols_for_new_tree_view(const GSymbolsPanel *panel, GtkStat symbol != NULL; symbol = get_symbol_iterator_next(siter)) { - switch (g_binary_symbol_get_target_type(symbol)) + switch (g_binary_symbol_get_stype(symbol)) { case STP_ROUTINE: case STP_ENTRY_POINT: @@ -1480,7 +1480,7 @@ static bool is_symbol_matching(const symbols_update_data *data, const GBinSymbol #ifndef NDEBUG - type = g_binary_symbol_get_target_type(symbol); + type = g_binary_symbol_get_stype(symbol); assert(type == STP_ROUTINE || type == STP_ENTRY_POINT || type == STP_OBJECT); diff --git a/src/panels/strings.c b/src/panels/strings.c index c60ef0a..25d1e41 100644 --- a/src/panels/strings.c +++ b/src/panels/strings.c @@ -137,7 +137,7 @@ void handle_new_exe_on_strings_panel(GtkWidget *panel, const GExeFormat *format) { if (g_binary_symbol_get_status(symbols[i]) == SSS_IMPORTED) continue; - if (g_binary_symbol_get_target_type(symbols[i]) != STP_STRING) continue; + if (g_binary_symbol_get_stype(symbols[i]) != STP_STRING) continue; range = g_binary_symbol_get_range(symbols[i]); mrange_virt_to_string(range, MDS_UNDEFINED, true, address, NULL); diff --git a/tests/format/symbol.py b/tests/format/symbol.py index 5d6be45..5e0ba10 100644 --- a/tests/format/symbol.py +++ b/tests/format/symbol.py @@ -14,12 +14,48 @@ class TestBinarySymbols(ChrysalideTestCase): """TestCase for format.BinSymbol.""" + def testSymbolProperties(self): + """Validate the basic properties of symbols.""" + + saddr = vmpa(0x10, vmpa.VMPA_NO_VIRTUAL) + srange = mrange(saddr, 0x3) + symbol = BinSymbol(BinSymbol.SymbolType.ENTRY_POINT, srange) + + self.assertEqual(symbol.range.length, 0x3) + + symbol.range = mrange(saddr, 0x4) + + self.assertEqual(symbol.range.length, 0x4) + + self.assertEqual(symbol.stype, BinSymbol.SymbolType.ENTRY_POINT) + + symbol.stype = BinSymbol.SymbolType.DATA + + self.assertEqual(symbol.stype, BinSymbol.SymbolType.DATA) + + self.assertEqual(symbol.status, BinSymbol.SymbolStatus.INTERNAL) + + symbol.status = BinSymbol.SymbolStatus.EXPORTED + + self.assertEqual(symbol.status, BinSymbol.SymbolStatus.EXPORTED) + + self.assertEqual(symbol.label, None) + + symbol.label = 'AAA' + + self.assertEqual(symbol.label, 'AAA') + + symbol.label = None + + self.assertEqual(symbol.label, None) + + def testSymbolDefaultStatus(self): """Validate the default status for symbols.""" saddr = vmpa(0x10, vmpa.VMPA_NO_VIRTUAL) srange = mrange(saddr, 0x3) - symbol = BinSymbol(BinSymbol.STP_ENTRY_POINT, srange) + symbol = BinSymbol(BinSymbol.SymbolType.ENTRY_POINT, srange) self.assertEqual(symbol.status, BinSymbol.SymbolStatus.INTERNAL) @@ -31,15 +67,15 @@ class TestBinarySymbols(ChrysalideTestCase): saddr = vmpa(0x100, vmpa.VMPA_NO_VIRTUAL) srange = mrange(saddr, 0x3) - symbol0 = BinSymbol(BinSymbol.STP_ENTRY_POINT, srange) + symbol0 = BinSymbol(BinSymbol.SymbolType.ENTRY_POINT, srange) saddr = vmpa(0x10, vmpa.VMPA_NO_VIRTUAL) srange = mrange(saddr, 0x3) - symbol1 = BinSymbol(BinSymbol.STP_ENTRY_POINT, srange) + symbol1 = BinSymbol(BinSymbol.SymbolType.ENTRY_POINT, srange) saddr = vmpa(0x100, vmpa.VMPA_NO_VIRTUAL) srange = mrange(saddr, 0x30) - symbol2 = BinSymbol(BinSymbol.STP_ENTRY_POINT, srange) + symbol2 = BinSymbol(BinSymbol.SymbolType.ENTRY_POINT, srange) self.assertTrue(symbol0 == symbol0) -- cgit v0.11.2-87-g4458