aboutsummaryrefslogtreecommitdiff
path: root/bfd/libbfd-in.h
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2018-06-28 08:02:42 -0600
committerTom Tromey <tom@tromey.com>2018-07-02 08:24:32 -0600
commiteac61af65bcd24a48633da375527eb3f36ab47ed (patch)
treecb3dd22ee041e9f253a12838b1802c73df14cd0a /bfd/libbfd-in.h
parent41823f29a811bb250ae274652281a6294fdc2530 (diff)
downloadgdb-eac61af65bcd24a48633da375527eb3f36ab47ed.zip
gdb-eac61af65bcd24a48633da375527eb3f36ab47ed.tar.gz
gdb-eac61af65bcd24a48633da375527eb3f36ab47ed.tar.bz2
Allow BFD to recognize macOS universal libraries
Bug #13157 is about a gdb regression, where previously it could handle universal libraries, but now cannot. gdb isn't working for me on macOS for other reasons, so I wrote this small test program to show the problem: #include <config.h> #include <stdio.h> #include <stdlib.h> #include <bfd.h> void die (const char *what) { fprintf (stderr, "die: %s\n", what); exit (1); } int main (int argc, char **argv) { bfd *file = bfd_openr (argv[1], NULL); if (file == NULL) die ("couldn't open"); if (!bfd_check_format (file, bfd_archive)) die ("not an archive"); printf ("yay\n"); bfd_close (file); return 0; } Then I built a simple universal binary. With git master BFD, I get: $ ./doit ./universal-exe die: not an archive Jeff Muizelaar tracked this down to the BFD change for PR binutils/21787. This patch changed bfd_generic_archive_p to sometimes reset the BFD's "format" field. However, simply changing bfd_generic_archive_p regressed the test case in that bug. Debugging PR binutils/21787 again, what I saw is that the mach-o universal binary support acts like a bfd_archive but does not provide a _close_and_cleanup function. However, if a BFD appears as an archive member, it must always remove its own entry from its parent's map. Otherwise, when the parent is destroyed, the already-destroyed child BFD will be referenced. mach-o does not use the usual archive member support, so simply using _bfd_archive_close_and_cleanup (as other targets do) will not work. This patch fixes the problem by introducing a new _bfd_unlink_from_archive_parent function, then arranging for it to be called in the mach-o case. Ok? bfd/ChangeLog 2018-07-02 Jeff Muizelaar <jrmuizel@gmail.com> Tom Tromey <tom@tromey.com> PR 13157 PR 21787 * mach-o.c (bfd_mach_o_fat_close_and_cleanup): New function. (bfd_mach_o_close_and_cleanup): Redefine. * archive.c (_bfd_unlink_from_archive_parent): New function, extracted from.. (_bfd_archive_close_and_cleanup): ..here. (bfd_generic_archive_p): Do not clear archive's format. * libbfd-in.h (_bfd_unlink_from_archive_parent): Declare. * libbfd.h: Regenerate.
Diffstat (limited to 'bfd/libbfd-in.h')
-rw-r--r--bfd/libbfd-in.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h
index 3c55adf..e53b255 100644
--- a/bfd/libbfd-in.h
+++ b/bfd/libbfd-in.h
@@ -277,6 +277,7 @@ extern int bfd_generic_stat_arch_elt
#define _bfd_generic_close_and_cleanup _bfd_archive_close_and_cleanup
extern bfd_boolean _bfd_archive_close_and_cleanup
(bfd *) ATTRIBUTE_HIDDEN;
+extern void _bfd_unlink_from_archive_parent (bfd *) ATTRIBUTE_HIDDEN;
#define _bfd_generic_bfd_free_cached_info _bfd_bool_bfd_true
extern bfd_boolean _bfd_generic_new_section_hook
(bfd *, asection *) ATTRIBUTE_HIDDEN;