ASR_BASE
Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/toolchain/binutils/patches/2.40/001-PR-30569-always-call-elf_backend_size_dynamic_sectio.patch b/toolchain/binutils/patches/2.40/001-PR-30569-always-call-elf_backend_size_dynamic_sectio.patch
new file mode 100644
index 0000000..9c7635d
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/001-PR-30569-always-call-elf_backend_size_dynamic_sectio.patch
@@ -0,0 +1,2172 @@
+From af969b14aedcc0ae27dcefab4327ff2d153dec8b Mon Sep 17 00:00:00 2001
+From: Alan Modra <amodra@gmail.com>
+Date: Thu, 28 Mar 2024 19:25:42 +1030
+Subject: [PATCH 1/2] PR 30569, always call elf_backend_size_dynamic_sections
+
+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.
+---
+ bfd/elf-bfd.h | 35 +++++++++++++++++------------------
+ bfd/elf-m10300.c | 11 ++++++-----
+ bfd/elf32-arc.c | 9 +++++----
+ bfd/elf32-arm.c | 15 ++++++++-------
+ bfd/elf32-bfin.c | 31 ++++++++++++++++---------------
+ bfd/elf32-cr16.c | 11 ++++++-----
+ bfd/elf32-cris.c | 13 +++++++------
+ bfd/elf32-csky.c | 8 ++++----
+ bfd/elf32-frv.c | 23 ++++++++++++-----------
+ bfd/elf32-hppa.c | 8 ++++----
+ bfd/elf32-i386.c | 7 +++----
+ bfd/elf32-lm32.c | 15 ++++++++-------
+ bfd/elf32-m32c.c | 8 ++++----
+ bfd/elf32-m32r.c | 11 ++++++-----
+ bfd/elf32-m68k.c | 16 ++++++++--------
+ bfd/elf32-metag.c | 8 ++++----
+ bfd/elf32-microblaze.c | 9 +++++----
+ bfd/elf32-mips.c | 6 ++----
+ bfd/elf32-nds32.c | 9 +++++----
+ bfd/elf32-nios2.c | 15 ++++++++-------
+ bfd/elf32-or1k.c | 9 +++++----
+ bfd/elf32-ppc.c | 11 ++++++-----
+ bfd/elf32-rl78.c | 8 ++++----
+ bfd/elf32-s390.c | 10 +++++-----
+ bfd/elf32-score.c | 35 ++++++++++++++++++-----------------
+ bfd/elf32-score.h | 4 ++--
+ bfd/elf32-score7.c | 13 +++++++------
+ bfd/elf32-sh.c | 15 +++++++--------
+ bfd/elf32-sparc.c | 3 +--
+ bfd/elf32-tic6x.c | 14 +++++++-------
+ bfd/elf32-tilegx.c | 2 +-
+ bfd/elf32-tilepro.c | 11 +++++------
+ bfd/elf32-vax.c | 16 +++++++---------
+ bfd/elf32-xstormy16.c | 8 ++++----
+ bfd/elf32-xtensa.c | 13 ++++++-------
+ bfd/elf64-alpha.c | 19 ++++++++++---------
+ bfd/elf64-hppa.c | 11 ++++-------
+ bfd/elf64-ia64-vms.c | 13 +++++++------
+ bfd/elf64-mips.c | 8 ++++----
+ bfd/elf64-ppc.c | 12 ++++++------
+ bfd/elf64-s390.c | 10 +++++-----
+ bfd/elf64-sparc.c | 4 ++--
+ bfd/elf64-tilegx.c | 2 +-
+ bfd/elf64-x86-64.c | 7 +++----
+ bfd/elflink.c | 9 ++++-----
+ bfd/elfn32-mips.c | 6 ++----
+ bfd/elfnn-aarch64.c | 21 +++++++++++----------
+ bfd/elfnn-ia64.c | 11 ++++++-----
+ bfd/elfnn-kvx.c | 19 +++++++++----------
+ bfd/elfnn-loongarch.c | 9 +++++----
+ bfd/elfnn-riscv.c | 7 ++++---
+ bfd/elfxx-mips.c | 15 ++++++++-------
+ bfd/elfxx-mips.h | 4 ++--
+ bfd/elfxx-sparc.c | 7 ++++---
+ bfd/elfxx-sparc.h | 2 +-
+ bfd/elfxx-target.h | 12 ++++++------
+ bfd/elfxx-tilegx.c | 7 ++++---
+ bfd/elfxx-tilegx.h | 2 +-
+ bfd/elfxx-x86.c | 8 ++++----
+ bfd/elfxx-x86.h | 8 ++++----
+ ld/emultempl/vms.em | 7 +++----
+ 61 files changed, 343 insertions(+), 337 deletions(-)
+
+--- a/bfd/elf-bfd.h
++++ b/bfd/elf-bfd.h
+@@ -1173,7 +1173,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
+@@ -1185,24 +1185,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
+--- a/bfd/elf-m10300.c
++++ b/bfd/elf-m10300.c
+@@ -5012,8 +5012,8 @@ _bfd_mn10300_elf_adjust_dynamic_symbol (
+ /* 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;
+@@ -5021,7 +5021,8 @@ _bfd_mn10300_elf_size_dynamic_sections (
+ bool relocs;
+
+ dynobj = htab->root.dynobj;
+- BFD_ASSERT (dynobj != NULL);
++ if (dynobj == NULL)
++ return true;
+
+ if (elf_hash_table (info)->dynamic_sections_created)
+ {
+@@ -5508,8 +5509,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
+--- a/bfd/elf32-arc.c
++++ b/bfd/elf32-arc.c
+@@ -2702,8 +2702,8 @@ elf_arc_finish_dynamic_sections (bfd * o
+
+ /* 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;
+@@ -2711,7 +2711,8 @@ elf_arc_size_dynamic_sections (bfd *outp
+ 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)
+ {
+@@ -3126,7 +3127,7 @@ arc_elf_relax_section (bfd *abfd, asecti
+ #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
+--- a/bfd/elf32-arm.c
++++ b/bfd/elf32-arm.c
+@@ -16734,8 +16734,8 @@ bfd_elf32_arm_set_byteswap_code (struct
+ /* 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;
+@@ -16748,7 +16748,9 @@ elf32_arm_size_dynamic_sections (bfd * o
+ 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)
+@@ -17120,8 +17122,7 @@ elf32_arm_size_dynamic_sections (bfd * o
+ _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;
+@@ -20320,8 +20321,8 @@ elf32_arm_backend_symbol_processing (bfd
+ #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
+--- 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 (b
+
+ 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 (b
+ }
+
+ 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)
+@@ -5124,15 +5125,16 @@ bfin_discard_copies (struct elf_link_has
+ }
+
+ 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)
+ {
+@@ -5424,8 +5426,7 @@ struct bfd_elf_special_section const elf
+ #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
+@@ -5471,9 +5472,9 @@ struct bfd_elf_special_section const elf
+ #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 \
+@@ -5481,9 +5482,9 @@ struct bfd_elf_special_section const elf
+ #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
+--- a/bfd/elf32-cr16.c
++++ b/bfd/elf32-cr16.c
+@@ -2390,15 +2390,16 @@ _bfd_cr16_elf_adjust_dynamic_symbol (str
+ /* 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)
+ {
+@@ -2835,8 +2836,8 @@ _bfd_cr16_elf_reloc_type_class (const st
+ _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
+--- a/bfd/elf32-cris.c
++++ b/bfd/elf32-cris.c
+@@ -2527,7 +2527,7 @@ cris_elf_plt_sym_val (bfd_vma i ATTRIBUT
+ 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
+@@ -3508,8 +3508,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;
+@@ -3521,7 +3521,8 @@ elf_cris_size_dynamic_sections (bfd *out
+ return false;
+
+ dynobj = htab->root.dynobj;
+- BFD_ASSERT (dynobj != NULL);
++ if (dynobj == NULL)
++ return true;
+
+ if (htab->root.dynamic_sections_created)
+ {
+@@ -4090,8 +4091,8 @@ elf_cris_got_elt_size (bfd *abfd ATTRIBU
+ 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
+--- a/bfd/elf32-csky.c
++++ b/bfd/elf32-csky.c
+@@ -1893,8 +1893,8 @@ csky_allocate_dynrelocs (struct elf_link
+ /* 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 *out
+ return false;
+ dynobj = htab->elf.dynobj;
+ if (dynobj == NULL)
+- return false;
++ return true;
+
+ if (htab->elf.dynamic_sections_created)
+ {
+@@ -5344,7 +5344,7 @@ elf32_csky_obj_attrs_handle_unknown (bfd
+ /* 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
+--- 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 (bf
+ }
+
+ 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_In
+ #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_In
+ #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
+--- a/bfd/elf32-hppa.c
++++ b/bfd/elf32-hppa.c
+@@ -2042,8 +2042,8 @@ clobber_millicode_symbols (struct elf_li
+ /* 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 *o
+
+ 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_Inte
+ #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
+--- a/bfd/elf32-i386.c
++++ b/bfd/elf32-i386.c
+@@ -1933,8 +1933,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;
+
+@@ -1947,7 +1946,7 @@ elf_i386_always_size_sections (bfd *outp
+ 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
+@@ -4444,7 +4443,7 @@ elf_i386_link_setup_gnu_properties (stru
+ #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
+--- a/bfd/elf32-lm32.c
++++ b/bfd/elf32-lm32.c
+@@ -1906,8 +1906,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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;
+@@ -1920,7 +1920,8 @@ lm32_elf_size_dynamic_sections (bfd *out
+ return false;
+
+ dynobj = htab->root.dynobj;
+- BFD_ASSERT (dynobj != NULL);
++ if (dynobj == NULL)
++ return true;
+
+ if (htab->root.dynamic_sections_created)
+ {
+@@ -2309,7 +2310,7 @@ lm32_elf_create_dynamic_sections (bfd *a
+ }
+
+ 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))
+ {
+@@ -2395,7 +2396,7 @@ lm32_elf_fdpic_copy_private_bfd_data (bf
+ #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
+@@ -2416,8 +2417,8 @@ lm32_elf_fdpic_copy_private_bfd_data (bf
+ #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
+
+--- a/bfd/elf32-m32c.c
++++ b/bfd/elf32-m32c.c
+@@ -773,8 +773,8 @@ m32c_elf_finish_dynamic_sections (bfd *a
+ }
+
+ 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;
+@@ -2131,8 +2131,8 @@ _bfd_m32c_elf_eh_frame_address_size (bfd
+ #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
+
+--- a/bfd/elf32-m32r.c
++++ b/bfd/elf32-m32r.c
+@@ -1958,8 +1958,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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 *out
+ 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 *out
+ return false;
+
+ dynobj = htab->dynobj;
+- BFD_ASSERT (dynobj != NULL);
++ if (dynobj == NULL)
++ return true;
+
+ if (htab->dynamic_sections_created)
+ {
+@@ -3658,7 +3659,7 @@ m32r_elf_reloc_type_class (const struct
+
+ #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
+--- 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 b
+ /* 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_Int
+ #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
+--- a/bfd/elf32-metag.c
++++ b/bfd/elf32-metag.c
+@@ -2717,8 +2717,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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 *ou
+ 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
+ #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
+--- a/bfd/elf32-microblaze.c
++++ b/bfd/elf32-microblaze.c
+@@ -2946,8 +2946,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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;
+@@ -2959,7 +2959,8 @@ microblaze_elf_size_dynamic_sections (bf
+ 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. */
+@@ -3477,7 +3478,7 @@ microblaze_elf_add_symbol_hook (bfd *abf
+ #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"
+--- a/bfd/elf32-mips.c
++++ b/bfd/elf32-mips.c
+@@ -2534,10 +2534,8 @@ static const struct ecoff_debug_swap mip
+ #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 \
+--- a/bfd/elf32-nds32.c
++++ b/bfd/elf32-nds32.c
+@@ -4302,8 +4302,8 @@ elf32_nds32_add_dynreloc (bfd *output_bf
+ /* 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 *ou
+ 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, a
+ #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
+--- a/bfd/elf32-nios2.c
++++ b/bfd/elf32-nios2.c
+@@ -5411,7 +5411,7 @@ nios2_elf32_adjust_dynamic_symbol (struc
+ 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)
+ {
+@@ -5438,7 +5438,7 @@ adjust_dynrelocs (struct elf_link_hash_e
+ 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
+@@ -5673,11 +5673,11 @@ allocate_dynrelocs (struct elf_link_hash
+ 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;
+@@ -5687,7 +5687,8 @@ nios2_elf32_size_dynamic_sections (bfd *
+
+ 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)
+@@ -6058,7 +6059,7 @@ const struct bfd_elf_special_section elf
+ 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
+--- a/bfd/elf32-or1k.c
++++ b/bfd/elf32-or1k.c
+@@ -3039,8 +3039,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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;
+@@ -3053,7 +3053,8 @@ or1k_elf_size_dynamic_sections (bfd *out
+ return false;
+
+ dynobj = htab->root.dynobj;
+- BFD_ASSERT (dynobj != NULL);
++ if (dynobj == NULL)
++ return true;
+
+ if (htab->root.dynamic_sections_created)
+ {
+@@ -3406,7 +3407,7 @@ or1k_grok_psinfo (bfd *abfd, Elf_Interna
+ #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
+
+--- a/bfd/elf32-ppc.c
++++ b/bfd/elf32-ppc.c
+@@ -5478,8 +5478,8 @@ static const unsigned char glink_eh_fram
+ /* 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;
+@@ -5487,11 +5487,12 @@ ppc_elf_size_dynamic_sections (bfd *outp
+ 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)
+ {
+@@ -10414,7 +10415,7 @@ ppc_elf_finish_dynamic_sections (bfd *ou
+ #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
+--- a/bfd/elf32-rl78.c
++++ b/bfd/elf32-rl78.c
+@@ -1440,8 +1440,8 @@ rl78_elf_finish_dynamic_sections (bfd *a
+ }
+
+ 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;
+@@ -2609,8 +2609,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
+
+--- 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
+@@ -1778,8 +1778,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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;
+@@ -1790,7 +1790,7 @@ elf_s390_size_dynamic_sections (bfd *out
+ htab = elf_s390_hash_table (info);
+ dynobj = htab->elf.dynobj;
+ if (dynobj == NULL)
+- abort ();
++ return true;
+
+ if (htab->elf.dynamic_sections_created)
+ {
+@@ -3926,7 +3926,7 @@ elf32_s390_merge_private_bfd_data (bfd *
+ #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
+--- a/bfd/elf32-score.c
++++ b/bfd/elf32-score.c
+@@ -1089,7 +1089,7 @@ score_elf_got_info (bfd *abfd, asection
+ 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 (
+ /* 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 (b
+
+ /* 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 (
+ }
+ 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. */
+@@ -4177,22 +4178,22 @@ _bfd_score_elf_adjust_dynamic_symbol (st
+ }
+
+ 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
+@@ -4455,10 +4456,10 @@ _bfd_score_elf_common_definition (Elf_In
+ _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
+--- a/bfd/elf32-score.h
++++ b/bfd/elf32-score.h
+@@ -78,10 +78,10 @@ s7_bfd_score_elf_adjust_dynamic_symbol (
+ 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 *);
+--- a/bfd/elf32-score7.c
++++ b/bfd/elf32-score7.c
+@@ -975,7 +975,7 @@ score_elf_got_info (bfd *abfd, asection
+ 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 (
+ 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 (b
+ /* 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 (
+ }
+ 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. */
+--- a/bfd/elf32-sh.c
++++ b/bfd/elf32-sh.c
+@@ -2925,7 +2925,7 @@ allocate_dynrelocs (struct elf_link_hash
+ 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));
+@@ -2940,8 +2940,8 @@ sh_elf_always_size_sections (bfd *output
+ /* 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;
+@@ -2954,7 +2954,8 @@ sh_elf_size_dynamic_sections (bfd *outpu
+ 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
+--- a/bfd/elf32-sparc.c
++++ b/bfd/elf32-sparc.c
+@@ -248,8 +248,7 @@ elf32_sparc_reloc_type_class (const stru
+ #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
+--- a/bfd/elf32-tic6x.c
++++ b/bfd/elf32-tic6x.c
+@@ -3160,7 +3160,7 @@ elf32_tic6x_allocate_dynrelocs (struct e
+ /* 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 *
+ 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 *
+ 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_b
+ #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 \
+--- a/bfd/elf32-tilegx.c
++++ b/bfd/elf32-tilegx.c
+@@ -105,7 +105,7 @@ tilegx_elf_grok_psinfo (bfd *abfd, Elf_I
+ #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
+--- a/bfd/elf32-tilepro.c
++++ b/bfd/elf32-tilepro.c
+@@ -2182,11 +2182,9 @@ tilepro_elf_omit_section_dynsym (bfd *ou
+ #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 *
+ 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
+ #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
+--- a/bfd/elf32-vax.c
++++ b/bfd/elf32-vax.c
+@@ -36,7 +36,6 @@ static bool elf_vax_check_relocs (bfd *,
+ 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_
+ /* 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 *outpu
+ /* 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 as
+ #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 \
+--- 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 *se
+ #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 \
+--- a/bfd/elf32-xtensa.c
++++ b/bfd/elf32-xtensa.c
+@@ -1557,8 +1557,8 @@ elf_xtensa_allocate_local_got_size (stru
+ /* 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 *o
+
+ 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 *o
+ }
+
+ 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;
+@@ -11537,8 +11536,8 @@ static const struct bfd_elf_special_sect
+ #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
+--- a/bfd/elf64-alpha.c
++++ b/bfd/elf64-alpha.c
+@@ -2579,8 +2579,8 @@ elf64_alpha_size_plt_section (struct bfd
+ }
+
+ 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;
+@@ -2806,8 +2806,8 @@ elf64_alpha_size_rela_got_section (struc
+ /* 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;
+@@ -2819,7 +2819,8 @@ elf64_alpha_size_dynamic_sections (bfd *
+ 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)
+ {
+@@ -5465,10 +5466,10 @@ static const struct elf_size_info alpha_
+ 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 \
+--- a/bfd/elf64-hppa.c
++++ b/bfd/elf64-hppa.c
+@@ -176,9 +176,6 @@ static bool elf64_hppa_adjust_dynamic_sy
+ 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_funct
+ 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 *o
+ 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
+@@ -3984,8 +3982,7 @@ const struct elf_size_info hppa64_elf_si
+ #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
+--- a/bfd/elf64-ia64-vms.c
++++ b/bfd/elf64-ia64-vms.c
+@@ -2590,8 +2590,8 @@ elf64_ia64_adjust_dynamic_symbol (struct
+ }
+
+ 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;
+@@ -2600,11 +2600,12 @@ elf64_ia64_size_dynamic_sections (bfd *o
+ 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. */
+@@ -5484,8 +5485,8 @@ static const struct elf_size_info elf64_
+ 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 \
+--- a/bfd/elf64-mips.c
++++ b/bfd/elf64-mips.c
+@@ -4745,10 +4745,10 @@ const struct elf_size_info mips_elf64_si
+ #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 \
+--- a/bfd/elf64-ppc.c
++++ b/bfd/elf64-ppc.c
+@@ -118,8 +118,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
+@@ -10118,7 +10118,7 @@ allocate_dynrelocs (struct elf_link_hash
+ ((((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. */
+
+@@ -10195,8 +10195,8 @@ size_global_entry_stubs (struct elf_link
+ /* 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;
+@@ -10211,7 +10211,7 @@ ppc64_elf_size_dynamic_sections (bfd *ou
+
+ dynobj = htab->elf.dynobj;
+ if (dynobj == NULL)
+- abort ();
++ return true;
+
+ if (htab->elf.dynamic_sections_created)
+ {
+--- 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
+ /* 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 *out
+
+ dynobj = htab->elf.dynobj;
+ if (dynobj == NULL)
+- abort ();
++ return true;
+
+ if (htab->elf.dynamic_sections_created)
+ {
+@@ -3912,7 +3912,7 @@ const struct elf_size_info s390_elf64_si
+ #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
+--- a/bfd/elf64-sparc.c
++++ b/bfd/elf64-sparc.c
+@@ -953,8 +953,8 @@ const struct elf_size_info elf64_sparc_s
+ _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 \
+--- a/bfd/elf64-tilegx.c
++++ b/bfd/elf64-tilegx.c
+@@ -106,7 +106,7 @@ tilegx_elf_grok_psinfo (bfd *abfd, Elf_I
+ #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
+--- a/bfd/elf64-x86-64.c
++++ b/bfd/elf64-x86-64.c
+@@ -2456,8 +2456,7 @@ elf_x86_64_scan_relocs (bfd *abfd, struc
+ }
+
+ 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;
+
+@@ -2470,7 +2469,7 @@ elf_x86_64_always_size_sections (bfd *ou
+ 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
+@@ -5384,7 +5383,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
+--- a/bfd/elflink.c
++++ b/bfd/elflink.c
+@@ -6619,8 +6619,8 @@ bfd_elf_size_dynamic_sections (bfd *outp
+
+ /* 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;
+@@ -7400,9 +7400,8 @@ NOTE: This behaviour is deprecated and w
+
+ /* 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)
+--- a/bfd/elfn32-mips.c
++++ b/bfd/elfn32-mips.c
+@@ -4131,10 +4131,8 @@ static const struct ecoff_debug_swap mip
+ #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 \
+--- 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
+@@ -8976,8 +8976,8 @@ elfNN_aarch64_allocate_local_ifunc_dynre
+ 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;
+@@ -8988,7 +8988,8 @@ elfNN_aarch64_size_dynamic_sections (bfd
+ 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)
+ {
+@@ -9390,8 +9391,8 @@ elfNN_aarch64_create_small_pltn_entry (s
+ _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;
+
+@@ -10126,8 +10127,8 @@ const struct elf_size_info elfNN_aarch64
+ #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
+@@ -10182,8 +10183,8 @@ const struct elf_size_info elfNN_aarch64
+ #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
+--- a/bfd/elfnn-ia64.c
++++ b/bfd/elfnn-ia64.c
+@@ -2986,8 +2986,8 @@ elfNN_ia64_adjust_dynamic_symbol (struct
+ }
+
+ 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;
+@@ -2998,8 +2998,9 @@ elfNN_ia64_size_dynamic_sections (bfd *o
+ 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. */
+@@ -5035,8 +5036,8 @@ ignore_errors (const char *fmt ATTRIBUTE
+ 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 \
+--- a/bfd/elfnn-loongarch.c
++++ b/bfd/elfnn-loongarch.c
+@@ -1574,8 +1574,8 @@ maybe_set_textrel (struct elf_link_hash_
+ }
+
+ 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;
+@@ -1585,7 +1585,8 @@ loongarch_elf_size_dynamic_sections (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)
+ {
+@@ -4140,7 +4141,7 @@ elf_loongarch64_hash_symbol (struct elf_
+ 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_finish_dynamic_sections \
+--- a/bfd/elfnn-riscv.c
++++ b/bfd/elfnn-riscv.c
+@@ -1348,7 +1348,7 @@ allocate_local_ifunc_dynrelocs (void **s
+ }
+
+ 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;
+@@ -1358,7 +1358,8 @@ riscv_elf_size_dynamic_sections (bfd *ou
+ 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)
+ {
+@@ -5341,7 +5342,7 @@ riscv_elf_merge_symbol_attribute (struct
+ #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
+--- a/bfd/elfxx-mips.c
++++ b/bfd/elfxx-mips.c
+@@ -9619,8 +9619,8 @@ _bfd_mips_elf_adjust_dynamic_symbol (str
+ 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;
+@@ -9963,8 +9963,8 @@ mips_elf_set_plt_sym_value (struct mips_
+ /* 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;
+@@ -9974,7 +9974,8 @@ _bfd_mips_elf_size_dynamic_sections (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)
+ {
+@@ -14899,7 +14900,7 @@ _bfd_mips_elf_final_link (bfd *abfd, str
+ 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
+@@ -14958,7 +14959,7 @@ _bfd_mips_elf_final_link (bfd *abfd, str
+ 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
+--- a/bfd/elfxx-mips.h
++++ b/bfd/elfxx-mips.h
+@@ -61,9 +61,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 *,
+--- a/bfd/elfxx-sparc.c
++++ b/bfd/elfxx-sparc.c
+@@ -2381,8 +2381,8 @@ _bfd_sparc_elf_omit_section_dynsym (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 (bf
+ 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)
+ {
+--- a/bfd/elfxx-sparc.h
++++ b/bfd/elfxx-sparc.h
+@@ -117,7 +117,7 @@ extern bool _bfd_sparc_elf_adjust_dynami
+ (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 *);
+--- a/bfd/elfxx-target.h
++++ b/bfd/elfxx-target.h
+@@ -487,11 +487,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
+@@ -849,8 +849,8 @@ static const struct elf_backend_data elf
+ 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,
+--- a/bfd/elfxx-tilegx.c
++++ b/bfd/elfxx-tilegx.c
+@@ -2430,8 +2430,8 @@ tilegx_elf_omit_section_dynsym (bfd *out
+ }
+
+ 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 *o
+ 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)
+ {
+--- 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 *,
+--- a/bfd/elfxx-x86.c
++++ b/bfd/elfxx-x86.c
+@@ -2225,7 +2225,7 @@ _bfd_elf_x86_valid_reloc_p (asection *in
+ /* 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;
+@@ -2241,7 +2241,7 @@ _bfd_x86_elf_size_dynamic_sections (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. */
+@@ -2948,8 +2948,8 @@ _bfd_x86_elf_finish_dynamic_sections (bf
+
+
+ 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;
+
+--- a/bfd/elfxx-x86.h
++++ b/bfd/elfxx-x86.h
+@@ -854,13 +854,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 *);
+
+-extern bool _bfd_x86_elf_size_dynamic_sections
++extern bool _bfd_x86_elf_late_size_sections
+ (bfd *, struct bfd_link_info *);
+
+ extern struct elf_x86_link_hash_table *_bfd_x86_elf_finish_dynamic_sections
+ (bfd *, struct bfd_link_info *);
+
+-extern bool _bfd_x86_elf_always_size_sections
++extern bool _bfd_x86_elf_early_size_sections
+ (bfd *, struct bfd_link_info *);
+
+ extern void _bfd_x86_elf_merge_symbol_attribute
+@@ -932,8 +932,8 @@ extern void _bfd_x86_elf_link_report_rel
+
+ #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 \
+--- a/ld/emultempl/vms.em
++++ b/ld/emultempl/vms.em
+@@ -196,10 +196,9 @@ gld${EMULATION_NAME}_before_allocation (
+
+ /* 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 ();
diff --git a/toolchain/binutils/patches/2.40/002-PR-30569-delete-_bfd_mips_elf_early_size_sections.patch b/toolchain/binutils/patches/2.40/002-PR-30569-delete-_bfd_mips_elf_early_size_sections.patch
new file mode 100644
index 0000000..8e5f1b7
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/002-PR-30569-delete-_bfd_mips_elf_early_size_sections.patch
@@ -0,0 +1,218 @@
+From 3c6c32951e292a51ede70b8087bb0308d7dbc4fc Mon Sep 17 00:00:00 2001
+From: Alan Modra <amodra@gmail.com>
+Date: Thu, 28 Mar 2024 20:33:32 +1030
+Subject: [PATCH 2/2] PR 30569, delete _bfd_mips_elf_early_size_sections
+
+PR30569 was triggered by a patch of mine 6540edd52cc0 moving the call
+to always_size_sections in bfd_elf_size_dynamic_sections earlier, made
+to support the x86 DT_RELR implementation. This broke mips16 code
+handling stubs when --export-dynamic is passed to the linker, because
+numerous symbols then became dynamic after always_size_sections. The
+mips backend fiddles with symbols in its always_size_sections. Maciej
+in 902e9fc76a0e had moved the call to always_size_sections to after
+the export-dynamic code. Prior to that, Nathan in 04c3a75556c0 moved
+it before the exec stack code, back to the start of
+bfd_elf_size_dynamic_sections which was where Ian put it originally
+in ff12f303355b. So the call has moved around a little. I'm leaving
+it where it is, and instead calling mips_elf_check_symbols from
+late_size_sections (the old size_dynamic_sections) which is now always
+called. In fact, the whole of _bfd_mips_elf_early_size_sections can
+be merged into _bfd_mips_elf_late_size_sections.
+---
+ bfd/elf32-mips.c | 1 -
+ bfd/elf64-mips.c | 2 --
+ bfd/elfn32-mips.c | 1 -
+ bfd/elfxx-mips.c | 84 +++++++++++++++++++----------------------------
+ bfd/elfxx-mips.h | 2 --
+ 5 files changed, 34 insertions(+), 56 deletions(-)
+
+--- a/bfd/elf32-mips.c
++++ b/bfd/elf32-mips.c
+@@ -2534,7 +2534,6 @@ static const struct ecoff_debug_swap mip
+ #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_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
+--- a/bfd/elf64-mips.c
++++ b/bfd/elf64-mips.c
+@@ -4745,8 +4745,6 @@ const struct elf_size_info mips_elf64_si
+ #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_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
+--- a/bfd/elfn32-mips.c
++++ b/bfd/elfn32-mips.c
+@@ -4131,7 +4131,6 @@ static const struct ecoff_debug_swap mip
+ #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_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
+--- a/bfd/elfxx-mips.c
++++ b/bfd/elfxx-mips.c
+@@ -9614,48 +9614,6 @@ _bfd_mips_elf_adjust_dynamic_symbol (str
+ return _bfd_elf_adjust_dynamic_copy (info, h, s);
+ }
+
+-/* This function is called after all the input files have been read,
+- and the input sections have been assigned to output sections. We
+- check for any mips16 stub sections that we can discard. */
+-
+-bool
+-_bfd_mips_elf_early_size_sections (bfd *output_bfd,
+- struct bfd_link_info *info)
+-{
+- asection *sect;
+- struct mips_elf_link_hash_table *htab;
+- struct mips_htab_traverse_info hti;
+-
+- htab = mips_elf_hash_table (info);
+- BFD_ASSERT (htab != NULL);
+-
+- /* The .reginfo section has a fixed size. */
+- sect = bfd_get_section_by_name (output_bfd, ".reginfo");
+- if (sect != NULL)
+- {
+- bfd_set_section_size (sect, sizeof (Elf32_External_RegInfo));
+- sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
+- }
+-
+- /* The .MIPS.abiflags section has a fixed size. */
+- sect = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
+- if (sect != NULL)
+- {
+- bfd_set_section_size (sect, sizeof (Elf_External_ABIFlags_v0));
+- sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
+- }
+-
+- hti.info = info;
+- hti.output_bfd = output_bfd;
+- hti.error = false;
+- mips_elf_link_hash_traverse (mips_elf_hash_table (info),
+- mips_elf_check_symbols, &hti);
+- if (hti.error)
+- return false;
+-
+- return true;
+-}
+-
+ /* If the link uses a GOT, lay it out and work out its size. */
+
+ static bool
+@@ -9960,7 +9918,8 @@ mips_elf_set_plt_sym_value (struct mips_
+ return true;
+ }
+
+-/* Set the sizes of the dynamic sections. */
++/* Set the sizes of the dynamic sections, some mips non-dynamic sections,
++ and check for any mips16 stub sections that we can discard. */
+
+ bool
+ _bfd_mips_elf_late_size_sections (bfd *output_bfd,
+@@ -9970,14 +9929,39 @@ _bfd_mips_elf_late_size_sections (bfd *o
+ asection *s, *sreldyn;
+ bool reltext;
+ struct mips_elf_link_hash_table *htab;
++ struct mips_htab_traverse_info hti;
+
+ htab = mips_elf_hash_table (info);
+ BFD_ASSERT (htab != NULL);
+- dynobj = elf_hash_table (info)->dynobj;
++
++ /* The .reginfo section has a fixed size. */
++ s = bfd_get_section_by_name (output_bfd, ".reginfo");
++ if (s != NULL)
++ {
++ bfd_set_section_size (s, sizeof (Elf32_External_RegInfo));
++ s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
++ }
++
++ /* The .MIPS.abiflags section has a fixed size. */
++ s = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
++ if (s != NULL)
++ {
++ bfd_set_section_size (s, sizeof (Elf_External_ABIFlags_v0));
++ s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
++ }
++
++ hti.info = info;
++ hti.output_bfd = output_bfd;
++ hti.error = false;
++ mips_elf_link_hash_traverse (htab, mips_elf_check_symbols, &hti);
++ if (hti.error)
++ return false;
++
++ dynobj = htab->root.dynobj;
+ if (dynobj == NULL)
+ return true;
+
+- if (elf_hash_table (info)->dynamic_sections_created)
++ if (htab->root.dynamic_sections_created)
+ {
+ /* Set the contents of the .interp section to the interpreter. */
+ if (bfd_link_executable (info) && !info->nointerp)
+@@ -10117,7 +10101,7 @@ _bfd_mips_elf_late_size_sections (bfd *o
+ }
+ }
+ else if (bfd_link_executable (info)
+- && ! mips_elf_hash_table (info)->use_rld_obj_head
++ && !htab->use_rld_obj_head
+ && startswith (name, ".rld_map"))
+ {
+ /* We add a room for __rld_map. It will be filled in by the
+@@ -10126,7 +10110,7 @@ _bfd_mips_elf_late_size_sections (bfd *o
+ }
+ else if (SGI_COMPAT (output_bfd)
+ && startswith (name, ".compact_rel"))
+- s->size += mips_elf_hash_table (info)->compact_rel_size;
++ s->size += htab->compact_rel_size;
+ else if (s == htab->root.splt)
+ {
+ /* If the last PLT entry has a branch delay slot, allocate
+@@ -10166,7 +10150,7 @@ _bfd_mips_elf_late_size_sections (bfd *o
+ }
+ }
+
+- if (elf_hash_table (info)->dynamic_sections_created)
++ if (htab->root.dynamic_sections_created)
+ {
+ /* Add some entries to the .dynamic section. We fill in the
+ values later, in _bfd_mips_elf_finish_dynamic_sections, but we
+@@ -14900,7 +14884,7 @@ _bfd_mips_elf_final_link (bfd *abfd, str
+ input_section->flags &= ~SEC_HAS_CONTENTS;
+ }
+
+- /* Size has been set in _bfd_mips_elf_early_size_sections. */
++ /* Size has been set in _bfd_mips_elf_late_size_sections. */
+ BFD_ASSERT(o->size == sizeof (Elf_External_ABIFlags_v0));
+
+ /* Skip this section later on (I don't think this currently
+@@ -14959,7 +14943,7 @@ _bfd_mips_elf_final_link (bfd *abfd, str
+ input_section->flags &= ~SEC_HAS_CONTENTS;
+ }
+
+- /* Size has been set in _bfd_mips_elf_early_size_sections. */
++ /* Size has been set in _bfd_mips_elf_late_size_sections. */
+ BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
+
+ /* Skip this section later on (I don't think this currently
+--- a/bfd/elfxx-mips.h
++++ b/bfd/elfxx-mips.h
+@@ -61,8 +61,6 @@ 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_early_size_sections
+- (bfd *, struct bfd_link_info *);
+ extern bool _bfd_mips_elf_late_size_sections
+ (bfd *, struct bfd_link_info *);
+ extern int _bfd_mips_elf_relocate_section
diff --git a/toolchain/binutils/patches/2.40/005-libctf-update-regexp-to-allow-makeinfo-to-build-docu.patch b/toolchain/binutils/patches/2.40/005-libctf-update-regexp-to-allow-makeinfo-to-build-docu.patch
new file mode 100644
index 0000000..19af340
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/005-libctf-update-regexp-to-allow-makeinfo-to-build-docu.patch
@@ -0,0 +1,70 @@
+From f7c5db99b76e8dde89335d794c82fcbfbf53c612 Mon Sep 17 00:00:00 2001
+From: Enze Li <enze.li@hotmail.com>
+Date: Sat, 14 Jan 2023 11:33:48 +0800
+Subject: [PATCH 05/50] libctf: update regexp to allow makeinfo to build
+ document
+
+While trying to build gdb on latest openSUSE Tumbleweed, I noticed the
+following warning,
+
+ checking for makeinfo... makeinfo --split-size=5000000
+ configure: WARNING:
+ *** Makeinfo is too old. Info documentation will not be built.
+
+then I checked the version of makeinfo, it said,
+======
+$ makeinfo --version
+texi2any (GNU texinfo) 7.0.1
+
+Copyright (C) 2022 Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+======
+
+After digging a little bit, it became quite obvious that a dot is
+missing in regexp that makes it impossible to match versions higher than
+7.0, and here's the solution:
+
+- | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9][0-9])' >/dev/null 2>&1; then
++ | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9]\.[0-9])' >/dev/null 2>&1; then
+
+However, Eli pointed out that the solution above has another problem: it
+will stop working when Texinfo 10.1 will be released. Meanwhile, he
+suggested to solve this problem permanently. That is, we don't care
+about the minor version for Texinfo > 6.9, we only care about the major
+version.
+
+In this way, the problem will be resolved permanently, thanks to Eli.
+
+libctf/ChangeLog:
+
+ * configure: Regenerated.
+ * configure.ac: Update regexp to match versions higher than 7.0.
+---
+ libctf/configure | 2 +-
+ libctf/configure.ac | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+--- a/libctf/configure
++++ b/libctf/configure
+@@ -14865,7 +14865,7 @@ esac
+ # We require texinfo to be 6.3 or later, for a working synindex
+ # and validatemenus: otherwise we fall back to /bin/true.
+ if ${MAKEINFO} --version \
+- | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9][0-9])' >/dev/null 2>&1; then
++ | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9]|[1-6][0-9])' >/dev/null 2>&1; then
+ build_info=yes
+ else
+ build_info=
+--- a/libctf/configure.ac
++++ b/libctf/configure.ac
+@@ -184,7 +184,7 @@ changequote(,)
+ # We require texinfo to be 6.3 or later, for a working synindex
+ # and validatemenus: otherwise we fall back to /bin/true.
+ if ${MAKEINFO} --version \
+- | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9][0-9])' >/dev/null 2>&1; then
++ | egrep 'texinfo[^0-9]*(6\.[3-9]|[7-9]|[1-6][0-9])' >/dev/null 2>&1; then
+ build_info=yes
+ else
+ build_info=
diff --git a/toolchain/binutils/patches/2.40/007-Fix-version-number-snafu-in-some-configuration-files.patch b/toolchain/binutils/patches/2.40/007-Fix-version-number-snafu-in-some-configuration-files.patch
new file mode 100644
index 0000000..0676240
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/007-Fix-version-number-snafu-in-some-configuration-files.patch
@@ -0,0 +1,444 @@
+From 59706683feafb6252d0ad369cf8759f75fd147be Mon Sep 17 00:00:00 2001
+From: Nick Clifton <nickc@redhat.com>
+Date: Tue, 17 Jan 2023 12:02:56 +0000
+Subject: [PATCH 07/50] Fix version number snafu in some configuration files:
+ 2.40.00 should be 2.40
+
+---
+ binutils/configure | 20 ++++++++++----------
+ gprof/configure | 20 ++++++++++----------
+ gprofng/configure | 20 ++++++++++----------
+ gprofng/doc/version.texi | 4 ++--
+ gprofng/libcollector/configure | 20 ++++++++++----------
+ ld/configure | 20 ++++++++++----------
+ 6 files changed, 52 insertions(+), 52 deletions(-)
+
+--- a/binutils/configure
++++ b/binutils/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for binutils 2.40.00.
++# Generated by GNU Autoconf 2.69 for binutils 2.40.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='binutils'
+ PACKAGE_TARNAME='binutils'
+-PACKAGE_VERSION='2.40.00'
+-PACKAGE_STRING='binutils 2.40.00'
++PACKAGE_VERSION='2.40'
++PACKAGE_STRING='binutils 2.40'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1401,7 +1401,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures binutils 2.40.00 to adapt to many kinds of systems.
++\`configure' configures binutils 2.40 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1472,7 +1472,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of binutils 2.40.00:";;
++ short | recursive ) echo "Configuration of binutils 2.40:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1631,7 +1631,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-binutils configure 2.40.00
++binutils configure 2.40
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -2099,7 +2099,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by binutils $as_me 2.40.00, which was
++It was created by binutils $as_me 2.40, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -3081,7 +3081,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='binutils'
+- VERSION='2.40.00'
++ VERSION='2.40'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -15326,7 +15326,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by binutils $as_me 2.40.00, which was
++This file was extended by binutils $as_me 2.40, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -15392,7 +15392,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-binutils config.status 2.40.00
++binutils config.status 2.40
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+--- a/gprof/configure
++++ b/gprof/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for gprof 2.40.00.
++# Generated by GNU Autoconf 2.69 for gprof 2.40.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='gprof'
+ PACKAGE_TARNAME='gprof'
+-PACKAGE_VERSION='2.40.00'
+-PACKAGE_STRING='gprof 2.40.00'
++PACKAGE_VERSION='2.40'
++PACKAGE_STRING='gprof 2.40'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1338,7 +1338,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures gprof 2.40.00 to adapt to many kinds of systems.
++\`configure' configures gprof 2.40 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1409,7 +1409,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of gprof 2.40.00:";;
++ short | recursive ) echo "Configuration of gprof 2.40:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1520,7 +1520,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-gprof configure 2.40.00
++gprof configure 2.40
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -1885,7 +1885,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by gprof $as_me 2.40.00, which was
++It was created by gprof $as_me 2.40, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -2864,7 +2864,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='gprof'
+- VERSION='2.40.00'
++ VERSION='2.40'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -12572,7 +12572,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by gprof $as_me 2.40.00, which was
++This file was extended by gprof $as_me 2.40, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -12638,7 +12638,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-gprof config.status 2.40.00
++gprof config.status 2.40
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+--- a/gprofng/configure
++++ b/gprofng/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for gprofng 2.40.00.
++# Generated by GNU Autoconf 2.69 for gprofng 2.40.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='gprofng'
+ PACKAGE_TARNAME='gprofng'
+-PACKAGE_VERSION='2.40.00'
+-PACKAGE_STRING='gprofng 2.40.00'
++PACKAGE_VERSION='2.40'
++PACKAGE_STRING='gprofng 2.40'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1362,7 +1362,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures gprofng 2.40.00 to adapt to many kinds of systems.
++\`configure' configures gprofng 2.40 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1433,7 +1433,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of gprofng 2.40.00:";;
++ short | recursive ) echo "Configuration of gprofng 2.40:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1547,7 +1547,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-gprofng configure 2.40.00
++gprofng configure 2.40
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -2079,7 +2079,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by gprofng $as_me 2.40.00, which was
++It was created by gprofng $as_me 2.40, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -3052,7 +3052,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='gprofng'
+- VERSION='2.40.00'
++ VERSION='2.40'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -17467,7 +17467,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by gprofng $as_me 2.40.00, which was
++This file was extended by gprofng $as_me 2.40, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -17533,7 +17533,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-gprofng config.status 2.40.00
++gprofng config.status 2.40
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+--- a/gprofng/doc/version.texi
++++ b/gprofng/doc/version.texi
+@@ -1,4 +1,4 @@
+ @set UPDATED 5 January 2023
+ @set UPDATED-MONTH January 2023
+-@set EDITION 2.40.00
+-@set VERSION 2.40.00
++@set EDITION 2.40
++@set VERSION 2.40
+--- a/gprofng/libcollector/configure
++++ b/gprofng/libcollector/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for gprofng 2.40.00.
++# Generated by GNU Autoconf 2.69 for gprofng 2.40.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='gprofng'
+ PACKAGE_TARNAME='gprofng'
+-PACKAGE_VERSION='2.40.00'
+-PACKAGE_STRING='gprofng 2.40.00'
++PACKAGE_VERSION='2.40'
++PACKAGE_STRING='gprofng 2.40'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1325,7 +1325,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures gprofng 2.40.00 to adapt to many kinds of systems.
++\`configure' configures gprofng 2.40 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1396,7 +1396,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of gprofng 2.40.00:";;
++ short | recursive ) echo "Configuration of gprofng 2.40:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1505,7 +1505,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-gprofng configure 2.40.00
++gprofng configure 2.40
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -1991,7 +1991,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by gprofng $as_me 2.40.00, which was
++It was created by gprofng $as_me 2.40, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -2968,7 +2968,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='gprofng'
+- VERSION='2.40.00'
++ VERSION='2.40'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -16098,7 +16098,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by gprofng $as_me 2.40.00, which was
++This file was extended by gprofng $as_me 2.40, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -16164,7 +16164,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-gprofng config.status 2.40.00
++gprofng config.status 2.40
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+--- a/ld/configure
++++ b/ld/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for ld 2.40.00.
++# Generated by GNU Autoconf 2.69 for ld 2.40.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='ld'
+ PACKAGE_TARNAME='ld'
+-PACKAGE_VERSION='2.40.00'
+-PACKAGE_STRING='ld 2.40.00'
++PACKAGE_VERSION='2.40'
++PACKAGE_STRING='ld 2.40'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1423,7 +1423,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures ld 2.40.00 to adapt to many kinds of systems.
++\`configure' configures ld 2.40 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1494,7 +1494,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of ld 2.40.00:";;
++ short | recursive ) echo "Configuration of ld 2.40:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1661,7 +1661,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-ld configure 2.40.00
++ld configure 2.40
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -2376,7 +2376,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by ld $as_me 2.40.00, which was
++It was created by ld $as_me 2.40, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -3359,7 +3359,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='ld'
+- VERSION='2.40.00'
++ VERSION='2.40'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -18083,7 +18083,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by ld $as_me 2.40.00, which was
++This file was extended by ld $as_me 2.40, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -18149,7 +18149,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-ld config.status 2.40.00
++ld config.status 2.40
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
diff --git a/toolchain/binutils/patches/2.40/010-toplevel-Makefile.def-add-install-strip-dependency-o.patch b/toolchain/binutils/patches/2.40/010-toplevel-Makefile.def-add-install-strip-dependency-o.patch
new file mode 100644
index 0000000..bef40f5
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/010-toplevel-Makefile.def-add-install-strip-dependency-o.patch
@@ -0,0 +1,60 @@
+From bcea253f5fa194e57f9564e8461c718e228bd26e Mon Sep 17 00:00:00 2001
+From: Indu Bhagat <indu.bhagat@oracle.com>
+Date: Wed, 18 Jan 2023 23:17:49 -0800
+Subject: [PATCH 10/50] toplevel: Makefile.def: add install-strip dependency on
+ libsframe
+
+As noted in PR libsframe/30014 - FTBFS: install-strip fails because
+bfdlib relinks and fails to find libsframe, the install time
+dependencies of libbfd need to be updated.
+
+ PR libsframe/30014
+ * Makefile.def: Reflect that libsframe needs to installed before
+ libbfd. Reorder a bit to better track libsframe dependencies.
+ * Makefile.in: Regenerate.
+
+(cherry picked from commit b8d21eb0cd10d6127e77cc437d82e949adb0c454)
+---
+ Makefile.def | 5 ++++-
+ Makefile.in | 3 ++-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+--- a/Makefile.def
++++ b/Makefile.def
+@@ -493,7 +493,6 @@ dependencies = { module=install-binutils
+ dependencies = { module=install-strip-binutils; on=install-strip-opcodes; };
+
+ // Likewise for ld, libctf, and bfd.
+-dependencies = { module=install-bfd; on=install-libsframe; };
+ dependencies = { module=install-libctf; on=install-bfd; };
+ dependencies = { module=install-ld; on=install-bfd; };
+ dependencies = { module=install-ld; on=install-libctf; };
+@@ -501,6 +500,10 @@ dependencies = { module=install-strip-li
+ dependencies = { module=install-strip-ld; on=install-strip-bfd; };
+ dependencies = { module=install-strip-ld; on=install-strip-libctf; };
+
++// libbfd depends on libsframe
++dependencies = { module=install-bfd; on=install-libsframe; };
++dependencies = { module=install-strip-bfd; on=install-strip-libsframe; };
++
+ // libopcodes depends on libbfd
+ dependencies = { module=configure-opcodes; on=configure-bfd; hard=true; };
+ dependencies = { module=install-opcodes; on=install-bfd; };
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -64549,13 +64549,14 @@ all-stageautoprofile-binutils: maybe-all
+ all-stageautofeedback-binutils: maybe-all-stageautofeedback-libsframe
+ install-binutils: maybe-install-opcodes
+ install-strip-binutils: maybe-install-strip-opcodes
+-install-bfd: maybe-install-libsframe
+ install-libctf: maybe-install-bfd
+ install-ld: maybe-install-bfd
+ install-ld: maybe-install-libctf
+ install-strip-libctf: maybe-install-strip-bfd
+ install-strip-ld: maybe-install-strip-bfd
+ install-strip-ld: maybe-install-strip-libctf
++install-bfd: maybe-install-libsframe
++install-strip-bfd: maybe-install-strip-libsframe
+ configure-opcodes: configure-bfd
+ configure-stage1-opcodes: configure-stage1-bfd
+ configure-stage2-opcodes: configure-stage2-bfd
diff --git a/toolchain/binutils/patches/2.40/018-gprofng-PR29521-docs-man-pages-are-not-in-the-releas.patch b/toolchain/binutils/patches/2.40/018-gprofng-PR29521-docs-man-pages-are-not-in-the-releas.patch
new file mode 100644
index 0000000..ae55764
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/018-gprofng-PR29521-docs-man-pages-are-not-in-the-releas.patch
@@ -0,0 +1,703 @@
+From c6e269febbc946a54ed9dbbb2dc70feba6017607 Mon Sep 17 00:00:00 2001
+From: Vladimir Mezentsev <vladimir.mezentsev@oracle.com>
+Date: Fri, 20 Jan 2023 15:39:55 -0800
+Subject: [PATCH 18/50] gprofng: PR29521 [docs] man pages are not in the
+ release tarball
+
+gprofng/ChangeLog
+2023-01-20 Vladimir Mezentsev <vladimir.mezentsev@oracle.com>
+
+ PR gprofng/29521
+ * configure.ac: Check if $MAKEINFO and $HELP2MAN are missing.
+ * Makefile.am: Build doc if $MAKEINFO exists.
+ * doc/gprofng.texi: Update documentation for gprofng.
+ * doc/Makefile.am: Build gprofng.1.
+ * src/Makefile.am: Move the build of gprofng.1 to doc/Makefile.am.
+ * configure: Rebuild.
+ * Makefile.in: Rebuild.
+ * doc/Makefile.in: Rebuild.
+ * src/Makefile.in: Rebuild.
+---
+ gprofng/Makefile.am | 2 +-
+ gprofng/Makefile.in | 2 +-
+ gprofng/configure | 79 +++++++++++++++---
+ gprofng/configure.ac | 21 +++--
+ gprofng/doc/Makefile.am | 24 +++++-
+ gprofng/doc/Makefile.in | 93 ++++++++++++++++++---
+ gprofng/doc/gprofng.texi | 169 +++++++++++++++++++++++++++++++++++++++
+ gprofng/src/Makefile.am | 8 +-
+ gprofng/src/Makefile.in | 8 +-
+ 9 files changed, 364 insertions(+), 42 deletions(-)
+
+--- a/gprofng/Makefile.am
++++ b/gprofng/Makefile.am
+@@ -23,7 +23,7 @@ AUTOMAKE_OPTIONS = dejagnu foreign
+ if BUILD_COLLECTOR
+ COLLECTOR_SUBDIRS = libcollector
+ endif
+-if BUILD_MAN
++if BUILD_DOC
+ DOC_SUBDIR = doc
+ endif
+ if BUILD_SRC
+--- a/gprofng/Makefile.in
++++ b/gprofng/Makefile.in
+@@ -381,7 +381,7 @@ zlibinc = @zlibinc@
+ ACLOCAL_AMFLAGS = -I . -I ..
+ AUTOMAKE_OPTIONS = dejagnu foreign
+ @BUILD_COLLECTOR_TRUE@COLLECTOR_SUBDIRS = libcollector
+-@BUILD_MAN_TRUE@DOC_SUBDIR = doc
++@BUILD_DOC_TRUE@DOC_SUBDIR = doc
+ @BUILD_SRC_TRUE@SRC_SUBDIRS = src gp-display-html $(DOC_SUBDIR)
+ SUBDIRS = $(COLLECTOR_SUBDIRS) $(SRC_SUBDIRS)
+ DIST_SUBDIRS = libcollector src gp-display-html $(DOC_SUBDIR)
+--- a/gprofng/configure
++++ b/gprofng/configure
+@@ -639,6 +639,8 @@ GPROFNG_CPPFLAGS
+ GPROFNG_NO_FORMAT_TRUNCATION_CFLAGS
+ GPROFNG_CFLAGS
+ LD_NO_AS_NEEDED
++BUILD_DOC_FALSE
++BUILD_DOC_TRUE
+ BUILD_MAN_FALSE
+ BUILD_MAN_TRUE
+ HELP2MAN
+@@ -12221,7 +12223,7 @@ else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+-#line 12224 "configure"
++#line 12226 "configure"
+ #include "confdefs.h"
+
+ #if HAVE_DLFCN_H
+@@ -12327,7 +12329,7 @@ else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<_LT_EOF
+-#line 12330 "configure"
++#line 12332 "configure"
+ #include "confdefs.h"
+
+ #if HAVE_DLFCN_H
+@@ -16737,9 +16739,58 @@ fi
+
+ # Generate manpages, if possible.
+ build_man=false
++build_doc=false
+ if test $cross_compiling = no; then
++ for ac_prog in help2man
++do
++ # Extract the first word of "$ac_prog", so it can be a program name with args.
++set dummy $ac_prog; ac_word=$2
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
++$as_echo_n "checking for $ac_word... " >&6; }
++if ${ac_cv_prog_HELP2MAN+:} false; then :
++ $as_echo_n "(cached) " >&6
++else
++ if test -n "$HELP2MAN"; then
++ ac_cv_prog_HELP2MAN="$HELP2MAN" # Let the user override the test.
++else
++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
++for as_dir in $PATH
++do
++ IFS=$as_save_IFS
++ test -z "$as_dir" && as_dir=.
++ for ac_exec_ext in '' $ac_executable_extensions; do
++ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
++ ac_cv_prog_HELP2MAN="$ac_prog"
++ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
++ break 2
++ fi
++done
++ done
++IFS=$as_save_IFS
++
++fi
++fi
++HELP2MAN=$ac_cv_prog_HELP2MAN
++if test -n "$HELP2MAN"; then
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HELP2MAN" >&5
++$as_echo "$HELP2MAN" >&6; }
++else
++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
++$as_echo "no" >&6; }
++fi
+
+-HELP2MAN=${HELP2MAN-"${am_missing_run}help2man"}
++
++ test -n "$HELP2MAN" && break
++done
++test -n "$HELP2MAN" || HELP2MAN="$MISSING help2man"
++
++ case "x$HELP2MAN" in
++ x | */missing\ help2man* )
++ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: gprofng: help2man is missing. Man pages will not be built." >&5
++$as_echo "$as_me: WARNING: gprofng: help2man is missing. Man pages will not be built." >&2;}
++ ;;
++ * ) build_man=true ;;
++ esac
+
+ for ac_prog in makeinfo
+ do
+@@ -16782,10 +16833,10 @@ fi
+
+ test -n "$MAKEINFO" && break
+ done
+-test -n "$MAKEINFO" || MAKEINFO=""@echo makeinfo missing; true""
++test -n "$MAKEINFO" || MAKEINFO="$MISSING makeinfo"
+
+- case "$MAKEINFO" in
+- *true)
++ case "x$MAKEINFO" in
++ x | */missing\ makeinfo*)
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: gprofng: makeinfo is missing. Info documentation will not be built." >&5
+ $as_echo "$as_me: WARNING: gprofng: makeinfo is missing. Info documentation will not be built." >&2;}
+ ;;
+@@ -16796,9 +16847,7 @@ $as_echo "$as_me: WARNING: gprofng: make
+ $as_echo "$as_me: WARNING: gprofng: $MAKEINFO is too old. Info documentation will not be built." >&2;}
+ MAKEINFO="@echo $MAKEINFO is too old, 6.5 or newer required; true"
+ ;;
+- x* )
+- build_man=true
+- ;;
++ x* ) build_doc=true ;;
+ esac
+ ;;
+ esac
+@@ -16812,6 +16861,14 @@ else
+ BUILD_MAN_FALSE=
+ fi
+
++ if test x$build_doc = xtrue; then
++ BUILD_DOC_TRUE=
++ BUILD_DOC_FALSE='#'
++else
++ BUILD_DOC_TRUE='#'
++ BUILD_DOC_FALSE=
++fi
++
+
+ LD_NO_AS_NEEDED=${no_as_needed}
+
+@@ -17070,6 +17127,10 @@ if test -z "${BUILD_MAN_TRUE}" && test -
+ as_fn_error $? "conditional \"BUILD_MAN\" was never defined.
+ Usually this means the macro was only invoked conditionally." "$LINENO" 5
+ fi
++if test -z "${BUILD_DOC_TRUE}" && test -z "${BUILD_DOC_FALSE}"; then
++ as_fn_error $? "conditional \"BUILD_DOC\" was never defined.
++Usually this means the macro was only invoked conditionally." "$LINENO" 5
++fi
+
+ : "${CONFIG_STATUS=./config.status}"
+ ac_write_fail=0
+--- a/gprofng/configure.ac
++++ b/gprofng/configure.ac
+@@ -210,11 +210,19 @@ AM_ZLIB
+
+ # Generate manpages, if possible.
+ build_man=false
++build_doc=false
+ if test $cross_compiling = no; then
+- AM_MISSING_PROG(HELP2MAN, help2man)
+- AC_CHECK_PROGS([MAKEINFO], makeinfo, ["@echo makeinfo missing; true"])
+- case "$MAKEINFO" in
+- *true)
++ AC_CHECK_PROGS([HELP2MAN], help2man, [$MISSING help2man])
++ case "x$HELP2MAN" in
++ x | */missing\ help2man* )
++ AC_MSG_WARN([gprofng: help2man is missing. Man pages will not be built.])
++ ;;
++ * ) build_man=true ;;
++ esac
++
++ AC_CHECK_PROGS([MAKEINFO], makeinfo, [$MISSING makeinfo])
++ case "x$MAKEINFO" in
++ x | */missing\ makeinfo*)
+ AC_MSG_WARN([gprofng: makeinfo is missing. Info documentation will not be built.])
+ ;;
+ *)
+@@ -223,15 +231,14 @@ if test $cross_compiling = no; then
+ AC_MSG_WARN([gprofng: $MAKEINFO is too old. Info documentation will not be built.])
+ MAKEINFO="@echo $MAKEINFO is too old, 6.5 or newer required; true"
+ ;;
+- x* )
+- build_man=true
+- ;;
++ x* ) build_doc=true ;;
+ esac
+ ;;
+ esac
+ AC_SUBST(MAKEINFO)
+ fi
+ AM_CONDITIONAL([BUILD_MAN], [test x$build_man = xtrue])
++AM_CONDITIONAL([BUILD_DOC], [test x$build_doc = xtrue])
+
+ AC_SUBST(LD_NO_AS_NEEDED, [${no_as_needed}])
+ AC_SUBST(GPROFNG_CFLAGS, [${gprofng_cflags}])
+--- a/gprofng/doc/Makefile.am
++++ b/gprofng/doc/Makefile.am
+@@ -19,9 +19,31 @@
+
+ AUTOMAKE_OPTIONS = info-in-builddir foreign no-texinfo.tex
+
++# Options to extract the man page
++MANCONF = -Dman
++
++TEXI2POD = perl $(srcdir)/../../etc/texi2pod.pl $(AM_MAKEINFOFLAGS)
++POD2MAN = pod2man --center="User Commands" \
++ --release="binutils-$(VERSION)" --section=1
++
+ info_TEXINFOS = gprofng.texi
+ gprofng_TEXINFOS = fdl.texi
+ TEXINFO_TEX = .
+ MAKEINFOHTML = $(MAKEINFO) --html --no-split
+
+-MAINTAINERCLEANFILES = gprofng.info
++man_MANS = gprofng.1
++
++# Build the man page from the texinfo file
++# The sed command removes the no-adjust Nroff command so that
++# the man output looks standard.
++gprofng.1: $(srcdir)/gprofng.texi
++ $(AM_V_GEN)touch $@
++ $(AM_V_at)-$(TEXI2POD) $(MANCONF) < $(srcdir)/gprofng.texi > gprofng.pod
++ $(AM_V_at)-($(POD2MAN) gprofng.pod | \
++ sed -e '/^.if n .na/d' > $@.tmp && \
++ mv -f $@.tmp $@) || (rm -f $@.tmp && exit 1)
++ $(AM_V_at)rm -f gprofng.pod
++
++MAINTAINERCLEANFILES = gprofng.info $(man_MANS)
++
++info: $(man_MANS)
+--- a/gprofng/doc/Makefile.in
++++ b/gprofng/doc/Makefile.in
+@@ -182,7 +182,7 @@ am__can_run_installinfo = \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+-am__installdirs = "$(DESTDIR)$(infodir)"
++am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"
+ am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+ am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+@@ -210,6 +210,9 @@ am__uninstall_files_from_dir = { \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
++man1dir = $(mandir)/man1
++NROFF = nroff
++MANS = $(man_MANS)
+ am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+ am__DIST_COMMON = $(gprofng_TEXINFOS) $(srcdir)/Makefile.in \
+ $(top_srcdir)/../mkinstalldirs mdate-sh texinfo.tex
+@@ -361,11 +364,19 @@ top_srcdir = @top_srcdir@
+ zlibdir = @zlibdir@
+ zlibinc = @zlibinc@
+ AUTOMAKE_OPTIONS = info-in-builddir foreign no-texinfo.tex
++
++# Options to extract the man page
++MANCONF = -Dman
++TEXI2POD = perl $(srcdir)/../../etc/texi2pod.pl $(AM_MAKEINFOFLAGS)
++POD2MAN = pod2man --center="User Commands" \
++ --release="binutils-$(VERSION)" --section=1
++
+ info_TEXINFOS = gprofng.texi
+ gprofng_TEXINFOS = fdl.texi
+ TEXINFO_TEX = .
+ MAKEINFOHTML = $(MAKEINFO) --html --no-split
+-MAINTAINERCLEANFILES = gprofng.info
++man_MANS = gprofng.1
++MAINTAINERCLEANFILES = gprofng.info $(man_MANS)
+ all: all-am
+
+ .SUFFIXES:
+@@ -558,6 +569,49 @@ maintainer-clean-aminfo:
+ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \
+ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \
+ done
++install-man1: $(man_MANS)
++ @$(NORMAL_INSTALL)
++ @list1=''; \
++ list2='$(man_MANS)'; \
++ test -n "$(man1dir)" \
++ && test -n "`echo $$list1$$list2`" \
++ || exit 0; \
++ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \
++ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \
++ { for i in $$list1; do echo "$$i"; done; \
++ if test -n "$$list2"; then \
++ for i in $$list2; do echo "$$i"; done \
++ | sed -n '/\.1[a-z]*$$/p'; \
++ fi; \
++ } | while read p; do \
++ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \
++ echo "$$d$$p"; echo "$$p"; \
++ done | \
++ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
++ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \
++ sed 'N;N;s,\n, ,g' | { \
++ list=; while read file base inst; do \
++ if test "$$base" = "$$inst"; then list="$$list $$file"; else \
++ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
++ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \
++ fi; \
++ done; \
++ for i in $$list; do echo "$$i"; done | $(am__base_list) | \
++ while read files; do \
++ test -z "$$files" || { \
++ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \
++ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \
++ done; }
++
++uninstall-man1:
++ @$(NORMAL_UNINSTALL)
++ @list=''; test -n "$(man1dir)" || exit 0; \
++ files=`{ for i in $$list; do echo "$$i"; done; \
++ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \
++ sed -n '/\.1[a-z]*$$/p'; \
++ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
++ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
++ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
+ tags TAGS:
+
+ ctags CTAGS:
+@@ -600,9 +654,9 @@ distdir: $(DISTFILES)
+ dist-info
+ check-am: all-am
+ check: check-am
+-all-am: Makefile $(INFO_DEPS)
++all-am: Makefile $(INFO_DEPS) $(MANS)
+ installdirs:
+- for dir in "$(DESTDIR)$(infodir)"; do \
++ for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+ install: install-am
+@@ -652,11 +706,9 @@ html: html-am
+
+ html-am: $(HTMLS)
+
+-info: info-am
+-
+ info-am: $(INFO_DEPS)
+
+-install-data-am: install-info-am
++install-data-am: install-info-am install-man
+
+ install-dvi: install-dvi-am
+
+@@ -739,7 +791,7 @@ install-info-am: $(INFO_DEPS)
+ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\
+ done; \
+ else : ; fi
+-install-man:
++install-man: install-man1
+
+ install-pdf: install-pdf-am
+
+@@ -794,7 +846,9 @@ ps: ps-am
+ ps-am: $(PSS)
+
+ uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \
+- uninstall-pdf-am uninstall-ps-am
++ uninstall-man uninstall-pdf-am uninstall-ps-am
++
++uninstall-man: uninstall-man1
+
+ .MAKE: install-am install-strip
+
+@@ -804,19 +858,32 @@ uninstall-am: uninstall-dvi-am uninstall
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+- install-info-am install-man install-pdf install-pdf-am \
+- install-ps install-ps-am install-strip installcheck \
+- installcheck-am installdirs maintainer-clean \
++ install-info-am install-man install-man1 install-pdf \
++ install-pdf-am install-ps install-ps-am install-strip \
++ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-aminfo maintainer-clean-generic \
+ maintainer-clean-vti mostlyclean mostlyclean-aminfo \
+ mostlyclean-generic mostlyclean-libtool mostlyclean-vti pdf \
+ pdf-am ps ps-am tags-am uninstall uninstall-am \
+ uninstall-dvi-am uninstall-html-am uninstall-info-am \
+- uninstall-pdf-am uninstall-ps-am
++ uninstall-man uninstall-man1 uninstall-pdf-am uninstall-ps-am
+
+ .PRECIOUS: Makefile
+
+
++# Build the man page from the texinfo file
++# The sed command removes the no-adjust Nroff command so that
++# the man output looks standard.
++gprofng.1: $(srcdir)/gprofng.texi
++ $(AM_V_GEN)touch $@
++ $(AM_V_at)-$(TEXI2POD) $(MANCONF) < $(srcdir)/gprofng.texi > gprofng.pod
++ $(AM_V_at)-($(POD2MAN) gprofng.pod | \
++ sed -e '/^.if n .na/d' > $@.tmp && \
++ mv -f $@.tmp $@) || (rm -f $@.tmp && exit 1)
++ $(AM_V_at)rm -f gprofng.pod
++
++info: $(man_MANS)
++
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+ # Otherwise a system limit (for SysV at least) may be exceeded.
+ .NOEXPORT:
+--- a/gprofng/doc/gprofng.texi
++++ b/gprofng/doc/gprofng.texi
+@@ -1,5 +1,8 @@
+ \input texinfo @c -*-texinfo-*-
+
++@c for $sect (qw(NAME SYNOPSIS TARGET DESCRIPTION OPTIONS ENVIRONMENT FILES
++@c BUGS NOTES FOOTNOTES SEEALSO AUTHOR COPYRIGHT)) {
++
+ @c ----------------------------------------------------------------------------
+ @c This is the Texinfo source file for the GPROFNG manual.
+ @c
+@@ -59,6 +62,10 @@ gprofng
+ @cindex \label\, \string\
+ @end macro
+
++@macro gcctabopt{body}
++@code{\body\}
++@end macro
++
+ @c -- Get the version information ---------------------------------------------
+ @include version.texi
+
+@@ -99,6 +106,20 @@ section entitled ``GNU Free Documentatio
+ @page
+ @vskip 0pt plus 1filll
+ @insertcopying
++
++@c man begin COPYRIGHT
++
++Copyright @copyright{} 2022-2023 Free Software Foundation, Inc.
++
++Permission is granted to copy, distribute and/or modify this document
++under the terms of the GNU Free Documentation License, Version 1.3
++or any later version published by the Free Software Foundation;
++with no Invariant Sections, with no Front-Cover Texts, and with no
++Back-Cover Texts. A copy of the license is included in the
++section entitled ``GNU Free Documentation License''.
++
++@c man end
++
+ @end titlepage
+
+ @c -- Generate the Table of Contents ------------------------------------------
+@@ -163,6 +184,154 @@ Terminology
+ @end menu
+ @end ifinfo
+
++@ifset man
++
++@c man title gprofng the driver for the gprofng tool suite
++
++@c man begin SYNOPSIS
++gprofng [OPTION(S)] ACTION [@b{QUALIFIER}] [ARGUMENTS] TARGET
++@c man end
++
++@c man begin DESCRIPTION
++This is the driver for the GPROFNG tools suite to gather and analyze performance data.
++
++The driver executes the action specified. An example of an action is @code{collect}
++to collect performance data. Depending on the action, a qualifier may be needed to
++define the command. Several qualifiers support options. The last item on the command
++is the target the command applies to.
++
++For example, to collect performance data for an application called @code{a.out} and
++store the results in experiment directory @code{mydata.er}, the following command may
++be used:
++
++@smallexample
++$ gprofng collect app -o mydata.er a.out
++@end smallexample
++
++In this example, the action is @code{collect}, the qualifier is @code{app}, the single
++argument is @code{-o mydata.er} and the target is @code{a.out}.
++
++If gprofng is executed without any additional option, action, or target, a usage
++overview is printed.
++
++@c man end
++
++@c man begin OPTIONS
++
++@table @gcctabopt
++
++@item @var{--version}
++print the version number and exit.
++
++@item @var{--help}
++print usage information and exit.
++
++@end table
++
++@c man end
++
++@c man begin NOTES
++
++The gprofng driver supports the following commands.
++
++@c The man pages for the commands below can be viewed using the command name with "gprofng" replaced by "gp" and the spaces replaced by a dash ("-"). For example the man page
++@c name for "gprofng collect app" is "gp-collect-app".
++
++Collect performance data:
++
++@table @code
++
++@item gprofng collect app
++collect application performance data.
++
++@end table
++
++Display the performance results:
++
++@table @code
++
++@item gprofng display text
++display the performance data in ASCII format.
++
++@item gprofng display html
++generate an HTML file from one or more experiments.
++
++@end table
++
++Miscellaneous commands:
++
++@table @code
++
++@item gprofng display src
++display source or disassembly with compiler annotations.
++
++@item gprofng archive
++include binaries and source code in an experiment directory.
++
++@end table
++
++It is also possible to invoke the lower level commands directly, but since
++these are subject to change, in particular the options, we recommend to
++use the driver.
++
++@c man end
++
++@c man begin ENVIRONMENT
++The following environment variables are supported:
++
++@table @code
++
++@item @env{GPROFNG_MAX_CALL_STACK_DEPTH}
++set the depth of the call stack (default is 256).
++
++@item @env{GPROFNG_USE_JAVA_OPTIONS}
++may be set when profiling a C/C++ application that uses dlopen() to execute Java code.
++
++@item @env{GPROFNG_SSH_REMOTE_DISPLAY}
++use this variable to define the ssh command executed by the remote display tool.
++
++@item @env{GPROFNG_SKIP_VALIDATION}
++set this variable to disable checking hardware, system, and Java versions.
++
++@item @env{GPROFNG_ALLOW_CORE_DUMP}
++set this variable to allow a core file to be generated; otherwise an error report is created on /tmp.
++
++@item @env{GPROFNG_ARCHIVE}
++use this variable to define the settings for automatic archiving upon experiment recording completion.
++
++@item @env{GPROFNG_ARCHIVE_COMMON_DIR}
++set this variable to the location of the common archive.
++
++@item @env{GPROFNG_JAVA_MAX_CALL_STACK_DEPTH}
++set the depth of the Java call stack; the default is 256; set to 0 to disable capturing of call stacks.
++
++@item @env{GPROFNG_JAVA_NATIVE_MAX_CALL_STACK_DEPTH}
++set the depth of the Java native call stack; the default is 256; set to 0 to disable capturing of call stacks (JNI and assembly call stacks are not captured).
++
++@end table
++
++@c man end
++
++@c man begin SEEALSO
++The man pages for the various gprofng commands are not available yet, but
++the @option{--help} option supported on each of the commands lists the options
++and provides more information.
++
++For example this displays the options supported on the @command{gprofng collect app}
++command:
++
++@smallexample
++$ gprofng collect app --help
++@end smallexample
++
++The user guide is available as an Info entry for @file{gprofng}.
++@c man end
++
++@end ifset
++
++@c man begin DESCRIPTION
++@c man end
++
+ @c -- A new node --------------------------------------------------------------
+ @node Introduction
+ @chapter Introduction
+--- a/gprofng/src/Makefile.am
++++ b/gprofng/src/Makefile.am
+@@ -160,7 +160,7 @@ gp_display_text_LDADD = $(LIBGPROFNG) $(
+
+ if BUILD_MAN
+
+-man_MANS = gprofng.1 \
++man_MANS = \
+ gp-archive.1 \
+ gp-collect-app.1 \
+ gp-display-src.1 \
+@@ -191,10 +191,6 @@ H2M_FILTER = | sed 's/\.TP/\.TP\n.B/' |
+ | sed 's/See also:/\.SH SEE ALSO/' | sed 's/Documentation:/.SH DOCUMENTATION/' \
+ | sed 's/Limitations:/.SH LIMITATIONS/'
+
+-gprofng.1: $(srcdir)/gprofng.cc $(common_mandeps) | ./gprofng$(EXEEXT)
+- $(AM_V_GEN)_BUILDING_MANPAGE=1 $(HELP2MAN) $(HELP2MAN_OPT) \
+- --name=$(TEXT_GPROFNG) ./gprofng$(EXEEXT) $(H2M_FILTER) > $@
+-
+ gp-archive.1: $(srcdir)/gp-archive.cc $(common_mandeps) | ./gp-archive$(EXEEXT)
+ $(AM_V_GEN)_BUILDING_MANPAGE=1 $(HELP2MAN) $(HELP2MAN_OPT) \
+ --name=$(TEXT_GP_ARCHIVE) ./gp-archive$(EXEEXT) $(H2M_FILTER) > $@
+@@ -223,3 +219,5 @@ dist-hook: $(LIBGPROFNG)
+
+ install-data-local: install-pkglibLTLIBRARIES
+ rm -f $(DESTDIR)/$(pkglibdir)/*.la $(DESTDIR)/$(pkglibdir)/*.a
++
++$(srcdir)/DbeSession.cc: QLParser.tab.hh
+--- a/gprofng/src/Makefile.in
++++ b/gprofng/src/Makefile.in
+@@ -572,7 +572,7 @@ gp_display_src_SOURCES = gp-display-src.
+ gp_display_src_LDADD = $(LIBGPROFNG) $(CLOCK_GETTIME_LINK) $(ZLIB)
+ gp_display_text_SOURCES = gp-display-text.cc ipc.cc ipcio.cc
+ gp_display_text_LDADD = $(LIBGPROFNG) $(CLOCK_GETTIME_LINK) $(ZLIB)
+-@BUILD_MAN_TRUE@man_MANS = gprofng.1 \
++@BUILD_MAN_TRUE@man_MANS = \
+ @BUILD_MAN_TRUE@ gp-archive.1 \
+ @BUILD_MAN_TRUE@ gp-collect-app.1 \
+ @BUILD_MAN_TRUE@ gp-display-src.1 \
+@@ -1176,10 +1176,6 @@ uninstall-man: uninstall-man1
+ QLParser.tab.cc QLParser.tab.hh: QLParser.yy
+ $(BISON) $^
+
+-@BUILD_MAN_TRUE@gprofng.1: $(srcdir)/gprofng.cc $(common_mandeps) | ./gprofng$(EXEEXT)
+-@BUILD_MAN_TRUE@ $(AM_V_GEN)_BUILDING_MANPAGE=1 $(HELP2MAN) $(HELP2MAN_OPT) \
+-@BUILD_MAN_TRUE@ --name=$(TEXT_GPROFNG) ./gprofng$(EXEEXT) $(H2M_FILTER) > $@
+-
+ @BUILD_MAN_TRUE@gp-archive.1: $(srcdir)/gp-archive.cc $(common_mandeps) | ./gp-archive$(EXEEXT)
+ @BUILD_MAN_TRUE@ $(AM_V_GEN)_BUILDING_MANPAGE=1 $(HELP2MAN) $(HELP2MAN_OPT) \
+ @BUILD_MAN_TRUE@ --name=$(TEXT_GP_ARCHIVE) ./gp-archive$(EXEEXT) $(H2M_FILTER) > $@
+@@ -1207,6 +1203,8 @@ dist-hook: $(LIBGPROFNG)
+ install-data-local: install-pkglibLTLIBRARIES
+ rm -f $(DESTDIR)/$(pkglibdir)/*.la $(DESTDIR)/$(pkglibdir)/*.a
+
++$(srcdir)/DbeSession.cc: QLParser.tab.hh
++
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
+ # Otherwise a system limit (for SysV at least) may be exceeded.
+ .NOEXPORT:
diff --git a/toolchain/binutils/patches/2.40/020-gprofng-PR30043-libgprofng.so.-are-installed-to-a-wr.patch b/toolchain/binutils/patches/2.40/020-gprofng-PR30043-libgprofng.so.-are-installed-to-a-wr.patch
new file mode 100644
index 0000000..d8d76a2
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/020-gprofng-PR30043-libgprofng.so.-are-installed-to-a-wr.patch
@@ -0,0 +1,212 @@
+From edd36b26f3506eeb259534ba2493e15c728cd280 Mon Sep 17 00:00:00 2001
+From: Vladimir Mezentsev <vladimir.mezentsev@oracle.com>
+Date: Wed, 25 Jan 2023 19:21:38 -0800
+Subject: [PATCH 20/50] gprofng: PR30043 libgprofng.so.* are installed to a
+ wrong location
+
+gprofng/ChangeLog
+2023-01-25 Vladimir Mezentsev <vladimir.mezentsev@oracle.com>
+
+ PR gprofng/30043
+ PR gprofng/28972
+ * src/Makefile.am: Use lib_LTLIBRARIES instead of pkglib_LTLIBRARIES.
+ * src/Makefile.in: Rebuild.
+---
+ gprofng/src/Makefile.am | 7 +---
+ gprofng/src/Makefile.in | 76 +++++++++++++++++++----------------------
+ 2 files changed, 37 insertions(+), 46 deletions(-)
+
+--- a/gprofng/src/Makefile.am
++++ b/gprofng/src/Makefile.am
+@@ -124,7 +124,7 @@ BUILT_SOURCES = QLParser.tab.hh
+ EXTRA_DIST = QLParser.yy $(man_MANS)
+
+
+-pkglib_LTLIBRARIES = $(LIBGPROFNG)
++lib_LTLIBRARIES = $(LIBGPROFNG)
+ libgprofng_la_SOURCES = $(CCSOURCES) $(CSOURCES)
+ libgprofng_la_LDFLAGS = -version-info 0:0:0
+
+@@ -215,9 +215,4 @@ endif
+ # so ensure that the necessary libraries are built at dist time.
+ dist-hook: $(LIBGPROFNG)
+
+-.PHONY: install-data-local
+-
+-install-data-local: install-pkglibLTLIBRARIES
+- rm -f $(DESTDIR)/$(pkglibdir)/*.la $(DESTDIR)/$(pkglibdir)/*.a
+-
+ $(srcdir)/DbeSession.cc: QLParser.tab.hh
+--- a/gprofng/src/Makefile.in
++++ b/gprofng/src/Makefile.in
+@@ -155,9 +155,9 @@ am__uninstall_files_from_dir = { \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+-am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
++am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(dbedir)"
+-LTLIBRARIES = $(pkglib_LTLIBRARIES)
++LTLIBRARIES = $(lib_LTLIBRARIES)
+ am__DEPENDENCIES_1 =
+ libgprofng_la_DEPENDENCIES = $(top_builddir)/../opcodes/libopcodes.la \
+ $(top_builddir)/../bfd/libbfd.la $(am__DEPENDENCIES_1)
+@@ -548,7 +548,7 @@ AM_CFLAGS = $(GPROFNG_CFLAGS) $(PTHREAD_
+ AM_CXXFLAGS = $(AM_CFLAGS)
+ BUILT_SOURCES = QLParser.tab.hh
+ EXTRA_DIST = QLParser.yy $(man_MANS)
+-pkglib_LTLIBRARIES = $(LIBGPROFNG)
++lib_LTLIBRARIES = $(LIBGPROFNG)
+ libgprofng_la_SOURCES = $(CCSOURCES) $(CSOURCES)
+ libgprofng_la_LDFLAGS = -version-info 0:0:0
+
+@@ -636,33 +636,33 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+ $(am__aclocal_m4_deps):
+
+-install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
++install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+- @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
++ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ list2=; for p in $$list; do \
+ if test -f $$p; then \
+ list2="$$list2 $$p"; \
+ else :; fi; \
+ done; \
+ test -z "$$list2" || { \
+- echo " $(MKDIR_P) '$(DESTDIR)$(pkglibdir)'"; \
+- $(MKDIR_P) "$(DESTDIR)$(pkglibdir)" || exit 1; \
+- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(pkglibdir)'"; \
+- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(pkglibdir)"; \
++ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
++ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
++ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
++ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+ }
+
+-uninstall-pkglibLTLIBRARIES:
++uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+- @list='$(pkglib_LTLIBRARIES)'; test -n "$(pkglibdir)" || list=; \
++ @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+ for p in $$list; do \
+ $(am__strip_dir) \
+- echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+- $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
++ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
++ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+ done
+
+-clean-pkglibLTLIBRARIES:
+- -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+- @list='$(pkglib_LTLIBRARIES)'; \
++clean-libLTLIBRARIES:
++ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
++ @list='$(lib_LTLIBRARIES)'; \
+ locs=`for p in $$list; do echo $$p; done | \
+ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+ sort -u`; \
+@@ -672,7 +672,7 @@ clean-pkglibLTLIBRARIES:
+ }
+
+ libgprofng.la: $(libgprofng_la_OBJECTS) $(libgprofng_la_DEPENDENCIES) $(EXTRA_libgprofng_la_DEPENDENCIES)
+- $(AM_V_CXXLD)$(libgprofng_la_LINK) -rpath $(pkglibdir) $(libgprofng_la_OBJECTS) $(libgprofng_la_LIBADD) $(LIBS)
++ $(AM_V_CXXLD)$(libgprofng_la_LINK) -rpath $(libdir) $(libgprofng_la_OBJECTS) $(libgprofng_la_LIBADD) $(LIBS)
+ install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+@@ -1039,8 +1039,10 @@ check-am: all-am
+ check: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) check-am
+ all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(DATA)
++install-binPROGRAMS: install-libLTLIBRARIES
++
+ installdirs:
+- for dir in "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(dbedir)"; do \
++ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(dbedir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+ install: $(BUILT_SOURCES)
+@@ -1078,8 +1080,8 @@ maintainer-clean-generic:
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+ clean: clean-am
+
+-clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+- clean-pkglibLTLIBRARIES mostlyclean-am
++clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
++ clean-libtool mostlyclean-am
+
+ distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+@@ -1099,13 +1101,13 @@ info: info-am
+
+ info-am:
+
+-install-data-am: install-data-local install-dbeDATA install-man
++install-data-am: install-dbeDATA install-man
+
+ install-dvi: install-dvi-am
+
+ install-dvi-am:
+
+-install-exec-am: install-binPROGRAMS install-pkglibLTLIBRARIES
++install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
+
+ install-html: install-html-am
+
+@@ -1145,30 +1147,29 @@ ps: ps-am
+
+ ps-am:
+
+-uninstall-am: uninstall-binPROGRAMS uninstall-dbeDATA uninstall-man \
+- uninstall-pkglibLTLIBRARIES
++uninstall-am: uninstall-binPROGRAMS uninstall-dbeDATA \
++ uninstall-libLTLIBRARIES uninstall-man
+
+ uninstall-man: uninstall-man1
+
+ .MAKE: all check install install-am install-strip
+
+ .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \
+- clean-binPROGRAMS clean-generic clean-libtool \
+- clean-pkglibLTLIBRARIES cscopelist-am ctags ctags-am dist-hook \
+- distclean distclean-compile distclean-generic \
+- distclean-libtool distclean-tags distdir dvi dvi-am html \
+- html-am info info-am install install-am install-binPROGRAMS \
+- install-data install-data-am install-data-local \
+- install-dbeDATA install-dvi install-dvi-am install-exec \
+- install-exec-am install-html install-html-am install-info \
+- install-info-am install-man install-man1 install-pdf \
+- install-pdf-am install-pkglibLTLIBRARIES install-ps \
++ clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
++ clean-libtool cscopelist-am ctags ctags-am dist-hook distclean \
++ distclean-compile distclean-generic distclean-libtool \
++ distclean-tags distdir dvi dvi-am html html-am info info-am \
++ install install-am install-binPROGRAMS install-data \
++ install-data-am install-dbeDATA install-dvi install-dvi-am \
++ install-exec install-exec-am install-html install-html-am \
++ install-info install-info-am install-libLTLIBRARIES \
++ install-man install-man1 install-pdf install-pdf-am install-ps \
+ install-ps-am install-strip installcheck installcheck-am \
+ installdirs maintainer-clean maintainer-clean-generic \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-binPROGRAMS uninstall-dbeDATA \
+- uninstall-man uninstall-man1 uninstall-pkglibLTLIBRARIES
++ uninstall-libLTLIBRARIES uninstall-man uninstall-man1
+
+ .PRECIOUS: Makefile
+
+@@ -1198,11 +1199,6 @@ QLParser.tab.cc QLParser.tab.hh: QLParse
+ # so ensure that the necessary libraries are built at dist time.
+ dist-hook: $(LIBGPROFNG)
+
+-.PHONY: install-data-local
+-
+-install-data-local: install-pkglibLTLIBRARIES
+- rm -f $(DESTDIR)/$(pkglibdir)/*.la $(DESTDIR)/$(pkglibdir)/*.a
+-
+ $(srcdir)/DbeSession.cc: QLParser.tab.hh
+
+ # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/toolchain/binutils/patches/2.40/026-RISC-V-make-C-extension-JAL-available-again-for-32-b.patch b/toolchain/binutils/patches/2.40/026-RISC-V-make-C-extension-JAL-available-again-for-32-b.patch
new file mode 100644
index 0000000..4129a22
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/026-RISC-V-make-C-extension-JAL-available-again-for-32-b.patch
@@ -0,0 +1,115 @@
+From 27f59ec47a18277b6ea3548f405263ef558f5217 Mon Sep 17 00:00:00 2001
+From: Jan Beulich <jbeulich@suse.com>
+Date: Tue, 31 Jan 2023 09:47:22 +0100
+Subject: [PATCH 26/50] RISC-V: make C-extension JAL available again for
+ (32-bit) assembly
+
+Along with the normal JAL alias, the C-extension one should have been
+moved as well by 839189bc932e ("RISC-V: re-arrange opcode table for
+consistent alias handling"), for the assembler to actually be able to
+use it where/when possible.
+
+Since neither this nor any other compressed branch insn was being tested
+so far, take the opportunity and introduce a new testcase covering those.
+---
+ gas/config/tc-riscv.c | 3 +++
+ gas/testsuite/gas/riscv/c-branch-na.d | 20 ++++++++++++++++++++
+ gas/testsuite/gas/riscv/c-branch.d | 19 +++++++++++++++++++
+ gas/testsuite/gas/riscv/c-branch.s | 11 +++++++++++
+ opcodes/riscv-opc.c | 2 +-
+ 5 files changed, 54 insertions(+), 1 deletion(-)
+ create mode 100644 gas/testsuite/gas/riscv/c-branch-na.d
+ create mode 100644 gas/testsuite/gas/riscv/c-branch.d
+ create mode 100644 gas/testsuite/gas/riscv/c-branch.s
+
+--- a/gas/config/tc-riscv.c
++++ b/gas/config/tc-riscv.c
+@@ -2762,6 +2762,8 @@ riscv_ip (char *str, struct riscv_cl_ins
+ case 'p':
+ goto branch;
+ case 'a':
++ if (oparg == insn->args + 1)
++ goto jump_check_gpr;
+ goto jump;
+ case 'S': /* Floating-point RS1 x8-x15. */
+ if (!reg_lookup (&asarg, RCLASS_FPR, ®no)
+@@ -3271,6 +3273,7 @@ riscv_ip (char *str, struct riscv_cl_ins
+ but the 2nd (with 2 operands) might. */
+ if (oparg == insn->args)
+ {
++ jump_check_gpr:
+ asargStart = asarg;
+ if (reg_lookup (&asarg, RCLASS_GPR, NULL)
+ && (*asarg == ',' || (ISSPACE (*asarg) && asarg[1] == ',')))
+--- /dev/null
++++ b/gas/testsuite/gas/riscv/c-branch-na.d
+@@ -0,0 +1,20 @@
++#as: -march=rv32ic
++#source: c-branch.s
++#objdump: -drw -Mno-aliases
++
++.*:[ ]+file format .*
++
++
++Disassembly of section .text:
++
++0+ <target>:
++[ ]+[0-9a-f]+:[ ]+c001[ ]+c\.beqz[ ]+s0,0 <target>[ ]+0: R_RISCV_RVC_BRANCH .*
++[ ]+[0-9a-f]+:[ ]+dcfd[ ]+c\.beqz[ ]+s1,0 <target>[ ]+2: R_RISCV_RVC_BRANCH .*
++[ ]+[0-9a-f]+:[ ]+fc75[ ]+c\.bnez[ ]+s0,0 <target>[ ]+4: R_RISCV_RVC_BRANCH .*
++[ ]+[0-9a-f]+:[ ]+fced[ ]+c\.bnez[ ]+s1,0 <target>[ ]+6: R_RISCV_RVC_BRANCH .*
++[ ]+[0-9a-f]+:[ ]+bfe5[ ]+c\.j[ ]+0 <target>[ ]+8: R_RISCV_RVC_JUMP .*
++[ ]+[0-9a-f]+:[ ]+3fdd[ ]+c\.jal[ ]+0 <target>[ ]+a: R_RISCV_RVC_JUMP .*
++[ ]+[0-9a-f]+:[ ]+9302[ ]+c\.jalr[ ]+t1
++[ ]+[0-9a-f]+:[ ]+8382[ ]+c\.jr[ ]+t2
++[ ]+[0-9a-f]+:[ ]+8082[ ]+c\.jr[ ]+ra
++#...
+--- /dev/null
++++ b/gas/testsuite/gas/riscv/c-branch.d
+@@ -0,0 +1,19 @@
++#as: -march=rv64ic
++#objdump: -drw
++
++.*:[ ]+file format .*
++
++
++Disassembly of section .text:
++
++0+ <target>:
++[ ]+[0-9a-f]+:[ ]+c001[ ]+beqz[ ]+s0,0 <target>[ ]+0: R_RISCV_RVC_BRANCH .*
++[ ]+[0-9a-f]+:[ ]+dcfd[ ]+beqz[ ]+s1,0 <target>[ ]+2: R_RISCV_RVC_BRANCH .*
++[ ]+[0-9a-f]+:[ ]+fc75[ ]+bnez[ ]+s0,0 <target>[ ]+4: R_RISCV_RVC_BRANCH .*
++[ ]+[0-9a-f]+:[ ]+fced[ ]+bnez[ ]+s1,0 <target>[ ]+6: R_RISCV_RVC_BRANCH .*
++[ ]+[0-9a-f]+:[ ]+bfe5[ ]+j[ ]+0 <target>[ ]+8: R_RISCV_RVC_JUMP .*
++[ ]+[0-9a-f]+:[ ]+ff7ff0ef[ ]+jal[ ]+0 <target>[ ]+a: R_RISCV_JAL .*
++[ ]+[0-9a-f]+:[ ]+9302[ ]+jalr[ ]+t1
++[ ]+[0-9a-f]+:[ ]+8382[ ]+jr[ ]+t2
++[ ]+[0-9a-f]+:[ ]+8082[ ]+ret
++#...
+--- /dev/null
++++ b/gas/testsuite/gas/riscv/c-branch.s
+@@ -0,0 +1,11 @@
++ .text
++target:
++ beq x8, x0, target
++ beqz x9, target
++ bne x8, x0, target
++ bnez x9, target
++ j target
++ jal target
++ jalr x6
++ jr x7
++ ret
+--- a/opcodes/riscv-opc.c
++++ b/opcodes/riscv-opc.c
+@@ -340,9 +340,9 @@ const struct riscv_opcode riscv_opcodes[
+ {"jalr", 0, INSN_CLASS_I, "d,s,j", MATCH_JALR, MASK_JALR, match_opcode, INSN_JSR },
+ {"j", 0, INSN_CLASS_C, "Ca", MATCH_C_J, MASK_C_J, match_opcode, INSN_ALIAS|INSN_BRANCH },
+ {"j", 0, INSN_CLASS_I, "a", MATCH_JAL, MASK_JAL|MASK_RD, match_opcode, INSN_ALIAS|INSN_BRANCH },
++{"jal", 32, INSN_CLASS_C, "Ca", MATCH_C_JAL, MASK_C_JAL, match_opcode, INSN_ALIAS|INSN_JSR },
+ {"jal", 0, INSN_CLASS_I, "a", MATCH_JAL|(X_RA << OP_SH_RD), MASK_JAL|MASK_RD, match_opcode, INSN_ALIAS|INSN_JSR },
+ {"jal", 0, INSN_CLASS_I, "d,a", MATCH_JAL, MASK_JAL, match_opcode, INSN_JSR },
+-{"jal", 32, INSN_CLASS_C, "Ca", MATCH_C_JAL, MASK_C_JAL, match_opcode, INSN_ALIAS|INSN_JSR },
+ {"call", 0, INSN_CLASS_I, "d,c", (X_T1 << OP_SH_RS1), (int) M_CALL, match_never, INSN_MACRO },
+ {"call", 0, INSN_CLASS_I, "c", (X_RA << OP_SH_RS1)|(X_RA << OP_SH_RD), (int) M_CALL, match_never, INSN_MACRO },
+ {"tail", 0, INSN_CLASS_I, "c", (X_T1 << OP_SH_RS1), (int) M_CALL, match_never, INSN_MACRO },
diff --git a/toolchain/binutils/patches/2.40/034-bpf-fix-error-conversion-from-long-unsigned-int-to-u.patch b/toolchain/binutils/patches/2.40/034-bpf-fix-error-conversion-from-long-unsigned-int-to-u.patch
new file mode 100644
index 0000000..d4317cd
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/034-bpf-fix-error-conversion-from-long-unsigned-int-to-u.patch
@@ -0,0 +1,209 @@
+From 3e888977f165594cf44dbe8f67e3a4960b22c11f Mon Sep 17 00:00:00 2001
+From: "Guillermo E. Martinez" <guillermo.e.martinez@oracle.com>
+Date: Fri, 3 Feb 2023 11:17:49 -0600
+Subject: [PATCH 34/50] bpf: fix error conversion from long unsigned int to
+ unsigned int [-Werror=overflow]
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Regenerating BPF target using the maintainer mode emits:
+.../opcodes/bpf-opc.c:57:11: error: conversion from ‘long unsigned int’ to ‘unsigned int’ changes value from ‘18446744073709486335’ to ‘4294902015’ [-Werror=overflow]
+ 57 | 64, 64, 0xffffffffffff00ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+
+The use of a narrow size to handle the mask CGEN in instruction format
+is causing this error. Additionally eBPF `call' instructions
+constructed by expressions using symbols (BPF_PSEUDO_CALL) emits
+annotations in `src' field of the instruction, used to identify BPF
+target endianness.
+
+cpu/
+ * bpf.cpu (define-call-insn): Remove `src' field from
+ instruction mask.
+
+include/
+ *opcode/cge.h (CGEN_IFMT): Adjust mask bit width.
+
+opcodes/
+ * bpf-opc.c: Regenerate.
+
+(cherry picked from commit 7f6ebecd56e690012b05af0a492280765b17f186)
+---
+ cpu/bpf.cpu | 2 +-
+ include/opcode/cgen.h | 2 +-
+ opcodes/bpf-opc.c | 54 +++++++++++++++++++++++--------------------
+ opcodes/cgen-dis.c | 2 +-
+ 4 files changed, 32 insertions(+), 28 deletions(-)
+
+--- a/cpu/bpf.cpu
++++ b/cpu/bpf.cpu
+@@ -768,7 +768,7 @@
+ "call"
+ (endian-isas x-endian)
+ "call $disp32"
+- (+ disp32 (f-offset16 0) (f-regs 0)
++ (+ disp32 (f-offset16 0) (.sym src x-endian) ((.sym f-dst x-endian) 0)
+ OP_CLASS_JMP OP_SRC_K OP_CODE_CALL)
+ (c-call VOID
+ "bpfbf_call" disp32 (ifield (.sym f-src x-endian)))
+--- a/include/opcode/cgen.h
++++ b/include/opcode/cgen.h
+@@ -914,7 +914,7 @@ typedef struct
+ Each insn's value is stored with the insn.
+ The first step in recognizing an insn for disassembly is
+ (opcode & mask) == value. */
+- CGEN_INSN_INT mask;
++ CGEN_INSN_LGUINT mask;
+ #define CGEN_IFMT_MASK(ifmt) ((ifmt)->mask)
+
+ /* Instruction fields.
+--- a/opcodes/bpf-opc.c
++++ b/opcodes/bpf-opc.c
+@@ -50,99 +50,103 @@ static const CGEN_IFMT ifmt_empty ATTRIB
+ };
+
+ static const CGEN_IFMT ifmt_addile ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_addrle ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffffffffffff00ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_negle ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xfffffffffffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_addibe ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_addrbe ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffffffffffff00ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_negbe ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffffffffffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_endlele ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_endlebe ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_lddwle ATTRIBUTE_UNUSED = {
+- 64, 128, 0xff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 128, 0xfffff0ff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_lddwbe ATTRIBUTE_UNUSED = {
+- 64, 128, 0xff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 128, 0xffff0fff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_ldabsw ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffffffff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_ldindwle ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_ldindwbe ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_ldxwle ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_ldxwbe ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_stble ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xf0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_stbbe ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xfff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_jeqile ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xf0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_jeqrle ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_jeqibe ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xfff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_jeqrbe ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_callle ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++};
++
++static const CGEN_IFMT ifmt_callbe ATTRIBUTE_UNUSED = {
++ 64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_ja ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffffffff0000ffff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ static const CGEN_IFMT ifmt_exit ATTRIBUTE_UNUSED = {
+- 64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
++ 64, 64, 0xffffffffffffffff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } }
+ };
+
+ #undef F
+@@ -1646,7 +1650,7 @@ static const CGEN_OPCODE bpf_cgen_insn_o
+ {
+ { 0, 0, 0, 0 },
+ { { MNEM, ' ', OP (DISP32), 0 } },
+- & ifmt_callle, { 0x85 }
++ & ifmt_callbe, { 0x85 }
+ },
+ /* call $dstle */
+ {
+--- a/opcodes/cgen-dis.c
++++ b/opcodes/cgen-dis.c
+@@ -39,7 +39,7 @@ static void add_insn_to_hash_chain (CG
+ static int
+ count_decodable_bits (const CGEN_INSN *insn)
+ {
+- unsigned mask = CGEN_INSN_BASE_MASK (insn);
++ CGEN_INSN_LGUINT mask = CGEN_INSN_BASE_MASK (insn);
+ #if GCC_VERSION >= 3004
+ return __builtin_popcount (mask);
+ #else
diff --git a/toolchain/binutils/patches/2.40/035-Pass-JANSSON_LIBS-and-ZSTD_LIBS-to-ld-bootstrap-boot.patch b/toolchain/binutils/patches/2.40/035-Pass-JANSSON_LIBS-and-ZSTD_LIBS-to-ld-bootstrap-boot.patch
new file mode 100644
index 0000000..3741c08
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/035-Pass-JANSSON_LIBS-and-ZSTD_LIBS-to-ld-bootstrap-boot.patch
@@ -0,0 +1,50 @@
+From e1815414077347097e5bf0d75162add955e241d9 Mon Sep 17 00:00:00 2001
+From: Romain Geissler <romain.geissler@amadeus.com>
+Date: Sun, 5 Feb 2023 13:56:34 +0000
+Subject: [PATCH 35/50] Pass $JANSSON_LIBS and $ZSTD_LIBS to
+ ld-bootstrap/bootrap.exp
+
+---
+ ld/Makefile.am | 1 +
+ ld/Makefile.in | 1 +
+ ld/testsuite/ld-bootstrap/bootstrap.exp | 4 ++--
+ 3 files changed, 4 insertions(+), 2 deletions(-)
+
+--- a/ld/Makefile.am
++++ b/ld/Makefile.am
+@@ -992,6 +992,7 @@ check-DEJAGNU: site.exp
+ CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \
+ OFILES="$(OFILES)" BFDLIB="$(TESTBFDLIB)" CTFLIB="$(TESTCTFLIB) $(ZLIB)" \
+ SFRAMELIB="$(TESTSFRAMELIB)" \
++ JANSSON_LIBS="$(JANSSON_LIBS)" ZSTD_LIBS="$(ZSTD_LIBS)" \
+ LIBIBERTY="$(LIBIBERTY) $(LIBINTL)" LIBS="$(LIBS)" \
+ DO_COMPARE="`echo '$(do_compare)' | sed -e 's,\\$$,,g'`" \
+ $(RUNTESTFLAGS); \
+--- a/ld/Makefile.in
++++ b/ld/Makefile.in
+@@ -2645,6 +2645,7 @@ check-DEJAGNU: site.exp
+ CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" \
+ OFILES="$(OFILES)" BFDLIB="$(TESTBFDLIB)" CTFLIB="$(TESTCTFLIB) $(ZLIB)" \
+ SFRAMELIB="$(TESTSFRAMELIB)" \
++ JANSSON_LIBS="$(JANSSON_LIBS)" ZSTD_LIBS="$(ZSTD_LIBS)" \
+ LIBIBERTY="$(LIBIBERTY) $(LIBINTL)" LIBS="$(LIBS)" \
+ DO_COMPARE="`echo '$(do_compare)' | sed -e 's,\\$$,,g'`" \
+ $(RUNTESTFLAGS); \
+--- a/ld/testsuite/ld-bootstrap/bootstrap.exp
++++ b/ld/testsuite/ld-bootstrap/bootstrap.exp
+@@ -162,13 +162,13 @@ foreach flags $test_flags {
+ }
+
+ if { [lindex [remote_exec build grep "-q \"HAVE_ZSTD 1\" config.h" ] 0] == 0 } then {
+- set extralibs "$extralibs -lzstd"
++ set extralibs "$extralibs $ZSTD_LIBS"
+ }
+
+ # Check if the system's jansson library is used. If so, the object files will
+ # be using symbols from it, so link to it.
+ if { [lindex [remote_exec build grep "-q \"HAVE_JANSSON 1\" config.h" ] 0] == 0 } then {
+- set extralibs "$extralibs -ljansson"
++ set extralibs "$extralibs $JANSSON_LIBS"
+ }
+
+ # Plugin support requires linking with libdl.
diff --git a/toolchain/binutils/patches/2.40/036-Regen-config-files.patch b/toolchain/binutils/patches/2.40/036-Regen-config-files.patch
new file mode 100644
index 0000000..1c80dde
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/036-Regen-config-files.patch
@@ -0,0 +1,714 @@
+From 1fc096a4c590f28e0efb1823cdca653f2db9de74 Mon Sep 17 00:00:00 2001
+From: Alan Modra <amodra@gmail.com>
+Date: Mon, 6 Feb 2023 10:48:59 +1030
+Subject: [PATCH 36/50] Regen config files
+
+For the version update to 2.40.0
+---
+ bfd/configure | 20 ++++++++++----------
+ binutils/configure | 20 ++++++++++----------
+ gas/configure | 20 ++++++++++----------
+ gprof/configure | 20 ++++++++++----------
+ gprofng/configure | 20 ++++++++++----------
+ gprofng/doc/version.texi | 8 ++++----
+ gprofng/libcollector/configure | 20 ++++++++++----------
+ intl/configure | 3 +++
+ ld/configure | 20 ++++++++++----------
+ opcodes/configure | 20 ++++++++++----------
+ 10 files changed, 87 insertions(+), 84 deletions(-)
+
+--- a/bfd/configure
++++ b/bfd/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for bfd 2.40.
++# Generated by GNU Autoconf 2.69 for bfd 2.40.0.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='bfd'
+ PACKAGE_TARNAME='bfd'
+-PACKAGE_VERSION='2.40'
+-PACKAGE_STRING='bfd 2.40'
++PACKAGE_VERSION='2.40.0'
++PACKAGE_STRING='bfd 2.40.0'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1400,7 +1400,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures bfd 2.40 to adapt to many kinds of systems.
++\`configure' configures bfd 2.40.0 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1471,7 +1471,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of bfd 2.40:";;
++ short | recursive ) echo "Configuration of bfd 2.40.0:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1608,7 +1608,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-bfd configure 2.40
++bfd configure 2.40.0
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -2202,7 +2202,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by bfd $as_me 2.40, which was
++It was created by bfd $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -3184,7 +3184,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='bfd'
+- VERSION='2.40'
++ VERSION='2.40.0'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -15906,7 +15906,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by bfd $as_me 2.40, which was
++This file was extended by bfd $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -15972,7 +15972,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-bfd config.status 2.40
++bfd config.status 2.40.0
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+--- a/binutils/configure
++++ b/binutils/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for binutils 2.40.
++# Generated by GNU Autoconf 2.69 for binutils 2.40.0.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='binutils'
+ PACKAGE_TARNAME='binutils'
+-PACKAGE_VERSION='2.40'
+-PACKAGE_STRING='binutils 2.40'
++PACKAGE_VERSION='2.40.0'
++PACKAGE_STRING='binutils 2.40.0'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1401,7 +1401,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures binutils 2.40 to adapt to many kinds of systems.
++\`configure' configures binutils 2.40.0 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1472,7 +1472,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of binutils 2.40:";;
++ short | recursive ) echo "Configuration of binutils 2.40.0:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1631,7 +1631,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-binutils configure 2.40
++binutils configure 2.40.0
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -2099,7 +2099,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by binutils $as_me 2.40, which was
++It was created by binutils $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -3081,7 +3081,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='binutils'
+- VERSION='2.40'
++ VERSION='2.40.0'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -15326,7 +15326,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by binutils $as_me 2.40, which was
++This file was extended by binutils $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -15392,7 +15392,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-binutils config.status 2.40
++binutils config.status 2.40.0
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+--- a/gas/configure
++++ b/gas/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for gas 2.40.
++# Generated by GNU Autoconf 2.69 for gas 2.40.0.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='gas'
+ PACKAGE_TARNAME='gas'
+-PACKAGE_VERSION='2.40'
+-PACKAGE_STRING='gas 2.40'
++PACKAGE_VERSION='2.40.0'
++PACKAGE_STRING='gas 2.40.0'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1381,7 +1381,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures gas 2.40 to adapt to many kinds of systems.
++\`configure' configures gas 2.40.0 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1452,7 +1452,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of gas 2.40:";;
++ short | recursive ) echo "Configuration of gas 2.40.0:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1600,7 +1600,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-gas configure 2.40
++gas configure 2.40.0
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -2011,7 +2011,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by gas $as_me 2.40, which was
++It was created by gas $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -2990,7 +2990,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='gas'
+- VERSION='2.40'
++ VERSION='2.40.0'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -14910,7 +14910,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by gas $as_me 2.40, which was
++This file was extended by gas $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -14976,7 +14976,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-gas config.status 2.40
++gas config.status 2.40.0
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+--- a/gprof/configure
++++ b/gprof/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for gprof 2.40.
++# Generated by GNU Autoconf 2.69 for gprof 2.40.0.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='gprof'
+ PACKAGE_TARNAME='gprof'
+-PACKAGE_VERSION='2.40'
+-PACKAGE_STRING='gprof 2.40'
++PACKAGE_VERSION='2.40.0'
++PACKAGE_STRING='gprof 2.40.0'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1338,7 +1338,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures gprof 2.40 to adapt to many kinds of systems.
++\`configure' configures gprof 2.40.0 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1409,7 +1409,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of gprof 2.40:";;
++ short | recursive ) echo "Configuration of gprof 2.40.0:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1520,7 +1520,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-gprof configure 2.40
++gprof configure 2.40.0
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -1885,7 +1885,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by gprof $as_me 2.40, which was
++It was created by gprof $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -2864,7 +2864,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='gprof'
+- VERSION='2.40'
++ VERSION='2.40.0'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -12572,7 +12572,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by gprof $as_me 2.40, which was
++This file was extended by gprof $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -12638,7 +12638,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-gprof config.status 2.40
++gprof config.status 2.40.0
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+--- a/gprofng/configure
++++ b/gprofng/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for gprofng 2.40.
++# Generated by GNU Autoconf 2.69 for gprofng 2.40.0.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='gprofng'
+ PACKAGE_TARNAME='gprofng'
+-PACKAGE_VERSION='2.40'
+-PACKAGE_STRING='gprofng 2.40'
++PACKAGE_VERSION='2.40.0'
++PACKAGE_STRING='gprofng 2.40.0'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1364,7 +1364,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures gprofng 2.40 to adapt to many kinds of systems.
++\`configure' configures gprofng 2.40.0 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1435,7 +1435,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of gprofng 2.40:";;
++ short | recursive ) echo "Configuration of gprofng 2.40.0:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1549,7 +1549,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-gprofng configure 2.40
++gprofng configure 2.40.0
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -2081,7 +2081,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by gprofng $as_me 2.40, which was
++It was created by gprofng $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -3054,7 +3054,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='gprofng'
+- VERSION='2.40'
++ VERSION='2.40.0'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -17528,7 +17528,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by gprofng $as_me 2.40, which was
++This file was extended by gprofng $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -17594,7 +17594,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-gprofng config.status 2.40
++gprofng config.status 2.40.0
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+--- a/gprofng/doc/version.texi
++++ b/gprofng/doc/version.texi
+@@ -1,4 +1,4 @@
+-@set UPDATED 5 January 2023
+-@set UPDATED-MONTH January 2023
+-@set EDITION 2.40
+-@set VERSION 2.40
++@set UPDATED 1 February 2023
++@set UPDATED-MONTH February 2023
++@set EDITION 2.40.0
++@set VERSION 2.40.0
+--- a/gprofng/libcollector/configure
++++ b/gprofng/libcollector/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for gprofng 2.40.
++# Generated by GNU Autoconf 2.69 for gprofng 2.40.0.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='gprofng'
+ PACKAGE_TARNAME='gprofng'
+-PACKAGE_VERSION='2.40'
+-PACKAGE_STRING='gprofng 2.40'
++PACKAGE_VERSION='2.40.0'
++PACKAGE_STRING='gprofng 2.40.0'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1325,7 +1325,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures gprofng 2.40 to adapt to many kinds of systems.
++\`configure' configures gprofng 2.40.0 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1396,7 +1396,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of gprofng 2.40:";;
++ short | recursive ) echo "Configuration of gprofng 2.40.0:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1505,7 +1505,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-gprofng configure 2.40
++gprofng configure 2.40.0
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -1991,7 +1991,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by gprofng $as_me 2.40, which was
++It was created by gprofng $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -2968,7 +2968,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='gprofng'
+- VERSION='2.40'
++ VERSION='2.40.0'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -16098,7 +16098,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by gprofng $as_me 2.40, which was
++This file was extended by gprofng $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -16164,7 +16164,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-gprofng config.status 2.40
++gprofng config.status 2.40.0
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+--- a/intl/configure
++++ b/intl/configure
+@@ -6857,6 +6857,9 @@ case "${host}" in
+ # sets the default TLS model and affects inlining.
+ PICFLAG=-fPIC
+ ;;
++ loongarch*-*-*)
++ PICFLAG=-fpic
++ ;;
+ mips-sgi-irix6*)
+ # PIC is the default.
+ ;;
+--- a/ld/configure
++++ b/ld/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for ld 2.40.
++# Generated by GNU Autoconf 2.69 for ld 2.40.0.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='ld'
+ PACKAGE_TARNAME='ld'
+-PACKAGE_VERSION='2.40'
+-PACKAGE_STRING='ld 2.40'
++PACKAGE_VERSION='2.40.0'
++PACKAGE_STRING='ld 2.40.0'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1423,7 +1423,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures ld 2.40 to adapt to many kinds of systems.
++\`configure' configures ld 2.40.0 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1494,7 +1494,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of ld 2.40:";;
++ short | recursive ) echo "Configuration of ld 2.40.0:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1661,7 +1661,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-ld configure 2.40
++ld configure 2.40.0
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -2376,7 +2376,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by ld $as_me 2.40, which was
++It was created by ld $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -3359,7 +3359,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='ld'
+- VERSION='2.40'
++ VERSION='2.40.0'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -18083,7 +18083,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by ld $as_me 2.40, which was
++This file was extended by ld $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -18149,7 +18149,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-ld config.status 2.40
++ld config.status 2.40.0
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
+--- a/opcodes/configure
++++ b/opcodes/configure
+@@ -1,6 +1,6 @@
+ #! /bin/sh
+ # Guess values for system-dependent variables and create Makefiles.
+-# Generated by GNU Autoconf 2.69 for opcodes 2.40.
++# Generated by GNU Autoconf 2.69 for opcodes 2.40.0.
+ #
+ #
+ # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+@@ -587,8 +587,8 @@ MAKEFLAGS=
+ # Identity of this package.
+ PACKAGE_NAME='opcodes'
+ PACKAGE_TARNAME='opcodes'
+-PACKAGE_VERSION='2.40'
+-PACKAGE_STRING='opcodes 2.40'
++PACKAGE_VERSION='2.40.0'
++PACKAGE_STRING='opcodes 2.40.0'
+ PACKAGE_BUGREPORT=''
+ PACKAGE_URL=''
+
+@@ -1360,7 +1360,7 @@ if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+-\`configure' configures opcodes 2.40 to adapt to many kinds of systems.
++\`configure' configures opcodes 2.40.0 to adapt to many kinds of systems.
+
+ Usage: $0 [OPTION]... [VAR=VALUE]...
+
+@@ -1431,7 +1431,7 @@ fi
+
+ if test -n "$ac_init_help"; then
+ case $ac_init_help in
+- short | recursive ) echo "Configuration of opcodes 2.40:";;
++ short | recursive ) echo "Configuration of opcodes 2.40.0:";;
+ esac
+ cat <<\_ACEOF
+
+@@ -1545,7 +1545,7 @@ fi
+ test -n "$ac_init_help" && exit $ac_status
+ if $ac_init_version; then
+ cat <<\_ACEOF
+-opcodes configure 2.40
++opcodes configure 2.40.0
+ generated by GNU Autoconf 2.69
+
+ Copyright (C) 2012 Free Software Foundation, Inc.
+@@ -2139,7 +2139,7 @@ cat >config.log <<_ACEOF
+ This file contains any messages produced by compilers while
+ running configure, to aid debugging if configure makes a mistake.
+
+-It was created by opcodes $as_me 2.40, which was
++It was created by opcodes $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ $ $0 $@
+@@ -3118,7 +3118,7 @@ fi
+
+ # Define the identity of the package.
+ PACKAGE='opcodes'
+- VERSION='2.40'
++ VERSION='2.40.0'
+
+
+ cat >>confdefs.h <<_ACEOF
+@@ -13191,7 +13191,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
+ # report actual input values of CONFIG_FILES etc. instead of their
+ # values after options handling.
+ ac_log="
+-This file was extended by opcodes $as_me 2.40, which was
++This file was extended by opcodes $as_me 2.40.0, which was
+ generated by GNU Autoconf 2.69. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+@@ -13257,7 +13257,7 @@ _ACEOF
+ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ ac_cs_version="\\
+-opcodes config.status 2.40
++opcodes config.status 2.40.0
+ configured by $0, generated by GNU Autoconf 2.69,
+ with options \\"\$ac_cs_config\\"
+
diff --git a/toolchain/binutils/patches/2.40/040-configure-remove-dependencies-on-gmp-and-mpfr-when-g.patch b/toolchain/binutils/patches/2.40/040-configure-remove-dependencies-on-gmp-and-mpfr-when-g.patch
new file mode 100644
index 0000000..261acb5
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/040-configure-remove-dependencies-on-gmp-and-mpfr-when-g.patch
@@ -0,0 +1,51 @@
+From 17294931e3e361bee6810b1a39493e214b38c5e5 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Cl=C3=A9ment=20Chigot?= <chigot@adacore.com>
+Date: Tue, 3 Jan 2023 14:24:43 +0100
+Subject: [PATCH 40/50] configure: remove dependencies on gmp and mpfr when gdb
+ is disabled
+
+Since 991180627851801f1999d1ebbc0e569a17e47c74, the configure checks
+about GMP and MPFR for gdb builds have been moved to the toplevel
+configure.
+However, it doesn't take into account the --disable-gdb option. Meaning
+that a build without gdb will require these libraries even if not
+needed.
+
+ChangeLog:
+
+ * configure.ac: Skip GMP and MPFR when --disable-gdb is
+ provided.
+ * configure: Regenerate.
+
+(cherry picked from commit 5fb0e308577143ceb313fde5538dc9ecb038f29f)
+---
+ configure | 4 +++-
+ configure.ac | 4 +++-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+--- a/configure
++++ b/configure
+@@ -8032,7 +8032,9 @@ if test -d ${srcdir}/gcc ; then
+ require_mpc=yes
+ fi
+ if test -d ${srcdir}/gdb ; then
+- require_gmp=yes
++ if test "x$enable_gdb" != xno; then
++ require_gmp=yes
++ fi
+ fi
+
+ gmplibs="-lmpfr -lgmp"
+--- a/configure.ac
++++ b/configure.ac
+@@ -1585,7 +1585,9 @@ if test -d ${srcdir}/gcc ; then
+ require_mpc=yes
+ fi
+ if test -d ${srcdir}/gdb ; then
+- require_gmp=yes
++ if test "x$enable_gdb" != xno; then
++ require_gmp=yes
++ fi
+ fi
+
+ gmplibs="-lmpfr -lgmp"
diff --git a/toolchain/binutils/patches/2.40/046-gas-correct-symbol-name-comparison-in-.startof.-.siz.patch b/toolchain/binutils/patches/2.40/046-gas-correct-symbol-name-comparison-in-.startof.-.siz.patch
new file mode 100644
index 0000000..4e31bb4
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/046-gas-correct-symbol-name-comparison-in-.startof.-.siz.patch
@@ -0,0 +1,46 @@
+From b2bc62b7b4e7638c3a249d2d2728ceb4d5f2b22c Mon Sep 17 00:00:00 2001
+From: Jan Beulich <jbeulich@suse.com>
+Date: Tue, 14 Feb 2023 08:35:02 +0100
+Subject: [PATCH 46/50] gas: correct symbol name comparison in
+ .startof./.sizeof. handling
+
+In 162c6aef1f3a ("gas: fold symbol table entries generated for
+.startof.() / .sizeof.()") I screwed up quite badly, inverting the case
+sensitive and case insensitive comparison functions.
+---
+ gas/expr.c | 4 ++--
+ gas/testsuite/gas/elf/startof.d | 2 ++
+ gas/testsuite/gas/elf/startof.s | 3 +++
+ 3 files changed, 7 insertions(+), 2 deletions(-)
+
+--- a/gas/expr.c
++++ b/gas/expr.c
+@@ -149,8 +149,8 @@ symbol_lookup_or_make (const char *name,
+
+ name = S_GET_NAME (symbolP);
+ if ((symbols_case_sensitive
+- ? strcasecmp (buf, name)
+- : strcmp (buf, name)) == 0)
++ ? strcmp (buf, name)
++ : strcasecmp (buf, name)) == 0)
+ {
+ free (buf);
+ return symbolP;
+--- a/gas/testsuite/gas/elf/startof.d
++++ b/gas/testsuite/gas/elf/startof.d
+@@ -7,4 +7,6 @@ Symbol table .*
+ #...
+ [1-8]: 0+ .* UND \.startof\.\.text
+ [2-9]: 0+ .* UND \.sizeof\.\.text
++ +[1-9][0-9]*: 0+ .* UND \.startof\.\.Text
++ +[1-9][0-9]*: 0+ .* UND \.sizeof\.\.TEXT
+ #pass
+--- a/gas/testsuite/gas/elf/startof.s
++++ b/gas/testsuite/gas/elf/startof.s
+@@ -4,3 +4,6 @@
+ .dc.a 0
+ .dc.a .sizeof.(.text)
+ .dc.a .startof.(.text)
++ .dc.a 0
++ .dc.a .startof.(.Text)
++ .dc.a .sizeof.(.TEXT)
diff --git a/toolchain/binutils/patches/2.40/300-001_ld_makefile_patch.patch b/toolchain/binutils/patches/2.40/300-001_ld_makefile_patch.patch
new file mode 100644
index 0000000..2dafd92
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/300-001_ld_makefile_patch.patch
@@ -0,0 +1,22 @@
+--- a/ld/Makefile.am
++++ b/ld/Makefile.am
+@@ -50,7 +50,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS)
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+
+ EMUL = @EMUL@
+ EMULATION_OFILES = @EMULATION_OFILES@
+--- a/ld/Makefile.in
++++ b/ld/Makefile.in
+@@ -573,7 +573,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CLFAGS)
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+ BASEDIR = $(srcdir)/..
+ BFDDIR = $(BASEDIR)/bfd
+ INCDIR = $(BASEDIR)/include
diff --git a/toolchain/binutils/patches/2.40/400-mips_no_dynamic_linking_sym.patch b/toolchain/binutils/patches/2.40/400-mips_no_dynamic_linking_sym.patch
new file mode 100644
index 0000000..aeb5a99
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/400-mips_no_dynamic_linking_sym.patch
@@ -0,0 +1,18 @@
+--- a/bfd/elfxx-mips.c
++++ b/bfd/elfxx-mips.c
+@@ -8119,6 +8119,7 @@ _bfd_mips_elf_create_dynamic_sections (b
+
+ name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
+ bh = NULL;
++ if (0) {
+ if (!(_bfd_generic_link_add_one_symbol
+ (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
+ NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
+@@ -8131,6 +8132,7 @@ _bfd_mips_elf_create_dynamic_sections (b
+
+ if (! bfd_elf_link_record_dynamic_symbol (info, h))
+ return false;
++ }
+
+ if (! mips_elf_hash_table (info)->use_rld_obj_head)
+ {
diff --git a/toolchain/binutils/patches/2.40/500-Change-default-emulation-for-mips64-linux.patch b/toolchain/binutils/patches/2.40/500-Change-default-emulation-for-mips64-linux.patch
new file mode 100644
index 0000000..14a18a1
--- /dev/null
+++ b/toolchain/binutils/patches/2.40/500-Change-default-emulation-for-mips64-linux.patch
@@ -0,0 +1,38 @@
+--- a/bfd/config.bfd
++++ b/bfd/config.bfd
+@@ -944,12 +944,12 @@ case "${targ}" in
+ targ_selvecs="mips_elf32_le_vec mips_elf64_be_vec mips_elf64_le_vec mips_ecoff_be_vec mips_ecoff_le_vec"
+ ;;
+ mips64*el-*-linux*)
+- targ_defvec=mips_elf32_ntrad_le_vec
+- targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_le_vec mips_elf64_trad_be_vec"
++ targ_defvec=mips_elf64_trad_le_vec
++ targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_be_vec"
+ ;;
+ mips64*-*-linux*)
+- targ_defvec=mips_elf32_ntrad_be_vec
+- targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec"
++ targ_defvec=mips_elf64_trad_be_vec
++ targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_le_vec"
+ ;;
+ mips*el-*-linux*)
+ targ_defvec=mips_elf32_trad_le_vec
+--- a/ld/configure.tgt
++++ b/ld/configure.tgt
+@@ -585,12 +585,12 @@ mips*-*-vxworks*) targ_emul=elf32ebmipvx
+ ;;
+ mips*-*-windiss) targ_emul=elf32mipswindiss
+ ;;
+-mips64*el-*-linux-*) targ_emul=elf32ltsmipn32
+- targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
++mips64*el-*-linux-*) targ_emul=elf64ltsmip
++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32ltsmip elf32btsmip elf64btsmip"
+ targ_extra_libpath=$targ_extra_emuls
+ ;;
+-mips64*-*-linux-*) targ_emul=elf32btsmipn32
+- targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
++mips64*-*-linux-*) targ_emul=elf64btsmip
++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip"
+ targ_extra_libpath=$targ_extra_emuls
+ ;;
+ mips*el-*-linux-*) targ_emul=elf32ltsmip
diff --git a/toolchain/binutils/patches/2.42/001-PR-30569-always-call-elf_backend_size_dynamic_sectio.patch b/toolchain/binutils/patches/2.42/001-PR-30569-always-call-elf_backend_size_dynamic_sectio.patch
new file mode 100644
index 0000000..96f3971
--- /dev/null
+++ b/toolchain/binutils/patches/2.42/001-PR-30569-always-call-elf_backend_size_dynamic_sectio.patch
@@ -0,0 +1,2228 @@
+From af969b14aedcc0ae27dcefab4327ff2d153dec8b Mon Sep 17 00:00:00 2001
+From: Alan Modra <amodra@gmail.com>
+Date: Thu, 28 Mar 2024 19:25:42 +1030
+Subject: [PATCH 1/2] PR 30569, always call elf_backend_size_dynamic_sections
+
+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.
+---
+ bfd/elf-bfd.h | 35 +++++++++++++++++------------------
+ bfd/elf-m10300.c | 11 ++++++-----
+ bfd/elf32-arc.c | 9 +++++----
+ bfd/elf32-arm.c | 15 ++++++++-------
+ bfd/elf32-bfin.c | 31 ++++++++++++++++---------------
+ bfd/elf32-cr16.c | 11 ++++++-----
+ bfd/elf32-cris.c | 13 +++++++------
+ bfd/elf32-csky.c | 8 ++++----
+ bfd/elf32-frv.c | 23 ++++++++++++-----------
+ bfd/elf32-hppa.c | 8 ++++----
+ bfd/elf32-i386.c | 7 +++----
+ bfd/elf32-lm32.c | 15 ++++++++-------
+ bfd/elf32-m32c.c | 8 ++++----
+ bfd/elf32-m32r.c | 11 ++++++-----
+ bfd/elf32-m68k.c | 16 ++++++++--------
+ bfd/elf32-metag.c | 8 ++++----
+ bfd/elf32-microblaze.c | 9 +++++----
+ bfd/elf32-mips.c | 6 ++----
+ bfd/elf32-nds32.c | 9 +++++----
+ bfd/elf32-nios2.c | 15 ++++++++-------
+ bfd/elf32-or1k.c | 9 +++++----
+ bfd/elf32-ppc.c | 11 ++++++-----
+ bfd/elf32-rl78.c | 8 ++++----
+ bfd/elf32-s390.c | 10 +++++-----
+ bfd/elf32-score.c | 35 ++++++++++++++++++-----------------
+ bfd/elf32-score.h | 4 ++--
+ bfd/elf32-score7.c | 13 +++++++------
+ bfd/elf32-sh.c | 15 +++++++--------
+ bfd/elf32-sparc.c | 3 +--
+ bfd/elf32-tic6x.c | 14 +++++++-------
+ bfd/elf32-tilegx.c | 2 +-
+ bfd/elf32-tilepro.c | 11 +++++------
+ bfd/elf32-vax.c | 16 +++++++---------
+ bfd/elf32-xstormy16.c | 8 ++++----
+ bfd/elf32-xtensa.c | 13 ++++++-------
+ bfd/elf64-alpha.c | 19 ++++++++++---------
+ bfd/elf64-hppa.c | 11 ++++-------
+ bfd/elf64-ia64-vms.c | 13 +++++++------
+ bfd/elf64-mips.c | 8 ++++----
+ bfd/elf64-ppc.c | 12 ++++++------
+ bfd/elf64-s390.c | 10 +++++-----
+ bfd/elf64-sparc.c | 4 ++--
+ bfd/elf64-tilegx.c | 2 +-
+ bfd/elf64-x86-64.c | 7 +++----
+ bfd/elflink.c | 9 ++++-----
+ bfd/elfn32-mips.c | 6 ++----
+ bfd/elfnn-aarch64.c | 21 +++++++++++----------
+ bfd/elfnn-ia64.c | 11 ++++++-----
+ bfd/elfnn-kvx.c | 19 +++++++++----------
+ bfd/elfnn-loongarch.c | 9 +++++----
+ bfd/elfnn-riscv.c | 7 ++++---
+ bfd/elfxx-mips.c | 15 ++++++++-------
+ bfd/elfxx-mips.h | 4 ++--
+ bfd/elfxx-sparc.c | 7 ++++---
+ bfd/elfxx-sparc.h | 2 +-
+ bfd/elfxx-target.h | 12 ++++++------
+ bfd/elfxx-tilegx.c | 7 ++++---
+ bfd/elfxx-tilegx.h | 2 +-
+ bfd/elfxx-x86.c | 8 ++++----
+ bfd/elfxx-x86.h | 8 ++++----
+ ld/emultempl/vms.em | 7 +++----
+ 61 files changed, 343 insertions(+), 337 deletions(-)
+
+--- 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
+--- a/bfd/elf-m10300.c
++++ b/bfd/elf-m10300.c
+@@ -5015,8 +5015,8 @@ _bfd_mn10300_elf_adjust_dynamic_symbol (
+ /* 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 (
+ 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
+--- a/bfd/elf32-arc.c
++++ b/bfd/elf32-arc.c
+@@ -2715,8 +2715,8 @@ elf_arc_finish_dynamic_sections (bfd * o
+
+ /* 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;
+@@ -2724,7 +2724,8 @@ elf_arc_size_dynamic_sections (bfd *outp
+ 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)
+ {
+@@ -3140,7 +3141,7 @@ arc_elf_relax_section (bfd *abfd, asecti
+ #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
+--- a/bfd/elf32-arm.c
++++ b/bfd/elf32-arm.c
+@@ -16752,8 +16752,8 @@ bfd_elf32_arm_set_byteswap_code (struct
+ /* 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;
+@@ -16766,7 +16766,9 @@ elf32_arm_size_dynamic_sections (bfd * o
+ 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)
+@@ -17138,8 +17140,7 @@ elf32_arm_size_dynamic_sections (bfd * o
+ _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;
+@@ -20341,8 +20342,8 @@ elf32_arm_backend_symbol_processing (bfd
+ #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
+--- 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 (b
+
+ 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 (b
+ }
+
+ 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_has
+ }
+
+ 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 elf
+ #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 elf
+ #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 elf
+ #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
+--- a/bfd/elf32-cr16.c
++++ b/bfd/elf32-cr16.c
+@@ -2391,15 +2391,16 @@ _bfd_cr16_elf_adjust_dynamic_symbol (str
+ /* 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 st
+ _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
+--- a/bfd/elf32-cris.c
++++ b/bfd/elf32-cris.c
+@@ -2527,7 +2527,7 @@ cris_elf_plt_sym_val (bfd_vma i ATTRIBUT
+ 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
+@@ -3508,8 +3508,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;
+@@ -3521,7 +3521,8 @@ elf_cris_size_dynamic_sections (bfd *out
+ return false;
+
+ dynobj = htab->root.dynobj;
+- BFD_ASSERT (dynobj != NULL);
++ if (dynobj == NULL)
++ return true;
+
+ if (htab->root.dynamic_sections_created)
+ {
+@@ -4090,8 +4091,8 @@ elf_cris_got_elt_size (bfd *abfd ATTRIBU
+ 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
+--- a/bfd/elf32-csky.c
++++ b/bfd/elf32-csky.c
+@@ -1893,8 +1893,8 @@ csky_allocate_dynrelocs (struct elf_link
+ /* 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 *out
+ return false;
+ dynobj = htab->elf.dynobj;
+ if (dynobj == NULL)
+- return false;
++ return true;
+
+ if (htab->elf.dynamic_sections_created)
+ {
+@@ -5333,7 +5333,7 @@ elf32_csky_obj_attrs_handle_unknown (bfd
+ /* 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
+--- 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 (bf
+ }
+
+ 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_In
+ #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_In
+ #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
+--- a/bfd/elf32-hppa.c
++++ b/bfd/elf32-hppa.c
+@@ -2042,8 +2042,8 @@ clobber_millicode_symbols (struct elf_li
+ /* 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 *o
+
+ dynobj = htab->etab.dynobj;
+ if (dynobj == NULL)
+- abort ();
++ return true;
+
+ if (htab->etab.dynamic_sections_created)
+ {
+@@ -4452,7 +4452,7 @@ elf32_hppa_elf_get_symbol_type (Elf_Inte
+ #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
+--- 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 *outp
+ 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
+@@ -4479,7 +4478,7 @@ elf_i386_link_setup_gnu_properties (stru
+ #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
+--- a/bfd/elf32-lm32.c
++++ b/bfd/elf32-lm32.c
+@@ -1906,8 +1906,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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;
+@@ -1920,7 +1920,8 @@ lm32_elf_size_dynamic_sections (bfd *out
+ return false;
+
+ dynobj = htab->root.dynobj;
+- BFD_ASSERT (dynobj != NULL);
++ if (dynobj == NULL)
++ return true;
+
+ if (htab->root.dynamic_sections_created)
+ {
+@@ -2309,7 +2310,7 @@ lm32_elf_create_dynamic_sections (bfd *a
+ }
+
+ 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))
+ {
+@@ -2395,7 +2396,7 @@ lm32_elf_fdpic_copy_private_bfd_data (bf
+ #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
+@@ -2416,8 +2417,8 @@ lm32_elf_fdpic_copy_private_bfd_data (bf
+ #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
+
+--- a/bfd/elf32-m32c.c
++++ b/bfd/elf32-m32c.c
+@@ -773,8 +773,8 @@ m32c_elf_finish_dynamic_sections (bfd *a
+ }
+
+ 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
+ #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
+
+--- a/bfd/elf32-m32r.c
++++ b/bfd/elf32-m32r.c
+@@ -1958,8 +1958,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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 *out
+ 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 *out
+ return false;
+
+ dynobj = htab->dynobj;
+- BFD_ASSERT (dynobj != NULL);
++ if (dynobj == NULL)
++ return true;
+
+ if (htab->dynamic_sections_created)
+ {
+@@ -3658,7 +3659,7 @@ m32r_elf_reloc_type_class (const struct
+
+ #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
+--- 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 b
+ /* 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_Int
+ #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
+--- a/bfd/elf32-metag.c
++++ b/bfd/elf32-metag.c
+@@ -2717,8 +2717,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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 *ou
+ 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
+ #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
+--- a/bfd/elf32-microblaze.c
++++ b/bfd/elf32-microblaze.c
+@@ -2966,8 +2966,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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 (bf
+ 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. */
+@@ -3497,7 +3498,7 @@ microblaze_elf_add_symbol_hook (bfd *abf
+ #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"
+--- a/bfd/elf32-mips.c
++++ b/bfd/elf32-mips.c
+@@ -2537,10 +2537,8 @@ static const struct ecoff_debug_swap mip
+ #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 \
+--- a/bfd/elf32-nds32.c
++++ b/bfd/elf32-nds32.c
+@@ -4302,8 +4302,8 @@ elf32_nds32_add_dynreloc (bfd *output_bf
+ /* 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 *ou
+ 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, a
+ #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
+--- a/bfd/elf32-nios2.c
++++ b/bfd/elf32-nios2.c
+@@ -5405,7 +5405,7 @@ nios2_elf32_adjust_dynamic_symbol (struc
+ 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)
+ {
+@@ -5432,7 +5432,7 @@ adjust_dynrelocs (struct elf_link_hash_e
+ 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
+@@ -5667,11 +5667,11 @@ allocate_dynrelocs (struct elf_link_hash
+ 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;
+@@ -5681,7 +5681,8 @@ nios2_elf32_size_dynamic_sections (bfd *
+
+ 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)
+@@ -6052,7 +6053,7 @@ const struct bfd_elf_special_section elf
+ 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
+--- a/bfd/elf32-or1k.c
++++ b/bfd/elf32-or1k.c
+@@ -3047,8 +3047,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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;
+@@ -3061,7 +3061,8 @@ or1k_elf_size_dynamic_sections (bfd *out
+ return false;
+
+ dynobj = htab->root.dynobj;
+- BFD_ASSERT (dynobj != NULL);
++ if (dynobj == NULL)
++ return true;
+
+ if (htab->root.dynamic_sections_created)
+ {
+@@ -3414,7 +3415,7 @@ or1k_grok_psinfo (bfd *abfd, Elf_Interna
+ #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
+
+--- a/bfd/elf32-ppc.c
++++ b/bfd/elf32-ppc.c
+@@ -5479,8 +5479,8 @@ static const unsigned char glink_eh_fram
+ /* 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 *outp
+ 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 *ou
+ #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
+--- a/bfd/elf32-rl78.c
++++ b/bfd/elf32-rl78.c
+@@ -1440,8 +1440,8 @@ rl78_elf_finish_dynamic_sections (bfd *a
+ }
+
+ 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
+
+--- 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
+@@ -1778,8 +1778,8 @@ allocate_dynrelocs (struct elf_link_hash
+ /* 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;
+@@ -1790,7 +1790,7 @@ elf_s390_size_dynamic_sections (bfd *out
+ htab = elf_s390_hash_table (info);
+ dynobj = htab->elf.dynobj;
+ if (dynobj == NULL)
+- abort ();
++ return true;
+
+ if (htab->elf.dynamic_sections_created)
+ {
+@@ -3926,7 +3926,7 @@ elf32_s390_merge_private_bfd_data (bfd *
+ #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
+--- a/bfd/elf32-score.c
++++ b/bfd/elf32-score.c
+@@ -1089,7 +1089,7 @@ score_elf_got_info (bfd *abfd, asection
+ 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 (
+ /* 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 (b
+
+ /* 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 (
+ }
+ 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. */
+@@ -4177,22 +4178,22 @@ _bfd_score_elf_adjust_dynamic_symbol (st
+ }
+
+ 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
+@@ -4455,10 +4456,10 @@ _bfd_score_elf_common_definition (Elf_In
+ _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
+--- a/bfd/elf32-score.h
++++ b/bfd/elf32-score.h
+@@ -78,10 +78,10 @@ s7_bfd_score_elf_adjust_dynamic_symbol (
+ 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 *);
+--- a/bfd/elf32-score7.c
++++ b/bfd/elf32-score7.c
+@@ -975,7 +975,7 @@ score_elf_got_info (bfd *abfd, asection
+ 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 (
+ 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 (b
+ /* 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 (
+ }
+ 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. */
+--- a/bfd/elf32-sh.c
++++ b/bfd/elf32-sh.c
+@@ -2927,7 +2927,7 @@ allocate_dynrelocs (struct elf_link_hash
+ 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
+ /* 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 *outpu
+ return false;
+
+ dynobj = htab->root.dynobj;
+- BFD_ASSERT (dynobj != NULL);
++ if (dynobj == NULL)
++ return true;
+
+ if (htab->root.dynamic_sections_created)
+ {
+@@ -6600,10 +6601,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
+--- a/bfd/elf32-sparc.c
++++ b/bfd/elf32-sparc.c
+@@ -248,8 +248,7 @@ elf32_sparc_reloc_type_class (const stru
+ #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
+--- a/bfd/elf32-tic6x.c
++++ b/bfd/elf32-tic6x.c
+@@ -3160,7 +3160,7 @@ elf32_tic6x_allocate_dynrelocs (struct e
+ /* 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 *
+ 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 *
+ 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_b
+ #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 \
+--- a/bfd/elf32-tilegx.c
++++ b/bfd/elf32-tilegx.c
+@@ -105,7 +105,7 @@ tilegx_elf_grok_psinfo (bfd *abfd, Elf_I
+ #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
+--- a/bfd/elf32-tilepro.c
++++ b/bfd/elf32-tilepro.c
+@@ -2182,11 +2182,9 @@ tilepro_elf_omit_section_dynsym (bfd *ou
+ #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 *
+ 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
+ #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
+--- a/bfd/elf32-vax.c
++++ b/bfd/elf32-vax.c
+@@ -36,7 +36,6 @@ static bool elf_vax_check_relocs (bfd *,
+ 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_
+ /* 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 *outpu
+ /* 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 as
+ #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 \
+--- 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 *se
+ #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 \
+--- a/bfd/elf32-xtensa.c
++++ b/bfd/elf32-xtensa.c
+@@ -1557,8 +1557,8 @@ elf_xtensa_allocate_local_got_size (stru
+ /* 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 *o
+
+ 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 *o
+ }
+
+ 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;
+@@ -11544,8 +11543,8 @@ static const struct bfd_elf_special_sect
+ #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
+--- a/bfd/elf64-alpha.c
++++ b/bfd/elf64-alpha.c
+@@ -2562,8 +2562,8 @@ elf64_alpha_size_plt_section (struct bfd
+ }
+
+ 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 (struc
+ /* 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 *
+ 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_
+ 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 \
+--- a/bfd/elf64-hppa.c
++++ b/bfd/elf64-hppa.c
+@@ -176,9 +176,6 @@ static bool elf64_hppa_adjust_dynamic_sy
+ 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_funct
+ 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 *o
+ 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
+@@ -3984,8 +3982,7 @@ const struct elf_size_info hppa64_elf_si
+ #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
+--- a/bfd/elf64-ia64-vms.c
++++ b/bfd/elf64-ia64-vms.c
+@@ -2591,8 +2591,8 @@ elf64_ia64_adjust_dynamic_symbol (struct
+ }
+
+ 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 *o
+ 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. */
+@@ -5488,8 +5489,8 @@ static const struct elf_size_info elf64_
+ 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 \
+--- a/bfd/elf64-mips.c
++++ b/bfd/elf64-mips.c
+@@ -4748,10 +4748,10 @@ const struct elf_size_info mips_elf64_si
+ #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 \
+--- 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
+ ((((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
+ /* 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 *ou
+
+ dynobj = htab->elf.dynobj;
+ if (dynobj == NULL)
+- abort ();
++ return true;
+
+ if (htab->elf.dynamic_sections_created)
+ {
+--- 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
+ /* 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 *out
+
+ dynobj = htab->elf.dynobj;
+ if (dynobj == NULL)
+- abort ();
++ return true;
+
+ if (htab->elf.dynamic_sections_created)
+ {
+@@ -3912,7 +3912,7 @@ const struct elf_size_info s390_elf64_si
+ #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
+--- a/bfd/elf64-sparc.c
++++ b/bfd/elf64-sparc.c
+@@ -953,8 +953,8 @@ const struct elf_size_info elf64_sparc_s
+ _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 \
+--- a/bfd/elf64-tilegx.c
++++ b/bfd/elf64-tilegx.c
+@@ -106,7 +106,7 @@ tilegx_elf_grok_psinfo (bfd *abfd, Elf_I
+ #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
+--- a/bfd/elf64-x86-64.c
++++ b/bfd/elf64-x86-64.c
+@@ -2549,8 +2549,7 @@ elf_x86_64_scan_relocs (bfd *abfd, struc
+ }
+
+ 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;
+
+@@ -2563,7 +2562,7 @@ elf_x86_64_always_size_sections (bfd *ou
+ 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
+@@ -5638,7 +5637,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
+--- a/bfd/elflink.c
++++ b/bfd/elflink.c
+@@ -6676,8 +6676,8 @@ bfd_elf_size_dynamic_sections (bfd *outp
+
+ /* 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;
+@@ -7483,9 +7483,8 @@ NOTE: This behaviour is deprecated and w
+
+ /* 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)
+--- a/bfd/elfn32-mips.c
++++ b/bfd/elfn32-mips.c
+@@ -4138,10 +4138,8 @@ static const struct ecoff_debug_swap mip
+ #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 \
+--- 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
+@@ -9175,8 +9175,8 @@ elfNN_aarch64_allocate_local_ifunc_dynre
+ 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;
+@@ -9187,7 +9187,8 @@ elfNN_aarch64_size_dynamic_sections (bfd
+ 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)
+ {
+@@ -9589,8 +9590,8 @@ elfNN_aarch64_create_small_pltn_entry (s
+ _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;
+
+@@ -10323,8 +10324,8 @@ const struct elf_size_info elfNN_aarch64
+ #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
+@@ -10379,8 +10380,8 @@ const struct elf_size_info elfNN_aarch64
+ #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
+--- a/bfd/elfnn-ia64.c
++++ b/bfd/elfnn-ia64.c
+@@ -2987,8 +2987,8 @@ elfNN_ia64_adjust_dynamic_symbol (struct
+ }
+
+ 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 *o
+ 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. */
+@@ -5036,8 +5037,8 @@ ignore_errors (const char *fmt ATTRIBUTE
+ 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 \
+--- a/bfd/elfnn-kvx.c
++++ b/bfd/elfnn-kvx.c
+@@ -4033,8 +4033,8 @@ kvx_readonly_dynrelocs (struct elf_link_
+ /* 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;
+@@ -4044,8 +4044,8 @@ elfNN_kvx_size_dynamic_sections (bfd *ou
+
+ 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)
+ {
+@@ -4359,8 +4359,7 @@ elfNN_kvx_create_small_pltn_entry (struc
+ _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;
+
+@@ -4715,8 +4714,8 @@ elfNN_kvx_plt_sym_val (bfd_vma i, const
+ #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
+@@ -4759,8 +4758,8 @@ elfNN_kvx_plt_sym_val (bfd_vma i, const
+ #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
+--- a/bfd/elfnn-loongarch.c
++++ b/bfd/elfnn-loongarch.c
+@@ -1731,8 +1731,8 @@ maybe_set_textrel (struct elf_link_hash_
+ }
+
+ 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;
+@@ -1742,7 +1742,8 @@ loongarch_elf_size_dynamic_sections (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)
+ {
+@@ -5340,7 +5341,7 @@ elf_loongarch64_hash_symbol (struct elf_
+ 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 \
+--- a/bfd/elfnn-riscv.c
++++ b/bfd/elfnn-riscv.c
+@@ -1482,7 +1482,7 @@ allocate_local_ifunc_dynrelocs (void **s
+ }
+
+ 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;
+@@ -1492,7 +1492,8 @@ riscv_elf_size_dynamic_sections (bfd *ou
+ 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)
+ {
+@@ -5570,7 +5571,7 @@ riscv_elf_merge_symbol_attribute (struct
+ #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
+--- a/bfd/elfxx-mips.c
++++ b/bfd/elfxx-mips.c
+@@ -9649,8 +9649,8 @@ _bfd_mips_elf_adjust_dynamic_symbol (str
+ 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_
+ /* 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
+ 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)
+ {
+@@ -14938,7 +14939,7 @@ _bfd_mips_elf_final_link (bfd *abfd, str
+ 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
+@@ -14997,7 +14998,7 @@ _bfd_mips_elf_final_link (bfd *abfd, str
+ 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
+--- 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 *,
+--- a/bfd/elfxx-sparc.c
++++ b/bfd/elfxx-sparc.c
+@@ -2381,8 +2381,8 @@ _bfd_sparc_elf_omit_section_dynsym (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 (bf
+ 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)
+ {
+--- a/bfd/elfxx-sparc.h
++++ b/bfd/elfxx-sparc.h
+@@ -117,7 +117,7 @@ extern bool _bfd_sparc_elf_adjust_dynami
+ (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 *);
+--- a/bfd/elfxx-target.h
++++ b/bfd/elfxx-target.h
+@@ -487,11 +487,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
+@@ -853,8 +853,8 @@ static const struct elf_backend_data elf
+ 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,
+--- a/bfd/elfxx-tilegx.c
++++ b/bfd/elfxx-tilegx.c
+@@ -2430,8 +2430,8 @@ tilegx_elf_omit_section_dynsym (bfd *out
+ }
+
+ 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 *o
+ 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)
+ {
+--- 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 *,
+--- a/bfd/elfxx-x86.c
++++ b/bfd/elfxx-x86.c
+@@ -2241,7 +2241,7 @@ _bfd_elf_x86_valid_reloc_p (asection *in
+ /* 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
+ 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 (bf
+
+
+ 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;
+
+--- a/bfd/elfxx-x86.h
++++ b/bfd/elfxx-x86.h
+@@ -850,13 +850,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 *);
+
+-extern bool _bfd_x86_elf_size_dynamic_sections
++extern bool _bfd_x86_elf_late_size_sections
+ (bfd *, struct bfd_link_info *);
+
+ extern struct elf_x86_link_hash_table *_bfd_x86_elf_finish_dynamic_sections
+ (bfd *, struct bfd_link_info *);
+
+-extern bool _bfd_x86_elf_always_size_sections
++extern bool _bfd_x86_elf_early_size_sections
+ (bfd *, struct bfd_link_info *);
+
+ extern void _bfd_x86_elf_merge_symbol_attribute
+@@ -928,8 +928,8 @@ extern void _bfd_x86_elf_link_report_rel
+
+ #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 \
+--- a/ld/emultempl/vms.em
++++ b/ld/emultempl/vms.em
+@@ -197,10 +197,9 @@ gld${EMULATION_NAME}_before_allocation (
+
+ /* 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 ();
diff --git a/toolchain/binutils/patches/2.42/002-PR-30569-delete-_bfd_mips_elf_early_size_sections.patch b/toolchain/binutils/patches/2.42/002-PR-30569-delete-_bfd_mips_elf_early_size_sections.patch
new file mode 100644
index 0000000..49381a4
--- /dev/null
+++ b/toolchain/binutils/patches/2.42/002-PR-30569-delete-_bfd_mips_elf_early_size_sections.patch
@@ -0,0 +1,218 @@
+From 3c6c32951e292a51ede70b8087bb0308d7dbc4fc Mon Sep 17 00:00:00 2001
+From: Alan Modra <amodra@gmail.com>
+Date: Thu, 28 Mar 2024 20:33:32 +1030
+Subject: [PATCH 2/2] PR 30569, delete _bfd_mips_elf_early_size_sections
+
+PR30569 was triggered by a patch of mine 6540edd52cc0 moving the call
+to always_size_sections in bfd_elf_size_dynamic_sections earlier, made
+to support the x86 DT_RELR implementation. This broke mips16 code
+handling stubs when --export-dynamic is passed to the linker, because
+numerous symbols then became dynamic after always_size_sections. The
+mips backend fiddles with symbols in its always_size_sections. Maciej
+in 902e9fc76a0e had moved the call to always_size_sections to after
+the export-dynamic code. Prior to that, Nathan in 04c3a75556c0 moved
+it before the exec stack code, back to the start of
+bfd_elf_size_dynamic_sections which was where Ian put it originally
+in ff12f303355b. So the call has moved around a little. I'm leaving
+it where it is, and instead calling mips_elf_check_symbols from
+late_size_sections (the old size_dynamic_sections) which is now always
+called. In fact, the whole of _bfd_mips_elf_early_size_sections can
+be merged into _bfd_mips_elf_late_size_sections.
+---
+ bfd/elf32-mips.c | 1 -
+ bfd/elf64-mips.c | 2 --
+ bfd/elfn32-mips.c | 1 -
+ bfd/elfxx-mips.c | 84 +++++++++++++++++++----------------------------
+ bfd/elfxx-mips.h | 2 --
+ 5 files changed, 34 insertions(+), 56 deletions(-)
+
+--- a/bfd/elf32-mips.c
++++ b/bfd/elf32-mips.c
+@@ -2537,7 +2537,6 @@ static const struct ecoff_debug_swap mip
+ #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_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
+--- a/bfd/elf64-mips.c
++++ b/bfd/elf64-mips.c
+@@ -4748,8 +4748,6 @@ const struct elf_size_info mips_elf64_si
+ #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_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
+--- a/bfd/elfn32-mips.c
++++ b/bfd/elfn32-mips.c
+@@ -4138,7 +4138,6 @@ static const struct ecoff_debug_swap mip
+ #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_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
+--- a/bfd/elfxx-mips.c
++++ b/bfd/elfxx-mips.c
+@@ -9644,48 +9644,6 @@ _bfd_mips_elf_adjust_dynamic_symbol (str
+ return _bfd_elf_adjust_dynamic_copy (info, h, s);
+ }
+
+-/* This function is called after all the input files have been read,
+- and the input sections have been assigned to output sections. We
+- check for any mips16 stub sections that we can discard. */
+-
+-bool
+-_bfd_mips_elf_early_size_sections (bfd *output_bfd,
+- struct bfd_link_info *info)
+-{
+- asection *sect;
+- struct mips_elf_link_hash_table *htab;
+- struct mips_htab_traverse_info hti;
+-
+- htab = mips_elf_hash_table (info);
+- BFD_ASSERT (htab != NULL);
+-
+- /* The .reginfo section has a fixed size. */
+- sect = bfd_get_section_by_name (output_bfd, ".reginfo");
+- if (sect != NULL)
+- {
+- bfd_set_section_size (sect, sizeof (Elf32_External_RegInfo));
+- sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
+- }
+-
+- /* The .MIPS.abiflags section has a fixed size. */
+- sect = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
+- if (sect != NULL)
+- {
+- bfd_set_section_size (sect, sizeof (Elf_External_ABIFlags_v0));
+- sect->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
+- }
+-
+- hti.info = info;
+- hti.output_bfd = output_bfd;
+- hti.error = false;
+- mips_elf_link_hash_traverse (mips_elf_hash_table (info),
+- mips_elf_check_symbols, &hti);
+- if (hti.error)
+- return false;
+-
+- return true;
+-}
+-
+ /* If the link uses a GOT, lay it out and work out its size. */
+
+ static bool
+@@ -9990,7 +9948,8 @@ mips_elf_set_plt_sym_value (struct mips_
+ return true;
+ }
+
+-/* Set the sizes of the dynamic sections. */
++/* Set the sizes of the dynamic sections, some mips non-dynamic sections,
++ and check for any mips16 stub sections that we can discard. */
+
+ bool
+ _bfd_mips_elf_late_size_sections (bfd *output_bfd,
+@@ -10000,14 +9959,39 @@ _bfd_mips_elf_late_size_sections (bfd *o
+ asection *s, *sreldyn;
+ bool reltext;
+ struct mips_elf_link_hash_table *htab;
++ struct mips_htab_traverse_info hti;
+
+ htab = mips_elf_hash_table (info);
+ BFD_ASSERT (htab != NULL);
+- dynobj = elf_hash_table (info)->dynobj;
++
++ /* The .reginfo section has a fixed size. */
++ s = bfd_get_section_by_name (output_bfd, ".reginfo");
++ if (s != NULL)
++ {
++ bfd_set_section_size (s, sizeof (Elf32_External_RegInfo));
++ s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
++ }
++
++ /* The .MIPS.abiflags section has a fixed size. */
++ s = bfd_get_section_by_name (output_bfd, ".MIPS.abiflags");
++ if (s != NULL)
++ {
++ bfd_set_section_size (s, sizeof (Elf_External_ABIFlags_v0));
++ s->flags |= SEC_FIXED_SIZE | SEC_HAS_CONTENTS;
++ }
++
++ hti.info = info;
++ hti.output_bfd = output_bfd;
++ hti.error = false;
++ mips_elf_link_hash_traverse (htab, mips_elf_check_symbols, &hti);
++ if (hti.error)
++ return false;
++
++ dynobj = htab->root.dynobj;
+ if (dynobj == NULL)
+ return true;
+
+- if (elf_hash_table (info)->dynamic_sections_created)
++ if (htab->root.dynamic_sections_created)
+ {
+ /* Set the contents of the .interp section to the interpreter. */
+ if (bfd_link_executable (info) && !info->nointerp)
+@@ -10147,7 +10131,7 @@ _bfd_mips_elf_late_size_sections (bfd *o
+ }
+ }
+ else if (bfd_link_executable (info)
+- && ! mips_elf_hash_table (info)->use_rld_obj_head
++ && !htab->use_rld_obj_head
+ && startswith (name, ".rld_map"))
+ {
+ /* We add a room for __rld_map. It will be filled in by the
+@@ -10156,7 +10140,7 @@ _bfd_mips_elf_late_size_sections (bfd *o
+ }
+ else if (SGI_COMPAT (output_bfd)
+ && startswith (name, ".compact_rel"))
+- s->size += mips_elf_hash_table (info)->compact_rel_size;
++ s->size += htab->compact_rel_size;
+ else if (s == htab->root.splt)
+ {
+ /* If the last PLT entry has a branch delay slot, allocate
+@@ -10196,7 +10180,7 @@ _bfd_mips_elf_late_size_sections (bfd *o
+ }
+ }
+
+- if (elf_hash_table (info)->dynamic_sections_created)
++ if (htab->root.dynamic_sections_created)
+ {
+ /* Add some entries to the .dynamic section. We fill in the
+ values later, in _bfd_mips_elf_finish_dynamic_sections, but we
+@@ -14939,7 +14923,7 @@ _bfd_mips_elf_final_link (bfd *abfd, str
+ input_section->flags &= ~SEC_HAS_CONTENTS;
+ }
+
+- /* Size has been set in _bfd_mips_elf_early_size_sections. */
++ /* Size has been set in _bfd_mips_elf_late_size_sections. */
+ BFD_ASSERT(o->size == sizeof (Elf_External_ABIFlags_v0));
+
+ /* Skip this section later on (I don't think this currently
+@@ -14998,7 +14982,7 @@ _bfd_mips_elf_final_link (bfd *abfd, str
+ input_section->flags &= ~SEC_HAS_CONTENTS;
+ }
+
+- /* Size has been set in _bfd_mips_elf_early_size_sections. */
++ /* Size has been set in _bfd_mips_elf_late_size_sections. */
+ BFD_ASSERT(o->size == sizeof (Elf32_External_RegInfo));
+
+ /* Skip this section later on (I don't think this currently
+--- a/bfd/elfxx-mips.h
++++ b/bfd/elfxx-mips.h
+@@ -67,8 +67,6 @@ 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_early_size_sections
+- (bfd *, struct bfd_link_info *);
+ extern bool _bfd_mips_elf_late_size_sections
+ (bfd *, struct bfd_link_info *);
+ extern int _bfd_mips_elf_relocate_section
diff --git a/toolchain/binutils/patches/2.42/300-001_ld_makefile_patch.patch b/toolchain/binutils/patches/2.42/300-001_ld_makefile_patch.patch
new file mode 100644
index 0000000..64dae55
--- /dev/null
+++ b/toolchain/binutils/patches/2.42/300-001_ld_makefile_patch.patch
@@ -0,0 +1,22 @@
+--- a/ld/Makefile.am
++++ b/ld/Makefile.am
+@@ -50,7 +50,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CFLAGS)
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+
+ EMUL = @EMUL@
+ EMULATION_OFILES = @EMULATION_OFILES@
+--- a/ld/Makefile.in
++++ b/ld/Makefile.in
+@@ -583,7 +583,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CFLAGS)
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+ BASEDIR = $(srcdir)/..
+ BFDDIR = $(BASEDIR)/bfd
+ INCDIR = $(BASEDIR)/include
diff --git a/toolchain/binutils/patches/2.42/400-mips_no_dynamic_linking_sym.patch b/toolchain/binutils/patches/2.42/400-mips_no_dynamic_linking_sym.patch
new file mode 100644
index 0000000..30f70c2
--- /dev/null
+++ b/toolchain/binutils/patches/2.42/400-mips_no_dynamic_linking_sym.patch
@@ -0,0 +1,18 @@
+--- a/bfd/elfxx-mips.c
++++ b/bfd/elfxx-mips.c
+@@ -8149,6 +8149,7 @@ _bfd_mips_elf_create_dynamic_sections (b
+
+ name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
+ bh = NULL;
++ if (0) {
+ if (!(_bfd_generic_link_add_one_symbol
+ (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
+ NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
+@@ -8161,6 +8162,7 @@ _bfd_mips_elf_create_dynamic_sections (b
+
+ if (! bfd_elf_link_record_dynamic_symbol (info, h))
+ return false;
++ }
+
+ if (! mips_elf_hash_table (info)->use_rld_obj_head)
+ {
diff --git a/toolchain/binutils/patches/2.42/500-Change-default-emulation-for-mips64-linux.patch b/toolchain/binutils/patches/2.42/500-Change-default-emulation-for-mips64-linux.patch
new file mode 100644
index 0000000..df38fca
--- /dev/null
+++ b/toolchain/binutils/patches/2.42/500-Change-default-emulation-for-mips64-linux.patch
@@ -0,0 +1,48 @@
+--- a/bfd/config.bfd
++++ b/bfd/config.bfd
+@@ -962,8 +962,8 @@ case "${targ}" in
+ want64=true
+ ;;
+ mips64*el-*-linux*)
+- targ_defvec=mips_elf32_ntrad_le_vec
+- targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_le_vec mips_elf64_trad_be_vec"
++ targ_defvec=mips_elf64_trad_le_vec
++ targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_be_vec"
+ ;;
+ mips64*-*-linux*-gnuabi64)
+ targ_defvec=mips_elf64_trad_be_vec
+@@ -971,8 +971,8 @@ case "${targ}" in
+ want64=true
+ ;;
+ mips64*-*-linux*)
+- targ_defvec=mips_elf32_ntrad_be_vec
+- targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec"
++ targ_defvec=mips_elf64_trad_be_vec
++ targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_le_vec"
+ ;;
+ mips*el-*-linux*)
+ targ_defvec=mips_elf32_trad_le_vec
+--- a/ld/configure.tgt
++++ b/ld/configure.tgt
+@@ -597,8 +597,8 @@ mips64*el-*-linux-gnuabi64)
+ targ_extra_emuls="elf64btsmip elf32ltsmipn32 elf32btsmipn32 elf32ltsmip elf32btsmip"
+ targ_extra_libpath=$targ_extra_emuls
+ ;;
+-mips64*el-*-linux-*) targ_emul=elf32ltsmipn32
+- targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
++mips64*el-*-linux-*) targ_emul=elf64ltsmip
++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32ltsmip elf32btsmip elf64btsmip"
+ targ_extra_libpath=$targ_extra_emuls
+ ;;
+ mips64*-*-linux-gnuabi64)
+@@ -606,8 +606,8 @@ mips64*-*-linux-gnuabi64)
+ targ_extra_emuls="elf64ltsmip elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip"
+ targ_extra_libpath=$targ_extra_emuls
+ ;;
+-mips64*-*-linux-*) targ_emul=elf32btsmipn32
+- targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
++mips64*-*-linux-*) targ_emul=elf64btsmip
++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip"
+ targ_extra_libpath=$targ_extra_emuls
+ ;;
+ mips*el-*-linux-*) targ_emul=elf32ltsmip
diff --git a/toolchain/binutils/patches/2.43.1/300-001_ld_makefile_patch.patch b/toolchain/binutils/patches/2.43.1/300-001_ld_makefile_patch.patch
new file mode 100644
index 0000000..64dae55
--- /dev/null
+++ b/toolchain/binutils/patches/2.43.1/300-001_ld_makefile_patch.patch
@@ -0,0 +1,22 @@
+--- a/ld/Makefile.am
++++ b/ld/Makefile.am
+@@ -50,7 +50,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CFLAGS)
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+
+ EMUL = @EMUL@
+ EMULATION_OFILES = @EMULATION_OFILES@
+--- a/ld/Makefile.in
++++ b/ld/Makefile.in
+@@ -583,7 +583,7 @@ AM_CFLAGS = $(WARN_CFLAGS) $(ELF_CFLAGS)
+ # We put the scripts in the directory $(scriptdir)/ldscripts.
+ # We can't put the scripts in $(datadir) because the SEARCH_DIR
+ # directives need to be different for native and cross linkers.
+-scriptdir = $(tooldir)/lib
++scriptdir = $(libdir)
+ BASEDIR = $(srcdir)/..
+ BFDDIR = $(BASEDIR)/bfd
+ INCDIR = $(BASEDIR)/include
diff --git a/toolchain/binutils/patches/2.43.1/400-mips_no_dynamic_linking_sym.patch b/toolchain/binutils/patches/2.43.1/400-mips_no_dynamic_linking_sym.patch
new file mode 100644
index 0000000..d0cc7dd
--- /dev/null
+++ b/toolchain/binutils/patches/2.43.1/400-mips_no_dynamic_linking_sym.patch
@@ -0,0 +1,18 @@
+--- a/bfd/elfxx-mips.c
++++ b/bfd/elfxx-mips.c
+@@ -8161,6 +8161,7 @@ _bfd_mips_elf_create_dynamic_sections (b
+
+ name = SGI_COMPAT (abfd) ? "_DYNAMIC_LINK" : "_DYNAMIC_LINKING";
+ bh = NULL;
++ if (0) {
+ if (!(_bfd_generic_link_add_one_symbol
+ (info, abfd, name, BSF_GLOBAL, bfd_abs_section_ptr, 0,
+ NULL, false, get_elf_backend_data (abfd)->collect, &bh)))
+@@ -8173,6 +8174,7 @@ _bfd_mips_elf_create_dynamic_sections (b
+
+ if (! bfd_elf_link_record_dynamic_symbol (info, h))
+ return false;
++ }
+
+ if (! mips_elf_hash_table (info)->use_rld_obj_head)
+ {
diff --git a/toolchain/binutils/patches/2.43.1/500-Change-default-emulation-for-mips64-linux.patch b/toolchain/binutils/patches/2.43.1/500-Change-default-emulation-for-mips64-linux.patch
new file mode 100644
index 0000000..df38fca
--- /dev/null
+++ b/toolchain/binutils/patches/2.43.1/500-Change-default-emulation-for-mips64-linux.patch
@@ -0,0 +1,48 @@
+--- a/bfd/config.bfd
++++ b/bfd/config.bfd
+@@ -962,8 +962,8 @@ case "${targ}" in
+ want64=true
+ ;;
+ mips64*el-*-linux*)
+- targ_defvec=mips_elf32_ntrad_le_vec
+- targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_le_vec mips_elf64_trad_be_vec"
++ targ_defvec=mips_elf64_trad_le_vec
++ targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_be_vec"
+ ;;
+ mips64*-*-linux*-gnuabi64)
+ targ_defvec=mips_elf64_trad_be_vec
+@@ -971,8 +971,8 @@ case "${targ}" in
+ want64=true
+ ;;
+ mips64*-*-linux*)
+- targ_defvec=mips_elf32_ntrad_be_vec
+- targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec"
++ targ_defvec=mips_elf64_trad_be_vec
++ targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_le_vec"
+ ;;
+ mips*el-*-linux*)
+ targ_defvec=mips_elf32_trad_le_vec
+--- a/ld/configure.tgt
++++ b/ld/configure.tgt
+@@ -597,8 +597,8 @@ mips64*el-*-linux-gnuabi64)
+ targ_extra_emuls="elf64btsmip elf32ltsmipn32 elf32btsmipn32 elf32ltsmip elf32btsmip"
+ targ_extra_libpath=$targ_extra_emuls
+ ;;
+-mips64*el-*-linux-*) targ_emul=elf32ltsmipn32
+- targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
++mips64*el-*-linux-*) targ_emul=elf64ltsmip
++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32ltsmip elf32btsmip elf64btsmip"
+ targ_extra_libpath=$targ_extra_emuls
+ ;;
+ mips64*-*-linux-gnuabi64)
+@@ -606,8 +606,8 @@ mips64*-*-linux-gnuabi64)
+ targ_extra_emuls="elf64ltsmip elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip"
+ targ_extra_libpath=$targ_extra_emuls
+ ;;
+-mips64*-*-linux-*) targ_emul=elf32btsmipn32
+- targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
++mips64*-*-linux-*) targ_emul=elf64btsmip
++ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip"
+ targ_extra_libpath=$targ_extra_emuls
+ ;;
+ mips*el-*-linux-*) targ_emul=elf32ltsmip