summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-01-15 09:56:05 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-01-15 09:56:05 (GMT)
commit56e060d11c238ac7c7b3ecf0eb0527bbaebd5b4b (patch)
tree22264b96c96b03aa9f99dc13231bdcfb1c667267
parent1aa9ba33144b37ae96859573699a80adde93e509 (diff)
Ensured that symbols always take priority over the disassembled code.
-rw-r--r--ChangeLog6
-rw-r--r--src/analysis/disass/area.c20
-rw-r--r--src/format/format.c2
3 files changed, 22 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 82d5060..3339d96 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
17-01-15 Cyrille Bagard <nocbos@gmail.com>
+ * src/analysis/disass/area.c:
+ * src/format/format.c:
+ Ensure that symbols always take priority over the disassembled code.
+
+17-01-15 Cyrille Bagard <nocbos@gmail.com>
+
* src/analysis/db/items/comment.c:
Match the perfect line index.
diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c
index 84103e0..7eacc29 100644
--- a/src/analysis/disass/area.c
+++ b/src/analysis/disass/area.c
@@ -314,6 +314,8 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction
const vmpa2t *addr; /* Début de la zone à traiter */
phys_t len; /* Taille de l'aire visée */
phys_t offset; /* Décallage de départ */
+ phys_t i; /* Boucle de parcours */
+ GArchInstruction *old; /* Instruction remplacée */
start = get_mrange_addr(&area->range);
@@ -333,8 +335,6 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction
{
assert(area->instructions[offset] == NULL || force);
-#ifndef NDEBUG
-
/**
* Un cas de remplacement forcé intervient en ARM, lorsque qu'une
* instruction utilise une valeur immédiate placée dans le code.
@@ -347,14 +347,22 @@ static bool mark_range_in_mem_area_as_processed(mem_area *area, GArchInstruction
* C'est par exemple le cas lors de l'utilisation d'appels système
* en assembleur, qui ne sont pas reconnus en tant qu'instructions
* cassant le flot d'exécution (typiquement : un exit()).
+ *
+ * On réinitialise donc la zone couverte par la nouvelle instruction.
*/
- if (area->instructions[offset] != NULL)
+ for (i = 0; force && i < len; i++)
{
- range = g_arch_instruction_get_range(area->instructions[offset]);
- assert(len == get_mrange_length(range));
+ old = area->instructions[offset + i];
+
+ if (old != NULL)
+ {
+ g_object_unref(G_OBJECT(old));
+ area->instructions[offset + 1] = NULL;
+ g_atomic_pointer_add(&area->count, -1);
+ }
+
}
-#endif
area->instructions[offset] = instr;
g_atomic_pointer_add(&area->count, 1);
diff --git a/src/format/format.c b/src/format/format.c
index be522cb..550e816 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -334,6 +334,8 @@ bool g_binary_format_add_symbol(GBinFormat *format, GBinSymbol *symbol)
format->symbols = _qinsert(format->symbols, &format->symbols_count,
sizeof(GBinSymbol *), &symbol, index);
+ result = true;
+
switch (g_binary_symbol_get_target_type(symbol))
{
case STP_ROUTINE: