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
