aboutsummaryrefslogtreecommitdiff
path: root/binutils
diff options
context:
space:
mode:
Diffstat (limited to 'binutils')
-rw-r--r--binutils/bucomm.c13
-rw-r--r--binutils/bucomm.h2
-rw-r--r--binutils/objcopy.c37
3 files changed, 28 insertions, 24 deletions
diff --git a/binutils/bucomm.c b/binutils/bucomm.c
index 4395cb9..5834190 100644
--- a/binutils/bucomm.c
+++ b/binutils/bucomm.c
@@ -142,6 +142,19 @@ non_fatal (const char *format, ...)
va_end (args);
}
+/* Like xmalloc except that ABFD's objalloc memory is returned.
+ Use objalloc_free_block to free this memory and all more recently
+ allocated, or more usually, leave it to bfd_close to free. */
+
+void *
+bfd_xalloc (bfd *abfd, size_t size)
+{
+ void *ret = bfd_alloc (abfd, size);
+ if (ret == NULL)
+ bfd_fatal (NULL);
+ return ret;
+}
+
/* Set the default BFD target based on the configured target. Doing
this permits the binutils to be configured for a particular target,
and linked against a shared BFD library which was configured for a
diff --git a/binutils/bucomm.h b/binutils/bucomm.h
index 48b2c50..a1814cb 100644
--- a/binutils/bucomm.h
+++ b/binutils/bucomm.h
@@ -39,6 +39,8 @@ void fatal (const char *, ...) ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
void non_fatal (const char *, ...) ATTRIBUTE_PRINTF_1;
+void *bfd_xalloc (bfd *, size_t);
+
void set_default_bfd_target (void);
void list_matching_formats (char **);
diff --git a/binutils/objcopy.c b/binutils/objcopy.c
index df87712..3743573 100644
--- a/binutils/objcopy.c
+++ b/binutils/objcopy.c
@@ -4336,14 +4336,13 @@ copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
}
else
{
- relpp = (arelent **) xmalloc (relsize);
+ relpp = bfd_xalloc (obfd, relsize);
relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
if (relcount < 0)
{
status = 1;
bfd_nonfatal_message (NULL, ibfd, isection,
_("relocation count is negative"));
- free (relpp);
return;
}
}
@@ -4352,34 +4351,24 @@ copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
{
/* Remove relocations which are not in
keep_strip_specific_list. */
- arelent **temp_relpp;
- long temp_relcount = 0;
+ arelent **w_relpp;
long i;
- temp_relpp = (arelent **) xmalloc (relsize);
- for (i = 0; i < relcount; i++)
- {
- /* PR 17512: file: 9e907e0c. */
- if (relpp[i]->sym_ptr_ptr
- /* PR 20096 */
- && * relpp[i]->sym_ptr_ptr)
- if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
- keep_specific_htab))
- temp_relpp [temp_relcount++] = relpp [i];
- }
- relcount = temp_relcount;
- if (relpp != isection->orelocation)
- free (relpp);
- relpp = temp_relpp;
+ for (w_relpp = relpp, i = 0; i < relcount; i++)
+ /* PR 17512: file: 9e907e0c. */
+ if (relpp[i]->sym_ptr_ptr
+ /* PR 20096 */
+ && *relpp[i]->sym_ptr_ptr
+ && is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
+ keep_specific_htab))
+ *w_relpp++ = relpp[i];
+ relcount = w_relpp - relpp;
+ *w_relpp = 0;
}
bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
if (relcount == 0)
- {
- osection->flags &= ~SEC_RELOC;
- if (relpp != isection->orelocation)
- free (relpp);
- }
+ osection->flags &= ~SEC_RELOC;
}
}