* ldlang.c (print_output_section_statement): Change ``no attached
[binutils-gdb.git] / ld / ldlang.c
1 /* Linker command language support.
2 Copyright (C) 1991, 92, 93, 94 Free Software Foundation, Inc.
3
4 This file is part of GLD, the Gnu Linker.
5
6 GLD is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 1, or (at your option)
9 any later version.
10
11 GLD is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GLD; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 #include "bfd.h"
21 #include "sysdep.h"
22 #include "libiberty.h"
23 #include "bfdlink.h"
24
25 #include "ld.h"
26 #include "ldmain.h"
27 #include "ldgram.h"
28 #include "ldexp.h"
29 #include "ldlang.h"
30 #include "ldemul.h"
31 #include "ldlex.h"
32 #include "ldmisc.h"
33 #include "ldctor.h"
34 #include "ldfile.h"
35
36 /* FORWARDS */
37 static void print_statements PARAMS ((void));
38 static void print_statement PARAMS ((lang_statement_union_type *,
39 lang_output_section_statement_type *));
40 static lang_statement_union_type *new_statement PARAMS ((enum statement_enum,
41 size_t,
42 lang_statement_list_type*));
43
44
45 /* LOCALS */
46 static struct obstack stat_obstack;
47
48 #define obstack_chunk_alloc xmalloc
49 #define obstack_chunk_free free
50 static CONST char *startup_file;
51 static lang_statement_list_type input_file_chain;
52
53 /* Points to the last statement in the .data section, so we can add
54 stuff to the data section without pain */
55 static lang_statement_list_type end_of_data_section_statement_list;
56
57 static boolean placed_commons = false;
58 static lang_output_section_statement_type *default_common_section;
59 static boolean map_option_f;
60 static bfd_vma print_dot;
61 static lang_input_statement_type *first_file;
62 static lang_statement_list_type lang_output_section_statement;
63 static CONST char *current_target;
64 static CONST char *output_target;
65 static int longest_section_name = 8;
66 static lang_statement_list_type statement_list;
67
68 static void print_size PARAMS ((size_t value));
69 static void print_alignment PARAMS ((unsigned int value));
70 static void print_fill PARAMS ((fill_type value));
71 static void print_section PARAMS ((const char *name));
72 static void lang_for_each_statement_worker
73 PARAMS ((void (*func) (lang_statement_union_type *),
74 lang_statement_union_type *s));
75 static lang_input_statement_type *new_afile
76 PARAMS ((const char *name, lang_input_file_enum_type file_type,
77 const char *target, boolean add_to_list));
78 static void print_flags PARAMS ((int *ignore_flags));
79 static void init_os PARAMS ((lang_output_section_statement_type *s));
80 static void wild_doit PARAMS ((lang_statement_list_type *ptr,
81 asection *section,
82 lang_output_section_statement_type *output,
83 lang_input_statement_type *file));
84 static void wild_section PARAMS ((lang_wild_statement_type *ptr,
85 const char *section,
86 lang_input_statement_type *file,
87 lang_output_section_statement_type *output));
88 static lang_input_statement_type *lookup_name PARAMS ((const char *name));
89 static void load_symbols PARAMS ((lang_input_statement_type *entry));
90 static void wild PARAMS ((lang_wild_statement_type *s,
91 const char *section, const char *file,
92 const char *target,
93 lang_output_section_statement_type *output));
94 static bfd *open_output PARAMS ((const char *name));
95 static void ldlang_open_output PARAMS ((lang_statement_union_type *statement));
96 static void open_input_bfds PARAMS ((lang_statement_union_type *statement));
97 static void lang_reasonable_defaults PARAMS ((void));
98 static void lang_place_undefineds PARAMS ((void));
99 static void map_input_to_output_sections
100 PARAMS ((lang_statement_union_type *s,
101 const char *target,
102 lang_output_section_statement_type *output_section_statement));
103 static void print_output_section_statement
104 PARAMS ((lang_output_section_statement_type *output_section_statement));
105 static void print_assignment
106 PARAMS ((lang_assignment_statement_type *assignment,
107 lang_output_section_statement_type *output_section));
108 static void print_input_statement PARAMS ((lang_input_statement_type *statm));
109 static void print_input_section PARAMS ((lang_input_section_type *in));
110 static void print_fill_statement PARAMS ((lang_fill_statement_type *fill));
111 static void print_data_statement PARAMS ((lang_data_statement_type *data));
112 static void print_reloc_statement PARAMS ((lang_reloc_statement_type *reloc));
113 static void print_padding_statement PARAMS ((lang_padding_statement_type *s));
114 static void print_wild_statement
115 PARAMS ((lang_wild_statement_type *w,
116 lang_output_section_statement_type *os));
117 static void print_statement PARAMS ((lang_statement_union_type *s,
118 lang_output_section_statement_type *os));
119 static void print_statements PARAMS ((void));
120 static bfd_vma insert_pad PARAMS ((lang_statement_union_type **this_ptr,
121 fill_type fill, unsigned int power,
122 asection *output_section_statement,
123 bfd_vma dot));
124 static bfd_vma size_input_section
125 PARAMS ((lang_statement_union_type **this_ptr,
126 lang_output_section_statement_type *output_section_statement,
127 fill_type fill, bfd_vma dot, boolean relax));
128 static bfd_vma lang_do_assignments
129 PARAMS ((lang_statement_union_type * s,
130 lang_output_section_statement_type *output_section_statement,
131 fill_type fill,
132 bfd_vma dot));
133 static void lang_finish PARAMS ((void));
134 static void lang_check PARAMS ((void));
135 static void lang_common PARAMS ((void));
136 static boolean lang_one_common PARAMS ((struct bfd_link_hash_entry *, PTR));
137 static void lang_place_orphans PARAMS ((void));
138 static int topower PARAMS ((int));
139 static void reset_memory_regions PARAMS ((void));
140
141 /* EXPORTS */
142 lang_output_section_statement_type *abs_output_section;
143 lang_statement_list_type *stat_ptr = &statement_list;
144 lang_statement_list_type file_chain =
145 {0};
146 CONST char *entry_symbol = 0;
147 boolean lang_has_input_file = false;
148 boolean had_output_filename = false;
149 boolean lang_float_flag = false;
150 boolean delete_output_file_on_failure = false;
151
152 etree_type *base; /* Relocation base - or null */
153
154
155 #if defined(__STDC__) || defined(ALMOST_STDC)
156 #define cat(a,b) a##b
157 #else
158 #define cat(a,b) a/**/b
159 #endif
160
161 #define new_stat(x,y) (cat(x,_type)*) new_statement(cat(x,_enum), sizeof(cat(x,_type)),y)
162
163 #define outside_section_address(q) ( (q)->output_offset + (q)->output_section->vma)
164
165 #define outside_symbol_address(q) ((q)->value + outside_section_address(q->section))
166
167 PTR
168 stat_alloc (size)
169 size_t size;
170 {
171 return obstack_alloc (&stat_obstack, size);
172 }
173
174 static void
175 print_size (value)
176 size_t value;
177 {
178 fprintf (config.map_file, "%5x", (unsigned) value);
179 }
180
181 static void
182 print_alignment (value)
183 unsigned int value;
184 {
185 fprintf (config.map_file, "2**%1u", value);
186 }
187
188 static void
189 print_fill (value)
190 fill_type value;
191 {
192 fprintf (config.map_file, "%04x", (unsigned) value);
193 }
194
195 static void
196 print_section (name)
197 CONST char *name;
198 {
199 fprintf (config.map_file, "%*s", -longest_section_name, name);
200 }
201
202 /*----------------------------------------------------------------------
203 lang_for_each_statement walks the parse tree and calls the provided
204 function for each node
205 */
206
207 static void
208 lang_for_each_statement_worker (func, s)
209 void (*func) PARAMS ((lang_statement_union_type *));
210 lang_statement_union_type *s;
211 {
212 for (; s != (lang_statement_union_type *) NULL; s = s->next)
213 {
214 func (s);
215
216 switch (s->header.type)
217 {
218 case lang_constructors_statement_enum:
219 lang_for_each_statement_worker (func, constructor_list.head);
220 break;
221 case lang_output_section_statement_enum:
222 lang_for_each_statement_worker
223 (func,
224 s->output_section_statement.children.head);
225 break;
226 case lang_wild_statement_enum:
227 lang_for_each_statement_worker
228 (func,
229 s->wild_statement.children.head);
230 break;
231 case lang_data_statement_enum:
232 case lang_reloc_statement_enum:
233 case lang_object_symbols_statement_enum:
234 case lang_output_statement_enum:
235 case lang_target_statement_enum:
236 case lang_input_section_enum:
237 case lang_input_statement_enum:
238 case lang_assignment_statement_enum:
239 case lang_padding_statement_enum:
240 case lang_address_statement_enum:
241 break;
242 default:
243 FAIL ();
244 break;
245 }
246 }
247 }
248
249 void
250 lang_for_each_statement (func)
251 void (*func) PARAMS ((lang_statement_union_type *));
252 {
253 lang_for_each_statement_worker (func,
254 statement_list.head);
255 }
256
257 /*----------------------------------------------------------------------*/
258 void
259 lang_list_init (list)
260 lang_statement_list_type *list;
261 {
262 list->head = (lang_statement_union_type *) NULL;
263 list->tail = &list->head;
264 }
265
266 /*----------------------------------------------------------------------
267
268 build a new statement node for the parse tree
269
270 */
271
272 static
273 lang_statement_union_type *
274 new_statement (type, size, list)
275 enum statement_enum type;
276 size_t size;
277 lang_statement_list_type * list;
278 {
279 lang_statement_union_type *new = (lang_statement_union_type *)
280 stat_alloc (size);
281
282 new->header.type = type;
283 new->header.next = (lang_statement_union_type *) NULL;
284 lang_statement_append (list, new, &new->header.next);
285 return new;
286 }
287
288 /*
289 Build a new input file node for the language. There are several ways
290 in which we treat an input file, eg, we only look at symbols, or
291 prefix it with a -l etc.
292
293 We can be supplied with requests for input files more than once;
294 they may, for example be split over serveral lines like foo.o(.text)
295 foo.o(.data) etc, so when asked for a file we check that we havn't
296 got it already so we don't duplicate the bfd.
297
298 */
299 static lang_input_statement_type *
300 new_afile (name, file_type, target, add_to_list)
301 CONST char *name;
302 lang_input_file_enum_type file_type;
303 CONST char *target;
304 boolean add_to_list;
305 {
306 lang_input_statement_type *p;
307
308 if (add_to_list)
309 p = new_stat (lang_input_statement, stat_ptr);
310 else
311 {
312 p = ((lang_input_statement_type *)
313 stat_alloc (sizeof (lang_input_statement_type)));
314 p->header.next = NULL;
315 }
316
317 lang_has_input_file = true;
318 p->target = target;
319 p->complained = false;
320 switch (file_type)
321 {
322 case lang_input_file_is_symbols_only_enum:
323 p->filename = name;
324 p->is_archive = false;
325 p->real = true;
326 p->local_sym_name = name;
327 p->just_syms_flag = true;
328 p->search_dirs_flag = false;
329 break;
330 case lang_input_file_is_fake_enum:
331 p->filename = name;
332 p->is_archive = false;
333 p->real = false;
334 p->local_sym_name = name;
335 p->just_syms_flag = false;
336 p->search_dirs_flag = false;
337 break;
338 case lang_input_file_is_l_enum:
339 p->is_archive = true;
340 p->filename = name;
341 p->real = true;
342 p->local_sym_name = concat ("-l", name, (const char *) NULL);
343 p->just_syms_flag = false;
344 p->search_dirs_flag = true;
345 break;
346 case lang_input_file_is_marker_enum:
347 p->filename = name;
348 p->is_archive = false;
349 p->real = false;
350 p->local_sym_name = name;
351 p->just_syms_flag = false;
352 p->search_dirs_flag = true;
353 break;
354 case lang_input_file_is_search_file_enum:
355 p->filename = name;
356 p->is_archive = false;
357 p->real = true;
358 p->local_sym_name = name;
359 p->just_syms_flag = false;
360 p->search_dirs_flag = true;
361 break;
362 case lang_input_file_is_file_enum:
363 p->filename = name;
364 p->is_archive = false;
365 p->real = true;
366 p->local_sym_name = name;
367 p->just_syms_flag = false;
368 p->search_dirs_flag = false;
369 break;
370 default:
371 FAIL ();
372 }
373 p->the_bfd = (bfd *) NULL;
374 p->asymbols = (asymbol **) NULL;
375 p->superfile = (lang_input_statement_type *) NULL;
376 p->next_real_file = (lang_statement_union_type *) NULL;
377 p->next = (lang_statement_union_type *) NULL;
378 p->symbol_count = 0;
379 p->common_output_section = (asection *) NULL;
380 p->loaded = false;
381 lang_statement_append (&input_file_chain,
382 (lang_statement_union_type *) p,
383 &p->next_real_file);
384 return p;
385 }
386
387 lang_input_statement_type *
388 lang_add_input_file (name, file_type, target)
389 CONST char *name;
390 lang_input_file_enum_type file_type;
391 CONST char *target;
392 {
393 /* Look it up or build a new one */
394 lang_has_input_file = true;
395
396 #if 0
397 lang_input_statement_type *p;
398
399 for (p = (lang_input_statement_type *) input_file_chain.head;
400 p != (lang_input_statement_type *) NULL;
401 p = (lang_input_statement_type *) (p->next_real_file))
402 {
403 /* Sometimes we have incomplete entries in here */
404 if (p->filename != (char *) NULL)
405 {
406 if (strcmp (name, p->filename) == 0)
407 return p;
408 }
409
410 }
411 #endif
412 return new_afile (name, file_type, target, true);
413 }
414
415 /* Build enough state so that the parser can build its tree */
416 void
417 lang_init ()
418 {
419 obstack_begin (&stat_obstack, 1000);
420
421 stat_ptr = &statement_list;
422
423 lang_list_init (stat_ptr);
424
425 lang_list_init (&input_file_chain);
426 lang_list_init (&lang_output_section_statement);
427 lang_list_init (&file_chain);
428 first_file = lang_add_input_file ((char *) NULL,
429 lang_input_file_is_marker_enum,
430 (char *) NULL);
431 abs_output_section = lang_output_section_statement_lookup (BFD_ABS_SECTION_NAME);
432
433 abs_output_section->bfd_section = &bfd_abs_section;
434
435 }
436
437 /*----------------------------------------------------------------------
438 A region is an area of memory declared with the
439 MEMORY { name:org=exp, len=exp ... }
440 syntax.
441
442 We maintain a list of all the regions here
443
444 If no regions are specified in the script, then the default is used
445 which is created when looked up to be the entire data space
446 */
447
448 static lang_memory_region_type *lang_memory_region_list;
449 static lang_memory_region_type **lang_memory_region_list_tail = &lang_memory_region_list;
450
451 lang_memory_region_type *
452 lang_memory_region_lookup (name)
453 CONST char *CONST name;
454 {
455
456 lang_memory_region_type *p = lang_memory_region_list;
457
458 for (p = lang_memory_region_list;
459 p != (lang_memory_region_type *) NULL;
460 p = p->next)
461 {
462 if (strcmp (p->name, name) == 0)
463 {
464 return p;
465 }
466 }
467 if (strcmp (name, "*default*") == 0)
468 {
469 /* This is the default region, dig out first one on the list */
470 if (lang_memory_region_list != (lang_memory_region_type *) NULL)
471 {
472 return lang_memory_region_list;
473 }
474 }
475 {
476 lang_memory_region_type *new =
477 (lang_memory_region_type *) stat_alloc ((bfd_size_type) (sizeof (lang_memory_region_type)));
478
479 new->name = buystring (name);
480 new->next = (lang_memory_region_type *) NULL;
481
482 *lang_memory_region_list_tail = new;
483 lang_memory_region_list_tail = &new->next;
484 new->origin = 0;
485 new->length = ~(bfd_size_type)0;
486 new->current = 0;
487 new->had_full_message = false;
488
489 return new;
490 }
491 }
492
493
494 lang_output_section_statement_type *
495 lang_output_section_find (name)
496 CONST char *CONST name;
497 {
498 lang_statement_union_type *u;
499 lang_output_section_statement_type *lookup;
500
501 for (u = lang_output_section_statement.head;
502 u != (lang_statement_union_type *) NULL;
503 u = lookup->next)
504 {
505 lookup = &u->output_section_statement;
506 if (strcmp (name, lookup->name) == 0)
507 {
508 return lookup;
509 }
510 }
511 return (lang_output_section_statement_type *) NULL;
512 }
513
514 lang_output_section_statement_type *
515 lang_output_section_statement_lookup (name)
516 CONST char *CONST name;
517 {
518 lang_output_section_statement_type *lookup;
519
520 lookup = lang_output_section_find (name);
521 if (lookup == (lang_output_section_statement_type *) NULL)
522 {
523
524 lookup = (lang_output_section_statement_type *)
525 new_stat (lang_output_section_statement, stat_ptr);
526 lookup->region = (lang_memory_region_type *) NULL;
527 lookup->fill = 0;
528 lookup->block_value = 1;
529 lookup->name = name;
530
531 lookup->next = (lang_statement_union_type *) NULL;
532 lookup->bfd_section = (asection *) NULL;
533 lookup->processed = false;
534 lookup->loadable = 1;
535 lookup->addr_tree = (etree_type *) NULL;
536 lang_list_init (&lookup->children);
537
538 lookup->memspec = (CONST char *) NULL;
539 lookup->flags = 0;
540 lookup->subsection_alignment = -1;
541 lookup->section_alignment = -1;
542 lookup->load_base = (union etree_union *) NULL;
543
544 lang_statement_append (&lang_output_section_statement,
545 (lang_statement_union_type *) lookup,
546 &lookup->next);
547 }
548 return lookup;
549 }
550
551 /*ARGSUSED*/
552 static void
553 print_flags (ignore_flags)
554 int *ignore_flags;
555 {
556 fprintf (config.map_file, "(");
557 #if 0
558 if (flags->flag_read)
559 fprintf (outfile, "R");
560 if (flags->flag_write)
561 fprintf (outfile, "W");
562 if (flags->flag_executable)
563 fprintf (outfile, "X");
564 if (flags->flag_loadable)
565 fprintf (outfile, "L");
566 #endif
567 fprintf (config.map_file, ")");
568 }
569
570 void
571 lang_map ()
572 {
573 lang_memory_region_type *m;
574
575 fprintf (config.map_file, "**MEMORY CONFIGURATION**\n\n");
576 #ifdef HOST_64_BIT
577 fprintf (config.map_file, "name\t\torigin\t\tlength\t\tattributes\n");
578 #else
579 fprintf (config.map_file,
580 "name\t\torigin length r_size c_size is attributes\n");
581
582 #endif
583 for (m = lang_memory_region_list;
584 m != (lang_memory_region_type *) NULL;
585 m = m->next)
586 {
587 fprintf (config.map_file, "%-16s", m->name);
588 print_address (m->origin);
589 print_space ();
590 print_address ((bfd_vma)m->length);
591 print_space ();
592 print_address ((bfd_vma)m->old_length);
593 print_space();
594 print_address (m->current - m->origin);
595 print_space();
596 if (m->old_length)
597 fprintf (config.map_file, " %2d%% ",
598 (int) ((m->current - m->origin) * 100 / m->old_length));
599 print_flags (&m->flags);
600 fprintf (config.map_file, "\n");
601 }
602 fprintf (config.map_file, "\n\n**LINK EDITOR MEMORY MAP**\n\n");
603 fprintf (config.map_file, "output input virtual\n");
604 fprintf (config.map_file, "section section address tsize\n\n");
605
606 print_statements ();
607
608 }
609
610 /*
611 *
612 */
613 static void
614 init_os (s)
615 lang_output_section_statement_type * s;
616 {
617 /* asection *section = bfd_get_section_by_name(output_bfd, s->name);*/
618 section_userdata_type *new =
619 (section_userdata_type *)
620 stat_alloc ((bfd_size_type) (sizeof (section_userdata_type)));
621
622 s->bfd_section = bfd_get_section_by_name (output_bfd, s->name);
623 if (s->bfd_section == (asection *) NULL)
624 s->bfd_section = bfd_make_section (output_bfd, s->name);
625 if (s->bfd_section == (asection *) NULL)
626 {
627 einfo ("%P%F: output format %s cannot represent section called %s\n",
628 output_bfd->xvec->name, s->name);
629 }
630 s->bfd_section->output_section = s->bfd_section;
631 /* s->bfd_section->flags = s->flags;*/
632
633 /* We initialize an output sections output offset to minus its own */
634 /* vma to allow us to output a section through itself */
635 s->bfd_section->output_offset = 0;
636 get_userdata (s->bfd_section) = (PTR) new;
637
638 }
639
640 /***********************************************************************
641 The wild routines.
642
643 These expand statements like *(.text) and foo.o to a list of
644 explicit actions, like foo.o(.text), bar.o(.text) and
645 foo.o(.text,.data) .
646
647 The toplevel routine, wild, takes a statement, section, file and
648 target. If either the section or file is null it is taken to be the
649 wildcard. Seperate lang_input_section statements are created for
650 each part of the expanstion, and placed after the statement provided.
651
652 */
653
654 static void
655 wild_doit (ptr, section, output, file)
656 lang_statement_list_type * ptr;
657 asection * section;
658 lang_output_section_statement_type * output;
659 lang_input_statement_type * file;
660 {
661 if (output->bfd_section == (asection *) NULL)
662 init_os (output);
663
664 if (section != (asection *) NULL
665 && section->output_section == (asection *) NULL)
666 {
667 /* Add a section reference to the list */
668 lang_input_section_type *new = new_stat (lang_input_section, ptr);
669
670 new->section = section;
671 new->ifile = file;
672 section->output_section = output->bfd_section;
673
674 /* We don't copy the SEC_NEVER_LOAD flag from an input section to
675 an output section, because we want to be able to include a
676 SEC_NEVER_LOAD section in the middle of an otherwise loaded
677 section (I don't know why we want to do this, but we do).
678 build_link_order in ldwrite.c handles this case by turning the
679 embedded SEC_NEVER_LOAD section into a fill. */
680 section->output_section->flags |=
681 section->flags & (flagword) (~ SEC_NEVER_LOAD);
682
683 if (!output->loadable)
684 {
685 /* Turn off load flag */
686 output->bfd_section->flags &= ~SEC_LOAD;
687 output->bfd_section->flags |= SEC_NEVER_LOAD;
688 }
689 if (section->alignment_power > output->bfd_section->alignment_power)
690 {
691 output->bfd_section->alignment_power = section->alignment_power;
692 }
693 /* If supplied an aligmnet, then force it */
694 if (output->section_alignment != -1)
695 {
696 output->bfd_section->alignment_power = output->section_alignment;
697 }
698 }
699 }
700
701 static void
702 wild_section (ptr, section, file, output)
703 lang_wild_statement_type * ptr;
704 CONST char *section;
705 lang_input_statement_type * file;
706 lang_output_section_statement_type * output;
707 {
708 asection *s;
709
710 if (file->just_syms_flag == false)
711 {
712 if (section == (char *) NULL)
713 {
714 /* Do the creation to all sections in the file */
715 for (s = file->the_bfd->sections; s != NULL; s = s->next)
716 {
717 /* except for bss */
718 if ((s->flags & SEC_IS_COMMON) == 0)
719 {
720 wild_doit (&ptr->children, s, output, file);
721 }
722 }
723 }
724 else
725 {
726 /* Do the creation to the named section only */
727 s = bfd_get_section_by_name (file->the_bfd, section);
728 if (s != NULL)
729 wild_doit (&ptr->children, s, output, file);
730 }
731 }
732 }
733
734 /* passed a file name (which must have been seen already and added to
735 the statement tree. We will see if it has been opened already and
736 had its symbols read. If not then we'll read it.
737
738 Archives are pecuilar here. We may open them once, but if they do
739 not define anything we need at the time, they won't have all their
740 symbols read. If we need them later, we'll have to redo it.
741 */
742 static lang_input_statement_type *
743 lookup_name (name)
744 CONST char *name;
745 {
746 lang_input_statement_type *search;
747
748 for (search = (lang_input_statement_type *) input_file_chain.head;
749 search != (lang_input_statement_type *) NULL;
750 search = (lang_input_statement_type *) search->next_real_file)
751 {
752 if (search->filename == (char *) NULL && name == (char *) NULL)
753 return search;
754 if (search->filename != (char *) NULL
755 && name != (char *) NULL
756 && strcmp (search->filename, name) == 0)
757 break;
758 }
759
760 if (search == (lang_input_statement_type *) NULL)
761 search = new_afile (name, lang_input_file_is_file_enum, default_target,
762 false);
763
764 /* If we have already added this file, or this file is not real
765 (FIXME: can that ever actually happen?) or the name is NULL
766 (FIXME: can that ever actually happen?) don't add this file. */
767 if (search->loaded
768 || ! search->real
769 || search->filename == (const char *) NULL)
770 return search;
771
772 load_symbols (search);
773
774 return search;
775 }
776
777 /* Get the symbols for an input file. */
778
779 static void
780 load_symbols (entry)
781 lang_input_statement_type *entry;
782 {
783 if (entry->loaded)
784 return;
785
786 ldfile_open_file (entry);
787
788 if (bfd_check_format (entry->the_bfd, bfd_object))
789 {
790 ldlang_add_file (entry);
791 if (trace_files || trace_file_tries)
792 info_msg ("%I\n", entry);
793 }
794 else if (bfd_check_format (entry->the_bfd, bfd_archive))
795 {
796 /* There is nothing to do here; the add_symbols routine will
797 call ldlang_add_file (via the add_archive_element callback)
798 for each element of the archive which is used. */
799 }
800 else
801 einfo ("%F%B: file not recognized: %E\n", entry->the_bfd);
802
803 if (bfd_link_add_symbols (entry->the_bfd, &link_info) == false)
804 einfo ("%F%B: could not read symbols: %E\n", entry->the_bfd);
805
806 entry->loaded = true;
807 }
808
809 static void
810 wild (s, section, file, target, output)
811 lang_wild_statement_type * s;
812 CONST char *section;
813 CONST char *file;
814 CONST char *target;
815 lang_output_section_statement_type * output;
816 {
817 lang_input_statement_type *f;
818
819 if (file == (char *) NULL)
820 {
821 /* Perform the iteration over all files in the list */
822 for (f = (lang_input_statement_type *) file_chain.head;
823 f != (lang_input_statement_type *) NULL;
824 f = (lang_input_statement_type *) f->next)
825 {
826 wild_section (s, section, f, output);
827 }
828 }
829 else
830 {
831 /* Perform the iteration over a single file */
832 wild_section (s, section, lookup_name (file), output);
833 }
834 if (section != (char *) NULL
835 && strcmp (section, "COMMON") == 0
836 && default_common_section == (lang_output_section_statement_type *) NULL)
837 {
838 /* Remember the section that common is going to incase we later
839 get something which doesn't know where to put it */
840 default_common_section = output;
841 }
842 }
843
844 /*
845 read in all the files
846 */
847
848 static bfd *
849 open_output (name)
850 CONST char *name;
851 {
852 bfd *output;
853
854 if (output_target == (char *) NULL)
855 {
856 if (current_target != (char *) NULL)
857 output_target = current_target;
858 else
859 output_target = default_target;
860 }
861 output = bfd_openw (name, output_target);
862
863 if (output == (bfd *) NULL)
864 {
865 if (bfd_get_error () == bfd_error_invalid_target)
866 {
867 einfo ("%P%F: target %s not found\n", output_target);
868 }
869 einfo ("%P%F: cannot open output file %s: %E\n", name);
870 }
871
872 delete_output_file_on_failure = 1;
873
874 /* output->flags |= D_PAGED;*/
875
876 if (! bfd_set_format (output, bfd_object))
877 einfo ("%P%F:%s: can not make object file: %E\n", name);
878 if (! bfd_set_arch_mach (output,
879 ldfile_output_architecture,
880 ldfile_output_machine))
881 einfo ("%P%F:%s: can not set architecture: %E\n", name);
882
883 link_info.hash = bfd_link_hash_table_create (output);
884 if (link_info.hash == (struct bfd_link_hash_table *) NULL)
885 einfo ("%P%F: can not create link hash table: %E\n");
886
887 bfd_set_gp_size (output, g_switch_value);
888 return output;
889 }
890
891
892
893
894 static void
895 ldlang_open_output (statement)
896 lang_statement_union_type * statement;
897 {
898 switch (statement->header.type)
899 {
900 case lang_output_statement_enum:
901 ASSERT (output_bfd == (bfd *) NULL);
902 output_bfd = open_output (statement->output_statement.name);
903 ldemul_set_output_arch ();
904 if (config.magic_demand_paged && !link_info.relocateable)
905 output_bfd->flags |= D_PAGED;
906 else
907 output_bfd->flags &= ~D_PAGED;
908 if (config.text_read_only)
909 output_bfd->flags |= WP_TEXT;
910 else
911 output_bfd->flags &= ~WP_TEXT;
912 break;
913
914 case lang_target_statement_enum:
915 current_target = statement->target_statement.target;
916 break;
917 default:
918 break;
919 }
920 }
921
922 static void
923 open_input_bfds (statement)
924 lang_statement_union_type * statement;
925 {
926 switch (statement->header.type)
927 {
928 case lang_target_statement_enum:
929 current_target = statement->target_statement.target;
930 break;
931 case lang_wild_statement_enum:
932 /* Maybe we should load the file's symbols */
933 if (statement->wild_statement.filename)
934 {
935 (void) lookup_name (statement->wild_statement.filename);
936 }
937 break;
938 case lang_input_statement_enum:
939 if (statement->input_statement.real == true)
940 {
941 statement->input_statement.target = current_target;
942 load_symbols (&statement->input_statement);
943 }
944 break;
945 default:
946 break;
947 }
948 }
949
950 /* If there are [COMMONS] statements, put a wild one into the bss section */
951
952 static void
953 lang_reasonable_defaults ()
954 {
955 #if 0
956 lang_output_section_statement_lookup (".text");
957 lang_output_section_statement_lookup (".data");
958
959 default_common_section =
960 lang_output_section_statement_lookup (".bss");
961
962
963 if (placed_commons == false)
964 {
965 lang_wild_statement_type *new =
966 new_stat (lang_wild_statement,
967 &default_common_section->children);
968
969 new->section_name = "COMMON";
970 new->filename = (char *) NULL;
971 lang_list_init (&new->children);
972 }
973 #endif
974
975 }
976
977 /*
978 Add the supplied name to the symbol table as an undefined reference.
979 Remove items from the chain as we open input bfds
980 */
981 typedef struct ldlang_undef_chain_list
982 {
983 struct ldlang_undef_chain_list *next;
984 char *name;
985 } ldlang_undef_chain_list_type;
986
987 static ldlang_undef_chain_list_type *ldlang_undef_chain_list_head;
988
989 void
990 ldlang_add_undef (name)
991 CONST char *CONST name;
992 {
993 ldlang_undef_chain_list_type *new =
994 (ldlang_undef_chain_list_type
995 *) stat_alloc ((bfd_size_type) (sizeof (ldlang_undef_chain_list_type)));
996
997 new->next = ldlang_undef_chain_list_head;
998 ldlang_undef_chain_list_head = new;
999
1000 new->name = buystring (name);
1001 }
1002
1003 /* Run through the list of undefineds created above and place them
1004 into the linker hash table as undefined symbols belonging to the
1005 script file.
1006 */
1007 static void
1008 lang_place_undefineds ()
1009 {
1010 ldlang_undef_chain_list_type *ptr;
1011
1012 for (ptr = ldlang_undef_chain_list_head;
1013 ptr != (ldlang_undef_chain_list_type *) NULL;
1014 ptr = ptr->next)
1015 {
1016 struct bfd_link_hash_entry *h;
1017
1018 h = bfd_link_hash_lookup (link_info.hash, ptr->name, true, false, true);
1019 if (h == (struct bfd_link_hash_entry *) NULL)
1020 einfo ("%P%F: bfd_link_hash_lookup failed: %E");
1021 if (h->type == bfd_link_hash_new)
1022 {
1023 h->type = bfd_link_hash_undefined;
1024 h->u.undef.abfd = NULL;
1025 bfd_link_add_undef (link_info.hash, h);
1026 }
1027 }
1028 }
1029
1030 /* Open input files and attatch to output sections */
1031 static void
1032 map_input_to_output_sections (s, target, output_section_statement)
1033 lang_statement_union_type * s;
1034 CONST char *target;
1035 lang_output_section_statement_type * output_section_statement;
1036 {
1037 for (; s != (lang_statement_union_type *) NULL; s = s->next)
1038 {
1039 switch (s->header.type)
1040 {
1041
1042
1043 case lang_wild_statement_enum:
1044 wild (&s->wild_statement, s->wild_statement.section_name,
1045 s->wild_statement.filename, target,
1046 output_section_statement);
1047
1048 break;
1049 case lang_constructors_statement_enum:
1050 map_input_to_output_sections (constructor_list.head,
1051 target,
1052 output_section_statement);
1053 break;
1054 case lang_output_section_statement_enum:
1055 map_input_to_output_sections (s->output_section_statement.children.head,
1056 target,
1057 &s->output_section_statement);
1058 break;
1059 case lang_output_statement_enum:
1060 break;
1061 case lang_target_statement_enum:
1062 target = s->target_statement.target;
1063 break;
1064 case lang_fill_statement_enum:
1065 case lang_input_section_enum:
1066 case lang_object_symbols_statement_enum:
1067 case lang_data_statement_enum:
1068 case lang_reloc_statement_enum:
1069 case lang_assignment_statement_enum:
1070 case lang_padding_statement_enum:
1071 case lang_input_statement_enum:
1072 if (output_section_statement != NULL
1073 && output_section_statement->bfd_section == NULL)
1074 init_os (output_section_statement);
1075 break;
1076 case lang_afile_asection_pair_statement_enum:
1077 FAIL ();
1078 break;
1079 case lang_address_statement_enum:
1080 /* Mark the specified section with the supplied address */
1081 {
1082 lang_output_section_statement_type *os =
1083 lang_output_section_statement_lookup
1084 (s->address_statement.section_name);
1085
1086 os->addr_tree = s->address_statement.address;
1087 if (os->bfd_section == (asection *) NULL)
1088 {
1089 einfo ("%P%F: cannot set the address of undefined section %s\n",
1090 s->address_statement.section_name);
1091 }
1092 }
1093 break;
1094 }
1095 }
1096 }
1097
1098 static void
1099 print_output_section_statement (output_section_statement)
1100 lang_output_section_statement_type * output_section_statement;
1101 {
1102 asection *section = output_section_statement->bfd_section;
1103
1104 print_nl ();
1105 print_section (output_section_statement->name);
1106
1107
1108 if (section)
1109 {
1110 print_dot = section->vma;
1111 print_space ();
1112 print_section ("");
1113 print_space ();
1114 print_address (section->vma);
1115 print_space ();
1116 print_size (section->_raw_size);
1117 print_space();
1118 print_size(section->_cooked_size);
1119 print_space ();
1120 print_alignment (section->alignment_power);
1121 print_space ();
1122 #if 0
1123 fprintf (config.map_file, "%s flags", output_section_statement->region->name);
1124 print_flags (stdout, &output_section_statement->flags);
1125 #endif
1126 if (section->flags & SEC_LOAD)
1127 fprintf (config.map_file, "load ");
1128 if (section->flags & SEC_ALLOC)
1129 fprintf (config.map_file, "alloc ");
1130 if (section->flags & SEC_RELOC)
1131 fprintf (config.map_file, "reloc ");
1132 if (section->flags & SEC_HAS_CONTENTS)
1133 fprintf (config.map_file, "contents ");
1134
1135 }
1136 else
1137 {
1138 fprintf (config.map_file, " (no attached output section)");
1139 }
1140 print_nl ();
1141 if (output_section_statement->load_base)
1142 {
1143 int b = exp_get_value_int(output_section_statement->load_base,
1144 0, "output base", lang_final_phase_enum);
1145 printf("Output address %08x\n", b);
1146 }
1147 if (output_section_statement->section_alignment >= 0
1148 || output_section_statement->section_alignment >= 0)
1149 {
1150 printf("\t\t\t\t\tforced alignment ");
1151 if ( output_section_statement->section_alignment >= 0)
1152 {
1153 printf("section 2**%d ",output_section_statement->section_alignment );
1154 }
1155 if ( output_section_statement->subsection_alignment >= 0)
1156 {
1157 printf("subsection 2**%d ",output_section_statement->subsection_alignment );
1158 }
1159
1160 print_nl ();
1161 }
1162 print_statement (output_section_statement->children.head,
1163 output_section_statement);
1164
1165 }
1166
1167 static void
1168 print_assignment (assignment, output_section)
1169 lang_assignment_statement_type * assignment;
1170 lang_output_section_statement_type * output_section;
1171 {
1172 etree_value_type result;
1173
1174 print_section ("");
1175 print_space ();
1176 print_section ("");
1177 print_space ();
1178 print_address (print_dot);
1179 print_space ();
1180 result = exp_fold_tree (assignment->exp->assign.src,
1181 output_section,
1182 lang_final_phase_enum,
1183 print_dot,
1184 &print_dot);
1185
1186 if (result.valid)
1187 {
1188 print_address (result.value);
1189 }
1190 else
1191 {
1192 fprintf (config.map_file, "*undefined*");
1193 }
1194 print_space ();
1195 exp_print_tree (assignment->exp);
1196
1197 fprintf (config.map_file, "\n");
1198 }
1199
1200 static void
1201 print_input_statement (statm)
1202 lang_input_statement_type * statm;
1203 {
1204 if (statm->filename != (char *) NULL)
1205 {
1206 fprintf (config.map_file, "LOAD %s\n", statm->filename);
1207 }
1208 }
1209
1210 /* Print all the defined symbols for the abfd provided by in the supplied
1211 section.
1212 */
1213
1214 static boolean
1215 print_one_symbol (hash_entry, ptr)
1216 struct bfd_link_hash_entry *hash_entry;
1217 PTR ptr;
1218 {
1219 asection * sec = (asection *)ptr;
1220
1221 if (hash_entry->type == bfd_link_hash_defined)
1222 {
1223 if (sec == hash_entry->u.def.section) {
1224 print_section ("");
1225 fprintf (config.map_file, " ");
1226 print_section ("");
1227 fprintf (config.map_file, " ");
1228 print_address (hash_entry->u.def.value + outside_section_address (sec));
1229 fprintf (config.map_file, " %s", hash_entry->root.string);
1230 print_nl ();
1231 }
1232 }
1233
1234 return true;
1235 }
1236
1237 static void
1238 print_input_section (in)
1239 lang_input_section_type * in;
1240 {
1241 asection *i = in->section;
1242 bfd_size_type size = i->_cooked_size != 0 ? i->_cooked_size : i->_raw_size;
1243
1244 if (size != 0)
1245 {
1246 print_section ("");
1247 fprintf (config.map_file, " ");
1248 print_section (i->name);
1249 fprintf (config.map_file, " ");
1250 if (i->output_section)
1251 {
1252 print_address (i->output_section->vma + i->output_offset);
1253 fprintf (config.map_file, " ");
1254 print_size (i->_raw_size);
1255 fprintf (config.map_file, " ");
1256 print_size(i->_cooked_size);
1257 fprintf (config.map_file, " ");
1258 print_alignment (i->alignment_power);
1259 fprintf (config.map_file, " ");
1260 if (in->ifile)
1261 {
1262
1263 bfd *abfd = in->ifile->the_bfd;
1264
1265 if (in->ifile->just_syms_flag == true)
1266 {
1267 fprintf (config.map_file, "symbols only ");
1268 }
1269
1270 fprintf (config.map_file, " %s ", abfd->xvec->name);
1271 if (abfd->my_archive != (bfd *) NULL)
1272 {
1273 fprintf (config.map_file, "[%s]%s", abfd->my_archive->filename,
1274 abfd->filename);
1275 }
1276 else
1277 {
1278 fprintf (config.map_file, "%s", abfd->filename);
1279 }
1280 fprintf (config.map_file, "(overhead %d bytes)", (int) bfd_alloc_size (abfd));
1281 print_nl ();
1282
1283 /* Print all the symbols */
1284 bfd_link_hash_traverse (link_info.hash, print_one_symbol, (PTR) i);
1285 }
1286 else
1287 {
1288 print_nl ();
1289 }
1290
1291
1292 print_dot = outside_section_address (i) + size;
1293 }
1294 else
1295 {
1296 fprintf (config.map_file, "No output section allocated\n");
1297 }
1298 }
1299 }
1300
1301 static void
1302 print_fill_statement (fill)
1303 lang_fill_statement_type * fill;
1304 {
1305 fprintf (config.map_file, "FILL mask ");
1306 print_fill (fill->fill);
1307 }
1308
1309 static void
1310 print_data_statement (data)
1311 lang_data_statement_type * data;
1312 {
1313 /* bfd_vma value; */
1314 print_section ("");
1315 print_space ();
1316 print_section ("");
1317 print_space ();
1318 /* ASSERT(print_dot == data->output_vma);*/
1319
1320 print_address (data->output_vma + data->output_section->vma);
1321 print_space ();
1322 print_address (data->value);
1323 print_space ();
1324 switch (data->type)
1325 {
1326 case BYTE:
1327 fprintf (config.map_file, "BYTE ");
1328 print_dot += BYTE_SIZE;
1329 break;
1330 case SHORT:
1331 fprintf (config.map_file, "SHORT ");
1332 print_dot += SHORT_SIZE;
1333 break;
1334 case LONG:
1335 fprintf (config.map_file, "LONG ");
1336 print_dot += LONG_SIZE;
1337 break;
1338 case QUAD:
1339 fprintf (config.map_file, "QUAD ");
1340 print_dot += QUAD_SIZE;
1341 break;
1342 }
1343
1344 exp_print_tree (data->exp);
1345
1346 fprintf (config.map_file, "\n");
1347 }
1348
1349 /* Print a reloc statement. */
1350
1351 static void
1352 print_reloc_statement (reloc)
1353 lang_reloc_statement_type *reloc;
1354 {
1355 print_section ("");
1356 print_space ();
1357 print_section ("");
1358 print_space ();
1359
1360 /* ASSERT(print_dot == data->output_vma);*/
1361
1362 print_address (reloc->output_vma + reloc->output_section->vma);
1363 print_space ();
1364 print_address (reloc->addend_value);
1365 print_space ();
1366
1367 fprintf (config.map_file, "RELOC %s ", reloc->howto->name);
1368
1369 print_dot += bfd_get_reloc_size (reloc->howto);
1370
1371 exp_print_tree (reloc->addend_exp);
1372
1373 fprintf (config.map_file, "\n");
1374 }
1375
1376 static void
1377 print_padding_statement (s)
1378 lang_padding_statement_type * s;
1379 {
1380 print_section ("");
1381 print_space ();
1382 print_section ("*fill*");
1383 print_space ();
1384 print_address (s->output_offset + s->output_section->vma);
1385 print_space ();
1386 print_size (s->size);
1387 print_space ();
1388 print_fill (s->fill);
1389 print_nl ();
1390
1391 print_dot = s->output_offset + s->output_section->vma + s->size;
1392
1393 }
1394
1395 static void
1396 print_wild_statement (w, os)
1397 lang_wild_statement_type * w;
1398 lang_output_section_statement_type * os;
1399 {
1400 fprintf (config.map_file, " from ");
1401 if (w->filename != (char *) NULL)
1402 {
1403 fprintf (config.map_file, "%s", w->filename);
1404 }
1405 else
1406 {
1407 fprintf (config.map_file, "*");
1408 }
1409 if (w->section_name != (char *) NULL)
1410 {
1411 fprintf (config.map_file, "(%s)", w->section_name);
1412 }
1413 else
1414 {
1415 fprintf (config.map_file, "(*)");
1416 }
1417 print_nl ();
1418 print_statement (w->children.head, os);
1419
1420 }
1421 static void
1422 print_statement (s, os)
1423 lang_statement_union_type * s;
1424 lang_output_section_statement_type * os;
1425 {
1426 while (s)
1427 {
1428 switch (s->header.type)
1429 {
1430 case lang_constructors_statement_enum:
1431 fprintf (config.map_file, "constructors:\n");
1432 print_statement (constructor_list.head, os);
1433 break;
1434 case lang_wild_statement_enum:
1435 print_wild_statement (&s->wild_statement, os);
1436 break;
1437 default:
1438 fprintf (config.map_file, "Fail with %d\n", s->header.type);
1439 FAIL ();
1440 break;
1441 case lang_address_statement_enum:
1442 fprintf (config.map_file, "address\n");
1443 break;
1444 case lang_object_symbols_statement_enum:
1445 fprintf (config.map_file, "object symbols\n");
1446 break;
1447 case lang_fill_statement_enum:
1448 print_fill_statement (&s->fill_statement);
1449 break;
1450 case lang_data_statement_enum:
1451 print_data_statement (&s->data_statement);
1452 break;
1453 case lang_reloc_statement_enum:
1454 print_reloc_statement (&s->reloc_statement);
1455 break;
1456 case lang_input_section_enum:
1457 print_input_section (&s->input_section);
1458 break;
1459 case lang_padding_statement_enum:
1460 print_padding_statement (&s->padding_statement);
1461 break;
1462 case lang_output_section_statement_enum:
1463 print_output_section_statement (&s->output_section_statement);
1464 break;
1465 case lang_assignment_statement_enum:
1466 print_assignment (&s->assignment_statement,
1467 os);
1468 break;
1469 case lang_target_statement_enum:
1470 fprintf (config.map_file, "TARGET(%s)\n", s->target_statement.target);
1471 break;
1472 case lang_output_statement_enum:
1473 fprintf (config.map_file, "OUTPUT(%s %s)\n",
1474 s->output_statement.name,
1475 output_target ? output_target : "");
1476 break;
1477 case lang_input_statement_enum:
1478 print_input_statement (&s->input_statement);
1479 break;
1480 case lang_afile_asection_pair_statement_enum:
1481 FAIL ();
1482 break;
1483 }
1484 s = s->next;
1485 }
1486 }
1487
1488
1489 static void
1490 print_statements ()
1491 {
1492 print_statement (statement_list.head,
1493 abs_output_section);
1494
1495 }
1496
1497 static bfd_vma
1498 insert_pad (this_ptr, fill, power, output_section_statement, dot)
1499 lang_statement_union_type ** this_ptr;
1500 fill_type fill;
1501 unsigned int power;
1502 asection * output_section_statement;
1503 bfd_vma dot;
1504 {
1505 /* Align this section first to the
1506 input sections requirement, then
1507 to the output section's requirement.
1508 If this alignment is > than any seen before,
1509 then record it too. Perform the alignment by
1510 inserting a magic 'padding' statement.
1511 */
1512
1513 unsigned int alignment_needed = align_power (dot, power) - dot;
1514
1515 if (alignment_needed != 0)
1516 {
1517 lang_statement_union_type *new =
1518 (lang_statement_union_type *)
1519 stat_alloc ((bfd_size_type) (sizeof (lang_padding_statement_type)));
1520
1521 /* Link into existing chain */
1522 new->header.next = *this_ptr;
1523 *this_ptr = new;
1524 new->header.type = lang_padding_statement_enum;
1525 new->padding_statement.output_section = output_section_statement;
1526 new->padding_statement.output_offset =
1527 dot - output_section_statement->vma;
1528 new->padding_statement.fill = fill;
1529 new->padding_statement.size = alignment_needed;
1530 }
1531
1532
1533 /* Remember the most restrictive alignment */
1534 if (power > output_section_statement->alignment_power)
1535 {
1536 output_section_statement->alignment_power = power;
1537 }
1538 output_section_statement->_raw_size += alignment_needed;
1539 return alignment_needed + dot;
1540
1541 }
1542
1543 /* Work out how much this section will move the dot point */
1544 static bfd_vma
1545 size_input_section (this_ptr, output_section_statement, fill, dot, relax)
1546 lang_statement_union_type ** this_ptr;
1547 lang_output_section_statement_type * output_section_statement;
1548 fill_type fill;
1549 bfd_vma dot;
1550 boolean relax;
1551 {
1552 lang_input_section_type *is = &((*this_ptr)->input_section);
1553 asection *i = is->section;
1554
1555 if (is->ifile->just_syms_flag == false)
1556 {
1557 if (output_section_statement->subsection_alignment != -1)
1558 i->alignment_power =
1559 output_section_statement->subsection_alignment;
1560
1561 dot = insert_pad (this_ptr, fill, i->alignment_power,
1562 output_section_statement->bfd_section, dot);
1563
1564 /* Remember where in the output section this input section goes */
1565
1566 i->output_offset = dot - output_section_statement->bfd_section->vma;
1567
1568 /* Mark how big the output section must be to contain this now
1569 */
1570 if (i->_cooked_size != 0)
1571 dot += i->_cooked_size;
1572 else
1573 dot += i->_raw_size;
1574 output_section_statement->bfd_section->_raw_size = dot - output_section_statement->bfd_section->vma;
1575 }
1576 else
1577 {
1578 i->output_offset = i->vma - output_section_statement->bfd_section->vma;
1579 }
1580
1581 return dot;
1582 }
1583
1584 /* This variable indicates whether bfd_relax_section should be called
1585 again. */
1586
1587 static boolean relax_again;
1588
1589 /* Set the sizes for all the output sections. */
1590
1591 bfd_vma
1592 lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
1593 lang_statement_union_type * s;
1594 lang_output_section_statement_type * output_section_statement;
1595 lang_statement_union_type ** prev;
1596 fill_type fill;
1597 bfd_vma dot;
1598 boolean relax;
1599 {
1600 /* Size up the sections from their constituent parts */
1601 for (; s != (lang_statement_union_type *) NULL; s = s->next)
1602 {
1603 switch (s->header.type)
1604 {
1605
1606 case lang_output_section_statement_enum:
1607 {
1608 bfd_vma after;
1609 lang_output_section_statement_type *os = &s->output_section_statement;
1610
1611 if (os->bfd_section == NULL)
1612 {
1613 /* This section was never actually created. */
1614 break;
1615 }
1616
1617 /* If this is a COFF shared library section, use the size and
1618 address from the input section. FIXME: This is COFF
1619 specific; it would be cleaner if there were some other way
1620 to do this, but nothing simple comes to mind. */
1621 if ((os->bfd_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
1622 {
1623 asection *input;
1624
1625 if (os->children.head == NULL
1626 || os->children.head->next != NULL
1627 || os->children.head->header.type != lang_input_section_enum)
1628 einfo ("%P%X: Internal error on COFF shared library section %s",
1629 os->name);
1630
1631 input = os->children.head->input_section.section;
1632 bfd_set_section_vma (os->bfd_section->owner,
1633 os->bfd_section,
1634 bfd_section_vma (input->owner, input));
1635 os->bfd_section->_raw_size = input->_raw_size;
1636 break;
1637 }
1638
1639 if (os->bfd_section == &bfd_abs_section)
1640 {
1641 /* No matter what happens, an abs section starts at zero */
1642 bfd_set_section_vma (0, os->bfd_section, 0);
1643 }
1644 else
1645 {
1646 if (os->addr_tree == (etree_type *) NULL)
1647 {
1648 /* No address specified for this section, get one
1649 from the region specification
1650 */
1651 if (os->region == (lang_memory_region_type *) NULL)
1652 {
1653 os->region = lang_memory_region_lookup ("*default*");
1654 }
1655 dot = os->region->current;
1656 if (os->section_alignment == -1)
1657 dot = align_power (dot, os->bfd_section->alignment_power);
1658 }
1659 else
1660 {
1661 etree_value_type r;
1662
1663 r = exp_fold_tree (os->addr_tree,
1664 abs_output_section,
1665 lang_allocating_phase_enum,
1666 dot, &dot);
1667 if (r.valid == false)
1668 {
1669 einfo ("%F%S: non constant address expression for section %s\n",
1670 os->name);
1671 }
1672 dot = r.value;
1673 }
1674 /* The section starts here */
1675 /* First, align to what the section needs */
1676
1677 if (os->section_alignment != -1)
1678 dot = align_power (dot, os->section_alignment);
1679
1680 bfd_set_section_vma (0, os->bfd_section, dot);
1681
1682 if (os->load_base) {
1683 os->bfd_section->lma
1684 = exp_get_value_int(os->load_base, 0,"load base", lang_final_phase_enum);
1685 }
1686 }
1687
1688
1689 os->bfd_section->output_offset = 0;
1690
1691 (void) lang_size_sections (os->children.head, os, &os->children.head,
1692 os->fill, dot, relax);
1693 /* Ignore the size of the input sections, use the vma and size to */
1694 /* align against */
1695
1696 after = ALIGN_N (os->bfd_section->vma +
1697 os->bfd_section->_raw_size,
1698 /* The coercion here is important, see ld.h. */
1699 (bfd_vma) os->block_value);
1700
1701 os->bfd_section->_raw_size = after - os->bfd_section->vma;
1702 dot = os->bfd_section->vma + os->bfd_section->_raw_size;
1703 os->processed = true;
1704
1705 /* Replace into region ? */
1706 if (os->addr_tree == (etree_type *) NULL
1707 && os->region != (lang_memory_region_type *) NULL)
1708 {
1709 os->region->current = dot;
1710 /* Make sure this isn't silly */
1711 if (( os->region->current
1712 > os->region->origin + os->region->length)
1713 || ( os->region->origin > os->region->current ))
1714 {
1715 einfo ("%X%P: region %s is full (%B section %s)\n",
1716 os->region->name,
1717 os->bfd_section->owner,
1718 os->bfd_section->name);
1719 /* Reset the region pointer */
1720 os->region->current = 0;
1721
1722 }
1723
1724 }
1725 }
1726
1727 break;
1728 case lang_constructors_statement_enum:
1729 dot = lang_size_sections (constructor_list.head,
1730 output_section_statement,
1731 &s->wild_statement.children.head,
1732 fill,
1733 dot, relax);
1734 break;
1735
1736 case lang_data_statement_enum:
1737 {
1738 unsigned int size = 0;
1739
1740 s->data_statement.output_vma = dot - output_section_statement->bfd_section->vma;
1741 s->data_statement.output_section =
1742 output_section_statement->bfd_section;
1743
1744 switch (s->data_statement.type)
1745 {
1746 case QUAD:
1747 size = QUAD_SIZE;
1748 break;
1749 case LONG:
1750 size = LONG_SIZE;
1751 break;
1752 case SHORT:
1753 size = SHORT_SIZE;
1754 break;
1755 case BYTE:
1756 size = BYTE_SIZE;
1757 break;
1758
1759 }
1760 dot += size;
1761 output_section_statement->bfd_section->_raw_size += size;
1762 }
1763 break;
1764
1765 case lang_reloc_statement_enum:
1766 {
1767 int size;
1768
1769 s->reloc_statement.output_vma =
1770 dot - output_section_statement->bfd_section->vma;
1771 s->reloc_statement.output_section =
1772 output_section_statement->bfd_section;
1773 size = bfd_get_reloc_size (s->reloc_statement.howto);
1774 dot += size;
1775 output_section_statement->bfd_section->_raw_size += size;
1776 }
1777 break;
1778
1779 case lang_wild_statement_enum:
1780
1781 dot = lang_size_sections (s->wild_statement.children.head,
1782 output_section_statement,
1783 &s->wild_statement.children.head,
1784
1785 fill, dot, relax);
1786
1787 break;
1788
1789 case lang_object_symbols_statement_enum:
1790 link_info.create_object_symbols_section =
1791 output_section_statement->bfd_section;
1792 break;
1793 case lang_output_statement_enum:
1794 case lang_target_statement_enum:
1795 break;
1796 case lang_input_section_enum:
1797 {
1798 asection *i;
1799
1800 i = (*prev)->input_section.section;
1801 if (! relax)
1802 i->_cooked_size = i->_raw_size;
1803 else
1804 {
1805 boolean again;
1806
1807 if (! bfd_relax_section (i->owner, i, &link_info, &again))
1808 einfo ("%P%F: can't relax section: %E\n");
1809 if (again)
1810 relax_again = true;
1811 }
1812 dot = size_input_section (prev,
1813 output_section_statement,
1814 output_section_statement->fill,
1815 dot, relax);
1816 }
1817 break;
1818 case lang_input_statement_enum:
1819 break;
1820 case lang_fill_statement_enum:
1821 s->fill_statement.output_section = output_section_statement->bfd_section;
1822
1823 fill = s->fill_statement.fill;
1824 break;
1825 case lang_assignment_statement_enum:
1826 {
1827 bfd_vma newdot = dot;
1828
1829 exp_fold_tree (s->assignment_statement.exp,
1830 output_section_statement,
1831 lang_allocating_phase_enum,
1832 dot,
1833 &newdot);
1834
1835 if (newdot != dot && !relax)
1836 {
1837 /* The assignment changed dot. Insert a pad. */
1838 if (output_section_statement == abs_output_section)
1839 {
1840 /* If we don't have an output section, then just adjust
1841 the default memory address. */
1842 lang_memory_region_lookup ("*default*")->current = newdot;
1843 }
1844 else
1845 {
1846 lang_statement_union_type *new =
1847 ((lang_statement_union_type *)
1848 stat_alloc (sizeof (lang_padding_statement_type)));
1849
1850 /* Link into existing chain */
1851 new->header.next = *prev;
1852 *prev = new;
1853 new->header.type = lang_padding_statement_enum;
1854 new->padding_statement.output_section =
1855 output_section_statement->bfd_section;
1856 new->padding_statement.output_offset =
1857 dot - output_section_statement->bfd_section->vma;
1858 new->padding_statement.fill = fill;
1859 new->padding_statement.size = newdot - dot;
1860 output_section_statement->bfd_section->_raw_size +=
1861 new->padding_statement.size;
1862 }
1863
1864 dot = newdot;
1865 }
1866 }
1867 break;
1868
1869 case lang_padding_statement_enum:
1870 /* If we are relaxing, and this is not the first pass, some
1871 padding statements may have been inserted during previous
1872 passes. We may have to move the padding statement to a new
1873 location if dot has a different value at this point in this
1874 pass than it did at this point in the previous pass. */
1875 s->padding_statement.output_offset =
1876 dot - output_section_statement->bfd_section->vma;
1877 dot += s->padding_statement.size;
1878 break;
1879
1880 default:
1881 FAIL ();
1882 break;
1883
1884 /* This can only get here when relaxing is turned on */
1885
1886 case lang_address_statement_enum:
1887 break;
1888 }
1889 prev = &s->header.next;
1890 }
1891 return dot;
1892 }
1893
1894 static bfd_vma
1895 lang_do_assignments (s, output_section_statement, fill, dot)
1896 lang_statement_union_type * s;
1897 lang_output_section_statement_type * output_section_statement;
1898 fill_type fill;
1899 bfd_vma dot;
1900 {
1901 for (; s != (lang_statement_union_type *) NULL; s = s->next)
1902 {
1903 switch (s->header.type)
1904 {
1905 case lang_constructors_statement_enum:
1906 dot = lang_do_assignments (constructor_list.head,
1907 output_section_statement,
1908 fill,
1909 dot);
1910 break;
1911
1912 case lang_output_section_statement_enum:
1913 {
1914 lang_output_section_statement_type *os =
1915 &(s->output_section_statement);
1916
1917 if (os->bfd_section != NULL)
1918 {
1919 dot = os->bfd_section->vma;
1920 (void) lang_do_assignments (os->children.head, os,
1921 os->fill, dot);
1922 dot = os->bfd_section->vma + os->bfd_section->_raw_size;
1923 }
1924 }
1925 break;
1926 case lang_wild_statement_enum:
1927
1928 dot = lang_do_assignments (s->wild_statement.children.head,
1929 output_section_statement,
1930 fill, dot);
1931
1932 break;
1933
1934 case lang_object_symbols_statement_enum:
1935 case lang_output_statement_enum:
1936 case lang_target_statement_enum:
1937 #if 0
1938 case lang_common_statement_enum:
1939 #endif
1940 break;
1941 case lang_data_statement_enum:
1942 {
1943 etree_value_type value;
1944
1945 value = exp_fold_tree (s->data_statement.exp,
1946 abs_output_section,
1947 lang_final_phase_enum, dot, &dot);
1948 s->data_statement.value = value.value;
1949 if (value.valid == false)
1950 einfo ("%F%P: invalid data statement\n");
1951 }
1952 switch (s->data_statement.type)
1953 {
1954 case QUAD:
1955 dot += QUAD_SIZE;
1956 break;
1957 case LONG:
1958 dot += LONG_SIZE;
1959 break;
1960 case SHORT:
1961 dot += SHORT_SIZE;
1962 break;
1963 case BYTE:
1964 dot += BYTE_SIZE;
1965 break;
1966 }
1967 break;
1968
1969 case lang_reloc_statement_enum:
1970 {
1971 etree_value_type value;
1972
1973 value = exp_fold_tree (s->reloc_statement.addend_exp,
1974 abs_output_section,
1975 lang_final_phase_enum, dot, &dot);
1976 s->reloc_statement.addend_value = value.value;
1977 if (value.valid == false)
1978 einfo ("%F%P: invalid reloc statement\n");
1979 }
1980 dot += bfd_get_reloc_size (s->reloc_statement.howto);
1981 break;
1982
1983 case lang_input_section_enum:
1984 {
1985 asection *in = s->input_section.section;
1986
1987 if (in->_cooked_size != 0)
1988 dot += in->_cooked_size;
1989 else
1990 dot += in->_raw_size;
1991 }
1992 break;
1993
1994 case lang_input_statement_enum:
1995 break;
1996 case lang_fill_statement_enum:
1997 fill = s->fill_statement.fill;
1998 break;
1999 case lang_assignment_statement_enum:
2000 {
2001 exp_fold_tree (s->assignment_statement.exp,
2002 output_section_statement,
2003 lang_final_phase_enum,
2004 dot,
2005 &dot);
2006 }
2007
2008 break;
2009 case lang_padding_statement_enum:
2010 dot += s->padding_statement.size;
2011 break;
2012 default:
2013 FAIL ();
2014 break;
2015 case lang_address_statement_enum:
2016 break;
2017 }
2018
2019 }
2020 return dot;
2021 }
2022
2023 static void
2024 lang_finish ()
2025 {
2026 struct bfd_link_hash_entry *h;
2027 boolean warn = link_info.relocateable ? false : true;
2028
2029 if (entry_symbol == (char *) NULL)
2030 {
2031 /* No entry has been specified. Look for start, but don't warn
2032 if we don't find it. */
2033 entry_symbol = "start";
2034 warn = false;
2035 }
2036
2037 h = bfd_link_hash_lookup (link_info.hash, entry_symbol, false, false, true);
2038 if (h != (struct bfd_link_hash_entry *) NULL
2039 && h->type == bfd_link_hash_defined)
2040 {
2041 bfd_vma val;
2042
2043 val = (h->u.def.value
2044 + bfd_get_section_vma (output_bfd,
2045 h->u.def.section->output_section)
2046 + h->u.def.section->output_offset);
2047 if (! bfd_set_start_address (output_bfd, val))
2048 einfo ("%P%F:%s: can't set start address\n", entry_symbol);
2049 }
2050 else
2051 {
2052 asection *ts;
2053
2054 /* Can't find the entry symbol. Use the first address in the
2055 text section. */
2056 ts = bfd_get_section_by_name (output_bfd, ".text");
2057 if (ts != (asection *) NULL)
2058 {
2059 if (warn)
2060 einfo ("%P: warning: cannot find entry symbol %s; defaulting to %V\n",
2061 entry_symbol, bfd_get_section_vma (output_bfd, ts));
2062 if (! bfd_set_start_address (output_bfd,
2063 bfd_get_section_vma (output_bfd, ts)))
2064 einfo ("%P%F: can't set start address\n");
2065 }
2066 else
2067 {
2068 if (warn)
2069 einfo ("%P: warning: cannot find entry symbol %s; not setting start address\n",
2070 entry_symbol);
2071 }
2072 }
2073 }
2074
2075 /* By now we know the target architecture, and we may have an */
2076 /* ldfile_output_machine_name */
2077 static void
2078 lang_check ()
2079 {
2080 lang_statement_union_type *file;
2081 bfd *input_bfd;
2082 unsigned long input_machine;
2083 enum bfd_architecture input_architecture;
2084 CONST bfd_arch_info_type *compatible;
2085
2086 for (file = file_chain.head;
2087 file != (lang_statement_union_type *) NULL;
2088 file = file->input_statement.next)
2089 {
2090 input_bfd = file->input_statement.the_bfd;
2091
2092 input_machine = bfd_get_mach (input_bfd);
2093 input_architecture = bfd_get_arch (input_bfd);
2094
2095
2096 /* Inspect the architecture and ensure we're linking like with
2097 like */
2098
2099 compatible = bfd_arch_get_compatible (input_bfd,
2100 output_bfd);
2101
2102 if (compatible)
2103 {
2104 ldfile_output_machine = compatible->mach;
2105 ldfile_output_architecture = compatible->arch;
2106 }
2107 else
2108 {
2109
2110 einfo ("%P: warning: %s architecture of input file `%B' is incompatible with %s output\n",
2111 bfd_printable_name (input_bfd), input_bfd,
2112 bfd_printable_name (output_bfd));
2113
2114 if (! bfd_set_arch_mach (output_bfd,
2115 input_architecture,
2116 input_machine))
2117 einfo ("%P%F:%s: can't set architecture: %E\n",
2118 bfd_get_filename (output_bfd));
2119 }
2120
2121 }
2122 }
2123
2124 /* Look through all the global common symbols and attach them to the
2125 correct section. The -sort-common command line switch may be used
2126 to roughly sort the entries by size. */
2127
2128 static void
2129 lang_common ()
2130 {
2131 if (link_info.relocateable
2132 && ! command_line.force_common_definition)
2133 return;
2134
2135 if (! config.sort_common)
2136 bfd_link_hash_traverse (link_info.hash, lang_one_common, (PTR) NULL);
2137 else
2138 {
2139 unsigned int power;
2140
2141 for (power = 1; power <= 16; power <<= 1)
2142 bfd_link_hash_traverse (link_info.hash, lang_one_common,
2143 (PTR) &power);
2144 }
2145 }
2146
2147 /* Place one common symbol in the correct section. */
2148
2149 static boolean
2150 lang_one_common (h, info)
2151 struct bfd_link_hash_entry *h;
2152 PTR info;
2153 {
2154 unsigned int power_of_two;
2155 bfd_vma size;
2156 size_t align;
2157 asection *section;
2158
2159 if (h->type != bfd_link_hash_common)
2160 return true;
2161
2162 size = h->u.c.size;
2163 switch (size)
2164 {
2165 case 0:
2166 case 1:
2167 power_of_two = 0;
2168 align = 1;
2169 break;
2170 case 2:
2171 power_of_two = 1;
2172 align = 2;
2173 break;
2174 case 3:
2175 case 4:
2176 power_of_two = 2;
2177 align = 4;
2178 break;
2179 case 5:
2180 case 6:
2181 case 7:
2182 case 8:
2183 power_of_two = 3;
2184 align = 8;
2185 break;
2186 default:
2187 power_of_two = 4;
2188 align = 16;
2189 break;
2190 }
2191
2192 if (config.sort_common && align != *(unsigned int *) info)
2193 return true;
2194
2195 section = h->u.c.section;
2196
2197 /* Increase the size of the section. */
2198 section->_raw_size = ALIGN_N (section->_raw_size, align);
2199
2200 /* Adjust the alignment if necessary. */
2201 if (power_of_two > section->alignment_power)
2202 section->alignment_power = power_of_two;
2203
2204 /* Change the symbol from common to defined. */
2205 h->type = bfd_link_hash_defined;
2206 h->u.def.section = section;
2207 h->u.def.value = section->_raw_size;
2208
2209 /* Increase the size of the section. */
2210 section->_raw_size += size;
2211
2212 if (config.map_file != NULL)
2213 fprintf (config.map_file, "Allocating common %s: %lx at %lx %s\n",
2214 h->root.string, (unsigned long) size,
2215 (unsigned long) h->u.def.value, section->owner->filename);
2216
2217 return true;
2218 }
2219
2220 /*
2221 run through the input files and ensure that every input
2222 section has somewhere to go. If one is found without
2223 a destination then create an input request and place it
2224 into the statement tree.
2225 */
2226
2227 static void
2228 lang_place_orphans ()
2229 {
2230 lang_input_statement_type *file;
2231
2232 for (file = (lang_input_statement_type *) file_chain.head;
2233 file != (lang_input_statement_type *) NULL;
2234 file = (lang_input_statement_type *) file->next)
2235 {
2236 asection *s;
2237
2238 if (file->just_syms_flag)
2239 continue;
2240
2241 for (s = file->the_bfd->sections;
2242 s != (asection *) NULL;
2243 s = s->next)
2244 {
2245 if (s->output_section == (asection *) NULL)
2246 {
2247 /* This section of the file is not attatched, root
2248 around for a sensible place for it to go */
2249
2250 if (file->common_section == s)
2251 {
2252 /* This is a lonely common section which must
2253 have come from an archive. We attatch to the
2254 section with the wildcard */
2255 if (! link_info.relocateable
2256 && ! command_line.force_common_definition)
2257 {
2258 if (default_common_section ==
2259 (lang_output_section_statement_type *) NULL)
2260 {
2261 info_msg ("%P: no [COMMON] command, defaulting to .bss\n");
2262
2263 default_common_section =
2264 lang_output_section_statement_lookup (".bss");
2265
2266 }
2267 wild_doit (&default_common_section->children, s,
2268 default_common_section, file);
2269 }
2270 }
2271 else
2272 {
2273 lang_output_section_statement_type *os =
2274 lang_output_section_statement_lookup (s->name);
2275
2276 wild_doit (&os->children, s, os, file);
2277 }
2278 }
2279 }
2280 }
2281 }
2282
2283
2284 void
2285 lang_set_flags (ptr, flags)
2286 int *ptr;
2287 CONST char *flags;
2288 {
2289 boolean state = false;
2290
2291 *ptr = 0;
2292 while (*flags)
2293 {
2294 if (*flags == '!')
2295 {
2296 state = false;
2297 flags++;
2298 }
2299 else
2300 state = true;
2301 switch (*flags)
2302 {
2303 case 'R':
2304 /* ptr->flag_read = state; */
2305 break;
2306 case 'W':
2307 /* ptr->flag_write = state; */
2308 break;
2309 case 'X':
2310 /* ptr->flag_executable= state;*/
2311 break;
2312 case 'L':
2313 case 'I':
2314 /* ptr->flag_loadable= state;*/
2315 break;
2316 default:
2317 einfo ("%P%F: invalid syntax in flags\n");
2318 break;
2319 }
2320 flags++;
2321 }
2322 }
2323
2324
2325
2326 void
2327 lang_for_each_file (func)
2328 void (*func) PARAMS ((lang_input_statement_type *));
2329 {
2330 lang_input_statement_type *f;
2331
2332 for (f = (lang_input_statement_type *) file_chain.head;
2333 f != (lang_input_statement_type *) NULL;
2334 f = (lang_input_statement_type *) f->next)
2335 {
2336 func (f);
2337 }
2338 }
2339
2340 #if 0
2341
2342 /* Not used. */
2343
2344 void
2345 lang_for_each_input_section (func)
2346 void (*func) PARAMS ((bfd * ab, asection * as));
2347 {
2348 lang_input_statement_type *f;
2349
2350 for (f = (lang_input_statement_type *) file_chain.head;
2351 f != (lang_input_statement_type *) NULL;
2352 f = (lang_input_statement_type *) f->next)
2353 {
2354 asection *s;
2355
2356 for (s = f->the_bfd->sections;
2357 s != (asection *) NULL;
2358 s = s->next)
2359 {
2360 func (f->the_bfd, s);
2361 }
2362 }
2363 }
2364
2365 #endif
2366
2367 void
2368 ldlang_add_file (entry)
2369 lang_input_statement_type * entry;
2370 {
2371 bfd **pp;
2372
2373 lang_statement_append (&file_chain,
2374 (lang_statement_union_type *) entry,
2375 &entry->next);
2376
2377 /* The BFD linker needs to have a list of all input BFDs involved in
2378 a link. */
2379 ASSERT (entry->the_bfd->link_next == (bfd *) NULL);
2380 ASSERT (entry->the_bfd != output_bfd);
2381 for (pp = &link_info.input_bfds;
2382 *pp != (bfd *) NULL;
2383 pp = &(*pp)->link_next)
2384 ;
2385 *pp = entry->the_bfd;
2386 entry->the_bfd->usrdata = (PTR) entry;
2387 bfd_set_gp_size (entry->the_bfd, g_switch_value);
2388 }
2389
2390 void
2391 lang_add_output (name, from_script)
2392 CONST char *name;
2393 int from_script;
2394 {
2395 /* Make -o on command line override OUTPUT in script. */
2396 if (had_output_filename == false || !from_script)
2397 {
2398 output_filename = name;
2399 had_output_filename = true;
2400 }
2401 }
2402
2403
2404 static lang_output_section_statement_type *current_section;
2405
2406 static int topower(x)
2407 int x;
2408 {
2409 unsigned int i = 1;
2410 int l;
2411 if (x < 0) return -1;
2412 for (l = 0; l < 32; l++)
2413 {
2414 if (i >= x) return l;
2415 i<<=1;
2416 }
2417 return 0;
2418 }
2419 void
2420 lang_enter_output_section_statement (output_section_statement_name,
2421 address_exp, flags, block_value,
2422 align, subalign, ebase)
2423 const char *output_section_statement_name;
2424 etree_type * address_exp;
2425 int flags;
2426 bfd_vma block_value;
2427 etree_type *align;
2428 etree_type *subalign;
2429 etree_type *ebase;
2430 {
2431 lang_output_section_statement_type *os;
2432
2433 current_section =
2434 os =
2435 lang_output_section_statement_lookup (output_section_statement_name);
2436
2437
2438
2439 /* Add this statement to tree */
2440 /* add_statement(lang_output_section_statement_enum,
2441 output_section_statement);*/
2442 /* Make next things chain into subchain of this */
2443
2444 if (os->addr_tree ==
2445 (etree_type *) NULL)
2446 {
2447 os->addr_tree =
2448 address_exp;
2449 }
2450 os->flags = flags;
2451 if (flags & SEC_NEVER_LOAD)
2452 os->loadable = 0;
2453 else
2454 os->loadable = 1;
2455 os->block_value = block_value ? block_value : 1;
2456 stat_ptr = &os->children;
2457
2458 os->subsection_alignment = topower(
2459 exp_get_value_int(subalign, -1,
2460 "subsection alignment",
2461 0));
2462 os->section_alignment = topower(
2463 exp_get_value_int(align, -1,
2464 "section alignment", 0));
2465
2466 os->load_base = ebase;
2467 }
2468
2469
2470 void
2471 lang_final ()
2472 {
2473 lang_output_statement_type *new =
2474 new_stat (lang_output_statement, stat_ptr);
2475
2476 new->name = output_filename;
2477 }
2478
2479 /* Reset the current counters in the regions */
2480 static void
2481 reset_memory_regions ()
2482 {
2483 lang_memory_region_type *p = lang_memory_region_list;
2484
2485 for (p = lang_memory_region_list;
2486 p != (lang_memory_region_type *) NULL;
2487 p = p->next)
2488 {
2489 p->old_length = (bfd_size_type) (p->current - p->origin);
2490 p->current = p->origin;
2491 }
2492 }
2493
2494 void
2495 lang_process ()
2496 {
2497 lang_reasonable_defaults ();
2498 current_target = default_target;
2499
2500 lang_for_each_statement (ldlang_open_output); /* Open the output file */
2501
2502 ldemul_create_output_section_statements ();
2503
2504 /* Add to the hash table all undefineds on the command line */
2505 lang_place_undefineds ();
2506
2507 /* Create a bfd for each input file */
2508 current_target = default_target;
2509 lang_for_each_statement (open_input_bfds);
2510
2511 /* Build all sets based on the information gathered from the input
2512 files. */
2513 ldctor_build_sets ();
2514
2515 /* Size up the common data */
2516 lang_common ();
2517
2518 /* Run through the contours of the script and attatch input sections
2519 to the correct output sections
2520 */
2521 map_input_to_output_sections (statement_list.head, (char *) NULL,
2522 (lang_output_section_statement_type *) NULL);
2523
2524
2525 /* Find any sections not attatched explicitly and handle them */
2526 lang_place_orphans ();
2527
2528 ldemul_before_allocation ();
2529
2530 /* Now run around and relax if we can */
2531 if (command_line.relax)
2532 {
2533 /* First time round is a trial run to get the 'worst case'
2534 addresses of the objects if there was no relaxing. */
2535 lang_size_sections (statement_list.head,
2536 abs_output_section,
2537 &(statement_list.head), 0, (bfd_vma) 0, false);
2538
2539
2540 reset_memory_regions ();
2541
2542 /* Keep relaxing until bfd_relax_section gives up. */
2543 do
2544 {
2545 relax_again = false;
2546
2547 /* Do all the assignments with our current guesses as to
2548 section sizes. */
2549 lang_do_assignments (statement_list.head,
2550 abs_output_section,
2551 (fill_type) 0, (bfd_vma) 0);
2552
2553 /* Perform another relax pass - this time we know where the
2554 globals are, so can make better guess. */
2555 lang_size_sections (statement_list.head,
2556 abs_output_section,
2557 &(statement_list.head), 0, (bfd_vma) 0, true);
2558 }
2559 while (relax_again);
2560 }
2561 else
2562 {
2563 /* Size up the sections. */
2564 lang_size_sections (statement_list.head,
2565 abs_output_section,
2566 &(statement_list.head), 0, (bfd_vma) 0, false);
2567 }
2568
2569 /* See if anything special should be done now we know how big
2570 everything is. */
2571 ldemul_after_allocation ();
2572
2573 /* Do all the assignments, now that we know the final restingplaces
2574 of all the symbols */
2575
2576 lang_do_assignments (statement_list.head,
2577 abs_output_section,
2578 (fill_type) 0, (bfd_vma) 0);
2579
2580 /* Make sure that we're not mixing architectures */
2581
2582 lang_check ();
2583
2584 /* Final stuffs */
2585
2586 ldemul_finish ();
2587 lang_finish ();
2588 }
2589
2590 /* EXPORTED TO YACC */
2591
2592 void
2593 lang_add_wild (section_name, filename)
2594 CONST char *CONST section_name;
2595 CONST char *CONST filename;
2596 {
2597 lang_wild_statement_type *new = new_stat (lang_wild_statement,
2598 stat_ptr);
2599
2600 if (section_name != (char *) NULL && strcmp (section_name, "COMMON") == 0)
2601 {
2602 placed_commons = true;
2603 }
2604 if (filename != (char *) NULL)
2605 {
2606 lang_has_input_file = true;
2607 }
2608 new->section_name = section_name;
2609 new->filename = filename;
2610 lang_list_init (&new->children);
2611 }
2612
2613 void
2614 lang_section_start (name, address)
2615 CONST char *name;
2616 etree_type * address;
2617 {
2618 lang_address_statement_type *ad = new_stat (lang_address_statement, stat_ptr);
2619
2620 ad->section_name = name;
2621 ad->address = address;
2622 }
2623
2624 void
2625 lang_add_entry (name)
2626 CONST char *name;
2627 {
2628 entry_symbol = name;
2629 }
2630
2631 void
2632 lang_add_target (name)
2633 CONST char *name;
2634 {
2635 lang_target_statement_type *new = new_stat (lang_target_statement,
2636 stat_ptr);
2637
2638 new->target = name;
2639
2640 }
2641
2642 void
2643 lang_add_map (name)
2644 CONST char *name;
2645 {
2646 while (*name)
2647 {
2648 switch (*name)
2649 {
2650 case 'F':
2651 map_option_f = true;
2652 break;
2653 }
2654 name++;
2655 }
2656 }
2657
2658 void
2659 lang_add_fill (exp)
2660 int exp;
2661 {
2662 lang_fill_statement_type *new = new_stat (lang_fill_statement,
2663 stat_ptr);
2664
2665 new->fill = exp;
2666 }
2667
2668 void
2669 lang_add_data (type, exp)
2670 int type;
2671 union etree_union *exp;
2672 {
2673
2674 lang_data_statement_type *new = new_stat (lang_data_statement,
2675 stat_ptr);
2676
2677 new->exp = exp;
2678 new->type = type;
2679
2680 }
2681
2682 /* Create a new reloc statement. RELOC is the BFD relocation type to
2683 generate. HOWTO is the corresponding howto structure (we could
2684 look this up, but the caller has already done so). SECTION is the
2685 section to generate a reloc against, or NAME is the name of the
2686 symbol to generate a reloc against. Exactly one of SECTION and
2687 NAME must be NULL. ADDEND is an expression for the addend. */
2688
2689 void
2690 lang_add_reloc (reloc, howto, section, name, addend)
2691 bfd_reloc_code_real_type reloc;
2692 const reloc_howto_type *howto;
2693 asection *section;
2694 const char *name;
2695 union etree_union *addend;
2696 {
2697 lang_reloc_statement_type *p = new_stat (lang_reloc_statement, stat_ptr);
2698
2699 p->reloc = reloc;
2700 p->howto = howto;
2701 p->section = section;
2702 p->name = name;
2703 p->addend_exp = addend;
2704
2705 p->addend_value = 0;
2706 p->output_section = NULL;
2707 p->output_vma = 0;
2708 }
2709
2710 void
2711 lang_add_assignment (exp)
2712 etree_type * exp;
2713 {
2714 lang_assignment_statement_type *new = new_stat (lang_assignment_statement,
2715 stat_ptr);
2716
2717 new->exp = exp;
2718 }
2719
2720 void
2721 lang_add_attribute (attribute)
2722 enum statement_enum attribute;
2723 {
2724 new_statement (attribute, sizeof (lang_statement_union_type), stat_ptr);
2725 }
2726
2727 void
2728 lang_startup (name)
2729 CONST char *name;
2730 {
2731 if (startup_file != (char *) NULL)
2732 {
2733 einfo ("%P%Fmultiple STARTUP files\n");
2734 }
2735 first_file->filename = name;
2736 first_file->local_sym_name = name;
2737 first_file->real = true;
2738
2739 startup_file = name;
2740 }
2741
2742 void
2743 lang_float (maybe)
2744 boolean maybe;
2745 {
2746 lang_float_flag = maybe;
2747 }
2748
2749 void
2750 lang_leave_output_section_statement (fill, memspec)
2751 bfd_vma fill;
2752 CONST char *memspec;
2753 {
2754 current_section->fill = fill;
2755 current_section->region = lang_memory_region_lookup (memspec);
2756 stat_ptr = &statement_list;
2757
2758 /* We remember if we are closing a .data section, since we use it to
2759 store constructors in */
2760 if (strcmp (current_section->name, ".data") == 0)
2761 {
2762 end_of_data_section_statement_list = statement_list;
2763
2764 }
2765 }
2766
2767 /*
2768 Create an absolute symbol with the given name with the value of the
2769 address of first byte of the section named.
2770
2771 If the symbol already exists, then do nothing.
2772 */
2773 void
2774 lang_abs_symbol_at_beginning_of (secname, name)
2775 const char *secname;
2776 const char *name;
2777 {
2778 struct bfd_link_hash_entry *h;
2779
2780 h = bfd_link_hash_lookup (link_info.hash, name, true, true, true);
2781 if (h == (struct bfd_link_hash_entry *) NULL)
2782 einfo ("%P%F: bfd_link_hash_lookup failed: %E\n");
2783
2784 if (h->type == bfd_link_hash_new
2785 || h->type == bfd_link_hash_undefined)
2786 {
2787 asection *sec;
2788
2789 h->type = bfd_link_hash_defined;
2790
2791 sec = bfd_get_section_by_name (output_bfd, secname);
2792 if (sec == (asection *) NULL)
2793 h->u.def.value = 0;
2794 else
2795 h->u.def.value = bfd_get_section_vma (output_bfd, sec);
2796
2797 h->u.def.section = &bfd_abs_section;
2798 }
2799 }
2800
2801 /*
2802 Create an absolute symbol with the given name with the value of the
2803 address of the first byte after the end of the section named.
2804
2805 If the symbol already exists, then do nothing.
2806 */
2807 void
2808 lang_abs_symbol_at_end_of (secname, name)
2809 const char *secname;
2810 const char *name;
2811 {
2812 struct bfd_link_hash_entry *h;
2813
2814 h = bfd_link_hash_lookup (link_info.hash, name, true, true, true);
2815 if (h == (struct bfd_link_hash_entry *) NULL)
2816 einfo ("%P%F: bfd_link_hash_lookup failed: %E\n");
2817
2818 if (h->type == bfd_link_hash_new
2819 || h->type == bfd_link_hash_undefined)
2820 {
2821 asection *sec;
2822
2823 h->type = bfd_link_hash_defined;
2824
2825 sec = bfd_get_section_by_name (output_bfd, secname);
2826 if (sec == (asection *) NULL)
2827 h->u.def.value = 0;
2828 else
2829 h->u.def.value = (bfd_get_section_vma (output_bfd, sec)
2830 + bfd_section_size (output_bfd, sec));
2831
2832 h->u.def.section = &bfd_abs_section;
2833 }
2834 }
2835
2836 void
2837 lang_statement_append (list, element, field)
2838 lang_statement_list_type * list;
2839 lang_statement_union_type * element;
2840 lang_statement_union_type ** field;
2841 {
2842 *(list->tail) = element;
2843 list->tail = field;
2844 }
2845
2846 /* Set the output format type. -oformat overrides scripts. */
2847 void
2848 lang_add_output_format (format, from_script)
2849 CONST char *format;
2850 int from_script;
2851 {
2852 if (output_target == NULL || !from_script)
2853 output_target = format;
2854 }