Initial revision
[deliverable/binutils-gdb.git] / ld / ldlang.c
CommitLineData
2fa0b342
DHW
1/* Copyright (C) 1991 Free Software Foundation, Inc.
2
3This file is part of GLD, the Gnu Linker.
4
5GLD is free software; you can redistribute it and/or modify
6it under the terms of the GNU General Public License as published by
7the Free Software Foundation; either version 1, or (at your option)
8any later version.
9
10GLD is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with GLD; see the file COPYING. If not, write to
17the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
18
19/* $Id$
20 *
2fa0b342
DHW
21*/
22
23
24
25#include "sysdep.h"
26#include "bfd.h"
27
28#include "ld.h"
29#include "ldmain.h"
30#include "ldsym.h"
31#include "ldgram.tab.h"
32#include "ldmisc.h"
33#include "ldlang.h"
34#include "ldexp.h"
35#include "ld-emul.h"
36#include "ldlex.h"
37
2fa0b342
DHW
38/* FORWARDS */
39PROTO(static void, print_statements,(void));
40PROTO(static void, print_statement,(lang_statement_union_type *,
41 lang_output_section_statement_type *));
42
43
d4c02e29
SC
44/* LOCALS */
45static CONST char *startup_file;
46static lang_statement_list_type input_file_chain;
47static boolean placed_commons = false;
48static lang_output_section_statement_type *default_common_section;
49static boolean map_option_f;
50static bfd_vma print_dot;
51static lang_input_statement_type *first_file;
52static lang_statement_list_type lang_output_section_statement;
53static CONST char *current_target;
54static CONST char *output_target;
55static size_t longest_section_name = 8;
56static asection common_section;
57static section_userdata_type common_section_userdata;
58static lang_statement_list_type statement_list;
2fa0b342 59/* EXPORTS */
2fa0b342 60
d4c02e29
SC
61lang_statement_list_type *stat_ptr = &statement_list;
62lang_input_statement_type *script_file = 0;
63boolean option_longmap = false;
64lang_statement_list_type file_chain = {0};
65CONST char *entry_symbol = 0;
66size_t largest_section = 0;
67boolean lang_has_input_file = false;
68lang_output_section_statement_type *create_object_symbols = 0;
69boolean had_output_filename = false;
70boolean lang_float_flag = false;
71/* IMPORTS */
72extern char *default_target;
2fa0b342 73
d4c02e29
SC
74extern unsigned int undefined_global_sym_count;
75extern char *current_file;
2fa0b342 76extern bfd *output_bfd;
2fa0b342
DHW
77extern enum bfd_architecture ldfile_output_architecture;
78extern unsigned long ldfile_output_machine;
79extern char *ldfile_output_machine_name;
2fa0b342 80extern ldsym_type *symbol_head;
d4c02e29 81extern unsigned int commons_pending;
2fa0b342
DHW
82extern args_type command_line;
83extern ld_config_type config;
2fa0b342 84extern boolean had_script;
2fa0b342
DHW
85extern boolean write_map;
86
87
2fa0b342
DHW
88#ifdef __STDC__
89#define cat(a,b) a##b
90#else
91#define cat(a,b) a/**/b
92#endif
93
94#define new_stat(x,y) (cat(x,_type)*) new_statement(cat(x,_enum), sizeof(cat(x,_type)),y)
95
96#define outside_section_address(q) ( (q)->output_offset + (q)->output_section->vma)
97
98#define outside_symbol_address(q) ((q)->value + outside_section_address(q->section))
99
d4c02e29 100
2fa0b342 101
1418c83b
SC
102/*----------------------------------------------------------------------
103 lang_for_each_statement walks the parse tree and calls the provided
104 function for each node
105*/
106
107static void
108DEFUN(lang_for_each_statement_worker,(func, s),
109 void (*func)() AND
110 lang_statement_union_type *s)
111{
112 for (; s != (lang_statement_union_type *)NULL ; s = s->next)
113 {
114 func(s);
115
116 switch (s->header.type) {
117 case lang_output_section_statement_enum:
118 lang_for_each_statement_worker
119 (func,
120 s->output_section_statement.children.head);
121 break;
122 case lang_wild_statement_enum:
123 lang_for_each_statement_worker
124 (func,
125 s->wild_statement.children.head);
126 break;
127 case lang_data_statement_enum:
128 case lang_object_symbols_statement_enum:
129 case lang_output_statement_enum:
130 case lang_target_statement_enum:
131 case lang_input_section_enum:
132 case lang_input_statement_enum:
133 case lang_fill_statement_enum:
134 case lang_assignment_statement_enum:
135 case lang_padding_statement_enum:
136 case lang_address_statement_enum:
137 break;
138 default:
139 FAIL();
140 break;
141 }
142 }
143}
144
145void
146DEFUN(lang_for_each_statement,(func),
147 void (*func)())
148{
149 lang_for_each_statement_worker(func,
150 statement_list.head);
151}
152/*----------------------------------------------------------------------*/
153static void
154DEFUN(lang_list_init,(list),
155 lang_statement_list_type *list)
2fa0b342
DHW
156{
157list->head = (lang_statement_union_type *)NULL;
158list->tail = &list->head;
159}
160
1418c83b
SC
161/*----------------------------------------------------------------------
162 Functions to print the link map
163 */
164
2fa0b342 165static void
1418c83b
SC
166DEFUN(print_section,(name),
167 CONST char *CONST name)
2fa0b342
DHW
168{
169 printf("%*s", -longest_section_name, name);
170}
171static void
1418c83b 172DEFUN_VOID(print_space)
2fa0b342
DHW
173{
174 printf(" ");
175}
176static void
1418c83b 177DEFUN_VOID(print_nl)
2fa0b342
DHW
178{
179 printf("\n");
180}
181static void
1418c83b
SC
182DEFUN(print_address,(value),
183 bfd_vma value)
2fa0b342
DHW
184{
185 printf("%8lx", value);
186}
187static void
1418c83b
SC
188DEFUN(print_size,(value),
189 size_t value)
2fa0b342
DHW
190{
191 printf("%5x", (unsigned)value);
192}
193static void
1418c83b
SC
194DEFUN(print_alignment,(value),
195 unsigned int value)
2fa0b342
DHW
196{
197 printf("2**%2u",value);
198}
1418c83b 199
2fa0b342 200static void
1418c83b
SC
201DEFUN(print_fill,(value),
202 fill_type value)
2fa0b342
DHW
203{
204 printf("%04x",(unsigned)value);
205}
206
1418c83b
SC
207/*----------------------------------------------------------------------
208
209 build a new statement node for the parse tree
210
211 */
2fa0b342
DHW
212
213static
1418c83b
SC
214lang_statement_union_type*
215DEFUN(new_statement,(type, size, list),
216 enum statement_enum type AND
217 size_t size AND
218 lang_statement_list_type *list)
2fa0b342
DHW
219{
220 lang_statement_union_type *new = (lang_statement_union_type *)
221 ldmalloc(size);
222 new->header.type = type;
223 new->header.next = (lang_statement_union_type *)NULL;
1418c83b 224 lang_statement_append(list, new, &new->header.next);
2fa0b342
DHW
225 return new;
226}
227
1418c83b
SC
228/*
229 Build a new input file node for the language. There are several ways
230 in which we treat an input file, eg, we only look at symbols, or
231 prefix it with a -l etc.
232
233 We can be supplied with requests for input files more than once;
234 they may, for example be split over serveral lines like foo.o(.text)
235 foo.o(.data) etc, so when asked for a file we check that we havn't
236 got it already so we don't duplicate the bfd.
237
238 */
2fa0b342 239static lang_input_statement_type *
1418c83b
SC
240DEFUN(new_afile, (name, file_type, target),
241 CONST char *CONST name AND
242 CONST lang_input_file_enum_type file_type AND
243 CONST char *CONST target)
2fa0b342
DHW
244{
245 lang_input_statement_type *p = new_stat(lang_input_statement,
246 stat_ptr);
247 lang_has_input_file = true;
248 p->target = target;
249 switch (file_type) {
250 case lang_input_file_is_symbols_only_enum:
251 p->filename = name;
252 p->is_archive =false;
253 p->real = true;
254 p->local_sym_name= name;
255 p->just_syms_flag = true;
256 p->search_dirs_flag = false;
257 break;
258 case lang_input_file_is_fake_enum:
259 p->filename = name;
260 p->is_archive =false;
261 p->real = false;
262 p->local_sym_name= name;
263 p->just_syms_flag = false;
264 p->search_dirs_flag =false;
2fa0b342
DHW
265 break;
266 case lang_input_file_is_l_enum:
267 p->is_archive = true;
268 p->filename = name;
269 p->real = true;
270 p->local_sym_name = concat("-l",name,"");
271 p->just_syms_flag = false;
272 p->search_dirs_flag = true;
273 break;
2fa0b342
DHW
274 case lang_input_file_is_search_file_enum:
275 case lang_input_file_is_marker_enum:
276 p->filename = name;
277 p->is_archive =false;
278 p->real = true;
279 p->local_sym_name= name;
280 p->just_syms_flag = false;
281 p->search_dirs_flag =true;
282 break;
2fa0b342
DHW
283 case lang_input_file_is_file_enum:
284 p->filename = name;
285 p->is_archive =false;
286 p->real = true;
287 p->local_sym_name= name;
288 p->just_syms_flag = false;
289 p->search_dirs_flag =false;
290 break;
2fa0b342
DHW
291 default:
292 FAIL();
293 }
294 p->asymbols = (asymbol **)NULL;
295 p->superfile = (lang_input_statement_type *)NULL;
2fa0b342
DHW
296 p->next_real_file = (lang_statement_union_type*)NULL;
297 p->next = (lang_statement_union_type*)NULL;
298 p->symbol_count = 0;
299 p->common_output_section = (asection *)NULL;
2fa0b342
DHW
300 lang_statement_append(&input_file_chain,
301 (lang_statement_union_type *)p,
302 &p->next_real_file);
303 return p;
304}
305
1418c83b
SC
306
307
2fa0b342 308lang_input_statement_type *
1418c83b
SC
309DEFUN(lang_add_input_file,(name, file_type, target),
310 char *name AND
311 lang_input_file_enum_type file_type AND
312 char *target)
2fa0b342
DHW
313{
314 /* Look it up or build a new one */
1418c83b
SC
315 lang_has_input_file = true;
316#if 0
2fa0b342
DHW
317 lang_input_statement_type *p;
318
319 for (p = (lang_input_statement_type *)input_file_chain.head;
320 p != (lang_input_statement_type *)NULL;
321 p = (lang_input_statement_type *)(p->next_real_file))
1418c83b
SC
322 {
323 /* Sometimes we have incomplete entries in here */
324 if (p->filename != (char *)NULL) {
325 if(strcmp(name,p->filename) == 0) return p;
326 }
327
328 }
329#endif
2fa0b342
DHW
330 return new_afile(name, file_type, target);
331}
332
333
1418c83b 334/* Build enough state so that the parser can build its tree */
2fa0b342 335void
1418c83b 336DEFUN_VOID(lang_init)
2fa0b342
DHW
337{
338
339 stat_ptr= &statement_list;
340 lang_list_init(stat_ptr);
341
342 lang_list_init(&input_file_chain);
343 lang_list_init(&lang_output_section_statement);
344 lang_list_init(&file_chain);
345 first_file = lang_add_input_file((char *)NULL,
346 lang_input_file_is_marker_enum,
347 (char *)NULL);
2fa0b342
DHW
348}
349
2fa0b342 350
1418c83b
SC
351/*----------------------------------------------------------------------
352 A region is an area of memory declared with the
353 MEMORY { name:org=exp, len=exp ... }
354 syntax.
2fa0b342 355
1418c83b 356 We maintain a list of all the regions here
2fa0b342 357
1418c83b
SC
358 If no regions are specified in the script, then the default is used
359 which is created when looked up to be the entire data space
2fa0b342
DHW
360*/
361
362static lang_memory_region_type *lang_memory_region_list;
363static lang_memory_region_type **lang_memory_region_list_tail = &lang_memory_region_list;
364
365lang_memory_region_type *
1418c83b
SC
366DEFUN(lang_memory_region_lookup,(name),
367 CONST char *CONST name)
2fa0b342
DHW
368{
369
1418c83b
SC
370 lang_memory_region_type *p = lang_memory_region_list;
371 for (p = lang_memory_region_list;
372 p != ( lang_memory_region_type *)NULL;
373 p = p->next) {
374 if (strcmp(p->name, name) == 0) {
375 return p;
2fa0b342 376 }
1418c83b
SC
377 }
378 if (strcmp(name,"*default*")==0) {
379 /* This is the default region, dig out first one on the list */
380 if (lang_memory_region_list != (lang_memory_region_type*)NULL){
381 return lang_memory_region_list;
2fa0b342 382 }
1418c83b 383 }
2fa0b342 384 {
1418c83b
SC
385 lang_memory_region_type *new =
386 (lang_memory_region_type *)ldmalloc(sizeof(lang_memory_region_type));
387 new->name = buystring(name);
388 new->next = (lang_memory_region_type *)NULL;
389
390 *lang_memory_region_list_tail = new;
391 lang_memory_region_list_tail = &new->next;
392 new->origin = 0;
393 new->length = ~0;
394 new->current = 0;
395 return new;
2fa0b342
DHW
396 }
397}
398
399
2fa0b342 400lang_output_section_statement_type *
1418c83b
SC
401DEFUN(lang_output_section_find,(name),
402 CONST char * CONST name)
2fa0b342
DHW
403{
404 lang_statement_union_type *u;
405 lang_output_section_statement_type *lookup;
406
407 for (u = lang_output_section_statement.head;
408 u != (lang_statement_union_type *)NULL;
409 u = lookup->next)
1418c83b
SC
410 {
411 lookup = &u->output_section_statement;
412 if (strcmp(name, lookup->name)==0) {
413 return lookup;
414 }
2fa0b342 415 }
2fa0b342
DHW
416 return (lang_output_section_statement_type *)NULL;
417}
418
419lang_output_section_statement_type *
1418c83b
SC
420DEFUN(lang_output_section_statement_lookup,(name),
421 CONST char * CONST name)
2fa0b342
DHW
422{
423 lang_output_section_statement_type *lookup;
424 lookup =lang_output_section_find(name);
425 if (lookup == (lang_output_section_statement_type *)NULL) {
426
427 lookup =(lang_output_section_statement_type *)
428 new_stat(lang_output_section_statement, stat_ptr);
429 lookup->region = (lang_memory_region_type *)NULL;
430 lookup->fill = 0;
431 lookup->block_value = 1;
432 lookup->name = name;
433
434 lookup->next = (lang_statement_union_type*)NULL;
435 lookup->bfd_section = (asection *)NULL;
436 lookup->processed = false;
437 lookup->addr_tree = (etree_type *)NULL;
438 lang_list_init(&lookup->children);
439
440 lang_statement_append(&lang_output_section_statement,
441 (lang_statement_union_type *)lookup,
442 &lookup->next);
443 }
444 return lookup;
445}
446
447
448
449
450
451static void
1418c83b
SC
452DEFUN(print_flags, (outfile, ignore_flags),
453 FILE *outfile AND
454 lang_section_flags_type *ignore_flags)
2fa0b342
DHW
455{
456 fprintf(outfile,"(");
457#if 0
458 if (flags->flag_read) fprintf(outfile,"R");
459 if (flags->flag_write) fprintf(outfile,"W");
460 if (flags->flag_executable) fprintf(outfile,"X");
461 if (flags->flag_loadable) fprintf(outfile,"L");
462#endif
463 fprintf(outfile,")");
464}
465
466void
1418c83b
SC
467DEFUN(lang_map,(outfile),
468 FILE *outfile)
2fa0b342
DHW
469{
470 lang_memory_region_type *m;
471 fprintf(outfile,"**MEMORY CONFIGURATION**\n\n");
472
473 fprintf(outfile,"name\t\torigin\t\tlength\t\tattributes\n");
474 for (m = lang_memory_region_list;
475 m != (lang_memory_region_type *)NULL;
476 m = m->next)
477 {
478 fprintf(outfile,"%-16s", m->name);
479
480 fprintf(outfile,"%08lx\t%08lx\t", m->origin, m->length);
481 print_flags(outfile, &m->flags);
482 fprintf(outfile,"\n");
483 }
484 fprintf(outfile,"\n\n**LINK EDITOR MEMORY MAP**\n\n");
485 fprintf(outfile,"output\t\tinput\t\tvirtual\n");
486 fprintf(outfile,"section\t\tsection\t\taddress\tsize\n\n");
487
488 print_statements();
489
490}
491
492/*
493 *
494 */
1418c83b
SC
495static void
496DEFUN(init_os,(s),
497 lang_output_section_statement_type *s)
2fa0b342
DHW
498{
499 section_userdata_type *new =
500 (section_userdata_type *)
501 ldmalloc(sizeof(section_userdata_type));
502
503 s->bfd_section = bfd_make_section(output_bfd, s->name);
504 s->bfd_section->output_section = s->bfd_section;
505 s->bfd_section->flags = SEC_NO_FLAGS;
506 /* We initialize an output sections output offset to minus its own */
507 /* vma to allow us to output a section through itself */
508 s->bfd_section->output_offset = 0;
509 get_userdata( s->bfd_section) = new;
510}
511
1418c83b
SC
512/***********************************************************************
513 The wild routines.
514
515 These expand statements like *(.text) and foo.o to a list of
516 explicit actions, like foo.o(.text), bar.o(.text) and
517 foo.o(.text,.data) .
518
519 The toplevel routine, wild, takes a statement, section, file and
520 target. If either the section or file is null it is taken to be the
521 wildcard. Seperate lang_input_section statements are created for
522 each part of the expanstion, and placed after the statement provided.
523
524*/
525
2fa0b342 526static void
1418c83b
SC
527DEFUN(wild_doit,(ptr, section, output, file),
528 lang_statement_list_type *ptr AND
529 asection *section AND
530 lang_output_section_statement_type *output AND
531 lang_input_statement_type *file)
2fa0b342
DHW
532{
533 if(output->bfd_section == (asection *)NULL)
534 {
535 init_os(output);
536 }
537
538 if (section != (asection *)NULL
539 && section->output_section == (asection *)NULL) {
540 /* Add a section reference to the list */
541 lang_input_section_type *new = new_stat(lang_input_section, ptr);
542
543 new->section = section;
544 new->ifile = file;
545 section->output_section = output->bfd_section;
546 section->output_section->flags |= section->flags;
547 if (section->alignment_power > output->bfd_section->alignment_power) {
548 output->bfd_section->alignment_power = section->alignment_power;
549 }
2fa0b342
DHW
550 }
551}
552
553static asection *
1418c83b
SC
554DEFUN(our_bfd_get_section_by_name,(abfd, section),
555bfd *abfd AND
556CONST char *section)
2fa0b342
DHW
557{
558 return bfd_get_section_by_name(abfd, section);
2fa0b342 559}
1418c83b 560
2fa0b342 561static void
1418c83b
SC
562DEFUN(wild_section,(ptr, section, file , output),
563 lang_wild_statement_type *ptr AND
564 CONST char *section AND
565 lang_input_statement_type *file AND
566 lang_output_section_statement_type *output)
2fa0b342
DHW
567{
568 asection *s;
1418c83b
SC
569 if (file->just_syms_flag == false) {
570 if (section == (char *)NULL) {
571 /* Do the creation to all sections in the file */
572 for (s = file->the_bfd->sections; s != (asection *)NULL; s=s->next) {
573 wild_doit(&ptr->children, s, output, file);
574 }
575 }
576 else {
577 /* Do the creation to the named section only */
578 wild_doit(&ptr->children,
579 our_bfd_get_section_by_name(file->the_bfd, section),
580 output, file);
2fa0b342
DHW
581 }
582 }
2fa0b342
DHW
583}
584
585
1418c83b
SC
586/* passed a file name (which must have been seen already and added to
587 the statement tree. We will see if it has been opened already and
588 had its symbols read. If not then we'll read it.
2fa0b342 589
1418c83b
SC
590 Archives are pecuilar here. We may open them once, but if they do
591 not define anything we need at the time, they won't have all their
592 symbols read. If we need them later, we'll have to redo it.
593 */
2fa0b342 594static
1418c83b
SC
595lang_input_statement_type *
596DEFUN(lookup_name,(name),
597 CONST char * CONST name)
2fa0b342
DHW
598{
599 lang_input_statement_type *search;
600 for(search = (lang_input_statement_type *)input_file_chain.head;
601 search != (lang_input_statement_type *)NULL;
602 search = (lang_input_statement_type *)search->next_real_file)
1418c83b
SC
603 {
604 if (search->filename == (char *)NULL && name == (char *)NULL) {
2fa0b342
DHW
605 return search;
606 }
1418c83b
SC
607 if (search->filename != (char *)NULL && name != (char *)NULL) {
608 if (strcmp(search->filename, name) == 0) {
609 ldmain_open_file_read_symbol(search);
610 return search;
611 }
612 }
2fa0b342 613 }
2fa0b342 614
1418c83b
SC
615 /* There isn't an afile entry for this file yet, this must be
616 because the name has only appeared inside a load script and not
617 on the command line */
618 search = new_afile(name, lang_input_file_is_file_enum, default_target);
619 ldmain_open_file_read_symbol(search);
2fa0b342 620 return search;
1418c83b
SC
621
622
2fa0b342
DHW
623}
624
625static void
1418c83b
SC
626DEFUN(wild,(s, section, file, target, output),
627 lang_wild_statement_type *s AND
628 CONST char *CONST section AND
629 CONST char *CONST file AND
630 CONST char *CONST target AND
631 lang_output_section_statement_type *output)
2fa0b342
DHW
632{
633 lang_input_statement_type *f;
634 if (file == (char *)NULL) {
635 /* Perform the iteration over all files in the list */
636 for (f = (lang_input_statement_type *)file_chain.head;
637 f != (lang_input_statement_type *)NULL;
638 f = (lang_input_statement_type *)f->next) {
639 wild_section(s, section, f, output);
640 }
641 }
642 else {
643 /* Perform the iteration over a single file */
1418c83b 644 wild_section( s, section, lookup_name(file), output);
2fa0b342 645 }
b0f36869
SC
646 if (section != (char *)NULL
647 && strcmp(section,"COMMON") == 0
1418c83b
SC
648 && default_common_section == (lang_output_section_statement_type*)NULL)
649 {
650 /* Remember the section that common is going to incase we later
651 get something which doesn't know where to put it */
652 default_common_section = output;
653 }
2fa0b342
DHW
654}
655
656/*
657 read in all the files
658 */
659static bfd *
097879bc
SC
660DEFUN(open_output,(name),
661 CONST char *CONST name)
2fa0b342 662{
1418c83b 663 extern CONST char *output_filename;
097879bc
SC
664 bfd *output;
665 if (output_target == (char *)NULL) {
666 if (current_target != (char *)NULL)
667 output_target = current_target;
668 else
669 output_target = default_target;
670 }
671 output = bfd_openw(name, output_target);
2fa0b342 672 output_filename = name;
097879bc 673
2fa0b342 674 if (output == (bfd *)NULL)
1418c83b
SC
675 {
676 if (bfd_error == invalid_target) {
097879bc 677 info("%P%F target %s not found\n", output_target);
1418c83b
SC
678 }
679 info("%P%F problem opening output file %s, %E", name);
2fa0b342 680 }
2fa0b342
DHW
681
682 output->flags |= D_PAGED;
683 bfd_set_format(output, bfd_object);
684 return output;
685}
1418c83b
SC
686
687
097879bc 688
1418c83b 689
2fa0b342 690static void
1418c83b
SC
691DEFUN(ldlang_open_output,(statement),
692 lang_statement_union_type *statement)
2fa0b342 693{
1418c83b
SC
694 switch (statement->header.type)
695 {
696 case lang_output_statement_enum:
097879bc 697 output_bfd = open_output(statement->output_statement.name);
2fa0b342 698 ldemul_set_output_arch();
2fa0b342 699 break;
1418c83b 700
2fa0b342 701 case lang_target_statement_enum:
1418c83b 702 current_target = statement->target_statement.target;
2fa0b342 703 break;
1418c83b 704 default:
2fa0b342 705 break;
1418c83b
SC
706 }
707}
2fa0b342 708
1418c83b
SC
709static void
710DEFUN(open_input_bfds,(statement),
711 lang_statement_union_type *statement)
712{
713 switch (statement->header.type)
714 {
715 case lang_target_statement_enum:
716 current_target = statement->target_statement.target;
2fa0b342 717 break;
1418c83b
SC
718 case lang_wild_statement_enum:
719 /* Maybe we should load the file's symbols */
720 if (statement->wild_statement.filename)
721 {
722 (void) lookup_name(statement->wild_statement.filename);
723 }
2fa0b342 724 break;
1418c83b
SC
725 case lang_input_statement_enum:
726 if (statement->input_statement.real == true)
727 {
728 statement->input_statement.target = current_target;
729 lookup_name(statement->input_statement.filename);
730 }
2fa0b342 731 break;
1418c83b 732 default:
2fa0b342
DHW
733 break;
734 }
2fa0b342 735}
2fa0b342
DHW
736/* If there are [COMMONS] statements, put a wild one into the bss section */
737
738static void
739lang_reasonable_defaults()
740{
1418c83b 741#if 0
8cb5eb31
SC
742 lang_output_section_statement_lookup(".text");
743 lang_output_section_statement_lookup(".data");
744
2fa0b342
DHW
745 default_common_section =
746 lang_output_section_statement_lookup(".bss");
8cb5eb31 747
1418c83b 748
2fa0b342
DHW
749 if (placed_commons == false) {
750 lang_wild_statement_type *new =
751 new_stat(lang_wild_statement,
752 &default_common_section->children);
753 new->section_name = "COMMON";
754 new->filename = (char *)NULL;
755 lang_list_init(&new->children);
756 }
1418c83b 757#endif
8cb5eb31 758
2fa0b342
DHW
759}
760
1418c83b
SC
761/*
762 Add the supplied name to the symbol table as an undefined reference.
763 Remove items from the chain as we open input bfds
764 */
765typedef struct ldlang_undef_chain_list_struct {
766 struct ldlang_undef_chain_list_struct *next;
767 char *name;
768} ldlang_undef_chain_list_type;
769
770static ldlang_undef_chain_list_type *ldlang_undef_chain_list_head;
771
772void
773DEFUN(ldlang_add_undef,(name),
774 CONST char *CONST name)
2fa0b342 775{
1418c83b
SC
776 ldlang_undef_chain_list_type *new =
777 (ldlang_undef_chain_list_type
778 *)ldmalloc(sizeof(ldlang_undef_chain_list_type));
779
780 new->next = ldlang_undef_chain_list_head;
781 ldlang_undef_chain_list_head = new;
782
783 new->name = buystring(name);
784}
785/* Run through the list of undefineds created above and place them
786 into the linker hash table as undefined symbols belonging to the
787 script file.
788*/
789static void
790DEFUN_VOID(lang_place_undefineds)
791{
792 ldlang_undef_chain_list_type *ptr = ldlang_undef_chain_list_head;
793 while (ptr != (ldlang_undef_chain_list_type*)NULL) {
794 ldsym_type *sy = ldsym_get(ptr->name);
795 asymbol *def;
796 asymbol **def_ptr = (asymbol **)ldmalloc(sizeof(asymbol **));
797 def = (asymbol *)bfd_make_empty_symbol(script_file->the_bfd);
798 *def_ptr= def;
799 def->name = ptr->name;
800 def->flags = BSF_UNDEFINED;
801 def->section = (asection *)NULL;
802 Q_enter_global_ref(def_ptr);
803 ptr = ptr->next;
2fa0b342 804 }
1418c83b 805}
2fa0b342 806
1418c83b
SC
807
808
809/* Copy important data from out internal form to the bfd way. Also
810 create a section for the dummy file
811 */
812
813static void
814DEFUN_VOID(lang_create_output_section_statements)
815{
816 lang_statement_union_type*os;
817 for (os = lang_output_section_statement.head;
818 os != (lang_statement_union_type*)NULL;
819 os = os->output_section_statement.next) {
820 lang_output_section_statement_type *s =
821 &os->output_section_statement;
822 init_os(s);
823 }
824
825}
826
827static void
828DEFUN_VOID(lang_init_script_file)
829{
830 script_file = lang_add_input_file("script file",
831 lang_input_file_is_fake_enum,
832 (char *)NULL);
833 script_file->the_bfd = bfd_create("script file", output_bfd);
834 script_file->symbol_count = 0;
835 script_file->the_bfd->sections = output_bfd->sections;
2fa0b342
DHW
836}
837
838
1418c83b
SC
839
840
2fa0b342
DHW
841/* Open input files and attatch to output sections */
842static void
1418c83b
SC
843DEFUN(map_input_to_output_sections,(s, target, output_section_statement),
844 lang_statement_union_type *s AND
845 CONST char *target AND
846 lang_output_section_statement_type *output_section_statement)
2fa0b342
DHW
847{
848 for (; s != (lang_statement_union_type *)NULL ; s = s->next)
849 {
850 switch (s->header.type) {
851 case lang_wild_statement_enum:
852 wild(&s->wild_statement, s->wild_statement.section_name,
853 s->wild_statement.filename, target,
854 output_section_statement);
855
856 break;
857
858 case lang_output_section_statement_enum:
1418c83b 859 map_input_to_output_sections(s->output_section_statement.children.head,
2fa0b342
DHW
860 target,
861 &s->output_section_statement);
862 break;
863 case lang_output_statement_enum:
864 break;
865 case lang_target_statement_enum:
866 target = s->target_statement.target;
867 break;
2fa0b342
DHW
868 case lang_fill_statement_enum:
869 case lang_input_section_enum:
870 case lang_object_symbols_statement_enum:
871 case lang_data_statement_enum:
1418c83b
SC
872 case lang_assignment_statement_enum:
873 case lang_padding_statement_enum:
2fa0b342
DHW
874 break;
875 case lang_afile_asection_pair_statement_enum:
876 FAIL();
877 break;
2fa0b342
DHW
878 case lang_address_statement_enum:
879 /* Mark the specified section with the supplied address */
880 {
881 lang_output_section_statement_type *os =
882 lang_output_section_statement_lookup
883 (s->address_statement.section_name);
884 os->addr_tree = s->address_statement.address;
885 }
886 break;
887 case lang_input_statement_enum:
888 /* A standard input statement, has no wildcards */
1418c83b 889 /* ldmain_open_file_read_symbol(&s->input_statement);*/
2fa0b342
DHW
890 break;
891 }
892 }
893}
894
895
896
897
898
899static void
1418c83b
SC
900DEFUN(print_output_section_statement,(output_section_statement),
901 lang_output_section_statement_type *output_section_statement)
2fa0b342
DHW
902{
903 asection *section = output_section_statement->bfd_section;
904 print_nl();
905 print_section(output_section_statement->name);
906
907 if (section) {
908 print_dot = section->vma;
909 print_space();
910 print_section("");
911 print_space();
912 print_address(section->vma);
913 print_space();
914 print_size(section->size);
915 print_space();
916 print_alignment(section->alignment_power);
917 print_space();
918#if 0
919 printf("%s flags", output_section_statement->region->name);
920 print_flags(stdout, &output_section_statement->flags);
921#endif
922
923 }
924 else {
925 printf("No attached output section");
926 }
927 print_nl();
928 print_statement(output_section_statement->children.head,
929 output_section_statement);
930
931}
932
933static void
1418c83b
SC
934DEFUN(print_assignment,(assignment, output_section),
935 lang_assignment_statement_type *assignment AND
936 lang_output_section_statement_type *output_section)
2fa0b342
DHW
937{
938 etree_value_type result;
939 print_section("");
940 print_space();
941 print_section("");
942 print_space();
943 print_address(print_dot);
944 print_space();
945 result = exp_fold_tree(assignment->exp->assign.src,
946 output_section,
947 lang_final_phase_enum,
948 print_dot,
949 &print_dot);
950
951 if (result.valid) {
952 print_address(result.value);
953 }
954 else
1418c83b
SC
955 {
956 printf("*undefined*");
957 }
2fa0b342
DHW
958 print_space();
959 exp_print_tree(stdout, assignment->exp);
960 printf("\n");
961}
962
963static void
1418c83b
SC
964DEFUN(print_input_statement,(statm),
965 lang_input_statement_type *statm)
2fa0b342 966{
070aa819
SC
967 if (statm->filename != (char *)NULL) {
968 printf("LOAD %s\n",statm->filename);
969 }
2fa0b342
DHW
970}
971
1418c83b
SC
972static void
973DEFUN(print_symbol,(q),
974 asymbol *q)
2fa0b342
DHW
975{
976 print_section("");
977 printf(" ");
978 print_section("");
979 printf(" ");
980 print_address(outside_symbol_address(q));
981 printf(" %s", q->name ? q->name : " ");
982 print_nl();
983}
1418c83b 984
2fa0b342 985static void
1418c83b
SC
986DEFUN(print_input_section,(in),
987 lang_input_section_type *in)
2fa0b342
DHW
988{
989 asection *i = in->section;
990
991 if(i->size != 0) {
992 print_section("");
993 printf(" ");
994 print_section(i->name);
995 printf(" ");
996 if (i->output_section) {
997 print_address(i->output_section->vma + i->output_offset);
998 printf(" ");
999 print_size(i->size);
1000 printf(" ");
1001 print_alignment(i->alignment_power);
1002 printf(" ");
1003 if (in->ifile) {
1418c83b 1004
2fa0b342 1005 bfd *abfd = in->ifile->the_bfd;
1418c83b
SC
1006 if (in->ifile->just_syms_flag == true) {
1007 printf("symbols only ");
1008 }
1009
2fa0b342
DHW
1010 printf(" %s ",abfd->xvec->name);
1011 if(abfd->my_archive != (bfd *)NULL) {
1012 printf("[%s]%s", abfd->my_archive->filename,
1013 abfd->filename);
1014 }
1015 else {
1016 printf("%s", abfd->filename);
1017 }
1018 print_nl();
1019
1020 /* Find all the symbols in this file defined in this section */
1418c83b
SC
1021 {
1022 asymbol **p;
1023 for (p = in->ifile->asymbols; *p; p++) {
1024 asymbol *q = *p;
2fa0b342 1025
1418c83b
SC
1026 if (bfd_get_section(q) == i && q->flags & BSF_GLOBAL) {
1027 print_symbol(q);
1028 }
2fa0b342
DHW
1029 }
1030 }
2fa0b342
DHW
1031 }
1032 else {
1033 print_nl();
1034 }
1035
1036
1037 print_dot = outside_section_address(i) + i->size;
1038 }
1039 else {
1040 printf("No output section allocated\n");
1041 }
1042 }
1043}
2fa0b342 1044
2fa0b342 1045static void
1418c83b
SC
1046DEFUN(print_fill_statement,(fill),
1047 lang_fill_statement_type *fill)
2fa0b342
DHW
1048{
1049 printf("FILL mask ");
1050 print_fill( fill->fill);
1051}
1052
1053static void
1418c83b
SC
1054DEFUN(print_data_statement,(data),
1055 lang_data_statement_type *data)
2fa0b342
DHW
1056{
1057/* bfd_vma value; */
1058 print_section("");
1059 print_space();
1060 print_section("");
1061 print_space();
1062 ASSERT(print_dot == data->output_vma);
1063
1064 print_address(data->output_vma);
1065 print_space();
1066 print_address(data->value);
1067 print_space();
1068 switch (data->type) {
1069 case BYTE :
1070 printf("BYTE ");
1071 print_dot += BYTE_SIZE;
1072 break;
1073 case SHORT:
1074 printf("SHORT ");
1075 print_dot += SHORT_SIZE;
1076 break;
1077 case LONG:
1078 printf("LONG ");
1079 print_dot += LONG_SIZE;
1080 break;
1081 }
1082
1083 exp_print_tree(stdout, data->exp);
1084
1085 printf("\n");
1086}
1087
1088
1089static void
1418c83b
SC
1090DEFUN(print_padding_statement,(s),
1091 lang_padding_statement_type *s)
2fa0b342
DHW
1092{
1093 print_section("");
1094 print_space();
1095 print_section("*fill*");
1096 print_space();
1097 print_address(s->output_offset + s->output_section->vma);
1098 print_space();
1099 print_size(s->size);
1100 print_space();
1101 print_fill(s->fill);
1102 print_nl();
1103}
1104
1418c83b
SC
1105static void
1106DEFUN(print_wild_statement,(w,os),
1107 lang_wild_statement_type *w AND
1108 lang_output_section_statement_type *os)
2fa0b342
DHW
1109{
1110 if (w->filename != (char *)NULL) {
1111 printf("%s",w->filename);
1112 }
1113 else {
1114 printf("*");
1115 }
1116 if (w->section_name != (char *)NULL) {
1117 printf("(%s)",w->section_name);
1118 }
1119 else {
1120 printf("(*)");
1121 }
1122 print_nl();
1123 print_statement(w->children.head, os);
1124
1125}
1126static void
1418c83b
SC
1127DEFUN(print_statement,(s, os),
1128 lang_statement_union_type *s AND
1129 lang_output_section_statement_type *os)
2fa0b342
DHW
1130{
1131 while (s) {
1132 switch (s->header.type) {
1133 case lang_wild_statement_enum:
1418c83b
SC
1134 print_wild_statement(&s->wild_statement, os);
1135 break;
2fa0b342 1136 default:
1418c83b 1137 printf("Fail with %d\n",s->header.type);
2fa0b342
DHW
1138 FAIL();
1139 break;
1418c83b
SC
1140 case lang_address_statement_enum:
1141 printf("address\n");
1142 break;
2fa0b342
DHW
1143 break;
1144 case lang_object_symbols_statement_enum:
1145 printf("object symbols\n");
1146 break;
1147 case lang_fill_statement_enum:
1148 print_fill_statement(&s->fill_statement);
1149 break;
1150 case lang_data_statement_enum:
1151 print_data_statement(&s->data_statement);
1152 break;
2fa0b342
DHW
1153 case lang_input_section_enum:
1154 print_input_section(&s->input_section);
1155 break;
1156 case lang_padding_statement_enum:
1157 print_padding_statement(&s->padding_statement);
1158 break;
1159 case lang_output_section_statement_enum:
1160 print_output_section_statement(&s->output_section_statement);
1161 break;
1162 case lang_assignment_statement_enum:
1163 print_assignment(&s->assignment_statement,
1418c83b 1164 os);
2fa0b342
DHW
1165 break;
1166
1167
1168 case lang_target_statement_enum:
1169 printf("TARGET(%s)\n", s->target_statement.target);
1170 break;
1171 case lang_output_statement_enum:
097879bc
SC
1172 printf("OUTPUT(%s %s)\n",
1173 s->output_statement.name,
1174 output_target);
2fa0b342
DHW
1175 break;
1176 case lang_input_statement_enum:
1177 print_input_statement(&s->input_statement);
1178 break;
1179 case lang_afile_asection_pair_statement_enum:
1180 FAIL();
1181 break;
1182 }
1183 s = s->next;
1184 }
1185}
1186
1187
1188static void
1418c83b 1189DEFUN_VOID(print_statements)
2fa0b342
DHW
1190{
1191 print_statement(statement_list.head,
1192 (lang_output_section_statement_type *)NULL);
1193}
1194
1195static bfd_vma
1418c83b
SC
1196DEFUN(insert_pad,(this_ptr, fill, power, output_section_statement, dot),
1197 lang_statement_union_type **this_ptr AND
1198 fill_type fill AND
1199 unsigned int power AND
1200 asection * output_section_statement AND
1201 bfd_vma dot)
2fa0b342
DHW
1202{
1203 /* Align this section first to the
1204 input sections requirement, then
1205 to the output section's requirement.
1206 If this alignment is > than any seen before,
1207 then record it too. Perform the alignment by
1208 inserting a magic 'padding' statement.
1209 */
1210
1211 unsigned int alignment_needed = align_power(dot, power) - dot;
1212
1213 if (alignment_needed != 0)
1214 {
1215 lang_statement_union_type *new =
1216 (lang_statement_union_type *)
1217 ldmalloc(sizeof(lang_padding_statement_type));
1218 /* Link into existing chain */
1219 new->header.next = *this_ptr;
1220 *this_ptr = new;
1221 new->header.type = lang_padding_statement_enum;
1222 new->padding_statement.output_section = output_section_statement;
1223 new->padding_statement.output_offset =
1224 dot - output_section_statement->vma;
1225 new->padding_statement.fill = fill;
1226 new->padding_statement.size = alignment_needed;
1227 }
1228
1229
1230 /* Remember the most restrictive alignment */
1231 if (power > output_section_statement->alignment_power) {
1232 output_section_statement->alignment_power = power;
1233 }
1234 output_section_statement->size += alignment_needed;
1235 return alignment_needed + dot;
1236
1237}
1238
1418c83b 1239/* Work out how much this section will move the dot point */
2fa0b342 1240static bfd_vma
1418c83b
SC
1241DEFUN(size_input_section, (this_ptr, output_section_statement, fill, dot),
1242 lang_statement_union_type **this_ptr AND
1243 lang_output_section_statement_type*output_section_statement AND
1244 unsigned short fill AND
1245 bfd_vma dot)
2fa0b342
DHW
1246{
1247 lang_input_section_type *is = &((*this_ptr)->input_section);
1248 asection *i = is->section;
1418c83b
SC
1249
1250 if (is->ifile->just_syms_flag == false) {
ac004870
SC
1251 dot = insert_pad(this_ptr, fill, i->alignment_power,
1252 output_section_statement->bfd_section, dot);
2fa0b342 1253
ac004870
SC
1254 /* remember the largest size so we can malloc the largest area */
1255 /* needed for the output stage */
1256 if (i->size > largest_section) {
1257 largest_section = i->size;
1258 }
2fa0b342 1259
ac004870 1260 /* Remember where in the output section this input section goes */
2fa0b342 1261
ac004870
SC
1262 i->output_offset = dot - output_section_statement->bfd_section->vma;
1263
1264 /* Mark how big the output section must be to contain this now */
1265 dot += i->size;
1266 output_section_statement->bfd_section->size =
1267 dot - output_section_statement->bfd_section->vma;
1268 }
1269 else
1270 {
1271 i->output_offset = i->vma - output_section_statement->bfd_section->vma;
1272 }
2fa0b342
DHW
1273
1274 return dot ;
1275}
1276
1277
1278/* Work out the size of the output sections
1279 from the sizes of the input sections */
1280static bfd_vma
1418c83b
SC
1281DEFUN(lang_size_sections,(s, output_section_statement, prev, fill, dot),
1282 lang_statement_union_type *s AND
1283 lang_output_section_statement_type * output_section_statement AND
1284 lang_statement_union_type **prev AND
1285 unsigned short fill AND
1286 bfd_vma dot)
2fa0b342
DHW
1287{
1288 /* Size up the sections from their constituent parts */
1289 for (; s != (lang_statement_union_type *)NULL ; s = s->next)
1418c83b
SC
1290 {
1291 switch (s->header.type) {
1292 case lang_output_section_statement_enum:
1293 {
1294 bfd_vma after;
1295 lang_output_section_statement_type *os =
1296 &(s->output_section_statement);
1297 /* The start of a section */
2fa0b342 1298
1418c83b
SC
1299 if (os->addr_tree == (etree_type *)NULL) {
1300 /* No address specified for this section, get one
1301 from the region specification
1302 */
1303 if (os->region == (lang_memory_region_type *)NULL) {
2fa0b342 1304 os->region = lang_memory_region_lookup("*default*");
1418c83b
SC
1305 }
1306 dot = os->region->current;
2fa0b342 1307 }
1418c83b
SC
1308 else {
1309 etree_value_type r ;
1310 r = exp_fold_tree(os->addr_tree,
1311 (lang_output_section_statement_type *)NULL,
1312 lang_allocating_phase_enum,
1313 dot, &dot);
1314 if (r.valid == false) {
1315 info("%F%S: non constant address expression for section %s\n",
1316 os->name);
1317 }
1318 dot = r.value;
1319 }
1320 /* The section starts here */
1321 /* First, align to what the section needs */
2fa0b342 1322
1418c83b
SC
1323 dot = align_power(dot, os->bfd_section->alignment_power);
1324 os->bfd_section->vma = dot;
1325 os->bfd_section->output_offset = 0;
2fa0b342 1326
1418c83b
SC
1327 (void) lang_size_sections(os->children.head, os, &os->children.head,
1328 os->fill, dot);
1329 /* Ignore the size of the input sections, use the vma and size to */
1330 /* align against */
2fa0b342
DHW
1331
1332
1418c83b
SC
1333 after = ALIGN(os->bfd_section->vma +
1334 os->bfd_section->size,
1335 os->block_value) ;
2fa0b342
DHW
1336
1337
1418c83b
SC
1338 os->bfd_section->size = after - os->bfd_section->vma;
1339 dot = os->bfd_section->vma + os->bfd_section->size;
1340 os->processed = true;
2fa0b342 1341
1418c83b
SC
1342 /* Replace into region ? */
1343 if (os->addr_tree == (etree_type *)NULL
1344 && os->region !=(lang_memory_region_type*)NULL ) {
1345 os->region->current = dot;
1346 }
1347 }
2fa0b342 1348
1418c83b 1349 break;
2fa0b342 1350
1418c83b
SC
1351 case lang_data_statement_enum:
1352 {
1353 unsigned int size;
1354 s->data_statement.output_vma = dot;
1355 s->data_statement.output_section =
1356 output_section_statement->bfd_section;
2fa0b342 1357
1418c83b
SC
1358 switch (s->data_statement.type) {
1359 case LONG:
1360 size = LONG_SIZE;
1361 break;
1362 case SHORT:
1363 size = SHORT_SIZE;
1364 break;
1365 case BYTE:
1366 size = BYTE_SIZE;
1367 break;
2fa0b342 1368
1418c83b
SC
1369 }
1370 dot += size;
1371 output_section_statement->bfd_section->size += size;
1372 }
1373 break;
2fa0b342 1374
1418c83b 1375 case lang_wild_statement_enum:
2fa0b342 1376
1418c83b 1377 dot = lang_size_sections(s->wild_statement.children.head,
2fa0b342
DHW
1378 output_section_statement,
1379 &s->wild_statement.children.head,
1380
1381 fill, dot);
1382
1418c83b 1383 break;
2fa0b342 1384
1418c83b
SC
1385 case lang_object_symbols_statement_enum:
1386 create_object_symbols = output_section_statement;
1387 break;
1388 case lang_output_statement_enum:
1389 case lang_target_statement_enum:
1390 break;
1391 case lang_input_section_enum:
1392 dot = size_input_section(prev,
2fa0b342
DHW
1393 output_section_statement,
1394 output_section_statement->fill, dot);
1418c83b
SC
1395 break;
1396 case lang_input_statement_enum:
1397 break;
1398 case lang_fill_statement_enum:
1399 fill = s->fill_statement.fill;
1400 break;
1401 case lang_assignment_statement_enum:
2fa0b342 1402 {
1418c83b
SC
1403 bfd_vma newdot = dot;
1404 exp_fold_tree(s->assignment_statement.exp,
1405 output_section_statement,
1406 lang_allocating_phase_enum,
1407 dot,
1408 &newdot);
1409
1410 if (newdot != dot)
1411 /* We've been moved ! so insert a pad */
1412 {
1413 lang_statement_union_type *new =
1414 (lang_statement_union_type *)
1415 ldmalloc(sizeof(lang_padding_statement_type));
1416 /* Link into existing chain */
1417 new->header.next = *prev;
1418 *prev = new;
1419 new->header.type = lang_padding_statement_enum;
1420 new->padding_statement.output_section =
1421 output_section_statement->bfd_section;
1422 new->padding_statement.output_offset =
1423 dot - output_section_statement->bfd_section->vma;
1424 new->padding_statement.fill = fill;
1425 new->padding_statement.size = newdot - dot;
1426 output_section_statement->bfd_section->size +=
1427 new->padding_statement.size;
1428 dot = newdot;
1429 }
2fa0b342 1430 }
2fa0b342 1431
1418c83b
SC
1432 break;
1433 case lang_padding_statement_enum:
1434 FAIL();
1435 break;
1436 default:
1437 FAIL();
1438 break;
1439 case lang_address_statement_enum:
1440 break;
1441 }
1442 prev = &s->header.next;
2fa0b342 1443 }
2fa0b342
DHW
1444 return dot;
1445}
1446
1447
1448static bfd_vma
1418c83b
SC
1449DEFUN(lang_do_assignments,(s, output_section_statement, fill, dot),
1450 lang_statement_union_type *s AND
1451 lang_output_section_statement_type * output_section_statement AND
1452 unsigned short fill AND
1453 bfd_vma dot)
2fa0b342
DHW
1454{
1455
1456 for (; s != (lang_statement_union_type *)NULL ; s = s->next)
1457 {
1458 switch (s->header.type) {
1459 case lang_output_section_statement_enum:
1460 {
1461 lang_output_section_statement_type *os =
1462 &(s->output_section_statement);
1463 dot = os->bfd_section->vma;
1464 (void) lang_do_assignments(os->children.head, os, os->fill, dot);
1465 dot = os->bfd_section->vma + os->bfd_section->size;
1466 }
1467 break;
1468 case lang_wild_statement_enum:
1469
1470 dot = lang_do_assignments(s->wild_statement.children.head,
1471 output_section_statement,
1472 fill, dot);
1473
1474 break;
1475
1476 case lang_object_symbols_statement_enum:
1477 case lang_output_statement_enum:
1478 case lang_target_statement_enum:
1418c83b 1479#if 0
2fa0b342 1480 case lang_common_statement_enum:
1418c83b 1481#endif
2fa0b342
DHW
1482 break;
1483 case lang_data_statement_enum:
1484 {
1485 etree_value_type value ;
1486 value = exp_fold_tree(s->data_statement.exp,
1487 0, lang_final_phase_enum, dot, &dot);
1488 s->data_statement.value = value.value;
1489 if (value.valid == false) info("%F%P: Invalid data statement\n");
1490 }
1491 switch (s->data_statement.type) {
1492 case LONG:
1493 dot += LONG_SIZE;
1494 break;
1495 case SHORT:
1496 dot += SHORT_SIZE;
1497 break;
1498 case BYTE:
1499 dot += BYTE_SIZE;
1500 break;
1501 }
1502 break;
1503 case lang_input_section_enum:
1504 {
1505 asection *in = s->input_section.section;
1506 dot += in->size;
1507 }
1508 break;
1509
1510 case lang_input_statement_enum:
1511 break;
1512 case lang_fill_statement_enum:
1513 fill = s->fill_statement.fill;
1514 break;
1515 case lang_assignment_statement_enum:
1516 {
1517 exp_fold_tree(s->assignment_statement.exp,
1518 output_section_statement,
1519 lang_final_phase_enum,
1520 dot,
1521 &dot);
1522 }
1523
1524 break;
1525 case lang_padding_statement_enum:
1526 dot += s->padding_statement.size;
1527 break;
1528 default:
1529 FAIL();
1530 break;
1531 case lang_address_statement_enum:
1532 break;
1533 }
1534
1535 }
1536 return dot;
1537}
1538
1539
1540
1418c83b
SC
1541static void
1542DEFUN_VOID(lang_relocate_globals)
2fa0b342
DHW
1543{
1544
1545 /*
1418c83b
SC
1546 Each ldsym_type maintains a chain of pointers to asymbols which
1547 references the definition. Replace each pointer to the referenence
1548 with a pointer to only one place, preferably the definition. If
1549 the defintion isn't available then the common symbol, and if
1550 there isn't one of them then choose one reference.
1551 */
2fa0b342
DHW
1552
1553 FOR_EACH_LDSYM(lgs) {
1554 asymbol *it;
1555 if (lgs->sdefs_chain) {
1556 it = *(lgs->sdefs_chain);
1557 }
1558 else if (lgs->scoms_chain != (asymbol **)NULL) {
1559 it = *(lgs->scoms_chain);
1560 }
1561 else if (lgs->srefs_chain != (asymbol **)NULL) {
1562 it = *(lgs->srefs_chain);
1563 }
1564 else {
1418c83b
SC
1565 /* This can happen when the command line asked for a symbol to
1566 be -u */
1567 it = (asymbol *)NULL;
2fa0b342
DHW
1568 }
1569 if (it != (asymbol *)NULL)
1418c83b
SC
1570 {
1571 asymbol **ptr= lgs->srefs_chain;
2fa0b342 1572
1418c83b
SC
1573 while (ptr != (asymbol **)NULL) {
1574 asymbol *ref = *ptr;
1575 *ptr = it;
1576 ptr = (asymbol **)(ref->udata);
1577 }
2fa0b342 1578 }
2fa0b342
DHW
1579 }
1580}
1581
1582
1583
2fa0b342 1584static void
1418c83b 1585DEFUN_VOID(lang_finish)
2fa0b342
DHW
1586{
1587 ldsym_type *lgs;
1588
1589 if (entry_symbol == (char *)NULL) {
1590 /* No entry has been specified, look for start */
1591 entry_symbol = "start";
1592 }
1593 lgs = ldsym_get_soft(entry_symbol);
1594 if (lgs && lgs->sdefs_chain) {
1595 asymbol *sy = *(lgs->sdefs_chain);
1596 /* We can set the entry address*/
1597 bfd_set_start_address(output_bfd,
1598 outside_symbol_address(sy));
1599
1600 }
1601 else {
1602 /* Can't find anything reasonable,
1603 use the first address in the text section
1604 */
1605 asection *ts = bfd_get_section_by_name(output_bfd, ".text");
1606 if (ts) {
1607 bfd_set_start_address(output_bfd, ts->vma);
1608 }
1609 }
1610}
1611
1612/* By now we know the target architecture, and we may have an */
1613/* ldfile_output_machine_name */
1614static void
1418c83b 1615DEFUN_VOID(lang_check)
2fa0b342
DHW
1616{
1617 lang_statement_union_type *file;
1618
1619
1620 for (file = file_chain.head;
1621 file != (lang_statement_union_type *)NULL;
1622 file=file->input_statement.next)
1418c83b
SC
1623 {
1624 /* Inspect the architecture and ensure we're linking like
1625 with like
1626 */
1627
1628 if (bfd_arch_compatible( file->input_statement.the_bfd,
1629 output_bfd,
1630 &ldfile_output_architecture,
1631 &ldfile_output_machine)) {
1632 bfd_set_arch_mach(output_bfd,
1633 ldfile_output_architecture, ldfile_output_machine);
1634 }
1635 else {
1636 enum bfd_architecture this_architecture =
1637 bfd_get_architecture(file->input_statement.the_bfd);
1638 unsigned long this_machine =
1639 bfd_get_machine(file->input_statement.the_bfd);
2fa0b342 1640
1418c83b
SC
1641 info("%I: architecture %s",
1642 file,
1643 bfd_printable_arch_mach(this_architecture, this_machine));
1644 info(" incompatible with output %s\n",
1645 bfd_printable_arch_mach(ldfile_output_architecture,
1646 ldfile_output_machine));
1647 ldfile_output_architecture = this_architecture;
1648 ldfile_output_machine = this_machine;
1649 bfd_set_arch_mach(output_bfd,
1650 ldfile_output_architecture,
1651 ldfile_output_machine);
2fa0b342
DHW
1652
1653
1418c83b 1654 }
2fa0b342 1655 }
2fa0b342
DHW
1656}
1657
1658
1659/*
1660 * run through all the global common symbols and tie them
1661 * to the output section requested.
1662 */
1663
1664static void
1418c83b 1665DEFUN_VOID(lang_common)
2fa0b342
DHW
1666{
1667 ldsym_type *lgs;
1668 if (config.relocateable_output == false ||
1669 command_line.force_common_definition== true) {
1670 for (lgs = symbol_head;
1671 lgs != (ldsym_type *)NULL;
1672 lgs=lgs->next)
1418c83b
SC
1673 {
1674 asymbol *com ;
1675 unsigned int power_of_two;
1676 size_t size;
1677 size_t align;
1678 if (lgs->scoms_chain != (asymbol **)NULL) {
1679 com = *(lgs->scoms_chain);
1680 size = com->value;
1681 switch (size) {
1682 case 0:
1683 case 1:
1684 align = 1;
1685 power_of_two = 0;
1686 break;
1687 case 2:
1688 power_of_two = 1;
1689 align = 2;
1690 break;
1691 case 3:
1692 case 4:
1693 power_of_two =2;
1694 align = 4;
1695 break;
1696 case 5:
1697 case 6:
1698 case 7:
1699 case 8:
1700 power_of_two = 3;
2fa0b342 1701 align = 8;
1418c83b
SC
1702 break;
1703 default:
1704 power_of_two = 4;
1705 align = 16;
1706 break;
2fa0b342 1707 }
2fa0b342
DHW
1708
1709
1418c83b
SC
1710 /* Change from a common symbol into a definition of
1711 a symbol */
1712 lgs->sdefs_chain = lgs->scoms_chain;
1713 lgs->scoms_chain = (asymbol **)NULL;
1714 commons_pending--;
1715 /* Point to the correct common section */
1716 com->section =
1717 ((lang_input_statement_type *)
1718 (com->the_bfd->usrdata))->common_section;
1719 /* Fix the size of the common section */
1720 com->section->size = ALIGN(com->section->size, align);
1721
1722 /* Remember if this is the biggest alignment ever seen */
1723 if (power_of_two > com->section->alignment_power) {
1724 com->section->alignment_power = power_of_two;
2fa0b342 1725 }
1418c83b 1726
ac004870
SC
1727 /* Symbol stops being common and starts being global, but
1728 we remember that it was common once. */
1418c83b 1729
ac004870 1730 com->flags = BSF_EXPORT | BSF_GLOBAL | BSF_OLD_COMMON;
097879bc 1731
1418c83b
SC
1732
1733 if (write_map)
1734 {
1735 printf ("Allocating common %s: %x at %x\n",
1736 lgs->name,
1737 (unsigned) size,
1738 (unsigned) com->section->size);
1739 }
1740 com->value = com->section->size;
1741 com->section->size += size;
097879bc 1742
1418c83b
SC
1743
1744 }
2fa0b342 1745 }
2fa0b342 1746 }
1418c83b
SC
1747
1748
2fa0b342
DHW
1749}
1750
1751/*
1752run through the input files and ensure that every input
1753section has somewhere to go. If one is found without
1754a destination then create an input request and place it
1755into the statement tree.
1756*/
1757
1418c83b
SC
1758static void
1759DEFUN_VOID(lang_place_orphans)
2fa0b342
DHW
1760{
1761 lang_input_statement_type *file;
1762 for (file = (lang_input_statement_type*)file_chain.head;
1763 file != (lang_input_statement_type*)NULL;
1764 file = (lang_input_statement_type*)file->next) {
1765 asection *s;
1766 for (s = file->the_bfd->sections;
1767 s != (asection *)NULL;
1768 s = s->next) {
1769 if ( s->output_section == (asection *)NULL) {
1770 /* This section of the file is not attatched, root
1771 around for a sensible place for it to go */
1772
1773 if (file->common_section == s) {
1774 /* This is a lonely common section which must
1775 have come from an archive. We attatch to the
1776 section with the wildcard */
1418c83b
SC
1777 if (config.relocateable_output != true
1778 && command_line.force_common_definition == false) {
1779 if (default_common_section ==
1780 (lang_output_section_statement_type *)NULL) {
1781 info("%P: No [COMMON] command, defaulting to .bss\n");
1782
1783 default_common_section =
1784 lang_output_section_statement_lookup(".bss");
1785
1786 }
1787 wild_doit(&default_common_section->children, s,
1788 default_common_section, file);
1789 }
2fa0b342
DHW
1790 }
1791 else {
1792 lang_output_section_statement_type *os =
1793 lang_output_section_statement_lookup(s->name);
1794
1795 wild_doit(&os->children, s, os, file);
1796 }
1797 }
1798 }
2fa0b342
DHW
1799 }
1800}
1801
1802
2fa0b342 1803void
1418c83b
SC
1804DEFUN(lang_set_flags,(ptr, flags),
1805 lang_section_flags_type *ptr AND
1806 CONST char *flags)
2fa0b342
DHW
1807{
1808 boolean state = true;
1809 ptr->flag_read = false;
1810 ptr->flag_write = false;
1811 ptr->flag_executable = false;
1812 ptr->flag_loadable= false;
1813 while (*flags)
1418c83b
SC
1814 {
1815 if (*flags == '!') {
1816 state = false;
1817 flags++;
1818 }
1819 else state = true;
1820 switch (*flags) {
1821 case 'R':
1822 ptr->flag_read = state;
1823 break;
1824 case 'W':
1825 ptr->flag_write = state;
1826 break;
1827 case 'X':
1828 ptr->flag_executable= state;
1829 break;
1830 case 'L':
1831 ptr->flag_loadable= state;
1832 break;
1833 default:
1834 info("%P%F illegal syntax in flags\n");
1835 break;
1836 }
2fa0b342
DHW
1837 flags++;
1838 }
2fa0b342
DHW
1839}
1840
1841
1842
1843void
1418c83b
SC
1844DEFUN(lang_for_each_file,(func),
1845 PROTO(void, (*func),(lang_input_statement_type *)))
2fa0b342
DHW
1846{
1847 lang_input_statement_type *f;
1848 for (f = (lang_input_statement_type *)file_chain.head;
1849 f != (lang_input_statement_type *)NULL;
1850 f = (lang_input_statement_type *)f->next)
1418c83b
SC
1851 {
1852 func(f);
1853 }
2fa0b342
DHW
1854}
1855
1856
1857void
1418c83b
SC
1858DEFUN(lang_for_each_input_section, (func),
1859 PROTO(void ,(*func),(bfd *ab, asection*as)))
2fa0b342
DHW
1860{
1861 lang_input_statement_type *f;
1862 for (f = (lang_input_statement_type *)file_chain.head;
1863 f != (lang_input_statement_type *)NULL;
1864 f = (lang_input_statement_type *)f->next)
1865 {
1866 asection *s;
1867 for (s = f->the_bfd->sections;
1868 s != (asection *)NULL;
1869 s = s->next) {
1870 func(f->the_bfd, s);
1871 }
1872 }
1873}
1874
1875
1876
1877void
1418c83b
SC
1878DEFUN(ldlang_add_file,(entry),
1879 lang_input_statement_type *entry)
2fa0b342 1880{
1418c83b 1881
2fa0b342
DHW
1882 lang_statement_append(&file_chain,
1883 (lang_statement_union_type *)entry,
1884 &entry->next);
1885}
1886
1887
1888
1889void
1418c83b
SC
1890DEFUN(lang_add_output,(name),
1891 CONST char *name)
2fa0b342
DHW
1892{
1893 lang_output_statement_type *new = new_stat(lang_output_statement,
1894 stat_ptr);
1895 new->name = name;
1896 had_output_filename = true;
1897}
1898
1899
1900static lang_output_section_statement_type *current_section;
1901
1902void
1418c83b
SC
1903DEFUN(lang_enter_output_section_statement,
1904 (output_section_statement_name,
1905 address_exp,
1906 block_value),
1907 char *output_section_statement_name AND
1908 etree_type *address_exp AND
1909 bfd_vma block_value)
2fa0b342
DHW
1910{
1911 lang_output_section_statement_type *os;
1912 current_section =
1913 os =
1914 lang_output_section_statement_lookup(output_section_statement_name);
1915
1916
1917 /* Add this statement to tree */
1918 /* add_statement(lang_output_section_statement_enum,
1919 output_section_statement);*/
1920 /* Make next things chain into subchain of this */
1921
1922 if (os->addr_tree ==
1923 (etree_type *)NULL) {
1924 os->addr_tree =
1925 address_exp;
1926 }
1927 os->block_value = block_value;
1928 stat_ptr = & os->children;
1929
1930}
1931
1932
1933void
1418c83b 1934DEFUN_VOID(lang_final)
2fa0b342
DHW
1935{
1936 if (had_output_filename == false) {
1937 lang_add_output("a.out");
1938 }
2fa0b342
DHW
1939}
1940
1941
1942
1943
1944
1418c83b
SC
1945asymbol *
1946DEFUN(create_symbol,(name, flags, section),
1947 CONST char *name AND
1948 flagword flags AND
1949 asection *section)
2fa0b342
DHW
1950{
1951 extern lang_input_statement_type *script_file;
1952 asymbol **def_ptr = (asymbol **)ldmalloc(sizeof(asymbol **));
1953 /* Add this definition to script file */
1954 asymbol *def = (asymbol *)bfd_make_empty_symbol(script_file->the_bfd);
1418c83b 1955 def->name = buystring(name);
2fa0b342
DHW
1956 def->udata = 0;
1957 def->flags = flags;
1958 def->section = section;
1959
1960 *def_ptr = def;
1961 Q_enter_global_ref(def_ptr);
1962 return def;
1963}
1964
1965
1966void
1418c83b
SC
1967DEFUN_VOID(lang_process)
1968{
1969 if (had_script == false) {
1970 parse_line(ldemul_get_script());
1971 }
1972 lang_reasonable_defaults();
1973 current_target = default_target;
1974
1975 lang_for_each_statement(ldlang_open_output); /* Open the output file */
1976 /* For each output section statement, create a section in the output
1977 file */
1978 lang_create_output_section_statements();
1979
1980 /* Create a dummy bfd for the script */
1981 lang_init_script_file();
1982
1983 /* Add to the hash table all undefineds on the command line */
1984 lang_place_undefineds();
1985
1986 /* Create a bfd for each input file */
1987 current_target = default_target;
1988 lang_for_each_statement(open_input_bfds);
1989
1990 common_section.userdata = &common_section_userdata;
1991
1992 /* Run through the contours of the script and attatch input sections
1993 to the correct output sections
1994 */
1995 map_input_to_output_sections(statement_list.head, (char *)NULL,
1996 ( lang_output_section_statement_type *)NULL);
1997
1998 /* Find any sections not attatched explicitly and handle them */
1999 lang_place_orphans();
2000
2001 /* Size up the common data */
2002 lang_common();
2003
2004 ldemul_before_allocation();
2005
2006 /* Size up the sections */
2007 lang_size_sections(statement_list.head,
2008 (lang_output_section_statement_type *)NULL,
2009 &(statement_list.head), 0, (bfd_vma)0);
2010
2011 /* See if anything special should be done now we know how big
2012 everything is */
2013 ldemul_after_allocation();
2014
2015 /* Do all the assignments, now that we know the final restingplaces
2016 of all the symbols */
2017
2018 lang_do_assignments(statement_list.head,
2019 (lang_output_section_statement_type *)NULL,
2020 0, (bfd_vma)0);
2021
2022 /* Make sure that we're not mixing architectures */
2023
2024 lang_check();
2025
2026 /* Move the global symbols around */
2027 lang_relocate_globals();
2028
2029 /* Final stuffs */
2030 lang_finish();
2fa0b342
DHW
2031}
2032
2033
2034/* EXPORTED TO YACC */
1418c83b 2035
2fa0b342 2036void
1418c83b
SC
2037DEFUN(lang_add_wild,(section_name, filename),
2038 CONST char *CONST section_name AND
2039 CONST char *CONST filename)
2040{
2041 lang_wild_statement_type *new = new_stat(lang_wild_statement,
2042 stat_ptr);
2043
2044 if (section_name != (char *)NULL && strcmp(section_name,"COMMON") == 0)
2045 {
2046 placed_commons = true;
2047 }
2048 if (filename != (char *)NULL) {
2049 lang_has_input_file = true;
2050 }
2051 new->section_name = section_name;
2052 new->filename = filename;
2053 lang_list_init(&new->children);
2054}
2055void
2056DEFUN(lang_section_start,(name, address),
2057 CONST char *name AND
2058 etree_type *address)
2fa0b342
DHW
2059{
2060 lang_address_statement_type *ad =new_stat(lang_address_statement, stat_ptr);
2061 ad->section_name = name;
2062 ad->address = address;
2063}
1418c83b
SC
2064
2065void
2066DEFUN(lang_add_entry,(name),
2067 CONST char *name)
2fa0b342
DHW
2068{
2069 entry_symbol = name;
2070}
2071
2072void
1418c83b
SC
2073DEFUN(lang_add_target,(name),
2074 CONST char *name)
2fa0b342
DHW
2075{
2076 lang_target_statement_type *new = new_stat(lang_target_statement,
2077 stat_ptr);
2078 new->target = name;
2079
2080}
2fa0b342 2081
1418c83b
SC
2082
2083
2fa0b342
DHW
2084
2085void
1418c83b
SC
2086DEFUN(lang_add_map,(name),
2087 CONST char *name)
2fa0b342
DHW
2088{
2089 while (*name) {
2090 switch (*name) {
2091 case 'F':
2092 map_option_f = true;
2093 break;
2094 }
2095 name++;
2096 }
2097}
2098
1418c83b
SC
2099void
2100DEFUN(lang_add_fill,(exp),
2101 int exp)
2fa0b342
DHW
2102{
2103 lang_fill_statement_type *new = new_stat(lang_fill_statement,
2104 stat_ptr);
2105 new->fill = exp;
2106}
2107
1418c83b
SC
2108void
2109DEFUN(lang_add_data,(type, exp),
2110 int type AND
2111 union etree_union *exp)
2fa0b342
DHW
2112{
2113
2114 lang_data_statement_type *new = new_stat(lang_data_statement,
2115 stat_ptr);
2116 new->exp = exp;
2117 new->type = type;
2118
2119}
2120void
1418c83b
SC
2121DEFUN(lang_add_assignment,(exp),
2122 etree_type *exp)
2fa0b342
DHW
2123{
2124 lang_assignment_statement_type *new = new_stat(lang_assignment_statement,
2125 stat_ptr);
2126 new->exp = exp;
2127}
2128
2129void
1418c83b
SC
2130DEFUN(lang_add_attribute,(attribute),
2131 enum statement_enum attribute)
2fa0b342
DHW
2132{
2133 new_statement(attribute, sizeof(lang_statement_union_type),stat_ptr);
2134}
2135
2136
2137
2138void
1418c83b
SC
2139DEFUN(lang_startup,(name),
2140 CONST char *name)
2fa0b342
DHW
2141{
2142 if (startup_file != (char *)NULL) {
2143 info("%P%FMultiple STARTUP files\n");
2144 }
2145 first_file->filename = name;
2146 first_file->local_sym_name = name;
2147
2148 startup_file= name;
2149}
2150void
1418c83b
SC
2151DEFUN(lang_float,(maybe),
2152 boolean maybe)
2fa0b342
DHW
2153{
2154 lang_float_flag = maybe;
2155}
2156
2157void
1418c83b
SC
2158DEFUN(lang_leave_output_section_statement,(fill, memspec),
2159 bfd_vma fill AND
2160 CONST char *memspec)
2fa0b342
DHW
2161{
2162 current_section->fill = fill;
2163 current_section->region = lang_memory_region_lookup(memspec);
2164 stat_ptr = &statement_list;
2165}
9f32f7c2
SC
2166/*
2167 Create an absolute symbol with the given name with the value of the
2168 address of first byte of the section named.
2fa0b342 2169
9f32f7c2
SC
2170 If the symbol already exists, then do nothing.
2171*/
8cb5eb31 2172void
1418c83b
SC
2173DEFUN(lang_abs_symbol_at_beginning_of,(section, name),
2174 CONST char *section AND
2175 CONST char *name)
8cb5eb31 2176{
c660714f 2177 if (ldsym_undefined(name)) {
9f32f7c2
SC
2178 extern bfd *output_bfd;
2179 extern asymbol *create_symbol();
2180 asection *s = bfd_get_section_by_name(output_bfd, section);
2181 asymbol *def = create_symbol(name,
2182 BSF_GLOBAL | BSF_EXPORT |
2183 BSF_ABSOLUTE,
2184 (asection *)NULL);
2185 if (s != (asection *)NULL) {
2186 def->value = s->vma;
2187 }
2188 else {
2189 def->value = 0;
2190 }
8cb5eb31
SC
2191 }
2192}
2193
9f32f7c2
SC
2194/*
2195 Create an absolute symbol with the given name with the value of the
2196 address of the first byte after the end of the section named.
2197
2198 If the symbol already exists, then do nothing.
2199*/
2fa0b342 2200void
1418c83b
SC
2201DEFUN(lang_abs_symbol_at_end_of,(section, name),
2202 CONST char *section AND
2203 CONST char *name)
2fa0b342 2204{
c660714f 2205 if (ldsym_undefined(name)){
9f32f7c2
SC
2206 extern bfd *output_bfd;
2207 extern asymbol *create_symbol();
2208 asection *s = bfd_get_section_by_name(output_bfd, section);
2209 /* Add a symbol called _end */
2210 asymbol *def = create_symbol(name,
2211 BSF_GLOBAL | BSF_EXPORT |
2212 BSF_ABSOLUTE,
2213 (asection *)NULL);
2214 if (s != (asection *)NULL) {
2215 def->value = s->vma + s->size;
2216 }
2217 else {
2218 def->value = 0;
2219 }
2fa0b342
DHW
2220 }
2221}
2222
2223void
1418c83b
SC
2224DEFUN(lang_statement_append,(list, element, field),
2225 lang_statement_list_type *list AND
2226 lang_statement_union_type *element AND
2227 lang_statement_union_type **field)
2fa0b342
DHW
2228{
2229 *(list->tail) = element;
2230 list->tail = field;
2231}
2232
097879bc
SC
2233/* Set the output format type */
2234void
2235DEFUN(lang_add_output_format,(format),
2236CONST char *format)
2237{
2238 output_target = format;
2239}
This page took 0.117406 seconds and 4 git commands to generate.