[binutils-gdb] bfd: avoid elf-attrs.c for ELF-attributes-free targets

Jan Beulich jbeulich@sourceware.org
Fri Mar 13 06:53:12 GMT 2026


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=32249500c73e611a23025d199fdd77c407ef68de

commit 32249500c73e611a23025d199fdd77c407ef68de
Author: Jan Beulich <jbeulich@suse.com>
Date:   Fri Mar 13 07:51:24 2026 +0100

    bfd: avoid elf-attrs.c for ELF-attributes-free targets
    
    It is wasteful to build this file when it's not actually used. Limit it
    to targets actually using ELF attributes and introduce a compiler define
    (paralleling OBJ_MAYBE_ELF, as having similar purpose) to guard internal
    function decls and to provide stubs for exported functions.

Diff:
---
 bfd/configure      | 140 +++++++++++++++++++++++++++++------------------------
 bfd/configure.ac   | 140 +++++++++++++++++++++++++++++------------------------
 bfd/elf-bfd.h      |  36 +++++++++++---
 bfd/elf.c          |   8 +++
 bfd/elflink.c      |   7 ++-
 bfd/elfxx-target.h |   5 ++
 6 files changed, 201 insertions(+), 135 deletions(-)

diff --git a/bfd/configure b/bfd/configure
index 0312b36e3c1..ccaf53b0914 100755
--- a/bfd/configure
+++ b/bfd/configure
@@ -15828,15 +15828,28 @@ selarchs="$f"
 # Target backend .o files.
 tb=
 
-elf="elf.lo elflink.lo elf-attrs.lo elf-strtab.lo elf-eh-frame.lo
-     elf-properties.lo elf-sframe.lo dwarf1.lo dwarf2.lo"
+elf="elf.lo elflink.lo elf-strtab.lo elf-eh-frame.lo elf-properties.lo
+     elf-sframe.lo dwarf1.lo dwarf2.lo"
 coffgen="coffgen.lo dwarf2.lo"
 coff="cofflink.lo $coffgen"
 ecoff="ecofflink.lo $coffgen"
 xcoff="xcofflink.lo $coffgen"
 
+elf32_aarch64="elf32-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf32.lo elf-attrs.lo"
+elf64_aarch64="elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo elf-attrs.lo"
+elf_arc="elf32-arc.lo elf32.lo elf-attrs.lo"
+elf_arm="elf32-arm.lo elf32.lo elf-attrs.lo elf-vxworks.lo"
+elf_csky="elf32-csky.lo elf32.lo elf-attrs.lo"
+elf32_mips="elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo elf-attrs.lo"
+elfn32_mips="elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo elf-attrs.lo"
+elf64_mips="elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo elf-attrs.lo"
+elf32_powerpc="elf32-ppc.lo elf-vxworks.lo elf32.lo elf-attrs.lo"
+elf64_powerpc="elf64-ppc.lo elf64-gen.lo elf64.lo elf-attrs.lo"
+elf32_riscv="elf32-riscv.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo elf-attrs.lo"
+elf64_riscv="elf64-riscv.lo elf64.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo elf-attrs.lo"
+elf_tic6x="elf32-tic6x.lo elf32.lo elf-attrs.lo"
 elfxx_x86="elfxx-x86.lo elf-ifunc.lo elf-solaris2.lo elf-vxworks.lo"
-elfxx_sparc="elfxx-sparc.lo elf-solaris2.lo elf-vxworks.lo $elf"
+elfxx_sparc="elfxx-sparc.lo elf-solaris2.lo elf-vxworks.lo elf-attrs.lo $elf"
 for vec in $selvecs
 do
     target_size=32
@@ -15844,10 +15857,10 @@ do
     # This list is alphabetized to make it easy to compare
     # with the two vector lists in targets.c.  For the same reason,
     # use one entry per line, even though this leads to long lines.
-    aarch64_elf32_be_vec)	 tb="$tb elf32-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
-    aarch64_elf32_le_vec)	 tb="$tb elf32-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
-    aarch64_elf64_be_vec)	   tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
-    aarch64_elf64_le_vec)	   tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+    aarch64_elf32_be_vec)	 tb="$tb $elf32_aarch64 $elf"; target_size=64 ;;
+    aarch64_elf32_le_vec)	 tb="$tb $elf32_aarch64 $elf"; target_size=64 ;;
+    aarch64_elf64_be_vec)	 tb="$tb $elf64_aarch64 $elf"; target_size=64 ;;
+    aarch64_elf64_le_vec)	 tb="$tb $elf64_aarch64 $elf"; target_size=64 ;;
     aarch64_mach_o_vec)		 tb="$tb mach-o-aarch64.lo"; target_size=64 ;;
     aarch64_pei_le_vec)		 tb="$tb pei-aarch64.lo pe-aarch64igen.lo $coff"; target_size=64 ;;
     aarch64_pe_le_vec)		 tb="$tb pe-aarch64.lo pe-aarch64igen.lo $coff"; target_size=64 ;;
@@ -15862,14 +15875,14 @@ do
     aout0_be_vec)		 tb="$tb aout0.lo aout32.lo" ;;
     aout64_vec)			 tb="$tb demo64.lo aout64.lo"; target_size=64 ;;
     aout_vec)			 tb="$tb host-aout.lo aout32.lo" ;;
