1*fae548d3Szrj /* ld-emul.h - Linker emulation header file 2*fae548d3Szrj Copyright (C) 1991-2020 Free Software Foundation, Inc. 3*fae548d3Szrj 4*fae548d3Szrj This file is part of the GNU Binutils. 5*fae548d3Szrj 6*fae548d3Szrj This program is free software; you can redistribute it and/or modify 7*fae548d3Szrj it under the terms of the GNU General Public License as published by 8*fae548d3Szrj the Free Software Foundation; either version 3 of the License, or 9*fae548d3Szrj (at your option) any later version. 10*fae548d3Szrj 11*fae548d3Szrj This program is distributed in the hope that it will be useful, 12*fae548d3Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 13*fae548d3Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*fae548d3Szrj GNU General Public License for more details. 15*fae548d3Szrj 16*fae548d3Szrj You should have received a copy of the GNU General Public License 17*fae548d3Szrj along with this program; if not, write to the Free Software 18*fae548d3Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19*fae548d3Szrj MA 02110-1301, USA. */ 20*fae548d3Szrj 21*fae548d3Szrj #ifndef LDEMUL_H 22*fae548d3Szrj #define LDEMUL_H 23*fae548d3Szrj 24*fae548d3Szrj /* Forward declaration for ldemul_add_options() and others. */ 25*fae548d3Szrj struct option; 26*fae548d3Szrj 27*fae548d3Szrj extern void ldemul_hll 28*fae548d3Szrj (char *); 29*fae548d3Szrj extern void ldemul_syslib 30*fae548d3Szrj (char *); 31*fae548d3Szrj extern void ldemul_after_parse 32*fae548d3Szrj (void); 33*fae548d3Szrj extern void ldemul_before_parse 34*fae548d3Szrj (void); 35*fae548d3Szrj extern void ldemul_after_open 36*fae548d3Szrj (void); 37*fae548d3Szrj extern void ldemul_after_check_relocs 38*fae548d3Szrj (void); 39*fae548d3Szrj extern void ldemul_after_allocation 40*fae548d3Szrj (void); 41*fae548d3Szrj extern void ldemul_before_allocation 42*fae548d3Szrj (void); 43*fae548d3Szrj extern void ldemul_set_output_arch 44*fae548d3Szrj (void); 45*fae548d3Szrj extern char *ldemul_choose_target 46*fae548d3Szrj (int, char**); 47*fae548d3Szrj extern void ldemul_choose_mode 48*fae548d3Szrj (char *); 49*fae548d3Szrj extern void ldemul_list_emulations 50*fae548d3Szrj (FILE *); 51*fae548d3Szrj extern void ldemul_list_emulation_options 52*fae548d3Szrj (FILE *); 53*fae548d3Szrj extern char *ldemul_get_script 54*fae548d3Szrj (int *isfile); 55*fae548d3Szrj extern void ldemul_finish 56*fae548d3Szrj (void); 57*fae548d3Szrj extern void ldemul_set_symbols 58*fae548d3Szrj (void); 59*fae548d3Szrj extern void ldemul_create_output_section_statements 60*fae548d3Szrj (void); 61*fae548d3Szrj extern lang_output_section_statement_type *ldemul_place_orphan 62*fae548d3Szrj (asection *, const char *, int); 63*fae548d3Szrj extern bfd_boolean ldemul_parse_args 64*fae548d3Szrj (int, char **); 65*fae548d3Szrj extern void ldemul_add_options 66*fae548d3Szrj (int, char **, int, struct option **, int, struct option **); 67*fae548d3Szrj extern bfd_boolean ldemul_handle_option 68*fae548d3Szrj (int); 69*fae548d3Szrj extern bfd_boolean ldemul_unrecognized_file 70*fae548d3Szrj (struct lang_input_statement_struct *); 71*fae548d3Szrj extern bfd_boolean ldemul_recognized_file 72*fae548d3Szrj (struct lang_input_statement_struct *); 73*fae548d3Szrj extern bfd_boolean ldemul_open_dynamic_archive 74*fae548d3Szrj (const char *, struct search_dirs *, struct lang_input_statement_struct *); 75*fae548d3Szrj extern char *ldemul_default_target 76*fae548d3Szrj (int, char**); 77*fae548d3Szrj extern void after_parse_default 78*fae548d3Szrj (void); 79*fae548d3Szrj extern void after_open_default 80*fae548d3Szrj (void); 81*fae548d3Szrj extern void after_check_relocs_default 82*fae548d3Szrj (void); 83*fae548d3Szrj extern void after_allocation_default 84*fae548d3Szrj (void); 85*fae548d3Szrj extern void before_allocation_default 86*fae548d3Szrj (void); 87*fae548d3Szrj extern void finish_default 88*fae548d3Szrj (void); 89*fae548d3Szrj extern void finish_default 90*fae548d3Szrj (void); 91*fae548d3Szrj extern void set_output_arch_default 92*fae548d3Szrj (void); 93*fae548d3Szrj extern void syslib_default 94*fae548d3Szrj (char*); 95*fae548d3Szrj extern void hll_default 96*fae548d3Szrj (char*); 97*fae548d3Szrj extern int ldemul_find_potential_libraries 98*fae548d3Szrj (char *, struct lang_input_statement_struct *); 99*fae548d3Szrj extern struct bfd_elf_version_expr *ldemul_new_vers_pattern 100*fae548d3Szrj (struct bfd_elf_version_expr *); 101*fae548d3Szrj extern void ldemul_extra_map_file_text 102*fae548d3Szrj (bfd *, struct bfd_link_info *, FILE *); 103*fae548d3Szrj /* Return 1 if we are emitting CTF early, and 0 if ldemul_examine_strtab_for_ctf 104*fae548d3Szrj will be called by the target. */ 105*fae548d3Szrj extern int ldemul_emit_ctf_early 106*fae548d3Szrj (void); 107*fae548d3Szrj /* Called from per-target code to examine the strtab and symtab. */ 108*fae548d3Szrj extern void ldemul_examine_strtab_for_ctf 109*fae548d3Szrj (struct ctf_file *, struct elf_sym_strtab *, bfd_size_type, 110*fae548d3Szrj struct elf_strtab_hash *); 111*fae548d3Szrj 112*fae548d3Szrj typedef struct ld_emulation_xfer_struct { 113*fae548d3Szrj /* Run before parsing the command line and script file. 114*fae548d3Szrj Set the architecture, maybe other things. */ 115*fae548d3Szrj void (*before_parse) (void); 116*fae548d3Szrj 117*fae548d3Szrj /* Handle the SYSLIB (low level library) script command. */ 118*fae548d3Szrj void (*syslib) (char *); 119*fae548d3Szrj 120*fae548d3Szrj /* Handle the HLL (high level library) script command. */ 121*fae548d3Szrj void (*hll) (char *); 122*fae548d3Szrj 123*fae548d3Szrj /* Run after parsing the command line and script file. */ 124*fae548d3Szrj void (*after_parse) (void); 125*fae548d3Szrj 126*fae548d3Szrj /* Run after opening all input files, and loading the symbols. */ 127*fae548d3Szrj void (*after_open) (void); 128*fae548d3Szrj 129*fae548d3Szrj /* Run after checking relocations. */ 130*fae548d3Szrj void (*after_check_relocs) (void); 131*fae548d3Szrj 132*fae548d3Szrj /* Run after allocating output sections. */ 133*fae548d3Szrj void (*after_allocation) (void); 134*fae548d3Szrj 135*fae548d3Szrj /* Set the output architecture and machine if possible. */ 136*fae548d3Szrj void (*set_output_arch) (void); 137*fae548d3Szrj 138*fae548d3Szrj /* Decide which target name to use. */ 139*fae548d3Szrj char * (*choose_target) (int, char**); 140*fae548d3Szrj 141*fae548d3Szrj /* Run before allocating output sections. */ 142*fae548d3Szrj void (*before_allocation) (void); 143*fae548d3Szrj 144*fae548d3Szrj /* Return the appropriate linker script. */ 145*fae548d3Szrj char * (*get_script) (int *isfile); 146*fae548d3Szrj 147*fae548d3Szrj /* The name of this emulation. */ 148*fae548d3Szrj char *emulation_name; 149*fae548d3Szrj 150*fae548d3Szrj /* The output format. */ 151*fae548d3Szrj char *target_name; 152*fae548d3Szrj 153*fae548d3Szrj /* Run after assigning values from the script. */ 154*fae548d3Szrj void (*finish) (void); 155*fae548d3Szrj 156*fae548d3Szrj /* Create any output sections needed by the target. */ 157*fae548d3Szrj void (*create_output_section_statements) (void); 158*fae548d3Szrj 159*fae548d3Szrj /* Try to open a dynamic library. ARCH is an architecture name, and 160*fae548d3Szrj is normally the empty string. ENTRY is the lang_input_statement 161*fae548d3Szrj that should be opened. */ 162*fae548d3Szrj bfd_boolean (*open_dynamic_archive) 163*fae548d3Szrj (const char *arch, struct search_dirs *, 164*fae548d3Szrj struct lang_input_statement_struct *entry); 165*fae548d3Szrj 166*fae548d3Szrj /* Place an orphan section. Return TRUE if it was placed, FALSE if 167*fae548d3Szrj the default action should be taken. This field may be NULL, in 168*fae548d3Szrj which case the default action will always be taken. */ 169*fae548d3Szrj lang_output_section_statement_type *(*place_orphan) 170*fae548d3Szrj (asection *, const char *, int); 171*fae548d3Szrj 172*fae548d3Szrj /* Run after assigning parsing with the args, but before 173*fae548d3Szrj reading the script. Used to initialize symbols used in the script. */ 174*fae548d3Szrj void (*set_symbols) (void); 175*fae548d3Szrj 176*fae548d3Szrj /* Parse args which the base linker doesn't understand. 177*fae548d3Szrj Return TRUE if the arg needs no further processing. */ 178*fae548d3Szrj bfd_boolean (*parse_args) (int, char **); 179*fae548d3Szrj 180*fae548d3Szrj /* Hook to add options to parameters passed by the base linker to 181*fae548d3Szrj getopt_long and getopt_long_only calls. */ 182*fae548d3Szrj void (*add_options) 183*fae548d3Szrj (int, char **, int, struct option **, int, struct option **); 184*fae548d3Szrj 185*fae548d3Szrj /* Companion to the above to handle an option. Returns TRUE if it is 186*fae548d3Szrj one of our options. */ 187*fae548d3Szrj bfd_boolean (*handle_option) (int); 188*fae548d3Szrj 189*fae548d3Szrj /* Run to handle files which are not recognized as object files or 190*fae548d3Szrj archives. Return TRUE if the file was handled. */ 191*fae548d3Szrj bfd_boolean (*unrecognized_file) 192*fae548d3Szrj (struct lang_input_statement_struct *); 193*fae548d3Szrj 194*fae548d3Szrj /* Run to list the command line options which parse_args handles. */ 195*fae548d3Szrj void (* list_options) (FILE *); 196*fae548d3Szrj 197*fae548d3Szrj /* Run to specially handle files which *are* recognized as object 198*fae548d3Szrj files or archives. Return TRUE if the file was handled. */ 199*fae548d3Szrj bfd_boolean (*recognized_file) 200*fae548d3Szrj (struct lang_input_statement_struct *); 201*fae548d3Szrj 202*fae548d3Szrj /* Called when looking for libraries in a directory specified 203*fae548d3Szrj via a linker command line option or linker script option. 204*fae548d3Szrj Files that match the pattern "lib*.a" have already been scanned. 205*fae548d3Szrj (For VMS files matching ":lib*.a" have also been scanned). */ 206*fae548d3Szrj int (* find_potential_libraries) 207*fae548d3Szrj (char *, struct lang_input_statement_struct *); 208*fae548d3Szrj 209*fae548d3Szrj /* Called when adding a new version pattern. PowerPC64-ELF uses 210*fae548d3Szrj this hook to add a pattern matching ".foo" for every "foo". */ 211*fae548d3Szrj struct bfd_elf_version_expr * (*new_vers_pattern) 212*fae548d3Szrj (struct bfd_elf_version_expr *); 213*fae548d3Szrj 214*fae548d3Szrj /* Called when printing the map file, in case there are 215*fae548d3Szrj emulation-specific sections for it. */ 216*fae548d3Szrj void (*extra_map_file_text) 217*fae548d3Szrj (bfd *, struct bfd_link_info *, FILE *); 218*fae548d3Szrj 219*fae548d3Szrj /* If this returns true, we emit CTF as early as possible: if false, we emit 220*fae548d3Szrj CTF once the strtab and symtab are laid out. */ 221*fae548d3Szrj int (*emit_ctf_early) 222*fae548d3Szrj (void); 223*fae548d3Szrj 224*fae548d3Szrj /* Called to examine the string and symbol table late enough in linking that 225*fae548d3Szrj they are finally laid out. If emit_ctf_early returns true, this is not 226*fae548d3Szrj called and ldemul_maybe_emit_ctf() emits CTF in 'early' mode: otherwise, it 227*fae548d3Szrj waits until 'late'. (Late mode needs explicit support at per-target link 228*fae548d3Szrj time to get called at all). If set, called by ld when the examine_strtab 229*fae548d3Szrj bfd_link_callback is invoked by per-target code. */ 230*fae548d3Szrj void (*examine_strtab_for_ctf) (struct ctf_file *, struct elf_sym_strtab *, 231*fae548d3Szrj bfd_size_type, struct elf_strtab_hash *); 232*fae548d3Szrj } ld_emulation_xfer_type; 233*fae548d3Szrj 234*fae548d3Szrj typedef enum { 235*fae548d3Szrj intel_ic960_ld_mode_enum, 236*fae548d3Szrj default_mode_enum, 237*fae548d3Szrj intel_gld960_ld_mode_enum 238*fae548d3Szrj } lang_emulation_mode_enum_type; 239*fae548d3Szrj 240*fae548d3Szrj extern ld_emulation_xfer_type *ld_emulations[]; 241*fae548d3Szrj 242*fae548d3Szrj #endif 243