|
|
13ae24 |
diff -rup binutils.orig/bfd/elf64-s390.c binutils-2.30/bfd/elf64-s390.c
|
|
|
13ae24 |
--- binutils.orig/bfd/elf64-s390.c 2019-03-11 14:41:06.432547033 +0000
|
|
|
13ae24 |
+++ binutils-2.30/bfd/elf64-s390.c 2019-03-11 14:45:42.066369572 +0000
|
|
|
13ae24 |
@@ -475,7 +475,7 @@ elf_s390_is_local_label_name (bfd *abfd,
|
|
|
13ae24 |
|
|
|
13ae24 |
#define RELA_ENTRY_SIZE sizeof (Elf64_External_Rela)
|
|
|
13ae24 |
|
|
|
13ae24 |
-/* The first three entries in a procedure linkage table are reserved,
|
|
|
13ae24 |
+/* The first three entries in a global offset table are reserved,
|
|
|
13ae24 |
and the initial contents are unimportant (we zero them out).
|
|
|
13ae24 |
Subsequent entries look like this. See the SVR4 ABI 386
|
|
|
13ae24 |
supplement to see how this works. */
|
|
|
13ae24 |
@@ -505,8 +505,8 @@ elf_s390_is_local_label_name (bfd *abfd,
|
|
|
13ae24 |
LG 1,0(1) # 6 bytes Load address from GOT in r1
|
|
|
13ae24 |
BCR 15,1 # 2 bytes Jump to address
|
|
|
13ae24 |
RET1: BASR 1,0 # 2 bytes Return from GOT 1st time
|
|
|
13ae24 |
- LGF 1,12(1) # 6 bytes Load offset in symbl table in r1
|
|
|
13ae24 |
- BRCL 15,-x # 6 bytes Jump to start of PLT
|
|
|
13ae24 |
+ LGF 1,12(1) # 6 bytes Load rela.plt offset into r1
|
|
|
13ae24 |
+ BRCL 15,-x # 6 bytes Jump to first PLT entry
|
|
|
13ae24 |
.long ? # 4 bytes offset into .rela.plt
|
|
|
13ae24 |
|
|
|
13ae24 |
Total = 32 bytes per PLT entry
|
|
|
13ae24 |
@@ -1599,8 +1599,7 @@ allocate_dynrelocs (struct elf_link_hash
|
|
|
13ae24 |
/* Make room for this entry. */
|
|
|
13ae24 |
s->size += PLT_ENTRY_SIZE;
|
|
|
13ae24 |
|
|
|
13ae24 |
- /* We also need to make an entry in the .got.plt section, which
|
|
|
13ae24 |
- will be placed in the .got section by the linker script. */
|
|
|
13ae24 |
+ /* We also need to make an entry in the .got.plt section. */
|
|
|
13ae24 |
htab->elf.sgotplt->size += GOT_ENTRY_SIZE;
|
|
|
13ae24 |
|
|
|
13ae24 |
/* We also need to make an entry in the .rela.plt section. */
|
|
|
13ae24 |
@@ -1825,6 +1824,20 @@ elf_s390_size_dynamic_sections (bfd *out
|
|
|
13ae24 |
}
|
|
|
13ae24 |
}
|
|
|
13ae24 |
|
|
|
13ae24 |
+ if (htab->elf.sgot && s390_gotplt_after_got_p (info))
|
|
|
13ae24 |
+ {
|
|
|
13ae24 |
+ /* _bfd_elf_create_got_section adds the got header size always
|
|
|
13ae24 |
+ to .got.plt but we need it in .got if this section comes
|
|
|
13ae24 |
+ first. */
|
|
|
13ae24 |
+ htab->elf.sgot->size += 3 * GOT_ENTRY_SIZE;
|
|
|
13ae24 |
+ htab->elf.sgotplt->size -= 3 * GOT_ENTRY_SIZE;
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ /* Make the _GLOBAL_OFFSET_TABLE_ symbol point to the .got
|
|
|
13ae24 |
+ instead of .got.plt. */
|
|
|
13ae24 |
+ htab->elf.hgot->root.u.def.section = htab->elf.sgot;
|
|
|
13ae24 |
+ htab->elf.hgot->root.u.def.value = 0;
|
|
|
13ae24 |
+ }
|
|
|
13ae24 |
+
|
|
|
13ae24 |
/* Set up .got offsets for local syms, and space for local dynamic
|
|
|
13ae24 |
relocs. */
|
|
|
13ae24 |
for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
|
|
|
13ae24 |
@@ -2125,7 +2138,6 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
bfd_boolean unresolved_reloc;
|
|
|
13ae24 |
bfd_reloc_status_type r;
|
|
|
13ae24 |
int tls_type;
|
|
|
13ae24 |
- asection *base_got = htab->elf.sgot;
|
|
|
13ae24 |
bfd_boolean resolved_to_zero;
|
|
|
13ae24 |
|
|
|
13ae24 |
r_type = ELF64_R_TYPE (rel->r_info);
|
|
|
13ae24 |
@@ -2166,7 +2178,7 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
case R_390_PLTOFF16:
|
|
|
13ae24 |
case R_390_PLTOFF32:
|
|
|
13ae24 |
case R_390_PLTOFF64:
|
|
|
13ae24 |
- relocation -= htab->elf.sgot->output_section->vma;
|
|
|
13ae24 |
+ relocation -= s390_got_pointer (info);
|
|
|
13ae24 |
break;
|
|
|
13ae24 |
case R_390_GOTPLT12:
|
|
|
13ae24 |
case R_390_GOTPLT16:
|
|
|
13ae24 |
@@ -2186,10 +2198,10 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
htab->elf.sgot->contents +
|
|
|
13ae24 |
local_got_offsets[r_symndx]);
|
|
|
13ae24 |
relocation = (local_got_offsets[r_symndx] +
|
|
|
13ae24 |
- htab->elf.sgot->output_offset);
|
|
|
13ae24 |
+ s390_got_offset (info));
|
|
|
13ae24 |
|
|
|
13ae24 |
if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT)
|
|
|
13ae24 |
- relocation += htab->elf.sgot->output_section->vma;
|
|
|
13ae24 |
+ relocation += s390_got_pointer (info);
|
|
|
13ae24 |
break;
|
|
|
13ae24 |
}
|
|
|
13ae24 |
default:
|
|
|
13ae24 |
@@ -2248,25 +2260,23 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
|
|
|
13ae24 |
if (s390_is_ifunc_symbol_p (h))
|
|
|
13ae24 |
{
|
|
|
13ae24 |
+ /* Entry indices of .iplt and .igot.plt match
|
|
|
13ae24 |
+ 1:1. No magic PLT first entry here. */
|
|
|
13ae24 |
plt_index = h->plt.offset / PLT_ENTRY_SIZE;
|
|
|
13ae24 |
- relocation = (plt_index * GOT_ENTRY_SIZE +
|
|
|
13ae24 |
- htab->elf.igotplt->output_offset);
|
|
|
13ae24 |
- if (r_type == R_390_GOTPLTENT)
|
|
|
13ae24 |
- relocation += htab->elf.igotplt->output_section->vma;
|
|
|
13ae24 |
+ relocation = (plt_index * GOT_ENTRY_SIZE
|
|
|
13ae24 |
+ + s390_gotplt_offset (info)
|
|
|
13ae24 |
+ + htab->elf.igotplt->output_offset);
|
|
|
13ae24 |
}
|
|
|
13ae24 |
else
|
|
|
13ae24 |
{
|
|
|
13ae24 |
- /* Calc. index no.
|
|
|
13ae24 |
- Current offset - size first entry / entry size. */
|
|
|
13ae24 |
- plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) /
|
|
|
13ae24 |
- PLT_ENTRY_SIZE;
|
|
|
13ae24 |
-
|
|
|
13ae24 |
- /* Offset in GOT is PLT index plus GOT headers(3)
|
|
|
13ae24 |
- times 8, addr & GOT addr. */
|
|
|
13ae24 |
- relocation = (plt_index + 3) * GOT_ENTRY_SIZE;
|
|
|
13ae24 |
- if (r_type == R_390_GOTPLTENT)
|
|
|
13ae24 |
- relocation += htab->elf.sgot->output_section->vma;
|
|
|
13ae24 |
+ plt_index = ((h->plt.offset - PLT_FIRST_ENTRY_SIZE)
|
|
|
13ae24 |
+ / PLT_ENTRY_SIZE);
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ relocation = (plt_index * GOT_ENTRY_SIZE
|
|
|
13ae24 |
+ + s390_gotplt_offset (info));
|
|
|
13ae24 |
}
|
|
|
13ae24 |
+ if (r_type == R_390_GOTPLTENT)
|
|
|
13ae24 |
+ relocation += s390_got_pointer (info);
|
|
|
13ae24 |
unresolved_reloc = FALSE;
|
|
|
13ae24 |
break;
|
|
|
13ae24 |
}
|
|
|
13ae24 |
@@ -2280,7 +2290,7 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
case R_390_GOTENT:
|
|
|
13ae24 |
/* Relocation is to the entry for this symbol in the global
|
|
|
13ae24 |
offset table. */
|
|
|
13ae24 |
- if (base_got == NULL)
|
|
|
13ae24 |
+ if (htab->elf.sgot == NULL)
|
|
|
13ae24 |
abort ();
|
|
|
13ae24 |
|
|
|
13ae24 |
if (h != NULL)
|
|
|
13ae24 |
@@ -2297,8 +2307,19 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
{
|
|
|
13ae24 |
/* No explicit GOT usage so redirect to the
|
|
|
13ae24 |
got.iplt slot. */
|
|
|
13ae24 |
- base_got = htab->elf.igotplt;
|
|
|
13ae24 |
- off = h->plt.offset / PLT_ENTRY_SIZE * GOT_ENTRY_SIZE;
|
|
|
13ae24 |
+ relocation = (s390_gotplt_offset (info)
|
|
|
13ae24 |
+ + htab->elf.igotplt->output_offset
|
|
|
13ae24 |
+ + (h->plt.offset / PLT_ENTRY_SIZE
|
|
|
13ae24 |
+ * GOT_ENTRY_SIZE));
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ /* For @GOTENT the relocation is against the offset between
|
|
|
13ae24 |
+ the instruction and the symbols entry in the GOT and not
|
|
|
13ae24 |
+ between the start of the GOT and the symbols entry. We
|
|
|
13ae24 |
+ add the vma of the GOT to get the correct value. */
|
|
|
13ae24 |
+ if (r_type == R_390_GOTENT || r_type == R_390_GOTPLTENT)
|
|
|
13ae24 |
+ relocation += s390_got_pointer (info);
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ break;
|
|
|
13ae24 |
}
|
|
|
13ae24 |
else
|
|
|
13ae24 |
{
|
|
|
13ae24 |
@@ -2331,7 +2352,7 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
else
|
|
|
13ae24 |
{
|
|
|
13ae24 |
bfd_put_64 (output_bfd, relocation,
|
|
|
13ae24 |
- base_got->contents + off);
|
|
|
13ae24 |
+ htab->elf.sgot->contents + off);
|
|
|
13ae24 |
h->got.offset |= 1;
|
|
|
13ae24 |
}
|
|
|
13ae24 |
|
|
|
13ae24 |
@@ -2413,7 +2434,7 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
if (off >= (bfd_vma) -2)
|
|
|
13ae24 |
abort ();
|
|
|
13ae24 |
|
|
|
13ae24 |
- relocation = base_got->output_offset + off;
|
|
|
13ae24 |
+ relocation = s390_got_offset (info) + off;
|
|
|
13ae24 |
|
|
|
13ae24 |
/* For @GOTENT the relocation is against the offset between
|
|
|
13ae24 |
the instruction and the symbols entry in the GOT and not
|
|
|
13ae24 |
@@ -2421,7 +2442,7 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
add the vma of the GOT to get the correct value. */
|
|
|
13ae24 |
if ( r_type == R_390_GOTENT
|
|
|
13ae24 |
|| r_type == R_390_GOTPLTENT)
|
|
|
13ae24 |
- relocation += base_got->output_section->vma;
|
|
|
13ae24 |
+ relocation += s390_got_pointer (info);
|
|
|
13ae24 |
|
|
|
13ae24 |
break;
|
|
|
13ae24 |
|
|
|
13ae24 |
@@ -2439,22 +2460,17 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
relocation = (htab->elf.iplt->output_section->vma
|
|
|
13ae24 |
+ htab->elf.iplt->output_offset
|
|
|
13ae24 |
+ h->plt.offset
|
|
|
13ae24 |
- - htab->elf.sgot->output_section->vma);
|
|
|
13ae24 |
+ - s390_got_pointer (info));
|
|
|
13ae24 |
goto do_relocation;
|
|
|
13ae24 |
}
|
|
|
13ae24 |
|
|
|
13ae24 |
- /* Note that sgot->output_offset is not involved in this
|
|
|
13ae24 |
- calculation. We always want the start of .got. If we
|
|
|
13ae24 |
- defined _GLOBAL_OFFSET_TABLE in a different way, as is
|
|
|
13ae24 |
- permitted by the ABI, we might have to change this
|
|
|
13ae24 |
- calculation. */
|
|
|
13ae24 |
- relocation -= htab->elf.sgot->output_section->vma;
|
|
|
13ae24 |
+ relocation -= s390_got_pointer (info);
|
|
|
13ae24 |
break;
|
|
|
13ae24 |
|
|
|
13ae24 |
case R_390_GOTPC:
|
|
|
13ae24 |
case R_390_GOTPCDBL:
|
|
|
13ae24 |
/* Use global offset table as symbol value. */
|
|
|
13ae24 |
- relocation = htab->elf.sgot->output_section->vma;
|
|
|
13ae24 |
+ relocation = s390_got_pointer (info);
|
|
|
13ae24 |
unresolved_reloc = FALSE;
|
|
|
13ae24 |
break;
|
|
|
13ae24 |
|
|
|
13ae24 |
@@ -2503,7 +2519,7 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
|| h->plt.offset == (bfd_vma) -1
|
|
|
13ae24 |
|| (htab->elf.splt == NULL && !s390_is_ifunc_symbol_p (h)))
|
|
|
13ae24 |
{
|
|
|
13ae24 |
- relocation -= htab->elf.sgot->output_section->vma;
|
|
|
13ae24 |
+ relocation -= s390_got_pointer (info);
|
|
|
13ae24 |
break;
|
|
|
13ae24 |
}
|
|
|
13ae24 |
|
|
|
13ae24 |
@@ -2511,12 +2527,12 @@ elf_s390_relocate_section (bfd *output_b
|
|
|
13ae24 |
relocation = (htab->elf.iplt->output_section->vma
|
|
|
13ae24 |
+ htab->elf.iplt->output_offset
|
|
|
13ae24 |
+ h->plt.offset
|
|
|
13ae24 |
- - htab->elf.sgot->output_section->vma);
|
|
|
13ae24 |
+ - s390_got_pointer (info));
|
|
|
13ae24 |
else
|
|
|
13ae24 |
relocation = (htab->elf.splt->output_section->vma
|
|
|
13ae24 |
+ htab->elf.splt->output_offset
|
|
|
13ae24 |
+ h->plt.offset
|
|
|
13ae24 |
- - htab->elf.sgot->output_section->vma);
|
|
|
13ae24 |
+ - s390_got_pointer (info));
|
|
|
13ae24 |
unresolved_reloc = FALSE;
|
|
|
13ae24 |
break;
|
|
|
13ae24 |
|
|
|
13ae24 |
@@ -3289,7 +3305,7 @@ elf_s390_finish_dynamic_symbol (bfd *out
|
|
|
13ae24 |
if (h->plt.offset != (bfd_vma) -1)
|
|
|
13ae24 |
{
|
|
|
13ae24 |
bfd_vma plt_index;
|
|
|
13ae24 |
- bfd_vma got_offset;
|
|
|
13ae24 |
+ bfd_vma gotplt_offset;
|
|
|
13ae24 |
Elf_Internal_Rela rela;
|
|
|
13ae24 |
bfd_byte *loc;
|
|
|
13ae24 |
|
|
|
13ae24 |
@@ -3318,18 +3334,25 @@ elf_s390_finish_dynamic_symbol (bfd *out
|
|
|
13ae24 |
Current offset - size first entry / entry size. */
|
|
|
13ae24 |
plt_index = (h->plt.offset - PLT_FIRST_ENTRY_SIZE) / PLT_ENTRY_SIZE;
|
|
|
13ae24 |
|
|
|
13ae24 |
- /* Offset in GOT is PLT index plus GOT headers(3) times 8,
|
|
|
13ae24 |
- addr & GOT addr. */
|
|
|
13ae24 |
- got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
|
|
|
13ae24 |
+ /* The slots in the .got.plt correspond to the PLT slots in
|
|
|
13ae24 |
+ the same order. */
|
|
|
13ae24 |
+ gotplt_offset = plt_index * GOT_ENTRY_SIZE;
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ /* If .got.plt comes first it needs to contain the 3 header
|
|
|
13ae24 |
+ entries. */
|
|
|
13ae24 |
+ if (!s390_gotplt_after_got_p (info))
|
|
|
13ae24 |
+ gotplt_offset += 3 * GOT_ENTRY_SIZE;
|
|
|
13ae24 |
|
|
|
13ae24 |
/* Fill in the blueprint of a PLT. */
|
|
|
13ae24 |
memcpy (htab->elf.splt->contents + h->plt.offset, elf_s390x_plt_entry,
|
|
|
13ae24 |
PLT_ENTRY_SIZE);
|
|
|
13ae24 |
|
|
|
13ae24 |
- /* Fixup the relative address to the GOT entry */
|
|
|
13ae24 |
+ /* The first instruction in the PLT entry is a LARL loading
|
|
|
13ae24 |
+ the address of the GOT slot. We write the 4 byte
|
|
|
13ae24 |
+ immediate operand of the LARL instruction here. */
|
|
|
13ae24 |
bfd_put_32 (output_bfd,
|
|
|
13ae24 |
(htab->elf.sgotplt->output_section->vma +
|
|
|
13ae24 |
- htab->elf.sgotplt->output_offset + got_offset
|
|
|
13ae24 |
+ htab->elf.sgotplt->output_offset + gotplt_offset
|
|
|
13ae24 |
- (htab->elf.splt->output_section->vma +
|
|
|
13ae24 |
htab->elf.splt->output_offset +
|
|
|
13ae24 |
h->plt.offset))/2,
|
|
|
13ae24 |
@@ -3349,12 +3372,12 @@ elf_s390_finish_dynamic_symbol (bfd *out
|
|
|
13ae24 |
+ htab->elf.splt->output_offset
|
|
|
13ae24 |
+ h->plt.offset
|
|
|
13ae24 |
+ 14),
|
|
|
13ae24 |
- htab->elf.sgotplt->contents + got_offset);
|
|
|
13ae24 |
+ htab->elf.sgotplt->contents + gotplt_offset);
|
|
|
13ae24 |
|
|
|
13ae24 |
/* Fill in the entry in the .rela.plt section. */
|
|
|
13ae24 |
rela.r_offset = (htab->elf.sgotplt->output_section->vma
|
|
|
13ae24 |
+ htab->elf.sgotplt->output_offset
|
|
|
13ae24 |
- + got_offset);
|
|
|
13ae24 |
+ + gotplt_offset);
|
|
|
13ae24 |
rela.r_info = ELF64_R_INFO (h->dynindx, R_390_JMP_SLOT);
|
|
|
13ae24 |
rela.r_addend = 0;
|
|
|
13ae24 |
loc = htab->elf.srelplt->contents + plt_index *
|
|
|
13ae24 |
@@ -3561,8 +3584,8 @@ elf_s390_finish_dynamic_sections (bfd *o
|
|
|
13ae24 |
continue;
|
|
|
13ae24 |
|
|
|
13ae24 |
case DT_PLTGOT:
|
|
|
13ae24 |
- s = htab->elf.sgotplt;
|
|
|
13ae24 |
- dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
|
|
|
13ae24 |
+ /* DT_PLTGOT matches _GLOBAL_OFFSET_TABLE_ */
|
|
|
13ae24 |
+ dyn.d_un.d_ptr = s390_got_pointer (info);
|
|
|
13ae24 |
break;
|
|
|
13ae24 |
|
|
|
13ae24 |
case DT_JMPREL:
|
|
|
13ae24 |
@@ -3599,10 +3622,11 @@ elf_s390_finish_dynamic_sections (bfd *o
|
|
|
13ae24 |
/* fill in blueprint for plt 0 entry */
|
|
|
13ae24 |
memcpy (htab->elf.splt->contents, elf_s390x_first_plt_entry,
|
|
|
13ae24 |
PLT_FIRST_ENTRY_SIZE);
|
|
|
13ae24 |
- /* Fixup relative address to start of GOT */
|
|
|
13ae24 |
+ /* The second instruction in the first PLT entry is a LARL
|
|
|
13ae24 |
+ loading the GOT pointer. Fill in the LARL immediate
|
|
|
13ae24 |
+ address. */
|
|
|
13ae24 |
bfd_put_32 (output_bfd,
|
|
|
13ae24 |
- (htab->elf.sgotplt->output_section->vma
|
|
|
13ae24 |
- + htab->elf.sgotplt->output_offset
|
|
|
13ae24 |
+ (s390_got_pointer (info)
|
|
|
13ae24 |
- htab->elf.splt->output_section->vma
|
|
|
13ae24 |
- htab->elf.splt->output_offset - 6)/2,
|
|
|
13ae24 |
htab->elf.splt->contents + 8);
|
|
|
13ae24 |
@@ -3612,21 +3636,22 @@ elf_s390_finish_dynamic_sections (bfd *o
|
|
|
13ae24 |
= PLT_ENTRY_SIZE;
|
|
|
13ae24 |
}
|
|
|
13ae24 |
|
|
|
13ae24 |
- if (htab->elf.sgotplt)
|
|
|
13ae24 |
+ if (htab->elf.hgot && htab->elf.hgot->root.u.def.section)
|
|
|
13ae24 |
{
|
|
|
13ae24 |
/* Fill in the first three entries in the global offset table. */
|
|
|
13ae24 |
- if (htab->elf.sgotplt->size > 0)
|
|
|
13ae24 |
+ if (htab->elf.hgot->root.u.def.section->size > 0)
|
|
|
13ae24 |
{
|
|
|
13ae24 |
bfd_put_64 (output_bfd,
|
|
|
13ae24 |
(sdyn == NULL ? (bfd_vma) 0
|
|
|
13ae24 |
: sdyn->output_section->vma + sdyn->output_offset),
|
|
|
13ae24 |
- htab->elf.sgotplt->contents);
|
|
|
13ae24 |
+ htab->elf.hgot->root.u.def.section->contents);
|
|
|
13ae24 |
/* One entry for shared object struct ptr. */
|
|
|
13ae24 |
- bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + 8);
|
|
|
13ae24 |
+ bfd_put_64 (output_bfd, (bfd_vma) 0,
|
|
|
13ae24 |
+ htab->elf.hgot->root.u.def.section->contents + 8);
|
|
|
13ae24 |
/* One entry for _dl_runtime_resolve. */
|
|
|
13ae24 |
- bfd_put_64 (output_bfd, (bfd_vma) 0, htab->elf.sgotplt->contents + 16);
|
|
|
13ae24 |
+ bfd_put_64 (output_bfd, (bfd_vma) 0,
|
|
|
13ae24 |
+ htab->elf.hgot->root.u.def.section->contents + 16);
|
|
|
13ae24 |
}
|
|
|
13ae24 |
-
|
|
|
13ae24 |
elf_section_data (htab->elf.sgot->output_section)
|
|
|
13ae24 |
->this_hdr.sh_entsize = 8;
|
|
|
13ae24 |
}
|
|
|
13ae24 |
diff -rup binutils.orig/bfd/elf-s390-common.c binutils-2.30/bfd/elf-s390-common.c
|
|
|
13ae24 |
--- binutils.orig/bfd/elf-s390-common.c 2019-03-11 14:41:06.444546938 +0000
|
|
|
13ae24 |
+++ binutils-2.30/bfd/elf-s390-common.c 2019-03-11 14:45:42.065369580 +0000
|
|
|
13ae24 |
@@ -30,6 +30,87 @@ s390_is_ifunc_symbol_p (struct elf_link_
|
|
|
13ae24 |
return h->type == STT_GNU_IFUNC || eh->ifunc_resolver_address != 0;
|
|
|
13ae24 |
}
|
|
|
13ae24 |
|
|
|
13ae24 |
+/* Return true if .got.plt is supposed to be emitted after .got. */
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+static inline bfd_boolean
|
|
|
13ae24 |
+s390_gotplt_after_got_p (struct bfd_link_info *info)
|
|
|
13ae24 |
+{
|
|
|
13ae24 |
+ struct elf_s390_link_hash_table *htab = elf_s390_hash_table (info);
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ if (!htab->elf.sgot || !htab->elf.sgotplt)
|
|
|
13ae24 |
+ return TRUE;
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ if (htab->elf.sgot->output_section == htab->elf.sgotplt->output_section)
|
|
|
13ae24 |
+ {
|
|
|
13ae24 |
+ if (htab->elf.sgot->output_offset < htab->elf.sgotplt->output_offset)
|
|
|
13ae24 |
+ return TRUE;
|
|
|
13ae24 |
+ }
|
|
|
13ae24 |
+ else
|
|
|
13ae24 |
+ {
|
|
|
13ae24 |
+ if (htab->elf.sgot->output_section->vma
|
|
|
13ae24 |
+ <= htab->elf.sgotplt->output_section->vma)
|
|
|
13ae24 |
+ return TRUE;
|
|
|
13ae24 |
+ }
|
|
|
13ae24 |
+ return FALSE;
|
|
|
13ae24 |
+}
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+/* Return the value of the _GLOBAL_OFFSET_TABLE_ symbol. */
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+static inline bfd_vma
|
|
|
13ae24 |
+s390_got_pointer (struct bfd_link_info *info)
|
|
|
13ae24 |
+{
|
|
|
13ae24 |
+ struct elf_s390_link_hash_table *htab = elf_s390_hash_table (info);
|
|
|
13ae24 |
+ bfd_vma got_pointer;
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ BFD_ASSERT (htab && htab->elf.hgot);
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ got_pointer = (htab->elf.hgot->root.u.def.section->output_section->vma
|
|
|
13ae24 |
+ + htab->elf.hgot->root.u.def.section->output_offset);
|
|
|
13ae24 |
+ /* Our ABI requires the GOT pointer to point at the very beginning
|
|
|
13ae24 |
+ of the global offset table. */
|
|
|
13ae24 |
+ BFD_ASSERT (got_pointer
|
|
|
13ae24 |
+ <= (htab->elf.sgot->output_section->vma
|
|
|
13ae24 |
+ + htab->elf.sgot->output_offset));
|
|
|
13ae24 |
+ BFD_ASSERT (got_pointer
|
|
|
13ae24 |
+ <= (htab->elf.sgotplt->output_section->vma
|
|
|
13ae24 |
+ + htab->elf.sgotplt->output_offset));
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ return got_pointer;
|
|
|
13ae24 |
+}
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+/* Return the offset of the .got versus _GLOBAL_OFFSET_TABLE_. */
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+static inline bfd_vma
|
|
|
13ae24 |
+s390_got_offset (struct bfd_link_info *info)
|
|
|
13ae24 |
+{
|
|
|
13ae24 |
+ struct elf_s390_link_hash_table *htab = elf_s390_hash_table (info);
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ /* The absolute address of the .got in the target image. */
|
|
|
13ae24 |
+ bfd_vma got_address = (htab->elf.sgot->output_section->vma
|
|
|
13ae24 |
+ + htab->elf.sgot->output_offset);
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ /* GOT offset must not be negative. */
|
|
|
13ae24 |
+ BFD_ASSERT (s390_got_pointer (info) <= got_address);
|
|
|
13ae24 |
+ return got_address - s390_got_pointer (info);
|
|
|
13ae24 |
+}
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+/* Return the offset of the .got.plt versus _GLOBAL_OFFSET_TABLE_. */
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+static inline bfd_vma
|
|
|
13ae24 |
+s390_gotplt_offset (struct bfd_link_info *info)
|
|
|
13ae24 |
+{
|
|
|
13ae24 |
+ struct elf_s390_link_hash_table *htab = elf_s390_hash_table (info);
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ /* The absolute address of the .got.plt in the target image. */
|
|
|
13ae24 |
+ bfd_vma gotplt_address = (htab->elf.sgotplt->output_section->vma
|
|
|
13ae24 |
+ + htab->elf.sgotplt->output_offset);
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ /* GOT offset must not be negative. */
|
|
|
13ae24 |
+ BFD_ASSERT (s390_got_pointer (info) <= gotplt_address);
|
|
|
13ae24 |
+ return gotplt_address - s390_got_pointer (info);
|
|
|
13ae24 |
+}
|
|
|
13ae24 |
+
|
|
|
13ae24 |
/* Create sections needed by STT_GNU_IFUNC symbol. */
|
|
|
13ae24 |
|
|
|
13ae24 |
static bfd_boolean
|
|
|
13ae24 |
diff -rup binutils.orig/ld/emulparams/elf64_s390.sh binutils-2.30/ld/emulparams/elf64_s390.sh
|
|
|
13ae24 |
--- binutils.orig/ld/emulparams/elf64_s390.sh 2019-03-11 14:41:05.978550619 +0000
|
|
|
13ae24 |
+++ binutils-2.30/ld/emulparams/elf64_s390.sh 2019-03-11 14:45:42.066369572 +0000
|
|
|
13ae24 |
@@ -11,9 +11,12 @@ NOP=0x07070707
|
|
|
13ae24 |
TEMPLATE_NAME=elf32
|
|
|
13ae24 |
GENERATE_SHLIB_SCRIPT=yes
|
|
|
13ae24 |
GENERATE_PIE_SCRIPT=yes
|
|
|
13ae24 |
+GENERATE_RELRO_SCRIPT=yes
|
|
|
13ae24 |
NO_SMALL_DATA=yes
|
|
|
13ae24 |
EXTRA_EM_FILE=s390
|
|
|
13ae24 |
IREL_IN_PLT=
|
|
|
13ae24 |
+SEPARATE_GOTPLT=0
|
|
|
13ae24 |
+test -z "$RELRO" && unset SEPARATE_GOTPLT
|
|
|
13ae24 |
|
|
|
13ae24 |
# Treat a host that matches the target with the possible exception of "x"
|
|
|
13ae24 |
# in the name as if it were native.
|
|
|
13ae24 |
diff -rup binutils.orig/ld/emultempl/elf32.em binutils-2.30/ld/emultempl/elf32.em
|
|
|
13ae24 |
--- binutils.orig/ld/emultempl/elf32.em 2019-03-11 14:41:05.971550675 +0000
|
|
|
13ae24 |
+++ binutils-2.30/ld/emultempl/elf32.em 2019-03-11 14:45:42.064369587 +0000
|
|
|
13ae24 |
@@ -2406,17 +2406,41 @@ echo ' && link_info.combrelo
|
|
|
13ae24 |
echo ' && link_info.relro' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xdceo >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xdce >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xdco >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xdeo >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xde >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xdo >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
echo ' ; else if (bfd_link_pie (&link_info)) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
@@ -2432,17 +2456,41 @@ echo ' && link_info.combrelo
|
|
|
13ae24 |
echo ' && link_info.relro' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xsceo >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xsce >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xsco >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xseo >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xse >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xso >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
echo ' ; else if (bfd_link_dll (&link_info)) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
@@ -2455,14 +2503,34 @@ echo ' ; else if (link_info.combreloc'
|
|
|
13ae24 |
echo ' && link_info.relro' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xceo >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xce >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xco >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
-echo ' ; else if (link_info.separate_code) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (link_info.separate_code' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xeo >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
+echo ' ; else if (link_info.separate_code) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.xe >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+echo ' ; else if (link_info.relro) return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+sed $sc ldscripts/${EMULATION_NAME}.xo >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
echo ' ; else return' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
echo '; }' >> e${EMULATION_NAME}.c
|
|
|
13ae24 |
@@ -2501,6 +2569,21 @@ fragment <
|
|
|
13ae24 |
else
|
|
|
13ae24 |
return "ldscripts/${EMULATION_NAME}.xdw";
|
|
|
13ae24 |
}
|
|
|
13ae24 |
+EOF
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+fragment <
|
|
|
13ae24 |
+ else if (bfd_link_pie (&link_info)
|
|
|
13ae24 |
+ && link_info.combreloc
|
|
|
13ae24 |
+ && link_info.relro)
|
|
|
13ae24 |
+ {
|
|
|
13ae24 |
+ if (link_info.separate_code)
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xdceo";
|
|
|
13ae24 |
+ else
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xdco";
|
|
|
13ae24 |
+ }
|
|
|
13ae24 |
+EOF
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
+fragment <
|
|
|
13ae24 |
else if (bfd_link_pie (&link_info)
|
|
|
13ae24 |
&& link_info.combreloc)
|
|
|
13ae24 |
{
|
|
|
13ae24 |
@@ -2511,6 +2594,18 @@ fragment <
|
|
|
13ae24 |
}
|
|
|
13ae24 |
EOF
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+fragment <
|
|
|
13ae24 |
+ else if (bfd_link_pie (&link_info)
|
|
|
13ae24 |
+ && link_info.relro)
|
|
|
13ae24 |
+ {
|
|
|
13ae24 |
+ if (link_info.separate_code)
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xdeo";
|
|
|
13ae24 |
+ else
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xdo";
|
|
|
13ae24 |
+ }
|
|
|
13ae24 |
+EOF
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
fragment <
|
|
|
13ae24 |
else if (bfd_link_pie (&link_info))
|
|
|
13ae24 |
{
|
|
|
13ae24 |
@@ -2532,6 +2627,21 @@ fragment <
|
|
|
13ae24 |
else
|
|
|
13ae24 |
return "ldscripts/${EMULATION_NAME}.xsw";
|
|
|
13ae24 |
}
|
|
|
13ae24 |
+EOF
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+fragment <
|
|
|
13ae24 |
+ else if (bfd_link_dll (&link_info)
|
|
|
13ae24 |
+ && link_info.combreloc
|
|
|
13ae24 |
+ && link_info.relro)
|
|
|
13ae24 |
+ {
|
|
|
13ae24 |
+ if (link_info.separate_code)
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xsceo";
|
|
|
13ae24 |
+ else
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xsco";
|
|
|
13ae24 |
+ }
|
|
|
13ae24 |
+EOF
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
+fragment <
|
|
|
13ae24 |
else if (bfd_link_dll (&link_info) && link_info.combreloc)
|
|
|
13ae24 |
{
|
|
|
13ae24 |
if (link_info.separate_code)
|
|
|
13ae24 |
@@ -2541,6 +2651,18 @@ fragment <
|
|
|
13ae24 |
}
|
|
|
13ae24 |
EOF
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+fragment <
|
|
|
13ae24 |
+ else if (bfd_link_dll (&link_info)
|
|
|
13ae24 |
+ && link_info.relro)
|
|
|
13ae24 |
+ {
|
|
|
13ae24 |
+ if (link_info.separate_code)
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xseo";
|
|
|
13ae24 |
+ else
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xso";
|
|
|
13ae24 |
+ }
|
|
|
13ae24 |
+EOF
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
fragment <
|
|
|
13ae24 |
else if (bfd_link_dll (&link_info))
|
|
|
13ae24 |
{
|
|
|
13ae24 |
@@ -2561,6 +2683,20 @@ fragment <
|
|
|
13ae24 |
else
|
|
|
13ae24 |
return "ldscripts/${EMULATION_NAME}.xw";
|
|
|
13ae24 |
}
|
|
|
13ae24 |
+EOF
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+fragment <
|
|
|
13ae24 |
+ else if (link_info.combreloc
|
|
|
13ae24 |
+ && link_info.relro)
|
|
|
13ae24 |
+ {
|
|
|
13ae24 |
+ if (link_info.separate_code)
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xceo";
|
|
|
13ae24 |
+ else
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xco";
|
|
|
13ae24 |
+ }
|
|
|
13ae24 |
+EOF
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
+fragment <
|
|
|
13ae24 |
else if (link_info.combreloc)
|
|
|
13ae24 |
{
|
|
|
13ae24 |
if (link_info.separate_code)
|
|
|
13ae24 |
@@ -2570,6 +2706,17 @@ fragment <
|
|
|
13ae24 |
}
|
|
|
13ae24 |
EOF
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT" ; then
|
|
|
13ae24 |
+fragment <
|
|
|
13ae24 |
+ else if (link_info.relro)
|
|
|
13ae24 |
+ {
|
|
|
13ae24 |
+ if (link_info.separate_code)
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xeo";
|
|
|
13ae24 |
+ else
|
|
|
13ae24 |
+ return "ldscripts/${EMULATION_NAME}.xo";
|
|
|
13ae24 |
+ }
|
|
|
13ae24 |
+EOF
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
fragment <
|
|
|
13ae24 |
else
|
|
|
13ae24 |
{
|
|
|
13ae24 |
diff -rup binutils.orig/ld/genscripts.sh binutils-2.30/ld/genscripts.sh
|
|
|
13ae24 |
--- binutils.orig/ld/genscripts.sh 2019-03-11 14:41:05.983550579 +0000
|
|
|
13ae24 |
+++ binutils-2.30/ld/genscripts.sh 2019-03-11 14:45:42.065369580 +0000
|
|
|
13ae24 |
@@ -304,6 +304,20 @@ LD_FLAG=textonly
|
|
|
13ae24 |
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xe
|
|
|
13ae24 |
|
|
|
13ae24 |
+if test -n "$GENERATE_RELRO_SCRIPT"; then
|
|
|
13ae24 |
+ LD_FLAG=
|
|
|
13ae24 |
+ RELRO=" "
|
|
|
13ae24 |
+ ( echo "/* Script for -z relo: generate normal executables with separate code segment */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xo
|
|
|
13ae24 |
+ LD_FLAG=textonly
|
|
|
13ae24 |
+ ( echo "/* Script for -z separate-code -z relo: generate normal executables with separate code segment */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xeo
|
|
|
13ae24 |
+ unset RELRO
|
|
|
13ae24 |
+fi
|
|
|
13ae24 |
LD_FLAG=n
|
|
|
13ae24 |
DATA_ALIGNMENT=${DATA_ALIGNMENT_n}
|
|
|
13ae24 |
( echo "/* Script for -n: mix text and data on same page */"
|
|
|
13ae24 |
@@ -351,6 +365,25 @@ if test -n "$GENERATE_COMBRELOC_SCRIPT";
|
|
|
13ae24 |
rm -f ${COMBRELOC}
|
|
|
13ae24 |
COMBRELOC=
|
|
|
13ae24 |
unset RELRO_NOW
|
|
|
13ae24 |
+ if test -n "$GENERATE_RELRO_SCRIPT"; then
|
|
|
13ae24 |
+ LD_FLAG=c
|
|
|
13ae24 |
+ RELRO=" "
|
|
|
13ae24 |
+ COMBRELOC=ldscripts/${EMULATION_NAME}.xco.tmp
|
|
|
13ae24 |
+ ( echo "/* Script for -z combreloc -z relro: combine and sort reloc sections */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xco
|
|
|
13ae24 |
+ rm -f ${COMBRELOC}
|
|
|
13ae24 |
+ LD_FLAG=ctextonly
|
|
|
13ae24 |
+ COMBRELOC=ldscripts/${EMULATION_NAME}.xceo.tmp
|
|
|
13ae24 |
+ ( echo "/* Script for -z combreloc -z separate-code -z relro: combine and sort reloc sections */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xceo
|
|
|
13ae24 |
+ rm -f ${COMBRELOC}
|
|
|
13ae24 |
+ COMBRELOC=
|
|
|
13ae24 |
+ unset RELRO
|
|
|
13ae24 |
+ fi
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
|
|
|
13ae24 |
if test -n "$GENERATE_SHLIB_SCRIPT"; then
|
|
|
13ae24 |
@@ -368,6 +401,23 @@ if test -n "$GENERATE_SHLIB_SCRIPT"; the
|
|
|
13ae24 |
. ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xse
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ if test -n "$GENERATE_RELRO_SCRIPT"; then
|
|
|
13ae24 |
+ RELRO=" "
|
|
|
13ae24 |
+ LD_FLAG=shared
|
|
|
13ae24 |
+ (
|
|
|
13ae24 |
+ echo "/* Script for ld --shared -z relro: link shared library */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xso
|
|
|
13ae24 |
+ LD_FLAG=sharedtextonly
|
|
|
13ae24 |
+ (
|
|
|
13ae24 |
+ echo "/* Script for ld --shared -z relro -z separate-code: link shared library with separate code segment */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xseo
|
|
|
13ae24 |
+ unset RELRO
|
|
|
13ae24 |
+ fi
|
|
|
13ae24 |
if test -n "$GENERATE_COMBRELOC_SCRIPT"; then
|
|
|
13ae24 |
DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}}
|
|
|
13ae24 |
LD_FLAG=cshared
|
|
|
13ae24 |
@@ -399,8 +449,27 @@ if test -n "$GENERATE_SHLIB_SCRIPT"; the
|
|
|
13ae24 |
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xswe
|
|
|
13ae24 |
rm -f ${COMBRELOC}
|
|
|
13ae24 |
- COMBRELOC=
|
|
|
13ae24 |
unset RELRO_NOW
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ if test -n "$GENERATE_RELRO_SCRIPT"; then
|
|
|
13ae24 |
+ LD_FLAG=wshared
|
|
|
13ae24 |
+ RELRO=" "
|
|
|
13ae24 |
+ COMBRELOC=ldscripts/${EMULATION_NAME}.xsco.tmp
|
|
|
13ae24 |
+ ( echo "/* Script for --shared -z combreloc -z relro: shared library, combine & sort relocs with separate code segment */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsco
|
|
|
13ae24 |
+ rm -f ${COMBRELOC}
|
|
|
13ae24 |
+ LD_FLAG=wsharedtextonly
|
|
|
13ae24 |
+ COMBRELOC=ldscripts/${EMULATION_NAME}.xsceo.tmp
|
|
|
13ae24 |
+ ( echo "/* Script for --shared -z combreloc -z relro -z separate-code: shared library, combine & sort relocs with separate code segment */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xsceo
|
|
|
13ae24 |
+ rm -f ${COMBRELOC}
|
|
|
13ae24 |
+ unset RELRO
|
|
|
13ae24 |
+ fi
|
|
|
13ae24 |
+ COMBRELOC=
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
unset CREATE_SHLIB
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
@@ -420,6 +489,22 @@ if test -n "$GENERATE_PIE_SCRIPT"; then
|
|
|
13ae24 |
. ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xde
|
|
|
13ae24 |
+ if test -n "$GENERATE_RELRO_SCRIPT"; then
|
|
|
13ae24 |
+ RELRO=" "
|
|
|
13ae24 |
+ LD_FLAG=pie
|
|
|
13ae24 |
+ (
|
|
|
13ae24 |
+ echo "/* Script for ld -pie -z relro: link position independent executable */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdo
|
|
|
13ae24 |
+ LD_FLAG=pietextonly
|
|
|
13ae24 |
+ (
|
|
|
13ae24 |
+ echo "/* Script for ld -pie -z relro -z separate-code: link position independent executable with separate code segment */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdeo
|
|
|
13ae24 |
+ unset RELRO
|
|
|
13ae24 |
+ fi
|
|
|
13ae24 |
if test -n "$GENERATE_COMBRELOC_SCRIPT"; then
|
|
|
13ae24 |
DATA_ALIGNMENT=${DATA_ALIGNMENT_sc-${DATA_ALIGNMENT}}
|
|
|
13ae24 |
COMBRELOC=ldscripts/${EMULATION_NAME}.xdc.tmp
|
|
|
13ae24 |
@@ -451,8 +536,28 @@ if test -n "$GENERATE_PIE_SCRIPT"; then
|
|
|
13ae24 |
. ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdwe
|
|
|
13ae24 |
rm -f ${COMBRELOC}
|
|
|
13ae24 |
- COMBRELOC=
|
|
|
13ae24 |
unset RELRO_NOW
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ if test -n "$GENERATE_RELRO_SCRIPT"; then
|
|
|
13ae24 |
+ LD_FLAG=wpie
|
|
|
13ae24 |
+ RELRO=" "
|
|
|
13ae24 |
+ COMBRELOC=ldscripts/${EMULATION_NAME}.xdco.tmp
|
|
|
13ae24 |
+ ( echo "/* Script for -pie -z combreloc -z relro: position independent executable, combine & sort relocs with separate code segment */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdco
|
|
|
13ae24 |
+ rm -f ${COMBRELOC}
|
|
|
13ae24 |
+ LD_FLAG=wpietextonly
|
|
|
13ae24 |
+ COMBRELOC=ldscripts/${EMULATION_NAME}.xdceo.tmp
|
|
|
13ae24 |
+ ( echo "/* Script for -pie -z combreloc -z relro -z separate-code: position independent executable, combine & sort relocs with separate code segment */"
|
|
|
13ae24 |
+ . ${CUSTOMIZER_SCRIPT}
|
|
|
13ae24 |
+ . ${srcdir}/scripttempl/${SCRIPT_NAME}.sc
|
|
|
13ae24 |
+ ) | sed -e '/^ *$/d;s/[ ]*$//' > ldscripts/${EMULATION_NAME}.xdceo
|
|
|
13ae24 |
+ rm -f ${COMBRELOC}
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+ unset RELRO
|
|
|
13ae24 |
+ fi
|
|
|
13ae24 |
+ COMBRELOC=
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
unset CREATE_PIE
|
|
|
13ae24 |
fi
|
|
|
13ae24 |
diff -rup binutils.orig/ld/testsuite/ld-s390/s390.exp binutils-2.30/ld/testsuite/ld-s390/s390.exp
|
|
|
13ae24 |
--- binutils.orig/ld/testsuite/ld-s390/s390.exp 2019-03-11 14:41:06.029550216 +0000
|
|
|
13ae24 |
+++ binutils-2.30/ld/testsuite/ld-s390/s390.exp 2019-03-11 14:45:42.066369572 +0000
|
|
|
13ae24 |
@@ -70,10 +70,15 @@ set s390xtests {
|
|
|
13ae24 |
{{readelf -WSsrl tlsbin_64.rd} {objdump -dzrj.text tlsbin_64.dd}
|
|
|
13ae24 |
{objdump -sj.got tlsbin_64.sd} {objdump -sj.tdata tlsbin_64.td}}
|
|
|
13ae24 |
"tlsbin_64"}
|
|
|
13ae24 |
- {"GOT: symbol address load from got to larl"
|
|
|
13ae24 |
- "-shared -melf64_s390 --hash-style=sysv --version-script=gotreloc-1.ver" ""
|
|
|
13ae24 |
+ {"GOT: norelro symbol address load from got to larl"
|
|
|
13ae24 |
+ "-shared -melf64_s390 -z norelro --hash-style=sysv --version-script=gotreloc-1.ver" ""
|
|
|
13ae24 |
"-m64" {gotreloc-1.s}
|
|
|
13ae24 |
- {{objdump -dzrj.text gotreloc_64-1.dd}}
|
|
|
13ae24 |
+ {{objdump -dzrj.text gotreloc_64-norelro-1.dd}}
|
|
|
13ae24 |
+ "gotreloc_64-1"}
|
|
|
13ae24 |
+ {"GOT: relro symbol address load from got to larl"
|
|
|
13ae24 |
+ "-shared -melf64_s390 -z relro --hash-style=sysv --version-script=gotreloc-1.ver" ""
|
|
|
13ae24 |
+ "-m64" {gotreloc-1.s}
|
|
|
13ae24 |
+ {{objdump -dzrj.text gotreloc_64-relro-1.dd}}
|
|
|
13ae24 |
"gotreloc_64-1"}
|
|
|
13ae24 |
{"PLT: offset test"
|
|
|
13ae24 |
"-shared -m elf64_s390 -dT pltoffset-1.ld" ""
|
|
|
13ae24 |
--- /dev/null 2019-03-11 08:49:22.227998809 +0000
|
|
|
13ae24 |
+++ binutils-2.30/ld/testsuite/ld-s390/gotreloc_64-relro-1.dd 2019-03-11 14:53:27.144667759 +0000
|
|
|
13ae24 |
@@ -0,0 +1,12 @@
|
|
|
13ae24 |
+tmpdir/gotreloc_64-1: file format elf64-s390
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+Disassembly of section .text:
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+.* <foo>:
|
|
|
13ae24 |
+.*: c0 10 00 00 00 0e [ ]*larl %r1,.* <bar>
|
|
|
13ae24 |
+.*: c0 10 00 00 00 0b [ ]*larl %r1,.* <bar>
|
|
|
13ae24 |
+.*: c4 1d 00 00 .. .. [ ]*lrl %r1,.* <_GLOBAL_OFFSET_TABLE_\+0x18>
|
|
|
13ae24 |
+.*: 58 10 c0 18 [ ]*l %r1,24\(%r12\)
|
|
|
13ae24 |
+.*: e3 10 c0 18 00 58 [ ]*ly %r1,24\(%r12\)
|
|
|
13ae24 |
+.* <bar>:
|
|
|
13ae24 |
+.*: 00 00 01 23 .long 0x00000123
|
|
|
13ae24 |
--- /dev/null 2019-03-11 08:49:22.227998809 +0000
|
|
|
13ae24 |
+++ binutils-2.30/ld/testsuite/ld-s390/gotreloc_64-norelro-1.dd 2019-03-11 14:45:42.066369572 +0000
|
|
|
13ae24 |
@@ -0,0 +1,12 @@
|
|
|
13ae24 |
+tmpdir/gotreloc_64-1: file format elf64-s390
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+Disassembly of section .text:
|
|
|
13ae24 |
+
|
|
|
13ae24 |
+.* <foo>:
|
|
|
13ae24 |
+.*: c0 10 00 00 00 0e [ ]*larl %r1,.* <bar>
|
|
|
13ae24 |
+.*: c0 10 00 00 00 0b [ ]*larl %r1,.* <bar>
|
|
|
13ae24 |
+.*: c4 1d 00 00 08 86 [ ]*lrl %r1,.* <_GLOBAL_OFFSET_TABLE_\+0x18>
|
|
|
13ae24 |
+.*: 58 10 c0 18 [ ]*l %r1,24\(%r12\)
|
|
|
13ae24 |
+.*: e3 10 c0 18 00 58 [ ]*ly %r1,24\(%r12\)
|
|
|
13ae24 |
+.* <bar>:
|
|
|
13ae24 |
+.*: 00 00 01 23 .long 0x00000123
|