1 /* Parse options for the GNU linker.
2 Copyright (C) 1991, 92, 93, 94, 1995 Free Software Foundation, Inc.
4 This file is part of GLD, the Gnu Linker.
6 GLD is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GLD is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GLD; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
38 /* Somewhere above, sys/stat.h got included . . . . */
39 #if !defined(S_ISDIR) && defined(S_IFDIR)
40 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
43 /* Omit args to avoid the possibility of clashing with a system header
44 that might disagree about consts. */
45 unsigned long strtoul ();
47 static void set_default_dirlist PARAMS ((char *dirlist_ptr));
48 static void set_section_start PARAMS ((char *sect, char *valstr));
52 parse_args (argc, argv)
58 char *default_dirlist = NULL;
60 /* Starting the short option string with '-' is for programs that
61 expect options and other ARGV-elements in any order and that care about
62 the ordering of the two. We describe each non-option ARGV-element
63 as if it were the argument of an option with character code 1. */
65 const char *shortopts =
66 "-a:A:B::b:c:de:F::G:gh:iL:l:Mm:NnO:o:R:rSsT:tu:VvXxY:y:z:()";
68 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
70 #define OPTION_ASSERT 150
71 #define OPTION_CALL_SHARED (OPTION_ASSERT + 1)
72 #define OPTION_DEFSYM (OPTION_CALL_SHARED + 1)
73 #define OPTION_DYNAMIC_LINKER (OPTION_DEFSYM + 1)
74 #define OPTION_EB (OPTION_DYNAMIC_LINKER + 1)
75 #define OPTION_EL (OPTION_EB + 1)
76 #define OPTION_EMBEDDED_RELOCS (OPTION_EL + 1)
77 #define OPTION_EXPORT_DYNAMIC (OPTION_EMBEDDED_RELOCS + 1)
78 #define OPTION_HELP (OPTION_EXPORT_DYNAMIC + 1)
79 #define OPTION_IGNORE (OPTION_HELP + 1)
80 #define OPTION_MAP (OPTION_IGNORE + 1)
81 #define OPTION_NO_KEEP_MEMORY (OPTION_MAP + 1)
82 #define OPTION_NOINHIBIT_EXEC (OPTION_NO_KEEP_MEMORY + 1)
83 #define OPTION_NON_SHARED (OPTION_NOINHIBIT_EXEC + 1)
84 #define OPTION_OFORMAT (OPTION_NON_SHARED + 1)
85 #define OPTION_RELAX (OPTION_OFORMAT + 1)
86 #define OPTION_RETAIN_SYMBOLS_FILE (OPTION_RELAX + 1)
87 #define OPTION_RPATH (OPTION_RETAIN_SYMBOLS_FILE + 1)
88 #define OPTION_SHARED (OPTION_RPATH + 1)
89 #define OPTION_SONAME (OPTION_SHARED + 1)
90 #define OPTION_SORT_COMMON (OPTION_SONAME + 1)
91 #define OPTION_STATS (OPTION_SORT_COMMON + 1)
92 #define OPTION_SYMBOLIC (OPTION_STATS + 1)
93 #define OPTION_TBSS (OPTION_SYMBOLIC + 1)
94 #define OPTION_TDATA (OPTION_TBSS + 1)
95 #define OPTION_TTEXT (OPTION_TDATA + 1)
96 #define OPTION_TRADITIONAL_FORMAT (OPTION_TTEXT + 1)
97 #define OPTION_UR (OPTION_TRADITIONAL_FORMAT + 1)
98 #define OPTION_VERBOSE (OPTION_UR + 1)
99 #define OPTION_VERSION (OPTION_VERBOSE + 1)
100 #define OPTION_WARN_COMMON (OPTION_VERSION + 1)
101 #define OPTION_WARN_CONSTRUCTORS (OPTION_WARN_COMMON + 1)
102 #define OPTION_WARN_ONCE (OPTION_WARN_CONSTRUCTORS + 1)
103 #define OPTION_SPLIT_BY_RELOC (OPTION_WARN_ONCE + 1)
104 #define OPTION_SPLIT_BY_FILE (OPTION_SPLIT_BY_RELOC + 1)
105 #define OPTION_WHOLE_ARCHIVE (OPTION_SPLIT_BY_FILE + 1)
108 static struct option longopts[] = {
109 /* Sorted alphabeticaly, except for the PE options grouped at the end. */
110 {"assert", required_argument, NULL, OPTION_ASSERT},
111 {"Bdynamic", no_argument, NULL, OPTION_CALL_SHARED},
112 {"Bstatic", no_argument, NULL, OPTION_NON_SHARED},
113 {"Bsymbolic", no_argument, NULL, OPTION_SYMBOLIC},
114 {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
115 {"dc", no_argument, NULL, 'd'},
116 {"defsym", required_argument, NULL, OPTION_DEFSYM},
117 {"dll-verbose", no_argument, NULL, OPTION_VERSION}, /* Linux. */
118 {"dn", no_argument, NULL, OPTION_NON_SHARED},
119 {"dp", no_argument, NULL, 'd'},
120 {"dy", no_argument, NULL, OPTION_CALL_SHARED},
121 {"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER},
122 {"EB", no_argument, NULL, OPTION_EB},
123 {"EL", no_argument, NULL, OPTION_EL},
124 {"embedded-relocs", no_argument, NULL, OPTION_EMBEDDED_RELOCS},
125 {"end-group", no_argument, NULL, ')'},
126 {"export-dynamic", no_argument, NULL, OPTION_EXPORT_DYNAMIC},
127 {"format", required_argument, NULL, 'b'},
128 {"help", no_argument, NULL, OPTION_HELP},
129 {"Map", required_argument, NULL, OPTION_MAP},
130 {"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY},
131 {"noinhibit-exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC},
132 {"noinhibit_exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC},
133 {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
134 {"oformat", required_argument, NULL, OPTION_OFORMAT},
135 {"Qy", no_argument, NULL, OPTION_IGNORE},
136 {"qmagic", no_argument, NULL, OPTION_IGNORE}, /* Linux compatibility. */
137 {"relax", no_argument, NULL, OPTION_RELAX},
138 {"retain-symbols-file", required_argument, NULL, OPTION_RETAIN_SYMBOLS_FILE},
139 {"rpath", required_argument, NULL, OPTION_RPATH},
140 {"shared", no_argument, NULL, OPTION_SHARED},
141 {"soname", required_argument, NULL, OPTION_SONAME},
142 {"sort-common", no_argument, NULL, OPTION_SORT_COMMON},
143 {"sort_common", no_argument, NULL, OPTION_SORT_COMMON},
144 {"start-group", no_argument, NULL, '('},
145 {"stats", no_argument, NULL, OPTION_STATS},
146 {"static", no_argument, NULL, OPTION_NON_SHARED},
147 {"Tbss", required_argument, NULL, OPTION_TBSS},
148 {"Tdata", required_argument, NULL, OPTION_TDATA},
149 {"Ttext", required_argument, NULL, OPTION_TTEXT},
150 {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
151 {"Ur", no_argument, NULL, OPTION_UR},
152 {"verbose", no_argument, NULL, OPTION_VERBOSE},
153 {"version", no_argument, NULL, OPTION_VERSION},
154 {"warn-common", no_argument, NULL, OPTION_WARN_COMMON},
155 {"warn-constructors", no_argument, NULL, OPTION_WARN_CONSTRUCTORS},
156 {"warn-once", no_argument, NULL, OPTION_WARN_ONCE},
157 {"split-by-reloc", required_argument, NULL, OPTION_SPLIT_BY_RELOC},
158 {"split-by-file", no_argument, NULL, OPTION_SPLIT_BY_FILE},
159 {"whole-archive", no_argument, NULL, OPTION_WHOLE_ARCHIVE},
162 {NULL, no_argument, NULL, 0}
165 /* The -G option is ambiguous on different platforms. Sometimes it
166 specifies the largest data size to put into the small data
167 section. Sometimes it is equivalent to --shared. Unfortunately,
168 the first form takes an argument, while the second does not.
170 We need to permit the --shared form because on some platforms,
171 such as Solaris, gcc -shared will pass -G to the linker.
173 To permit either usage, we look through the argument list. If we
174 find -G not followed by a number, we change it into --shared.
175 This will work for most normal cases. */
176 for (i = 1; i < argc; i++)
177 if (strcmp (argv[i], "-G") == 0
179 || ! isdigit (argv[i + 1][0])))
180 argv[i] = (char *) "--shared";
184 /* getopt_long_only is like getopt_long, but '-' as well as '--' can
185 indicate a long option. */
189 if (ldemul_parse_args (argc, argv))
192 optc = getopt_long_only (argc, argv, shortopts, longopts, &longind);
200 case 1: /* File name. */
201 lang_add_input_file (optarg, lang_input_file_is_file_enum,
208 /* For HP/UX compatibility. Actually -a shared should mean
209 ``use only shared libraries'' but, then, we don't
210 currently support shared libraries on HP/UX anyhow. */
211 if (strcmp (optarg, "archive") == 0)
212 config.dynamic_link = false;
213 else if (strcmp (optarg, "shared") == 0
214 || strcmp (optarg, "default") == 0)
215 config.dynamic_link = true;
217 einfo ("%P%F: unrecognized -a option `%s'\n", optarg);
220 /* FIXME: We just ignore these, except for pure-text, but we
221 should handle them. */
222 if (strcmp (optarg, "definitions") == 0)
224 else if (strcmp (optarg, "nodefinitions") == 0)
226 else if (strcmp (optarg, "nosymbolic") == 0)
228 else if (strcmp (optarg, "pure-text") == 0)
230 /* FIXME: This is wrong. We do it this way as a hack to
231 support SunOS4, on which gcc -shared will pass
232 -assert pure-text to the linker. The SunOS linker
233 will automatically create a shared library if there
234 are any undefined symbols, but our linker does not
235 know how to do that (it seems to require an extra
236 pass over the relocs). */
237 link_info.shared = true;
240 einfo ("%P%F: unrecognized -assert option `%s'\n", optarg);
243 ldfile_add_arch (optarg);
246 lang_add_target (optarg);
249 ldfile_open_command_file (optarg);
250 parser_input = input_mri_script;
253 case OPTION_CALL_SHARED:
254 config.dynamic_link = true;
256 case OPTION_NON_SHARED:
257 config.dynamic_link = false;
260 command_line.force_common_definition = true;
263 lex_redirect (optarg);
264 parser_input = input_defsym;
267 case OPTION_DYNAMIC_LINKER:
268 command_line.interpreter = optarg;
271 command_line.endian = ENDIAN_BIG;
274 command_line.endian = ENDIAN_LITTLE;
276 case OPTION_EMBEDDED_RELOCS:
277 command_line.embedded_relocs = true;
279 case OPTION_EXPORT_DYNAMIC:
280 command_line.export_dynamic = true;
283 lang_add_entry (optarg, 1);
291 g_switch_value = strtoul (optarg, &end, 0);
293 einfo ("%P%F: invalid number `%s'\n", optarg);
304 ldfile_add_library_path (optarg, true);
307 lang_add_input_file (optarg, lang_input_file_is_l_enum,
311 config.map_filename = "-";
314 /* Ignore. Was handled in a pre-parse. */
317 config.map_filename = optarg;
320 config.text_read_only = false;
321 config.magic_demand_paged = false;
324 config.magic_demand_paged = false;
326 case OPTION_NO_KEEP_MEMORY:
327 link_info.keep_memory = false;
329 case OPTION_NOINHIBIT_EXEC:
330 force_make_executable = true;
333 /* FIXME "-O<non-digits> <value>" used to set the address of
334 section <non-digits>. Was this for compatibility with
335 something, or can we create a new option to do that
336 (with a syntax similar to -defsym)?
337 getopt can't handle two args to an option without kludges. */
340 lang_add_output (optarg, 0);
343 lang_add_output_format (optarg, (char *) NULL, (char *) NULL, 0);
347 link_info.relocateable = true;
348 config.build_constructors = false;
349 config.magic_demand_paged = false;
350 config.text_read_only = false;
351 config.dynamic_link = false;
354 /* The GNU linker traditionally uses -R to mean to include
355 only the symbols from a file. The Solaris linker uses -R
356 to set the path used by the runtime linker to find
357 libraries. This is the GNU linker -rpath argument. We
358 try to support both simultaneously by checking the file
359 named. If it is a directory, rather than a regular file,
360 we assume -rpath was meant. */
364 if (stat (optarg, &s) >= 0
365 && ! S_ISDIR (s.st_mode))
367 lang_add_input_file (optarg,
368 lang_input_file_is_symbols_only_enum,
375 if (command_line.rpath == NULL)
376 command_line.rpath = buystring (optarg);
381 buf = xmalloc (strlen (command_line.rpath)
384 sprintf (buf, "%s:%s", command_line.rpath, optarg);
385 free (command_line.rpath);
386 command_line.rpath = buf;
390 command_line.relax = true;
392 case OPTION_RETAIN_SYMBOLS_FILE:
393 add_keepsyms_file (optarg);
396 link_info.strip = strip_debugger;
399 link_info.strip = strip_all;
402 link_info.shared = true;
404 case 'h': /* Used on Solaris. */
406 command_line.soname = optarg;
408 case OPTION_SORT_COMMON:
409 config.sort_common = true;
414 case OPTION_SYMBOLIC:
415 link_info.symbolic = true;
421 ldfile_open_command_file (optarg);
422 parser_input = input_script;
426 set_section_start (".bss", optarg);
429 set_section_start (".data", optarg);
432 set_section_start (".text", optarg);
434 case OPTION_TRADITIONAL_FORMAT:
435 config.traditional_format = true;
438 link_info.relocateable = true;
439 config.build_constructors = true;
440 config.magic_demand_paged = false;
441 config.text_read_only = false;
442 config.dynamic_link = false;
445 ldlang_add_undef (optarg);
449 version_printed = true;
450 trace_file_tries = true;
454 version_printed = true;
458 version_printed = true;
462 version_printed = true;
464 case OPTION_WARN_COMMON:
465 config.warn_common = true;
467 case OPTION_WARN_CONSTRUCTORS:
468 config.warn_constructors = true;
470 case OPTION_WARN_ONCE:
471 config.warn_once = true;
473 case OPTION_WHOLE_ARCHIVE:
474 whole_archive = true;
477 link_info.discard = discard_l;
480 link_info.discard = discard_all;
483 if (strncmp (optarg, "P,", 2) == 0)
485 default_dirlist = optarg;
491 /* We accept and ignore this option for Solaris
492 compatibility. Actually, on Solaris, optarg is not
493 ignored. Someday we should handle it correctly. FIXME. */
495 case OPTION_SPLIT_BY_RELOC:
496 config.split_by_reloc = atoi (optarg);
498 case OPTION_SPLIT_BY_FILE:
499 config.split_by_file = true;
505 "%s: may not nest groups (--help for usage)\n",
516 "%s: group ended before it began (--help for usage)\n",
530 if (default_dirlist != NULL)
531 set_default_dirlist (default_dirlist);
535 /* Add the (colon-separated) elements of DIRLIST_PTR to the
536 library search path. */
539 set_default_dirlist (dirlist_ptr)
546 p = strchr (dirlist_ptr, ':');
550 ldfile_add_library_path (dirlist_ptr, true);
559 set_section_start (sect, valstr)
563 unsigned long val = strtoul (valstr, &end, 16);
565 einfo ("%P%F: invalid hex number `%s'\n", valstr);
566 lang_section_start (sect, exp_intop (val));