From 0794024b412604ae5e5aca0f104b5a8f3ec5412c Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 14 Apr 2020 00:53:32 +0200 Subject: Avoided to look for syscalls in a kernel binary. --- plugins/lnxsyscalls/collect.c | 5 +- plugins/lnxsyscalls/core.c | 5 +- plugins/pychrysalide/format/constants.c | 56 +++++++- plugins/pychrysalide/format/constants.h | 3 + plugins/pychrysalide/format/format.c | 231 +++++++++++++++++++++++++++----- src/format/format-int.h | 45 ++++++- src/format/format.c | 129 ++++++++++++++++++ src/format/format.h | 33 ++++- src/format/symbol-int.h | 6 +- 9 files changed, 467 insertions(+), 46 deletions(-) diff --git a/plugins/lnxsyscalls/collect.c b/plugins/lnxsyscalls/collect.c index e7db1c7..8726dc2 100644 --- a/plugins/lnxsyscalls/collect.c +++ b/plugins/lnxsyscalls/collect.c @@ -129,7 +129,7 @@ static void copy_call_stack(call_stack *dest, const call_stack *src) } - dest->iter = copy_instruction_iterator(src->iter); + dest->iter = src->iter != NULL ? copy_instruction_iterator(src->iter) : NULL; dest->use_current = src->use_current; dest->skip_syscall = src->skip_syscall; @@ -339,7 +339,8 @@ static void change_register_tracker_iter(tracked_path *path, size_t sid, GArchPr const mrange_t *range; /* Couverture d'une instruction*/ instr_iter_t *iter; /* Tête de lecture */ - delete_instruction_iterator(path->stacks[sid].iter); + if (path->stacks[sid].iter != NULL) + delete_instruction_iterator(path->stacks[sid].iter); range = g_arch_instruction_get_range(dest); iter = g_arch_processor_get_iter_from_address(proc, get_mrange_addr(range)); diff --git a/plugins/lnxsyscalls/core.c b/plugins/lnxsyscalls/core.c index 02e109d..314f89f 100644 --- a/plugins/lnxsyscalls/core.c +++ b/plugins/lnxsyscalls/core.c @@ -114,11 +114,12 @@ G_MODULE_EXPORT void chrysalide_plugin_process_binary_disassembly(const GPluginM format = G_BIN_FORMAT(g_loaded_binary_get_format(binary)); - goto pbd_exit; + if (g_binary_format_has_flag(format, FFL_RUN_IN_KERNEL_SPACE)) + goto pbd_exit; arch = g_exe_format_get_target_machine(G_EXE_FORMAT(format)); - if (strcmp(arch, "armv7") == 0) + if (0 && strcmp(arch, "armv7") == 0) hops = get_armv7_hunting_ops(); else diff --git a/plugins/pychrysalide/format/constants.c b/plugins/pychrysalide/format/constants.c index a0d71f7..0df7bd4 100644 --- a/plugins/pychrysalide/format/constants.c +++ b/plugins/pychrysalide/format/constants.c @@ -25,6 +25,7 @@ #include "constants.h" +#include #include @@ -36,7 +37,60 @@ * * * Paramètres : type = type dont le dictionnaire est à compléter. * * * -* Description : Définit les constantes pour le format Dex. * +* Description : Définit les constantes pour les formats binaires. * +* * +* Retour : true en cas de succès de l'opération, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool define_binary_format_constants(PyTypeObject *type) +{ + bool result; /* Bilan à retourner */ + PyObject *values; /* Groupe de valeurs à établir */ + + values = PyDict_New(); + + result = add_const_to_group(values, "SPECIFICATION", BFE_SPECIFICATION); + if (result) result = add_const_to_group(values, "STRUCTURE", BFE_STRUCTURE); + + if (!result) + { + Py_DECREF(values); + goto exit; + } + + result = attach_constants_group_to_type(type, true, "BinaryFormatError", values, + "Flags for error occurring while loading a binary format."); + + values = PyDict_New(); + + result = add_const_to_group(values, "NONE", FFL_NONE); + if (result) result = add_const_to_group(values, "RUN_IN_KERNEL_SPACE", FFL_RUN_IN_KERNEL_SPACE); + if (result) result = add_const_to_group(values, "MASK", FFL_MASK); + + if (!result) + { + Py_DECREF(values); + goto exit; + } + + result = attach_constants_group_to_type(type, true, "FormatFlag", values, + "Extra indications for formats."); + + exit: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : type = type dont le dictionnaire est à compléter. * +* * +* Description : Définit les constantes pour les symboles binaires. * * * * Retour : true en cas de succès de l'opération, false sinon. * * * diff --git a/plugins/pychrysalide/format/constants.h b/plugins/pychrysalide/format/constants.h index 6515f35..ad7b9a5 100644 --- a/plugins/pychrysalide/format/constants.h +++ b/plugins/pychrysalide/format/constants.h @@ -31,6 +31,9 @@ +/* Définit les constantes pour les formats binaires. */ +bool define_binary_format_constants(PyTypeObject *); + /* Définit les constantes pour les symboles binaires. */ bool define_binary_symbol_constants(PyTypeObject *); diff --git a/plugins/pychrysalide/format/format.c b/plugins/pychrysalide/format/format.c index a0f8079..6c1d2da 100644 --- a/plugins/pychrysalide/format/format.c +++ b/plugins/pychrysalide/format/format.c @@ -31,6 +31,7 @@ #include +#include "constants.h" #include "executable.h" #include "symbol.h" #include "symiter.h" @@ -43,6 +44,15 @@ /* ---------------------------- FORMAT BINAIRE GENERIQUE ---------------------------- */ +/* Ajoute une information complémentaire à un format. */ +static PyObject *py_binary_format_set_flag(PyObject *, PyObject *); + +/* Retire une information complémentaire à un format. */ +static PyObject *py_binary_format_unset_flag(PyObject *, PyObject *); + +/* Détermine si un format possède un fanion particulier. */ +static PyObject *py_binary_format_has_flag(PyObject *, PyObject *); + /* Assure l'interprétation d'un format en différé. */ static PyObject *py_binary_format_analyze(PyObject *, PyObject *, PyObject *); @@ -67,6 +77,9 @@ static PyObject *py_binary_format_find_next_symbol_at(PyObject *, PyObject *); /* Recherche le symbole correspondant à une adresse. */ static PyObject *py_binary_format_resolve_symbol(PyObject *, PyObject *); +/* Fournit les particularités du format. */ +static PyObject *py_binary_format_get_flags(PyObject *, void *); + /* Indique la désignation interne du format. */ static PyObject *py_binary_format_get_name(PyObject *, void *); @@ -95,9 +108,6 @@ static PyObject *py_binary_format_get_errors(PyObject *, void *); -/* Définit les constantes pour les types d'erreurs. */ -static bool define_python_binary_format_constants(PyTypeObject *); - /* ---------------------------------------------------------------------------------- */ @@ -107,6 +117,152 @@ static bool define_python_binary_format_constants(PyTypeObject *); /****************************************************************************** * * +* Paramètres : self = serveur à manipuler. * +* args = arguments d'appel non utilisés ici. * +* * +* Description : Ajoute une information complémentaire à un format. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_binary_format_set_flag(PyObject *self, PyObject *args) +{ + PyObject *result; /* Bilan à retourner */ + unsigned int flag; /* Propriété à traiter */ + int ret; /* Bilan de lecture des args. */ + GBinFormat *format; /* Elément à manipuler */ + bool status; /* Bilan de l'opération */ + +#define BINARY_FORMAT_SET_FLAG_METHOD PYTHON_METHOD_DEF \ +( \ + set_flag, "$self, flag, /", \ + METH_VARARGS, py_binary_format, \ + "Add a property from a binary format.\n" \ + "\n" \ + "This property is one of the values listed in the" \ + " of pychrysalide.format.BinFormat.FormatFlag enumeration.\n" \ + "\n" \ + "If the flag was not set before the operation, True is" \ + " returned, else the result is False." \ +) + + ret = PyArg_ParseTuple(args, "I", &flag); + if (!ret) return NULL; + + format = G_BIN_FORMAT(pygobject_get(self)); + + status = g_binary_format_set_flag(format, flag); + + result = status ? Py_True : Py_False; + Py_INCREF(result); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = serveur à manipuler. * +* args = arguments d'appel non utilisés ici. * +* * +* Description : Retire une information complémentaire à un format. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_binary_format_unset_flag(PyObject *self, PyObject *args) +{ + PyObject *result; /* Bilan à retourner */ + unsigned int flag; /* Propriété à traiter */ + int ret; /* Bilan de lecture des args. */ + GBinFormat *format; /* Elément à manipuler */ + bool status; /* Bilan de l'opération */ + +#define BINARY_FORMAT_UNSET_FLAG_METHOD PYTHON_METHOD_DEF \ +( \ + unset_flag, "$self, flag, /", \ + METH_VARARGS, py_binary_format, \ + "Remove a property from a binary format.\n" \ + "\n" \ + "This property is one of the values listed in the" \ + " of pychrysalide.format.BinFormat.FormatFlag enumeration.\n" \ + "\n" \ + "If the flag was not set before the operation, False is" \ + " returned, else the result is True." \ +) + + ret = PyArg_ParseTuple(args, "I", &flag); + if (!ret) return NULL; + + format = G_BIN_FORMAT(pygobject_get(self)); + + status = g_binary_format_unset_flag(format, flag); + + result = status ? Py_True : Py_False; + Py_INCREF(result); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = serveur à manipuler. * +* args = arguments d'appel non utilisés ici. * +* * +* Description : Détermine si un format possède un fanion particulier. * +* * +* Retour : Bilan de la détection. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_binary_format_has_flag(PyObject *self, PyObject *args) +{ + PyObject *result; /* Bilan à retourner */ + unsigned int flag; /* Propriété à traiter */ + int ret; /* Bilan de lecture des args. */ + GBinFormat *format; /* Elément à manipuler */ + bool status; /* Bilan de l'opération */ + +#define BINARY_FORMAT_HAS_FLAG_METHOD PYTHON_METHOD_DEF \ +( \ + has_flag, "$self, flag, /", \ + METH_VARARGS, py_binary_format, \ + "Test if a binary format has a given property.\n" \ + "\n" \ + "This property is one of the values listed in the" \ + " of pychrysalide.format.BinFormat.FormatFlag enumeration.\n" \ + "\n" \ + "The result is a boolean value." \ +) + + ret = PyArg_ParseTuple(args, "I", &flag); + if (!ret) return NULL; + + format = G_BIN_FORMAT(pygobject_get(self)); + + status = g_binary_format_has_flag(format, flag); + + result = status ? Py_True : Py_False; + Py_INCREF(result); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : self = contenu binaire à manipuler. * * args = arguments fournis à l'appel. * * kwds = arguments de type key=val fournis. * @@ -453,6 +609,42 @@ static PyObject *py_binary_format_resolve_symbol(PyObject *self, PyObject *args) * Paramètres : self = objet Python concerné par l'appel. * * closure = non utilisé ici. * * * +* Description : Fournit les particularités du format. * +* * +* Retour : Somme de tous les fanions associés au format. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_binary_format_get_flags(PyObject *self, void *closure) +{ + PyObject *result; /* Valeur à retourner */ + GBinFormat *format; /* Elément à consulter */ + FormatFlag flags; /* Indications complémentaires */ + +#define BINARY_FORMAT_FLAGS_ATTRIB PYTHON_GET_DEF_FULL \ +( \ + flags, py_binary_format, \ + "Provide all the flags set for a format. The return value" \ + " is of type pychrysalide.format.BinFormat.FormatFlag." \ +) + + format = G_BIN_FORMAT(pygobject_get(self)); + flags = g_binary_format_get_flags(format); + + result = cast_with_constants_group_from_type(get_python_binary_format_type(), "FormatFlag", flags); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * * Description : Indique la désignation interne du format. * * * * Retour : Description du format. * @@ -674,33 +866,6 @@ static PyObject *py_binary_format_get_errors(PyObject *self, void *closure) - -/****************************************************************************** -* * -* Paramètres : obj_type = type dont le dictionnaire est à compléter. * -* * -* Description : Définit les constantes pour les types d'erreurs. * -* * -* Retour : true en cas de succès de l'opération, false sinon. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool define_python_binary_format_constants(PyTypeObject *obj_type) -{ - bool result; /* Bilan à retourner */ - - result = true; - - result &= PyDict_AddULongMacro(obj_type, BFE_SPECIFICATION); - result &= PyDict_AddULongMacro(obj_type, BFE_STRUCTURE); - - return result; - -} - - /****************************************************************************** * * * Paramètres : - * @@ -716,6 +881,9 @@ static bool define_python_binary_format_constants(PyTypeObject *obj_type) PyTypeObject *get_python_binary_format_type(void) { static PyMethodDef py_bin_format_methods[] = { + BINARY_FORMAT_SET_FLAG_METHOD, + BINARY_FORMAT_UNSET_FLAG_METHOD, + BINARY_FORMAT_HAS_FLAG_METHOD, BINARY_FORMAT_ANALYZE_METHOD, { "register_code_point", py_binary_format_register_code_point, @@ -761,6 +929,7 @@ PyTypeObject *get_python_binary_format_type(void) }; static PyGetSetDef py_bin_format_getseters[] = { + BINARY_FORMAT_FLAGS_ATTRIB, { "name", py_binary_format_get_name, NULL, "Internal name of the binary format.", NULL @@ -836,7 +1005,7 @@ bool ensure_python_binary_format_is_registered(void) if (!register_class_for_pygobject(dict, G_TYPE_BIN_FORMAT, type, &PyGObject_Type)) return false; - if (!define_python_binary_format_constants(type)) + if (!define_binary_format_constants(type)) return false; } diff --git a/src/format/format-int.h b/src/format/format-int.h index c8f2b1a..4ef9793 100644 --- a/src/format/format-int.h +++ b/src/format/format-int.h @@ -29,6 +29,7 @@ #include "preload.h" +#include "../glibext/objhole.h" #include "../gtkext/gtkstatusstack.h" #include "../mangling/demangler.h" @@ -56,6 +57,18 @@ typedef void (* format_complete_analysis_fc) (GBinFormat *, wgroup_id_t, GtkStat /* Rythme des allocations pour les entrées de code */ #define EXTRA_POINT_BLOCK 20 +/* Informations glissées dans la structure GObject de GBinFormat */ +typedef union _fmt_obj_extra +{ + struct + { + FormatFlag flags; /* Informations complémentaires*/ + + }; + + gint lock; /* Gestion d'accès aux fanions */ + +} fmt_obj_extra; /* Description d'une erreur */ typedef struct _fmt_error @@ -67,7 +80,6 @@ typedef struct _fmt_error } fmt_error; - /* Format binaire générique (instance) */ struct _GBinFormat { @@ -99,8 +111,39 @@ struct _GBinFormat gint error_locked; /* Statut d'accès à la liste */ #endif +#if __SIZEOF_INT__ == __SIZEOF_LONG__ + + /** + * L'inclusion des informations suivantes dépend de l'architecture. + * + * Si la structure GObject possède un trou, on remplit de préférence + * ce dernier. + */ + + fmt_obj_extra extra; /* Externalisation embarquée */ + +#endif + }; +/** + * Accès aux informations éventuellement déportées. + */ + +#if __SIZEOF_INT__ == __SIZEOF_LONG__ + +# define INIT_BIN_FORMAT_EXTRA(fmt) fmt->extra.lock = 0 + +# define GET_BIN_FORMAT_EXTRA(fmt) &fmt->extra + +#else + +# define INIT_BIN_FORMAT_EXTRA(fmt) INIT_GOBJECT_EXTRA(G_OBJECT(fmt)) + +# define GET_BIN_FORMAT_EXTRA(fmt) GET_GOBJECT_EXTRA(G_OBJECT(fmt), fmt_obj_extra) + +#endif + /* Format binaire générique (classe) */ struct _GBinFormatClass { diff --git a/src/format/format.c b/src/format/format.c index 533d641..2be7d5c 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -123,6 +123,8 @@ static void g_binary_format_class_init(GBinFormatClass *klass) static void g_binary_format_init(GBinFormat *format) { + INIT_BIN_FORMAT_EXTRA(format); + g_rw_lock_init(&format->pt_lock); format->info = g_preload_info_new(); @@ -288,6 +290,133 @@ GBinContent *g_binary_format_get_content(const GBinFormat *format) /****************************************************************************** * * +* Paramètres : format = format à venir modifier. * +* flag = drapeau d'information complémentaire à planter. * +* * +* Description : Ajoute une information complémentaire à un format. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_format_set_flag(GBinFormat *format, FormatFlag flag) +{ + bool result; /* Bilan à retourner */ + fmt_obj_extra *extra; /* Données insérées à modifier */ + + extra = GET_BIN_FORMAT_EXTRA(format); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = !(extra->flags & flag); + + extra->flags |= flag; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = format à venir modifier. * +* flag = drapeau d'information complémentaire à planter. * +* * +* Description : Retire une information complémentaire à un format. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_format_unset_flag(GBinFormat *format, FormatFlag flag) +{ + bool result; /* Bilan à retourner */ + fmt_obj_extra *extra; /* Données insérées à modifier */ + + extra = GET_BIN_FORMAT_EXTRA(format); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = (extra->flags & flag); + + extra->flags &= ~flag; + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = format à venir consulter. * +* flag = drapeau d'information à rechercher. * +* * +* Description : Détermine si un format possède un fanion particulier. * +* * +* Retour : Bilan de la détection. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_binary_format_has_flag(const GBinFormat *format, FormatFlag flag) +{ + bool result; /* Bilan à retourner */ + fmt_obj_extra *extra; /* Données insérées à modifier */ + + extra = GET_BIN_FORMAT_EXTRA(format); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = (extra->flags & flag); + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = format à venir consulter. * +* * +* Description : Fournit les particularités du format. * +* * +* Retour : Somme de tous les fanions associés au format. * +* * +* Remarques : - * +* * +******************************************************************************/ + +FormatFlag g_binary_format_get_flags(const GBinFormat *format) +{ + FormatFlag result; /* Fanions à retourner */ + fmt_obj_extra *extra; /* Données insérées à modifier */ + + extra = GET_BIN_FORMAT_EXTRA(format); + + g_bit_lock(&extra->lock, HOLE_LOCK_BIT); + + result = (extra->flags & FFL_MASK); + + g_bit_unlock(&extra->lock, HOLE_LOCK_BIT); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : format = description de l'exécutable à consulter. * * * * Description : Indique la désignation interne du format. * diff --git a/src/format/format.h b/src/format/format.h index 626bb8a..f11b1db 100644 --- a/src/format/format.h +++ b/src/format/format.h @@ -40,14 +40,23 @@ /* Depuis ../mangling/demangler.h : Décodeur de désignations générique (instance) */ typedef struct _GCompDemangler GCompDemangler; +/* Indications supplémentaires liées aux formats */ +typedef enum _FormatFlag +{ + FFL_NONE = (0 << 0), /* Aucune propriété */ + FFL_RUN_IN_KERNEL_SPACE = (1 << 0), /* Exécution en espace noyau */ + + FFL_MASK = (1 << 1) - 1, /* Indication de nature */ +} FormatFlag; -#define G_TYPE_BIN_FORMAT g_binary_format_get_type() -#define G_BIN_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_binary_format_get_type(), GBinFormat)) -#define G_IS_BIN_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_binary_format_get_type())) -#define G_BIN_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BIN_FORMAT, GBinFormatClass)) -#define G_IS_BIN_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BIN_FORMAT)) -#define G_BIN_FORMAT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BIN_FORMAT, GBinFormatClass)) + +#define G_TYPE_BIN_FORMAT g_binary_format_get_type() +#define G_BIN_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_BIN_FORMAT, GBinFormat)) +#define G_IS_BIN_FORMAT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_BIN_FORMAT)) +#define G_BIN_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_BIN_FORMAT, GBinFormatClass)) +#define G_IS_BIN_FORMAT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_BIN_FORMAT)) +#define G_BIN_FORMAT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_BIN_FORMAT, GBinFormatClass)) /* Format binaire générique (instance) */ @@ -63,6 +72,18 @@ GType g_binary_format_get_type(void); /* Fournit une référence vers le contenu binaire analysé. */ GBinContent *g_binary_format_get_content(const GBinFormat *); +/* Ajoute une information complémentaire à un format. */ +bool g_binary_format_set_flag(GBinFormat *, FormatFlag); + +/* Retire une information complémentaire à un format. */ +bool g_binary_format_unset_flag(GBinFormat *, FormatFlag); + +/* Détermine si un format possède un fanion particulier. */ +bool g_binary_format_has_flag(const GBinFormat *, FormatFlag); + +/* Fournit les particularités du format. */ +FormatFlag g_binary_format_get_flags(const GBinFormat *); + /* Indique la désignation interne du format. */ const char *g_binary_format_get_name(const GBinFormat *); diff --git a/src/format/symbol-int.h b/src/format/symbol-int.h index 5e77a4d..99cee88 100644 --- a/src/format/symbol-int.h +++ b/src/format/symbol-int.h @@ -34,7 +34,7 @@ typedef char * (* get_symbol_label_fc) (const GBinSymbol *); -/* Informations glissées dans la structure GObject de GArchInstruction */ +/* Informations glissées dans la structure GObject de GBinSymbol */ typedef union _sym_obj_extra { struct @@ -82,9 +82,9 @@ struct _GBinSymbol #if __SIZEOF_INT__ == __SIZEOF_LONG__ -# define INIT_BIN_SYMBOL_EXTRA(sym) ins->extra.lock = 0 +# define INIT_BIN_SYMBOL_EXTRA(sym) sym->extra.lock = 0 -# define GET_BIN_SYMBOL_EXTRA(sym) &ins->extra +# define GET_BIN_SYMBOL_EXTRA(sym) &sym->extra #else -- cgit v0.11.2-87-g4458