summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-03-22 17:58:36 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-03-22 17:58:36 (GMT)
commitcd956221a807e4c1961e17602d5ca641b93a937a (patch)
tree77c53ebad8404da4182fdba5b70e9f3ae8e05fbd /src/arch
parent88e34a085a69d23da262a92641a80f409931ea82 (diff)
Ensured all string symbols referenced by instructions get a label.
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/target.c43
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;
}