aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2024-04-03 11:16:23 +0100
committerNick Clifton <nickc@redhat.com>2024-04-03 11:17:19 +0100
commit28b24770bb7b8dc0c79121bdaa64303d17693669 (patch)
treeb831c4f78c6c60574ca02fae5b3aaaae6b207582 /binutils
parentb1c4af2086db25da1acf546b28df5b6fe8198cd6 (diff)
downloadgdb-28b24770bb7b8dc0c79121bdaa64303d17693669.zip
gdb-28b24770bb7b8dc0c79121bdaa64303d17693669.tar.gz
gdb-28b24770bb7b8dc0c79121bdaa64303d17693669.tar.bz2
Extend objdump's --show-all-symbols option so that it also shows the extra symbols referenced by an instruction.
Diffstat (limited to 'binutils')
-rw-r--r--binutils/objdump.c63
1 files changed, 62 insertions, 1 deletions
diff --git a/binutils/objdump.c b/binutils/objdump.c
index 68da543..6396174 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -1652,6 +1652,42 @@ objdump_print_addr_with_sym (bfd *abfd, asection *sec, asymbol *sym,
(long int)(sec->filepos + (vma - sec->vma)));
}
+/* Displays all symbols in the sorted symbol table starting at PLACE
+ which match the address VMA. Assumes that show_all_symbols == true. */
+
+static void
+display_extra_syms (long place,
+ bfd_vma vma,
+ struct disassemble_info *inf)
+{
+ struct objdump_disasm_info *aux = (struct objdump_disasm_info *) inf->application_data;
+
+ if (place == 0)
+ return;
+
+ bool first = true;
+
+ for (; place < sorted_symcount; place++)
+ {
+ asymbol *sym = sorted_syms[place];
+
+ if (bfd_asymbol_value (sym) != vma)
+ break;
+
+ if (! inf->symbol_is_valid (sym, inf))
+ continue;
+
+ if (first && ! do_wide)
+ inf->fprintf_styled_func (inf->stream, dis_style_immediate, ",\n\t<");
+ else
+ inf->fprintf_styled_func (inf->stream, dis_style_immediate, ", <");
+
+ objdump_print_symname (aux->abfd, inf, sym);
+ inf->fprintf_styled_func (inf->stream, dis_style_immediate, ">");
+ first = false;
+ }
+}
+
/* Print an address (VMA), symbolically if possible.
If SKIP_ZEROES is TRUE, don't output leading zeroes. */
@@ -1663,6 +1699,7 @@ objdump_print_addr (bfd_vma vma,
struct objdump_disasm_info *aux;
asymbol *sym = NULL;
bool skip_find = false;
+ long place = 0;
aux = (struct objdump_disasm_info *) inf->application_data;
@@ -1696,10 +1733,34 @@ objdump_print_addr (bfd_vma vma,
}
if (!skip_find)
- sym = find_symbol_for_address (vma, inf, NULL);
+ sym = find_symbol_for_address (vma, inf, &place);
objdump_print_addr_with_sym (aux->abfd, inf->section, sym, vma, inf,
skip_zeroes);
+
+ /* If requested, display any extra symbols at this address. */
+ if (sym == NULL || ! show_all_symbols)
+ return;
+
+ if (place)
+ display_extra_syms (place + 1, vma, inf);
+
+ /* If we found an absolute symbol in the reloc (ie: "*ABS*+0x....")
+ and there is a valid symbol at the address contained in the absolute symbol
+ then display any extra symbols that match this address. This helps
+ particularly with relocations for PLT entries. */
+ if (startswith (sym->name, BFD_ABS_SECTION_NAME "+"))
+ {
+ bfd_vma addr = strtoul (sym->name + strlen (BFD_ABS_SECTION_NAME "+"), NULL, 0);
+
+ if (addr && addr != vma)
+ {
+ sym = find_symbol_for_address (addr, inf, &place);
+
+ if (sym)
+ display_extra_syms (place, addr, inf);
+ }
+ }
}
/* Print VMA to INFO. This function is passed to the disassembler