(linenum→info "unix/slp.c:2238")

binutils/2.18/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, 2004, 2005, 2006, 2007
    4:    Free Software Foundation, Inc.
    5: 
    6:    This file is part of the GNU Binutils.
    7: 
    8:    This program 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 3 of the License, or
   11:    (at your option) any later version.
   12: 
   13:    This program 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 this program; if not, write to the Free Software
   20:    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   21:    MA 02110-1301, USA.  */
   22: 
   23: #include "sysdep.h"
   24: #include "bfd.h"
   25: #include "bfdver.h"
   26: #include "libiberty.h"
   27: #include <stdio.h>
   28: #include <string.h>
   29: #include "safe-ctype.h"
   30: #include "getopt.h"
   31: #include "bfdlink.h"
   32: #include "ld.h"
   33: #include "ldmain.h"
   34: #include "ldmisc.h"
   35: #include "ldexp.h"
   36: #include "ldlang.h"
   37: #include <ldgram.h>
   38: #include "ldlex.h"
   39: #include "ldfile.h"
   40: #include "ldver.h"
   41: #include "ldemul.h"
   42: #include "demangle.h"
   43: 
   44: #ifndef PATH_SEPARATOR
   45: #if defined (__MSDOS__) || (defined (_WIN32) && ! defined (__CYGWIN32__))
   46: #define PATH_SEPARATOR ';'
   47: #else
   48: #define PATH_SEPARATOR ':'
   49: #endif
   50: #endif
   51: 
   52: /* Somewhere above, sys/stat.h got included . . . .  */
   53: #if !defined(S_ISDIR) && defined(S_IFDIR)
   54: #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
   55: #endif
   56: 
   57: static void set_default_dirlist (char *);
   58: static void set_section_start (char *, char *);
   59: static void set_segment_start (const char *, char *);
   60: static void help (void);
   61: 
   62: /* Non-zero if we are processing a --defsym from the command line.  */
   63: int parsing_defsym = 0;
   64: 
   65: /* Codes used for the long options with no short synonyms.  150 isn't
   66:    special; it's just an arbitrary non-ASCII char value.  */
   67: enum option_values
   68: {
   69:   OPTION_ASSERT = 150,
   70:   OPTION_CALL_SHARED,
   71:   OPTION_CREF,
   72:   OPTION_DEFSYM,
   73:   OPTION_DEMANGLE,
   74:   OPTION_DYNAMIC_LINKER,
   75:   OPTION_SYSROOT,
   76:   OPTION_EB,
   77:   OPTION_EL,
   78:   OPTION_EMBEDDED_RELOCS,
   79:   OPTION_EXPORT_DYNAMIC,
   80:   OPTION_HELP,
   81:   OPTION_IGNORE,
   82:   OPTION_MAP,
   83:   OPTION_NO_DEMANGLE,
   84:   OPTION_NO_KEEP_MEMORY,
   85:   OPTION_NO_WARN_MISMATCH,
   86:   OPTION_NO_WARN_SEARCH_MISMATCH,
   87:   OPTION_NOINHIBIT_EXEC,
   88:   OPTION_NON_SHARED,
   89:   OPTION_NO_WHOLE_ARCHIVE,
   90:   OPTION_OFORMAT,
   91:   OPTION_RELAX,
   92:   OPTION_RETAIN_SYMBOLS_FILE,
   93:   OPTION_RPATH,
   94:   OPTION_RPATH_LINK,
   95:   OPTION_SHARED,
   96:   OPTION_SONAME,
   97:   OPTION_SORT_COMMON,
   98:   OPTION_SORT_SECTION,
   99:   OPTION_STATS,
  100:   OPTION_SYMBOLIC,
  101:   OPTION_SYMBOLIC_FUNCTIONS,
  102:   OPTION_TASK_LINK,
  103:   OPTION_TBSS,
  104:   OPTION_TDATA,
  105:   OPTION_TTEXT,
  106:   OPTION_TRADITIONAL_FORMAT,
  107:   OPTION_UR,
  108:   OPTION_VERBOSE,
  109:   OPTION_VERSION,
  110:   OPTION_VERSION_SCRIPT,
  111:   OPTION_VERSION_EXPORTS_SECTION,
  112:   OPTION_DYNAMIC_LIST,
  113:   OPTION_DYNAMIC_LIST_CPP_NEW,
  114:   OPTION_DYNAMIC_LIST_CPP_TYPEINFO,
  115:   OPTION_DYNAMIC_LIST_DATA,
  116:   OPTION_WARN_COMMON,
  117:   OPTION_WARN_CONSTRUCTORS,
  118:   OPTION_WARN_FATAL,
  119:   OPTION_WARN_MULTIPLE_GP,
  120:   OPTION_WARN_ONCE,
  121:   OPTION_WARN_SECTION_ALIGN,
  122:   OPTION_SPLIT_BY_RELOC,
  123:   OPTION_SPLIT_BY_FILE ,
  124:   OPTION_WHOLE_ARCHIVE,
  125:   OPTION_ADD_NEEDED,
  126:   OPTION_NO_ADD_NEEDED,
  127:   OPTION_AS_NEEDED,
  128:   OPTION_NO_AS_NEEDED,
  129:   OPTION_WRAP,
  130:   OPTION_FORCE_EXE_SUFFIX,
  131:   OPTION_GC_SECTIONS,
  132:   OPTION_NO_GC_SECTIONS,
  133:   OPTION_PRINT_GC_SECTIONS,
  134:   OPTION_NO_PRINT_GC_SECTIONS,
  135:   OPTION_HASH_SIZE,
  136:   OPTION_CHECK_SECTIONS,
  137:   OPTION_NO_CHECK_SECTIONS,
  138:   OPTION_NO_UNDEFINED,
  139:   OPTION_INIT,
  140:   OPTION_FINI,
  141:   OPTION_SECTION_START,
  142:   OPTION_UNIQUE,
  143:   OPTION_TARGET_HELP,
  144:   OPTION_ALLOW_SHLIB_UNDEFINED,
  145:   OPTION_NO_ALLOW_SHLIB_UNDEFINED,
  146:   OPTION_ALLOW_MULTIPLE_DEFINITION,
  147:   OPTION_NO_UNDEFINED_VERSION,
  148:   OPTION_DEFAULT_SYMVER,
  149:   OPTION_DEFAULT_IMPORTED_SYMVER,
  150:   OPTION_DISCARD_NONE,
  151:   OPTION_SPARE_DYNAMIC_TAGS,
  152:   OPTION_NO_DEFINE_COMMON,
  153:   OPTION_NOSTDLIB,
  154:   OPTION_NO_OMAGIC,
  155:   OPTION_STRIP_DISCARDED,
  156:   OPTION_NO_STRIP_DISCARDED,
  157:   OPTION_ACCEPT_UNKNOWN_INPUT_ARCH,
  158:   OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH,
  159:   OPTION_PIE,
  160:   OPTION_UNRESOLVED_SYMBOLS,
  161:   OPTION_WARN_UNRESOLVED_SYMBOLS,
  162:   OPTION_ERROR_UNRESOLVED_SYMBOLS,
  163:   OPTION_WARN_SHARED_TEXTREL,
  164:   OPTION_REDUCE_MEMORY_OVERHEADS,
  165:   OPTION_DEFAULT_SCRIPT
  166: };
  167: 
  168: /* The long options.  This structure is used for both the option
  169:    parsing and the help text.  */
  170: 
  171: struct ld_option
  172: {
  173:   /* The long option information.  */
  174:   struct option opt;
  175:   /* The short option with the same meaning ('\0' if none).  */
  176:   char shortopt;
  177:   /* The name of the argument (NULL if none).  */
  178:   const char *arg;
  179:   /* The documentation string.  If this is NULL, this is a synonym for
  180:      the previous option.  */
  181:   const char *doc;
  182:   enum {
  183:     /* Use one dash before long option name.  */
  184:     ONE_DASH,
  185:     /* Use two dashes before long option name.  */
  186:     TWO_DASHES,
  187:     /* Only accept two dashes before the long option name.
  188:        This is an overloading of the use of this enum, since originally it
  189:        was only intended to tell the --help display function how to display
  190:        the long option name.  This feature was added in order to resolve
  191:        the confusion about the -omagic command line switch.  Is it setting
  192:        the output file name to "magic" or is it setting the NMAGIC flag on
  193:        the output ?  It has been decided that it is setting the output file
  194:        name, and that if you want to set the NMAGIC flag you should use -N
  195:        or --omagic.  */
  196:     EXACTLY_TWO_DASHES,
  197:     /* Don't mention this option in --help output.  */
  198:     NO_HELP
  199:   } control;
  200: };
  201: 
  202: static const struct ld_option ld_options[] =
  203: {
  204:   { {NULL, required_argument, NULL, '\0'},
  205:     'a', N_("KEYWORD"), N_("Shared library control for HP/UX compatibility"),
  206:     ONE_DASH },
  207:   { {"architecture", required_argument, NULL, 'A'},
  208:     'A', N_("ARCH"), N_("Set architecture") , TWO_DASHES },
  209:   { {"format", required_argument, NULL, 'b'},
  210:     'b', N_("TARGET"), N_("Specify target for following input files"),
  211:     TWO_DASHES },
  212:   { {"mri-script", required_argument, NULL, 'c'},
  213:     'c', N_("FILE"), N_("Read MRI format linker script"), TWO_DASHES },
  214:   { {"dc", no_argument, NULL, 'd'},
  215:     'd', NULL, N_("Force common symbols to be defined"), ONE_DASH },
  216:   { {"dp", no_argument, NULL, 'd'},
  217:     '\0', NULL, NULL, ONE_DASH },
  218:   { {"entry", required_argument, NULL, 'e'},
  219:     'e', N_("ADDRESS"), N_("Set start address"), TWO_DASHES },
  220:   { {"export-dynamic", no_argument, NULL, OPTION_EXPORT_DYNAMIC},
  221:     'E', NULL, N_("Export all dynamic symbols"), TWO_DASHES },
  222:   { {"EB", no_argument, NULL, OPTION_EB},
  223:     '\0', NULL, N_("Link big-endian objects"), ONE_DASH },
  224:   { {"EL", no_argument, NULL, OPTION_EL},
  225:     '\0', NULL, N_("Link little-endian objects"), ONE_DASH },
  226:   { {"auxiliary", required_argument, NULL, 'f'},
  227:     'f', N_("SHLIB"), N_("Auxiliary filter for shared object symbol table"),
  228:     TWO_DASHES },
  229:   { {"filter", required_argument, NULL, 'F'},
  230:     'F', N_("SHLIB"), N_("Filter for shared object symbol table"),
  231:     TWO_DASHES },
  232:   { {NULL, no_argument, NULL, '\0'},
  233:     'g', NULL, N_("Ignored"), ONE_DASH },
  234:   { {"gpsize", required_argument, NULL, 'G'},
  235:     'G', N_("SIZE"), N_("Small data size (if no size, same as --shared)"),
  236:     TWO_DASHES },
  237:   { {"soname", required_argument, NULL, OPTION_SONAME},
  238:     'h', N_("FILENAME"), N_("Set internal name of shared library"), ONE_DASH },
  239:   { {"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER},
  240:     'I', N_("PROGRAM"), N_("Set PROGRAM as the dynamic linker to use"),
  241:     TWO_DASHES },
  242:   { {"library", required_argument, NULL, 'l'},
  243:     'l', N_("LIBNAME"), N_("Search for library LIBNAME"), TWO_DASHES },
  244:   { {"library-path", required_argument, NULL, 'L'},
  245:     'L', N_("DIRECTORY"), N_("Add DIRECTORY to library search path"),
  246:     TWO_DASHES },
  247:   { {"sysroot=<DIRECTORY>", required_argument, NULL, OPTION_SYSROOT},
  248:     '\0', NULL, N_("Override the default sysroot location"), TWO_DASHES },
  249:   { {NULL, required_argument, NULL, '\0'},
  250:     'm', N_("EMULATION"), N_("Set emulation"), ONE_DASH },
  251:   { {"print-map", no_argument, NULL, 'M'},
  252:     'M', NULL, N_("Print map file on standard output"), TWO_DASHES },
  253:   { {"nmagic", no_argument, NULL, 'n'},
  254:     'n', NULL, N_("Do not page align data"), TWO_DASHES },
  255:   { {"omagic", no_argument, NULL, 'N'},
  256:     'N', NULL, N_("Do not page align data, do not make text readonly"),
  257:     EXACTLY_TWO_DASHES },
  258:   { {"no-omagic", no_argument, NULL, OPTION_NO_OMAGIC},
  259:     '\0', NULL, N_("Page align data, make text readonly"),
  260:     EXACTLY_TWO_DASHES },
  261:   { {"output", required_argument, NULL, 'o'},
  262:     'o', N_("FILE"), N_("Set output file name"), EXACTLY_TWO_DASHES },
  263:   { {NULL, required_argument, NULL, '\0'},
  264:     'O', NULL, N_("Optimize output file"), ONE_DASH },
  265:   { {"Qy", no_argument, NULL, OPTION_IGNORE},
  266:     '\0', NULL, N_("Ignored for SVR4 compatibility"), ONE_DASH },
  267:   { {"emit-relocs", no_argument, NULL, 'q'},
  268:     'q', NULL, "Generate relocations in final output", TWO_DASHES },
  269:   { {"relocatable", no_argument, NULL, 'r'},
  270:     'r', NULL, N_("Generate relocatable output"), TWO_DASHES },
  271:   { {NULL, no_argument, NULL, '\0'},
  272:     'i', NULL, NULL, ONE_DASH },
  273:   { {"just-symbols", required_argument, NULL, 'R'},
  274:     'R', N_("FILE"), N_("Just link symbols (if directory, same as --rpath)"),
  275:     TWO_DASHES },
  276:   { {"strip-all", no_argument, NULL, 's'},
  277:     's', NULL, N_("Strip all symbols"), TWO_DASHES },
  278:   { {"strip-debug", no_argument, NULL, 'S'},
  279:     'S', NULL, N_("Strip debugging symbols"), TWO_DASHES },
  280:   { {"strip-discarded", no_argument, NULL, OPTION_STRIP_DISCARDED},
  281:     '\0', NULL, N_("Strip symbols in discarded sections"), TWO_DASHES },
  282:   { {"no-strip-discarded", no_argument, NULL, OPTION_NO_STRIP_DISCARDED},
  283:     '\0', NULL, N_("Do not strip symbols in discarded sections"), TWO_DASHES },
  284:   { {"trace", no_argument, NULL, 't'},
  285:     't', NULL, N_("Trace file opens"), TWO_DASHES },
  286:   { {"script", required_argument, NULL, 'T'},
  287:     'T', N_("FILE"), N_("Read linker script"), TWO_DASHES },
  288:   { {"default-script", required_argument, NULL, OPTION_DEFAULT_SCRIPT},
  289:     '\0', N_("FILE"), N_("Read default linker script"), TWO_DASHES },
  290:   { {"dT", required_argument, NULL, OPTION_DEFAULT_SCRIPT},
  291:     '\0', NULL, NULL, ONE_DASH },
  292:   { {"undefined", required_argument, NULL, 'u'},
  293:     'u', N_("SYMBOL"), N_("Start with undefined reference to SYMBOL"),
  294:     TWO_DASHES },
  295:   { {"unique", optional_argument, NULL, OPTION_UNIQUE},
  296:     '\0', N_("[=SECTION]"),
  297:     N_("Don't merge input [SECTION | orphan] sections"), TWO_DASHES },
  298:   { {"Ur", no_argument, NULL, OPTION_UR},
  299:     '\0', NULL, N_("Build global constructor/destructor tables"), ONE_DASH },
  300:   { {"version", no_argument, NULL, OPTION_VERSION},
  301:     'v', NULL, N_("Print version information"), TWO_DASHES },
  302:   { {NULL, no_argument, NULL, '\0'},
  303:     'V', NULL, N_("Print version and emulation information"), ONE_DASH },
  304:   { {"discard-all", no_argument, NULL, 'x'},
  305:     'x', NULL, N_("Discard all local symbols"), TWO_DASHES },
  306:   { {"discard-locals", no_argument, NULL, 'X'},
  307:     'X', NULL, N_("Discard temporary local symbols (default)"), TWO_DASHES },
  308:   { {"discard-none", no_argument, NULL, OPTION_DISCARD_NONE},
  309:     '\0', NULL, N_("Don't discard any local symbols"), TWO_DASHES },
  310:   { {"trace-symbol", required_argument, NULL, 'y'},
  311:     'y', N_("SYMBOL"), N_("Trace mentions of SYMBOL"), TWO_DASHES },
  312:   { {NULL, required_argument, NULL, '\0'},
  313:     'Y', N_("PATH"), N_("Default search path for Solaris compatibility"),
  314:     ONE_DASH },
  315:   { {"start-group", no_argument, NULL, '('},
  316:     '(', NULL, N_("Start a group"), TWO_DASHES },
  317:   { {"end-group", no_argument, NULL, ')'},
  318:     ')', NULL, N_("End a group"), TWO_DASHES },
  319:   { {"accept-unknown-input-arch", no_argument, NULL,
  320:      OPTION_ACCEPT_UNKNOWN_INPUT_ARCH},
  321:     '\0', NULL,
  322:     N_("Accept input files whose architecture cannot be determined"),
  323:     TWO_DASHES },
  324:   { {"no-accept-unknown-input-arch", no_argument, NULL,
  325:      OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH},
  326:     '\0', NULL, N_("Reject input files whose architecture is unknown"),
  327:     TWO_DASHES },
  328:   { {"add-needed", no_argument, NULL, OPTION_ADD_NEEDED},
  329:     '\0', NULL, N_("Set DT_NEEDED tags for DT_NEEDED entries in\n"
  330:                    "\t\t\t\tfollowing dynamic libs"), TWO_DASHES },
  331:   { {"no-add-needed", no_argument, NULL, OPTION_NO_ADD_NEEDED},
  332:     '\0', NULL, N_("Do not set DT_NEEDED tags for DT_NEEDED entries\n"
  333:                    "\t\t\t\tin following dynamic libs"), TWO_DASHES },
  334:   { {"as-needed", no_argument, NULL, OPTION_AS_NEEDED},
  335:     '\0', NULL, N_("Only set DT_NEEDED for following dynamic libs if used"),
  336:     TWO_DASHES },
  337:   { {"no-as-needed", no_argument, NULL, OPTION_NO_AS_NEEDED},
  338:     '\0', NULL, N_("Always set DT_NEEDED for following dynamic libs"),
  339:     TWO_DASHES },
  340:   { {"assert", required_argument, NULL, OPTION_ASSERT},
  341:     '\0', N_("KEYWORD"), N_("Ignored for SunOS compatibility"), ONE_DASH },
  342:   { {"Bdynamic", no_argument, NULL, OPTION_CALL_SHARED},
  343:     '\0', NULL, N_("Link against shared libraries"), ONE_DASH },
  344:   { {"dy", no_argument, NULL, OPTION_CALL_SHARED},
  345:     '\0', NULL, NULL, ONE_DASH },
  346:   { {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
  347:     '\0', NULL, NULL, ONE_DASH },
  348:   { {"Bstatic", no_argument, NULL, OPTION_NON_SHARED},
  349:     '\0', NULL, N_("Do not link against shared libraries"), ONE_DASH },
  350:   { {"dn", no_argument, NULL, OPTION_NON_SHARED},
  351:     '\0', NULL, NULL, ONE_DASH },
  352:   { {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
  353:     '\0', NULL, NULL, ONE_DASH },
  354:   { {"static", no_argument, NULL, OPTION_NON_SHARED},
  355:     '\0', NULL, NULL, ONE_DASH },
  356:   { {"Bsymbolic", no_argument, NULL, OPTION_SYMBOLIC},
  357:     '\0', NULL, N_("Bind global references locally"), ONE_DASH },
  358:   { {"Bsymbolic-functions", no_argument, NULL, OPTION_SYMBOLIC_FUNCTIONS},
  359:     '\0', NULL, N_("Bind global function references locally"), ONE_DASH },
  360:   { {"check-sections", no_argument, NULL, OPTION_CHECK_SECTIONS},
  361:     '\0', NULL, N_("Check section addresses for overlaps (default)"),
  362:     TWO_DASHES },
  363:   { {"no-check-sections", no_argument, NULL, OPTION_NO_CHECK_SECTIONS},
  364:     '\0', NULL, N_("Do not check section addresses for overlaps"),
  365:     TWO_DASHES },
  366:   { {"cref", no_argument, NULL, OPTION_CREF},
  367:     '\0', NULL, N_("Output cross reference table"), TWO_DASHES },
  368:   { {"defsym", required_argument, NULL, OPTION_DEFSYM},
  369:     '\0', N_("SYMBOL=EXPRESSION"), N_("Define a symbol"), TWO_DASHES },
  370:   { {"demangle", optional_argument, NULL, OPTION_DEMANGLE},
  371:     '\0', N_("[=STYLE]"), N_("Demangle symbol names [using STYLE]"),
  372:     TWO_DASHES },
  373:   { {"embedded-relocs", no_argument, NULL, OPTION_EMBEDDED_RELOCS},
  374:     '\0', NULL, N_("Generate embedded relocs"), TWO_DASHES},
  375:   { {"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL},
  376:     '\0', NULL, N_("Treat warnings as errors"),
  377:     TWO_DASHES },
  378:   { {"fini", required_argument, NULL, OPTION_FINI},
  379:     '\0', N_("SYMBOL"), N_("Call SYMBOL at unload-time"), ONE_DASH },
  380:   { {"force-exe-suffix", no_argument, NULL, OPTION_FORCE_EXE_SUFFIX},
  381:     '\0', NULL, N_("Force generation of file with .exe suffix"), TWO_DASHES},
  382:   { {"gc-sections", no_argument, NULL, OPTION_GC_SECTIONS},
  383:     '\0', NULL, N_("Remove unused sections (on some targets)"),
  384:     TWO_DASHES },
  385:   { {"no-gc-sections", no_argument, NULL, OPTION_NO_GC_SECTIONS},
  386:     '\0', NULL, N_("Don't remove unused sections (default)"),
  387:     TWO_DASHES },
  388:   { {"print-gc-sections", no_argument, NULL, OPTION_PRINT_GC_SECTIONS},
  389:     '\0', NULL, N_("List removed unused sections on stderr"),
  390:     TWO_DASHES },
  391:   { {"no-print-gc-sections", no_argument, NULL, OPTION_NO_PRINT_GC_SECTIONS},
  392:     '\0', NULL, N_("Do not list removed unused sections"),
  393:     TWO_DASHES },
  394:   { {"hash-size=<NUMBER>", required_argument, NULL, OPTION_HASH_SIZE},
  395:     '\0', NULL, N_("Set default hash table size close to <NUMBER>"),
  396:     TWO_DASHES },
  397:   { {"help", no_argument, NULL, OPTION_HELP},
  398:     '\0', NULL, N_("Print option help"), TWO_DASHES },
  399:   { {"init", required_argument, NULL, OPTION_INIT},
  400:     '\0', N_("SYMBOL"), N_("Call SYMBOL at load-time"), ONE_DASH },
  401:   { {"Map", required_argument, NULL, OPTION_MAP},
  402:     '\0', N_("FILE"), N_("Write a map file"), ONE_DASH },
  403:   { {"no-define-common", no_argument, NULL, OPTION_NO_DEFINE_COMMON},
  404:     '\0', NULL, N_("Do not define Common storage"), TWO_DASHES },
  405:   { {"no-demangle", no_argument, NULL, OPTION_NO_DEMANGLE },
  406:     '\0', NULL, N_("Do not demangle symbol names"), TWO_DASHES },
  407:   { {"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY},
  408:     '\0', NULL, N_("Use less memory and more disk I/O"), TWO_DASHES },
  409:   { {"no-undefined", no_argument, NULL, OPTION_NO_UNDEFINED},
  410:     '\0', NULL, N_("Do not allow unresolved references in object files"),
  411:     TWO_DASHES },
  412:   { {"allow-shlib-undefined", no_argument, NULL, OPTION_ALLOW_SHLIB_UNDEFINED},
  413:     '\0', NULL, N_("Allow unresolved references in shared libaries"),
  414:     TWO_DASHES },
  415:   { {"no-allow-shlib-undefined", no_argument, NULL,
  416:      OPTION_NO_ALLOW_SHLIB_UNDEFINED},
  417:     '\0', NULL, N_("Do not allow unresolved references in shared libs"),
  418:     TWO_DASHES },
  419:   { {"allow-multiple-definition", no_argument, NULL,
  420:      OPTION_ALLOW_MULTIPLE_DEFINITION},
  421:     '\0', NULL, N_("Allow multiple definitions"), TWO_DASHES },
  422:   { {"no-undefined-version", no_argument, NULL, OPTION_NO_UNDEFINED_VERSION},
  423:     '\0', NULL, N_("Disallow undefined version"), TWO_DASHES },
  424:   { {"default-symver", no_argument, NULL, OPTION_DEFAULT_SYMVER},
  425:     '\0', NULL, N_("Create default symbol version"), TWO_DASHES },
  426:   { {"default-imported-symver", no_argument, NULL,
  427:       OPTION_DEFAULT_IMPORTED_SYMVER},
  428:     '\0', NULL, N_("Create default symbol version for imported symbols"),
  429:     TWO_DASHES },
  430:   { {"no-warn-mismatch", no_argument, NULL, OPTION_NO_WARN_MISMATCH},
  431:     '\0', NULL, N_("Don't warn about mismatched input files"), TWO_DASHES},
  432:   { {"no-warn-search-mismatch", no_argument, NULL,
  433:      OPTION_NO_WARN_SEARCH_MISMATCH},
  434:     '\0', NULL, N_("Don't warn on finding an incompatible library"),
  435:     TWO_DASHES},
  436:   { {"no-whole-archive", no_argument, NULL, OPTION_NO_WHOLE_ARCHIVE},
  437:     '\0', NULL, N_("Turn off --whole-archive"), TWO_DASHES },
  438:   { {"noinhibit-exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC},
  439:     '\0', NULL, N_("Create an output file even if errors occur"),
  440:     TWO_DASHES },
  441:   { {"noinhibit_exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC},
  442:     '\0', NULL, NULL, NO_HELP },
  443:   { {"nostdlib", no_argument, NULL, OPTION_NOSTDLIB},
  444:     '\0', NULL, N_("Only use library directories specified on\n"
  445:                    "\t\t\t\tthe command line"), ONE_DASH },
  446:   { {"oformat", required_argument, NULL, OPTION_OFORMAT},
  447:     '\0', N_("TARGET"), N_("Specify target of output file"),
  448:     EXACTLY_TWO_DASHES },
  449:   { {"qmagic", no_argument, NULL, OPTION_IGNORE},
  450:     '\0', NULL, N_("Ignored for Linux compatibility"), ONE_DASH },
  451:   { {"reduce-memory-overheads", no_argument, NULL,
  452:      OPTION_REDUCE_MEMORY_OVERHEADS},
  453:     '\0', NULL, N_("Reduce memory overheads, possibly taking much longer"),
  454:     TWO_DASHES },
  455:   { {"relax", no_argument, NULL, OPTION_RELAX},
  456:     '\0', NULL, N_("Relax branches on certain targets"), TWO_DASHES },
  457:   { {"retain-symbols-file", required_argument, NULL,
  458:      OPTION_RETAIN_SYMBOLS_FILE},
  459:     '\0', N_("FILE"), N_("Keep only symbols listed in FILE"), TWO_DASHES },
  460:   { {"rpath", required_argument, NULL, OPTION_RPATH},
  461:     '\0', N_("PATH"), N_("Set runtime shared library search path"), ONE_DASH },
  462:   { {"rpath-link", required_argument, NULL, OPTION_RPATH_LINK},
  463:     '\0', N_("PATH"), N_("Set link time shared library search path"),
  464:     ONE_DASH },
  465:   { {"shared", no_argument, NULL, OPTION_SHARED},
  466:     '\0', NULL, N_("Create a shared library"), ONE_DASH },
  467:   { {"Bshareable", no_argument, NULL, OPTION_SHARED }, /* FreeBSD.  */
  468:     '\0', NULL, NULL, ONE_DASH },
  469:   { {"pie", no_argument, NULL, OPTION_PIE},
  470:     '\0', NULL, N_("Create a position independent executable"), ONE_DASH },
  471:   { {"pic-executable", no_argument, NULL, OPTION_PIE},
  472:     '\0', NULL, NULL, TWO_DASHES },
  473:   { {"sort-common", no_argument, NULL, OPTION_SORT_COMMON},
  474:     '\0', NULL, N_("Sort common symbols by size"), TWO_DASHES },
  475:   { {"sort_common", no_argument, NULL, OPTION_SORT_COMMON},
  476:     '\0', NULL, NULL, NO_HELP },
  477:   { {"sort-section", required_argument, NULL, OPTION_SORT_SECTION},
  478:     '\0', N_("name|alignment"), 
  479:     N_("Sort sections by name or maximum alignment"), TWO_DASHES },
  480:   { {"spare-dynamic-tags", required_argument, NULL, OPTION_SPARE_DYNAMIC_TAGS},
  481:     '\0', N_("COUNT"), N_("How many tags to reserve in .dynamic section"),
  482:     TWO_DASHES },
  483:   { {"split-by-file", optional_argument, NULL, OPTION_SPLIT_BY_FILE},
  484:     '\0', N_("[=SIZE]"), N_("Split output sections every SIZE octets"),
  485:     TWO_DASHES },
  486:   { {"split-by-reloc", optional_argument, NULL, OPTION_SPLIT_BY_RELOC},
  487:     '\0', N_("[=COUNT]"), N_("Split output sections every COUNT relocs"),
  488:     TWO_DASHES },
  489:   { {"stats", no_argument, NULL, OPTION_STATS},
  490:     '\0', NULL, N_("Print memory usage statistics"), TWO_DASHES },
  491:   { {"target-help", no_argument, NULL, OPTION_TARGET_HELP},
  492:     '\0', NULL, N_("Display target specific options"), TWO_DASHES },
  493:   { {"task-link", required_argument, NULL, OPTION_TASK_LINK},
  494:     '\0', N_("SYMBOL"), N_("Do task level linking"), TWO_DASHES },
  495:   { {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
  496:     '\0', NULL, N_("Use same format as native linker"), TWO_DASHES },
  497:   { {"section-start", required_argument, NULL, OPTION_SECTION_START},
  498:     '\0', N_("SECTION=ADDRESS"), N_("Set address of named section"),
  499:     TWO_DASHES },
  500:   { {"Tbss", required_argument, NULL, OPTION_TBSS},
  501:     '\0', N_("ADDRESS"), N_("Set address of .bss section"), ONE_DASH },
  502:   { {"Tdata", required_argument, NULL, OPTION_TDATA},
  503:     '\0', N_("ADDRESS"), N_("Set address of .data section"), ONE_DASH },
  504:   { {"Ttext", required_argument, NULL, OPTION_TTEXT},