-    arc_elf32_be_vec)		 tb="$tb elf32-arc.lo elf32.lo $elf" ;;
-    arc_elf32_le_vec)		 tb="$tb elf32-arc.lo elf32.lo $elf" ;;
-    arm_elf32_be_vec)		 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
-    arm_elf32_le_vec)		 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
-    arm_elf32_fdpic_be_vec)	 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
-    arm_elf32_fdpic_le_vec)	 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
-    arm_elf32_vxworks_be_vec)	 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
-    arm_elf32_vxworks_le_vec)	 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
+    arc_elf32_be_vec)		 tb="$tb $elf_arc $elf" ;;
+    arc_elf32_le_vec)		 tb="$tb $elf_arc $elf" ;;
+    arm_elf32_be_vec)		 tb="$tb $elf_arm $elf" ;;
+    arm_elf32_le_vec)		 tb="$tb $elf_arm $elf" ;;
+    arm_elf32_fdpic_be_vec)	 tb="$tb $elf_arm $elf" ;;
+    arm_elf32_fdpic_le_vec)	 tb="$tb $elf_arm $elf" ;;
+    arm_elf32_vxworks_be_vec)	 tb="$tb $elf_arm $elf" ;;
+    arm_elf32_vxworks_le_vec)	 tb="$tb $elf_arm $elf" ;;
     arm_pe_be_vec)		 tb="$tb pe-arm.lo peigen.lo $coff" ;;
     arm_pe_le_vec)		 tb="$tb pe-arm.lo peigen.lo $coff" ;;
     arm_pe_wince_be_vec)	 tb="$tb pe-arm-wince.lo pe-arm.lo peigen.lo $coff" ;;
@@ -15887,8 +15900,8 @@ do
     cris_elf32_vec)		 tb="$tb elf32-cris.lo elf32.lo $elf" ;;
     cris_elf32_us_vec)		 tb="$tb elf32-cris.lo elf32.lo $elf" ;;
     crx_elf32_vec)		 tb="$tb elf32-crx.lo elf32.lo $elf" ;;
-    csky_elf32_be_vec)		 tb="$tb elf32-csky.lo elf32.lo $elf" ;;
-    csky_elf32_le_vec)		 tb="$tb elf32-csky.lo elf32.lo $elf" ;;
+    csky_elf32_be_vec)		 tb="$tb $elf_csky $elf" ;;
+    csky_elf32_le_vec)		 tb="$tb $elf_csky $elf" ;;
     d10v_elf32_vec)		 tb="$tb elf32-d10v.lo elf32.lo $elf" ;;
     d30v_elf32_vec)		 tb="$tb elf32-d30v.lo elf32.lo $elf" ;;
     dlx_elf32_be_vec)		 tb="$tb elf32-dlx.lo elf32.lo $elf" ;;
@@ -15940,8 +15953,8 @@ do
     kvx_elf64_vec)		 tb="$tb elf64-kvx.lo elfxx-kvx.lo elf64.lo $elf $ipa"; target_size=64 ;;
     lm32_elf32_vec)		 tb="$tb elf32-lm32.lo elf32.lo $elf" ;;
     lm32_elf32_fdpic_vec)	 tb="$tb elf32-lm32.lo elf32.lo $elf" ;;
-    loongarch_elf32_vec)	 tb="$tb elf32-loongarch.lo elfxx-loongarch.lo elf32.lo elf-ifunc.lo $elf" ;;
-    loongarch_elf64_vec)	 tb="$tb elf64-loongarch.lo elf64.lo elfxx-loongarch.lo elf32.lo elf-ifunc.lo $elf"; target_size=64 ;;
+    loongarch_elf32_vec)	 tb="$tb elf32-loongarch.lo elfxx-loongarch.lo elf32.lo elf-ifunc.lo elf-attrs.lo $elf" ;;
+    loongarch_elf64_vec)	 tb="$tb elf64-loongarch.lo elf64.lo elfxx-loongarch.lo elf32.lo elf-ifunc.lo elf-attrs.lo $elf"; target_size=64 ;;
     loongarch64_pei_vec)	 tb="$tb pei-loongarch64.lo pe-loongarch64igen.lo $coff"; target_size=64 ;;
     m32c_elf32_vec)		 tb="$tb elf32-m32c.lo elf32.lo $elf" ;;
     m32r_elf32_vec)		 tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
@@ -15950,7 +15963,7 @@ do
     m32r_elf32_linux_le_vec)	 tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
     m68hc11_elf32_vec)		 tb="$tb elf32-m68hc11.lo elf32-m68hc1x.lo elf32.lo $elf" ;;
     m68hc12_elf32_vec)		 tb="$tb elf32-m68hc12.lo elf32-m68hc1x.lo elf32.lo $elf" ;;
-    m68k_elf32_vec)		 tb="$tb elf32-m68k.lo elf32.lo $elf" ;;
+    m68k_elf32_vec)		 tb="$tb elf32-m68k.lo elf32.lo elf-attrs.lo $elf" ;;
     s12z_elf32_vec)		 tb="$tb elf32-s12z.lo elf32.lo $elf" ;;
     mach_o_be_vec)		 tb="$tb mach-o.lo dwarf2.lo" ;;
     mach_o_le_vec)		 tb="$tb mach-o.lo dwarf2.lo" ;;
@@ -15969,34 +15982,34 @@ do
     mips_ecoff_be_vec)		 tb="$tb coff-mips.lo ecoff.lo $ecoff" ;;
     mips_ecoff_le_vec)		 tb="$tb coff-mips.lo ecoff.lo $ecoff" ;;
     mips_ecoff_bele_vec)	 tb="$tb coff-mips.lo ecoff.lo $ecoff" ;;
