source: branches/libc-0.6/src/binutils/ld/lexsup.c

Last change on this file was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

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