From 9bbc1a67d375f36d009bf5ba8ffd7d9c53511885 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 10 Oct 2011 12:43:14 +0000 Subject: [PATCH] * ldmain.c (main): Move code twiddling various config and link_info bits to.. * lexsup.c (parse_args): ..here. Move plugin_load_plugins call into main. * plugin.c (set_tv_header): Test link_info.executable, not link_info.shared. (is_visible_from_outside): Likewise. Delete redundant is_ir_dummy_bfd check and "section" parameter. --- ld/ChangeLog | 11 ++++++++ ld/ldmain.c | 72 +++++----------------------------------------------- ld/lexsup.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++---- ld/plugin.c | 12 +++------ 4 files changed, 86 insertions(+), 79 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 8257eecd837..bc39daae2cb 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,14 @@ +2011-10-10 Alan Modra + + * ldmain.c (main): Move code twiddling various config and link_info + bits to.. + * lexsup.c (parse_args): ..here. Move plugin_load_plugins call + into main. + * plugin.c (set_tv_header): Test link_info.executable, not + link_info.shared. + (is_visible_from_outside): Likewise. Delete redundant + is_ir_dummy_bfd check and "section" parameter. + 2011-10-10 Alan Modra * emultempl/ppc64elf.em (ppc_add_stub_section): Align to 32 bytes. diff --git a/ld/ldmain.c b/ld/ldmain.c index 3c0dbc4d44e..7aacf0f51a3 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -297,73 +297,13 @@ main (int argc, char **argv) if (config.hash_table_size != 0) bfd_hash_set_default_size (config.hash_table_size); - ldemul_set_symbols (); - - if (link_info.relocatable) - { - if (command_line.check_section_addresses < 0) - command_line.check_section_addresses = 0; - if (link_info.shared) - einfo (_("%P%F: -r and -shared may not be used together\n")); - } - - /* We may have -Bsymbolic, -Bsymbolic-functions, --dynamic-list-data, - --dynamic-list-cpp-new, --dynamic-list-cpp-typeinfo and - --dynamic-list FILE. -Bsymbolic and -Bsymbolic-functions are - for shared libraries. -Bsymbolic overrides all others and vice - versa. */ - switch (command_line.symbolic) - { - case symbolic_unset: - break; - case symbolic: - /* -Bsymbolic is for shared library only. */ - if (link_info.shared) - { - link_info.symbolic = TRUE; - /* Should we free the unused memory? */ - link_info.dynamic_list = NULL; - command_line.dynamic_list = dynamic_list_unset; - } - break; - case symbolic_functions: - /* -Bsymbolic-functions is for shared library only. */ - if (link_info.shared) - command_line.dynamic_list = dynamic_list_data; - break; - } - - switch (command_line.dynamic_list) - { - case dynamic_list_unset: - break; - case dynamic_list_data: - link_info.dynamic_data = TRUE; - case dynamic_list: - link_info.dynamic = TRUE; - break; - } - - if (! link_info.shared) - { - if (command_line.filter_shlib) - einfo (_("%P%F: -F may not be used without -shared\n")); - if (command_line.auxiliary_filters) - einfo (_("%P%F: -f may not be used without -shared\n")); - } - - if (! link_info.shared || link_info.pie) - link_info.executable = TRUE; +#ifdef ENABLE_PLUGINS + /* Now all the plugin arguments have been gathered, we can load them. */ + if (plugin_load_plugins ()) + einfo (_("%P%F: %s: error loading plugin\n"), plugin_error_plugin ()); +#endif /* ENABLE_PLUGINS */ - /* Treat ld -r -s as ld -r -S -x (i.e., strip all local symbols). I - don't see how else this can be handled, since in this case we - must preserve all externally visible symbols. */ - if (link_info.relocatable && link_info.strip == strip_all) - { - link_info.strip = strip_debugger; - if (link_info.discard == discard_sec_merge) - link_info.discard = discard_all; - } + ldemul_set_symbols (); /* If we have not already opened and parsed a linker script, try the default script from command line first. */ diff --git a/ld/lexsup.c b/ld/lexsup.c index b5e52a88fd9..20e0271e78f 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -1564,11 +1564,71 @@ parse_args (unsigned argc, char **argv) /* FIXME: Should we allow emulations a chance to set this ? */ link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols; -#ifdef ENABLE_PLUGINS - /* Now all the plugin arguments have been gathered, we can load them. */ - if (plugin_load_plugins ()) - einfo (_("%P%F: %s: error loading plugin\n"), plugin_error_plugin ()); -#endif /* ENABLE_PLUGINS */ + if (link_info.relocatable) + { + if (command_line.check_section_addresses < 0) + command_line.check_section_addresses = 0; + if (link_info.shared) + einfo (_("%P%F: -r and -shared may not be used together\n")); + } + + /* We may have -Bsymbolic, -Bsymbolic-functions, --dynamic-list-data, + --dynamic-list-cpp-new, --dynamic-list-cpp-typeinfo and + --dynamic-list FILE. -Bsymbolic and -Bsymbolic-functions are + for shared libraries. -Bsymbolic overrides all others and vice + versa. */ + switch (command_line.symbolic) + { + case symbolic_unset: + break; + case symbolic: + /* -Bsymbolic is for shared library only. */ + if (link_info.shared) + { + link_info.symbolic = TRUE; + /* Should we free the unused memory? */ + link_info.dynamic_list = NULL; + command_line.dynamic_list = dynamic_list_unset; + } + break; + case symbolic_functions: + /* -Bsymbolic-functions is for shared library only. */ + if (link_info.shared) + command_line.dynamic_list = dynamic_list_data; + break; + } + + switch (command_line.dynamic_list) + { + case dynamic_list_unset: + break; + case dynamic_list_data: + link_info.dynamic_data = TRUE; + case dynamic_list: + link_info.dynamic = TRUE; + break; + } + + if (! link_info.shared) + { + if (command_line.filter_shlib) + einfo (_("%P%F: -F may not be used without -shared\n")); + if (command_line.auxiliary_filters) + einfo (_("%P%F: -f may not be used without -shared\n")); + } + + if (! link_info.shared || link_info.pie) + link_info.executable = TRUE; + + /* Treat ld -r -s as ld -r -S -x (i.e., strip all local symbols). I + don't see how else this can be handled, since in this case we + must preserve all externally visible symbols. */ + if (link_info.relocatable && link_info.strip == strip_all) + { + link_info.strip = strip_debugger; + if (link_info.discard == discard_sec_merge) + link_info.discard = discard_all; + } } /* Add the (colon-separated) elements of DIRLIST_PTR to the diff --git a/ld/plugin.c b/ld/plugin.c index 250233b8986..5f4aa8faa6a 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -442,18 +442,14 @@ release_input_file (const void *handle) /* Return TRUE if a defined symbol might be reachable from outside the universe of claimed objects. */ static inline bfd_boolean -is_visible_from_outside (struct ld_plugin_symbol *lsym, asection *section, +is_visible_from_outside (struct ld_plugin_symbol *lsym, struct bfd_link_hash_entry *blhe) { struct bfd_sym_chain *sym; - /* Section's owner may be NULL if it is the absolute - section, fortunately is_ir_dummy_bfd handles that. */ - if (!is_ir_dummy_bfd (section->owner)) - return TRUE; if (link_info.relocatable) return TRUE; - if (link_info.export_dynamic || link_info.shared) + if (link_info.export_dynamic || !link_info.executable) { /* Check if symbol is hidden by version script. */ if (bfd_hide_sym_by_version (link_info.version_info, @@ -580,7 +576,7 @@ get_symbols (const void *handle, int nsyms, struct ld_plugin_symbol *syms, symbol is externally visible. */ if (blhe->non_ir_ref) res = LDPR_PREVAILING_DEF; - else if (is_visible_from_outside (&syms[n], owner_sec, blhe)) + else if (is_visible_from_outside (&syms[n], blhe)) res = def_ironly_exp; } @@ -701,7 +697,7 @@ set_tv_header (struct ld_plugin_tv *tv) case LDPT_LINKER_OUTPUT: TVU(val) = (link_info.relocatable ? LDPO_REL - : (link_info.shared ? LDPO_DYN : LDPO_EXEC)); + : link_info.executable ? LDPO_EXEC : LDPO_DYN); break; case LDPT_OUTPUT_NAME: TVU(string) = output_filename; -- 2.30.2