-    mips_elf32_be_vec)		 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_le_vec)		 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_n_be_vec)	 tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_n_le_vec)	 tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_ntrad_be_vec)	 tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_ntrad_le_vec)	 tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_ntradfbsd_be_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_ntradfbsd_le_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_trad_be_vec)	 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_trad_le_vec)	 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_tradfbsd_be_vec)  tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_tradfbsd_le_vec)  tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_vxworks_be_vec)	 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_vxworks_le_vec)	 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf64_be_vec)		 tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf64_le_vec)		 tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf64_trad_be_vec)	 tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf64_trad_le_vec)	 tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf64_tradfbsd_be_vec)  tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf64_tradfbsd_le_vec)  tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
+    mips_elf32_be_vec)		 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_le_vec)		 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_n_be_vec)	 tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_n_le_vec)	 tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_ntrad_be_vec)	 tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_ntrad_le_vec)	 tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_ntradfbsd_be_vec) tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_ntradfbsd_le_vec) tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_trad_be_vec)	 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_trad_le_vec)	 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_tradfbsd_be_vec)  tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_tradfbsd_le_vec)  tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_vxworks_be_vec)	 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_vxworks_le_vec)	 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf64_be_vec)		 tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf64_le_vec)		 tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf64_trad_be_vec)	 tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf64_trad_le_vec)	 tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf64_tradfbsd_be_vec)  tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf64_tradfbsd_le_vec)  tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
     mmix_elf64_vec)		 tb="$tb elf64-mmix.lo elf64.lo $elf" target_size=64 ;;
     mmix_mmo_vec)			 tb="$tb mmo.lo" target_size=64 ;;
     mn10200_elf32_vec)		 tb="$tb elf-m10200.lo elf32.lo $elf" ;;
     mn10300_elf32_vec)		 tb="$tb elf-m10300.lo elf32.lo $elf" ;;
     moxie_elf32_be_vec)		 tb="$tb elf32-moxie.lo elf32.lo $elf" ;;
     moxie_elf32_le_vec)		 tb="$tb elf32-moxie.lo elf32.lo $elf" ;;
-    msp430_elf32_vec)		 tb="$tb elf32-msp430.lo elf32.lo $elf" ;;
-    msp430_elf32_ti_vec)	 tb="$tb elf32-msp430.lo elf32.lo $elf" ;;
+    msp430_elf32_vec)		 tb="$tb elf32-msp430.lo elf32.lo elf-attrs.lo $elf" ;;
+    msp430_elf32_ti_vec)	 tb="$tb elf32-msp430.lo elf32.lo elf-attrs.lo $elf" ;;
     mt_elf32_vec)		 tb="$tb elf32-mt.lo elf32.lo $elf" ;;
     nds32_elf32_be_vec)		 tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
     nds32_elf32_le_vec)		 tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
@@ -16013,20 +16026,20 @@ do
     pj_elf32_vec)		 tb="$tb elf32-pj.lo elf32.lo $elf" ;;
     pj_elf32_le_vec)		 tb="$tb elf32-pj.lo elf32.lo $elf" ;;
     powerpc_boot_vec)		 tb="$tb ppcboot.lo" ;;
-    powerpc_elf32_vec)		 tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
-    powerpc_elf32_le_vec)	 tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
-    powerpc_elf32_fbsd_vec)	 tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
-    powerpc_elf32_vxworks_vec)	 tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
-    powerpc_elf64_vec)		 tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
-    powerpc_elf64_le_vec)	 tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
-    powerpc_elf64_fbsd_vec)	 tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
-    powerpc_elf64_fbsd_le_vec)	 tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
+    powerpc_elf32_vec)		 tb="$tb $elf32_powerpc $elf" ;;
+    powerpc_elf32_le_vec)	 tb="$tb $elf32_powerpc $elf" ;;
+    powerpc_elf32_fbsd_vec)	 tb="$tb $elf32_powerpc $elf" ;;
+    powerpc_elf32_vxworks_vec)	 tb="$tb $elf32_powerpc $elf" ;;
+    powerpc_elf64_vec)		 tb="$tb $elf64_powerpc $elf"; target_size=64 ;;
+    powerpc_elf64_le_vec)	 tb="$tb $elf64_powerpc $elf"; target_size=64 ;;
+    powerpc_elf64_fbsd_vec)	 tb="$tb $elf64_powerpc $elf"; target_size=64 ;;
+    powerpc_elf64_fbsd_le_vec)	 tb="$tb $elf64_powerpc $elf"; target_size=64 ;;
     powerpc_xcoff_vec)		 tb="$tb coff-rs6000.lo $xcoff" ;;
     pru_elf32_vec)		 tb="$tb elf32-pru.lo elf32.lo $elf" ;;
-    riscv_elf32_vec)		 tb="$tb elf32-riscv.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf" ;;
-    riscv_elf64_vec)		 tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
-    riscv_elf32_be_vec)		 tb="$tb elf32-riscv.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf" ;;
-    riscv_elf64_be_vec)		 tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
+    riscv_elf32_vec)		 tb="$tb $elf32_riscv $elf" ;;
+    riscv_elf64_vec)		 tb="$tb $elf64_riscv $elf"; target_size=64 ;;
+    riscv_elf32_be_vec)		 tb="$tb $elf32_riscv $elf" ;;
+    riscv_elf64_be_vec)		 tb="$tb $elf64_riscv $elf"; target_size=64 ;;
     riscv64_pei_vec)		 tb="$tb pei-riscv64.lo pe-riscv64igen.lo $coff"; target_size=64 ;;
     rl78_elf32_vec)		 tb="$tb elf32-rl78.lo elf32.lo $elf" ;;
     rs6000_xcoff64_vec)		 tb="$tb coff64-rs6000.lo aix5ppc-core.lo $xcoff"; target_size=64 ;;
@@ -16036,8 +16049,8 @@ do
     rx_elf32_be_ns_vec)		 tb="$tb elf32-rx.lo elf32.lo $elf" ;;
     rx_elf32_le_vec)		 tb="$tb elf32-rx.lo elf32.lo $elf" ;;
     rx_elf32_linux_le_vec)	 tb="$tb elf32-rx.lo elf32.lo $elf" ;;
-    s390_elf32_vec)		 tb="$tb elf32-s390.lo elf32.lo $elf" ;;
-    s390_elf64_vec)		 tb="$tb elf64-s390.lo elf64.lo $elf"; target_size=64 ;;
+    s390_elf32_vec)		 tb="$tb elf32-s390.lo elf32.lo elf-attrs.lo $elf" ;;
+    s390_elf64_vec)		 tb="$tb elf64-s390.lo elf64.lo elf-attrs.lo $elf"; target_size=64 ;;
     score_elf32_be_vec)		 tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;;
     score_elf32_le_vec)		 tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;;
     sh_coff_vec)		 tb="$tb coff-sh.lo $coff" ;;
