Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package binutils for openSUSE:Factory 
checked in at 2021-05-17 18:44:48
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/binutils (Old)
 and      /work/SRC/openSUSE:Factory/.binutils.new.2988 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "binutils"

Mon May 17 18:44:48 2021 rev:149 rq:892038 version:2.36

Changes:
--------
--- /work/SRC/openSUSE:Factory/binutils/binutils.changes        2021-04-08 
21:01:22.493849401 +0200
+++ /work/SRC/openSUSE:Factory/.binutils.new.2988/binutils.changes      
2021-05-17 18:44:51.752738709 +0200
@@ -1,0 +2,8 @@
+Fri May  7 15:34:22 UTC 2021 - Andreas Schwab <[email protected]>
+
+- ppc-ensure-undef-dynamic-weak-undefined.patch: PPC: ensure_undef_dynamic
+  on weak undef only in plt
+- ppc-use-local-plt.patch: PowerPC use_local_plt (prerequisite for above
+  patch)
+
+-------------------------------------------------------------------
cross-aarch64-binutils.changes: same change
cross-arm-binutils.changes: same change
cross-avr-binutils.changes: same change
cross-epiphany-binutils.changes: same change
cross-hppa-binutils.changes: same change
cross-hppa64-binutils.changes: same change
cross-i386-binutils.changes: same change
cross-ia64-binutils.changes: same change
cross-m68k-binutils.changes: same change
cross-mips-binutils.changes: same change
cross-ppc-binutils.changes: same change
cross-ppc64-binutils.changes: same change
cross-ppc64le-binutils.changes: same change
cross-riscv64-binutils.changes: same change
cross-rx-binutils.changes: same change
cross-s390-binutils.changes: same change
cross-s390x-binutils.changes: same change
cross-sparc-binutils.changes: same change
cross-sparc64-binutils.changes: same change
cross-spu-binutils.changes: same change
cross-x86_64-binutils.changes: same change
cross-xtensa-binutils.changes: same change

New:
----
  ppc-ensure-undef-dynamic-weak-undefined.patch
  ppc-use-local-plt.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ binutils.spec ++++++
--- /var/tmp/diff_new_pack.UKHt0I/_old  2021-05-17 18:44:55.076724606 +0200
+++ /var/tmp/diff_new_pack.UKHt0I/_new  2021-05-17 18:44:55.080724589 +0200
@@ -101,6 +101,8 @@
 Patch39:        binutils-revert-nm-symversion.diff
 Patch40:        binutils-fix-abierrormsg.diff
 Patch41:        binutils-fix-relax.diff
+Patch42:        ppc-use-local-plt.patch
+Patch43:        ppc-ensure-undef-dynamic-weak-undefined.patch
 Patch100:       add-ulp-section.diff
 Patch90:        cross-avr-nesc-as.patch
 Patch92:        cross-avr-omit_section_dynsym.patch
@@ -192,6 +194,8 @@
 %patch39 -p1
 %patch40 -p1
 %patch41 -p1
+%patch42 -p1
+%patch43 -p1
 %patch100 -p1
 %if "%{TARGET}" == "avr"
 cp gas/config/tc-avr.h gas/config/tc-avr-nesc.h

++++++ cross-aarch64-binutils.spec ++++++
--- /var/tmp/diff_new_pack.UKHt0I/_old  2021-05-17 18:44:55.096724521 +0200
+++ /var/tmp/diff_new_pack.UKHt0I/_new  2021-05-17 18:44:55.100724504 +0200
@@ -104,6 +104,8 @@
 Patch39:        binutils-revert-nm-symversion.diff
 Patch40:        binutils-fix-abierrormsg.diff
 Patch41:        binutils-fix-relax.diff
+Patch42:        ppc-use-local-plt.patch
+Patch43:        ppc-ensure-undef-dynamic-weak-undefined.patch
 Patch100:       add-ulp-section.diff
 Patch90:        cross-avr-nesc-as.patch
 Patch92:        cross-avr-omit_section_dynsym.patch
@@ -195,6 +197,8 @@
 %patch39 -p1
 %patch40 -p1
 %patch41 -p1
+%patch42 -p1
+%patch43 -p1
 %patch100 -p1
 %if "%{TARGET}" == "avr"
 cp gas/config/tc-avr.h gas/config/tc-avr-nesc.h

