Blame SOURCES/binutils-page-to-segment-assignment.patch

13ae24
diff --git a/bfd/elf.c b/bfd/elf.c
13ae24
index c132098558..325bdd545a 100644
13ae24
--- a/bfd/elf.c
13ae24
+++ b/bfd/elf.c
13ae24
@@ -4727,33 +4727,35 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
13ae24
 		 the previous section, then we need a new segment.  */
13ae24
 	      new_segment = TRUE;
13ae24
 	    }
13ae24
+	  else if ((abfd->flags & D_PAGED) != 0
13ae24
+		   && (((last_hdr->lma + last_size - 1) & -maxpagesize)
13ae24
+		       == (hdr->lma & -maxpagesize)))
13ae24
+	    {
13ae24
+	      /* If we are demand paged then we can't map two disk
13ae24
+		 pages onto the same memory page.  */
13ae24
+	      new_segment = FALSE;
13ae24
+	    }
13ae24
 	  /* In the next test we have to be careful when last_hdr->lma is close
13ae24
 	     to the end of the address space.  If the aligned address wraps
13ae24
 	     around to the start of the address space, then there are no more
13ae24
 	     pages left in memory and it is OK to assume that the current
13ae24
 	     section can be included in the current segment.  */
13ae24
-	  else if ((BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
13ae24
-		    > last_hdr->lma)
13ae24
-		   && (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
13ae24
-		       <= hdr->lma))
13ae24
+	  else if ((BFD_ALIGN (last_hdr->lma + last_size, maxpagesize)
13ae24
+		    + maxpagesize > last_hdr->lma)
13ae24
+		   && (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize)
13ae24
+		       + maxpagesize <= hdr->lma))
13ae24
 	    {
13ae24
 	      /* If putting this section in this segment would force us to
13ae24
 		 skip a page in the segment, then we need a new segment.  */
13ae24
 	      new_segment = TRUE;
13ae24
 	    }
13ae24
 	  else if ((last_hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == 0
13ae24
-		   && (hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != 0
13ae24
-		   && ((abfd->flags & D_PAGED) == 0
13ae24
-		       || (((last_hdr->lma + last_size - 1) & -maxpagesize)
13ae24
-			   != (hdr->lma & -maxpagesize))))
13ae24
+		   && (hdr->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != 0)
13ae24
 	    {
13ae24
 	      /* We don't want to put a loaded section after a
13ae24
 		 nonloaded (ie. bss style) section in the same segment
13ae24
 		 as that will force the non-loaded section to be loaded.
13ae24
-		 Consider .tbss sections as loaded for this purpose.
13ae24
-		 However, like the writable/non-writable case below,
13ae24
-		 if they are on the same page then they must be put
13ae24
-		 in the same segment.  */
13ae24
+		 Consider .tbss sections as loaded for this purpose.  */
13ae24
 	      new_segment = TRUE;
13ae24
 	    }
13ae24
 	  else if ((abfd->flags & D_PAGED) == 0)
13ae24
@@ -4769,21 +4771,11 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
13ae24
 	    {
13ae24
 	      new_segment = TRUE;
13ae24
 	    }
13ae24
-	  else if (! writable
13ae24
-		   && (hdr->flags & SEC_READONLY) == 0
13ae24
-		   && ((info != NULL
13ae24
-			&& info->relro_end > info->relro_start)
13ae24
-		       || (((last_hdr->lma + last_size - 1) & -maxpagesize)
13ae24
-			   != (hdr->lma & -maxpagesize))))
13ae24
+          else if (! writable
13ae24
+		   && (hdr->flags & SEC_READONLY) == 0)
13ae24
 	    {
13ae24
 	      /* We don't want to put a writable section in a read only
13ae24
-		 segment, unless they are on the same page in memory
13ae24
-		 anyhow and there is no RELRO segment.  We already
13ae24
-		 know that the last section does not bring us past the
13ae24
-		 current section on the page, so the only case in which
13ae24
-		 the new section is not on the same page as the previous
13ae24
-		 section is when the previous section ends precisely on
13ae24
-		 a page boundary.  */
13ae24
+		 segment.  */
13ae24
 	      new_segment = TRUE;
13ae24
 	    }
13ae24
 	  else