summaryrefslogtreecommitdiff
path: root/plugins/readelf/strtab.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/readelf/strtab.c')
-rw-r--r--plugins/readelf/strtab.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/plugins/readelf/strtab.c b/plugins/readelf/strtab.c
index f8ab2c7..1564674 100644
--- a/plugins/readelf/strtab.c
+++ b/plugins/readelf/strtab.c
@@ -59,9 +59,11 @@ static void parse_elf_string_table(GElfFormat *format, GPreloadInfo *info, const
vmpa2t pos; /* Tête de lecture */
const bin_t *data; /* Donnés à parcourir */
bool cut; /* Séparation nette ? */
+ GBinFormat *base; /* Autre version du format */
phys_t i; /* Boucle de parcours */
phys_t end; /* Position de fin de chaîne */
GArchInstruction *instr; /* Instruction décodée */
+ const mrange_t *irange; /* Espace occupé par une chaîne*/
GBinSymbol *symbol; /* Symbole à intégrer */
char *label; /* Désignation de la chaîne */
@@ -76,12 +78,12 @@ static void parse_elf_string_table(GElfFormat *format, GPreloadInfo *info, const
*/
if (data == NULL) return;
- cut = true;
-
/* Boucle de parcours */
cut = true;
+ base = G_BIN_FORMAT(format);
+
for (i = 0; i < length; i++)
if (isprint(data[i]))
{
@@ -103,8 +105,10 @@ static void parse_elf_string_table(GElfFormat *format, GPreloadInfo *info, const
g_preload_info_add_instruction(info, instr);
- g_object_ref(G_OBJECT(instr));
- ADD_STR_AS_SYM(format, symbol, instr);
+ irange = g_arch_instruction_get_range(instr);
+
+ symbol = g_binary_symbol_new(irange, STP_RO_STRING);
+ g_binary_format_add_symbol(base, symbol);
/* Jointure avec la chaîne précédente ? */
@@ -113,7 +117,7 @@ static void parse_elf_string_table(GElfFormat *format, GPreloadInfo *info, const
copy_vmpa(&pos, get_mrange_addr(range));
advance_vmpa(&pos, i);
- label = create_string_label(G_BIN_FORMAT(format), &pos, end - i);
+ label = create_string_label(base, get_mrange_addr(irange), end - i);
g_binary_symbol_set_alt_label(symbol, label);