cross-arm-binutils.spec: same change
cross-avr-binutils.spec: same change
cross-epiphany-binutils.spec: same change
cross-hppa-binutils.spec: same change
cross-hppa64-binutils.spec: same change
cross-i386-binutils.spec: same change
cross-ia64-binutils.spec: same change
cross-m68k-binutils.spec: same change
cross-mips-binutils.spec: same change
cross-ppc-binutils.spec: same change
cross-ppc64-binutils.spec: same change
cross-ppc64le-binutils.spec: same change
cross-riscv64-binutils.spec: same change
cross-rx-binutils.spec: same change
cross-s390-binutils.spec: same change
cross-s390x-binutils.spec: same change
cross-sparc-binutils.spec: same change
cross-sparc64-binutils.spec: same change
cross-spu-binutils.spec: same change
cross-x86_64-binutils.spec: same change
cross-xtensa-binutils.spec: same change


++++++ ppc-ensure-undef-dynamic-weak-undefined.patch ++++++
>From b293661219c36e72acb80502a86b51160bb88cfd Mon Sep 17 00:00:00 2001
From: Alan Modra <[email protected]>
Date: Mon, 3 May 2021 10:03:06 +0930
Subject: [PATCH] PPC: ensure_undef_dynamic on weak undef only in plt

It's slightly weird to have a call to a weak function not protected by
a test of that function being non-NULL, but the non-NULL test might be
covered by a test of another function.  For example:
  if (func1)
    {
      func1 ();
      func2 ();
    }
where func2 is known to exist if func1 exists.

        * elf32-ppc.c (allocate_dynrelocs): Call ensure_undef_dynamic for
        weak undefined symols that only appear on PLT relocs.
        * elf64-ppc.c (allocate_dynrelocs): Likewise.
---
 bfd/ChangeLog   | 6 ++++++
 bfd/elf32-ppc.c | 9 +++++++--
 bfd/elf64-ppc.c | 3 +++
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index 830c9200b0c..ff618e460a4 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -5296,9 +5296,14 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void 
*inf)
       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
        if (ent->plt.refcount > 0)
          {
-           asection *s = htab->elf.splt;
-           bfd_boolean dyn = !use_local_plt (info, h);
+           asection *s;
+           bfd_boolean dyn;
 
+           if (!ensure_undef_dynamic (info, h))
+             return FALSE;
+
+           dyn = !use_local_plt (info, h);
+           s = htab->elf.splt;
            if (!dyn)
              {
                if (h->type == STT_GNU_IFUNC)
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index ed72de27507..bc960bf8e9d 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -9855,6 +9855,9 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void 
*inf)
       for (pent = h->plt.plist; pent != NULL; pent = pent->next)
        if (pent->plt.refcount > 0)
          {
+           if (!ensure_undef_dynamic (info, h))
+             return FALSE;
+
            if (use_local_plt (info, h))
              {
                if (h->type == STT_GNU_IFUNC)
-- 
2.31.1

++++++ ppc-use-local-plt.patch ++++++
>From 30845f113a3b01640c46f9b07549b080cb83bc81 Mon Sep 17 00:00:00 2001
From: Alan Modra <[email protected]>
Date: Tue, 19 Jan 2021 19:26:11 +1030
Subject: [PATCH] PowerPC use_local_plt

Put the logic to select local vs. usual .plt section in one place.

        * elf64-ppc.c (elf_hash_entry): New inline function.  Use
        throughout to replace casts.
        (branch_reloc_hash_match): Remove const from params.
        (use_local_plt): New function.
        (allocate_dynrelocs, ppc_build_one_stub, ppc_size_one_stub),
        (build_global_entry_stubs_and_plt, ppc64_elf_relocate_section):
        Use use_local_plt.
        * elf32-ppc.c (use_local_plt): New function.
        (allocate_dynrelocs, ppc_elf_relocate_section),
        (write_global_sym_plt): Use use_local_plt.
---
 bfd/ChangeLog   | 13 +++++++++
 bfd/elf32-ppc.c | 48 +++++++++++++++---------------
 bfd/elf64-ppc.c | 77 ++++++++++++++++++++++++++-----------------------
 3 files changed, 78 insertions(+), 60 deletions(-)

diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c
index fd88f3d718e..a8da3049986 100644
--- a/bfd/elf32-ppc.c
+++ b/bfd/elf32-ppc.c
@@ -5094,6 +5094,18 @@ ensure_undef_dynamic (struct bfd_link_info *info,
   return TRUE;
 }
 
+/* Choose whether to use htab->iplt or htab->pltlocal rather than the
+   usual htab->elf.splt section for a PLT entry.  */
+
+static inline
+bfd_boolean use_local_plt (struct bfd_link_info *info,
+                          struct elf_link_hash_entry *h)
+{
+  return (h == NULL
+         || h->dynindx == -1
+         || !elf_hash_table (info)->dynamic_sections_created);
+}
+
 /* Allocate space in associated reloc sections for dynamic relocs.  */
 
 static bfd_boolean
@@ -5103,7 +5115,6 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void 
*inf)
   struct ppc_elf_link_hash_entry *eh;
   struct ppc_elf_link_hash_table *htab;
   struct elf_dyn_relocs *p;
-  bfd_boolean dyn;
 
   if (h->root.type == bfd_link_hash_indirect)
     return TRUE;
@@ -5271,8 +5282,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void 
*inf)
      b) is an ifunc, or
      c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
      d) has plt16 relocs and we are linking statically.  */
