PR 30569, always call elf_backend_size_dynamic_sections

Message ID ZgtDqoDoRuqPRfTg@squeak.grove.modra.org
State New
Headers
Series PR 30569, always call elf_backend_size_dynamic_sections |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 fail Patch failed to apply

Commit Message

Alan Modra April 1, 2024, 11:30 p.m. UTC
  This largely mechanical patch is preparation for a followup patch.

For quite some time I've thought that it would be useful to call
elf_backend_size_dynamic_sections even when no dynamic objects are
seen by the linker.  That's what this patch does, with some renaming.
There are no functional changes to the linker, just a move of the
dynobj test in bfd_elf_size_dynamic_sections to target backend
functions, replacing the asserts/aborts already there.  No doubt some
of the current always_size_sections functions could be moved to
size_dynamic_sections but I haven't made that change.

Because both hooks are now always called, I have renamed
always_size_sections to early_size_sections and size_dynamic_sections
to late_size_sections.  I condisdered calling late_size_sections plain
size_sections, since this is the usual target dynamic section sizing
hook, but decided that searching the sources for "size_sections" would
then hit early_size_sections and other functions.
  

Patch

diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index af507b93df5..7ad171d5000 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -1187,7 +1187,7 @@  struct elf_backend_data
   /* The ADJUST_DYNAMIC_SYMBOL function is called by the ELF backend
      linker for every symbol which is defined by a dynamic object and
      referenced by a regular object.  This is called after all the
-     input files have been seen, but before the SIZE_DYNAMIC_SECTIONS
+     input files have been seen, but before the LATE_SIZE_SECTIONS
      function has been called.  The hash table entry should be
      bfd_link_hash_defined ore bfd_link_hash_defweak, and it should be
      defined in a section from a dynamic object.  Dynamic object
@@ -1199,24 +1199,23 @@  struct elf_backend_data
   bool (*elf_backend_adjust_dynamic_symbol)
     (struct bfd_link_info *info, struct elf_link_hash_entry *h);
 
-  /* The ALWAYS_SIZE_SECTIONS function is called by the backend linker
-     after all the linker input files have been seen but before the
-     section sizes have been set.  This is called after
-     ADJUST_DYNAMIC_SYMBOL, but before SIZE_DYNAMIC_SECTIONS.  */
-  bool (*elf_backend_always_size_sections)
+  /* The EARLY_SIZE_SECTIONS and LATE_SIZE_SECTIONS functions are
+     called by the backend linker after all linker input files have
+     been seen and sections have been assigned to output sections, but
+     before the section sizes have been set.  Both of these functions
+     are called even when no dynamic object is seen by the linker.
+     Between them, they must set the sizes of the dynamic sections and
+     other backend specific sections, and may fill in their contents.
+     Most backends need only use LATE_SIZE_SECTIONS.
+     EARLY_SIZE_SECTIONS is called before --export-dynamic makes some
+     symbols dynamic and before ADJUST_DYNAMIC_SYMBOL processes
+     dynamic symbols, LATE_SIZE_SECTIONS afterwards.  The generic ELF
+     linker can handle the .dynsym, .dynstr and .hash sections.
+     Besides those, these functions must handle the .interp section
+     and any other sections created by CREATE_DYNAMIC_SECTIONS.  */
+  bool (*elf_backend_early_size_sections)
     (bfd *output_bfd, struct bfd_link_info *info);
-
-  /* The SIZE_DYNAMIC_SECTIONS function is called by the ELF backend
-     linker after all the linker input files have been seen but before
-     the sections sizes have been set.  This is called after
-     ADJUST_DYNAMIC_SYMBOL has been called on all appropriate symbols.
-     It is only called when linking against a dynamic object.  It must
-     set the sizes of the dynamic sections, and may fill in their
-     contents as well.  The generic ELF linker can handle the .dynsym,
-     .dynstr and .hash sections.  This function must handle the
-     .interp section and any sections created by the
-     CREATE_DYNAMIC_SECTIONS entry point.  */
-  bool (*elf_backend_size_dynamic_sections)
+  bool (*elf_backend_late_size_sections)
     (bfd *output_bfd, struct bfd_link_info *info);
 
   /* The STRIP_ZERO_SIZED_DYNAMIC_SECTIONS function is called by the
diff --git a/bfd/elf-m10300.c b/bfd/elf-m10300.c
index 24ea43a777d..aa387fc4130 100644
--- a/bfd/elf-m10300.c
+++ b/bfd/elf-m10300.c
@@ -5015,8 +5015,8 @@  _bfd_mn10300_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-_bfd_mn10300_elf_size_dynamic_sections (bfd * output_bfd,
-					struct bfd_link_info * info)
+_bfd_mn10300_elf_late_size_sections (bfd * output_bfd,
+				     struct bfd_link_info * info)
 {
   struct elf32_mn10300_link_hash_table *htab = elf32_mn10300_hash_table (info);
   bfd * dynobj;
@@ -5024,7 +5024,8 @@  _bfd_mn10300_elf_size_dynamic_sections (bfd * output_bfd,
   bool relocs;
 
   dynobj = htab->root.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -5511,8 +5512,8 @@  mn10300_elf_mkobject (bfd *abfd)
   _bfd_mn10300_elf_create_dynamic_sections
 #define elf_backend_adjust_dynamic_symbol \
   _bfd_mn10300_elf_adjust_dynamic_symbol
-#define elf_backend_size_dynamic_sections \
-  _bfd_mn10300_elf_size_dynamic_sections
+#define elf_backend_late_size_sections \
+  _bfd_mn10300_elf_late_size_sections
 #define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
 #define elf_backend_finish_dynamic_symbol \
   _bfd_mn10300_elf_finish_dynamic_symbol
diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c
index 5727bfbf889..7e94373773b 100644
--- a/bfd/elf32-arc.c
+++ b/bfd/elf32-arc.c
@@ -2712,8 +2712,8 @@  elf_arc_finish_dynamic_sections (bfd * output_bfd,
 
 /* Set the sizes of the dynamic sections.  */
 static bool
