| /* ld-emul.h - Linker emulation header file | 
 |    Copyright (C) 1991-2023 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 LDEMUL_H | 
 | #define LDEMUL_H | 
 |  | 
 | /* Forward declaration for ldemul_add_options() and others.  */ | 
 | struct option; | 
 |  | 
 | extern void ldemul_hll | 
 |   (char *); | 
 | extern void ldemul_syslib | 
 |   (char *); | 
 | extern void ldemul_after_parse | 
 |   (void); | 
 | extern void ldemul_before_parse | 
 |   (void); | 
 | extern void ldemul_before_plugin_all_symbols_read | 
 |   (void); | 
 | extern void ldemul_after_open | 
 |   (void); | 
 | extern void ldemul_after_check_relocs | 
 |   (void); | 
 | extern void ldemul_before_place_orphans | 
 |   (void); | 
 | extern void ldemul_after_allocation | 
 |   (void); | 
 | extern void ldemul_before_allocation | 
 |   (void); | 
 | extern void ldemul_set_output_arch | 
 |   (void); | 
 | extern char *ldemul_choose_target | 
 |   (int, char**); | 
 | extern void ldemul_choose_mode | 
 |   (char *); | 
 | extern void ldemul_list_emulations | 
 |   (FILE *); | 
 | extern void ldemul_list_emulation_options | 
 |   (FILE *); | 
 | extern char *ldemul_get_script | 
 |   (int *isfile); | 
 | extern void ldemul_finish | 
 |   (void); | 
 | extern void ldemul_set_symbols | 
 |   (void); | 
 | extern void ldemul_create_output_section_statements | 
 |   (void); | 
 | extern lang_output_section_statement_type *ldemul_place_orphan | 
 |   (asection *, const char *, int); | 
 | extern bool ldemul_parse_args | 
 |   (int, char **); | 
 | extern void ldemul_add_options | 
 |   (int, char **, int, struct option **, int, struct option **); | 
 | extern bool ldemul_handle_option | 
 |   (int); | 
 | extern bool ldemul_unrecognized_file | 
 |   (struct lang_input_statement_struct *); | 
 | extern bool ldemul_recognized_file | 
 |   (struct lang_input_statement_struct *); | 
 | extern bool ldemul_open_dynamic_archive | 
 |   (const char *, struct search_dirs *, struct lang_input_statement_struct *); | 
 | extern char *ldemul_default_target | 
 |   (int, char**); | 
 | extern void after_parse_default | 
 |   (void); | 
 | extern void after_open_default | 
 |   (void); | 
 | extern void after_check_relocs_default | 
 |   (void); | 
 | extern void before_place_orphans_default | 
 |   (void); | 
 | extern void after_allocation_default | 
 |   (void); | 
 | extern void before_allocation_default | 
 |   (void); | 
 | extern void finish_default | 
 |   (void); | 
 | extern void finish_default | 
 |   (void); | 
 | extern void set_output_arch_default | 
 |   (void); | 
 | extern void syslib_default | 
 |   (char*); | 
 | extern void hll_default | 
 |   (char*); | 
 | extern int  ldemul_find_potential_libraries | 
 |   (char *, struct lang_input_statement_struct *); | 
 | extern struct bfd_elf_version_expr *ldemul_new_vers_pattern | 
 |   (struct bfd_elf_version_expr *); | 
 | extern void ldemul_extra_map_file_text | 
 |   (bfd *, struct bfd_link_info *, FILE *); | 
 | /* Return 1 if we are emitting CTF early, and 0 if ldemul_examine_strtab_for_ctf | 
 |    will be called by the target.  */ | 
 | extern int ldemul_emit_ctf_early | 
 |   (void); | 
 | /* Called from per-target code to examine the strtab and symtab.  */ | 
 | extern void ldemul_acquire_strings_for_ctf | 
 |   (struct ctf_dict *, struct elf_strtab_hash *); | 
 | extern void ldemul_new_dynsym_for_ctf | 
 |   (struct ctf_dict *, int symidx, struct elf_internal_sym *); | 
 |  | 
 | extern bool ldemul_print_symbol | 
 |   (struct bfd_link_hash_entry *hash_entry, void *ptr); | 
 |  | 
 | typedef struct ld_emulation_xfer_struct { | 
 |   /* Run before parsing the command line and script file. | 
 |      Set the architecture, maybe other things.  */ | 
 |   void   (*before_parse) (void); | 
 |  | 
 |   /* Handle the SYSLIB (low level library) script command.  */ | 
 |   void   (*syslib) (char *); | 
 |  | 
 |   /* Handle the HLL (high level library) script command.  */ | 
 |   void   (*hll) (char *); | 
 |  | 
 |   /* Run after parsing the command line and script file.  */ | 
 |   void   (*after_parse) (void); | 
 |  | 
 |   /* Run before calling plugin 'all symbols read' hook.  */ | 
 |   void   (*before_plugin_all_symbols_read)  (void); | 
 |  | 
 |   /* Run after opening all input files, and loading the symbols.  */ | 
 |   void   (*after_open) (void); | 
 |  | 
 |   /* Run after checking relocations.  */ | 
 |   void   (*after_check_relocs)  (void); | 
 |  | 
 |   /* Run before placing orphans.  */ | 
 |   void   (*before_place_orphans)  (void); | 
 |  | 
 |   /* Run after allocating output sections.  */ | 
 |   void   (*after_allocation)  (void); | 
 |  | 
 |   /* Set the output architecture and machine if possible.  */ | 
 |   void   (*set_output_arch) (void); | 
 |  | 
 |   /* Decide which target name to use.  */ | 
 |   char * (*choose_target) (int, char**); | 
 |  | 
 |   /* Run before allocating output sections.  */ | 
 |   void   (*before_allocation) (void); | 
 |  | 
 |   /* Return the appropriate linker script.  */ | 
 |   char * (*get_script) (int *isfile); | 
 |  | 
 |   /* The name of this emulation.  */ | 
 |   char *emulation_name; | 
 |  | 
 |   /* The output format.  */ | 
 |   char *target_name; | 
 |  | 
 |   /* Run after assigning values from the script.  */ | 
 |   void	(*finish) (void); | 
 |  | 
 |   /* Create any output sections needed by the target.  */ | 
 |   void	(*create_output_section_statements) (void); | 
 |  | 
 |   /* Try to open a dynamic library.  ARCH is an architecture name, and | 
 |      is normally the empty string.  ENTRY is the lang_input_statement | 
 |      that should be opened.  */ | 
 |   bool (*open_dynamic_archive) | 
 |     (const char *arch, struct search_dirs *, | 
 |      struct lang_input_statement_struct *entry); | 
 |  | 
 |   /* Place an orphan section.  Return TRUE if it was placed, FALSE if | 
 |      the default action should be taken.  This field may be NULL, in | 
 |      which case the default action will always be taken.  */ | 
 |   lang_output_section_statement_type *(*place_orphan) | 
 |     (asection *, const char *, int); | 
 |  | 
 |   /* Run after assigning parsing with the args, but before | 
 |      reading the script.  Used to initialize symbols used in the script.  */ | 
 |   void	(*set_symbols) (void); | 
 |  | 
 |   /* Parse args which the base linker doesn't understand. | 
 |      Return TRUE if the arg needs no further processing.  */ | 
 |   bool (*parse_args) (int, char **); | 
 |  | 
 |   /* Hook to add options to parameters passed by the base linker to | 
 |      getopt_long and getopt_long_only calls.  */ | 
 |   void (*add_options) | 
 |     (int, char **, int, struct option **, int, struct option **); | 
 |  | 
 |   /* Companion to the above to handle an option.  Returns TRUE if it is | 
 |      one of our options.  */ | 
 |   bool (*handle_option) (int); | 
 |  | 
 |   /* Run to handle files which are not recognized as object files or | 
 |      archives.  Return TRUE if the file was handled.  */ | 
 |   bool (*unrecognized_file) | 
 |     (struct lang_input_statement_struct *); | 
 |  | 
 |   /* Run to list the command line options which parse_args handles.  */ | 
 |   void (* list_options) (FILE *); | 
 |  | 
 |   /* Run to specially handle files which *are* recognized as object | 
 |      files or archives.  Return TRUE if the file was handled.  */ | 
 |   bool (*recognized_file) | 
 |     (struct lang_input_statement_struct *); | 
 |  | 
 |   /* Called when looking for libraries in a directory specified | 
 |      via a linker command line option or linker script option. | 
 |      Files that match the pattern "lib*.a" have already been scanned. | 
 |      (For VMS files matching ":lib*.a" have also been scanned).  */ | 
 |   int (* find_potential_libraries) | 
 |     (char *, struct lang_input_statement_struct *); | 
 |  | 
 |   /* Called when adding a new version pattern.  PowerPC64-ELF uses | 
 |      this hook to add a pattern matching ".foo" for every "foo".  */ | 
 |   struct bfd_elf_version_expr * (*new_vers_pattern) | 
 |     (struct bfd_elf_version_expr *); | 
 |  | 
 |   /* Called when printing the map file, in case there are | 
 |      emulation-specific sections for it.  */ | 
 |   void (*extra_map_file_text) | 
 |     (bfd *, struct bfd_link_info *, FILE *); | 
 |  | 
 |   /* If this returns true, we emit CTF as early as possible: if false, we emit | 
 |      CTF once the strtab and symtab are laid out.  */ | 
 |   int (*emit_ctf_early) | 
 |     (void); | 
 |  | 
 |   /* Called to examine the string table late enough in linking that it is | 
 |      finally laid out.  If emit_ctf_early returns true, this is not called, and | 
 |      ldemul_maybe_emit_ctf emits CTF in 'early' mode: otherwise, it waits | 
 |      until 'late'. (Late mode needs explicit support at per-target link time to | 
 |      get called at all).  If set, called by ld when the examine_strtab | 
 |      bfd_link_callback is invoked by per-target code.  */ | 
 |   void (*acquire_strings_for_ctf) (struct ctf_dict *, struct elf_strtab_hash *); | 
 |  | 
 |   /* Called when a new symbol is added to the dynamic symbol table.  If | 
 |      emit_ctf_early returns true, this is not called, and ldemul_maybe_emit_ctf | 
 |      emits CTF in 'early' mode: otherwise, it waits until 'late'. (Late mode | 
 |      needs explicit support at per-target link time to get called at all).  If | 
 |      set, called by ld when the ctf_new_symbol bfd_link_callback is invoked by | 
 |      per-target code.  Called with a NULL symbol when no further symbols will be | 
 |      provided.  */ | 
 |   void (*new_dynsym_for_ctf) (struct ctf_dict *, int, struct elf_internal_sym *); | 
 |  | 
 |   /* Called when printing a symbol to the map file.   AIX uses this | 
 |      hook to flag gc'd symbols.  */ | 
 |   bool (*print_symbol) | 
 |     (struct bfd_link_hash_entry *hash_entry, void *ptr); | 
 |  | 
 | } ld_emulation_xfer_type; | 
 |  | 
 | typedef enum { | 
 |   intel_ic960_ld_mode_enum, | 
 |   default_mode_enum, | 
 |   intel_gld960_ld_mode_enum | 
 | } lang_emulation_mode_enum_type; | 
 |  | 
 | extern ld_emulation_xfer_type *ld_emulations[]; | 
 |  | 
 | #endif |