diff options
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/bucomm.c | 13 | ||||
-rw-r--r-- | binutils/bucomm.h | 2 | ||||
-rw-r--r-- | binutils/objcopy.c | 37 |
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; } } |