lexsup.c revision 60484
1/* Parse options for the GNU linker. 2 Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000 3 Free Software Foundation, Inc. 4 5This file is part of GLD, the Gnu Linker. 6 7GLD is free software; you can redistribute it and/or modify 8it under the terms of the GNU General Public License as published by 9the Free Software Foundation; either version 2, or (at your option) 10any later version. 11 12GLD is distributed in the hope that it will be useful, 13but WITHOUT ANY WARRANTY; without even the implied warranty of 14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15GNU General Public License for more details. 16 17You should have received a copy of the GNU General Public License 18along with GLD; see the file COPYING. If not, write to the Free 19Software Foundation, 59 Temple Place - Suite 330, Boston, MA 2002111-1307, USA. */ 21 22#include "bfd.h" 23#include "sysdep.h" 24#include "libiberty.h" 25#include <stdio.h> 26#include <string.h> 27#include <ctype.h> 28#include "getopt.h" 29#include "bfdlink.h" 30#include "ld.h" 31#include "ldmain.h" 32#include "ldmisc.h" 33#include "ldexp.h" 34#include "ldlang.h" 35#include "ldgram.h" 36#include "ldlex.h" 37#include "ldfile.h" 38#include "ldver.h" 39#include "ldemul.h" 40 41#ifndef PATH_SEPARATOR 42#if defined (__MSDOS__) || (defined (_WIN32) && ! defined (__CYGWIN32__)) 43#define PATH_SEPARATOR ';' 44#else 45#define PATH_SEPARATOR ':' 46#endif 47#endif 48 49/* Somewhere above, sys/stat.h got included . . . . */ 50#if !defined(S_ISDIR) && defined(S_IFDIR) 51#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 52#endif 53 54/* Omit args to avoid the possibility of clashing with a system header 55 that might disagree about consts. */ 56unsigned long strtoul (); 57 58static int is_num PARAMS ((const char *, int, int, int)); 59static void set_default_dirlist PARAMS ((char *dirlist_ptr)); 60static void set_section_start PARAMS ((char *sect, char *valstr)); 61static void help PARAMS ((void)); 62 63/* Non-zero if we are processing a --defsym from the command line. */ 64int parsing_defsym = 0; 65 66/* Codes used for the long options with no short synonyms. 150 isn't 67 special; it's just an arbitrary non-ASCII char value. */ 68 69#define OPTION_ASSERT 150 70#define OPTION_CALL_SHARED (OPTION_ASSERT + 1) 71#define OPTION_CREF (OPTION_CALL_SHARED + 1) 72#define OPTION_DEFSYM (OPTION_CREF + 1) 73#define OPTION_DEMANGLE (OPTION_DEFSYM + 1) 74#define OPTION_DYNAMIC_LINKER (OPTION_DEMANGLE + 1) 75#define OPTION_EB (OPTION_DYNAMIC_LINKER + 1) 76#define OPTION_EL (OPTION_EB + 1) 77#define OPTION_EMBEDDED_RELOCS (OPTION_EL + 1) 78#define OPTION_EXPORT_DYNAMIC (OPTION_EMBEDDED_RELOCS + 1) 79#define OPTION_HELP (OPTION_EXPORT_DYNAMIC + 1) 80#define OPTION_IGNORE (OPTION_HELP + 1) 81#define OPTION_MAP (OPTION_IGNORE + 1) 82#define OPTION_NO_DEMANGLE (OPTION_MAP + 1) 83#define OPTION_NO_KEEP_MEMORY (OPTION_NO_DEMANGLE + 1) 84#define OPTION_NO_WARN_MISMATCH (OPTION_NO_KEEP_MEMORY + 1) 85#define OPTION_NOINHIBIT_EXEC (OPTION_NO_WARN_MISMATCH + 1) 86#define OPTION_NON_SHARED (OPTION_NOINHIBIT_EXEC + 1) 87#define OPTION_NO_WHOLE_ARCHIVE (OPTION_NON_SHARED + 1) 88#define OPTION_OFORMAT (OPTION_NO_WHOLE_ARCHIVE + 1) 89#define OPTION_RELAX (OPTION_OFORMAT + 1) 90#define OPTION_RETAIN_SYMBOLS_FILE (OPTION_RELAX + 1) 91#define OPTION_RPATH (OPTION_RETAIN_SYMBOLS_FILE + 1) 92#define OPTION_RPATH_LINK (OPTION_RPATH + 1) 93#define OPTION_SHARED (OPTION_RPATH_LINK + 1) 94#define OPTION_SONAME (OPTION_SHARED + 1) 95#define OPTION_SORT_COMMON (OPTION_SONAME + 1) 96#define OPTION_STATS (OPTION_SORT_COMMON + 1) 97#define OPTION_SYMBOLIC (OPTION_STATS + 1) 98#define OPTION_TASK_LINK (OPTION_SYMBOLIC + 1) 99#define OPTION_TBSS (OPTION_TASK_LINK + 1) 100#define OPTION_TDATA (OPTION_TBSS + 1) 101#define OPTION_TTEXT (OPTION_TDATA + 1) 102#define OPTION_TRADITIONAL_FORMAT (OPTION_TTEXT + 1) 103#define OPTION_UR (OPTION_TRADITIONAL_FORMAT + 1) 104#define OPTION_VERBOSE (OPTION_UR + 1) 105#define OPTION_VERSION (OPTION_VERBOSE + 1) 106#define OPTION_VERSION_SCRIPT (OPTION_VERSION + 1) 107#define OPTION_VERSION_EXPORTS_SECTION (OPTION_VERSION_SCRIPT + 1) 108#define OPTION_WARN_COMMON (OPTION_VERSION_EXPORTS_SECTION + 1) 109#define OPTION_WARN_CONSTRUCTORS (OPTION_WARN_COMMON + 1) 110#define OPTION_WARN_MULTIPLE_GP (OPTION_WARN_CONSTRUCTORS + 1) 111#define OPTION_WARN_ONCE (OPTION_WARN_MULTIPLE_GP + 1) 112#define OPTION_WARN_SECTION_ALIGN (OPTION_WARN_ONCE + 1) 113#define OPTION_SPLIT_BY_RELOC (OPTION_WARN_SECTION_ALIGN + 1) 114#define OPTION_SPLIT_BY_FILE (OPTION_SPLIT_BY_RELOC + 1) 115#define OPTION_WHOLE_ARCHIVE (OPTION_SPLIT_BY_FILE + 1) 116#define OPTION_WRAP (OPTION_WHOLE_ARCHIVE + 1) 117#define OPTION_FORCE_EXE_SUFFIX (OPTION_WRAP + 1) 118#define OPTION_GC_SECTIONS (OPTION_FORCE_EXE_SUFFIX + 1) 119#define OPTION_NO_GC_SECTIONS (OPTION_GC_SECTIONS + 1) 120#define OPTION_CHECK_SECTIONS (OPTION_NO_GC_SECTIONS + 1) 121#define OPTION_NO_CHECK_SECTIONS (OPTION_CHECK_SECTIONS + 1) 122#define OPTION_MPC860C0 (OPTION_NO_CHECK_SECTIONS + 1) 123#define OPTION_NO_UNDEFINED (OPTION_MPC860C0 + 1) 124#define OPTION_INIT (OPTION_NO_UNDEFINED + 1) 125#define OPTION_FINI (OPTION_INIT + 1) 126 127/* The long options. This structure is used for both the option 128 parsing and the help text. */ 129 130struct ld_option 131{ 132 /* The long option information. */ 133 struct option opt; 134 /* The short option with the same meaning ('\0' if none). */ 135 char shortopt; 136 /* The name of the argument (NULL if none). */ 137 const char *arg; 138 /* The documentation string. If this is NULL, this is a synonym for 139 the previous option. */ 140 const char *doc; 141 enum 142 { 143 /* Use one dash before long option name. */ 144 ONE_DASH, 145 /* Use two dashes before long option name. */ 146 TWO_DASHES, 147 /* Don't mention this option in --help output. */ 148 NO_HELP 149 } control; 150}; 151 152static const struct ld_option ld_options[] = 153{ 154 { {NULL, required_argument, NULL, '\0'}, 155 'a', N_("KEYWORD"), N_("Shared library control for HP/UX compatibility"), 156 ONE_DASH }, 157 { {"architecture", required_argument, NULL, 'A'}, 158 'A', N_("ARCH"), N_("Set architecture") , TWO_DASHES }, 159 { {"format", required_argument, NULL, 'b'}, 160 'b', N_("TARGET"), N_("Specify target for following input files"), TWO_DASHES }, 161 { {"mri-script", required_argument, NULL, 'c'}, 162 'c', N_("FILE"), N_("Read MRI format linker script"), TWO_DASHES }, 163 { {"dc", no_argument, NULL, 'd'}, 164 'd', NULL, N_("Force common symbols to be defined"), ONE_DASH }, 165 { {"dp", no_argument, NULL, 'd'}, 166 '\0', NULL, NULL, ONE_DASH }, 167 { {"entry", required_argument, NULL, 'e'}, 168 'e', N_("ADDRESS"), N_("Set start address"), TWO_DASHES }, 169 { {"export-dynamic", no_argument, NULL, OPTION_EXPORT_DYNAMIC}, 170 'E', NULL, N_("Export all dynamic symbols"), TWO_DASHES }, 171 { {"EB", no_argument, NULL, OPTION_EB}, 172 '\0', NULL, N_("Link big-endian objects"), ONE_DASH }, 173 { {"EL", no_argument, NULL, OPTION_EL}, 174 '\0', NULL, N_("Link little-endian objects"), ONE_DASH }, 175 { {"auxiliary", required_argument, NULL, 'f'}, 176 'f', N_("SHLIB"), N_("Auxiliary filter for shared object symbol table"), 177 TWO_DASHES }, 178 { {"filter", required_argument, NULL, 'F'}, 179 'F', N_("SHLIB"), N_("Filter for shared object symbol table"), TWO_DASHES }, 180 { {NULL, no_argument, NULL, '\0'}, 181 'g', NULL, N_("Ignored"), ONE_DASH }, 182 { {"gpsize", required_argument, NULL, 'G'}, 183 'G', N_("SIZE"), N_("Small data size (if no size, same as --shared)"), 184 TWO_DASHES }, 185 { {"soname", required_argument, NULL, OPTION_SONAME}, 186 'h', N_("FILENAME"), N_("Set internal name of shared library"), ONE_DASH }, 187 { {"library", required_argument, NULL, 'l'}, 188 'l', N_("LIBNAME"), N_("Search for library LIBNAME"), TWO_DASHES }, 189 { {"library-path", required_argument, NULL, 'L'}, 190 'L', N_("DIRECTORY"), N_("Add DIRECTORY to library search path"), TWO_DASHES }, 191 { {NULL, required_argument, NULL, '\0'}, 192 'm', N_("EMULATION"), N_("Set emulation"), ONE_DASH }, 193 { {"print-map", no_argument, NULL, 'M'}, 194 'M', NULL, N_("Print map file on standard output"), TWO_DASHES }, 195 { {"nmagic", no_argument, NULL, 'n'}, 196 'n', NULL, N_("Do not page align data"), TWO_DASHES }, 197 { {"omagic", no_argument, NULL, 'N'}, 198 'N', NULL, N_("Do not page align data, do not make text readonly"), 199 TWO_DASHES }, 200 { {"output", required_argument, NULL, 'o'}, 201 'o', N_("FILE"), N_("Set output file name"), TWO_DASHES }, 202 { {NULL, required_argument, NULL, '\0'}, 203 'O', NULL, N_("Optimize output file"), ONE_DASH }, 204 { {"Qy", no_argument, NULL, OPTION_IGNORE}, 205 '\0', NULL, N_("Ignored for SVR4 compatibility"), ONE_DASH }, 206 { {"relocateable", no_argument, NULL, 'r'}, 207 'r', NULL, N_("Generate relocateable output"), TWO_DASHES }, 208 { {NULL, no_argument, NULL, '\0'}, 209 'i', NULL, NULL, ONE_DASH }, 210 { {"just-symbols", required_argument, NULL, 'R'}, 211 'R', N_("FILE"), N_("Just link symbols (if directory, same as --rpath)"), 212 TWO_DASHES }, 213 { {"strip-all", no_argument, NULL, 's'}, 214 's', NULL, N_("Strip all symbols"), TWO_DASHES }, 215 { {"strip-debug", no_argument, NULL, 'S'}, 216 'S', NULL, N_("Strip debugging symbols"), TWO_DASHES }, 217 { {"trace", no_argument, NULL, 't'}, 218 't', NULL, N_("Trace file opens"), TWO_DASHES }, 219 { {"script", required_argument, NULL, 'T'}, 220 'T', N_("FILE"), N_("Read linker script"), TWO_DASHES }, 221 { {"undefined", required_argument, NULL, 'u'}, 222 'u', N_("SYMBOL"), N_("Start with undefined reference to SYMBOL"), TWO_DASHES }, 223 { {"Ur", no_argument, NULL, OPTION_UR}, 224 '\0', NULL, N_("Build global constructor/destructor tables"), ONE_DASH }, 225 { {"version", no_argument, NULL, OPTION_VERSION}, 226 'v', NULL, N_("Print version information"), TWO_DASHES }, 227 { {NULL, no_argument, NULL, '\0'}, 228 'V', NULL, N_("Print version and emulation information"), ONE_DASH }, 229 { {"discard-all", no_argument, NULL, 'x'}, 230 'x', NULL, N_("Discard all local symbols"), TWO_DASHES }, 231 { {"discard-locals", no_argument, NULL, 'X'}, 232 'X', NULL, N_("Discard temporary local symbols"), TWO_DASHES }, 233 { {"trace-symbol", required_argument, NULL, 'y'}, 234 'y', N_("SYMBOL"), N_("Trace mentions of SYMBOL"), TWO_DASHES }, 235 { {NULL, required_argument, NULL, '\0'}, 236 'Y', N_("PATH"), N_("Default search path for Solaris compatibility"), ONE_DASH }, 237 { {NULL, required_argument, NULL, '\0'}, 238 'z', N_("KEYWORD"), N_("Ignored for Solaris compatibility"), ONE_DASH }, 239 { {"start-group", no_argument, NULL, '('}, 240 '(', NULL, N_("Start a group"), TWO_DASHES }, 241 { {"end-group", no_argument, NULL, ')'}, 242 ')', NULL, N_("End a group"), TWO_DASHES }, 243 { {"assert", required_argument, NULL, OPTION_ASSERT}, 244 '\0', N_("KEYWORD"), N_("Ignored for SunOS compatibility"), ONE_DASH }, 245 { {"Bdynamic", no_argument, NULL, OPTION_CALL_SHARED}, 246 '\0', NULL, N_("Link against shared libraries"), ONE_DASH }, 247 { {"dy", no_argument, NULL, OPTION_CALL_SHARED}, 248 '\0', NULL, NULL, ONE_DASH }, 249 { {"call_shared", no_argument, NULL, OPTION_CALL_SHARED}, 250 '\0', NULL, NULL, ONE_DASH }, 251 { {"Bstatic", no_argument, NULL, OPTION_NON_SHARED}, 252 '\0', NULL, N_("Do not link against shared libraries"), ONE_DASH }, 253 { {"dn", no_argument, NULL, OPTION_NON_SHARED}, 254 '\0', NULL, NULL, ONE_DASH }, 255 { {"non_shared", no_argument, NULL, OPTION_NON_SHARED}, 256 '\0', NULL, NULL, ONE_DASH }, 257 { {"static", no_argument, NULL, OPTION_NON_SHARED}, 258 '\0', NULL, NULL, ONE_DASH }, 259 { {"Bsymbolic", no_argument, NULL, OPTION_SYMBOLIC}, 260 '\0', NULL, N_("Bind global references locally"), ONE_DASH }, 261 { {"check-sections", no_argument, NULL, OPTION_CHECK_SECTIONS}, 262 '\0', NULL, N_("Check section addresses for overlaps (default)"), TWO_DASHES }, 263 { {"no-check-sections", no_argument, NULL, OPTION_NO_CHECK_SECTIONS}, 264 '\0', NULL, N_("Do not check section addresses for overlaps"), 265 TWO_DASHES }, 266 { {"cref", no_argument, NULL, OPTION_CREF}, 267 '\0', NULL, N_("Output cross reference table"), TWO_DASHES }, 268 { {"defsym", required_argument, NULL, OPTION_DEFSYM}, 269 '\0', N_("SYMBOL=EXPRESSION"), N_("Define a symbol"), TWO_DASHES }, 270 { {"demangle", no_argument, NULL, OPTION_DEMANGLE}, 271 '\0', NULL, N_("Demangle symbol names"), TWO_DASHES }, 272 { {"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER}, 273 '\0', N_("PROGRAM"), N_("Set the dynamic linker to use"), TWO_DASHES }, 274 { {"embedded-relocs", no_argument, NULL, OPTION_EMBEDDED_RELOCS}, 275 '\0', NULL, N_("Generate embedded relocs"), TWO_DASHES}, 276 { {"fini", required_argument, NULL, OPTION_FINI}, 277 '\0', N_("SYMBOL"), N_("Call SYMBOL at unload-time"), ONE_DASH }, 278 { {"force-exe-suffix", no_argument, NULL, OPTION_FORCE_EXE_SUFFIX}, 279 '\0', NULL, N_("Force generation of file with .exe suffix"), TWO_DASHES}, 280 { {"gc-sections", no_argument, NULL, OPTION_GC_SECTIONS}, 281 '\0', NULL, N_("Remove unused sections (on some targets)"), 282 TWO_DASHES }, 283 { {"no-gc-sections", no_argument, NULL, OPTION_NO_GC_SECTIONS}, 284 '\0', NULL, N_("Don't remove unused sections (default)"), 285 TWO_DASHES }, 286 { {"help", no_argument, NULL, OPTION_HELP}, 287 '\0', NULL, N_("Print option help"), TWO_DASHES }, 288 { {"init", required_argument, NULL, OPTION_INIT}, 289 '\0', N_("SYMBOL"), N_("Call SYMBOL at load-time"), ONE_DASH }, 290 { {"Map", required_argument, NULL, OPTION_MAP}, 291 '\0', N_("FILE"), N_("Write a map file"), ONE_DASH }, 292 { {"no-demangle", no_argument, NULL, OPTION_NO_DEMANGLE }, 293 '\0', NULL, N_("Do not demangle symbol names"), TWO_DASHES }, 294 { {"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY}, 295 '\0', NULL, N_("Use less memory and more disk I/O"), TWO_DASHES }, 296 { {"no-undefined", no_argument, NULL, OPTION_NO_UNDEFINED}, 297 '\0', NULL, N_("Allow no undefined symbols"), TWO_DASHES }, 298 { {"no-warn-mismatch", no_argument, NULL, OPTION_NO_WARN_MISMATCH}, 299 '\0', NULL, N_("Don't warn about mismatched input files"), TWO_DASHES}, 300 { {"no-whole-archive", no_argument, NULL, OPTION_NO_WHOLE_ARCHIVE}, 301 '\0', NULL, N_("Turn off --whole-archive"), TWO_DASHES }, 302 { {"noinhibit-exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC}, 303 '\0', NULL, N_("Create an output file even if errors occur"), TWO_DASHES }, 304 { {"noinhibit_exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC}, 305 '\0', NULL, NULL, NO_HELP }, 306 { {"oformat", required_argument, NULL, OPTION_OFORMAT}, 307 '\0', N_("TARGET"), N_("Specify target of output file"), TWO_DASHES }, 308 { {"qmagic", no_argument, NULL, OPTION_IGNORE}, 309 '\0', NULL, N_("Ignored for Linux compatibility"), ONE_DASH }, 310 { {"relax", no_argument, NULL, OPTION_RELAX}, 311 '\0', NULL, N_("Relax branches on certain targets"), TWO_DASHES }, 312 { {"retain-symbols-file", required_argument, NULL, 313 OPTION_RETAIN_SYMBOLS_FILE}, 314 '\0', N_("FILE"), N_("Keep only symbols listed in FILE"), TWO_DASHES }, 315 { {"rpath", required_argument, NULL, OPTION_RPATH}, 316 '\0', N_("PATH"), N_("Set runtime shared library search path"), ONE_DASH }, 317 { {"rpath-link", required_argument, NULL, OPTION_RPATH_LINK}, 318 '\0', N_("PATH"), N_("Set link time shared library search path"), ONE_DASH }, 319 { {"shared", no_argument, NULL, OPTION_SHARED}, 320 '\0', NULL, N_("Create a shared library"), ONE_DASH }, 321 { {"Bshareable", no_argument, NULL, OPTION_SHARED }, /* FreeBSD. */ 322 '\0', NULL, NULL, ONE_DASH }, 323 { {"sort-common", no_argument, NULL, OPTION_SORT_COMMON}, 324 '\0', NULL, N_("Sort common symbols by size"), TWO_DASHES }, 325 { {"sort_common", no_argument, NULL, OPTION_SORT_COMMON}, 326 '\0', NULL, NULL, NO_HELP }, 327 { {"split-by-file", no_argument, NULL, OPTION_SPLIT_BY_FILE}, 328 '\0', NULL, N_("Split output sections for each file"), TWO_DASHES }, 329 { {"split-by-reloc", required_argument, NULL, OPTION_SPLIT_BY_RELOC}, 330 '\0', N_("COUNT"), N_("Split output sections every COUNT relocs"), TWO_DASHES }, 331 { {"stats", no_argument, NULL, OPTION_STATS}, 332 '\0', NULL, N_("Print memory usage statistics"), TWO_DASHES }, 333 { {"task-link", required_argument, NULL, OPTION_TASK_LINK}, 334 '\0', N_("SYMBOL"), N_("Do task level linking"), TWO_DASHES }, 335 { {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT}, 336 '\0', NULL, N_("Use same format as native linker"), TWO_DASHES }, 337 { {"Tbss", required_argument, NULL, OPTION_TBSS}, 338 '\0', N_("ADDRESS"), N_("Set address of .bss section"), ONE_DASH }, 339 { {"Tdata", required_argument, NULL, OPTION_TDATA}, 340 '\0', N_("ADDRESS"), N_("Set address of .data section"), ONE_DASH }, 341 { {"Ttext", required_argument, NULL, OPTION_TTEXT}, 342 '\0', N_("ADDRESS"), N_("Set address of .text section"), ONE_DASH }, 343 { {"verbose", no_argument, NULL, OPTION_VERBOSE}, 344 '\0', NULL, N_("Output lots of information during link"), TWO_DASHES }, 345 { {"dll-verbose", no_argument, NULL, OPTION_VERBOSE}, /* Linux. */ 346 '\0', NULL, NULL, NO_HELP }, 347 { {"version-script", required_argument, NULL, OPTION_VERSION_SCRIPT }, 348 '\0', N_("FILE"), N_("Read version information script"), TWO_DASHES }, 349 { {"version-exports-section", required_argument, NULL, 350 OPTION_VERSION_EXPORTS_SECTION }, 351 '\0', N_("SYMBOL"), N_("Take export symbols list from .exports, using\n\t\t\t\tSYMBOL as the version."), 352 TWO_DASHES }, 353 { {"warn-common", no_argument, NULL, OPTION_WARN_COMMON}, 354 '\0', NULL, N_("Warn about duplicate common symbols"), TWO_DASHES }, 355 { {"warn-constructors", no_argument, NULL, OPTION_WARN_CONSTRUCTORS}, 356 '\0', NULL, N_("Warn if global constructors/destructors are seen"), 357 TWO_DASHES }, 358 { {"warn-multiple-gp", no_argument, NULL, OPTION_WARN_MULTIPLE_GP}, 359 '\0', NULL, N_("Warn if the multiple GP values are used"), TWO_DASHES }, 360 { {"warn-once", no_argument, NULL, OPTION_WARN_ONCE}, 361 '\0', NULL, N_("Warn only once per undefined symbol"), TWO_DASHES }, 362 { {"warn-section-align", no_argument, NULL, OPTION_WARN_SECTION_ALIGN}, 363 '\0', NULL, N_("Warn if start of section changes due to alignment"), 364 TWO_DASHES }, 365 { {"whole-archive", no_argument, NULL, OPTION_WHOLE_ARCHIVE}, 366 '\0', NULL, N_("Include all objects from following archives"), TWO_DASHES }, 367 { {"wrap", required_argument, NULL, OPTION_WRAP}, 368 '\0', N_("SYMBOL"), N_("Use wrapper functions for SYMBOL"), TWO_DASHES }, 369 { {"mpc860c0", optional_argument, NULL, OPTION_MPC860C0}, 370 '\0', N_("[=WORDS]"), N_("Modify problematic branches in last WORDS (1-10,\n\t\t\t\tdefault 5) words of a page"), TWO_DASHES } 371}; 372 373#define OPTION_COUNT ((int) (sizeof ld_options / sizeof ld_options[0])) 374 375/* Test STRING for containing a string of digits that form a number 376 between MIN and MAX. The return value is the number or ERR. */ 377 378static int 379is_num (string, min, max, err) 380 const char *string; 381 int min; 382 int max; 383 int err; 384{ 385 int result = 0; 386 387 for (; *string; ++string) 388 { 389 if (! isdigit (*string)) 390 { 391 result = err; 392 break; 393 } 394 result = result * 10 + (*string - '0'); 395 } 396 if (result < min || result > max) 397 result = err; 398 399 return result; 400} 401 402void 403parse_args (argc, argv) 404 int argc; 405 char **argv; 406{ 407 int i, is, il; 408 int ingroup = 0; 409 char *default_dirlist = NULL; 410 char shortopts[OPTION_COUNT * 3 + 2]; 411 struct option longopts[OPTION_COUNT + 1]; 412 int last_optind; 413 414 /* Starting the short option string with '-' is for programs that 415 expect options and other ARGV-elements in any order and that care about 416 the ordering of the two. We describe each non-option ARGV-element 417 as if it were the argument of an option with character code 1. */ 418 shortopts[0] = '-'; 419 is = 1; 420 il = 0; 421 for (i = 0; i < OPTION_COUNT; i++) 422 { 423 if (ld_options[i].shortopt != '\0') 424 { 425 shortopts[is] = ld_options[i].shortopt; 426 ++is; 427 if (ld_options[i].opt.has_arg == required_argument 428 || ld_options[i].opt.has_arg == optional_argument) 429 { 430 shortopts[is] = ':'; 431 ++is; 432 if (ld_options[i].opt.has_arg == optional_argument) 433 { 434 shortopts[is] = ':'; 435 ++is; 436 } 437 } 438 } 439 if (ld_options[i].opt.name != NULL) 440 { 441 longopts[il] = ld_options[i].opt; 442 ++il; 443 } 444 } 445 shortopts[is] = '\0'; 446 longopts[il].name = NULL; 447 448 /* The -G option is ambiguous on different platforms. Sometimes it 449 specifies the largest data size to put into the small data 450 section. Sometimes it is equivalent to --shared. Unfortunately, 451 the first form takes an argument, while the second does not. 452 453 We need to permit the --shared form because on some platforms, 454 such as Solaris, gcc -shared will pass -G to the linker. 455 456 To permit either usage, we look through the argument list. If we 457 find -G not followed by a number, we change it into --shared. 458 This will work for most normal cases. */ 459 for (i = 1; i < argc; i++) 460 if (strcmp (argv[i], "-G") == 0 461 && (i + 1 >= argc 462 || ! isdigit ((unsigned char) argv[i + 1][0]))) 463 argv[i] = (char *) "--shared"; 464 465 /* Because we permit long options to start with a single dash, and 466 we have a --library option, and the -l option is conventionally 467 used with an immediately following argument, we can have bad 468 results if somebody tries to use -l with a library whose name 469 happens to start with "ibrary", as in -li. We avoid problems by 470 simply turning -l into --library. This means that users will 471 have to use two dashes in order to use --library, which is OK 472 since that's how it is documented. 473 474 FIXME: It's possible that this problem can arise for other short 475 options as well, although the user does always have the recourse 476 of adding a space between the option and the argument. */ 477 for (i = 1; i < argc; i++) 478 { 479 if (argv[i][0] == '-' 480 && argv[i][1] == 'l' 481 && argv[i][2] != '\0') 482 { 483 char *n; 484 485 n = (char *) xmalloc (strlen (argv[i]) + 20); 486 sprintf (n, "--library=%s", argv[i] + 2); 487 argv[i] = n; 488 } 489 } 490 491 last_optind = -1; 492 while (1) 493 { 494 int longind; 495 int optc; 496 497 /* Using last_optind lets us avoid calling ldemul_parse_args 498 multiple times on a single option, which would lead to 499 confusion in the internal static variables maintained by 500 getopt. This could otherwise happen for an argument like 501 -nx, in which the -n is parsed as a single option, and we 502 loop around to pick up the -x. */ 503 if (optind != last_optind) 504 { 505 if (ldemul_parse_args (argc, argv)) 506 continue; 507 last_optind = optind; 508 } 509 510 /* getopt_long_only is like getopt_long, but '-' as well as '--' 511 can indicate a long option. */ 512 optc = getopt_long_only (argc, argv, shortopts, longopts, &longind); 513 514 if (optc == -1) 515 break; 516 switch (optc) 517 { 518 default: 519 fprintf (stderr, 520 _("%s: use the --help option for usage information\n"), 521 program_name); 522 xexit (1); 523 case 1: /* File name. */ 524 lang_add_input_file (optarg, lang_input_file_is_file_enum, 525 (char *) NULL); 526 break; 527 528 case OPTION_IGNORE: 529 break; 530 case 'a': 531 /* For HP/UX compatibility. Actually -a shared should mean 532 ``use only shared libraries'' but, then, we don't 533 currently support shared libraries on HP/UX anyhow. */ 534 if (strcmp (optarg, "archive") == 0) 535 config.dynamic_link = false; 536 else if (strcmp (optarg, "shared") == 0 537 || strcmp (optarg, "default") == 0) 538 config.dynamic_link = true; 539 else 540 einfo (_("%P%F: unrecognized -a option `%s'\n"), optarg); 541 break; 542 case OPTION_ASSERT: 543 /* FIXME: We just ignore these, but we should handle them. */ 544 if (strcmp (optarg, "definitions") == 0) 545 ; 546 else if (strcmp (optarg, "nodefinitions") == 0) 547 ; 548 else if (strcmp (optarg, "nosymbolic") == 0) 549 ; 550 else if (strcmp (optarg, "pure-text") == 0) 551 ; 552 else 553 einfo (_("%P%F: unrecognized -assert option `%s'\n"), optarg); 554 break; 555 case 'A': 556 ldfile_add_arch (optarg); 557 break; 558 case 'b': 559 lang_add_target (optarg); 560 break; 561 case 'c': 562 ldfile_open_command_file (optarg); 563 parser_input = input_mri_script; 564 yyparse (); 565 break; 566 case OPTION_CALL_SHARED: 567 config.dynamic_link = true; 568 break; 569 case OPTION_NON_SHARED: 570 config.dynamic_link = false; 571 break; 572 case OPTION_CREF: 573 command_line.cref = true; 574 link_info.notice_all = true; 575 break; 576 case 'd': 577 command_line.force_common_definition = true; 578 break; 579 case OPTION_DEFSYM: 580 lex_string = optarg; 581 lex_redirect (optarg); 582 parser_input = input_defsym; 583 parsing_defsym = 1; 584 yyparse (); 585 parsing_defsym = 0; 586 lex_string = NULL; 587 break; 588 case OPTION_DEMANGLE: 589 demangling = true; 590 break; 591 case OPTION_DYNAMIC_LINKER: 592 command_line.interpreter = optarg; 593 break; 594 case OPTION_EB: 595 command_line.endian = ENDIAN_BIG; 596 break; 597 case OPTION_EL: 598 command_line.endian = ENDIAN_LITTLE; 599 break; 600 case OPTION_EMBEDDED_RELOCS: 601 command_line.embedded_relocs = true; 602 break; 603 case OPTION_EXPORT_DYNAMIC: 604 case 'E': /* HP/UX compatibility. */ 605 command_line.export_dynamic = true; 606 break; 607 case 'e': 608 lang_add_entry (optarg, true); 609 break; 610 case 'f': 611 if (command_line.auxiliary_filters == NULL) 612 { 613 command_line.auxiliary_filters = 614 (char **) xmalloc (2 * sizeof (char *)); 615 command_line.auxiliary_filters[0] = optarg; 616 command_line.auxiliary_filters[1] = NULL; 617 } 618 else 619 { 620 int c; 621 char **p; 622 623 c = 0; 624 for (p = command_line.auxiliary_filters; *p != NULL; p++) 625 ++c; 626 command_line.auxiliary_filters = 627 (char **) xrealloc (command_line.auxiliary_filters, 628 (c + 2) * sizeof (char *)); 629 command_line.auxiliary_filters[c] = optarg; 630 command_line.auxiliary_filters[c + 1] = NULL; 631 } 632 break; 633 case 'F': 634 command_line.filter_shlib = optarg; 635 break; 636 case OPTION_FORCE_EXE_SUFFIX: 637 command_line.force_exe_suffix = true; 638 break; 639 case 'G': 640 { 641 char *end; 642 g_switch_value = strtoul (optarg, &end, 0); 643 if (*end) 644 einfo (_("%P%F: invalid number `%s'\n"), optarg); 645 } 646 break; 647 case 'g': 648 /* Ignore. */ 649 break; 650 case OPTION_GC_SECTIONS: 651 command_line.gc_sections = true; 652 break; 653 case OPTION_HELP: 654 help (); 655 xexit (0); 656 break; 657 case 'L': 658 ldfile_add_library_path (optarg, true); 659 break; 660 case 'l': 661 lang_add_input_file (optarg, lang_input_file_is_l_enum, 662 (char *) NULL); 663 break; 664 case 'M': 665 config.map_filename = "-"; 666 break; 667 case 'm': 668 /* Ignore. Was handled in a pre-parse. */ 669 break; 670 case OPTION_MAP: 671 config.map_filename = optarg; 672 break; 673 case 'N': 674 config.text_read_only = false; 675 config.magic_demand_paged = false; 676 config.dynamic_link = false; 677 break; 678 case 'n': 679 config.magic_demand_paged = false; 680 config.dynamic_link = false; 681 break; 682 case OPTION_NO_DEMANGLE: 683 demangling = false; 684 break; 685 case OPTION_NO_GC_SECTIONS: 686 command_line.gc_sections = false; 687 break; 688 case OPTION_NO_KEEP_MEMORY: 689 link_info.keep_memory = false; 690 break; 691 case OPTION_NO_UNDEFINED: 692 link_info.no_undefined = true; 693 break; 694 case OPTION_NO_WARN_MISMATCH: 695 command_line.warn_mismatch = false; 696 break; 697 case OPTION_NOINHIBIT_EXEC: 698 force_make_executable = true; 699 break; 700 case OPTION_NO_WHOLE_ARCHIVE: 701 whole_archive = false; 702 break; 703 case 'O': 704 /* FIXME "-O<non-digits> <value>" used to set the address of 705 section <non-digits>. Was this for compatibility with 706 something, or can we create a new option to do that 707 (with a syntax similar to -defsym)? 708 getopt can't handle two args to an option without kludges. */ 709 710 /* Enable optimizations of output files. */ 711 link_info.optimize = strtoul (optarg, NULL, 0) ? true : false; 712 break; 713 case 'o': 714 lang_add_output (optarg, 0); 715 break; 716 case OPTION_OFORMAT: 717 lang_add_output_format (optarg, (char *) NULL, (char *) NULL, 0); 718 break; 719 case 'i': 720 case 'r': 721 link_info.relocateable = true; 722 config.build_constructors = false; 723 config.magic_demand_paged = false; 724 config.text_read_only = false; 725 config.dynamic_link = false; 726 break; 727 case 'R': 728 /* The GNU linker traditionally uses -R to mean to include 729 only the symbols from a file. The Solaris linker uses -R 730 to set the path used by the runtime linker to find 731 libraries. This is the GNU linker -rpath argument. We 732 try to support both simultaneously by checking the file 733 named. If it is a directory, rather than a regular file, 734 we assume -rpath was meant. */ 735 { 736 struct stat s; 737 738 if (stat (optarg, &s) >= 0 739 && ! S_ISDIR (s.st_mode)) 740 { 741 lang_add_input_file (optarg, 742 lang_input_file_is_symbols_only_enum, 743 (char *) NULL); 744 break; 745 } 746 } 747 /* Fall through. */ 748 case OPTION_RPATH: 749 if (command_line.rpath == NULL) 750 command_line.rpath = buystring (optarg); 751 else 752 { 753 size_t rpath_len = strlen (command_line.rpath); 754 size_t optarg_len = strlen (optarg); 755 char *buf; 756 char *cp = command_line.rpath; 757 758 /* First see whether OPTARG is already in the path. */ 759 do 760 { 761 size_t idx = 0; 762 while (optarg[idx] != '\0' && optarg[idx] == cp[idx]) 763 ++idx; 764 if (optarg[idx] == '\0' 765 && (cp[idx] == '\0' || cp[idx] == ':')) 766 /* We found it. */ 767 break; 768 769 /* Not yet found. */ 770 cp = strchr (cp, ':'); 771 if (cp != NULL) 772 ++cp; 773 } 774 while (cp != NULL); 775 776 if (cp == NULL) 777 { 778 buf = xmalloc (rpath_len + optarg_len + 2); 779 sprintf (buf, "%s:%s", command_line.rpath, optarg); 780 free (command_line.rpath); 781 command_line.rpath = buf; 782 } 783 } 784 break; 785 case OPTION_RPATH_LINK: 786 if (command_line.rpath_link == NULL) 787 command_line.rpath_link = buystring (optarg); 788 else 789 { 790 char *buf; 791 792 buf = xmalloc (strlen (command_line.rpath_link) 793 + strlen (optarg) 794 + 2); 795 sprintf (buf, "%s:%s", command_line.rpath_link, optarg); 796 free (command_line.rpath_link); 797 command_line.rpath_link = buf; 798 } 799 break; 800 case OPTION_RELAX: 801 command_line.relax = true; 802 break; 803 case OPTION_RETAIN_SYMBOLS_FILE: 804 add_keepsyms_file (optarg); 805 break; 806 case 'S': 807 link_info.strip = strip_debugger; 808 break; 809 case 's': 810 link_info.strip = strip_all; 811 break; 812 case OPTION_SHARED: 813 if (config.has_shared) 814 link_info.shared = true; 815 else 816 einfo (_("%P%F: -shared not supported\n")); 817 break; 818 case 'h': /* Used on Solaris. */ 819 case OPTION_SONAME: 820 command_line.soname = optarg; 821 break; 822 case OPTION_SORT_COMMON: 823 config.sort_common = true; 824 break; 825 case OPTION_STATS: 826 config.stats = true; 827 break; 828 case OPTION_SYMBOLIC: 829 link_info.symbolic = true; 830 break; 831 case 't': 832 trace_files = true; 833 break; 834 case 'T': 835 ldfile_open_command_file (optarg); 836 parser_input = input_script; 837 yyparse (); 838 break; 839 case OPTION_TBSS: 840 set_section_start (".bss", optarg); 841 break; 842 case OPTION_TDATA: 843 set_section_start (".data", optarg); 844 break; 845 case OPTION_TTEXT: 846 set_section_start (".text", optarg); 847 break; 848 case OPTION_TRADITIONAL_FORMAT: 849 link_info.traditional_format = true; 850 break; 851 case OPTION_TASK_LINK: 852 link_info.task_link = true; 853 /* Fall through - do an implied -r option. */ 854 case OPTION_UR: 855 link_info.relocateable = true; 856 config.build_constructors = true; 857 config.magic_demand_paged = false; 858 config.text_read_only = false; 859 config.dynamic_link = false; 860 break; 861 case 'u': 862 ldlang_add_undef (optarg); 863 break; 864 case OPTION_VERBOSE: 865 ldversion (1); 866 version_printed = true; 867 trace_file_tries = true; 868 break; 869 case 'v': 870 ldversion (0); 871 version_printed = true; 872 break; 873 case 'V': 874 ldversion (1); 875 version_printed = true; 876 break; 877 case OPTION_VERSION: 878 /* This output is intended to follow the GNU standards document. */ 879 printf ("GNU ld %s\n", ld_program_version); 880 printf (_("Copyright 1997 Free Software Foundation, Inc.\n")); 881 printf (_("\ 882This program is free software; you may redistribute it under the terms of\n\ 883the GNU General Public License. This program has absolutely no warranty.\n")); 884 { 885 ld_emulation_xfer_type **ptr = ld_emulations; 886 887 printf (_(" Supported emulations:\n")); 888 while (*ptr) 889 { 890 printf (" %s\n", (*ptr)->emulation_name); 891 ptr++; 892 } 893 } 894 xexit (0); 895 break; 896 case OPTION_VERSION_SCRIPT: 897 /* This option indicates a small script that only specifies 898 version information. Read it, but don't assume that 899 we've seen a linker script. */ 900 { 901 boolean hold_had_script; 902 903 hold_had_script = had_script; 904 ldfile_open_command_file (optarg); 905 had_script = hold_had_script; 906 parser_input = input_version_script; 907 yyparse (); 908 } 909 break; 910 case OPTION_VERSION_EXPORTS_SECTION: 911 /* This option records a version symbol to be applied to the 912 symbols listed for export to be found in the object files 913 .exports sections. */ 914 command_line.version_exports_section = optarg; 915 break; 916 case OPTION_WARN_COMMON: 917 config.warn_common = true; 918 break; 919 case OPTION_WARN_CONSTRUCTORS: 920 config.warn_constructors = true; 921 break; 922 case OPTION_WARN_MULTIPLE_GP: 923 config.warn_multiple_gp = true; 924 break; 925 case OPTION_WARN_ONCE: 926 config.warn_once = true; 927 break; 928 case OPTION_WARN_SECTION_ALIGN: 929 config.warn_section_align = true; 930 break; 931 case OPTION_WHOLE_ARCHIVE: 932 whole_archive = true; 933 break; 934 case OPTION_WRAP: 935 add_wrap (optarg); 936 break; 937 case 'X': 938 link_info.discard = discard_l; 939 break; 940 case 'x': 941 link_info.discard = discard_all; 942 break; 943 case 'Y': 944 if (strncmp (optarg, "P,", 2) == 0) 945 optarg += 2; 946 default_dirlist = xstrdup (optarg); 947 break; 948 case 'y': 949 add_ysym (optarg); 950 break; 951 case 'z': 952 /* We accept and ignore this option for Solaris 953 compatibility. Actually, on Solaris, optarg is not 954 ignored. Someday we should handle it correctly. FIXME. */ 955 break; 956 case OPTION_SPLIT_BY_RELOC: 957 config.split_by_reloc = strtoul (optarg, NULL, 0); 958 break; 959 case OPTION_SPLIT_BY_FILE: 960 config.split_by_file = true; 961 break; 962 case OPTION_CHECK_SECTIONS: 963 command_line.check_section_addresses = true; 964 break; 965 case OPTION_NO_CHECK_SECTIONS: 966 command_line.check_section_addresses = false; 967 break; 968 case '(': 969 if (ingroup) 970 { 971 fprintf (stderr, 972 _("%s: may not nest groups (--help for usage)\n"), 973 program_name); 974 xexit (1); 975 } 976 lang_enter_group (); 977 ingroup = 1; 978 break; 979 case ')': 980 if (! ingroup) 981 { 982 fprintf (stderr, 983 _("%s: group ended before it began (--help for usage)\n"), 984 program_name); 985 xexit (1); 986 } 987 lang_leave_group (); 988 ingroup = 0; 989 break; 990 case OPTION_MPC860C0: 991 link_info.mpc860c0 = 20; /* default value (in bytes) */ 992 if (optarg) 993 { 994 unsigned words; 995 996 words = is_num (optarg, 1, 10, 0); 997 if (words == 0) 998 { 999 fprintf (stderr, 1000 _("%s: Invalid argument to option \"mpc860c0\"\n"), 1001 program_name); 1002 xexit (1); 1003 } 1004 link_info.mpc860c0 = words * 4; /* convert words to bytes */ 1005 } 1006 command_line.relax = true; 1007 break; 1008 1009 case OPTION_INIT: 1010 link_info.init_function = optarg; 1011 break; 1012 1013 case OPTION_FINI: 1014 link_info.fini_function = optarg; 1015 break; 1016 } 1017 } 1018 1019 if (ingroup) 1020 lang_leave_group (); 1021 1022 if (default_dirlist != NULL) 1023 set_default_dirlist (default_dirlist); 1024 1025} 1026 1027/* Add the (colon-separated) elements of DIRLIST_PTR to the 1028 library search path. */ 1029 1030static void 1031set_default_dirlist (dirlist_ptr) 1032 char *dirlist_ptr; 1033{ 1034 char *p; 1035 1036 while (1) 1037 { 1038 p = strchr (dirlist_ptr, PATH_SEPARATOR); 1039 if (p != NULL) 1040 *p = '\0'; 1041 if (*dirlist_ptr != '\0') 1042 ldfile_add_library_path (dirlist_ptr, true); 1043 if (p == NULL) 1044 break; 1045 dirlist_ptr = p + 1; 1046 } 1047} 1048 1049static void 1050set_section_start (sect, valstr) 1051 char *sect, *valstr; 1052{ 1053 const char *end; 1054 bfd_vma val = bfd_scan_vma (valstr, &end, 16); 1055 if (*end) 1056 einfo (_("%P%F: invalid hex number `%s'\n"), valstr); 1057 lang_section_start (sect, exp_intop (val)); 1058} 1059 1060/* Print help messages for the options. */ 1061 1062static void 1063help () 1064{ 1065 int i; 1066 const char **targets, **pp; 1067 1068 printf (_("Usage: %s [options] file...\n"), program_name); 1069 1070 printf (_("Options:\n")); 1071 for (i = 0; i < OPTION_COUNT; i++) 1072 { 1073 if (ld_options[i].doc != NULL) 1074 { 1075 boolean comma; 1076 int len; 1077 int j; 1078 1079 printf (" "); 1080 1081 comma = false; 1082 len = 2; 1083 1084 j = i; 1085 do 1086 { 1087 if (ld_options[j].shortopt != '\0' 1088 && ld_options[j].control != NO_HELP) 1089 { 1090 printf ("%s-%c", comma ? ", " : "", ld_options[j].shortopt); 1091 len += (comma ? 2 : 0) + 2; 1092 if (ld_options[j].arg != NULL) 1093 { 1094 if (ld_options[j].opt.has_arg != optional_argument) 1095 { 1096 printf (" "); 1097 ++len; 1098 } 1099 printf ("%s", _(ld_options[j].arg)); 1100 len += strlen (_(ld_options[j].arg)); 1101 } 1102 comma = true; 1103 } 1104 ++j; 1105 } 1106 while (j < OPTION_COUNT && ld_options[j].doc == NULL); 1107 1108 j = i; 1109 do 1110 { 1111 if (ld_options[j].opt.name != NULL 1112 && ld_options[j].control != NO_HELP) 1113 { 1114 printf ("%s-%s%s", 1115 comma ? ", " : "", 1116 ld_options[j].control == TWO_DASHES ? "-" : "", 1117 ld_options[j].opt.name); 1118 len += ((comma ? 2 : 0) 1119 + 1 1120 + (ld_options[j].control == TWO_DASHES ? 1 : 0) 1121 + strlen (ld_options[j].opt.name)); 1122 if (ld_options[j].arg != NULL) 1123 { 1124 printf (" %s", _(ld_options[j].arg)); 1125 len += 1 + strlen (_(ld_options[j].arg)); 1126 } 1127 comma = true; 1128 } 1129 ++j; 1130 } 1131 while (j < OPTION_COUNT && ld_options[j].doc == NULL); 1132 1133 if (len >= 30) 1134 { 1135 printf ("\n"); 1136 len = 0; 1137 } 1138 1139 for (; len < 30; len++) 1140 putchar (' '); 1141 1142 printf ("%s\n", _(ld_options[i].doc)); 1143 } 1144 } 1145 1146 /* Note: Various tools (such as libtool) depend upon the 1147 format of the listings below - do not change them. */ 1148 /* xgettext:c-format */ 1149 printf (_("%s: supported targets:"), program_name); 1150 targets = bfd_target_list (); 1151 for (pp = targets; *pp != NULL; pp++) 1152 printf (" %s", *pp); 1153 free (targets); 1154 printf ("\n"); 1155 1156 /* xgettext:c-format */ 1157 printf (_("%s: supported emulations: "), program_name); 1158 ldemul_list_emulations (stdout); 1159 printf ("\n"); 1160 1161 /* xgettext:c-format */ 1162 printf (_("%s: emulation specific options:\n"), program_name); 1163 ldemul_list_emulation_options (stdout); 1164 printf ("\n"); 1165 1166 printf (_("Report bugs to %s\n"), REPORT_BUGS_TO); 1167} 1168