diff options
author | Alan Modra <amodra@gmail.com> | 2011-10-10 12:43:14 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2011-10-10 12:43:14 +0000 |
commit | 9bbc1a67d375f36d009bf5ba8ffd7d9c53511885 (patch) | |
tree | 33011b9c0c8b4ce911cae37e29939e4d7ea8e6ce | |
parent | bd518033e94e94717505ba617c9cc46beebffde8 (diff) | |
download | fsf-binutils-gdb-9bbc1a67d375f36d009bf5ba8ffd7d9c53511885.zip fsf-binutils-gdb-9bbc1a67d375f36d009bf5ba8ffd7d9c53511885.tar.gz fsf-binutils-gdb-9bbc1a67d375f36d009bf5ba8ffd7d9c53511885.tar.bz2 |
* 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.
-rw-r--r-- | ld/ChangeLog | 11 | ||||
-rw-r--r-- | ld/ldmain.c | 72 | ||||
-rw-r--r-- | ld/lexsup.c | 70 | ||||
-rw-r--r-- | ld/plugin.c | 12 |
4 files changed, 86 insertions, 79 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 8257eec..bc39daa 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,16 @@ 2011-10-10 Alan Modra <amodra@gmail.com> + * 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 <amodra@gmail.com> + * emultempl/ppc64elf.em (ppc_add_stub_section): Align to 32 bytes. 2011-10-09 Alan Modra <amodra@gmail.com> diff --git a/ld/ldmain.c b/ld/ldmain.c index 3c0dbc4..7aacf0f 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 b5e52a8..20e0271 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 250233b..5f4aa8f 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; |