From e4b56188b664e6b986733d456e6a0ea9b2da6d53 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 16 Dec 2015 20:45:47 +0100
Subject: Dealt with empty ranges in the early states of disassembled symbols.

---
 ChangeLog                   |  8 ++++++++
 src/arch/vmpa.c             | 18 +++++++++++++++++-
 src/format/elf/helper_arm.c | 16 ++++------------
 3 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index f116419..4ba3351 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 15-12-16  Cyrille Bagard <nocbos@gmail.com>
 
+	* src/arch/vmpa.c:
+	Deal with empty ranges in the early states of disassembled symbols.
+
+	* src/format/elf/helper_arm.c:
+	Do optimization by delaying the process of sorting added symbols.
+
+15-12-16  Cyrille Bagard <nocbos@gmail.com>
+
 	* src/analysis/disass/area.c:
 	Update code.
 
diff --git a/src/arch/vmpa.c b/src/arch/vmpa.c
index 4c2b4cf..a289a28 100644
--- a/src/arch/vmpa.c
+++ b/src/arch/vmpa.c
@@ -812,8 +812,24 @@ int cmp_mrange_with_vmpa(const mrange_t *a, const vmpa2t *b)
     {
         diff = compute_vmpa_diff(&a->addr, b);
 
-        if (diff < a->length)
+        /**
+         * On prend en compte le cas très particulier des couvertures vides.
+         *
+         * C'est typiquement le cas avec les espaces de symboles pendant la
+         * phase de désassemblage, après laquelle ces espaces deviennent bornés.
+         *
+         */
+
+        if (diff == 0 && a->length == 0)
             result = 0;
+
+        /**
+         * Sinon on regarde simplement si l'adresse est contenue.
+         */
+
+        else if (diff < a->length)
+            result = 0;
+
         else
             result = 1;
 
diff --git a/src/format/elf/helper_arm.c b/src/format/elf/helper_arm.c
index f47df5d..f966296 100644
--- a/src/format/elf/helper_arm.c
+++ b/src/format/elf/helper_arm.c
@@ -118,30 +118,22 @@ bool load_elf_arm_relocated_symbols(GElfFormat *format, const elf_shdr *relxxx,
 
                 symbol = g_binary_symbol_new(STP_ROUTINE);
                 g_binary_symbol_attach_routine(symbol, routine);
-                g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol);
 
                 /* Comptabilisation pour le désassemblage brut */
                 g_binary_format_register_code_point(G_BIN_FORMAT(format), virt, false);
 
-
-                /*
-                printf("got a jump ! >> %d - %s\n", index, name);
-                printf("  -->> val = 0x%08lx\n", ELF_SYM(format, sym, st_value));
-                printf("  -->> 0x%08lx  =>> 0x%08lx\n", (unsigned int)ELF_REL(format, reloc, r_offset),
-                       ((unsigned int)ELF_SHDR(format, (*relxxx), sh_addr) + ELF_REL(format, reloc, r_offset)));
-                */
-
-                //symbol = g_binary_symbol_new(STP_FUNCTION));
-                //g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol);
-
                 break;
 
             default:
                 printf("Relocation not supported (%lld) !\n", ELF_REL_TYPE(format, reloc));
+                symbol = NULL;
                 break;
 
         }
 
+        if (symbol != NULL)
+            _g_binary_format_add_symbol(G_BIN_FORMAT(format), symbol, false);
+
     }
 
     return result;
-- 
cgit v0.11.2-87-g4458