[binutils-gdb] bfd: replace _bfd_merge_sections() hook with simple boolean

Jan Beulich jbeulich@sourceware.org
Fri Oct 24 13:14:58 GMT 2025


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

commit caccc182b5e0743dde736560ae87e4891a812818
Author: Jan Beulich <jbeulich@suse.com>
Date:   Fri Oct 24 15:11:39 2025 +0200

    bfd: replace _bfd_merge_sections() hook with simple boolean
    
    There's no need for a hook; what needs doing is uniform, the question is
    only whether to perform any merging (i.e. whether other parts of a backend
    are capable of dealing with the effects).
    
    Where _bfd_nolink_bfd_merge_sections() was used, false is hardcoded. For
    ELF no real target override is permitted; true is hardcoded except for the
    cases where bfd_generic_merge_sections() was used as the hook function
    before.

Diff:
---
 bfd/aout-target.h      |  4 +---
 bfd/bfd-in2.h          | 15 ++++++++-------
 bfd/bfd.c              |  3 ---
 bfd/binary.c           |  2 +-
 bfd/cisco-core.c       |  1 +
 bfd/coff-aarch64.c     |  1 +
 bfd/coff-alpha.c       |  2 +-
 bfd/coff-i386.c        |  2 ++
 bfd/coff-ia64.c        |  1 +
 bfd/coff-loongarch64.c |  1 +
 bfd/coff-mips.c        |  6 +++---
 bfd/coff-riscv64.c     |  1 +
 bfd/coff-rs6000.c      |  3 ++-
 bfd/coff-sh.c          |  2 ++
 bfd/coff-tic30.c       |  1 +
 bfd/coff-tic54x.c      |  6 ++++++
 bfd/coff-x86_64.c      |  2 ++
 bfd/coff64-rs6000.c    |  4 ++--
 bfd/coffcode.h         |  7 +++----
 bfd/elfxx-target.h     | 10 ++++------
 bfd/hppabsd-core.c     |  1 +
 bfd/hpux-core.c        |  1 +
 bfd/i386msdos.c        |  2 +-
 bfd/ihex.c             |  2 +-
 bfd/irix-core.c        |  1 +
 bfd/libbfd-in.h        |  6 ------
 bfd/libbfd.h           |  9 ---------
 bfd/mach-o-target.c    |  2 +-
 bfd/merge.c            |  7 +++++--
 bfd/mmo.c              |  2 +-
 bfd/netbsd-core.c      |  1 +
 bfd/osf-core.c         |  1 +
 bfd/pdb.c              |  1 +
 bfd/pdp11.c            |  1 +
 bfd/pef.c              |  3 ++-
 bfd/plugin.c           |  2 +-
 bfd/ppcboot.c          |  2 +-
 bfd/ptrace-core.c      |  1 +
 bfd/reloc.c            | 20 --------------------
 bfd/som.c              |  2 +-
 bfd/srec.c             |  3 ++-
 bfd/targets.c          | 12 ++++++++----
 bfd/tekhex.c           |  2 +-
 bfd/trad-core.c        |  1 +
 bfd/verilog.c          |  1 +
 bfd/vms-alpha.c        |  2 +-
 bfd/vms-lib.c          |  1 +
 bfd/wasm-module.c      |  1 +
 bfd/xsym.c             |  2 +-
 include/bfdlink.h      |  3 +++
 50 files changed, 85 insertions(+), 84 deletions(-)

diff --git a/bfd/aout-target.h b/bfd/aout-target.h
index c6d9d60ca8a..229e90b0175 100644
--- a/bfd/aout-target.h
+++ b/bfd/aout-target.h
@@ -495,9 +495,6 @@ MY_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
 #ifndef MY_bfd_lookup_section_flags
 #define MY_bfd_lookup_section_flags bfd_generic_lookup_section_flags
 #endif
-#ifndef MY_bfd_merge_sections
-#define MY_bfd_merge_sections bfd_generic_merge_sections
-#endif
 #ifndef MY_bfd_is_group_section
 #define MY_bfd_is_group_section bfd_generic_is_group_section
 #endif
