summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog17
-rw-r--r--src/format/elf/Makefile.am1
-rw-r--r--src/format/elf/elf.c2
-rw-r--r--src/format/elf/elf_def_arm.h45
-rw-r--r--src/format/elf/helper_arm.c28
-rw-r--r--src/format/elf/helper_arm.h3
-rw-r--r--src/format/elf/program.c34
-rw-r--r--src/format/elf/program.h2
8 files changed, 127 insertions, 5 deletions
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 *);