You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
5.0 KiB
143 lines
5.0 KiB
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
|
|
|