* elf.c (_bfd_elf_map_sections_to_segments): Allow sections in
authorNick Clifton <nickc@redhat.com>
Tue, 22 Jul 2008 11:19:01 +0000 (11:19 +0000)
committerNick Clifton <nickc@redhat.com>
Tue, 22 Jul 2008 11:19:01 +0000 (11:19 +0000)
        adjoining pages to be included in the same segment.

bfd/ChangeLog
bfd/elf.c

index 3616c0f..1b5f018 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-22  Nick Clifton  <nickc@redhat.com>
+
+       * elf.c (_bfd_elf_map_sections_to_segments): Allow sections in
+       adjoining pages to be included in the same segment.
+
 2008-07-22  Simon Baldwin  <simonb@google.com>
 
        * elflink.c (elf_link_output_extsym): Set st_size to zero for
index 24ab2c0..a7cc4a5 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -3720,8 +3720,15 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
                 segment.  */
              new_segment = TRUE;
            }
-         else if (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize)
-                  < BFD_ALIGN (hdr->lma, maxpagesize))
+         /* In the next test we have to be careful when last_hdr->lma is close
+            to the end of the address space.  If the aligned address wraps
+            around to the start of the address space, then there are no more
+            pages left in memory and it is OK to assume that the current
+            section can be included in the current segment.  */
+         else if ((BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
+                   > last_hdr->lma)
+                  && (BFD_ALIGN (last_hdr->lma + last_size, maxpagesize) + maxpagesize
+                      < hdr->lma))
            {
              /* If putting this section in this segment would force us to
                 skip a page in the segment, then we need a new segment.  */