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