* 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.
This commit is contained in:
parent
bd518033e9
commit
9bbc1a67d3
11
ld/ChangeLog
11
ld/ChangeLog
@ -1,3 +1,14 @@
|
||||
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.
|
||||
|
72
ld/ldmain.c
72
ld/ldmain.c
@ -297,74 +297,14 @@ main (int argc, char **argv)
|
||||
if (config.hash_table_size != 0)
|
||||
bfd_hash_set_default_size (config.hash_table_size);
|
||||
|
||||
#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 */
|
||||
|
||||
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;
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/* If we have not already opened and parsed a linker script,
|
||||
try the default script from command line first. */
|
||||
if (saved_script_handle == NULL
|
||||
|
70
ld/lexsup.c
70
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
|
||||
|
12
ld/plugin.c
12
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;
|
||||
|
Loading…
Reference in New Issue
Block a user