]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
BFD: Correct archive format determination for non-default link emulations
authorAlan Modra <amodra@gmail.com>
Fri, 20 Feb 2026 17:29:50 +0000 (17:29 +0000)
committerMaciej W. Rozycki <macro@redhat.com>
Fri, 20 Feb 2026 17:29:50 +0000 (17:29 +0000)
Fix an issue with archive format determination coming from commit
b228303dd14e ("PR binutils/13278: --plugin doesn't work on archive"),
<https://inbox.sourceware.org/binutils/20111011064345.GM25970@bubble.grove.modra.org/>,
causing the default link emulation to be used despite archive members
being in another object format and consequently triggering segmentation
faults in `cris-aout' LD with the default (`crisaout') emulation where
archive members are in the ELF format.

Address the issue by always checking the format of the first member of
an archive even if no default target has been specified, except when the
target being checked against is be the plugin target.  Verified by hand
and the `powerpc64le-linux-gnu' target to cause no issue with the recipe
in PR binutils/13278 and removing failures from segmentation faults with
the new tests:

cris-aout  -FAIL: CRIS regular archive link (implicit emulation)
cris-aout  -FAIL: CRIS thin archive link (implicit emulation)

Co-Authored-By: Maciej W. Rozycki <macro@redhat.com>
bfd/archive.c
ld/testsuite/ld-cris/archive.exp

index 40b49dcb294c782314f53f64e1a312ee5ae956cb..fc1f1ac5685a47f248ff1c2df161fad4169586c1 100644 (file)
@@ -921,7 +921,8 @@ bfd_generic_archive_p (bfd *abfd)
       return NULL;
     }
 
-  if (abfd->target_defaulted && bfd_has_map (abfd))
+  if ((abfd->target_defaulted || abfd->is_linker_input)
+      && bfd_has_map (abfd))
     {
       bfd *first;
       unsigned int save;
@@ -944,6 +945,8 @@ bfd_generic_archive_p (bfd *abfd)
       if (first != NULL)
        {
          first->target_defaulted = false;
+         if (abfd->is_linker_input)
+           first->plugin_format = bfd_plugin_no;
          if (!bfd_check_format (first, bfd_object)
              || first->xvec != abfd->xvec)
            bfd_set_error (bfd_error_wrong_object_format);
index b5eb28bd56a0d5300422f3626c1c29132443c686..12768e804587cf2e540882996f215fec33bd1fa3 100644 (file)
@@ -82,6 +82,14 @@ run_ld_link_tests [list \
         {nm "" ../ld-archive/nx.nd}} \
        "abcx" \
     ] \
+    [list "CRIS regular archive link (implicit emulation)" \
+       "-e ff" "tmpdir/ab.a --verbose --print-map" \
+       "$asemul" {../ld-archive/abc.s} \
+       {{ld ../ld-archive/abc.vd} \
+        {nm "" ../ld-archive/abc.nd} \
+        {nm "" ../ld-archive/nx.nd}} \
+       "abci" \
+    ] \
 ]
 # PR binutils/33485 hits with the aout archive format and with this
 # test that format is used with non-aout targets, hence the reverse
@@ -99,3 +107,19 @@ run_ld_link_tests [list \
        "abtcx" \
     ] \
 ]
+# PR binutils/33485 hits with the aout archive format and with this
+# test that format is used with non-aout targets, hence the reverse
+# condition.  Cf. the note at the top.
+if { ![istarget cris-*-*aout*] } {
+    setup_xfail "binutils/33485" "*-*-*"
+}
+run_ld_link_tests [list \
+    [list "CRIS thin archive link (implicit emulation)" \
+       "-e ff" "tmpdir/abt.a --verbose --print-map" \
+       "$asemul" {../ld-archive/abc.s} \
+       {{ld ../ld-archive/abtc.vd} \
+        {nm "" ../ld-archive/abc.nd} \
+        {nm "" ../ld-archive/nx.nd}} \
+       "abtci" \
+    ] \
+]