bfd/
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 22 Mar 2007 15:50:38 +0000 (15:50 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 22 Mar 2007 15:50:38 +0000 (15:50 +0000)
2007-03-22  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/4007
* elf.c (assign_file_positions_for_load_sections): Check if
all sections are in the segment.

ld/testsuite/

2007-03-22  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/4007
* ld-elf/note-1.d: New file.
* ld-elf/note-1.s: Likewise.
* ld-elf/note-1.t: Likewise.
* ld-i386/alloc.d: Likewise.
* ld-i386/alloc.s: Likewise.
* ld-i386/alloc.t: Likewise.

* ld-i386/i386.exp: Run "alloc".

bfd/ChangeLog
bfd/elf.c
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/note-1.d [new file with mode: 0644]
ld/testsuite/ld-elf/note-1.s [new file with mode: 0644]
ld/testsuite/ld-elf/note-1.t [new file with mode: 0644]
ld/testsuite/ld-i386/alloc.d [new file with mode: 0644]
ld/testsuite/ld-i386/alloc.s [new file with mode: 0644]
ld/testsuite/ld-i386/alloc.t [new file with mode: 0644]
ld/testsuite/ld-i386/i386.exp

index e33adfb..7c6bc2e 100644 (file)
@@ -1,3 +1,9 @@
+2007-03-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/4007
+       * elf.c (assign_file_positions_for_load_sections): Check if
+       all sections are in the segment.
+
 2003-03-20  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/4208
index 0a6eaa0..3777838 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4246,7 +4246,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
   file_ptr off, voff;
   bfd_size_type maxpagesize;
   unsigned int alloc;
-  unsigned int i;
+  unsigned int i, j;
 
   if (link_info == NULL
       && !elf_modify_segment_map (abfd, link_info))
@@ -4284,9 +4284,9 @@ assign_file_positions_for_load_sections (bfd *abfd,
   off = bed->s->sizeof_ehdr;
   off += alloc * bed->s->sizeof_phdr;
 
-  for (m = elf_tdata (abfd)->segment_map, p = phdrs;
+  for (m = elf_tdata (abfd)->segment_map, p = phdrs, j = 0;
        m != NULL;
-       m = m->next, p++)
+       m = m->next, p++, j++)
     {
       asection **secpp;
 
@@ -4604,6 +4604,29 @@ assign_file_positions_for_load_sections (bfd *abfd,
                p->p_flags |= PF_W;
            }
        }
+
+      /* Check if all sections are in the segment.  Skip PT_GNU_RELRO
+        and PT_NOTE segments since they will be processed by
+        assign_file_positions_for_non_load_sections later.  */
+      if (p->p_type != PT_GNU_RELRO
+         && p->p_type != PT_NOTE)
+       for (i = 0, secpp = m->sections; i < m->count; i++, secpp++)
+         {
+           Elf_Internal_Shdr *this_hdr;
+           asection *sec;
+
+           sec = *secpp;
+           this_hdr = &(elf_section_data(sec)->this_hdr);
+           if (this_hdr->sh_size != 0
+               && !ELF_IS_SECTION_IN_SEGMENT_FILE (this_hdr, p))
+             {
+               (*_bfd_error_handler)
+                 (_("%B: section `%A' can't be allocated in segment %d"),
+                  abfd, sec, j);
+               bfd_set_error (bfd_error_bad_value);
+               return FALSE;
+             }
+         }
     }
 
   elf_tdata (abfd)->next_file_pos = off;
index 20f932a..07f2895 100644 (file)
@@ -1,3 +1,15 @@
+2007-03-22  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/4007
+       * ld-elf/note-1.d: New file.
+       * ld-elf/note-1.s: Likewise.
+       * ld-elf/note-1.t: Likewise.
+       * ld-i386/alloc.d: Likewise.
+       * ld-i386/alloc.s: Likewise.
+       * ld-i386/alloc.t: Likewise.
+
+       * ld-i386/i386.exp: Run "alloc".
+
 2007-03-20  Paul Brook  <paul@codesourcery.com>
 
        * ld-arm/arm-elf.exp (ld-arm/arm-elf.exp): Add arm-pic-veneer.
diff --git a/ld/testsuite/ld-elf/note-1.d b/ld/testsuite/ld-elf/note-1.d
new file mode 100644 (file)
index 0000000..a5fc40f
--- /dev/null
@@ -0,0 +1,8 @@
+#ld: -Tnote-1.t
+#readelf: -l --wide
+
+#...
+ Section to Segment mapping:
+  Segment Sections...
+   00     .foo 
+   01     .note 
diff --git a/ld/testsuite/ld-elf/note-1.s b/ld/testsuite/ld-elf/note-1.s
new file mode 100644 (file)
index 0000000..82c9513
--- /dev/null
@@ -0,0 +1,6 @@
+       .globl _entry
+       .section .foo,"awx",%progbits
+_entry:
+       .byte 0
+       .section .note,"",%note
+       .byte 0
diff --git a/ld/testsuite/ld-elf/note-1.t b/ld/testsuite/ld-elf/note-1.t
new file mode 100644 (file)
index 0000000..031fe82
--- /dev/null
@@ -0,0 +1,14 @@
+ENTRY(_entry)
+PHDRS
+{
+  data PT_LOAD;
+  note PT_NOTE;
+}
+SECTIONS
+{
+  . = 0x1000000;
+  .foo : { *(.foo) } :data
+  . = 0x2000000;
+  .note : { *(.note) } :note
+  /DISCARD/ : { *(*) }
+}
diff --git a/ld/testsuite/ld-i386/alloc.d b/ld/testsuite/ld-i386/alloc.d
new file mode 100644 (file)
index 0000000..c2b22f2
--- /dev/null
@@ -0,0 +1,4 @@
+#name: Invalid allocated section
+#as: --32
+#ld: -melf_i386 -T alloc.t
+#error: .*section `.foo' can't be allocated in segment 0.*
diff --git a/ld/testsuite/ld-i386/alloc.s b/ld/testsuite/ld-i386/alloc.s
new file mode 100644 (file)
index 0000000..8c4f8fa
--- /dev/null
@@ -0,0 +1,6 @@
+       .section .bar,"ax","progbits"
+       .byte 0
+       .section .foo,"aw","progbits"
+       .byte 0
+       .bss
+       .long 0
diff --git a/ld/testsuite/ld-i386/alloc.t b/ld/testsuite/ld-i386/alloc.t
new file mode 100644 (file)
index 0000000..ea7f48c
--- /dev/null
@@ -0,0 +1,13 @@
+OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
+OUTPUT_ARCH(i386)
+PHDRS {
+ text PT_LOAD FLAGS(5); /* R_E */
+}
+SECTIONS
+{
+  . = 0xC0000000 + ((0x100000 + (0x100000 - 1)) & ~(0x100000 - 1));
+  .bar : AT(ADDR(.bar) - 0xC0000000) { *(.bar) } :text
+  .bss : AT(ADDR(.bss) - 0xC0000000) { *(.bss) }
+  .foo 0 : AT(ADDR(.bss) + SIZEOF(.bss) - 0xC0000000) { *(.foo) } :text
+  /DISCARD/ : { *(.*) }
+}
index d0d4cad..f008829 100644 (file)
@@ -114,3 +114,4 @@ run_dump_test "abs"
 run_dump_test "pcrel8"
 run_dump_test "pcrel16"
 run_dump_test "pcrel16abs"
+run_dump_test "alloc"