@@ -16077,12 +16090,12 @@ do
     tic54x_coff1_beh_vec)	 tb="$tb coff-tic54x.lo $coffgen" ;;
     tic54x_coff2_vec)		 tb="$tb coff-tic54x.lo $coffgen" ;;
     tic54x_coff2_beh_vec)	 tb="$tb coff-tic54x.lo $coffgen" ;;
-    tic6x_elf32_be_vec)		 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
-    tic6x_elf32_le_vec)		 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
-    tic6x_elf32_c6000_be_vec)	 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
-    tic6x_elf32_c6000_le_vec)	 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
-    tic6x_elf32_linux_be_vec)	 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
-    tic6x_elf32_linux_le_vec)	 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
+    tic6x_elf32_be_vec)		 tb="$tb $elf_tic6x $elf" ;;
+    tic6x_elf32_le_vec)		 tb="$tb $elf_tic6x $elf" ;;
+    tic6x_elf32_c6000_be_vec)	 tb="$tb $elf_tic6x $elf" ;;
+    tic6x_elf32_c6000_le_vec)	 tb="$tb $elf_tic6x $elf" ;;
+    tic6x_elf32_linux_be_vec)	 tb="$tb $elf_tic6x $elf" ;;
+    tic6x_elf32_linux_le_vec)	 tb="$tb $elf_tic6x $elf" ;;
     tilegx_elf32_be_vec)	 tb="$tb elf32-tilegx.lo elfxx-tilegx.lo elf32.lo $elf" ; target_size=32 ;;
     tilegx_elf32_le_vec)	 tb="$tb elf32-tilegx.lo elfxx-tilegx.lo elf32.lo $elf" ; target_size=32 ;;
     tilegx_elf64_be_vec)	 tb="$tb elf64-tilegx.lo elfxx-tilegx.lo elf64.lo $elf" ; target_size=64 ;;
@@ -16178,7 +16191,7 @@ if test x${all_targets} = xtrue ; then
     esac
   done
   assocvecs=$f
-  TDEFINES="$TDEFINES -DOBJ_MAYBE_ELF"
+  TDEFINES="$TDEFINES -DOBJ_MAYBE_ELF -DOBJ_MAYBE_ELF_ATTRIBUTES"
 else	# all_targets is true
   # Only set these if they will be nonempty, for the clever echo.
   havevecs=
@@ -16193,6 +16206,7 @@ else	# all_targets is true
   for i in $bfd_backends ; do
     case "$i" in
     elf.*) TDEFINES="$TDEFINES -DOBJ_MAYBE_ELF" ;;
+    elf-attrs.*) TDEFINES="$TDEFINES -DOBJ_MAYBE_ELF_ATTRIBUTES" ;;
     esac
   done
 fi	# all_targets is true
diff --git a/bfd/configure.ac b/bfd/configure.ac
index f1477bca81b..877ba4a64f2 100644
--- a/bfd/configure.ac
+++ b/bfd/configure.ac
@@ -369,15 +369,28 @@ selarchs="$f"
 # Target backend .o files.
 tb=
 
-elf="elf.lo elflink.lo elf-attrs.lo elf-strtab.lo elf-eh-frame.lo
-     elf-properties.lo elf-sframe.lo dwarf1.lo dwarf2.lo"
+elf="elf.lo elflink.lo elf-strtab.lo elf-eh-frame.lo elf-properties.lo
+     elf-sframe.lo dwarf1.lo dwarf2.lo"
 coffgen="coffgen.lo dwarf2.lo"
 coff="cofflink.lo $coffgen"
 ecoff="ecofflink.lo $coffgen"
 xcoff="xcofflink.lo $coffgen"
 
+elf32_aarch64="elf32-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf32.lo elf-attrs.lo"
+elf64_aarch64="elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo elf-attrs.lo"
+elf_arc="elf32-arc.lo elf32.lo elf-attrs.lo"
+elf_arm="elf32-arm.lo elf32.lo elf-attrs.lo elf-vxworks.lo"
+elf_csky="elf32-csky.lo elf32.lo elf-attrs.lo"
+elf32_mips="elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo elf-attrs.lo"
+elfn32_mips="elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo elf-attrs.lo"
+elf64_mips="elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo elf-attrs.lo"
+elf32_powerpc="elf32-ppc.lo elf-vxworks.lo elf32.lo elf-attrs.lo"
+elf64_powerpc="elf64-ppc.lo elf64-gen.lo elf64.lo elf-attrs.lo"
+elf32_riscv="elf32-riscv.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo elf-attrs.lo"
+elf64_riscv="elf64-riscv.lo elf64.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo elf-attrs.lo"
+elf_tic6x="elf32-tic6x.lo elf32.lo elf-attrs.lo"
 elfxx_x86="elfxx-x86.lo elf-ifunc.lo elf-solaris2.lo elf-vxworks.lo"
-elfxx_sparc="elfxx-sparc.lo elf-solaris2.lo elf-vxworks.lo $elf"
+elfxx_sparc="elfxx-sparc.lo elf-solaris2.lo elf-vxworks.lo elf-attrs.lo $elf"
 for vec in $selvecs
 do
     target_size=32
@@ -385,10 +398,10 @@ do
     # This list is alphabetized to make it easy to compare
     # with the two vector lists in targets.c.  For the same reason,
     # use one entry per line, even though this leads to long lines.
-    aarch64_elf32_be_vec)	 tb="$tb elf32-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
-    aarch64_elf32_le_vec)	 tb="$tb elf32-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
-    aarch64_elf64_be_vec)	   tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
-    aarch64_elf64_le_vec)	   tb="$tb elf64-aarch64.lo elfxx-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+    aarch64_elf32_be_vec)	 tb="$tb $elf32_aarch64 $elf"; target_size=64 ;;
+    aarch64_elf32_le_vec)	 tb="$tb $elf32_aarch64 $elf"; target_size=64 ;;
+    aarch64_elf64_be_vec)	 tb="$tb $elf64_aarch64 $elf"; target_size=64 ;;
+    aarch64_elf64_le_vec)	 tb="$tb $elf64_aarch64 $elf"; target_size=64 ;;
     aarch64_mach_o_vec)		 tb="$tb mach-o-aarch64.lo"; target_size=64 ;;
     aarch64_pei_le_vec)		 tb="$tb pei-aarch64.lo pe-aarch64igen.lo $coff"; target_size=64 ;;
     aarch64_pe_le_vec)		 tb="$tb pe-aarch64.lo pe-aarch64igen.lo $coff"; target_size=64 ;;
