Set no file contents PT_LOAD p_offset to first page
authorAlan Modra <amodra@gmail.com>
Fri, 13 Dec 2019 05:44:57 +0000 (16:14 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 13 Dec 2019 10:53:15 +0000 (21:23 +1030)
PR 25237
* elf.c (assign_file_positions_for_load_sections): Attempt to
keep meaningless p_offset for PT_LOAD segments without file
contents within file size.

bfd/ChangeLog
bfd/elf.c

index 7c3cf2906fceeafe3e0354e3d254848e1e7cf940..f1a707d37336c7242362d6271fa92204cdf32ce7 100644 (file)
@@ -1,3 +1,10 @@
+2019-12-13  Alan Modra  <amodra@gmail.com>
+
+       PR 25237
+       * elf.c: (assign_file_positions_for_load_sections): Attempt to
+       keep meaningless p_offset for PT_LOAD segments without file
+       contents within file size.
+
 2019-12-12  Alan Modra  <amodra@gmail.com>
 
        * libbfd.c (bfd_get): Don't cast result of bfd_get_8.
index 1aa2603ee8ce010377c7db66dd81118cc1dda28c..fd447fdb281e5de1cd3cbb5917a57ac80ffd1f0e 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -5752,7 +5752,15 @@ assign_file_positions_for_load_sections (bfd *abfd,
          || (p->p_type == PT_NOTE && bfd_get_format (abfd) == bfd_core))
        {
          if (!m->includes_filehdr && !m->includes_phdrs)
-           p->p_offset = off;
+           {
+             p->p_offset = off;
+             if (no_contents)
+               /* Put meaningless p_offset for PT_LOAD segments
+                  without file contents somewhere within the first
+                  page, in an attempt to not point past EOF.  */
+               p->p_offset = off % (p->p_align > maxpagesize
+                                    ? p->p_align : maxpagesize);
+           }
          else
            {
              file_ptr adjust;