From e5034e59e04c90d3a0b6c78af0cbfd3f73eb7809 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 27 Aug 2013 01:06:43 +0000 Subject: * elf-bfd.h (struct elf_backend_data): Remove as_needed_cleanup. Add notice_as_needed. * elf64-ppc.c (elf_backend_as_needed_cleanup): Don't define. (elf_backend_notice_as_needed): Define. (ppc64_elf_as_needed_cleanup): Rename and adjust.. (ppc64_elf_notice_as_needed): ..to this. * elflink.c (_bfd_elf_notice_as_needed): New function, extracted.. (elf_link_add_object_symbols): ..from here. * elfxx-target.h (elf_backend_as_needed_cleanup): Don't define. (elf_backend_notice_as_needed): Define.. (elfNN_bed): ..and use here. --- bfd/ChangeLog | 14 ++++++++++++++ bfd/elf-bfd.h | 14 ++++++++------ bfd/elf64-ppc.c | 20 ++++++++++++-------- bfd/elflink.c | 23 +++++++++++++++-------- bfd/elfxx-target.h | 6 +++--- 5 files changed, 52 insertions(+), 25 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 815503bc0d..a73dd953ac 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2013-08-27 Alan Modra + + * elf-bfd.h (struct elf_backend_data): Remove as_needed_cleanup. + Add notice_as_needed. + * elf64-ppc.c (elf_backend_as_needed_cleanup): Don't define. + (elf_backend_notice_as_needed): Define. + (ppc64_elf_as_needed_cleanup): Rename and adjust.. + (ppc64_elf_notice_as_needed): ..to this. + * elflink.c (_bfd_elf_notice_as_needed): New function, extracted.. + (elf_link_add_object_symbols): ..from here. + * elfxx-target.h (elf_backend_as_needed_cleanup): Don't define. + (elf_backend_notice_as_needed): Define.. + (elfNN_bed): ..and use here. + 2013-08-26 Roland McGrath * archures.c (bfd_mach_i386_nacl, bfd_mach_i386_i386_nacl): New macros. diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 4a67d02198..add80b3c04 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -881,12 +881,12 @@ struct elf_backend_data bfd_boolean (*check_directives) (bfd *abfd, struct bfd_link_info *info); - /* The AS_NEEDED_CLEANUP function is called once per --as-needed - input file that was not needed by the add_symbols phase of the - ELF backend linker. The function must undo any target specific - changes in the symbol hash table. */ - bfd_boolean (*as_needed_cleanup) - (bfd *abfd, struct bfd_link_info *info); + /* The NOTICE_AS_NEEDED function is called as the linker is about to + handle an as-needed lib (ACT = notice_as_needed), and after the + linker has decided to keep the lib (ACT = notice_needed) or when + the lib is not needed (ACT = notice_not_needed). */ + bfd_boolean (*notice_as_needed) + (bfd *abfd, struct bfd_link_info *info, enum notice_asneeded_action act); /* The ADJUST_DYNAMIC_SYMBOL function is called by the ELF backend linker for every symbol which is defined by a dynamic object and @@ -2139,6 +2139,8 @@ extern bfd_boolean _bfd_elf_default_relocs_compatible extern bfd_boolean _bfd_elf_relocs_compatible (const bfd_target *, const bfd_target *); +extern bfd_boolean _bfd_elf_notice_as_needed + (bfd *, struct bfd_link_info *, enum notice_asneeded_action); extern struct elf_link_hash_entry *_bfd_elf_archive_symbol_lookup (bfd *, struct bfd_link_info *, const char *); diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 349f9b3fd4..3df01f64f8 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -96,7 +96,7 @@ static bfd_vma opd_entry_value #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol #define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook #define elf_backend_check_directives ppc64_elf_process_dot_syms -#define elf_backend_as_needed_cleanup ppc64_elf_as_needed_cleanup +#define elf_backend_notice_as_needed ppc64_elf_notice_as_needed #define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup #define elf_backend_check_relocs ppc64_elf_check_relocs #define elf_backend_gc_keep ppc64_elf_gc_keep @@ -4806,16 +4806,20 @@ ppc64_elf_process_dot_syms (bfd *ibfd, struct bfd_link_info *info) not to be needed. */ static bfd_boolean -ppc64_elf_as_needed_cleanup (bfd *ibfd ATTRIBUTE_UNUSED, - struct bfd_link_info *info) +ppc64_elf_notice_as_needed (bfd *ibfd, + struct bfd_link_info *info, + enum notice_asneeded_action act) { - struct ppc_link_hash_table *htab = ppc_hash_table (info); + if (act == notice_not_needed) + { + struct ppc_link_hash_table *htab = ppc_hash_table (info); - if (htab == NULL) - return FALSE; + if (htab == NULL) + return FALSE; - htab->dot_syms = NULL; - return TRUE; + htab->dot_syms = NULL; + } + return _bfd_elf_notice_as_needed (ibfd, info, act); } /* If --just-symbols against a final linked binary, then assume we need diff --git a/bfd/elflink.c b/bfd/elflink.c index c22f7e8ad6..99b7ca1c22 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -3309,6 +3309,18 @@ _bfd_elf_relocs_compatible (const bfd_target *input, return ibed->relocs_compatible == obed->relocs_compatible; } +/* Make a special call to the linker "notice" function to tell it that + we are about to handle an as-needed lib, or have finished + processing the lib. */ + +bfd_boolean +_bfd_elf_notice_as_needed (bfd *ibfd, + struct bfd_link_info *info, + enum notice_asneeded_action act) +{ + return (*info->callbacks->notice) (info, NULL, ibfd, NULL, act, 0, NULL); +} + /* Add symbols from an ELF object file to the linker hash table. */ static bfd_boolean @@ -3766,8 +3778,7 @@ error_free_dyn: /* Make a special call to the linker "notice" function to tell it that we are about to handle an as-needed lib. */ - if (!(*info->callbacks->notice) (info, NULL, abfd, NULL, - notice_as_needed, 0, NULL)) + if (!(*bed->notice_as_needed) (abfd, info, notice_as_needed)) goto error_free_vers; /* Clone the symbol table. Remember some pointers into the @@ -4461,8 +4472,6 @@ error_free_dyn: unsigned int i; /* Restore the symbol table. */ - if (bed->as_needed_cleanup) - (*bed->as_needed_cleanup) (abfd, info); old_ent = (char *) old_tab + tabsize; memset (elf_sym_hashes (abfd), 0, extsymcount * sizeof (struct elf_link_hash_entry *)); @@ -4524,8 +4533,7 @@ error_free_dyn: /* Make a special call to the linker "notice" function to tell it that symbols added for crefs may need to be removed. */ - if (!(*info->callbacks->notice) (info, NULL, abfd, NULL, - notice_not_needed, 0, NULL)) + if (!(*bed->notice_as_needed) (abfd, info, notice_not_needed)) goto error_free_vers; free (old_tab); @@ -4538,8 +4546,7 @@ error_free_dyn: if (old_tab != NULL) { - if (!(*info->callbacks->notice) (info, NULL, abfd, NULL, - notice_needed, 0, NULL)) + if (!(*bed->notice_as_needed) (abfd, info, notice_needed)) goto error_free_vers; free (old_tab); old_tab = NULL; diff --git a/bfd/elfxx-target.h b/bfd/elfxx-target.h index 86c9b1bad4..d42ce26fdd 100644 --- a/bfd/elfxx-target.h +++ b/bfd/elfxx-target.h @@ -424,8 +424,8 @@ #ifndef elf_backend_check_directives #define elf_backend_check_directives 0 #endif -#ifndef elf_backend_as_needed_cleanup -#define elf_backend_as_needed_cleanup 0 +#ifndef elf_backend_notice_as_needed +#define elf_backend_notice_as_needed _bfd_elf_notice_as_needed #endif #ifndef elf_backend_adjust_dynamic_symbol #define elf_backend_adjust_dynamic_symbol 0 @@ -705,7 +705,7 @@ static struct elf_backend_data elfNN_bed = elf_backend_relocs_compatible, elf_backend_check_relocs, elf_backend_check_directives, - elf_backend_as_needed_cleanup, + elf_backend_notice_as_needed, elf_backend_adjust_dynamic_symbol, elf_backend_always_size_sections, elf_backend_size_dynamic_sections, -- cgit v1.2.1