Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save masatake/cf2201b4b07a0d3f2d9cee6e1315cff3 to your computer and use it in GitHub Desktop.

Select an option

Save masatake/cf2201b4b07a0d3f2d9cee6e1315cff3 to your computer and use it in GitHub Desktop.

Revisions

  1. masatake created this gist Oct 20, 2018.
    91 changes: 91 additions & 0 deletions objdump, limiting the output to a given label
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,91 @@
    diff --git a/binutils/objdump.c b/binutils/objdump.c
    index 9c3bce8b75..ce6bf7b920 100644
    --- a/binutils/objdump.c
    +++ b/binutils/objdump.c
    @@ -118,6 +118,7 @@ static const char *prefix; /* --prefix */
    static int prefix_strip; /* --prefix-strip */
    static size_t prefix_length;
    static bfd_boolean unwind_inlines; /* --inlines. */
    +static const char *label;

    /* A structure to record the sections mentioned in -j switches. */
    struct only
    @@ -145,6 +146,7 @@ struct objdump_disasm_info
    long dynrelcount;
    disassembler_ftype disassemble_fn;
    arelent * reloc;
    + const char * label;
    };

    /* Architecture to disassemble for, or default if NULL. */
    @@ -313,8 +315,8 @@ static struct option long_options[]=
    {"debugging", no_argument, NULL, 'g'},
    {"debugging-tags", no_argument, NULL, 'e'},
    {"demangle", optional_argument, NULL, 'C'},
    - {"disassemble", no_argument, NULL, 'd'},
    - {"disassemble-all", no_argument, NULL, 'D'},
    + {"disassemble", optional_argument, NULL, 'd'},
    + {"disassemble-all", optional_argument, NULL, 'D'},
    {"disassembler-options", required_argument, NULL, 'M'},
    {"disassemble-zeroes", no_argument, NULL, 'z'},
    {"dynamic-reloc", no_argument, NULL, 'R'},
    @@ -2253,6 +2255,7 @@ disassemble_section (bfd *abfd, asection *section, void *inf)
    asymbol *nextsym;
    bfd_vma nextstop_offset;
    bfd_boolean insns;
    + bfd_boolean do_print = FALSE;

    addr = section->vma + addr_offset;
    addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
    @@ -2278,7 +2281,12 @@ disassemble_section (bfd *abfd, asection *section, void *inf)
    pinfo->symtab_pos = -1;
    }

    - if (! prefix_addresses)
    + {
    + const char *l = (sym && paux->label)? bfd_asymbol_name (sym): NULL;
    + do_print = (paux->label == NULL || (l && streq(l, paux->label)));
    + }
    +
    + if (! prefix_addresses && do_print)
    {
    pinfo->fprintf_func (pinfo->stream, "\n");
    objdump_print_addr_with_sym (abfd, section, sym, addr,
    @@ -2339,9 +2347,10 @@ disassemble_section (bfd *abfd, asection *section, void *inf)
    else
    insns = FALSE;

    - disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
    - addr_offset, nextstop_offset,
    - rel_offset, &rel_pp, rel_ppend);
    + if (do_print)
    + disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
    + addr_offset, nextstop_offset,
    + rel_offset, &rel_pp, rel_ppend);

    addr_offset = nextstop_offset;
    sym = nextsym;
    @@ -2394,6 +2403,7 @@ disassemble_data (bfd *abfd)
    aux.dynrelbuf = NULL;
    aux.dynrelcount = 0;
    aux.reloc = NULL;
    + aux.label = label;

    disasm_info.print_address_func = objdump_print_address;
    disasm_info.symbol_at_address_func = objdump_symbol_at_address;
    @@ -3995,6 +4005,7 @@ main (int argc, char **argv)
    case 'd':
    disassemble = TRUE;
    seenflag = TRUE;
    + label = optarg;
    break;
    case 'z':
    disassemble_zeroes = TRUE;
    @@ -4003,6 +4014,7 @@ main (int argc, char **argv)
    disassemble = TRUE;
    disassemble_all = TRUE;
    seenflag = TRUE;
    + label = optarg;
    break;
    case 'S':
    disassemble = TRUE;