Port lib32 arangement from Debian.
[deliverable/binutils-gdb.git] / ld / lexsup.c
CommitLineData
252b5132 1/* Parse options for the GNU linker.
a2b64bed 2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
dab69f68 3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012
252b5132
RH
4 Free Software Foundation, Inc.
5
f96b4a7b 6 This file is part of the GNU Binutils.
252b5132 7
f96b4a7b 8 This program is free software; you can redistribute it and/or modify
53b2a62f 9 it under the terms of the GNU General Public License as published by
f96b4a7b
NC
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
252b5132 12
f96b4a7b 13 This program is distributed in the hope that it will be useful,
53b2a62f
NC
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
252b5132 17
53b2a62f 18 You should have received a copy of the GNU General Public License
f96b4a7b
NC
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
252b5132 22
3db64b00 23#include "sysdep.h"
252b5132 24#include "bfd.h"
c428fa83 25#include "bfdver.h"
252b5132
RH
26#include "libiberty.h"
27#include <stdio.h>
28#include <string.h>
3882b010 29#include "safe-ctype.h"
252b5132
RH
30#include "getopt.h"
31#include "bfdlink.h"
32#include "ld.h"
33#include "ldmain.h"
34#include "ldmisc.h"
35#include "ldexp.h"
36#include "ldlang.h"
df2a7313 37#include <ldgram.h>
252b5132
RH
38#include "ldlex.h"
39#include "ldfile.h"
40#include "ldver.h"
41#include "ldemul.h"
28c309a2 42#include "demangle.h"
5d3236ee
DK
43#ifdef ENABLE_PLUGINS
44#include "plugin.h"
45#endif /* ENABLE_PLUGINS */
252b5132
RH
46
47#ifndef PATH_SEPARATOR
48#if defined (__MSDOS__) || (defined (_WIN32) && ! defined (__CYGWIN32__))
49#define PATH_SEPARATOR ';'
50#else
51#define PATH_SEPARATOR ':'
52#endif
53#endif
54
5cc18311 55/* Somewhere above, sys/stat.h got included . . . . */
252b5132
RH
56#if !defined(S_ISDIR) && defined(S_IFDIR)
57#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
58#endif
59
1579bae1
AM
60static void set_default_dirlist (char *);
61static void set_section_start (char *, char *);
ba916c8a 62static void set_segment_start (const char *, char *);
1579bae1 63static void help (void);
252b5132 64
252b5132
RH
65/* The long options. This structure is used for both the option
66 parsing and the help text. */
67
1e9cc1c2
NC
68enum control_enum {
69 /* Use one dash before long option name. */
70 ONE_DASH,
71 /* Use two dashes before long option name. */
72 TWO_DASHES,
73 /* Only accept two dashes before the long option name.
74 This is an overloading of the use of this enum, since originally it
75 was only intended to tell the --help display function how to display
76 the long option name. This feature was added in order to resolve
77 the confusion about the -omagic command line switch. Is it setting
78 the output file name to "magic" or is it setting the NMAGIC flag on
79 the output ? It has been decided that it is setting the output file
80 name, and that if you want to set the NMAGIC flag you should use -N
81 or --omagic. */
82 EXACTLY_TWO_DASHES,
83 /* Don't mention this option in --help output. */
84 NO_HELP
85};
86
b79e8c78
NC
87struct ld_option
88{
252b5132
RH
89 /* The long option information. */
90 struct option opt;
91 /* The short option with the same meaning ('\0' if none). */
92 char shortopt;
93 /* The name of the argument (NULL if none). */
94 const char *arg;
95 /* The documentation string. If this is NULL, this is a synonym for
96 the previous option. */
97 const char *doc;
1e9cc1c2 98 enum control_enum control;
252b5132
RH
99};
100
b79e8c78
NC
101static const struct ld_option ld_options[] =
102{
252b5132 103 { {NULL, required_argument, NULL, '\0'},
6feb9908
AM
104 'a', N_("KEYWORD"), N_("Shared library control for HP/UX compatibility"),
105 ONE_DASH },
252b5132 106 { {"architecture", required_argument, NULL, 'A'},
6feb9908 107 'A', N_("ARCH"), N_("Set architecture") , TWO_DASHES },
252b5132 108 { {"format", required_argument, NULL, 'b'},
6feb9908
AM
109 'b', N_("TARGET"), N_("Specify target for following input files"),
110 TWO_DASHES },
252b5132 111 { {"mri-script", required_argument, NULL, 'c'},
6feb9908 112 'c', N_("FILE"), N_("Read MRI format linker script"), TWO_DASHES },
252b5132 113 { {"dc", no_argument, NULL, 'd'},
6feb9908 114 'd', NULL, N_("Force common symbols to be defined"), ONE_DASH },
252b5132 115 { {"dp", no_argument, NULL, 'd'},
6feb9908 116 '\0', NULL, NULL, ONE_DASH },
252b5132 117 { {"entry", required_argument, NULL, 'e'},
6feb9908 118 'e', N_("ADDRESS"), N_("Set start address"), TWO_DASHES },
252b5132 119 { {"export-dynamic", no_argument, NULL, OPTION_EXPORT_DYNAMIC},
6feb9908 120 'E', NULL, N_("Export all dynamic symbols"), TWO_DASHES },
267e2722
CD
121 { {"no-export-dynamic", no_argument, NULL, OPTION_NO_EXPORT_DYNAMIC},
122 '\0', NULL, N_("Undo the effect of --export-dynamic"), TWO_DASHES },
252b5132 123 { {"EB", no_argument, NULL, OPTION_EB},
6feb9908 124 '\0', NULL, N_("Link big-endian objects"), ONE_DASH },
252b5132 125 { {"EL", no_argument, NULL, OPTION_EL},
6feb9908 126 '\0', NULL, N_("Link little-endian objects"), ONE_DASH },
252b5132 127 { {"auxiliary", required_argument, NULL, 'f'},
6feb9908
AM
128 'f', N_("SHLIB"), N_("Auxiliary filter for shared object symbol table"),
129 TWO_DASHES },
252b5132 130 { {"filter", required_argument, NULL, 'F'},
6feb9908
AM
131 'F', N_("SHLIB"), N_("Filter for shared object symbol table"),
132 TWO_DASHES },
252b5132 133 { {NULL, no_argument, NULL, '\0'},
6feb9908 134 'g', NULL, N_("Ignored"), ONE_DASH },
252b5132 135 { {"gpsize", required_argument, NULL, 'G'},
6feb9908
AM
136 'G', N_("SIZE"), N_("Small data size (if no size, same as --shared)"),
137 TWO_DASHES },
252b5132 138 { {"soname", required_argument, NULL, OPTION_SONAME},
6feb9908 139 'h', N_("FILENAME"), N_("Set internal name of shared library"), ONE_DASH },
506eee22 140 { {"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER},
6feb9908
AM
141 'I', N_("PROGRAM"), N_("Set PROGRAM as the dynamic linker to use"),
142 TWO_DASHES },
252b5132 143 { {"library", required_argument, NULL, 'l'},
6feb9908 144 'l', N_("LIBNAME"), N_("Search for library LIBNAME"), TWO_DASHES },
252b5132 145 { {"library-path", required_argument, NULL, 'L'},
6feb9908
AM
146 'L', N_("DIRECTORY"), N_("Add DIRECTORY to library search path"),
147 TWO_DASHES },
e2243057
RS
148 { {"sysroot=<DIRECTORY>", required_argument, NULL, OPTION_SYSROOT},
149 '\0', NULL, N_("Override the default sysroot location"), TWO_DASHES },
252b5132 150 { {NULL, required_argument, NULL, '\0'},
6feb9908 151 'm', N_("EMULATION"), N_("Set emulation"), ONE_DASH },
252b5132 152 { {"print-map", no_argument, NULL, 'M'},
6feb9908 153 'M', NULL, N_("Print map file on standard output"), TWO_DASHES },
252b5132 154 { {"nmagic", no_argument, NULL, 'n'},
6feb9908 155 'n', NULL, N_("Do not page align data"), TWO_DASHES },
252b5132 156 { {"omagic", no_argument, NULL, 'N'},
6feb9908
AM
157 'N', NULL, N_("Do not page align data, do not make text readonly"),
158 EXACTLY_TWO_DASHES },
63fd3b82 159 { {"no-omagic", no_argument, NULL, OPTION_NO_OMAGIC},
6feb9908
AM
160 '\0', NULL, N_("Page align data, make text readonly"),
161 EXACTLY_TWO_DASHES },
252b5132 162 { {"output", required_argument, NULL, 'o'},
6feb9908 163 'o', N_("FILE"), N_("Set output file name"), EXACTLY_TWO_DASHES },
252b5132 164 { {NULL, required_argument, NULL, '\0'},
6feb9908 165 'O', NULL, N_("Optimize output file"), ONE_DASH },
5d3236ee
DK
166#ifdef ENABLE_PLUGINS
167 { {"plugin", required_argument, NULL, OPTION_PLUGIN},
168 '\0', N_("PLUGIN"), N_("Load named plugin"), ONE_DASH },
169 { {"plugin-opt", required_argument, NULL, OPTION_PLUGIN_OPT},
170 '\0', N_("ARG"), N_("Send arg to last-loaded plugin"), ONE_DASH },
94bf3a11
L
171 { {"flto", optional_argument, NULL, OPTION_IGNORE},
172 '\0', NULL, N_("Ignored for GCC LTO option compatibility"),
173 ONE_DASH },
174 { {"flto-partition=", required_argument, NULL, OPTION_IGNORE},
175 '\0', NULL, N_("Ignored for GCC LTO option compatibility"),
176 ONE_DASH },
5d3236ee 177#endif /* ENABLE_PLUGINS */
252b5132 178 { {"Qy", no_argument, NULL, OPTION_IGNORE},
6feb9908 179 '\0', NULL, N_("Ignored for SVR4 compatibility"), ONE_DASH },
a712da20 180 { {"emit-relocs", no_argument, NULL, 'q'},
6feb9908 181 'q', NULL, "Generate relocations in final output", TWO_DASHES },
1049f94e 182 { {"relocatable", no_argument, NULL, 'r'},
6feb9908 183 'r', NULL, N_("Generate relocatable output"), TWO_DASHES },
252b5132 184 { {NULL, no_argument, NULL, '\0'},
6feb9908 185 'i', NULL, NULL, ONE_DASH },
252b5132 186 { {"just-symbols", required_argument, NULL, 'R'},
6feb9908
AM
187 'R', N_("FILE"), N_("Just link symbols (if directory, same as --rpath)"),
188 TWO_DASHES },
252b5132 189 { {"strip-all", no_argument, NULL, 's'},
6feb9908 190 's', NULL, N_("Strip all symbols"), TWO_DASHES },
252b5132 191 { {"strip-debug", no_argument, NULL, 'S'},
6feb9908 192 'S', NULL, N_("Strip debugging symbols"), TWO_DASHES },
d5cd3933 193 { {"strip-discarded", no_argument, NULL, OPTION_STRIP_DISCARDED},
6feb9908 194 '\0', NULL, N_("Strip symbols in discarded sections"), TWO_DASHES },
d5cd3933 195 { {"no-strip-discarded", no_argument, NULL, OPTION_NO_STRIP_DISCARDED},
6feb9908 196 '\0', NULL, N_("Do not strip symbols in discarded sections"), TWO_DASHES },
252b5132 197 { {"trace", no_argument, NULL, 't'},
6feb9908 198 't', NULL, N_("Trace file opens"), TWO_DASHES },
252b5132 199 { {"script", required_argument, NULL, 'T'},
6feb9908 200 'T', N_("FILE"), N_("Read linker script"), TWO_DASHES },
14be8564
L
201 { {"default-script", required_argument, NULL, OPTION_DEFAULT_SCRIPT},
202 '\0', N_("FILE"), N_("Read default linker script"), TWO_DASHES },
203 { {"dT", required_argument, NULL, OPTION_DEFAULT_SCRIPT},
204 '\0', NULL, NULL, ONE_DASH },
252b5132 205 { {"undefined", required_argument, NULL, 'u'},
6feb9908
AM
206 'u', N_("SYMBOL"), N_("Start with undefined reference to SYMBOL"),
207 TWO_DASHES },
577a0623 208 { {"unique", optional_argument, NULL, OPTION_UNIQUE},
6feb9908
AM
209 '\0', N_("[=SECTION]"),
210 N_("Don't merge input [SECTION | orphan] sections"), TWO_DASHES },
252b5132 211 { {"Ur", no_argument, NULL, OPTION_UR},
6feb9908 212 '\0', NULL, N_("Build global constructor/destructor tables"), ONE_DASH },
252b5132 213 { {"version", no_argument, NULL, OPTION_VERSION},
6feb9908 214 'v', NULL, N_("Print version information"), TWO_DASHES },
252b5132 215 { {NULL, no_argument, NULL, '\0'},
6feb9908 216 'V', NULL, N_("Print version and emulation information"), ONE_DASH },
252b5132 217 { {"discard-all", no_argument, NULL, 'x'},
6feb9908 218 'x', NULL, N_("Discard all local symbols"), TWO_DASHES },
252b5132 219 { {"discard-locals", no_argument, NULL, 'X'},
6feb9908 220 'X', NULL, N_("Discard temporary local symbols (default)"), TWO_DASHES },
f5fa8ca2 221 { {"discard-none", no_argument, NULL, OPTION_DISCARD_NONE},
6feb9908 222 '\0', NULL, N_("Don't discard any local symbols"), TWO_DASHES },
252b5132 223 { {"trace-symbol", required_argument, NULL, 'y'},
6feb9908 224 'y', N_("SYMBOL"), N_("Trace mentions of SYMBOL"), TWO_DASHES },
252b5132 225 { {NULL, required_argument, NULL, '\0'},
6feb9908
AM
226 'Y', N_("PATH"), N_("Default search path for Solaris compatibility"),
227 ONE_DASH },
252b5132 228 { {"start-group", no_argument, NULL, '('},
6feb9908 229 '(', NULL, N_("Start a group"), TWO_DASHES },
252b5132 230 { {"end-group", no_argument, NULL, ')'},
6feb9908
AM
231 ')', NULL, N_("End a group"), TWO_DASHES },
232 { {"accept-unknown-input-arch", no_argument, NULL,
233 OPTION_ACCEPT_UNKNOWN_INPUT_ARCH},
234 '\0', NULL,
235 N_("Accept input files whose architecture cannot be determined"),
236 TWO_DASHES },
237 { {"no-accept-unknown-input-arch", no_argument, NULL,
238 OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH},
239 '\0', NULL, N_("Reject input files whose architecture is unknown"),
240 TWO_DASHES },
ddbb8a31
NC
241
242 /* The next two options are deprecated because of their similarity to
243 --as-needed and --no-as-needed. They have been replaced by
99bca8f9 244 --copy-dt-needed-entries and --no-copy-dt-needed-entries. */
ddbb8a31
NC
245 { {"add-needed", no_argument, NULL, OPTION_ADD_DT_NEEDED_FOR_DYNAMIC},
246 '\0', NULL, NULL, NO_HELP },
247 { {"no-add-needed", no_argument, NULL, OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC},
248 '\0', NULL, NULL, NO_HELP },
249
250 { {"as-needed", no_argument, NULL, OPTION_ADD_DT_NEEDED_FOR_REGULAR},
8fdd7217
NC
251 '\0', NULL, N_("Only set DT_NEEDED for following dynamic libs if used"),
252 TWO_DASHES },
ddbb8a31
NC
253 { {"no-as-needed", no_argument, NULL, OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR},
254 '\0', NULL, N_("Always set DT_NEEDED for dynamic libraries mentioned on\n"
255 " the command line"),
8fdd7217 256 TWO_DASHES },
252b5132 257 { {"assert", required_argument, NULL, OPTION_ASSERT},
6feb9908 258 '\0', N_("KEYWORD"), N_("Ignored for SunOS compatibility"), ONE_DASH },
252b5132 259 { {"Bdynamic", no_argument, NULL, OPTION_CALL_SHARED},
6feb9908 260 '\0', NULL, N_("Link against shared libraries"), ONE_DASH },
252b5132 261 { {"dy", no_argument, NULL, OPTION_CALL_SHARED},
6feb9908 262 '\0', NULL, NULL, ONE_DASH },
252b5132 263 { {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
6feb9908 264 '\0', NULL, NULL, ONE_DASH },
252b5132 265 { {"Bstatic", no_argument, NULL, OPTION_NON_SHARED},
6feb9908 266 '\0', NULL, N_("Do not link against shared libraries"), ONE_DASH },
252b5132 267 { {"dn", no_argument, NULL, OPTION_NON_SHARED},
6feb9908 268 '\0', NULL, NULL, ONE_DASH },
252b5132 269 { {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
6feb9908 270 '\0', NULL, NULL, ONE_DASH },
252b5132 271 { {"static", no_argument, NULL, OPTION_NON_SHARED},
6feb9908 272 '\0', NULL, NULL, ONE_DASH },
252b5132 273 { {"Bsymbolic", no_argument, NULL, OPTION_SYMBOLIC},
6feb9908 274 '\0', NULL, N_("Bind global references locally"), ONE_DASH },
d8cf8b51 275 { {"Bsymbolic-functions", no_argument, NULL, OPTION_SYMBOLIC_FUNCTIONS},
40b36307 276 '\0', NULL, N_("Bind global function references locally"), ONE_DASH },
252b5132 277 { {"check-sections", no_argument, NULL, OPTION_CHECK_SECTIONS},
6feb9908
AM
278 '\0', NULL, N_("Check section addresses for overlaps (default)"),
279 TWO_DASHES },
252b5132 280 { {"no-check-sections", no_argument, NULL, OPTION_NO_CHECK_SECTIONS},
6feb9908
AM
281 '\0', NULL, N_("Do not check section addresses for overlaps"),
282 TWO_DASHES },
ddbb8a31
NC
283 { {"copy-dt-needed-entries", no_argument, NULL,
284 OPTION_ADD_DT_NEEDED_FOR_DYNAMIC},
285 '\0', NULL, N_("Copy DT_NEEDED links mentioned inside DSOs that follow"),
286 TWO_DASHES },
287 { {"no-copy-dt-needed-entries", no_argument, NULL,
288 OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC},
289 '\0', NULL, N_("Do not copy DT_NEEDED links mentioned inside DSOs that follow"),
290 TWO_DASHES },
291
252b5132 292 { {"cref", no_argument, NULL, OPTION_CREF},
6feb9908 293 '\0', NULL, N_("Output cross reference table"), TWO_DASHES },
252b5132 294 { {"defsym", required_argument, NULL, OPTION_DEFSYM},
6feb9908 295 '\0', N_("SYMBOL=EXPRESSION"), N_("Define a symbol"), TWO_DASHES },
28c309a2 296 { {"demangle", optional_argument, NULL, OPTION_DEMANGLE},
6feb9908
AM
297 '\0', N_("[=STYLE]"), N_("Demangle symbol names [using STYLE]"),
298 TWO_DASHES },
252b5132 299 { {"embedded-relocs", no_argument, NULL, OPTION_EMBEDDED_RELOCS},
6feb9908 300 '\0', NULL, N_("Generate embedded relocs"), TWO_DASHES},
8fdd7217
NC
301 { {"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL},
302 '\0', NULL, N_("Treat warnings as errors"),
303 TWO_DASHES },
0fe58ccd
NC
304 { {"no-fatal-warnings", no_argument, NULL, OPTION_NO_WARN_FATAL},
305 '\0', NULL, N_("Do not treat warnings as errors (default)"),
306 TWO_DASHES },
3dbf70a2 307 { {"fini", required_argument, NULL, OPTION_FINI},
6feb9908 308 '\0', N_("SYMBOL"), N_("Call SYMBOL at unload-time"), ONE_DASH },
252b5132 309 { {"force-exe-suffix", no_argument, NULL, OPTION_FORCE_EXE_SUFFIX},
6feb9908 310 '\0', NULL, N_("Force generation of file with .exe suffix"), TWO_DASHES},
252b5132 311 { {"gc-sections", no_argument, NULL, OPTION_GC_SECTIONS},
6feb9908
AM
312 '\0', NULL, N_("Remove unused sections (on some targets)"),
313 TWO_DASHES },
252b5132 314 { {"no-gc-sections", no_argument, NULL, OPTION_NO_GC_SECTIONS},
6feb9908
AM
315 '\0', NULL, N_("Don't remove unused sections (default)"),
316 TWO_DASHES },
c17d87de
NC
317 { {"print-gc-sections", no_argument, NULL, OPTION_PRINT_GC_SECTIONS},
318 '\0', NULL, N_("List removed unused sections on stderr"),
319 TWO_DASHES },
320 { {"no-print-gc-sections", no_argument, NULL, OPTION_NO_PRINT_GC_SECTIONS},
321 '\0', NULL, N_("Do not list removed unused sections"),
322 TWO_DASHES },
2d643429 323 { {"hash-size=<NUMBER>", required_argument, NULL, OPTION_HASH_SIZE},
6feb9908
AM
324 '\0', NULL, N_("Set default hash table size close to <NUMBER>"),
325 TWO_DASHES },
252b5132 326 { {"help", no_argument, NULL, OPTION_HELP},
6feb9908 327 '\0', NULL, N_("Print option help"), TWO_DASHES },
3dbf70a2 328 { {"init", required_argument, NULL, OPTION_INIT},
6feb9908 329 '\0', N_("SYMBOL"), N_("Call SYMBOL at load-time"), ONE_DASH },
252b5132 330 { {"Map", required_argument, NULL, OPTION_MAP},
6feb9908 331 '\0', N_("FILE"), N_("Write a map file"), ONE_DASH },
4818e05f 332 { {"no-define-common", no_argument, NULL, OPTION_NO_DEFINE_COMMON},
6feb9908 333 '\0', NULL, N_("Do not define Common storage"), TWO_DASHES },
252b5132 334 { {"no-demangle", no_argument, NULL, OPTION_NO_DEMANGLE },
6feb9908 335 '\0', NULL, N_("Do not demangle symbol names"), TWO_DASHES },
252b5132 336 { {"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY},
6feb9908 337 '\0', NULL, N_("Use less memory and more disk I/O"), TWO_DASHES },
252b5132 338 { {"no-undefined", no_argument, NULL, OPTION_NO_UNDEFINED},
6feb9908
AM
339 '\0', NULL, N_("Do not allow unresolved references in object files"),
340 TWO_DASHES },
b79e8c78 341 { {"allow-shlib-undefined", no_argument, NULL, OPTION_ALLOW_SHLIB_UNDEFINED},
cc643b88 342 '\0', NULL, N_("Allow unresolved references in shared libraries"),
6feb9908
AM
343 TWO_DASHES },
344 { {"no-allow-shlib-undefined", no_argument, NULL,
345 OPTION_NO_ALLOW_SHLIB_UNDEFINED},
346 '\0', NULL, N_("Do not allow unresolved references in shared libs"),
347 TWO_DASHES },
348 { {"allow-multiple-definition", no_argument, NULL,
349 OPTION_ALLOW_MULTIPLE_DEFINITION},
350 '\0', NULL, N_("Allow multiple definitions"), TWO_DASHES },
31941635 351 { {"no-undefined-version", no_argument, NULL, OPTION_NO_UNDEFINED_VERSION},
6feb9908 352 '\0', NULL, N_("Disallow undefined version"), TWO_DASHES },
3e3b46e5
PB
353 { {"default-symver", no_argument, NULL, OPTION_DEFAULT_SYMVER},
354 '\0', NULL, N_("Create default symbol version"), TWO_DASHES },
fc0e6df6
PB
355 { {"default-imported-symver", no_argument, NULL,
356 OPTION_DEFAULT_IMPORTED_SYMVER},
357 '\0', NULL, N_("Create default symbol version for imported symbols"),
358 TWO_DASHES },
252b5132 359 { {"no-warn-mismatch", no_argument, NULL, OPTION_NO_WARN_MISMATCH},
6feb9908 360 '\0', NULL, N_("Don't warn about mismatched input files"), TWO_DASHES},
fe7929ce
AM
361 { {"no-warn-search-mismatch", no_argument, NULL,
362 OPTION_NO_WARN_SEARCH_MISMATCH},
363 '\0', NULL, N_("Don't warn on finding an incompatible library"),
364 TWO_DASHES},
252b5132 365 { {"no-whole-archive", no_argument, NULL, OPTION_NO_WHOLE_ARCHIVE},
6feb9908 366 '\0', NULL, N_("Turn off --whole-archive"), TWO_DASHES },
252b5132 367 { {"noinhibit-exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC},
6feb9908
AM
368 '\0', NULL, N_("Create an output file even if errors occur"),
369 TWO_DASHES },
252b5132 370 { {"noinhibit_exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC},
6feb9908 371 '\0', NULL, NULL, NO_HELP },
361b220e 372 { {"nostdlib", no_argument, NULL, OPTION_NOSTDLIB},
6feb9908 373 '\0', NULL, N_("Only use library directories specified on\n"
c58dea77
AM
374 " the command line"),
375 ONE_DASH },
252b5132 376 { {"oformat", required_argument, NULL, OPTION_OFORMAT},
6feb9908
AM
377 '\0', N_("TARGET"), N_("Specify target of output file"),
378 EXACTLY_TWO_DASHES },
30824704
RM
379 { {"print-output-format", no_argument, NULL, OPTION_PRINT_OUTPUT_FORMAT},
380 '\0', NULL, N_("Print default output format"), TWO_DASHES },
252b5132 381 { {"qmagic", no_argument, NULL, OPTION_IGNORE},
6feb9908
AM
382 '\0', NULL, N_("Ignored for Linux compatibility"), ONE_DASH },
383 { {"reduce-memory-overheads", no_argument, NULL,
384 OPTION_REDUCE_MEMORY_OVERHEADS},
385 '\0', NULL, N_("Reduce memory overheads, possibly taking much longer"),
386 TWO_DASHES },
252b5132 387 { {"relax", no_argument, NULL, OPTION_RELAX},
28d5f677
NC
388 '\0', NULL, N_("Reduce code size by using target specific optimizations"), TWO_DASHES },
389 { {"no-relax", no_argument, NULL, OPTION_NO_RELAX},
390 '\0', NULL, N_("Do not use relaxation techniques to reduce code size"), TWO_DASHES },
252b5132 391 { {"retain-symbols-file", required_argument, NULL,
6feb9908
AM
392 OPTION_RETAIN_SYMBOLS_FILE},
393 '\0', N_("FILE"), N_("Keep only symbols listed in FILE"), TWO_DASHES },
252b5132 394 { {"rpath", required_argument, NULL, OPTION_RPATH},
6feb9908 395 '\0', N_("PATH"), N_("Set runtime shared library search path"), ONE_DASH },
252b5132 396 { {"rpath-link", required_argument, NULL, OPTION_RPATH_LINK},
6feb9908
AM
397 '\0', N_("PATH"), N_("Set link time shared library search path"),
398 ONE_DASH },
252b5132 399 { {"shared", no_argument, NULL, OPTION_SHARED},
6feb9908 400 '\0', NULL, N_("Create a shared library"), ONE_DASH },
252b5132 401 { {"Bshareable", no_argument, NULL, OPTION_SHARED }, /* FreeBSD. */
6feb9908 402 '\0', NULL, NULL, ONE_DASH },
36af4a4e 403 { {"pie", no_argument, NULL, OPTION_PIE},
6feb9908 404 '\0', NULL, N_("Create a position independent executable"), ONE_DASH },
36af4a4e 405 { {"pic-executable", no_argument, NULL, OPTION_PIE},
6feb9908 406 '\0', NULL, NULL, TWO_DASHES },
de7dd2bd
NC
407 { {"sort-common", optional_argument, NULL, OPTION_SORT_COMMON},
408 '\0', N_("[=ascending|descending]"),
409 N_("Sort common symbols by alignment [in specified order]"),
410 TWO_DASHES },
252b5132 411 { {"sort_common", no_argument, NULL, OPTION_SORT_COMMON},
6feb9908 412 '\0', NULL, NULL, NO_HELP },
bcaa7b3e
L
413 { {"sort-section", required_argument, NULL, OPTION_SORT_SECTION},
414 '\0', N_("name|alignment"),
415 N_("Sort sections by name or maximum alignment"), TWO_DASHES },
db6751f2 416 { {"spare-dynamic-tags", required_argument, NULL, OPTION_SPARE_DYNAMIC_TAGS},
6feb9908
AM
417 '\0', N_("COUNT"), N_("How many tags to reserve in .dynamic section"),
418 TWO_DASHES },
a854a4a7 419 { {"split-by-file", optional_argument, NULL, OPTION_SPLIT_BY_FILE},
6feb9908
AM
420 '\0', N_("[=SIZE]"), N_("Split output sections every SIZE octets"),
421 TWO_DASHES },
a854a4a7 422 { {"split-by-reloc", optional_argument, NULL, OPTION_SPLIT_BY_RELOC},
6feb9908
AM
423 '\0', N_("[=COUNT]"), N_("Split output sections every COUNT relocs"),
424 TWO_DASHES },
252b5132 425 { {"stats", no_argument, NULL, OPTION_STATS},
6feb9908 426 '\0', NULL, N_("Print memory usage statistics"), TWO_DASHES },
ea20a7da 427 { {"target-help", no_argument, NULL, OPTION_TARGET_HELP},
6feb9908 428 '\0', NULL, N_("Display target specific options"), TWO_DASHES },
252b5132 429 { {"task-link", required_argument, NULL, OPTION_TASK_LINK},
6feb9908 430 '\0', N_("SYMBOL"), N_("Do task level linking"), TWO_DASHES },
252b5132 431 { {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
6feb9908 432 '\0', NULL, N_("Use same format as native linker"), TWO_DASHES },
176355da 433 { {"section-start", required_argument, NULL, OPTION_SECTION_START},
6feb9908
AM
434 '\0', N_("SECTION=ADDRESS"), N_("Set address of named section"),
435 TWO_DASHES },
252b5132 436 { {"Tbss", required_argument, NULL, OPTION_TBSS},
6feb9908 437 '\0', N_("ADDRESS"), N_("Set address of .bss section"), ONE_DASH },
252b5132 438 { {"Tdata", required_argument, NULL, OPTION_TDATA},
6feb9908 439 '\0', N_("ADDRESS"), N_("Set address of .data section"), ONE_DASH },
252b5132 440 { {"Ttext", required_argument, NULL, OPTION_TTEXT},
6feb9908 441 '\0', N_("ADDRESS"), N_("Set address of .text section"), ONE_DASH },
258795f5
L
442 { {"Ttext-segment", required_argument, NULL, OPTION_TTEXT_SEGMENT},
443 '\0', N_("ADDRESS"), N_("Set address of text segment"), ONE_DASH },
6feb9908
AM
444 { {"unresolved-symbols=<method>", required_argument, NULL,
445 OPTION_UNRESOLVED_SYMBOLS},
446 '\0', NULL, N_("How to handle unresolved symbols. <method> is:\n"
c58dea77
AM
447 " ignore-all, report-all, ignore-in-object-files,\n"
448 " ignore-in-shared-libs"),
449 TWO_DASHES },
1715a13c
L
450 { {"verbose", optional_argument, NULL, OPTION_VERBOSE},
451 '\0', N_("[=NUMBER]"),
452 N_("Output lots of information during link"), TWO_DASHES },
252b5132 453 { {"dll-verbose", no_argument, NULL, OPTION_VERBOSE}, /* Linux. */
6feb9908 454 '\0', NULL, NULL, NO_HELP },
252b5132 455 { {"version-script", required_argument, NULL, OPTION_VERSION_SCRIPT },
6feb9908 456 '\0', N_("FILE"), N_("Read version information script"), TWO_DASHES },
252b5132
RH
457 { {"version-exports-section", required_argument, NULL,
458 OPTION_VERSION_EXPORTS_SECTION },
6feb9908 459 '\0', N_("SYMBOL"), N_("Take export symbols list from .exports, using\n"
c58dea77
AM
460 " SYMBOL as the version."),
461 TWO_DASHES },
40b36307
L
462 { {"dynamic-list-data", no_argument, NULL, OPTION_DYNAMIC_LIST_DATA},
463 '\0', NULL, N_("Add data symbols to dynamic list"), TWO_DASHES },
464 { {"dynamic-list-cpp-new", no_argument, NULL, OPTION_DYNAMIC_LIST_CPP_NEW},
465 '\0', NULL, N_("Use C++ operator new/delete dynamic list"), TWO_DASHES },
55255dae
L
466 { {"dynamic-list-cpp-typeinfo", no_argument, NULL, OPTION_DYNAMIC_LIST_CPP_TYPEINFO},
467 '\0', NULL, N_("Use C++ typeinfo dynamic list"), TWO_DASHES },
468 { {"dynamic-list", required_argument, NULL, OPTION_DYNAMIC_LIST},
469 '\0', N_("FILE"), N_("Read dynamic list"), TWO_DASHES },
252b5132 470 { {"warn-common", no_argument, NULL, OPTION_WARN_COMMON},
6feb9908 471 '\0', NULL, N_("Warn about duplicate common symbols"), TWO_DASHES },
252b5132 472 { {"warn-constructors", no_argument, NULL, OPTION_WARN_CONSTRUCTORS},
6feb9908
AM
473 '\0', NULL, N_("Warn if global constructors/destructors are seen"),
474 TWO_DASHES },
252b5132 475 { {"warn-multiple-gp", no_argument, NULL, OPTION_WARN_MULTIPLE_GP},
6feb9908 476 '\0', NULL, N_("Warn if the multiple GP values are used"), TWO_DASHES },
252b5132 477 { {"warn-once", no_argument, NULL, OPTION_WARN_ONCE},
6feb9908 478 '\0', NULL, N_("Warn only once per undefined symbol"), TWO_DASHES },
252b5132 479 { {"warn-section-align", no_argument, NULL, OPTION_WARN_SECTION_ALIGN},
6feb9908
AM
480 '\0', NULL, N_("Warn if start of section changes due to alignment"),
481 TWO_DASHES },
8fdd7217
NC
482 { {"warn-shared-textrel", no_argument, NULL, OPTION_WARN_SHARED_TEXTREL},
483 '\0', NULL, N_("Warn if shared object has DT_TEXTREL"),
484 TWO_DASHES },
a0c402a5
L
485 { {"warn-alternate-em", no_argument, NULL, OPTION_WARN_ALTERNATE_EM},
486 '\0', NULL, N_("Warn if an object has alternate ELF machine code"),
487 TWO_DASHES },
6feb9908
AM
488 { {"warn-unresolved-symbols", no_argument, NULL,
489 OPTION_WARN_UNRESOLVED_SYMBOLS},
560e09e9 490 '\0', NULL, N_("Report unresolved symbols as warnings"), TWO_DASHES },
6feb9908
AM
491 { {"error-unresolved-symbols", no_argument, NULL,
492 OPTION_ERROR_UNRESOLVED_SYMBOLS},
560e09e9 493 '\0', NULL, N_("Report unresolved symbols as errors"), TWO_DASHES },
252b5132 494 { {"whole-archive", no_argument, NULL, OPTION_WHOLE_ARCHIVE},
6feb9908
AM
495 '\0', NULL, N_("Include all objects from following archives"),
496 TWO_DASHES },
252b5132 497 { {"wrap", required_argument, NULL, OPTION_WRAP},
6feb9908 498 '\0', N_("SYMBOL"), N_("Use wrapper functions for SYMBOL"), TWO_DASHES },
0e86e20e
AM
499 { {"ignore-unresolved-symbol", required_argument, NULL,
500 OPTION_IGNORE_UNRESOLVED_SYMBOL},
501 '\0', N_("SYMBOL"),
502 N_("Unresolved SYMBOL will not cause an error or warning"), TWO_DASHES },
252b5132
RH
503};
504
e4897a32 505#define OPTION_COUNT ARRAY_SIZE (ld_options)
252b5132 506
252b5132 507void
1579bae1 508parse_args (unsigned argc, char **argv)
252b5132 509{
e4897a32
NC
510 unsigned i;
511 int is, il, irl;
252b5132
RH
512 int ingroup = 0;
513 char *default_dirlist = NULL;
3bcf5557
AM
514 char *shortopts;
515 struct option *longopts;
516 struct option *really_longopts;
252b5132 517 int last_optind;
560e09e9 518 enum report_method how_to_report_unresolved_symbols = RM_GENERATE_ERROR;
252b5132 519
1e9cc1c2
NC
520 shortopts = (char *) xmalloc (OPTION_COUNT * 3 + 2);
521 longopts = (struct option *)
522 xmalloc (sizeof (*longopts) * (OPTION_COUNT + 1));
523 really_longopts = (struct option *)
524 malloc (sizeof (*really_longopts) * (OPTION_COUNT + 1));
3bcf5557 525
252b5132
RH
526 /* Starting the short option string with '-' is for programs that
527 expect options and other ARGV-elements in any order and that care about
528 the ordering of the two. We describe each non-option ARGV-element
529 as if it were the argument of an option with character code 1. */
530 shortopts[0] = '-';
531 is = 1;
532 il = 0;
e4897a32 533 irl = 0;
252b5132
RH
534 for (i = 0; i < OPTION_COUNT; i++)
535 {
536 if (ld_options[i].shortopt != '\0')
537 {
538 shortopts[is] = ld_options[i].shortopt;
539 ++is;
540 if (ld_options[i].opt.has_arg == required_argument
541 || ld_options[i].opt.has_arg == optional_argument)
542 {
543 shortopts[is] = ':';
544 ++is;
545 if (ld_options[i].opt.has_arg == optional_argument)
546 {
547 shortopts[is] = ':';
548 ++is;
549 }
550 }
551 }
552 if (ld_options[i].opt.name != NULL)
553 {
e4897a32
NC
554 if (ld_options[i].control == EXACTLY_TWO_DASHES)
555 {
556 really_longopts[irl] = ld_options[i].opt;
557 ++irl;
558 }
559 else
560 {
561 longopts[il] = ld_options[i].opt;
562 ++il;
563 }
252b5132
RH
564 }
565 }
566 shortopts[is] = '\0';
567 longopts[il].name = NULL;
e4897a32 568 really_longopts[irl].name = NULL;
252b5132 569
3bcf5557
AM
570 ldemul_add_options (is, &shortopts, il, &longopts, irl, &really_longopts);
571
252b5132
RH
572 /* The -G option is ambiguous on different platforms. Sometimes it
573 specifies the largest data size to put into the small data
574 section. Sometimes it is equivalent to --shared. Unfortunately,
575 the first form takes an argument, while the second does not.
576
577 We need to permit the --shared form because on some platforms,
578 such as Solaris, gcc -shared will pass -G to the linker.
579
580 To permit either usage, we look through the argument list. If we
581 find -G not followed by a number, we change it into --shared.
582 This will work for most normal cases. */
583 for (i = 1; i < argc; i++)
584 if (strcmp (argv[i], "-G") == 0
585 && (i + 1 >= argc
3882b010 586 || ! ISDIGIT (argv[i + 1][0])))
252b5132
RH
587 argv[i] = (char *) "--shared";
588
589 /* Because we permit long options to start with a single dash, and
590 we have a --library option, and the -l option is conventionally
591 used with an immediately following argument, we can have bad
592 results if somebody tries to use -l with a library whose name
593 happens to start with "ibrary", as in -li. We avoid problems by
594 simply turning -l into --library. This means that users will
595 have to use two dashes in order to use --library, which is OK
596 since that's how it is documented.
597
598 FIXME: It's possible that this problem can arise for other short
599 options as well, although the user does always have the recourse
600 of adding a space between the option and the argument. */
601 for (i = 1; i < argc; i++)
602 {
603 if (argv[i][0] == '-'
604 && argv[i][1] == 'l'
605 && argv[i][2] != '\0')
606 {
607 char *n;
608
1e9cc1c2 609 n = (char *) xmalloc (strlen (argv[i]) + 20);
252b5132
RH
610 sprintf (n, "--library=%s", argv[i] + 2);
611 argv[i] = n;
612 }
613 }
614
615 last_optind = -1;
616 while (1)
617 {
89894c62 618 int longind;
252b5132 619 int optc;
dab69f68 620 static unsigned int defsym_count;
252b5132
RH
621
622 /* Using last_optind lets us avoid calling ldemul_parse_args
623 multiple times on a single option, which would lead to
624 confusion in the internal static variables maintained by
625 getopt. This could otherwise happen for an argument like
626 -nx, in which the -n is parsed as a single option, and we
627 loop around to pick up the -x. */
628 if (optind != last_optind)
89894c62
AM
629 if (ldemul_parse_args (argc, argv))
630 continue;
252b5132
RH
631
632 /* getopt_long_only is like getopt_long, but '-' as well as '--'
633 can indicate a long option. */
0fc3347a 634 opterr = 0;
89894c62 635 last_optind = optind;
252b5132 636 optc = getopt_long_only (argc, argv, shortopts, longopts, &longind);
0fc3347a
NC
637 if (optc == '?')
638 {
89894c62
AM
639 optind = last_optind;
640 optc = getopt_long (argc, argv, "-", really_longopts, &longind);
0fc3347a 641 }
b7ed8fad 642
3bcf5557
AM
643 if (ldemul_handle_option (optc))
644 continue;
645
252b5132
RH
646 if (optc == -1)
647 break;
0fc3347a 648
252b5132
RH
649 switch (optc)
650 {
0fc3347a 651 case '?':
89894c62 652 einfo (_("%P: unrecognized option '%s'\n"), argv[last_optind]);
058a363d
BE
653 /* Fall through. */
654
252b5132 655 default:
210a7bd1
NC
656 einfo (_("%P%F: use the --help option for usage information\n"));
657
252b5132 658 case 1: /* File name. */
1579bae1 659 lang_add_input_file (optarg, lang_input_file_is_file_enum, NULL);
252b5132
RH
660 break;
661
662 case OPTION_IGNORE:
663 break;
664 case 'a':
665 /* For HP/UX compatibility. Actually -a shared should mean
1579bae1
AM
666 ``use only shared libraries'' but, then, we don't
667 currently support shared libraries on HP/UX anyhow. */
252b5132 668 if (strcmp (optarg, "archive") == 0)
66be1055 669 input_flags.dynamic = FALSE;
252b5132
RH
670 else if (strcmp (optarg, "shared") == 0
671 || strcmp (optarg, "default") == 0)
66be1055 672 input_flags.dynamic = TRUE;
252b5132
RH
673 else
674 einfo (_("%P%F: unrecognized -a option `%s'\n"), optarg);
675 break;
676 case OPTION_ASSERT:
677 /* FIXME: We just ignore these, but we should handle them. */
678 if (strcmp (optarg, "definitions") == 0)
679 ;
680 else if (strcmp (optarg, "nodefinitions") == 0)
681 ;
682 else if (strcmp (optarg, "nosymbolic") == 0)
683 ;
684 else if (strcmp (optarg, "pure-text") == 0)
685 ;
686 else
687 einfo (_("%P%F: unrecognized -assert option `%s'\n"), optarg);
688 break;
689 case 'A':
690 ldfile_add_arch (optarg);
691 break;
692 case 'b':
693 lang_add_target (optarg);
694 break;
695 case 'c':
696 ldfile_open_command_file (optarg);
697 parser_input = input_mri_script;
698 yyparse ();
699 break;
700 case OPTION_CALL_SHARED:
66be1055 701 input_flags.dynamic = TRUE;
252b5132
RH
702 break;
703 case OPTION_NON_SHARED:
66be1055 704 input_flags.dynamic = FALSE;
252b5132
RH
705 break;
706 case OPTION_CREF:
b34976b6
AM
707 command_line.cref = TRUE;
708 link_info.notice_all = TRUE;
252b5132
RH
709 break;
710 case 'd':
b34976b6 711 command_line.force_common_definition = TRUE;
252b5132
RH
712 break;
713 case OPTION_DEFSYM:
714 lex_string = optarg;
dab69f68 715 lex_redirect (optarg, "--defsym", ++defsym_count);
252b5132 716 parser_input = input_defsym;
252b5132 717 yyparse ();
252b5132
RH
718 lex_string = NULL;
719 break;
720 case OPTION_DEMANGLE:
b34976b6 721 demangling = TRUE;
28c309a2
NC
722 if (optarg != NULL)
723 {
724 enum demangling_styles style;
5cc18311 725
28c309a2 726 style = cplus_demangle_name_to_style (optarg);
5cc18311 727 if (style == unknown_demangling)
1d6d1a2c 728 einfo (_("%F%P: unknown demangling style `%s'\n"),
28c309a2 729 optarg);
5cc18311 730
28c309a2 731 cplus_demangle_set_style (style);
e47d05ad 732 }
252b5132 733 break;
506eee22 734 case 'I': /* Used on Solaris. */
252b5132
RH
735 case OPTION_DYNAMIC_LINKER:
736 command_line.interpreter = optarg;
737 break;
e2243057
RS
738 case OPTION_SYSROOT:
739 /* Already handled in ldmain.c. */
740 break;
252b5132
RH
741 case OPTION_EB:
742 command_line.endian = ENDIAN_BIG;
743 break;
744 case OPTION_EL:
745 command_line.endian = ENDIAN_LITTLE;
746 break;
747 case OPTION_EMBEDDED_RELOCS:
b34976b6 748 command_line.embedded_relocs = TRUE;
252b5132
RH
749 break;
750 case OPTION_EXPORT_DYNAMIC:
751 case 'E': /* HP/UX compatibility. */
b34976b6 752 link_info.export_dynamic = TRUE;
252b5132 753 break;
267e2722
CD
754 case OPTION_NO_EXPORT_DYNAMIC:
755 link_info.export_dynamic = FALSE;
756 break;
252b5132 757 case 'e':
b34976b6 758 lang_add_entry (optarg, TRUE);
252b5132
RH
759 break;
760 case 'f':
761 if (command_line.auxiliary_filters == NULL)
762 {
1e9cc1c2
NC
763 command_line.auxiliary_filters = (char **)
764 xmalloc (2 * sizeof (char *));
252b5132
RH
765 command_line.auxiliary_filters[0] = optarg;
766 command_line.auxiliary_filters[1] = NULL;
767 }
768 else
769 {
770 int c;
771 char **p;
772
773 c = 0;
774 for (p = command_line.auxiliary_filters; *p != NULL; p++)
775 ++c;
1e9cc1c2
NC
776 command_line.auxiliary_filters = (char **)
777 xrealloc (command_line.auxiliary_filters,
1579bae1 778 (c + 2) * sizeof (char *));
252b5132
RH
779 command_line.auxiliary_filters[c] = optarg;
780 command_line.auxiliary_filters[c + 1] = NULL;
781 }
782 break;
783 case 'F':
784 command_line.filter_shlib = optarg;
785 break;
786 case OPTION_FORCE_EXE_SUFFIX:
b34976b6 787 command_line.force_exe_suffix = TRUE;
252b5132
RH
788 break;
789 case 'G':
790 {
791 char *end;
792 g_switch_value = strtoul (optarg, &end, 0);
793 if (*end)
794 einfo (_("%P%F: invalid number `%s'\n"), optarg);
795 }
796 break;
797 case 'g':
798 /* Ignore. */
799 break;
800 case OPTION_GC_SECTIONS:
57316bff 801 link_info.gc_sections = TRUE;
252b5132 802 break;
c17d87de
NC
803 case OPTION_PRINT_GC_SECTIONS:
804 link_info.print_gc_sections = TRUE;
805 break;
252b5132
RH
806 case OPTION_HELP:
807 help ();
808 xexit (0);
809 break;
810 case 'L':
b34976b6 811 ldfile_add_library_path (optarg, TRUE);
252b5132
RH
812 break;
813 case 'l':
1579bae1 814 lang_add_input_file (optarg, lang_input_file_is_l_enum, NULL);
252b5132
RH
815 break;
816 case 'M':
817 config.map_filename = "-";
818 break;
819 case 'm':
820 /* Ignore. Was handled in a pre-parse. */
821 break;
822 case OPTION_MAP:
823 config.map_filename = optarg;
824 break;
825 case 'N':
b34976b6
AM
826 config.text_read_only = FALSE;
827 config.magic_demand_paged = FALSE;
66be1055 828 input_flags.dynamic = FALSE;
252b5132 829 break;
63fd3b82 830 case OPTION_NO_OMAGIC:
b34976b6
AM
831 config.text_read_only = TRUE;
832 config.magic_demand_paged = TRUE;
66be1055 833 /* NB/ Does not set input_flags.dynamic to TRUE.
63fd3b82
NC
834 Use --call-shared or -Bdynamic for this. */
835 break;
252b5132 836 case 'n':
b34976b6 837 config.magic_demand_paged = FALSE;
66be1055 838 input_flags.dynamic = FALSE;
252b5132 839 break;
4818e05f 840 case OPTION_NO_DEFINE_COMMON:
b34976b6 841 command_line.inhibit_common_definition = TRUE;
4818e05f 842 break;
252b5132 843 case OPTION_NO_DEMANGLE:
b34976b6 844 demangling = FALSE;
252b5132
RH
845 break;
846 case OPTION_NO_GC_SECTIONS:
57316bff 847 link_info.gc_sections = FALSE;
252b5132 848 break;
c17d87de
NC
849 case OPTION_NO_PRINT_GC_SECTIONS:
850 link_info.print_gc_sections = FALSE;
851 break;
252b5132 852 case OPTION_NO_KEEP_MEMORY:
b34976b6 853 link_info.keep_memory = FALSE;
252b5132
RH
854 break;
855 case OPTION_NO_UNDEFINED:
6feb9908
AM
856 link_info.unresolved_syms_in_objects
857 = how_to_report_unresolved_symbols;
252b5132 858 break;
b79e8c78 859 case OPTION_ALLOW_SHLIB_UNDEFINED:
560e09e9 860 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
b79e8c78 861 break;
ae9a127f 862 case OPTION_NO_ALLOW_SHLIB_UNDEFINED:
6feb9908
AM
863 link_info.unresolved_syms_in_shared_libs
864 = how_to_report_unresolved_symbols;
ae9a127f 865 break;
560e09e9
NC
866 case OPTION_UNRESOLVED_SYMBOLS:
867 if (strcmp (optarg, "ignore-all") == 0)
868 {
869 link_info.unresolved_syms_in_objects = RM_IGNORE;
870 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
871 }
872 else if (strcmp (optarg, "report-all") == 0)
873 {
6feb9908
AM
874 link_info.unresolved_syms_in_objects
875 = how_to_report_unresolved_symbols;
876 link_info.unresolved_syms_in_shared_libs
877 = how_to_report_unresolved_symbols;
560e09e9
NC
878 }
879 else if (strcmp (optarg, "ignore-in-object-files") == 0)
880 {
881 link_info.unresolved_syms_in_objects = RM_IGNORE;
6feb9908
AM
882 link_info.unresolved_syms_in_shared_libs
883 = how_to_report_unresolved_symbols;
560e09e9
NC
884 }
885 else if (strcmp (optarg, "ignore-in-shared-libs") == 0)
886 {
6feb9908
AM
887 link_info.unresolved_syms_in_objects
888 = how_to_report_unresolved_symbols;
560e09e9
NC
889 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
890 }
891 else
892 einfo (_("%P%F: bad --unresolved-symbols option: %s\n"), optarg);
893 break;
894 case OPTION_WARN_UNRESOLVED_SYMBOLS:
895 how_to_report_unresolved_symbols = RM_GENERATE_WARNING;
896 if (link_info.unresolved_syms_in_objects == RM_GENERATE_ERROR)
897 link_info.unresolved_syms_in_objects = RM_GENERATE_WARNING;
898 if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
899 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_WARNING;
900 break;
6feb9908 901
560e09e9
NC
902 case OPTION_ERROR_UNRESOLVED_SYMBOLS:
903 how_to_report_unresolved_symbols = RM_GENERATE_ERROR;
904 if (link_info.unresolved_syms_in_objects == RM_GENERATE_WARNING)
905 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
906 if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_WARNING)
907 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
6feb9908 908 break;
aa713662 909 case OPTION_ALLOW_MULTIPLE_DEFINITION:
b34976b6 910 link_info.allow_multiple_definition = TRUE;
aa713662 911 break;
31941635 912 case OPTION_NO_UNDEFINED_VERSION:
b34976b6 913 link_info.allow_undefined_version = FALSE;
31941635 914 break;
3e3b46e5
PB
915 case OPTION_DEFAULT_SYMVER:
916 link_info.create_default_symver = TRUE;
917 break;
fc0e6df6
PB
918 case OPTION_DEFAULT_IMPORTED_SYMVER:
919 link_info.default_imported_symver = TRUE;
920 break;
252b5132 921 case OPTION_NO_WARN_MISMATCH:
b34976b6 922 command_line.warn_mismatch = FALSE;
252b5132 923 break;
fe7929ce
AM
924 case OPTION_NO_WARN_SEARCH_MISMATCH:
925 command_line.warn_search_mismatch = FALSE;
926 break;
252b5132 927 case OPTION_NOINHIBIT_EXEC:
b34976b6 928 force_make_executable = TRUE;
252b5132 929 break;
361b220e 930 case OPTION_NOSTDLIB:
b34976b6 931 config.only_cmd_line_lib_dirs = TRUE;
361b220e 932 break;
252b5132 933 case OPTION_NO_WHOLE_ARCHIVE:
66be1055 934 input_flags.whole_archive = FALSE;
252b5132
RH
935 break;
936 case 'O':
937 /* FIXME "-O<non-digits> <value>" used to set the address of
938 section <non-digits>. Was this for compatibility with
939 something, or can we create a new option to do that
940 (with a syntax similar to -defsym)?
941 getopt can't handle two args to an option without kludges. */
942
943 /* Enable optimizations of output files. */
b34976b6 944 link_info.optimize = strtoul (optarg, NULL, 0) ? TRUE : FALSE;
252b5132
RH
945 break;
946 case 'o':
5cc18311 947 lang_add_output (optarg, 0);
252b5132
RH
948 break;
949 case OPTION_OFORMAT:
1579bae1 950 lang_add_output_format (optarg, NULL, NULL, 0);
252b5132 951 break;
30824704
RM
952 case OPTION_PRINT_OUTPUT_FORMAT:
953 command_line.print_output_format = TRUE;
954 break;
5d3236ee
DK
955#ifdef ENABLE_PLUGINS
956 case OPTION_PLUGIN:
957 if (plugin_opt_plugin (optarg))
f9982339
L
958 einfo (_("%P%F: %s: error loading plugin\n"),
959 plugin_error_plugin ());
5d3236ee
DK
960 break;
961 case OPTION_PLUGIN_OPT:
962 if (plugin_opt_plugin_arg (optarg))
963 einfo(_("%P%F: bad -plugin-opt option\n"));
964 break;
965#endif /* ENABLE_PLUGINS */
a712da20 966 case 'q':
b34976b6 967 link_info.emitrelocations = TRUE;
a712da20 968 break;
8c5ff972 969 case 'i':
252b5132 970 case 'r':
210a7bd1
NC
971 if (optind == last_optind)
972 /* This can happen if the user put "-rpath,a" on the command
973 line. (Or something similar. The comma is important).
974 Getopt becomes confused and thinks that this is a -r option
975 but it cannot parse the text after the -r so it refuses to
976 increment the optind counter. Detect this case and issue
977 an error message here. We cannot just make this a warning,
978 increment optind, and continue because getopt is too confused
979 and will seg-fault the next time around. */
980 einfo(_("%P%F: bad -rpath option\n"));
b7a26f91 981
1049f94e 982 link_info.relocatable = TRUE;
b34976b6
AM
983 config.build_constructors = FALSE;
984 config.magic_demand_paged = FALSE;
985 config.text_read_only = FALSE;
66be1055 986 input_flags.dynamic = FALSE;
252b5132
RH
987 break;
988 case 'R':
989 /* The GNU linker traditionally uses -R to mean to include
990 only the symbols from a file. The Solaris linker uses -R
991 to set the path used by the runtime linker to find
992 libraries. This is the GNU linker -rpath argument. We
993 try to support both simultaneously by checking the file
994 named. If it is a directory, rather than a regular file,
995 we assume -rpath was meant. */
996 {
997 struct stat s;
998
999 if (stat (optarg, &s) >= 0
1000 && ! S_ISDIR (s.st_mode))
1001 {
1002 lang_add_input_file (optarg,
1003 lang_input_file_is_symbols_only_enum,
1579bae1 1004 NULL);
252b5132
RH
1005 break;
1006 }
1007 }
1008 /* Fall through. */
1009 case OPTION_RPATH:
1010 if (command_line.rpath == NULL)
d1b2b2dc 1011 command_line.rpath = xstrdup (optarg);
252b5132
RH
1012 else
1013 {
1014 size_t rpath_len = strlen (command_line.rpath);
1015 size_t optarg_len = strlen (optarg);
1016 char *buf;
1017 char *cp = command_line.rpath;
1018
1019 /* First see whether OPTARG is already in the path. */
1020 do
1021 {
c76308d2
RS
1022 if (strncmp (optarg, cp, optarg_len) == 0
1023 && (cp[optarg_len] == 0
1024 || cp[optarg_len] == config.rpath_separator))
252b5132
RH
1025 /* We found it. */
1026 break;
1027
1028 /* Not yet found. */
c76308d2 1029 cp = strchr (cp, config.rpath_separator);
252b5132
RH
1030 if (cp != NULL)
1031 ++cp;
1032 }
1033 while (cp != NULL);
1034
1035 if (cp == NULL)
1036 {
1e9cc1c2 1037 buf = (char *) xmalloc (rpath_len + optarg_len + 2);
c76308d2
RS
1038 sprintf (buf, "%s%c%s", command_line.rpath,
1039 config.rpath_separator, optarg);
252b5132
RH
1040 free (command_line.rpath);
1041 command_line.rpath = buf;
1042 }
1043 }
1044 break;
1045 case OPTION_RPATH_LINK:
1046 if (command_line.rpath_link == NULL)
d1b2b2dc 1047 command_line.rpath_link = xstrdup (optarg);
252b5132
RH
1048 else
1049 {
1050 char *buf;
1051
1e9cc1c2
NC
1052 buf = (char *) xmalloc (strlen (command_line.rpath_link)
1053 + strlen (optarg)
1054 + 2);
c76308d2
RS
1055 sprintf (buf, "%s%c%s", command_line.rpath_link,
1056 config.rpath_separator, optarg);
252b5132
RH
1057 free (command_line.rpath_link);
1058 command_line.rpath_link = buf;
1059 }
1060 break;
28d5f677
NC
1061 case OPTION_NO_RELAX:
1062 DISABLE_RELAXATION;
1063 break;
252b5132 1064 case OPTION_RELAX:
28d5f677 1065 ENABLE_RELAXATION;
252b5132
RH
1066 break;
1067 case OPTION_RETAIN_SYMBOLS_FILE:
1068 add_keepsyms_file (optarg);
1069 break;
1070 case 'S':
1071 link_info.strip = strip_debugger;
1072 break;
1073 case 's':
1074 link_info.strip = strip_all;
1075 break;
d5cd3933
AM
1076 case OPTION_STRIP_DISCARDED:
1077 link_info.strip_discarded = TRUE;
1078 break;
1079 case OPTION_NO_STRIP_DISCARDED:
1080 link_info.strip_discarded = FALSE;
1081 break;
252b5132
RH
1082 case OPTION_SHARED:
1083 if (config.has_shared)
560e09e9
NC
1084 {
1085 link_info.shared = TRUE;
1086 /* When creating a shared library, the default
1087 behaviour is to ignore any unresolved references. */
1088 if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
1089 link_info.unresolved_syms_in_objects = RM_IGNORE;
1090 if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
1091 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
1092 }
252b5132
RH
1093 else
1094 einfo (_("%P%F: -shared not supported\n"));
1095 break;
36af4a4e
JJ
1096 case OPTION_PIE:
1097 if (config.has_shared)
1098 {
1099 link_info.shared = TRUE;
1100 link_info.pie = TRUE;
1101 }
1102 else
1103 einfo (_("%P%F: -pie not supported\n"));
1104 break;
252b5132
RH
1105 case 'h': /* Used on Solaris. */
1106 case OPTION_SONAME:
1107 command_line.soname = optarg;
1108 break;
1109 case OPTION_SORT_COMMON:
de7dd2bd
NC
1110 if (optarg == NULL
1111 || strcmp (optarg, N_("descending")) == 0)
1112 config.sort_common = sort_descending;
1113 else if (strcmp (optarg, N_("ascending")) == 0)
1114 config.sort_common = sort_ascending;
1115 else
1116 einfo (_("%P%F: invalid common section sorting option: %s\n"),
1117 optarg);
252b5132 1118 break;
bcaa7b3e
L
1119 case OPTION_SORT_SECTION:
1120 if (strcmp (optarg, N_("name")) == 0)
1121 sort_section = by_name;
1122 else if (strcmp (optarg, N_("alignment")) == 0)
1123 sort_section = by_alignment;
1124 else
1125 einfo (_("%P%F: invalid section sorting option: %s\n"),
1126 optarg);
1127 break;
252b5132 1128 case OPTION_STATS:
b34976b6 1129 config.stats = TRUE;
252b5132
RH
1130 break;
1131 case OPTION_SYMBOLIC:
d8cf8b51
L
1132 command_line.symbolic = symbolic;
1133 break;
1134 case OPTION_SYMBOLIC_FUNCTIONS:
1135 command_line.symbolic = symbolic_functions;
252b5132
RH
1136 break;
1137 case 't':
b34976b6 1138 trace_files = TRUE;
252b5132
RH
1139 break;
1140 case 'T':
53d25da6 1141 previous_script_handle = saved_script_handle;
252b5132
RH
1142 ldfile_open_command_file (optarg);
1143 parser_input = input_script;
1144 yyparse ();
53d25da6 1145 previous_script_handle = NULL;
252b5132 1146 break;
14be8564
L
1147 case OPTION_DEFAULT_SCRIPT:
1148 command_line.default_script = optarg;
1149 break;
176355da
NC
1150 case OPTION_SECTION_START:
1151 {
1152 char *optarg2;
227aeb07
AM
1153 char *sec_name;
1154 int len;
176355da
NC
1155
1156 /* Check for <something>=<somthing>... */
1157 optarg2 = strchr (optarg, '=');
1158 if (optarg2 == NULL)
6feb9908
AM
1159 einfo (_("%P%F: invalid argument to option"
1160 " \"--section-start\"\n"));
176355da 1161
e47d05ad 1162 optarg2++;
5cc18311 1163
176355da
NC
1164 /* So far so good. Are all the args present? */
1165 if ((*optarg == '\0') || (*optarg2 == '\0'))
6feb9908
AM
1166 einfo (_("%P%F: missing argument(s) to option"
1167 " \"--section-start\"\n"));
176355da 1168
227aeb07
AM
1169 /* We must copy the section name as set_section_start
1170 doesn't do it for us. */
1171 len = optarg2 - optarg;
1e9cc1c2 1172 sec_name = (char *) xmalloc (len);
227aeb07
AM
1173 memcpy (sec_name, optarg, len - 1);
1174 sec_name[len - 1] = 0;
176355da
NC
1175
1176 /* Then set it... */
227aeb07 1177 set_section_start (sec_name, optarg2);
176355da
NC
1178 }
1179 break;
ea20a7da
CC
1180 case OPTION_TARGET_HELP:
1181 /* Mention any target specific options. */
b7a26f91
KH
1182 ldemul_list_emulation_options (stdout);
1183 exit (0);
252b5132 1184 case OPTION_TBSS:
ba916c8a 1185 set_segment_start (".bss", optarg);
252b5132
RH
1186 break;
1187 case OPTION_TDATA:
ba916c8a 1188 set_segment_start (".data", optarg);
252b5132
RH
1189 break;
1190 case OPTION_TTEXT:
ba916c8a 1191 set_segment_start (".text", optarg);
252b5132 1192 break;
258795f5
L
1193 case OPTION_TTEXT_SEGMENT:
1194 set_segment_start (".text-segment", optarg);
1195 break;
252b5132 1196 case OPTION_TRADITIONAL_FORMAT:
b34976b6 1197 link_info.traditional_format = TRUE;
252b5132
RH
1198 break;
1199 case OPTION_TASK_LINK:
b34976b6 1200 link_info.task_link = TRUE;
252b5132
RH
1201 /* Fall through - do an implied -r option. */
1202 case OPTION_UR:
1049f94e 1203 link_info.relocatable = TRUE;
b34976b6
AM
1204 config.build_constructors = TRUE;
1205 config.magic_demand_paged = FALSE;
1206 config.text_read_only = FALSE;
66be1055 1207 input_flags.dynamic = FALSE;
252b5132
RH
1208 break;
1209 case 'u':
24898b70 1210 ldlang_add_undef (optarg, TRUE);
252b5132 1211 break;
a854a4a7 1212 case OPTION_UNIQUE:
577a0623
AM
1213 if (optarg != NULL)
1214 lang_add_unique (optarg);
1215 else
b34976b6 1216 config.unique_orphan_sections = TRUE;
a854a4a7 1217 break;
252b5132
RH
1218 case OPTION_VERBOSE:
1219 ldversion (1);
b34976b6 1220 version_printed = TRUE;
cd6f1cf3 1221 verbose = TRUE;
8aae64e6 1222 overflow_cutoff_limit = -2;
1715a13c
L
1223 if (optarg != NULL)
1224 {
1225 char *end;
d436a15e 1226 int level ATTRIBUTE_UNUSED = strtoul (optarg, &end, 0);
1715a13c
L
1227 if (*end)
1228 einfo (_("%P%F: invalid number `%s'\n"), optarg);
d436a15e 1229#ifdef ENABLE_PLUGINS
1715a13c 1230 report_plugin_symbols = level > 1;
d436a15e 1231#endif /* ENABLE_PLUGINS */
1715a13c 1232 }
252b5132
RH
1233 break;
1234 case 'v':
1235 ldversion (0);
b34976b6 1236 version_printed = TRUE;
252b5132
RH
1237 break;
1238 case 'V':
1239 ldversion (1);
b34976b6 1240 version_printed = TRUE;
252b5132
RH
1241 break;
1242 case OPTION_VERSION:
d32820f2 1243 ldversion (2);
252b5132
RH
1244 xexit (0);
1245 break;
1246 case OPTION_VERSION_SCRIPT:
1247 /* This option indicates a small script that only specifies
1579bae1
AM
1248 version information. Read it, but don't assume that
1249 we've seen a linker script. */
252b5132 1250 {
b7a26f91 1251 FILE *hold_script_handle;
252b5132 1252
b9a8de1e 1253 hold_script_handle = saved_script_handle;
252b5132 1254 ldfile_open_command_file (optarg);
b9a8de1e 1255 saved_script_handle = hold_script_handle;
252b5132
RH
1256 parser_input = input_version_script;
1257 yyparse ();
1258 }
1259 break;
1260 case OPTION_VERSION_EXPORTS_SECTION:
1261 /* This option records a version symbol to be applied to the
1262 symbols listed for export to be found in the object files
1263 .exports sections. */
1264 command_line.version_exports_section = optarg;
1265 break;
40b36307 1266 case OPTION_DYNAMIC_LIST_DATA:
d8cf8b51
L
1267 command_line.dynamic_list = dynamic_list_data;
1268 if (command_line.symbolic == symbolic)
1269 command_line.symbolic = symbolic_unset;
40b36307 1270 break;
55255dae
L
1271 case OPTION_DYNAMIC_LIST_CPP_TYPEINFO:
1272 lang_append_dynamic_list_cpp_typeinfo ();
d8cf8b51
L
1273 if (command_line.dynamic_list != dynamic_list_data)
1274 command_line.dynamic_list = dynamic_list;
1275 if (command_line.symbolic == symbolic)
1276 command_line.symbolic = symbolic_unset;
40b36307
L
1277 break;
1278 case OPTION_DYNAMIC_LIST_CPP_NEW:
1279 lang_append_dynamic_list_cpp_new ();
d8cf8b51
L
1280 if (command_line.dynamic_list != dynamic_list_data)
1281 command_line.dynamic_list = dynamic_list;
1282 if (command_line.symbolic == symbolic)
1283 command_line.symbolic = symbolic_unset;
55255dae
L
1284 break;
1285 case OPTION_DYNAMIC_LIST:
1286 /* This option indicates a small script that only specifies
1287 a dynamic list. Read it, but don't assume that we've
1288 seen a linker script. */
1289 {
1290 FILE *hold_script_handle;
1291
1292 hold_script_handle = saved_script_handle;
1293 ldfile_open_command_file (optarg);
1294 saved_script_handle = hold_script_handle;
1295 parser_input = input_dynamic_list;
1296 yyparse ();
1297 }
d8cf8b51
L
1298 if (command_line.dynamic_list != dynamic_list_data)
1299 command_line.dynamic_list = dynamic_list;
1300 if (command_line.symbolic == symbolic)
1301 command_line.symbolic = symbolic_unset;
55255dae 1302 break;
252b5132 1303 case OPTION_WARN_COMMON:
b34976b6 1304 config.warn_common = TRUE;
252b5132
RH
1305 break;
1306 case OPTION_WARN_CONSTRUCTORS:
b34976b6 1307 config.warn_constructors = TRUE;
252b5132 1308 break;
7ce691ae 1309 case OPTION_WARN_FATAL:
b34976b6 1310 config.fatal_warnings = TRUE;
7ce691ae 1311 break;
0fe58ccd
NC
1312 case OPTION_NO_WARN_FATAL:
1313 config.fatal_warnings = FALSE;
1314 break;
252b5132 1315 case OPTION_WARN_MULTIPLE_GP:
b34976b6 1316 config.warn_multiple_gp = TRUE;
252b5132
RH
1317 break;
1318 case OPTION_WARN_ONCE:
b34976b6 1319 config.warn_once = TRUE;
252b5132
RH
1320 break;
1321 case OPTION_WARN_SECTION_ALIGN:
b34976b6 1322 config.warn_section_align = TRUE;
252b5132 1323 break;
8fdd7217
NC
1324 case OPTION_WARN_SHARED_TEXTREL:
1325 link_info.warn_shared_textrel = TRUE;
1326 break;
a0c402a5
L
1327 case OPTION_WARN_ALTERNATE_EM:
1328 link_info.warn_alternate_em = TRUE;
1329 break;
252b5132 1330 case OPTION_WHOLE_ARCHIVE:
66be1055 1331 input_flags.whole_archive = TRUE;
252b5132 1332 break;
ddbb8a31 1333 case OPTION_ADD_DT_NEEDED_FOR_DYNAMIC:
66be1055 1334 input_flags.add_DT_NEEDED_for_dynamic = TRUE;
e56f61be 1335 break;
ddbb8a31 1336 case OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC:
66be1055 1337 input_flags.add_DT_NEEDED_for_dynamic = FALSE;
e56f61be 1338 break;
ddbb8a31 1339 case OPTION_ADD_DT_NEEDED_FOR_REGULAR:
66be1055 1340 input_flags.add_DT_NEEDED_for_regular = TRUE;
4a43e768 1341 break;
ddbb8a31 1342 case OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR:
66be1055 1343 input_flags.add_DT_NEEDED_for_regular = FALSE;
4a43e768 1344 break;
252b5132
RH
1345 case OPTION_WRAP:
1346 add_wrap (optarg);
1347 break;
0e86e20e
AM
1348 case OPTION_IGNORE_UNRESOLVED_SYMBOL:
1349 add_ignoresym (&link_info, optarg);
1350 break;
f5fa8ca2
JJ
1351 case OPTION_DISCARD_NONE:
1352 link_info.discard = discard_none;
1353 break;
252b5132
RH
1354 case 'X':
1355 link_info.discard = discard_l;
1356 break;
1357 case 'x':
1358 link_info.discard = discard_all;
1359 break;
1360 case 'Y':
0112cd26 1361 if (CONST_STRNEQ (optarg, "P,"))
252b5132 1362 optarg += 2;
5ed6aba4
NC
1363 if (default_dirlist != NULL)
1364 free (default_dirlist);
252b5132
RH
1365 default_dirlist = xstrdup (optarg);
1366 break;
1367 case 'y':
1368 add_ysym (optarg);
1369 break;
db6751f2
JJ
1370 case OPTION_SPARE_DYNAMIC_TAGS:
1371 link_info.spare_dynamic_tags = strtoul (optarg, NULL, 0);
1372 break;
252b5132 1373 case OPTION_SPLIT_BY_RELOC:
a854a4a7
AM
1374 if (optarg != NULL)
1375 config.split_by_reloc = strtoul (optarg, NULL, 0);
1376 else
1377 config.split_by_reloc = 32768;
5cc18311 1378 break;
252b5132 1379 case OPTION_SPLIT_BY_FILE:
a854a4a7
AM
1380 if (optarg != NULL)
1381 config.split_by_file = bfd_scan_vma (optarg, NULL, 0);
1382 else
1383 config.split_by_file = 1;
5cc18311 1384 break;
252b5132 1385 case OPTION_CHECK_SECTIONS:
02b0b1aa 1386 command_line.check_section_addresses = 1;
252b5132
RH
1387 break;
1388 case OPTION_NO_CHECK_SECTIONS:
02b0b1aa 1389 command_line.check_section_addresses = 0;
252b5132 1390 break;
312b768e
NC
1391 case OPTION_ACCEPT_UNKNOWN_INPUT_ARCH:
1392 command_line.accept_unknown_input_arch = TRUE;
1393 break;
1394 case OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH:
1395 command_line.accept_unknown_input_arch = FALSE;
1396 break;
252b5132 1397 case '(':
252b5132 1398 lang_enter_group ();
20f3d0d6 1399 ingroup++;
252b5132
RH
1400 break;
1401 case ')':
1402 if (! ingroup)
210a7bd1
NC
1403 einfo (_("%P%F: group ended before it began (--help for usage)\n"));
1404
252b5132 1405 lang_leave_group ();
20f3d0d6 1406 ingroup--;
252b5132 1407 break;
3dbf70a2
MM
1408
1409 case OPTION_INIT:
1410 link_info.init_function = optarg;
1411 break;
5cc18311 1412
3dbf70a2
MM
1413 case OPTION_FINI:
1414 link_info.fini_function = optarg;
1415 break;
2d643429 1416
35835446 1417 case OPTION_REDUCE_MEMORY_OVERHEADS:
c0f00686 1418 link_info.reduce_memory_overheads = TRUE;
2d643429
NC
1419 if (config.hash_table_size == 0)
1420 config.hash_table_size = 1021;
35835446 1421 break;
2d643429
NC
1422
1423 case OPTION_HASH_SIZE:
1424 {
1425 bfd_size_type new_size;
1426
1427 new_size = strtoul (optarg, NULL, 0);
1428 if (new_size)
1429 config.hash_table_size = new_size;
1430 else
1431 einfo (_("%P%X: --hash-size needs a numeric argument\n"));
1432 }
1433 break;
252b5132
RH
1434 }
1435 }
1436
20f3d0d6
AM
1437 while (ingroup)
1438 {
1439 lang_leave_group ();
1440 ingroup--;
1441 }
252b5132
RH
1442
1443 if (default_dirlist != NULL)
5ed6aba4
NC
1444 {
1445 set_default_dirlist (default_dirlist);
1446 free (default_dirlist);
1447 }
560e09e9
NC
1448
1449 if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
1450 /* FIXME: Should we allow emulations a chance to set this ? */
1451 link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
6feb9908 1452
560e09e9
NC
1453 if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
1454 /* FIXME: Should we allow emulations a chance to set this ? */
1455 link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
5d3236ee 1456
9bbc1a67
AM
1457 if (link_info.relocatable)
1458 {
1459 if (command_line.check_section_addresses < 0)
1460 command_line.check_section_addresses = 0;
1461 if (link_info.shared)
1462 einfo (_("%P%F: -r and -shared may not be used together\n"));
1463 }
1464
1465 /* We may have -Bsymbolic, -Bsymbolic-functions, --dynamic-list-data,
1466 --dynamic-list-cpp-new, --dynamic-list-cpp-typeinfo and
1467 --dynamic-list FILE. -Bsymbolic and -Bsymbolic-functions are
1468 for shared libraries. -Bsymbolic overrides all others and vice
1469 versa. */
1470 switch (command_line.symbolic)
1471 {
1472 case symbolic_unset:
1473 break;
1474 case symbolic:
1475 /* -Bsymbolic is for shared library only. */
1476 if (link_info.shared)
1477 {
1478 link_info.symbolic = TRUE;
1479 /* Should we free the unused memory? */
1480 link_info.dynamic_list = NULL;
1481 command_line.dynamic_list = dynamic_list_unset;
1482 }
1483 break;
1484 case symbolic_functions:
1485 /* -Bsymbolic-functions is for shared library only. */
1486 if (link_info.shared)
1487 command_line.dynamic_list = dynamic_list_data;
1488 break;
1489 }
1490
1491 switch (command_line.dynamic_list)
1492 {
1493 case dynamic_list_unset:
1494 break;
1495 case dynamic_list_data:
1496 link_info.dynamic_data = TRUE;
1497 case dynamic_list:
1498 link_info.dynamic = TRUE;
1499 break;
1500 }
1501
1502 if (! link_info.shared)
1503 {
1504 if (command_line.filter_shlib)
1505 einfo (_("%P%F: -F may not be used without -shared\n"));
1506 if (command_line.auxiliary_filters)
1507 einfo (_("%P%F: -f may not be used without -shared\n"));
1508 }
1509
1510 if (! link_info.shared || link_info.pie)
1511 link_info.executable = TRUE;
1512
1513 /* Treat ld -r -s as ld -r -S -x (i.e., strip all local symbols). I
1514 don't see how else this can be handled, since in this case we
1515 must preserve all externally visible symbols. */
1516 if (link_info.relocatable && link_info.strip == strip_all)
1517 {
1518 link_info.strip = strip_debugger;
1519 if (link_info.discard == discard_sec_merge)
1520 link_info.discard = discard_all;
1521 }
252b5132
RH
1522}
1523
1524/* Add the (colon-separated) elements of DIRLIST_PTR to the
1525 library search path. */
1526
1527static void
1579bae1 1528set_default_dirlist (char *dirlist_ptr)
252b5132
RH
1529{
1530 char *p;
1531
1532 while (1)
1533 {
1534 p = strchr (dirlist_ptr, PATH_SEPARATOR);
1535 if (p != NULL)
1536 *p = '\0';
1537 if (*dirlist_ptr != '\0')
b34976b6 1538 ldfile_add_library_path (dirlist_ptr, TRUE);
252b5132
RH
1539 if (p == NULL)
1540 break;
1541 dirlist_ptr = p + 1;
1542 }
1543}
1544
1545static void
1579bae1 1546set_section_start (char *sect, char *valstr)
252b5132 1547{
93697284
AM
1548 const char *end;
1549 bfd_vma val = bfd_scan_vma (valstr, &end, 16);
252b5132
RH
1550 if (*end)
1551 einfo (_("%P%F: invalid hex number `%s'\n"), valstr);
ba916c8a 1552 lang_section_start (sect, exp_intop (val), NULL);
252b5132 1553}
ba916c8a
MM
1554
1555static void
1556set_segment_start (const char *section, char *valstr)
1557{
1558 const char *name;
1559 const char *end;
1560 segment_type *seg;
1561
1562 bfd_vma val = bfd_scan_vma (valstr, &end, 16);
1563 if (*end)
1564 einfo (_("%P%F: invalid hex number `%s'\n"), valstr);
1565 /* If we already have an entry for this segment, update the existing
1566 value. */
1567 name = section + 1;
1568 for (seg = segments; seg; seg = seg->next)
1569 if (strcmp (seg->name, name) == 0)
1570 {
1571 seg->value = val;
1572 return;
1573 }
1574 /* There was no existing value so we must create a new segment
1575 entry. */
1e9cc1c2 1576 seg = (segment_type *) stat_alloc (sizeof (*seg));
ba916c8a
MM
1577 seg->name = name;
1578 seg->value = val;
1579 seg->used = FALSE;
1580 /* Add it to the linked list of segments. */
1581 seg->next = segments;
1582 segments = seg;
1583 /* Historically, -Ttext and friends set the base address of a
1584 particular section. For backwards compatibility, we still do
1585 that. If a SEGMENT_START directive is seen, the section address
1586 assignment will be disabled. */
1587 lang_section_start (section, exp_intop (val), seg);
1588}
1589
252b5132
RH
1590\f
1591/* Print help messages for the options. */
1592
1593static void
1579bae1 1594help (void)
252b5132 1595{
e4897a32 1596 unsigned i;
252b5132 1597 const char **targets, **pp;
a55ff675 1598 int len;
252b5132
RH
1599
1600 printf (_("Usage: %s [options] file...\n"), program_name);
1601
1602 printf (_("Options:\n"));
1603 for (i = 0; i < OPTION_COUNT; i++)
1604 {
1605 if (ld_options[i].doc != NULL)
1606 {
b34976b6 1607 bfd_boolean comma;
e4897a32 1608 unsigned j;
252b5132
RH
1609
1610 printf (" ");
1611
b34976b6 1612 comma = FALSE;
252b5132
RH
1613 len = 2;
1614
1615 j = i;
1616 do
1617 {
1618 if (ld_options[j].shortopt != '\0'
1619 && ld_options[j].control != NO_HELP)
1620 {
1621 printf ("%s-%c", comma ? ", " : "", ld_options[j].shortopt);
1622 len += (comma ? 2 : 0) + 2;
1623 if (ld_options[j].arg != NULL)
1624 {
1625 if (ld_options[j].opt.has_arg != optional_argument)
1626 {
1627 printf (" ");
1628 ++len;
1629 }
1630 printf ("%s", _(ld_options[j].arg));
1631 len += strlen (_(ld_options[j].arg));
1632 }
b34976b6 1633 comma = TRUE;
252b5132
RH
1634 }
1635 ++j;
1636 }
1637 while (j < OPTION_COUNT && ld_options[j].doc == NULL);
1638
1639 j = i;
1640 do
1641 {
1642 if (ld_options[j].opt.name != NULL
1643 && ld_options[j].control != NO_HELP)
1644 {
e4897a32
NC
1645 int two_dashes =
1646 (ld_options[j].control == TWO_DASHES
1647 || ld_options[j].control == EXACTLY_TWO_DASHES);
b7a26f91 1648
252b5132
RH
1649 printf ("%s-%s%s",
1650 comma ? ", " : "",
e4897a32 1651 two_dashes ? "-" : "",
252b5132
RH
1652 ld_options[j].opt.name);
1653 len += ((comma ? 2 : 0)
1654 + 1
e4897a32 1655 + (two_dashes ? 1 : 0)
252b5132
RH
1656 + strlen (ld_options[j].opt.name));
1657 if (ld_options[j].arg != NULL)
1658 {
1659 printf (" %s", _(ld_options[j].arg));
1660 len += 1 + strlen (_(ld_options[j].arg));
1661 }
b34976b6 1662 comma = TRUE;
252b5132
RH
1663 }
1664 ++j;
1665 }
1666 while (j < OPTION_COUNT && ld_options[j].doc == NULL);
1667
1668 if (len >= 30)
1669 {
1670 printf ("\n");
1671 len = 0;
1672 }
1673
1674 for (; len < 30; len++)
1675 putchar (' ');
1676
1677 printf ("%s\n", _(ld_options[i].doc));
1678 }
1679 }
a55ff675
MM
1680 printf (_(" @FILE"));
1681 for (len = strlen (" @FILE"); len < 30; len++)
1682 putchar (' ');
1683 printf (_("Read options from FILE\n"));
252b5132 1684
f75692fe
NC
1685 /* Note: Various tools (such as libtool) depend upon the
1686 format of the listings below - do not change them. */
252b5132 1687 /* xgettext:c-format */
f75692fe 1688 printf (_("%s: supported targets:"), program_name);
252b5132
RH
1689 targets = bfd_target_list ();
1690 for (pp = targets; *pp != NULL; pp++)
1691 printf (" %s", *pp);
1692 free (targets);
1693 printf ("\n");
1694
1695 /* xgettext:c-format */
f75692fe 1696 printf (_("%s: supported emulations: "), program_name);
252b5132
RH
1697 ldemul_list_emulations (stdout);
1698 printf ("\n");
1699
1700 /* xgettext:c-format */
1701 printf (_("%s: emulation specific options:\n"), program_name);
1702 ldemul_list_emulation_options (stdout);
1703 printf ("\n");
c20f4f8c 1704
92f01d61
JM
1705 if (REPORT_BUGS_TO[0])
1706 printf (_("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132 1707}
This page took 0.630292 seconds and 4 git commands to generate.