@@ -403,14 +416,14 @@ do
     aout0_be_vec)		 tb="$tb aout0.lo aout32.lo" ;;
     aout64_vec)			 tb="$tb demo64.lo aout64.lo"; target_size=64 ;;
     aout_vec)			 tb="$tb host-aout.lo aout32.lo" ;;
-    arc_elf32_be_vec)		 tb="$tb elf32-arc.lo elf32.lo $elf" ;;
-    arc_elf32_le_vec)		 tb="$tb elf32-arc.lo elf32.lo $elf" ;;
-    arm_elf32_be_vec)		 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
-    arm_elf32_le_vec)		 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
-    arm_elf32_fdpic_be_vec)	 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
-    arm_elf32_fdpic_le_vec)	 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
-    arm_elf32_vxworks_be_vec)	 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
-    arm_elf32_vxworks_le_vec)	 tb="$tb elf32-arm.lo elf32.lo elf-vxworks.lo $elf" ;;
+    arc_elf32_be_vec)		 tb="$tb $elf_arc $elf" ;;
+    arc_elf32_le_vec)		 tb="$tb $elf_arc $elf" ;;
+    arm_elf32_be_vec)		 tb="$tb $elf_arm $elf" ;;
+    arm_elf32_le_vec)		 tb="$tb $elf_arm $elf" ;;
+    arm_elf32_fdpic_be_vec)	 tb="$tb $elf_arm $elf" ;;
+    arm_elf32_fdpic_le_vec)	 tb="$tb $elf_arm $elf" ;;
+    arm_elf32_vxworks_be_vec)	 tb="$tb $elf_arm $elf" ;;
+    arm_elf32_vxworks_le_vec)	 tb="$tb $elf_arm $elf" ;;
     arm_pe_be_vec)		 tb="$tb pe-arm.lo peigen.lo $coff" ;;
     arm_pe_le_vec)		 tb="$tb pe-arm.lo peigen.lo $coff" ;;
     arm_pe_wince_be_vec)	 tb="$tb pe-arm-wince.lo pe-arm.lo peigen.lo $coff" ;;
@@ -428,8 +441,8 @@ do
     cris_elf32_vec)		 tb="$tb elf32-cris.lo elf32.lo $elf" ;;
     cris_elf32_us_vec)		 tb="$tb elf32-cris.lo elf32.lo $elf" ;;
     crx_elf32_vec)		 tb="$tb elf32-crx.lo elf32.lo $elf" ;;
-    csky_elf32_be_vec)		 tb="$tb elf32-csky.lo elf32.lo $elf" ;;
-    csky_elf32_le_vec)		 tb="$tb elf32-csky.lo elf32.lo $elf" ;;
+    csky_elf32_be_vec)		 tb="$tb $elf_csky $elf" ;;
+    csky_elf32_le_vec)		 tb="$tb $elf_csky $elf" ;;
     d10v_elf32_vec)		 tb="$tb elf32-d10v.lo elf32.lo $elf" ;;
     d30v_elf32_vec)		 tb="$tb elf32-d30v.lo elf32.lo $elf" ;;
     dlx_elf32_be_vec)		 tb="$tb elf32-dlx.lo elf32.lo $elf" ;;
@@ -481,8 +494,8 @@ do
     kvx_elf64_vec)		 tb="$tb elf64-kvx.lo elfxx-kvx.lo elf64.lo $elf $ipa"; target_size=64 ;;
     lm32_elf32_vec)		 tb="$tb elf32-lm32.lo elf32.lo $elf" ;;
     lm32_elf32_fdpic_vec)	 tb="$tb elf32-lm32.lo elf32.lo $elf" ;;
-    loongarch_elf32_vec)	 tb="$tb elf32-loongarch.lo elfxx-loongarch.lo elf32.lo elf-ifunc.lo $elf" ;;
-    loongarch_elf64_vec)	 tb="$tb elf64-loongarch.lo elf64.lo elfxx-loongarch.lo elf32.lo elf-ifunc.lo $elf"; target_size=64 ;;
+    loongarch_elf32_vec)	 tb="$tb elf32-loongarch.lo elfxx-loongarch.lo elf32.lo elf-ifunc.lo elf-attrs.lo $elf" ;;
+    loongarch_elf64_vec)	 tb="$tb elf64-loongarch.lo elf64.lo elfxx-loongarch.lo elf32.lo elf-ifunc.lo elf-attrs.lo $elf"; target_size=64 ;;
     loongarch64_pei_vec)	 tb="$tb pei-loongarch64.lo pe-loongarch64igen.lo $coff"; target_size=64 ;;
     m32c_elf32_vec)		 tb="$tb elf32-m32c.lo elf32.lo $elf" ;;
     m32r_elf32_vec)		 tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
@@ -491,7 +504,7 @@ do
     m32r_elf32_linux_le_vec)	 tb="$tb elf32-m32r.lo elf32.lo $elf" ;;
     m68hc11_elf32_vec)		 tb="$tb elf32-m68hc11.lo elf32-m68hc1x.lo elf32.lo $elf" ;;
     m68hc12_elf32_vec)		 tb="$tb elf32-m68hc12.lo elf32-m68hc1x.lo elf32.lo $elf" ;;
-    m68k_elf32_vec)		 tb="$tb elf32-m68k.lo elf32.lo $elf" ;;
+    m68k_elf32_vec)		 tb="$tb elf32-m68k.lo elf32.lo elf-attrs.lo $elf" ;;
     s12z_elf32_vec)		 tb="$tb elf32-s12z.lo elf32.lo $elf" ;;
     mach_o_be_vec)		 tb="$tb mach-o.lo dwarf2.lo" ;;
     mach_o_le_vec)		 tb="$tb mach-o.lo dwarf2.lo" ;;
