xref: /dragonfly/contrib/binutils-2.34/ld/ldlang.h (revision fae548d3)
1*fae548d3Szrj /* ldlang.h - linker command language support
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 LDLANG_H
22*fae548d3Szrj #define LDLANG_H
23*fae548d3Szrj 
24*fae548d3Szrj #define DEFAULT_MEMORY_REGION   "*default*"
25*fae548d3Szrj 
26*fae548d3Szrj typedef enum
27*fae548d3Szrj {
28*fae548d3Szrj   lang_input_file_is_l_enum,
29*fae548d3Szrj   lang_input_file_is_symbols_only_enum,
30*fae548d3Szrj   lang_input_file_is_marker_enum,
31*fae548d3Szrj   lang_input_file_is_fake_enum,
32*fae548d3Szrj   lang_input_file_is_search_file_enum,
33*fae548d3Szrj   lang_input_file_is_file_enum
34*fae548d3Szrj } lang_input_file_enum_type;
35*fae548d3Szrj 
36*fae548d3Szrj struct _fill_type
37*fae548d3Szrj {
38*fae548d3Szrj   size_t size;
39*fae548d3Szrj   unsigned char data[1];
40*fae548d3Szrj };
41*fae548d3Szrj 
42*fae548d3Szrj typedef struct statement_list
43*fae548d3Szrj {
44*fae548d3Szrj   union lang_statement_union *  head;
45*fae548d3Szrj   union lang_statement_union ** tail;
46*fae548d3Szrj } lang_statement_list_type;
47*fae548d3Szrj 
48*fae548d3Szrj typedef struct memory_region_name_struct
49*fae548d3Szrj {
50*fae548d3Szrj   const char * name;
51*fae548d3Szrj   struct memory_region_name_struct * next;
52*fae548d3Szrj } lang_memory_region_name;
53*fae548d3Szrj 
54*fae548d3Szrj typedef struct memory_region_struct
55*fae548d3Szrj {
56*fae548d3Szrj   lang_memory_region_name name_list;
57*fae548d3Szrj   struct memory_region_struct *next;
58*fae548d3Szrj   union etree_union *origin_exp;
59*fae548d3Szrj   bfd_vma origin;
60*fae548d3Szrj   bfd_size_type length;
61*fae548d3Szrj   union etree_union *length_exp;
62*fae548d3Szrj   bfd_vma current;
63*fae548d3Szrj   union lang_statement_union *last_os;
64*fae548d3Szrj   flagword flags;
65*fae548d3Szrj   flagword not_flags;
66*fae548d3Szrj   bfd_boolean had_full_message;
67*fae548d3Szrj } lang_memory_region_type;
68*fae548d3Szrj 
69*fae548d3Szrj enum statement_enum
70*fae548d3Szrj {
71*fae548d3Szrj   lang_address_statement_enum,
72*fae548d3Szrj   lang_assignment_statement_enum,
73*fae548d3Szrj   lang_data_statement_enum,
74*fae548d3Szrj   lang_fill_statement_enum,
75*fae548d3Szrj   lang_group_statement_enum,
76*fae548d3Szrj   lang_input_section_enum,
77*fae548d3Szrj   lang_input_statement_enum,
78*fae548d3Szrj   lang_insert_statement_enum,
79*fae548d3Szrj   lang_output_section_statement_enum,
80*fae548d3Szrj   lang_output_statement_enum,
81*fae548d3Szrj   lang_padding_statement_enum,
82*fae548d3Szrj   lang_reloc_statement_enum,
83*fae548d3Szrj   lang_target_statement_enum,
84*fae548d3Szrj   lang_wild_statement_enum,
85*fae548d3Szrj   lang_constructors_statement_enum,
86*fae548d3Szrj   lang_object_symbols_statement_enum
87*fae548d3Szrj };
88*fae548d3Szrj 
89*fae548d3Szrj typedef struct lang_statement_header_struct
90*fae548d3Szrj {
91*fae548d3Szrj   /* Next pointer for statement_list statement list.  */
92*fae548d3Szrj   union lang_statement_union *next;
93*fae548d3Szrj   enum statement_enum type;
94*fae548d3Szrj } lang_statement_header_type;
95*fae548d3Szrj 
96*fae548d3Szrj typedef struct
97*fae548d3Szrj {
98*fae548d3Szrj   lang_statement_header_type header;
99*fae548d3Szrj   union etree_union *exp;
100*fae548d3Szrj } lang_assignment_statement_type;
101*fae548d3Szrj 
102*fae548d3Szrj typedef struct lang_target_statement_struct
103*fae548d3Szrj {
104*fae548d3Szrj   lang_statement_header_type header;
105*fae548d3Szrj   const char *target;
106*fae548d3Szrj } lang_target_statement_type;
107*fae548d3Szrj 
108*fae548d3Szrj typedef struct lang_output_statement_struct
109*fae548d3Szrj {
110*fae548d3Szrj   lang_statement_header_type header;
111*fae548d3Szrj   const char *name;
112*fae548d3Szrj } lang_output_statement_type;
113*fae548d3Szrj 
114*fae548d3Szrj /* Section types specified in a linker script.  */
115*fae548d3Szrj 
116*fae548d3Szrj enum section_type
117*fae548d3Szrj {
118*fae548d3Szrj   normal_section,
119*fae548d3Szrj   first_overlay_section,
120*fae548d3Szrj   overlay_section,
121*fae548d3Szrj   noload_section,
122*fae548d3Szrj   noalloc_section
123*fae548d3Szrj };
124*fae548d3Szrj 
125*fae548d3Szrj /* This structure holds a list of program headers describing
126*fae548d3Szrj    segments in which this section should be placed.  */
127*fae548d3Szrj 
128*fae548d3Szrj typedef struct lang_output_section_phdr_list
129*fae548d3Szrj {
130*fae548d3Szrj   struct lang_output_section_phdr_list *next;
131*fae548d3Szrj   const char *name;
132*fae548d3Szrj   bfd_boolean used;
133*fae548d3Szrj } lang_output_section_phdr_list;
134*fae548d3Szrj 
135*fae548d3Szrj typedef struct lang_output_section_statement_struct
136*fae548d3Szrj {
137*fae548d3Szrj   lang_statement_header_type header;
138*fae548d3Szrj   lang_statement_list_type children;
139*fae548d3Szrj   struct lang_output_section_statement_struct *next;
140*fae548d3Szrj   struct lang_output_section_statement_struct *prev;
141*fae548d3Szrj   const char *name;
142*fae548d3Szrj   asection *bfd_section;
143*fae548d3Szrj   lang_memory_region_type *region;
144*fae548d3Szrj   lang_memory_region_type *lma_region;
145*fae548d3Szrj   fill_type *fill;
146*fae548d3Szrj   union etree_union *addr_tree;
147*fae548d3Szrj   union etree_union *load_base;
148*fae548d3Szrj   union etree_union *section_alignment;
149*fae548d3Szrj   union etree_union *subsection_alignment;
150*fae548d3Szrj 
151*fae548d3Szrj   /* If non-null, an expression to evaluate after setting the section's
152*fae548d3Szrj      size.  The expression is evaluated inside REGION (above) with '.'
153*fae548d3Szrj      set to the end of the section.  Used in the last overlay section
154*fae548d3Szrj      to move '.' past all the overlaid sections.  */
155*fae548d3Szrj   union etree_union *update_dot_tree;
156*fae548d3Szrj 
157*fae548d3Szrj   lang_output_section_phdr_list *phdrs;
158*fae548d3Szrj 
159*fae548d3Szrj   unsigned int block_value;
160*fae548d3Szrj   int constraint;
161*fae548d3Szrj   flagword flags;
162*fae548d3Szrj   enum section_type sectype;
163*fae548d3Szrj   unsigned int processed_vma : 1;
164*fae548d3Szrj   unsigned int processed_lma : 1;
165*fae548d3Szrj   unsigned int all_input_readonly : 1;
166*fae548d3Szrj   /* If this section should be ignored.  */
167*fae548d3Szrj   unsigned int ignored : 1;
168*fae548d3Szrj   /* If this section should update "dot".  Prevents section being ignored.  */
169*fae548d3Szrj   unsigned int update_dot : 1;
170*fae548d3Szrj   /* If this section is after assignment to _end.  */
171*fae548d3Szrj   unsigned int after_end : 1;
172*fae548d3Szrj   /* If this section uses the alignment of its input sections.  */
173*fae548d3Szrj   unsigned int align_lma_with_input : 1;
174*fae548d3Szrj } lang_output_section_statement_type;
175*fae548d3Szrj 
176*fae548d3Szrj typedef struct
177*fae548d3Szrj {
178*fae548d3Szrj   lang_statement_header_type header;
179*fae548d3Szrj   fill_type *fill;
180*fae548d3Szrj   int size;
181*fae548d3Szrj   asection *output_section;
182*fae548d3Szrj } lang_fill_statement_type;
183*fae548d3Szrj 
184*fae548d3Szrj typedef struct
185*fae548d3Szrj {
186*fae548d3Szrj   lang_statement_header_type header;
187*fae548d3Szrj   unsigned int type;
188*fae548d3Szrj   union etree_union *exp;
189*fae548d3Szrj   bfd_vma value;
190*fae548d3Szrj   asection *output_section;
191*fae548d3Szrj   bfd_vma output_offset;
192*fae548d3Szrj } lang_data_statement_type;
193*fae548d3Szrj 
194*fae548d3Szrj /* Generate a reloc in the output file.  */
195*fae548d3Szrj 
196*fae548d3Szrj typedef struct
197*fae548d3Szrj {
198*fae548d3Szrj   lang_statement_header_type header;
199*fae548d3Szrj 
200*fae548d3Szrj   /* Reloc to generate.  */
201*fae548d3Szrj   bfd_reloc_code_real_type reloc;
202*fae548d3Szrj 
203*fae548d3Szrj   /* Reloc howto structure.  */
204*fae548d3Szrj   reloc_howto_type *howto;
205*fae548d3Szrj 
206*fae548d3Szrj   /* Section to generate reloc against.
207*fae548d3Szrj      Exactly one of section and name must be NULL.  */
208*fae548d3Szrj   asection *section;
209*fae548d3Szrj 
210*fae548d3Szrj   /* Name of symbol to generate reloc against.
211*fae548d3Szrj      Exactly one of section and name must be NULL.  */
212*fae548d3Szrj   const char *name;
213*fae548d3Szrj 
214*fae548d3Szrj   /* Expression for addend.  */
215*fae548d3Szrj   union etree_union *addend_exp;
216*fae548d3Szrj 
217*fae548d3Szrj   /* Resolved addend.  */
218*fae548d3Szrj   bfd_vma addend_value;
219*fae548d3Szrj 
220*fae548d3Szrj   /* Output section where reloc should be performed.  */
221*fae548d3Szrj   asection *output_section;
222*fae548d3Szrj 
223*fae548d3Szrj   /* Offset within output section.  */
224*fae548d3Szrj   bfd_vma output_offset;
225*fae548d3Szrj } lang_reloc_statement_type;
226*fae548d3Szrj 
227*fae548d3Szrj struct lang_input_statement_flags
228*fae548d3Szrj {
229*fae548d3Szrj   /* 1 means this file was specified in a -l option.  */
230*fae548d3Szrj   unsigned int maybe_archive : 1;
231*fae548d3Szrj 
232*fae548d3Szrj   /* 1 means this file was specified in a -l:namespec option.  */
233*fae548d3Szrj   unsigned int full_name_provided : 1;
234*fae548d3Szrj 
235*fae548d3Szrj   /* 1 means search a set of directories for this file.  */
236*fae548d3Szrj   unsigned int search_dirs : 1;
237*fae548d3Szrj 
238*fae548d3Szrj   /* 1 means this was found when processing a script in the sysroot.  */
239*fae548d3Szrj   unsigned int sysrooted : 1;
240*fae548d3Szrj 
241*fae548d3Szrj   /* 1 means this is base file of incremental load.
242*fae548d3Szrj      Do not load this file's text or data.
243*fae548d3Szrj      Also default text_start to after this file's bss.  */
244*fae548d3Szrj   unsigned int just_syms : 1;
245*fae548d3Szrj 
246*fae548d3Szrj   /* Whether to search for this entry as a dynamic archive.  */
247*fae548d3Szrj   unsigned int dynamic : 1;
248*fae548d3Szrj 
249*fae548d3Szrj   /* Set if a DT_NEEDED tag should be added not just for the dynamic library
250*fae548d3Szrj      explicitly given by this entry but also for any dynamic libraries in
251*fae548d3Szrj      this entry's needed list.  */
252*fae548d3Szrj   unsigned int add_DT_NEEDED_for_dynamic : 1;
253*fae548d3Szrj 
254*fae548d3Szrj   /* Set if this entry should cause a DT_NEEDED tag only when some
255*fae548d3Szrj      regular file references its symbols (ie. --as-needed is in effect).  */
256*fae548d3Szrj   unsigned int add_DT_NEEDED_for_regular : 1;
257*fae548d3Szrj 
258*fae548d3Szrj   /* Whether to include the entire contents of an archive.  */
259*fae548d3Szrj   unsigned int whole_archive : 1;
260*fae548d3Szrj 
261*fae548d3Szrj   /* Set when bfd opening is successful.  */
262*fae548d3Szrj   unsigned int loaded : 1;
263*fae548d3Szrj 
264*fae548d3Szrj   unsigned int real : 1;
265*fae548d3Szrj 
266*fae548d3Szrj   /* Set if the file does not exist.  */
267*fae548d3Szrj   unsigned int missing_file : 1;
268*fae548d3Szrj 
269*fae548d3Szrj   /* Set if reloading an archive or --as-needed lib.  */
270*fae548d3Szrj   unsigned int reload : 1;
271*fae548d3Szrj 
272*fae548d3Szrj #ifdef ENABLE_PLUGINS
273*fae548d3Szrj   /* Set if the file was claimed by a plugin.  */
274*fae548d3Szrj   unsigned int claimed : 1;
275*fae548d3Szrj 
276*fae548d3Szrj   /* Set if the file was claimed from an archive.  */
277*fae548d3Szrj   unsigned int claim_archive : 1;
278*fae548d3Szrj 
279*fae548d3Szrj   /* Set if added by the lto plugin add_input_file callback.  */
280*fae548d3Szrj   unsigned int lto_output : 1;
281*fae548d3Szrj #endif /* ENABLE_PLUGINS */
282*fae548d3Szrj 
283*fae548d3Szrj   /* Head of list of pushed flags.  */
284*fae548d3Szrj   struct lang_input_statement_flags *pushed;
285*fae548d3Szrj };
286*fae548d3Szrj 
287*fae548d3Szrj typedef struct lang_input_statement_struct
288*fae548d3Szrj {
289*fae548d3Szrj   lang_statement_header_type header;
290*fae548d3Szrj   /* Name of this file.  */
291*fae548d3Szrj   const char *filename;
292*fae548d3Szrj   /* Name to use for the symbol giving address of text start.
293*fae548d3Szrj      Usually the same as filename, but for a file spec'd with
294*fae548d3Szrj      -l this is the -l switch itself rather than the filename.  */
295*fae548d3Szrj   const char *local_sym_name;
296*fae548d3Szrj 
297*fae548d3Szrj   bfd *the_bfd;
298*fae548d3Szrj 
299*fae548d3Szrj   ctf_archive_t *the_ctf;
300*fae548d3Szrj 
301*fae548d3Szrj   struct flag_info *section_flag_list;
302*fae548d3Szrj 
303*fae548d3Szrj   /* Next pointer for file_chain statement list.  */
304*fae548d3Szrj   struct lang_input_statement_struct *next;
305*fae548d3Szrj 
306*fae548d3Szrj   /* Next pointer for input_file_chain statement list.  */
307*fae548d3Szrj   struct lang_input_statement_struct *next_real_file;
308*fae548d3Szrj 
309*fae548d3Szrj   const char *target;
310*fae548d3Szrj 
311*fae548d3Szrj   struct lang_input_statement_flags flags;
312*fae548d3Szrj } lang_input_statement_type;
313*fae548d3Szrj 
314*fae548d3Szrj typedef struct
315*fae548d3Szrj {
316*fae548d3Szrj   lang_statement_header_type header;
317*fae548d3Szrj   asection *section;
318*fae548d3Szrj } lang_input_section_type;
319*fae548d3Szrj 
320*fae548d3Szrj struct map_symbol_def {
321*fae548d3Szrj   struct bfd_link_hash_entry *entry;
322*fae548d3Szrj   struct map_symbol_def *next;
323*fae548d3Szrj };
324*fae548d3Szrj 
325*fae548d3Szrj /* For input sections, when writing a map file: head / tail of a linked
326*fae548d3Szrj    list of hash table entries for symbols defined in this section.  */
327*fae548d3Szrj typedef struct input_section_userdata_struct
328*fae548d3Szrj {
329*fae548d3Szrj   struct map_symbol_def *map_symbol_def_head;
330*fae548d3Szrj   struct map_symbol_def **map_symbol_def_tail;
331*fae548d3Szrj   unsigned long map_symbol_def_count;
332*fae548d3Szrj } input_section_userdata_type;
333*fae548d3Szrj 
334*fae548d3Szrj static inline bfd_boolean
bfd_input_just_syms(const bfd * abfd)335*fae548d3Szrj bfd_input_just_syms (const bfd *abfd)
336*fae548d3Szrj {
337*fae548d3Szrj   lang_input_statement_type *is = bfd_usrdata (abfd);
338*fae548d3Szrj   return is != NULL && is->flags.just_syms;
339*fae548d3Szrj }
340*fae548d3Szrj 
341*fae548d3Szrj typedef struct lang_wild_statement_struct lang_wild_statement_type;
342*fae548d3Szrj 
343*fae548d3Szrj typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *,
344*fae548d3Szrj 			    asection *, struct flag_info *,
345*fae548d3Szrj 			    lang_input_statement_type *, void *);
346*fae548d3Szrj 
347*fae548d3Szrj typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *,
348*fae548d3Szrj 					     lang_input_statement_type *,
349*fae548d3Szrj 					     callback_t callback,
350*fae548d3Szrj 					     void *data);
351*fae548d3Szrj 
352*fae548d3Szrj typedef bfd_boolean (*lang_match_sec_type_func) (bfd *, const asection *,
353*fae548d3Szrj 						 bfd *, const asection *);
354*fae548d3Szrj 
355*fae548d3Szrj /* Binary search tree structure to efficiently sort sections by
356*fae548d3Szrj    name.  */
357*fae548d3Szrj typedef struct lang_section_bst
358*fae548d3Szrj {
359*fae548d3Szrj   asection *section;
360*fae548d3Szrj   struct lang_section_bst *left;
361*fae548d3Szrj   struct lang_section_bst *right;
362*fae548d3Szrj } lang_section_bst_type;
363*fae548d3Szrj 
364*fae548d3Szrj struct lang_wild_statement_struct
365*fae548d3Szrj {
366*fae548d3Szrj   lang_statement_header_type header;
367*fae548d3Szrj   const char *filename;
368*fae548d3Szrj   bfd_boolean filenames_sorted;
369*fae548d3Szrj   struct wildcard_list *section_list;
370*fae548d3Szrj   bfd_boolean keep_sections;
371*fae548d3Szrj   lang_statement_list_type children;
372*fae548d3Szrj   struct name_list *exclude_name_list;
373*fae548d3Szrj 
374*fae548d3Szrj   walk_wild_section_handler_t walk_wild_section_handler;
375*fae548d3Szrj   struct wildcard_list *handler_data[4];
376*fae548d3Szrj   lang_section_bst_type *tree;
377*fae548d3Szrj   struct flag_info *section_flag_list;
378*fae548d3Szrj };
379*fae548d3Szrj 
380*fae548d3Szrj typedef struct lang_address_statement_struct
381*fae548d3Szrj {
382*fae548d3Szrj   lang_statement_header_type header;
383*fae548d3Szrj   const char *section_name;
384*fae548d3Szrj   union etree_union *address;
385*fae548d3Szrj   const segment_type *segment;
386*fae548d3Szrj } lang_address_statement_type;
387*fae548d3Szrj 
388*fae548d3Szrj typedef struct
389*fae548d3Szrj {
390*fae548d3Szrj   lang_statement_header_type header;
391*fae548d3Szrj   bfd_vma output_offset;
392*fae548d3Szrj   bfd_size_type size;
393*fae548d3Szrj   asection *output_section;
394*fae548d3Szrj   fill_type *fill;
395*fae548d3Szrj } lang_padding_statement_type;
396*fae548d3Szrj 
397*fae548d3Szrj /* A group statement collects a set of libraries together.  The
398*fae548d3Szrj    libraries are searched multiple times, until no new undefined
399*fae548d3Szrj    symbols are found.  The effect is to search a group of libraries as
400*fae548d3Szrj    though they were a single library.  */
401*fae548d3Szrj 
402*fae548d3Szrj typedef struct
403*fae548d3Szrj {
404*fae548d3Szrj   lang_statement_header_type header;
405*fae548d3Szrj   lang_statement_list_type children;
406*fae548d3Szrj } lang_group_statement_type;
407*fae548d3Szrj 
408*fae548d3Szrj typedef struct
409*fae548d3Szrj {
410*fae548d3Szrj   lang_statement_header_type header;
411*fae548d3Szrj   const char *where;
412*fae548d3Szrj   bfd_boolean is_before;
413*fae548d3Szrj } lang_insert_statement_type;
414*fae548d3Szrj 
415*fae548d3Szrj typedef union lang_statement_union
416*fae548d3Szrj {
417*fae548d3Szrj   lang_statement_header_type header;
418*fae548d3Szrj   lang_address_statement_type address_statement;
419*fae548d3Szrj   lang_assignment_statement_type assignment_statement;
420*fae548d3Szrj   lang_data_statement_type data_statement;
421*fae548d3Szrj   lang_fill_statement_type fill_statement;
422*fae548d3Szrj   lang_group_statement_type group_statement;
423*fae548d3Szrj   lang_input_section_type input_section;
424*fae548d3Szrj   lang_input_statement_type input_statement;
425*fae548d3Szrj   lang_insert_statement_type insert_statement;
426*fae548d3Szrj   lang_output_section_statement_type output_section_statement;
427*fae548d3Szrj   lang_output_statement_type output_statement;
428*fae548d3Szrj   lang_padding_statement_type padding_statement;
429*fae548d3Szrj   lang_reloc_statement_type reloc_statement;
430*fae548d3Szrj   lang_target_statement_type target_statement;
431*fae548d3Szrj   lang_wild_statement_type wild_statement;
432*fae548d3Szrj } lang_statement_union_type;
433*fae548d3Szrj 
434*fae548d3Szrj /* This structure holds information about a program header, from the
435*fae548d3Szrj    PHDRS command in the linker script.  */
436*fae548d3Szrj 
437*fae548d3Szrj struct lang_phdr
438*fae548d3Szrj {
439*fae548d3Szrj   struct lang_phdr *next;
440*fae548d3Szrj   const char *name;
441*fae548d3Szrj   unsigned long type;
442*fae548d3Szrj   bfd_boolean filehdr;
443*fae548d3Szrj   bfd_boolean phdrs;
444*fae548d3Szrj   etree_type *at;
445*fae548d3Szrj   etree_type *flags;
446*fae548d3Szrj };
447*fae548d3Szrj 
448*fae548d3Szrj /* This structure is used to hold a list of sections which may not
449*fae548d3Szrj    cross reference each other.  */
450*fae548d3Szrj 
451*fae548d3Szrj typedef struct lang_nocrossref
452*fae548d3Szrj {
453*fae548d3Szrj   struct lang_nocrossref *next;
454*fae548d3Szrj   const char *name;
455*fae548d3Szrj } lang_nocrossref_type;
456*fae548d3Szrj 
457*fae548d3Szrj /* The list of nocrossref lists.  */
458*fae548d3Szrj 
459*fae548d3Szrj struct lang_nocrossrefs
460*fae548d3Szrj {
461*fae548d3Szrj   struct lang_nocrossrefs *next;
462*fae548d3Szrj   lang_nocrossref_type *list;
463*fae548d3Szrj   bfd_boolean onlyfirst;
464*fae548d3Szrj };
465*fae548d3Szrj 
466*fae548d3Szrj /* This structure is used to hold a list of input section names which
467*fae548d3Szrj    will not match an output section in the linker script.  */
468*fae548d3Szrj 
469*fae548d3Szrj struct unique_sections
470*fae548d3Szrj {
471*fae548d3Szrj   struct unique_sections *next;
472*fae548d3Szrj   const char *name;
473*fae548d3Szrj };
474*fae548d3Szrj 
475*fae548d3Szrj /* Used by place_orphan to keep track of orphan sections and statements.  */
476*fae548d3Szrj 
477*fae548d3Szrj struct orphan_save
478*fae548d3Szrj {
479*fae548d3Szrj   const char *name;
480*fae548d3Szrj   flagword flags;
481*fae548d3Szrj   lang_output_section_statement_type *os;
482*fae548d3Szrj   asection **section;
483*fae548d3Szrj   lang_statement_union_type **stmt;
484*fae548d3Szrj   lang_output_section_statement_type **os_tail;
485*fae548d3Szrj };
486*fae548d3Szrj 
487*fae548d3Szrj struct asneeded_minfo
488*fae548d3Szrj {
489*fae548d3Szrj   struct asneeded_minfo *next;
490*fae548d3Szrj   const char *soname;
491*fae548d3Szrj   bfd *ref;
492*fae548d3Szrj   const char *name;
493*fae548d3Szrj };
494*fae548d3Szrj 
495*fae548d3Szrj extern struct lang_phdr *lang_phdr_list;
496*fae548d3Szrj extern struct lang_nocrossrefs *nocrossref_list;
497*fae548d3Szrj extern const char *output_target;
498*fae548d3Szrj extern lang_output_section_statement_type *abs_output_section;
499*fae548d3Szrj extern lang_statement_list_type lang_os_list;
500*fae548d3Szrj extern struct lang_input_statement_flags input_flags;
501*fae548d3Szrj extern bfd_boolean lang_has_input_file;
502*fae548d3Szrj extern lang_statement_list_type *stat_ptr;
503*fae548d3Szrj extern bfd_boolean delete_output_file_on_failure;
504*fae548d3Szrj 
505*fae548d3Szrj extern struct bfd_sym_chain entry_symbol;
506*fae548d3Szrj extern const char *entry_section;
507*fae548d3Szrj extern bfd_boolean entry_from_cmdline;
508*fae548d3Szrj extern lang_statement_list_type file_chain;
509*fae548d3Szrj extern lang_statement_list_type input_file_chain;
510*fae548d3Szrj 
511*fae548d3Szrj extern int lang_statement_iteration;
512*fae548d3Szrj extern struct asneeded_minfo **asneeded_list_tail;
513*fae548d3Szrj 
514*fae548d3Szrj extern void (*output_bfd_hash_table_free_fn) (struct bfd_link_hash_table *);
515*fae548d3Szrj 
516*fae548d3Szrj extern void lang_init
517*fae548d3Szrj   (void);
518*fae548d3Szrj extern void lang_finish
519*fae548d3Szrj   (void);
520*fae548d3Szrj extern lang_memory_region_type * lang_memory_region_lookup
521*fae548d3Szrj   (const char * const, bfd_boolean);
522*fae548d3Szrj extern void lang_memory_region_alias
523*fae548d3Szrj   (const char *, const char *);
524*fae548d3Szrj extern void lang_map
525*fae548d3Szrj   (void);
526*fae548d3Szrj extern void lang_set_flags
527*fae548d3Szrj   (lang_memory_region_type *, const char *, int);
528*fae548d3Szrj extern void lang_add_output
529*fae548d3Szrj   (const char *, int from_script);
530*fae548d3Szrj extern lang_output_section_statement_type *lang_enter_output_section_statement
531*fae548d3Szrj   (const char *, etree_type *, enum section_type, etree_type *, etree_type *,
532*fae548d3Szrj    etree_type *, int, int);
533*fae548d3Szrj extern void lang_final
534*fae548d3Szrj   (void);
535*fae548d3Szrj extern void lang_relax_sections
536*fae548d3Szrj   (bfd_boolean);
537*fae548d3Szrj extern void lang_process
538*fae548d3Szrj   (void);
539*fae548d3Szrj extern void lang_section_start
540*fae548d3Szrj   (const char *, union etree_union *, const segment_type *);
541*fae548d3Szrj extern void lang_add_entry
542*fae548d3Szrj   (const char *, bfd_boolean);
543*fae548d3Szrj extern void lang_default_entry
544*fae548d3Szrj   (const char *);
545*fae548d3Szrj extern void lang_add_target
546*fae548d3Szrj   (const char *);
547*fae548d3Szrj extern void lang_add_wild
548*fae548d3Szrj   (struct wildcard_spec *, struct wildcard_list *, bfd_boolean);
549*fae548d3Szrj extern void lang_add_map
550*fae548d3Szrj   (const char *);
551*fae548d3Szrj extern void lang_add_fill
552*fae548d3Szrj   (fill_type *);
553*fae548d3Szrj extern lang_assignment_statement_type *lang_add_assignment
554*fae548d3Szrj   (union etree_union *);
555*fae548d3Szrj extern void lang_add_attribute
556*fae548d3Szrj   (enum statement_enum);
557*fae548d3Szrj extern void lang_startup
558*fae548d3Szrj   (const char *);
559*fae548d3Szrj extern void lang_float
560*fae548d3Szrj   (bfd_boolean);
561*fae548d3Szrj extern void lang_leave_output_section_statement
562*fae548d3Szrj   (fill_type *, const char *, lang_output_section_phdr_list *,
563*fae548d3Szrj    const char *);
564*fae548d3Szrj extern void lang_for_each_input_file
565*fae548d3Szrj   (void (*dothis) (lang_input_statement_type *));
566*fae548d3Szrj extern void lang_for_each_file
567*fae548d3Szrj   (void (*dothis) (lang_input_statement_type *));
568*fae548d3Szrj extern void lang_reset_memory_regions
569*fae548d3Szrj   (void);
570*fae548d3Szrj extern void lang_do_assignments
571*fae548d3Szrj   (lang_phase_type);
572*fae548d3Szrj extern asection *section_for_dot
573*fae548d3Szrj   (void);
574*fae548d3Szrj 
575*fae548d3Szrj #define LANG_FOR_EACH_INPUT_STATEMENT(statement)			\
576*fae548d3Szrj   lang_input_statement_type *statement;					\
577*fae548d3Szrj   for (statement = (lang_input_statement_type *) file_chain.head;	\
578*fae548d3Szrj        statement != NULL;						\
579*fae548d3Szrj        statement = statement->next)
580*fae548d3Szrj 
581*fae548d3Szrj #define lang_output_section_find(NAME) \
582*fae548d3Szrj   lang_output_section_statement_lookup (NAME, 0, FALSE)
583*fae548d3Szrj 
584*fae548d3Szrj extern void lang_process
585*fae548d3Szrj   (void);
586*fae548d3Szrj extern void ldlang_add_file
587*fae548d3Szrj   (lang_input_statement_type *);
588*fae548d3Szrj extern lang_output_section_statement_type *lang_output_section_find_by_flags
589*fae548d3Szrj   (const asection *, flagword, lang_output_section_statement_type **,
590*fae548d3Szrj    lang_match_sec_type_func);
591*fae548d3Szrj extern lang_output_section_statement_type *lang_insert_orphan
592*fae548d3Szrj   (asection *, const char *, int, lang_output_section_statement_type *,
593*fae548d3Szrj    struct orphan_save *, etree_type *, lang_statement_list_type *);
594*fae548d3Szrj extern lang_input_statement_type *lang_add_input_file
595*fae548d3Szrj   (const char *, lang_input_file_enum_type, const char *);
596*fae548d3Szrj extern void lang_add_keepsyms_file
597*fae548d3Szrj   (const char *);
598*fae548d3Szrj extern lang_output_section_statement_type *lang_output_section_get
599*fae548d3Szrj   (const asection *);
600*fae548d3Szrj extern lang_output_section_statement_type *lang_output_section_statement_lookup
601*fae548d3Szrj   (const char *, int, bfd_boolean);
602*fae548d3Szrj extern lang_output_section_statement_type *next_matching_output_section_statement
603*fae548d3Szrj   (lang_output_section_statement_type *, int);
604*fae548d3Szrj extern void ldlang_add_undef
605*fae548d3Szrj   (const char *const, bfd_boolean);
606*fae548d3Szrj extern void ldlang_add_require_defined
607*fae548d3Szrj   (const char *const);
608*fae548d3Szrj extern void lang_add_output_format
609*fae548d3Szrj   (const char *, const char *, const char *, int);
610*fae548d3Szrj extern void lang_list_init
611*fae548d3Szrj   (lang_statement_list_type *);
612*fae548d3Szrj extern void push_stat_ptr
613*fae548d3Szrj   (lang_statement_list_type *);
614*fae548d3Szrj extern void pop_stat_ptr
615*fae548d3Szrj   (void);
616*fae548d3Szrj extern void lang_add_data
617*fae548d3Szrj   (int type, union etree_union *);
618*fae548d3Szrj extern void lang_add_reloc
619*fae548d3Szrj   (bfd_reloc_code_real_type, reloc_howto_type *, asection *, const char *,
620*fae548d3Szrj    union etree_union *);
621*fae548d3Szrj extern void lang_for_each_statement
622*fae548d3Szrj   (void (*) (lang_statement_union_type *));
623*fae548d3Szrj extern void lang_for_each_statement_worker
624*fae548d3Szrj   (void (*) (lang_statement_union_type *), lang_statement_union_type *);
625*fae548d3Szrj extern void *stat_alloc
626*fae548d3Szrj   (size_t);
627*fae548d3Szrj extern void strip_excluded_output_sections
628*fae548d3Szrj   (void);
629*fae548d3Szrj extern void lang_clear_os_map
630*fae548d3Szrj   (void);
631*fae548d3Szrj extern void dprint_statement
632*fae548d3Szrj   (lang_statement_union_type *, int);
633*fae548d3Szrj extern void lang_size_sections
634*fae548d3Szrj   (bfd_boolean *, bfd_boolean);
635*fae548d3Szrj extern void one_lang_size_sections_pass
636*fae548d3Szrj   (bfd_boolean *, bfd_boolean);
637*fae548d3Szrj extern void lang_add_insert
638*fae548d3Szrj   (const char *, int);
639*fae548d3Szrj extern void lang_enter_group
640*fae548d3Szrj   (void);
641*fae548d3Szrj extern void lang_leave_group
642*fae548d3Szrj   (void);
643*fae548d3Szrj extern void lang_add_section
644*fae548d3Szrj   (lang_statement_list_type *, asection *,
645*fae548d3Szrj    struct flag_info *, lang_output_section_statement_type *);
646*fae548d3Szrj extern void lang_new_phdr
647*fae548d3Szrj   (const char *, etree_type *, bfd_boolean, bfd_boolean, etree_type *,
648*fae548d3Szrj    etree_type *);
649*fae548d3Szrj extern void lang_add_nocrossref
650*fae548d3Szrj   (lang_nocrossref_type *);
651*fae548d3Szrj extern void lang_add_nocrossref_to
652*fae548d3Szrj   (lang_nocrossref_type *);
653*fae548d3Szrj extern void lang_enter_overlay
654*fae548d3Szrj   (etree_type *, etree_type *);
655*fae548d3Szrj extern void lang_enter_overlay_section
656*fae548d3Szrj   (const char *);
657*fae548d3Szrj extern void lang_leave_overlay_section
658*fae548d3Szrj   (fill_type *, lang_output_section_phdr_list *);
659*fae548d3Szrj extern void lang_leave_overlay
660*fae548d3Szrj   (etree_type *, int, fill_type *, const char *,
661*fae548d3Szrj    lang_output_section_phdr_list *, const char *);
662*fae548d3Szrj 
663*fae548d3Szrj extern struct bfd_elf_version_expr *lang_new_vers_pattern
664*fae548d3Szrj   (struct bfd_elf_version_expr *, const char *, const char *, bfd_boolean);
665*fae548d3Szrj extern struct bfd_elf_version_tree *lang_new_vers_node
666*fae548d3Szrj   (struct bfd_elf_version_expr *, struct bfd_elf_version_expr *);
667*fae548d3Szrj extern struct bfd_elf_version_deps *lang_add_vers_depend
668*fae548d3Szrj   (struct bfd_elf_version_deps *, const char *);
669*fae548d3Szrj extern void lang_register_vers_node
670*fae548d3Szrj   (const char *, struct bfd_elf_version_tree *, struct bfd_elf_version_deps *);
671*fae548d3Szrj extern void lang_append_dynamic_list (struct bfd_elf_version_expr *);
672*fae548d3Szrj extern void lang_append_dynamic_list_cpp_typeinfo (void);
673*fae548d3Szrj extern void lang_append_dynamic_list_cpp_new (void);
674*fae548d3Szrj extern void lang_add_unique
675*fae548d3Szrj   (const char *);
676*fae548d3Szrj extern const char *lang_get_output_target
677*fae548d3Szrj   (void);
678*fae548d3Szrj extern void add_excluded_libs (const char *);
679*fae548d3Szrj extern bfd_boolean load_symbols
680*fae548d3Szrj   (lang_input_statement_type *, lang_statement_list_type *);
681*fae548d3Szrj 
682*fae548d3Szrj struct elf_sym_strtab;
683*fae548d3Szrj struct elf_strtab_hash;
684*fae548d3Szrj extern void ldlang_ctf_apply_strsym
685*fae548d3Szrj   (struct elf_sym_strtab *, bfd_size_type, struct elf_strtab_hash *);
686*fae548d3Szrj extern void ldlang_write_ctf_late
687*fae548d3Szrj   (void);
688*fae548d3Szrj extern bfd_boolean
689*fae548d3Szrj ldlang_override_segment_assignment
690*fae548d3Szrj   (struct bfd_link_info *, bfd *, asection *, asection *, bfd_boolean);
691*fae548d3Szrj 
692*fae548d3Szrj extern void
693*fae548d3Szrj lang_ld_feature (char *);
694*fae548d3Szrj 
695*fae548d3Szrj extern void
696*fae548d3Szrj lang_print_memory_usage (void);
697*fae548d3Szrj 
698*fae548d3Szrj extern void
699*fae548d3Szrj lang_add_gc_name (const char *);
700*fae548d3Szrj 
701*fae548d3Szrj #endif
702