-  dyn = htab->elf.dynamic_sections_created && h->dynindx != -1;
-  if (dyn
+  if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
       || h->type == STT_GNU_IFUNC
       || (h->needs_plt && h->dynamic_adjusted)
       || (h->needs_plt
@@ -5290,6 +5300,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void 
*inf)
        if (ent->plt.refcount > 0)
          {
            asection *s = htab->elf.splt;
+           bfd_boolean dyn = !use_local_plt (info, h);
 
            if (!dyn)
              {
@@ -8373,9 +8384,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
 
                  unresolved_reloc = FALSE;
                  plt = htab->elf.splt;
-                 if (!htab->elf.dynamic_sections_created
-                     || h == NULL
-                     || h->dynindx == -1)
+                 if (use_local_plt (info, h))
                    {
                      if (ifunc != NULL)
                        plt = htab->elf.iplt;
@@ -9351,6 +9360,8 @@ write_global_sym_plt (struct elf_link_hash_entry *h, void 
*inf)
   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
     if (ent->plt.offset != (bfd_vma) -1)
       {
+       bfd_boolean dyn = !use_local_plt (info, h);
+
        if (!doneone)
          {
            Elf_Internal_Rela rela;
@@ -9359,9 +9370,7 @@ write_global_sym_plt (struct elf_link_hash_entry *h, void 
*inf)
            asection *plt = htab->elf.splt;
            asection *relplt = htab->elf.srelplt;
 
-           if (htab->plt_type == PLT_NEW
-               || !htab->elf.dynamic_sections_created
-               || h->dynindx == -1)
+           if (htab->plt_type == PLT_NEW || !dyn)
              reloc_index = ent->plt.offset / 4;
            else
              {
@@ -9374,9 +9383,7 @@ write_global_sym_plt (struct elf_link_hash_entry *h, void 
*inf)
 
            /* This symbol has an entry in the procedure linkage table.
               Set it up.  */
-           if (htab->plt_type == PLT_VXWORKS
-               && htab->elf.dynamic_sections_created
-               && h->dynindx != -1)
+           if (htab->plt_type == PLT_VXWORKS && dyn)
              {
                bfd_vma got_offset;
                const bfd_vma *plt_entry;
@@ -9499,8 +9506,7 @@ write_global_sym_plt (struct elf_link_hash_entry *h, void 
*inf)
            else
              {
                rela.r_addend = 0;
-               if (!htab->elf.dynamic_sections_created
-                   || h->dynindx == -1)
+               if (!dyn)
                  {
                    if (h->type == STT_GNU_IFUNC)
                      {
@@ -9529,9 +9535,7 @@ write_global_sym_plt (struct elf_link_hash_entry *h, void 
*inf)
                                     + plt->output_offset
                                     + ent->plt.offset);
 
-                   if (htab->plt_type == PLT_OLD
-                       || !htab->elf.dynamic_sections_created
-                       || h->dynindx == -1)
+                   if (htab->plt_type == PLT_OLD || !dyn)
                      {
                        /* We don't need to fill in the .plt.  The ppc dynamic
                           linker will fill it in.  */
@@ -9550,8 +9554,7 @@ write_global_sym_plt (struct elf_link_hash_entry *h, void 
*inf)
            if (relplt != NULL)
              {
                /* Fill in the entry in the .rela.plt section.  */
-               if (!htab->elf.dynamic_sections_created
-                   || h->dynindx == -1)
+               if (!dyn)
                  {
                    if (h->type == STT_GNU_IFUNC)
                      rela.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
@@ -9574,15 +9577,12 @@ write_global_sym_plt (struct elf_link_hash_entry *h, 
void *inf)
            doneone = TRUE;
          }
 
-       if (htab->plt_type == PLT_NEW
-           || !htab->elf.dynamic_sections_created
-           || h->dynindx == -1)
+       if (htab->plt_type == PLT_NEW || !dyn)
          {
            unsigned char *p;
            asection *plt = htab->elf.splt;
 
-           if (!htab->elf.dynamic_sections_created
-               || h->dynindx == -1)
+           if (!dyn)
              {
                if (h->type == STT_GNU_IFUNC)
                  plt = htab->elf.iplt;
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index a118c32c797..ed595074b94 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -3149,6 +3149,12 @@ ppc_elf_hash_entry (struct elf_link_hash_entry *ent)
   return (struct ppc_link_hash_entry *) ent;
 }
 
+static inline struct elf_link_hash_entry *
+elf_hash_entry (struct ppc_link_hash_entry *ent)
+{
+  return (struct elf_link_hash_entry *) ent;
+}
+
 /* ppc64 ELF linker hash table.  */
 
 struct ppc_link_hash_table
@@ -5656,10 +5662,10 @@ static bfd_boolean
 is_tls_get_addr (struct elf_link_hash_entry *h,
                 struct ppc_link_hash_table *htab)
 {
-  return (h == (struct elf_link_hash_entry *) htab->tls_get_addr_fd
-         || h == (struct elf_link_hash_entry *) htab->tga_desc_fd
-         || h == (struct elf_link_hash_entry *) htab->tls_get_addr
-         || h == (struct elf_link_hash_entry *) htab->tga_desc);
+  return (h == elf_hash_entry (htab->tls_get_addr_fd)
+         || h == elf_hash_entry (htab->tga_desc_fd)
+         || h == elf_hash_entry (htab->tls_get_addr)
+         || h == elf_hash_entry (htab->tga_desc));
 }
 
 static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
@@ -7856,7 +7862,7 @@ ppc64_elf_tls_setup (struct bfd_link_info *info)
                  if (tga_fd != NULL)
                    {
                      htab->tls_get_addr_fd = ppc_elf_hash_entry (opt_fd);
-                     tga = (struct elf_link_hash_entry *) htab->tls_get_addr;
+                     tga = elf_hash_entry (htab->tls_get_addr);
                      if (opt != NULL && tga != NULL)
                        {
                          tga->root.type = bfd_link_hash_indirect;
@@ -7917,12 +7923,12 @@ ppc64_elf_tls_setup (struct bfd_link_info *info)
    any of HASH1, HASH2, HASH3, or HASH4.  */
 
 static bfd_boolean
-branch_reloc_hash_match (const bfd *ibfd,
-                        const Elf_Internal_Rela *rel,
-                        const struct ppc_link_hash_entry *hash1,
-                        const struct ppc_link_hash_entry *hash2,
-                        const struct ppc_link_hash_entry *hash3,
-                        const struct ppc_link_hash_entry *hash4)
+branch_reloc_hash_match (bfd *ibfd,
+                        Elf_Internal_Rela *rel,
+                        struct ppc_link_hash_entry *hash1,
+                        struct ppc_link_hash_entry *hash2,
+                        struct ppc_link_hash_entry *hash3,
+                        struct ppc_link_hash_entry *hash4)
 {
   Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
   enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
@@ -7935,10 +7941,10 @@ branch_reloc_hash_match (const bfd *ibfd,
 
       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
       h = elf_follow_link (h);
-      if (h == (struct elf_link_hash_entry *) hash1
-         || h == (struct elf_link_hash_entry *) hash2
-         || h == (struct elf_link_hash_entry *) hash3
-         || h == (struct elf_link_hash_entry *) hash4)
+      if (h == elf_hash_entry (hash1)
+         || h == elf_hash_entry (hash2)
+         || h == elf_hash_entry (hash3)
+         || h == elf_hash_entry (hash4))
        return TRUE;
     }
   return FALSE;
@@ -9629,6 +9635,18 @@ ensure_undef_dynamic (struct bfd_link_info *info,
   return TRUE;
 }
 
+/* Choose whether to use htab->iplt or htab->pltlocal rather than the
+   usual htab->elf.splt section for a PLT entry.  */
+
+static inline
+bfd_boolean use_local_plt (struct bfd_link_info *info,
+                          struct elf_link_hash_entry *h)
+{
+  return (h == NULL
+         || h->dynindx == -1
+         || !elf_hash_table (info)->dynamic_sections_created);
+}
+
 /* Allocate space in .plt, .got and associated reloc sections for
    dynamic relocs.  */
 
@@ -9818,8 +9836,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void 
*inf)
       for (pent = h->plt.plist; pent != NULL; pent = pent->next)
        if (pent->plt.refcount > 0)
          {
-           if (!htab->elf.dynamic_sections_created
-               || h->dynindx == -1)
+           if (use_local_plt (info, h))
              {
                if (h->type == STT_GNU_IFUNC)
                  {
@@ -11703,9 +11720,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, 
void *in_arg)
            abort ();
 
          plt = htab->elf.splt;
-         if (!htab->elf.dynamic_sections_created
-             || stub_entry->h == NULL
-             || stub_entry->h->elf.dynindx == -1)
+         if (use_local_plt (info, elf_hash_entry (stub_entry->h)))
            {
              if (stub_entry->symtype == STT_GNU_IFUNC)
                plt = htab->elf.iplt;
@@ -11837,9 +11852,7 @@ ppc_build_one_stub (struct bfd_hash_entry *gen_entry, 
void *in_arg)
        abort ();
 
       plt = htab->elf.splt;
-      if (!htab->elf.dynamic_sections_created
-         || stub_entry->h == NULL
-         || stub_entry->h->elf.dynindx == -1)
+      if (use_local_plt (info, elf_hash_entry (stub_entry->h)))
        {
          if (stub_entry->symtype == STT_GNU_IFUNC)
            plt = htab->elf.iplt;
@@ -12208,9 +12221,7 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, 
void *in_arg)
        abort ();
 
       plt = htab->elf.splt;
-      if (!htab->elf.dynamic_sections_created
-         || stub_entry->h == NULL
-         || stub_entry->h->elf.dynindx == -1)
+      if (use_local_plt (info, elf_hash_entry (stub_entry->h)))
        {
          if (stub_entry->symtype == STT_GNU_IFUNC)
            plt = htab->elf.iplt;
@@ -12292,9 +12303,7 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, 
void *in_arg)
       if (targ >= (bfd_vma) -2)
        abort ();
       plt = htab->elf.splt;
-      if (!htab->elf.dynamic_sections_created
-         || stub_entry->h == NULL
-         || stub_entry->h->elf.dynindx == -1)
+      if (use_local_plt (info, elf_hash_entry (stub_entry->h)))
        {
          if (stub_entry->symtype == STT_GNU_IFUNC)
            plt = htab->elf.iplt;
@@ -14061,8 +14070,7 @@ build_global_entry_stubs_and_plt (struct 
elf_link_hash_entry *h, void *inf)
        asection *plt, *relplt;
        bfd_byte *loc;
 
-       if (!htab->elf.dynamic_sections_created
-           || h->dynindx == -1)
+       if (use_local_plt (info, h))
          {
            if (!(h->def_regular
                  && (h->root.type == bfd_link_hash_defined
@@ -14151,8 +14159,7 @@ build_global_entry_stubs_and_plt (struct 
elf_link_hash_entry *h, void *inf)
 
        p = s->contents + h->root.u.def.value;
        plt = htab->elf.splt;
-       if (!htab->elf.dynamic_sections_created
-           || h->dynindx == -1)
+       if (use_local_plt (info, h))
          {
            if (h->type == STT_GNU_IFUNC)
              plt = htab->elf.iplt;
@@ -16490,9 +16497,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
                      bfd_vma got;
 
                      plt = htab->elf.splt;
-                     if (!htab->elf.dynamic_sections_created
-                         || h == NULL
-                         || h->elf.dynindx == -1)
+                     if (use_local_plt (info, elf_hash_entry (h)))
                        {
                          if (h != NULL
                              ? h->elf.type == STT_GNU_IFUNC
-- 
2.31.1

Reply via email to