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. */
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 bfd_size_type 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))
101 DEFUN(print_size
,(value
),
104 printf("%5x", (unsigned)value
);
107 DEFUN(print_alignment
,(value
),
110 printf("2**%1u",value
);
113 DEFUN(print_fill
,(value
),
116 printf("%04x",(unsigned)value
);
121 DEFUN(print_section
,(name
),
122 CONST
char *CONST name
)
124 printf("%*s", -longest_section_name
, name
);
127 /*----------------------------------------------------------------------
128 lang_for_each_statement walks the parse tree and calls the provided
129 function for each node
133 DEFUN(lang_for_each_statement_worker
,(func
, s
),
135 lang_statement_union_type
*s
)
137 for (; s
!= (lang_statement_union_type
*)NULL
; s
= s
->next
)
141 switch (s
->header
.type
) {
142 case lang_output_section_statement_enum
:
143 lang_for_each_statement_worker
145 s
->output_section_statement
.children
.head
);
147 case lang_wild_statement_enum
:
148 lang_for_each_statement_worker
150 s
->wild_statement
.children
.head
);
152 case lang_data_statement_enum
:
153 case lang_object_symbols_statement_enum
:
154 case lang_output_statement_enum
:
155 case lang_target_statement_enum
:
156 case lang_input_section_enum
:
157 case lang_input_statement_enum
:
158 case lang_fill_statement_enum
:
159 case lang_assignment_statement_enum
:
160 case lang_padding_statement_enum
:
161 case lang_address_statement_enum
:
171 DEFUN(lang_for_each_statement
,(func
),
174 lang_for_each_statement_worker(func
,
175 statement_list
.head
);
177 /*----------------------------------------------------------------------*/
179 DEFUN(lang_list_init
,(list
),
180 lang_statement_list_type
*list
)
182 list
->head
= (lang_statement_union_type
*)NULL
;
183 list
->tail
= &list
->head
;
187 /*----------------------------------------------------------------------
189 build a new statement node for the parse tree
194 lang_statement_union_type
*
195 DEFUN(new_statement
,(type
, size
, list
),
196 enum statement_enum type AND
197 bfd_size_type size AND
198 lang_statement_list_type
*list
)
200 lang_statement_union_type
*new = (lang_statement_union_type
*)
202 new->header
.type
= type
;
203 new->header
.next
= (lang_statement_union_type
*)NULL
;
204 lang_statement_append(list
, new, &new->header
.next
);
209 Build a new input file node for the language. There are several ways
210 in which we treat an input file, eg, we only look at symbols, or
211 prefix it with a -l etc.
213 We can be supplied with requests for input files more than once;
214 they may, for example be split over serveral lines like foo.o(.text)
215 foo.o(.data) etc, so when asked for a file we check that we havn't
216 got it already so we don't duplicate the bfd.
219 static lang_input_statement_type
*
220 DEFUN(new_afile
, (name
, file_type
, target
),
221 CONST
char *CONST name AND
222 CONST lang_input_file_enum_type file_type AND
223 CONST
char *CONST target
)
225 lang_input_statement_type
*p
= new_stat(lang_input_statement
,
227 lang_has_input_file
= true;
230 case lang_input_file_is_symbols_only_enum
:
232 p
->is_archive
=false;
234 p
->local_sym_name
= name
;
235 p
->just_syms_flag
= true;
236 p
->search_dirs_flag
= false;
238 case lang_input_file_is_fake_enum
:
240 p
->is_archive
=false;
242 p
->local_sym_name
= name
;
243 p
->just_syms_flag
= false;
244 p
->search_dirs_flag
=false;
246 case lang_input_file_is_l_enum
:
247 p
->is_archive
= true;
250 p
->local_sym_name
= concat("-l",name
,"");
251 p
->just_syms_flag
= false;
252 p
->search_dirs_flag
= true;
254 case lang_input_file_is_search_file_enum
:
255 case lang_input_file_is_marker_enum
:
257 p
->is_archive
=false;
259 p
->local_sym_name
= name
;
260 p
->just_syms_flag
= false;
261 p
->search_dirs_flag
=true;
263 case lang_input_file_is_file_enum
:
265 p
->is_archive
=false;
267 p
->local_sym_name
= name
;
268 p
->just_syms_flag
= false;
269 p
->search_dirs_flag
=false;
274 p
->asymbols
= (asymbol
**)NULL
;
275 p
->superfile
= (lang_input_statement_type
*)NULL
;
276 p
->next_real_file
= (lang_statement_union_type
*)NULL
;
277 p
->next
= (lang_statement_union_type
*)NULL
;
279 p
->common_output_section
= (asection
*)NULL
;
280 lang_statement_append(&input_file_chain
,
281 (lang_statement_union_type
*)p
,
288 lang_input_statement_type
*
289 DEFUN(lang_add_input_file
,(name
, file_type
, target
),
291 lang_input_file_enum_type file_type AND
294 /* Look it up or build a new one */
295 lang_has_input_file
= true;
297 lang_input_statement_type
*p
;
299 for (p
= (lang_input_statement_type
*)input_file_chain
.head
;
300 p
!= (lang_input_statement_type
*)NULL
;
301 p
= (lang_input_statement_type
*)(p
->next_real_file
))
303 /* Sometimes we have incomplete entries in here */
304 if (p
->filename
!= (char *)NULL
) {
305 if(strcmp(name
,p
->filename
) == 0) return p
;
310 return new_afile(name
, file_type
, target
);
314 /* Build enough state so that the parser can build its tree */
316 DEFUN_VOID(lang_init
)
319 stat_ptr
= &statement_list
;
320 lang_list_init(stat_ptr
);
322 lang_list_init(&input_file_chain
);
323 lang_list_init(&lang_output_section_statement
);
324 lang_list_init(&file_chain
);
325 first_file
= lang_add_input_file((char *)NULL
,
326 lang_input_file_is_marker_enum
,
331 /*----------------------------------------------------------------------
332 A region is an area of memory declared with the
333 MEMORY { name:org=exp, len=exp ... }
336 We maintain a list of all the regions here
338 If no regions are specified in the script, then the default is used
339 which is created when looked up to be the entire data space
342 static lang_memory_region_type
*lang_memory_region_list
;
343 static lang_memory_region_type
**lang_memory_region_list_tail
= &lang_memory_region_list
;
345 lang_memory_region_type
*
346 DEFUN(lang_memory_region_lookup
,(name
),
347 CONST
char *CONST name
)
350 lang_memory_region_type
*p
= lang_memory_region_list
;
351 for (p
= lang_memory_region_list
;
352 p
!= ( lang_memory_region_type
*)NULL
;
354 if (strcmp(p
->name
, name
) == 0) {
358 if (strcmp(name
,"*default*")==0) {
359 /* This is the default region, dig out first one on the list */
360 if (lang_memory_region_list
!= (lang_memory_region_type
*)NULL
){
361 return lang_memory_region_list
;
365 lang_memory_region_type
*new =
366 (lang_memory_region_type
*)ldmalloc((bfd_size_type
)(sizeof(lang_memory_region_type
)));
367 new->name
= buystring(name
);
368 new->next
= (lang_memory_region_type
*)NULL
;
370 *lang_memory_region_list_tail
= new;
371 lang_memory_region_list_tail
= &new->next
;
380 lang_output_section_statement_type
*
381 DEFUN(lang_output_section_find
,(name
),
382 CONST
char * CONST name
)
384 lang_statement_union_type
*u
;
385 lang_output_section_statement_type
*lookup
;
387 for (u
= lang_output_section_statement
.head
;
388 u
!= (lang_statement_union_type
*)NULL
;
391 lookup
= &u
->output_section_statement
;
392 if (strcmp(name
, lookup
->name
)==0) {
396 return (lang_output_section_statement_type
*)NULL
;
399 lang_output_section_statement_type
*
400 DEFUN(lang_output_section_statement_lookup
,(name
),
401 CONST
char * CONST name
)
403 lang_output_section_statement_type
*lookup
;
404 lookup
=lang_output_section_find(name
);
405 if (lookup
== (lang_output_section_statement_type
*)NULL
) {
407 lookup
=(lang_output_section_statement_type
*)
408 new_stat(lang_output_section_statement
, stat_ptr
);
409 lookup
->region
= (lang_memory_region_type
*)NULL
;
411 lookup
->block_value
= 1;
414 lookup
->next
= (lang_statement_union_type
*)NULL
;
415 lookup
->bfd_section
= (asection
*)NULL
;
416 lookup
->processed
= false;
417 lookup
->addr_tree
= (etree_type
*)NULL
;
418 lang_list_init(&lookup
->children
);
420 lang_statement_append(&lang_output_section_statement
,
421 (lang_statement_union_type
*)lookup
,
432 DEFUN(print_flags
, (outfile
, ignore_flags
),
434 lang_section_flags_type
*ignore_flags
)
436 fprintf(outfile
,"(");
438 if (flags
->flag_read
) fprintf(outfile
,"R");
439 if (flags
->flag_write
) fprintf(outfile
,"W");
440 if (flags
->flag_executable
) fprintf(outfile
,"X");
441 if (flags
->flag_loadable
) fprintf(outfile
,"L");
443 fprintf(outfile
,")");
447 DEFUN(lang_map
,(outfile
),
450 lang_memory_region_type
*m
;
451 fprintf(outfile
,"**MEMORY CONFIGURATION**\n\n");
453 fprintf(outfile
,"name\t\torigin\t\tlength\t\tattributes\n");
455 fprintf(outfile
,"name\t\torigin length\t\tattributes\n");
457 for (m
= lang_memory_region_list
;
458 m
!= (lang_memory_region_type
*)NULL
;
461 fprintf(outfile
,"%-16s", m
->name
);
462 print_address(m
->origin
);
464 print_address(m
->length
);
466 print_flags(outfile
, &m
->flags
);
467 fprintf(outfile
,"\n");
469 fprintf(outfile
,"\n\n**LINK EDITOR MEMORY MAP**\n\n");
470 fprintf(outfile
,"output input virtual\n");
471 fprintf(outfile
,"section section address tsize\n\n");
482 lang_output_section_statement_type
*s
)
484 section_userdata_type
*new =
485 (section_userdata_type
*)
486 ldmalloc((bfd_size_type
)(sizeof(section_userdata_type
)));
488 s
->bfd_section
= bfd_make_section(output_bfd
, s
->name
);
489 s
->bfd_section
->output_section
= s
->bfd_section
;
490 s
->bfd_section
->flags
= SEC_NO_FLAGS
;
491 /* We initialize an output sections output offset to minus its own */
492 /* vma to allow us to output a section through itself */
493 s
->bfd_section
->output_offset
= 0;
494 get_userdata( s
->bfd_section
) = (PTR
)new;
497 /***********************************************************************
500 These expand statements like *(.text) and foo.o to a list of
501 explicit actions, like foo.o(.text), bar.o(.text) and
504 The toplevel routine, wild, takes a statement, section, file and
505 target. If either the section or file is null it is taken to be the
506 wildcard. Seperate lang_input_section statements are created for
507 each part of the expanstion, and placed after the statement provided.
512 DEFUN(wild_doit
,(ptr
, section
, output
, file
),
513 lang_statement_list_type
*ptr AND
514 asection
*section AND
515 lang_output_section_statement_type
*output AND
516 lang_input_statement_type
*file
)
518 if(output
->bfd_section
== (asection
*)NULL
)
523 if (section
!= (asection
*)NULL
524 && section
->output_section
== (asection
*)NULL
) {
525 /* Add a section reference to the list */
526 lang_input_section_type
*new = new_stat(lang_input_section
, ptr
);
528 new->section
= section
;
530 section
->output_section
= output
->bfd_section
;
531 section
->output_section
->flags
|= section
->flags
;
532 if (section
->alignment_power
> output
->bfd_section
->alignment_power
) {
533 output
->bfd_section
->alignment_power
= section
->alignment_power
;
539 DEFUN(our_bfd_get_section_by_name
,(abfd
, section
),
543 return bfd_get_section_by_name(abfd
, section
);
547 DEFUN(wild_section
,(ptr
, section
, file
, output
),
548 lang_wild_statement_type
*ptr AND
549 CONST
char *section AND
550 lang_input_statement_type
*file AND
551 lang_output_section_statement_type
*output
)
554 if (file
->just_syms_flag
== false) {
555 if (section
== (char *)NULL
) {
556 /* Do the creation to all sections in the file */
557 for (s
= file
->the_bfd
->sections
; s
!= (asection
*)NULL
; s
=s
->next
) {
558 wild_doit(&ptr
->children
, s
, output
, file
);
562 /* Do the creation to the named section only */
563 wild_doit(&ptr
->children
,
564 our_bfd_get_section_by_name(file
->the_bfd
, section
),
571 /* passed a file name (which must have been seen already and added to
572 the statement tree. We will see if it has been opened already and
573 had its symbols read. If not then we'll read it.
575 Archives are pecuilar here. We may open them once, but if they do
576 not define anything we need at the time, they won't have all their
577 symbols read. If we need them later, we'll have to redo it.
580 lang_input_statement_type
*
581 DEFUN(lookup_name
,(name
),
582 CONST
char * CONST name
)
584 lang_input_statement_type
*search
;
585 for(search
= (lang_input_statement_type
*)input_file_chain
.head
;
586 search
!= (lang_input_statement_type
*)NULL
;
587 search
= (lang_input_statement_type
*)search
->next_real_file
)
589 if (search
->filename
== (char *)NULL
&& name
== (char *)NULL
) {
592 if (search
->filename
!= (char *)NULL
&& name
!= (char *)NULL
) {
593 if (strcmp(search
->filename
, name
) == 0) {
594 ldmain_open_file_read_symbol(search
);
600 /* There isn't an afile entry for this file yet, this must be
601 because the name has only appeared inside a load script and not
602 on the command line */
603 search
= new_afile(name
, lang_input_file_is_file_enum
, default_target
);
604 ldmain_open_file_read_symbol(search
);
611 DEFUN(wild
,(s
, section
, file
, target
, output
),
612 lang_wild_statement_type
*s AND
613 CONST
char *CONST section AND
614 CONST
char *CONST file AND
615 CONST
char *CONST target AND
616 lang_output_section_statement_type
*output
)
618 lang_input_statement_type
*f
;
619 if (file
== (char *)NULL
) {
620 /* Perform the iteration over all files in the list */
621 for (f
= (lang_input_statement_type
*)file_chain
.head
;
622 f
!= (lang_input_statement_type
*)NULL
;
623 f
= (lang_input_statement_type
*)f
->next
) {
624 wild_section(s
, section
, f
, output
);
628 /* Perform the iteration over a single file */
629 wild_section( s
, section
, lookup_name(file
), output
);
631 if (section
!= (char *)NULL
632 && strcmp(section
,"COMMON") == 0
633 && default_common_section
== (lang_output_section_statement_type
*)NULL
)
635 /* Remember the section that common is going to incase we later
636 get something which doesn't know where to put it */
637 default_common_section
= output
;
642 read in all the files
645 DEFUN(open_output
,(name
),
646 CONST
char *CONST name
)
648 extern CONST
char *output_filename
;
650 if (output_target
== (char *)NULL
) {
651 if (current_target
!= (char *)NULL
)
652 output_target
= current_target
;
654 output_target
= default_target
;
656 output
= bfd_openw(name
, output_target
);
657 output_filename
= name
;
659 if (output
== (bfd
*)NULL
)
661 if (bfd_error
== invalid_target
) {
662 info("%P%F target %s not found\n", output_target
);
664 info("%P%F problem opening output file %s, %E", name
);
667 output
->flags
|= D_PAGED
;
668 bfd_set_format(output
, bfd_object
);
676 DEFUN(ldlang_open_output
,(statement
),
677 lang_statement_union_type
*statement
)
679 switch (statement
->header
.type
)
681 case lang_output_statement_enum
:
682 output_bfd
= open_output(statement
->output_statement
.name
);
683 ldemul_set_output_arch();
686 case lang_target_statement_enum
:
687 current_target
= statement
->target_statement
.target
;
695 DEFUN(open_input_bfds
,(statement
),
696 lang_statement_union_type
*statement
)
698 switch (statement
->header
.type
)
700 case lang_target_statement_enum
:
701 current_target
= statement
->target_statement
.target
;
703 case lang_wild_statement_enum
:
704 /* Maybe we should load the file's symbols */
705 if (statement
->wild_statement
.filename
)
707 (void) lookup_name(statement
->wild_statement
.filename
);
710 case lang_input_statement_enum
:
711 if (statement
->input_statement
.real
== true)
713 statement
->input_statement
.target
= current_target
;
714 lookup_name(statement
->input_statement
.filename
);
721 /* If there are [COMMONS] statements, put a wild one into the bss section */
724 lang_reasonable_defaults()
727 lang_output_section_statement_lookup(".text");
728 lang_output_section_statement_lookup(".data");
730 default_common_section
=
731 lang_output_section_statement_lookup(".bss");
734 if (placed_commons
== false) {
735 lang_wild_statement_type
*new =
736 new_stat(lang_wild_statement
,
737 &default_common_section
->children
);
738 new->section_name
= "COMMON";
739 new->filename
= (char *)NULL
;
740 lang_list_init(&new->children
);
747 Add the supplied name to the symbol table as an undefined reference.
748 Remove items from the chain as we open input bfds
750 typedef struct ldlang_undef_chain_list_struct
{
751 struct ldlang_undef_chain_list_struct
*next
;
753 } ldlang_undef_chain_list_type
;
755 static ldlang_undef_chain_list_type
*ldlang_undef_chain_list_head
;
758 DEFUN(ldlang_add_undef
,(name
),
759 CONST
char *CONST name
)
761 ldlang_undef_chain_list_type
*new =
762 (ldlang_undef_chain_list_type
763 *)ldmalloc((bfd_size_type
)(sizeof(ldlang_undef_chain_list_type
)));
765 new->next
= ldlang_undef_chain_list_head
;
766 ldlang_undef_chain_list_head
= new;
768 new->name
= buystring(name
);
770 /* Run through the list of undefineds created above and place them
771 into the linker hash table as undefined symbols belonging to the
775 DEFUN_VOID(lang_place_undefineds
)
777 ldlang_undef_chain_list_type
*ptr
= ldlang_undef_chain_list_head
;
778 while (ptr
!= (ldlang_undef_chain_list_type
*)NULL
) {
779 ldsym_type
*sy
= ldsym_get(ptr
->name
);
781 asymbol
**def_ptr
= (asymbol
**)ldmalloc((bfd_size_type
)(sizeof(asymbol
**)));
782 def
= (asymbol
*)bfd_make_empty_symbol(script_file
->the_bfd
);
784 def
->name
= ptr
->name
;
785 def
->flags
= BSF_UNDEFINED
;
786 def
->section
= (asection
*)NULL
;
787 Q_enter_global_ref(def_ptr
);
794 /* Copy important data from out internal form to the bfd way. Also
795 create a section for the dummy file
799 DEFUN_VOID(lang_create_output_section_statements
)
801 lang_statement_union_type
*os
;
802 for (os
= lang_output_section_statement
.head
;
803 os
!= (lang_statement_union_type
*)NULL
;
804 os
= os
->output_section_statement
.next
) {
805 lang_output_section_statement_type
*s
=
806 &os
->output_section_statement
;
813 DEFUN_VOID(lang_init_script_file
)
815 script_file
= lang_add_input_file("script file",
816 lang_input_file_is_fake_enum
,
818 script_file
->the_bfd
= bfd_create("script file", output_bfd
);
819 script_file
->symbol_count
= 0;
820 script_file
->the_bfd
->sections
= output_bfd
->sections
;
826 /* Open input files and attatch to output sections */
828 DEFUN(map_input_to_output_sections
,(s
, target
, output_section_statement
),
829 lang_statement_union_type
*s AND
830 CONST
char *target AND
831 lang_output_section_statement_type
*output_section_statement
)
833 for (; s
!= (lang_statement_union_type
*)NULL
; s
= s
->next
)
835 switch (s
->header
.type
) {
836 case lang_wild_statement_enum
:
837 wild(&s
->wild_statement
, s
->wild_statement
.section_name
,
838 s
->wild_statement
.filename
, target
,
839 output_section_statement
);
843 case lang_output_section_statement_enum
:
844 map_input_to_output_sections(s
->output_section_statement
.children
.head
,
846 &s
->output_section_statement
);
848 case lang_output_statement_enum
:
850 case lang_target_statement_enum
:
851 target
= s
->target_statement
.target
;
853 case lang_fill_statement_enum
:
854 case lang_input_section_enum
:
855 case lang_object_symbols_statement_enum
:
856 case lang_data_statement_enum
:
857 case lang_assignment_statement_enum
:
858 case lang_padding_statement_enum
:
860 case lang_afile_asection_pair_statement_enum
:
863 case lang_address_statement_enum
:
864 /* Mark the specified section with the supplied address */
866 lang_output_section_statement_type
*os
=
867 lang_output_section_statement_lookup
868 (s
->address_statement
.section_name
);
869 os
->addr_tree
= s
->address_statement
.address
;
870 if (os
->bfd_section
== (asection
*)NULL
) {
871 info("%P%F can't set the address of undefined section %s\n",
872 s
->address_statement
.section_name
);
876 case lang_input_statement_enum
:
877 /* A standard input statement, has no wildcards */
878 /* ldmain_open_file_read_symbol(&s->input_statement);*/
889 DEFUN(print_output_section_statement
,(output_section_statement
),
890 lang_output_section_statement_type
*output_section_statement
)
892 asection
*section
= output_section_statement
->bfd_section
;
894 print_section(output_section_statement
->name
);
897 print_dot
= section
->vma
;
901 print_address(section
->vma
);
903 print_size(section
->size
);
905 print_alignment(section
->alignment_power
);
908 printf("%s flags", output_section_statement
->region
->name
);
909 print_flags(stdout
, &output_section_statement
->flags
);
914 printf("No attached output section");
917 print_statement(output_section_statement
->children
.head
,
918 output_section_statement
);
923 DEFUN(print_assignment
,(assignment
, output_section
),
924 lang_assignment_statement_type
*assignment AND
925 lang_output_section_statement_type
*output_section
)
927 etree_value_type result
;
932 print_address(print_dot
);
934 result
= exp_fold_tree(assignment
->exp
->assign
.src
,
936 lang_final_phase_enum
,
941 print_address(result
.value
);
945 printf("*undefined*");
948 exp_print_tree(stdout
, assignment
->exp
);
953 DEFUN(print_input_statement
,(statm
),
954 lang_input_statement_type
*statm
)
956 if (statm
->filename
!= (char *)NULL
) {
957 printf("LOAD %s\n",statm
->filename
);
962 DEFUN(print_symbol
,(q
),
969 print_address(outside_symbol_address(q
));
970 printf(" %s", q
->name
? q
->name
: " ");
975 DEFUN(print_input_section
,(in
),
976 lang_input_section_type
*in
)
978 asection
*i
= in
->section
;
983 print_section(i
->name
);
985 if (i
->output_section
) {
986 print_address(i
->output_section
->vma
+ i
->output_offset
);
990 print_alignment(i
->alignment_power
);
994 bfd
*abfd
= in
->ifile
->the_bfd
;
995 if (in
->ifile
->just_syms_flag
== true) {
996 printf("symbols only ");
999 printf(" %s ",abfd
->xvec
->name
);
1000 if(abfd
->my_archive
!= (bfd
*)NULL
) {
1001 printf("[%s]%s", abfd
->my_archive
->filename
,
1005 printf("%s", abfd
->filename
);
1007 printf("(overhead %d bytes)", (int)bfd_alloc_size(abfd
));
1010 /* Find all the symbols in this file defined in this section */
1013 for (p
= in
->ifile
->asymbols
; *p
; p
++) {
1016 if (bfd_get_section(q
) == i
&& q
->flags
& BSF_GLOBAL
) {
1027 print_dot
= outside_section_address(i
) + i
->size
;
1030 printf("No output section allocated\n");
1036 DEFUN(print_fill_statement
,(fill
),
1037 lang_fill_statement_type
*fill
)
1039 printf("FILL mask ");
1040 print_fill( fill
->fill
);
1044 DEFUN(print_data_statement
,(data
),
1045 lang_data_statement_type
*data
)
1047 /* bfd_vma value; */
1052 /* ASSERT(print_dot == data->output_vma);*/
1054 print_address(data
->output_vma
);
1056 print_address(data
->value
);
1058 switch (data
->type
) {
1061 print_dot
+= BYTE_SIZE
;
1065 print_dot
+= SHORT_SIZE
;
1069 print_dot
+= LONG_SIZE
;
1073 exp_print_tree(stdout
, data
->exp
);
1080 DEFUN(print_padding_statement
,(s
),
1081 lang_padding_statement_type
*s
)
1085 print_section("*fill*");
1087 print_address(s
->output_offset
+ s
->output_section
->vma
);
1089 print_size(s
->size
);
1091 print_fill(s
->fill
);
1096 DEFUN(print_wild_statement
,(w
,os
),
1097 lang_wild_statement_type
*w AND
1098 lang_output_section_statement_type
*os
)
1101 if (w
->filename
!= (char *)NULL
) {
1102 printf("%s",w
->filename
);
1107 if (w
->section_name
!= (char *)NULL
) {
1108 printf("(%s)",w
->section_name
);
1114 print_statement(w
->children
.head
, os
);
1118 DEFUN(print_statement
,(s
, os
),
1119 lang_statement_union_type
*s AND
1120 lang_output_section_statement_type
*os
)
1123 switch (s
->header
.type
) {
1124 case lang_wild_statement_enum
:
1125 print_wild_statement(&s
->wild_statement
, os
);
1128 printf("Fail with %d\n",s
->header
.type
);
1131 case lang_address_statement_enum
:
1132 printf("address\n");
1135 case lang_object_symbols_statement_enum
:
1136 printf("object symbols\n");
1138 case lang_fill_statement_enum
:
1139 print_fill_statement(&s
->fill_statement
);
1141 case lang_data_statement_enum
:
1142 print_data_statement(&s
->data_statement
);
1144 case lang_input_section_enum
:
1145 print_input_section(&s
->input_section
);
1147 case lang_padding_statement_enum
:
1148 print_padding_statement(&s
->padding_statement
);
1150 case lang_output_section_statement_enum
:
1151 print_output_section_statement(&s
->output_section_statement
);
1153 case lang_assignment_statement_enum
:
1154 print_assignment(&s
->assignment_statement
,
1159 case lang_target_statement_enum
:
1160 printf("TARGET(%s)\n", s
->target_statement
.target
);
1162 case lang_output_statement_enum
:
1163 printf("OUTPUT(%s %s)\n",
1164 s
->output_statement
.name
,
1167 case lang_input_statement_enum
:
1168 print_input_statement(&s
->input_statement
);
1170 case lang_afile_asection_pair_statement_enum
:
1180 DEFUN_VOID(print_statements
)
1182 print_statement(statement_list
.head
,
1183 (lang_output_section_statement_type
*)NULL
);
1187 DEFUN(insert_pad
,(this_ptr
, fill
, power
, output_section_statement
, dot
),
1188 lang_statement_union_type
**this_ptr AND
1190 unsigned int power AND
1191 asection
* output_section_statement AND
1194 /* Align this section first to the
1195 input sections requirement, then
1196 to the output section's requirement.
1197 If this alignment is > than any seen before,
1198 then record it too. Perform the alignment by
1199 inserting a magic 'padding' statement.
1202 unsigned int alignment_needed
= align_power(dot
, power
) - dot
;
1204 if (alignment_needed
!= 0)
1206 lang_statement_union_type
*new =
1207 (lang_statement_union_type
*)
1208 ldmalloc((bfd_size_type
)(sizeof(lang_padding_statement_type
)));
1209 /* Link into existing chain */
1210 new->header
.next
= *this_ptr
;
1212 new->header
.type
= lang_padding_statement_enum
;
1213 new->padding_statement
.output_section
= output_section_statement
;
1214 new->padding_statement
.output_offset
=
1215 dot
- output_section_statement
->vma
;
1216 new->padding_statement
.fill
= fill
;
1217 new->padding_statement
.size
= alignment_needed
;
1221 /* Remember the most restrictive alignment */
1222 if (power
> output_section_statement
->alignment_power
) {
1223 output_section_statement
->alignment_power
= power
;
1225 output_section_statement
->size
+= alignment_needed
;
1226 return alignment_needed
+ dot
;
1230 /* Work out how much this section will move the dot point */
1232 DEFUN(size_input_section
, (this_ptr
, output_section_statement
, fill
, dot
),
1233 lang_statement_union_type
**this_ptr AND
1234 lang_output_section_statement_type
*output_section_statement AND
1235 unsigned short fill AND
1238 lang_input_section_type
*is
= &((*this_ptr
)->input_section
);
1239 asection
*i
= is
->section
;
1241 if (is
->ifile
->just_syms_flag
== false) {
1242 dot
= insert_pad(this_ptr
, fill
, i
->alignment_power
,
1243 output_section_statement
->bfd_section
, dot
);
1245 /* remember the largest size so we can malloc the largest area */
1246 /* needed for the output stage */
1247 if (i
->size
> largest_section
) {
1248 largest_section
= i
->size
;
1251 /* Remember where in the output section this input section goes */
1253 i
->output_offset
= dot
- output_section_statement
->bfd_section
->vma
;
1255 /* Mark how big the output section must be to contain this now */
1257 output_section_statement
->bfd_section
->size
=
1258 dot
- output_section_statement
->bfd_section
->vma
;
1262 i
->output_offset
= i
->vma
- output_section_statement
->bfd_section
->vma
;
1269 /* Work out the size of the output sections
1270 from the sizes of the input sections */
1272 DEFUN(lang_size_sections
,(s
, output_section_statement
, prev
, fill
, dot
),
1273 lang_statement_union_type
*s AND
1274 lang_output_section_statement_type
* output_section_statement AND
1275 lang_statement_union_type
**prev AND
1276 unsigned short fill AND
1279 /* Size up the sections from their constituent parts */
1280 for (; s
!= (lang_statement_union_type
*)NULL
; s
= s
->next
)
1282 switch (s
->header
.type
) {
1283 case lang_output_section_statement_enum
:
1286 lang_output_section_statement_type
*os
=
1287 &(s
->output_section_statement
);
1288 /* The start of a section */
1290 if (os
->addr_tree
== (etree_type
*)NULL
) {
1291 /* No address specified for this section, get one
1292 from the region specification
1294 if (os
->region
== (lang_memory_region_type
*)NULL
) {
1295 os
->region
= lang_memory_region_lookup("*default*");
1297 dot
= os
->region
->current
;
1300 etree_value_type r
;
1301 r
= exp_fold_tree(os
->addr_tree
,
1302 (lang_output_section_statement_type
*)NULL
,
1303 lang_allocating_phase_enum
,
1305 if (r
.valid
== false) {
1306 info("%F%S: non constant address expression for section %s\n",
1311 /* The section starts here */
1312 /* First, align to what the section needs */
1314 dot
= align_power(dot
, os
->bfd_section
->alignment_power
);
1315 os
->bfd_section
->vma
= dot
;
1316 os
->bfd_section
->output_offset
= 0;
1318 (void) lang_size_sections(os
->children
.head
, os
, &os
->children
.head
,
1320 /* Ignore the size of the input sections, use the vma and size to */
1324 after
= ALIGN(os
->bfd_section
->vma
+
1325 os
->bfd_section
->size
,
1329 os
->bfd_section
->size
= after
- os
->bfd_section
->vma
;
1330 dot
= os
->bfd_section
->vma
+ os
->bfd_section
->size
;
1331 os
->processed
= true;
1333 /* Replace into region ? */
1334 if (os
->addr_tree
== (etree_type
*)NULL
1335 && os
->region
!=(lang_memory_region_type
*)NULL
) {
1336 os
->region
->current
= dot
;
1342 case lang_data_statement_enum
:
1345 s
->data_statement
.output_vma
= dot
- output_section_statement
->bfd_section
->vma
;
1346 s
->data_statement
.output_section
=
1347 output_section_statement
->bfd_section
;
1349 switch (s
->data_statement
.type
) {
1362 output_section_statement
->bfd_section
->size
+= size
;
1366 case lang_wild_statement_enum
:
1368 dot
= lang_size_sections(s
->wild_statement
.children
.head
,
1369 output_section_statement
,
1370 &s
->wild_statement
.children
.head
,
1376 case lang_object_symbols_statement_enum
:
1377 create_object_symbols
= output_section_statement
;
1379 case lang_output_statement_enum
:
1380 case lang_target_statement_enum
:
1382 case lang_input_section_enum
:
1383 dot
= size_input_section(prev
,
1384 output_section_statement
,
1385 output_section_statement
->fill
, dot
);
1387 case lang_input_statement_enum
:
1389 case lang_fill_statement_enum
:
1390 fill
= s
->fill_statement
.fill
;
1392 case lang_assignment_statement_enum
:
1394 bfd_vma newdot
= dot
;
1395 exp_fold_tree(s
->assignment_statement
.exp
,
1396 output_section_statement
,
1397 lang_allocating_phase_enum
,
1402 /* We've been moved ! so insert a pad */
1404 lang_statement_union_type
*new =
1405 (lang_statement_union_type
*)
1406 ldmalloc((bfd_size_type
)(sizeof(lang_padding_statement_type
)));
1407 /* Link into existing chain */
1408 new->header
.next
= *prev
;
1410 new->header
.type
= lang_padding_statement_enum
;
1411 new->padding_statement
.output_section
=
1412 output_section_statement
->bfd_section
;
1413 new->padding_statement
.output_offset
=
1414 dot
- output_section_statement
->bfd_section
->vma
;
1415 new->padding_statement
.fill
= fill
;
1416 new->padding_statement
.size
= newdot
- dot
;
1417 output_section_statement
->bfd_section
->size
+=
1418 new->padding_statement
.size
;
1424 case lang_padding_statement_enum
:
1430 case lang_address_statement_enum
:
1433 prev
= &s
->header
.next
;
1440 DEFUN(lang_do_assignments
,(s
, output_section_statement
, fill
, dot
),
1441 lang_statement_union_type
*s AND
1442 lang_output_section_statement_type
* output_section_statement AND
1443 unsigned short fill AND
1447 for (; s
!= (lang_statement_union_type
*)NULL
; s
= s
->next
)
1449 switch (s
->header
.type
) {
1450 case lang_output_section_statement_enum
:
1452 lang_output_section_statement_type
*os
=
1453 &(s
->output_section_statement
);
1454 dot
= os
->bfd_section
->vma
;
1455 (void) lang_do_assignments(os
->children
.head
, os
, os
->fill
, dot
);
1456 dot
= os
->bfd_section
->vma
+ os
->bfd_section
->size
;
1459 case lang_wild_statement_enum
:
1461 dot
= lang_do_assignments(s
->wild_statement
.children
.head
,
1462 output_section_statement
,
1467 case lang_object_symbols_statement_enum
:
1468 case lang_output_statement_enum
:
1469 case lang_target_statement_enum
:
1471 case lang_common_statement_enum
:
1474 case lang_data_statement_enum
:
1476 etree_value_type value
;
1477 value
= exp_fold_tree(s
->data_statement
.exp
,
1478 0, lang_final_phase_enum
, dot
, &dot
);
1479 s
->data_statement
.value
= value
.value
;
1480 if (value
.valid
== false) info("%F%P: Invalid data statement\n");
1482 switch (s
->data_statement
.type
) {
1494 case lang_input_section_enum
:
1496 asection
*in
= s
->input_section
.section
;
1501 case lang_input_statement_enum
:
1503 case lang_fill_statement_enum
:
1504 fill
= s
->fill_statement
.fill
;
1506 case lang_assignment_statement_enum
:
1508 exp_fold_tree(s
->assignment_statement
.exp
,
1509 output_section_statement
,
1510 lang_final_phase_enum
,
1516 case lang_padding_statement_enum
:
1517 dot
+= s
->padding_statement
.size
;
1522 case lang_address_statement_enum
:
1533 DEFUN_VOID(lang_relocate_globals
)
1537 Each ldsym_type maintains a chain of pointers to asymbols which
1538 references the definition. Replace each pointer to the referenence
1539 with a pointer to only one place, preferably the definition. If
1540 the defintion isn't available then the common symbol, and if
1541 there isn't one of them then choose one reference.
1544 FOR_EACH_LDSYM(lgs
) {
1546 if (lgs
->sdefs_chain
) {
1547 it
= *(lgs
->sdefs_chain
);
1549 else if (lgs
->scoms_chain
!= (asymbol
**)NULL
) {
1550 it
= *(lgs
->scoms_chain
);
1552 else if (lgs
->srefs_chain
!= (asymbol
**)NULL
) {
1553 it
= *(lgs
->srefs_chain
);
1556 /* This can happen when the command line asked for a symbol to
1558 it
= (asymbol
*)NULL
;
1560 if (it
!= (asymbol
*)NULL
)
1562 asymbol
**ptr
= lgs
->srefs_chain
;
1564 while (ptr
!= (asymbol
**)NULL
) {
1565 asymbol
*ref
= *ptr
;
1567 ptr
= (asymbol
**)(ref
->udata
);
1576 DEFUN_VOID(lang_finish
)
1580 if (entry_symbol
== (char *)NULL
) {
1581 /* No entry has been specified, look for start */
1582 entry_symbol
= "start";
1584 lgs
= ldsym_get_soft(entry_symbol
);
1585 if (lgs
&& lgs
->sdefs_chain
) {
1586 asymbol
*sy
= *(lgs
->sdefs_chain
);
1587 /* We can set the entry address*/
1588 bfd_set_start_address(output_bfd
,
1589 outside_symbol_address(sy
));
1593 /* Can't find anything reasonable,
1594 use the first address in the text section
1596 asection
*ts
= bfd_get_section_by_name(output_bfd
, ".text");
1598 bfd_set_start_address(output_bfd
, ts
->vma
);
1603 /* By now we know the target architecture, and we may have an */
1604 /* ldfile_output_machine_name */
1606 DEFUN_VOID(lang_check
)
1608 lang_statement_union_type
*file
;
1609 unsigned long max_machine
= bfd_get_machine(output_bfd
);
1610 unsigned long max_machine_seen
= 0;
1612 unsigned long input_machine
;
1613 char *out_arch
, *out_arch2
;
1615 for (file
= file_chain
.head
;
1616 file
!= (lang_statement_union_type
*)NULL
;
1617 file
=file
->input_statement
.next
)
1619 input_bfd
= file
->input_statement
.the_bfd
;
1620 input_machine
= bfd_get_machine(input_bfd
);
1622 if ( input_machine
> max_machine_seen
){
1623 max_machine_seen
= input_machine
;
1626 /* Inspect the architecture and ensure we're linking like with like */
1627 if ( (input_machine
> max_machine
)
1628 || !bfd_arch_compatible( input_bfd
,
1630 &ldfile_output_architecture
,
1632 enum bfd_architecture this_architecture
=
1633 bfd_get_architecture(file
->input_statement
.the_bfd
);
1634 unsigned long this_machine
=
1636 bfd_get_machine(file
->input_statement
.the_bfd
);
1638 /* Result of bfd_printable_arch_mach is not guaranteed to stick
1639 around after next call, so we have to copy it. */
1640 out_arch
= bfd_printable_arch_mach(ldfile_output_architecture
,
1641 ldfile_output_machine
);
1642 out_arch2
= ldmalloc (strlen (out_arch
)+1);
1643 strcpy (out_arch2
, out_arch
);
1645 info("%P: warning, %s architecture of input file `%B' incompatible with %s output\n",
1646 bfd_printable_arch_mach(this_architecture
, this_machine
),
1650 ldfile_output_architecture
= this_architecture
;
1651 ldfile_output_machine
= this_machine
;
1652 bfd_set_arch_mach(output_bfd
,
1653 ldfile_output_architecture
,
1654 ldfile_output_machine
);
1657 bfd_set_arch_mach(output_bfd
,ldfile_output_architecture
,max_machine_seen
);
1662 * run through all the global common symbols and tie them
1663 * to the output section requested.
1665 As an experiment we do this 4 times, once for all the byte sizes,
1666 then all the two bytes, all the four bytes and then everything else
1670 DEFUN_VOID(lang_common
)
1674 if (config
.relocateable_output
== false ||
1675 command_line
.force_common_definition
== true) {
1676 for (power
= 1; (config
.sort_common
== true && power
== 1) || (power
<= 16); power
<<=1) {
1677 for (lgs
= symbol_head
;
1678 lgs
!= (ldsym_type
*)NULL
;
1682 unsigned int power_of_two
;
1685 if (lgs
->scoms_chain
!= (asymbol
**)NULL
) {
1686 com
= *(lgs
->scoms_chain
);
1715 if (config
.sort_common
== false || align
== power
) {
1716 /* Change from a common symbol into a definition of
1718 lgs
->sdefs_chain
= lgs
->scoms_chain
;
1719 lgs
->scoms_chain
= (asymbol
**)NULL
;
1721 /* Point to the correct common section */
1723 ((lang_input_statement_type
*)
1724 (com
->the_bfd
->usrdata
))->common_section
;
1725 /* Fix the size of the common section */
1726 com
->section
->size
= ALIGN(com
->section
->size
, align
);
1728 /* Remember if this is the biggest alignment ever seen */
1729 if (power_of_two
> com
->section
->alignment_power
) {
1730 com
->section
->alignment_power
= power_of_two
;
1733 /* Symbol stops being common and starts being global, but
1734 we remember that it was common once. */
1736 com
->flags
= BSF_EXPORT
| BSF_GLOBAL
| BSF_OLD_COMMON
;
1737 com
->value
= com
->section
->size
;
1741 printf ("Allocating common %s: %x at %x %s\n",
1744 (unsigned) com
->value
,
1745 com
->the_bfd
->filename
);
1748 com
->section
->size
+= size
;
1761 run through the input files and ensure that every input
1762 section has somewhere to go. If one is found without
1763 a destination then create an input request and place it
1764 into the statement tree.
1768 DEFUN_VOID(lang_place_orphans
)
1770 lang_input_statement_type
*file
;
1771 for (file
= (lang_input_statement_type
*)file_chain
.head
;
1772 file
!= (lang_input_statement_type
*)NULL
;
1773 file
= (lang_input_statement_type
*)file
->next
) {
1775 for (s
= file
->the_bfd
->sections
;
1776 s
!= (asection
*)NULL
;
1778 if ( s
->output_section
== (asection
*)NULL
) {
1779 /* This section of the file is not attatched, root
1780 around for a sensible place for it to go */
1782 if (file
->common_section
== s
) {
1783 /* This is a lonely common section which must
1784 have come from an archive. We attatch to the
1785 section with the wildcard */
1786 if (config
.relocateable_output
!= true
1787 && command_line
.force_common_definition
== false) {
1788 if (default_common_section
==
1789 (lang_output_section_statement_type
*)NULL
) {
1790 info("%P: No [COMMON] command, defaulting to .bss\n");
1792 default_common_section
=
1793 lang_output_section_statement_lookup(".bss");
1796 wild_doit(&default_common_section
->children
, s
,
1797 default_common_section
, file
);
1801 lang_output_section_statement_type
*os
=
1802 lang_output_section_statement_lookup(s
->name
);
1804 wild_doit(&os
->children
, s
, os
, file
);
1813 DEFUN(lang_set_flags
,(ptr
, flags
),
1814 lang_section_flags_type
*ptr AND
1817 boolean state
= true;
1818 ptr
->flag_read
= false;
1819 ptr
->flag_write
= false;
1820 ptr
->flag_executable
= false;
1821 ptr
->flag_loadable
= false;
1824 if (*flags
== '!') {
1831 ptr
->flag_read
= state
;
1834 ptr
->flag_write
= state
;
1837 ptr
->flag_executable
= state
;
1841 ptr
->flag_loadable
= state
;
1844 info("%P%F illegal syntax in flags\n");
1854 DEFUN(lang_for_each_file
,(func
),
1855 PROTO(void, (*func
),(lang_input_statement_type
*)))
1857 lang_input_statement_type
*f
;
1858 for (f
= (lang_input_statement_type
*)file_chain
.head
;
1859 f
!= (lang_input_statement_type
*)NULL
;
1860 f
= (lang_input_statement_type
*)f
->next
)
1868 DEFUN(lang_for_each_input_section
, (func
),
1869 PROTO(void ,(*func
),(bfd
*ab
, asection
*as
)))
1871 lang_input_statement_type
*f
;
1872 for (f
= (lang_input_statement_type
*)file_chain
.head
;
1873 f
!= (lang_input_statement_type
*)NULL
;
1874 f
= (lang_input_statement_type
*)f
->next
)
1877 for (s
= f
->the_bfd
->sections
;
1878 s
!= (asection
*)NULL
;
1880 func(f
->the_bfd
, s
);
1888 DEFUN(ldlang_add_file
,(entry
),
1889 lang_input_statement_type
*entry
)
1892 lang_statement_append(&file_chain
,
1893 (lang_statement_union_type
*)entry
,
1900 DEFUN(lang_add_output
,(name
),
1903 lang_output_statement_type
*new = new_stat(lang_output_statement
,
1906 had_output_filename
= true;
1910 static lang_output_section_statement_type
*current_section
;
1913 DEFUN(lang_enter_output_section_statement
,
1914 (output_section_statement_name
,
1917 char *output_section_statement_name AND
1918 etree_type
*address_exp AND
1919 bfd_vma block_value
)
1921 lang_output_section_statement_type
*os
;
1924 lang_output_section_statement_lookup(output_section_statement_name
);
1927 /* Add this statement to tree */
1928 /* add_statement(lang_output_section_statement_enum,
1929 output_section_statement);*/
1930 /* Make next things chain into subchain of this */
1932 if (os
->addr_tree
==
1933 (etree_type
*)NULL
) {
1937 os
->block_value
= block_value
;
1938 stat_ptr
= & os
->children
;
1944 DEFUN_VOID(lang_final
)
1946 if (had_output_filename
== false) {
1947 extern CONST
char *output_filename
;
1948 lang_add_output(output_filename
);
1957 DEFUN(create_symbol
,(name
, flags
, section
),
1958 CONST
char *name AND
1962 extern lang_input_statement_type
*script_file
;
1963 asymbol
**def_ptr
= (asymbol
**)ldmalloc((bfd_size_type
)(sizeof(asymbol
**)));
1964 /* Add this definition to script file */
1965 asymbol
*def
= (asymbol
*)bfd_make_empty_symbol(script_file
->the_bfd
);
1966 def
->name
= buystring(name
);
1969 def
->section
= section
;
1972 Q_enter_global_ref(def_ptr
);
1978 DEFUN_VOID(lang_process
)
1980 if (had_script
== false) {
1981 parse_line(ldemul_get_script());
1983 lang_reasonable_defaults();
1984 current_target
= default_target
;
1986 lang_for_each_statement(ldlang_open_output
); /* Open the output file */
1987 /* For each output section statement, create a section in the output
1989 lang_create_output_section_statements();
1991 /* Create a dummy bfd for the script */
1992 lang_init_script_file();
1994 /* Add to the hash table all undefineds on the command line */
1995 lang_place_undefineds();
1997 /* Create a bfd for each input file */
1998 current_target
= default_target
;
1999 lang_for_each_statement(open_input_bfds
);
2001 common_section
.userdata
= (PTR
)&common_section_userdata
;
2003 /* Run through the contours of the script and attatch input sections
2004 to the correct output sections
2006 map_input_to_output_sections(statement_list
.head
, (char *)NULL
,
2007 ( lang_output_section_statement_type
*)NULL
);
2009 /* Find any sections not attatched explicitly and handle them */
2010 lang_place_orphans();
2012 /* Size up the common data */
2015 ldemul_before_allocation();
2017 /* Size up the sections */
2018 lang_size_sections(statement_list
.head
,
2019 (lang_output_section_statement_type
*)NULL
,
2020 &(statement_list
.head
), 0, (bfd_vma
)0);
2022 /* See if anything special should be done now we know how big
2024 ldemul_after_allocation();
2026 /* Do all the assignments, now that we know the final restingplaces
2027 of all the symbols */
2029 lang_do_assignments(statement_list
.head
,
2030 (lang_output_section_statement_type
*)NULL
,
2033 /* Make sure that we're not mixing architectures */
2037 /* Move the global symbols around */
2038 lang_relocate_globals();
2045 /* EXPORTED TO YACC */
2048 DEFUN(lang_add_wild
,(section_name
, filename
),
2049 CONST
char *CONST section_name AND
2050 CONST
char *CONST filename
)
2052 lang_wild_statement_type
*new = new_stat(lang_wild_statement
,
2055 if (section_name
!= (char *)NULL
&& strcmp(section_name
,"COMMON") == 0)
2057 placed_commons
= true;
2059 if (filename
!= (char *)NULL
) {
2060 lang_has_input_file
= true;
2062 new->section_name
= section_name
;
2063 new->filename
= filename
;
2064 lang_list_init(&new->children
);
2067 DEFUN(lang_section_start
,(name
, address
),
2068 CONST
char *name AND
2069 etree_type
*address
)
2071 lang_address_statement_type
*ad
=new_stat(lang_address_statement
, stat_ptr
);
2072 ad
->section_name
= name
;
2073 ad
->address
= address
;
2077 DEFUN(lang_add_entry
,(name
),
2080 entry_symbol
= name
;
2084 DEFUN(lang_add_target
,(name
),
2087 lang_target_statement_type
*new = new_stat(lang_target_statement
,
2097 DEFUN(lang_add_map
,(name
),
2103 map_option_f
= true;
2111 DEFUN(lang_add_fill
,(exp
),
2114 lang_fill_statement_type
*new = new_stat(lang_fill_statement
,
2120 DEFUN(lang_add_data
,(type
, exp
),
2122 union etree_union
*exp
)
2125 lang_data_statement_type
*new = new_stat(lang_data_statement
,
2132 DEFUN(lang_add_assignment
,(exp
),
2135 lang_assignment_statement_type
*new = new_stat(lang_assignment_statement
,
2141 DEFUN(lang_add_attribute
,(attribute
),
2142 enum statement_enum attribute
)
2144 new_statement(attribute
, sizeof(lang_statement_union_type
),stat_ptr
);
2150 DEFUN(lang_startup
,(name
),
2153 if (startup_file
!= (char *)NULL
) {
2154 info("%P%FMultiple STARTUP files\n");
2156 first_file
->filename
= name
;
2157 first_file
->local_sym_name
= name
;
2162 DEFUN(lang_float
,(maybe
),
2165 lang_float_flag
= maybe
;
2169 DEFUN(lang_leave_output_section_statement
,(fill
, memspec
),
2171 CONST
char *memspec
)
2173 current_section
->fill
= fill
;
2174 current_section
->region
= lang_memory_region_lookup(memspec
);
2175 stat_ptr
= &statement_list
;
2178 Create an absolute symbol with the given name with the value of the
2179 address of first byte of the section named.
2181 If the symbol already exists, then do nothing.
2184 DEFUN(lang_abs_symbol_at_beginning_of
,(section
, name
),
2185 CONST
char *section AND
2188 if (ldsym_undefined(name
)) {
2189 extern bfd
*output_bfd
;
2190 extern asymbol
*create_symbol();
2191 asection
*s
= bfd_get_section_by_name(output_bfd
, section
);
2192 asymbol
*def
= create_symbol(name
,
2193 BSF_GLOBAL
| BSF_EXPORT
|
2196 if (s
!= (asection
*)NULL
) {
2197 def
->value
= s
->vma
;
2206 Create an absolute symbol with the given name with the value of the
2207 address of the first byte after the end of the section named.
2209 If the symbol already exists, then do nothing.
2212 DEFUN(lang_abs_symbol_at_end_of
,(section
, name
),
2213 CONST
char *section AND
2216 if (ldsym_undefined(name
)){
2217 extern bfd
*output_bfd
;
2218 extern asymbol
*create_symbol();
2219 asection
*s
= bfd_get_section_by_name(output_bfd
, section
);
2220 /* Add a symbol called _end */
2221 asymbol
*def
= create_symbol(name
,
2222 BSF_GLOBAL
| BSF_EXPORT
|
2225 if (s
!= (asection
*)NULL
) {
2226 def
->value
= s
->vma
+ s
->size
;
2235 DEFUN(lang_statement_append
,(list
, element
, field
),
2236 lang_statement_list_type
*list AND
2237 lang_statement_union_type
*element AND
2238 lang_statement_union_type
**field
)
2240 *(list
->tail
) = element
;
2244 /* Set the output format type */
2246 DEFUN(lang_add_output_format
,(format
),
2249 output_target
= format
;