From 60e254b7012b370f1b55d572565f829379553a7e Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Fri, 7 Mar 2025 11:23:13 +0100 Subject: objdump: properly disassemble successive functions of the same name ... when only their symbol was requested for disassembly. Addressing the respective FIXME is as easy as coverting the "else" there to an if() with the opposite condition, thus accounting for the disabling the original if() may have effected. --- binutils/objdump.c | 6 ++---- binutils/testsuite/binutils-all/multi-1.d | 23 +++++++++++++++++++++++ binutils/testsuite/binutils-all/multi-2.d | 23 +++++++++++++++++++++++ binutils/testsuite/binutils-all/multi1.s | 6 ++++++ binutils/testsuite/binutils-all/multi2.s | 6 ++++++ binutils/testsuite/binutils-all/objdump.exp | 16 ++++++++++++++++ 6 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 binutils/testsuite/binutils-all/multi-1.d create mode 100644 binutils/testsuite/binutils-all/multi-2.d create mode 100644 binutils/testsuite/binutils-all/multi1.s create mode 100644 binutils/testsuite/binutils-all/multi2.s (limited to 'binutils') diff --git a/binutils/objdump.c b/binutils/objdump.c index e7b053c..8239746 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -3957,15 +3957,13 @@ disassemble_section (bfd *abfd, asection *section, void *inf) break; case next_sym: - /* FIXME: There is an implicit assumption here - that the name of sym is different from - paux->symbol. */ if (! bfd_is_local_label (abfd, sym)) do_print = false; break; } } - else + + if (!do_print) { const char * name = bfd_asymbol_name (sym); char * alloc = NULL; diff --git a/binutils/testsuite/binutils-all/multi-1.d b/binutils/testsuite/binutils-all/multi-1.d new file mode 100644 index 0000000..4cfdc61 --- /dev/null +++ b/binutils/testsuite/binutils-all/multi-1.d @@ -0,0 +1,23 @@ +#name: objdump --disassemble= of consecutive same-name functions (1) +#source: multi1.s +#source: multi2.s +#ld: -r +#objdump: --disassemble=func -wz +# ECOFF disassembly omits local symbols, for whatever reason. +#xfail: "alpha*-*-*ecoff" "alpha*-*-osf*" + +.*: +file format .* + +Disassembly of section .*: + +0+ : +[ ]*[0-9a-f]+: [0-9a-f][0-9a-f].* +#?[ ]*[0-9a-f]+: [0-9a-f][0-9a-f].* +#?[ ]*[0-9a-f]+: [0-9a-f][0-9a-f].* + +# HPPA 32-bit ELF "ld -r" leaves .text unmerged. +#?Disassembly of section .*: + +0+[0-3][0-9a-f] : +[ ]*[0-9a-f]+: [0-9a-f][0-9a-f].* +#pass diff --git a/binutils/testsuite/binutils-all/multi-2.d b/binutils/testsuite/binutils-all/multi-2.d new file mode 100644 index 0000000..791aa87 --- /dev/null +++ b/binutils/testsuite/binutils-all/multi-2.d @@ -0,0 +1,23 @@ +#name: objdump --disassemble= of consecutive same-name functions (2) +#source: multi2.s +#source: multi1.s +#ld: -r +#objdump: --disassemble=func2 -wz +# ECOFF disassembly omits local symbols, for whatever reason. +#xfail: "alpha*-*-*ecoff" "alpha*-*-osf*" + +.*: +file format .* + +Disassembly of section .*: + +0+ : +[ ]*[0-9a-f]+: [0-9a-f][0-9a-f].* +#?[ ]*[0-9a-f]+: [0-9a-f][0-9a-f].* +#?[ ]*[0-9a-f]+: [0-9a-f][0-9a-f].* + +# HPPA 32-bit ELF "ld -r" leaves .text unmerged. +#?Disassembly of section .*: + +0+[0-3][0-9a-f] : +[ ]*[0-9a-f]+: [0-9a-f][0-9a-f].* +#pass diff --git a/binutils/testsuite/binutils-all/multi1.s b/binutils/testsuite/binutils-all/multi1.s new file mode 100644 index 0000000..ee7a397 --- /dev/null +++ b/binutils/testsuite/binutils-all/multi1.s @@ -0,0 +1,6 @@ + .text +func: + .nop + +func2: + .nop diff --git a/binutils/testsuite/binutils-all/multi2.s b/binutils/testsuite/binutils-all/multi2.s new file mode 100644 index 0000000..34e52e8 --- /dev/null +++ b/binutils/testsuite/binutils-all/multi2.s @@ -0,0 +1,6 @@ + .text +func2: + .nop + +func: + .nop diff --git a/binutils/testsuite/binutils-all/objdump.exp b/binutils/testsuite/binutils-all/objdump.exp index e74b77b..aa7ddda 100644 --- a/binutils/testsuite/binutils-all/objdump.exp +++ b/binutils/testsuite/binutils-all/objdump.exp @@ -249,6 +249,22 @@ if { [ remote_file host exists $testarchive ] } then { test_objdump_d $testarchive bintest2.${obj} } +# AIX gas doesn't add local symbols to the symbol table. +# TI C30 and C54x ld emits various "address .. of tmpdir/dump section `...' is +# not within region `...'" errors, which look bogus for relocatable linking. +# alpha-vms doesn't support relocatable linking. +# i?86-msdos ld generates an executable despite being passed -r. +# Don't chance other than our own ld improperly handling -r. +if { ![istarget "*-*-aix*"] + && ![istarget "*c30-*-*"] + && ![istarget "*c54x-*-*"] + && ![istarget "alpha-*-*vms*"] + && ![istarget "i?86-*-msdos"] + && [file normalize "$LD"] == [file normalize "$objdir/../ld/ld-new"]} then { + run_dump_test multi-1 + run_dump_test multi-2 +} + # Test objdump --disassemble= proc test_objdump_d_sym { testfile dumpfile } { global OBJDUMP -- cgit v1.1