From 1af362266f616aed07e2661c9676c67dc3365740 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Sun, 4 Oct 2020 21:48:12 +0200
Subject: Registered ELF constants for the Python bindings in the right way.

---
 plugins/elf/python/constants.c | 703 +++++++++++++++++++++++------------------
 1 file changed, 403 insertions(+), 300 deletions(-)

diff --git a/plugins/elf/python/constants.c b/plugins/elf/python/constants.c
index 5156b4f..527c75c 100644
--- a/plugins/elf/python/constants.c
+++ b/plugins/elf/python/constants.c
@@ -32,15 +32,11 @@
 
 
 
-/* Définit les constantes communes pour le format Elf. */
-static bool define_python_elf_format_common_constants(PyTypeObject *);
-
-
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : obj_type = type dont le dictionnaire est à compléter.        *
+*  Paramètres  : type = type dont le dictionnaire est à compléter.            *
 *                                                                             *
-*  Description : Définit les constantes communes pour le format Elf.          *
+*  Description : Définit les constantes pour le format Elf.                   *
 *                                                                             *
 *  Retour      : true en cas de succès de l'opération, false sinon.           *
 *                                                                             *
@@ -48,9 +44,10 @@ static bool define_python_elf_format_common_constants(PyTypeObject *);
 *                                                                             *
 ******************************************************************************/
 
