diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-03-22 17:58:36 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-03-22 17:58:36 (GMT) |
commit | cd956221a807e4c1961e17602d5ca641b93a937a (patch) | |
tree | 77c53ebad8404da4182fdba5b70e9f3ae8e05fbd /src/arch | |
parent | 88e34a085a69d23da262a92641a80f409931ea82 (diff) |
Ensured all string symbols referenced by instructions get a label.
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/target.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/arch/target.c b/src/arch/target.c index 63ae295..3632b76 100644 --- a/src/arch/target.c +++ b/src/arch/target.c @@ -24,6 +24,7 @@ #include "target.h" +#include <assert.h> #include <inttypes.h> #include <malloc.h> #include <stdarg.h> @@ -305,12 +306,54 @@ void g_target_operand_get_addr(const GTargetOperand *operand, vmpa2t *addr) bool g_target_operand_resolve(GTargetOperand *operand, GBinFormat *format, bool strict) { bool result; /* Bilan à retourner */ + GBinSymbol *symbol; /* Facilités d'accès au symbole*/ + SymbolType stype; /* Type de symbole trouvé */ + const mrange_t *range; /* Couverture du symbole */ + char *label; /* Désignation de la chaîne */ if (operand->symbol != NULL) g_object_unref(G_OBJECT(operand->symbol)); result = g_binary_format_resolve_symbol(format, &operand->addr, strict, &operand->symbol, &operand->diff); + /** + * Si plusieurs chaînes se suivent, la seconde et les suivantes bénéficient + * d'une étiquette si et seulement si elles sont détachées des précédentes + * par un octet nul. + * + * S'il y a juste un retour à la ligne ("\n"), alors aucune séparation n'est + * considérée, et le bloc de chaînes est uniforme. + * + * Aussi, si une référence renvoie vers une ligne de ce bloc, alors on + * attribue à cette ligne une étiquette propre. + */ + + if (result && operand->diff == 0) + { + symbol = operand->symbol; + + stype = g_binary_symbol_get_target_type(symbol); + + if (stype == STP_STRING || stype == STP_RO_STRING) + { + if (g_binary_symbol_get_label(symbol) == NULL) + { + range = g_binary_symbol_get_range(symbol); + + assert(cmp_vmpa(&operand->addr, get_mrange_addr(range)) == 0); + + label = create_string_label(format, get_mrange_addr(range), get_mrange_length(range)); + + g_binary_symbol_set_alt_label(symbol, label); + + free(label); + + } + + } + + } + return result; } |