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