From 0e144ba71eacb7e00bff43fc66b707bd7f029c44 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 13 Dec 2010 01:06:16 +0000 Subject: [PATCH] * aoutx.h (aout_link_check_ar_symbols): Formatting. * cofflink.c (coff_link_check_ar_symbols): Likewise. * elflink.c (elf_link_add_archive_symbols): Likewise. * pdp11.c (aout_link_check_ar_symbols): Likewise. * xcofflink.c (xcoff_link_check_dynamic_ar_symbols, xcoff_link_check_dynamic_ar_symbols): Likewise. * aoutx.h (aout_link_check_archive_element): Simplify code dealing with add_archive_element substitute BFD. * cofflink.c (coff_link_check_archive_element): Likewise. * ecoff.c (ecoff_link_check_archive_element): Likewise. (ecoff_link_add_archive_symbols): Likewise. * linker.c (generic_link_check_archive_element): Likewise. * pdp11.c (aout_link_check_archive_element): Likewise. * vms-alpha.c (alpha_vms_link_add_archive_symbols): Likewise. * xcofflink.c (xcoff_link_check_archive_element): Likewise. * aoutx.h (aout_link_check_archive_element): Free symbols from old bfd if !keep_memory. * cofflink.c (coff_link_check_archive_element): Likewise. * pdp11.c (aout_link_check_archive_element): Likewise. * xcofflink.c (xcoff_link_check_archive_element): Likewise. --- bfd/ChangeLog | 25 +++++++++++++++++++++++++ bfd/aoutx.h | 43 ++++++++++++++++++++++++++----------------- bfd/cofflink.c | 47 ++++++++++++++++++++++++++++------------------- bfd/ecoff.c | 25 ++++++++++--------------- bfd/elflink.c | 6 +++--- bfd/linker.c | 22 ++++++++++------------ bfd/pdp11.c | 35 ++++++++++++++++++++++------------- bfd/vms-alpha.c | 11 +++-------- bfd/xcofflink.c | 30 +++++++++++++++++++----------- 9 files changed, 146 insertions(+), 98 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 5bcf80894b..8e1246178b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,28 @@ +2010-12-13 Alan Modra + + * aoutx.h (aout_link_check_ar_symbols): Formatting. + * cofflink.c (coff_link_check_ar_symbols): Likewise. + * elflink.c (elf_link_add_archive_symbols): Likewise. + * pdp11.c (aout_link_check_ar_symbols): Likewise. + * xcofflink.c (xcoff_link_check_dynamic_ar_symbols, + xcoff_link_check_dynamic_ar_symbols): Likewise. + + * aoutx.h (aout_link_check_archive_element): Simplify code dealing + with add_archive_element substitute BFD. + * cofflink.c (coff_link_check_archive_element): Likewise. + * ecoff.c (ecoff_link_check_archive_element): Likewise. + (ecoff_link_add_archive_symbols): Likewise. + * linker.c (generic_link_check_archive_element): Likewise. + * pdp11.c (aout_link_check_archive_element): Likewise. + * vms-alpha.c (alpha_vms_link_add_archive_symbols): Likewise. + * xcofflink.c (xcoff_link_check_archive_element): Likewise. + + * aoutx.h (aout_link_check_archive_element): Free symbols from old + bfd if !keep_memory. + * cofflink.c (coff_link_check_archive_element): Likewise. + * pdp11.c (aout_link_check_archive_element): Likewise. + * xcofflink.c (xcoff_link_check_archive_element): Likewise. + 2010-12-13 Alan Modra * plugin.c (bfd_plugin_mkobject): Delete. diff --git a/bfd/aoutx.h b/bfd/aoutx.h index efa9d47431..7ca221ecd6 100644 --- a/bfd/aoutx.h +++ b/bfd/aoutx.h @@ -3305,8 +3305,8 @@ aout_link_check_ar_symbols (bfd *abfd, continue; } - if (! (*info->callbacks->add_archive_element) - (info, abfd, name, subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, abfd, name, subsbfd)) return FALSE; *pneeded = TRUE; return TRUE; @@ -3333,8 +3333,8 @@ aout_link_check_ar_symbols (bfd *abfd, outside BFD. We assume that we should link in the object file. This is done for the -u option in the linker. */ - if (! (*info->callbacks->add_archive_element) - (info, abfd, name, subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, abfd, name, subsbfd)) return FALSE; *pneeded = TRUE; return TRUE; @@ -3343,8 +3343,8 @@ aout_link_check_ar_symbols (bfd *abfd, symbol. It is already on the undefs list. */ h->type = bfd_link_hash_common; h->u.c.p = (struct bfd_link_hash_common_entry *) - bfd_hash_allocate (&info->hash->table, - sizeof (struct bfd_link_hash_common_entry)); + bfd_hash_allocate (&info->hash->table, + sizeof (struct bfd_link_hash_common_entry)); if (h->u.c.p == NULL) return FALSE; @@ -3382,8 +3382,8 @@ aout_link_check_ar_symbols (bfd *abfd, it if the current link symbol is common. */ if (h->type == bfd_link_hash_undefined) { - if (! (*info->callbacks->add_archive_element) - (info, abfd, name, subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, abfd, name, subsbfd)) return FALSE; *pneeded = TRUE; return TRUE; @@ -3404,27 +3404,36 @@ aout_link_check_archive_element (bfd *abfd, struct bfd_link_info *info, bfd_boolean *pneeded) { - bfd *subsbfd = NULL; + bfd *oldbfd; + bfd_boolean needed; - if (! aout_get_external_symbols (abfd)) + if (!aout_get_external_symbols (abfd)) return FALSE; - if (! aout_link_check_ar_symbols (abfd, info, pneeded, &subsbfd)) + oldbfd = abfd; + if (!aout_link_check_ar_symbols (abfd, info, pneeded, &abfd)) return FALSE; - if (*pneeded) + needed = *pneeded; + if (needed) { /* Potentially, the add_archive_element hook may have set a substitute BFD for us. */ - if (subsbfd && !aout_get_external_symbols (subsbfd)) - return FALSE; - if (! aout_link_add_symbols (subsbfd ? subsbfd : abfd, info)) + if (abfd != oldbfd) + { + if (!info->keep_memory + && !aout_link_free_symbols (oldbfd)) + return FALSE; + if (!aout_get_external_symbols (abfd)) + return FALSE; + } + if (!aout_link_add_symbols (abfd, info)) return FALSE; } - if (! info->keep_memory || ! *pneeded) + if (!info->keep_memory || !needed) { - if (! aout_link_free_symbols (abfd)) + if (!aout_link_free_symbols (abfd)) return FALSE; } diff --git a/bfd/cofflink.c b/bfd/cofflink.c index a28d396919..33de7fe3cc 100644 --- a/bfd/cofflink.c +++ b/bfd/cofflink.c @@ -244,8 +244,8 @@ coff_link_check_ar_symbols (bfd *abfd, if (h != (struct bfd_link_hash_entry *) NULL && h->type == bfd_link_hash_undefined) { - if (! (*info->callbacks->add_archive_element) - (info, abfd, name, subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, abfd, name, subsbfd)) return FALSE; *pneeded = TRUE; return TRUE; @@ -269,29 +269,38 @@ coff_link_check_archive_element (bfd *abfd, struct bfd_link_info *info, bfd_boolean *pneeded) { - bfd *subsbfd = NULL; + bfd *oldbfd; + bfd_boolean needed; - if (! _bfd_coff_get_external_symbols (abfd)) - return FALSE; - - if (! coff_link_check_ar_symbols (abfd, info, pneeded, &subsbfd)) - return FALSE; - - /* Potentially, the add_archive_element hook may have set a - substitute BFD for us. */ - if (*pneeded - && subsbfd - && ! _bfd_coff_get_external_symbols (subsbfd)) + if (!_bfd_coff_get_external_symbols (abfd)) return FALSE; - if (*pneeded - && ! coff_link_add_symbols (subsbfd ? subsbfd : abfd, info)) + oldbfd = abfd; + if (!coff_link_check_ar_symbols (abfd, info, pneeded, &abfd)) return FALSE; - if ((! info->keep_memory || ! *pneeded) - && ! _bfd_coff_free_symbols (abfd)) - return FALSE; + needed = *pneeded; + if (needed) + { + /* Potentially, the add_archive_element hook may have set a + substitute BFD for us. */ + if (abfd != oldbfd) + { + if (!info->keep_memory + && !_bfd_coff_free_symbols (oldbfd)) + return FALSE; + if (!_bfd_coff_get_external_symbols (abfd)) + return FALSE; + } + if (!coff_link_add_symbols (abfd, info)) + return FALSE; + } + if (!info->keep_memory || !needed) + { + if (!_bfd_coff_free_symbols (abfd)) + return FALSE; + } return TRUE; } diff --git a/bfd/ecoff.c b/bfd/ecoff.c index 43494868d6..f85627d2f5 100644 --- a/bfd/ecoff.c +++ b/bfd/ecoff.c @@ -3600,7 +3600,7 @@ ecoff_link_check_archive_element (bfd *abfd, EXTR esym; bfd_boolean def; const char *name; - bfd *subsbfd; + bfd *oldbfd; struct bfd_link_hash_entry *h; (*swap_ext_in) (abfd, (void *) ext_ptr, &esym); @@ -3645,18 +3645,17 @@ ecoff_link_check_archive_element (bfd *abfd, continue; /* Include this element. */ - subsbfd = NULL; - if (! (*info->callbacks->add_archive_element) - (info, abfd, name, &subsbfd)) + oldbfd = abfd; + if (!(*info->callbacks + ->add_archive_element) (info, abfd, name, &abfd)) goto error_return; /* Potentially, the add_archive_element hook may have set a substitute BFD for us. */ - if (subsbfd + if (abfd != oldbfd && !reread_ext_syms_and_strs (&symhdr, &external_ext_size, &esize, - &external_ext, &ssext, subsbfd, backend)) + &external_ext, &ssext, abfd, backend)) goto error_return; - if (! ecoff_link_add_externals (subsbfd ? subsbfd : abfd, info, - external_ext, ssext)) + if (! ecoff_link_add_externals (abfd, info, external_ext, ssext)) goto error_return; *pneeded = TRUE; @@ -3733,7 +3732,6 @@ ecoff_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info) unsigned int file_offset; const char *name; bfd *element; - bfd *subsbfd; h = *pundef; @@ -3820,13 +3818,10 @@ ecoff_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info) /* Unlike the generic linker, we know that this element provides a definition for an undefined symbol and we know that we want to include it. We don't need to check anything. */ - subsbfd = NULL; - if (! (*info->callbacks->add_archive_element) - (info, element, name, &subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, element, name, &element)) return FALSE; - /* Potentially, the add_archive_element hook may have set a - substitute BFD for us. */ - if (! ecoff_link_add_object_symbols (subsbfd ? subsbfd : element, info)) + if (! ecoff_link_add_object_symbols (element, info)) return FALSE; pundef = &(*pundef)->u.undef.next; diff --git a/bfd/elflink.c b/bfd/elflink.c index a8aac7ced0..6136a94cfd 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -5073,10 +5073,10 @@ elf_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info) undefs_tail = info->hash->undefs_tail; - if (! (*info->callbacks->add_archive_element) - (info, element, symdef->name, &element)) + if (!(*info->callbacks + ->add_archive_element) (info, element, symdef->name, &element)) goto error_return; - if (! bfd_link_add_symbols (element, info)) + if (!bfd_link_add_symbols (element, info)) goto error_return; /* If there are any new undefined symbols, we need to make diff --git a/bfd/linker.c b/bfd/linker.c index fc52b51f00..2b52ba9651 100644 --- a/bfd/linker.c +++ b/bfd/linker.c @@ -1223,20 +1223,18 @@ generic_link_check_archive_element (bfd *abfd, { bfd_size_type symcount; asymbol **symbols; - bfd *subsbfd = NULL; + bfd *oldbfd = abfd; /* This object file defines this symbol, so pull it in. */ - if (! (*info->callbacks->add_archive_element) - (info, abfd, bfd_asymbol_name (p), &subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, abfd, bfd_asymbol_name (p), + &abfd)) return FALSE; /* Potentially, the add_archive_element hook may have set a substitute BFD for us. */ - if (subsbfd) - { - abfd = subsbfd; - if (!bfd_generic_link_read_symbols (abfd)) - return FALSE; - } + if (abfd != oldbfd + && !bfd_generic_link_read_symbols (abfd)) + return FALSE; symcount = _bfd_generic_link_get_symcount (abfd); symbols = _bfd_generic_link_get_symbols (abfd); if (! generic_link_add_symbol_list (abfd, info, symcount, @@ -1257,12 +1255,12 @@ generic_link_check_archive_element (bfd *abfd, symbfd = h->u.undef.abfd; if (symbfd == NULL) { - bfd *subsbfd = NULL; /* This symbol was created as undefined from outside BFD. We assume that we should link in the object file. This is for the -u option in the linker. */ - if (! (*info->callbacks->add_archive_element) - (info, abfd, bfd_asymbol_name (p), &subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, abfd, bfd_asymbol_name (p), + &abfd)) return FALSE; /* Potentially, the add_archive_element hook may have set a substitute BFD for us. But no symbols are going to get diff --git a/bfd/pdp11.c b/bfd/pdp11.c index 08aab37dd9..3821037827 100644 --- a/bfd/pdp11.c +++ b/bfd/pdp11.c @@ -2601,8 +2601,8 @@ aout_link_check_ar_symbols (bfd *abfd, but not if it is defined in the .text section. That seems a bit crazy to me, and I haven't implemented it. However, it might be correct. */ - if (! (*info->callbacks->add_archive_element) - (info, abfd, name, subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, abfd, name, subsbfd)) return FALSE; *pneeded = TRUE; return TRUE; @@ -2629,8 +2629,8 @@ aout_link_check_ar_symbols (bfd *abfd, outside BFD. We assume that we should link in the object file. This is done for the -u option in the linker. */ - if (! (*info->callbacks->add_archive_element) - (info, abfd, name, subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, abfd, name, subsbfd)) return FALSE; *pneeded = TRUE; return TRUE; @@ -2682,27 +2682,36 @@ aout_link_check_archive_element (bfd *abfd, struct bfd_link_info *info, bfd_boolean *pneeded) { - bfd *subsbfd = NULL; + bfd *oldbfd; + bfd_boolean needed; - if (! aout_get_external_symbols (abfd)) + if (!aout_get_external_symbols (abfd)) return FALSE; - if (! aout_link_check_ar_symbols (abfd, info, pneeded, &subsbfd)) + oldbfd = abfd; + if (!aout_link_check_ar_symbols (abfd, info, pneeded, &abfd)) return FALSE; - if (*pneeded) + needed = *pneeded; + if (needed) { /* Potentially, the add_archive_element hook may have set a substitute BFD for us. */ - if (subsbfd && ! aout_get_external_symbols (subsbfd)) - return FALSE; - if (! aout_link_add_symbols (subsbfd ? subsbfd : abfd, info)) + if (abfd != oldbfd) + { + if (!info->keep_memory + && !aout_link_free_symbols (oldbfd)) + return FALSE; + if (!aout_get_external_symbols (abfd)) + return FALSE; + } + if (!aout_link_add_symbols (abfd, info)) return FALSE; } - if (! info->keep_memory || ! *pneeded) + if (!info->keep_memory || !needed) { - if (! aout_link_free_symbols (abfd)) + if (!aout_link_free_symbols (abfd)) return FALSE; } diff --git a/bfd/vms-alpha.c b/bfd/vms-alpha.c index ba195f9e71..309c3a241b 100644 --- a/bfd/vms-alpha.c +++ b/bfd/vms-alpha.c @@ -8220,7 +8220,6 @@ alpha_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info) symindex symidx; bfd *element; bfd *orig_element; - bfd *subsbfd; h = *pundef; next_pundef = &(*pundef)->u.undef.next; @@ -8278,14 +8277,10 @@ alpha_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info) /* Unlike the generic linker, we know that this element provides a definition for an undefined symbol and we know that we want to include it. We don't need to check anything. */ - subsbfd = NULL; - if (! (*info->callbacks->add_archive_element) - (info, element, h->root.string, &subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, element, h->root.string, &element)) return FALSE; - /* Potentially, the add_archive_element hook may have set a - substitute BFD for us. */ - if (! alpha_vms_link_add_object_symbols (subsbfd ? subsbfd : element, - info)) + if (!alpha_vms_link_add_object_symbols (element, info)) return FALSE; orig_element->archive_pass = pass; diff --git a/bfd/xcofflink.c b/bfd/xcofflink.c index c055b260d6..d3e9043dc3 100644 --- a/bfd/xcofflink.c +++ b/bfd/xcofflink.c @@ -2292,8 +2292,8 @@ xcoff_link_check_dynamic_ar_symbols (bfd *abfd, && (((struct xcoff_link_hash_entry *) h)->flags & XCOFF_DEF_DYNAMIC) == 0) { - if (! (*info->callbacks->add_archive_element) - (info, abfd, name, subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, abfd, name, subsbfd)) return FALSE; *pneeded = TRUE; return TRUE; @@ -2364,8 +2364,8 @@ xcoff_link_check_ar_symbols (bfd *abfd, || (((struct xcoff_link_hash_entry *) h)->flags & XCOFF_DEF_DYNAMIC) == 0)) { - if (! (*info->callbacks->add_archive_element) - (info, abfd, name, subsbfd)) + if (!(*info->callbacks + ->add_archive_element) (info, abfd, name, subsbfd)) return FALSE; *pneeded = TRUE; return TRUE; @@ -2390,22 +2390,30 @@ xcoff_link_check_archive_element (bfd *abfd, bfd_boolean *pneeded) { bfd_boolean keep_syms_p; - bfd *subsbfd = NULL; + bfd *oldbfd; keep_syms_p = (obj_coff_external_syms (abfd) != NULL); - if (! _bfd_coff_get_external_symbols (abfd)) + if (!_bfd_coff_get_external_symbols (abfd)) return FALSE; - if (! xcoff_link_check_ar_symbols (abfd, info, pneeded, &subsbfd)) + oldbfd = abfd; + if (!xcoff_link_check_ar_symbols (abfd, info, pneeded, &abfd)) return FALSE; if (*pneeded) { /* Potentially, the add_archive_element hook may have set a substitute BFD for us. */ - if (subsbfd && !_bfd_coff_get_external_symbols (subsbfd)) - return FALSE; - if (! xcoff_link_add_symbols (subsbfd ? subsbfd : abfd, info)) + if (abfd != oldbfd) + { + if (!keep_syms_p + && !_bfd_coff_free_symbols (oldbfd)) + return FALSE; + keep_syms_p = (obj_coff_external_syms (abfd) != NULL); + if (!_bfd_coff_get_external_symbols (abfd)) + return FALSE; + } + if (!xcoff_link_add_symbols (abfd, info)) return FALSE; if (info->keep_memory) keep_syms_p = TRUE; @@ -2413,7 +2421,7 @@ xcoff_link_check_archive_element (bfd *abfd, if (!keep_syms_p) { - if (! _bfd_coff_free_symbols (abfd)) + if (!_bfd_coff_free_symbols (abfd)) return FALSE; } -- 2.34.1