/* Parse options for the GNU linker.
- Copyright (C) 1991-2019 Free Software Foundation, Inc.
+ Copyright (C) 1991-2020 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
#include "safe-ctype.h"
#include "getopt.h"
#include "bfdlink.h"
+#include "ctf-api.h"
#include "ld.h"
#include "ldmain.h"
#include "ldmisc.h"
'E', NULL, N_("Export all dynamic symbols"), TWO_DASHES },
{ {"no-export-dynamic", no_argument, NULL, OPTION_NO_EXPORT_DYNAMIC},
'\0', NULL, N_("Undo the effect of --export-dynamic"), TWO_DASHES },
+ { {"enable-non-contiguous-regions", no_argument, NULL, OPTION_NON_CONTIGUOUS_REGIONS},
+ '\0', NULL, N_("Enable support of non-contiguous memory regions"), TWO_DASHES },
+ { {"enable-non-contiguous-regions-warnings", no_argument, NULL, OPTION_NON_CONTIGUOUS_REGIONS_WARNINGS},
+ '\0', NULL, N_("Enable warnings when --enable-non-contiguous-regions may cause unexpected behaviour"), TWO_DASHES },
{ {"EB", no_argument, NULL, OPTION_EB},
'\0', NULL, N_("Link big-endian objects"), ONE_DASH },
{ {"EL", no_argument, NULL, OPTION_EL},
struct option *longopts;
struct option *really_longopts;
int last_optind;
- enum report_method how_to_report_unresolved_symbols = RM_GENERATE_ERROR;
+ enum symbolic_enum
+ {
+ symbolic_unset = 0,
+ symbolic,
+ symbolic_functions,
+ } opt_symbolic = symbolic_unset;
+ enum dynamic_list_enum
+ {
+ dynamic_list_unset = 0,
+ dynamic_list_data,
+ dynamic_list
+ } opt_dynamic_list = dynamic_list_unset;
shortopts = (char *) xmalloc (OPTION_COUNT * 3 + 2);
longopts = (struct option *)
case OPTION_NO_EXPORT_DYNAMIC:
link_info.export_dynamic = FALSE;
break;
+ case OPTION_NON_CONTIGUOUS_REGIONS:
+ link_info.non_contiguous_regions = TRUE;
+ break;
+ case OPTION_NON_CONTIGUOUS_REGIONS_WARNINGS:
+ link_info.non_contiguous_regions_warnings = TRUE;
+ break;
case 'e':
lang_add_entry (optarg, TRUE);
break;
Use --call-shared or -Bdynamic for this. */
break;
case 'n':
+ config.text_read_only = TRUE;
config.magic_demand_paged = FALSE;
input_flags.dynamic = FALSE;
break;
link_info.keep_memory = FALSE;
break;
case OPTION_NO_UNDEFINED:
- link_info.unresolved_syms_in_objects
- = how_to_report_unresolved_symbols;
+ link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
break;
case OPTION_ALLOW_SHLIB_UNDEFINED:
link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
break;
case OPTION_NO_ALLOW_SHLIB_UNDEFINED:
- link_info.unresolved_syms_in_shared_libs
- = how_to_report_unresolved_symbols;
+ link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
break;
case OPTION_UNRESOLVED_SYMBOLS:
if (strcmp (optarg, "ignore-all") == 0)
}
else if (strcmp (optarg, "report-all") == 0)
{
- link_info.unresolved_syms_in_objects
- = how_to_report_unresolved_symbols;
- link_info.unresolved_syms_in_shared_libs
- = how_to_report_unresolved_symbols;
+ link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
+ link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
}
else if (strcmp (optarg, "ignore-in-object-files") == 0)
{
link_info.unresolved_syms_in_objects = RM_IGNORE;
- link_info.unresolved_syms_in_shared_libs
- = how_to_report_unresolved_symbols;
+ link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
}
else if (strcmp (optarg, "ignore-in-shared-libs") == 0)
{
- link_info.unresolved_syms_in_objects
- = how_to_report_unresolved_symbols;
+ link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
}
else
einfo (_("%F%P: bad --unresolved-symbols option: %s\n"), optarg);
break;
case OPTION_WARN_UNRESOLVED_SYMBOLS:
- how_to_report_unresolved_symbols = RM_GENERATE_WARNING;
- if (link_info.unresolved_syms_in_objects == RM_GENERATE_ERROR)
- link_info.unresolved_syms_in_objects = RM_GENERATE_WARNING;
- if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
- link_info.unresolved_syms_in_shared_libs = RM_GENERATE_WARNING;
+ link_info.warn_unresolved_syms = TRUE;
break;
-
case OPTION_ERROR_UNRESOLVED_SYMBOLS:
- how_to_report_unresolved_symbols = RM_GENERATE_ERROR;
- if (link_info.unresolved_syms_in_objects == RM_GENERATE_WARNING)
- link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
- if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_WARNING)
- link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
+ link_info.warn_unresolved_syms = FALSE;
break;
case OPTION_ALLOW_MULTIPLE_DEFINITION:
link_info.allow_multiple_definition = TRUE;
config.stats = TRUE;
break;
case OPTION_SYMBOLIC:
- command_line.symbolic = symbolic;
+ opt_symbolic = symbolic;
break;
case OPTION_SYMBOLIC_FUNCTIONS:
- command_line.symbolic = symbolic_functions;
+ opt_symbolic = symbolic_functions;
break;
case 't':
++trace_files;
command_line.version_exports_section = optarg;
break;
case OPTION_DYNAMIC_LIST_DATA:
- command_line.dynamic_list = dynamic_list_data;
- if (command_line.symbolic == symbolic)
- command_line.symbolic = symbolic_unset;
+ opt_dynamic_list = dynamic_list_data;
+ if (opt_symbolic == symbolic)
+ opt_symbolic = symbolic_unset;
break;
case OPTION_DYNAMIC_LIST_CPP_TYPEINFO:
lang_append_dynamic_list_cpp_typeinfo ();
- if (command_line.dynamic_list != dynamic_list_data)
- command_line.dynamic_list = dynamic_list;
- if (command_line.symbolic == symbolic)
- command_line.symbolic = symbolic_unset;
+ if (opt_dynamic_list != dynamic_list_data)
+ opt_dynamic_list = dynamic_list;
+ if (opt_symbolic == symbolic)
+ opt_symbolic = symbolic_unset;
break;
case OPTION_DYNAMIC_LIST_CPP_NEW:
lang_append_dynamic_list_cpp_new ();
- if (command_line.dynamic_list != dynamic_list_data)
- command_line.dynamic_list = dynamic_list;
- if (command_line.symbolic == symbolic)
- command_line.symbolic = symbolic_unset;
+ if (opt_dynamic_list != dynamic_list_data)
+ opt_dynamic_list = dynamic_list;
+ if (opt_symbolic == symbolic)
+ opt_symbolic = symbolic_unset;
break;
case OPTION_DYNAMIC_LIST:
/* This option indicates a small script that only specifies
parser_input = input_dynamic_list;
yyparse ();
}
- if (command_line.dynamic_list != dynamic_list_data)
- command_line.dynamic_list = dynamic_list;
- if (command_line.symbolic == symbolic)
- command_line.symbolic = symbolic_unset;
+ if (opt_dynamic_list != dynamic_list_data)
+ opt_dynamic_list = dynamic_list;
+ if (opt_symbolic == symbolic)
+ opt_symbolic = symbolic_unset;
break;
case OPTION_WARN_COMMON:
config.warn_common = TRUE;
if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
/* FIXME: Should we allow emulations a chance to set this ? */
- link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
+ link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
/* FIXME: Should we allow emulations a chance to set this ? */
- link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
+ link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
if (bfd_link_relocatable (&link_info)
&& command_line.check_section_addresses < 0)
command_line.check_section_addresses = 0;
- /* 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 PIC outputs. -Bsymbolic overrides all others and vice versa. */
- switch (command_line.symbolic)
- {
- case symbolic_unset:
- break;
- case symbolic:
- /* -Bsymbolic is for PIC output only. */
- if (bfd_link_pic (&link_info))
- {
- 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 PIC output only. */
- if (bfd_link_pic (&link_info))
- command_line.dynamic_list = dynamic_list_data;
- break;
- }
+ /* -Bsymbolic and -Bsymbols-functions are for shared library output. */
+ if (bfd_link_dll (&link_info))
+ switch (opt_symbolic)
+ {
+ case symbolic_unset:
+ break;
+ case symbolic:
+ link_info.symbolic = TRUE;
+ if (link_info.dynamic_list)
+ {
+ struct bfd_elf_version_expr *ent, *next;
+ for (ent = link_info.dynamic_list->head.list; ent; ent = next)
+ {
+ next = ent->next;
+ free (ent);
+ }
+ free (link_info.dynamic_list);
+ link_info.dynamic_list = NULL;
+ }
+ opt_dynamic_list = dynamic_list_unset;
+ break;
+ case symbolic_functions:
+ opt_dynamic_list = dynamic_list_data;
+ break;
+ }
- switch (command_line.dynamic_list)
+ switch (opt_dynamic_list)
{
case dynamic_list_unset:
break;
}
/* There was no existing value so we must create a new segment
entry. */
- seg = (segment_type *) stat_alloc (sizeof (*seg));
+ seg = stat_alloc (sizeof (*seg));
seg->name = name;
seg->value = val;
seg->used = FALSE;
fprintf (file, _("\
--exclude-libs=LIBS Make all symbols in LIBS hidden\n"));
fprintf (file, _("\
- --hash-style=STYLE Set hash style to sysv, gnu or both\n"));
+ --hash-style=STYLE Set hash style to sysv/gnu/both. Default: "));
+ if (DEFAULT_EMIT_SYSV_HASH)
+ {
+ /* Note - these strings are not translated as
+ they are keywords not descriptive text. */
+ if (DEFAULT_EMIT_GNU_HASH)
+ fprintf (file, "both\n");
+ else
+ fprintf (file, "sysv\n");
+ }
+ else
+ {
+ if (DEFAULT_EMIT_GNU_HASH)
+ fprintf (file, "gnu\n");
+ else
+ /* FIXME: Can this happen ? */
+ fprintf (file, "none\n");
+ }
fprintf (file, _("\
-P AUDITLIB, --depaudit=AUDITLIB\n" "\
Specify a library to use for auditing dependencies\n"));