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