From 643d8886dbc8e04de7a3bab1207c6997ea2549d7 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Fri, 18 Aug 2017 00:41:36 +0200
Subject: Resolved some extra program header types specific to ARM.

---
 ChangeLog                    | 17 +++++++++++++++++
 src/format/elf/Makefile.am   |  1 +
 src/format/elf/elf.c         |  2 +-
 src/format/elf/elf_def_arm.h | 45 ++++++++++++++++++++++++++++++++++++++++++++
 src/format/elf/helper_arm.c  | 28 +++++++++++++++++++++++++++
 src/format/elf/helper_arm.h  |  3 +++
 src/format/elf/program.c     | 34 ++++++++++++++++++++++++++++++---
 src/format/elf/program.h     |  2 +-
 8 files changed, 127 insertions(+), 5 deletions(-)
 create mode 100644 src/format/elf/elf_def_arm.h

diff --git a/ChangeLog b/ChangeLog
index 30d4c4d..a64d9b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
 17-08-18  Cyrille Bagard <nocbos@gmail.com>
 
+	* src/format/elf/Makefile.am:
+	Add the 'elf_def_arm.h' file to libformatelf_la_SOURCES.
+
+	* src/format/elf/elf.c:
+	Update code.
+
+	* src/format/elf/elf_def_arm.h:
+	New entry: define extra constant values for ARM.
+
+	* src/format/elf/helper_arm.c:
+	* src/format/elf/helper_arm.h:
+	* src/format/elf/program.c:
+	* src/format/elf/program.h:
+	Resolve some extra program header types specific to ARM.
+
+17-08-18  Cyrille Bagard <nocbos@gmail.com>
+
 	* src/format/executable.c:
 	Skip all empty binary portions as they are useless.
 
diff --git a/src/format/elf/Makefile.am b/src/format/elf/Makefile.am
index 78dabcd..53139d4 100644
--- a/src/format/elf/Makefile.am
+++ b/src/format/elf/Makefile.am
@@ -5,6 +5,7 @@ libformatelf_la_SOURCES =				\
 	elf-int.h elf-int.c					\
 	elf.h elf.c							\
 	elf_def.h							\
+	elf_def_arm.h						\
 	dynamic.h dynamic.c					\
 	helper_arm.h helper_arm.c			\
 	helper_x86.h helper_x86.c			\
diff --git a/src/format/elf/elf.c b/src/format/elf/elf.c
index 2ca3b8c..acdd01f 100644
--- a/src/format/elf/elf.c
+++ b/src/format/elf/elf.c
@@ -527,7 +527,7 @@ static void g_elf_format_refine_portions(GElfFormat *format)
 
         snprintf(desc, MAX_PORTION_DESC, "%s \"%s\"",
                  _("Segment"),
-                 get_elf_program_type_desc(ELF_PHDR(format, phdr, p_type)));
+                 get_elf_program_type_desc(format, ELF_PHDR(format, phdr, p_type)));
 
         g_binary_portion_set_desc(new, desc);
 
diff --git a/src/format/elf/elf_def_arm.h b/src/format/elf/elf_def_arm.h
new file mode 100644
index 0000000..5b0191e
--- /dev/null
+++ b/src/format/elf/elf_def_arm.h
@@ -0,0 +1,45 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * elf_def_arm.h - liste des structures et constantes utilisées par le format ELF et dédiées à ARM
+ *
+ * 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 Foobar.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _FORMAT_ELF_ELF_DEF_ARM_H
+#define _FORMAT_ELF_ELF_DEF_ARM_H
+
+
+#include "elf_def.h"
+
+
+
+/* Valeurs spécifiques pour le champ p_type des en-tête de programme */
+
+#define PT_ARM_EXIDX (PT_LOPROC + 1)        /* ARM unwind segment          */
+
+
+/* Valeurs spécifiques pour le champ sh_type des en-têtes de section */
+
+#define SHT_ARM_EXIDX      (SHT_LOPROC + 1) /* ARM unwind section          */
+#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) /* Preemption details          */
+#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) /* ARM attributes section      */
+
+
+
+#endif  /* _FORMAT_ELF_ELF_DEF_ARM_H */
diff --git a/src/format/elf/helper_arm.c b/src/format/elf/helper_arm.c
index 734a2bb..5b510b9 100644
--- a/src/format/elf/helper_arm.c
+++ b/src/format/elf/helper_arm.c
@@ -24,15 +24,43 @@
 #include "helper_arm.h"
 
 
