diff -rup binutils.orig/bfd/elf64-s390.c binutils-2.35.2/bfd/elf64-s390.c --- binutils.orig/bfd/elf64-s390.c 2022-05-03 12:03:39.004203905 +0100 +++ binutils-2.35.2/bfd/elf64-s390.c 2022-05-03 12:06:19.884715801 +0100 @@ -773,7 +773,7 @@ elf_s390_tls_transition (struct bfd_link int r_type, int is_local) { - if (bfd_link_pic (info)) + if (bfd_link_dll (info)) return r_type; switch (r_type) @@ -1025,7 +1025,7 @@ elf_s390_check_relocs (bfd *abfd, case R_390_TLS_GOTIE20: case R_390_TLS_GOTIE64: case R_390_TLS_IEENT: - if (bfd_link_pic (info)) + if (bfd_link_dll (info)) info->flags |= DF_STATIC_TLS; /* Fall through */ @@ -1106,7 +1106,7 @@ elf_s390_check_relocs (bfd *abfd, if (r_type == R_390_TLS_LE64 && bfd_link_pie (info)) break; - if (!bfd_link_pic (info)) + if (!bfd_link_dll (info)) break; info->flags |= DF_STATIC_TLS; /* Fall through */ @@ -1570,7 +1570,7 @@ allocate_dynrelocs (struct elf_link_hash to R_390_TLS_LE64 requiring no TLS entry. For GOTIE12 and IEENT we can save the dynamic TLS relocation. */ if (h->got.refcount > 0 - && !bfd_link_pic (info) + && !bfd_link_dll (info) && h->dynindx == -1 && elf_s390_hash_entry(h)->tls_type >= GOT_TLS_IE) { @@ -1875,7 +1875,20 @@ elf_s390_size_dynamic_sections (bfd *out else if (CONST_STRNEQ (bfd_section_name (s), ".rela")) { if (s->size != 0 && s != htab->elf.srelplt) - relocs = TRUE; + { + relocs = TRUE; + if (s == htab->elf.irelplt) + { + /* In static-pie case, there are IRELATIVE-relocs in + .rela.iplt (htab->irelplt), which will later be grouped + to .rela.plt. On s390, the IRELATIVE relocations are + always located in .rela.iplt - even for non-static case. + Ensure that DT_JMPREL, DT_PLTRELA, DT_PLTRELASZ is added + to the dynamic section even if htab->srelplt->size == 0. + See _bfd_elf_add_dynamic_tags in bfd/elflink.c. */ + htab->elf.dt_jmprel_required = TRUE; + } + } /* We use the reloc_count field as a counter if we need to copy relocs into the output file. */ @@ -2661,7 +2674,7 @@ elf_s390_relocate_section (bfd *output_b /* Relocations for tls literal pool entries. */ case R_390_TLS_IE64: - if (bfd_link_pic (info)) + if (bfd_link_dll (info)) { Elf_Internal_Rela outrel; asection *sreloc; @@ -2689,7 +2702,7 @@ elf_s390_relocate_section (bfd *output_b else if (h != NULL) { tls_type = elf_s390_hash_entry(h)->tls_type; - if (!bfd_link_pic (info) && h->dynindx == -1 && tls_type >= GOT_TLS_IE) + if (!bfd_link_dll (info) && h->dynindx == -1 && tls_type >= GOT_TLS_IE) r_type = R_390_TLS_LE64; } if (r_type == R_390_TLS_GD64 && tls_type >= GOT_TLS_IE) @@ -2800,14 +2813,14 @@ elf_s390_relocate_section (bfd *output_b if (local_got_offsets == NULL) abort(); off = local_got_offsets[r_symndx]; - if (bfd_link_pic (info)) + if (bfd_link_dll (info)) goto emit_tls_relocs; } else { off = h->got.offset; tls_type = elf_s390_hash_entry(h)->tls_type; - if (bfd_link_pic (info) || h->dynindx != -1 || tls_type < GOT_TLS_IE) + if (bfd_link_dll (info) || h->dynindx != -1 || tls_type < GOT_TLS_IE) goto emit_tls_relocs; } @@ -2824,7 +2837,7 @@ elf_s390_relocate_section (bfd *output_b break; case R_390_TLS_LDM64: - if (! bfd_link_pic (info)) + if (! bfd_link_dll (info)) /* The literal pool entry this relocation refers to gets ignored by the optimized code of the local exec model. Do nothing and the value will turn out zero. */ @@ -2899,7 +2912,7 @@ elf_s390_relocate_section (bfd *output_b continue; case R_390_TLS_LDO64: - if (bfd_link_pic (info) || (input_section->flags & SEC_DEBUGGING)) + if (bfd_link_dll (info) || (input_section->flags & SEC_DEBUGGING)) relocation -= dtpoff_base (info); else /* When converting LDO to LE, we must negate. */ @@ -2921,7 +2934,7 @@ elf_s390_relocate_section (bfd *output_b if (r_type == R_390_TLS_LOAD) { - if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1)) + if (!bfd_link_dll (info) && (h == NULL || h->dynindx == -1)) { /* IE->LE transition. Four valid cases: lg %rx,(0,%ry) -> sllg %rx,%ry,0 @@ -2971,7 +2984,7 @@ elf_s390_relocate_section (bfd *output_b invalid_tls_insn (input_bfd, input_section, rel); return FALSE; } - if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1)) + if (!bfd_link_dll (info) && (h == NULL || h->dynindx == -1)) { /* GD->LE transition. brasl %r14,__tls_get_addr@plt -> brcl 0,. */ @@ -2990,7 +3003,7 @@ elf_s390_relocate_section (bfd *output_b } else if (r_type == R_390_TLS_LDCALL) { - if (!bfd_link_pic (info)) + if (!bfd_link_dll (info)) { unsigned int insn0, insn1; Only in binutils-2.35.2/bfd: elf64-s390.c.orig Only in binutils-2.35.2/bfd: elf64-s390.c.rej