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