@@ -648,6 +645,7 @@ const bfd_target MY (vec) =
   15,				/* AR_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
 #ifdef TARGET_IS_BIG_ENDIAN_P
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
      bfd_getb32, bfd_getb_signed_32, bfd_putb32,
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index 8f3b0f7c255..1a178c57daf 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -2708,9 +2708,6 @@ bool bfd_set_private_flags (bfd *abfd, flagword flags);
 #define bfd_lookup_section_flags(link_info, flag_info, section) \
        BFD_SEND (abfd, _bfd_lookup_section_flags, (link_info, flag_info, section))
 
-#define bfd_merge_sections(abfd, link_info) \
-       BFD_SEND (abfd, _bfd_merge_sections, (abfd, link_info))
-
 #define bfd_is_group_section(abfd, sec) \
        BFD_SEND (abfd, _bfd_is_group_section, (abfd, sec))
 
@@ -7525,6 +7522,11 @@ struct stab_info
 #define TARGET_KEEP_UNUSED_SECTION_SYMBOLS true
 #endif
 
+/* Define to TRUE if section merging is supported by the backend.  */
+#ifndef TARGET_MERGE_SECTIONS
+#define TARGET_MERGE_SECTIONS false
+#endif
+
 enum bfd_flavour
 {
   /* N.B. Update bfd_flavour_name if you change this.  */
@@ -7594,6 +7596,9 @@ typedef struct bfd_target
  /* TRUE if unused section symbols should be kept.  */
   bool keep_unused_section_symbols;
 
+  /* TRUE if section merging is supported by the backend.  */
+  bool merge_sections;
+
   /* Entries for byte swapping for data. These are different from the
      other entry points, since they don't take a BFD as the first argument.
      Certain other handlers could do the same.  */
@@ -7831,7 +7836,6 @@ typedef struct bfd_target
   NAME##_bfd_link_check_relocs, \
   NAME##_bfd_gc_sections, \
   NAME##_bfd_lookup_section_flags, \
-  NAME##_bfd_merge_sections, \
   NAME##_bfd_is_group_section, \
   NAME##_bfd_group_name, \
   NAME##_bfd_discard_group, \
@@ -7887,9 +7891,6 @@ typedef struct bfd_target
   bool (*_bfd_lookup_section_flags) (struct bfd_link_info *,
 				     struct flag_info *, asection *);
 
-  /* Attempt to merge SEC_MERGE sections.  */
-  bool (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
-
   /* Is this section a member of a group?  */
   bool (*_bfd_is_group_section) (bfd *, const struct bfd_section *);
 
diff --git a/bfd/bfd.c b/bfd/bfd.c
index 858ab5ce017..11ce75669d3 100644
--- a/bfd/bfd.c
+++ b/bfd/bfd.c
@@ -2645,9 +2645,6 @@ DESCRIPTION
 .#define bfd_lookup_section_flags(link_info, flag_info, section) \
 .	BFD_SEND (abfd, _bfd_lookup_section_flags, (link_info, flag_info, section))
 .
-.#define bfd_merge_sections(abfd, link_info) \
-.	BFD_SEND (abfd, _bfd_merge_sections, (abfd, link_info))
-.
 .#define bfd_is_group_section(abfd, sec) \
 .	BFD_SEND (abfd, _bfd_is_group_section, (abfd, sec))
 .
diff --git a/bfd/binary.c b/bfd/binary.c
index 7fe47b590de..eb5f3b1371e 100644
--- a/bfd/binary.c
+++ b/bfd/binary.c
@@ -298,7 +298,6 @@ binary_set_section_contents (bfd *abfd,
 #define binary_bfd_relax_section		   bfd_generic_relax_section
 #define binary_bfd_gc_sections			   bfd_generic_gc_sections
 #define binary_bfd_lookup_section_flags		   bfd_generic_lookup_section_flags
-#define binary_bfd_merge_sections		   bfd_generic_merge_sections
 #define binary_bfd_is_group_section		   bfd_generic_is_group_section
 #define binary_bfd_group_name			   bfd_generic_group_name
 #define binary_bfd_discard_group		   bfd_generic_discard_group
@@ -328,6 +327,7 @@ const bfd_target binary_vec =
   16,				/* ar_max_namelen */
   255,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* data */
diff --git a/bfd/cisco-core.c b/bfd/cisco-core.c
index 23ce251357e..70c086b1cfd 100644
--- a/bfd/cisco-core.c
+++ b/bfd/cisco-core.c
@@ -330,6 +330,7 @@ const bfd_target core_cisco_be_vec =
   16,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  false,			/* merge sections */
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
diff --git a/bfd/coff-aarch64.c b/bfd/coff-aarch64.c
index 48b8bfaf496..0792306cfa0 100644
--- a/bfd/coff-aarch64.c
+++ b/bfd/coff-aarch64.c
@@ -973,6 +973,7 @@ const bfd_target
   15,				/* Ar_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
 
   /* Data conversion functions.  */
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
diff --git a/bfd/coff-alpha.c b/bfd/coff-alpha.c
index 3616a3eceef..b20269b077b 100644
--- a/bfd/coff-alpha.c
+++ b/bfd/coff-alpha.c
@@ -2445,7 +2445,6 @@ static const struct ecoff_backend_data alpha_ecoff_backend_data =
 /* Relaxing sections is generic.  */
 #define _bfd_ecoff_bfd_relax_section bfd_generic_relax_section
 #define _bfd_ecoff_bfd_gc_sections bfd_generic_gc_sections
-#define _bfd_ecoff_bfd_merge_sections bfd_generic_merge_sections
 #define _bfd_ecoff_bfd_is_group_section bfd_generic_is_group_section
 #define _bfd_ecoff_bfd_group_name bfd_generic_group_name
 #define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group
@@ -2477,6 +2476,7 @@ const bfd_target alpha_ecoff_le_vec =
   15,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
diff --git a/bfd/coff-i386.c b/bfd/coff-i386.c
index 6a41c327ec2..935aeb4ac0d 100644
--- a/bfd/coff-i386.c
+++ b/bfd/coff-i386.c
@@ -740,6 +740,7 @@ const bfd_target
   15,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
 
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
@@ -819,6 +820,7 @@ const bfd_target
   15,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
 
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
diff --git a/bfd/coff-ia64.c b/bfd/coff-ia64.c
index b2873ae8684..a457497c385 100644
--- a/bfd/coff-ia64.c
+++ b/bfd/coff-ia64.c
@@ -174,6 +174,7 @@ const bfd_target
   15,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
 
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
diff --git a/bfd/coff-loongarch64.c b/bfd/coff-loongarch64.c
index a85210864ae..10a902869d8 100644
--- a/bfd/coff-loongarch64.c
+++ b/bfd/coff-loongarch64.c
@@ -115,6 +115,7 @@ const bfd_target
   15,				/* Ar_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
 
      /* Data conversion functions.  */
      bfd_getl64, bfd_getl_signed_64, bfd_putl64,
diff --git a/bfd/coff-mips.c b/bfd/coff-mips.c
index 1213a159358..80e6990db01 100644
--- a/bfd/coff-mips.c
+++ b/bfd/coff-mips.c
@@ -1404,9 +1404,6 @@ static const struct ecoff_backend_data mips_ecoff_backend_data =
 /* Input section flags is not implemented.  */
 #define _bfd_ecoff_bfd_lookup_section_flags bfd_generic_lookup_section_flags
 
-/* Merging of sections is not done.  */
-#define _bfd_ecoff_bfd_merge_sections bfd_generic_merge_sections
-
 #define _bfd_ecoff_bfd_is_group_section bfd_generic_is_group_section
 #define _bfd_ecoff_bfd_group_name bfd_generic_group_name
 #define _bfd_ecoff_bfd_discard_group bfd_generic_discard_group
@@ -1437,6 +1434,7 @@ const bfd_target mips_ecoff_le_vec =
   15,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
@@ -1496,6 +1494,7 @@ const bfd_target mips_ecoff_be_vec =
   15,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
      bfd_getb32, bfd_getb_signed_32, bfd_putb32,
      bfd_getb16, bfd_getb_signed_16, bfd_putb16,
@@ -1555,6 +1554,7 @@ const bfd_target mips_ecoff_bele_vec =
   15,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
diff --git a/bfd/coff-riscv64.c b/bfd/coff-riscv64.c
index 2356a6bb94d..508fd85f1d8 100644
--- a/bfd/coff-riscv64.c
+++ b/bfd/coff-riscv64.c
@@ -88,6 +88,7 @@ const bfd_target
   15,				/* Ar_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
 
      /* Data conversion functions.  */
      bfd_getl64, bfd_getl_signed_64, bfd_putl64,
diff --git a/bfd/coff-rs6000.c b/bfd/coff-rs6000.c
index 803b51c9fc3..fc065d7095d 100644
--- a/bfd/coff-rs6000.c
+++ b/bfd/coff-rs6000.c
@@ -4521,7 +4521,6 @@ coff_find_nearest_line_with_alt
 #define _bfd_xcoff_bfd_link_split_section _bfd_generic_link_split_section
 #define _bfd_xcoff_bfd_gc_sections bfd_generic_gc_sections
 #define _bfd_xcoff_bfd_lookup_section_flags bfd_generic_lookup_section_flags
-#define _bfd_xcoff_bfd_merge_sections bfd_generic_merge_sections
 #define _bfd_xcoff_bfd_is_group_section bfd_generic_is_group_section
 #define _bfd_xcoff_bfd_group_name bfd_generic_group_name
 #define _bfd_xcoff_bfd_discard_group bfd_generic_discard_group
@@ -4655,6 +4654,7 @@ const bfd_target rs6000_xcoff_vec =
     15,				/* ar_max_namelen */
     0,				/* match priority.  */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    TARGET_MERGE_SECTIONS,
 
     /* data */
     bfd_getb64,
@@ -4844,6 +4844,7 @@ const bfd_target powerpc_xcoff_vec =
     15,				/* ar_max_namelen */
     0,				/* match priority.  */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    TARGET_MERGE_SECTIONS,
 
     /* data */
     bfd_getb64,
diff --git a/bfd/coff-sh.c b/bfd/coff-sh.c
index 008d1e7b38f..928d13a4d18 100644
--- a/bfd/coff-sh.c
+++ b/bfd/coff-sh.c
@@ -3139,6 +3139,7 @@ const bfd_target sh_coff_small_vec =
   15,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16, /* data */
@@ -3197,6 +3198,7 @@ const bfd_target sh_coff_small_le_vec =
   15,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
   bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
diff --git a/bfd/coff-tic30.c b/bfd/coff-tic30.c
index 583c7c253c7..957fdf447c4 100644
--- a/bfd/coff-tic30.c
+++ b/bfd/coff-tic30.c
@@ -200,6 +200,7 @@ const bfd_target tic30_coff_vec =
   15,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* data */
diff --git a/bfd/coff-tic54x.c b/bfd/coff-tic54x.c
index 0eb8534e437..9166ed82751 100644
--- a/bfd/coff-tic54x.c
+++ b/bfd/coff-tic54x.c
@@ -388,6 +388,7 @@ const bfd_target tic54x_coff0_vec =
     15,				/* ar_max_namelen */
     0,				/* match priority.  */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    TARGET_MERGE_SECTIONS,
     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
     bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
@@ -450,6 +451,7 @@ const bfd_target tic54x_coff0_beh_vec =
 #else
     false,			/* keep unused section symbols.  */
 #endif
+    TARGET_MERGE_SECTIONS,
     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
     bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
@@ -513,6 +515,7 @@ const bfd_target tic54x_coff1_vec =
 #else
     false,			/* keep unused section symbols.  */
 #endif
+    TARGET_MERGE_SECTIONS,
     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
     bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
@@ -576,6 +579,7 @@ const bfd_target tic54x_coff1_beh_vec =
 #else
     false,			/* keep unused section symbols.  */
 #endif
+    TARGET_MERGE_SECTIONS,
     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
     bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
@@ -639,6 +643,7 @@ const bfd_target tic54x_coff2_vec =
 #else
     false,			/* keep unused section symbols.  */
 #endif
+    TARGET_MERGE_SECTIONS,
     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
     bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
@@ -702,6 +707,7 @@ const bfd_target tic54x_coff2_beh_vec =
 #else
     false,			/* keep unused section symbols.  */
 #endif
+    TARGET_MERGE_SECTIONS,
     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
     tic54x_getl32, tic54x_getl_signed_32, tic54x_putl32,
     bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
diff --git a/bfd/coff-x86_64.c b/bfd/coff-x86_64.c
index af47b7fbb76..3d5a82f8b4a 100644
--- a/bfd/coff-x86_64.c
+++ b/bfd/coff-x86_64.c
@@ -927,6 +927,7 @@ const bfd_target
   15,				/* Ar_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
 
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
@@ -1000,6 +1001,7 @@ const bfd_target
   15,				/* Ar_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
 
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
diff --git a/bfd/coff64-rs6000.c b/bfd/coff64-rs6000.c
index 814d25eda90..00cb91a02cc 100644
--- a/bfd/coff64-rs6000.c
+++ b/bfd/coff64-rs6000.c
@@ -2568,6 +2568,7 @@ const bfd_target rs6000_xcoff64_vec =
     15,				/* ar_max_namelen */
     0,				/* match priority.  */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    TARGET_MERGE_SECTIONS,
 
     /* data */
     bfd_getb64,
@@ -2685,7 +2686,6 @@ const bfd_target rs6000_xcoff64_vec =
     _bfd_generic_link_check_relocs,
     bfd_generic_gc_sections,
     bfd_generic_lookup_section_flags,
-    bfd_generic_merge_sections,
     bfd_generic_is_group_section,
     bfd_generic_group_name,
     bfd_generic_discard_group,
@@ -2838,6 +2838,7 @@ const bfd_target rs6000_xcoff64_aix_vec =
     15,				/* ar_max_namelen */
     0,				/* match priority.  */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    TARGET_MERGE_SECTIONS,
 
     /* data */
     bfd_getb64,
@@ -2955,7 +2956,6 @@ const bfd_target rs6000_xcoff64_aix_vec =
     _bfd_generic_link_check_relocs,
     bfd_generic_gc_sections,
     bfd_generic_lookup_section_flags,
-    bfd_generic_merge_sections,
     bfd_generic_is_group_section,
     bfd_generic_group_name,
     bfd_generic_discard_group,
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index 5cfdb2dc56b..1e5acc0032c 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -6024,10 +6024,6 @@ static const bfd_coff_backend_data bigobj_swap_table =
 #define coff_bfd_lookup_section_flags	    bfd_generic_lookup_section_flags
 #endif
 
-#ifndef coff_bfd_merge_sections
-#define coff_bfd_merge_sections		    bfd_generic_merge_sections
-#endif
-
 #ifndef coff_bfd_is_group_section
 #define coff_bfd_is_group_section	    bfd_generic_is_group_section
 #endif
@@ -6082,6 +6078,7 @@ const bfd_target VAR =							\
   15,				/* AR_max_namelen.  */			\
   0,				/* match priority.  */			\
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */ \
+  TARGET_MERGE_SECTIONS,						\
 									\
   /* Data conversion functions.  */					\
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,				\
@@ -6145,6 +6142,7 @@ const bfd_target VAR =							\
   15,				/* AR_max_namelen.  */			\
   0,				/* match priority.  */			\
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */ \
+  TARGET_MERGE_SECTIONS,						\
 									\
   /* Data conversion functions.  */					\
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,				\
@@ -6208,6 +6206,7 @@ const bfd_target VAR =							\
   15,				/* AR_max_namelen.  */			\
   0,				/* match priority.  */			\
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */ \
+  TARGET_MERGE_SECTIONS,						\
 									\
   /* Data conversion functions.  */					\
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,				\
diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h
index 839555647b0..3369db5c2cf 100644
--- a/bfd/elfxx-target.h
+++ b/bfd/elfxx-target.h
@@ -280,9 +280,8 @@
 #ifndef bfd_elfNN_bfd_final_link
 #define bfd_elfNN_bfd_final_link	bfd_elf_final_link
 #endif
-#ifndef bfd_elfNN_bfd_merge_sections
-#define bfd_elfNN_bfd_merge_sections	_bfd_merge_sections
-#endif
+#undef TARGET_MERGE_SECTIONS
+#define TARGET_MERGE_SECTIONS true
 #else /* ! defined (elf_backend_relocate_section) */
 /* If no backend relocate_section routine, use the generic linker.
    Note - this will prevent the port from being able to use some of
@@ -306,9 +305,6 @@
 #ifndef bfd_elfNN_bfd_final_link
 #define bfd_elfNN_bfd_final_link	_bfd_generic_final_link
 #endif
-#ifndef bfd_elfNN_bfd_merge_sections
-#define bfd_elfNN_bfd_merge_sections	bfd_generic_merge_sections
-#endif
 #endif /* ! defined (elf_backend_relocate_section) */
 
 #ifndef bfd_elfNN_bfd_link_just_syms
@@ -1027,6 +1023,7 @@ const bfd_target TARGET_BIG_SYM =
 
   /* TRUE if unused section symbols should be kept.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS,
+  TARGET_MERGE_SECTIONS,
 
   /* Routines to byte-swap various sized integers from the data sections */
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
@@ -1132,6 +1129,7 @@ const bfd_target TARGET_LITTLE_SYM =
 
   /* TRUE if unused section symbols should be kept.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS,
+  TARGET_MERGE_SECTIONS,
 
   /* Routines to byte-swap various sized integers from the data sections */
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
diff --git a/bfd/hppabsd-core.c b/bfd/hppabsd-core.c
index d9cd1363fa8..45f41c8a139 100644
--- a/bfd/hppabsd-core.c
+++ b/bfd/hppabsd-core.c
@@ -232,6 +232,7 @@ const bfd_target core_hppabsd_vec =
     ' ',						   /* ar_pad_char */
     16,							   /* ar_max_namelen */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    false,			/* merge sections */
     NO_GET64, NO_GETS64, NO_PUT64,	/* 64 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 32 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 16 bit data */
diff --git a/bfd/hpux-core.c b/bfd/hpux-core.c
index 5dca3eff8e9..537e08a2169 100644
--- a/bfd/hpux-core.c
+++ b/bfd/hpux-core.c
@@ -379,6 +379,7 @@ const bfd_target core_hpux_vec =
     16,				/* ar_max_namelen */
     0,				/* match priority.  */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    false,			/* merge sections */
     NO_GET64, NO_GETS64, NO_PUT64,	/* 64 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 32 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 16 bit data */
diff --git a/bfd/i386msdos.c b/bfd/i386msdos.c
index ba58f0feabc..a4a9c54831c 100644
--- a/bfd/i386msdos.c
+++ b/bfd/i386msdos.c
@@ -224,7 +224,6 @@ msdos_set_section_contents (bfd *abfd,
 #define msdos_bfd_relax_section bfd_generic_relax_section
 #define msdos_bfd_gc_sections bfd_generic_gc_sections
 #define msdos_bfd_lookup_section_flags bfd_generic_lookup_section_flags
-#define msdos_bfd_merge_sections bfd_generic_merge_sections
 #define msdos_bfd_is_group_section bfd_generic_is_group_section
 #define msdos_bfd_group_name bfd_generic_group_name
 #define msdos_bfd_discard_group bfd_generic_discard_group
@@ -279,6 +278,7 @@ const bfd_target i386_msdos_vec =
     16,				/* ar_max_namelen */
     0,				/* match priority.  */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    TARGET_MERGE_SECTIONS,
     bfd_getl64, bfd_getl_signed_64, bfd_putl64,
     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
     bfd_getl16, bfd_getl_signed_16, bfd_putl16,	/* data */
diff --git a/bfd/ihex.c b/bfd/ihex.c
index 79c5349375c..c612b780f1a 100644
--- a/bfd/ihex.c
+++ b/bfd/ihex.c
@@ -926,7 +926,6 @@ ihex_set_arch_mach (bfd *abfd,
 #define ihex_bfd_relax_section			  bfd_generic_relax_section
 #define ihex_bfd_gc_sections			  bfd_generic_gc_sections
 #define ihex_bfd_lookup_section_flags		  bfd_generic_lookup_section_flags
-#define ihex_bfd_merge_sections			  bfd_generic_merge_sections
 #define ihex_bfd_is_group_section		  bfd_generic_is_group_section
 #define ihex_bfd_group_name			  bfd_generic_group_name
 #define ihex_bfd_discard_group			  bfd_generic_discard_group
@@ -957,6 +956,7 @@ const bfd_target ihex_vec =
   16,				/* AR_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
diff --git a/bfd/irix-core.c b/bfd/irix-core.c
index 4087419d6a8..60da91957e3 100644
--- a/bfd/irix-core.c
+++ b/bfd/irix-core.c
@@ -295,6 +295,7 @@ const bfd_target core_irix_vec =
     16,							   /* ar_max_namelen */
     0,							   /* match_priority */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    false,			/* merge sections */
     NO_GET64, NO_GETS64, NO_PUT64,	/* 64 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 32 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 16 bit data */
diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h
index 8caec1c76a6..e00bd4353e3 100644
--- a/bfd/libbfd-in.h
+++ b/bfd/libbfd-in.h
@@ -489,7 +489,6 @@ extern bool _bfd_nolink_bfd_relax_section
 #define _bfd_nolink_bfd_gc_sections _bfd_bool_bfd_link_false_error
 extern bool _bfd_nolink_bfd_lookup_section_flags
   (struct bfd_link_info *, struct flag_info *, asection *) ATTRIBUTE_HIDDEN;
-#define _bfd_nolink_bfd_merge_sections _bfd_bool_bfd_link_false_error
 extern bool _bfd_nolink_bfd_is_group_section
   (bfd *, const asection *) ATTRIBUTE_HIDDEN;
 extern const char *_bfd_nolink_bfd_group_name
@@ -688,11 +687,6 @@ extern bfd_reloc_status_type _bfd_relocate_contents
 extern bfd_reloc_status_type _bfd_clear_contents
   (reloc_howto_type *, bfd *, asection *, bfd_byte *, bfd_vma) ATTRIBUTE_HIDDEN;
 
-/* Attempt to merge SEC_MERGE sections.  */
-
-extern bool _bfd_merge_sections
-  (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN;
-
 /* Write out a merged section.  */
 
 extern bool _bfd_write_merged_section
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index 617df41924e..193c01ef50a 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -495,7 +495,6 @@ extern bool _bfd_nolink_bfd_relax_section
 #define _bfd_nolink_bfd_gc_sections _bfd_bool_bfd_link_false_error
 extern bool _bfd_nolink_bfd_lookup_section_flags
   (struct bfd_link_info *, struct flag_info *, asection *) ATTRIBUTE_HIDDEN;
-#define _bfd_nolink_bfd_merge_sections _bfd_bool_bfd_link_false_error
 extern bool _bfd_nolink_bfd_is_group_section
   (bfd *, const asection *) ATTRIBUTE_HIDDEN;
 extern const char *_bfd_nolink_bfd_group_name
@@ -694,11 +693,6 @@ extern bfd_reloc_status_type _bfd_relocate_contents
 extern bfd_reloc_status_type _bfd_clear_contents
   (reloc_howto_type *, bfd *, asection *, bfd_byte *, bfd_vma) ATTRIBUTE_HIDDEN;
 
-/* Attempt to merge SEC_MERGE sections.  */
-
-extern bool _bfd_merge_sections
-  (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN;
-
 /* Write out a merged section.  */
 
 extern bool _bfd_write_merged_section
@@ -3631,9 +3625,6 @@ bool bfd_generic_gc_sections
 bool bfd_generic_lookup_section_flags
    (struct bfd_link_info *, struct flag_info *, asection *) ATTRIBUTE_HIDDEN;
 
-bool bfd_generic_merge_sections
-   (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN;
-
 bfd_byte *bfd_generic_get_relocated_section_contents
    (bfd *abfd,
     struct bfd_link_info *link_info,
diff --git a/bfd/mach-o-target.c b/bfd/mach-o-target.c
index e402d3a034f..55e0c749224 100644
--- a/bfd/mach-o-target.c
+++ b/bfd/mach-o-target.c
@@ -48,7 +48,6 @@
 #define bfd_mach_o_get_section_contents		      _bfd_generic_get_section_contents
 #define bfd_mach_o_bfd_gc_sections		      bfd_generic_gc_sections
 #define bfd_mach_o_bfd_lookup_section_flags	      bfd_generic_lookup_section_flags
-#define bfd_mach_o_bfd_merge_sections		      bfd_generic_merge_sections
 #define bfd_mach_o_bfd_is_group_section		      bfd_generic_is_group_section
 #define bfd_mach_o_bfd_group_name		      bfd_generic_group_name
 #define bfd_mach_o_bfd_discard_group		      bfd_generic_discard_group
@@ -135,6 +134,7 @@ const bfd_target TARGET_NAME =
   16,				/* ar_max_namelen.  */
   TARGET_PRIORITY,	/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
 
 #if TARGET_BIG_ENDIAN
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
diff --git a/bfd/merge.c b/bfd/merge.c
index d89f4800f8a..0de35da5cf4 100644
--- a/bfd/merge.c
+++ b/bfd/merge.c
@@ -874,7 +874,7 @@ is_suffix (const struct sec_merge_hash_entry *A,
 		 B->str, B->len) == 0;
 }
 
-/* This is a helper function for _bfd_merge_sections.  It attempts to
+/* This is a helper function for bfd_merge_sections.  It attempts to
    merge strings matching suffixes of longer strings.  */
 static struct sec_merge_sec_info *
 merge_strings (struct sec_merge_info *sinfo)
@@ -1058,11 +1058,14 @@ merge_sections (bfd *abfd,
 /* Finish SEC_MERGE section merging.  */
 
 bool
-_bfd_merge_sections (bfd *obfd, struct bfd_link_info *info)
+bfd_merge_sections (bfd *obfd, struct bfd_link_info *info)
 {
   const bfd *ibfd;
   asection *sec;
 
+  if (!obfd->xvec->merge_sections)
+    return true;
+
   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
     if ((ibfd->flags & DYNAMIC) == 0)
       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
diff --git a/bfd/mmo.c b/bfd/mmo.c
index 762aeffd3e0..f63654a4592 100644
--- a/bfd/mmo.c
+++ b/bfd/mmo.c
@@ -3332,7 +3332,6 @@ mmo_write_object_contents (bfd *abfd)
    stop anybody from shooting themselves in the foot.  */
 #define mmo_set_arch_mach bfd_default_set_arch_mach
 #define mmo_bfd_relax_section bfd_generic_relax_section
-#define mmo_bfd_merge_sections bfd_generic_merge_sections
 #define mmo_bfd_is_group_section bfd_generic_is_group_section
 #define mmo_bfd_group_name bfd_generic_group_name
 #define mmo_bfd_discard_group bfd_generic_discard_group
@@ -3372,6 +3371,7 @@ const bfd_target mmix_mmo_vec =
   16,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* data */
diff --git a/bfd/netbsd-core.c b/bfd/netbsd-core.c
index 2290817d8c1..34afcefd5e7 100644
--- a/bfd/netbsd-core.c
+++ b/bfd/netbsd-core.c
@@ -279,6 +279,7 @@ const bfd_target core_netbsd_vec =
     16,				/* ar_max_namelen.  */
     0,				/* Match priority.  */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    false,			/* merge sections */
     NO_GET64, NO_GETS64, NO_PUT64,	/* 64 bit data.  */
     NO_GET, NO_GETS, NO_PUT,		/* 32 bit data.  */
     NO_GET, NO_GETS, NO_PUT,		/* 16 bit data.  */
diff --git a/bfd/osf-core.c b/bfd/osf-core.c
index 8433e7cae3e..95e05fe2956 100644
--- a/bfd/osf-core.c
+++ b/bfd/osf-core.c
@@ -189,6 +189,7 @@ const bfd_target core_osf_vec =
     16,				/* ar_max_namelen */
     0,				/* match priority.  */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    false,			/* merge sections */
     NO_GET64, NO_GETS64, NO_PUT64,	/* 64 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 32 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 16 bit data */
diff --git a/bfd/pdb.c b/bfd/pdb.c
index ac94d372c7f..4446830af53 100644
--- a/bfd/pdb.c
+++ b/bfd/pdb.c
@@ -822,6 +822,7 @@ const bfd_target pdb_vec =
   16,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  false,			/* merge sections */
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
   bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data.  */
diff --git a/bfd/pdp11.c b/bfd/pdp11.c
index 2d12033f086..67e667e745b 100644
--- a/bfd/pdp11.c
+++ b/bfd/pdp11.c
@@ -4644,6 +4644,7 @@ const bfd_target MY (vec) =
   15,				/* AR_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
      bfd_getp32, bfd_getp_signed_32, bfd_putp32,
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data.  */
diff --git a/bfd/pef.c b/bfd/pef.c
index 23d26b06095..2054285accd 100644
--- a/bfd/pef.c
+++ b/bfd/pef.c
@@ -55,7 +55,6 @@
 #define bfd_pef_bfd_relax_section		    bfd_generic_relax_section
 #define bfd_pef_bfd_gc_sections			    bfd_generic_gc_sections
 #define bfd_pef_bfd_lookup_section_flags	    bfd_generic_lookup_section_flags
-#define bfd_pef_bfd_merge_sections		    bfd_generic_merge_sections
 #define bfd_pef_bfd_is_group_section		    bfd_generic_is_group_section
 #define bfd_pef_bfd_group_name			    bfd_generic_group_name
 #define bfd_pef_bfd_discard_group		    bfd_generic_discard_group
@@ -1020,6 +1019,7 @@ const bfd_target pef_vec =
   16,				/* AR_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  false,			/* merge sections */
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
@@ -1156,6 +1156,7 @@ const bfd_target pef_xlib_vec =
   16,				/* AR_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
diff --git a/bfd/plugin.c b/bfd/plugin.c
index f8ddc616724..45f17fee25a 100644
--- a/bfd/plugin.c
+++ b/bfd/plugin.c
@@ -99,7 +99,6 @@ dlerror (void)
 #define bfd_plugin_bfd_link_split_section	      _bfd_generic_link_split_section
 #define bfd_plugin_bfd_gc_sections		      bfd_generic_gc_sections
 #define bfd_plugin_bfd_lookup_section_flags	      bfd_generic_lookup_section_flags
-#define bfd_plugin_bfd_merge_sections		      bfd_generic_merge_sections
 #define bfd_plugin_bfd_is_group_section		      bfd_generic_is_group_section
 #define bfd_plugin_bfd_group_name		      bfd_generic_group_name
 #define bfd_plugin_bfd_discard_group		      bfd_generic_discard_group
@@ -983,6 +982,7 @@ const bfd_target plugin_vec =
   15,				/* ar_max_namelen.  */
   255,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
 
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
diff --git a/bfd/ppcboot.c b/bfd/ppcboot.c
index dd70267640c..b296d0e290d 100644
--- a/bfd/ppcboot.c
+++ b/bfd/ppcboot.c
@@ -454,7 +454,6 @@ ppcboot_bfd_print_private_bfd_data (bfd *abfd, void * farg)
 #define ppcboot_bfd_relax_section bfd_generic_relax_section
 #define ppcboot_bfd_gc_sections bfd_generic_gc_sections
 #define ppcboot_bfd_lookup_section_flags bfd_generic_lookup_section_flags
-#define ppcboot_bfd_merge_sections bfd_generic_merge_sections
 #define ppcboot_bfd_is_group_section bfd_generic_is_group_section
 #define ppcboot_bfd_group_name bfd_generic_group_name
 #define ppcboot_bfd_discard_group bfd_generic_discard_group
@@ -494,6 +493,7 @@ const bfd_target powerpc_boot_vec =
   16,				/* ar_max_namelen */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* data */
diff --git a/bfd/ptrace-core.c b/bfd/ptrace-core.c
index 1d44f9f5d02..7182df68974 100644
--- a/bfd/ptrace-core.c
+++ b/bfd/ptrace-core.c
@@ -180,6 +180,7 @@ const bfd_target core_ptrace_vec =
     ' ',						   /* ar_pad_char */
     16,							   /* ar_max_namelen */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    false,			/* merge sections */
     NO_GET64, NO_GETS64, NO_PUT64,	/* 64 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 32 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 16 bit data */
diff --git a/bfd/reloc.c b/bfd/reloc.c
index aa69a3c2dc9..68a8929413b 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -8426,26 +8426,6 @@ bfd_generic_lookup_section_flags (struct bfd_link_info *info ATTRIBUTE_UNUSED,
   return true;
 }
 
-/*
-INTERNAL_FUNCTION
-	bfd_generic_merge_sections
-
-SYNOPSIS
-	bool bfd_generic_merge_sections
-	  (bfd *, struct bfd_link_info *);
-
-DESCRIPTION
-	Provides default handling for SEC_MERGE section merging for back ends
-	which don't have SEC_MERGE support -- i.e., does nothing.
-*/
-
-bool
-bfd_generic_merge_sections (bfd *abfd ATTRIBUTE_UNUSED,
-			    struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
-{
-  return true;
-}
-
 /*
 INTERNAL_FUNCTION
 	bfd_generic_get_relocated_section_contents
diff --git a/bfd/som.c b/bfd/som.c
index 5c60f605043..bed2e9b5e8b 100644
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -6771,7 +6771,6 @@ som_bfd_link_split_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
 #define som_bfd_final_link			_bfd_generic_final_link
 #define som_bfd_gc_sections			bfd_generic_gc_sections
 #define som_bfd_lookup_section_flags		bfd_generic_lookup_section_flags
-#define som_bfd_merge_sections			bfd_generic_merge_sections
 #define som_bfd_is_group_section		bfd_generic_is_group_section
 #define som_bfd_group_name			bfd_generic_group_name
 #define som_bfd_discard_group			bfd_generic_discard_group
@@ -6805,6 +6804,7 @@ const bfd_target hppa_som_vec =
   14,				/* AR_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
diff --git a/bfd/srec.c b/bfd/srec.c
index 1509bebd6c1..9c59ae86ad9 100644
--- a/bfd/srec.c
+++ b/bfd/srec.c
@@ -1262,7 +1262,6 @@ srec_print_symbol (bfd *abfd,
 #define srec_bfd_relax_section			  bfd_generic_relax_section
 #define srec_bfd_gc_sections			  bfd_generic_gc_sections
 #define srec_bfd_lookup_section_flags		  bfd_generic_lookup_section_flags
-#define srec_bfd_merge_sections			  bfd_generic_merge_sections
 #define srec_bfd_is_group_section		  bfd_generic_is_group_section
 #define srec_bfd_group_name			  bfd_generic_group_name
 #define srec_bfd_discard_group			  bfd_generic_discard_group
@@ -1292,6 +1291,7 @@ const bfd_target srec_vec =
   16,				/* AR_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
@@ -1347,6 +1347,7 @@ const bfd_target symbolsrec_vec =
   16,				/* AR_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
diff --git a/bfd/targets.c b/bfd/targets.c
index ee629bbe9df..89557a060e8 100644
--- a/bfd/targets.c
+++ b/bfd/targets.c
@@ -138,6 +138,11 @@ DESCRIPTION
 .#ifndef TARGET_KEEP_UNUSED_SECTION_SYMBOLS
 .#define TARGET_KEEP_UNUSED_SECTION_SYMBOLS true
 .#endif
+.
+.{* Define to TRUE if section merging is supported by the backend.  *}
+.#ifndef TARGET_MERGE_SECTIONS
+.#define TARGET_MERGE_SECTIONS false
+.#endif
 .
 	This is the structure which defines the type of BFD this is.  The
 	<<xvec>> member of the struct <<bfd>> itself points here.  Each
@@ -220,6 +225,9 @@ CODE_FRAGMENT
 . {* TRUE if unused section symbols should be kept.  *}
 .  bool keep_unused_section_symbols;
 .
+.  {* TRUE if section merging is supported by the backend.  *}
+.  bool merge_sections;
+.
 .  {* Entries for byte swapping for data. These are different from the
 .     other entry points, since they don't take a BFD as the first argument.
 .     Certain other handlers could do the same.  *}
@@ -461,7 +469,6 @@ BFD_JUMP_TABLE macros.
 .  NAME##_bfd_link_check_relocs, \
 .  NAME##_bfd_gc_sections, \
 .  NAME##_bfd_lookup_section_flags, \
-.  NAME##_bfd_merge_sections, \
 .  NAME##_bfd_is_group_section, \
 .  NAME##_bfd_group_name, \
 .  NAME##_bfd_discard_group, \
@@ -517,9 +524,6 @@ BFD_JUMP_TABLE macros.
 .  bool (*_bfd_lookup_section_flags) (struct bfd_link_info *,
 .				      struct flag_info *, asection *);
 .
-.  {* Attempt to merge SEC_MERGE sections.  *}
-.  bool (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
-.
 .  {* Is this section a member of a group?  *}
 .  bool (*_bfd_is_group_section) (bfd *, const struct bfd_section *);
 .
diff --git a/bfd/tekhex.c b/bfd/tekhex.c
index 4ac61166d0e..99d40fe936c 100644
--- a/bfd/tekhex.c
+++ b/bfd/tekhex.c
@@ -963,7 +963,6 @@ tekhex_print_symbol (bfd *abfd,
 #define tekhex_bfd_relax_section		    bfd_generic_relax_section
 #define tekhex_bfd_gc_sections			    bfd_generic_gc_sections
 #define tekhex_bfd_lookup_section_flags		    bfd_generic_lookup_section_flags
-#define tekhex_bfd_merge_sections		    bfd_generic_merge_sections
 #define tekhex_bfd_is_group_section		    bfd_generic_is_group_section
 #define tekhex_bfd_group_name			    bfd_generic_group_name
 #define tekhex_bfd_discard_group		    bfd_generic_discard_group
@@ -993,6 +992,7 @@ const bfd_target tekhex_vec =
   16,				/* AR_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
diff --git a/bfd/trad-core.c b/bfd/trad-core.c
index f208fc814c0..054224db526 100644
--- a/bfd/trad-core.c
+++ b/bfd/trad-core.c
@@ -270,6 +270,7 @@ const bfd_target core_trad_vec =
     16,				/* ar_max_namelen */
     0,				/* match priority.  */
     TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+    false,			/* merge sections */
     NO_GET64, NO_GETS64, NO_PUT64,	/* 64 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 32 bit data */
     NO_GET, NO_GETS, NO_PUT,		/* 16 bit data */
diff --git a/bfd/verilog.c b/bfd/verilog.c
index 70cc7c69412..9797a915b29 100644
--- a/bfd/verilog.c
+++ b/bfd/verilog.c
@@ -392,6 +392,7 @@ const bfd_target verilog_vec =
   16,				/* AR_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  false,			/* merge sections */
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
diff --git a/bfd/vms-alpha.c b/bfd/vms-alpha.c
index 277cba0107e..0e557563efb 100644
--- a/bfd/vms-alpha.c
+++ b/bfd/vms-alpha.c
@@ -10201,7 +10201,6 @@ bfd_vms_get_data (bfd *abfd)
 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
 #define alpha_vms_bfd_lookup_section_flags bfd_generic_lookup_section_flags
-#define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
 #define alpha_vms_bfd_group_name bfd_generic_group_name
 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
@@ -10244,6 +10243,7 @@ const bfd_target alpha_vms_vec =
   15,				/* ar_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  TARGET_MERGE_SECTIONS,
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
   bfd_getl16, bfd_getl_signed_16, bfd_putl16,
diff --git a/bfd/vms-lib.c b/bfd/vms-lib.c
index 1206d7e24d4..2ffb4e4acf9 100644
--- a/bfd/vms-lib.c
+++ b/bfd/vms-lib.c
@@ -2425,6 +2425,7 @@ const bfd_target alpha_vms_lib_txt_vec =
   15,				/* ar_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  false,			/* merge sections */
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
   bfd_getl16, bfd_getl_signed_16, bfd_putl16,
diff --git a/bfd/wasm-module.c b/bfd/wasm-module.c
index db4b08147a8..a76b89e0b89 100644
--- a/bfd/wasm-module.c
+++ b/bfd/wasm-module.c
@@ -805,6 +805,7 @@ const bfd_target wasm_vec =
   255,				/* AR_max_namelen.  */
   0,				/* Match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  false,			/* merge sections */
   /* Routines to byte-swap various sized integers from the data sections.  */
   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
diff --git a/bfd/xsym.c b/bfd/xsym.c
index 516ee88e85c..19bea8ad3c6 100644
--- a/bfd/xsym.c
+++ b/bfd/xsym.c
@@ -46,7 +46,6 @@
 #define bfd_sym_bfd_relax_section		    bfd_generic_relax_section
 #define bfd_sym_bfd_gc_sections			    bfd_generic_gc_sections
 #define bfd_sym_bfd_lookup_section_flags	    bfd_generic_lookup_section_flags
-#define bfd_sym_bfd_merge_sections		    bfd_generic_merge_sections
 #define bfd_sym_bfd_is_group_section		    bfd_generic_is_group_section
 #define bfd_sym_bfd_group_name			    bfd_generic_group_name
 #define bfd_sym_bfd_discard_group		    bfd_generic_discard_group
@@ -2299,6 +2298,7 @@ const bfd_target sym_vec =
   16,				/* AR_max_namelen.  */
   0,				/* match priority.  */
   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
+  false,			/* TARGET_MERGE_SECTIONS */
   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* Data.  */
diff --git a/include/bfdlink.h b/include/bfdlink.h
index 0c47d09977f..00fe0f8c7c8 100644
--- a/include/bfdlink.h
+++ b/include/bfdlink.h
@@ -1017,6 +1017,9 @@ struct bfd_link_order_reloc
 /* Allocate a new link_order for a section.  */
 extern struct bfd_link_order *bfd_new_link_order (bfd *, asection *);
 
+/* Attempt to merge SEC_MERGE sections.  */
+extern bool bfd_merge_sections (bfd *, struct bfd_link_info *);
+
 struct bfd_section_already_linked;
 
 extern bool bfd_section_already_linked_table_init (void);


More information about the Binutils-cvs mailing list