-static bool define_python_elf_format_common_constants(PyTypeObject *obj_type)
+bool define_python_elf_format_constants(PyTypeObject *type)
 {
     bool result;                            /* Bilan à retourner           */
+    PyObject *values;                       /* Groupe de valeurs à établir */
 
     result = true;
 
@@ -58,332 +55,438 @@ static bool define_python_elf_format_common_constants(PyTypeObject *obj_type)
      * En-tête de fichier ELF (32 et 64 bits)
      */
 
-    if (result) result = PyDict_AddULongMacro(obj_type, EI_NIDENT);
-
-    /* Composition du champ e_ident */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, EI_MAG0);
-    if (result) result = PyDict_AddULongMacro(obj_type, EI_MAG1);
-    if (result) result = PyDict_AddULongMacro(obj_type, EI_MAG2);
-    if (result) result = PyDict_AddULongMacro(obj_type, EI_MAG3);
-    if (result) result = PyDict_AddULongMacro(obj_type, EI_CLASS);
-    if (result) result = PyDict_AddULongMacro(obj_type, EI_DATA);
-    if (result) result = PyDict_AddULongMacro(obj_type, EI_VERSION);
-    if (result) result = PyDict_AddULongMacro(obj_type, EI_OSABI);
-    if (result) result = PyDict_AddULongMacro(obj_type, EI_ABIVERSION);
-    if (result) result = PyDict_AddULongMacro(obj_type, EI_PAD);
-
-    /* ... EI_CLASS */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFCLASSNONE);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFCLASS32);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFCLASS64);
-
-    /* ... EI_DATA */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFDATANONE);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFDATA2LSB);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFDATA2MSB);
-
-    /* ... EI_VERSION */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, EV_NONE);
-    if (result) result = PyDict_AddULongMacro(obj_type, EV_CURRENT);
-
-    /* ... EI_OSABI */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_NONE);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_SYSV);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_HPUX);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_NETBSD);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_GNU);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_LINUX);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_SOLARIS);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_AIX);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_IRIX);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_FREEBSD);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_TRU64);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_MODESTO);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_OPENBSD);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_ARM_AEABI);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_ARM);
-    if (result) result = PyDict_AddULongMacro(obj_type, ELFOSABI_STANDALONE);
-
-    /* Valeurs possibles pour e_type */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, ET_NONE);
-    if (result) result = PyDict_AddULongMacro(obj_type, ET_REL);
-    if (result) result = PyDict_AddULongMacro(obj_type, ET_EXEC);
-    if (result) result = PyDict_AddULongMacro(obj_type, ET_DYN);
-    if (result) result = PyDict_AddULongMacro(obj_type, ET_CORE);
-    if (result) result = PyDict_AddULongMacro(obj_type, ET_LOOS);
-    if (result) result = PyDict_AddULongMacro(obj_type, ET_HIOS);
-    if (result) result = PyDict_AddULongMacro(obj_type, ET_LOPROC);
-    if (result) result = PyDict_AddULongMacro(obj_type, ET_HIPROC);
-
-    /* Valeurs possibles pour e_machine */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_NONE);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_M32);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_SPARC);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_386);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_68K);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_88K);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_860);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_MIPS);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_S370);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_MIPS_RS3_LE);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_PARISC);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_VPP500);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_SPARC32PLUS);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_960);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_PPC);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_PPC64);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_S390);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_V800);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_FR20);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_RH32);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_RCE);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_ARM);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_FAKE_ALPHA);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_SH);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_SPARCV9);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_TRICORE);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_ARC);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_H8_300);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_H8_300H);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_H8S);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_H8_500);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_IA_64);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_MIPS_X);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_COLDFIRE);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_68HC12);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_MMA);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_PCP);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_NCPU);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_NDR1);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_STARCORE);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_ME16);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_ST100);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_TINYJ);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_X86_64);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_PDSP);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_FX66);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_ST9PLUS);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_ST7);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_68HC16);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_68HC11);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_68HC08);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_68HC05);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_SVX);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_ST19);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_VAX);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_CRIS);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_JAVELIN);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_FIREPATH);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_ZSP);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_MMIX);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_HUANY);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_PRISM);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_AVR);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_FR30);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_D10V);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_D30V);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_V850);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_M32R);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_MN10300);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_MN10200);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_PJ);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_OPENRISC);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_ARC_A5);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_XTENSA);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_AARCH64);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_TILEPRO);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_MICROBLAZE);
-    if (result) result = PyDict_AddULongMacro(obj_type, EM_TILEGX);
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "EI_MAG0", EI_MAG0);
+    if (result) result = add_const_to_group(values, "EI_MAG1", EI_MAG1);
+    if (result) result = add_const_to_group(values, "EI_MAG2", EI_MAG2);
+    if (result) result = add_const_to_group(values, "EI_MAG3", EI_MAG3);
+    if (result) result = add_const_to_group(values, "EI_CLASS", EI_CLASS);
+    if (result) result = add_const_to_group(values, "EI_DATA", EI_DATA);
+    if (result) result = add_const_to_group(values, "EI_VERSION", EI_VERSION);
+    if (result) result = add_const_to_group(values, "EI_OSABI", EI_OSABI);
+    if (result) result = add_const_to_group(values, "EI_ABIVERSION", EI_ABIVERSION);
+    if (result) result = add_const_to_group(values, "EI_PAD", EI_PAD);
+    if (result) result = add_const_to_group(values, "EI_NIDENT", EI_NIDENT);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "ElfHeaderIdent", values,
+                                            "Positions of information inside the *e_ident* field of ELF headers.");
+
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "ELFCLASSNONE", ELFCLASSNONE);
+    if (result) result = add_const_to_group(values, "ELFCLASS32", ELFCLASS32);
+    if (result) result = add_const_to_group(values, "ELFCLASS64", ELFCLASS64);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "ElfClassIdent", values,
+                                            "Class of ELF file formats at position *EI_CLASS*.");
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "ELFDATANONE", ELFDATANONE);
+    if (result) result = add_const_to_group(values, "ELFDATA2LSB", ELFDATA2LSB);
+    if (result) result = add_const_to_group(values, "ELFDATA2MSB", ELFDATA2MSB);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "ElfEndiannessIdent", values,
+                                            "Endianness of ELF file formats at position *EI_DATA*.");
+
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "EV_NONE", EV_NONE);
+    if (result) result = add_const_to_group(values, "EV_CURRENT", EV_CURRENT);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "ElfVersionIdent", values,
+                                            "Version of ELF file formats at position *EI_VERSION*.");
+
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "ELFOSABI_NONE", ELFOSABI_NONE);
+    if (result) result = add_const_to_group(values, "ELFOSABI_SYSV", ELFOSABI_SYSV);
+    if (result) result = add_const_to_group(values, "ELFOSABI_HPUX", ELFOSABI_HPUX);
+    if (result) result = add_const_to_group(values, "ELFOSABI_NETBSD", ELFOSABI_NETBSD);
+    if (result) result = add_const_to_group(values, "ELFOSABI_GNU", ELFOSABI_GNU);
+    if (result) result = add_const_to_group(values, "ELFOSABI_LINUX", ELFOSABI_LINUX);
+    if (result) result = add_const_to_group(values, "ELFOSABI_SOLARIS", ELFOSABI_SOLARIS);
+    if (result) result = add_const_to_group(values, "ELFOSABI_AIX", ELFOSABI_AIX);
+    if (result) result = add_const_to_group(values, "ELFOSABI_IRIX", ELFOSABI_IRIX);
+    if (result) result = add_const_to_group(values, "ELFOSABI_FREEBSD", ELFOSABI_FREEBSD);
+    if (result) result = add_const_to_group(values, "ELFOSABI_TRU64", ELFOSABI_TRU64);
+    if (result) result = add_const_to_group(values, "ELFOSABI_MODESTO", ELFOSABI_MODESTO);
+    if (result) result = add_const_to_group(values, "ELFOSABI_OPENBSD", ELFOSABI_OPENBSD);
+    if (result) result = add_const_to_group(values, "ELFOSABI_ARM_AEABI", ELFOSABI_ARM_AEABI);
+    if (result) result = add_const_to_group(values, "ELFOSABI_ARM", ELFOSABI_ARM);
+    if (result) result = add_const_to_group(values, "ELFOSABI_STANDALONE", ELFOSABI_STANDALONE);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "ElfAbiIdent", values,
+                                            "ABI of ELF file formats at position *EI_OSABI*.");
+
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "ET_NONE", ET_NONE);
+    if (result) result = add_const_to_group(values, "ET_REL", ET_REL);
+    if (result) result = add_const_to_group(values, "ET_EXEC", ET_EXEC);
+    if (result) result = add_const_to_group(values, "ET_DYN", ET_DYN);
+    if (result) result = add_const_to_group(values, "ET_CORE", ET_CORE);
+    if (result) result = add_const_to_group(values, "ET_LOOS", ET_LOOS);
+    if (result) result = add_const_to_group(values, "ET_HIOS", ET_HIOS);
+    if (result) result = add_const_to_group(values, "ET_LOPROC", ET_LOPROC);
+    if (result) result = add_const_to_group(values, "ET_HIPROC", ET_HIPROC);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "ElfHeaderType", values,
+                                            "Type available in the *e_type* field of ELF headers.");
+
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "EM_NONE", EM_NONE);
+    if (result) result = add_const_to_group(values, "EM_M32", EM_M32);
+    if (result) result = add_const_to_group(values, "EM_SPARC", EM_SPARC);
+    if (result) result = add_const_to_group(values, "EM_386", EM_386);
+    if (result) result = add_const_to_group(values, "EM_68K", EM_68K);
+    if (result) result = add_const_to_group(values, "EM_88K", EM_88K);
+    if (result) result = add_const_to_group(values, "EM_860", EM_860);
+    if (result) result = add_const_to_group(values, "EM_MIPS", EM_MIPS);
+    if (result) result = add_const_to_group(values, "EM_S370", EM_S370);
+    if (result) result = add_const_to_group(values, "EM_MIPS_RS3_LE", EM_MIPS_RS3_LE);
+    if (result) result = add_const_to_group(values, "EM_PARISC", EM_PARISC);
+    if (result) result = add_const_to_group(values, "EM_VPP500", EM_VPP500);
+    if (result) result = add_const_to_group(values, "EM_SPARC32PLUS", EM_SPARC32PLUS);
+    if (result) result = add_const_to_group(values, "EM_960", EM_960);
+    if (result) result = add_const_to_group(values, "EM_PPC", EM_PPC);
+    if (result) result = add_const_to_group(values, "EM_PPC64", EM_PPC64);
+    if (result) result = add_const_to_group(values, "EM_S390", EM_S390);
+    if (result) result = add_const_to_group(values, "EM_V800", EM_V800);
+    if (result) result = add_const_to_group(values, "EM_FR20", EM_FR20);
+    if (result) result = add_const_to_group(values, "EM_RH32", EM_RH32);
+    if (result) result = add_const_to_group(values, "EM_RCE", EM_RCE);
+    if (result) result = add_const_to_group(values, "EM_ARM", EM_ARM);
+    if (result) result = add_const_to_group(values, "EM_FAKE_ALPHA", EM_FAKE_ALPHA);
+    if (result) result = add_const_to_group(values, "EM_SH", EM_SH);
+    if (result) result = add_const_to_group(values, "EM_SPARCV9", EM_SPARCV9);
+    if (result) result = add_const_to_group(values, "EM_TRICORE", EM_TRICORE);
+    if (result) result = add_const_to_group(values, "EM_ARC", EM_ARC);
+    if (result) result = add_const_to_group(values, "EM_H8_300", EM_H8_300);
+    if (result) result = add_const_to_group(values, "EM_H8_300H", EM_H8_300H);
+    if (result) result = add_const_to_group(values, "EM_H8S", EM_H8S);
+    if (result) result = add_const_to_group(values, "EM_H8_500", EM_H8_500);
+    if (result) result = add_const_to_group(values, "EM_IA_64", EM_IA_64);
+    if (result) result = add_const_to_group(values, "EM_MIPS_X", EM_MIPS_X);
+    if (result) result = add_const_to_group(values, "EM_COLDFIRE", EM_COLDFIRE);
+    if (result) result = add_const_to_group(values, "EM_68HC12", EM_68HC12);
+    if (result) result = add_const_to_group(values, "EM_MMA", EM_MMA);
+    if (result) result = add_const_to_group(values, "EM_PCP", EM_PCP);
+    if (result) result = add_const_to_group(values, "EM_NCPU", EM_NCPU);
+    if (result) result = add_const_to_group(values, "EM_NDR1", EM_NDR1);
+    if (result) result = add_const_to_group(values, "EM_STARCORE", EM_STARCORE);
+    if (result) result = add_const_to_group(values, "EM_ME16", EM_ME16);
+    if (result) result = add_const_to_group(values, "EM_ST100", EM_ST100);
+    if (result) result = add_const_to_group(values, "EM_TINYJ", EM_TINYJ);
+    if (result) result = add_const_to_group(values, "EM_X86_64", EM_X86_64);
+    if (result) result = add_const_to_group(values, "EM_PDSP", EM_PDSP);
+    if (result) result = add_const_to_group(values, "EM_FX66", EM_FX66);
+    if (result) result = add_const_to_group(values, "EM_ST9PLUS", EM_ST9PLUS);
+    if (result) result = add_const_to_group(values, "EM_ST7", EM_ST7);
+    if (result) result = add_const_to_group(values, "EM_68HC16", EM_68HC16);
+    if (result) result = add_const_to_group(values, "EM_68HC11", EM_68HC11);
+    if (result) result = add_const_to_group(values, "EM_68HC08", EM_68HC08);
+    if (result) result = add_const_to_group(values, "EM_68HC05", EM_68HC05);
+    if (result) result = add_const_to_group(values, "EM_SVX", EM_SVX);
+    if (result) result = add_const_to_group(values, "EM_ST19", EM_ST19);
+    if (result) result = add_const_to_group(values, "EM_VAX", EM_VAX);
+    if (result) result = add_const_to_group(values, "EM_CRIS", EM_CRIS);
+    if (result) result = add_const_to_group(values, "EM_JAVELIN", EM_JAVELIN);
+    if (result) result = add_const_to_group(values, "EM_FIREPATH", EM_FIREPATH);
+    if (result) result = add_const_to_group(values, "EM_ZSP", EM_ZSP);
+    if (result) result = add_const_to_group(values, "EM_MMIX", EM_MMIX);
+    if (result) result = add_const_to_group(values, "EM_HUANY", EM_HUANY);
+    if (result) result = add_const_to_group(values, "EM_PRISM", EM_PRISM);
+    if (result) result = add_const_to_group(values, "EM_AVR", EM_AVR);
+    if (result) result = add_const_to_group(values, "EM_FR30", EM_FR30);
+    if (result) result = add_const_to_group(values, "EM_D10V", EM_D10V);
+    if (result) result = add_const_to_group(values, "EM_D30V", EM_D30V);
+    if (result) result = add_const_to_group(values, "EM_V850", EM_V850);
+    if (result) result = add_const_to_group(values, "EM_M32R", EM_M32R);
+    if (result) result = add_const_to_group(values, "EM_MN10300", EM_MN10300);
+    if (result) result = add_const_to_group(values, "EM_MN10200", EM_MN10200);
+    if (result) result = add_const_to_group(values, "EM_PJ", EM_PJ);
+    if (result) result = add_const_to_group(values, "EM_OPENRISC", EM_OPENRISC);
+    if (result) result = add_const_to_group(values, "EM_ARC_A5", EM_ARC_A5);
+    if (result) result = add_const_to_group(values, "EM_XTENSA", EM_XTENSA);
+    if (result) result = add_const_to_group(values, "EM_AARCH64", EM_AARCH64);
+    if (result) result = add_const_to_group(values, "EM_TILEPRO", EM_TILEPRO);
+    if (result) result = add_const_to_group(values, "EM_MICROBLAZE", EM_MICROBLAZE);
+    if (result) result = add_const_to_group(values, "EM_TILEGX", EM_TILEGX);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "ElfHeaderMachine", values,
+                                            "Value inside the *e_machine* field of ELF headers.");
 
     /**
      * En-tête des programmes Elf
      */
 
