[PATCH 7/8] bfd: replace _bfd_merge_sections() hook with simple boolean

Jan Beulich jbeulich@suse.com
Mon Oct 13 09:14:38 GMT 2025


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.
---
With the placement of the TARGET_MERGE_SECTIONS default definition I'm
following TARGET_KEEP_UNUSED_SECTION_SYMBOLS, yet that's somewhat odd.
Format specific settings are generally done only later, requiring an
#undef to be put there first. Which then doesn't really permit target-
specific overrides (for the time being we also don't really need any).

--- a/bfd/aout-target.h
+++ b/bfd/aout-target.h
@@ -495,9 +495,6 @@ MY_bfd_final_link (bfd *abfd, struct bfd
 #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,
--- 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))
 .
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -2708,9 +2708,6 @@ bool bfd_set_private_flags (bfd *abfd, f
 #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 *);
 
--- 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 */
--- 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 */
--- 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,
--- a/bfd/coff-alpha.c
+++ b/bfd/coff-alpha.c
@@ -2445,7 +2445,6 @@ static const struct ecoff_backend_data a
 /* 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 */
--- 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,
--- 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,
--- 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,
--- a/bfd/coff-mips.c
+++ b/bfd/coff-mips.c
@@ -1404,9 +1404,6 @@ static const struct ecoff_backend_data m
 /* 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 */
--- 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,
--- 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,
--- 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 */
--- 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 */
--- 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 */
--- 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,
--- 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,
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -6024,10 +6024,6 @@ static const bfd_coff_backend_data bigob
 #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,				\
--- 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,
--- 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 */
--- 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 */
--- 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 */
--- 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.  */
--- 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 */
--- a/bfd/libbfd-in.h
+++ b/bfd/libbfd-in.h
@@ -489,7 +489,6 @@ extern bool _bfd_nolink_bfd_relax_sectio
 #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_reloca
 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
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -495,7 +495,6 @@ extern bool _bfd_nolink_bfd_relax_sectio
 #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_reloca
 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,
--- 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,
--- a/bfd/merge.c
+++ b/bfd/merge.c
@@ -874,7 +874,7 @@ is_suffix (const struct sec_merge_hash_e
 		 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)
--- 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 */
--- 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.  */
--- 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 */
--- 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.  */
--- 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.  */
--- 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.  */
--- 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,
--- a/bfd/ppcboot.c
+++ b/bfd/ppcboot.c
@@ -454,7 +454,6 @@ ppcboot_bfd_print_private_bfd_data (bfd
 #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 */
--- 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 */
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -8428,26 +8428,6 @@ bfd_generic_lookup_section_flags (struct
 
 /*
 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
 
 SYNOPSIS
--- a/bfd/som.c
+++ b/bfd/som.c
@@ -6771,7 +6771,6 @@ som_bfd_link_split_section (bfd *abfd AT
 #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.  */
--- 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.  */
--- a/bfd/targets.c
+++ b/bfd/targets.c
@@ -139,6 +139,11 @@ DESCRIPTION
 .#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
 	module that implements access to a different target under BFD,
@@ -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 *);
 .
--- 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.  */
--- 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 */
--- 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.  */
--- 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,
--- 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,
--- 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,
--- 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.  */
--- 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 mailing list