(coff_swap_scnhdr_in): Only remove padding when processing an executable.
[binutils.git] / ld / lexsup.c
blobb8d0be4cba474d22821d13e6b5b6b000b60607ac
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.
6 This file is part of GLD, the Gnu Linker.
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.
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.
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. */
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"
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
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
56 static void set_default_dirlist (char *);
57 static void set_section_start (char *, char *);
58 static void help (void);
60 /* Non-zero if we are processing a --defsym from the command line. */
61 int parsing_defsym = 0;
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
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
147 /* The long options. This structure is used for both the option
148 parsing and the help text. */
150 struct ld_option
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;
181 static const struct ld_option ld_options[] =
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 }
448 #define OPTION_COUNT ARRAY_SIZE (ld_options)
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. */
453 static int
454 is_num (const char *string, int min, int max, int err)
456 int result = 0;
458 for (; *string; ++string)
460 if (! ISDIGIT (*string))
462 result = err;
463 break;
465 result = result * 10 + (*string - '0');
467 if (result < min || result > max)
468 result = err;
470 return result;
473 void
474 parse_args (unsigned argc, char **argv)
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;
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));
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++)
500 if (ld_options[i].shortopt != '\0')
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)
507 shortopts[is] = ':';
508 ++is;
509 if (ld_options[i].opt.has_arg == optional_argument)
511 shortopts[is] = ':';
512 ++is;
516 if (ld_options[i].opt.name != NULL)
518 if (ld_options[i].control == EXACTLY_TWO_DASHES)
520 really_longopts[irl] = ld_options[i].opt;
521 ++irl;
523 else
525 longopts[il] = ld_options[i].opt;
526 ++il;
530 shortopts[is] = '\0';
531 longopts[il].name = NULL;
532 really_longopts[irl].name = NULL;
534 ldemul_add_options (is, &shortopts, il, &longopts, irl, &really_longopts);
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.
541 We need to permit the --shared form because on some platforms,
542 such as Solaris, gcc -shared will pass -G to the linker.
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";
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.
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++)
567 if (argv[i][0] == '-'
568 && argv[i][1] == 'l'
569 && argv[i][2] != '\0')
571 char *n;
573 n = xmalloc (strlen (argv[i]) + 20);
574 sprintf (n, "--library=%s", argv[i] + 2);
575 argv[i] = n;
579 last_optind = -1;
580 while (1)
582 int longind;
583 int optc;
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;
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 == '?')
602 optind = last_optind;
603 optc = getopt_long (argc, argv, "-", really_longopts, &longind);
606 if (ldemul_handle_option (optc))
607 continue;
609 if (optc == -1)
610 break;
612 switch (optc)
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"));
619 case 1: /* File name. */
620 lang_add_input_file (optarg, lang_input_file_is_file_enum, NULL);
621 break;
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)
641 else if (strcmp (optarg, "nodefinitions") == 0)
643 else if (strcmp (optarg, "nosymbolic") == 0)
645 else if (strcmp (optarg, "pure-text") == 0)
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. Although strictly speaking
665 it is not a failure to encounter unresolved symbols at link time
666 - the symbol *might* be available at load time - it is a strong
667 indication that the resulting executable will not work. Plus it
668 is necessary for the correct execution of the autoconf package,
669 which needs to be able to detect functions that are not provided
670 by the host OS. */
671 if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
672 link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
673 if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
674 link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
675 break;
676 case OPTION_NON_SHARED:
677 config.dynamic_link = FALSE;
678 /* When linking against static libraries, the default
679 behaviour is to report any unresolved references. */
680 if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
681 link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
682 if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
683 link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
684 break;
685 case OPTION_CREF:
686 command_line.cref = TRUE;
687 link_info.notice_all = TRUE;
688 break;
689 case 'd':
690 command_line.force_common_definition = TRUE;
691 break;
692 case OPTION_DEFSYM:
693 lex_string = optarg;
694 lex_redirect (optarg);
695 parser_input = input_defsym;
696 parsing_defsym = 1;
697 yyparse ();
698 parsing_defsym = 0;
699 lex_string = NULL;
700 break;
701 case OPTION_DEMANGLE:
702 demangling = TRUE;
703 if (optarg != NULL)
705 enum demangling_styles style;
707 style = cplus_demangle_name_to_style (optarg);
708 if (style == unknown_demangling)
709 einfo (_("%F%P: unknown demangling style `%s'"),
710 optarg);
712 cplus_demangle_set_style (style);
714 break;
715 case 'I': /* Used on Solaris. */
716 case OPTION_DYNAMIC_LINKER:
717 command_line.interpreter = optarg;
718 break;
719 case OPTION_EB:
720 command_line.endian = ENDIAN_BIG;
721 break;
722 case OPTION_EL:
723 command_line.endian = ENDIAN_LITTLE;
724 break;
725 case OPTION_EMBEDDED_RELOCS:
726 command_line.embedded_relocs = TRUE;
727 break;
728 case OPTION_EXPORT_DYNAMIC:
729 case 'E': /* HP/UX compatibility. */
730 link_info.export_dynamic = TRUE;
731 break;
732 case 'e':
733 lang_add_entry (optarg, TRUE);
734 break;
735 case 'f':
736 if (command_line.auxiliary_filters == NULL)
738 command_line.auxiliary_filters = xmalloc (2 * sizeof (char *));
739 command_line.auxiliary_filters[0] = optarg;
740 command_line.auxiliary_filters[1] = NULL;
742 else
744 int c;
745 char **p;
747 c = 0;
748 for (p = command_line.auxiliary_filters; *p != NULL; p++)
749 ++c;
750 command_line.auxiliary_filters
751 = xrealloc (command_line.auxiliary_filters,
752 (c + 2) * sizeof (char *));
753 command_line.auxiliary_filters[c] = optarg;
754 command_line.auxiliary_filters[c + 1] = NULL;
756 break;
757 case 'F':
758 command_line.filter_shlib = optarg;
759 break;
760 case OPTION_FORCE_EXE_SUFFIX:
761 command_line.force_exe_suffix = TRUE;
762 break;
763 case 'G':
765 char *end;
766 g_switch_value = strtoul (optarg, &end, 0);
767 if (*end)
768 einfo (_("%P%F: invalid number `%s'\n"), optarg);
770 break;
771 case 'g':
772 /* Ignore. */
773 break;
774 case OPTION_GC_SECTIONS:
775 command_line.gc_sections = TRUE;
776 break;
777 case OPTION_HELP:
778 help ();
779 xexit (0);
780 break;
781 case 'L':
782 ldfile_add_library_path (optarg, TRUE);
783 break;
784 case 'l':
785 lang_add_input_file (optarg, lang_input_file_is_l_enum, NULL);
786 break;
787 case 'M':
788 config.map_filename = "-";
789 break;
790 case 'm':
791 /* Ignore. Was handled in a pre-parse. */
792 break;
793 case OPTION_MAP:
794 config.map_filename = optarg;
795 break;
796 case 'N':
797 config.text_read_only = FALSE;
798 config.magic_demand_paged = FALSE;
799 config.dynamic_link = FALSE;
800 break;
801 case OPTION_NO_OMAGIC:
802 config.text_read_only = TRUE;
803 config.magic_demand_paged = TRUE;
804 /* NB/ Does not set dynamic_link to TRUE.
805 Use --call-shared or -Bdynamic for this. */
806 break;
807 case 'n':
808 config.magic_demand_paged = FALSE;
809 config.dynamic_link = FALSE;
810 break;
811 case OPTION_NO_DEFINE_COMMON:
812 command_line.inhibit_common_definition = TRUE;
813 break;
814 case OPTION_NO_DEMANGLE:
815 demangling = FALSE;
816 break;
817 case OPTION_NO_GC_SECTIONS:
818 command_line.gc_sections = FALSE;
819 break;
820 case OPTION_NO_KEEP_MEMORY:
821 link_info.keep_memory = FALSE;
822 break;
823 case OPTION_NO_UNDEFINED:
824 link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
825 break;
826 case OPTION_ALLOW_SHLIB_UNDEFINED:
827 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
828 break;
829 case OPTION_NO_ALLOW_SHLIB_UNDEFINED:
830 link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
831 break;
832 case OPTION_UNRESOLVED_SYMBOLS:
833 if (strcmp (optarg, "ignore-all") == 0)
835 link_info.unresolved_syms_in_objects = RM_IGNORE;
836 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
838 else if (strcmp (optarg, "report-all") == 0)
840 link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
841 link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
843 else if (strcmp (optarg, "ignore-in-object-files") == 0)
845 link_info.unresolved_syms_in_objects = RM_IGNORE;
846 link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
848 else if (strcmp (optarg, "ignore-in-shared-libs") == 0)
850 link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
851 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
853 else
854 einfo (_("%P%F: bad --unresolved-symbols option: %s\n"), optarg);
855 break;
856 case OPTION_WARN_UNRESOLVED_SYMBOLS:
857 how_to_report_unresolved_symbols = RM_GENERATE_WARNING;
858 if (link_info.unresolved_syms_in_objects == RM_GENERATE_ERROR)
859 link_info.unresolved_syms_in_objects = RM_GENERATE_WARNING;
860 if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
861 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_WARNING;
862 break;
864 case OPTION_ERROR_UNRESOLVED_SYMBOLS:
865 how_to_report_unresolved_symbols = RM_GENERATE_ERROR;
866 if (link_info.unresolved_syms_in_objects == RM_GENERATE_WARNING)
867 link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
868 if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_WARNING)
869 link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
870 break;
871 case OPTION_ALLOW_MULTIPLE_DEFINITION:
872 link_info.allow_multiple_definition = TRUE;
873 break;
874 case OPTION_NO_UNDEFINED_VERSION:
875 link_info.allow_undefined_version = FALSE;
876 break;
877 case OPTION_NO_WARN_MISMATCH:
878 command_line.warn_mismatch = FALSE;
879 break;
880 case OPTION_NOINHIBIT_EXEC:
881 force_make_executable = TRUE;
882 break;
883 case OPTION_NOSTDLIB:
884 config.only_cmd_line_lib_dirs = TRUE;
885 break;
886 case OPTION_NO_WHOLE_ARCHIVE:
887 whole_archive = FALSE;
888 break;
889 case 'O':
890 /* FIXME "-O<non-digits> <value>" used to set the address of
891 section <non-digits>. Was this for compatibility with
892 something, or can we create a new option to do that
893 (with a syntax similar to -defsym)?
894 getopt can't handle two args to an option without kludges. */
896 /* Enable optimizations of output files. */
897 link_info.optimize = strtoul (optarg, NULL, 0) ? TRUE : FALSE;
898 break;
899 case 'o':
900 lang_add_output (optarg, 0);
901 break;
902 case OPTION_OFORMAT:
903 lang_add_output_format (optarg, NULL, NULL, 0);
904 break;
905 case 'q':
906 link_info.emitrelocations = TRUE;
907 break;
908 case 'i':
909 case 'r':
910 if (optind == last_optind)
911 /* This can happen if the user put "-rpath,a" on the command
912 line. (Or something similar. The comma is important).
913 Getopt becomes confused and thinks that this is a -r option
914 but it cannot parse the text after the -r so it refuses to
915 increment the optind counter. Detect this case and issue
916 an error message here. We cannot just make this a warning,
917 increment optind, and continue because getopt is too confused
918 and will seg-fault the next time around. */
919 einfo(_("%P%F: bad -rpath option\n"));
921 link_info.relocatable = TRUE;
922 config.build_constructors = FALSE;
923 config.magic_demand_paged = FALSE;
924 config.text_read_only = FALSE;
925 config.dynamic_link = FALSE;
926 break;
927 case 'R':
928 /* The GNU linker traditionally uses -R to mean to include
929 only the symbols from a file. The Solaris linker uses -R
930 to set the path used by the runtime linker to find
931 libraries. This is the GNU linker -rpath argument. We
932 try to support both simultaneously by checking the file
933 named. If it is a directory, rather than a regular file,
934 we assume -rpath was meant. */
936 struct stat s;
938 if (stat (optarg, &s) >= 0
939 && ! S_ISDIR (s.st_mode))
941 lang_add_input_file (optarg,
942 lang_input_file_is_symbols_only_enum,
943 NULL);
944 break;
947 /* Fall through. */
948 case OPTION_RPATH:
949 if (command_line.rpath == NULL)
950 command_line.rpath = xstrdup (optarg);
951 else
953 size_t rpath_len = strlen (command_line.rpath);
954 size_t optarg_len = strlen (optarg);
955 char *buf;
956 char *cp = command_line.rpath;
958 /* First see whether OPTARG is already in the path. */
961 size_t idx = 0;
963 while (optarg[idx] != '\0' && optarg[idx] == cp[idx])
964 ++idx;
965 if (optarg[idx] == '\0'
966 && (cp[idx] == '\0' || cp[idx] == ':'))
967 /* We found it. */
968 break;
970 /* Not yet found. */
971 cp = strchr (cp, ':');
972 if (cp != NULL)
973 ++cp;
975 while (cp != NULL);
977 if (cp == NULL)
979 buf = xmalloc (rpath_len + optarg_len + 2);
980 sprintf (buf, "%s:%s", command_line.rpath, optarg);
981 free (command_line.rpath);
982 command_line.rpath = buf;
985 break;
986 case OPTION_RPATH_LINK:
987 if (command_line.rpath_link == NULL)
988 command_line.rpath_link = xstrdup (optarg);
989 else
991 char *buf;
993 buf = xmalloc (strlen (command_line.rpath_link)
994 + strlen (optarg)
995 + 2);
996 sprintf (buf, "%s:%s", command_line.rpath_link, optarg);
997 free (command_line.rpath_link);
998 command_line.rpath_link = buf;
1000 break;
1001 case OPTION_RELAX:
1002 command_line.relax = TRUE;
1003 break;
1004 case OPTION_RETAIN_SYMBOLS_FILE:
1005 add_keepsyms_file (optarg);
1006 break;
1007 case 'S':
1008 link_info.strip = strip_debugger;
1009 break;
1010 case 's':
1011 link_info.strip = strip_all;
1012 break;
1013 case OPTION_STRIP_DISCARDED:
1014 link_info.strip_discarded = TRUE;
1015 break;
1016 case OPTION_NO_STRIP_DISCARDED:
1017 link_info.strip_discarded = FALSE;
1018 break;
1019 case OPTION_SHARED:
1020 if (config.has_shared)
1022 link_info.shared = TRUE;
1023 /* When creating a shared library, the default
1024 behaviour is to ignore any unresolved references. */
1025 if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
1026 link_info.unresolved_syms_in_objects = RM_IGNORE;
1027 if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
1028 link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
1030 else
1031 einfo (_("%P%F: -shared not supported\n"));
1032 break;
1033 case OPTION_PIE:
1034 if (config.has_shared)
1036 link_info.shared = TRUE;
1037 link_info.pie = TRUE;
1039 else
1040 einfo (_("%P%F: -pie not supported\n"));
1041 break;
1042 case 'h': /* Used on Solaris. */
1043 case OPTION_SONAME:
1044 command_line.soname = optarg;
1045 break;
1046 case OPTION_SORT_COMMON:
1047 config.sort_common = TRUE;
1048 break;
1049 case OPTION_STATS:
1050 config.stats = TRUE;
1051 break;
1052 case OPTION_SYMBOLIC:
1053 link_info.symbolic = TRUE;
1054 break;
1055 case 't':
1056 trace_files = TRUE;
1057 break;
1058 case 'T':
1059 ldfile_open_command_file (optarg);
1060 parser_input = input_script;
1061 yyparse ();
1062 break;
1063 case OPTION_SECTION_START:
1065 char *optarg2;
1066 char *sec_name;
1067 int len;
1069 /* Check for <something>=<somthing>... */
1070 optarg2 = strchr (optarg, '=');
1071 if (optarg2 == NULL)
1072 einfo (_("%P%F: invalid argument to option \"--section-start\"\n"));
1074 optarg2++;
1076 /* So far so good. Are all the args present? */
1077 if ((*optarg == '\0') || (*optarg2 == '\0'))
1078 einfo (_("%P%F: missing argument(s) to option \"--section-start\"\n"));
1080 /* We must copy the section name as set_section_start
1081 doesn't do it for us. */
1082 len = optarg2 - optarg;
1083 sec_name = xmalloc (len);
1084 memcpy (sec_name, optarg, len - 1);
1085 sec_name[len - 1] = 0;
1087 /* Then set it... */
1088 set_section_start (sec_name, optarg2);
1090 break;
1091 case OPTION_TARGET_HELP:
1092 /* Mention any target specific options. */
1093 ldemul_list_emulation_options (stdout);
1094 exit (0);
1095 case OPTION_TBSS:
1096 set_section_start (".bss", optarg);
1097 break;
1098 case OPTION_TDATA:
1099 set_section_start (".data", optarg);
1100 break;
1101 case OPTION_TTEXT:
1102 set_section_start (".text", optarg);
1103 break;
1104 case OPTION_TRADITIONAL_FORMAT:
1105 link_info.traditional_format = TRUE;
1106 break;
1107 case OPTION_TASK_LINK:
1108 link_info.task_link = TRUE;
1109 /* Fall through - do an implied -r option. */
1110 case OPTION_UR:
1111 link_info.relocatable = TRUE;
1112 config.build_constructors = TRUE;
1113 config.magic_demand_paged = FALSE;
1114 config.text_read_only = FALSE;
1115 config.dynamic_link = FALSE;
1116 break;
1117 case 'u':
1118 ldlang_add_undef (optarg);
1119 break;
1120 case OPTION_UNIQUE:
1121 if (optarg != NULL)
1122 lang_add_unique (optarg);
1123 else
1124 config.unique_orphan_sections = TRUE;
1125 break;
1126 case OPTION_VERBOSE:
1127 ldversion (1);
1128 version_printed = TRUE;
1129 trace_file_tries = TRUE;
1130 overflow_cutoff_limit = -2;
1131 break;
1132 case 'v':
1133 ldversion (0);
1134 version_printed = TRUE;
1135 break;
1136 case 'V':
1137 ldversion (1);
1138 version_printed = TRUE;
1139 break;
1140 case OPTION_VERSION:
1141 ldversion (2);
1142 xexit (0);
1143 break;
1144 case OPTION_VERSION_SCRIPT:
1145 /* This option indicates a small script that only specifies
1146 version information. Read it, but don't assume that
1147 we've seen a linker script. */
1149 FILE *hold_script_handle;
1151 hold_script_handle = saved_script_handle;
1152 ldfile_open_command_file (optarg);
1153 saved_script_handle = hold_script_handle;
1154 parser_input = input_version_script;
1155 yyparse ();
1157 break;
1158 case OPTION_VERSION_EXPORTS_SECTION:
1159 /* This option records a version symbol to be applied to the
1160 symbols listed for export to be found in the object files
1161 .exports sections. */
1162 command_line.version_exports_section = optarg;
1163 break;
1164 case OPTION_WARN_COMMON:
1165 config.warn_common = TRUE;
1166 break;
1167 case OPTION_WARN_CONSTRUCTORS:
1168 config.warn_constructors = TRUE;
1169 break;
1170 case OPTION_WARN_FATAL:
1171 config.fatal_warnings = TRUE;
1172 break;
1173 case OPTION_WARN_MULTIPLE_GP:
1174 config.warn_multiple_gp = TRUE;
1175 break;
1176 case OPTION_WARN_ONCE:
1177 config.warn_once = TRUE;
1178 break;
1179 case OPTION_WARN_SECTION_ALIGN:
1180 config.warn_section_align = TRUE;
1181 break;
1182 case OPTION_WHOLE_ARCHIVE:
1183 whole_archive = TRUE;
1184 break;
1185 case OPTION_WRAP:
1186 add_wrap (optarg);
1187 break;
1188 case OPTION_DISCARD_NONE:
1189 link_info.discard = discard_none;
1190 break;
1191 case 'X':
1192 link_info.discard = discard_l;
1193 break;
1194 case 'x':
1195 link_info.discard = discard_all;
1196 break;
1197 case 'Y':
1198 if (strncmp (optarg, "P,", 2) == 0)
1199 optarg += 2;
1200 if (default_dirlist != NULL)
1201 free (default_dirlist);
1202 default_dirlist = xstrdup (optarg);
1203 break;
1204 case 'y':
1205 add_ysym (optarg);
1206 break;
1207 case OPTION_SPARE_DYNAMIC_TAGS:
1208 link_info.spare_dynamic_tags = strtoul (optarg, NULL, 0);
1209 break;
1210 case OPTION_SPLIT_BY_RELOC:
1211 if (optarg != NULL)
1212 config.split_by_reloc = strtoul (optarg, NULL, 0);
1213 else
1214 config.split_by_reloc = 32768;
1215 break;
1216 case OPTION_SPLIT_BY_FILE:
1217 if (optarg != NULL)
1218 config.split_by_file = bfd_scan_vma (optarg, NULL, 0);
1219 else
1220 config.split_by_file = 1;
1221 break;
1222 case OPTION_CHECK_SECTIONS:
1223 command_line.check_section_addresses = TRUE;
1224 break;
1225 case OPTION_NO_CHECK_SECTIONS:
1226 command_line.check_section_addresses = FALSE;
1227 break;
1228 case OPTION_ACCEPT_UNKNOWN_INPUT_ARCH:
1229 command_line.accept_unknown_input_arch = TRUE;
1230 break;
1231 case OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH:
1232 command_line.accept_unknown_input_arch = FALSE;
1233 break;
1234 case '(':
1235 if (ingroup)
1236 einfo (_("%P%F: may not nest groups (--help for usage)\n"));
1238 lang_enter_group ();
1239 ingroup = 1;
1240 break;
1241 case ')':
1242 if (! ingroup)
1243 einfo (_("%P%F: group ended before it began (--help for usage)\n"));
1245 lang_leave_group ();
1246 ingroup = 0;
1247 break;
1248 case OPTION_MPC860C0:
1249 /* Default value (in bytes). */
1250 link_info.mpc860c0 = 20;
1251 if (optarg)
1253 unsigned words;
1255 words = is_num (optarg, 1, 10, 0);
1256 if (words == 0)
1257 einfo (_("%P%F: invalid argument to option \"mpc860c0\"\n"));
1259 /* Convert words to bytes. */
1260 link_info.mpc860c0 = words * 4;
1262 command_line.relax = TRUE;
1263 break;
1265 case OPTION_INIT:
1266 link_info.init_function = optarg;
1267 break;
1269 case OPTION_FINI:
1270 link_info.fini_function = optarg;
1271 break;
1275 if (ingroup)
1276 lang_leave_group ();
1278 if (default_dirlist != NULL)
1280 set_default_dirlist (default_dirlist);
1281 free (default_dirlist);
1284 if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
1285 /* FIXME: Should we allow emulations a chance to set this ? */
1286 link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
1288 if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
1289 /* FIXME: Should we allow emulations a chance to set this ? */
1290 link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
1293 /* Add the (colon-separated) elements of DIRLIST_PTR to the
1294 library search path. */
1296 static void
1297 set_default_dirlist (char *dirlist_ptr)
1299 char *p;
1301 while (1)
1303 p = strchr (dirlist_ptr, PATH_SEPARATOR);
1304 if (p != NULL)
1305 *p = '\0';
1306 if (*dirlist_ptr != '\0')
1307 ldfile_add_library_path (dirlist_ptr, TRUE);
1308 if (p == NULL)
1309 break;
1310 dirlist_ptr = p + 1;
1314 static void
1315 set_section_start (char *sect, char *valstr)
1317 const char *end;
1318 bfd_vma val = bfd_scan_vma (valstr, &end, 16);
1319 if (*end)
1320 einfo (_("%P%F: invalid hex number `%s'\n"), valstr);
1321 lang_section_start (sect, exp_intop (val));
1324 /* Print help messages for the options. */
1326 static void
1327 help (void)
1329 unsigned i;
1330 const char **targets, **pp;
1332 printf (_("Usage: %s [options] file...\n"), program_name);
1334 printf (_("Options:\n"));
1335 for (i = 0; i < OPTION_COUNT; i++)
1337 if (ld_options[i].doc != NULL)
1339 bfd_boolean comma;
1340 int len;
1341 unsigned j;
1343 printf (" ");
1345 comma = FALSE;
1346 len = 2;
1348 j = i;
1351 if (ld_options[j].shortopt != '\0'
1352 && ld_options[j].control != NO_HELP)
1354 printf ("%s-%c", comma ? ", " : "", ld_options[j].shortopt);
1355 len += (comma ? 2 : 0) + 2;
1356 if (ld_options[j].arg != NULL)
1358 if (ld_options[j].opt.has_arg != optional_argument)
1360 printf (" ");
1361 ++len;
1363 printf ("%s", _(ld_options[j].arg));
1364 len += strlen (_(ld_options[j].arg));
1366 comma = TRUE;
1368 ++j;
1370 while (j < OPTION_COUNT && ld_options[j].doc == NULL);
1372 j = i;
1375 if (ld_options[j].opt.name != NULL
1376 && ld_options[j].control != NO_HELP)
1378 int two_dashes =
1379 (ld_options[j].control == TWO_DASHES
1380 || ld_options[j].control == EXACTLY_TWO_DASHES);
1382 printf ("%s-%s%s",
1383 comma ? ", " : "",
1384 two_dashes ? "-" : "",
1385 ld_options[j].opt.name);
1386 len += ((comma ? 2 : 0)
1388 + (two_dashes ? 1 : 0)
1389 + strlen (ld_options[j].opt.name));
1390 if (ld_options[j].arg != NULL)
1392 printf (" %s", _(ld_options[j].arg));
1393 len += 1 + strlen (_(ld_options[j].arg));
1395 comma = TRUE;
1397 ++j;
1399 while (j < OPTION_COUNT && ld_options[j].doc == NULL);
1401 if (len >= 30)
1403 printf ("\n");
1404 len = 0;
1407 for (; len < 30; len++)
1408 putchar (' ');
1410 printf ("%s\n", _(ld_options[i].doc));
1414 /* Note: Various tools (such as libtool) depend upon the
1415 format of the listings below - do not change them. */
1416 /* xgettext:c-format */
1417 printf (_("%s: supported targets:"), program_name);
1418 targets = bfd_target_list ();
1419 for (pp = targets; *pp != NULL; pp++)
1420 printf (" %s", *pp);
1421 free (targets);
1422 printf ("\n");
1424 /* xgettext:c-format */
1425 printf (_("%s: supported emulations: "), program_name);
1426 ldemul_list_emulations (stdout);
1427 printf ("\n");
1429 /* xgettext:c-format */
1430 printf (_("%s: emulation specific options:\n"), program_name);
1431 ldemul_list_emulation_options (stdout);
1432 printf ("\n");
1434 printf (_("Report bugs to %s\n"), REPORT_BUGS_TO);