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