aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2011-10-10 12:43:14 +0000
committerAlan Modra <amodra@gmail.com>2011-10-10 12:43:14 +0000
commit9bbc1a67d375f36d009bf5ba8ffd7d9c53511885 (patch)
tree33011b9c0c8b4ce911cae37e29939e4d7ea8e6ce /ld
parentbd518033e94e94717505ba617c9cc46beebffde8 (diff)
downloadfsf-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.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog11
-rw-r--r--ld/ldmain.c72
-rw-r--r--ld/lexsup.c70
-rw-r--r--ld/plugin.c12
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;