/* Parse options for the GNU linker.
- Copyright (C) 1991-2015 Free Software Foundation, Inc.
+ Copyright (C) 1991-2016 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
enum control_enum {
/* Use one dash before long option name. */
- ONE_DASH,
+ ONE_DASH = 1,
/* Use two dashes before long option name. */
- TWO_DASHES,
+ TWO_DASHES = 2,
/* Only accept two dashes before the long option name.
This is an overloading of the use of this enum, since originally it
was only intended to tell the --help display function how to display
'o', N_("FILE"), N_("Set output file name"), EXACTLY_TWO_DASHES },
{ {NULL, required_argument, NULL, '\0'},
'O', NULL, N_("Optimize output file"), ONE_DASH },
+ { {"out-implib", required_argument, NULL, OPTION_OUT_IMPLIB},
+ '\0', N_("FILE"), N_("Generate import library"), TWO_DASHES },
#ifdef ENABLE_PLUGINS
{ {"plugin", required_argument, NULL, OPTION_PLUGIN},
'\0', N_("PLUGIN"), N_("Load named plugin"), ONE_DASH },
switch (optc)
{
case '?':
- einfo (_("%P: unrecognized option '%s'\n"), argv[last_optind]);
+ {
+ /* If the last word on the command line is an option that
+ requires an argument, getopt will refuse to recognise it.
+ Try to catch such options here and issue a more helpful
+ error message than just "unrecognized option". */
+ int opt;
+
+ for (opt = ARRAY_SIZE (ld_options); opt--;)
+ if (ld_options[opt].opt.has_arg == required_argument
+ /* FIXME: There are a few short options that do not
+ have long equivalents, but which require arguments.
+ We should handle them too. */
+ && ld_options[opt].opt.name != NULL
+ && strcmp (argv[last_optind] + ld_options[opt].control, ld_options[opt].opt.name) == 0)
+ {
+ einfo (_("%P: %s: missing argument\n"), argv[last_optind]);
+ break;
+ }
+
+ if (opt == -1)
+ einfo (_("%P: unrecognized option '%s'\n"), argv[last_optind]);
+ }
/* Fall through. */
default:
case OPTION_OFORMAT:
lang_add_output_format (optarg, NULL, NULL, 0);
break;
+ case OPTION_OUT_IMPLIB:
+ command_line.out_implib_filename = xstrdup (optarg);
+ break;
case OPTION_PRINT_SYSROOT:
if (*ld_sysroot)
puts (ld_sysroot);
break;
case OPTION_PLUGIN_OPT:
if (plugin_opt_plugin_arg (optarg))
- einfo(_("%P%F: bad -plugin-opt option\n"));
+ einfo (_("%P%F: bad -plugin-opt option\n"));
break;
#endif /* ENABLE_PLUGINS */
case 'q':
/* 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. */
+ for PIC outputs. -Bsymbolic overrides all others and vice versa. */
switch (command_line.symbolic)
{
case symbolic_unset:
break;
case symbolic:
- /* -Bsymbolic is for shared library only. */
- if (bfd_link_dll (&link_info))
+ /* -Bsymbolic is for PIC output only. */
+ if (bfd_link_pic (&link_info))
{
link_info.symbolic = TRUE;
/* Should we free the unused memory? */
}
break;
case symbolic_functions:
- /* -Bsymbolic-functions is for shared library only. */
- if (bfd_link_dll (&link_info))
+ /* -Bsymbolic-functions is for PIC output only. */
+ if (bfd_link_pic (&link_info))
command_line.dynamic_list = dynamic_list_data;
break;
}
if (strcmp (seg->name, name) == 0)
{
seg->value = val;
+ lang_section_start (section, exp_intop (val), seg);
return;
}
/* There was no existing value so we must create a new segment
fprintf (file, _("\
--eh-frame-hdr Create .eh_frame_hdr section\n"));
fprintf (file, _("\
+ --no-eh-frame-hdr Do not create .eh_frame_hdr section\n"));
+ 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"));
fprintf (file, _("\
-z origin Mark object requiring immediate $ORIGIN\n\
processing at runtime\n"));
+#if DEFAULT_LD_Z_RELRO
fprintf (file, _("\
- -z relro Create RELRO program header\n"));
+ -z relro Create RELRO program header (default)\n"));
fprintf (file, _("\
-z norelro Don't create RELRO program header\n"));
+#else
+ fprintf (file, _("\
+ -z relro Create RELRO program header\n"));
+ fprintf (file, _("\
+ -z norelro Don't create RELRO program header (default)\n"));
+#endif
+ fprintf (file, _("\
+ -z common Generate common symbols with STT_COMMON type\n"));
+ fprintf (file, _("\
+ -z nocommon Generate common symbols with STT_OBJECT type\n"));
fprintf (file, _("\
-z stacksize=SIZE Set size of stack segment\n"));
fprintf (file, _("\