+#include "elf_def_arm.h"
 #include "elf-int.h"
 #include "symbols.h"
 #include "../mangling/demangler.h"
 
 
 
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : p_type = type associé à un en-tête de programme.             *
+*                                                                             *
+*  Description : Fournit la description humaine d'un type de segment ELF.     *
+*                                                                             *
+*  Retour      : Désignation prête à emploi ou NULL si aucune.                *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
 
+const char *get_elf_program_arm_type_desc(uint32_t p_type)
+{
+    const char *result;                     /* Description à renvoyer      */
+
+#define MAKE_STRING_FROM_PT(pt) case pt: result = #pt; break;
+
+    switch(p_type)
+    {
+        MAKE_STRING_FROM_PT(PT_ARM_EXIDX);
 
+        default:
+            result = NULL;
+            break;
+    }
+
+    return result;
 
+}
 
 
 /******************************************************************************
diff --git a/src/format/elf/helper_arm.h b/src/format/elf/helper_arm.h
index 09c159b..e971ed6 100644
--- a/src/format/elf/helper_arm.h
+++ b/src/format/elf/helper_arm.h
@@ -29,6 +29,9 @@
 
 
 
+/* Fournit la description humaine d'un type de segment ELF. */
+const char *get_elf_program_arm_type_desc(uint32_t);
+
 /* Charge en mémoire la liste des symboles relogés. */
 bool load_elf_arm_relocated_symbols(GElfFormat *, const elf_shdr *, const elf_shdr *, const elf_shdr *);
 
diff --git a/src/format/elf/program.c b/src/format/elf/program.c
index f14dac2..3016feb 100644
--- a/src/format/elf/program.c
+++ b/src/format/elf/program.c
@@ -25,12 +25,14 @@
 
 
 #include "elf-int.h"
+#include "helper_arm.h"
 
 
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : p_type = type associé à un en-tête de programme.             *
+*  Paramètres  : format = description de l'exécutable à consulter.            *
+*                p_type = type associé à un en-tête de programme.             *
 *                                                                             *
 *  Description : Fournit la description humaine d'un type de segment ELF.     *
 *                                                                             *
@@ -40,7 +42,7 @@
 *                                                                             *
 ******************************************************************************/
 
-const char *get_elf_program_type_desc(uint32_t p_type)
+const char *get_elf_program_type_desc(const GElfFormat *format, uint32_t p_type)
 {
     const char *result;                     /* Description à renvoyer      */
 
@@ -68,10 +70,36 @@ const char *get_elf_program_type_desc(uint32_t p_type)
         MAKE_STRING_FROM_PT(PT_HIPROC);
 
         default:
-            result = "PT_???";
+            result = NULL;
             break;
+
     }
 
+    if (result == NULL)
+        switch (ELF_HDR(format, format->header, e_machine))
+        {
+            case EM_ARM:
+                result = get_elf_program_arm_type_desc(p_type);
+                break;
+
+            default:
+                break;
+
+        }
+
+    if (result == NULL)
+        switch(p_type)
+        {
+            MAKE_STRING_FROM_PT(PT_LOOS);
+            MAKE_STRING_FROM_PT(PT_HIOS);
+            MAKE_STRING_FROM_PT(PT_LOPROC);
+            MAKE_STRING_FROM_PT(PT_HIPROC);
+
+            default:
+                result = "PT_???";
+                break;
+        }
+
     return result;
 
 }
diff --git a/src/format/elf/program.h b/src/format/elf/program.h
index 0b727aa..bf05d2a 100644
--- a/src/format/elf/program.h
+++ b/src/format/elf/program.h
@@ -31,7 +31,7 @@
 
 
 /* Fournit la description humaine d'un type de segment ELF. */
-const char *get_elf_program_type_desc(uint32_t);
+const char *get_elf_program_type_desc(const GElfFormat *, uint32_t);
 
 /* Recherche un programme donné au sein de binaire par indice. */
 bool find_elf_program_by_index(const GElfFormat *, uint16_t, elf_phdr *);
-- 
cgit v0.11.2-87-g4458