From d5e94fd2895a5f9c4903bdaddf75727a54aec181 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Fri, 16 Feb 2018 18:58:35 +0100 Subject: Extended the ELF format support. --- ChangeLog | 31 +++++++ plugins/elf/dynamic.c | 85 ++++++++++++++++-- plugins/elf/dynamic.h | 14 ++- plugins/elf/elf_def.h | 8 +- plugins/elf/python/Makefile.am | 1 + plugins/elf/python/constants.c | 6 ++ plugins/elf/python/dynamic.c | 46 +++++++++- plugins/elf/python/dynamic.h | 3 + plugins/elf/python/elf_def.c | 195 +++++++++++++++++++++++++++++++++++++++++ plugins/elf/python/elf_def.h | 53 +++++++++++ plugins/elf/python/format.c | 30 +++++++ plugins/elf/python/program.c | 2 +- plugins/elf/python/section.c | 2 +- plugins/elf/symbols.c | 32 +++---- 14 files changed, 477 insertions(+), 31 deletions(-) create mode 100644 plugins/elf/python/elf_def.c create mode 100644 plugins/elf/python/elf_def.h diff --git a/ChangeLog b/ChangeLog index 3892417..6259b01 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,34 @@ +18-02-16 Cyrille Bagard + + * plugins/elf/dynamic.c: + * plugins/elf/dynamic.h: + Improve the dynamic segment handle using refactoring. + + * plugins/elf/elf_def.h: + Insert some mssing ELF definitions. + + * plugins/elf/python/Makefile.am: + Add the 'elf_def.[ch]' files to libelfpython_la_SOURCES. + + * plugins/elf/python/constants.c: + * plugins/elf/python/dynamic.c: + * plugins/elf/python/dynamic.h: + Update code. + + * plugins/elf/python/elf_def.c: + * plugins/elf/python/elf_def.h: + New entries: provide the size of some internal ELF structures to Python. + + * plugins/elf/python/format.c: + Extend the ELF format support. + + * plugins/elf/python/program.c: + * plugins/elf/python/section.c: + Typo. + + * plugins/elf/symbols.c: + Update code. + 18-02-15 Cyrille Bagard * plugins/pychrysalide/arch/vmpa.c: diff --git a/plugins/elf/dynamic.c b/plugins/elf/dynamic.c index f1d5e02..9d211e6 100644 --- a/plugins/elf/dynamic.c +++ b/plugins/elf/dynamic.c @@ -24,6 +24,9 @@ #include "dynamic.h" +#include + + #include "elf-int.h" #include "program.h" @@ -71,10 +74,80 @@ bool find_elf_dynamic_program_header(const GElfFormat *format, elf_phdr *dynamic * * * Paramètres : format = informations chargées à consulter. * * dynamic = programme de type PT_DYNAMIC. * +* index = indice de l'élément recherché. * +* item = élément retrouvé dans la section. [OUT] * +* * +* Description : Retrouve un élément dans la section dynamique par son indice.* +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool _find_elf_dynamic_item_by_index(const GElfFormat *format, const elf_phdr *dynamic, size_t index, elf_dyn *item) +{ + bool result; /* Bilan à retourner */ + size_t max; /* Nombre d'entités présentes */ + phys_t pos; /* Position de lecture */ + + max = ELF_PHDR(format, *dynamic, p_filesz) / ELF_SIZEOF_DYN(format); + + assert(index < max); + + if (index < max) + { + pos = ELF_PHDR(format, *dynamic, p_offset) + index * ELF_SIZEOF_DYN(format); + + result = read_elf_dynamic_entry(format, pos, item); + + } + + else + result = false; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* index = indice de l'élément recherché. * +* item = élément retrouvé dans la section. [OUT] * +* * +* Description : Retrouve un élément dans la section dynamique par son indice.* +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool find_elf_dynamic_item_by_index(const GElfFormat *format, size_t index, elf_dyn *item) +{ + bool result; /* Bilan à retourner */ + elf_phdr dynamic; /* En-tête de programme DYNAMIC*/ + + result = find_elf_dynamic_program_header(format, &dynamic); + + if (result) + result = _find_elf_dynamic_item_by_index(format, &dynamic, index, item); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : format = informations chargées à consulter. * +* dynamic = programme de type PT_DYNAMIC. * * type = sorte d'élément recherché. * * item = élément retrouvé dans la section. [OUT] * * * -* Description : Retrouve un élément donné dans la section dynamique. * +* Description : Retrouve un élément dans la section dynamique par son type. * * * * Retour : Bilan de l'opération. * * * @@ -82,7 +155,7 @@ bool find_elf_dynamic_program_header(const GElfFormat *format, elf_phdr *dynamic * * ******************************************************************************/ -bool find_elf_dynamic_item_from_pheader(const GElfFormat *format, const elf_phdr *dynamic, int64_t type, elf_dyn *item) +bool _find_elf_dynamic_item_by_type(const GElfFormat *format, const elf_phdr *dynamic, int64_t type, elf_dyn *item) { bool result; /* Bilan à retourner */ off_t max; /* Nombre d'entités présentes */ @@ -115,7 +188,7 @@ bool find_elf_dynamic_item_from_pheader(const GElfFormat *format, const elf_phdr * type = sorte d'élément recherché. * * item = élément retrouvé dans la section. [OUT] * * * -* Description : Retrouve rapidement un élément dans la section dynamique. * +* Description : Retrouve un élément dans la section dynamique par son type. * * * * Retour : Bilan de l'opération. * * * @@ -123,7 +196,7 @@ bool find_elf_dynamic_item_from_pheader(const GElfFormat *format, const elf_phdr * * ******************************************************************************/ -bool find_elf_dynamic_item(const GElfFormat *format, int64_t type, elf_dyn *item) +bool find_elf_dynamic_item_by_type(const GElfFormat *format, int64_t type, elf_dyn *item) { bool result; /* Bilan à retourner */ elf_phdr dynamic; /* En-tête de programme DYNAMIC*/ @@ -131,7 +204,7 @@ bool find_elf_dynamic_item(const GElfFormat *format, int64_t type, elf_dyn *item result = find_elf_dynamic_program_header(format, &dynamic); if (result) - result = find_elf_dynamic_item_from_pheader(format, &dynamic, type, item); + result = _find_elf_dynamic_item_by_type(format, &dynamic, type, item); return result; @@ -262,7 +335,7 @@ bool resolve_plt_using_got(GElfFormat *format, virt_t *virt) if (!find_elf_program_by_type(format, PT_DYNAMIC, &dynamic)) goto rpug_exit; - if (!find_elf_dynamic_item_from_pheader(format, &dynamic, DT_PLTGOT, &pltgot)) + if (!_find_elf_dynamic_item_by_type(format, &dynamic, DT_PLTGOT, &pltgot)) goto rpug_exit; got_virt = ELF_DYN(format, pltgot, d_un.d_ptr); diff --git a/plugins/elf/dynamic.h b/plugins/elf/dynamic.h index 1ca4785..62e8b39 100644 --- a/plugins/elf/dynamic.h +++ b/plugins/elf/dynamic.h @@ -33,11 +33,17 @@ /* Recherche un en-tête de programme DYNAMIC au sein de binaire. */ bool find_elf_dynamic_program_header(const GElfFormat *, elf_phdr *); -/* Retrouve un élément donné dans la section dynamique. */ -bool find_elf_dynamic_item_from_pheader(const GElfFormat *, const elf_phdr *, int64_t, elf_dyn *); +/* Retrouve un élément dans la section dynamique par son indice. */ +bool _find_elf_dynamic_item_by_index(const GElfFormat *, const elf_phdr *, size_t, elf_dyn *); -/* Retrouve rapidement un élément dans la section dynamique. */ -bool find_elf_dynamic_item(const GElfFormat *, int64_t, elf_dyn *); +/* Retrouve un élément dans la section dynamique par son indice. */ +bool find_elf_dynamic_item_by_index(const GElfFormat *, size_t, elf_dyn *); + +/* Retrouve un élément dans la section dynamique par son type. */ +bool _find_elf_dynamic_item_by_type(const GElfFormat *, const elf_phdr *, int64_t, elf_dyn *); + +/* Retrouve un élément dans la section dynamique par son type. */ +bool find_elf_dynamic_item_by_type(const GElfFormat *, int64_t, elf_dyn *); /* Fournit la liste des objets partagés requis. */ const char **list_elf_needed_objects(const GElfFormat *, size_t *); diff --git a/plugins/elf/elf_def.h b/plugins/elf/elf_def.h index 2120afa..9284328 100644 --- a/plugins/elf/elf_def.h +++ b/plugins/elf/elf_def.h @@ -100,12 +100,16 @@ typedef union _elf_header /* Composition du champ e_ident */ - +#define EI_MAG0 0 /* Identification, octet #0 */ +#define EI_MAG1 1 /* Identification, octet #1 */ +#define EI_MAG2 2 /* Identification, octet #2 */ +#define EI_MAG3 3 /* Identification, octet #3 */ #define EI_CLASS 4 /* Indice de classe du fichier */ #define EI_DATA 5 /* Indice de l'encodage */ #define EI_VERSION 6 /* Version de fichier ELF */ #define EI_OSABI 7 /* Identification de l'ABI OS */ - +#define EI_ABIVERSION 8 /* Version de l'ABI */ +#define EI_PAD 9 /* Premier octet de bourrage */ /* ... EI_CLASS */ diff --git a/plugins/elf/python/Makefile.am b/plugins/elf/python/Makefile.am index 6080e86..ce2fe74 100644 --- a/plugins/elf/python/Makefile.am +++ b/plugins/elf/python/Makefile.am @@ -4,6 +4,7 @@ noinst_LTLIBRARIES = libelfpython.la libelfpython_la_SOURCES = \ constants.h constants.c \ dynamic.h dynamic.c \ + elf_def.h elf_def.c \ format.h format.c \ module.h module.c \ program.h program.c \ diff --git a/plugins/elf/python/constants.c b/plugins/elf/python/constants.c index 1e92616..098443c 100644 --- a/plugins/elf/python/constants.c +++ b/plugins/elf/python/constants.c @@ -62,10 +62,16 @@ static bool define_python_binary_format_common_constants(PyTypeObject *obj_type) /* Composition du champ e_ident */ + if (result) result = PyDict_AddIntMacro(obj_type, EI_MAG0); + if (result) result = PyDict_AddIntMacro(obj_type, EI_MAG1); + if (result) result = PyDict_AddIntMacro(obj_type, EI_MAG2); + if (result) result = PyDict_AddIntMacro(obj_type, EI_MAG3); if (result) result = PyDict_AddIntMacro(obj_type, EI_CLASS); if (result) result = PyDict_AddIntMacro(obj_type, EI_DATA); if (result) result = PyDict_AddIntMacro(obj_type, EI_VERSION); if (result) result = PyDict_AddIntMacro(obj_type, EI_OSABI); + if (result) result = PyDict_AddIntMacro(obj_type, EI_ABIVERSION); + if (result) result = PyDict_AddIntMacro(obj_type, EI_PAD); /* ... EI_CLASS */ diff --git a/plugins/elf/python/dynamic.c b/plugins/elf/python/dynamic.c index 5c060c1..9fe6eb4 100644 --- a/plugins/elf/python/dynamic.c +++ b/plugins/elf/python/dynamic.c @@ -1,6 +1,6 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * dynamic.c - prototypes pour l'équivalent Python du fichier "plugins/elf/dynamic.c" + * dynamic.c - équivalent Python du fichier "plugins/elf/dynamic.c" * * Copyright (C) 2017 Cyrille Bagard * @@ -29,12 +29,56 @@ #include +#include "translate.h" #include "../dynamic.h" /****************************************************************************** * * +* Paramètres : self = format Elf à manipuler. * +* args = indice de la section visée. * +* * +* Description : Retrouve un élément dans la section dynamique par son indice.* +* * +* Retour : Elément trouvé ou rien (None). * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyObject *py_elf_format_find_dynamic_item_by_index(PyObject *self, PyObject *args) +{ + PyObject *result; /* Trouvaille à retourner */ + GElfFormat *format; /* Version GLib du format */ + unsigned long index; /* Indice de l'élément visé */ + int ret; /* Bilan de lecture des args. */ + elf_dyn item; /* Informations remontées */ + bool found; /* Recherches concluantes ? */ + + format = G_ELF_FORMAT(pygobject_get(self)); + + ret = PyArg_ParseTuple(args, "k", &index); + if (!ret) return NULL; + + found = find_elf_dynamic_item_by_index(format, index, &item); + + if (found) + result = translate_elf_dyn_to_python(format, &item); + + else + { + result = Py_None; + Py_INCREF(result); + } + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : self = classe représentant un format ELF. * * closure = adresse non utilisée ici. * * * diff --git a/plugins/elf/python/dynamic.h b/plugins/elf/python/dynamic.h index b1c4008..4ef2936 100644 --- a/plugins/elf/python/dynamic.h +++ b/plugins/elf/python/dynamic.h @@ -30,6 +30,9 @@ +/* Retrouve un élément dans la section dynamique par son indice. */ +PyObject *py_elf_format_find_dynamic_item_by_index(PyObject *, PyObject *); + /* Fournit la liste des objets partagés requis. */ PyObject *py_elf_format_get_needed(PyObject *, void *); diff --git a/plugins/elf/python/elf_def.c b/plugins/elf/python/elf_def.c new file mode 100644 index 0000000..0721020 --- /dev/null +++ b/plugins/elf/python/elf_def.c @@ -0,0 +1,195 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * elf_def.c - équivalent Python du fichier "plugins/elf/elf_def.c" + * + * Copyright (C) 2017 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "elf_def.h" + + +#include + + +#include "../elf_def.h" +#include "../elf-int.h" + + + +/****************************************************************************** +* * +* Paramètres : self = classe représentant un format ELF. * +* closure = adresse non utilisée ici. * +* * +* Description : Indique la taille d'un entête ELF. * +* * +* Retour : Taille d'une structure ELF adaptée à l'architecture. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyObject *py_elf_format_get_sizeof_hdr(PyObject *self, void *closure) +{ + PyObject *result; /* Liste éventuelle à renvoyer */ + GElfFormat *format; /* Version native */ + + format = G_ELF_FORMAT(pygobject_get(self)); + + result = PyLong_FromSize_t(ELF_SIZEOF_HDR(format)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = classe représentant un format ELF. * +* closure = adresse non utilisée ici. * +* * +* Description : Indique la taille d'un entête de programme ELF. * +* * +* Retour : Taille d'une structure ELF adaptée à l'architecture. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyObject *py_elf_format_get_sizeof_phdr(PyObject *self, void *closure) +{ + PyObject *result; /* Liste éventuelle à renvoyer */ + GElfFormat *format; /* Version native */ + + format = G_ELF_FORMAT(pygobject_get(self)); + + result = PyLong_FromSize_t(ELF_SIZEOF_PHDR(format)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = classe représentant un format ELF. * +* closure = adresse non utilisée ici. * +* * +* Description : Indique la taille d'un entête de section ELF. * +* * +* Retour : Taille d'une structure ELF adaptée à l'architecture. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyObject *py_elf_format_get_sizeof_shdr(PyObject *self, void *closure) +{ + PyObject *result; /* Liste éventuelle à renvoyer */ + GElfFormat *format; /* Version native */ + + format = G_ELF_FORMAT(pygobject_get(self)); + + result = PyLong_FromSize_t(ELF_SIZEOF_SHDR(format)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = classe représentant un format ELF. * +* closure = adresse non utilisée ici. * +* * +* Description : Indique la taille d'une entité dynamique de format ELF. * +* * +* Retour : Taille d'une structure ELF adaptée à l'architecture. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyObject *py_elf_format_get_sizeof_dyn(PyObject *self, void *closure) +{ + PyObject *result; /* Liste éventuelle à renvoyer */ + GElfFormat *format; /* Version native */ + + format = G_ELF_FORMAT(pygobject_get(self)); + + result = PyLong_FromSize_t(ELF_SIZEOF_DYN(format)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = classe représentant un format ELF. * +* closure = adresse non utilisée ici. * +* * +* Description : Indique la taille d'une information sur un symbole ELF. * +* * +* Retour : Taille d'une structure ELF adaptée à l'architecture. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyObject *py_elf_format_get_sizeof_sym(PyObject *self, void *closure) +{ + PyObject *result; /* Liste éventuelle à renvoyer */ + GElfFormat *format; /* Version native */ + + format = G_ELF_FORMAT(pygobject_get(self)); + + result = PyLong_FromSize_t(ELF_SIZEOF_SYM(format)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = classe représentant un format ELF. * +* closure = adresse non utilisée ici. * +* * +* Description : Indique la taille d'une information de relocalisation ELF. * +* * +* Retour : Taille d'une structure ELF adaptée à l'architecture. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyObject *py_elf_format_get_sizeof_rel(PyObject *self, void *closure) +{ + PyObject *result; /* Liste éventuelle à renvoyer */ + GElfFormat *format; /* Version native */ + + format = G_ELF_FORMAT(pygobject_get(self)); + + result = PyLong_FromSize_t(ELF_SIZEOF_REL(format)); + + return result; + +} diff --git a/plugins/elf/python/elf_def.h b/plugins/elf/python/elf_def.h new file mode 100644 index 0000000..134dd13 --- /dev/null +++ b/plugins/elf/python/elf_def.h @@ -0,0 +1,53 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * elf_def.h - prototypes pour l'équivalent Python du fichier "plugins/elf/elf_def.h" + * + * Copyright (C) 2018 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifndef _PLUGINS_ELF_PYTHON_ELF_DEF_H +#define _PLUGINS_ELF_PYTHON_ELF_DEF_H + + +#include + + + +/* Indique la taille d'un entête ELF. */ +PyObject *py_elf_format_get_sizeof_hdr(PyObject *, void *); + +/* Indique la taille d'un entête de programme ELF. */ +PyObject *py_elf_format_get_sizeof_phdr(PyObject *, void *); + +/* Indique la taille d'un entête de section ELF. */ +PyObject *py_elf_format_get_sizeof_shdr(PyObject *, void *); + +/* Indique la taille d'une entité dynamique de format ELF. */ +PyObject *py_elf_format_get_sizeof_dyn(PyObject *, void *); + +/* Indique la taille d'une information sur un symbole ELF. */ +PyObject *py_elf_format_get_sizeof_sym(PyObject *, void *); + +/* Indique la taille d'une information de relocalisation ELF. */ +PyObject *py_elf_format_get_sizeof_rel(PyObject *, void *); + + + +#endif /* _PLUGINS_ELF_PYTHON_ELF_DEF_H */ diff --git a/plugins/elf/python/format.c b/plugins/elf/python/format.c index 6b44703..a3d8758 100644 --- a/plugins/elf/python/format.c +++ b/plugins/elf/python/format.c @@ -38,6 +38,7 @@ #include "constants.h" #include "dynamic.h" +#include "elf_def.h" #include "program.h" #include "section.h" #include "translate.h" @@ -219,11 +220,40 @@ PyTypeObject *get_python_elf_format_type(void) METH_VARARGS, "find_sections_by_type($self, type, /)\n--\n\nFind sections using a given type." }, + { + "find_dynamic_item_by_index", py_elf_format_find_dynamic_item_by_index, + METH_VARARGS, + "find_dynamic_item_by_type($self, type, /)\n--\n\nFind an item from the dynamic segment using a given index." + }, { NULL } }; static PyGetSetDef py_elf_format_getseters[] = { { + "sizeof_hdr", py_elf_format_get_sizeof_hdr, NULL, + "Provide the size of Elf_Ehdr structures for the loaded format.", NULL + }, + { + "sizeof_phdr", py_elf_format_get_sizeof_phdr, NULL, + "Provide the size of Elf_Phdr structures for the loaded format.", NULL + }, + { + "sizeof_shdr", py_elf_format_get_sizeof_shdr, NULL, + "Provide the size of Elf_Shdr structures for the loaded format.", NULL + }, + { + "sizeof_dyn", py_elf_format_get_sizeof_dyn, NULL, + "Provide the size of Elf_Dyn structures for the loaded format.", NULL + }, + { + "sizeof_sym", py_elf_format_get_sizeof_sym, NULL, + "Provide the size of Elf_Sym structures for the loaded format.", NULL + }, + { + "sizeof_rel", py_elf_format_get_sizeof_rel, NULL, + "Provide the size of Elf_Rel structures for the loaded format.", NULL + }, + { "needed", py_elf_format_get_needed, NULL, "Provide the list of requiered shared objects.", NULL }, diff --git a/plugins/elf/python/program.c b/plugins/elf/python/program.c index 198a76b..401b0d0 100644 --- a/plugins/elf/python/program.c +++ b/plugins/elf/python/program.c @@ -1,6 +1,6 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * program.c - prototypes pour l'équivalent Python du fichier "plugins/elf/program.c" + * program.c - équivalent Python du fichier "plugins/elf/program.c" * * Copyright (C) 2017 Cyrille Bagard * diff --git a/plugins/elf/python/section.c b/plugins/elf/python/section.c index 537babc..b40681d 100644 --- a/plugins/elf/python/section.c +++ b/plugins/elf/python/section.c @@ -1,6 +1,6 @@ /* Chrysalide - Outil d'analyse de fichiers binaires - * section.c - prototypes pour l'équivalent Python du fichier "plugins/elf/section.c" + * section.c - équivalent Python du fichier "plugins/elf/section.c" * * Copyright (C) 2017 Cyrille Bagard * diff --git a/plugins/elf/symbols.c b/plugins/elf/symbols.c index de4d21a..315d003 100644 --- a/plugins/elf/symbols.c +++ b/plugins/elf/symbols.c @@ -262,7 +262,7 @@ static bool load_all_elf_basic_entry_points(GElfFormat *format) /* Détection des constructeurs & destructeurs */ - if (find_elf_dynamic_item_from_pheader(format, &dynamic, DT_INIT, &item_a)) + if (_find_elf_dynamic_item_by_type(format, &dynamic, DT_INIT, &item_a)) { ep = ELF_DYN(format, item_a, d_un.d_ptr); @@ -274,7 +274,7 @@ static bool load_all_elf_basic_entry_points(GElfFormat *format) } - if (find_elf_dynamic_item_from_pheader(format, &dynamic, DT_FINI, &item_a)) + if (_find_elf_dynamic_item_by_type(format, &dynamic, DT_FINI, &item_a)) { ep = ELF_DYN(format, item_a, d_un.d_ptr); @@ -340,27 +340,27 @@ static bool load_all_elf_basic_entry_points(GElfFormat *format) } - if (find_elf_dynamic_item_from_pheader(format, &dynamic, DT_INIT_ARRAY, &item_a)) + if (_find_elf_dynamic_item_by_type(format, &dynamic, DT_INIT_ARRAY, &item_a)) { - if (find_elf_dynamic_item_from_pheader(format, &dynamic, DT_INIT_ARRAYSZ, &item_b)) + if (_find_elf_dynamic_item_by_type(format, &dynamic, DT_INIT_ARRAYSZ, &item_b)) { load_entry_points_from_array(format, &item_a, &item_b, "init_array_function_"); } } - if (find_elf_dynamic_item_from_pheader(format, &dynamic, DT_FINI_ARRAY, &item_a)) + if (_find_elf_dynamic_item_by_type(format, &dynamic, DT_FINI_ARRAY, &item_a)) { - if (find_elf_dynamic_item_from_pheader(format, &dynamic, DT_FINI_ARRAYSZ, &item_b)) + if (_find_elf_dynamic_item_by_type(format, &dynamic, DT_FINI_ARRAYSZ, &item_b)) { load_entry_points_from_array(format, &item_a, &item_b, "fini_array_function_"); } } - if (find_elf_dynamic_item_from_pheader(format, &dynamic, DT_PREINIT_ARRAY, &item_a)) + if (_find_elf_dynamic_item_by_type(format, &dynamic, DT_PREINIT_ARRAY, &item_a)) { - if (find_elf_dynamic_item_from_pheader(format, &dynamic, DT_PREINIT_ARRAYSZ, &item_b)) + if (_find_elf_dynamic_item_by_type(format, &dynamic, DT_PREINIT_ARRAYSZ, &item_b)) { load_entry_points_from_array(format, &item_a, &item_b, "preinit_array_function_"); } @@ -369,7 +369,7 @@ static bool load_all_elf_basic_entry_points(GElfFormat *format) /* Identification de l'entrée de la PLT */ - if (find_elf_dynamic_item_from_pheader(format, &dynamic, DT_PLTGOT, &item_a)) + if (_find_elf_dynamic_item_by_type(format, &dynamic, DT_PLTGOT, &item_a)) { status = g_exe_format_translate_address_into_vmpa(G_EXE_FORMAT(format), ELF_DYN(format, item_a, d_un.d_val), @@ -775,7 +775,7 @@ static bool count_elf_global_symbols(GElfFormat *format, GExeFormat *exec, uint3 * */ - found = find_elf_dynamic_item(format, DT_HASH, &hash); + found = find_elf_dynamic_item_by_type(format, DT_HASH, &hash); if (!found) goto cegs_exit; exec = G_EXE_FORMAT(format); @@ -833,7 +833,7 @@ static bool load_elf_global_symbols(GElfFormat *format, wgroup_id_t gid, GtkStat /* Récupération du début des chaînes de description */ - result = find_elf_dynamic_item(format, DT_STRTAB, &strtab); + result = find_elf_dynamic_item_by_type(format, DT_STRTAB, &strtab); if (!result) goto lees_exit; result = g_exe_format_translate_address_into_offset(exec, ELF_DYN(format, strtab, d_un.d_ptr), &str_start); @@ -841,7 +841,7 @@ static bool load_elf_global_symbols(GElfFormat *format, wgroup_id_t gid, GtkStat /* Récupération du début des définitions de symboles */ - result = find_elf_dynamic_item(format, DT_SYMTAB, &symtab); + result = find_elf_dynamic_item_by_type(format, DT_SYMTAB, &symtab); if (!result) goto lees_exit; result = g_exe_format_translate_address_into_offset(exec, ELF_DYN(format, symtab, d_un.d_ptr), &sym_start); @@ -954,7 +954,7 @@ static bool load_elf_relocations(GElfFormat *format, const elf_phdr *dynamic, el /* Collecte des informations */ - if (!find_elf_dynamic_item_from_pheader(format, dynamic, DT_JMPREL, &jmprel)) + if (!_find_elf_dynamic_item_by_type(format, dynamic, DT_JMPREL, &jmprel)) goto ler_exit; result = g_exe_format_translate_address_into_vmpa(exec, ELF_DYN(format, jmprel, d_un.d_ptr), &start); @@ -962,7 +962,7 @@ static bool load_elf_relocations(GElfFormat *format, const elf_phdr *dynamic, el if (!result) goto ler_exit; - if (!find_elf_dynamic_item_from_pheader(format, dynamic, DT_PLTRELSZ, &pltrelsz)) + if (!_find_elf_dynamic_item_by_type(format, dynamic, DT_PLTRELSZ, &pltrelsz)) goto ler_exit; length = ELF_DYN(format, pltrelsz, d_un.d_val); @@ -1270,7 +1270,7 @@ static bool apply_elf_relocations(GElfFormat *format, elf_rel *relocs, size_t re /* Récupération du début des chaînes de description */ - result = find_elf_dynamic_item(format, DT_STRTAB, &strtab); + result = find_elf_dynamic_item_by_type(format, DT_STRTAB, &strtab); if (!result) goto aer_exit; result = g_exe_format_translate_address_into_offset(exec, ELF_DYN(format, strtab, d_un.d_ptr), &str_start); @@ -1278,7 +1278,7 @@ static bool apply_elf_relocations(GElfFormat *format, elf_rel *relocs, size_t re /* Récupération du début des définitions de symboles */ - result = find_elf_dynamic_item(format, DT_SYMTAB, &symtab); + result = find_elf_dynamic_item_by_type(format, DT_SYMTAB, &symtab); if (!result) goto aer_exit; result = g_exe_format_translate_address_into_offset(exec, ELF_DYN(format, symtab, d_un.d_ptr), &sym_start); -- cgit v0.11.2-87-g4458