| /* ld.h -- general linker header file | 
 |    Copyright (C) 1991-2022 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 LD_H | 
 | #define LD_H | 
 |  | 
 | #ifndef SEEK_CUR | 
 | #define SEEK_CUR 1 | 
 | #endif | 
 | #ifndef SEEK_END | 
 | #define SEEK_END 2 | 
 | #endif | 
 |  | 
 | #ifndef ENABLE_NLS | 
 |   /* The Solaris version of locale.h always includes libintl.h.  If we have | 
 |      been configured with --disable-nls then ENABLE_NLS will not be defined | 
 |      and the dummy definitions of bindtextdomain (et al) below will conflict | 
 |      with the defintions in libintl.h.  So we define these values to prevent | 
 |      the bogus inclusion of libintl.h.  */ | 
 | # define _LIBINTL_H | 
 | # define _LIBGETTEXT_H | 
 | #endif | 
 | #include <locale.h> | 
 |  | 
 | #ifdef ENABLE_NLS | 
 | # include <libintl.h> | 
 | # define _(String) gettext (String) | 
 | # ifdef gettext_noop | 
 | #  define N_(String) gettext_noop (String) | 
 | # else | 
 | #  define N_(String) (String) | 
 | # endif | 
 | #else | 
 | # define gettext(Msgid) (Msgid) | 
 | # define dgettext(Domainname, Msgid) (Msgid) | 
 | # define dcgettext(Domainname, Msgid, Category) (Msgid) | 
 | # define ngettext(Msgid1, Msgid2, n) \ | 
 |   (n == 1 ? Msgid1 : Msgid2) | 
 | # define dngettext(Domainname, Msgid1, Msgid2, n) \ | 
 |   (n == 1 ? Msgid1 : Msgid2) | 
 | # define dcngettext(Domainname, Msgid1, Msgid2, n, Category) \ | 
 |   (n == 1 ? Msgid1 : Msgid2) | 
 | # define textdomain(Domainname) do {} while (0) | 
 | # define bindtextdomain(Domainname, Dirname) do {} while (0) | 
 | # define _(String) (String) | 
 | # define N_(String) (String) | 
 | #endif | 
 |  | 
 | /* Look in this environment name for the linker to pretend to be */ | 
 | #define EMULATION_ENVIRON "LDEMULATION" | 
 | /* If in there look for the strings: */ | 
 |  | 
 | /* Look in this variable for a target format */ | 
 | #define TARGET_ENVIRON "GNUTARGET" | 
 |  | 
 | /* Input sections which are put in a section of this name are actually | 
 |    discarded.  */ | 
 | #define DISCARD_SECTION_NAME "/DISCARD/" | 
 |  | 
 | /* A file name list.  */ | 
 | typedef struct name_list | 
 | { | 
 |   const char *name; | 
 |   struct name_list *next; | 
 | } | 
 | name_list; | 
 |  | 
 | typedef enum {sort_none, sort_ascending, sort_descending} sort_order; | 
 |  | 
 | /* A wildcard specification.  */ | 
 |  | 
 | typedef enum | 
 | { | 
 |   none, by_name, by_alignment, by_name_alignment, by_alignment_name, | 
 |   by_none, by_init_priority | 
 | } sort_type; | 
 |  | 
 | extern sort_type sort_section; | 
 |  | 
 | struct wildcard_spec | 
 | { | 
 |   const char *name; | 
 |   struct name_list *exclude_name_list; | 
 |   sort_type sorted; | 
 |   struct flag_info *section_flag_list; | 
 | }; | 
 |  | 
 | struct wildcard_list | 
 | { | 
 |   struct wildcard_list *next; | 
 |   struct wildcard_spec spec; | 
 | }; | 
 |  | 
 | #define BYTE_SIZE	(1) | 
 | #define SHORT_SIZE	(2) | 
 | #define LONG_SIZE	(4) | 
 | #define QUAD_SIZE	(8) | 
 |  | 
 | enum endian_enum { ENDIAN_UNSET = 0, ENDIAN_BIG, ENDIAN_LITTLE }; | 
 |  | 
 | typedef struct | 
 | { | 
 |   /* 1 => assign space to common symbols even if `relocatable_output'.  */ | 
 |   bool force_common_definition; | 
 |  | 
 |   /* If TRUE, build MIPS embedded PIC relocation tables in the output | 
 |      file.  */ | 
 |   bool embedded_relocs; | 
 |  | 
 |   /* If TRUE, force generation of a file with a .exe file.  */ | 
 |   bool force_exe_suffix; | 
 |  | 
 |   /* If TRUE, generate a cross reference report.  */ | 
 |   bool cref; | 
 |  | 
 |   /* If TRUE (which is the default), warn about mismatched input | 
 |      files.  */ | 
 |   bool warn_mismatch; | 
 |  | 
 |   /* Warn on attempting to open an incompatible library during a library | 
 |      search.  */ | 
 |   bool warn_search_mismatch; | 
 |  | 
 |   /* If non-zero check section addresses, once computed, | 
 |      for overlaps.  Relocatable links only check when this is > 0.  */ | 
 |   signed char check_section_addresses; | 
 |  | 
 |   /* If TRUE allow the linking of input files in an unknown architecture | 
 |      assuming that the user knows what they are doing.  This was the old | 
 |      behaviour of the linker.  The new default behaviour is to reject such | 
 |      input files.  */ | 
 |   bool accept_unknown_input_arch; | 
 |  | 
 |   /* Name of the import library to generate.  */ | 
 |   char *out_implib_filename; | 
 |  | 
 |   /* If TRUE we'll just print the default output on stdout.  */ | 
 |   bool print_output_format; | 
 |  | 
 |   /* If set, display the target memory usage (per memory region).  */ | 
 |   bool print_memory_usage; | 
 |  | 
 |   /* Should we force section groups to be resolved?  Controlled with | 
 |      --force-group-allocation on the command line or FORCE_GROUP_ALLOCATION | 
 |      in the linker script.  */ | 
 |   bool force_group_allocation; | 
 |  | 
 |   /* Big or little endian as set on command line.  */ | 
 |   enum endian_enum endian; | 
 |  | 
 |   /* Name of runtime interpreter to invoke.  */ | 
 |   char *interpreter; | 
 |  | 
 |   /* Name to give runtime library from the -soname argument.  */ | 
 |   char *soname; | 
 |  | 
 |   /* Runtime library search path from the -rpath argument.  */ | 
 |   char *rpath; | 
 |  | 
 |   /* Link time runtime library search path from the -rpath-link | 
 |      argument.  */ | 
 |   char *rpath_link; | 
 |  | 
 |   /* Name of shared object whose symbol table should be filtered with | 
 |      this shared object.  From the --filter option.  */ | 
 |   char *filter_shlib; | 
 |  | 
 |   /* Name of shared object for whose symbol table this shared object | 
 |      is an auxiliary filter.  From the --auxiliary option.  */ | 
 |   char **auxiliary_filters; | 
 |  | 
 |   /* A version symbol to be applied to the symbol names found in the | 
 |      .exports sections.  */ | 
 |   char *version_exports_section; | 
 |  | 
 |   /* Default linker script.  */ | 
 |   char *default_script; | 
 | } args_type; | 
 |  | 
 | extern args_type command_line; | 
 |  | 
 | typedef int token_code_type; | 
 |  | 
 | /* Different ways we can handle orphan sections.  */ | 
 |  | 
 | enum orphan_handling_enum | 
 | { | 
 |   /* The classic strategy, find a suitable section to place the orphan | 
 |      into.  */ | 
 |   orphan_handling_place = 0, | 
 |  | 
 |   /* Discard any orphan sections as though they were assign to the section | 
 |      /DISCARD/.  */ | 
 |   orphan_handling_discard, | 
 |  | 
 |   /* Find somewhere to place the orphan section, as with | 
 |      ORPHAN_HANDLING_PLACE, but also issue a warning.  */ | 
 |   orphan_handling_warn, | 
 |  | 
 |   /* Issue a fatal error if any orphan sections are found.  */ | 
 |   orphan_handling_error, | 
 | }; | 
 |  | 
 | typedef struct | 
 | { | 
 |   bool magic_demand_paged; | 
 |   bool make_executable; | 
 |  | 
 |   /* If TRUE, -shared is supported.  */ | 
 |   /* ??? A better way to do this is perhaps to define this in the | 
 |      ld_emulation_xfer_struct since this is really a target dependent | 
 |      parameter.  */ | 
 |   bool has_shared; | 
 |  | 
 |   /* If TRUE, build constructors.  */ | 
 |   bool build_constructors; | 
 |  | 
 |   /* If TRUE, warn about any constructors.  */ | 
 |   bool warn_constructors; | 
 |  | 
 |   /* If TRUE, warn about merging common symbols with others.  */ | 
 |   bool warn_common; | 
 |  | 
 |   /* If TRUE, only warn once about a particular undefined symbol.  */ | 
 |   bool warn_once; | 
 |  | 
 |   /* How should we deal with orphan sections.  */ | 
 |   enum orphan_handling_enum orphan_handling; | 
 |  | 
 |   /* If TRUE, warn if multiple global-pointers are needed (Alpha | 
 |      only).  */ | 
 |   bool warn_multiple_gp; | 
 |  | 
 |   /* If TRUE, warn if the starting address of an output section | 
 |      changes due to the alignment of an input section.  */ | 
 |   bool warn_section_align; | 
 |  | 
 |   /* If TRUE, warning messages are fatal.  */ | 
 |   bool fatal_warnings; | 
 |  | 
 |   /* If TRUE, warning and error messages are ignored.  */ | 
 |   bool no_warnings; | 
 |  | 
 |   sort_order sort_common; | 
 |  | 
 |   bool text_read_only; | 
 |  | 
 |   bool stats; | 
 |  | 
 |   /* If set, orphan input sections will be mapped to separate output | 
 |      sections.  */ | 
 |   bool unique_orphan_sections; | 
 |  | 
 |   /* If set, only search library directories explicitly selected | 
 |      on the command line.  */ | 
 |   bool only_cmd_line_lib_dirs; | 
 |  | 
 |   /* If set, numbers and absolute symbols are simply treated as | 
 |      numbers everywhere.  */ | 
 |   bool sane_expr; | 
 |  | 
 |   /* If set, code and non-code sections should never be in one segment.  */ | 
 |   bool separate_code; | 
 |  | 
 |   /* The rpath separation character.  Usually ':'.  */ | 
 |   char rpath_separator; | 
 |  | 
 |   char *map_filename; | 
 |   FILE *map_file; | 
 |  | 
 |   char *dependency_file; | 
 |  | 
 |   unsigned int split_by_reloc; | 
 |   bfd_size_type split_by_file; | 
 |  | 
 |   /* The size of the hash table to use.  */ | 
 |   unsigned long hash_table_size; | 
 |  | 
 |   /* If set, print discarded sections in map file output.  */ | 
 |   bool print_map_discarded; | 
 |  | 
 |   /* If set, emit the names and types of statically-linked variables | 
 |      into the CTF.  */ | 
 |   bool ctf_variables; | 
 |  | 
 |   /* If set, share only duplicated types in CTF, rather than sharing | 
 |      all types that are not in conflict.  */ | 
 |   bool ctf_share_duplicated; | 
 | } ld_config_type; | 
 |  | 
 | extern ld_config_type config; | 
 |  | 
 | extern FILE * saved_script_handle; | 
 | extern bool force_make_executable; | 
 |  | 
 | extern int yyparse (void); | 
 | extern void add_cref (const char *, bfd *, asection *, bfd_vma); | 
 | extern bool handle_asneeded_cref (bfd *, enum notice_asneeded_action); | 
 | extern void output_cref (FILE *); | 
 | extern void check_nocrossrefs (void); | 
 | extern void ld_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; | 
 |  | 
 | /* If gcc >= 2.6, we can give a function name, too.  */ | 
 | #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 6) | 
 | #define __PRETTY_FUNCTION__  NULL | 
 | #endif | 
 |  | 
 | #undef abort | 
 | #define abort() ld_abort (__FILE__, __LINE__, __PRETTY_FUNCTION__) | 
 |  | 
 | #endif |