Tidy elf_segment_map allocation
authorAlan Modra <amodra@gmail.com>
Fri, 5 Oct 2018 12:47:00 +0000 (22:17 +0930)
committerAlan Modra <amodra@gmail.com>
Mon, 8 Oct 2018 09:56:08 +0000 (20:26 +1030)
This cleans up elf_segment_map allocation when the section array is
empty.  "amt += (to - from - 1) * sizeof (asection *)", when "to" and
"from" are unsigned int results in an unsigned value inside the
parentheses.  When "to" and "from" are equal on a 64-bit host,
0xffffffff * 8 is added to "amt", not -8 as desired.

The patch also renames a variable for consistency with other functions
using a similar index.

* elf.c (make_mapping): Cope with zero size array at end of
struct elf_segment_map.
(_bfd_elf_map_sections_to_segments): Likewise.
(rewrite_elf_program_header, copy_elf_program_header): Likewise.
(_bfd_elf_map_sections_to_segments): Rename phdr_index to hdr_index.

bfd/ChangeLog
bfd/elf.c

index da2a4d2fb71b205501c0edaf932f8bcdb394fe2e..4e5eac1029bfb4583495bc50ce665704e81b6d67 100644 (file)
@@ -1,3 +1,11 @@
+2018-10-08  Alan Modra  <amodra@gmail.com>
+
+       * elf.c (make_mapping): Cope with zero size array at end of
+       struct elf_segment_map.
+       (_bfd_elf_map_sections_to_segments): Likewise.
+       (rewrite_elf_program_header, copy_elf_program_header): Likewise.
+       (_bfd_elf_map_sections_to_segments): Rename phdr_index to hdr_index.
+
 2018-10-05  Alan Modra  <amodra@gmail.com>
 
        * elf32-spu.c (spu_elf_create_sections): Make .note.spu_name
index 8850efe20e9ea5c9f59bac839cf453790594b6af..b3ce110893b351c8b4daabaf84dbac1780569bf8 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -4475,8 +4475,8 @@ make_mapping (bfd *abfd,
   asection **hdrpp;
   bfd_size_type amt;
 
-  amt = sizeof (struct elf_segment_map);
-  amt += (to - from - 1) * sizeof (asection *);
+  amt = sizeof (struct elf_segment_map) - sizeof (asection *);
+  amt += (to - from) * sizeof (asection *);
   m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
   if (m == NULL)
     return NULL;
@@ -4594,7 +4594,7 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
       struct elf_segment_map **pm;
       asection *last_hdr;
       bfd_vma last_size;
-      unsigned int phdr_index;
+      unsigned int hdr_index;
       bfd_vma maxpagesize;
       asection **hdrpp;
       bfd_boolean phdr_in_segment = TRUE;
@@ -4680,7 +4680,7 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
         a few bytes of the end of the first section.  */
       last_hdr = NULL;
       last_size = 0;
-      phdr_index = 0;
+      hdr_index = 0;
       maxpagesize = bed->maxpagesize;
       /* PR 17512: file: c8455299.
         Avoid divide-by-zero errors later on.
@@ -4834,9 +4834,9 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
            }
 
          /* We need a new program segment.  We must create a new program
-            header holding all the sections from phdr_index until hdr.  */
+            header holding all the sections from hdr_index until hdr.  */
 
-         m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
+         m = make_mapping (abfd, sections, hdr_index, i, phdr_in_segment);
          if (m == NULL)
            goto error_return;
 
@@ -4856,17 +4856,17 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
          last_hdr = hdr;
          /* .tbss sections effectively have zero size.  */
          last_size = !IS_TBSS (hdr) ? hdr->size : 0;
-         phdr_index = i;
+         hdr_index = i;
          phdr_in_segment = FALSE;
        }
 
       /* Create a final PT_LOAD program segment, but not if it's just
         for .tbss.  */
       if (last_hdr != NULL
-         && (i - phdr_index != 1
+         && (i - hdr_index != 1
              || !IS_TBSS (last_hdr)))
        {
-         m = make_mapping (abfd, sections, phdr_index, i, phdr_in_segment);
+         m = make_mapping (abfd, sections, hdr_index, i, phdr_in_segment);
          if (m == NULL)
            goto error_return;
 
@@ -4898,7 +4898,6 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
              unsigned int alignment_power = s->alignment_power;
 
              count = 1;
-             amt = sizeof (struct elf_segment_map);
              for (s2 = s; s2->next != NULL; s2 = s2->next)
                {
                  if (s2->next->alignment_power == alignment_power
@@ -4911,7 +4910,8 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
                  else
                    break;
                }
-             amt += (count - 1) * sizeof (asection *);
+             amt = sizeof (struct elf_segment_map) - sizeof (asection *);
+             amt += count * sizeof (asection *);
              m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
              if (m == NULL)
                goto error_return;
@@ -4943,8 +4943,8 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info)
       /* If there are any SHF_TLS output sections, add PT_TLS segment.  */
       if (tls_count > 0)
        {
-         amt = sizeof (struct elf_segment_map);
-         amt += (tls_count - 1) * sizeof (asection *);
+         amt = sizeof (struct elf_segment_map) - sizeof (asection *);
+         amt += tls_count * sizeof (asection *);
          m = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
          if (m == NULL)
            goto error_return;
@@ -6824,8 +6824,8 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
 
       /* Allocate a segment map big enough to contain
         all of the sections we have selected.  */
-      amt = sizeof (struct elf_segment_map);
-      amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
+      amt = sizeof (struct elf_segment_map) - sizeof (asection *);
+      amt += (bfd_size_type) section_count * sizeof (asection *);
       map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
       if (map == NULL)
        return FALSE;
@@ -7136,8 +7136,8 @@ rewrite_elf_program_header (bfd *ibfd, bfd *obfd)
              /* We still have not allocated all of the sections to
                 segments.  Create a new segment here, initialise it
                 and carry on looping.  */
-             amt = sizeof (struct elf_segment_map);
-             amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
+             amt = sizeof (struct elf_segment_map) - sizeof (asection *);
+             amt += (bfd_size_type) section_count * sizeof (asection *);
              map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
              if (map == NULL)
                {
@@ -7266,9 +7266,8 @@ copy_elf_program_header (bfd *ibfd, bfd *obfd)
 
       /* Allocate a segment map big enough to contain
         all of the sections we have selected.  */
-      amt = sizeof (struct elf_segment_map);
-      if (section_count != 0)
-       amt += ((bfd_size_type) section_count - 1) * sizeof (asection *);
+      amt = sizeof (struct elf_segment_map) - sizeof (asection *);
+      amt += (bfd_size_type) section_count * sizeof (asection *);
       map = (struct elf_segment_map *) bfd_zalloc (obfd, amt);
       if (map == NULL)
        return FALSE;