-    /* Valeurs possibles pour p_type */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_NULL);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_LOAD);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_DYNAMIC);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_INTERP);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_NOTE);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_SHLIB);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_PHDR);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_TLS);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_NUM);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_LOOS);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_GNU_EH_FRAME);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_GNU_STACK);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_GNU_RELRO);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_LOSUNW);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_SUNWBSS);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_SUNWSTACK);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_HISUNW);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_HIOS);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_LOPROC);
-    if (result) result = PyDict_AddULongMacro(obj_type, PT_HIPROC);
-
-    /* Valeurs possibles pour p_flags */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, PF_X);
-    if (result) result = PyDict_AddULongMacro(obj_type, PF_W);
-    if (result) result = PyDict_AddULongMacro(obj_type, PF_R);
-    if (result) result = PyDict_AddULongMacro(obj_type, PF_MASKOS);
-    if (result) result = PyDict_AddULongMacro(obj_type, PF_MASKPROC);
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "PT_NULL", PT_NULL);
+    if (result) result = add_const_to_group(values, "PT_LOAD", PT_LOAD);
+    if (result) result = add_const_to_group(values, "PT_DYNAMIC", PT_DYNAMIC);
+    if (result) result = add_const_to_group(values, "PT_INTERP", PT_INTERP);
+    if (result) result = add_const_to_group(values, "PT_NOTE", PT_NOTE);
+    if (result) result = add_const_to_group(values, "PT_SHLIB", PT_SHLIB);
+    if (result) result = add_const_to_group(values, "PT_PHDR", PT_PHDR);
+    if (result) result = add_const_to_group(values, "PT_TLS", PT_TLS);
+    if (result) result = add_const_to_group(values, "PT_NUM", PT_NUM);
+    if (result) result = add_const_to_group(values, "PT_LOOS", PT_LOOS);
+    if (result) result = add_const_to_group(values, "PT_GNU_EH_FRAME", PT_GNU_EH_FRAME);
+    if (result) result = add_const_to_group(values, "PT_GNU_STACK", PT_GNU_STACK);
+    if (result) result = add_const_to_group(values, "PT_GNU_RELRO", PT_GNU_RELRO);
+    if (result) result = add_const_to_group(values, "PT_LOSUNW", PT_LOSUNW);
+    if (result) result = add_const_to_group(values, "PT_SUNWBSS", PT_SUNWBSS);
+    if (result) result = add_const_to_group(values, "PT_SUNWSTACK", PT_SUNWSTACK);
+    if (result) result = add_const_to_group(values, "PT_HISUNW", PT_HISUNW);
+    if (result) result = add_const_to_group(values, "PT_HIOS", PT_HIOS);
+    if (result) result = add_const_to_group(values, "PT_LOPROC", PT_LOPROC);
+    if (result) result = add_const_to_group(values, "PT_HIPROC", PT_HIPROC);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "ElfProgramHeaderType", values,
+                                            "Value inside the *p_type* field of ELF program headers.");
+
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "PF_X", PF_X);
+    if (result) result = add_const_to_group(values, "PF_W", PF_W);
+    if (result) result = add_const_to_group(values, "PF_R", PF_R);
+    if (result) result = add_const_to_group(values, "PF_MASKOS", PF_MASKOS);
+    if (result) result = add_const_to_group(values, "PF_MASKPROC", PF_MASKPROC);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "ElfProgramHeaderFlags", values,
+                                            "Value inside the *p_flags* field of ELF program headers.");
 
     /**
      * En-tête des sections Elf
      */
