Automatic date update in version.in
[deliverable/binutils-gdb.git] / bfd / merge.c
index ad8db83ef624f2ebdc4134840bd3b2557f134160..790455294276b0e82e8234b2098290d00d036bb3 100644 (file)
@@ -1,5 +1,5 @@
 /* SEC_MERGE support.
-   Copyright (C) 2001-2017 Free Software Foundation, Inc.
+   Copyright (C) 2001-2018 Free Software Foundation, Inc.
    Written by Jakub Jelinek <jakub@redhat.com>.
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -109,7 +109,7 @@ sec_merge_hash_newfunc (struct bfd_hash_entry *entry,
      subclass.  */
   if (entry == NULL)
     entry = (struct bfd_hash_entry *)
-        bfd_hash_allocate (table, sizeof (struct sec_merge_hash_entry));
+       bfd_hash_allocate (table, sizeof (struct sec_merge_hash_entry));
   if (entry == NULL)
     return NULL;
 
@@ -292,13 +292,15 @@ sec_merge_emit (bfd *abfd, struct sec_merge_hash_entry *entry,
   char *pad = NULL;
   bfd_size_type off = 0;
   int alignment_power = sec->output_section->alignment_power;
+  bfd_size_type pad_len;
 
-  if (alignment_power)
-    {
-      pad = (char *) bfd_zmalloc ((bfd_size_type) 1 << alignment_power);
-      if (pad == NULL)
-       return FALSE;
-    }
+  /* FIXME: If alignment_power is 0 then really we should scan the
+     entry list for the largest required alignment and use that.  */
+  pad_len = alignment_power ? ((bfd_size_type) 1 << alignment_power) : 16;
+
+  pad = (char *) bfd_zmalloc (pad_len);
+  if (pad == NULL)
+    return FALSE;
 
   for (; entry != NULL && entry->secinfo == secinfo; entry = entry->next)
     {
@@ -308,6 +310,7 @@ sec_merge_emit (bfd *abfd, struct sec_merge_hash_entry *entry,
       len = -off & (entry->alignment - 1);
       if (len != 0)
        {
+         BFD_ASSERT (len <= pad_len);
          if (contents)
            {
              memcpy (contents + offset, pad, len);
@@ -336,19 +339,18 @@ sec_merge_emit (bfd *abfd, struct sec_merge_hash_entry *entry,
   off = sec->size - off;
   if (off != 0)
     {
+      BFD_ASSERT (off <= pad_len);
       if (contents)
        memcpy (contents + offset, pad, off);
       else if (bfd_bwrite (pad, off, abfd) != off)
        goto err;
     }
 
-  if (pad != NULL)
-    free (pad);
+  free (pad);
   return TRUE;
 
  err:
-  if (pad != NULL)
-    free (pad);
+  free (pad);
   return FALSE;
 }
 
@@ -408,7 +410,7 @@ _bfd_add_merge_section (bfd *abfd, void **psinfo, asection *sec,
     {
       /* Initialize the information we need to keep track of.  */
       sinfo = (struct sec_merge_info *)
-          bfd_alloc (abfd, sizeof (struct sec_merge_info));
+         bfd_alloc (abfd, sizeof (struct sec_merge_info));
       if (sinfo == NULL)
        goto error_return;
       sinfo->next = (struct sec_merge_info *) *psinfo;
@@ -863,8 +865,8 @@ _bfd_merged_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED, asection **psec,
       if (offset > sec->rawsize)
        _bfd_error_handler
          /* xgettext:c-format */
-         (_("%B: access beyond end of merged section (%Ld)"),
-          sec->owner, offset);
+         (_("%pB: access beyond end of merged section (%" PRId64 ")"),
+          sec->owner, (int64_t) offset);
       return secinfo->first_str ? sec->size : 0;
     }
 
This page took 0.028468 seconds and 4 git commands to generate.