@@ -510,34 +523,34 @@ do
     mips_ecoff_be_vec)		 tb="$tb coff-mips.lo ecoff.lo $ecoff" ;;
     mips_ecoff_le_vec)		 tb="$tb coff-mips.lo ecoff.lo $ecoff" ;;
     mips_ecoff_bele_vec)	 tb="$tb coff-mips.lo ecoff.lo $ecoff" ;;
-    mips_elf32_be_vec)		 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_le_vec)		 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_n_be_vec)	 tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_n_le_vec)	 tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_ntrad_be_vec)	 tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_ntrad_le_vec)	 tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_ntradfbsd_be_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_ntradfbsd_le_vec) tb="$tb elfn32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf32_trad_be_vec)	 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_trad_le_vec)	 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_tradfbsd_be_vec)  tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_tradfbsd_le_vec)  tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_vxworks_be_vec)	 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf32_vxworks_le_vec)	 tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff" ;;
-    mips_elf64_be_vec)		 tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf64_le_vec)		 tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf64_trad_be_vec)	 tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf64_trad_le_vec)	 tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf64_tradfbsd_be_vec)  tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
-    mips_elf64_tradfbsd_le_vec)  tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf $ecoff"; target_size=64 ;;
+    mips_elf32_be_vec)		 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_le_vec)		 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_n_be_vec)	 tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_n_le_vec)	 tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_ntrad_be_vec)	 tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_ntrad_le_vec)	 tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_ntradfbsd_be_vec) tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_ntradfbsd_le_vec) tb="$tb $elfn32_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf32_trad_be_vec)	 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_trad_le_vec)	 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_tradfbsd_be_vec)  tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_tradfbsd_le_vec)  tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_vxworks_be_vec)	 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf32_vxworks_le_vec)	 tb="$tb $elf32_mips $elf $ecoff" ;;
+    mips_elf64_be_vec)		 tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf64_le_vec)		 tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf64_trad_be_vec)	 tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf64_trad_le_vec)	 tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf64_tradfbsd_be_vec)  tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
+    mips_elf64_tradfbsd_le_vec)  tb="$tb $elf64_mips $elf $ecoff"; target_size=64 ;;
     mmix_elf64_vec)		 tb="$tb elf64-mmix.lo elf64.lo $elf" target_size=64 ;;
     mmix_mmo_vec)			 tb="$tb mmo.lo" target_size=64 ;;
     mn10200_elf32_vec)		 tb="$tb elf-m10200.lo elf32.lo $elf" ;;
     mn10300_elf32_vec)		 tb="$tb elf-m10300.lo elf32.lo $elf" ;;
     moxie_elf32_be_vec)		 tb="$tb elf32-moxie.lo elf32.lo $elf" ;;
     moxie_elf32_le_vec)		 tb="$tb elf32-moxie.lo elf32.lo $elf" ;;
-    msp430_elf32_vec)		 tb="$tb elf32-msp430.lo elf32.lo $elf" ;;
-    msp430_elf32_ti_vec)	 tb="$tb elf32-msp430.lo elf32.lo $elf" ;;
+    msp430_elf32_vec)		 tb="$tb elf32-msp430.lo elf32.lo elf-attrs.lo $elf" ;;
+    msp430_elf32_ti_vec)	 tb="$tb elf32-msp430.lo elf32.lo elf-attrs.lo $elf" ;;
     mt_elf32_vec)		 tb="$tb elf32-mt.lo elf32.lo $elf" ;;
     nds32_elf32_be_vec)		 tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
     nds32_elf32_le_vec)		 tb="$tb elf32-nds32.lo elf32.lo $elf" ;;
@@ -554,20 +567,20 @@ do
     pj_elf32_vec)		 tb="$tb elf32-pj.lo elf32.lo $elf" ;;
     pj_elf32_le_vec)		 tb="$tb elf32-pj.lo elf32.lo $elf" ;;
     powerpc_boot_vec)		 tb="$tb ppcboot.lo" ;;
-    powerpc_elf32_vec)		 tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
-    powerpc_elf32_le_vec)	 tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
-    powerpc_elf32_fbsd_vec)	 tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
-    powerpc_elf32_vxworks_vec)	 tb="$tb elf32-ppc.lo elf-vxworks.lo elf32.lo $elf" ;;
-    powerpc_elf64_vec)		 tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
-    powerpc_elf64_le_vec)	 tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
-    powerpc_elf64_fbsd_vec)	 tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
-    powerpc_elf64_fbsd_le_vec)	 tb="$tb elf64-ppc.lo elf64-gen.lo elf64.lo $elf" target_size=64 ;;
+    powerpc_elf32_vec)		 tb="$tb $elf32_powerpc $elf" ;;
+    powerpc_elf32_le_vec)	 tb="$tb $elf32_powerpc $elf" ;;
+    powerpc_elf32_fbsd_vec)	 tb="$tb $elf32_powerpc $elf" ;;
+    powerpc_elf32_vxworks_vec)	 tb="$tb $elf32_powerpc $elf" ;;
+    powerpc_elf64_vec)		 tb="$tb $elf64_powerpc $elf"; target_size=64 ;;
+    powerpc_elf64_le_vec)	 tb="$tb $elf64_powerpc $elf"; target_size=64 ;;
+    powerpc_elf64_fbsd_vec)	 tb="$tb $elf64_powerpc $elf"; target_size=64 ;;
+    powerpc_elf64_fbsd_le_vec)	 tb="$tb $elf64_powerpc $elf"; target_size=64 ;;
     powerpc_xcoff_vec)		 tb="$tb coff-rs6000.lo $xcoff" ;;
     pru_elf32_vec)		 tb="$tb elf32-pru.lo elf32.lo $elf" ;;
