aboutsummaryrefslogtreecommitdiff
path: root/bfd/aout-tic30.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2020-03-02 15:21:09 +1030
committerAlan Modra <amodra@gmail.com>2020-03-02 19:30:48 +1030
commitcb001c0d283dd884efe06770d033a50fb1bc6c7d (patch)
tree77155357075b8f3b0f45446b16af3ab4216dde0d /bfd/aout-tic30.c
parent2aa90762b71af7f04032d2bebed6470070d3d801 (diff)
downloadfsf-binutils-gdb-cb001c0d283dd884efe06770d033a50fb1bc6c7d.zip
fsf-binutils-gdb-cb001c0d283dd884efe06770d033a50fb1bc6c7d.tar.gz
fsf-binutils-gdb-cb001c0d283dd884efe06770d033a50fb1bc6c7d.tar.bz2
bfd_cleanup for object_p
The object_p (and archive_p, core_file_p) functions are not supposed to have any target specific malloc'd memory attached to the bfd on their return. This should be obvious on a failure return, but it's also true for a successful return. The reason is that even though the object_p recognises the file, that particular target may not be used and thus the bfd won't be closed calling close_and_cleanup for the target that allocated the memory. It turns out that the object_p bfd_target* return value isn't needed. In all cases except ld/plugin.c the target is abfd->xvec and with ld/plugin.c the target isn't used. So this patch returns a cleanup function from object_p instead, called in bfd_check_format_matches to tidy the bfd before trying a different target match. The only cleanup that does anything at this stage is the alpha-vms one. bfd/ * targets.c (bfd_cleanup): New typedef. (struct bfd <_bfd_check_format>): Return a bfd_cleanup. * libbfd-in.h (_bfd_no_cleanup): Define. * format.c (bfd_reinit): Add cleanup parameter, call it. (bfd_check_format_matches): Set cleanup from _bfd_check_format call and pass to bfd_reinit. Delete temp, use abfd->xvec instead. * aout-target.h (callback, object_p): Return bfd_cleanup. * aout-tic30.c (tic30_aout_callback, tic30_aout_object_p): Likewise. * archive.c (bfd_generic_archive_p): Likewise. * binary.c (binary_object_p): Likewise. * coff-alpha.c (alpha_ecoff_object_p): Likewise. * coff-ia64.c (ia64coff_object_p): Likewise. * coff-rs6000.c (_bfd_xcoff_archive_p, rs6000coff_core_p): Likewise. * coff-sh.c (coff_small_object_p): Likewise. * coff-stgo32.c (go32_check_format): Likewise. * coff64-rs6000.c (xcoff64_archive_p, rs6000coff_core_p), (xcoff64_core_p): Likewise. * coffgen.c (coff_real_object_p, coff_object_p): Likewise. * elf-bfd.h (bfd_elf32_object_p, bfd_elf32_core_file_p), (bfd_elf64_object_p, bfd_elf64_core_file_p): Likewise. * elfcode.h (elf_object_p): Likewise. * elfcore.h (elf_core_file_p): Likewise. * i386msdos.c (msdos_object_p): Likewise. * ihex.c (ihex_object_p): Likewise. * libaout.h (some_aout_object_p): Likewise. * libbfd-in.h (bfd_generic_archive_p, _bfd_dummy_target), (_bfd_vms_lib_alpha_archive_p, _bfd_vms_lib_ia64_archive_p): Likewise. * libbfd.c (_bfd_dummy_target): Likewise. * libcoff-in.h (coff_object_p): Likewise. * mach-o-aarch64.c (bfd_mach_o_arm64_object_p), (bfd_mach_o_arm64_core_p): Likewise. * mach-o-arm.c (bfd_mach_o_arm_object_p), (bfd_mach_o_arm_core_p): Likewise. * mach-o-i386.c (bfd_mach_o_i386_object_p), (bfd_mach_o_i386_core_p): Likewise. * mach-o-x86-64.c (bfd_mach_o_x86_64_object_p), (bfd_mach_o_x86_64_core_p): Likewise. * mach-o.c (bfd_mach_o_header_p, bfd_mach_o_gen_object_p), (bfd_mach_o_gen_core_p, bfd_mach_o_fat_archive_p): Likewise. * mach-o.h (bfd_mach_o_object_p, bfd_mach_o_core_p), (bfd_mach_o_fat_archive_p, bfd_mach_o_header_p): Likewise. * mmo.c (mmo_object_p): Likewise. * pef.c (bfd_pef_object_p, bfd_pef_xlib_object_p): Likewise. * peicode.h (coff_real_object_p, pe_ILF_object_p), (pe_bfd_object_p): Likewise. * plugin.c (ld_plugin_object_p, bfd_plugin_object_p): Likewise. * ppcboot.c (ppcboot_object_p): Likewise. * rs6000-core.c (rs6000coff_core_p): Likewise. * som.c (som_object_setup, som_object_p): Likewise. * srec.c (srec_object_p, symbolsrec_object_p): Likewise. * tekhex.c (tekhex_object_p): Likewise. * vms-alpha.c (alpha_vms_object_p): Likewise. * vms-lib.c (_bfd_vms_lib_archive_p, _bfd_vms_lib_alpha_archive_p), (_bfd_vms_lib_ia64_archive_p, _bfd_vms_lib_txt_archive_p): Likewise. * wasm-module.c (wasm_object_p): Likewise. * xsym.c (bfd_sym_object_p): Likewise. * xsym.h (bfd_sym_object_p): Likewise. * aoutx.h (some_aout_object_p): Likewise, and callback parameter return type. * pdp11.c (some_aout_object_p): Likewise. * plugin.c (register_ld_plugin_object_p): Update object_p parameter type. * plugin.h (register_ld_plugin_object_p): Likewise. * bfd-in2.h: Regenerate. * libbfd.h: Regenerate. * libcoff.h: Regenerate. ld/ * plugin.c (plugin_object_p): Return a bfd_cleanup. (plugin_cleanup): New function.
Diffstat (limited to 'bfd/aout-tic30.c')
-rw-r--r--bfd/aout-tic30.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/bfd/aout-tic30.c b/bfd/aout-tic30.c
index 06f401c..222d1f0 100644
--- a/bfd/aout-tic30.c
+++ b/bfd/aout-tic30.c
@@ -331,7 +331,7 @@ tic30_aout_reloc_howto (bfd *abfd,
/* Set parameters about this a.out file that are machine-dependent.
This routine is called from some_aout_object_p just before it returns. */
-static const bfd_target *
+static bfd_cleanup
tic30_aout_callback (bfd *abfd)
{
struct internal_exec *execp = exec_hdr (abfd);
@@ -388,7 +388,7 @@ tic30_aout_callback (bfd *abfd)
obj_datasec (abfd)->alignment_power = arch_align_power;
obj_bsssec (abfd)->alignment_power = arch_align_power;
}
- return abfd->xvec;
+ return _bfd_no_cleanup;
}
static bfd_reloc_status_type
@@ -547,12 +547,12 @@ tic30_aout_final_link_relocate (reloc_howto_type *howto,
/* Finish up the reading of an a.out file header. */
-static const bfd_target *
+static bfd_cleanup
tic30_aout_object_p (bfd *abfd)
{
struct external_exec exec_bytes; /* Raw exec header from file. */
struct internal_exec exec; /* Cleaned-up exec header. */
- const bfd_target *target;
+ bfd_cleanup cleanup;
size_t amt = EXEC_BYTES_SIZE;
if (bfd_bread (& exec_bytes, amt, abfd) != amt)
@@ -582,7 +582,7 @@ tic30_aout_object_p (bfd *abfd)
exec.a_info = SWAP_MAGIC (exec_bytes.e_info);
#endif
- target = NAME (aout, some_aout_object_p) (abfd, &exec, tic30_aout_callback);
+ cleanup = NAME (aout, some_aout_object_p) (abfd, &exec, tic30_aout_callback);
#ifdef ENTRY_CAN_BE_ZERO
/* The NEWSOS3 entry-point is/was 0, which (amongst other lossage)
@@ -603,7 +603,7 @@ tic30_aout_object_p (bfd *abfd)
}
#endif
- return target;
+ return cleanup;
}
/* Copy private section data. This actually does nothing with the