123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- /* ld-emul.h - Linker emulation 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 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
|