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