Line 295... |
Line 295... |
parse_args (argc, argv);
|
parse_args (argc, argv);
|
|
|
if (config.hash_table_size != 0)
|
if (config.hash_table_size != 0)
|
bfd_hash_set_default_size (config.hash_table_size);
|
bfd_hash_set_default_size (config.hash_table_size);
|
|
|
ldemul_set_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)
|
ldemul_set_symbols ();
|
{
|
|
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,
|
/* If we have not already opened and parsed a linker script,
|
try the default script from command line first. */
|
try the default script from command line first. */
|
if (saved_script_handle == NULL
|
if (saved_script_handle == NULL
|
&& command_line.default_script != NULL)
|
&& command_line.default_script != NULL)
|
Line 806... |
Line 746... |
/* Save the original data for trace files/tries below, as plugins
|
/* Save the original data for trace files/tries below, as plugins
|
(if enabled) may possibly alter it to point to a replacement
|
(if enabled) may possibly alter it to point to a replacement
|
BFD, but we still want to output the original BFD filename. */
|
BFD, but we still want to output the original BFD filename. */
|
orig_input = *input;
|
orig_input = *input;
|
#ifdef ENABLE_PLUGINS
|
#ifdef ENABLE_PLUGINS
|
if (bfd_my_archive (abfd) != NULL
|
if (plugin_active_plugins_p () && !no_more_claiming)
|
&& plugin_active_plugins_p ()
|
|
&& !no_more_claiming)
|
|
{
|
{
|
/* We must offer this archive member to the plugins to claim. */
|
/* We must offer this archive member to the plugins to claim. */
|
int fd = open (bfd_my_archive (abfd)->filename, O_RDONLY | O_BINARY);
|
const char *filename = (bfd_my_archive (abfd) != NULL
|
|
? bfd_my_archive (abfd)->filename : abfd->filename);
|
|
int fd = open (filename, O_RDONLY | O_BINARY);
|
if (fd >= 0)
|
if (fd >= 0)
|
{
|
{
|
struct ld_plugin_input_file file;
|
struct ld_plugin_input_file file;
|
|
|
/* Offset and filesize must refer to the individual archive
|
/* Offset and filesize must refer to the individual archive
|
member, not the whole file, and must exclude the header.
|
member, not the whole file, and must exclude the header.
|
Fortunately for us, that is how the data is stored in the
|
Fortunately for us, that is how the data is stored in the
|
origin field of the bfd and in the arelt_data. */
|
origin field of the bfd and in the arelt_data. */
|
file.name = bfd_my_archive (abfd)->filename;
|
file.name = filename;
|
file.offset = abfd->origin;
|
file.offset = abfd->origin;
|
file.filesize = arelt_size (abfd);
|
file.filesize = arelt_size (abfd);
|
file.fd = fd;
|
file.fd = fd;
|
plugin_maybe_claim (&file, input);
|
plugin_maybe_claim (&file, input);
|
if (input->claimed)
|
if (input->claimed)
|