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