diff mbox series

[walnascar] binutils: Fix CVE-2025-1181

Message ID 20250603062637.2915962-1-Deepesh.Varatharajan@windriver.com
State Under Review
Delegated to: Steve Sakoman
Headers show
Series [walnascar] binutils: Fix CVE-2025-1181 | expand

Commit Message

Deepesh Varatharajan June 3, 2025, 6:26 a.m. UTC
From: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>

PR 32641 [https://sourceware.org/bugzilla/show_bug.cgi?id=32641]
PR 32643 [https://sourceware.org/bugzilla/show_bug.cgi?id=32643]

Upstream-Status: Backport
[https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=18cc11a2771d9e40180485da9a4fb660c03efac3
&& https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=931494c9a89558acb36a03a340c01726545eef24]

Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
---
 .../binutils/binutils-2.44.inc                |   2 +
 .../binutils/0016-CVE-2025-1181-1.patch       | 141 ++++++++
 .../binutils/0017-CVE-2025-1181-2.patch       | 337 ++++++++++++++++++
 3 files changed, 480 insertions(+)
 create mode 100644 meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
 create mode 100644 meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch

Comments

Khem Raj June 3, 2025, 8:14 p.m. UTC | #1
On Mon, Jun 2, 2025 at 11:26 PM Varatharajan, Deepesh via
lists.openembedded.org
<deepesh.varatharajan=windriver.com@lists.openembedded.org> wrote:
>
> From: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
>
> PR 32641 [https://sourceware.org/bugzilla/show_bug.cgi?id=32641]
> PR 32643 [https://sourceware.org/bugzilla/show_bug.cgi?id=32643]

LGTM, second patch does have some questions on bugzilla we should
watchout for those to resolve along side.

>
> Upstream-Status: Backport
> [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=18cc11a2771d9e40180485da9a4fb660c03efac3
> && https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=931494c9a89558acb36a03a340c01726545eef24]
>
> Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
> ---
>  .../binutils/binutils-2.44.inc                |   2 +
>  .../binutils/0016-CVE-2025-1181-1.patch       | 141 ++++++++
>  .../binutils/0017-CVE-2025-1181-2.patch       | 337 ++++++++++++++++++
>  3 files changed, 480 insertions(+)
>  create mode 100644 meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
>  create mode 100644 meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch
>
> diff --git a/meta/recipes-devtools/binutils/binutils-2.44.inc b/meta/recipes-devtools/binutils/binutils-2.44.inc
> index 6906ab3efb..46a95838b7 100644
> --- a/meta/recipes-devtools/binutils/binutils-2.44.inc
> +++ b/meta/recipes-devtools/binutils/binutils-2.44.inc
> @@ -37,5 +37,7 @@ SRC_URI = "\
>       file://0014-Remove-duplicate-pe-dll.o-entry-deom-targ_extra_ofil.patch \
>       file://0015-CVE-2025-1178.patch \
>       file://CVE-2025-1180.patch \
> +     file://0016-CVE-2025-1181-1.patch \
> +     file://0017-CVE-2025-1181-2.patch \
>  "
>  S  = "${WORKDIR}/git"
> diff --git a/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch b/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
> new file mode 100644
> index 0000000000..d3709c7a4f
> --- /dev/null
> +++ b/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
> @@ -0,0 +1,141 @@
> +From: Nick Clifton <nickc@redhat.com>
> +Date: Wed, 5 Feb 2025 14:31:10 +0000
> +
> +Prevent illegal memory access when checking relocs in a corrupt ELF binary.
> +
> +PR 32641
> +
> +Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=18cc11a2771d9e40180485da9a4fb660c03efac3]
> +CVE: CVE-2025-1181
> +
> +Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
> +
> +diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
> +index 785a37dd7fd..d2bf8e5cbae 100644
> +--- a/bfd/elf-bfd.h
> ++++ b/bfd/elf-bfd.h
> +@@ -3150,6 +3150,9 @@ extern bool _bfd_elf_link_mmap_section_contents
> + extern void _bfd_elf_link_munmap_section_contents
> +   (asection *);
> +
> ++extern struct elf_link_hash_entry * _bfd_elf_get_link_hash_entry
> ++  (struct elf_link_hash_entry **, unsigned int, Elf_Internal_Shdr *);
> ++
> + /* Large common section.  */
> + extern asection _bfd_elf_large_com_section;
> +
> +diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
> +index 32db254ba6c..2d82c6583c3 100644
> +--- a/bfd/elf64-x86-64.c
> ++++ b/bfd/elf64-x86-64.c
> +@@ -1744,7 +1744,7 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
> +   bool to_reloc_pc32;
> +   bool abs_symbol;
> +   bool local_ref;
> +-  asection *tsec;
> ++  asection *tsec = NULL;
> +   bfd_signed_vma raddend;
> +   unsigned int opcode;
> +   unsigned int modrm;
> +@@ -1910,6 +1910,9 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
> +       return true;
> +     }
> +
> ++  if (tsec == NULL)
> ++    return false;
> ++
> +   /* Don't convert GOTPCREL relocation against large section.  */
> +   if (elf_section_data (tsec) !=  NULL
> +       && (elf_section_flags (tsec) & SHF_X86_64_LARGE) != 0)
> +@@ -2206,10 +2209,7 @@ elf_x86_64_scan_relocs (bfd *abfd, struct bfd_link_info *info,
> +       else
> +       {
> +         isym = NULL;
> +-        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
> +-        while (h->root.type == bfd_link_hash_indirect
> +-               || h->root.type == bfd_link_hash_warning)
> +-          h = (struct elf_link_hash_entry *) h->root.u.i.link;
> ++        h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
> +       }
> +
> +       /* Check invalid x32 relocations.  */
> +diff --git a/bfd/elflink.c b/bfd/elflink.c
> +index 1f1263007c0..eafbd133ff5 100644
> +--- a/bfd/elflink.c
> ++++ b/bfd/elflink.c
> +@@ -96,6 +96,27 @@ _bfd_elf_link_keep_memory (struct bfd_link_info *info)
> +   return true;
> + }
> +
> ++struct elf_link_hash_entry *
> ++_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
> ++                            unsigned int                   symndx,
> ++                            Elf_Internal_Shdr *            symtab_hdr)
> ++{
> ++  if (symndx < symtab_hdr->sh_info)
> ++    return NULL;
> ++
> ++  struct elf_link_hash_entry *h = sym_hashes[symndx - symtab_hdr->sh_info];
> ++
> ++  /* The hash might be empty.  See PR 32641 for an example of this.  */
> ++  if (h == NULL)
> ++    return NULL;
> ++
> ++  while (h->root.type == bfd_link_hash_indirect
> ++       || h->root.type == bfd_link_hash_warning)
> ++    h = (struct elf_link_hash_entry *) h->root.u.i.link;
> ++
> ++  return h;
> ++}
> ++
> + static struct elf_link_hash_entry *
> + get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
> + {
> +@@ -108,6 +129,9 @@ get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
> +     {
> +       h = cookie->sym_hashes[r_symndx - cookie->extsymoff];
> +
> ++      if (h == NULL)
> ++      return NULL;
> ++
> +       while (h->root.type == bfd_link_hash_indirect
> +            || h->root.type == bfd_link_hash_warning)
> +       h = (struct elf_link_hash_entry *) h->root.u.i.link;
> +diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
> +index 8e5a005fd36..832a5495eb1 100644
> +--- a/bfd/elfxx-x86.c
> ++++ b/bfd/elfxx-x86.c
> +@@ -973,15 +973,7 @@ _bfd_x86_elf_check_relocs (bfd *abfd,
> +         goto error_return;
> +       }
> +
> +-      if (r_symndx < symtab_hdr->sh_info)
> +-      h = NULL;
> +-      else
> +-      {
> +-        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
> +-        while (h->root.type == bfd_link_hash_indirect
> +-               || h->root.type == bfd_link_hash_warning)
> +-          h = (struct elf_link_hash_entry *) h->root.u.i.link;
> +-      }
> ++      h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
> +
> +       if (X86_NEED_DYNAMIC_RELOC_TYPE_P (is_x86_64, r_type)
> +         && NEED_DYNAMIC_RELOCATION_P (is_x86_64, info, true, h, sec,
> +@@ -1209,10 +1201,12 @@ _bfd_x86_elf_link_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
> +       else
> +       {
> +         /* Get H and SEC for GENERATE_DYNAMIC_RELOCATION_P below.  */
> +-        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
> +-        while (h->root.type == bfd_link_hash_indirect
> +-               || h->root.type == bfd_link_hash_warning)
> +-          h = (struct elf_link_hash_entry *) h->root.u.i.link;
> ++        h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
> ++        if (h == NULL)
> ++          {
> ++            /* FIXMEL: Issue an error message ?  */
> ++            continue;
> ++          }
> +
> +         if (h->root.type == bfd_link_hash_defined
> +             || h->root.type == bfd_link_hash_defweak)
> diff --git a/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch b/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch
> new file mode 100644
> index 0000000000..5af743582f
> --- /dev/null
> +++ b/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch
> @@ -0,0 +1,337 @@
> +From: Nick Clifton <nickc@redhat.com>
> +Date: Wed, 5 Feb 2025 15:43:04 +0000
> +
> +Add even more checks for corrupt input when processing
> +relocations for ELF files.
> +
> +PR 32643
> +
> +Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=931494c9a89558acb36a03a340c01726545eef24]
> +CVE: CVE-2025-1181
> +
> +Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
> +
> +diff --git a/bfd/elflink.c b/bfd/elflink.c
> +index fd423d61..91cd7c28 100644
> +--- a/bfd/elflink.c
> ++++ b/bfd/elflink.c
> +@@ -96,15 +96,17 @@
> +   return true;
> + }
> +
> +-struct elf_link_hash_entry *
> +-_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
> +-                            unsigned int                   symndx,
> +-                            Elf_Internal_Shdr *            symtab_hdr)
> ++static struct elf_link_hash_entry *
> ++get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
> ++                   unsigned int                   symndx,
> ++                   unsigned int                   ext_sym_start)
> + {
> +-  if (symndx < symtab_hdr->sh_info)
> ++  if (sym_hashes == NULL
> ++      /* Guard against corrupt input.  See PR 32636 for an example.  */
> ++      || symndx < ext_sym_start)
> +     return NULL;
> +
> +-  struct elf_link_hash_entry *h = sym_hashes[symndx - symtab_hdr->sh_info];
> ++  struct elf_link_hash_entry *h = sym_hashes[symndx - ext_sym_start];
> +
> +   /* The hash might be empty.  See PR 32641 for an example of this.  */
> +   if (h == NULL)
> +@@ -117,27 +119,28 @@
> +   return h;
> + }
> +
> +-static struct elf_link_hash_entry *
> +-get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
> ++struct elf_link_hash_entry *
> ++_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
> ++                            unsigned int                   symndx,
> ++                            Elf_Internal_Shdr *            symtab_hdr)
> + {
> +-  struct elf_link_hash_entry *h = NULL;
> +-
> +-  if ((r_symndx >= cookie->locsymcount
> +-       || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
> +-      /* Guard against corrupt input.  See PR 32636 for an example.  */
> +-      && r_symndx >= cookie->extsymoff)
> +-    {
> +-      h = cookie->sym_hashes[r_symndx - cookie->extsymoff];
> ++  if (symtab_hdr == NULL)
> ++    return NULL;
> +
> +-      if (h == NULL)
> +-      return NULL;
> ++  return get_link_hash_entry (sym_hashes, symndx, symtab_hdr->sh_info);
> ++}
> +
> +-      while (h->root.type == bfd_link_hash_indirect
> +-           || h->root.type == bfd_link_hash_warning)
> +-      h = (struct elf_link_hash_entry *) h->root.u.i.link;
> +-    }
> ++static struct elf_link_hash_entry *
> ++get_ext_sym_hash_from_cookie (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
> ++{
> ++  if (cookie == NULL || cookie->sym_hashes == NULL)
> ++    return NULL;
> ++
> ++  if (r_symndx >= cookie->locsymcount
> ++      || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
> ++    return get_link_hash_entry (cookie->sym_hashes, r_symndx, cookie->extsymoff);
> +
> +-  return h;
> ++  return NULL;
> + }
> +
> + asection *
> +@@ -147,7 +150,7 @@
> + {
> +   struct elf_link_hash_entry *h;
> +
> +-  h = get_ext_sym_hash (cookie, r_symndx);
> ++  h = get_ext_sym_hash_from_cookie (cookie, r_symndx);
> +
> +   if (h != NULL)
> +     {
> +@@ -9105,7 +9108,6 @@
> +                 size_t symidx,
> +                 bfd_vma val)
> + {
> +-  struct elf_link_hash_entry **sym_hashes;
> +   struct elf_link_hash_entry *h;
> +   size_t extsymoff = locsymcount;
> +
> +@@ -9128,12 +9130,12 @@
> +
> +   /* It is a global symbol: set its link type
> +      to "defined" and give it a value.  */
> +-
> +-  sym_hashes = elf_sym_hashes (bfd_with_globals);
> +-  h = sym_hashes [symidx - extsymoff];
> +-  while (h->root.type == bfd_link_hash_indirect
> +-       || h->root.type == bfd_link_hash_warning)
> +-    h = (struct elf_link_hash_entry *) h->root.u.i.link;
> ++  h = get_link_hash_entry (elf_sym_hashes (bfd_with_globals), symidx, extsymoff);
> ++  if (h == NULL)
> ++    {
> ++      /* FIXMEL What should we do ?  */
> ++      return;
> ++    }
> +   h->root.type = bfd_link_hash_defined;
> +   h->root.u.def.value = val;
> +   h->root.u.def.section = bfd_abs_section_ptr;
> +@@ -11611,10 +11613,19 @@
> +             || (elf_bad_symtab (input_bfd)
> +                 && flinfo->sections[symndx] == NULL))
> +           {
> +-            struct elf_link_hash_entry *h = sym_hashes[symndx - extsymoff];
> +-            while (h->root.type == bfd_link_hash_indirect
> +-                   || h->root.type == bfd_link_hash_warning)
> +-              h = (struct elf_link_hash_entry *) h->root.u.i.link;
> ++            struct elf_link_hash_entry *h;
> ++
> ++            h = get_link_hash_entry (sym_hashes, symndx, extsymoff);
> ++            if (h == NULL)
> ++              {
> ++                _bfd_error_handler
> ++                  /* xgettext:c-format */
> ++                  (_("error: %pB: unable to create group section symbol"),
> ++                   input_bfd);
> ++                bfd_set_error (bfd_error_bad_value);
> ++                return false;
> ++              }
> ++
> +             /* Arrange for symbol to be output.  */
> +             h->indx = -2;
> +             elf_section_data (osec)->this_hdr.sh_info = -2;
> +@@ -11749,7 +11760,7 @@
> +                 || (elf_bad_symtab (input_bfd)
> +                     && flinfo->sections[r_symndx] == NULL))
> +               {
> +-                h = sym_hashes[r_symndx - extsymoff];
> ++                h = get_link_hash_entry (sym_hashes, r_symndx, extsymoff);
> +
> +                 /* Badly formatted input files can contain relocs that
> +                    reference non-existant symbols.  Check here so that
> +@@ -11758,17 +11769,13 @@
> +                   {
> +                     _bfd_error_handler
> +                       /* xgettext:c-format */
> +-                      (_("error: %pB contains a reloc (%#" PRIx64 ") for section %pA "
> ++                      (_("error: %pB contains a reloc (%#" PRIx64 ") for section '%pA' "
> +                          "that references a non-existent global symbol"),
> +                        input_bfd, (uint64_t) rel->r_info, o);
> +                     bfd_set_error (bfd_error_bad_value);
> +                     return false;
> +                   }
> +
> +-                while (h->root.type == bfd_link_hash_indirect
> +-                       || h->root.type == bfd_link_hash_warning)
> +-                  h = (struct elf_link_hash_entry *) h->root.u.i.link;
> +-
> +                 s_type = h->type;
> +
> +                 /* If a plugin symbol is referenced from a non-IR file,
> +@@ -11984,7 +11991,6 @@
> +                         && flinfo->sections[r_symndx] == NULL))
> +                   {
> +                     struct elf_link_hash_entry *rh;
> +-                    unsigned long indx;
> +
> +                     /* This is a reloc against a global symbol.  We
> +                        have not yet output all the local symbols, so
> +@@ -11993,15 +11999,16 @@
> +                        reloc to point to the global hash table entry
> +                        for this symbol.  The symbol index is then
> +                        set at the end of bfd_elf_final_link.  */
> +-                    indx = r_symndx - extsymoff;
> +-                    rh = elf_sym_hashes (input_bfd)[indx];
> +-                    while (rh->root.type == bfd_link_hash_indirect
> +-                           || rh->root.type == bfd_link_hash_warning)
> +-                      rh = (struct elf_link_hash_entry *) rh->root.u.i.link;
> +-
> +-                    /* Setting the index to -2 tells
> +-                       elf_link_output_extsym that this symbol is
> +-                       used by a reloc.  */
> ++                    rh = get_link_hash_entry (elf_sym_hashes (input_bfd),
> ++                                              r_symndx, extsymoff);
> ++                    if (rh == NULL)
> ++                      {
> ++                        /* FIXME: Generate an error ?  */
> ++                        continue;
> ++                      }
> ++
> ++                    /* Setting the index to -2 tells elf_link_output_extsym
> ++                       that this symbol is used by a reloc.  */
> +                     BFD_ASSERT (rh->indx < 0);
> +                     rh->indx = -2;
> +                     *rel_hash = rh;
> +@@ -13965,25 +13972,21 @@
> +                      struct elf_link_hash_entry *h,
> +                      Elf_Internal_Sym *sym)
> + {
> +-  if (h != NULL)
> ++  if (h == NULL)
> ++    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
> ++
> ++  switch (h->root.type)
> +     {
> +-      switch (h->root.type)
> +-      {
> +-      case bfd_link_hash_defined:
> +-      case bfd_link_hash_defweak:
> +-        return h->root.u.def.section;
> ++    case bfd_link_hash_defined:
> ++    case bfd_link_hash_defweak:
> ++      return h->root.u.def.section;
> +
> +-      case bfd_link_hash_common:
> +-        return h->root.u.c.p->section;
> ++    case bfd_link_hash_common:
> ++      return h->root.u.c.p->section;
> +
> +-      default:
> +-        break;
> +-      }
> ++    default:
> ++      return NULL;
> +     }
> +-  else
> +-    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
> +-
> +-  return NULL;
> + }
> +
> + /* Return the debug definition section.  */
> +@@ -14032,46 +14035,49 @@
> +   if (r_symndx == STN_UNDEF)
> +     return NULL;
> +
> +-  h = get_ext_sym_hash (cookie, r_symndx);
> ++  h = get_ext_sym_hash_from_cookie (cookie, r_symndx);
> ++  if (h == NULL)
> ++    {
> ++      /* A corrup tinput file can lead to a situation where the index
> ++       does not reference either a local or an external symbol.  */
> ++      if (r_symndx >= cookie->locsymcount)
> ++      return NULL;
> +
> +-  if (h != NULL)
> ++      return (*gc_mark_hook) (sec, info, cookie->rel, NULL,
> ++                            &cookie->locsyms[r_symndx]);
> ++    }
> ++
> ++  bool was_marked = h->mark;
> ++
> ++  h->mark = 1;
> ++  /* Keep all aliases of the symbol too.  If an object symbol
> ++     needs to be copied into .dynbss then all of its aliases
> ++     should be present as dynamic symbols, not just the one used
> ++     on the copy relocation.  */
> ++  hw = h;
> ++  while (hw->is_weakalias)
> +     {
> +-      bool was_marked;
> ++      hw = hw->u.alias;
> ++      hw->mark = 1;
> ++    }
> +
> +-      was_marked = h->mark;
> +-      h->mark = 1;
> +-      /* Keep all aliases of the symbol too.  If an object symbol
> +-       needs to be copied into .dynbss then all of its aliases
> +-       should be present as dynamic symbols, not just the one used
> +-       on the copy relocation.  */
> +-      hw = h;
> +-      while (hw->is_weakalias)
> +-      {
> +-        hw = hw->u.alias;
> +-        hw->mark = 1;
> +-      }
> ++  if (!was_marked && h->start_stop && !h->root.ldscript_def)
> ++    {
> ++      if (info->start_stop_gc)
> ++      return NULL;
> +
> +-      if (!was_marked && h->start_stop && !h->root.ldscript_def)
> ++      /* To work around a glibc bug, mark XXX input sections
> ++       when there is a reference to __start_XXX or __stop_XXX
> ++       symbols.  */
> ++      else if (start_stop != NULL)
> +       {
> +-        if (info->start_stop_gc)
> +-          return NULL;
> +-
> +-        /* To work around a glibc bug, mark XXX input sections
> +-           when there is a reference to __start_XXX or __stop_XXX
> +-           symbols.  */
> +-        else if (start_stop != NULL)
> +-          {
> +-            asection *s = h->u2.start_stop_section;
> +-            *start_stop = true;
> +-            return s;
> +-          }
> ++        asection *s = h->u2.start_stop_section;
> ++        *start_stop = true;
> ++        return s;
> +       }
> +-
> +-      return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
> +     }
> +
> +-  return (*gc_mark_hook) (sec, info, cookie->rel, NULL,
> +-                        &cookie->locsyms[r_symndx]);
> ++  return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
> + }
> +
> + /* COOKIE->rel describes a relocation against section SEC, which is
> +@@ -15094,7 +15100,7 @@
> +
> +       struct elf_link_hash_entry *h;
> +
> +-      h = get_ext_sym_hash (rcookie, r_symndx);
> ++      h = get_ext_sym_hash_from_cookie (rcookie, r_symndx);
> +
> +       if (h != NULL)
> +       {
> --
> 2.49.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#217759): https://lists.openembedded.org/g/openembedded-core/message/217759
> Mute This Topic: https://lists.openembedded.org/mt/113443237/1997914
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [raj.khem@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
Deepesh Varatharajan June 5, 2025, 4:09 a.m. UTC | #2
On 04-06-2025 01:44, Khem Raj wrote:
> CAUTION: This email comes from a non Wind River email account!
> Do not click links or open attachments unless you recognize the sender and know the content is safe.
>
> On Mon, Jun 2, 2025 at 11:26 PM Varatharajan, Deepesh via
> lists.openembedded.org
> <deepesh.varatharajan=windriver.com@lists.openembedded.org> wrote:
>> From: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
>>
>> PR 32641 [https://sourceware.org/bugzilla/show_bug.cgi?id=32641]
>> PR 32643 [https://sourceware.org/bugzilla/show_bug.cgi?id=32643]
> LGTM, second patch does have some questions on bugzilla we should
> watchout for those to resolve along side.
Hi Khem,

Thanks for your review . Would it be preferable to submit only the first 
patch as a v2 for now? Alternatively, if both patches are acceptable at 
this stage, I can monitor the related issues and submit a follow-up 
patch once a proper fix is finalized. Please let me know if you would 
rather postpone the submission entirely until a more comprehensive 
solution is available.

Thanks,
Deepesh
>> Upstream-Status: Backport
>> [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=18cc11a2771d9e40180485da9a4fb660c03efac3
>> && https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=931494c9a89558acb36a03a340c01726545eef24]
>>
>> Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
>> ---
>>   .../binutils/binutils-2.44.inc                |   2 +
>>   .../binutils/0016-CVE-2025-1181-1.patch       | 141 ++++++++
>>   .../binutils/0017-CVE-2025-1181-2.patch       | 337 ++++++++++++++++++
>>   3 files changed, 480 insertions(+)
>>   create mode 100644 meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
>>   create mode 100644 meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch
>>
>> diff --git a/meta/recipes-devtools/binutils/binutils-2.44.inc b/meta/recipes-devtools/binutils/binutils-2.44.inc
>> index 6906ab3efb..46a95838b7 100644
>> --- a/meta/recipes-devtools/binutils/binutils-2.44.inc
>> +++ b/meta/recipes-devtools/binutils/binutils-2.44.inc
>> @@ -37,5 +37,7 @@ SRC_URI = "\
>>        file://0014-Remove-duplicate-pe-dll.o-entry-deom-targ_extra_ofil.patch \
>>        file://0015-CVE-2025-1178.patch \
>>        file://CVE-2025-1180.patch \
>> +     file://0016-CVE-2025-1181-1.patch \
>> +     file://0017-CVE-2025-1181-2.patch \
>>   "
>>   S  = "${WORKDIR}/git"
>> diff --git a/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch b/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
>> new file mode 100644
>> index 0000000000..d3709c7a4f
>> --- /dev/null
>> +++ b/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
>> @@ -0,0 +1,141 @@
>> +From: Nick Clifton <nickc@redhat.com>
>> +Date: Wed, 5 Feb 2025 14:31:10 +0000
>> +
>> +Prevent illegal memory access when checking relocs in a corrupt ELF binary.
>> +
>> +PR 32641
>> +
>> +Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=18cc11a2771d9e40180485da9a4fb660c03efac3]
>> +CVE: CVE-2025-1181
>> +
>> +Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
>> +
>> +diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
>> +index 785a37dd7fd..d2bf8e5cbae 100644
>> +--- a/bfd/elf-bfd.h
>> ++++ b/bfd/elf-bfd.h
>> +@@ -3150,6 +3150,9 @@ extern bool _bfd_elf_link_mmap_section_contents
>> + extern void _bfd_elf_link_munmap_section_contents
>> +   (asection *);
>> +
>> ++extern struct elf_link_hash_entry * _bfd_elf_get_link_hash_entry
>> ++  (struct elf_link_hash_entry **, unsigned int, Elf_Internal_Shdr *);
>> ++
>> + /* Large common section.  */
>> + extern asection _bfd_elf_large_com_section;
>> +
>> +diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
>> +index 32db254ba6c..2d82c6583c3 100644
>> +--- a/bfd/elf64-x86-64.c
>> ++++ b/bfd/elf64-x86-64.c
>> +@@ -1744,7 +1744,7 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
>> +   bool to_reloc_pc32;
>> +   bool abs_symbol;
>> +   bool local_ref;
>> +-  asection *tsec;
>> ++  asection *tsec = NULL;
>> +   bfd_signed_vma raddend;
>> +   unsigned int opcode;
>> +   unsigned int modrm;
>> +@@ -1910,6 +1910,9 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
>> +       return true;
>> +     }
>> +
>> ++  if (tsec == NULL)
>> ++    return false;
>> ++
>> +   /* Don't convert GOTPCREL relocation against large section.  */
>> +   if (elf_section_data (tsec) !=  NULL
>> +       && (elf_section_flags (tsec) & SHF_X86_64_LARGE) != 0)
>> +@@ -2206,10 +2209,7 @@ elf_x86_64_scan_relocs (bfd *abfd, struct bfd_link_info *info,
>> +       else
>> +       {
>> +         isym = NULL;
>> +-        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
>> +-        while (h->root.type == bfd_link_hash_indirect
>> +-               || h->root.type == bfd_link_hash_warning)
>> +-          h = (struct elf_link_hash_entry *) h->root.u.i.link;
>> ++        h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
>> +       }
>> +
>> +       /* Check invalid x32 relocations.  */
>> +diff --git a/bfd/elflink.c b/bfd/elflink.c
>> +index 1f1263007c0..eafbd133ff5 100644
>> +--- a/bfd/elflink.c
>> ++++ b/bfd/elflink.c
>> +@@ -96,6 +96,27 @@ _bfd_elf_link_keep_memory (struct bfd_link_info *info)
>> +   return true;
>> + }
>> +
>> ++struct elf_link_hash_entry *
>> ++_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
>> ++                            unsigned int                   symndx,
>> ++                            Elf_Internal_Shdr *            symtab_hdr)
>> ++{
>> ++  if (symndx < symtab_hdr->sh_info)
>> ++    return NULL;
>> ++
>> ++  struct elf_link_hash_entry *h = sym_hashes[symndx - symtab_hdr->sh_info];
>> ++
>> ++  /* The hash might be empty.  See PR 32641 for an example of this.  */
>> ++  if (h == NULL)
>> ++    return NULL;
>> ++
>> ++  while (h->root.type == bfd_link_hash_indirect
>> ++       || h->root.type == bfd_link_hash_warning)
>> ++    h = (struct elf_link_hash_entry *) h->root.u.i.link;
>> ++
>> ++  return h;
>> ++}
>> ++
>> + static struct elf_link_hash_entry *
>> + get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
>> + {
>> +@@ -108,6 +129,9 @@ get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
>> +     {
>> +       h = cookie->sym_hashes[r_symndx - cookie->extsymoff];
>> +
>> ++      if (h == NULL)
>> ++      return NULL;
>> ++
>> +       while (h->root.type == bfd_link_hash_indirect
>> +            || h->root.type == bfd_link_hash_warning)
>> +       h = (struct elf_link_hash_entry *) h->root.u.i.link;
>> +diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
>> +index 8e5a005fd36..832a5495eb1 100644
>> +--- a/bfd/elfxx-x86.c
>> ++++ b/bfd/elfxx-x86.c
>> +@@ -973,15 +973,7 @@ _bfd_x86_elf_check_relocs (bfd *abfd,
>> +         goto error_return;
>> +       }
>> +
>> +-      if (r_symndx < symtab_hdr->sh_info)
>> +-      h = NULL;
>> +-      else
>> +-      {
>> +-        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
>> +-        while (h->root.type == bfd_link_hash_indirect
>> +-               || h->root.type == bfd_link_hash_warning)
>> +-          h = (struct elf_link_hash_entry *) h->root.u.i.link;
>> +-      }
>> ++      h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
>> +
>> +       if (X86_NEED_DYNAMIC_RELOC_TYPE_P (is_x86_64, r_type)
>> +         && NEED_DYNAMIC_RELOCATION_P (is_x86_64, info, true, h, sec,
>> +@@ -1209,10 +1201,12 @@ _bfd_x86_elf_link_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
>> +       else
>> +       {
>> +         /* Get H and SEC for GENERATE_DYNAMIC_RELOCATION_P below.  */
>> +-        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
>> +-        while (h->root.type == bfd_link_hash_indirect
>> +-               || h->root.type == bfd_link_hash_warning)
>> +-          h = (struct elf_link_hash_entry *) h->root.u.i.link;
>> ++        h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
>> ++        if (h == NULL)
>> ++          {
>> ++            /* FIXMEL: Issue an error message ?  */
>> ++            continue;
>> ++          }
>> +
>> +         if (h->root.type == bfd_link_hash_defined
>> +             || h->root.type == bfd_link_hash_defweak)
>> diff --git a/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch b/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch
>> new file mode 100644
>> index 0000000000..5af743582f
>> --- /dev/null
>> +++ b/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch
>> @@ -0,0 +1,337 @@
>> +From: Nick Clifton <nickc@redhat.com>
>> +Date: Wed, 5 Feb 2025 15:43:04 +0000
>> +
>> +Add even more checks for corrupt input when processing
>> +relocations for ELF files.
>> +
>> +PR 32643
>> +
>> +Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=931494c9a89558acb36a03a340c01726545eef24]
>> +CVE: CVE-2025-1181
>> +
>> +Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
>> +
>> +diff --git a/bfd/elflink.c b/bfd/elflink.c
>> +index fd423d61..91cd7c28 100644
>> +--- a/bfd/elflink.c
>> ++++ b/bfd/elflink.c
>> +@@ -96,15 +96,17 @@
>> +   return true;
>> + }
>> +
>> +-struct elf_link_hash_entry *
>> +-_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
>> +-                            unsigned int                   symndx,
>> +-                            Elf_Internal_Shdr *            symtab_hdr)
>> ++static struct elf_link_hash_entry *
>> ++get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
>> ++                   unsigned int                   symndx,
>> ++                   unsigned int                   ext_sym_start)
>> + {
>> +-  if (symndx < symtab_hdr->sh_info)
>> ++  if (sym_hashes == NULL
>> ++      /* Guard against corrupt input.  See PR 32636 for an example.  */
>> ++      || symndx < ext_sym_start)
>> +     return NULL;
>> +
>> +-  struct elf_link_hash_entry *h = sym_hashes[symndx - symtab_hdr->sh_info];
>> ++  struct elf_link_hash_entry *h = sym_hashes[symndx - ext_sym_start];
>> +
>> +   /* The hash might be empty.  See PR 32641 for an example of this.  */
>> +   if (h == NULL)
>> +@@ -117,27 +119,28 @@
>> +   return h;
>> + }
>> +
>> +-static struct elf_link_hash_entry *
>> +-get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
>> ++struct elf_link_hash_entry *
>> ++_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
>> ++                            unsigned int                   symndx,
>> ++                            Elf_Internal_Shdr *            symtab_hdr)
>> + {
>> +-  struct elf_link_hash_entry *h = NULL;
>> +-
>> +-  if ((r_symndx >= cookie->locsymcount
>> +-       || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
>> +-      /* Guard against corrupt input.  See PR 32636 for an example.  */
>> +-      && r_symndx >= cookie->extsymoff)
>> +-    {
>> +-      h = cookie->sym_hashes[r_symndx - cookie->extsymoff];
>> ++  if (symtab_hdr == NULL)
>> ++    return NULL;
>> +
>> +-      if (h == NULL)
>> +-      return NULL;
>> ++  return get_link_hash_entry (sym_hashes, symndx, symtab_hdr->sh_info);
>> ++}
>> +
>> +-      while (h->root.type == bfd_link_hash_indirect
>> +-           || h->root.type == bfd_link_hash_warning)
>> +-      h = (struct elf_link_hash_entry *) h->root.u.i.link;
>> +-    }
>> ++static struct elf_link_hash_entry *
>> ++get_ext_sym_hash_from_cookie (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
>> ++{
>> ++  if (cookie == NULL || cookie->sym_hashes == NULL)
>> ++    return NULL;
>> ++
>> ++  if (r_symndx >= cookie->locsymcount
>> ++      || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
>> ++    return get_link_hash_entry (cookie->sym_hashes, r_symndx, cookie->extsymoff);
>> +
>> +-  return h;
>> ++  return NULL;
>> + }
>> +
>> + asection *
>> +@@ -147,7 +150,7 @@
>> + {
>> +   struct elf_link_hash_entry *h;
>> +
>> +-  h = get_ext_sym_hash (cookie, r_symndx);
>> ++  h = get_ext_sym_hash_from_cookie (cookie, r_symndx);
>> +
>> +   if (h != NULL)
>> +     {
>> +@@ -9105,7 +9108,6 @@
>> +                 size_t symidx,
>> +                 bfd_vma val)
>> + {
>> +-  struct elf_link_hash_entry **sym_hashes;
>> +   struct elf_link_hash_entry *h;
>> +   size_t extsymoff = locsymcount;
>> +
>> +@@ -9128,12 +9130,12 @@
>> +
>> +   /* It is a global symbol: set its link type
>> +      to "defined" and give it a value.  */
>> +-
>> +-  sym_hashes = elf_sym_hashes (bfd_with_globals);
>> +-  h = sym_hashes [symidx - extsymoff];
>> +-  while (h->root.type == bfd_link_hash_indirect
>> +-       || h->root.type == bfd_link_hash_warning)
>> +-    h = (struct elf_link_hash_entry *) h->root.u.i.link;
>> ++  h = get_link_hash_entry (elf_sym_hashes (bfd_with_globals), symidx, extsymoff);
>> ++  if (h == NULL)
>> ++    {
>> ++      /* FIXMEL What should we do ?  */
>> ++      return;
>> ++    }
>> +   h->root.type = bfd_link_hash_defined;
>> +   h->root.u.def.value = val;
>> +   h->root.u.def.section = bfd_abs_section_ptr;
>> +@@ -11611,10 +11613,19 @@
>> +             || (elf_bad_symtab (input_bfd)
>> +                 && flinfo->sections[symndx] == NULL))
>> +           {
>> +-            struct elf_link_hash_entry *h = sym_hashes[symndx - extsymoff];
>> +-            while (h->root.type == bfd_link_hash_indirect
>> +-                   || h->root.type == bfd_link_hash_warning)
>> +-              h = (struct elf_link_hash_entry *) h->root.u.i.link;
>> ++            struct elf_link_hash_entry *h;
>> ++
>> ++            h = get_link_hash_entry (sym_hashes, symndx, extsymoff);
>> ++            if (h == NULL)
>> ++              {
>> ++                _bfd_error_handler
>> ++                  /* xgettext:c-format */
>> ++                  (_("error: %pB: unable to create group section symbol"),
>> ++                   input_bfd);
>> ++                bfd_set_error (bfd_error_bad_value);
>> ++                return false;
>> ++              }
>> ++
>> +             /* Arrange for symbol to be output.  */
>> +             h->indx = -2;
>> +             elf_section_data (osec)->this_hdr.sh_info = -2;
>> +@@ -11749,7 +11760,7 @@
>> +                 || (elf_bad_symtab (input_bfd)
>> +                     && flinfo->sections[r_symndx] == NULL))
>> +               {
>> +-                h = sym_hashes[r_symndx - extsymoff];
>> ++                h = get_link_hash_entry (sym_hashes, r_symndx, extsymoff);
>> +
>> +                 /* Badly formatted input files can contain relocs that
>> +                    reference non-existant symbols.  Check here so that
>> +@@ -11758,17 +11769,13 @@
>> +                   {
>> +                     _bfd_error_handler
>> +                       /* xgettext:c-format */
>> +-                      (_("error: %pB contains a reloc (%#" PRIx64 ") for section %pA "
>> ++                      (_("error: %pB contains a reloc (%#" PRIx64 ") for section '%pA' "
>> +                          "that references a non-existent global symbol"),
>> +                        input_bfd, (uint64_t) rel->r_info, o);
>> +                     bfd_set_error (bfd_error_bad_value);
>> +                     return false;
>> +                   }
>> +
>> +-                while (h->root.type == bfd_link_hash_indirect
>> +-                       || h->root.type == bfd_link_hash_warning)
>> +-                  h = (struct elf_link_hash_entry *) h->root.u.i.link;
>> +-
>> +                 s_type = h->type;
>> +
>> +                 /* If a plugin symbol is referenced from a non-IR file,
>> +@@ -11984,7 +11991,6 @@
>> +                         && flinfo->sections[r_symndx] == NULL))
>> +                   {
>> +                     struct elf_link_hash_entry *rh;
>> +-                    unsigned long indx;
>> +
>> +                     /* This is a reloc against a global symbol.  We
>> +                        have not yet output all the local symbols, so
>> +@@ -11993,15 +11999,16 @@
>> +                        reloc to point to the global hash table entry
>> +                        for this symbol.  The symbol index is then
>> +                        set at the end of bfd_elf_final_link.  */
>> +-                    indx = r_symndx - extsymoff;
>> +-                    rh = elf_sym_hashes (input_bfd)[indx];
>> +-                    while (rh->root.type == bfd_link_hash_indirect
>> +-                           || rh->root.type == bfd_link_hash_warning)
>> +-                      rh = (struct elf_link_hash_entry *) rh->root.u.i.link;
>> +-
>> +-                    /* Setting the index to -2 tells
>> +-                       elf_link_output_extsym that this symbol is
>> +-                       used by a reloc.  */
>> ++                    rh = get_link_hash_entry (elf_sym_hashes (input_bfd),
>> ++                                              r_symndx, extsymoff);
>> ++                    if (rh == NULL)
>> ++                      {
>> ++                        /* FIXME: Generate an error ?  */
>> ++                        continue;
>> ++                      }
>> ++
>> ++                    /* Setting the index to -2 tells elf_link_output_extsym
>> ++                       that this symbol is used by a reloc.  */
>> +                     BFD_ASSERT (rh->indx < 0);
>> +                     rh->indx = -2;
>> +                     *rel_hash = rh;
>> +@@ -13965,25 +13972,21 @@
>> +                      struct elf_link_hash_entry *h,
>> +                      Elf_Internal_Sym *sym)
>> + {
>> +-  if (h != NULL)
>> ++  if (h == NULL)
>> ++    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
>> ++
>> ++  switch (h->root.type)
>> +     {
>> +-      switch (h->root.type)
>> +-      {
>> +-      case bfd_link_hash_defined:
>> +-      case bfd_link_hash_defweak:
>> +-        return h->root.u.def.section;
>> ++    case bfd_link_hash_defined:
>> ++    case bfd_link_hash_defweak:
>> ++      return h->root.u.def.section;
>> +
>> +-      case bfd_link_hash_common:
>> +-        return h->root.u.c.p->section;
>> ++    case bfd_link_hash_common:
>> ++      return h->root.u.c.p->section;
>> +
>> +-      default:
>> +-        break;
>> +-      }
>> ++    default:
>> ++      return NULL;
>> +     }
>> +-  else
>> +-    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
>> +-
>> +-  return NULL;
>> + }
>> +
>> + /* Return the debug definition section.  */
>> +@@ -14032,46 +14035,49 @@
>> +   if (r_symndx == STN_UNDEF)
>> +     return NULL;
>> +
>> +-  h = get_ext_sym_hash (cookie, r_symndx);
>> ++  h = get_ext_sym_hash_from_cookie (cookie, r_symndx);
>> ++  if (h == NULL)
>> ++    {
>> ++      /* A corrup tinput file can lead to a situation where the index
>> ++       does not reference either a local or an external symbol.  */
>> ++      if (r_symndx >= cookie->locsymcount)
>> ++      return NULL;
>> +
>> +-  if (h != NULL)
>> ++      return (*gc_mark_hook) (sec, info, cookie->rel, NULL,
>> ++                            &cookie->locsyms[r_symndx]);
>> ++    }
>> ++
>> ++  bool was_marked = h->mark;
>> ++
>> ++  h->mark = 1;
>> ++  /* Keep all aliases of the symbol too.  If an object symbol
>> ++     needs to be copied into .dynbss then all of its aliases
>> ++     should be present as dynamic symbols, not just the one used
>> ++     on the copy relocation.  */
>> ++  hw = h;
>> ++  while (hw->is_weakalias)
>> +     {
>> +-      bool was_marked;
>> ++      hw = hw->u.alias;
>> ++      hw->mark = 1;
>> ++    }
>> +
>> +-      was_marked = h->mark;
>> +-      h->mark = 1;
>> +-      /* Keep all aliases of the symbol too.  If an object symbol
>> +-       needs to be copied into .dynbss then all of its aliases
>> +-       should be present as dynamic symbols, not just the one used
>> +-       on the copy relocation.  */
>> +-      hw = h;
>> +-      while (hw->is_weakalias)
>> +-      {
>> +-        hw = hw->u.alias;
>> +-        hw->mark = 1;
>> +-      }
>> ++  if (!was_marked && h->start_stop && !h->root.ldscript_def)
>> ++    {
>> ++      if (info->start_stop_gc)
>> ++      return NULL;
>> +
>> +-      if (!was_marked && h->start_stop && !h->root.ldscript_def)
>> ++      /* To work around a glibc bug, mark XXX input sections
>> ++       when there is a reference to __start_XXX or __stop_XXX
>> ++       symbols.  */
>> ++      else if (start_stop != NULL)
>> +       {
>> +-        if (info->start_stop_gc)
>> +-          return NULL;
>> +-
>> +-        /* To work around a glibc bug, mark XXX input sections
>> +-           when there is a reference to __start_XXX or __stop_XXX
>> +-           symbols.  */
>> +-        else if (start_stop != NULL)
>> +-          {
>> +-            asection *s = h->u2.start_stop_section;
>> +-            *start_stop = true;
>> +-            return s;
>> +-          }
>> ++        asection *s = h->u2.start_stop_section;
>> ++        *start_stop = true;
>> ++        return s;
>> +       }
>> +-
>> +-      return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
>> +     }
>> +
>> +-  return (*gc_mark_hook) (sec, info, cookie->rel, NULL,
>> +-                        &cookie->locsyms[r_symndx]);
>> ++  return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
>> + }
>> +
>> + /* COOKIE->rel describes a relocation against section SEC, which is
>> +@@ -15094,7 +15100,7 @@
>> +
>> +       struct elf_link_hash_entry *h;
>> +
>> +-      h = get_ext_sym_hash (rcookie, r_symndx);
>> ++      h = get_ext_sym_hash_from_cookie (rcookie, r_symndx);
>> +
>> +       if (h != NULL)
>> +       {
>> --
>> 2.49.0
>>
>>
>> -=-=-=-=-=-=-=-=-=-=-=-
>> Links: You receive all messages sent to this group.
>> View/Reply Online (#217759): https://lists.openembedded.org/g/openembedded-core/message/217759
>> Mute This Topic: https://lists.openembedded.org/mt/113443237/1997914
>> Group Owner: openembedded-core+owner@lists.openembedded.org
>> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [raj.khem@gmail.com]
>> -=-=-=-=-=-=-=-=-=-=-=-
>>
Khem Raj June 5, 2025, 5:16 a.m. UTC | #3
On Wed, Jun 4, 2025 at 9:10 PM Deepesh Varatharajan
<deepesh.varatharajan@windriver.com> wrote:
>
>
> On 04-06-2025 01:44, Khem Raj wrote:
> > CAUTION: This email comes from a non Wind River email account!
> > Do not click links or open attachments unless you recognize the sender and know the content is safe.
> >
> > On Mon, Jun 2, 2025 at 11:26 PM Varatharajan, Deepesh via
> > lists.openembedded.org
> > <deepesh.varatharajan=windriver.com@lists.openembedded.org> wrote:
> >> From: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
> >>
> >> PR 32641 [https://sourceware.org/bugzilla/show_bug.cgi?id=32641]
> >> PR 32643 [https://sourceware.org/bugzilla/show_bug.cgi?id=32643]
> > LGTM, second patch does have some questions on bugzilla we should
> > watchout for those to resolve along side.
> Hi Khem,
>
> Thanks for your review . Would it be preferable to submit only the first
> patch as a v2 for now? Alternatively, if both patches are acceptable at
> this stage, I can monitor the related issues and submit a follow-up
> patch once a proper fix is finalized. Please let me know if you would
> rather postpone the submission entirely until a more comprehensive
> solution is available.
>

followup is fine.

> Thanks,
> Deepesh
> >> Upstream-Status: Backport
> >> [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=18cc11a2771d9e40180485da9a4fb660c03efac3
> >> && https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=931494c9a89558acb36a03a340c01726545eef24]
> >>
> >> Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
> >> ---
> >>   .../binutils/binutils-2.44.inc                |   2 +
> >>   .../binutils/0016-CVE-2025-1181-1.patch       | 141 ++++++++
> >>   .../binutils/0017-CVE-2025-1181-2.patch       | 337 ++++++++++++++++++
> >>   3 files changed, 480 insertions(+)
> >>   create mode 100644 meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
> >>   create mode 100644 meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch
> >>
> >> diff --git a/meta/recipes-devtools/binutils/binutils-2.44.inc b/meta/recipes-devtools/binutils/binutils-2.44.inc
> >> index 6906ab3efb..46a95838b7 100644
> >> --- a/meta/recipes-devtools/binutils/binutils-2.44.inc
> >> +++ b/meta/recipes-devtools/binutils/binutils-2.44.inc
> >> @@ -37,5 +37,7 @@ SRC_URI = "\
> >>        file://0014-Remove-duplicate-pe-dll.o-entry-deom-targ_extra_ofil.patch \
> >>        file://0015-CVE-2025-1178.patch \
> >>        file://CVE-2025-1180.patch \
> >> +     file://0016-CVE-2025-1181-1.patch \
> >> +     file://0017-CVE-2025-1181-2.patch \
> >>   "
> >>   S  = "${WORKDIR}/git"
> >> diff --git a/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch b/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
> >> new file mode 100644
> >> index 0000000000..d3709c7a4f
> >> --- /dev/null
> >> +++ b/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
> >> @@ -0,0 +1,141 @@
> >> +From: Nick Clifton <nickc@redhat.com>
> >> +Date: Wed, 5 Feb 2025 14:31:10 +0000
> >> +
> >> +Prevent illegal memory access when checking relocs in a corrupt ELF binary.
> >> +
> >> +PR 32641
> >> +
> >> +Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=18cc11a2771d9e40180485da9a4fb660c03efac3]
> >> +CVE: CVE-2025-1181
> >> +
> >> +Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
> >> +
> >> +diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
> >> +index 785a37dd7fd..d2bf8e5cbae 100644
> >> +--- a/bfd/elf-bfd.h
> >> ++++ b/bfd/elf-bfd.h
> >> +@@ -3150,6 +3150,9 @@ extern bool _bfd_elf_link_mmap_section_contents
> >> + extern void _bfd_elf_link_munmap_section_contents
> >> +   (asection *);
> >> +
> >> ++extern struct elf_link_hash_entry * _bfd_elf_get_link_hash_entry
> >> ++  (struct elf_link_hash_entry **, unsigned int, Elf_Internal_Shdr *);
> >> ++
> >> + /* Large common section.  */
> >> + extern asection _bfd_elf_large_com_section;
> >> +
> >> +diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
> >> +index 32db254ba6c..2d82c6583c3 100644
> >> +--- a/bfd/elf64-x86-64.c
> >> ++++ b/bfd/elf64-x86-64.c
> >> +@@ -1744,7 +1744,7 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
> >> +   bool to_reloc_pc32;
> >> +   bool abs_symbol;
> >> +   bool local_ref;
> >> +-  asection *tsec;
> >> ++  asection *tsec = NULL;
> >> +   bfd_signed_vma raddend;
> >> +   unsigned int opcode;
> >> +   unsigned int modrm;
> >> +@@ -1910,6 +1910,9 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
> >> +       return true;
> >> +     }
> >> +
> >> ++  if (tsec == NULL)
> >> ++    return false;
> >> ++
> >> +   /* Don't convert GOTPCREL relocation against large section.  */
> >> +   if (elf_section_data (tsec) !=  NULL
> >> +       && (elf_section_flags (tsec) & SHF_X86_64_LARGE) != 0)
> >> +@@ -2206,10 +2209,7 @@ elf_x86_64_scan_relocs (bfd *abfd, struct bfd_link_info *info,
> >> +       else
> >> +       {
> >> +         isym = NULL;
> >> +-        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
> >> +-        while (h->root.type == bfd_link_hash_indirect
> >> +-               || h->root.type == bfd_link_hash_warning)
> >> +-          h = (struct elf_link_hash_entry *) h->root.u.i.link;
> >> ++        h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
> >> +       }
> >> +
> >> +       /* Check invalid x32 relocations.  */
> >> +diff --git a/bfd/elflink.c b/bfd/elflink.c
> >> +index 1f1263007c0..eafbd133ff5 100644
> >> +--- a/bfd/elflink.c
> >> ++++ b/bfd/elflink.c
> >> +@@ -96,6 +96,27 @@ _bfd_elf_link_keep_memory (struct bfd_link_info *info)
> >> +   return true;
> >> + }
> >> +
> >> ++struct elf_link_hash_entry *
> >> ++_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
> >> ++                            unsigned int                   symndx,
> >> ++                            Elf_Internal_Shdr *            symtab_hdr)
> >> ++{
> >> ++  if (symndx < symtab_hdr->sh_info)
> >> ++    return NULL;
> >> ++
> >> ++  struct elf_link_hash_entry *h = sym_hashes[symndx - symtab_hdr->sh_info];
> >> ++
> >> ++  /* The hash might be empty.  See PR 32641 for an example of this.  */
> >> ++  if (h == NULL)
> >> ++    return NULL;
> >> ++
> >> ++  while (h->root.type == bfd_link_hash_indirect
> >> ++       || h->root.type == bfd_link_hash_warning)
> >> ++    h = (struct elf_link_hash_entry *) h->root.u.i.link;
> >> ++
> >> ++  return h;
> >> ++}
> >> ++
> >> + static struct elf_link_hash_entry *
> >> + get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
> >> + {
> >> +@@ -108,6 +129,9 @@ get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
> >> +     {
> >> +       h = cookie->sym_hashes[r_symndx - cookie->extsymoff];
> >> +
> >> ++      if (h == NULL)
> >> ++      return NULL;
> >> ++
> >> +       while (h->root.type == bfd_link_hash_indirect
> >> +            || h->root.type == bfd_link_hash_warning)
> >> +       h = (struct elf_link_hash_entry *) h->root.u.i.link;
> >> +diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
> >> +index 8e5a005fd36..832a5495eb1 100644
> >> +--- a/bfd/elfxx-x86.c
> >> ++++ b/bfd/elfxx-x86.c
> >> +@@ -973,15 +973,7 @@ _bfd_x86_elf_check_relocs (bfd *abfd,
> >> +         goto error_return;
> >> +       }
> >> +
> >> +-      if (r_symndx < symtab_hdr->sh_info)
> >> +-      h = NULL;
> >> +-      else
> >> +-      {
> >> +-        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
> >> +-        while (h->root.type == bfd_link_hash_indirect
> >> +-               || h->root.type == bfd_link_hash_warning)
> >> +-          h = (struct elf_link_hash_entry *) h->root.u.i.link;
> >> +-      }
> >> ++      h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
> >> +
> >> +       if (X86_NEED_DYNAMIC_RELOC_TYPE_P (is_x86_64, r_type)
> >> +         && NEED_DYNAMIC_RELOCATION_P (is_x86_64, info, true, h, sec,
> >> +@@ -1209,10 +1201,12 @@ _bfd_x86_elf_link_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
> >> +       else
> >> +       {
> >> +         /* Get H and SEC for GENERATE_DYNAMIC_RELOCATION_P below.  */
> >> +-        h = sym_hashes[r_symndx - symtab_hdr->sh_info];
> >> +-        while (h->root.type == bfd_link_hash_indirect
> >> +-               || h->root.type == bfd_link_hash_warning)
> >> +-          h = (struct elf_link_hash_entry *) h->root.u.i.link;
> >> ++        h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
> >> ++        if (h == NULL)
> >> ++          {
> >> ++            /* FIXMEL: Issue an error message ?  */
> >> ++            continue;
> >> ++          }
> >> +
> >> +         if (h->root.type == bfd_link_hash_defined
> >> +             || h->root.type == bfd_link_hash_defweak)
> >> diff --git a/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch b/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch
> >> new file mode 100644
> >> index 0000000000..5af743582f
> >> --- /dev/null
> >> +++ b/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch
> >> @@ -0,0 +1,337 @@
> >> +From: Nick Clifton <nickc@redhat.com>
> >> +Date: Wed, 5 Feb 2025 15:43:04 +0000
> >> +
> >> +Add even more checks for corrupt input when processing
> >> +relocations for ELF files.
> >> +
> >> +PR 32643
> >> +
> >> +Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=931494c9a89558acb36a03a340c01726545eef24]
> >> +CVE: CVE-2025-1181
> >> +
> >> +Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
> >> +
> >> +diff --git a/bfd/elflink.c b/bfd/elflink.c
> >> +index fd423d61..91cd7c28 100644
> >> +--- a/bfd/elflink.c
> >> ++++ b/bfd/elflink.c
> >> +@@ -96,15 +96,17 @@
> >> +   return true;
> >> + }
> >> +
> >> +-struct elf_link_hash_entry *
> >> +-_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
> >> +-                            unsigned int                   symndx,
> >> +-                            Elf_Internal_Shdr *            symtab_hdr)
> >> ++static struct elf_link_hash_entry *
> >> ++get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
> >> ++                   unsigned int                   symndx,
> >> ++                   unsigned int                   ext_sym_start)
> >> + {
> >> +-  if (symndx < symtab_hdr->sh_info)
> >> ++  if (sym_hashes == NULL
> >> ++      /* Guard against corrupt input.  See PR 32636 for an example.  */
> >> ++      || symndx < ext_sym_start)
> >> +     return NULL;
> >> +
> >> +-  struct elf_link_hash_entry *h = sym_hashes[symndx - symtab_hdr->sh_info];
> >> ++  struct elf_link_hash_entry *h = sym_hashes[symndx - ext_sym_start];
> >> +
> >> +   /* The hash might be empty.  See PR 32641 for an example of this.  */
> >> +   if (h == NULL)
> >> +@@ -117,27 +119,28 @@
> >> +   return h;
> >> + }
> >> +
> >> +-static struct elf_link_hash_entry *
> >> +-get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
> >> ++struct elf_link_hash_entry *
> >> ++_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
> >> ++                            unsigned int                   symndx,
> >> ++                            Elf_Internal_Shdr *            symtab_hdr)
> >> + {
> >> +-  struct elf_link_hash_entry *h = NULL;
> >> +-
> >> +-  if ((r_symndx >= cookie->locsymcount
> >> +-       || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
> >> +-      /* Guard against corrupt input.  See PR 32636 for an example.  */
> >> +-      && r_symndx >= cookie->extsymoff)
> >> +-    {
> >> +-      h = cookie->sym_hashes[r_symndx - cookie->extsymoff];
> >> ++  if (symtab_hdr == NULL)
> >> ++    return NULL;
> >> +
> >> +-      if (h == NULL)
> >> +-      return NULL;
> >> ++  return get_link_hash_entry (sym_hashes, symndx, symtab_hdr->sh_info);
> >> ++}
> >> +
> >> +-      while (h->root.type == bfd_link_hash_indirect
> >> +-           || h->root.type == bfd_link_hash_warning)
> >> +-      h = (struct elf_link_hash_entry *) h->root.u.i.link;
> >> +-    }
> >> ++static struct elf_link_hash_entry *
> >> ++get_ext_sym_hash_from_cookie (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
> >> ++{
> >> ++  if (cookie == NULL || cookie->sym_hashes == NULL)
> >> ++    return NULL;
> >> ++
> >> ++  if (r_symndx >= cookie->locsymcount
> >> ++      || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
> >> ++    return get_link_hash_entry (cookie->sym_hashes, r_symndx, cookie->extsymoff);
> >> +
> >> +-  return h;
> >> ++  return NULL;
> >> + }
> >> +
> >> + asection *
> >> +@@ -147,7 +150,7 @@
> >> + {
> >> +   struct elf_link_hash_entry *h;
> >> +
> >> +-  h = get_ext_sym_hash (cookie, r_symndx);
> >> ++  h = get_ext_sym_hash_from_cookie (cookie, r_symndx);
> >> +
> >> +   if (h != NULL)
> >> +     {
> >> +@@ -9105,7 +9108,6 @@
> >> +                 size_t symidx,
> >> +                 bfd_vma val)
> >> + {
> >> +-  struct elf_link_hash_entry **sym_hashes;
> >> +   struct elf_link_hash_entry *h;
> >> +   size_t extsymoff = locsymcount;
> >> +
> >> +@@ -9128,12 +9130,12 @@
> >> +
> >> +   /* It is a global symbol: set its link type
> >> +      to "defined" and give it a value.  */
> >> +-
> >> +-  sym_hashes = elf_sym_hashes (bfd_with_globals);
> >> +-  h = sym_hashes [symidx - extsymoff];
> >> +-  while (h->root.type == bfd_link_hash_indirect
> >> +-       || h->root.type == bfd_link_hash_warning)
> >> +-    h = (struct elf_link_hash_entry *) h->root.u.i.link;
> >> ++  h = get_link_hash_entry (elf_sym_hashes (bfd_with_globals), symidx, extsymoff);
> >> ++  if (h == NULL)
> >> ++    {
> >> ++      /* FIXMEL What should we do ?  */
> >> ++      return;
> >> ++    }
> >> +   h->root.type = bfd_link_hash_defined;
> >> +   h->root.u.def.value = val;
> >> +   h->root.u.def.section = bfd_abs_section_ptr;
> >> +@@ -11611,10 +11613,19 @@
> >> +             || (elf_bad_symtab (input_bfd)
> >> +                 && flinfo->sections[symndx] == NULL))
> >> +           {
> >> +-            struct elf_link_hash_entry *h = sym_hashes[symndx - extsymoff];
> >> +-            while (h->root.type == bfd_link_hash_indirect
> >> +-                   || h->root.type == bfd_link_hash_warning)
> >> +-              h = (struct elf_link_hash_entry *) h->root.u.i.link;
> >> ++            struct elf_link_hash_entry *h;
> >> ++
> >> ++            h = get_link_hash_entry (sym_hashes, symndx, extsymoff);
> >> ++            if (h == NULL)
> >> ++              {
> >> ++                _bfd_error_handler
> >> ++                  /* xgettext:c-format */
> >> ++                  (_("error: %pB: unable to create group section symbol"),
> >> ++                   input_bfd);
> >> ++                bfd_set_error (bfd_error_bad_value);
> >> ++                return false;
> >> ++              }
> >> ++
> >> +             /* Arrange for symbol to be output.  */
> >> +             h->indx = -2;
> >> +             elf_section_data (osec)->this_hdr.sh_info = -2;
> >> +@@ -11749,7 +11760,7 @@
> >> +                 || (elf_bad_symtab (input_bfd)
> >> +                     && flinfo->sections[r_symndx] == NULL))
> >> +               {
> >> +-                h = sym_hashes[r_symndx - extsymoff];
> >> ++                h = get_link_hash_entry (sym_hashes, r_symndx, extsymoff);
> >> +
> >> +                 /* Badly formatted input files can contain relocs that
> >> +                    reference non-existant symbols.  Check here so that
> >> +@@ -11758,17 +11769,13 @@
> >> +                   {
> >> +                     _bfd_error_handler
> >> +                       /* xgettext:c-format */
> >> +-                      (_("error: %pB contains a reloc (%#" PRIx64 ") for section %pA "
> >> ++                      (_("error: %pB contains a reloc (%#" PRIx64 ") for section '%pA' "
> >> +                          "that references a non-existent global symbol"),
> >> +                        input_bfd, (uint64_t) rel->r_info, o);
> >> +                     bfd_set_error (bfd_error_bad_value);
> >> +                     return false;
> >> +                   }
> >> +
> >> +-                while (h->root.type == bfd_link_hash_indirect
> >> +-                       || h->root.type == bfd_link_hash_warning)
> >> +-                  h = (struct elf_link_hash_entry *) h->root.u.i.link;
> >> +-
> >> +                 s_type = h->type;
> >> +
> >> +                 /* If a plugin symbol is referenced from a non-IR file,
> >> +@@ -11984,7 +11991,6 @@
> >> +                         && flinfo->sections[r_symndx] == NULL))
> >> +                   {
> >> +                     struct elf_link_hash_entry *rh;
> >> +-                    unsigned long indx;
> >> +
> >> +                     /* This is a reloc against a global symbol.  We
> >> +                        have not yet output all the local symbols, so
> >> +@@ -11993,15 +11999,16 @@
> >> +                        reloc to point to the global hash table entry
> >> +                        for this symbol.  The symbol index is then
> >> +                        set at the end of bfd_elf_final_link.  */
> >> +-                    indx = r_symndx - extsymoff;
> >> +-                    rh = elf_sym_hashes (input_bfd)[indx];
> >> +-                    while (rh->root.type == bfd_link_hash_indirect
> >> +-                           || rh->root.type == bfd_link_hash_warning)
> >> +-                      rh = (struct elf_link_hash_entry *) rh->root.u.i.link;
> >> +-
> >> +-                    /* Setting the index to -2 tells
> >> +-                       elf_link_output_extsym that this symbol is
> >> +-                       used by a reloc.  */
> >> ++                    rh = get_link_hash_entry (elf_sym_hashes (input_bfd),
> >> ++                                              r_symndx, extsymoff);
> >> ++                    if (rh == NULL)
> >> ++                      {
> >> ++                        /* FIXME: Generate an error ?  */
> >> ++                        continue;
> >> ++                      }
> >> ++
> >> ++                    /* Setting the index to -2 tells elf_link_output_extsym
> >> ++                       that this symbol is used by a reloc.  */
> >> +                     BFD_ASSERT (rh->indx < 0);
> >> +                     rh->indx = -2;
> >> +                     *rel_hash = rh;
> >> +@@ -13965,25 +13972,21 @@
> >> +                      struct elf_link_hash_entry *h,
> >> +                      Elf_Internal_Sym *sym)
> >> + {
> >> +-  if (h != NULL)
> >> ++  if (h == NULL)
> >> ++    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
> >> ++
> >> ++  switch (h->root.type)
> >> +     {
> >> +-      switch (h->root.type)
> >> +-      {
> >> +-      case bfd_link_hash_defined:
> >> +-      case bfd_link_hash_defweak:
> >> +-        return h->root.u.def.section;
> >> ++    case bfd_link_hash_defined:
> >> ++    case bfd_link_hash_defweak:
> >> ++      return h->root.u.def.section;
> >> +
> >> +-      case bfd_link_hash_common:
> >> +-        return h->root.u.c.p->section;
> >> ++    case bfd_link_hash_common:
> >> ++      return h->root.u.c.p->section;
> >> +
> >> +-      default:
> >> +-        break;
> >> +-      }
> >> ++    default:
> >> ++      return NULL;
> >> +     }
> >> +-  else
> >> +-    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
> >> +-
> >> +-  return NULL;
> >> + }
> >> +
> >> + /* Return the debug definition section.  */
> >> +@@ -14032,46 +14035,49 @@
> >> +   if (r_symndx == STN_UNDEF)
> >> +     return NULL;
> >> +
> >> +-  h = get_ext_sym_hash (cookie, r_symndx);
> >> ++  h = get_ext_sym_hash_from_cookie (cookie, r_symndx);
> >> ++  if (h == NULL)
> >> ++    {
> >> ++      /* A corrup tinput file can lead to a situation where the index
> >> ++       does not reference either a local or an external symbol.  */
> >> ++      if (r_symndx >= cookie->locsymcount)
> >> ++      return NULL;
> >> +
> >> +-  if (h != NULL)
> >> ++      return (*gc_mark_hook) (sec, info, cookie->rel, NULL,
> >> ++                            &cookie->locsyms[r_symndx]);
> >> ++    }
> >> ++
> >> ++  bool was_marked = h->mark;
> >> ++
> >> ++  h->mark = 1;
> >> ++  /* Keep all aliases of the symbol too.  If an object symbol
> >> ++     needs to be copied into .dynbss then all of its aliases
> >> ++     should be present as dynamic symbols, not just the one used
> >> ++     on the copy relocation.  */
> >> ++  hw = h;
> >> ++  while (hw->is_weakalias)
> >> +     {
> >> +-      bool was_marked;
> >> ++      hw = hw->u.alias;
> >> ++      hw->mark = 1;
> >> ++    }
> >> +
> >> +-      was_marked = h->mark;
> >> +-      h->mark = 1;
> >> +-      /* Keep all aliases of the symbol too.  If an object symbol
> >> +-       needs to be copied into .dynbss then all of its aliases
> >> +-       should be present as dynamic symbols, not just the one used
> >> +-       on the copy relocation.  */
> >> +-      hw = h;
> >> +-      while (hw->is_weakalias)
> >> +-      {
> >> +-        hw = hw->u.alias;
> >> +-        hw->mark = 1;
> >> +-      }
> >> ++  if (!was_marked && h->start_stop && !h->root.ldscript_def)
> >> ++    {
> >> ++      if (info->start_stop_gc)
> >> ++      return NULL;
> >> +
> >> +-      if (!was_marked && h->start_stop && !h->root.ldscript_def)
> >> ++      /* To work around a glibc bug, mark XXX input sections
> >> ++       when there is a reference to __start_XXX or __stop_XXX
> >> ++       symbols.  */
> >> ++      else if (start_stop != NULL)
> >> +       {
> >> +-        if (info->start_stop_gc)
> >> +-          return NULL;
> >> +-
> >> +-        /* To work around a glibc bug, mark XXX input sections
> >> +-           when there is a reference to __start_XXX or __stop_XXX
> >> +-           symbols.  */
> >> +-        else if (start_stop != NULL)
> >> +-          {
> >> +-            asection *s = h->u2.start_stop_section;
> >> +-            *start_stop = true;
> >> +-            return s;
> >> +-          }
> >> ++        asection *s = h->u2.start_stop_section;
> >> ++        *start_stop = true;
> >> ++        return s;
> >> +       }
> >> +-
> >> +-      return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
> >> +     }
> >> +
> >> +-  return (*gc_mark_hook) (sec, info, cookie->rel, NULL,
> >> +-                        &cookie->locsyms[r_symndx]);
> >> ++  return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
> >> + }
> >> +
> >> + /* COOKIE->rel describes a relocation against section SEC, which is
> >> +@@ -15094,7 +15100,7 @@
> >> +
> >> +       struct elf_link_hash_entry *h;
> >> +
> >> +-      h = get_ext_sym_hash (rcookie, r_symndx);
> >> ++      h = get_ext_sym_hash_from_cookie (rcookie, r_symndx);
> >> +
> >> +       if (h != NULL)
> >> +       {
> >> --
> >> 2.49.0
> >>
> >>
> >> -=-=-=-=-=-=-=-=-=-=-=-
> >> Links: You receive all messages sent to this group.
> >> View/Reply Online (#217759): https://lists.openembedded.org/g/openembedded-core/message/217759
> >> Mute This Topic: https://lists.openembedded.org/mt/113443237/1997914
> >> Group Owner: openembedded-core+owner@lists.openembedded.org
> >> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [raj.khem@gmail.com]
> >> -=-=-=-=-=-=-=-=-=-=-=-
> >>
diff mbox series

Patch

diff --git a/meta/recipes-devtools/binutils/binutils-2.44.inc b/meta/recipes-devtools/binutils/binutils-2.44.inc
index 6906ab3efb..46a95838b7 100644
--- a/meta/recipes-devtools/binutils/binutils-2.44.inc
+++ b/meta/recipes-devtools/binutils/binutils-2.44.inc
@@ -37,5 +37,7 @@  SRC_URI = "\
      file://0014-Remove-duplicate-pe-dll.o-entry-deom-targ_extra_ofil.patch \
      file://0015-CVE-2025-1178.patch \
      file://CVE-2025-1180.patch \
+     file://0016-CVE-2025-1181-1.patch \
+     file://0017-CVE-2025-1181-2.patch \
 "
 S  = "${WORKDIR}/git"
diff --git a/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch b/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
new file mode 100644
index 0000000000..d3709c7a4f
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0016-CVE-2025-1181-1.patch
@@ -0,0 +1,141 @@ 
+From: Nick Clifton <nickc@redhat.com>
+Date: Wed, 5 Feb 2025 14:31:10 +0000
+
+Prevent illegal memory access when checking relocs in a corrupt ELF binary.
+
+PR 32641
+
+Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=18cc11a2771d9e40180485da9a4fb660c03efac3]
+CVE: CVE-2025-1181
+
+Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
+
+diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
+index 785a37dd7fd..d2bf8e5cbae 100644
+--- a/bfd/elf-bfd.h
++++ b/bfd/elf-bfd.h
+@@ -3150,6 +3150,9 @@ extern bool _bfd_elf_link_mmap_section_contents
+ extern void _bfd_elf_link_munmap_section_contents
+   (asection *);
+ 
++extern struct elf_link_hash_entry * _bfd_elf_get_link_hash_entry
++  (struct elf_link_hash_entry **, unsigned int, Elf_Internal_Shdr *);
++
+ /* Large common section.  */
+ extern asection _bfd_elf_large_com_section;
+ 
+diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
+index 32db254ba6c..2d82c6583c3 100644
+--- a/bfd/elf64-x86-64.c
++++ b/bfd/elf64-x86-64.c
+@@ -1744,7 +1744,7 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
+   bool to_reloc_pc32;
+   bool abs_symbol;
+   bool local_ref;
+-  asection *tsec;
++  asection *tsec = NULL;
+   bfd_signed_vma raddend;
+   unsigned int opcode;
+   unsigned int modrm;
+@@ -1910,6 +1910,9 @@ elf_x86_64_convert_load_reloc (bfd *abfd,
+ 	return true;
+     }
+ 
++  if (tsec == NULL)
++    return false;
++
+   /* Don't convert GOTPCREL relocation against large section.  */
+   if (elf_section_data (tsec) !=  NULL
+       && (elf_section_flags (tsec) & SHF_X86_64_LARGE) != 0)
+@@ -2206,10 +2209,7 @@ elf_x86_64_scan_relocs (bfd *abfd, struct bfd_link_info *info,
+       else
+ 	{
+ 	  isym = NULL;
+-	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+-	  while (h->root.type == bfd_link_hash_indirect
+-		 || h->root.type == bfd_link_hash_warning)
+-	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
++	  h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
+ 	}
+ 
+       /* Check invalid x32 relocations.  */
+diff --git a/bfd/elflink.c b/bfd/elflink.c
+index 1f1263007c0..eafbd133ff5 100644
+--- a/bfd/elflink.c
++++ b/bfd/elflink.c
+@@ -96,6 +96,27 @@ _bfd_elf_link_keep_memory (struct bfd_link_info *info)
+   return true;
+ }
+ 
++struct elf_link_hash_entry *
++_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
++			      unsigned int                   symndx,
++			      Elf_Internal_Shdr *            symtab_hdr)
++{
++  if (symndx < symtab_hdr->sh_info)
++    return NULL;
++
++  struct elf_link_hash_entry *h = sym_hashes[symndx - symtab_hdr->sh_info];
++
++  /* The hash might be empty.  See PR 32641 for an example of this.  */
++  if (h == NULL)
++    return NULL;
++
++  while (h->root.type == bfd_link_hash_indirect
++	 || h->root.type == bfd_link_hash_warning)
++    h = (struct elf_link_hash_entry *) h->root.u.i.link;
++
++  return h;
++}
++
+ static struct elf_link_hash_entry *
+ get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
+ {
+@@ -108,6 +129,9 @@ get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
+     {
+       h = cookie->sym_hashes[r_symndx - cookie->extsymoff];
+ 
++      if (h == NULL)
++	return NULL;
++
+       while (h->root.type == bfd_link_hash_indirect
+ 	     || h->root.type == bfd_link_hash_warning)
+ 	h = (struct elf_link_hash_entry *) h->root.u.i.link;
+diff --git a/bfd/elfxx-x86.c b/bfd/elfxx-x86.c
+index 8e5a005fd36..832a5495eb1 100644
+--- a/bfd/elfxx-x86.c
++++ b/bfd/elfxx-x86.c
+@@ -973,15 +973,7 @@ _bfd_x86_elf_check_relocs (bfd *abfd,
+ 	  goto error_return;
+ 	}
+ 
+-      if (r_symndx < symtab_hdr->sh_info)
+-	h = NULL;
+-      else
+-	{
+-	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+-	  while (h->root.type == bfd_link_hash_indirect
+-		 || h->root.type == bfd_link_hash_warning)
+-	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+-	}
++      h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
+ 
+       if (X86_NEED_DYNAMIC_RELOC_TYPE_P (is_x86_64, r_type)
+ 	  && NEED_DYNAMIC_RELOCATION_P (is_x86_64, info, true, h, sec,
+@@ -1209,10 +1201,12 @@ _bfd_x86_elf_link_relax_section (bfd *abfd ATTRIBUTE_UNUSED,
+       else
+ 	{
+ 	  /* Get H and SEC for GENERATE_DYNAMIC_RELOCATION_P below.  */
+-	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
+-	  while (h->root.type == bfd_link_hash_indirect
+-		 || h->root.type == bfd_link_hash_warning)
+-	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
++	  h = _bfd_elf_get_link_hash_entry (sym_hashes, r_symndx, symtab_hdr);
++	  if (h == NULL)
++	    {
++	      /* FIXMEL: Issue an error message ?  */
++	      continue;
++	    }
+ 
+ 	  if (h->root.type == bfd_link_hash_defined
+ 	      || h->root.type == bfd_link_hash_defweak)
diff --git a/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch b/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch
new file mode 100644
index 0000000000..5af743582f
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/0017-CVE-2025-1181-2.patch
@@ -0,0 +1,337 @@ 
+From: Nick Clifton <nickc@redhat.com>
+Date: Wed, 5 Feb 2025 15:43:04 +0000
+
+Add even more checks for corrupt input when processing
+relocations for ELF files.
+
+PR 32643
+
+Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=931494c9a89558acb36a03a340c01726545eef24]
+CVE: CVE-2025-1181
+
+Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
+
+diff --git a/bfd/elflink.c b/bfd/elflink.c
+index fd423d61..91cd7c28 100644
+--- a/bfd/elflink.c
++++ b/bfd/elflink.c
+@@ -96,15 +96,17 @@
+   return true;
+ }
+ 
+-struct elf_link_hash_entry *
+-_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
+-			      unsigned int                   symndx,
+-			      Elf_Internal_Shdr *            symtab_hdr)
++static struct elf_link_hash_entry *
++get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
++		     unsigned int                   symndx,
++		     unsigned int                   ext_sym_start)
+ {
+-  if (symndx < symtab_hdr->sh_info)
++  if (sym_hashes == NULL
++      /* Guard against corrupt input.  See PR 32636 for an example.  */
++      || symndx < ext_sym_start)
+     return NULL;
+ 
+-  struct elf_link_hash_entry *h = sym_hashes[symndx - symtab_hdr->sh_info];
++  struct elf_link_hash_entry *h = sym_hashes[symndx - ext_sym_start];
+ 
+   /* The hash might be empty.  See PR 32641 for an example of this.  */
+   if (h == NULL)
+@@ -117,27 +119,28 @@
+   return h;
+ }
+ 
+-static struct elf_link_hash_entry *
+-get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
++struct elf_link_hash_entry *
++_bfd_elf_get_link_hash_entry (struct elf_link_hash_entry **  sym_hashes,
++			      unsigned int                   symndx,
++			      Elf_Internal_Shdr *            symtab_hdr)
+ {
+-  struct elf_link_hash_entry *h = NULL;
+-
+-  if ((r_symndx >= cookie->locsymcount
+-       || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
+-      /* Guard against corrupt input.  See PR 32636 for an example.  */
+-      && r_symndx >= cookie->extsymoff)
+-    {
+-      h = cookie->sym_hashes[r_symndx - cookie->extsymoff];
++  if (symtab_hdr == NULL)
++    return NULL;
+ 
+-      if (h == NULL)
+-	return NULL;
++  return get_link_hash_entry (sym_hashes, symndx, symtab_hdr->sh_info);
++}
+ 
+-      while (h->root.type == bfd_link_hash_indirect
+-	     || h->root.type == bfd_link_hash_warning)
+-	h = (struct elf_link_hash_entry *) h->root.u.i.link;
+-    }
++static struct elf_link_hash_entry *
++get_ext_sym_hash_from_cookie (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
++{
++  if (cookie == NULL || cookie->sym_hashes == NULL)
++    return NULL;
++  
++  if (r_symndx >= cookie->locsymcount
++      || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
++    return get_link_hash_entry (cookie->sym_hashes, r_symndx, cookie->extsymoff);
+ 
+-  return h;
++  return NULL;
+ }
+ 
+ asection *
+@@ -147,7 +150,7 @@
+ {
+   struct elf_link_hash_entry *h;
+ 
+-  h = get_ext_sym_hash (cookie, r_symndx);
++  h = get_ext_sym_hash_from_cookie (cookie, r_symndx);
+   
+   if (h != NULL)
+     {
+@@ -9105,7 +9108,6 @@
+ 		  size_t symidx,
+ 		  bfd_vma val)
+ {
+-  struct elf_link_hash_entry **sym_hashes;
+   struct elf_link_hash_entry *h;
+   size_t extsymoff = locsymcount;
+ 
+@@ -9128,12 +9130,12 @@
+ 
+   /* It is a global symbol: set its link type
+      to "defined" and give it a value.  */
+-
+-  sym_hashes = elf_sym_hashes (bfd_with_globals);
+-  h = sym_hashes [symidx - extsymoff];
+-  while (h->root.type == bfd_link_hash_indirect
+-	 || h->root.type == bfd_link_hash_warning)
+-    h = (struct elf_link_hash_entry *) h->root.u.i.link;
++  h = get_link_hash_entry (elf_sym_hashes (bfd_with_globals), symidx, extsymoff);
++  if (h == NULL)
++    {
++      /* FIXMEL What should we do ?  */
++      return;
++    }
+   h->root.type = bfd_link_hash_defined;
+   h->root.u.def.value = val;
+   h->root.u.def.section = bfd_abs_section_ptr;
+@@ -11611,10 +11613,19 @@
+ 	      || (elf_bad_symtab (input_bfd)
+ 		  && flinfo->sections[symndx] == NULL))
+ 	    {
+-	      struct elf_link_hash_entry *h = sym_hashes[symndx - extsymoff];
+-	      while (h->root.type == bfd_link_hash_indirect
+-		     || h->root.type == bfd_link_hash_warning)
+-		h = (struct elf_link_hash_entry *) h->root.u.i.link;
++	      struct elf_link_hash_entry *h;
++
++	      h = get_link_hash_entry (sym_hashes, symndx, extsymoff);
++	      if (h == NULL)
++		{
++		  _bfd_error_handler
++		    /* xgettext:c-format */
++		    (_("error: %pB: unable to create group section symbol"),
++		     input_bfd);
++		  bfd_set_error (bfd_error_bad_value);
++		  return false;
++		}	      
++
+ 	      /* Arrange for symbol to be output.  */
+ 	      h->indx = -2;
+ 	      elf_section_data (osec)->this_hdr.sh_info = -2;
+@@ -11749,7 +11760,7 @@
+ 		  || (elf_bad_symtab (input_bfd)
+ 		      && flinfo->sections[r_symndx] == NULL))
+ 		{
+-		  h = sym_hashes[r_symndx - extsymoff];
++		  h = get_link_hash_entry (sym_hashes, r_symndx, extsymoff);
+ 
+ 		  /* Badly formatted input files can contain relocs that
+ 		     reference non-existant symbols.  Check here so that
+@@ -11758,17 +11769,13 @@
+ 		    {
+ 		      _bfd_error_handler
+ 			/* xgettext:c-format */
+-			(_("error: %pB contains a reloc (%#" PRIx64 ") for section %pA "
++			(_("error: %pB contains a reloc (%#" PRIx64 ") for section '%pA' "
+ 			   "that references a non-existent global symbol"),
+ 			 input_bfd, (uint64_t) rel->r_info, o);
+ 		      bfd_set_error (bfd_error_bad_value);
+ 		      return false;
+ 		    }
+ 
+-		  while (h->root.type == bfd_link_hash_indirect
+-			 || h->root.type == bfd_link_hash_warning)
+-		    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+-
+ 		  s_type = h->type;
+ 
+ 		  /* If a plugin symbol is referenced from a non-IR file,
+@@ -11984,7 +11991,6 @@
+ 			  && flinfo->sections[r_symndx] == NULL))
+ 		    {
+ 		      struct elf_link_hash_entry *rh;
+-		      unsigned long indx;
+ 
+ 		      /* This is a reloc against a global symbol.  We
+ 			 have not yet output all the local symbols, so
+@@ -11993,15 +11999,16 @@
+ 			 reloc to point to the global hash table entry
+ 			 for this symbol.  The symbol index is then
+ 			 set at the end of bfd_elf_final_link.  */
+-		      indx = r_symndx - extsymoff;
+-		      rh = elf_sym_hashes (input_bfd)[indx];
+-		      while (rh->root.type == bfd_link_hash_indirect
+-			     || rh->root.type == bfd_link_hash_warning)
+-			rh = (struct elf_link_hash_entry *) rh->root.u.i.link;
+-
+-		      /* Setting the index to -2 tells
+-			 elf_link_output_extsym that this symbol is
+-			 used by a reloc.  */
++		      rh = get_link_hash_entry (elf_sym_hashes (input_bfd),
++						r_symndx, extsymoff);
++		      if (rh == NULL)
++			{
++			  /* FIXME: Generate an error ?  */
++			  continue;
++			}
++
++		      /* Setting the index to -2 tells elf_link_output_extsym
++			 that this symbol is used by a reloc.  */
+ 		      BFD_ASSERT (rh->indx < 0);
+ 		      rh->indx = -2;
+ 		      *rel_hash = rh;
+@@ -13965,25 +13972,21 @@
+ 		       struct elf_link_hash_entry *h,
+ 		       Elf_Internal_Sym *sym)
+ {
+-  if (h != NULL)
++  if (h == NULL)
++    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
++
++  switch (h->root.type)
+     {
+-      switch (h->root.type)
+-	{
+-	case bfd_link_hash_defined:
+-	case bfd_link_hash_defweak:
+-	  return h->root.u.def.section;
++    case bfd_link_hash_defined:
++    case bfd_link_hash_defweak:
++      return h->root.u.def.section;
+ 
+-	case bfd_link_hash_common:
+-	  return h->root.u.c.p->section;
++    case bfd_link_hash_common:
++      return h->root.u.c.p->section;
+ 
+-	default:
+-	  break;
+-	}
++    default:
++      return NULL;
+     }
+-  else
+-    return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
+-
+-  return NULL;
+ }
+ 
+ /* Return the debug definition section.  */
+@@ -14032,46 +14035,49 @@
+   if (r_symndx == STN_UNDEF)
+     return NULL;
+ 
+-  h = get_ext_sym_hash (cookie, r_symndx);
++  h = get_ext_sym_hash_from_cookie (cookie, r_symndx);
++  if (h == NULL)
++    {
++      /* A corrup tinput file can lead to a situation where the index
++	 does not reference either a local or an external symbol.  */
++      if (r_symndx >= cookie->locsymcount)
++	return NULL;
+ 
+-  if (h != NULL)
++      return (*gc_mark_hook) (sec, info, cookie->rel, NULL,
++			      &cookie->locsyms[r_symndx]);
++    }
++
++  bool was_marked = h->mark;
++
++  h->mark = 1;
++  /* Keep all aliases of the symbol too.  If an object symbol
++     needs to be copied into .dynbss then all of its aliases
++     should be present as dynamic symbols, not just the one used
++     on the copy relocation.  */
++  hw = h;
++  while (hw->is_weakalias)
+     {
+-      bool was_marked;
++      hw = hw->u.alias;
++      hw->mark = 1;
++    }
+ 
+-      was_marked = h->mark;
+-      h->mark = 1;
+-      /* Keep all aliases of the symbol too.  If an object symbol
+-	 needs to be copied into .dynbss then all of its aliases
+-	 should be present as dynamic symbols, not just the one used
+-	 on the copy relocation.  */
+-      hw = h;
+-      while (hw->is_weakalias)
+-	{
+-	  hw = hw->u.alias;
+-	  hw->mark = 1;
+-	}
++  if (!was_marked && h->start_stop && !h->root.ldscript_def)
++    {
++      if (info->start_stop_gc)
++	return NULL;
+ 
+-      if (!was_marked && h->start_stop && !h->root.ldscript_def)
++      /* To work around a glibc bug, mark XXX input sections
++	 when there is a reference to __start_XXX or __stop_XXX
++	 symbols.  */
++      else if (start_stop != NULL)
+ 	{
+-	  if (info->start_stop_gc)
+-	    return NULL;
+-
+-	  /* To work around a glibc bug, mark XXX input sections
+-	     when there is a reference to __start_XXX or __stop_XXX
+-	     symbols.  */
+-	  else if (start_stop != NULL)
+-	    {
+-	      asection *s = h->u2.start_stop_section;
+-	      *start_stop = true;
+-	      return s;
+-	    }
++	  asection *s = h->u2.start_stop_section;
++	  *start_stop = true;
++	  return s;
+ 	}
+-
+-      return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
+     }
+ 
+-  return (*gc_mark_hook) (sec, info, cookie->rel, NULL,
+-			  &cookie->locsyms[r_symndx]);
++  return (*gc_mark_hook) (sec, info, cookie->rel, h, NULL);
+ }
+ 
+ /* COOKIE->rel describes a relocation against section SEC, which is
+@@ -15094,7 +15100,7 @@
+ 
+       struct elf_link_hash_entry *h;
+ 
+-      h = get_ext_sym_hash (rcookie, r_symndx);
++      h = get_ext_sym_hash_from_cookie (rcookie, r_symndx);
+ 
+       if (h != NULL)
+ 	{