objcopy/strip ELF program header p_vaddr confusion
authorAlan Modra <amodra@gmail.com>
Wed, 12 Mar 2014 00:03:26 +0000 (10:33 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 12 Mar 2014 00:03:26 +0000 (10:33 +1030)
copy_elf_program_header has logic to reject non-alloc sections when
calculating p_vaddr offset for padding, but blithely assumed the
first section in a segment was allocated.

PR 16690
* elf.c (copy_elf_program_header): Ignore first section lma if
non-alloc.

bfd/ChangeLog
bfd/elf.c

index fd3135a886e453637e32ec4ebce9096bb5c78c90..c9887c35e6b359786e7bae39d21f94ddfea5b58e 100644 (file)
@@ -1,3 +1,9 @@
+2014-03-12  Alan Modra  <amodra@gmail.com>
+
+       PR 16690
+       * elf.c (copy_elf_program_header): Ignore first section lma if
+       non-alloc.
+
 2014-03-11  Alan Modra  <amodra@gmail.com>
 
        PR 16686
index ce7878c18ff2a80a1a5f389650936ec278a5cfe5..3ded683efe45035b58c0f1bce95c4da03f030c37 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -6259,7 +6259,7 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd)
            phdr_included = TRUE;
        }
 
-      lowest_section = first_section;
+      lowest_section = NULL;
       if (section_count != 0)
        {
          unsigned int isec = 0;
@@ -6276,7 +6276,8 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd)
                    {
                      bfd_vma seg_off;
 
-                     if (section->lma < lowest_section->lma)
+                     if (lowest_section == NULL
+                         || section->lma < lowest_section->lma)
                        lowest_section = section;
 
                      /* Section lmas are set up from PT_LOAD header