bfd/
authorNathan Sidwell <nathan@codesourcery.com>
Thu, 11 Jan 2007 12:23:53 +0000 (12:23 +0000)
committerNathan Sidwell <nathan@codesourcery.com>
Thu, 11 Jan 2007 12:23:53 +0000 (12:23 +0000)
* elf.c (assign_file_positions_for_load_sections): We can
require fewer phdrs than expected.
ld/
* emultempl/elf-generic.em (gdl_map_segments): Only allow header
shrinkage for the first few iterations.
ld/testsuite/
* ld-elf/header.d: New.
* ld-elf/header.t: New.
* ld-elf/header.s: New.

bfd/ChangeLog
bfd/elf.c
ld/ChangeLog
ld/emultempl/elf-generic.em
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/header.d [new file with mode: 0644]
ld/testsuite/ld-elf/header.s [new file with mode: 0644]
ld/testsuite/ld-elf/header.t [new file with mode: 0644]

index 0db2a5ec3403064fb433cd1e85cf392b3ae60a83..c3cc405b7a5ad01dc4676aba89f678bfc7870b96 100644 (file)
@@ -1,3 +1,8 @@
+2007-01-11  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * elf.c (assign_file_positions_for_load_sections): We can
+       require fewer phdrs than expected.
+
 2007-01-08  Kazu Hirata  <kazu@codesourcery.com>
 
        * archures.c (bfd_mach_cpu32_fido): Rename to bfd_mach_fido.
index c8fcbb560cb564de1dc79dd1e09389858d4a1750..faeb1459ad0eb9c297e020e9fcb242881df896bd 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4275,7 +4275,7 @@ assign_file_positions_for_load_sections (bfd *abfd,
     elf_tdata (abfd)->program_header_size = alloc * bed->s->sizeof_phdr;
   else
     BFD_ASSERT (elf_tdata (abfd)->program_header_size
-               == alloc * bed->s->sizeof_phdr);
+               >= alloc * bed->s->sizeof_phdr);
 
   if (alloc == 0)
     {
index b3de4e6c56e628e6a532baaf2f14e3cd479921d2..d5366ec50eb8cd1b61a4b3f0824f73c7f151911c 100644 (file)
@@ -1,3 +1,8 @@
+2007-01-11  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * emultempl/elf-generic.em (gdl_map_segments): Only allow header
+       shrinkage for the first few iterations.
+
 2007-01-08  Kai Tietz  <kai.tietz@onevision.com>
 
        * configure.tgt: Renamed target x86_64-*-mingw64 to
index dd0907ccf82c8bac9746281ed2416eb5870862f3..7edee8b68e20ab32e7b2b326709014f9ca49e167 100644 (file)
@@ -60,7 +60,17 @@ gld${EMULATION_NAME}_map_segments (bfd_boolean need_layout)
            einfo ("%F%P: map sections to segments failed: %E\n");
 
          if (phdr_size != elf_tdata (output_bfd)->program_header_size)
-           need_layout = TRUE;
+           {
+             if (tries > 6)
+               /* The first few times we allow any change to
+                  phdr_size .  */
+               need_layout = TRUE;
+             else if (phdr_size < elf_tdata (output_bfd)->program_header_size)
+               /* After that we only allow the size to grow.  */
+               need_layout = TRUE;
+             else
+               elf_tdata (output_bfd)->program_header_size = phdr_size;
+           }
        }
     }
   while (need_layout && --tries);
index 93c63d644efa01eb067d521828df0ba9e8e70777..4b709366a0049edd38f836fa32897c9a0bec5462 100644 (file)
@@ -1,3 +1,9 @@
+2007-01-11  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * ld-elf/header.d: New.
+       * ld-elf/header.t: New.
+       * ld-elf/header.s: New.
+
 2007-01-08  Kai Tietz  <kai.tietz@onevision.com>
 
        * ld-fastcall/fastcall.exp: Renamed target x86_64-*-mingw64 to
diff --git a/ld/testsuite/ld-elf/header.d b/ld/testsuite/ld-elf/header.d
new file mode 100644 (file)
index 0000000..bc4bed3
--- /dev/null
@@ -0,0 +1,12 @@
+# ld: -T header.t -z max-page-size=0x10000
+# objdump: -hpw
+
+#...
+Program Header:
+    LOAD off    0x0*0000000 vaddr 0x0*0010000 paddr 0x0*0010000 align 2..16
+         filesz 0x0*001002[48] memsz 0x0*001002[48] flags rwx
+
+Sections:
+Idx Name          Size      VMA       *LMA       *File off  Algn  Flags
+  0 .text         0*000ffac  0*001007[48]  0*001007[48]  0*000007[48]  2...  CONTENTS, ALLOC, LOAD, READONLY, CODE
+  1 .data         0*0000004  0*002002[04]  0*002002[04]  0*001002[04]  2...  CONTENTS, ALLOC, LOAD, DATA
diff --git a/ld/testsuite/ld-elf/header.s b/ld/testsuite/ld-elf/header.s
new file mode 100644 (file)
index 0000000..c47d3f1
--- /dev/null
@@ -0,0 +1,8 @@
+       .text
+       .globl main
+main:
+       .rept 0x4000 - 0x15
+       .long 0xfedcba98
+       .endr
+       .data
+       .long 0x76543210
diff --git a/ld/testsuite/ld-elf/header.t b/ld/testsuite/ld-elf/header.t
new file mode 100644 (file)
index 0000000..cc0317b
--- /dev/null
@@ -0,0 +1,8 @@
+ENTRY(main)
+
+SECTIONS
+{
+  . = 0x10000 + SIZEOF_HEADERS;
+  .text : { *(.text) }
+  .data : { *(.data) }
+}