1 /* Copyright (C) 1991 Free Software Foundation, Inc.
3 This file is part of GLD, the Gnu Linker.
5 GLD is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 1, or (at your option)
10 GLD is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GLD; see the file COPYING. If not, write to
17 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
31 #include "ldgram.tab.h"
39 PROTO(static void, print_statements,(void));
40 PROTO(static void, print_statement,(lang_statement_union_type *,
41 lang_output_section_statement_type *));
45 static CONST char *startup_file;
46 static lang_statement_list_type input_file_chain;
47 static boolean placed_commons = false;
48 static lang_output_section_statement_type *default_common_section;
49 static boolean map_option_f;
50 static bfd_vma print_dot;
51 static lang_input_statement_type *first_file;
52 static lang_statement_list_type lang_output_section_statement;
53 static CONST char *current_target;
54 static CONST char *output_target;
55 static size_t longest_section_name = 8;
56 static asection common_section;
57 static section_userdata_type common_section_userdata;
58 static lang_statement_list_type statement_list;
61 lang_statement_list_type *stat_ptr = &statement_list;
62 lang_input_statement_type *script_file = 0;
63 boolean option_longmap = false;
64 lang_statement_list_type file_chain = {0};
65 CONST char *entry_symbol = 0;
66 size_t largest_section = 0;
67 boolean lang_has_input_file = false;
68 lang_output_section_statement_type *create_object_symbols = 0;
69 boolean had_output_filename = false;
70 boolean lang_float_flag = false;
72 extern char *default_target;
74 extern unsigned int undefined_global_sym_count;
75 extern char *current_file;
76 extern bfd *output_bfd;
77 extern enum bfd_architecture ldfile_output_architecture;
78 extern unsigned long ldfile_output_machine;
79 extern char *ldfile_output_machine_name;
80 extern ldsym_type *symbol_head;
81 extern unsigned int commons_pending;
82 extern args_type command_line;
83 extern ld_config_type config;
84 extern boolean had_script;
85 extern boolean write_map;
91 #define cat(a,b) a/**/b
94 #define new_stat(x,y) (cat(x,_type)*) new_statement(cat(x,_enum), sizeof(cat(x,_type)),y)
96 #define outside_section_address(q) ( (q)->output_offset + (q)->output_section->vma)
98 #define outside_symbol_address(q) ((q)->value + outside_section_address(q->section))
102 /*----------------------------------------------------------------------
103 lang_for_each_statement walks the parse tree and calls the provided
104 function for each node
108 DEFUN(lang_for_each_statement_worker,(func, s),
110 lang_statement_union_type *s)
112 for (; s != (lang_statement_union_type *)NULL ; s = s->next)
116 switch (s->header.type) {
117 case lang_output_section_statement_enum:
118 lang_for_each_statement_worker
120 s->output_section_statement.children.head);
122 case lang_wild_statement_enum:
123 lang_for_each_statement_worker
125 s->wild_statement.children.head);
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:
146 DEFUN(lang_for_each_statement,(func),
149 lang_for_each_statement_worker(func,
150 statement_list.head);
152 /*----------------------------------------------------------------------*/
154 DEFUN(lang_list_init,(list),
155 lang_statement_list_type *list)
157 list->head = (lang_statement_union_type *)NULL;
158 list->tail = &list->head;
161 /*----------------------------------------------------------------------
162 Functions to print the link map
166 DEFUN(print_section,(name),
167 CONST char *CONST name)
169 printf("%*s", -longest_section_name, name);
172 DEFUN_VOID(print_space)
182 DEFUN(print_address,(value),
185 printf("%8lx", value);
188 DEFUN(print_size,(value),
191 printf("%5x", (unsigned)value);
194 DEFUN(print_alignment,(value),
197 printf("2**%2u",value);
201 DEFUN(print_fill,(value),
204 printf("%04x",(unsigned)value);
207 /*----------------------------------------------------------------------
209 build a new statement node for the parse tree
214 lang_statement_union_type*
215 DEFUN(new_statement,(type, size, list),
216 enum statement_enum type AND
218 lang_statement_list_type *list)
220 lang_statement_union_type *new = (lang_statement_union_type *)
222 new->header.type = type;
223 new->header.next = (lang_statement_union_type *)NULL;
224 lang_statement_append(list, new, &new->header.next);
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.
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.
239 static lang_input_statement_type *
240 DEFUN(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)
245 lang_input_statement_type *p = new_stat(lang_input_statement,
247 lang_has_input_file = true;
250 case lang_input_file_is_symbols_only_enum:
252 p->is_archive =false;
254 p->local_sym_name= name;
255 p->just_syms_flag = true;
256 p->search_dirs_flag = false;
258 case lang_input_file_is_fake_enum:
260 p->is_archive =false;
262 p->local_sym_name= name;
263 p->just_syms_flag = false;
264 p->search_dirs_flag =false;
266 case lang_input_file_is_l_enum:
267 p->is_archive = true;
270 p->local_sym_name = concat("-l",name,"");
271 p->just_syms_flag = false;
272 p->search_dirs_flag = true;
274 case lang_input_file_is_search_file_enum:
275 case lang_input_file_is_marker_enum:
277 p->is_archive =false;
279 p->local_sym_name= name;
280 p->just_syms_flag = false;
281 p->search_dirs_flag =true;
283 case lang_input_file_is_file_enum:
285 p->is_archive =false;
287 p->local_sym_name= name;
288 p->just_syms_flag = false;
289 p->search_dirs_flag =false;
294 p->asymbols = (asymbol **)NULL;
295 p->superfile = (lang_input_statement_type *)NULL;
296 p->next_real_file = (lang_statement_union_type*)NULL;
297 p->next = (lang_statement_union_type*)NULL;
299 p->common_output_section = (asection *)NULL;
300 lang_statement_append(&input_file_chain,
301 (lang_statement_union_type *)p,
308 lang_input_statement_type *
309 DEFUN(lang_add_input_file,(name, file_type, target),
311 lang_input_file_enum_type file_type AND
314 /* Look it up or build a new one */
315 lang_has_input_file = true;
317 lang_input_statement_type *p;
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))
323 /* Sometimes we have incomplete entries in here */
324 if (p->filename != (char *)NULL) {
325 if(strcmp(name,p->filename) == 0) return p;
330 return new_afile(name, file_type, target);
334 /* Build enough state so that the parser can build its tree */
336 DEFUN_VOID(lang_init)
339 stat_ptr= &statement_list;
340 lang_list_init(stat_ptr);
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,
351 /*----------------------------------------------------------------------
352 A region is an area of memory declared with the
353 MEMORY { name:org=exp, len=exp ... }
356 We maintain a list of all the regions here
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
362 static lang_memory_region_type *lang_memory_region_list;
363 static lang_memory_region_type **lang_memory_region_list_tail = &lang_memory_region_list;
365 lang_memory_region_type *
366 DEFUN(lang_memory_region_lookup,(name),
367 CONST char *CONST name)
370 lang_memory_region_type *p = lang_memory_region_list;
371 for (p = lang_memory_region_list;
372 p != ( lang_memory_region_type *)NULL;
374 if (strcmp(p->name, name) == 0) {
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;
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;
390 *lang_memory_region_list_tail = new;
391 lang_memory_region_list_tail = &new->next;
400 lang_output_section_statement_type *
401 DEFUN(lang_output_section_find,(name),
402 CONST char * CONST name)
404 lang_statement_union_type *u;
405 lang_output_section_statement_type *lookup;
407 for (u = lang_output_section_statement.head;
408 u != (lang_statement_union_type *)NULL;
411 lookup = &u->output_section_statement;
412 if (strcmp(name, lookup->name)==0) {
416 return (lang_output_section_statement_type *)NULL;
419 lang_output_section_statement_type *
420 DEFUN(lang_output_section_statement_lookup,(name),
421 CONST char * CONST name)
423 lang_output_section_statement_type *lookup;
424 lookup =lang_output_section_find(name);
425 if (lookup == (lang_output_section_statement_type *)NULL) {
427 lookup =(lang_output_section_statement_type *)
428 new_stat(lang_output_section_statement, stat_ptr);
429 lookup->region = (lang_memory_region_type *)NULL;
431 lookup->block_value = 1;
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);
440 lang_statement_append(&lang_output_section_statement,
441 (lang_statement_union_type *)lookup,
452 DEFUN(print_flags, (outfile, ignore_flags),
454 lang_section_flags_type *ignore_flags)
456 fprintf(outfile,"(");
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");
463 fprintf(outfile,")");
467 DEFUN(lang_map,(outfile),
470 lang_memory_region_type *m;
471 fprintf(outfile,"**MEMORY CONFIGURATION**\n\n");
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;
478 fprintf(outfile,"%-16s", m->name);
480 fprintf(outfile,"%08lx\t%08lx\t", m->origin, m->length);
481 print_flags(outfile, &m->flags);
482 fprintf(outfile,"\n");
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");
497 lang_output_section_statement_type *s)
499 section_userdata_type *new =
500 (section_userdata_type *)
501 ldmalloc(sizeof(section_userdata_type));
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;
512 /***********************************************************************
515 These expand statements like *(.text) and foo.o to a list of
516 explicit actions, like foo.o(.text), bar.o(.text) and
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.
527 DEFUN(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)
533 if(output->bfd_section == (asection *)NULL)
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);
543 new->section = section;
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;
554 DEFUN(our_bfd_get_section_by_name,(abfd, section),
558 return bfd_get_section_by_name(abfd, section);
562 DEFUN(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)
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);
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),
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.
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.
595 lang_input_statement_type *
596 DEFUN(lookup_name,(name),
597 CONST char * CONST name)
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)
604 if (search->filename == (char *)NULL && name == (char *)NULL) {
607 if (search->filename != (char *)NULL && name != (char *)NULL) {
608 if (strcmp(search->filename, name) == 0) {
609 ldmain_open_file_read_symbol(search);
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);
626 DEFUN(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)
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);
643 /* Perform the iteration over a single file */
644 wild_section( s, section, lookup_name(file), output);
646 if (strcmp(section,"COMMON") == 0
647 && default_common_section == (lang_output_section_statement_type*)NULL)
649 /* Remember the section that common is going to incase we later
650 get something which doesn't know where to put it */
651 default_common_section = output;
656 read in all the files
659 DEFUN(open_output,(name),
660 CONST char *CONST name)
662 extern CONST char *output_filename;
664 if (output_target == (char *)NULL) {
665 if (current_target != (char *)NULL)
666 output_target = current_target;
668 output_target = default_target;
670 output = bfd_openw(name, output_target);
671 output_filename = name;
673 if (output == (bfd *)NULL)
675 if (bfd_error == invalid_target) {
676 info("%P%F target %s not found\n", output_target);
678 info("%P%F problem opening output file %s, %E", name);
681 output->flags |= D_PAGED;
682 bfd_set_format(output, bfd_object);
690 DEFUN(ldlang_open_output,(statement),
691 lang_statement_union_type *statement)
693 switch (statement->header.type)
695 case lang_output_statement_enum:
696 output_bfd = open_output(statement->output_statement.name);
697 ldemul_set_output_arch();
700 case lang_target_statement_enum:
701 current_target = statement->target_statement.target;
709 DEFUN(open_input_bfds,(statement),
710 lang_statement_union_type *statement)
712 switch (statement->header.type)
714 case lang_target_statement_enum:
715 current_target = statement->target_statement.target;
717 case lang_wild_statement_enum:
718 /* Maybe we should load the file's symbols */
719 if (statement->wild_statement.filename)
721 (void) lookup_name(statement->wild_statement.filename);
724 case lang_input_statement_enum:
725 if (statement->input_statement.real == true)
727 statement->input_statement.target = current_target;
728 lookup_name(statement->input_statement.filename);
735 /* If there are [COMMONS] statements, put a wild one into the bss section */
738 lang_reasonable_defaults()
741 lang_output_section_statement_lookup(".text");
742 lang_output_section_statement_lookup(".data");
744 default_common_section =
745 lang_output_section_statement_lookup(".bss");
748 if (placed_commons == false) {
749 lang_wild_statement_type *new =
750 new_stat(lang_wild_statement,
751 &default_common_section->children);
752 new->section_name = "COMMON";
753 new->filename = (char *)NULL;
754 lang_list_init(&new->children);
761 Add the supplied name to the symbol table as an undefined reference.
762 Remove items from the chain as we open input bfds
764 typedef struct ldlang_undef_chain_list_struct {
765 struct ldlang_undef_chain_list_struct *next;
767 } ldlang_undef_chain_list_type;
769 static ldlang_undef_chain_list_type *ldlang_undef_chain_list_head;
772 DEFUN(ldlang_add_undef,(name),
773 CONST char *CONST name)
775 ldlang_undef_chain_list_type *new =
776 (ldlang_undef_chain_list_type
777 *)ldmalloc(sizeof(ldlang_undef_chain_list_type));
779 new->next = ldlang_undef_chain_list_head;
780 ldlang_undef_chain_list_head = new;
782 new->name = buystring(name);
784 /* Run through the list of undefineds created above and place them
785 into the linker hash table as undefined symbols belonging to the
789 DEFUN_VOID(lang_place_undefineds)
791 ldlang_undef_chain_list_type *ptr = ldlang_undef_chain_list_head;
792 while (ptr != (ldlang_undef_chain_list_type*)NULL) {
793 ldsym_type *sy = ldsym_get(ptr->name);
795 asymbol **def_ptr = (asymbol **)ldmalloc(sizeof(asymbol **));
796 def = (asymbol *)bfd_make_empty_symbol(script_file->the_bfd);
798 def->name = ptr->name;
799 def->flags = BSF_UNDEFINED;
800 def->section = (asection *)NULL;
801 Q_enter_global_ref(def_ptr);
808 /* Copy important data from out internal form to the bfd way. Also
809 create a section for the dummy file
813 DEFUN_VOID(lang_create_output_section_statements)
815 lang_statement_union_type*os;
816 for (os = lang_output_section_statement.head;
817 os != (lang_statement_union_type*)NULL;
818 os = os->output_section_statement.next) {
819 lang_output_section_statement_type *s =
820 &os->output_section_statement;
827 DEFUN_VOID(lang_init_script_file)
829 script_file = lang_add_input_file("script file",
830 lang_input_file_is_fake_enum,
832 script_file->the_bfd = bfd_create("script file", output_bfd);
833 script_file->symbol_count = 0;
834 script_file->the_bfd->sections = output_bfd->sections;
840 /* Open input files and attatch to output sections */
842 DEFUN(map_input_to_output_sections,(s, target, output_section_statement),
843 lang_statement_union_type *s AND
844 CONST char *target AND
845 lang_output_section_statement_type *output_section_statement)
847 for (; s != (lang_statement_union_type *)NULL ; s = s->next)
849 switch (s->header.type) {
850 case lang_wild_statement_enum:
851 wild(&s->wild_statement, s->wild_statement.section_name,
852 s->wild_statement.filename, target,
853 output_section_statement);
857 case lang_output_section_statement_enum:
858 map_input_to_output_sections(s->output_section_statement.children.head,
860 &s->output_section_statement);
862 case lang_output_statement_enum:
864 case lang_target_statement_enum:
865 target = s->target_statement.target;
867 case lang_fill_statement_enum:
868 case lang_input_section_enum:
869 case lang_object_symbols_statement_enum:
870 case lang_data_statement_enum:
871 case lang_assignment_statement_enum:
872 case lang_padding_statement_enum:
874 case lang_afile_asection_pair_statement_enum:
877 case lang_address_statement_enum:
878 /* Mark the specified section with the supplied address */
880 lang_output_section_statement_type *os =
881 lang_output_section_statement_lookup
882 (s->address_statement.section_name);
883 os->addr_tree = s->address_statement.address;
886 case lang_input_statement_enum:
887 /* A standard input statement, has no wildcards */
888 /* ldmain_open_file_read_symbol(&s->input_statement);*/
899 DEFUN(print_output_section_statement,(output_section_statement),
900 lang_output_section_statement_type *output_section_statement)
902 asection *section = output_section_statement->bfd_section;
904 print_section(output_section_statement->name);
907 print_dot = section->vma;
911 print_address(section->vma);
913 print_size(section->size);
915 print_alignment(section->alignment_power);
918 printf("%s flags", output_section_statement->region->name);
919 print_flags(stdout, &output_section_statement->flags);
924 printf("No attached output section");
927 print_statement(output_section_statement->children.head,
928 output_section_statement);
933 DEFUN(print_assignment,(assignment, output_section),
934 lang_assignment_statement_type *assignment AND
935 lang_output_section_statement_type *output_section)
937 etree_value_type result;
942 print_address(print_dot);
944 result = exp_fold_tree(assignment->exp->assign.src,
946 lang_final_phase_enum,
951 print_address(result.value);
955 printf("*undefined*");
958 exp_print_tree(stdout, assignment->exp);
963 DEFUN(print_input_statement,(statm),
964 lang_input_statement_type *statm)
966 if (statm->filename != (char *)NULL) {
967 printf("LOAD %s\n",statm->filename);
972 DEFUN(print_symbol,(q),
979 print_address(outside_symbol_address(q));
980 printf(" %s", q->name ? q->name : " ");
985 DEFUN(print_input_section,(in),
986 lang_input_section_type *in)
988 asection *i = in->section;
993 print_section(i->name);
995 if (i->output_section) {
996 print_address(i->output_section->vma + i->output_offset);
1000 print_alignment(i->alignment_power);
1004 bfd *abfd = in->ifile->the_bfd;
1005 if (in->ifile->just_syms_flag == true) {
1006 printf("symbols only ");
1009 printf(" %s ",abfd->xvec->name);
1010 if(abfd->my_archive != (bfd *)NULL) {
1011 printf("[%s]%s", abfd->my_archive->filename,
1015 printf("%s", abfd->filename);
1019 /* Find all the symbols in this file defined in this section */
1022 for (p = in->ifile->asymbols; *p; p++) {
1025 if (bfd_get_section(q) == i && q->flags & BSF_GLOBAL) {
1036 print_dot = outside_section_address(i) + i->size;
1039 printf("No output section allocated\n");
1045 DEFUN(print_fill_statement,(fill),
1046 lang_fill_statement_type *fill)
1048 printf("FILL mask ");
1049 print_fill( fill->fill);
1053 DEFUN(print_data_statement,(data),
1054 lang_data_statement_type *data)
1056 /* bfd_vma value; */
1061 ASSERT(print_dot == data->output_vma);
1063 print_address(data->output_vma);
1065 print_address(data->value);
1067 switch (data->type) {
1070 print_dot += BYTE_SIZE;
1074 print_dot += SHORT_SIZE;
1078 print_dot += LONG_SIZE;
1082 exp_print_tree(stdout, data->exp);
1089 DEFUN(print_padding_statement,(s),
1090 lang_padding_statement_type *s)
1094 print_section("*fill*");
1096 print_address(s->output_offset + s->output_section->vma);
1098 print_size(s->size);
1100 print_fill(s->fill);
1105 DEFUN(print_wild_statement,(w,os),
1106 lang_wild_statement_type *w AND
1107 lang_output_section_statement_type *os)
1109 if (w->filename != (char *)NULL) {
1110 printf("%s",w->filename);
1115 if (w->section_name != (char *)NULL) {
1116 printf("(%s)",w->section_name);
1122 print_statement(w->children.head, os);
1126 DEFUN(print_statement,(s, os),
1127 lang_statement_union_type *s AND
1128 lang_output_section_statement_type *os)
1131 switch (s->header.type) {
1132 case lang_wild_statement_enum:
1133 print_wild_statement(&s->wild_statement, os);
1136 printf("Fail with %d\n",s->header.type);
1139 case lang_address_statement_enum:
1140 printf("address\n");
1143 case lang_object_symbols_statement_enum:
1144 printf("object symbols\n");
1146 case lang_fill_statement_enum:
1147 print_fill_statement(&s->fill_statement);
1149 case lang_data_statement_enum:
1150 print_data_statement(&s->data_statement);
1152 case lang_input_section_enum:
1153 print_input_section(&s->input_section);
1155 case lang_padding_statement_enum:
1156 print_padding_statement(&s->padding_statement);
1158 case lang_output_section_statement_enum:
1159 print_output_section_statement(&s->output_section_statement);
1161 case lang_assignment_statement_enum:
1162 print_assignment(&s->assignment_statement,
1167 case lang_target_statement_enum:
1168 printf("TARGET(%s)\n", s->target_statement.target);
1170 case lang_output_statement_enum:
1171 printf("OUTPUT(%s %s)\n",
1172 s->output_statement.name,
1175 case lang_input_statement_enum:
1176 print_input_statement(&s->input_statement);
1178 case lang_afile_asection_pair_statement_enum:
1188 DEFUN_VOID(print_statements)
1190 print_statement(statement_list.head,
1191 (lang_output_section_statement_type *)NULL);
1195 DEFUN(insert_pad,(this_ptr, fill, power, output_section_statement, dot),
1196 lang_statement_union_type **this_ptr AND
1198 unsigned int power AND
1199 asection * output_section_statement AND
1202 /* Align this section first to the
1203 input sections requirement, then
1204 to the output section's requirement.
1205 If this alignment is > than any seen before,
1206 then record it too. Perform the alignment by
1207 inserting a magic 'padding' statement.
1210 unsigned int alignment_needed = align_power(dot, power) - dot;
1212 if (alignment_needed != 0)
1214 lang_statement_union_type *new =
1215 (lang_statement_union_type *)
1216 ldmalloc(sizeof(lang_padding_statement_type));
1217 /* Link into existing chain */
1218 new->header.next = *this_ptr;
1220 new->header.type = lang_padding_statement_enum;
1221 new->padding_statement.output_section = output_section_statement;
1222 new->padding_statement.output_offset =
1223 dot - output_section_statement->vma;
1224 new->padding_statement.fill = fill;
1225 new->padding_statement.size = alignment_needed;
1229 /* Remember the most restrictive alignment */
1230 if (power > output_section_statement->alignment_power) {
1231 output_section_statement->alignment_power = power;
1233 output_section_statement->size += alignment_needed;
1234 return alignment_needed + dot;
1238 /* Work out how much this section will move the dot point */
1240 DEFUN(size_input_section, (this_ptr, output_section_statement, fill, dot),
1241 lang_statement_union_type **this_ptr AND
1242 lang_output_section_statement_type*output_section_statement AND
1243 unsigned short fill AND
1246 lang_input_section_type *is = &((*this_ptr)->input_section);
1247 asection *i = is->section;
1249 if (is->ifile->just_syms_flag == false) {
1250 dot = insert_pad(this_ptr, fill, i->alignment_power,
1251 output_section_statement->bfd_section, dot);
1253 /* remember the largest size so we can malloc the largest area */
1254 /* needed for the output stage */
1255 if (i->size > largest_section) {
1256 largest_section = i->size;
1259 /* Remember where in the output section this input section goes */
1260 i->output_offset = dot - output_section_statement->bfd_section->vma;
1262 /* Mark how big the output section must be to contain this now */
1264 output_section_statement->bfd_section->size =
1265 dot - output_section_statement->bfd_section->vma;
1272 /* Work out the size of the output sections
1273 from the sizes of the input sections */
1275 DEFUN(lang_size_sections,(s, output_section_statement, prev, fill, dot),
1276 lang_statement_union_type *s AND
1277 lang_output_section_statement_type * output_section_statement AND
1278 lang_statement_union_type **prev AND
1279 unsigned short fill AND
1282 /* Size up the sections from their constituent parts */
1283 for (; s != (lang_statement_union_type *)NULL ; s = s->next)
1285 switch (s->header.type) {
1286 case lang_output_section_statement_enum:
1289 lang_output_section_statement_type *os =
1290 &(s->output_section_statement);
1291 /* The start of a section */
1293 if (os->addr_tree == (etree_type *)NULL) {
1294 /* No address specified for this section, get one
1295 from the region specification
1297 if (os->region == (lang_memory_region_type *)NULL) {
1298 os->region = lang_memory_region_lookup("*default*");
1300 dot = os->region->current;
1303 etree_value_type r ;
1304 r = exp_fold_tree(os->addr_tree,
1305 (lang_output_section_statement_type *)NULL,
1306 lang_allocating_phase_enum,
1308 if (r.valid == false) {
1309 info("%F%S: non constant address expression for section %s\n",
1314 /* The section starts here */
1315 /* First, align to what the section needs */
1317 dot = align_power(dot, os->bfd_section->alignment_power);
1318 os->bfd_section->vma = dot;
1319 os->bfd_section->output_offset = 0;
1321 (void) lang_size_sections(os->children.head, os, &os->children.head,
1323 /* Ignore the size of the input sections, use the vma and size to */
1327 after = ALIGN(os->bfd_section->vma +
1328 os->bfd_section->size,
1332 os->bfd_section->size = after - os->bfd_section->vma;
1333 dot = os->bfd_section->vma + os->bfd_section->size;
1334 os->processed = true;
1336 /* Replace into region ? */
1337 if (os->addr_tree == (etree_type *)NULL
1338 && os->region !=(lang_memory_region_type*)NULL ) {
1339 os->region->current = dot;
1345 case lang_data_statement_enum:
1348 s->data_statement.output_vma = dot;
1349 s->data_statement.output_section =
1350 output_section_statement->bfd_section;
1352 switch (s->data_statement.type) {
1365 output_section_statement->bfd_section->size += size;
1369 case lang_wild_statement_enum:
1371 dot = lang_size_sections(s->wild_statement.children.head,
1372 output_section_statement,
1373 &s->wild_statement.children.head,
1379 case lang_object_symbols_statement_enum:
1380 create_object_symbols = output_section_statement;
1382 case lang_output_statement_enum:
1383 case lang_target_statement_enum:
1385 case lang_input_section_enum:
1386 dot = size_input_section(prev,
1387 output_section_statement,
1388 output_section_statement->fill, dot);
1390 case lang_input_statement_enum:
1392 case lang_fill_statement_enum:
1393 fill = s->fill_statement.fill;
1395 case lang_assignment_statement_enum:
1397 bfd_vma newdot = dot;
1398 exp_fold_tree(s->assignment_statement.exp,
1399 output_section_statement,
1400 lang_allocating_phase_enum,
1405 /* We've been moved ! so insert a pad */
1407 lang_statement_union_type *new =
1408 (lang_statement_union_type *)
1409 ldmalloc(sizeof(lang_padding_statement_type));
1410 /* Link into existing chain */
1411 new->header.next = *prev;
1413 new->header.type = lang_padding_statement_enum;
1414 new->padding_statement.output_section =
1415 output_section_statement->bfd_section;
1416 new->padding_statement.output_offset =
1417 dot - output_section_statement->bfd_section->vma;
1418 new->padding_statement.fill = fill;
1419 new->padding_statement.size = newdot - dot;
1420 output_section_statement->bfd_section->size +=
1421 new->padding_statement.size;
1427 case lang_padding_statement_enum:
1433 case lang_address_statement_enum:
1436 prev = &s->header.next;
1443 DEFUN(lang_do_assignments,(s, output_section_statement, fill, dot),
1444 lang_statement_union_type *s AND
1445 lang_output_section_statement_type * output_section_statement AND
1446 unsigned short fill AND
1450 for (; s != (lang_statement_union_type *)NULL ; s = s->next)
1452 switch (s->header.type) {
1453 case lang_output_section_statement_enum:
1455 lang_output_section_statement_type *os =
1456 &(s->output_section_statement);
1457 dot = os->bfd_section->vma;
1458 (void) lang_do_assignments(os->children.head, os, os->fill, dot);
1459 dot = os->bfd_section->vma + os->bfd_section->size;
1462 case lang_wild_statement_enum:
1464 dot = lang_do_assignments(s->wild_statement.children.head,
1465 output_section_statement,
1470 case lang_object_symbols_statement_enum:
1471 case lang_output_statement_enum:
1472 case lang_target_statement_enum:
1474 case lang_common_statement_enum:
1477 case lang_data_statement_enum:
1479 etree_value_type value ;
1480 value = exp_fold_tree(s->data_statement.exp,
1481 0, lang_final_phase_enum, dot, &dot);
1482 s->data_statement.value = value.value;
1483 if (value.valid == false) info("%F%P: Invalid data statement\n");
1485 switch (s->data_statement.type) {
1497 case lang_input_section_enum:
1499 asection *in = s->input_section.section;
1504 case lang_input_statement_enum:
1506 case lang_fill_statement_enum:
1507 fill = s->fill_statement.fill;
1509 case lang_assignment_statement_enum:
1511 exp_fold_tree(s->assignment_statement.exp,
1512 output_section_statement,
1513 lang_final_phase_enum,
1519 case lang_padding_statement_enum:
1520 dot += s->padding_statement.size;
1525 case lang_address_statement_enum:
1536 DEFUN_VOID(lang_relocate_globals)
1540 Each ldsym_type maintains a chain of pointers to asymbols which
1541 references the definition. Replace each pointer to the referenence
1542 with a pointer to only one place, preferably the definition. If
1543 the defintion isn't available then the common symbol, and if
1544 there isn't one of them then choose one reference.
1547 FOR_EACH_LDSYM(lgs) {
1549 if (lgs->sdefs_chain) {
1550 it = *(lgs->sdefs_chain);
1552 else if (lgs->scoms_chain != (asymbol **)NULL) {
1553 it = *(lgs->scoms_chain);
1555 else if (lgs->srefs_chain != (asymbol **)NULL) {
1556 it = *(lgs->srefs_chain);
1559 /* This can happen when the command line asked for a symbol to
1561 it = (asymbol *)NULL;
1563 if (it != (asymbol *)NULL)
1565 asymbol **ptr= lgs->srefs_chain;
1567 while (ptr != (asymbol **)NULL) {
1568 asymbol *ref = *ptr;
1570 ptr = (asymbol **)(ref->udata);
1579 DEFUN_VOID(lang_finish)
1583 if (entry_symbol == (char *)NULL) {
1584 /* No entry has been specified, look for start */
1585 entry_symbol = "start";
1587 lgs = ldsym_get_soft(entry_symbol);
1588 if (lgs && lgs->sdefs_chain) {
1589 asymbol *sy = *(lgs->sdefs_chain);
1590 /* We can set the entry address*/
1591 bfd_set_start_address(output_bfd,
1592 outside_symbol_address(sy));
1596 /* Can't find anything reasonable,
1597 use the first address in the text section
1599 asection *ts = bfd_get_section_by_name(output_bfd, ".text");
1601 bfd_set_start_address(output_bfd, ts->vma);
1606 /* By now we know the target architecture, and we may have an */
1607 /* ldfile_output_machine_name */
1609 DEFUN_VOID(lang_check)
1611 lang_statement_union_type *file;
1614 for (file = file_chain.head;
1615 file != (lang_statement_union_type *)NULL;
1616 file=file->input_statement.next)
1618 /* Inspect the architecture and ensure we're linking like
1622 if (bfd_arch_compatible( file->input_statement.the_bfd,
1624 &ldfile_output_architecture,
1625 &ldfile_output_machine)) {
1626 bfd_set_arch_mach(output_bfd,
1627 ldfile_output_architecture, ldfile_output_machine);
1630 enum bfd_architecture this_architecture =
1631 bfd_get_architecture(file->input_statement.the_bfd);
1632 unsigned long this_machine =
1633 bfd_get_machine(file->input_statement.the_bfd);
1635 info("%I: architecture %s",
1637 bfd_printable_arch_mach(this_architecture, this_machine));
1638 info(" incompatible with output %s\n",
1639 bfd_printable_arch_mach(ldfile_output_architecture,
1640 ldfile_output_machine));
1641 ldfile_output_architecture = this_architecture;
1642 ldfile_output_machine = this_machine;
1643 bfd_set_arch_mach(output_bfd,
1644 ldfile_output_architecture,
1645 ldfile_output_machine);
1654 * run through all the global common symbols and tie them
1655 * to the output section requested.
1659 DEFUN_VOID(lang_common)
1662 if (config.relocateable_output == false ||
1663 command_line.force_common_definition== true) {
1664 for (lgs = symbol_head;
1665 lgs != (ldsym_type *)NULL;
1669 unsigned int power_of_two;
1672 if (lgs->scoms_chain != (asymbol **)NULL) {
1673 com = *(lgs->scoms_chain);
1704 /* Change from a common symbol into a definition of
1706 lgs->sdefs_chain = lgs->scoms_chain;
1707 lgs->scoms_chain = (asymbol **)NULL;
1709 /* Point to the correct common section */
1711 ((lang_input_statement_type *)
1712 (com->the_bfd->usrdata))->common_section;
1713 /* Fix the size of the common section */
1714 com->section->size = ALIGN(com->section->size, align);
1716 /* Remember if this is the biggest alignment ever seen */
1717 if (power_of_two > com->section->alignment_power) {
1718 com->section->alignment_power = power_of_two;
1722 com->flags = BSF_EXPORT | BSF_GLOBAL ;
1727 printf ("Allocating common %s: %x at %x\n",
1730 (unsigned) com->section->size);
1732 com->value = com->section->size;
1733 com->section->size += size;
1734 com->the_bfd = output_bfd;
1745 run through the input files and ensure that every input
1746 section has somewhere to go. If one is found without
1747 a destination then create an input request and place it
1748 into the statement tree.
1752 DEFUN_VOID(lang_place_orphans)
1754 lang_input_statement_type *file;
1755 for (file = (lang_input_statement_type*)file_chain.head;
1756 file != (lang_input_statement_type*)NULL;
1757 file = (lang_input_statement_type*)file->next) {
1759 for (s = file->the_bfd->sections;
1760 s != (asection *)NULL;
1762 if ( s->output_section == (asection *)NULL) {
1763 /* This section of the file is not attatched, root
1764 around for a sensible place for it to go */
1766 if (file->common_section == s) {
1767 /* This is a lonely common section which must
1768 have come from an archive. We attatch to the
1769 section with the wildcard */
1770 if (config.relocateable_output != true
1771 && command_line.force_common_definition == false) {
1772 if (default_common_section ==
1773 (lang_output_section_statement_type *)NULL) {
1774 info("%P: No [COMMON] command, defaulting to .bss\n");
1776 default_common_section =
1777 lang_output_section_statement_lookup(".bss");
1780 wild_doit(&default_common_section->children, s,
1781 default_common_section, file);
1785 lang_output_section_statement_type *os =
1786 lang_output_section_statement_lookup(s->name);
1788 wild_doit(&os->children, s, os, file);
1797 DEFUN(lang_set_flags,(ptr, flags),
1798 lang_section_flags_type *ptr AND
1801 boolean state = true;
1802 ptr->flag_read = false;
1803 ptr->flag_write = false;
1804 ptr->flag_executable = false;
1805 ptr->flag_loadable= false;
1808 if (*flags == '!') {
1815 ptr->flag_read = state;
1818 ptr->flag_write = state;
1821 ptr->flag_executable= state;
1824 ptr->flag_loadable= state;
1827 info("%P%F illegal syntax in flags\n");
1837 DEFUN(lang_for_each_file,(func),
1838 PROTO(void, (*func),(lang_input_statement_type *)))
1840 lang_input_statement_type *f;
1841 for (f = (lang_input_statement_type *)file_chain.head;
1842 f != (lang_input_statement_type *)NULL;
1843 f = (lang_input_statement_type *)f->next)
1851 DEFUN(lang_for_each_input_section, (func),
1852 PROTO(void ,(*func),(bfd *ab, asection*as)))
1854 lang_input_statement_type *f;
1855 for (f = (lang_input_statement_type *)file_chain.head;
1856 f != (lang_input_statement_type *)NULL;
1857 f = (lang_input_statement_type *)f->next)
1860 for (s = f->the_bfd->sections;
1861 s != (asection *)NULL;
1863 func(f->the_bfd, s);
1871 DEFUN(ldlang_add_file,(entry),
1872 lang_input_statement_type *entry)
1875 lang_statement_append(&file_chain,
1876 (lang_statement_union_type *)entry,
1883 DEFUN(lang_add_output,(name),
1886 lang_output_statement_type *new = new_stat(lang_output_statement,
1889 had_output_filename = true;
1893 static lang_output_section_statement_type *current_section;
1896 DEFUN(lang_enter_output_section_statement,
1897 (output_section_statement_name,
1900 char *output_section_statement_name AND
1901 etree_type *address_exp AND
1902 bfd_vma block_value)
1904 lang_output_section_statement_type *os;
1907 lang_output_section_statement_lookup(output_section_statement_name);
1910 /* Add this statement to tree */
1911 /* add_statement(lang_output_section_statement_enum,
1912 output_section_statement);*/
1913 /* Make next things chain into subchain of this */
1915 if (os->addr_tree ==
1916 (etree_type *)NULL) {
1920 os->block_value = block_value;
1921 stat_ptr = & os->children;
1927 DEFUN_VOID(lang_final)
1929 if (had_output_filename == false) {
1930 lang_add_output("a.out");
1939 DEFUN(create_symbol,(name, flags, section),
1940 CONST char *name AND
1944 extern lang_input_statement_type *script_file;
1945 asymbol **def_ptr = (asymbol **)ldmalloc(sizeof(asymbol **));
1946 /* Add this definition to script file */
1947 asymbol *def = (asymbol *)bfd_make_empty_symbol(script_file->the_bfd);
1948 def->name = buystring(name);
1951 def->section = section;
1954 Q_enter_global_ref(def_ptr);
1960 DEFUN_VOID(lang_process)
1962 if (had_script == false) {
1963 parse_line(ldemul_get_script());
1965 lang_reasonable_defaults();
1966 current_target = default_target;
1968 lang_for_each_statement(ldlang_open_output); /* Open the output file */
1969 /* For each output section statement, create a section in the output
1971 lang_create_output_section_statements();
1973 /* Create a dummy bfd for the script */
1974 lang_init_script_file();
1976 /* Add to the hash table all undefineds on the command line */
1977 lang_place_undefineds();
1979 /* Create a bfd for each input file */
1980 current_target = default_target;
1981 lang_for_each_statement(open_input_bfds);
1983 common_section.userdata = &common_section_userdata;
1985 /* Run through the contours of the script and attatch input sections
1986 to the correct output sections
1988 map_input_to_output_sections(statement_list.head, (char *)NULL,
1989 ( lang_output_section_statement_type *)NULL);
1991 /* Find any sections not attatched explicitly and handle them */
1992 lang_place_orphans();
1994 /* Size up the common data */
1997 ldemul_before_allocation();
1999 /* Size up the sections */
2000 lang_size_sections(statement_list.head,
2001 (lang_output_section_statement_type *)NULL,
2002 &(statement_list.head), 0, (bfd_vma)0);
2004 /* See if anything special should be done now we know how big
2006 ldemul_after_allocation();
2008 /* Do all the assignments, now that we know the final restingplaces
2009 of all the symbols */
2011 lang_do_assignments(statement_list.head,
2012 (lang_output_section_statement_type *)NULL,
2015 /* Make sure that we're not mixing architectures */
2019 /* Move the global symbols around */
2020 lang_relocate_globals();
2027 /* EXPORTED TO YACC */
2030 DEFUN(lang_add_wild,(section_name, filename),
2031 CONST char *CONST section_name AND
2032 CONST char *CONST filename)
2034 lang_wild_statement_type *new = new_stat(lang_wild_statement,
2037 if (section_name != (char *)NULL && strcmp(section_name,"COMMON") == 0)
2039 placed_commons = true;
2041 if (filename != (char *)NULL) {
2042 lang_has_input_file = true;
2044 new->section_name = section_name;
2045 new->filename = filename;
2046 lang_list_init(&new->children);
2049 DEFUN(lang_section_start,(name, address),
2050 CONST char *name AND
2051 etree_type *address)
2053 lang_address_statement_type *ad =new_stat(lang_address_statement, stat_ptr);
2054 ad->section_name = name;
2055 ad->address = address;
2059 DEFUN(lang_add_entry,(name),
2062 entry_symbol = name;
2066 DEFUN(lang_add_target,(name),
2069 lang_target_statement_type *new = new_stat(lang_target_statement,
2079 DEFUN(lang_add_map,(name),
2085 map_option_f = true;
2093 DEFUN(lang_add_fill,(exp),
2096 lang_fill_statement_type *new = new_stat(lang_fill_statement,
2102 DEFUN(lang_add_data,(type, exp),
2104 union etree_union *exp)
2107 lang_data_statement_type *new = new_stat(lang_data_statement,
2114 DEFUN(lang_add_assignment,(exp),
2117 lang_assignment_statement_type *new = new_stat(lang_assignment_statement,
2123 DEFUN(lang_add_attribute,(attribute),
2124 enum statement_enum attribute)
2126 new_statement(attribute, sizeof(lang_statement_union_type),stat_ptr);
2132 DEFUN(lang_startup,(name),
2135 if (startup_file != (char *)NULL) {
2136 info("%P%FMultiple STARTUP files\n");
2138 first_file->filename = name;
2139 first_file->local_sym_name = name;
2144 DEFUN(lang_float,(maybe),
2147 lang_float_flag = maybe;
2151 DEFUN(lang_leave_output_section_statement,(fill, memspec),
2153 CONST char *memspec)
2155 current_section->fill = fill;
2156 current_section->region = lang_memory_region_lookup(memspec);
2157 stat_ptr = &statement_list;
2160 Create an absolute symbol with the given name with the value of the
2161 address of first byte of the section named.
2163 If the symbol already exists, then do nothing.
2166 DEFUN(lang_abs_symbol_at_beginning_of,(section, name),
2167 CONST char *section AND
2170 if (ldsym_undefined(name)) {
2171 extern bfd *output_bfd;
2172 extern asymbol *create_symbol();
2173 asection *s = bfd_get_section_by_name(output_bfd, section);
2174 asymbol *def = create_symbol(name,
2175 BSF_GLOBAL | BSF_EXPORT |
2178 if (s != (asection *)NULL) {
2179 def->value = s->vma;
2188 Create an absolute symbol with the given name with the value of the
2189 address of the first byte after the end of the section named.
2191 If the symbol already exists, then do nothing.
2194 DEFUN(lang_abs_symbol_at_end_of,(section, name),
2195 CONST char *section AND
2198 if (ldsym_undefined(name)){
2199 extern bfd *output_bfd;
2200 extern asymbol *create_symbol();
2201 asection *s = bfd_get_section_by_name(output_bfd, section);
2202 /* Add a symbol called _end */
2203 asymbol *def = create_symbol(name,
2204 BSF_GLOBAL | BSF_EXPORT |
2207 if (s != (asection *)NULL) {
2208 def->value = s->vma + s->size;
2217 DEFUN(lang_statement_append,(list, element, field),
2218 lang_statement_list_type *list AND
2219 lang_statement_union_type *element AND
2220 lang_statement_union_type **field)
2222 *(list->tail) = element;
2226 /* Set the output format type */
2228 DEFUN(lang_add_output_format,(format),
2231 output_target = format;