diff options
Diffstat (limited to 'plugins/readelf')
| -rw-r--r-- | plugins/readelf/strtab.c | 29 | 
1 files changed, 17 insertions, 12 deletions
| diff --git a/plugins/readelf/strtab.c b/plugins/readelf/strtab.c index 1564674..7cdb4c9 100644 --- a/plugins/readelf/strtab.c +++ b/plugins/readelf/strtab.c @@ -63,6 +63,7 @@ static void parse_elf_string_table(GElfFormat *format, GPreloadInfo *info, const      phys_t i;                               /* Boucle de parcours          */      phys_t end;                             /* Position de fin de chaîne   */      GArchInstruction *instr;                /* Instruction décodée         */ +    bool inserted;                          /* Bilan d'une insertion       */      const mrange_t *irange;                 /* Espace occupé par une chaîne*/      GBinSymbol *symbol;                     /* Symbole à intégrer          */      char *label;                            /* Désignation de la chaîne    */ @@ -103,25 +104,29 @@ static void parse_elf_string_table(GElfFormat *format, GPreloadInfo *info, const              g_raw_instruction_mark_as_string(G_RAW_INSTRUCTION(instr), true); -            g_preload_info_add_instruction(info, instr); +            inserted = g_preload_info_add_instruction(info, instr); -            irange = g_arch_instruction_get_range(instr); +            if (inserted) +            { +                irange = g_arch_instruction_get_range(instr); -            symbol = g_binary_symbol_new(irange, STP_RO_STRING); -            g_binary_format_add_symbol(base, symbol); +                symbol = g_binary_symbol_new(irange, STP_RO_STRING); +                g_binary_format_add_symbol(base, symbol); -            /* Jointure avec la chaîne précédente ? */ +                /* Jointure avec la chaîne précédente ? */ -            if (cut) -            { -                copy_vmpa(&pos, get_mrange_addr(range)); -                advance_vmpa(&pos, i); +                if (cut) +                { +                    copy_vmpa(&pos, get_mrange_addr(range)); +                    advance_vmpa(&pos, i); + +                    label = create_string_label(base, get_mrange_addr(irange), end - i); -                label = create_string_label(base, get_mrange_addr(irange), end - i); +                    g_binary_symbol_set_alt_label(symbol, label); -                g_binary_symbol_set_alt_label(symbol, label); +                    free(label); -                free(label); +                }              } | 
