]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
objdump: properly disassemble successive functions of the same name
authorJan Beulich <jbeulich@suse.com>
Fri, 7 Mar 2025 10:23:13 +0000 (11:23 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 7 Mar 2025 10:23:13 +0000 (11:23 +0100)
... 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
binutils/testsuite/binutils-all/multi-1.d [new file with mode: 0644]
binutils/testsuite/binutils-all/multi-2.d [new file with mode: 0644]
binutils/testsuite/binutils-all/multi1.s [new file with mode: 0644]
binutils/testsuite/binutils-all/multi2.s [new file with mode: 0644]
binutils/testsuite/binutils-all/objdump.exp

index e7b053c7bc6c68ed95a2a6d79889a462309651bc..82397463c694432d034ac30a8c9d9dd173b4bceb 100644 (file)
@@ -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 (file)
index 0000000..4cfdc61
--- /dev/null
@@ -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+ <func>:
+[      ]*[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] <func>:
+[      ]*[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 (file)
index 0000000..791aa87
--- /dev/null
@@ -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+ <func2>:
+[      ]*[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] <func2>:
+[      ]*[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 (file)
index 0000000..ee7a397
--- /dev/null
@@ -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 (file)
index 0000000..34e52e8
--- /dev/null
@@ -0,0 +1,6 @@
+       .text
+func2:
+       .nop
+
+func:
+       .nop
index e74b77be928bc6f2ef16743bb34301db76dfb1db..aa7ddda8700824594c5fee8852bbc77ca6bae39e 100644 (file)
@@ -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=<symbol>
 proc test_objdump_d_sym { testfile dumpfile } {
     global OBJDUMP