-    riscv_elf32_vec)		 tb="$tb elf32-riscv.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf" ;;
-    riscv_elf64_vec)		 tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
-    riscv_elf32_be_vec)		 tb="$tb elf32-riscv.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf" ;;
-    riscv_elf64_be_vec)		 tb="$tb elf64-riscv.lo elf64.lo elfxx-riscv.lo elf-ifunc.lo elf32.lo $elf"; target_size=64 ;;
+    riscv_elf32_vec)		 tb="$tb $elf32_riscv $elf" ;;
+    riscv_elf64_vec)		 tb="$tb $elf64_riscv $elf"; target_size=64 ;;
+    riscv_elf32_be_vec)		 tb="$tb $elf32_riscv $elf" ;;
+    riscv_elf64_be_vec)		 tb="$tb $elf64_riscv $elf"; target_size=64 ;;
     riscv64_pei_vec)		 tb="$tb pei-riscv64.lo pe-riscv64igen.lo $coff"; target_size=64 ;;
     rl78_elf32_vec)		 tb="$tb elf32-rl78.lo elf32.lo $elf" ;;
     rs6000_xcoff64_vec)		 tb="$tb coff64-rs6000.lo aix5ppc-core.lo $xcoff"; target_size=64 ;;
@@ -577,8 +590,8 @@ do
     rx_elf32_be_ns_vec)		 tb="$tb elf32-rx.lo elf32.lo $elf" ;;
     rx_elf32_le_vec)		 tb="$tb elf32-rx.lo elf32.lo $elf" ;;
     rx_elf32_linux_le_vec)	 tb="$tb elf32-rx.lo elf32.lo $elf" ;;
-    s390_elf32_vec)		 tb="$tb elf32-s390.lo elf32.lo $elf" ;;
-    s390_elf64_vec)		 tb="$tb elf64-s390.lo elf64.lo $elf"; target_size=64 ;;
+    s390_elf32_vec)		 tb="$tb elf32-s390.lo elf32.lo elf-attrs.lo $elf" ;;
+    s390_elf64_vec)		 tb="$tb elf64-s390.lo elf64.lo elf-attrs.lo $elf"; target_size=64 ;;
     score_elf32_be_vec)		 tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;;
     score_elf32_le_vec)		 tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;;
     sh_coff_vec)		 tb="$tb coff-sh.lo $coff" ;;
@@ -618,12 +631,12 @@ do
     tic54x_coff1_beh_vec)	 tb="$tb coff-tic54x.lo $coffgen" ;;
     tic54x_coff2_vec)		 tb="$tb coff-tic54x.lo $coffgen" ;;
     tic54x_coff2_beh_vec)	 tb="$tb coff-tic54x.lo $coffgen" ;;
-    tic6x_elf32_be_vec)		 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
-    tic6x_elf32_le_vec)		 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
-    tic6x_elf32_c6000_be_vec)	 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
-    tic6x_elf32_c6000_le_vec)	 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
-    tic6x_elf32_linux_be_vec)	 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
-    tic6x_elf32_linux_le_vec)	 tb="$tb elf32-tic6x.lo elf32.lo $elf" ;;
+    tic6x_elf32_be_vec)		 tb="$tb $elf_tic6x $elf" ;;
+    tic6x_elf32_le_vec)		 tb="$tb $elf_tic6x $elf" ;;
+    tic6x_elf32_c6000_be_vec)	 tb="$tb $elf_tic6x $elf" ;;
+    tic6x_elf32_c6000_le_vec)	 tb="$tb $elf_tic6x $elf" ;;
+    tic6x_elf32_linux_be_vec)	 tb="$tb $elf_tic6x $elf" ;;
+    tic6x_elf32_linux_le_vec)	 tb="$tb $elf_tic6x $elf" ;;
     tilegx_elf32_be_vec)	 tb="$tb elf32-tilegx.lo elfxx-tilegx.lo elf32.lo $elf" ; target_size=32 ;;
     tilegx_elf32_le_vec)	 tb="$tb elf32-tilegx.lo elfxx-tilegx.lo elf32.lo $elf" ; target_size=32 ;;
     tilegx_elf64_be_vec)	 tb="$tb elf64-tilegx.lo elfxx-tilegx.lo elf64.lo $elf" ; target_size=64 ;;
@@ -719,7 +732,7 @@ if test x${all_targets} = xtrue ; then
     esac
   done
   assocvecs=$f
-  TDEFINES="$TDEFINES -DOBJ_MAYBE_ELF"
+  TDEFINES="$TDEFINES -DOBJ_MAYBE_ELF -DOBJ_MAYBE_ELF_ATTRIBUTES"
 else	# all_targets is true
   # Only set these if they will be nonempty, for the clever echo.
   havevecs=
@@ -734,6 +747,7 @@ else	# all_targets is true
   for i in $bfd_backends ; do
     case "$i" in
     elf.*) TDEFINES="$TDEFINES -DOBJ_MAYBE_ELF" ;;
+    elf-attrs.*) TDEFINES="$TDEFINES -DOBJ_MAYBE_ELF_ATTRIBUTES" ;;
     esac
   done
 fi	# all_targets is true
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 837fbefa6a2..58db4eb81b0 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -3174,10 +3174,6 @@ extern bfd *_bfd_elf64_bfd_from_remote_memory
    int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
   ATTRIBUTE_HIDDEN;
 
-extern obj_attr_version_t _bfd_obj_attrs_version_dec (uint8_t)
-  ATTRIBUTE_HIDDEN;
-extern uint8_t _bfd_obj_attrs_version_enc (obj_attr_version_t)
-  ATTRIBUTE_HIDDEN;
 extern bfd_vma bfd_elf_obj_attr_size (bfd *);
 extern void bfd_elf_set_obj_attr_contents (bfd *, bfd_byte *, bfd_vma);
 extern obj_attribute *
@@ -3196,27 +3192,51 @@ extern obj_attribute *bfd_elf_add_obj_attr_int_string
 #define bfd_elf_add_proc_attr_int_string(BFD, TAG, INTVAL, STRVAL) \
   bfd_elf_add_obj_attr_int_string ((BFD), OBJ_ATTR_PROC, (TAG), \
 				   (INTVAL), (STRVAL))
