Blame SOURCES/binutils-s390x-partial-relro.patch

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