-elf_arc_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-			       struct bfd_link_info *info)
+elf_arc_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			    struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
@@ -2721,7 +2721,8 @@  elf_arc_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   struct elf_link_hash_table *htab = elf_hash_table (info);
 
   dynobj = htab->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (htab->dynamic_sections_created)
     {
@@ -3137,7 +3138,7 @@  arc_elf_relax_section (bfd *abfd, asection *sec,
 #define elf_backend_finish_dynamic_symbol    elf_arc_finish_dynamic_symbol
 
 #define elf_backend_finish_dynamic_sections  elf_arc_finish_dynamic_sections
-#define elf_backend_size_dynamic_sections    elf_arc_size_dynamic_sections
+#define elf_backend_late_size_sections       elf_arc_late_size_sections
 
 #define elf_backend_can_gc_sections	1
 #define elf_backend_want_got_plt	1
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 779c7081c53..2dc6670e012 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -16725,8 +16725,8 @@  bfd_elf32_arm_set_byteswap_code (struct bfd_link_info *info,
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
-				 struct bfd_link_info * info)
+elf32_arm_late_size_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
+			      struct bfd_link_info * info)
 {
   bfd * dynobj;
   asection * s;
@@ -16739,7 +16739,9 @@  elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
     return false;
 
   dynobj = elf_hash_table (info)->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
+
   check_use_blx (htab);
 
   if (elf_hash_table (info)->dynamic_sections_created)
@@ -17111,8 +17113,7 @@  elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
    _TLS_MODULE_BASE_, if needed.  */
 
 static bool
-elf32_arm_always_size_sections (bfd *output_bfd,
-				struct bfd_link_info *info)
+elf32_arm_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   asection *tls_sec;
   struct elf32_arm_link_hash_table *htab;
@@ -20312,8 +20313,8 @@  elf32_arm_backend_symbol_processing (bfd *abfd, asymbol *sym)
 #define elf_backend_create_dynamic_sections	elf32_arm_create_dynamic_sections
 #define elf_backend_finish_dynamic_symbol	elf32_arm_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections	elf32_arm_finish_dynamic_sections
-#define elf_backend_size_dynamic_sections	elf32_arm_size_dynamic_sections
-#define elf_backend_always_size_sections	elf32_arm_always_size_sections
+#define elf_backend_late_size_sections		elf32_arm_late_size_sections
+#define elf_backend_early_size_sections		elf32_arm_early_size_sections
 #define elf_backend_init_index_section		_bfd_elf_init_2_index_sections
 #define elf_backend_init_file_header		elf32_arm_init_file_header
 #define elf_backend_reloc_type_class		elf32_arm_reloc_type_class
diff --git a/bfd/elf32-bfin.c b/bfd/elf32-bfin.c
index 78402526520..f0e650d7e60 100644
--- a/bfd/elf32-bfin.c
+++ b/bfd/elf32-bfin.c
@@ -4027,8 +4027,8 @@  _bfinfdpic_size_got_plt (bfd *output_bfd,
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd,
-				      struct bfd_link_info *info)
+elf32_bfinfdpic_late_size_sections (bfd *output_bfd,
+				    struct bfd_link_info *info)
 {
   struct elf_link_hash_table *htab;
   bfd *dynobj;
@@ -4037,7 +4037,8 @@  elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd,
 
   htab = elf_hash_table (info);
   dynobj = htab->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (htab->dynamic_sections_created)
     {
@@ -4086,7 +4087,7 @@  elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd,
 }
 
 static bool
-elf32_bfinfdpic_always_size_sections (bfd *output_bfd,
+elf32_bfinfdpic_early_size_sections (bfd *output_bfd,
 				     struct bfd_link_info *info)
 {
   if (!bfd_link_relocatable (info)
@@ -5123,15 +5124,16 @@  bfin_discard_copies (struct elf_link_hash_entry *h, void * inf)
 }
 
 static bool
-bfin_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
-			    struct bfd_link_info *info)
+bfin_late_size_sections (bfd * output_bfd ATTRIBUTE_UNUSED,
+			 struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
   bool relocs;
 
   dynobj = elf_hash_table (info)->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -5423,8 +5425,7 @@  struct bfd_elf_special_section const elf32_bfin_special_sections[] =
 #define elf_backend_check_relocs	bfin_check_relocs
 #define elf_backend_adjust_dynamic_symbol \
 					bfin_adjust_dynamic_symbol
-#define elf_backend_size_dynamic_sections \
-					bfin_size_dynamic_sections
+#define elf_backend_late_size_sections	bfin_late_size_sections
 #define elf_backend_relocate_section	bfin_relocate_section
 #define elf_backend_finish_dynamic_symbol \
 					bfin_finish_dynamic_symbol
@@ -5470,9 +5471,9 @@  struct bfd_elf_special_section const elf32_bfin_special_sections[] =
 #undef bfd_elf32_bfd_link_hash_table_create
 #define bfd_elf32_bfd_link_hash_table_create \
 		bfinfdpic_elf_link_hash_table_create
-#undef elf_backend_always_size_sections
-#define elf_backend_always_size_sections \
-		elf32_bfinfdpic_always_size_sections
+#undef elf_backend_early_size_sections
+#define elf_backend_early_size_sections \
+		elf32_bfinfdpic_early_size_sections
 
 #undef elf_backend_create_dynamic_sections
 #define elf_backend_create_dynamic_sections \
@@ -5480,9 +5481,9 @@  struct bfd_elf_special_section const elf32_bfin_special_sections[] =
 #undef elf_backend_adjust_dynamic_symbol
 #define elf_backend_adjust_dynamic_symbol \
 		elf32_bfinfdpic_adjust_dynamic_symbol
-#undef elf_backend_size_dynamic_sections
-#define elf_backend_size_dynamic_sections \
-		elf32_bfinfdpic_size_dynamic_sections
+#undef elf_backend_late_size_sections
+#define elf_backend_late_size_sections \
+		elf32_bfinfdpic_late_size_sections
 #undef elf_backend_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_symbol \
 		elf32_bfinfdpic_finish_dynamic_symbol
diff --git a/bfd/elf32-cr16.c b/bfd/elf32-cr16.c
index da3f6834882..f622fc708fb 100644
--- a/bfd/elf32-cr16.c
+++ b/bfd/elf32-cr16.c
@@ -2391,15 +2391,16 @@  _bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info,
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-_bfd_cr16_elf_size_dynamic_sections (bfd * output_bfd,
-				     struct bfd_link_info * info)
+_bfd_cr16_elf_late_size_sections (bfd * output_bfd,
+				  struct bfd_link_info * info)
 {
   bfd * dynobj;
   asection * s;
   bool relocs;
 
   dynobj = elf_hash_table (info)->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -2836,8 +2837,8 @@  _bfd_cr16_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSE
 				  _bfd_cr16_elf_create_dynamic_sections
 #define elf_backend_adjust_dynamic_symbol \
 				  _bfd_cr16_elf_adjust_dynamic_symbol
-#define elf_backend_size_dynamic_sections \
-				  _bfd_cr16_elf_size_dynamic_sections
+#define elf_backend_late_size_sections \
+				  _bfd_cr16_elf_late_size_sections
 #define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
 #define elf_backend_finish_dynamic_symbol \
 				   _bfd_cr16_elf_finish_dynamic_symbol
diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c
index e2e402a593e..8b10dae21b3 100644
--- a/bfd/elf32-cris.c
+++ b/bfd/elf32-cris.c
@@ -2525,7 +2525,7 @@  cris_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED, const asection *plt,
    entry but we found we will not create any.  Called when we find we will
    not have any PLT for this symbol, by for example
    elf_cris_adjust_dynamic_symbol when we're doing a proper dynamic link,
-   or elf_cris_size_dynamic_sections if no dynamic sections will be
+   or elf_cris_late_size_sections if no dynamic sections will be
    created (we're only linking static objects).  */
 
 static bool
@@ -3506,8 +3506,8 @@  cris_elf_check_relocs (bfd *abfd,
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf_cris_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				struct bfd_link_info *info)
+elf_cris_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			     struct bfd_link_info *info)
 {
   struct elf_cris_link_hash_table * htab;
   bfd *dynobj;
@@ -3519,7 +3519,8 @@  elf_cris_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
     return false;
 
   dynobj = htab->root.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (htab->root.dynamic_sections_created)
     {
@@ -4088,8 +4089,8 @@  elf_cris_got_elt_size (bfd *abfd ATTRIBUTE_UNUSED,
 	elf_cris_adjust_dynamic_symbol
 #define elf_backend_copy_indirect_symbol \
 	elf_cris_copy_indirect_symbol
-#define elf_backend_size_dynamic_sections \
-	elf_cris_size_dynamic_sections
+#define elf_backend_late_size_sections \
+	elf_cris_late_size_sections
 #define elf_backend_init_index_section		_bfd_elf_init_1_index_section
 #define elf_backend_finish_dynamic_symbol \
 	elf_cris_finish_dynamic_symbol
diff --git a/bfd/elf32-csky.c b/bfd/elf32-csky.c
index 6f8a787dae8..ff92cbf6b0d 100644
--- a/bfd/elf32-csky.c
+++ b/bfd/elf32-csky.c
@@ -1893,8 +1893,8 @@  csky_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-csky_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				struct bfd_link_info *info)
+csky_elf_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			     struct bfd_link_info *info)
 {
   struct csky_elf_link_hash_table *htab;
   bfd *dynobj;
@@ -1907,7 +1907,7 @@  csky_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
     return false;
   dynobj = htab->elf.dynobj;
   if (dynobj == NULL)
-    return false;
+    return true;
 
   if (htab->elf.dynamic_sections_created)
     {
@@ -5331,7 +5331,7 @@  elf32_csky_obj_attrs_handle_unknown (bfd *abfd ATTRIBUTE_UNUSED,
 /* Dynamic relocate related API.  */
 #define elf_backend_create_dynamic_sections   _bfd_elf_create_dynamic_sections
 #define elf_backend_adjust_dynamic_symbol     csky_elf_adjust_dynamic_symbol
-#define elf_backend_size_dynamic_sections     csky_elf_size_dynamic_sections
+#define elf_backend_late_size_sections        csky_elf_late_size_sections
 #define elf_backend_finish_dynamic_symbol     csky_elf_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections   csky_elf_finish_dynamic_sections
 #define elf_backend_rela_normal               1
diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c
index 5b66b074b9d..718b7da8d68 100644
--- a/bfd/elf32-frv.c
+++ b/bfd/elf32-frv.c
@@ -5423,15 +5423,16 @@  _frvfdpic_size_got_plt (bfd *output_bfd,
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf32_frvfdpic_size_dynamic_sections (bfd *output_bfd,
-				      struct bfd_link_info *info)
+elf32_frvfdpic_late_size_sections (bfd *output_bfd,
+				   struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
   struct _frvfdpic_dynamic_got_plt_info gpinfo;
 
   dynobj = elf_hash_table (info)->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -5472,8 +5473,8 @@  elf32_frvfdpic_size_dynamic_sections (bfd *output_bfd,
 }
 
 static bool
-elf32_frvfdpic_always_size_sections (bfd *output_bfd,
-				     struct bfd_link_info *info)
+elf32_frvfdpic_early_size_sections (bfd *output_bfd,
+				    struct bfd_link_info *info)
 {
   if (!bfd_link_relocatable (info)
       && !bfd_elf_stack_segment_size (output_bfd, info,
@@ -6817,9 +6818,9 @@  elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 #undef bfd_elf32_bfd_link_hash_table_create
 #define bfd_elf32_bfd_link_hash_table_create \
 		frvfdpic_elf_link_hash_table_create
-#undef elf_backend_always_size_sections
-#define elf_backend_always_size_sections \
-		elf32_frvfdpic_always_size_sections
+#undef elf_backend_early_size_sections
+#define elf_backend_early_size_sections \
+		elf32_frvfdpic_early_size_sections
 
 #undef elf_backend_create_dynamic_sections
 #define elf_backend_create_dynamic_sections \
@@ -6827,9 +6828,9 @@  elf32_frv_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 #undef elf_backend_adjust_dynamic_symbol
 #define elf_backend_adjust_dynamic_symbol \
 		elf32_frvfdpic_adjust_dynamic_symbol
-#undef elf_backend_size_dynamic_sections
-#define elf_backend_size_dynamic_sections \
-		elf32_frvfdpic_size_dynamic_sections
+#undef elf_backend_late_size_sections
+#define elf_backend_late_size_sections \
+		elf32_frvfdpic_late_size_sections
 #undef bfd_elf32_bfd_relax_section
 #define bfd_elf32_bfd_relax_section \
   elf32_frvfdpic_relax_section
diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
index bb4bfdc00b8..4f9859ae9f1 100644
--- a/bfd/elf32-hppa.c
+++ b/bfd/elf32-hppa.c
@@ -2042,8 +2042,8 @@  clobber_millicode_symbols (struct elf_link_hash_entry *eh,
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				  struct bfd_link_info *info)
+elf32_hppa_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			       struct bfd_link_info *info)
 {
   struct elf32_hppa_link_hash_table *htab;
   bfd *dynobj;
@@ -2057,7 +2057,7 @@  elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
   dynobj = htab->etab.dynobj;
   if (dynobj == NULL)
-    abort ();
+    return true;
 
   if (htab->etab.dynamic_sections_created)
     {
@@ -4450,7 +4450,7 @@  elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
 #define elf_backend_hide_symbol		     elf32_hppa_hide_symbol
 #define elf_backend_finish_dynamic_symbol    elf32_hppa_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections  elf32_hppa_finish_dynamic_sections
-#define elf_backend_size_dynamic_sections    elf32_hppa_size_dynamic_sections
+#define elf_backend_late_size_sections	     elf32_hppa_late_size_sections
 #define elf_backend_init_index_section	     _bfd_elf_init_1_index_section
 #define elf_backend_gc_mark_hook	     elf32_hppa_gc_mark_hook
 #define elf_backend_grok_prstatus	     elf32_hppa_grok_prstatus
diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
index 703a48c2c0a..9fa568fa979 100644
--- a/bfd/elf32-i386.c
+++ b/bfd/elf32-i386.c
@@ -1957,8 +1957,7 @@  elf_i386_scan_relocs (bfd *abfd,
 }
 
 static bool
-elf_i386_always_size_sections (bfd *output_bfd,
-			       struct bfd_link_info *info)
+elf_i386_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   bfd *abfd;
 
@@ -1971,7 +1970,7 @@  elf_i386_always_size_sections (bfd *output_bfd,
 					     elf_i386_scan_relocs))
       return false;
 
-  return _bfd_x86_elf_always_size_sections (output_bfd, info);
+  return _bfd_x86_elf_early_size_sections (output_bfd, info);
 }
 
 /* Set the correct type for an x86 ELF section.  We do this by the
@@ -4477,7 +4476,7 @@  elf_i386_link_setup_gnu_properties (struct bfd_link_info *info)
 #define bfd_elf32_get_synthetic_symtab	      elf_i386_get_synthetic_symtab
 
 #define elf_backend_relocs_compatible	      _bfd_elf_relocs_compatible
-#define elf_backend_always_size_sections      elf_i386_always_size_sections
+#define elf_backend_early_size_sections	      elf_i386_early_size_sections
 #define elf_backend_create_dynamic_sections   _bfd_elf_create_dynamic_sections
 #define elf_backend_fake_sections	      elf_i386_fake_sections
 #define elf_backend_finish_dynamic_sections   elf_i386_finish_dynamic_sections
diff --git a/bfd/elf32-lm32.c b/bfd/elf32-lm32.c
index b0eaa06180f..e62e5fd1d46 100644
--- a/bfd/elf32-lm32.c
+++ b/bfd/elf32-lm32.c
@@ -1904,8 +1904,8 @@  allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-lm32_elf_size_dynamic_sections (bfd *output_bfd,
-				struct bfd_link_info *info)
+lm32_elf_late_size_sections (bfd *output_bfd,
+			     struct bfd_link_info *info)
 {
   struct elf_lm32_link_hash_table *htab;
   bfd *dynobj;
@@ -1918,7 +1918,8 @@  lm32_elf_size_dynamic_sections (bfd *output_bfd,
     return false;
 
   dynobj = htab->root.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (htab->root.dynamic_sections_created)
     {
@@ -2307,7 +2308,7 @@  lm32_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
 }
 
 static bool
-lm32_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
+lm32_elf_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   if (!bfd_link_relocatable (info))
     {
@@ -2393,7 +2394,7 @@  lm32_elf_fdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 #define bfd_elf32_bfd_link_hash_table_create	lm32_elf_link_hash_table_create
 #define elf_backend_check_relocs		lm32_elf_check_relocs
 #define elf_backend_reloc_type_class		lm32_elf_reloc_type_class
-#define elf_backend_size_dynamic_sections	lm32_elf_size_dynamic_sections
+#define elf_backend_late_size_sections		lm32_elf_late_size_sections
 #define elf_backend_omit_section_dynsym		_bfd_elf_omit_section_dynsym_all
 #define elf_backend_create_dynamic_sections	lm32_elf_create_dynamic_sections
 #define elf_backend_finish_dynamic_sections	lm32_elf_finish_dynamic_sections
@@ -2414,8 +2415,8 @@  lm32_elf_fdpic_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
 #undef	elf32_bed
 #define	elf32_bed		elf32_lm32fdpic_bed
 
-#undef	elf_backend_always_size_sections
-#define elf_backend_always_size_sections	lm32_elf_always_size_sections
+#undef	elf_backend_early_size_sections
+#define elf_backend_early_size_sections		lm32_elf_early_size_sections
 #undef	bfd_elf32_bfd_copy_private_bfd_data
 #define bfd_elf32_bfd_copy_private_bfd_data	lm32_elf_fdpic_copy_private_bfd_data
 
diff --git a/bfd/elf32-m32c.c b/bfd/elf32-m32c.c
index 8a7cf463ab7..9607652a257 100644
--- a/bfd/elf32-m32c.c
+++ b/bfd/elf32-m32c.c
@@ -773,8 +773,8 @@  m32c_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
 }
 
 static bool
-m32c_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-			       struct bfd_link_info *info)
+m32c_elf_early_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			      struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *splt;
@@ -2132,8 +2132,8 @@  _bfd_m32c_elf_eh_frame_address_size (bfd *abfd,
 #define elf_backend_check_relocs		m32c_elf_check_relocs
 #define elf_backend_object_p			m32c_elf_object_p
 #define elf_symbol_leading_char			('_')
-#define elf_backend_always_size_sections \
-  m32c_elf_always_size_sections
+#define elf_backend_early_size_sections \
+  m32c_elf_early_size_sections
 #define elf_backend_finish_dynamic_sections \
   m32c_elf_finish_dynamic_sections
 
diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c
index ab2f45a8946..a02645a8358 100644
--- a/bfd/elf32-m32r.c
+++ b/bfd/elf32-m32r.c
@@ -1958,8 +1958,8 @@  allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-m32r_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				struct bfd_link_info *info)
+m32r_elf_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			     struct bfd_link_info *info)
 {
   struct elf_link_hash_table *htab;
   bfd *dynobj;
@@ -1968,7 +1968,7 @@  m32r_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   bfd *ibfd;
 
 #ifdef DEBUG_PIC
-  printf ("m32r_elf_size_dynamic_sections()\n");
+  printf ("m32r_elf_late_size_sections()\n");
 #endif
 
   htab = m32r_elf_hash_table (info);
@@ -1976,7 +1976,8 @@  m32r_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
     return false;
 
   dynobj = htab->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (htab->dynamic_sections_created)
     {
@@ -3656,7 +3657,7 @@  m32r_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
 
 #define elf_backend_create_dynamic_sections	m32r_elf_create_dynamic_sections
 #define bfd_elf32_bfd_link_hash_table_create	m32r_elf_link_hash_table_create
-#define elf_backend_size_dynamic_sections	m32r_elf_size_dynamic_sections
+#define elf_backend_late_size_sections		m32r_elf_late_size_sections
 #define elf_backend_omit_section_dynsym		_bfd_elf_omit_section_dynsym_all
 #define elf_backend_finish_dynamic_sections	m32r_elf_finish_dynamic_sections
 #define elf_backend_adjust_dynamic_symbol	m32r_elf_adjust_dynamic_symbol
diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c
index 240b4efab88..6355ae92a3c 100644
--- a/bfd/elf32-m68k.c
+++ b/bfd/elf32-m68k.c
@@ -2934,7 +2934,7 @@  elf_m68k_get_plt_info (bfd *output_bfd)
    It's a convenient place to determine the PLT style.  */
 
 static bool
-elf_m68k_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
+elf_m68k_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   /* Bind input BFDs to GOTs and calculate sizes of .got and .rela.got
      sections.  */
@@ -3107,15 +3107,16 @@  elf_m68k_adjust_dynamic_symbol (struct bfd_link_info *info,
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				struct bfd_link_info *info)
+elf_m68k_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			     struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
   bool relocs;
 
   dynobj = elf_hash_table (info)->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -4628,12 +4629,11 @@  elf_m68k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 #define bfd_elf32_bfd_final_link	bfd_elf_final_link
 
 #define elf_backend_check_relocs	elf_m68k_check_relocs
-#define elf_backend_always_size_sections \
-					elf_m68k_always_size_sections
+#define elf_backend_early_size_sections \
+					elf_m68k_early_size_sections
 #define elf_backend_adjust_dynamic_symbol \
 					elf_m68k_adjust_dynamic_symbol
-#define elf_backend_size_dynamic_sections \
-					elf_m68k_size_dynamic_sections
+#define elf_backend_late_size_sections	elf_m68k_late_size_sections
 #define elf_backend_final_write_processing	elf_m68k_final_write_processing
 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
 #define elf_backend_relocate_section	elf_m68k_relocate_section
diff --git a/bfd/elf32-metag.c b/bfd/elf32-metag.c
index de14dfe5c56..2821be43c44 100644
--- a/bfd/elf32-metag.c
+++ b/bfd/elf32-metag.c
@@ -2717,8 +2717,8 @@  allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				 struct bfd_link_info *info)
+elf_metag_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			      struct bfd_link_info *info)
 {
   struct elf_metag_link_hash_table *htab;
   bfd *dynobj;
@@ -2729,7 +2729,7 @@  elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   htab = metag_link_hash_table (info);
   dynobj = htab->etab.dynobj;
   if (dynobj == NULL)
-    abort ();
+    return true;
 
   if (htab->etab.dynamic_sections_created)
     {
@@ -4019,7 +4019,7 @@  elf_metag_plt_sym_val (bfd_vma i, const asection *plt,
 #define elf_backend_adjust_dynamic_symbol	elf_metag_adjust_dynamic_symbol
 #define elf_backend_finish_dynamic_symbol	elf_metag_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections	elf_metag_finish_dynamic_sections
-#define elf_backend_size_dynamic_sections	elf_metag_size_dynamic_sections
+#define elf_backend_late_size_sections		elf_metag_late_size_sections
 #define elf_backend_omit_section_dynsym \
 	_bfd_elf_omit_section_dynsym_all
 #define elf_backend_init_file_header		elf_metag_init_file_header
diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c
index fd2855d4f9f..ce2064a75df 100644
--- a/bfd/elf32-microblaze.c
+++ b/bfd/elf32-microblaze.c
@@ -2966,8 +2966,8 @@  allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-microblaze_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				      struct bfd_link_info *info)
+microblaze_elf_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+				   struct bfd_link_info *info)
 {
   struct elf32_mb_link_hash_table *htab;
   bfd *dynobj;
@@ -2979,7 +2979,8 @@  microblaze_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
     return false;
 
   dynobj = htab->elf.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   /* Set up .got offsets for local syms, and space for local dynamic
      relocs.  */
@@ -3495,7 +3496,7 @@  microblaze_elf_add_symbol_hook (bfd *abfd,
 #define elf_backend_create_dynamic_sections	_bfd_elf_create_dynamic_sections
 #define elf_backend_finish_dynamic_sections	microblaze_elf_finish_dynamic_sections
 #define elf_backend_finish_dynamic_symbol	microblaze_elf_finish_dynamic_symbol
-#define elf_backend_size_dynamic_sections	microblaze_elf_size_dynamic_sections
+#define elf_backend_late_size_sections		microblaze_elf_late_size_sections
 #define elf_backend_add_symbol_hook		microblaze_elf_add_symbol_hook
 
 #include "elf32-target.h"
diff --git a/bfd/elf32-mips.c b/bfd/elf32-mips.c
index 63d7334dd52..8d18a318643 100644
--- a/bfd/elf32-mips.c
+++ b/bfd/elf32-mips.c
@@ -2537,10 +2537,8 @@  static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
 #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
 #define elf_backend_adjust_dynamic_symbol \
 					_bfd_mips_elf_adjust_dynamic_symbol
-#define elf_backend_always_size_sections \
-					_bfd_mips_elf_always_size_sections
-#define elf_backend_size_dynamic_sections \
-					_bfd_mips_elf_size_dynamic_sections
+#define elf_backend_early_size_sections	_bfd_mips_elf_early_size_sections
+#define elf_backend_late_size_sections	_bfd_mips_elf_late_size_sections
 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
 #define elf_backend_relocate_section	_bfd_mips_elf_relocate_section
 #define elf_backend_finish_dynamic_symbol \
diff --git a/bfd/elf32-nds32.c b/bfd/elf32-nds32.c
index f8a6836d599..b0b9b9bc9fd 100644
--- a/bfd/elf32-nds32.c
+++ b/bfd/elf32-nds32.c
@@ -4302,8 +4302,8 @@  elf32_nds32_add_dynreloc (bfd *output_bfd,
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-nds32_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				 struct bfd_link_info *info)
+nds32_elf_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			      struct bfd_link_info *info)
 {
   struct elf_nds32_link_hash_table *htab;
   bfd *dynobj;
@@ -4316,7 +4316,8 @@  nds32_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
     return false;
 
   dynobj = elf_hash_table (info)->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -13984,7 +13985,7 @@  nds32_elf_unify_tls_model (bfd *inbfd, asection *insec, bfd_byte *incontents,
 #define elf_backend_create_dynamic_sections	nds32_elf_create_dynamic_sections
 #define elf_backend_finish_dynamic_sections	nds32_elf_finish_dynamic_sections
 #define elf_backend_finish_dynamic_symbol	nds32_elf_finish_dynamic_symbol
-#define elf_backend_size_dynamic_sections	nds32_elf_size_dynamic_sections
+#define elf_backend_late_size_sections		nds32_elf_late_size_sections
 #define elf_backend_relocate_section		nds32_elf_relocate_section
 #define elf_backend_gc_mark_hook		nds32_elf_gc_mark_hook
 #define elf_backend_grok_prstatus		nds32_elf_grok_prstatus
diff --git a/bfd/elf32-nios2.c b/bfd/elf32-nios2.c
index 7f61e2f8507..f6580af9519 100644
--- a/bfd/elf32-nios2.c
+++ b/bfd/elf32-nios2.c
@@ -5413,7 +5413,7 @@  nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info,
   return true;
 }
 
-/* Worker function for nios2_elf32_size_dynamic_sections.  */
+/* Worker function for nios2_elf32_late_size_sections.  */
 static bool
 adjust_dynrelocs (struct elf_link_hash_entry *h, void *inf)
 {
@@ -5440,7 +5440,7 @@  adjust_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   return true;
 }
 
-/* Another worker function for nios2_elf32_size_dynamic_sections.
+/* Another worker function for nios2_elf32_late_size_sections.
    Allocate space in .plt, .got and associated reloc sections for
    dynamic relocs.  */
 static bool
@@ -5675,11 +5675,11 @@  allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   return true;
 }
 
-/* Implement elf_backend_size_dynamic_sections:
+/* Implement elf_backend_late_size_sections:
    Set the sizes of the dynamic sections.  */
 static bool
-nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				   struct bfd_link_info *info)
+nios2_elf32_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+				struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
@@ -5689,7 +5689,8 @@  nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
   htab = elf32_nios2_hash_table (info);
   dynobj = htab->root.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   htab->res_n_size = 0;
   if (htab->root.dynamic_sections_created)
@@ -6060,7 +6061,7 @@  const struct bfd_elf_special_section elf32_nios2_special_sections[] =
 					  nios2_elf32_finish_dynamic_sections
 #define elf_backend_adjust_dynamic_symbol nios2_elf32_adjust_dynamic_symbol
 #define elf_backend_reloc_type_class	  nios2_elf32_reloc_type_class
-#define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
+#define elf_backend_late_size_sections	  nios2_elf32_late_size_sections
 #define elf_backend_add_symbol_hook	  nios2_elf_add_symbol_hook
 #define elf_backend_copy_indirect_symbol  nios2_elf32_copy_indirect_symbol
 #define elf_backend_object_p		  nios2_elf32_object_p
diff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c
index 358d2e3940f..f6c922016f7 100644
--- a/bfd/elf32-or1k.c
+++ b/bfd/elf32-or1k.c
@@ -3045,8 +3045,8 @@  allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				struct bfd_link_info *info)
+or1k_elf_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			     struct bfd_link_info *info)
 {
   struct elf_or1k_link_hash_table *htab;
   bfd *dynobj;
@@ -3059,7 +3059,8 @@  or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
     return false;
 
   dynobj = htab->root.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (htab->root.dynamic_sections_created)
     {
@@ -3412,7 +3413,7 @@  or1k_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 #define elf_backend_copy_indirect_symbol	or1k_elf_copy_indirect_symbol
 #define elf_backend_create_dynamic_sections	_bfd_elf_create_dynamic_sections
 #define elf_backend_finish_dynamic_sections	or1k_elf_finish_dynamic_sections
-#define elf_backend_size_dynamic_sections	or1k_elf_size_dynamic_sections
+#define elf_backend_late_size_sections		or1k_elf_late_size_sections
 #define elf_backend_adjust_dynamic_symbol	or1k_elf_adjust_dynamic_symbol
 #define elf_backend_finish_dynamic_symbol	or1k_elf_finish_dynamic_symbol
 
diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 68e17c8babb..a5370a0624e 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -5479,8 +5479,8 @@  static const unsigned char glink_eh_frame_cie[] =
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-ppc_elf_size_dynamic_sections (bfd *output_bfd,
-			       struct bfd_link_info *info)
+ppc_elf_late_size_sections (bfd *output_bfd,
+			    struct bfd_link_info *info)
 {
   struct ppc_elf_link_hash_table *htab;
   asection *s;
@@ -5488,11 +5488,12 @@  ppc_elf_size_dynamic_sections (bfd *output_bfd,
   bfd *ibfd;
 
 #ifdef DEBUG
-  fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
+  fprintf (stderr, "ppc_elf_late_size_sections called\n");
 #endif
 
   htab = ppc_elf_hash_table (info);
-  BFD_ASSERT (htab->elf.dynobj != NULL);
+  if (htab->elf.dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -10433,7 +10434,7 @@  ppc_elf_finish_dynamic_sections (bfd *output_bfd,
 #define elf_backend_copy_indirect_symbol	ppc_elf_copy_indirect_symbol
 #define elf_backend_adjust_dynamic_symbol	ppc_elf_adjust_dynamic_symbol
 #define elf_backend_add_symbol_hook		ppc_elf_add_symbol_hook
-#define elf_backend_size_dynamic_sections	ppc_elf_size_dynamic_sections
+#define elf_backend_late_size_sections		ppc_elf_late_size_sections
 #define elf_backend_hash_symbol			ppc_elf_hash_symbol
 #define elf_backend_finish_dynamic_symbol	ppc_elf_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections	ppc_elf_finish_dynamic_sections
diff --git a/bfd/elf32-rl78.c b/bfd/elf32-rl78.c
index 8e8fd8b31e1..49b97a20fe3 100644
--- a/bfd/elf32-rl78.c
+++ b/bfd/elf32-rl78.c
@@ -1440,8 +1440,8 @@  rl78_elf_finish_dynamic_sections (bfd *abfd ATTRIBUTE_UNUSED,
 }
 
 static bool
-rl78_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-			       struct bfd_link_info *info)
+rl78_elf_early_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			      struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *splt;
@@ -2610,8 +2610,8 @@  rl78_elf_relax_section (bfd *abfd,
 
 #define bfd_elf32_bfd_relax_section		rl78_elf_relax_section
 #define elf_backend_check_relocs		rl78_elf_check_relocs
-#define elf_backend_always_size_sections \
-  rl78_elf_always_size_sections
+#define elf_backend_early_size_sections \
+  rl78_elf_early_size_sections
 #define elf_backend_finish_dynamic_sections \
   rl78_elf_finish_dynamic_sections
 
diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c
index bd9eb1ea31b..2b97b7d2aec 100644
--- a/bfd/elf32-s390.c
+++ b/bfd/elf32-s390.c
@@ -1366,7 +1366,7 @@  elf_s390_gc_mark_hook (asection *sec,
    entry but we found we will not create any.  Called when we find we will
    not have any PLT for this symbol, by for example
    elf_s390_adjust_dynamic_symbol when we're doing a proper dynamic link,
-   or elf_s390_size_dynamic_sections if no dynamic sections will be
+   or elf_s390_late_size_sections if no dynamic sections will be
    created (we're only linking static objects).  */
 
 static void
@@ -1776,8 +1776,8 @@  allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				struct bfd_link_info *info)
+elf_s390_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			     struct bfd_link_info *info)
 {
   struct elf_s390_link_hash_table *htab;
   bfd *dynobj;
@@ -1788,7 +1788,7 @@  elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   htab = elf_s390_hash_table (info);
   dynobj = htab->elf.dynobj;
   if (dynobj == NULL)
-    abort ();
+    return true;
 
   if (htab->elf.dynamic_sections_created)
     {
@@ -3925,7 +3925,7 @@  elf32_s390_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
 #define elf_backend_gc_mark_hook	      elf_s390_gc_mark_hook
 #define elf_backend_reloc_type_class	      elf_s390_reloc_type_class
 #define elf_backend_relocate_section	      elf_s390_relocate_section
-#define elf_backend_size_dynamic_sections     elf_s390_size_dynamic_sections
+#define elf_backend_late_size_sections	      elf_s390_late_size_sections
 #define elf_backend_init_index_section	      _bfd_elf_init_1_index_section
 #define elf_backend_grok_prstatus	      elf_s390_grok_prstatus
 #define elf_backend_grok_psinfo		      elf_s390_grok_psinfo
diff --git a/bfd/elf32-score.c b/bfd/elf32-score.c
index 0c4a29f336c..a3e22c3e564 100644
--- a/bfd/elf32-score.c
+++ b/bfd/elf32-score.c
@@ -1089,7 +1089,7 @@  score_elf_got_info (bfd *abfd, asection **sgotp)
    appear towards the end.  This reduces the amount of GOT space
    required.  MAX_LOCAL is used to set the number of local symbols
    known to be in the dynamic symbol table.  During
-   s3_bfd_score_elf_size_dynamic_sections, this value is 1.  Afterward, the
+   s3_bfd_score_elf_late_size_sections, this value is 1.  Afterward, the
    section symbols are added and the count is higher.  */
 static bool
 score_elf_sort_hash_table (struct bfd_link_info *info,
@@ -3160,8 +3160,8 @@  s3_bfd_score_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
 /* This function is called after all the input files have been read,
    and the input sections have been assigned to output sections.  */
 static bool
-s3_bfd_score_elf_always_size_sections (bfd *output_bfd,
-				       struct bfd_link_info *info)
+s3_bfd_score_elf_early_size_sections (bfd *output_bfd,
+				      struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
@@ -3237,14 +3237,15 @@  s3_bfd_score_elf_always_size_sections (bfd *output_bfd,
 
 /* Set the sizes of the dynamic sections.  */
 static bool
-s3_bfd_score_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
+s3_bfd_score_elf_late_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
   bool reltext;
 
   dynobj = elf_hash_table (info)->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -3313,7 +3314,7 @@  s3_bfd_score_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *i
 	}
       else if (startswith (name, ".got"))
 	{
-	  /* s3_bfd_score_elf_always_size_sections() has already done
+	  /* s3_bfd_score_elf_early_size_sections() has already done
 	     most of the work, but some symbols may have been mapped
 	     to versions that we must now resolve in the got_entries
 	     hash tables.  */
@@ -4183,22 +4184,22 @@  _bfd_score_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
 }
 
 static bool
-_bfd_score_elf_always_size_sections (bfd *output_bfd,
-				     struct bfd_link_info *info)
+_bfd_score_elf_early_size_sections (bfd *output_bfd,
+				    struct bfd_link_info *info)
 {
   if (bfd_get_mach (output_bfd) == bfd_mach_score3)
-    return s3_bfd_score_elf_always_size_sections (output_bfd, info);
+    return s3_bfd_score_elf_early_size_sections (output_bfd, info);
   else
-    return s7_bfd_score_elf_always_size_sections (output_bfd, info);
+    return s7_bfd_score_elf_early_size_sections (output_bfd, info);
 }
 
 static bool
-_bfd_score_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
+_bfd_score_elf_late_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   if (bfd_get_mach (output_bfd) == bfd_mach_score3)
-    return s3_bfd_score_elf_size_dynamic_sections (output_bfd, info);
+    return s3_bfd_score_elf_late_size_sections (output_bfd, info);
   else
-    return s7_bfd_score_elf_size_dynamic_sections (output_bfd, info);
+    return s7_bfd_score_elf_late_size_sections (output_bfd, info);
 }
 
 static bool
@@ -4461,10 +4462,10 @@  _bfd_score_elf_common_definition (Elf_Internal_Sym *sym)
   _bfd_score_elf_section_from_bfd_section
 #define elf_backend_adjust_dynamic_symbol \
   _bfd_score_elf_adjust_dynamic_symbol
-#define elf_backend_always_size_sections \
-  _bfd_score_elf_always_size_sections
-#define elf_backend_size_dynamic_sections \
-  _bfd_score_elf_size_dynamic_sections
+#define elf_backend_early_size_sections \
+  _bfd_score_elf_early_size_sections
+#define elf_backend_late_size_sections \
+  _bfd_score_elf_late_size_sections
 #define elf_backend_omit_section_dynsym   _bfd_elf_omit_section_dynsym_all
 #define elf_backend_create_dynamic_sections \
   _bfd_score_elf_create_dynamic_sections
diff --git a/bfd/elf32-score.h b/bfd/elf32-score.h
index 19e3b3f2c10..b1730edbc23 100644
--- a/bfd/elf32-score.h
+++ b/bfd/elf32-score.h
@@ -78,10 +78,10 @@  s7_bfd_score_elf_adjust_dynamic_symbol (struct bfd_link_info *,
 					struct elf_link_hash_entry *);
 
 extern bool
-s7_bfd_score_elf_always_size_sections (bfd *, struct bfd_link_info *);
+s7_bfd_score_elf_early_size_sections (bfd *, struct bfd_link_info *);
 
 extern bool
-s7_bfd_score_elf_size_dynamic_sections (bfd *, struct bfd_link_info *);
+s7_bfd_score_elf_late_size_sections (bfd *, struct bfd_link_info *);
 
 extern bool
 s7_bfd_score_elf_create_dynamic_sections (bfd *, struct bfd_link_info *);
diff --git a/bfd/elf32-score7.c b/bfd/elf32-score7.c
index d1155bfdb13..c9edf2b1a48 100644
--- a/bfd/elf32-score7.c
+++ b/bfd/elf32-score7.c
@@ -975,7 +975,7 @@  score_elf_got_info (bfd *abfd, asection **sgotp)
    appear towards the end.  This reduces the amount of GOT space
    required.  MAX_LOCAL is used to set the number of local symbols
    known to be in the dynamic symbol table.  During
-   s7_bfd_score_elf_size_dynamic_sections, this value is 1.  Afterward, the
+   s7_bfd_score_elf_late_size_sections, this value is 1.  Afterward, the
    section symbols are added and the count is higher.  */
 
 static bool
@@ -2969,8 +2969,8 @@  s7_bfd_score_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
    and the input sections have been assigned to output sections.  */
 
 bool
-s7_bfd_score_elf_always_size_sections (bfd *output_bfd,
-				       struct bfd_link_info *info)
+s7_bfd_score_elf_early_size_sections (bfd *output_bfd,
+				      struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
@@ -3047,14 +3047,15 @@  s7_bfd_score_elf_always_size_sections (bfd *output_bfd,
 /* Set the sizes of the dynamic sections.  */
 
 bool
-s7_bfd_score_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
+s7_bfd_score_elf_late_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
   bool reltext;
 
   dynobj = elf_hash_table (info)->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -3123,7 +3124,7 @@  s7_bfd_score_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *i
 	}
       else if (startswith (name, ".got"))
 	{
-	  /* s7_bfd_score_elf_always_size_sections() has already done
+	  /* s7_bfd_score_elf_early_size_sections() has already done
 	     most of the work, but some symbols may have been mapped
 	     to versions that we must now resolve in the got_entries
 	     hash tables.  */
diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c
index bf4cb2a8242..ecb46bb616f 100644
--- a/bfd/elf32-sh.c
+++ b/bfd/elf32-sh.c
@@ -2927,7 +2927,7 @@  allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
    It's a convenient place to determine the PLT style.  */
 
 static bool
-sh_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
+sh_elf_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   sh_elf_hash_table (info)->plt_info = get_plt_info (output_bfd,
 						     bfd_link_pic (info));
@@ -2942,8 +2942,8 @@  sh_elf_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-			      struct bfd_link_info *info)
+sh_elf_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			   struct bfd_link_info *info)
 {
   struct elf_sh_link_hash_table *htab;
   bfd *dynobj;
@@ -2956,7 +2956,8 @@  sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
     return false;
 
   dynobj = htab->root.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (htab->root.dynamic_sections_created)
     {
@@ -6598,10 +6599,8 @@  sh_elf_encode_eh_address (bfd *abfd,
 					sh_elf_link_hash_table_create
 #define elf_backend_adjust_dynamic_symbol \
 					sh_elf_adjust_dynamic_symbol
-#define elf_backend_always_size_sections \
-					sh_elf_always_size_sections
-#define elf_backend_size_dynamic_sections \
-					sh_elf_size_dynamic_sections
+#define elf_backend_early_size_sections	sh_elf_early_size_sections
+#define elf_backend_late_size_sections	sh_elf_late_size_sections
 #define elf_backend_omit_section_dynsym	sh_elf_omit_section_dynsym
 #define elf_backend_finish_dynamic_symbol \
 					sh_elf_finish_dynamic_symbol
diff --git a/bfd/elf32-sparc.c b/bfd/elf32-sparc.c
index 51892fb7fc5..17702b1d7aa 100644
--- a/bfd/elf32-sparc.c
+++ b/bfd/elf32-sparc.c
@@ -248,8 +248,7 @@  elf32_sparc_reloc_type_class (const struct bfd_link_info *info,
 #define elf_backend_adjust_dynamic_symbol \
 					_bfd_sparc_elf_adjust_dynamic_symbol
 #define elf_backend_omit_section_dynsym	_bfd_sparc_elf_omit_section_dynsym
-#define elf_backend_size_dynamic_sections \
-					_bfd_sparc_elf_size_dynamic_sections
+#define elf_backend_late_size_sections	_bfd_sparc_elf_late_size_sections
 #define elf_backend_relocate_section	_bfd_sparc_elf_relocate_section
 #define elf_backend_finish_dynamic_symbol \
 					_bfd_sparc_elf_finish_dynamic_symbol
diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
index afd8e0d2aff..5c00318cd15 100644
--- a/bfd/elf32-tic6x.c
+++ b/bfd/elf32-tic6x.c
@@ -3160,7 +3160,7 @@  elf32_tic6x_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
+elf32_tic6x_late_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   struct elf32_tic6x_link_hash_table *htab;
   bfd *dynobj;
@@ -3171,7 +3171,7 @@  elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
   htab = elf32_tic6x_hash_table (info);
   dynobj = htab->elf.dynobj;
   if (dynobj == NULL)
-    abort ();
+    return true;
 
   if (htab->elf.dynamic_sections_created)
     {
@@ -3358,7 +3358,7 @@  elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
    and the input sections have been assigned to output sections.  */
 
 static bool
-elf32_tic6x_always_size_sections (bfd *output_bfd, struct bfd_link_info *info)
+elf32_tic6x_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   if (elf32_tic6x_using_dsbt (output_bfd) && !bfd_link_relocatable (info)
       && !bfd_elf_stack_segment_size (output_bfd, info,
@@ -4261,10 +4261,10 @@  elf32_tic6x_write_section (bfd *output_bfd,
 #define elf_backend_relocs_compatible	_bfd_elf_relocs_compatible
 #define elf_backend_finish_dynamic_symbol \
   elf32_tic6x_finish_dynamic_symbol
-#define elf_backend_always_size_sections \
-  elf32_tic6x_always_size_sections
-#define elf_backend_size_dynamic_sections \
-  elf32_tic6x_size_dynamic_sections
+#define elf_backend_early_size_sections \
+  elf32_tic6x_early_size_sections
+#define elf_backend_late_size_sections \
+  elf32_tic6x_late_size_sections
 #define elf_backend_finish_dynamic_sections \
   elf32_tic6x_finish_dynamic_sections
 #define bfd_elf32_bfd_final_link \
diff --git a/bfd/elf32-tilegx.c b/bfd/elf32-tilegx.c
index df92493ba43..e88460fe7b3 100644
--- a/bfd/elf32-tilegx.c
+++ b/bfd/elf32-tilegx.c
@@ -105,7 +105,7 @@  tilegx_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 #define elf_backend_check_relocs	     tilegx_elf_check_relocs
 #define elf_backend_adjust_dynamic_symbol    tilegx_elf_adjust_dynamic_symbol
 #define elf_backend_omit_section_dynsym	     tilegx_elf_omit_section_dynsym
-#define elf_backend_size_dynamic_sections    tilegx_elf_size_dynamic_sections
+#define elf_backend_late_size_sections	     tilegx_elf_late_size_sections
 #define elf_backend_relocate_section	     tilegx_elf_relocate_section
 #define elf_backend_finish_dynamic_symbol    tilegx_elf_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections  tilegx_elf_finish_dynamic_sections
diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c
index 60e5a5aadf9..0c187c07832 100644
--- a/bfd/elf32-tilepro.c
+++ b/bfd/elf32-tilepro.c
@@ -2182,11 +2182,9 @@  tilepro_elf_omit_section_dynsym (bfd *output_bfd,
 #define ELF32_DYNAMIC_INTERPRETER "/lib/ld.so.1"
 
 static bool
-tilepro_elf_size_dynamic_sections (bfd *output_bfd,
-				      struct bfd_link_info *info)
+tilepro_elf_late_size_sections (bfd *output_bfd,
+				struct bfd_link_info *info)
 {
-  (void)output_bfd;
-
   struct elf_link_hash_table *htab;
   bfd *dynobj;
   asection *s;
@@ -2195,7 +2193,8 @@  tilepro_elf_size_dynamic_sections (bfd *output_bfd,
   htab = tilepro_elf_hash_table (info);
   BFD_ASSERT (htab != NULL);
   dynobj = htab->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -3739,7 +3738,7 @@  tilepro_additional_program_headers (bfd *abfd,
 #define elf_backend_check_relocs	     tilepro_elf_check_relocs
 #define elf_backend_adjust_dynamic_symbol    tilepro_elf_adjust_dynamic_symbol
 #define elf_backend_omit_section_dynsym	     tilepro_elf_omit_section_dynsym
-#define elf_backend_size_dynamic_sections    tilepro_elf_size_dynamic_sections
+#define elf_backend_late_size_sections	     tilepro_elf_late_size_sections
 #define elf_backend_relocate_section	     tilepro_elf_relocate_section
 #define elf_backend_finish_dynamic_symbol    tilepro_elf_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections  tilepro_elf_finish_dynamic_sections
diff --git a/bfd/elf32-vax.c b/bfd/elf32-vax.c
index 4422dc995aa..5107a4aa34e 100644
--- a/bfd/elf32-vax.c
+++ b/bfd/elf32-vax.c
@@ -36,7 +36,6 @@  static bool elf_vax_check_relocs (bfd *, struct bfd_link_info *,
 				  asection *, const Elf_Internal_Rela *);
 static bool elf_vax_adjust_dynamic_symbol (struct bfd_link_info *,
 					   struct elf_link_hash_entry *);
-static bool elf_vax_size_dynamic_sections (bfd *, struct bfd_link_info *);
 static int elf_vax_relocate_section (bfd *, struct bfd_link_info *,
 				     bfd *, asection *, bfd_byte *,
 				     Elf_Internal_Rela *,
@@ -985,8 +984,8 @@  elf_vax_discard_got_entries (struct elf_link_hash_entry *h,
 /* Discard unused dynamic data if this is a static link.  */
 
 static bool
-elf_vax_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-			      struct bfd_link_info *info)
+elf_vax_early_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			     struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
@@ -1024,14 +1023,15 @@  elf_vax_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
+elf_vax_late_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
   bool relocs;
 
   dynobj = elf_hash_table (info)->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -1861,10 +1861,8 @@  elf_vax_plt_sym_val (bfd_vma i, const asection *plt,
 #define elf_backend_check_relocs	elf_vax_check_relocs
 #define elf_backend_adjust_dynamic_symbol \
 					elf_vax_adjust_dynamic_symbol
-#define elf_backend_always_size_sections \
-					elf_vax_always_size_sections
-#define elf_backend_size_dynamic_sections \
-					elf_vax_size_dynamic_sections
+#define elf_backend_early_size_sections	elf_vax_early_size_sections
+#define elf_backend_late_size_sections	elf_vax_late_size_sections
 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
 #define elf_backend_relocate_section	elf_vax_relocate_section
 #define elf_backend_finish_dynamic_symbol \
diff --git a/bfd/elf32-xstormy16.c b/bfd/elf32-xstormy16.c
index bff89aba686..8234df186ce 100644
--- a/bfd/elf32-xstormy16.c
+++ b/bfd/elf32-xstormy16.c
@@ -706,8 +706,8 @@  xstormy16_elf_relax_section (bfd *dynobj,
 }
 
 static bool
-xstormy16_elf_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				    struct bfd_link_info *info)
+xstormy16_elf_early_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+				   struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *splt;
@@ -1013,8 +1013,8 @@  xstormy16_elf_gc_mark_hook (asection *sec,
 #define elf_backend_relocate_section		xstormy16_elf_relocate_section
 #define elf_backend_gc_mark_hook		xstormy16_elf_gc_mark_hook
 #define elf_backend_check_relocs		xstormy16_elf_check_relocs
-#define elf_backend_always_size_sections \
-  xstormy16_elf_always_size_sections
+#define elf_backend_early_size_sections \
+  xstormy16_elf_early_size_sections
 #define elf_backend_omit_section_dynsym \
   _bfd_elf_omit_section_dynsym_all
 #define elf_backend_finish_dynamic_sections \
diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c
index e73f96a7dcc..eb7fef9331e 100644
--- a/bfd/elf32-xtensa.c
+++ b/bfd/elf32-xtensa.c
@@ -1557,8 +1557,8 @@  elf_xtensa_allocate_local_got_size (struct bfd_link_info *info)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				  struct bfd_link_info *info)
+elf_xtensa_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			       struct bfd_link_info *info)
 {
   struct elf_xtensa_link_hash_table *htab;
   bfd *dynobj, *abfd;
@@ -1575,7 +1575,7 @@  elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
   dynobj = elf_hash_table (info)->dynobj;
   if (dynobj == NULL)
-    abort ();
+    return true;
   srelgot = htab->elf.srelgot;
   srelplt = htab->elf.srelplt;
 
@@ -1780,8 +1780,7 @@  elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 }
 
 static bool
-elf_xtensa_always_size_sections (bfd *output_bfd,
-				 struct bfd_link_info *info)
+elf_xtensa_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   struct elf_xtensa_link_hash_table *htab;
   asection *tls_sec;
@@ -11512,8 +11511,8 @@  static const struct bfd_elf_special_section elf_xtensa_special_sections[] =
 #define elf_backend_object_p		     elf_xtensa_object_p
 #define elf_backend_reloc_type_class	     elf_xtensa_reloc_type_class
 #define elf_backend_relocate_section	     elf_xtensa_relocate_section
-#define elf_backend_size_dynamic_sections    elf_xtensa_size_dynamic_sections
-#define elf_backend_always_size_sections     elf_xtensa_always_size_sections
+#define elf_backend_late_size_sections	     elf_xtensa_late_size_sections
+#define elf_backend_early_size_sections	     elf_xtensa_early_size_sections
 #define elf_backend_omit_section_dynsym      _bfd_elf_omit_section_dynsym_all
 #define elf_backend_special_sections	     elf_xtensa_special_sections
 #define elf_backend_action_discarded	     elf_xtensa_action_discarded
diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c
index ce50291cd3f..a29913d9365 100644
--- a/bfd/elf64-alpha.c
+++ b/bfd/elf64-alpha.c
@@ -2562,8 +2562,8 @@  elf64_alpha_size_plt_section (struct bfd_link_info *info)
 }
 
 static bool
-elf64_alpha_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				  struct bfd_link_info *info)
+elf64_alpha_early_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+				 struct bfd_link_info *info)
 {
   bfd *i;
   struct alpha_elf_link_hash_table * htab;
@@ -2789,8 +2789,8 @@  elf64_alpha_size_rela_got_section (struct bfd_link_info *info)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				   struct bfd_link_info *info)
+elf64_alpha_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+				struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s;
@@ -2802,7 +2802,8 @@  elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
     return false;
 
   dynobj = elf_hash_table(info)->dynobj;
-  BFD_ASSERT(dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -5448,10 +5449,10 @@  static const struct elf_size_info alpha_elf_size_info =
   elf64_alpha_merge_symbol_attribute
 #define elf_backend_copy_indirect_symbol \
   elf64_alpha_copy_indirect_symbol
-#define elf_backend_always_size_sections \
-  elf64_alpha_always_size_sections
-#define elf_backend_size_dynamic_sections \
-  elf64_alpha_size_dynamic_sections
+#define elf_backend_early_size_sections \
+  elf64_alpha_early_size_sections
+#define elf_backend_late_size_sections \
+  elf64_alpha_late_size_sections
 #define elf_backend_omit_section_dynsym \
   _bfd_elf_omit_section_dynsym_all
 #define elf_backend_relocate_section \
diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c
index bc91bc4c08a..041ab29c3b4 100644
--- a/bfd/elf64-hppa.c
+++ b/bfd/elf64-hppa.c
@@ -176,9 +176,6 @@  static bool elf64_hppa_adjust_dynamic_symbol
 static bool elf64_hppa_mark_milli_and_exported_functions
   (struct elf_link_hash_entry *, void *);
 
-static bool elf64_hppa_size_dynamic_sections
-  (bfd *, struct bfd_link_info *);
-
 static int elf64_hppa_link_output_symbol_hook
   (struct bfd_link_info *, const char *, Elf_Internal_Sym *,
    asection *, struct elf_link_hash_entry *);
@@ -1520,7 +1517,7 @@  elf64_hppa_mark_milli_and_exported_functions (struct elf_link_hash_entry *eh,
    the contents of our special sections.  */
 
 static bool
-elf64_hppa_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
+elf64_hppa_late_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   struct elf64_hppa_link_hash_table *hppa_info;
   struct elf64_hppa_allocate_data data;
@@ -1534,7 +1531,8 @@  elf64_hppa_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
     return false;
 
   dynobj = hppa_info->root.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   /* Mark each function this program exports so that we will allocate
      space in the .opd section for each function's FPTR.  If we are
@@ -3982,8 +3980,7 @@  const struct elf_size_info hppa64_elf_size_info =
 #define elf_backend_adjust_dynamic_symbol \
 					elf64_hppa_adjust_dynamic_symbol
 
-#define elf_backend_size_dynamic_sections \
-					elf64_hppa_size_dynamic_sections
+#define elf_backend_late_size_sections	elf64_hppa_late_size_sections
 
 #define elf_backend_finish_dynamic_symbol \
 					elf64_hppa_finish_dynamic_symbol
diff --git a/bfd/elf64-ia64-vms.c b/bfd/elf64-ia64-vms.c
index aa058a1793e..54133c94c91 100644
--- a/bfd/elf64-ia64-vms.c
+++ b/bfd/elf64-ia64-vms.c
@@ -2591,8 +2591,8 @@  elf64_ia64_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
 }
 
 static bool
-elf64_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				  struct bfd_link_info *info)
+elf64_ia64_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			       struct bfd_link_info *info)
 {
   struct elf64_ia64_allocate_data data;
   struct elf64_ia64_link_hash_table *ia64_info;
@@ -2601,11 +2601,12 @@  elf64_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   struct elf_link_hash_table *hash_table;
 
   hash_table = elf_hash_table (info);
-  dynobj = hash_table->dynobj;
   ia64_info = elf64_ia64_hash_table (info);
   if (ia64_info == NULL)
     return false;
-  BFD_ASSERT(dynobj != NULL);
+  dynobj = hash_table->dynobj;
+  if (dynobj == NULL)
+    return true;
   data.info = info;
 
   /* Allocate the GOT entries.  */
@@ -5486,8 +5487,8 @@  static const struct elf_size_info elf64_ia64_vms_size_info = {
 	elf64_ia64_check_relocs
 #define elf_backend_adjust_dynamic_symbol \
 	elf64_ia64_adjust_dynamic_symbol
-#define elf_backend_size_dynamic_sections \
-	elf64_ia64_size_dynamic_sections
+#define elf_backend_late_size_sections \
+	elf64_ia64_late_size_sections
 #define elf_backend_omit_section_dynsym \
 	_bfd_elf_omit_section_dynsym_all
 #define elf_backend_relocate_section \
diff --git a/bfd/elf64-mips.c b/bfd/elf64-mips.c
index 489a461bb0b..78bece0e072 100644
--- a/bfd/elf64-mips.c
+++ b/bfd/elf64-mips.c
@@ -4748,10 +4748,10 @@  const struct elf_size_info mips_elf64_size_info =
 #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
 #define elf_backend_adjust_dynamic_symbol \
 				_bfd_mips_elf_adjust_dynamic_symbol
-#define elf_backend_always_size_sections \
-				_bfd_mips_elf_always_size_sections
-#define elf_backend_size_dynamic_sections \
-				_bfd_mips_elf_size_dynamic_sections
+#define elf_backend_early_size_sections \
+				_bfd_mips_elf_early_size_sections
+#define elf_backend_late_size_sections \
+				_bfd_mips_elf_late_size_sections
 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
 #define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
 #define elf_backend_finish_dynamic_symbol \
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 508419bfedc..cd3aaacaeb3 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -119,8 +119,8 @@  static bfd_vma opd_entry_value
 #define elf_backend_adjust_dynamic_symbol     ppc64_elf_adjust_dynamic_symbol
 #define elf_backend_hide_symbol		      ppc64_elf_hide_symbol
 #define elf_backend_maybe_function_sym	      ppc64_elf_maybe_function_sym
-#define elf_backend_always_size_sections      ppc64_elf_edit
-#define elf_backend_size_dynamic_sections     ppc64_elf_size_dynamic_sections
+#define elf_backend_early_size_sections	      ppc64_elf_edit
+#define elf_backend_late_size_sections	      ppc64_elf_late_size_sections
 #define elf_backend_hash_symbol		      ppc64_elf_hash_symbol
 #define elf_backend_init_index_section	      _bfd_elf_init_2_index_sections
 #define elf_backend_action_discarded	      ppc64_elf_action_discarded
@@ -10148,7 +10148,7 @@  allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   ((((v) & 0x3ffff0000ULL) << 16) | (v & 0xffff))
 #define HA34(v) ((v + (1ULL << 33)) >> 34)
 
-/* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
+/* Called via elf_link_hash_traverse from ppc64_elf_late_size_sections
    to set up space for global entry stubs.  These are put in glink,
    after the branch table.  */
 
@@ -10225,8 +10225,8 @@  size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-ppc64_elf_size_dynamic_sections (bfd *output_bfd,
-				 struct bfd_link_info *info)
+ppc64_elf_late_size_sections (bfd *output_bfd,
+			      struct bfd_link_info *info)
 {
   struct ppc_link_hash_table *htab;
   bfd *dynobj;
@@ -10241,7 +10241,7 @@  ppc64_elf_size_dynamic_sections (bfd *output_bfd,
 
   dynobj = htab->elf.dynobj;
   if (dynobj == NULL)
-    abort ();
+    return true;
 
   if (htab->elf.dynamic_sections_created)
     {
diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c
index beaf3e90743..d3b6e17ed64 100644
--- a/bfd/elf64-s390.c
+++ b/bfd/elf64-s390.c
@@ -1301,7 +1301,7 @@  elf_s390_gc_mark_hook (asection *sec,
    entry but we found we will not create any.  Called when we find we will
    not have any PLT for this symbol, by for example
    elf_s390_adjust_dynamic_symbol when we're doing a proper dynamic link,
-   or elf_s390_size_dynamic_sections if no dynamic sections will be
+   or elf_s390_late_size_sections if no dynamic sections will be
    created (we're only linking static objects).  */
 
 static void
@@ -1714,8 +1714,8 @@  allocate_dynrelocs (struct elf_link_hash_entry *h,
 /* Set the sizes of the dynamic sections.  */
 
 static bool
-elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				struct bfd_link_info *info)
+elf_s390_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			     struct bfd_link_info *info)
 {
   struct elf_s390_link_hash_table *htab;
   bfd *dynobj;
@@ -1729,7 +1729,7 @@  elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
   dynobj = htab->elf.dynobj;
   if (dynobj == NULL)
-    abort ();
+    return true;
 
   if (htab->elf.dynamic_sections_created)
     {
@@ -3965,7 +3965,7 @@  const struct elf_size_info s390_elf64_size_info =
 #define elf_backend_gc_mark_hook	      elf_s390_gc_mark_hook
 #define elf_backend_reloc_type_class	      elf_s390_reloc_type_class
 #define elf_backend_relocate_section	      elf_s390_relocate_section
-#define elf_backend_size_dynamic_sections     elf_s390_size_dynamic_sections
+#define elf_backend_late_size_sections	      elf_s390_late_size_sections
 #define elf_backend_init_index_section	      _bfd_elf_init_1_index_section
 #define elf_backend_grok_prstatus	      elf_s390_grok_prstatus
 #define elf_backend_grok_psinfo		      elf_s390_grok_psinfo
diff --git a/bfd/elf64-sparc.c b/bfd/elf64-sparc.c
index d494b58208c..300e7fdb72c 100644
--- a/bfd/elf64-sparc.c
+++ b/bfd/elf64-sparc.c
@@ -953,8 +953,8 @@  const struct elf_size_info elf64_sparc_size_info =
   _bfd_sparc_elf_adjust_dynamic_symbol
 #define elf_backend_omit_section_dynsym \
   _bfd_sparc_elf_omit_section_dynsym
-#define elf_backend_size_dynamic_sections \
-  _bfd_sparc_elf_size_dynamic_sections
+#define elf_backend_late_size_sections \
+  _bfd_sparc_elf_late_size_sections
 #define elf_backend_relocate_section \
   _bfd_sparc_elf_relocate_section
 #define elf_backend_finish_dynamic_symbol \
diff --git a/bfd/elf64-tilegx.c b/bfd/elf64-tilegx.c
index 623c99b9aed..40637a83eb1 100644
--- a/bfd/elf64-tilegx.c
+++ b/bfd/elf64-tilegx.c
@@ -106,7 +106,7 @@  tilegx_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
 #define elf_backend_check_relocs	     tilegx_elf_check_relocs
 #define elf_backend_adjust_dynamic_symbol    tilegx_elf_adjust_dynamic_symbol
 #define elf_backend_omit_section_dynsym	     tilegx_elf_omit_section_dynsym
-#define elf_backend_size_dynamic_sections    tilegx_elf_size_dynamic_sections
+#define elf_backend_late_size_sections	     tilegx_elf_late_size_sections
 #define elf_backend_relocate_section	     tilegx_elf_relocate_section
 #define elf_backend_finish_dynamic_symbol    tilegx_elf_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections  tilegx_elf_finish_dynamic_sections
diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
index 3300a2017bd..8058d713c03 100644
--- a/bfd/elf64-x86-64.c
+++ b/bfd/elf64-x86-64.c
@@ -2615,8 +2615,7 @@  elf_x86_64_scan_relocs (bfd *abfd, struct bfd_link_info *info,
 }
 
 static bool
-elf_x86_64_always_size_sections (bfd *output_bfd,
-				 struct bfd_link_info *info)
+elf_x86_64_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   bfd *abfd;
 
@@ -2629,7 +2628,7 @@  elf_x86_64_always_size_sections (bfd *output_bfd,
 					     elf_x86_64_scan_relocs))
       return false;
 
-  return _bfd_x86_elf_always_size_sections (output_bfd, info);
+  return _bfd_x86_elf_early_size_sections (output_bfd, info);
 }
 
 /* Return the relocation value for @tpoff relocation
@@ -5747,7 +5746,7 @@  elf_x86_64_special_sections[]=
   elf_x86_64_reloc_name_lookup
 
 #define elf_backend_relocs_compatible	    elf_x86_64_relocs_compatible
-#define elf_backend_always_size_sections    elf_x86_64_always_size_sections
+#define elf_backend_early_size_sections	    elf_x86_64_early_size_sections
 #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
 #define elf_backend_finish_dynamic_sections elf_x86_64_finish_dynamic_sections
 #define elf_backend_finish_dynamic_symbol   elf_x86_64_finish_dynamic_symbol
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 5d9b4092e48..37a61b7cd31 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -6667,8 +6667,8 @@  bfd_elf_size_dynamic_sections (bfd *output_bfd,
 
   /* The backend may have to create some sections regardless of whether
      we're dynamic or not.  */
-  if (bed->elf_backend_always_size_sections
-      && ! (*bed->elf_backend_always_size_sections) (output_bfd, info))
+  if (bed->elf_backend_early_size_sections
+      && !bed->elf_backend_early_size_sections (output_bfd, info))
     return false;
 
   dynobj = elf_hash_table (info)->dynobj;
@@ -7474,9 +7474,8 @@  NOTE: This behaviour is deprecated and will be removed in a future version of th
 
   /* The backend must work out the sizes of all the other dynamic
      sections.  */
-  if (dynobj != NULL
-      && bed->elf_backend_size_dynamic_sections != NULL
-      && ! (*bed->elf_backend_size_dynamic_sections) (output_bfd, info))
+  if (bed->elf_backend_late_size_sections != NULL
+      && !bed->elf_backend_late_size_sections (output_bfd, info))
     return false;
 
   if (dynobj != NULL && elf_hash_table (info)->dynamic_sections_created)
diff --git a/bfd/elfn32-mips.c b/bfd/elfn32-mips.c
index 7e672200006..52d6e4410cd 100644
--- a/bfd/elfn32-mips.c
+++ b/bfd/elfn32-mips.c
@@ -4138,10 +4138,8 @@  static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
 #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
 #define elf_backend_adjust_dynamic_symbol \
 					_bfd_mips_elf_adjust_dynamic_symbol
-#define elf_backend_always_size_sections \
-					_bfd_mips_elf_always_size_sections
-#define elf_backend_size_dynamic_sections \
-					_bfd_mips_elf_size_dynamic_sections
+#define elf_backend_early_size_sections	_bfd_mips_elf_early_size_sections
+#define elf_backend_late_size_sections	_bfd_mips_elf_late_size_sections
 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
 #define elf_backend_relocate_section	_bfd_mips_elf_relocate_section
 #define elf_backend_finish_dynamic_symbol \
diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c
index 3c65ac1f01b..55871dbe763 100644
--- a/bfd/elfnn-aarch64.c
+++ b/bfd/elfnn-aarch64.c
@@ -112,7 +112,7 @@ 
   allocate space for one relocation on the slot. Record the GOT offset
   for this symbol.
 
-  elfNN_aarch64_size_dynamic_sections ()
+  elfNN_aarch64_late_size_sections ()
 
   Iterate all input BFDS, look for in the local symbol data structure
   constructed earlier for local TLS symbols and allocate them double
@@ -9173,8 +9173,8 @@  elfNN_aarch64_allocate_local_ifunc_dynrelocs (void **slot, void *inf)
    though !  */
 
 static bool
-elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				     struct bfd_link_info *info)
+elfNN_aarch64_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+				  struct bfd_link_info *info)
 {
   struct elf_aarch64_link_hash_table *htab;
   bfd *dynobj;
@@ -9185,7 +9185,8 @@  elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   htab = elf_aarch64_hash_table ((info));
   dynobj = htab->root.dynobj;
 
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (htab->root.dynamic_sections_created)
     {
@@ -9587,8 +9588,8 @@  elfNN_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h,
    _TLS_MODULE_BASE_, if needed.  */
 
 static bool
-elfNN_aarch64_always_size_sections (bfd *output_bfd,
-				    struct bfd_link_info *info)
+elfNN_aarch64_early_size_sections (bfd *output_bfd,
+				   struct bfd_link_info *info)
 {
   asection *tls_sec;
 
@@ -10320,8 +10321,8 @@  const struct elf_size_info elfNN_aarch64_size_info =
 #define elf_backend_adjust_dynamic_symbol	\
   elfNN_aarch64_adjust_dynamic_symbol
 
-#define elf_backend_always_size_sections	\
-  elfNN_aarch64_always_size_sections
+#define elf_backend_early_size_sections		\
+  elfNN_aarch64_early_size_sections
 
 #define elf_backend_check_relocs		\
   elfNN_aarch64_check_relocs
@@ -10376,8 +10377,8 @@  const struct elf_size_info elfNN_aarch64_size_info =
 #define elf_backend_modify_headers		\
   elfNN_aarch64_modify_headers
 
-#define elf_backend_size_dynamic_sections	\
-  elfNN_aarch64_size_dynamic_sections
+#define elf_backend_late_size_sections		\
+  elfNN_aarch64_late_size_sections
 
 #define elf_backend_size_info			\
   elfNN_aarch64_size_info
diff --git a/bfd/elfnn-ia64.c b/bfd/elfnn-ia64.c
index 9951a47349b..4dabaa792f6 100644
--- a/bfd/elfnn-ia64.c
+++ b/bfd/elfnn-ia64.c
@@ -2987,8 +2987,8 @@  elfNN_ia64_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
 }
 
 static bool
-elfNN_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				  struct bfd_link_info *info)
+elfNN_ia64_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			       struct bfd_link_info *info)
 {
   struct elfNN_ia64_allocate_data data;
   struct elfNN_ia64_link_hash_table *ia64_info;
@@ -2999,8 +2999,9 @@  elfNN_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   if (ia64_info == NULL)
     return false;
   dynobj = ia64_info->root.dynobj;
+  if (dynobj == NULL)
+    return true;
   ia64_info->self_dtpmod_offset = (bfd_vma) -1;
-  BFD_ASSERT(dynobj != NULL);
   data.info = info;
 
   /* Set the contents of the .interp section to the interpreter.  */
@@ -5034,8 +5035,8 @@  ignore_errors (const char *fmt ATTRIBUTE_UNUSED, ...)
 	elfNN_ia64_check_relocs
 #define elf_backend_adjust_dynamic_symbol \
 	elfNN_ia64_adjust_dynamic_symbol
-#define elf_backend_size_dynamic_sections \
-	elfNN_ia64_size_dynamic_sections
+#define elf_backend_late_size_sections \
+	elfNN_ia64_late_size_sections
 #define elf_backend_omit_section_dynsym \
 	_bfd_elf_omit_section_dynsym_all
 #define elf_backend_relocate_section \
diff --git a/bfd/elfnn-kvx.c b/bfd/elfnn-kvx.c
index 8591dea5432..516ce2fb988 100644
--- a/bfd/elfnn-kvx.c
+++ b/bfd/elfnn-kvx.c
@@ -4031,8 +4031,8 @@  kvx_readonly_dynrelocs (struct elf_link_hash_entry * h, void * inf)
 /* This is the most important function of all . Innocuosly named
    though !  */
 static bool
-elfNN_kvx_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				 struct bfd_link_info *info)
+elfNN_kvx_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			      struct bfd_link_info *info)
 {
   struct elf_kvx_link_hash_table *htab;
   bfd *dynobj;
@@ -4042,8 +4042,8 @@  elfNN_kvx_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
 
   htab = elf_kvx_hash_table ((info));
   dynobj = htab->root.dynobj;
-
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (htab->root.dynamic_sections_created)
     {
@@ -4357,8 +4357,7 @@  elfNN_kvx_create_small_pltn_entry (struct elf_link_hash_entry *h,
    _TLS_MODULE_BASE_, if needed.  */
 
 static bool
-elfNN_kvx_always_size_sections (bfd *output_bfd,
-				struct bfd_link_info *info)
+elfNN_kvx_early_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   asection *tls_sec;
 
@@ -4713,8 +4712,8 @@  elfNN_kvx_plt_sym_val (bfd_vma i, const asection *plt,
 #define elf_backend_adjust_dynamic_symbol	\
   elfNN_kvx_adjust_dynamic_symbol
 
-#define elf_backend_always_size_sections	\
-  elfNN_kvx_always_size_sections
+#define elf_backend_early_size_sections		\
+  elfNN_kvx_early_size_sections
 
 #define elf_backend_check_relocs		\
   elfNN_kvx_check_relocs
@@ -4757,8 +4756,8 @@  elfNN_kvx_plt_sym_val (bfd_vma i, const asection *plt,
 #define elf_backend_reloc_type_class		\
   elfNN_kvx_reloc_type_class
 
-#define elf_backend_size_dynamic_sections	\
-  elfNN_kvx_size_dynamic_sections
+#define elf_backend_late_size_sections	\
+  elfNN_kvx_late_size_sections
 
 #define elf_backend_can_refcount       1
 #define elf_backend_can_gc_sections    1
diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index 952c42d3de3..eb70799b06a 100644
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -1741,8 +1741,8 @@  maybe_set_textrel (struct elf_link_hash_entry *h, void *info_p)
 }
 
 static bool
-loongarch_elf_size_dynamic_sections (bfd *output_bfd,
-				     struct bfd_link_info *info)
+loongarch_elf_late_size_sections (bfd *output_bfd,
+				  struct bfd_link_info *info)
 {
   struct loongarch_elf_link_hash_table *htab;
   bfd *dynobj;
@@ -1752,7 +1752,8 @@  loongarch_elf_size_dynamic_sections (bfd *output_bfd,
   htab = loongarch_elf_hash_table (info);
   BFD_ASSERT (htab != NULL);
   dynobj = htab->elf.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (htab->elf.dynamic_sections_created)
     {
@@ -5497,7 +5498,7 @@  loongarch_elf_is_rela_normal (Elf_Internal_Rela *rel)
   loongarch_elf_create_dynamic_sections
 #define elf_backend_check_relocs loongarch_elf_check_relocs
 #define elf_backend_adjust_dynamic_symbol loongarch_elf_adjust_dynamic_symbol
-#define elf_backend_size_dynamic_sections loongarch_elf_size_dynamic_sections
+#define elf_backend_late_size_sections loongarch_elf_late_size_sections
 #define elf_backend_relocate_section loongarch_elf_relocate_section
 #define elf_backend_finish_dynamic_symbol loongarch_elf_finish_dynamic_symbol
 #define elf_backend_output_arch_local_syms \
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index 40ff08e934d..95abf2d10e2 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -1500,7 +1500,7 @@  allocate_local_ifunc_dynrelocs (void **slot, void *inf)
 }
 
 static bool
-riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
+riscv_elf_late_size_sections (bfd *output_bfd, struct bfd_link_info *info)
 {
   struct riscv_elf_link_hash_table *htab;
   bfd *dynobj;
@@ -1510,7 +1510,8 @@  riscv_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
   htab = riscv_elf_hash_table (info);
   BFD_ASSERT (htab != NULL);
   dynobj = htab->elf.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -5667,7 +5668,7 @@  riscv_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
 #define elf_backend_create_dynamic_sections	riscv_elf_create_dynamic_sections
 #define elf_backend_check_relocs		riscv_elf_check_relocs
 #define elf_backend_adjust_dynamic_symbol	riscv_elf_adjust_dynamic_symbol
-#define elf_backend_size_dynamic_sections	riscv_elf_size_dynamic_sections
+#define elf_backend_late_size_sections		riscv_elf_late_size_sections
 #define elf_backend_relocate_section		riscv_elf_relocate_section
 #define elf_backend_finish_dynamic_symbol	riscv_elf_finish_dynamic_symbol
 #define elf_backend_finish_dynamic_sections	riscv_elf_finish_dynamic_sections
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 89dd34e798b..87e2ce5093d 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -9649,8 +9649,8 @@  _bfd_mips_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
    check for any mips16 stub sections that we can discard.  */
 
 bool
-_bfd_mips_elf_always_size_sections (bfd *output_bfd,
-				    struct bfd_link_info *info)
+_bfd_mips_elf_early_size_sections (bfd *output_bfd,
+				   struct bfd_link_info *info)
 {
   asection *sect;
   struct mips_elf_link_hash_table *htab;
@@ -9993,8 +9993,8 @@  mips_elf_set_plt_sym_value (struct mips_elf_link_hash_entry *h, void *data)
 /* Set the sizes of the dynamic sections.  */
 
 bool
-_bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
-				     struct bfd_link_info *info)
+_bfd_mips_elf_late_size_sections (bfd *output_bfd,
+				  struct bfd_link_info *info)
 {
   bfd *dynobj;
   asection *s, *sreldyn;
@@ -10004,7 +10004,8 @@  _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd,
   htab = mips_elf_hash_table (info);
   BFD_ASSERT (htab != NULL);
   dynobj = elf_hash_table (info)->dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
@@ -14943,7 +14944,7 @@  _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
 	      input_section->flags &= ~SEC_HAS_CONTENTS;
 	    }
 
-	  /* Size has been set in _bfd_mips_elf_always_size_sections.  */
+	  /* Size has been set in _bfd_mips_elf_early_size_sections.  */
 	  BFD_ASSERT(o->size == sizeof (Elf_External_ABIFlags_v0));
 
 	  /* Skip this section later on (I don't think this currently
@@ -15002,7 +15003,7 @@  _bfd_mips_elf_final_link (bfd *abfd, struct bfd_link_info *info)
 	      input_section->flags &= ~SEC_HAS_CONTENTS;
 	    }
 
-	  /* Size has been set in _bfd_mips_elf_always_size_sections.  */
+	  /* Size has been set in _bfd_mips_elf_early_size_sections.  */
 	  BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
 
 	  /* Skip this section later on (I don't think this currently
diff --git a/bfd/elfxx-mips.h b/bfd/elfxx-mips.h
index 1533ad16e1a..ad47e7634bb 100644
--- a/bfd/elfxx-mips.h
+++ b/bfd/elfxx-mips.h
@@ -67,9 +67,9 @@  extern bool _bfd_mips_elf_check_relocs
   (bfd *, struct bfd_link_info *, asection *, const Elf_Internal_Rela *);
 extern bool _bfd_mips_elf_adjust_dynamic_symbol
   (struct bfd_link_info *, struct elf_link_hash_entry *);
-extern bool _bfd_mips_elf_always_size_sections
+extern bool _bfd_mips_elf_early_size_sections
   (bfd *, struct bfd_link_info *);
-extern bool _bfd_mips_elf_size_dynamic_sections
+extern bool _bfd_mips_elf_late_size_sections
   (bfd *, struct bfd_link_info *);
 extern int _bfd_mips_elf_relocate_section
   (bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c
index 6f5062bb301..4ab3ab842d5 100644
--- a/bfd/elfxx-sparc.c
+++ b/bfd/elfxx-sparc.c
@@ -2381,8 +2381,8 @@  _bfd_sparc_elf_omit_section_dynsym (bfd *output_bfd,
 /* Set the sizes of the dynamic sections.  */
 
 bool
-_bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
-				      struct bfd_link_info *info)
+_bfd_sparc_elf_late_size_sections (bfd *output_bfd,
+				   struct bfd_link_info *info)
 {
   struct _bfd_sparc_elf_link_hash_table *htab;
   bfd *dynobj;
@@ -2392,7 +2392,8 @@  _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd,
   htab = _bfd_sparc_elf_hash_table (info);
   BFD_ASSERT (htab != NULL);
   dynobj = htab->elf.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
diff --git a/bfd/elfxx-sparc.h b/bfd/elfxx-sparc.h
index f357432b317..486bd2af798 100644
--- a/bfd/elfxx-sparc.h
+++ b/bfd/elfxx-sparc.h
@@ -117,7 +117,7 @@  extern bool _bfd_sparc_elf_adjust_dynamic_symbol
   (struct bfd_link_info *, struct elf_link_hash_entry *);
 extern bool _bfd_sparc_elf_omit_section_dynsym
   (bfd *, struct bfd_link_info *, asection *);
-extern bool _bfd_sparc_elf_size_dynamic_sections
+extern bool _bfd_sparc_elf_late_size_sections
   (bfd *, struct bfd_link_info *);
 extern bool _bfd_sparc_elf_new_section_hook
   (bfd *, asection *);
diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h
index 6e2d948b69b..efda910d59b 100644
--- a/bfd/elfxx-target.h
+++ b/bfd/elfxx-target.h
@@ -489,11 +489,11 @@ 
 #ifndef elf_backend_adjust_dynamic_symbol
 #define elf_backend_adjust_dynamic_symbol 0
 #endif
-#ifndef elf_backend_always_size_sections
-#define elf_backend_always_size_sections 0
+#ifndef elf_backend_early_size_sections
+#define elf_backend_early_size_sections 0
 #endif
-#ifndef elf_backend_size_dynamic_sections
-#define elf_backend_size_dynamic_sections 0
+#ifndef elf_backend_late_size_sections
+#define elf_backend_late_size_sections 0
 #endif
 #ifndef elf_backend_strip_zero_sized_dynamic_sections
 #define elf_backend_strip_zero_sized_dynamic_sections 0
@@ -859,8 +859,8 @@  static const struct elf_backend_data elfNN_bed =
   elf_backend_check_directives,
   elf_backend_notice_as_needed,
   elf_backend_adjust_dynamic_symbol,
-  elf_backend_always_size_sections,
-  elf_backend_size_dynamic_sections,
+  elf_backend_early_size_sections,
+  elf_backend_late_size_sections,
   elf_backend_strip_zero_sized_dynamic_sections,
   elf_backend_init_index_section,
   elf_backend_relocate_section,
diff --git a/bfd/elfxx-tilegx.c b/bfd/elfxx-tilegx.c
index 949c844bf26..c829792b253 100644
--- a/bfd/elfxx-tilegx.c
+++ b/bfd/elfxx-tilegx.c
@@ -2430,8 +2430,8 @@  tilegx_elf_omit_section_dynsym (bfd *output_bfd,
 }
 
 bool
-tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-				  struct bfd_link_info *info)
+tilegx_elf_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+			       struct bfd_link_info *info)
 {
   struct tilegx_elf_link_hash_table *htab;
   bfd *dynobj;
@@ -2441,7 +2441,8 @@  tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   htab = tilegx_elf_hash_table (info);
   BFD_ASSERT (htab != NULL);
   dynobj = htab->elf.dynobj;
-  BFD_ASSERT (dynobj != NULL);
+  if (dynobj == NULL)
+    return true;
 
   if (elf_hash_table (info)->dynamic_sections_created)
     {
diff --git a/bfd/elfxx-tilegx.h b/bfd/elfxx-tilegx.h
index 14440aee273..f004a00d888 100644
--- a/bfd/elfxx-tilegx.h
+++ b/bfd/elfxx-tilegx.h
@@ -57,7 +57,7 @@  tilegx_elf_omit_section_dynsym (bfd *,
 				asection *);
 
 extern bool
-tilegx_elf_size_dynamic_sections (bfd *, struct bfd_link_info *);
+tilegx_elf_late_size_sections (bfd *, struct bfd_link_info *);
 
 extern int
 tilegx_elf_relocate_section (bfd *, struct bfd_link_info *,
diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
index 508fd771da3..7436158f8b7 100644
--- a/bfd/elfxx-x86.c
+++ b/bfd/elfxx-x86.c
@@ -2241,7 +2241,7 @@  _bfd_elf_x86_valid_reloc_p (asection *input_section,
 /* Set the sizes of the dynamic sections.  */
 
 bool
-_bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
+_bfd_x86_elf_late_size_sections (bfd *output_bfd,
 				    struct bfd_link_info *info)
 {
   struct elf_x86_link_hash_table *htab;
@@ -2257,7 +2257,7 @@  _bfd_x86_elf_size_dynamic_sections (bfd *output_bfd,
     return false;
   dynobj = htab->elf.dynobj;
   if (dynobj == NULL)
-    abort ();
+    return true;
 
   /* Set up .got offsets for local syms, and space for local dynamic
      relocs.  */
@@ -3003,8 +3003,8 @@  _bfd_x86_elf_finish_dynamic_sections (bfd *output_bfd,
 
 
 bool
-_bfd_x86_elf_always_size_sections (bfd *output_bfd,
-				   struct bfd_link_info *info)
+_bfd_x86_elf_early_size_sections (bfd *output_bfd,
+				  struct bfd_link_info *info)
 {
   asection *tls_sec = elf_hash_table (info)->tls_sec;
 
diff --git a/bfd/elfxx-x86.h b/bfd/elfxx-x86.h
index b3af9b841ba..dacf36805cd 100644
--- a/bfd/elfxx-x86.h
+++ b/bfd/elfxx-x86.h
@@ -853,13 +853,13 @@  extern bool _bfd_elf_x86_valid_reloc_p
    const Elf_Internal_Rela *, struct elf_link_hash_entry *,
    Elf_Internal_Sym *, Elf_Internal_Shdr *, bool *) ATTRIBUTE_HIDDEN;
 
-extern bool _bfd_x86_elf_size_dynamic_sections
+extern bool _bfd_x86_elf_late_size_sections
   (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN;
 
 extern struct elf_x86_link_hash_table *_bfd_x86_elf_finish_dynamic_sections
   (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN;
 
-extern bool _bfd_x86_elf_always_size_sections
+extern bool _bfd_x86_elf_early_size_sections
   (bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN;
 
 extern void _bfd_x86_elf_merge_symbol_attribute
@@ -934,8 +934,8 @@  extern void _bfd_x86_elf_link_report_relative_reloc
 
 #define elf_backend_check_relocs \
   _bfd_x86_elf_check_relocs
-#define elf_backend_size_dynamic_sections \
-  _bfd_x86_elf_size_dynamic_sections
+#define elf_backend_late_size_sections \
+  _bfd_x86_elf_late_size_sections
 #define elf_backend_merge_symbol_attribute \
   _bfd_x86_elf_merge_symbol_attribute
 #define elf_backend_copy_indirect_symbol \
diff --git a/ld/emultempl/vms.em b/ld/emultempl/vms.em
index 8baacb35a13..b643233932f 100644
--- a/ld/emultempl/vms.em
+++ b/ld/emultempl/vms.em
@@ -197,10 +197,9 @@  gld${EMULATION_NAME}_before_allocation (void)
 
   /* The backend must work out the sizes of all the other dynamic
      sections.  */
-  if (elf_hash_table (&link_info)->dynamic_sections_created
-      && bed->elf_backend_size_dynamic_sections
-      && ! (*bed->elf_backend_size_dynamic_sections) (link_info.output_bfd,
-						      &link_info))
+  if (bed->elf_backend_late_size_sections
+      && !bed->elf_backend_late_size_sections (link_info.output_bfd,
+					       &link_info))
     einfo (_("%F%P: failed to set dynamic section sizes: %E\n"));
 
   before_allocation_default ();