remove more xmalloc in bfd
authorAlan Modra <amodra@gmail.com>
Tue, 15 Oct 2019 05:27:35 +0000 (15:57 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 15 Oct 2019 06:20:32 +0000 (16:50 +1030)
Also fixes m68hc1x printf arguments which would have bombed when
compiling on a 32-bit host with --enable-64-bit-bfd.

bfd/
PR 24955
* elf32-arm.c (set_cmse_veneer_addr_from_implib): Use bfd_malloc
rather than xmalloc.
* elf32-m68hc1x.c (reloc_warning): New function.
(elf32_m68hc11_relocate_section): Use it here.  Cast bfd_vma values
corresponding to %lx in format strings.
* elf32-nds32.c (nds32_insertion_sort): Use a stack temporary.
gas/
* config/tc-nds32.c (nds32_set_section_relocs): Use relocs and n
parameters rather than equivalent sec->orelocation and
sec->reloc_count.  Don't sort for n <= 1.  Tidy.

bfd/ChangeLog
bfd/elf32-arm.c
bfd/elf32-m68hc1x.c
bfd/elf32-nds32.c
gas/ChangeLog
gas/config/tc-nds32.c

index 40ddfa14d5e01825b6b3ce5433ef57fa8ebf3d60..72fb5eea975f2d659aea85329cb607bbb7fb26e9 100644 (file)
@@ -1,3 +1,13 @@
+2019-10-15  Alan Modra  <amodra@gmail.com>
+
+       PR 24955
+       * elf32-arm.c (set_cmse_veneer_addr_from_implib): Use bfd_malloc
+       rather than xmalloc.
+       * elf32-m68hc1x.c (reloc_warning): New function.
+       (elf32_m68hc11_relocate_section): Use it here.  Cast bfd_vma values
+       corresponding to %lx in format strings.
+       * elf32-nds32.c (nds32_insertion_sort): Use a stack temporary.
+
 2019-10-15  Alan Modra  <amodra@gmail.com>
 
        PR 25100
index 9837350d0662073c24ca26141794fa4fd7692ce0..3aa7de8fee1867bf4378fae5ae6c0d37bfe4f282 100644 (file)
@@ -6255,7 +6255,10 @@ set_cmse_veneer_addr_from_implib (struct bfd_link_info *info,
     return FALSE;
 
   /* Read in the input secure gateway import library's symbol table.  */
-  sympp = (asymbol **) xmalloc (symsize);
+  sympp = (asymbol **) bfd_malloc (symsize);
+  if (sympp == NULL)
+    return FALSE;
+
   symcount = bfd_canonicalize_symtab (in_implib_bfd, sympp);
   if (symcount < 0)
     {
index 8739ca86c13a4810f0c1d22ea4938e5c6613f47d..915f3b7a9a286b3fbf9779206bcd9551533fc50d 100644 (file)
@@ -899,6 +899,29 @@ elf32_m68hc11_check_relocs (bfd *abfd, struct bfd_link_info *info,
   return TRUE;
 }
 
+static bfd_boolean
+reloc_warning (struct bfd_link_info *info, const char *name, bfd *input_bfd,
+              asection *input_section, const Elf_Internal_Rela *rel,
+              const char *fmt, ...)
+{
+  va_list ap;
+  char *buf;
+  int ret;
+
+  va_start (ap, fmt);
+  ret = vasprintf (&buf, fmt, ap);
+  va_end (ap);
+  if (ret < 0)
+    {
+      bfd_set_error (bfd_error_no_memory);
+      return FALSE;
+    }
+  info->callbacks->warning (info, buf, name, input_bfd, input_section,
+                           rel->r_offset);
+  free (buf);
+  return TRUE;
+}
+
 /* Relocate a 68hc11/68hc12 ELF section.  */
 bfd_boolean
 elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
@@ -951,8 +974,7 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
       bfd_boolean is_section_symbol = FALSE;
       struct elf_link_hash_entry *h;
       bfd_vma val;
-      const char * msg;
-      char * buf;
+      const char *msg;
 
       r_symndx = ELF32_R_SYM (rel->r_info);
       r_type = ELF32_R_TYPE (rel->r_info);
@@ -1108,17 +1130,13 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
          break;
 
        case R_M68HC11_16:
-         /* Get virtual address of instruction having the relocation.  */
          if (is_far)
            {
              msg = _("reference to the far symbol `%s' using a wrong "
                      "relocation may result in incorrect execution");
-             buf = xmalloc (strlen (msg) + strlen (name) + 10);
-             sprintf (buf, msg, name);
-
-             (*info->callbacks->warning)
-               (info, buf, name, input_bfd, NULL, rel->r_offset);
-             free (buf);
+             if (!reloc_warning (info, name, input_bfd, input_section, rel,
+                                 msg, name))
+               return FALSE;
            }
 
          /* Get virtual address of instruction having the relocation.  */
@@ -1149,30 +1167,28 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
                          "(0xE000-0xFFFF), therefore you must manually offset "
                          "the address, and possibly manage the page, in your "
                          "code.");
-                 buf = xmalloc (strlen (msg) + 128);
-                 sprintf (buf, msg, phys_addr);
-                 (*info->callbacks->warning) (info, buf, name, input_bfd,
-                                              input_section, insn_addr);
-                 free (buf);
+                 if (!reloc_warning (info, name, input_bfd, input_section, rel,
+                                     msg, (long) phys_addr))
+                   return FALSE;
                  break;
                }
            }
 
          if (m68hc11_addr_is_banked (pinfo, relocation + rel->r_addend)
              && m68hc11_addr_is_banked (pinfo, insn_addr)
-             && phys_page != insn_page && !(e_flags & E_M68HC11_NO_BANK_WARNING))
+             && phys_page != insn_page
+             && !(e_flags & E_M68HC11_NO_BANK_WARNING))
            {
              /* xgettext:c-format */
-             msg = _("banked address [%lx:%04lx] (%lx) is not in the same bank "
-                     "as current banked address [%lx:%04lx] (%lx)");
-             buf = xmalloc (strlen (msg) + 128);
-             sprintf (buf, msg, phys_page, phys_addr,
-                      (long) (relocation + rel->r_addend),
-                      insn_page, m68hc11_phys_addr (pinfo, insn_addr),
-                      (long) (insn_addr));
-             (*info->callbacks->warning) (info, buf, name, input_bfd,
-                                          input_section, rel->r_offset);
-             free (buf);
+             msg = _("banked address [%lx:%04lx] (%lx) is not in the same "
+                     "bank as current banked address [%lx:%04lx] (%lx)");
+             if (!reloc_warning (info, name, input_bfd, input_section, rel,
+                                 msg, (long) phys_page, (long) phys_addr,
+                                 (long) (relocation + rel->r_addend),
+                                 (long) insn_page,
+                                 (long) m68hc11_phys_addr (pinfo, insn_addr),
+                                 (long) insn_addr))
+               return FALSE;
              break;
            }
 