- 
-    /* Valeurs possibles pour sh_type */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_NULL);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_PROGBITS);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_SYMTAB);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_STRTAB);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_RELA);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_HASH);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_DYNAMIC);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_NOTE);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_NOBITS);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_REL);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_SHLIB);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_DYNSYM);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_INIT_ARRAY);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_FINI_ARRAY);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_PREINIT_ARRAY);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_GROUP);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_SYMTAB_SHNDX);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_NUM);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_LOOS);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_GNU_ATTRIBUTES);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_GNU_HASH);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_GNU_LIBLIST);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_CHECKSUM);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_LOSUNW);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_SUNW_move);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_SUNW_COMDAT);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_SUNW_syminfo);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_GNU_verdef);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_GNU_verneed);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_GNU_versym);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_HISUNW);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_HIOS);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_LOPROC);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_HIPROC);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_LOUSER);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHT_HIUSER);
-
-    /* Valeurs possibles pour sh_flags */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_WRITE);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_ALLOC);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_EXECINSTR);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_MERGE);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_STRINGS);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_INFO_LINK);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_LINK_ORDER);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_OS_NONCONFORMING);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_GROUP);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_TLS);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_MASKOS);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_MASKPROC);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_ORDERED);
-    if (result) result = PyDict_AddULongMacro(obj_type, SHF_EXCLUDE);
+
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "SHT_NULL", SHT_NULL);
+    if (result) result = add_const_to_group(values, "SHT_PROGBITS", SHT_PROGBITS);
+    if (result) result = add_const_to_group(values, "SHT_SYMTAB", SHT_SYMTAB);
+    if (result) result = add_const_to_group(values, "SHT_STRTAB", SHT_STRTAB);
+    if (result) result = add_const_to_group(values, "SHT_RELA", SHT_RELA);
+    if (result) result = add_const_to_group(values, "SHT_HASH", SHT_HASH);
+    if (result) result = add_const_to_group(values, "SHT_DYNAMIC", SHT_DYNAMIC);
+    if (result) result = add_const_to_group(values, "SHT_NOTE", SHT_NOTE);
+    if (result) result = add_const_to_group(values, "SHT_NOBITS", SHT_NOBITS);
+    if (result) result = add_const_to_group(values, "SHT_REL", SHT_REL);
+    if (result) result = add_const_to_group(values, "SHT_SHLIB", SHT_SHLIB);
+    if (result) result = add_const_to_group(values, "SHT_DYNSYM", SHT_DYNSYM);
+    if (result) result = add_const_to_group(values, "SHT_INIT_ARRAY", SHT_INIT_ARRAY);
+    if (result) result = add_const_to_group(values, "SHT_FINI_ARRAY", SHT_FINI_ARRAY);
+    if (result) result = add_const_to_group(values, "SHT_PREINIT_ARRAY", SHT_PREINIT_ARRAY);
+    if (result) result = add_const_to_group(values, "SHT_GROUP", SHT_GROUP);
+    if (result) result = add_const_to_group(values, "SHT_SYMTAB_SHNDX", SHT_SYMTAB_SHNDX);
+    if (result) result = add_const_to_group(values, "SHT_NUM", SHT_NUM);
+    if (result) result = add_const_to_group(values, "SHT_LOOS", SHT_LOOS);
+    if (result) result = add_const_to_group(values, "SHT_GNU_ATTRIBUTES", SHT_GNU_ATTRIBUTES);
+    if (result) result = add_const_to_group(values, "SHT_GNU_HASH", SHT_GNU_HASH);
+    if (result) result = add_const_to_group(values, "SHT_GNU_LIBLIST", SHT_GNU_LIBLIST);
+    if (result) result = add_const_to_group(values, "SHT_CHECKSUM", SHT_CHECKSUM);
+    if (result) result = add_const_to_group(values, "SHT_LOSUNW", SHT_LOSUNW);
+    if (result) result = add_const_to_group(values, "SHT_SUNW_move", SHT_SUNW_move);
+    if (result) result = add_const_to_group(values, "SHT_SUNW_COMDAT", SHT_SUNW_COMDAT);
+    if (result) result = add_const_to_group(values, "SHT_SUNW_syminfo", SHT_SUNW_syminfo);
+    if (result) result = add_const_to_group(values, "SHT_GNU_verdef", SHT_GNU_verdef);
+    if (result) result = add_const_to_group(values, "SHT_GNU_verneed", SHT_GNU_verneed);
+    if (result) result = add_const_to_group(values, "SHT_GNU_versym", SHT_GNU_versym);
+    if (result) result = add_const_to_group(values, "SHT_HISUNW", SHT_HISUNW);
+    if (result) result = add_const_to_group(values, "SHT_HIOS", SHT_HIOS);
+    if (result) result = add_const_to_group(values, "SHT_LOPROC", SHT_LOPROC);
+    if (result) result = add_const_to_group(values, "SHT_HIPROC", SHT_HIPROC);
+    if (result) result = add_const_to_group(values, "SHT_LOUSER", SHT_LOUSER);
+    if (result) result = add_const_to_group(values, "SHT_HIUSER", SHT_HIUSER);
+
+    result = attach_constants_group_to_type(type, true, "ElfSectionHeaderType", values,
+                                            "Value inside the *sh_type* field of ELF section headers.");
+
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "SHF_WRITE", SHF_WRITE);
+    if (result) result = add_const_to_group(values, "SHF_ALLOC", SHF_ALLOC);
+    if (result) result = add_const_to_group(values, "SHF_EXECINSTR", SHF_EXECINSTR);
+    if (result) result = add_const_to_group(values, "SHF_MERGE", SHF_MERGE);
+    if (result) result = add_const_to_group(values, "SHF_STRINGS", SHF_STRINGS);
+    if (result) result = add_const_to_group(values, "SHF_INFO_LINK", SHF_INFO_LINK);
+    if (result) result = add_const_to_group(values, "SHF_LINK_ORDER", SHF_LINK_ORDER);
+    if (result) result = add_const_to_group(values, "SHF_OS_NONCONFORMING", SHF_OS_NONCONFORMING);
+    if (result) result = add_const_to_group(values, "SHF_GROUP", SHF_GROUP);
+    if (result) result = add_const_to_group(values, "SHF_TLS", SHF_TLS);
+    if (result) result = add_const_to_group(values, "SHF_MASKOS", SHF_MASKOS);
+    if (result) result = add_const_to_group(values, "SHF_MASKPROC", SHF_MASKPROC);
+    if (result) result = add_const_to_group(values, "SHF_ORDERED", SHF_ORDERED);
+    if (result) result = add_const_to_group(values, "SHF_EXCLUDE", SHF_EXCLUDE);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "ElfSectionHeaderFlags", values,
+                                            "Value inside the *sh_flags* field of ELF section headers.");
 
     /**
      * Données pour le linker
      */
 
