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