@@ -1181,11 +1197,10 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
              /* xgettext:c-format */
              msg = _("reference to a banked address [%lx:%04lx] in the "
                      "normal address space at %04lx");
-             buf = xmalloc (strlen (msg) + 128);
-             sprintf (buf, msg, phys_page, phys_addr, insn_addr);
-             (*info->callbacks->warning) (info, buf, name, input_bfd,
-                                          input_section, insn_addr);
-             free (buf);
+             if (!reloc_warning (info, name, input_bfd, input_section, rel,
+                                 msg, (long) phys_page, (long) phys_addr,
+                                 (long) insn_addr))
+               return FALSE;
              relocation = phys_addr;
              break;
            }
@@ -1216,18 +1231,12 @@ elf32_m68hc11_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
                relocation += 0xC000;
              else
                {
-                 /* Get virtual address of instruction having the relocation.  */
-                 insn_addr = input_section->output_section->vma
-                     + input_section->output_offset + rel->r_offset;
-
                  msg = _("S12 address (%lx) is not within shared RAM"
-                     "(0x2000-0x4000), therefore you must manually "
-                     "offset the address in your code");
-                 buf = xmalloc (strlen (msg) + 128);
-                 sprintf (buf, msg, phys_addr);
-                 (*info->callbacks->warning) (info, buf, name, input_bfd,
-                                              input_section, insn_addr);
-                 free (buf);
+                         "(0x2000-0x4000), therefore you must manually "
+                         "offset the address in your code");
+                 if (!reloc_warning (info, name, input_bfd, input_section, rel,
+                                     msg, (long) phys_addr))
+                   return FALSE;
                  break;
                }
            }
index 013355a490802f446e016dfe4f52f7731bf5f9b3..482fb290d14b5d154f5c311393f9d2ea4d7c11ee 100644 (file)
@@ -2526,7 +2526,9 @@ nds32_insertion_sort (void *base, size_t nmemb, size_t size,
 {
   char *ptr = (char *) base;
   int i, j;
-  char *tmp = xmalloc (size);
+  char tmp[sizeof (Elf_Internal_Rela)];
+
+  BFD_ASSERT (size <= sizeof (tmp));
 
   /* If i is less than j, i is inserted before j.
 
@@ -2550,7 +2552,6 @@ nds32_insertion_sort (void *base, size_t nmemb, size_t size,
       memmove (ptr + (j + 1) * size, ptr + j * size, (i - j) * size);
       memcpy (ptr + j * size, tmp, size);
     }
-  free (tmp);
 }
 
 /* Sort relocation by r_offset.
index 3a1183b3742332b2947ad6ee57b970ac05cd2024..33cc6ffc9aff1cb289277cc7b1367558746e258f 100644 (file)
@@ -1,3 +1,9 @@
+2019-10-15  Alan Modra  <amodra@gmail.com>
+
+       * config/tc-nds32.c (nds32_set_section_relocs): Use relocs and n
+       parameters rather than equivalent sec->orelocation and
+       sec->reloc_count.  Don't sort for n <= 1.  Tidy.
+
 2019-10-09  Nick Clifton  <nickc@redhat.com>
 
        PR 25041
index 36ed58a453814b5c56ce7523074fd9ec05bef38c..a75dd9ada9c89c3bc9ab89a5356db2d125f2a56c 100644 (file)
@@ -7565,13 +7565,13 @@ compar_relent (const void *lhs, const void *rhs)
    relocation.  */
 
 void
-nds32_set_section_relocs (asection *sec, arelent ** relocs ATTRIBUTE_UNUSED,
-                         unsigned int n ATTRIBUTE_UNUSED)
+nds32_set_section_relocs (asection *sec ATTRIBUTE_UNUSED,
+                         arelent **relocs, unsigned int n)
 {
-  bfd *abfd ATTRIBUTE_UNUSED = sec->owner;
-  if (bfd_section_flags (sec) & (flagword) SEC_RELOC)
-    nds32_insertion_sort (sec->orelocation, sec->reloc_count,
-                         sizeof (arelent**), compar_relent);
+  if (n <= 1)
+    return;
+
+  nds32_insertion_sort (relocs, n, sizeof (*relocs), compar_relent);
 }
 
 long
This page took 0.03616 seconds and 4 git commands to generate.