1999-05-03 15:29:11 +08:00
|
|
|
/* ldlex.h -
|
2015-01-01 22:15:26 +08:00
|
|
|
Copyright (C) 1991-2015 Free Software Foundation, Inc.
|
1999-05-03 15:29:11 +08:00
|
|
|
|
2007-07-06 22:09:45 +08:00
|
|
|
This file is part of the GNU Binutils.
|
1999-05-03 15:29:11 +08:00
|
|
|
|
2007-07-06 22:09:45 +08:00
|
|
|
This program is free software; you can redistribute it and/or modify
|
1999-05-03 15:29:11 +08:00
|
|
|
it under the terms of the GNU General Public License as published by
|
2007-07-06 22:09:45 +08:00
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
1999-05-03 15:29:11 +08:00
|
|
|
|
2007-07-06 22:09:45 +08:00
|
|
|
This program is distributed in the hope that it will be useful,
|
1999-05-03 15:29:11 +08:00
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
2007-07-06 22:09:45 +08:00
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
|
|
MA 02110-1301, USA. */
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
|
|
#ifndef LDLEX_H
|
|
|
|
#define LDLEX_H
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
2012-05-26 19:13:20 +08:00
|
|
|
/* Codes used for the long options with no short synonyms. 150 isn't
|
|
|
|
special; it's just an arbitrary non-ASCII char value. */
|
|
|
|
enum option_values
|
|
|
|
{
|
|
|
|
OPTION_ASSERT = 150,
|
|
|
|
OPTION_CALL_SHARED,
|
|
|
|
OPTION_CREF,
|
|
|
|
OPTION_DEFSYM,
|
|
|
|
OPTION_DEMANGLE,
|
|
|
|
OPTION_DYNAMIC_LINKER,
|
|
|
|
OPTION_SYSROOT,
|
|
|
|
OPTION_EB,
|
|
|
|
OPTION_EL,
|
|
|
|
OPTION_EMBEDDED_RELOCS,
|
|
|
|
OPTION_EXPORT_DYNAMIC,
|
|
|
|
OPTION_NO_EXPORT_DYNAMIC,
|
|
|
|
OPTION_HELP,
|
|
|
|
OPTION_IGNORE,
|
|
|
|
OPTION_MAP,
|
|
|
|
OPTION_NO_DEMANGLE,
|
|
|
|
OPTION_NO_KEEP_MEMORY,
|
|
|
|
OPTION_NO_WARN_MISMATCH,
|
|
|
|
OPTION_NO_WARN_SEARCH_MISMATCH,
|
|
|
|
OPTION_NOINHIBIT_EXEC,
|
|
|
|
OPTION_NON_SHARED,
|
|
|
|
OPTION_NO_WHOLE_ARCHIVE,
|
|
|
|
OPTION_OFORMAT,
|
|
|
|
OPTION_RELAX,
|
|
|
|
OPTION_NO_RELAX,
|
|
|
|
OPTION_RETAIN_SYMBOLS_FILE,
|
|
|
|
OPTION_RPATH,
|
|
|
|
OPTION_RPATH_LINK,
|
|
|
|
OPTION_SHARED,
|
|
|
|
OPTION_SONAME,
|
|
|
|
OPTION_SORT_COMMON,
|
|
|
|
OPTION_SORT_SECTION,
|
|
|
|
OPTION_STATS,
|
|
|
|
OPTION_SYMBOLIC,
|
|
|
|
OPTION_SYMBOLIC_FUNCTIONS,
|
|
|
|
OPTION_TASK_LINK,
|
|
|
|
OPTION_TBSS,
|
|
|
|
OPTION_TDATA,
|
|
|
|
OPTION_TTEXT,
|
|
|
|
OPTION_TTEXT_SEGMENT,
|
2012-12-19 04:42:43 +08:00
|
|
|
OPTION_TRODATA_SEGMENT,
|
2013-01-14 21:37:10 +08:00
|
|
|
OPTION_TLDATA_SEGMENT,
|
2012-05-26 19:13:20 +08:00
|
|
|
OPTION_TRADITIONAL_FORMAT,
|
|
|
|
OPTION_UR,
|
|
|
|
OPTION_VERBOSE,
|
|
|
|
OPTION_VERSION,
|
|
|
|
OPTION_VERSION_SCRIPT,
|
|
|
|
OPTION_VERSION_EXPORTS_SECTION,
|
|
|
|
OPTION_DYNAMIC_LIST,
|
|
|
|
OPTION_DYNAMIC_LIST_CPP_NEW,
|
|
|
|
OPTION_DYNAMIC_LIST_CPP_TYPEINFO,
|
|
|
|
OPTION_DYNAMIC_LIST_DATA,
|
|
|
|
OPTION_WARN_COMMON,
|
|
|
|
OPTION_WARN_CONSTRUCTORS,
|
|
|
|
OPTION_WARN_FATAL,
|
|
|
|
OPTION_NO_WARN_FATAL,
|
|
|
|
OPTION_WARN_MULTIPLE_GP,
|
|
|
|
OPTION_WARN_ONCE,
|
|
|
|
OPTION_WARN_SECTION_ALIGN,
|
|
|
|
OPTION_SPLIT_BY_RELOC,
|
|
|
|
OPTION_SPLIT_BY_FILE ,
|
|
|
|
OPTION_WHOLE_ARCHIVE,
|
|
|
|
OPTION_ADD_DT_NEEDED_FOR_DYNAMIC,
|
|
|
|
OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC,
|
|
|
|
OPTION_ADD_DT_NEEDED_FOR_REGULAR,
|
|
|
|
OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR,
|
|
|
|
OPTION_WRAP,
|
|
|
|
OPTION_FORCE_EXE_SUFFIX,
|
|
|
|
OPTION_GC_SECTIONS,
|
|
|
|
OPTION_NO_GC_SECTIONS,
|
|
|
|
OPTION_PRINT_GC_SECTIONS,
|
|
|
|
OPTION_NO_PRINT_GC_SECTIONS,
|
|
|
|
OPTION_HASH_SIZE,
|
|
|
|
OPTION_CHECK_SECTIONS,
|
|
|
|
OPTION_NO_CHECK_SECTIONS,
|
|
|
|
OPTION_NO_UNDEFINED,
|
|
|
|
OPTION_INIT,
|
|
|
|
OPTION_FINI,
|
|
|
|
OPTION_SECTION_START,
|
|
|
|
OPTION_UNIQUE,
|
|
|
|
OPTION_TARGET_HELP,
|
|
|
|
OPTION_ALLOW_SHLIB_UNDEFINED,
|
|
|
|
OPTION_NO_ALLOW_SHLIB_UNDEFINED,
|
|
|
|
OPTION_ALLOW_MULTIPLE_DEFINITION,
|
|
|
|
OPTION_NO_UNDEFINED_VERSION,
|
|
|
|
OPTION_DEFAULT_SYMVER,
|
|
|
|
OPTION_DEFAULT_IMPORTED_SYMVER,
|
|
|
|
OPTION_DISCARD_NONE,
|
|
|
|
OPTION_SPARE_DYNAMIC_TAGS,
|
|
|
|
OPTION_NO_DEFINE_COMMON,
|
|
|
|
OPTION_NOSTDLIB,
|
|
|
|
OPTION_NO_OMAGIC,
|
|
|
|
OPTION_STRIP_DISCARDED,
|
|
|
|
OPTION_NO_STRIP_DISCARDED,
|
|
|
|
OPTION_ACCEPT_UNKNOWN_INPUT_ARCH,
|
|
|
|
OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH,
|
|
|
|
OPTION_PIE,
|
|
|
|
OPTION_UNRESOLVED_SYMBOLS,
|
|
|
|
OPTION_WARN_UNRESOLVED_SYMBOLS,
|
|
|
|
OPTION_ERROR_UNRESOLVED_SYMBOLS,
|
|
|
|
OPTION_WARN_SHARED_TEXTREL,
|
|
|
|
OPTION_WARN_ALTERNATE_EM,
|
|
|
|
OPTION_REDUCE_MEMORY_OVERHEADS,
|
|
|
|
#ifdef ENABLE_PLUGINS
|
|
|
|
OPTION_PLUGIN,
|
|
|
|
OPTION_PLUGIN_OPT,
|
|
|
|
#endif /* ENABLE_PLUGINS */
|
|
|
|
OPTION_DEFAULT_SCRIPT,
|
|
|
|
OPTION_PRINT_OUTPUT_FORMAT,
|
2014-10-17 19:06:56 +08:00
|
|
|
OPTION_PRINT_SYSROOT,
|
2012-10-22 21:33:49 +08:00
|
|
|
OPTION_IGNORE_UNRESOLVED_SYMBOL,
|
2014-08-09 08:26:41 +08:00
|
|
|
OPTION_PUSH_STATE,
|
|
|
|
OPTION_POP_STATE,
|
2015-06-05 21:09:31 +08:00
|
|
|
OPTION_PRINT_MEMORY_USAGE,
|
2015-07-16 01:37:30 +08:00
|
|
|
OPTION_REQUIRE_DEFINED_SYMBOL,
|
ld: Extend options for altering orphan handling behaviour.
Replace the options --warn-orphan and --no-warn-orphan with a single
option --orphan-handling=MODE, where mode can be place, warn, error, and
discard.
Mode 'place' is the default, and is the current behaviour, placing the
orphan section into a suitable output section.
Mode 'warn' is the same as '--warn-orphan'. The orphan is also placed
using the same algorithm as for 'place'.
Mode 'error' is the same as '--warn-orphan' and '--fatal-warnings'.
Mode 'discard' assigns all output sections to the /DISCARD/ section.
ld/ChangeLog:
* ld.h (enum orphan_handling_enum): New.
(ld_config_type): Remove warn_orphan, add orphan_handling.
* ldemul.c (ldemul_place_orphan): Remove warning about orphan
sections.
* ldlang.c (ldlang_place_orphan): New function.
(lang_place_orphans): Call ldlang_place_orphan.
* ldlex.h (enum option_values): Remove OPTION_WARN_ORPHAN and
OPTION_NO_WARN_ORPHAN, add OPTION_ORPHAN_HANDLING.
* lexsup.c (ld_options): Remove 'warn-orphan' and
'no-warn-orphan', add 'orphan-handling'.
(parse_args): Remove handling for OPTION_WARN_ORPHAN and
OPTION_NO_WARN_ORPHAN, add handling for OPTION_ORPHAN_HANDLING.
* NEWS: Replace text about --warn-orphan with --orphan-handling.
* ld.texinfo (Options): Remove --warn-orphan entry and add
entry on --orphan-handling.
(Orphan Sections): Add reference to relevant command line options.
ld/testsuite/ChangeLog:
* ld-elf/elf.exp: Switch to rely on run_dump_test.
* ld-elf/orphan-5.l: Update expected output.
* ld-elf/orphan-5.d: New file.
* ld-elf/orphan-6.d: New file.
* ld-elf/orphan-6.l: New file.
* ld-elf/orphan-7.d: New file.
* ld-elf/orphan-7.map: New file.
* ld-elf/orphan-8.d: New file.
* ld-elf/orphan-8.map: New file.
2015-07-29 02:20:37 +08:00
|
|
|
OPTION_ORPHAN_HANDLING,
|
2012-05-26 19:13:20 +08:00
|
|
|
};
|
|
|
|
|
1999-05-03 15:29:11 +08:00
|
|
|
/* The initial parser states. */
|
|
|
|
typedef enum input_enum {
|
|
|
|
input_selected, /* We've set the initial state. */
|
|
|
|
input_script,
|
|
|
|
input_mri_script,
|
|
|
|
input_version_script,
|
2006-09-08 01:16:34 +08:00
|
|
|
input_dynamic_list,
|
1999-05-03 15:29:11 +08:00
|
|
|
input_defsym
|
|
|
|
} input_type;
|
|
|
|
|
|
|
|
extern input_type parser_input;
|
|
|
|
|
|
|
|
extern unsigned int lineno;
|
|
|
|
extern const char *lex_string;
|
|
|
|
|
|
|
|
/* In ldlex.l. */
|
2003-06-28 13:28:54 +08:00
|
|
|
extern int yylex (void);
|
2012-03-08 13:29:33 +08:00
|
|
|
extern void lex_push_file (FILE *, const char *, unsigned int);
|
PR ld/13343
* ld.h (parsing_defsym): Delete.
* ldexp.c (exp_intop, exp_bigintop, exp_relop): Set type.filename.
(fold_binary, fold_name, exp_fold_tree_1, exp_get_vma, exp_get_fill,
exp_get_abs_int): Add tree arg for %S in error messages. Don't
fudge lineno.
(exp_binop, exp_unop, exp_nameop, exp_assop, exp_assert): Copy
type.filename from sub-tree.
(exp_trinop): Likewise, and use "cond" rather than "lhs".
* ldexp.h (node_type): Add filename field to struct.
* ldfile.c (ldfile_input_filename): Delete. Remove all refs.
* ldfile.h (ldfile_input_filename): Delete.
* ldgram.y (phdr_type, phdr_qualifiers, yyerror): Add NULL arg for
%S in error messages.
* ldemul.c (syslib_default, hll_default): Likewise.
* ldlang.c (lang_memory_region_lookup, lang_memory_region_alias,
lang_get_regions, lang_new_phdr): Likewise.
(lang_size_sections_1): Pass addr_tree for %S.
* ldlex.h (lex_redirect): Update prototype.
(ldlex_filename): Declare.
* ldlex.l (<EOF>): Don't set ldfile_input_filename.
(lex_redirect): Add fake_filename and count params. Push
fake_filename to file_name_stack and init lineno from count.
(ldlex_filename): New function.
(lex_warn_invalid): Use above.
* ldmain.c (main): Update lex_redirect call.
* ldmisc.c (vfinfo <%S>): Take file name and line number from
etree_type arg, or use current if arg is NULL.
* lexsup.c (parsing_defsym): Delete.
(parse_args <OPTION_DEFSYM>): Update lex_redirect call.
2012-02-17 22:09:57 +08:00
|
|
|
extern void lex_redirect (const char *, const char *, unsigned int);
|
2003-06-28 13:28:54 +08:00
|
|
|
extern void ldlex_script (void);
|
Allow unquoted = as the first character in ldscript input_list names
* ldlex.l (INPUTLIST): New start condition.
(comment pattern, ",", "(", ")", "AS_NEEDED")
({FILENAMECHAR1}{FILENAMECHAR}*, "-l"{FILENAMECHAR}+)
(quoted string pattern, whitespace pattern): Add INPUTLIST to
valid start conditions.
(<INPUTLIST>"="{FILENAMECHAR1}{FILENAMECHAR}*): New NAME rule.
(ldlex_inputlist): New start-condition-setter function.
* ldgram.y (input_list1): Rename from input_list. All recursive
use changed.
(input_list): New wrapper rule for input_list1, setting
INPUTLIST lexer state for the duration of parsing input_list1.
All this to say INPUT(=/path/to/file) and not be forced to use
INPUT("=/path/to/file") whenever there's a need to force a sysroot-
prefix. Still, IMHO it seems better to make use of a previously
invalid syntax and not only change the meaning of quoted =-prefixed
paths (though arguably that's not very useful before this patchset).
This got a little bit hairier than I'd expected: I had to add a new
lexer state (aka. start condition) to avoid a first "=" being lexed as
the token "=", despite that not making sense in constructs expecting
file-names in the first place. (The grammar doesn't allow for
expressions in any part of those lists.) I guess I *could* have made
it work using that token anyway, but I didn't like the idea that you
would be able to separate the "=" from the rest of the file-name with
whitespace.
2014-10-15 09:10:25 +08:00
|
|
|
extern void ldlex_inputlist (void);
|
2003-06-28 13:28:54 +08:00
|
|
|
extern void ldlex_mri_script (void);
|
|
|
|
extern void ldlex_version_script (void);
|
|
|
|
extern void ldlex_version_file (void);
|
|
|
|
extern void ldlex_defsym (void);
|
|
|
|
extern void ldlex_expression (void);
|
|
|
|
extern void ldlex_both (void);
|
|
|
|
extern void ldlex_command (void);
|
|
|
|
extern void ldlex_popstate (void);
|
PR ld/13343
* ld.h (parsing_defsym): Delete.
* ldexp.c (exp_intop, exp_bigintop, exp_relop): Set type.filename.
(fold_binary, fold_name, exp_fold_tree_1, exp_get_vma, exp_get_fill,
exp_get_abs_int): Add tree arg for %S in error messages. Don't
fudge lineno.
(exp_binop, exp_unop, exp_nameop, exp_assop, exp_assert): Copy
type.filename from sub-tree.
(exp_trinop): Likewise, and use "cond" rather than "lhs".
* ldexp.h (node_type): Add filename field to struct.
* ldfile.c (ldfile_input_filename): Delete. Remove all refs.
* ldfile.h (ldfile_input_filename): Delete.
* ldgram.y (phdr_type, phdr_qualifiers, yyerror): Add NULL arg for
%S in error messages.
* ldemul.c (syslib_default, hll_default): Likewise.
* ldlang.c (lang_memory_region_lookup, lang_memory_region_alias,
lang_get_regions, lang_new_phdr): Likewise.
(lang_size_sections_1): Pass addr_tree for %S.
* ldlex.h (lex_redirect): Update prototype.
(ldlex_filename): Declare.
* ldlex.l (<EOF>): Don't set ldfile_input_filename.
(lex_redirect): Add fake_filename and count params. Push
fake_filename to file_name_stack and init lineno from count.
(ldlex_filename): New function.
(lex_warn_invalid): Use above.
* ldmain.c (main): Update lex_redirect call.
* ldmisc.c (vfinfo <%S>): Take file name and line number from
etree_type arg, or use current if arg is NULL.
* lexsup.c (parsing_defsym): Delete.
(parse_args <OPTION_DEFSYM>): Update lex_redirect call.
2012-02-17 22:09:57 +08:00
|
|
|
extern const char* ldlex_filename (void);
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
|
|
/* In lexsup.c. */
|
2003-06-28 13:28:54 +08:00
|
|
|
extern int lex_input (void);
|
|
|
|
extern void lex_unput (int);
|
1999-05-03 15:29:11 +08:00
|
|
|
#ifndef yywrap
|
2003-06-28 13:28:54 +08:00
|
|
|
extern int yywrap (void);
|
1999-05-03 15:29:11 +08:00
|
|
|
#endif
|
2003-06-28 13:28:54 +08:00
|
|
|
extern void parse_args (unsigned, char **);
|
1999-05-03 15:29:11 +08:00
|
|
|
|
|
|
|
#endif
|