From d5e94fd2895a5f9c4903bdaddf75727a54aec181 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
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 <nocbos@gmail.com>
+
+	* 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 <nocbos@gmail.com>
 
 	* 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 <assert.h>
+
+
 #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 <pygobject.h>
 
 
+#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 <pygobject.h>
+
+
+#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 <Python.h>
+
+
+
+/* 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