binutils-gdb/ld/ldlex.h
Hakan Candar f4e363cae2 ld/ELF: Add --image-base command line option to the ELF linker
LLD has dropped the option -Ttext-segment for specifying image base
addresses, instead forcing the use of the --image-base option for both
ELF and PE targets. As it stands, GNU LD and LLVM LLD are incompatible,
having two different options for the same functionality.

This patch enables the use of --image-base on ELF targets, advancing
consistency and compatibility.

See: https://reviews.llvm.org/D70468
     https://maskray.me/blog/2020-11-15-explain-gnu-linker-options#address-related
     https://sourceware.org/bugzilla/show_bug.cgi?id=25207

Moreover, a new test has been added to ensure -z separate-code behaviour
when used with -Ttext-segment stays the same. When this combination is
used, -Ttext-segment sets the address of the first segment (R), not the
text segment (RX), and like with -z noseparate-code, no segments lesser
than the specified address are created. If this behaviour was to change,
the first (R) segment of the ELF file would begin in a lesser address
than the specified text (RX) segment, breaking traditional use of this
option for specifying image base address.
2024-10-29 19:38:39 +10:30

514 lines
14 KiB
C

/* ldlex.h -
Copyright (C) 1991-2024 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
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
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
MA 02110-1301, USA. */
#ifndef LDLEX_H
#define LDLEX_H
#include <stdio.h>
/* 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_NO_DYNAMIC_LINKER,
OPTION_SYSROOT,
OPTION_OUT_IMPLIB,
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_NO_SYMBOLIC,
OPTION_RETAIN_SYMBOLS_FILE,
OPTION_RPATH,
OPTION_RPATH_LINK,
OPTION_SHARED,
OPTION_SONAME,
OPTION_SORT_COMMON,
OPTION_SORT_SECTION,
OPTION_SECTION_ORDERING_FILE,
OPTION_STATS,
OPTION_SYMBOLIC,
OPTION_SYMBOLIC_FUNCTIONS,
OPTION_TASK_LINK,
OPTION_IMAGE_BASE,
OPTION_TBSS,
OPTION_TDATA,
OPTION_TTEXT,
OPTION_TTEXT_SEGMENT,
OPTION_TRODATA_SEGMENT,
OPTION_TLDATA_SEGMENT,
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_EXPORT_DYNAMIC_SYMBOL,
OPTION_EXPORT_DYNAMIC_SYMBOL_LIST,
OPTION_WARN_COMMON,
OPTION_WARN_CONSTRUCTORS,
OPTION_WARN_FATAL,
OPTION_NO_WARN_FATAL,
OPTION_NO_WARNINGS,
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_GC_KEEP_EXPORTED,
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,
#if SUPPORT_ERROR_HANDLING_SCRIPT
OPTION_ERROR_HANDLING_SCRIPT,
#endif
OPTION_UNDEFINED_VERSION,
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_NO_PIE,
OPTION_UNRESOLVED_SYMBOLS,
OPTION_WARN_UNRESOLVED_SYMBOLS,
OPTION_ERROR_UNRESOLVED_SYMBOLS,
OPTION_WARN_TEXTREL,
OPTION_WARN_ALTERNATE_EM,
OPTION_REDUCE_MEMORY_OVERHEADS,
OPTION_MAX_CACHE_SIZE,
#if BFD_SUPPORTS_PLUGINS
OPTION_PLUGIN,
OPTION_PLUGIN_OPT,
OPTION_PLUGIN_SAVE_TEMPS,
#endif /* BFD_SUPPORTS_PLUGINS */
OPTION_DEFAULT_SCRIPT,
OPTION_PRINT_OUTPUT_FORMAT,
OPTION_PRINT_SYSROOT,
OPTION_IGNORE_UNRESOLVED_SYMBOL,
OPTION_PUSH_STATE,
OPTION_POP_STATE,
OPTION_DISABLE_MULTIPLE_DEFS_ABS,
OPTION_PRINT_MEMORY_USAGE,
OPTION_REQUIRE_DEFINED_SYMBOL,
OPTION_ORPHAN_HANDLING,
OPTION_FORCE_GROUP_ALLOCATION,
OPTION_PRINT_MAP_DISCARDED,
OPTION_NO_PRINT_MAP_DISCARDED,
OPTION_PRINT_MAP_LOCALS,
OPTION_NO_PRINT_MAP_LOCALS,
OPTION_NON_CONTIGUOUS_REGIONS,
OPTION_NON_CONTIGUOUS_REGIONS_WARNINGS,
OPTION_DEPENDENCY_FILE,
OPTION_CTF_VARIABLES,
OPTION_NO_CTF_VARIABLES,
OPTION_CTF_SHARE_TYPES,
OPTION_ERROR_EXECSTACK,
OPTION_NO_ERROR_EXECSTACK,
OPTION_WARN_EXECSTACK_OBJECTS,
OPTION_WARN_EXECSTACK,
OPTION_NO_WARN_EXECSTACK,
OPTION_WARN_RWX_SEGMENTS,
OPTION_NO_WARN_RWX_SEGMENTS,
OPTION_ERROR_RWX_SEGMENTS,
OPTION_NO_ERROR_RWX_SEGMENTS,
OPTION_ENABLE_LINKER_VERSION,
OPTION_DISABLE_LINKER_VERSION,
OPTION_REMAP_INPUTS,
OPTION_REMAP_INPUTS_FILE,
/* Used by emultempl/elf.em, emultempl/pe.em and emultempl/pep.em. */
OPTION_BUILD_ID,
OPTION_EXCLUDE_LIBS,
/* Used by emulparams/elf32mcore.sh, emultempl/beos.em, emultempl/pe.em
and emultempl/pep.em. */
OPTION_BASE_FILE,
/* Used by emultempl/ppc32elf.em and emultempl/ppc64elf.em. */
OPTION_NO_INLINE_OPT,
OPTION_NO_PLT_ALIGN,
OPTION_NO_STUBSYMS,
OPTION_NO_TLS_GET_ADDR_OPT,
OPTION_NO_TLS_OPT,
OPTION_PLT_ALIGN,
OPTION_STUBSYMS,
/* Used by emultempl/armelf.em and emultempl/tic6xdsbt.em. */
OPTION_NO_MERGE_EXIDX_ENTRIES,
/* Used by emultempl/aarch64elf.em and emultempl/armelf.em. */
OPTION_PIC_VENEER,
OPTION_NO_ENUM_SIZE_WARNING,
OPTION_NO_WCHAR_SIZE_WARNING,
/* Used by emultempl/armelf.em and emultempl/pe.em. */
OPTION_THUMB_ENTRY,
/* Used by emultempl/beos.em, emultempl/nto.em, emultempl/pe.em and
emultempl/pep.em. */
OPTION_STACK,
/* Used by emultempl/aarch64elf.em, emultempl/armelf.em,
emultempl/cskyelf.em, emultempl/hppaelf.em, emultempl/metagelf.em
and emultempl/ppc64elf.em. */
OPTION_STUBGROUP_SIZE,
/* Used by emulparams/plt_unwind.sh. */
OPTION_LD_GENERATED_UNWIND_INFO,
OPTION_NO_LD_GENERATED_UNWIND_INFO,
/* Used by emultempl/aarch64elf.em. */
OPTION_FIX_ERRATUM_835769,
OPTION_FIX_ERRATUM_843419,
OPTION_NO_APPLY_DYNAMIC_RELOCS,
/* Used by emultempl/aix.em. */
OPTION_AUTOIMP,
OPTION_ERNOTOK,
OPTION_EROK,
OPTION_EXPALL,
OPTION_EXPFULL,
OPTION_EXPORT,
OPTION_IMPORT,
OPTION_INITFINI,
OPTION_LOADMAP,
OPTION_MAXDATA,
OPTION_MAXSTACK,
OPTION_MODTYPE,
OPTION_NOAUTOIMP,
OPTION_NOEXPALL,
OPTION_NOEXPFULL,
OPTION_NOSTRCMPCT,
OPTION_PD,
OPTION_PT,
OPTION_STRCMPCT,
OPTION_UNIX,
OPTION_32,
OPTION_64,
OPTION_LIBPATH,
OPTION_NOLIBPATH,
/* Used by emultempl/alphaelf.em. */
OPTION_TASO,
OPTION_SECUREPLT,
OPTION_NO_SECUREPLT,
/* Used by emultempl/armelf.em. */
OPTION_BE8,
OPTION_TARGET1_REL,
OPTION_TARGET1_ABS,
OPTION_TARGET2,
OPTION_FIX_V4BX,
OPTION_USE_BLX,
OPTION_VFP11_DENORM_FIX,
OPTION_FIX_V4BX_INTERWORKING,
OPTION_FIX_CORTEX_A8,
OPTION_NO_FIX_CORTEX_A8,
OPTION_FIX_ARM1176,
OPTION_NO_FIX_ARM1176,
OPTION_LONG_PLT,
OPTION_STM32L4XX_FIX,
OPTION_CMSE_IMPLIB,
OPTION_IN_IMPLIB,
/* Used by emultempl/avrelf.em. */
OPTION_NO_CALL_RET_REPLACEMENT,
OPTION_PMEM_WRAP_AROUND,
OPTION_NO_STUBS,
OPTION_DEBUG_STUBS,
OPTION_DEBUG_RELAX,
/* Used by emultempl/bfin.em. */
OPTION_CODE_IN_L1,
OPTION_DATA_IN_L1,
/* Used by emultempl/cskyelf.em. */
OPTION_BRANCH_STUB,
OPTION_NO_BRANCH_STUB,
/* Used by emultempl/elf.em. */
OPTION_DISABLE_NEW_DTAGS,
OPTION_ENABLE_NEW_DTAGS,
OPTION_GROUP,
OPTION_EH_FRAME_HDR,
OPTION_NO_EH_FRAME_HDR,
OPTION_HASH_STYLE,
OPTION_PACKAGE_METADATA,
OPTION_AUDIT,
OPTION_COMPRESS_DEBUG,
OPTION_ROSEGMENT,
OPTION_NO_ROSEGMENT,
/* Used by emultempl/hppaelf.em. */
OPTION_MULTI_SUBSPACE,
/* Used by emultempl/ia64elf.em. */
OPTION_ITANIUM,
/* Used by emultempl/m68hc1xelf.em. */
OPTION_NO_TRAMPOLINE,
OPTION_BANK_WINDOW,
/* Used by emultempl/m68kelf.em. */
OPTION_GOT,
/* Used by emultempl/mipself.em. */
OPTION_INSN32,
OPTION_NO_INSN32,
OPTION_IGNORE_BRANCH_ISA,
OPTION_NO_IGNORE_BRANCH_ISA,
OPTION_COMPACT_BRANCHES,
OPTION_NO_COMPACT_BRANCHES,
/* Used by emultempl/msp430.em. */
OPTION_CODE_REGION,
OPTION_DATA_REGION,
OPTION_DISABLE_TRANS,
/* Used by emultempl/nds32elf.em. */
OPTION_BASELINE,
OPTION_ELIM_GC_RELOCS,
OPTION_FP_AS_GP,
OPTION_NO_FP_AS_GP,
OPTION_REDUCE_FP_UPDATE,
OPTION_NO_REDUCE_FP_UPDATE,
OPTION_EXPORT_SYMBOLS,
OPTION_HYPER_RELAX,
OPTION_TLSDESC_TRAMPOLINE,
OPTION_NO_TLSDESC_TRAMPOLINE,
/* Used by emultempl/nto.em. */
OPTION_LAZY_STACK,
/* Used by emultempl/pe.em, emultempl/pep.em and emultempl/beos.em. */
OPTION_DLL,
OPTION_FILE_ALIGNMENT,
OPTION_MAJOR_IMAGE_VERSION,
OPTION_MAJOR_OS_VERSION,
OPTION_MAJOR_SUBSYSTEM_VERSION,
OPTION_MINOR_IMAGE_VERSION,
OPTION_MINOR_OS_VERSION,
OPTION_MINOR_SUBSYSTEM_VERSION,
OPTION_SECTION_ALIGNMENT,
OPTION_SUBSYSTEM,
OPTION_HEAP,
OPTION_SUPPORT_OLD_CODE,
OPTION_OUT_DEF,
OPTION_EXPORT_ALL,
OPTION_EXCLUDE_SYMBOLS,
OPTION_EXCLUDE_ALL_SYMBOLS,
OPTION_KILL_ATS,
OPTION_STDCALL_ALIASES,
OPTION_ENABLE_STDCALL_FIXUP,
OPTION_DISABLE_STDCALL_FIXUP,
OPTION_WARN_DUPLICATE_EXPORTS,
OPTION_IMP_COMPAT,
OPTION_ENABLE_AUTO_IMAGE_BASE,
OPTION_DISABLE_AUTO_IMAGE_BASE,
OPTION_DLL_SEARCH_PREFIX,
OPTION_NO_DEFAULT_EXCLUDES,
OPTION_DLL_ENABLE_AUTO_IMPORT,
OPTION_DLL_DISABLE_AUTO_IMPORT,
OPTION_ENABLE_EXTRA_PE_DEBUG,
OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC,
OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC,
OPTION_LARGE_ADDRESS_AWARE,
OPTION_DISABLE_LARGE_ADDRESS_AWARE,
OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1,
OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2,
OPTION_EXCLUDE_MODULES_FOR_IMPLIB,
OPTION_USE_NUL_PREFIXED_IMPORT_TABLES,
OPTION_NO_LEADING_UNDERSCORE,
OPTION_LEADING_UNDERSCORE,
OPTION_ENABLE_LONG_SECTION_NAMES,
OPTION_DISABLE_LONG_SECTION_NAMES,
/* DLLCharacteristics flags. */
OPTION_DYNAMIC_BASE,
OPTION_FORCE_INTEGRITY,
OPTION_NX_COMPAT,
OPTION_NO_ISOLATION,
OPTION_NO_SEH,
OPTION_NO_BIND,
OPTION_WDM_DRIVER,
OPTION_TERMINAL_SERVER_AWARE,
/* Determinism. */
OPTION_INSERT_TIMESTAMP,
OPTION_NO_INSERT_TIMESTAMP,
OPTION_PDB,
OPTION_ENABLE_RELOC_SECTION,
OPTION_DISABLE_RELOC_SECTION,
/* DLL Characteristics flags. */
OPTION_DISABLE_DYNAMIC_BASE,
OPTION_DISABLE_FORCE_INTEGRITY,
OPTION_DISABLE_NX_COMPAT,
OPTION_DISABLE_NO_ISOLATION,
OPTION_DISABLE_NO_SEH,
OPTION_DISABLE_NO_BIND,
OPTION_DISABLE_WDM_DRIVER,
OPTION_DISABLE_TERMINAL_SERVER_AWARE,
/* Used by emultempl/pep.em. */
OPTION_DISABLE_HIGH_ENTROPY_VA,
OPTION_HIGH_ENTROPY_VA,
/* Used by emultempl/ppc32elf.em. */
OPTION_NEW_PLT,
OPTION_OLD_PLT,
OPTION_OLD_GOT,
OPTION_PPC476_WORKAROUND,
OPTION_NO_PPC476_WORKAROUND,
OPTION_NO_PICFIXUP,
OPTION_VLE_RELOC_FIXUP,
/* Used by emultempl/ppc64elf.em. */
OPTION_PLT_STATIC_CHAIN,
OPTION_NO_PLT_STATIC_CHAIN,
OPTION_PLT_THREAD_SAFE,
OPTION_NO_PLT_THREAD_SAFE,
OPTION_PLT_LOCALENTRY,
OPTION_NO_PLT_LOCALENTRY,
OPTION_POWER10_STUBS,
OPTION_NO_POWER10_STUBS,
OPTION_NO_PCREL_OPT,
OPTION_SAVRES,
OPTION_NO_SAVRES,
OPTION_DOTSYMS,
OPTION_NO_DOTSYMS,
OPTION_TLS_GET_ADDR_OPT,
OPTION_TLS_GET_ADDR_REGSAVE,
OPTION_NO_TLS_GET_ADDR_REGSAVE,
OPTION_NO_OPD_OPT,
OPTION_NO_TOC_OPT,
OPTION_NO_MULTI_TOC,
OPTION_NO_TOC_SORT,
OPTION_NON_OVERLAPPING_OPD,
/* Used by emultempl/riscvelf.em. */
OPTION_RELAX_GP,
OPTION_NO_RELAX_GP,
OPTION_CHECK_ULEB128,
OPTION_NO_CHECK_ULEB128,
/* Used by emultempl/rxelf.em. */
OPTION_NO_FLAG_MISMATCH_WARNINGS,
OPTION_IGNORE_LMA,
OPTION_NO_IGNORE_LMA,
OPTION_FLAG_MISMATCH_WARNINGS,
/* Used by emultempl/s390.em. */
OPTION_PGSTE,
/* Used by emultempl/spuelf.em. */
OPTION_SPU_PLUGIN,
OPTION_SPU_NO_OVERLAYS,
OPTION_SPU_COMPACT_STUBS,
OPTION_SPU_STUB_SYMS,
OPTION_SPU_NON_OVERLAY_STUBS,
OPTION_SPU_LOCAL_STORE,
OPTION_SPU_STACK_ANALYSIS,
OPTION_SPU_STACK_SYMS,
OPTION_SPU_AUTO_OVERLAY,
OPTION_SPU_AUTO_RELINK,
OPTION_SPU_OVERLAY_RODATA,
OPTION_SPU_SOFT_ICACHE,
OPTION_SPU_LINE_SIZE,
OPTION_SPU_NUM_LINES,
OPTION_SPU_LRLIVE,
OPTION_SPU_NON_IA_TEXT,
OPTION_SPU_FIXED_SPACE,
OPTION_SPU_RESERVED_SPACE,
OPTION_SPU_EXTRA_STACK,
OPTION_SPU_NO_AUTO_OVERLAY,
OPTION_SPU_EMIT_FIXUPS,
/* Used by emultempl/tic6xdsbt.em. */
OPTION_DSBT_INDEX,
OPTION_DSBT_SIZE,
/* Used by emultempl/ticoff.em. */
OPTION_COFF_FORMAT,
/* Used by emultempl/vms.em. */
OPTION_IDENTIFICATION,
/* Used by emultempl/vxworks.em. */
OPTION_FORCE_DYNAMIC,
/* Used by emultempl/xtensaelf.em. */
OPTION_OPT_SIZEOPT,
OPTION_LITERAL_MOVEMENT,
OPTION_NO_LITERAL_MOVEMENT,
OPTION_ABI_WINDOWED,
OPTION_ABI_CALL0,
};
/* The initial parser states. */
typedef enum input_enum
{
input_selected, /* We've set the initial state. */
input_script,
input_mri_script,
input_version_script,
input_section_ordering_script,
input_dynamic_list,
input_defsym
} input_type;
extern input_type parser_input;
extern unsigned int lineno;
extern const char *lex_string;
/* In ldlex.l. */
extern int yylex (void);
extern void lex_push_file (FILE *, const char *, unsigned int);
extern void lex_redirect (const char *, const char *, unsigned int);
extern void ldlex_script (void);
extern void ldlex_inputlist (void);
extern void ldlex_mri_script (void);
extern void ldlex_version_script (void);
extern void ldlex_version_file (void);
extern void ldlex_expression (void);
extern void ldlex_wild (void);
extern void ldlex_popstate (void);
extern void ldlex_backup (void);
extern const char* ldlex_filename (void);
/* In lexsup.c. */
extern int lex_input (void);
extern void lex_unput (int);
extern void parse_args (unsigned, char **);
#endif