diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-01-15 09:56:05 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-01-15 09:56:05 (GMT) |
commit | 56e060d11c238ac7c7b3ecf0eb0527bbaebd5b4b (patch) | |
tree | 22264b96c96b03aa9f99dc13231bdcfb1c667267 | |
parent | 1aa9ba33144b37ae96859573699a80adde93e509 (diff) |
Ensured that symbols always take priority over the disassembled code.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | src/analysis/disass/area.c | 20 | ||||
-rw-r--r-- | src/format/format.c | 2 |
3 files changed, 22 insertions, 6 deletions
@@ -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: |