-    /* Valeurs possibles pour d_tag */
-
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_NULL);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_NEEDED);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_PLTRELSZ);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_PLTGOT);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_HASH);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_STRTAB);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_SYMTAB);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_RELA);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_RELASZ);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_RELAENT);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_STRSZ);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_SYMENT);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_INIT);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_FINI);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_SONAME);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_RPATH);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_SYMBOLIC);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_REL);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_RELSZ);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_RELENT);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_PLTREL);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_DEBUG);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_TEXTREL);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_JMPREL);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_BIND_NOW);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_INIT_ARRAY);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_FINI_ARRAY);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_INIT_ARRAYSZ);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_FINI_ARRAYSZ);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_RUNPATH);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_FLAGS);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_ENCODING);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_PREINIT_ARRAY);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_PREINIT_ARRAYSZ);
-    if (result) result = PyDict_AddULongMacro(obj_type, DT_NUM);
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "DT_NULL", DT_NULL);
+    if (result) result = add_const_to_group(values, "DT_NEEDED", DT_NEEDED);
+    if (result) result = add_const_to_group(values, "DT_PLTRELSZ", DT_PLTRELSZ);
+    if (result) result = add_const_to_group(values, "DT_PLTGOT", DT_PLTGOT);
+    if (result) result = add_const_to_group(values, "DT_HASH", DT_HASH);
+    if (result) result = add_const_to_group(values, "DT_STRTAB", DT_STRTAB);
+    if (result) result = add_const_to_group(values, "DT_SYMTAB", DT_SYMTAB);
+    if (result) result = add_const_to_group(values, "DT_RELA", DT_RELA);
+    if (result) result = add_const_to_group(values, "DT_RELASZ", DT_RELASZ);
+    if (result) result = add_const_to_group(values, "DT_RELAENT", DT_RELAENT);
+    if (result) result = add_const_to_group(values, "DT_STRSZ", DT_STRSZ);
+    if (result) result = add_const_to_group(values, "DT_SYMENT", DT_SYMENT);
+    if (result) result = add_const_to_group(values, "DT_INIT", DT_INIT);
+    if (result) result = add_const_to_group(values, "DT_FINI", DT_FINI);
+    if (result) result = add_const_to_group(values, "DT_SONAME", DT_SONAME);
+    if (result) result = add_const_to_group(values, "DT_RPATH", DT_RPATH);
+    if (result) result = add_const_to_group(values, "DT_SYMBOLIC", DT_SYMBOLIC);
+    if (result) result = add_const_to_group(values, "DT_REL", DT_REL);
+    if (result) result = add_const_to_group(values, "DT_RELSZ", DT_RELSZ);
+    if (result) result = add_const_to_group(values, "DT_RELENT", DT_RELENT);
+    if (result) result = add_const_to_group(values, "DT_PLTREL", DT_PLTREL);
+    if (result) result = add_const_to_group(values, "DT_DEBUG", DT_DEBUG);
+    if (result) result = add_const_to_group(values, "DT_TEXTREL", DT_TEXTREL);
+    if (result) result = add_const_to_group(values, "DT_JMPREL", DT_JMPREL);
+    if (result) result = add_const_to_group(values, "DT_BIND_NOW", DT_BIND_NOW);
+    if (result) result = add_const_to_group(values, "DT_INIT_ARRAY", DT_INIT_ARRAY);
+    if (result) result = add_const_to_group(values, "DT_FINI_ARRAY", DT_FINI_ARRAY);
+    if (result) result = add_const_to_group(values, "DT_INIT_ARRAYSZ", DT_INIT_ARRAYSZ);
+    if (result) result = add_const_to_group(values, "DT_FINI_ARRAYSZ", DT_FINI_ARRAYSZ);
+    if (result) result = add_const_to_group(values, "DT_RUNPATH", DT_RUNPATH);
+    if (result) result = add_const_to_group(values, "DT_FLAGS", DT_FLAGS);
+    if (result) result = add_const_to_group(values, "DT_ENCODING", DT_ENCODING);
+    if (result) result = add_const_to_group(values, "DT_PREINIT_ARRAY", DT_PREINIT_ARRAY);
+    if (result) result = add_const_to_group(values, "DT_PREINIT_ARRAYSZ", DT_PREINIT_ARRAYSZ);
+    if (result) result = add_const_to_group(values, "DT_NUM", DT_NUM);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
+
+    result = attach_constants_group_to_type(type, true, "ElfSectionHeaderFlags", values,
+                                            "Value for the *d_tag* field of ELF file dynamic section entries.");
 
     /**
      * Symboles de binaires Elf
      */
 