+extern int bfd_elf_obj_attrs_arg_type
+  (bfd *, obj_attr_vendor_t, obj_attr_tag_t);
+extern bfd *_bfd_elf_link_setup_object_attributes
+  (struct bfd_link_info *) ATTRIBUTE_HIDDEN;
+
+#ifdef OBJ_MAYBE_ELF_ATTRIBUTES
 
+extern obj_attr_version_t _bfd_obj_attrs_version_dec (uint8_t)
+  ATTRIBUTE_HIDDEN;
+extern uint8_t _bfd_obj_attrs_version_enc (obj_attr_version_t)
+  ATTRIBUTE_HIDDEN;
 extern bool _bfd_elf_write_section_object_attributes
   (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN;
 extern char *_bfd_elf_attr_strdup
   (bfd *, const char *) ATTRIBUTE_HIDDEN;
 extern void _bfd_elf_copy_obj_attributes
   (bfd *, bfd *) ATTRIBUTE_HIDDEN;
-extern int bfd_elf_obj_attrs_arg_type
-  (bfd *, obj_attr_vendor_t, obj_attr_tag_t);
 extern void _bfd_elf_parse_attributes
   (bfd *, Elf_Internal_Shdr *) ATTRIBUTE_HIDDEN;
 extern void _bfd_elf_cleanup_object_attributes
   (bfd *) ATTRIBUTE_HIDDEN;
-extern bfd *_bfd_elf_link_setup_object_attributes
-  (struct bfd_link_info *) ATTRIBUTE_HIDDEN;
 extern bool _bfd_elf_merge_object_attributes
   (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN;
 extern bool _bfd_elf_merge_unknown_attribute_low
   (bfd *, bfd *, int) ATTRIBUTE_HIDDEN;
 extern bool _bfd_elf_merge_unknown_attribute_list
   (bfd *, bfd *) ATTRIBUTE_HIDDEN;
+
+#else /* !OBJ_MAYBE_ELF_ATTRIBUTES */
+
+static inline bool _bfd_elf_write_section_object_attributes
+  (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info ATTRIBUTE_UNUSED)
+{ return true; }
+static inline void _bfd_elf_copy_obj_attributes
+  (bfd *ibfd ATTRIBUTE_UNUSED, bfd *obfd ATTRIBUTE_UNUSED)
+{}
+static inline void _bfd_elf_parse_attributes
+  (bfd *abfd ATTRIBUTE_UNUSED, Elf_Internal_Shdr *hdr ATTRIBUTE_UNUSED)
+{}
+static inline void _bfd_elf_cleanup_object_attributes
+  (bfd *abfd ATTRIBUTE_UNUSED)
+{}
+
+#endif /* OBJ_MAYBE_ELF_ATTRIBUTES */
+
 extern Elf_Internal_Shdr *_bfd_elf_single_rel_hdr
   (asection *sec);
 extern bool _bfd_elf_read_notes
diff --git a/bfd/elf.c b/bfd/elf.c
index a8e1834b8f2..5f02188b4b5 100644
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -14209,3 +14209,11 @@ _bfd_elf_link_munmap_section_contents (asection *sec ATTRIBUTE_UNUSED)
     }
 #endif
 }
+
+#ifndef OBJ_MAYBE_ELF_ATTRIBUTES
+
+bfd *_bfd_elf_link_setup_object_attributes
+  (struct bfd_link_info *info ATTRIBUTE_UNUSED)
+{ return NULL; }
+
+#endif /* !OBJ_MAYBE_ELF_ATTRIBUTES */
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 60c1ccb6c8d..70a1cd107aa 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -12706,11 +12706,14 @@ _bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
      sections from the link, and set the contents of the output
      section.  */
   sections_removed = false;
+#ifdef OBJ_MAYBE_ELF_ATTRIBUTES
   const char *obj_attrs_section = get_elf_backend_data (abfd)->obj_attrs_section;
+#endif
   for (o = abfd->sections; o != NULL; o = o->next)
     {
       bool remove_section = false;
 
+#ifdef OBJ_MAYBE_ELF_ATTRIBUTES
       if ((obj_attrs_section && strcmp (o->name, obj_attrs_section) == 0)
 	  || strcmp (o->name, ".gnu.attributes") == 0)
 	{
@@ -12739,7 +12742,9 @@ _bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
 	  else
 	    remove_section = true;
 	}
-      else if ((o->flags & SEC_GROUP) != 0 && o->size == 0)
+      else
+#endif /* OBJ_MAYBE_ELF_ATTRIBUTES */
+      if ((o->flags & SEC_GROUP) != 0 && o->size == 0)
 	{
 	  /* Remove empty group section from linker output.  */
 	  remove_section = true;
diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h
index 672daeccb04..124be5ed0c4 100644
--- a/bfd/elfxx-target.h
+++ b/bfd/elfxx-target.h
@@ -554,12 +554,17 @@
 #ifndef elf_backend_default_obj_attr_version
 #define elf_backend_default_obj_attr_version	OBJ_ATTR_V1
 #endif
+#ifdef OBJ_MAYBE_ELF_ATTRIBUTES
 #ifndef elf_backend_obj_attrs_version_dec
 #define elf_backend_obj_attrs_version_dec	_bfd_obj_attrs_version_dec
 #endif
 #ifndef elf_backend_obj_attrs_version_enc
 #define elf_backend_obj_attrs_version_enc	_bfd_obj_attrs_version_enc
 #endif
+#else /* OBJ_MAYBE_ELF_ATTRIBUTES */
+#define elf_backend_obj_attrs_version_dec	NULL
+#define elf_backend_obj_attrs_version_enc	NULL
+#endif /* OBJ_MAYBE_ELF_ATTRIBUTES */
 #ifndef elf_backend_obj_attr_v2_known_subsections
 #define elf_backend_obj_attr_v2_known_subsections	NULL
 #endif


More information about the Binutils-cvs mailing list