1 /* Linker command language support.
2 Copyright 1991, 1992 Free Software Foundation, Inc.
4 This file is part of GLD, the Gnu Linker.
6 GLD is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 1, or (at your option)
11 GLD is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GLD; see the file COPYING. If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
36 static void print_statements PARAMS ((void));
37 static void print_statement PARAMS ((lang_statement_union_type *,
38 lang_output_section_statement_type *));
41 static struct obstack stat_obstack;
43 #define obstack_chunk_alloc ldmalloc
44 #define obstack_chunk_free free
45 static CONST char *startup_file;
46 static lang_statement_list_type input_file_chain;
48 /* Points to the last statement in the .data section, so we can add
49 stuff to the data section without pain */
50 static lang_statement_list_type end_of_data_section_statement_list;
52 /* List of statements needed to handle constructors */
53 extern lang_statement_list_type constructor_list;
55 static boolean placed_commons = false;
56 static lang_output_section_statement_type *default_common_section;
57 static boolean map_option_f;
58 static bfd_vma print_dot;
59 static lang_input_statement_type *first_file;
60 static lang_statement_list_type lang_output_section_statement;
61 static CONST char *current_target;
62 static CONST char *output_target;
63 static size_t longest_section_name = 8;
64 static section_userdata_type common_section_userdata;
65 static lang_statement_list_type statement_list;
69 lang_output_section_statement_type *abs_output_section;
70 lang_statement_list_type *stat_ptr = &statement_list;
71 lang_input_statement_type *script_file = 0;
72 boolean option_longmap = false;
73 lang_statement_list_type file_chain =
75 CONST char *entry_symbol = 0;
76 bfd_size_type largest_section = 0;
77 boolean lang_has_input_file = false;
78 lang_output_section_statement_type *create_object_symbols = 0;
79 boolean had_output_filename = false;
80 boolean lang_float_flag = false;
83 extern char *default_target;
85 extern unsigned int undefined_global_sym_count;
86 extern char *current_file;
87 extern bfd *output_bfd;
88 extern enum bfd_architecture ldfile_output_architecture;
89 extern unsigned long ldfile_output_machine;
90 extern char *ldfile_output_machine_name;
91 extern ldsym_type *symbol_head;
92 extern unsigned int commons_pending;
93 extern args_type command_line;
94 extern ld_config_type config;
95 extern boolean had_script;
96 extern boolean write_map;
97 extern int g_switch_value;
100 etree_type *base; /* Relocation base - or null */
104 #define cat(a,b) a##b
106 #define cat(a,b) a/**/b
109 #define new_stat(x,y) (cat(x,_type)*) new_statement(cat(x,_enum), sizeof(cat(x,_type)),y)
111 #define outside_section_address(q) ( (q)->output_offset + (q)->output_section->vma)
113 #define outside_symbol_address(q) ((q)->value + outside_section_address(q->section))
115 void lang_add_data PARAMS ((int type, union etree_union * exp));
121 return obstack_alloc (&stat_obstack, size);
127 fprintf (config.map_file, "%5x", (unsigned) value);
130 print_alignment (value)
133 fprintf (config.map_file, "2**%1u", value);
136 DEFUN (print_fill, (value),
139 fprintf (config.map_file, "%04x", (unsigned) value);
145 CONST char *CONST name;
147 fprintf (config.map_file, "%*s", -longest_section_name, name);
150 /*----------------------------------------------------------------------
151 lang_for_each_statement walks the parse tree and calls the provided
152 function for each node
156 lang_for_each_statement_worker (func, s)
158 lang_statement_union_type *s;
160 for (; s != (lang_statement_union_type *) NULL; s = s->next)
164 switch (s->header.type)
166 case lang_constructors_statement_enum:
167 lang_for_each_statement_worker (func, constructor_list.head);
169 case lang_output_section_statement_enum:
170 lang_for_each_statement_worker
172 s->output_section_statement.children.head);
174 case lang_wild_statement_enum:
175 lang_for_each_statement_worker
177 s->wild_statement.children.head);
179 case lang_data_statement_enum:
180 case lang_object_symbols_statement_enum:
181 case lang_output_statement_enum:
182 case lang_target_statement_enum:
183 case lang_input_section_enum:
184 case lang_input_statement_enum:
185 case lang_assignment_statement_enum:
186 case lang_padding_statement_enum:
187 case lang_address_statement_enum:
197 lang_for_each_statement (func)
200 lang_for_each_statement_worker (func,
201 statement_list.head);
204 /*----------------------------------------------------------------------*/
206 lang_list_init (list)
207 lang_statement_list_type *list;
209 list->head = (lang_statement_union_type *) NULL;
210 list->tail = &list->head;
213 /*----------------------------------------------------------------------
215 build a new statement node for the parse tree
220 lang_statement_union_type *
221 new_statement (type, size, list)
222 enum statement_enum type;
224 lang_statement_list_type * list;
226 lang_statement_union_type *new = (lang_statement_union_type *)
229 new->header.type = type;
230 new->header.next = (lang_statement_union_type *) NULL;
231 lang_statement_append (list, new, &new->header.next);
236 Build a new input file node for the language. There are several ways
237 in which we treat an input file, eg, we only look at symbols, or
238 prefix it with a -l etc.
240 We can be supplied with requests for input files more than once;
241 they may, for example be split over serveral lines like foo.o(.text)
242 foo.o(.data) etc, so when asked for a file we check that we havn't
243 got it already so we don't duplicate the bfd.
246 static lang_input_statement_type *
247 new_afile (name, file_type, target)
248 CONST char *CONST name;
249 CONST lang_input_file_enum_type file_type;
250 CONST char *CONST target;
253 lang_input_statement_type *p = new_stat (lang_input_statement,
256 lang_has_input_file = true;
258 p->complained = false;
261 case lang_input_file_is_symbols_only_enum:
263 p->is_archive = false;
265 p->local_sym_name = name;
266 p->just_syms_flag = true;
267 p->search_dirs_flag = false;
269 case lang_input_file_is_fake_enum:
271 p->is_archive = false;
273 p->local_sym_name = name;
274 p->just_syms_flag = false;
275 p->search_dirs_flag = false;
277 case lang_input_file_is_l_enum:
278 p->is_archive = true;
281 p->local_sym_name = concat ("-l", name, "");
282 p->just_syms_flag = false;
283 p->search_dirs_flag = true;
285 case lang_input_file_is_search_file_enum:
286 case lang_input_file_is_marker_enum:
288 p->is_archive = false;
290 p->local_sym_name = name;
291 p->just_syms_flag = false;
292 p->search_dirs_flag = true;
294 case lang_input_file_is_file_enum:
296 p->is_archive = false;
298 p->local_sym_name = name;
299 p->just_syms_flag = false;
300 p->search_dirs_flag = false;
305 p->asymbols = (asymbol **) NULL;
306 p->superfile = (lang_input_statement_type *) NULL;
307 p->next_real_file = (lang_statement_union_type *) NULL;
308 p->next = (lang_statement_union_type *) NULL;
310 p->common_output_section = (asection *) NULL;
311 lang_statement_append (&input_file_chain,
312 (lang_statement_union_type *) p,
317 lang_input_statement_type *
318 lang_add_input_file (name, file_type, target)
320 lang_input_file_enum_type file_type;
323 /* Look it up or build a new one */
324 lang_has_input_file = true;
326 lang_input_statement_type *p;
328 for (p = (lang_input_statement_type *) input_file_chain.head;
329 p != (lang_input_statement_type *) NULL;
330 p = (lang_input_statement_type *) (p->next_real_file))
332 /* Sometimes we have incomplete entries in here */
333 if (p->filename != (char *) NULL)
335 if (strcmp (name, p->filename) == 0)
341 return new_afile (name, file_type, target);
345 lang_add_keepsyms_file (filename)
346 CONST char *filename;
348 extern strip_symbols_type strip_symbols;
349 if (keepsyms_file != 0)
350 info ("%X%P error: duplicated keep-symbols-file value\n");
351 keepsyms_file = filename;
352 if (strip_symbols != STRIP_NONE)
353 info ("%P `-keep-only-symbols-file' overrides `-s' and `-S'\n");
354 strip_symbols = STRIP_SOME;
357 /* Build enough state so that the parser can build its tree */
361 obstack_begin (&stat_obstack, 1000);
363 stat_ptr = &statement_list;
365 lang_list_init (stat_ptr);
367 lang_list_init (&input_file_chain);
368 lang_list_init (&lang_output_section_statement);
369 lang_list_init (&file_chain);
370 first_file = lang_add_input_file ((char *) NULL,
371 lang_input_file_is_marker_enum,
373 abs_output_section = lang_output_section_statement_lookup (BFD_ABS_SECTION_NAME);
375 abs_output_section->bfd_section = &bfd_abs_section;
379 /*----------------------------------------------------------------------
380 A region is an area of memory declared with the
381 MEMORY { name:org=exp, len=exp ... }
384 We maintain a list of all the regions here
386 If no regions are specified in the script, then the default is used
387 which is created when looked up to be the entire data space
390 static lang_memory_region_type *lang_memory_region_list;
391 static lang_memory_region_type **lang_memory_region_list_tail = &lang_memory_region_list;
393 lang_memory_region_type *
394 lang_memory_region_lookup (name)
395 CONST char *CONST name;
398 lang_memory_region_type *p = lang_memory_region_list;
400 for (p = lang_memory_region_list;
401 p != (lang_memory_region_type *) NULL;
404 if (strcmp (p->name, name) == 0)
409 if (strcmp (name, "*default*") == 0)
411 /* This is the default region, dig out first one on the list */
412 if (lang_memory_region_list != (lang_memory_region_type *) NULL)
414 return lang_memory_region_list;
418 lang_memory_region_type *new =
419 (lang_memory_region_type *) stat_alloc ((bfd_size_type) (sizeof (lang_memory_region_type)));
421 new->name = buystring (name);
422 new->next = (lang_memory_region_type *) NULL;
424 *lang_memory_region_list_tail = new;
425 lang_memory_region_list_tail = &new->next;
427 new->length = ~(bfd_size_type)0;
429 new->had_full_message = false;
436 lang_output_section_statement_type *
437 lang_output_section_find (name)
438 CONST char *CONST name;
440 lang_statement_union_type *u;
441 lang_output_section_statement_type *lookup;
443 for (u = lang_output_section_statement.head;
444 u != (lang_statement_union_type *) NULL;
447 lookup = &u->output_section_statement;
448 if (strcmp (name, lookup->name) == 0)
453 return (lang_output_section_statement_type *) NULL;
456 lang_output_section_statement_type *
457 lang_output_section_statement_lookup (name)
458 CONST char *CONST name;
460 lang_output_section_statement_type *lookup;
462 lookup = lang_output_section_find (name);
463 if (lookup == (lang_output_section_statement_type *) NULL)
466 lookup = (lang_output_section_statement_type *)
467 new_stat (lang_output_section_statement, stat_ptr);
468 lookup->region = (lang_memory_region_type *) NULL;
470 lookup->block_value = 1;
473 lookup->next = (lang_statement_union_type *) NULL;
474 lookup->bfd_section = (asection *) NULL;
475 lookup->processed = false;
476 lookup->loadable = 1;
477 lookup->addr_tree = (etree_type *) NULL;
478 lang_list_init (&lookup->children);
480 lookup->memspec = (CONST char *) NULL;
482 lookup->subsection_alignment = -1;
483 lookup->section_alignment = -1;
484 lookup->load_base = (union etree_union *) NULL;
486 lang_statement_append (&lang_output_section_statement,
487 (lang_statement_union_type *) lookup,
495 print_flags (ignore_flags)
498 fprintf (config.map_file, "(");
500 if (flags->flag_read)
501 fprintf (outfile, "R");
502 if (flags->flag_write)
503 fprintf (outfile, "W");
504 if (flags->flag_executable)
505 fprintf (outfile, "X");
506 if (flags->flag_loadable)
507 fprintf (outfile, "L");
509 fprintf (config.map_file, ")");
515 lang_memory_region_type *m;
517 fprintf (config.map_file, "**MEMORY CONFIGURATION**\n\n");
519 fprintf (config.map_file, "name\t\torigin\t\tlength\t\tattributes\n");
521 fprintf (config.map_file,
522 "name\t\torigin length r_size c_size is attributes\n");
525 for (m = lang_memory_region_list;
526 m != (lang_memory_region_type *) NULL;
529 fprintf (config.map_file, "%-16s", m->name);
530 print_address (m->origin);
532 print_address ((bfd_vma)m->length);
534 print_address ((bfd_vma)m->old_length);
536 print_address (m->current - m->origin);
539 fprintf(config.map_file," %2d%% ", ( m->current - m->origin) * 100 / m->old_length);
540 print_flags (&m->flags);
541 fprintf (config.map_file, "\n");
543 fprintf (config.map_file, "\n\n**LINK EDITOR MEMORY MAP**\n\n");
544 fprintf (config.map_file, "output input virtual\n");
545 fprintf (config.map_file, "section section address tsize\n\n");
556 lang_output_section_statement_type * s;
558 /* asection *section = bfd_get_section_by_name(output_bfd, s->name);*/
559 section_userdata_type *new =
560 (section_userdata_type *)
561 stat_alloc ((bfd_size_type) (sizeof (section_userdata_type)));
563 s->bfd_section = bfd_get_section_by_name (output_bfd, s->name);
564 if (s->bfd_section == (asection *) NULL)
565 s->bfd_section = bfd_make_section (output_bfd, s->name);
566 if (s->bfd_section == (asection *) NULL)
568 einfo ("%P%F output format %s cannot represent section called %s\n",
569 output_bfd->xvec->name, s->name);
571 s->bfd_section->output_section = s->bfd_section;
572 /* s->bfd_section->flags = s->flags;*/
574 /* We initialize an output sections output offset to minus its own */
575 /* vma to allow us to output a section through itself */
576 s->bfd_section->output_offset = 0;
577 get_userdata (s->bfd_section) = (PTR) new;
581 /***********************************************************************
584 These expand statements like *(.text) and foo.o to a list of
585 explicit actions, like foo.o(.text), bar.o(.text) and
588 The toplevel routine, wild, takes a statement, section, file and
589 target. If either the section or file is null it is taken to be the
590 wildcard. Seperate lang_input_section statements are created for
591 each part of the expanstion, and placed after the statement provided.
596 wild_doit (ptr, section, output, file)
597 lang_statement_list_type * ptr;
599 lang_output_section_statement_type * output;
600 lang_input_statement_type * file;
602 if (output->bfd_section == (asection *) NULL)
605 /* Initialize the vma and size to the existing section. This will
606 be overriden in lang_size_sections unless SEC_NEVER_LOAD gets
608 if (section != (asection *) NULL)
610 bfd_set_section_vma (0, output->bfd_section,
611 bfd_section_vma (0, section));
612 output->bfd_section->_raw_size = section->_raw_size;
616 if (section != (asection *) NULL
617 && section->output_section == (asection *) NULL)
619 /* Add a section reference to the list */
620 lang_input_section_type *new = new_stat (lang_input_section, ptr);
622 new->section = section;
624 section->output_section = output->bfd_section;
626 /* Be selective about what the output section inherits from the
629 if ((section->flags & SEC_SHARED_LIBRARY) != 0)
630 section->output_section->flags |= section->flags;
632 section->output_section->flags |= section->flags & ~SEC_NEVER_LOAD;
634 if (!output->loadable)
636 /* Turn off load flag */
637 output->bfd_section->flags &= ~SEC_LOAD;
638 output->bfd_section->flags |= SEC_NEVER_LOAD;
640 if (section->alignment_power > output->bfd_section->alignment_power)
642 output->bfd_section->alignment_power = section->alignment_power;
644 /* If supplied an aligmnet, then force it */
645 if (output->section_alignment != -1)
647 output->bfd_section->alignment_power = output->section_alignment;
653 our_bfd_get_section_by_name (abfd, section)
657 return bfd_get_section_by_name (abfd, section);
661 wild_section (ptr, section, file, output)
662 lang_wild_statement_type * ptr;
664 lang_input_statement_type * file;
665 lang_output_section_statement_type * output;
669 if (file->just_syms_flag == false)
671 if (section == (char *) NULL)
673 /* Do the creation to all sections in the file */
674 for (s = file->the_bfd->sections; s != (asection *) NULL; s = s->next)
677 if ((s->flags & SEC_IS_COMMON) == 0)
679 wild_doit (&ptr->children, s, output, file);
685 /* Do the creation to the named section only */
686 wild_doit (&ptr->children,
687 our_bfd_get_section_by_name (file->the_bfd, section),
693 /* passed a file name (which must have been seen already and added to
694 the statement tree. We will see if it has been opened already and
695 had its symbols read. If not then we'll read it.
697 Archives are pecuilar here. We may open them once, but if they do
698 not define anything we need at the time, they won't have all their
699 symbols read. If we need them later, we'll have to redo it.
702 lang_input_statement_type *
704 CONST char *CONST name;
706 lang_input_statement_type *search;
708 for (search = (lang_input_statement_type *) input_file_chain.head;
709 search != (lang_input_statement_type *) NULL;
710 search = (lang_input_statement_type *) search->next_real_file)
712 if (search->filename == (char *) NULL && name == (char *) NULL)
716 if (search->filename != (char *) NULL && name != (char *) NULL)
718 if (strcmp (search->filename, name) == 0)
720 ldmain_open_file_read_symbol (search);
726 /* There isn't an afile entry for this file yet, this must be
727 because the name has only appeared inside a load script and not
728 on the command line */
729 search = new_afile (name, lang_input_file_is_file_enum, default_target);
730 ldmain_open_file_read_symbol (search);
737 wild (s, section, file, target, output)
738 lang_wild_statement_type * s;
739 CONST char *CONST section;
740 CONST char *CONST file;
741 CONST char *CONST target;
742 lang_output_section_statement_type * output;
744 lang_input_statement_type *f;
746 if (file == (char *) NULL)
748 /* Perform the iteration over all files in the list */
749 for (f = (lang_input_statement_type *) file_chain.head;
750 f != (lang_input_statement_type *) NULL;
751 f = (lang_input_statement_type *) f->next)
753 wild_section (s, section, f, output);
755 /* Once more for the script file */
756 wild_section(s, section, script_file, output);
760 /* Perform the iteration over a single file */
761 wild_section (s, section, lookup_name (file), output);
763 if (section != (char *) NULL
764 && strcmp (section, "COMMON") == 0
765 && default_common_section == (lang_output_section_statement_type *) NULL)
767 /* Remember the section that common is going to incase we later
768 get something which doesn't know where to put it */
769 default_common_section = output;
774 read in all the files
778 CONST char *CONST name;
780 extern unsigned long ldfile_output_machine;
781 extern enum bfd_architecture ldfile_output_architecture;
783 extern CONST char *output_filename;
786 if (output_target == (char *) NULL)
788 if (current_target != (char *) NULL)
789 output_target = current_target;
791 output_target = default_target;
793 output = bfd_openw (name, output_target);
794 output_filename = name;
796 if (output == (bfd *) NULL)
798 if (bfd_error == invalid_target)
800 einfo ("%P%F target %s not found\n", output_target);
802 einfo ("%P%F problem opening output file %s, %E\n", name);
805 /* output->flags |= D_PAGED;*/
807 bfd_set_format (output, bfd_object);
808 bfd_set_arch_mach (output,
809 ldfile_output_architecture,
810 ldfile_output_machine);
811 bfd_set_gp_size (output, g_switch_value);
819 ldlang_open_output (statement)
820 lang_statement_union_type * statement;
822 switch (statement->header.type)
824 case lang_output_statement_enum:
825 output_bfd = open_output (statement->output_statement.name);
826 ldemul_set_output_arch ();
827 if (config.magic_demand_paged && !config.relocateable_output)
828 output_bfd->flags |= D_PAGED;
830 output_bfd->flags &= ~D_PAGED;
831 if (config.text_read_only)
832 output_bfd->flags |= WP_TEXT;
834 output_bfd->flags &= ~WP_TEXT;
837 case lang_target_statement_enum:
838 current_target = statement->target_statement.target;
846 open_input_bfds (statement)
847 lang_statement_union_type * statement;
849 switch (statement->header.type)
851 case lang_target_statement_enum:
852 current_target = statement->target_statement.target;
854 case lang_wild_statement_enum:
855 /* Maybe we should load the file's symbols */
856 if (statement->wild_statement.filename)
858 (void) lookup_name (statement->wild_statement.filename);
861 case lang_input_statement_enum:
862 if (statement->input_statement.real == true)
864 statement->input_statement.target = current_target;
865 lookup_name (statement->input_statement.filename);
873 /* If there are [COMMONS] statements, put a wild one into the bss section */
876 lang_reasonable_defaults ()
882 lang_output_section_statement_lookup (".text");
883 lang_output_section_statement_lookup (".data");
885 default_common_section =
886 lang_output_section_statement_lookup (".bss");
889 if (placed_commons == false)
891 lang_wild_statement_type *new =
892 new_stat (lang_wild_statement,
893 &default_common_section->children);
895 new->section_name = "COMMON";
896 new->filename = (char *) NULL;
897 lang_list_init (&new->children);
904 Add the supplied name to the symbol table as an undefined reference.
905 Remove items from the chain as we open input bfds
907 typedef struct ldlang_undef_chain_list
909 struct ldlang_undef_chain_list *next;
911 } ldlang_undef_chain_list_type;
913 static ldlang_undef_chain_list_type *ldlang_undef_chain_list_head;
916 ldlang_add_undef (name)
917 CONST char *CONST name;
919 ldlang_undef_chain_list_type *new =
920 (ldlang_undef_chain_list_type
921 *) stat_alloc ((bfd_size_type) (sizeof (ldlang_undef_chain_list_type)));
923 new->next = ldlang_undef_chain_list_head;
924 ldlang_undef_chain_list_head = new;
926 new->name = buystring (name);
929 /* Run through the list of undefineds created above and place them
930 into the linker hash table as undefined symbols belonging to the
934 lang_place_undefineds ()
936 ldlang_undef_chain_list_type *ptr = ldlang_undef_chain_list_head;
938 while (ptr != (ldlang_undef_chain_list_type *) NULL)
941 asymbol **def_ptr = (asymbol **) stat_alloc ((bfd_size_type) (sizeof (asymbol **)));
943 def = (asymbol *) bfd_make_empty_symbol (script_file->the_bfd);
945 def->name = ptr->name;
946 def->section = &bfd_und_section;
947 Q_enter_global_ref (def_ptr, ptr->name);
952 /* Copy important data from out internal form to the bfd way. Also
953 create a section for the dummy file
957 lang_create_output_section_statements ()
959 lang_statement_union_type *os;
961 for (os = lang_output_section_statement.head;
962 os != (lang_statement_union_type *) NULL;
963 os = os->output_section_statement.next)
965 lang_output_section_statement_type *s =
966 &os->output_section_statement;
974 lang_init_script_file ()
976 script_file = lang_add_input_file ("command line",
977 lang_input_file_is_fake_enum,
979 script_file->the_bfd = bfd_create ("command line", output_bfd);
980 script_file->symbol_count = 0;
981 script_file->the_bfd->sections = 0;
983 /* The user data of a bfd points to the input statement attatched */
984 script_file->the_bfd->usrdata = (void *)script_file;
985 script_file->common_section =
986 bfd_make_section(script_file->the_bfd,"COMMON");
989 lang_output_section_statement_lookup (BFD_ABS_SECTION_NAME);
991 abs_output_section->bfd_section = &bfd_abs_section;
995 /* Open input files and attatch to output sections */
997 map_input_to_output_sections (s, target, output_section_statement)
998 lang_statement_union_type * s;
1000 lang_output_section_statement_type * output_section_statement;
1002 for (; s != (lang_statement_union_type *) NULL; s = s->next)
1004 switch (s->header.type)
1008 case lang_wild_statement_enum:
1009 wild (&s->wild_statement, s->wild_statement.section_name,
1010 s->wild_statement.filename, target,
1011 output_section_statement);
1014 case lang_constructors_statement_enum:
1015 map_input_to_output_sections (constructor_list.head,
1017 output_section_statement);
1019 case lang_output_section_statement_enum:
1020 map_input_to_output_sections (s->output_section_statement.children.head,
1022 &s->output_section_statement);
1024 case lang_output_statement_enum:
1026 case lang_target_statement_enum:
1027 target = s->target_statement.target;
1029 case lang_fill_statement_enum:
1030 case lang_input_section_enum:
1031 case lang_object_symbols_statement_enum:
1032 case lang_data_statement_enum:
1033 case lang_assignment_statement_enum:
1034 case lang_padding_statement_enum:
1036 case lang_afile_asection_pair_statement_enum:
1039 case lang_address_statement_enum:
1040 /* Mark the specified section with the supplied address */
1042 lang_output_section_statement_type *os =
1043 lang_output_section_statement_lookup
1044 (s->address_statement.section_name);
1046 os->addr_tree = s->address_statement.address;
1047 if (os->bfd_section == (asection *) NULL)
1049 einfo ("%P%F can't set the address of undefined section %s\n",
1050 s->address_statement.section_name);
1054 case lang_input_statement_enum:
1055 /* A standard input statement, has no wildcards */
1056 /* ldmain_open_file_read_symbol(&s->input_statement);*/
1067 print_output_section_statement (output_section_statement)
1068 lang_output_section_statement_type * output_section_statement;
1070 asection *section = output_section_statement->bfd_section;
1073 print_section (output_section_statement->name);
1078 print_dot = section->vma;
1082 print_address (section->vma);
1084 print_size (section->_raw_size);
1086 print_size(section->_cooked_size);
1088 print_alignment (section->alignment_power);
1091 fprintf (config.map_file, "%s flags", output_section_statement->region->name);
1092 print_flags (stdout, &output_section_statement->flags);
1094 if (section->flags & SEC_LOAD)
1095 fprintf (config.map_file, "load ");
1096 if (section->flags & SEC_ALLOC)
1097 fprintf (config.map_file, "alloc ");
1098 if (section->flags & SEC_RELOC)
1099 fprintf (config.map_file, "reloc ");
1100 if (section->flags & SEC_HAS_CONTENTS)
1101 fprintf (config.map_file, "contents ");
1106 fprintf (config.map_file, "No attached output section");
1109 if (output_section_statement->load_base)
1111 int b = exp_get_value_int(output_section_statement->load_base,
1112 0, "output base", lang_final_phase_enum);
1113 printf("Output address %08x\n", b);
1115 if (output_section_statement->section_alignment >= 0
1116 || output_section_statement->section_alignment >= 0)
1118 printf("\t\t\t\t\tforced alignment ");
1119 if ( output_section_statement->section_alignment >= 0)
1121 printf("section 2**%d ",output_section_statement->section_alignment );
1123 if ( output_section_statement->subsection_alignment >= 0)
1125 printf("subsection 2**%d ",output_section_statement->subsection_alignment );
1130 print_statement (output_section_statement->children.head,
1131 output_section_statement);
1136 print_assignment (assignment, output_section)
1137 lang_assignment_statement_type * assignment;
1138 lang_output_section_statement_type * output_section;
1140 etree_value_type result;
1146 print_address (print_dot);
1148 result = exp_fold_tree (assignment->exp->assign.src,
1150 lang_final_phase_enum,
1156 print_address (result.value);
1160 fprintf (config.map_file, "*undefined*");
1163 exp_print_tree (assignment->exp);
1165 fprintf (config.map_file, "\n");
1169 print_input_statement (statm)
1170 lang_input_statement_type * statm;
1172 if (statm->filename != (char *) NULL)
1174 fprintf (config.map_file, "LOAD %s\n", statm->filename);
1183 fprintf (config.map_file, " ");
1185 fprintf (config.map_file, " ");
1186 print_address (outside_symbol_address (q));
1187 fprintf (config.map_file, " %s", q->name ? q->name : " ");
1192 print_input_section (in)
1193 lang_input_section_type * in;
1195 asection *i = in->section;
1196 int size = i->reloc_done ?
1197 bfd_get_section_size_after_reloc (i) :
1198 bfd_get_section_size_before_reloc (i);
1203 fprintf (config.map_file, " ");
1204 print_section (i->name);
1205 fprintf (config.map_file, " ");
1206 if (i->output_section)
1208 print_address (i->output_section->vma + i->output_offset);
1209 fprintf (config.map_file, " ");
1210 print_size (i->_raw_size);
1211 fprintf (config.map_file, " ");
1212 print_size(i->_cooked_size);
1213 fprintf (config.map_file, " ");
1214 print_alignment (i->alignment_power);
1215 fprintf (config.map_file, " ");
1219 bfd *abfd = in->ifile->the_bfd;
1221 if (in->ifile->just_syms_flag == true)
1223 fprintf (config.map_file, "symbols only ");
1226 fprintf (config.map_file, " %s ", abfd->xvec->name);
1227 if (abfd->my_archive != (bfd *) NULL)
1229 fprintf (config.map_file, "[%s]%s", abfd->my_archive->filename,
1234 fprintf (config.map_file, "%s", abfd->filename);
1236 fprintf (config.map_file, "(overhead %d bytes)", (int) bfd_alloc_size (abfd));
1239 /* Find all the symbols in this file defined in this section */
1241 if (in->ifile->symbol_count)
1245 for (p = in->ifile->asymbols; *p; p++)
1249 if (bfd_get_section (q) == i && q->flags & BSF_GLOBAL)
1262 print_dot = outside_section_address (i) + size;
1266 fprintf (config.map_file, "No output section allocated\n");
1272 print_fill_statement (fill)
1273 lang_fill_statement_type * fill;
1275 fprintf (config.map_file, "FILL mask ");
1276 print_fill (fill->fill);
1280 print_data_statement (data)
1281 lang_data_statement_type * data;
1283 /* bfd_vma value; */
1288 /* ASSERT(print_dot == data->output_vma);*/
1290 print_address (data->output_vma + data->output_section->vma);
1292 print_address (data->value);
1297 fprintf (config.map_file, "BYTE ");
1298 print_dot += BYTE_SIZE;
1301 fprintf (config.map_file, "SHORT ");
1302 print_dot += SHORT_SIZE;
1305 fprintf (config.map_file, "LONG ");
1306 print_dot += LONG_SIZE;
1310 exp_print_tree (data->exp);
1312 fprintf (config.map_file, "\n");
1317 print_padding_statement (s)
1318 lang_padding_statement_type * s;
1322 print_section ("*fill*");
1324 print_address (s->output_offset + s->output_section->vma);
1326 print_size (s->size);
1328 print_fill (s->fill);
1331 print_dot = s->output_offset + s->output_section->vma + s->size;
1336 print_wild_statement (w, os)
1337 lang_wild_statement_type * w;
1338 lang_output_section_statement_type * os;
1340 fprintf (config.map_file, " from ");
1341 if (w->filename != (char *) NULL)
1343 fprintf (config.map_file, "%s", w->filename);
1347 fprintf (config.map_file, "*");
1349 if (w->section_name != (char *) NULL)
1351 fprintf (config.map_file, "(%s)", w->section_name);
1355 fprintf (config.map_file, "(*)");
1358 print_statement (w->children.head, os);
1362 print_statement (s, os)
1363 lang_statement_union_type * s;
1364 lang_output_section_statement_type * os;
1368 switch (s->header.type)
1370 case lang_constructors_statement_enum:
1371 fprintf (config.map_file, "constructors:\n");
1372 print_statement (constructor_list.head, os);
1374 case lang_wild_statement_enum:
1375 print_wild_statement (&s->wild_statement, os);
1378 fprintf (config.map_file, "Fail with %d\n", s->header.type);
1381 case lang_address_statement_enum:
1382 fprintf (config.map_file, "address\n");
1384 case lang_object_symbols_statement_enum:
1385 fprintf (config.map_file, "object symbols\n");
1387 case lang_fill_statement_enum:
1388 print_fill_statement (&s->fill_statement);
1390 case lang_data_statement_enum:
1391 print_data_statement (&s->data_statement);
1393 case lang_input_section_enum:
1394 print_input_section (&s->input_section);
1396 case lang_padding_statement_enum:
1397 print_padding_statement (&s->padding_statement);
1399 case lang_output_section_statement_enum:
1400 print_output_section_statement (&s->output_section_statement);
1402 case lang_assignment_statement_enum:
1403 print_assignment (&s->assignment_statement,
1406 case lang_target_statement_enum:
1407 fprintf (config.map_file, "TARGET(%s)\n", s->target_statement.target);
1409 case lang_output_statement_enum:
1410 fprintf (config.map_file, "OUTPUT(%s %s)\n",
1411 s->output_statement.name,
1412 output_target ? output_target : "");
1414 case lang_input_statement_enum:
1415 print_input_statement (&s->input_statement);
1417 case lang_afile_asection_pair_statement_enum:
1429 print_statement (statement_list.head,
1430 abs_output_section);
1435 DEFUN (insert_pad, (this_ptr, fill, power, output_section_statement, dot),
1436 lang_statement_union_type ** this_ptr AND
1438 unsigned int power AND
1439 asection * output_section_statement AND
1442 /* Align this section first to the
1443 input sections requirement, then
1444 to the output section's requirement.
1445 If this alignment is > than any seen before,
1446 then record it too. Perform the alignment by
1447 inserting a magic 'padding' statement.
1450 unsigned int alignment_needed = align_power (dot, power) - dot;
1452 if (alignment_needed != 0)
1454 lang_statement_union_type *new =
1455 (lang_statement_union_type *)
1456 stat_alloc ((bfd_size_type) (sizeof (lang_padding_statement_type)));
1458 /* Link into existing chain */
1459 new->header.next = *this_ptr;
1461 new->header.type = lang_padding_statement_enum;
1462 new->padding_statement.output_section = output_section_statement;
1463 new->padding_statement.output_offset =
1464 dot - output_section_statement->vma;
1465 new->padding_statement.fill = fill;
1466 new->padding_statement.size = alignment_needed;
1470 /* Remember the most restrictive alignment */
1471 if (power > output_section_statement->alignment_power)
1473 output_section_statement->alignment_power = power;
1475 output_section_statement->_raw_size += alignment_needed;
1476 return alignment_needed + dot;
1480 /* Work out how much this section will move the dot point */
1482 DEFUN (size_input_section, (this_ptr, output_section_statement, fill, dot, relax),
1483 lang_statement_union_type ** this_ptr AND
1484 lang_output_section_statement_type * output_section_statement AND
1485 unsigned short fill AND
1489 lang_input_section_type *is = &((*this_ptr)->input_section);
1490 asection *i = is->section;
1492 if (is->ifile->just_syms_flag == false)
1494 if (output_section_statement->subsection_alignment != -1)
1495 i->alignment_power =
1496 output_section_statement->subsection_alignment;
1498 dot = insert_pad (this_ptr, fill, i->alignment_power,
1499 output_section_statement->bfd_section, dot);
1501 /* remember the largest size so we can malloc the largest area
1502 needed for the output stage. Only remember the size of sections
1503 which we will actually allocate */
1504 if ((i->flags & SEC_HAS_CONTENTS) != 0
1505 && (bfd_get_section_size_before_reloc (i) > largest_section))
1507 largest_section = bfd_get_section_size_before_reloc (i);
1510 /* Remember where in the output section this input section goes */
1512 i->output_offset = dot - output_section_statement->bfd_section->vma;
1514 /* Mark how big the output section must be to contain this now
1518 dot += i->_cooked_size;
1522 dot += i->_raw_size;
1524 output_section_statement->bfd_section->_raw_size = dot - output_section_statement->bfd_section->vma;
1528 i->output_offset = i->vma - output_section_statement->bfd_section->vma;
1534 /* Sizing happens in two passes, first pass we allocate worst case
1535 stuff. The second pass (if relaxing), we use what we learnt to
1536 change the size of some relocs from worst case to better
1538 static boolean had_relax;
1541 DEFUN (lang_size_sections, (s, output_section_statement, prev, fill, dot, relax),
1542 lang_statement_union_type * s AND
1543 lang_output_section_statement_type * output_section_statement AND
1544 lang_statement_union_type ** prev AND
1545 unsigned short fill AND
1549 /* Size up the sections from their constituent parts */
1550 for (; s != (lang_statement_union_type *) NULL; s = s->next)
1552 switch (s->header.type)
1555 case lang_output_section_statement_enum:
1558 lang_output_section_statement_type *os = &s->output_section_statement;
1560 /* If this is a shared library section, don't change the size
1562 if (os->bfd_section->flags & SEC_SHARED_LIBRARY)
1565 if (os->bfd_section == &bfd_abs_section)
1567 /* No matter what happens, an abs section starts at zero */
1568 bfd_set_section_vma (0, os->bfd_section, 0);
1572 if (os->addr_tree == (etree_type *) NULL)
1574 /* No address specified for this section, get one
1575 from the region specification
1577 if (os->region == (lang_memory_region_type *) NULL)
1579 os->region = lang_memory_region_lookup ("*default*");
1581 dot = os->region->current;
1587 r = exp_fold_tree (os->addr_tree,
1589 lang_allocating_phase_enum,
1591 if (r.valid == false)
1593 einfo ("%F%S: non constant address expression for section %s\n",
1598 /* The section starts here */
1599 /* First, align to what the section needs */
1602 dot = align_power (dot, os->bfd_section->alignment_power);
1603 bfd_set_section_vma (0, os->bfd_section, dot);
1605 if (os->load_base) {
1606 os->bfd_section->lma
1607 = exp_get_value_int(os->load_base, 0,"load base", lang_final_phase_enum);
1612 os->bfd_section->output_offset = 0;
1614 (void) lang_size_sections (os->children.head, os, &os->children.head,
1615 os->fill, dot, relax);
1616 /* Ignore the size of the input sections, use the vma and size to */
1620 after = ALIGN_N (os->bfd_section->vma +
1621 os->bfd_section->_raw_size,
1625 os->bfd_section->_raw_size = after - os->bfd_section->vma;
1626 dot = os->bfd_section->vma + os->bfd_section->_raw_size;
1627 os->processed = true;
1629 /* Replace into region ? */
1630 if (os->addr_tree == (etree_type *) NULL
1631 && os->region != (lang_memory_region_type *) NULL)
1633 os->region->current = dot;
1634 /* Make sure this isn't silly */
1635 if (( os->region->current
1636 > os->region->origin + os->region->length)
1637 || ( os->region->origin > os->region->current ))
1639 einfo ("%X%P: Region %s is full (%B section %s)\n",
1641 os->bfd_section->owner,
1642 os->bfd_section->name);
1643 /* Reset the region pointer */
1644 os->region->current = 0;
1652 case lang_constructors_statement_enum:
1653 dot = lang_size_sections (constructor_list.head,
1654 output_section_statement,
1655 &s->wild_statement.children.head,
1660 case lang_data_statement_enum:
1662 unsigned int size = 0;
1664 s->data_statement.output_vma = dot - output_section_statement->bfd_section->vma;
1665 s->data_statement.output_section =
1666 output_section_statement->bfd_section;
1668 switch (s->data_statement.type)
1682 output_section_statement->bfd_section->_raw_size += size;
1686 case lang_wild_statement_enum:
1688 dot = lang_size_sections (s->wild_statement.children.head,
1689 output_section_statement,
1690 &s->wild_statement.children.head,
1696 case lang_object_symbols_statement_enum:
1697 create_object_symbols = output_section_statement;
1699 case lang_output_statement_enum:
1700 case lang_target_statement_enum:
1702 case lang_input_section_enum:
1707 if( relax_section (prev))
1713 (*prev)->input_section.section->_cooked_size =
1714 (*prev)->input_section.section->_raw_size ;
1717 dot = size_input_section (prev,
1718 output_section_statement,
1719 output_section_statement->fill,
1722 case lang_input_statement_enum:
1724 case lang_fill_statement_enum:
1725 s->fill_statement.output_section = output_section_statement->bfd_section;
1727 fill = s->fill_statement.fill;
1729 case lang_assignment_statement_enum:
1731 bfd_vma newdot = dot;
1733 exp_fold_tree (s->assignment_statement.exp,
1734 output_section_statement,
1735 lang_allocating_phase_enum,
1739 if (newdot != dot && !relax)
1740 /* We've been moved ! so insert a pad */
1742 lang_statement_union_type *new =
1743 (lang_statement_union_type *)
1744 stat_alloc ((bfd_size_type) (sizeof (lang_padding_statement_type)));
1746 /* Link into existing chain */
1747 new->header.next = *prev;
1749 new->header.type = lang_padding_statement_enum;
1750 new->padding_statement.output_section =
1751 output_section_statement->bfd_section;
1752 new->padding_statement.output_offset =
1753 dot - output_section_statement->bfd_section->vma;
1754 new->padding_statement.fill = fill;
1755 new->padding_statement.size = newdot - dot;
1756 output_section_statement->bfd_section->_raw_size +=
1757 new->padding_statement.size;
1766 /* This can only get here when relaxing is turned on */
1767 case lang_padding_statement_enum:
1769 case lang_address_statement_enum:
1772 prev = &s->header.next;
1778 DEFUN (lang_do_assignments, (s, output_section_statement, fill, dot),
1779 lang_statement_union_type * s AND
1780 lang_output_section_statement_type * output_section_statement AND
1781 unsigned short fill AND
1785 for (; s != (lang_statement_union_type *) NULL; s = s->next)
1787 switch (s->header.type)
1789 case lang_constructors_statement_enum:
1790 dot = lang_do_assignments (constructor_list.head,
1791 output_section_statement,
1796 case lang_output_section_statement_enum:
1798 lang_output_section_statement_type *os =
1799 &(s->output_section_statement);
1801 dot = os->bfd_section->vma;
1802 (void) lang_do_assignments (os->children.head, os, os->fill, dot);
1803 dot = os->bfd_section->vma + os->bfd_section->_raw_size;
1806 case lang_wild_statement_enum:
1808 dot = lang_do_assignments (s->wild_statement.children.head,
1809 output_section_statement,
1814 case lang_object_symbols_statement_enum:
1815 case lang_output_statement_enum:
1816 case lang_target_statement_enum:
1818 case lang_common_statement_enum:
1821 case lang_data_statement_enum:
1823 etree_value_type value;
1825 value = exp_fold_tree (s->data_statement.exp,
1827 lang_final_phase_enum, dot, &dot);
1828 s->data_statement.value = value.value;
1829 if (value.valid == false)
1830 einfo ("%F%P: Invalid data statement\n");
1832 switch (s->data_statement.type)
1845 case lang_input_section_enum:
1847 asection *in = s->input_section.section;
1849 dot += bfd_get_section_size_before_reloc (in);
1853 case lang_input_statement_enum:
1855 case lang_fill_statement_enum:
1856 fill = s->fill_statement.fill;
1858 case lang_assignment_statement_enum:
1860 exp_fold_tree (s->assignment_statement.exp,
1861 output_section_statement,
1862 lang_final_phase_enum,
1868 case lang_padding_statement_enum:
1869 dot += s->padding_statement.size;
1874 case lang_address_statement_enum:
1885 lang_relocate_globals ()
1888 Each ldsym_type maintains a chain of pointers to asymbols which
1889 references the definition. Replace each pointer to the referenence
1890 with a pointer to only one place, preferably the definition. If
1891 the defintion isn't available then the common symbol, and if
1892 there isn't one of them then choose one reference.
1895 FOR_EACH_LDSYM (lgs)
1899 /* Skip indirect symbols. */
1900 if (lgs->flags & SYM_INDIRECT)
1903 if (lgs->sdefs_chain)
1905 it = *(lgs->sdefs_chain);
1907 else if (lgs->scoms_chain != (asymbol **) NULL)
1909 it = *(lgs->scoms_chain);
1911 else if (lgs->srefs_chain != (asymbol **) NULL)
1913 it = *(lgs->srefs_chain);
1917 /* This can happen when the command line asked for a symbol to
1919 it = (asymbol *) NULL;
1921 if (it != (asymbol *) NULL)
1924 asymbol **ptr = lgs->srefs_chain;;
1925 if (lgs->flags & SYM_WARNING)
1927 produce_warnings (lgs, it);
1930 while (ptr != (asymbol **) NULL
1933 asymbol *ref = *ptr;
1936 ptr = (asymbol **) (ref->udata);
1948 int warn = config.relocateable_output != true;
1949 if (entry_symbol == (char *) NULL)
1951 /* No entry has been specified, look for start, but don't warn */
1952 entry_symbol = "start";
1955 lgs = ldsym_get_soft (entry_symbol);
1956 if (lgs && lgs->sdefs_chain)
1958 asymbol *sy = *(lgs->sdefs_chain);
1960 /* We can set the entry address*/
1961 bfd_set_start_address (output_bfd,
1962 outside_symbol_address (sy));
1967 /* Can't find anything reasonable,
1968 use the first address in the text section
1970 asection *ts = bfd_get_section_by_name (output_bfd, ".text");
1974 einfo ("%P: Warning, can't find entry symbol %s, defaulting to %V\n",
1975 entry_symbol, ts->vma);
1977 bfd_set_start_address (output_bfd, ts->vma);
1982 einfo ("%P: Warning, can't find entry symbol %s, not setting start address\n",
1988 /* By now we know the target architecture, and we may have an */
1989 /* ldfile_output_machine_name */
1993 lang_statement_union_type *file;
1995 unsigned long input_machine;
1996 enum bfd_architecture input_architecture;
1997 CONST bfd_arch_info_type *compatible;
1999 for (file = file_chain.head;
2000 file != (lang_statement_union_type *) NULL;
2001 file = file->input_statement.next)
2003 input_bfd = file->input_statement.the_bfd;
2005 input_machine = bfd_get_mach (input_bfd);
2006 input_architecture = bfd_get_arch (input_bfd);
2009 /* Inspect the architecture and ensure we're linking like with
2012 compatible = bfd_arch_get_compatible (input_bfd,
2017 ldfile_output_machine = compatible->mach;
2018 ldfile_output_architecture = compatible->arch;
2023 info ("%P: warning, %s architecture of input file `%B' incompatible with %s output\n",
2024 bfd_printable_name (input_bfd), input_bfd,
2025 bfd_printable_name (output_bfd));
2027 bfd_set_arch_mach (output_bfd,
2036 * run through all the global common symbols and tie them
2037 * to the output section requested.
2039 As an experiment we do this 4 times, once for all the byte sizes,
2040 then all the two bytes, all the four bytes and then everything else
2049 if (config.relocateable_output == false ||
2050 command_line.force_common_definition == true)
2052 for (power = 1; (config.sort_common == true && power == 1) || (power <= 16); power <<= 1)
2054 for (lgs = symbol_head;
2055 lgs != (ldsym_type *) NULL;
2059 unsigned int power_of_two;
2063 if (lgs->scoms_chain != (asymbol **) NULL)
2065 com = *(lgs->scoms_chain);
2095 if (config.sort_common == false || align == power)
2099 /* Change from a common symbol into a definition of
2101 lgs->sdefs_chain = lgs->scoms_chain;
2102 lgs->scoms_chain = (asymbol **) NULL;
2105 /* Point to the correct common section */
2106 symbfd = bfd_asymbol_bfd (com);
2107 if (com->section == &bfd_com_section)
2109 ((lang_input_statement_type *) symbfd->usrdata)
2116 name = bfd_get_section_name (symbfd,
2118 newsec = bfd_get_section_by_name (symbfd,
2120 /* BFD backend must provide this section. */
2121 if (newsec == (asection *) NULL)
2122 einfo ("%P%F: No output section %s", name);
2123 com->section = newsec;
2126 /* Fix the size of the common section */
2128 com->section->_raw_size =
2129 ALIGN_N (com->section->_raw_size, align);
2131 /* Remember if this is the biggest alignment ever seen */
2132 if (power_of_two > com->section->alignment_power)
2134 com->section->alignment_power = power_of_two;
2137 /* Symbol stops being common and starts being global, but
2138 we remember that it was common once. */
2140 com->flags = BSF_EXPORT | BSF_GLOBAL | BSF_OLD_COMMON;
2141 com->value = com->section->_raw_size;
2143 if (write_map && config.map_file)
2145 fprintf (config.map_file, "Allocating common %s: %x at %x %s\n",
2148 (unsigned) com->value,
2149 bfd_asymbol_bfd(com)->filename);
2152 com->section->_raw_size += size;
2165 run through the input files and ensure that every input
2166 section has somewhere to go. If one is found without
2167 a destination then create an input request and place it
2168 into the statement tree.
2172 lang_place_orphans ()
2174 lang_input_statement_type *file;
2176 for (file = (lang_input_statement_type *) file_chain.head;
2177 file != (lang_input_statement_type *) NULL;
2178 file = (lang_input_statement_type *) file->next)
2182 for (s = file->the_bfd->sections;
2183 s != (asection *) NULL;
2186 if (s->output_section == (asection *) NULL)
2188 /* This section of the file is not attatched, root
2189 around for a sensible place for it to go */
2191 if (file->common_section == s)
2193 /* This is a lonely common section which must
2194 have come from an archive. We attatch to the
2195 section with the wildcard */
2196 if (config.relocateable_output != true
2197 && command_line.force_common_definition == false)
2199 if (default_common_section ==
2200 (lang_output_section_statement_type *) NULL)
2202 info ("%P: No [COMMON] command, defaulting to .bss\n");
2204 default_common_section =
2205 lang_output_section_statement_lookup (".bss");
2208 wild_doit (&default_common_section->children, s,
2209 default_common_section, file);
2214 lang_output_section_statement_type *os =
2215 lang_output_section_statement_lookup (s->name);
2217 wild_doit (&os->children, s, os, file);
2226 lang_set_flags (ptr, flags)
2230 boolean state = false;
2245 /* ptr->flag_read = state; */
2248 /* ptr->flag_write = state; */
2251 /* ptr->flag_executable= state;*/
2255 /* ptr->flag_loadable= state;*/
2258 einfo ("%P%F illegal syntax in flags\n");
2268 lang_for_each_file (func)
2269 void (*func) PARAMS ((lang_input_statement_type *));
2271 lang_input_statement_type *f;
2273 for (f = (lang_input_statement_type *) file_chain.head;
2274 f != (lang_input_statement_type *) NULL;
2275 f = (lang_input_statement_type *) f->next)
2283 lang_for_each_input_section (func)
2284 void (*func) PARAMS ((bfd * ab, asection * as));
2286 lang_input_statement_type *f;
2288 for (f = (lang_input_statement_type *) file_chain.head;
2289 f != (lang_input_statement_type *) NULL;
2290 f = (lang_input_statement_type *) f->next)
2294 for (s = f->the_bfd->sections;
2295 s != (asection *) NULL;
2298 func (f->the_bfd, s);
2306 ldlang_add_file (entry)
2307 lang_input_statement_type * entry;
2310 lang_statement_append (&file_chain,
2311 (lang_statement_union_type *) entry,
2316 lang_add_output (name)
2319 lang_output_statement_type *new = new_stat (lang_output_statement,
2323 had_output_filename = true;
2327 static lang_output_section_statement_type *current_section;
2329 static int topower(x)
2334 if (x < 0) return -1;
2335 for (l = 0; l < 32; l++)
2337 if (i >= x) return l;
2343 lang_enter_output_section_statement (output_section_statement_name,
2344 address_exp, flags, block_value,
2345 align, subalign, base)
2346 char *output_section_statement_name;
2347 etree_type * address_exp;
2349 bfd_vma block_value;
2351 etree_type *subalign;
2354 lang_output_section_statement_type *os;
2358 lang_output_section_statement_lookup (output_section_statement_name);
2362 /* Add this statement to tree */
2363 /* add_statement(lang_output_section_statement_enum,
2364 output_section_statement);*/
2365 /* Make next things chain into subchain of this */
2367 if (os->addr_tree ==
2368 (etree_type *) NULL)
2374 if (flags & SEC_NEVER_LOAD)
2378 os->block_value = block_value ? block_value : 1;
2379 stat_ptr = &os->children;
2381 os->subsection_alignment = topower(
2382 exp_get_value_int(subalign, -1,
2383 "subsection alignment",
2385 os->section_alignment = topower(
2386 exp_get_value_int(align, -1,
2387 "section alignment", 0));
2389 os->load_base = base;
2396 if (had_output_filename == false)
2398 extern CONST char *output_filename;
2400 lang_add_output (output_filename);
2404 /* Reset the current counters in the regions */
2406 reset_memory_regions ()
2408 lang_memory_region_type *p = lang_memory_region_list;
2410 for (p = lang_memory_region_list;
2411 p != (lang_memory_region_type *) NULL;
2414 p->old_length = (bfd_size_type) (p->current - p->origin);
2415 p->current = p->origin;
2422 DEFUN (create_symbol, (name, flags, section),
2423 CONST char *name AND
2427 extern lang_input_statement_type *script_file;
2428 asymbol **def_ptr = (asymbol **) stat_alloc ((bfd_size_type) (sizeof (asymbol **)));
2430 /* Add this definition to script file */
2431 asymbol *def = (asymbol *) bfd_make_empty_symbol (script_file->the_bfd);
2432 def->name = buystring (name);
2435 def->section = section;
2437 Q_enter_global_ref (def_ptr, name);
2444 if (had_script == false)
2446 /* Read the emulation's appropriate default script. */
2447 char *scriptname = ldemul_get_script ();
2448 size_t size = strlen (scriptname) + 13;
2449 char *buf = (char *) ldmalloc(size);
2451 sprintf (buf, "-Tldscripts/%s", scriptname);
2452 parse_line (buf, 0);
2456 lang_reasonable_defaults ();
2457 current_target = default_target;
2459 lang_for_each_statement (ldlang_open_output); /* Open the output file */
2460 /* For each output section statement, create a section in the output
2462 lang_create_output_section_statements ();
2464 /* Create a dummy bfd for the script */
2465 lang_init_script_file ();
2467 /* Add to the hash table all undefineds on the command line */
2468 lang_place_undefineds ();
2470 /* Create a bfd for each input file */
2471 current_target = default_target;
2472 lang_for_each_statement (open_input_bfds);
2474 /* Run through the contours of the script and attatch input sections
2475 to the correct output sections
2477 find_constructors ();
2478 map_input_to_output_sections (statement_list.head, (char *) NULL,
2479 (lang_output_section_statement_type *) NULL);
2482 /* Find any sections not attatched explicitly and handle them */
2483 lang_place_orphans ();
2485 /* Size up the common data */
2488 ldemul_before_allocation ();
2498 lang_size_sections (statement_list.head,
2499 (lang_output_section_statement_type *) NULL,
2500 &(statement_list.head), 0, (bfd_vma) 0, true);
2501 /* FIXME. Until the code in relax is fixed so that it only reads in
2502 stuff once, we cant iterate since there is no way for the linker to
2503 know what has been patched and what hasn't */
2509 /* Now run around and relax if we can */
2510 if (command_line.relax)
2512 /* First time round is a trial run to get the 'worst case' addresses of the
2513 objects if there was no relaxing */
2514 lang_size_sections (statement_list.head,
2515 (lang_output_section_statement_type *) NULL,
2516 &(statement_list.head), 0, (bfd_vma) 0, false);
2520 /* Move the global symbols around so the second pass of relaxing can
2522 lang_relocate_globals ();
2524 reset_memory_regions ();
2526 /* Do all the assignments, now that we know the final restingplaces
2527 of all the symbols */
2529 lang_do_assignments (statement_list.head,
2534 /* Perform another relax pass - this time we know where the
2535 globals are, so can make better guess */
2536 lang_size_sections (statement_list.head,
2537 (lang_output_section_statement_type *) NULL,
2538 &(statement_list.head), 0, (bfd_vma) 0, true);
2546 /* Size up the sections */
2547 lang_size_sections (statement_list.head,
2549 &(statement_list.head), 0, (bfd_vma) 0, false);
2554 /* See if anything special should be done now we know how big
2556 ldemul_after_allocation ();
2558 /* Do all the assignments, now that we know the final restingplaces
2559 of all the symbols */
2561 lang_do_assignments (statement_list.head,
2566 /* Move the global symbols around */
2567 lang_relocate_globals ();
2569 /* Make sure that we're not mixing architectures */
2577 /* EXPORTED TO YACC */
2580 lang_add_wild (section_name, filename)
2581 CONST char *CONST section_name;
2582 CONST char *CONST filename;
2584 lang_wild_statement_type *new = new_stat (lang_wild_statement,
2587 if (section_name != (char *) NULL && strcmp (section_name, "COMMON") == 0)
2589 placed_commons = true;
2591 if (filename != (char *) NULL)
2593 lang_has_input_file = true;
2595 new->section_name = section_name;
2596 new->filename = filename;
2597 lang_list_init (&new->children);
2601 lang_section_start (name, address)
2603 etree_type * address;
2605 lang_address_statement_type *ad = new_stat (lang_address_statement, stat_ptr);
2607 ad->section_name = name;
2608 ad->address = address;
2612 lang_add_entry (name)
2615 entry_symbol = name;
2619 lang_add_target (name)
2622 lang_target_statement_type *new = new_stat (lang_target_statement,
2638 map_option_f = true;
2649 lang_fill_statement_type *new = new_stat (lang_fill_statement,
2656 lang_add_data (type, exp)
2658 union etree_union *exp;
2661 lang_data_statement_type *new = new_stat (lang_data_statement,
2670 lang_add_assignment (exp)
2673 lang_assignment_statement_type *new = new_stat (lang_assignment_statement,
2680 lang_add_attribute (attribute)
2681 enum statement_enum attribute;
2683 new_statement (attribute, sizeof (lang_statement_union_type), stat_ptr);
2690 if (startup_file != (char *) NULL)
2692 einfo ("%P%FMultiple STARTUP files\n");
2694 first_file->filename = name;
2695 first_file->local_sym_name = name;
2697 startup_file = name;
2704 lang_float_flag = maybe;
2708 lang_leave_output_section_statement (fill, memspec)
2710 CONST char *memspec;
2712 current_section->fill = fill;
2713 current_section->region = lang_memory_region_lookup (memspec);
2714 stat_ptr = &statement_list;
2716 /* We remember if we are closing a .data section, since we use it to
2717 store constructors in */
2718 if (strcmp (current_section->name, ".data") == 0)
2720 end_of_data_section_statement_list = statement_list;
2726 Create an absolute symbol with the given name with the value of the
2727 address of first byte of the section named.
2729 If the symbol already exists, then do nothing.
2732 lang_abs_symbol_at_beginning_of (section, name)
2733 CONST char *section;
2736 if (ldsym_undefined (name))
2738 asection *s = bfd_get_section_by_name (output_bfd, section);
2739 asymbol *def = create_symbol (name,
2740 BSF_GLOBAL | BSF_EXPORT,
2743 if (s != (asection *) NULL)
2745 def->value = s->vma;
2755 Create an absolute symbol with the given name with the value of the
2756 address of the first byte after the end of the section named.
2758 If the symbol already exists, then do nothing.
2761 lang_abs_symbol_at_end_of (section, name)
2762 CONST char *section;
2765 if (ldsym_undefined (name))
2767 asection *s = bfd_get_section_by_name (output_bfd, section);
2769 /* Add a symbol called _end */
2770 asymbol *def = create_symbol (name,
2771 BSF_GLOBAL | BSF_EXPORT,
2774 if (s != (asection *) NULL)
2776 def->value = s->vma + s->_raw_size;
2786 lang_statement_append (list, element, field)
2787 lang_statement_list_type * list;
2788 lang_statement_union_type * element;
2789 lang_statement_union_type ** field;
2791 *(list->tail) = element;
2795 /* Set the output format type. -oformat overrides scripts. */
2797 lang_add_output_format (format, from_script)
2801 if (!from_script || output_target == NULL)
2802 output_target = format;