xref: /dflybsd-src/contrib/binutils-2.34/ld/ldemul.h (revision b52ef7118d1621abed722c5bbbd542210290ecef)
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