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