aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/elf32-arm.c5
-rw-r--r--bfd/elf32-m68hc1x.c91
-rw-r--r--bfd/elf32-nds32.c5
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/config/tc-nds32.c12
6 files changed, 79 insertions, 50 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 40ddfa1..72fb5ee 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,5 +1,15 @@
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
* elf64-ppc.c (sfpr_define): Delete dead code that triggered a warning.
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c
index 9837350..3aa7de8 100644
--- a/bfd/elf32-arm.c
+++ b/bfd/elf32-arm.c
@@ -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)
{
diff --git a/bfd/elf32-m68hc1x.c b/bfd/elf32-m68hc1x.c
index 8739ca8..915f3b7 100644
--- a/bfd/elf32-m68hc1x.c
+++ b/bfd/elf32-m68hc1x.c
@@ -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;
}
}
diff --git a/bfd/elf32-nds32.c b/bfd/elf32-nds32.c
index 013355a..482fb29 100644
--- a/bfd/elf32-nds32.c
+++ b/bfd/elf32-nds32.c
@@ -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.
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 3a1183b..33cc6ff 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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
diff --git a/gas/config/tc-nds32.c b/gas/config/tc-nds32.c
index 36ed58a..a75dd9a 100644
--- a/gas/config/tc-nds32.c
+++ b/gas/config/tc-nds32.c
@@ -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