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