-    /* Valeurs pour le sous-champ ST_TYPE de st_info  */
+    values = PyDict_New();
+
+    if (result) result = add_const_to_group(values, "STT_NOTYPE", STT_NOTYPE);
+    if (result) result = add_const_to_group(values, "STT_OBJECT", STT_OBJECT);
+    if (result) result = add_const_to_group(values, "STT_FUNC", STT_FUNC);
+
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
 
-    if (result) result = PyDict_AddULongMacro(obj_type, STT_NOTYPE);
-    if (result) result = PyDict_AddULongMacro(obj_type, STT_OBJECT);
-    if (result) result = PyDict_AddULongMacro(obj_type, STT_FUNC);
+    result = attach_constants_group_to_type(type, true, "ElfSymbolInfo", values,
+                                            "Value inside the *st_info* field of ELF symbols.");
 
     /**
      * Informations de relocalisation
      */
 
-    /* Type de relocalisation (x86) */
+    values = PyDict_New();
 
-    if (result) result = PyDict_AddULongMacro(obj_type, R_386_NONE);
-    if (result) result = PyDict_AddULongMacro(obj_type, R_386_JMP_SLOT);
+    if (result) result = add_const_to_group(values, "R_386_NONE", R_386_NONE);
+    if (result) result = add_const_to_group(values, "R_386_JMP_SLOT", R_386_JMP_SLOT);
 
-    /* Type de relocalisation (ARM) */
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
 
-    if (result) result = PyDict_AddULongMacro(obj_type, R_ARM_JUMP_SLOT);
+    result = attach_constants_group_to_type(type, true, "ElfRelocation386", values,
+                                            "Type of relocation for i386 ELF files.");
 
-    return result;
+    values = PyDict_New();
 
-}
+    if (result) result = add_const_to_group(values, "R_ARM_JUMP_SLOT", R_ARM_JUMP_SLOT);
 
+    if (!result)
+    {
+        Py_DECREF(values);
+        goto exit;
+    }
 
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : obj_type = type dont le dictionnaire est à compléter.        *
-*                                                                             *
-*  Description : Définit les constantes pour le format Elf.                   *
-*                                                                             *
-*  Retour      : true en cas de succès de l'opération, false sinon.           *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-bool define_python_elf_format_constants(PyTypeObject *obj_type)
-{
-    bool result;                            /* Bilan à retourner           */
+    result = attach_constants_group_to_type(type, true, "ElfRelocationArm", values,
+                                            "Type of relocation for ARM ELF files.");
 
-    result = define_python_elf_format_common_constants(obj_type);
+ exit:
 
     return result;
 
-- 
cgit v0.11.2-87-g4458