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
));
50 /* Non-zero if we are processing a --defsym from the command line. */
51 int parsing_defsym
= 0;
54 parse_args (argc
, argv
)
60 char *default_dirlist
= NULL
;
62 /* Starting the short option string with '-' is for programs that
63 expect options and other ARGV-elements in any order and that care about
64 the ordering of the two. We describe each non-option ARGV-element
65 as if it were the argument of an option with character code 1. */
67 const char *shortopts
=
68 "-a:A:B::b:c:de:F::G:gh:iL:l:Mm:NnO:o:R:rSsT:tu:VvXxY:y:z:()";
70 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
72 #define OPTION_ASSERT 150
73 #define OPTION_CALL_SHARED (OPTION_ASSERT + 1)
74 #define OPTION_DEFSYM (OPTION_CALL_SHARED + 1)
75 #define OPTION_DYNAMIC_LINKER (OPTION_DEFSYM + 1)
76 #define OPTION_EB (OPTION_DYNAMIC_LINKER + 1)
77 #define OPTION_EL (OPTION_EB + 1)
78 #define OPTION_EMBEDDED_RELOCS (OPTION_EL + 1)
79 #define OPTION_EXPORT_DYNAMIC (OPTION_EMBEDDED_RELOCS + 1)
80 #define OPTION_HELP (OPTION_EXPORT_DYNAMIC + 1)
81 #define OPTION_IGNORE (OPTION_HELP + 1)
82 #define OPTION_MAP (OPTION_IGNORE + 1)
83 #define OPTION_NO_KEEP_MEMORY (OPTION_MAP + 1)
84 #define OPTION_NOINHIBIT_EXEC (OPTION_NO_KEEP_MEMORY + 1)
85 #define OPTION_NON_SHARED (OPTION_NOINHIBIT_EXEC + 1)
86 #define OPTION_OFORMAT (OPTION_NON_SHARED + 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_SHARED (OPTION_RPATH + 1)
91 #define OPTION_SONAME (OPTION_SHARED + 1)
92 #define OPTION_SORT_COMMON (OPTION_SONAME + 1)
93 #define OPTION_STATS (OPTION_SORT_COMMON + 1)
94 #define OPTION_SYMBOLIC (OPTION_STATS + 1)
95 #define OPTION_TBSS (OPTION_SYMBOLIC + 1)
96 #define OPTION_TDATA (OPTION_TBSS + 1)
97 #define OPTION_TTEXT (OPTION_TDATA + 1)
98 #define OPTION_TRADITIONAL_FORMAT (OPTION_TTEXT + 1)
99 #define OPTION_UR (OPTION_TRADITIONAL_FORMAT + 1)
100 #define OPTION_VERBOSE (OPTION_UR + 1)
101 #define OPTION_VERSION (OPTION_VERBOSE + 1)
102 #define OPTION_WARN_COMMON (OPTION_VERSION + 1)
103 #define OPTION_WARN_CONSTRUCTORS (OPTION_WARN_COMMON + 1)
104 #define OPTION_WARN_ONCE (OPTION_WARN_CONSTRUCTORS + 1)
105 #define OPTION_SPLIT_BY_RELOC (OPTION_WARN_ONCE + 1)
106 #define OPTION_SPLIT_BY_FILE (OPTION_SPLIT_BY_RELOC + 1)
107 #define OPTION_WHOLE_ARCHIVE (OPTION_SPLIT_BY_FILE + 1)
110 static struct option longopts
[] = {
111 /* Sorted alphabeticaly, except for the PE options grouped at the end. */
112 {"assert", required_argument
, NULL
, OPTION_ASSERT
},
113 {"Bdynamic", no_argument
, NULL
, OPTION_CALL_SHARED
},
114 {"Bstatic", no_argument
, NULL
, OPTION_NON_SHARED
},
115 {"Bsymbolic", no_argument
, NULL
, OPTION_SYMBOLIC
},
116 {"call_shared", no_argument
, NULL
, OPTION_CALL_SHARED
},
117 {"dc", no_argument
, NULL
, 'd'},
118 {"defsym", required_argument
, NULL
, OPTION_DEFSYM
},
119 {"dll-verbose", no_argument
, NULL
, OPTION_VERSION
}, /* Linux. */
120 {"dn", no_argument
, NULL
, OPTION_NON_SHARED
},
121 {"dp", no_argument
, NULL
, 'd'},
122 {"dy", no_argument
, NULL
, OPTION_CALL_SHARED
},
123 {"dynamic-linker", required_argument
, NULL
, OPTION_DYNAMIC_LINKER
},
124 {"EB", no_argument
, NULL
, OPTION_EB
},
125 {"EL", no_argument
, NULL
, OPTION_EL
},
126 {"embedded-relocs", no_argument
, NULL
, OPTION_EMBEDDED_RELOCS
},
127 {"end-group", no_argument
, NULL
, ')'},
128 {"export-dynamic", no_argument
, NULL
, OPTION_EXPORT_DYNAMIC
},
129 {"format", required_argument
, NULL
, 'b'},
130 {"help", no_argument
, NULL
, OPTION_HELP
},
131 {"Map", required_argument
, NULL
, OPTION_MAP
},
132 {"no-keep-memory", no_argument
, NULL
, OPTION_NO_KEEP_MEMORY
},
133 {"noinhibit-exec", no_argument
, NULL
, OPTION_NOINHIBIT_EXEC
},
134 {"noinhibit_exec", no_argument
, NULL
, OPTION_NOINHIBIT_EXEC
},
135 {"non_shared", no_argument
, NULL
, OPTION_NON_SHARED
},
136 {"oformat", required_argument
, NULL
, OPTION_OFORMAT
},
137 {"Qy", no_argument
, NULL
, OPTION_IGNORE
},
138 {"qmagic", no_argument
, NULL
, OPTION_IGNORE
}, /* Linux compatibility. */
139 {"relax", no_argument
, NULL
, OPTION_RELAX
},
140 {"retain-symbols-file", required_argument
, NULL
, OPTION_RETAIN_SYMBOLS_FILE
},
141 {"rpath", required_argument
, NULL
, OPTION_RPATH
},
142 {"shared", no_argument
, NULL
, OPTION_SHARED
},
143 {"soname", required_argument
, NULL
, OPTION_SONAME
},
144 {"sort-common", no_argument
, NULL
, OPTION_SORT_COMMON
},
145 {"sort_common", no_argument
, NULL
, OPTION_SORT_COMMON
},
146 {"start-group", no_argument
, NULL
, '('},
147 {"stats", no_argument
, NULL
, OPTION_STATS
},
148 {"static", no_argument
, NULL
, OPTION_NON_SHARED
},
149 {"Tbss", required_argument
, NULL
, OPTION_TBSS
},
150 {"Tdata", required_argument
, NULL
, OPTION_TDATA
},
151 {"Ttext", required_argument
, NULL
, OPTION_TTEXT
},
152 {"traditional-format", no_argument
, NULL
, OPTION_TRADITIONAL_FORMAT
},
153 {"Ur", no_argument
, NULL
, OPTION_UR
},
154 {"verbose", no_argument
, NULL
, OPTION_VERBOSE
},
155 {"version", no_argument
, NULL
, OPTION_VERSION
},
156 {"warn-common", no_argument
, NULL
, OPTION_WARN_COMMON
},
157 {"warn-constructors", no_argument
, NULL
, OPTION_WARN_CONSTRUCTORS
},
158 {"warn-once", no_argument
, NULL
, OPTION_WARN_ONCE
},
159 {"split-by-reloc", required_argument
, NULL
, OPTION_SPLIT_BY_RELOC
},
160 {"split-by-file", no_argument
, NULL
, OPTION_SPLIT_BY_FILE
},
161 {"whole-archive", no_argument
, NULL
, OPTION_WHOLE_ARCHIVE
},
164 {NULL
, no_argument
, NULL
, 0}
167 /* The -G option is ambiguous on different platforms. Sometimes it
168 specifies the largest data size to put into the small data
169 section. Sometimes it is equivalent to --shared. Unfortunately,
170 the first form takes an argument, while the second does not.
172 We need to permit the --shared form because on some platforms,
173 such as Solaris, gcc -shared will pass -G to the linker.
175 To permit either usage, we look through the argument list. If we
176 find -G not followed by a number, we change it into --shared.
177 This will work for most normal cases. */
178 for (i
= 1; i
< argc
; i
++)
179 if (strcmp (argv
[i
], "-G") == 0
181 || ! isdigit (argv
[i
+ 1][0])))
182 argv
[i
] = (char *) "--shared";
186 /* getopt_long_only is like getopt_long, but '-' as well as '--' can
187 indicate a long option. */
191 if (ldemul_parse_args (argc
, argv
))
194 optc
= getopt_long_only (argc
, argv
, shortopts
, longopts
, &longind
);
202 case 1: /* File name. */
203 lang_add_input_file (optarg
, lang_input_file_is_file_enum
,
210 /* For HP/UX compatibility. Actually -a shared should mean
211 ``use only shared libraries'' but, then, we don't
212 currently support shared libraries on HP/UX anyhow. */
213 if (strcmp (optarg
, "archive") == 0)
214 config
.dynamic_link
= false;
215 else if (strcmp (optarg
, "shared") == 0
216 || strcmp (optarg
, "default") == 0)
217 config
.dynamic_link
= true;
219 einfo ("%P%F: unrecognized -a option `%s'\n", optarg
);
222 /* FIXME: We just ignore these, except for pure-text, but we
223 should handle them. */
224 if (strcmp (optarg
, "definitions") == 0)
226 else if (strcmp (optarg
, "nodefinitions") == 0)
228 else if (strcmp (optarg
, "nosymbolic") == 0)
230 else if (strcmp (optarg
, "pure-text") == 0)
232 /* FIXME: This is wrong. We do it this way as a hack to
233 support SunOS4, on which gcc -shared will pass
234 -assert pure-text to the linker. The SunOS linker
235 will automatically create a shared library if there
236 are any undefined symbols, but our linker does not
237 know how to do that (it seems to require an extra
238 pass over the relocs). */
239 link_info
.shared
= true;
242 einfo ("%P%F: unrecognized -assert option `%s'\n", optarg
);
245 ldfile_add_arch (optarg
);
248 lang_add_target (optarg
);
251 ldfile_open_command_file (optarg
);
252 parser_input
= input_mri_script
;
255 case OPTION_CALL_SHARED
:
256 config
.dynamic_link
= true;
258 case OPTION_NON_SHARED
:
259 config
.dynamic_link
= false;
262 command_line
.force_common_definition
= true;
266 lex_redirect (optarg
);
267 parser_input
= input_defsym
;
273 case OPTION_DYNAMIC_LINKER
:
274 command_line
.interpreter
= optarg
;
277 command_line
.endian
= ENDIAN_BIG
;
280 command_line
.endian
= ENDIAN_LITTLE
;
282 case OPTION_EMBEDDED_RELOCS
:
283 command_line
.embedded_relocs
= true;
285 case OPTION_EXPORT_DYNAMIC
:
286 command_line
.export_dynamic
= true;
289 lang_add_entry (optarg
, 1);
297 g_switch_value
= strtoul (optarg
, &end
, 0);
299 einfo ("%P%F: invalid number `%s'\n", optarg
);
310 ldfile_add_library_path (optarg
, true);
313 lang_add_input_file (optarg
, lang_input_file_is_l_enum
,
317 config
.map_filename
= "-";
320 /* Ignore. Was handled in a pre-parse. */
323 config
.map_filename
= optarg
;
326 config
.text_read_only
= false;
327 config
.magic_demand_paged
= false;
330 config
.magic_demand_paged
= false;
332 case OPTION_NO_KEEP_MEMORY
:
333 link_info
.keep_memory
= false;
335 case OPTION_NOINHIBIT_EXEC
:
336 force_make_executable
= true;
339 /* FIXME "-O<non-digits> <value>" used to set the address of
340 section <non-digits>. Was this for compatibility with
341 something, or can we create a new option to do that
342 (with a syntax similar to -defsym)?
343 getopt can't handle two args to an option without kludges. */
346 lang_add_output (optarg
, 0);
349 lang_add_output_format (optarg
, (char *) NULL
, (char *) NULL
, 0);
353 link_info
.relocateable
= true;
354 config
.build_constructors
= false;
355 config
.magic_demand_paged
= false;
356 config
.text_read_only
= false;
357 config
.dynamic_link
= false;
360 /* The GNU linker traditionally uses -R to mean to include
361 only the symbols from a file. The Solaris linker uses -R
362 to set the path used by the runtime linker to find
363 libraries. This is the GNU linker -rpath argument. We
364 try to support both simultaneously by checking the file
365 named. If it is a directory, rather than a regular file,
366 we assume -rpath was meant. */
370 if (stat (optarg
, &s
) >= 0
371 && ! S_ISDIR (s
.st_mode
))
373 lang_add_input_file (optarg
,
374 lang_input_file_is_symbols_only_enum
,
381 if (command_line
.rpath
== NULL
)
382 command_line
.rpath
= buystring (optarg
);
387 buf
= xmalloc (strlen (command_line
.rpath
)
390 sprintf (buf
, "%s:%s", command_line
.rpath
, optarg
);
391 free (command_line
.rpath
);
392 command_line
.rpath
= buf
;
396 command_line
.relax
= true;
398 case OPTION_RETAIN_SYMBOLS_FILE
:
399 add_keepsyms_file (optarg
);
402 link_info
.strip
= strip_debugger
;
405 link_info
.strip
= strip_all
;
408 link_info
.shared
= true;
410 case 'h': /* Used on Solaris. */
412 command_line
.soname
= optarg
;
414 case OPTION_SORT_COMMON
:
415 config
.sort_common
= true;
420 case OPTION_SYMBOLIC
:
421 link_info
.symbolic
= true;
427 ldfile_open_command_file (optarg
);
428 parser_input
= input_script
;
432 set_section_start (".bss", optarg
);
435 set_section_start (".data", optarg
);
438 set_section_start (".text", optarg
);
440 case OPTION_TRADITIONAL_FORMAT
:
441 config
.traditional_format
= true;
444 link_info
.relocateable
= true;
445 config
.build_constructors
= true;
446 config
.magic_demand_paged
= false;
447 config
.text_read_only
= false;
448 config
.dynamic_link
= false;
451 ldlang_add_undef (optarg
);
455 version_printed
= true;
456 trace_file_tries
= true;
460 version_printed
= true;
464 version_printed
= true;
468 version_printed
= true;
470 case OPTION_WARN_COMMON
:
471 config
.warn_common
= true;
473 case OPTION_WARN_CONSTRUCTORS
:
474 config
.warn_constructors
= true;
476 case OPTION_WARN_ONCE
:
477 config
.warn_once
= true;
479 case OPTION_WHOLE_ARCHIVE
:
480 whole_archive
= true;
483 link_info
.discard
= discard_l
;
486 link_info
.discard
= discard_all
;
489 if (strncmp (optarg
, "P,", 2) == 0)
491 default_dirlist
= optarg
;
497 /* We accept and ignore this option for Solaris
498 compatibility. Actually, on Solaris, optarg is not
499 ignored. Someday we should handle it correctly. FIXME. */
501 case OPTION_SPLIT_BY_RELOC
:
502 config
.split_by_reloc
= atoi (optarg
);
504 case OPTION_SPLIT_BY_FILE
:
505 config
.split_by_file
= true;
511 "%s: may not nest groups (--help for usage)\n",
522 "%s: group ended before it began (--help for usage)\n",
536 if (default_dirlist
!= NULL
)
537 set_default_dirlist (default_dirlist
);
541 /* Add the (colon-separated) elements of DIRLIST_PTR to the
542 library search path. */
545 set_default_dirlist (dirlist_ptr
)
552 p
= strchr (dirlist_ptr
, ':');
556 ldfile_add_library_path (dirlist_ptr
, true);
565 set_section_start (sect
, valstr
)
569 unsigned long val
= strtoul (valstr
, &end
, 16);
571 einfo ("%P%F: invalid hex number `%s'\n", valstr
);
572 lang_section_start (sect
, exp_intop (val
));