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