1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23: #ifndef LDLANG_H
24: #define LDLANG_H
25:
26: #define DEFAULT_MEMORY_REGION "*default*"
27:
28: typedef enum
29: {
30: lang_input_file_is_l_enum,
31: lang_input_file_is_symbols_only_enum,
32: lang_input_file_is_marker_enum,
33: lang_input_file_is_fake_enum,
34: lang_input_file_is_search_file_enum,
35: lang_input_file_is_file_enum
36: } lang_input_file_enum_type;
37:
38: struct _fill_type
39: {
40: size_t size;
41: unsigned char data[1];
42: };
43:
44: typedef struct statement_list
45: {
46: union lang_statement_union *head;
47: union lang_statement_union **tail;
48: } lang_statement_list_type;
49:
50: typedef struct memory_region_struct
51: {
52: char *name;
53: struct memory_region_struct *next;
54: bfd_vma origin;
55: bfd_size_type length;
56: bfd_vma current;
57: union lang_statement_union *last_os;
58: flagword flags;
59: flagword not_flags;
60: bfd_boolean had_full_message;
61: } lang_memory_region_type;
62:
63: typedef struct lang_statement_header_struct
64: {
65: union lang_statement_union *next;
66: enum statement_enum
67: {
68: lang_output_section_statement_enum,
69: lang_assignment_statement_enum,
70: lang_input_statement_enum,
71: lang_address_statement_enum,
72: lang_wild_statement_enum,
73: lang_input_section_enum,
74: lang_object_symbols_statement_enum,
75: lang_fill_statement_enum,
76: lang_data_statement_enum,
77: lang_reloc_statement_enum,
78: lang_target_statement_enum,
79: lang_output_statement_enum,
80: lang_padding_statement_enum,
81: lang_group_statement_enum,
82:
83: lang_afile_asection_pair_statement_enum,
84: lang_constructors_statement_enum
85: } type;
86: } lang_statement_header_type;
87:
88: typedef struct
89: {
90: lang_statement_header_type header;
91: union etree_union *exp;
92: } lang_assignment_statement_type;
93:
94: typedef struct lang_target_statement_struct
95: {
96: lang_statement_header_type header;
97: const char *target;
98: } lang_target_statement_type;
99:
100: typedef struct lang_output_statement_struct
101: {
102: lang_statement_header_type header;
103: const char *name;
104: } lang_output_statement_type;
105:
106:
107:
108: enum section_type
109: {
110: normal_section,
111: overlay_section,
112: noload_section,
113: noalloc_section
114: };
115:
116:
117:
118:
119: typedef struct lang_output_section_phdr_list
120: {
121: struct lang_output_section_phdr_list *next;
122: const char *name;
123: bfd_boolean used;
124: } lang_output_section_phdr_list;
125:
126: typedef struct lang_output_section_statement_struct
127: {
128: lang_statement_header_type header;
129: lang_statement_list_type children;
130: struct lang_output_section_statement_struct *next;
131: struct lang_output_section_statement_struct *prev;
132: const char *name;
133: asection *bfd_section;
134: lang_memory_region_type *region;
135: lang_memory_region_type *lma_region;
136: fill_type *fill;
137: union etree_union *addr_tree;
138: union etree_union *load_base;
139:
140:
141:
142:
143:
144: union etree_union *update_dot_tree;
145:
146: lang_output_section_phdr_list *phdrs;
147:
148: unsigned int block_value;
149: int subsection_alignment;
150: int section_alignment;
151: int constraint;
152: flagword flags;
153: enum section_type sectype;
154: unsigned int processed_vma : 1;
155: unsigned int processed_lma : 1;
156: unsigned int all_input_readonly : 1;
157:
158: unsigned int ignored : 1;
159:
160: unsigned int section_relative_symbol : 1;
161: } lang_output_section_statement_type;
162:
163: typedef struct
164: {
165: lang_statement_header_type header;
166: } lang_common_statement_type;
167:
168: typedef struct
169: {
170: lang_statement_header_type header;
171: } lang_object_symbols_statement_type;
172:
173: typedef struct
174: {
175: lang_statement_header_type header;
176: fill_type *fill;
177: int size;
178: asection *output_section;
179: } lang_fill_statement_type;
180:
181: typedef struct
182: {
183: lang_statement_header_type header;
184: unsigned int type;
185: union etree_union *exp;
186: bfd_vma value;
187: asection *output_section;
188: bfd_vma output_offset;
189: } lang_data_statement_type;
190:
191:
192:
193: typedef struct
194: {
195: lang_statement_header_type header;
196:
197:
198: bfd_reloc_code_real_type reloc;
199:
200:
201: reloc_howto_type *howto;
202:
203:
204:
205: asection *section;
206:
207:
208:
209: const char *name;
210:
211:
212: union etree_union *addend_exp;
213:
214:
215: bfd_vma addend_value;
216:
217:
218: asection *output_section;
219:
220:
221: bfd_vma output_offset;
222: } lang_reloc_statement_type;
223:
224: typedef struct lang_input_statement_struct
225: {
226: lang_statement_header_type header;
227:
228: const char *filename;
229:
230:
231:
232: const char *local_sym_name;
233:
234: bfd *the_bfd;
235:
236: file_ptr passive_position;
237:
238:
239: asymbol **asymbols;
240: unsigned int symbol_count;
241:
242:
243:
244: union lang_statement_union *next;
245:
246:
247: union lang_statement_union *next_real_file;
248:
249: const char *target;
250:
251: unsigned int closed : 1;
252: unsigned int is_archive : 1;
253:
254:
255: unsigned int search_dirs_flag : 1;
256:
257:
258:
259:
260:
261: unsigned int sysrooted : 1;
262:
263:
264:
265:
266: unsigned int just_syms_flag : 1;
267:
268:
269: unsigned int dynamic : 1;
270:
271:
272:
273: unsigned int add_needed : 1;
274:
275:
276:
277: unsigned int as_needed : 1;
278:
279:
280: unsigned int whole_archive : 1;
281:
282: unsigned int loaded : 1;
283:
284: unsigned int real : 1;
285: } lang_input_statement_type;
286:
287: typedef struct
288: {
289: lang_statement_header_type header;
290: asection *section;
291: } lang_input_section_type;
292:
293: typedef struct
294: {
295: lang_statement_header_type header;
296: asection *section;
297: union lang_statement_union *file;
298: } lang_afile_asection_pair_statement_type;
299:
300: typedef struct lang_wild_statement_struct lang_wild_statement_type;
301:
302: typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *,
303: asection *, lang_input_statement_type *, void *);
304:
305: typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *,
306: lang_input_statement_type *,
307: callback_t callback,
308: void *data);
309:
310: typedef bfd_boolean (*lang_match_sec_type_func) (bfd *, const asection *,
311: bfd *, const asection *);
312:
313:
314:
315: typedef struct lang_section_bst
316: {
317: asection *section;
318: struct lang_section_bst *left;
319: struct lang_section_bst *right;
320: } lang_section_bst_type;
321:
322: struct lang_wild_statement_struct
323: {
324: lang_statement_header_type header;
325: const char *filename;
326: bfd_boolean filenames_sorted;
327: struct wildcard_list *section_list;
328: bfd_boolean keep_sections;
329: lang_statement_list_type children;
330:
331: walk_wild_section_handler_t walk_wild_section_handler;
332: struct wildcard_list *handler_data[4];
333: lang_section_bst_type *tree;
334: };
335:
336: typedef struct lang_address_statement_struct
337: {
338: lang_statement_header_type header;
339: const char *section_name;
340: union etree_union *address;
341: const segment_type *segment;
342: } lang_address_statement_type;
343:
344: typedef struct
345: {
346: lang_statement_header_type header;
347: bfd_vma output_offset;
348: size_t size;
349: asection *output_section;
350: fill_type *fill;
351: } lang_padding_statement_type;
352:
353:
354:
355:
356:
357:
358: typedef struct
359: {
360: lang_statement_header_type header;
361: lang_statement_list_type children;
362: } lang_group_statement_type;
363:
364: typedef union lang_statement_union
365: {
366: lang_statement_header_type header;
367: lang_wild_statement_type wild_statement;
368: lang_data_statement_type data_statement;
369: lang_reloc_statement_type reloc_statement;
370: lang_address_statement_type address_statement;
371: lang_output_section_statement_type output_section_statement;
372: lang_afile_asection_pair_statement_type afile_asection_pair_statement;
373: lang_assignment_statement_type assignment_statement;
374: lang_input_statement_type input_statement;
375: lang_target_statement_type target_statement;
376: lang_output_statement_type output_statement;
377: lang_input_section_type input_section;
378: lang_common_statement_type common_statement;
379: lang_object_symbols_statement_type object_symbols_statement;
380: lang_fill_statement_type fill_statement;
381: lang_padding_statement_type padding_statement;
382: lang_group_statement_type group_statement;
383: } lang_statement_union_type;
384:
385:
386:
387:
388: struct lang_phdr
389: {
390: struct lang_phdr *next;
391: const char *name;
392: unsigned long type;
393: bfd_boolean filehdr;
394: bfd_boolean phdrs;
395: etree_type *at;
396: etree_type *flags;
397: };
398:
399: extern struct lang_phdr *lang_phdr_list;
400:
401:
402:
403:
404: typedef struct lang_nocrossref
405: {
406: struct lang_nocrossref *next;
407: const char *name;
408: } lang_nocrossref_type;
409:
410:
411:
412: struct lang_nocrossrefs
413: {
414: struct lang_nocrossrefs *next;
415: lang_nocrossref_type *list;
416: };
417:
418: extern struct lang_nocrossrefs *nocrossref_list;
419:
420:
421:
422:
423: struct unique_sections
424: {
425: struct unique_sections *next;
426: const char *name;
427: };
428:
429:
430:
431:
432: struct lang_definedness_hash_entry
433: {
434: struct bfd_hash_entry root;
435: int iteration;
436: };
437:
438:
439:
440: struct orphan_save {
441: const char *name;
442: flagword flags;
443: lang_output_section_statement_type *os;
444: asection **section;
445: lang_statement_union_type **stmt;
446: lang_output_section_statement_type **os_tail;
447: };
448:
449: extern lang_output_section_statement_type *abs_output_section;
450: extern lang_statement_list_type lang_output_section_statement;
451: extern bfd_boolean lang_has_input_file;
452: extern etree_type *base;
453: extern lang_statement_list_type *stat_ptr;
454: extern bfd_boolean delete_output_file_on_failure;
455:
456: extern struct bfd_sym_chain entry_symbol;
457: extern const char *entry_section;
458: extern bfd_boolean entry_from_cmdline;
459: extern lang_statement_list_type file_chain;
460: extern lang_statement_list_type input_file_chain;
461:
462: extern int lang_statement_iteration;
463:
464: extern void lang_init
465: (void);
466: extern void lang_finish
467: (void);
468: extern lang_memory_region_type *lang_memory_region_lookup
469: (const char *const, bfd_boolean);
470: extern lang_memory_region_type *lang_memory_region_default
471: (asection *);
472: extern void lang_map
473: (void);
474: extern void lang_set_flags
475: (lang_memory_region_type *, const char *, int);
476: extern void lang_add_output
477: (const char *, int from_script);
478: extern lang_output_section_statement_type *lang_enter_output_section_statement
479: (const char *output_section_statement_name,
480: etree_type *address_exp,
481: enum section_type sectype,
482: etree_type *align,
483: etree_type *subalign,
484: etree_type *, int);
485: extern void lang_final
486: (void);
487: extern void lang_process
488: (void);
489: extern void lang_section_start
490: (const char *, union etree_union *, const segment_type *);
491: extern void lang_add_entry
492: (const char *, bfd_boolean);
493: extern void lang_default_entry
494: (const char *);
495: extern void lang_add_target
496: (const char *);
497: extern void lang_add_wild
498: (struct wildcard_spec *, struct wildcard_list *, bfd_boolean);
499: extern void lang_add_map
500: (const char *);
501: extern void lang_add_fill
502: (fill_type *);
503: extern lang_assignment_statement_type *lang_add_assignment
504: (union etree_union *);
505: extern void lang_add_attribute
506: (enum statement_enum);
507: extern void lang_startup
508: (const char *);
509: extern void lang_float
510: (bfd_boolean);
511: extern void lang_leave_output_section_statement
512: (fill_type *, const char *, lang_output_section_phdr_list *,
513: const char *);
514: extern void lang_abs_symbol_at_end_of
515: (const char *, const char *);
516: extern void lang_abs_symbol_at_beginning_of
517: (const char *, const char *);
518: extern void lang_statement_append
519: (lang_statement_list_type *, lang_statement_union_type *,
520: lang_statement_union_type **);
521: extern void lang_for_each_input_file
522: (void (*dothis) (lang_input_statement_type *));
523: extern void lang_for_each_file
524: (void (*dothis) (lang_input_statement_type *));
525: extern void lang_reset_memory_regions
526: (void);
527: extern void lang_do_assignments
528: (void);
529:
530: #define LANG_FOR_EACH_INPUT_STATEMENT(statement) \
531: lang_input_statement_type *statement; \
532: for (statement = (lang_input_statement_type *) file_chain.head; \
533: statement != (lang_input_statement_type *) NULL; \
534: statement = (lang_input_statement_type *) statement->next) \
535:
536: extern void lang_process
537: (void);
538: extern void ldlang_add_file
539: (lang_input_statement_type *);
540: extern lang_output_section_statement_type *lang_output_section_find
541: (const char * const);
542: extern lang_output_section_statement_type *lang_output_section_find_by_flags
543: (const asection *, lang_output_section_statement_type **,
544: lang_match_sec_type_func);
545: extern lang_output_section_statement_type *lang_insert_orphan
546: (asection *, const char *, lang_output_section_statement_type *,
547: struct orphan_save *, etree_type *, lang_statement_list_type *);
548: extern lang_input_statement_type *lang_add_input_file
549: (const char *, lang_input_file_enum_type, const char *);
550: extern void lang_add_keepsyms_file
551: (const char *);
552: extern lang_output_section_statement_type *
553: lang_output_section_statement_lookup
554: (const char *const);
555: extern void ldlang_add_undef
556: (const char *const);
557: extern void lang_add_output_format
558: (const char *, const char *, const char *, int);
559: extern void lang_list_init
560: (lang_statement_list_type *);
561: extern void lang_add_data
562: (int type, union etree_union *);
563: extern void lang_add_reloc
564: (bfd_reloc_code_real_type, reloc_howto_type *, asection *, const char *,
565: union etree_union *);
566: extern void lang_for_each_statement
567: (void (*) (lang_statement_union_type *));
568: extern void *stat_alloc
569: (size_t);
570: extern void strip_excluded_output_sections
571: (void);
572: extern void dprint_statement
573: (lang_statement_union_type *, int);
574: extern void lang_size_sections
575: (bfd_boolean *, bfd_boolean);
576: extern void one_lang_size_sections_pass
577: (bfd_boolean *, bfd_boolean);
578: extern void lang_enter_group
579: (void);
580: extern void lang_leave_group
581: (void);
582: extern void lang_add_section
583: (lang_statement_list_type *, asection *,
584: lang_output_section_statement_type *);
585: extern void lang_new_phdr
586: (const char *, etree_type *, bfd_boolean, bfd_boolean, etree_type *,
587: etree_type *);
588: extern void lang_add_nocrossref
589: (lang_nocrossref_type *);
590: extern void lang_enter_overlay
591: (etree_type *, etree_type *);
592: extern void lang_enter_overlay_section
593: (const char *);
594: extern void lang_leave_overlay_section
595: (fill_type *, lang_output_section_phdr_list *);
596: extern void lang_leave_overlay
597: (etree_type *, int, fill_type *, const char *,
598: lang_output_section_phdr_list *, const char *);
599:
600: extern struct bfd_elf_version_tree *lang_elf_version_info;
601:
602: extern struct bfd_elf_version_expr *lang_new_vers_pattern
603: (struct bfd_elf_version_expr *, const char *, const char *, bfd_boolean);
604: extern struct bfd_elf_version_tree *lang_new_vers_node
605: (struct bfd_elf_version_expr *, struct bfd_elf_version_expr *);
606: extern struct bfd_elf_version_deps *lang_add_vers_depend
607: (struct bfd_elf_version_deps *, const char *);
608: extern void lang_register_vers_node
609: (const char *, struct bfd_elf_version_tree *, struct bfd_elf_version_deps *);
610: extern void lang_append_dynamic_list (struct bfd_elf_version_expr *);
611: extern void lang_append_dynamic_list_cpp_typeinfo (void);
612: extern void lang_append_dynamic_list_cpp_new (void);
613: bfd_boolean unique_section_p
614: (const asection *);
615: extern void lang_add_unique