* ldgram.y (PHDRS): New token.
[deliverable/binutils-gdb.git] / ld / ldlang.c
1 /* Linker command language support.
2 Copyright (C) 1991, 92, 93, 94, 1995 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20 #include "bfd.h"
21 #include "sysdep.h"
22 #include "libiberty.h"
23 #include "bfdlink.h"
24
25 #include "ld.h"
26 #include "ldmain.h"
27 #include "ldgram.h"
28 #include "ldexp.h"
29 #include "ldlang.h"
30 #include "ldemul.h"
31 #include "ldlex.h"
32 #include "ldmisc.h"
33 #include "ldctor.h"
34 #include "ldfile.h"
35
36 /* FORWARDS */
37 static void print_statements PARAMS ((void));
38 static void print_statement PARAMS ((lang_statement_union_type *,
39 lang_output_section_statement_type *));
40 static lang_statement_union_type *new_statement PARAMS ((enum statement_enum,
41 size_t,
42 lang_statement_list_type*));
43
44
45 /* LOCALS */
46 static struct obstack stat_obstack;
47
48 #define obstack_chunk_alloc xmalloc
49 #define obstack_chunk_free free
50 static CONST char *startup_file;
51 static lang_statement_list_type input_file_chain;
52 static boolean placed_commons = false;
53 static lang_output_section_statement_type *default_common_section;
54 static boolean map_option_f;
55 static bfd_vma print_dot;
56 static lang_input_statement_type *first_file;
57 static lang_statement_list_type lang_output_section_statement;
58 static CONST char *current_target;
59 static CONST char *output_target;
60 static int longest_section_name = 8;
61 static lang_statement_list_type statement_list;
62 static struct lang_phdr *lang_phdr_list;
63
64 static void print_size PARAMS ((size_t value));
65 static void print_alignment PARAMS ((unsigned int value));
66 static void print_fill PARAMS ((fill_type value));
67 static void print_section PARAMS ((const char *name));
68 static void lang_for_each_statement_worker
69 PARAMS ((void (*func) (lang_statement_union_type *),
70 lang_statement_union_type *s));
71 static lang_input_statement_type *new_afile
72 PARAMS ((const char *name, lang_input_file_enum_type file_type,
73 const char *target, boolean add_to_list));
74 static void print_flags PARAMS ((int *ignore_flags));
75 static void init_os PARAMS ((lang_output_section_statement_type *s));
76 static void wild_section PARAMS ((lang_wild_statement_type *ptr,
77 const char *section,
78 lang_input_statement_type *file,
79 lang_output_section_statement_type *output));
80 static lang_input_statement_type *lookup_name PARAMS ((const char *name));
81 static void load_symbols PARAMS ((lang_input_statement_type *entry,
82 lang_statement_list_type *));
83 static void wild PARAMS ((lang_wild_statement_type *s,
84 const char *section, const char *file,
85 const char *target,
86 lang_output_section_statement_type *output));
87 static bfd *open_output PARAMS ((const char *name));
88 static void ldlang_open_output PARAMS ((lang_statement_union_type *statement));
89 static void open_input_bfds
90 PARAMS ((lang_statement_union_type *statement, boolean));
91 static void lang_reasonable_defaults PARAMS ((void));
92 static void lang_place_undefineds PARAMS ((void));
93 static void map_input_to_output_sections
94 PARAMS ((lang_statement_union_type *s,
95 const char *target,
96 lang_output_section_statement_type *output_section_statement));
97 static void print_output_section_statement
98 PARAMS ((lang_output_section_statement_type *output_section_statement));
99 static void print_assignment
100 PARAMS ((lang_assignment_statement_type *assignment,
101 lang_output_section_statement_type *output_section));
102 static void print_input_statement PARAMS ((lang_input_statement_type *statm));
103 static void print_input_section PARAMS ((lang_input_section_type *in));
104 static void print_fill_statement PARAMS ((lang_fill_statement_type *fill));
105 static void print_data_statement PARAMS ((lang_data_statement_type *data));
106 static void print_reloc_statement PARAMS ((lang_reloc_statement_type *reloc));
107 static void print_padding_statement PARAMS ((lang_padding_statement_type *s));
108 static void print_wild_statement
109 PARAMS ((lang_wild_statement_type *w,
110 lang_output_section_statement_type *os));
111 static void print_group
112 PARAMS ((lang_group_statement_type *, lang_output_section_statement_type *));
113 static void print_statement PARAMS ((lang_statement_union_type *s,
114 lang_output_section_statement_type *os));
115 static void print_statements PARAMS ((void));
116 static bfd_vma insert_pad PARAMS ((lang_statement_union_type **this_ptr,
117 fill_type fill, unsigned int power,
118 asection *output_section_statement,
119 bfd_vma dot));
120 static bfd_vma size_input_section
121 PARAMS ((lang_statement_union_type **this_ptr,
122 lang_output_section_statement_type *output_section_statement,
123 fill_type fill, bfd_vma dot, boolean relax));
124 static void lang_finish PARAMS ((void));
125 static void lang_check PARAMS ((void));
126 static void lang_common PARAMS ((void));
127 static boolean lang_one_common PARAMS ((struct bfd_link_hash_entry *, PTR));
128 static void lang_place_orphans PARAMS ((void));
129 static int topower PARAMS ((int));
130 static void lang_set_startof PARAMS ((void));
131 static void reset_memory_regions PARAMS ((void));
132 static void lang_record_phdrs PARAMS ((void));
133
134 /* EXPORTS */
135 lang_output_section_statement_type *abs_output_section;
136 lang_statement_list_type *stat_ptr = &statement_list;
137 lang_statement_list_type file_chain = { 0 };
138 const char *entry_symbol = NULL;
139 boolean entry_from_cmdline;
140 boolean lang_has_input_file = false;
141 boolean had_output_filename = false;
142 boolean lang_float_flag = false;
143 boolean delete_output_file_on_failure = false;
144
145 etree_type *base; /* Relocation base - or null */
146
147
148 #if defined(__STDC__) || defined(ALMOST_STDC)
149 #define cat(a,b) a##b
150 #else
151 #define cat(a,b) a/**/b
152 #endif
153
154 #define new_stat(x,y) (cat(x,_type)*) new_statement(cat(x,_enum), sizeof(cat(x,_type)),y)
155
156 #define outside_section_address(q) ( (q)->output_offset + (q)->output_section->vma)
157
158 #define outside_symbol_address(q) ((q)->value + outside_section_address(q->section))
159
160 PTR
161 stat_alloc (size)
162 size_t size;
163 {
164 return obstack_alloc (&stat_obstack, size);
165 }
166
167 static void
168 print_size (value)
169 size_t value;
170 {
171 fprintf (config.map_file, "%5x", (unsigned) value);
172 }
173
174 static void
175 print_alignment (value)
176 unsigned int value;
177 {
178 fprintf (config.map_file, "2**%1u", value);
179 }
180
181 static void
182 print_fill (value)
183 fill_type value;
184 {
185 fprintf (config.map_file, "%04x", (unsigned) value);
186 }
187
188 static void
189 print_section (name)
190 CONST char *name;
191 {
192 fprintf (config.map_file, "%*s", -longest_section_name, name);
193 }
194
195 /*----------------------------------------------------------------------
196 lang_for_each_statement walks the parse tree and calls the provided
197 function for each node
198 */
199
200 static void
201 lang_for_each_statement_worker (func, s)
202 void (*func) PARAMS ((lang_statement_union_type *));
203 lang_statement_union_type *s;
204 {
205 for (; s != (lang_statement_union_type *) NULL; s = s->next)
206 {
207 func (s);
208
209 switch (s->header.type)
210 {
211 case lang_constructors_statement_enum:
212 lang_for_each_statement_worker (func, constructor_list.head);
213 break;
214 case lang_output_section_statement_enum:
215 lang_for_each_statement_worker
216 (func,
217 s->output_section_statement.children.head);
218 break;
219 case lang_wild_statement_enum:
220 lang_for_each_statement_worker
221 (func,
222 s->wild_statement.children.head);
223 break;
224 case lang_group_statement_enum:
225 lang_for_each_statement_worker (func,
226 s->group_statement.children.head);
227 break;
228 case lang_data_statement_enum:
229 case lang_reloc_statement_enum:
230 case lang_object_symbols_statement_enum:
231 case lang_output_statement_enum:
232 case lang_target_statement_enum:
233 case lang_input_section_enum:
234 case lang_input_statement_enum:
235 case lang_assignment_statement_enum:
236 case lang_padding_statement_enum:
237 case lang_address_statement_enum:
238 break;
239 default:
240 FAIL ();
241 break;
242 }
243 }
244 }
245
246 void
247 lang_for_each_statement (func)
248 void (*func) PARAMS ((lang_statement_union_type *));
249 {
250 lang_for_each_statement_worker (func,
251 statement_list.head);
252 }
253
254 /*----------------------------------------------------------------------*/
255 void
256 lang_list_init (list)
257 lang_statement_list_type *list;
258 {
259 list->head = (lang_statement_union_type *) NULL;
260 list->tail = &list->head;
261 }
262
263 /*----------------------------------------------------------------------
264
265 build a new statement node for the parse tree
266
267 */
268
269 static
270 lang_statement_union_type *
271 new_statement (type, size, list)
272 enum statement_enum type;
273 size_t size;
274 lang_statement_list_type * list;
275 {
276 lang_statement_union_type *new = (lang_statement_union_type *)
277 stat_alloc (size);
278
279 new->header.type = type;
280 new->header.next = (lang_statement_union_type *) NULL;
281 lang_statement_append (list, new, &new->header.next);
282 return new;
283 }
284
285 /*
286 Build a new input file node for the language. There are several ways
287 in which we treat an input file, eg, we only look at symbols, or
288 prefix it with a -l etc.
289
290 We can be supplied with requests for input files more than once;
291 they may, for example be split over serveral lines like foo.o(.text)
292 foo.o(.data) etc, so when asked for a file we check that we havn't
293 got it already so we don't duplicate the bfd.
294
295 */
296 static lang_input_statement_type *
297 new_afile (name, file_type, target, add_to_list)
298 CONST char *name;
299 lang_input_file_enum_type file_type;
300 CONST char *target;
301 boolean add_to_list;
302 {
303 lang_input_statement_type *p;
304
305 if (add_to_list)
306 p = new_stat (lang_input_statement, stat_ptr);
307 else
308 {
309 p = ((lang_input_statement_type *)
310 stat_alloc (sizeof (lang_input_statement_type)));
311 p->header.next = NULL;
312 }
313
314 lang_has_input_file = true;
315 p->target = target;
316 p->complained = false;
317 switch (file_type)
318 {
319 case lang_input_file_is_symbols_only_enum:
320 p->filename = name;
321 p->is_archive = false;
322 p->real = true;
323 p->local_sym_name = name;
324 p->just_syms_flag = true;
325 p->search_dirs_flag = false;
326 break;
327 case lang_input_file_is_fake_enum:
328 p->filename = name;
329 p->is_archive = false;
330 p->real = false;
331 p->local_sym_name = name;
332 p->just_syms_flag = false;
333 p->search_dirs_flag = false;
334 break;
335 case lang_input_file_is_l_enum:
336 p->is_archive = true;
337 p->filename = name;
338 p->real = true;
339 p->local_sym_name = concat ("-l", name, (const char *) NULL);
340 p->just_syms_flag = false;
341 p->search_dirs_flag = true;
342 break;
343 case lang_input_file_is_marker_enum:
344 p->filename = name;
345 p->is_archive = false;
346 p->real = false;
347 p->local_sym_name = name;
348 p->just_syms_flag = false;
349 p->search_dirs_flag = true;
350 break;
351 case lang_input_file_is_search_file_enum:
352 p->filename = name;
353 p->is_archive = false;
354 p->real = true;
355 p->local_sym_name = name;
356 p->just_syms_flag = false;
357 p->search_dirs_flag = true;
358 break;
359 case lang_input_file_is_file_enum:
360 p->filename = name;
361 p->is_archive = false;
362 p->real = true;
363 p->local_sym_name = name;
364 p->just_syms_flag = false;
365 p->search_dirs_flag = false;
366 break;
367 default:
368 FAIL ();
369 }
370 p->the_bfd = (bfd *) NULL;
371 p->asymbols = (asymbol **) NULL;
372 p->next_real_file = (lang_statement_union_type *) NULL;
373 p->next = (lang_statement_union_type *) NULL;
374 p->symbol_count = 0;
375 p->common_output_section = (asection *) NULL;
376 p->dynamic = config.dynamic_link;
377 p->loaded = false;
378 lang_statement_append (&input_file_chain,
379 (lang_statement_union_type *) p,
380 &p->next_real_file);
381 return p;
382 }
383
384 lang_input_statement_type *
385 lang_add_input_file (name, file_type, target)
386 CONST char *name;
387 lang_input_file_enum_type file_type;
388 CONST char *target;
389 {
390 lang_has_input_file = true;
391 return new_afile (name, file_type, target, true);
392 }
393
394 /* Build enough state so that the parser can build its tree */
395 void
396 lang_init ()
397 {
398 obstack_begin (&stat_obstack, 1000);
399
400 stat_ptr = &statement_list;
401
402 lang_list_init (stat_ptr);
403
404 lang_list_init (&input_file_chain);
405 lang_list_init (&lang_output_section_statement);
406 lang_list_init (&file_chain);
407 first_file = lang_add_input_file ((char *) NULL,
408 lang_input_file_is_marker_enum,
409 (char *) NULL);
410 abs_output_section = lang_output_section_statement_lookup (BFD_ABS_SECTION_NAME);
411
412 abs_output_section->bfd_section = bfd_abs_section_ptr;
413
414 }
415
416 /*----------------------------------------------------------------------
417 A region is an area of memory declared with the
418 MEMORY { name:org=exp, len=exp ... }
419 syntax.
420
421 We maintain a list of all the regions here
422
423 If no regions are specified in the script, then the default is used
424 which is created when looked up to be the entire data space
425 */
426
427 static lang_memory_region_type *lang_memory_region_list;
428 static lang_memory_region_type **lang_memory_region_list_tail = &lang_memory_region_list;
429
430 lang_memory_region_type *
431 lang_memory_region_lookup (name)
432 CONST char *CONST name;
433 {
434
435 lang_memory_region_type *p = lang_memory_region_list;
436
437 for (p = lang_memory_region_list;
438 p != (lang_memory_region_type *) NULL;
439 p = p->next)
440 {
441 if (strcmp (p->name, name) == 0)
442 {
443 return p;
444 }
445 }
446
447 #if 0
448 /* This code used to always use the first region in the list as the
449 default region. I changed it to instead use a region
450 encompassing all of memory as the default region. This permits
451 NOLOAD sections to work reasonably without requiring a region.
452 People should specify what region they mean, if they really want
453 a region. */
454 if (strcmp (name, "*default*") == 0)
455 {
456 if (lang_memory_region_list != (lang_memory_region_type *) NULL)
457 {
458 return lang_memory_region_list;
459 }
460 }
461 #endif
462
463 {
464 lang_memory_region_type *new =
465 (lang_memory_region_type *) stat_alloc (sizeof (lang_memory_region_type));
466
467 new->name = buystring (name);
468 new->next = (lang_memory_region_type *) NULL;
469
470 *lang_memory_region_list_tail = new;
471 lang_memory_region_list_tail = &new->next;
472 new->origin = 0;
473 new->length = ~(bfd_size_type)0;
474 new->current = 0;
475 new->had_full_message = false;
476
477 return new;
478 }
479 }
480
481
482 lang_output_section_statement_type *
483 lang_output_section_find (name)
484 CONST char *CONST name;
485 {
486 lang_statement_union_type *u;
487 lang_output_section_statement_type *lookup;
488
489 for (u = lang_output_section_statement.head;
490 u != (lang_statement_union_type *) NULL;
491 u = lookup->next)
492 {
493 lookup = &u->output_section_statement;
494 if (strcmp (name, lookup->name) == 0)
495 {
496 return lookup;
497 }
498 }
499 return (lang_output_section_statement_type *) NULL;
500 }
501
502 lang_output_section_statement_type *
503 lang_output_section_statement_lookup (name)
504 CONST char *CONST name;
505 {
506 lang_output_section_statement_type *lookup;
507
508 lookup = lang_output_section_find (name);
509 if (lookup == (lang_output_section_statement_type *) NULL)
510 {
511
512 lookup = (lang_output_section_statement_type *)
513 new_stat (lang_output_section_statement, stat_ptr);
514 lookup->region = (lang_memory_region_type *) NULL;
515 lookup->fill = 0;
516 lookup->block_value = 1;
517 lookup->name = name;
518
519 lookup->next = (lang_statement_union_type *) NULL;
520 lookup->bfd_section = (asection *) NULL;
521 lookup->processed = false;
522 lookup->loadable = 1;
523 lookup->addr_tree = (etree_type *) NULL;
524 lang_list_init (&lookup->children);
525
526 lookup->memspec = (CONST char *) NULL;
527 lookup->flags = 0;
528 lookup->subsection_alignment = -1;
529 lookup->section_alignment = -1;
530 lookup->load_base = (union etree_union *) NULL;
531 lookup->phdrs = NULL;
532
533 lang_statement_append (&lang_output_section_statement,
534 (lang_statement_union_type *) lookup,
535 &lookup->next);
536 }
537 return lookup;
538 }
539
540 /*ARGSUSED*/
541 static void
542 print_flags (ignore_flags)
543 int *ignore_flags;
544 {
545 fprintf (config.map_file, "(");
546 #if 0
547 if (flags->flag_read)
548 fprintf (outfile, "R");
549 if (flags->flag_write)
550 fprintf (outfile, "W");
551 if (flags->flag_executable)
552 fprintf (outfile, "X");
553 if (flags->flag_loadable)
554 fprintf (outfile, "L");
555 #endif
556 fprintf (config.map_file, ")");
557 }
558
559 void
560 lang_map ()
561 {
562 lang_memory_region_type *m;
563
564 fprintf (config.map_file, "**MEMORY CONFIGURATION**\n\n");
565 #ifdef BFD64
566 fprintf (config.map_file, "name\t\torigin\t\tlength\t\tattributes\n");
567 #else
568 fprintf (config.map_file,
569 "name\t\torigin length r_size c_size is attributes\n");
570
571 #endif
572 for (m = lang_memory_region_list;
573 m != (lang_memory_region_type *) NULL;
574 m = m->next)
575 {
576 fprintf (config.map_file, "%-16s", m->name);
577 print_address (m->origin);
578 print_space ();
579 print_address ((bfd_vma)m->length);
580 print_space ();
581 print_address ((bfd_vma)m->old_length);
582 print_space();
583 print_address (m->current - m->origin);
584 print_space();
585 if (m->old_length)
586 fprintf (config.map_file, " %2d%% ",
587 (int) ((m->current - m->origin) * 100 / m->old_length));
588 print_flags (&m->flags);
589 fprintf (config.map_file, "\n");
590 }
591 fprintf (config.map_file, "\n\n**LINK EDITOR MEMORY MAP**\n\n");
592 fprintf (config.map_file, "output input virtual\n");
593 fprintf (config.map_file, "section section address tsize\n\n");
594
595 print_statements ();
596
597 }
598
599 /*
600 *
601 */
602 static void
603 init_os (s)
604 lang_output_section_statement_type * s;
605 {
606 /* asection *section = bfd_get_section_by_name(output_bfd, s->name);*/
607 section_userdata_type *new =
608 (section_userdata_type *)
609 stat_alloc (sizeof (section_userdata_type));
610
611 s->bfd_section = bfd_get_section_by_name (output_bfd, s->name);
612 if (s->bfd_section == (asection *) NULL)
613 s->bfd_section = bfd_make_section (output_bfd, s->name);
614 if (s->bfd_section == (asection *) NULL)
615 {
616 einfo ("%P%F: output format %s cannot represent section called %s\n",
617 output_bfd->xvec->name, s->name);
618 }
619 s->bfd_section->output_section = s->bfd_section;
620
621 /* We initialize an output sections output offset to minus its own */
622 /* vma to allow us to output a section through itself */
623 s->bfd_section->output_offset = 0;
624 get_userdata (s->bfd_section) = (PTR) new;
625
626 }
627
628 /***********************************************************************
629 The wild routines.
630
631 These expand statements like *(.text) and foo.o to a list of
632 explicit actions, like foo.o(.text), bar.o(.text) and
633 foo.o(.text,.data) .
634
635 The toplevel routine, wild, takes a statement, section, file and
636 target. If either the section or file is null it is taken to be the
637 wildcard. Seperate lang_input_section statements are created for
638 each part of the expanstion, and placed after the statement provided.
639
640 */
641
642 void
643 wild_doit (ptr, section, output, file)
644 lang_statement_list_type * ptr;
645 asection * section;
646 lang_output_section_statement_type * output;
647 lang_input_statement_type * file;
648 {
649 if (output->bfd_section == (asection *) NULL)
650 init_os (output);
651
652 if (section != (asection *) NULL
653 && section->output_section == (asection *) NULL)
654 {
655 /* Add a section reference to the list */
656 lang_input_section_type *new = new_stat (lang_input_section, ptr);
657
658 new->section = section;
659 new->ifile = file;
660 section->output_section = output->bfd_section;
661
662 /* We don't copy the SEC_NEVER_LOAD flag from an input section to
663 an output section, because we want to be able to include a
664 SEC_NEVER_LOAD section in the middle of an otherwise loaded
665 section (I don't know why we want to do this, but we do).
666 build_link_order in ldwrite.c handles this case by turning the
667 embedded SEC_NEVER_LOAD section into a fill. */
668 section->output_section->flags |=
669 section->flags & (flagword) (~ SEC_NEVER_LOAD);
670
671 if (!output->loadable)
672 {
673 /* Turn off load flag */
674 output->bfd_section->flags &= ~SEC_LOAD;
675 output->bfd_section->flags |= SEC_NEVER_LOAD;
676 }
677 if (section->alignment_power > output->bfd_section->alignment_power)
678 {
679 output->bfd_section->alignment_power = section->alignment_power;
680 }
681 /* If supplied an aligmnet, then force it */
682 if (output->section_alignment != -1)
683 {
684 output->bfd_section->alignment_power = output->section_alignment;
685 }
686 }
687 }
688
689 static void
690 wild_section (ptr, section, file, output)
691 lang_wild_statement_type *ptr;
692 const char *section;
693 lang_input_statement_type *file;
694 lang_output_section_statement_type *output;
695 {
696 if (file->just_syms_flag == false)
697 {
698 register asection *s;
699
700 for (s = file->the_bfd->sections; s != NULL; s = s->next)
701 {
702 /* Attach all sections named SECTION. If SECTION is NULL,
703 then attach all sections.
704
705 Previously, if SECTION was NULL, this code did not call
706 wild_doit if the SEC_IS_COMMON flag was set for the
707 section. I did not understand that, and I took it out.
708 --ian@cygnus.com. */
709
710 if (section == NULL
711 || strcmp (bfd_get_section_name (file->the_bfd, s),
712 section) == 0)
713 wild_doit (&ptr->children, s, output, file);
714 }
715 }
716 }
717
718 /* passed a file name (which must have been seen already and added to
719 the statement tree. We will see if it has been opened already and
720 had its symbols read. If not then we'll read it.
721
722 Archives are pecuilar here. We may open them once, but if they do
723 not define anything we need at the time, they won't have all their
724 symbols read. If we need them later, we'll have to redo it. */
725 static lang_input_statement_type *
726 lookup_name (name)
727 CONST char *name;
728 {
729 lang_input_statement_type *search;
730
731 for (search = (lang_input_statement_type *) input_file_chain.head;
732 search != (lang_input_statement_type *) NULL;
733 search = (lang_input_statement_type *) search->next_real_file)
734 {
735 if (search->filename == (char *) NULL && name == (char *) NULL)
736 return search;
737 if (search->filename != (char *) NULL
738 && name != (char *) NULL
739 && strcmp (search->filename, name) == 0)
740 break;
741 }
742
743 if (search == (lang_input_statement_type *) NULL)
744 search = new_afile (name, lang_input_file_is_file_enum, default_target,
745 false);
746
747 /* If we have already added this file, or this file is not real
748 (FIXME: can that ever actually happen?) or the name is NULL
749 (FIXME: can that ever actually happen?) don't add this file. */
750 if (search->loaded
751 || ! search->real
752 || search->filename == (const char *) NULL)
753 return search;
754
755 load_symbols (search, (lang_statement_list_type *) NULL);
756
757 return search;
758 }
759
760 /* Get the symbols for an input file. */
761
762 static void
763 load_symbols (entry, place)
764 lang_input_statement_type *entry;
765 lang_statement_list_type *place;
766 {
767 char **matching;
768
769 if (entry->loaded)
770 return;
771
772 ldfile_open_file (entry);
773
774 if (! bfd_check_format (entry->the_bfd, bfd_archive)
775 && ! bfd_check_format_matches (entry->the_bfd, bfd_object, &matching))
776 {
777 bfd_error_type err;
778 lang_statement_list_type *hold;
779
780 err = bfd_get_error ();
781 if (err == bfd_error_file_ambiguously_recognized)
782 {
783 char **p;
784
785 einfo ("%B: file not recognized: %E\n", entry->the_bfd);
786 einfo ("%B: matching formats:", entry->the_bfd);
787 for (p = matching; *p != NULL; p++)
788 einfo (" %s", *p);
789 einfo ("%F\n");
790 }
791 else if (err != bfd_error_file_not_recognized
792 || place == NULL)
793 einfo ("%F%B: file not recognized: %E\n", entry->the_bfd);
794
795 /* Try to interpret the file as a linker script. */
796
797 bfd_close (entry->the_bfd);
798 entry->the_bfd = NULL;
799
800 ldfile_open_command_file (entry->filename);
801
802 hold = stat_ptr;
803 stat_ptr = place;
804
805 ldfile_assumed_script = true;
806 parser_input = input_script;
807 yyparse ();
808 ldfile_assumed_script = false;
809
810 stat_ptr = hold;
811
812 return;
813 }
814
815 /* We don't call ldlang_add_file for an archive. Instead, the
816 add_symbols entry point will call ldlang_add_file, via the
817 add_archive_element callback, for each element of the archive
818 which is used. */
819 switch (bfd_get_format (entry->the_bfd))
820 {
821 default:
822 break;
823
824 case bfd_object:
825 ldlang_add_file (entry);
826 if (trace_files || trace_file_tries)
827 info_msg ("%I\n", entry);
828 break;
829
830 case bfd_archive:
831 if (whole_archive)
832 {
833 bfd *member = bfd_openr_next_archived_file (entry->the_bfd,
834 (bfd *) NULL);
835 while (member != NULL)
836 {
837 if (! bfd_check_format (member, bfd_object))
838 einfo ("%F%B: object %B in archive is not object\n",
839 entry->the_bfd, member);
840 if (! ((*link_info.callbacks->add_archive_element)
841 (&link_info, member, "-whole-archive")))
842 abort ();
843 if (! bfd_link_add_symbols (member, &link_info))
844 einfo ("%F%B: could not read symbols: %E\n", member);
845 member = bfd_openr_next_archived_file (entry->the_bfd,
846 member);
847 }
848
849 entry->loaded = true;
850
851 return;
852 }
853 }
854
855 if (! bfd_link_add_symbols (entry->the_bfd, &link_info))
856 einfo ("%F%B: could not read symbols: %E\n", entry->the_bfd);
857
858 entry->loaded = true;
859 }
860
861 static void
862 wild (s, section, file, target, output)
863 lang_wild_statement_type * s;
864 CONST char *section;
865 CONST char *file;
866 CONST char *target;
867 lang_output_section_statement_type * output;
868 {
869 lang_input_statement_type *f;
870
871 if (file == (char *) NULL)
872 {
873 /* Perform the iteration over all files in the list */
874 for (f = (lang_input_statement_type *) file_chain.head;
875 f != (lang_input_statement_type *) NULL;
876 f = (lang_input_statement_type *) f->next)
877 {
878 wild_section (s, section, f, output);
879 }
880 }
881 else
882 {
883 /* Perform the iteration over a single file */
884 wild_section (s, section, lookup_name (file), output);
885 }
886 if (section != (char *) NULL
887 && strcmp (section, "COMMON") == 0
888 && default_common_section == (lang_output_section_statement_type *) NULL)
889 {
890 /* Remember the section that common is going to incase we later
891 get something which doesn't know where to put it */
892 default_common_section = output;
893 }
894 }
895
896 /*
897 read in all the files
898 */
899
900 static bfd *
901 open_output (name)
902 CONST char *name;
903 {
904 bfd *output;
905
906 if (output_target == (char *) NULL)
907 {
908 if (current_target != (char *) NULL)
909 output_target = current_target;
910 else
911 output_target = default_target;
912 }
913 output = bfd_openw (name, output_target);
914
915 if (output == (bfd *) NULL)
916 {
917 if (bfd_get_error () == bfd_error_invalid_target)
918 {
919 einfo ("%P%F: target %s not found\n", output_target);
920 }
921 einfo ("%P%F: cannot open output file %s: %E\n", name);
922 }
923
924 delete_output_file_on_failure = 1;
925
926 /* output->flags |= D_PAGED;*/
927
928 if (! bfd_set_format (output, bfd_object))
929 einfo ("%P%F:%s: can not make object file: %E\n", name);
930 if (! bfd_set_arch_mach (output,
931 ldfile_output_architecture,
932 ldfile_output_machine))
933 einfo ("%P%F:%s: can not set architecture: %E\n", name);
934
935 link_info.hash = bfd_link_hash_table_create (output);
936 if (link_info.hash == (struct bfd_link_hash_table *) NULL)
937 einfo ("%P%F: can not create link hash table: %E\n");
938
939 bfd_set_gp_size (output, g_switch_value);
940 return output;
941 }
942
943
944
945
946 static void
947 ldlang_open_output (statement)
948 lang_statement_union_type * statement;
949 {
950 switch (statement->header.type)
951 {
952 case lang_output_statement_enum:
953 ASSERT (output_bfd == (bfd *) NULL);
954 output_bfd = open_output (statement->output_statement.name);
955 ldemul_set_output_arch ();
956 if (config.magic_demand_paged && !link_info.relocateable)
957 output_bfd->flags |= D_PAGED;
958 else
959 output_bfd->flags &= ~D_PAGED;
960 if (config.text_read_only)
961 output_bfd->flags |= WP_TEXT;
962 else
963 output_bfd->flags &= ~WP_TEXT;
964 if (config.traditional_format)
965 output_bfd->flags |= BFD_TRADITIONAL_FORMAT;
966 else
967 output_bfd->flags &= ~BFD_TRADITIONAL_FORMAT;
968 break;
969
970 case lang_target_statement_enum:
971 current_target = statement->target_statement.target;
972 break;
973 default:
974 break;
975 }
976 }
977
978 /* Open all the input files. */
979
980 static void
981 open_input_bfds (s, force)
982 lang_statement_union_type *s;
983 boolean force;
984 {
985 for (; s != (lang_statement_union_type *) NULL; s = s->next)
986 {
987 switch (s->header.type)
988 {
989 case lang_constructors_statement_enum:
990 open_input_bfds (constructor_list.head, force);
991 break;
992 case lang_output_section_statement_enum:
993 open_input_bfds (s->output_section_statement.children.head, force);
994 break;
995 case lang_wild_statement_enum:
996 /* Maybe we should load the file's symbols */
997 if (s->wild_statement.filename)
998 (void) lookup_name (s->wild_statement.filename);
999 open_input_bfds (s->wild_statement.children.head, force);
1000 break;
1001 case lang_group_statement_enum:
1002 {
1003 struct bfd_link_hash_entry *undefs;
1004
1005 /* We must continually search the entries in the group
1006 until no new symbols are added to the list of undefined
1007 symbols. */
1008
1009 do
1010 {
1011 undefs = link_info.hash->undefs_tail;
1012 open_input_bfds (s->group_statement.children.head, true);
1013 }
1014 while (undefs != link_info.hash->undefs_tail);
1015 }
1016 break;
1017 case lang_target_statement_enum:
1018 current_target = s->target_statement.target;
1019 break;
1020 case lang_input_statement_enum:
1021 if (s->input_statement.real == true)
1022 {
1023 lang_statement_list_type add;
1024
1025 s->input_statement.target = current_target;
1026
1027 /* If we are being called from within a group, and this
1028 is an archive which has already been searched, then
1029 force it to be researched. */
1030 if (force
1031 && s->input_statement.loaded
1032 && bfd_check_format (s->input_statement.the_bfd,
1033 bfd_archive))
1034 s->input_statement.loaded = false;
1035
1036 lang_list_init (&add);
1037
1038 load_symbols (&s->input_statement, &add);
1039
1040 if (add.head != NULL)
1041 {
1042 *add.tail = s->next;
1043 s->next = add.head;
1044 }
1045 }
1046 break;
1047 default:
1048 break;
1049 }
1050 }
1051 }
1052
1053 /* If there are [COMMONS] statements, put a wild one into the bss section */
1054
1055 static void
1056 lang_reasonable_defaults ()
1057 {
1058 #if 0
1059 lang_output_section_statement_lookup (".text");
1060 lang_output_section_statement_lookup (".data");
1061
1062 default_common_section =
1063 lang_output_section_statement_lookup (".bss");
1064
1065
1066 if (placed_commons == false)
1067 {
1068 lang_wild_statement_type *new =
1069 new_stat (lang_wild_statement,
1070 &default_common_section->children);
1071
1072 new->section_name = "COMMON";
1073 new->filename = (char *) NULL;
1074 lang_list_init (&new->children);
1075 }
1076 #endif
1077
1078 }
1079
1080 /*
1081 Add the supplied name to the symbol table as an undefined reference.
1082 Remove items from the chain as we open input bfds
1083 */
1084 typedef struct ldlang_undef_chain_list
1085 {
1086 struct ldlang_undef_chain_list *next;
1087 char *name;
1088 } ldlang_undef_chain_list_type;
1089
1090 static ldlang_undef_chain_list_type *ldlang_undef_chain_list_head;
1091
1092 void
1093 ldlang_add_undef (name)
1094 CONST char *CONST name;
1095 {
1096 ldlang_undef_chain_list_type *new =
1097 ((ldlang_undef_chain_list_type *)
1098 stat_alloc (sizeof (ldlang_undef_chain_list_type)));
1099
1100 new->next = ldlang_undef_chain_list_head;
1101 ldlang_undef_chain_list_head = new;
1102
1103 new->name = buystring (name);
1104 }
1105
1106 /* Run through the list of undefineds created above and place them
1107 into the linker hash table as undefined symbols belonging to the
1108 script file.
1109 */
1110 static void
1111 lang_place_undefineds ()
1112 {
1113 ldlang_undef_chain_list_type *ptr;
1114
1115 for (ptr = ldlang_undef_chain_list_head;
1116 ptr != (ldlang_undef_chain_list_type *) NULL;
1117 ptr = ptr->next)
1118 {
1119 struct bfd_link_hash_entry *h;
1120
1121 h = bfd_link_hash_lookup (link_info.hash, ptr->name, true, false, true);
1122 if (h == (struct bfd_link_hash_entry *) NULL)
1123 einfo ("%P%F: bfd_link_hash_lookup failed: %E");
1124 if (h->type == bfd_link_hash_new)
1125 {
1126 h->type = bfd_link_hash_undefined;
1127 h->u.undef.abfd = NULL;
1128 bfd_link_add_undef (link_info.hash, h);
1129 }
1130 }
1131 }
1132
1133 /* Open input files and attatch to output sections */
1134 static void
1135 map_input_to_output_sections (s, target, output_section_statement)
1136 lang_statement_union_type * s;
1137 CONST char *target;
1138 lang_output_section_statement_type * output_section_statement;
1139 {
1140 for (; s != (lang_statement_union_type *) NULL; s = s->next)
1141 {
1142 switch (s->header.type)
1143 {
1144
1145
1146 case lang_wild_statement_enum:
1147 wild (&s->wild_statement, s->wild_statement.section_name,
1148 s->wild_statement.filename, target,
1149 output_section_statement);
1150
1151 break;
1152 case lang_constructors_statement_enum:
1153 map_input_to_output_sections (constructor_list.head,
1154 target,
1155 output_section_statement);
1156 break;
1157 case lang_output_section_statement_enum:
1158 map_input_to_output_sections (s->output_section_statement.children.head,
1159 target,
1160 &s->output_section_statement);
1161 break;
1162 case lang_output_statement_enum:
1163 break;
1164 case lang_target_statement_enum:
1165 target = s->target_statement.target;
1166 break;
1167 case lang_group_statement_enum:
1168 map_input_to_output_sections (s->group_statement.children.head,
1169 target,
1170 output_section_statement);
1171 break;
1172 case lang_fill_statement_enum:
1173 case lang_input_section_enum:
1174 case lang_object_symbols_statement_enum:
1175 case lang_data_statement_enum:
1176 case lang_reloc_statement_enum:
1177 case lang_assignment_statement_enum:
1178 case lang_padding_statement_enum:
1179 case lang_input_statement_enum:
1180 if (output_section_statement != NULL
1181 && output_section_statement->bfd_section == NULL)
1182 init_os (output_section_statement);
1183 break;
1184 case lang_afile_asection_pair_statement_enum:
1185 FAIL ();
1186 break;
1187 case lang_address_statement_enum:
1188 /* Mark the specified section with the supplied address */
1189 {
1190 lang_output_section_statement_type *os =
1191 lang_output_section_statement_lookup
1192 (s->address_statement.section_name);
1193
1194 if (os->bfd_section == NULL)
1195 init_os (os);
1196 os->addr_tree = s->address_statement.address;
1197 }
1198 break;
1199 }
1200 }
1201 }
1202
1203 static void
1204 print_output_section_statement (output_section_statement)
1205 lang_output_section_statement_type * output_section_statement;
1206 {
1207 asection *section = output_section_statement->bfd_section;
1208
1209 print_nl ();
1210 print_section (output_section_statement->name);
1211
1212
1213 if (section)
1214 {
1215 print_dot = section->vma;
1216 print_space ();
1217 print_section ("");
1218 print_space ();
1219 print_address (section->vma);
1220 print_space ();
1221 print_size (section->_raw_size);
1222 print_space ();
1223 print_size(section->_cooked_size);
1224 print_space ();
1225 print_alignment (section->alignment_power);
1226 print_space ();
1227 #if 0
1228 fprintf (config.map_file, "%s flags", output_section_statement->region->name);
1229 print_flags (stdout, &output_section_statement->flags);
1230 #endif
1231 if (section->flags & SEC_LOAD)
1232 fprintf (config.map_file, "load ");
1233 if (section->flags & SEC_ALLOC)
1234 fprintf (config.map_file, "alloc ");
1235 if (section->flags & SEC_RELOC)
1236 fprintf (config.map_file, "reloc ");
1237 if (section->flags & SEC_HAS_CONTENTS)
1238 fprintf (config.map_file, "contents ");
1239
1240 }
1241 else
1242 {
1243 fprintf (config.map_file, " (no attached output section)");
1244 }
1245 print_nl ();
1246 if (output_section_statement->load_base)
1247 {
1248 bfd_vma b = exp_get_abs_int(output_section_statement->load_base,
1249 0, "output base", lang_final_phase_enum);
1250 fprintf (config.map_file, "Output address ");
1251 fprintf_vma (config.map_file, b);
1252 fprintf (config.map_file, "\n");
1253 }
1254 if (output_section_statement->section_alignment >= 0
1255 || output_section_statement->subsection_alignment >= 0)
1256 {
1257 fprintf (config.map_file, "\t\t\t\t\tforced alignment ");
1258 if (output_section_statement->section_alignment >= 0)
1259 {
1260 fprintf (config.map_file, "section 2**%d ",output_section_statement->section_alignment );
1261 }
1262 if ( output_section_statement->subsection_alignment >= 0)
1263 {
1264 fprintf (config.map_file, "subsection 2**%d ",output_section_statement->subsection_alignment );
1265 }
1266
1267 print_nl ();
1268 }
1269 print_statement (output_section_statement->children.head,
1270 output_section_statement);
1271
1272 }
1273
1274 static void
1275 print_assignment (assignment, output_section)
1276 lang_assignment_statement_type * assignment;
1277 lang_output_section_statement_type * output_section;
1278 {
1279 etree_value_type result;
1280
1281 print_section ("");
1282 print_space ();
1283 print_section ("");
1284 print_space ();
1285 print_address (print_dot);
1286 print_space ();
1287 result = exp_fold_tree (assignment->exp->assign.src,
1288 output_section,
1289 lang_final_phase_enum,
1290 print_dot,
1291 &print_dot);
1292
1293 if (result.valid)
1294 {
1295 print_address (result.value);
1296 }
1297 else
1298 {
1299 fprintf (config.map_file, "*undefined*");
1300 }
1301 print_space ();
1302 exp_print_tree (assignment->exp);
1303
1304 fprintf (config.map_file, "\n");
1305 }
1306
1307 static void
1308 print_input_statement (statm)
1309 lang_input_statement_type * statm;
1310 {
1311 if (statm->filename != (char *) NULL)
1312 {
1313 fprintf (config.map_file, "LOAD %s\n", statm->filename);
1314 }
1315 }
1316
1317 /* Print all the defined symbols for the abfd provided by in the supplied
1318 section.
1319 */
1320
1321 static boolean
1322 print_one_symbol (hash_entry, ptr)
1323 struct bfd_link_hash_entry *hash_entry;
1324 PTR ptr;
1325 {
1326 asection * sec = (asection *)ptr;
1327
1328 if (hash_entry->type == bfd_link_hash_defined
1329 || hash_entry->type == bfd_link_hash_defweak)
1330 {
1331 if (sec == hash_entry->u.def.section) {
1332 print_section ("");
1333 fprintf (config.map_file, " ");
1334 print_section ("");
1335 fprintf (config.map_file, " ");
1336 print_address (hash_entry->u.def.value + outside_section_address (sec));
1337 fprintf (config.map_file, " %s", hash_entry->root.string);
1338 print_nl ();
1339 }
1340 }
1341
1342 return true;
1343 }
1344
1345 static void
1346 print_input_section (in)
1347 lang_input_section_type * in;
1348 {
1349 asection *i = in->section;
1350 bfd_size_type size = i->_cooked_size != 0 ? i->_cooked_size : i->_raw_size;
1351
1352 if (size != 0)
1353 {
1354 print_section ("");
1355 fprintf (config.map_file, " ");
1356 print_section (i->name);
1357 fprintf (config.map_file, " ");
1358 if (i->output_section)
1359 {
1360 print_address (i->output_section->vma + i->output_offset);
1361 fprintf (config.map_file, " ");
1362 print_size (i->_raw_size);
1363 fprintf (config.map_file, " ");
1364 print_size(i->_cooked_size);
1365 fprintf (config.map_file, " ");
1366 print_alignment (i->alignment_power);
1367 fprintf (config.map_file, " ");
1368 if (in->ifile)
1369 {
1370
1371 bfd *abfd = in->ifile->the_bfd;
1372
1373 if (in->ifile->just_syms_flag == true)
1374 {
1375 fprintf (config.map_file, "symbols only ");
1376 }
1377
1378 fprintf (config.map_file, " %s ", abfd->xvec->name);
1379 if (abfd->my_archive != (bfd *) NULL)
1380 {
1381 fprintf (config.map_file, "[%s]%s", abfd->my_archive->filename,
1382 abfd->filename);
1383 }
1384 else
1385 {
1386 fprintf (config.map_file, "%s", abfd->filename);
1387 }
1388 fprintf (config.map_file, "(overhead %d bytes)", (int) bfd_alloc_size (abfd));
1389 print_nl ();
1390
1391 /* Print all the symbols */
1392 bfd_link_hash_traverse (link_info.hash, print_one_symbol, (PTR) i);
1393 }
1394 else
1395 {
1396 print_nl ();
1397 }
1398
1399
1400 print_dot = outside_section_address (i) + size;
1401 }
1402 else
1403 {
1404 fprintf (config.map_file, "No output section allocated\n");
1405 }
1406 }
1407 }
1408
1409 static void
1410 print_fill_statement (fill)
1411 lang_fill_statement_type * fill;
1412 {
1413 fprintf (config.map_file, "FILL mask ");
1414 print_fill (fill->fill);
1415 }
1416
1417 static void
1418 print_data_statement (data)
1419 lang_data_statement_type * data;
1420 {
1421 /* bfd_vma value; */
1422 print_section ("");
1423 print_space ();
1424 print_section ("");
1425 print_space ();
1426 /* ASSERT(print_dot == data->output_vma);*/
1427
1428 print_address (data->output_vma + data->output_section->vma);
1429 print_space ();
1430 print_address (data->value);
1431 print_space ();
1432 switch (data->type)
1433 {
1434 case BYTE:
1435 fprintf (config.map_file, "BYTE ");
1436 print_dot += BYTE_SIZE;
1437 break;
1438 case SHORT:
1439 fprintf (config.map_file, "SHORT ");
1440 print_dot += SHORT_SIZE;
1441 break;
1442 case LONG:
1443 fprintf (config.map_file, "LONG ");
1444 print_dot += LONG_SIZE;
1445 break;
1446 case QUAD:
1447 fprintf (config.map_file, "QUAD ");
1448 print_dot += QUAD_SIZE;
1449 break;
1450 }
1451
1452 exp_print_tree (data->exp);
1453
1454 fprintf (config.map_file, "\n");
1455 }
1456
1457 /* Print a reloc statement. */
1458
1459 static void
1460 print_reloc_statement (reloc)
1461 lang_reloc_statement_type *reloc;
1462 {
1463 print_section ("");
1464 print_space ();
1465 print_section ("");
1466 print_space ();
1467
1468 /* ASSERT(print_dot == data->output_vma);*/
1469
1470 print_address (reloc->output_vma + reloc->output_section->vma);
1471 print_space ();
1472 print_address (reloc->addend_value);
1473 print_space ();
1474
1475 fprintf (config.map_file, "RELOC %s ", reloc->howto->name);
1476
1477 print_dot += bfd_get_reloc_size (reloc->howto);
1478
1479 exp_print_tree (reloc->addend_exp);
1480
1481 fprintf (config.map_file, "\n");
1482 }
1483
1484 static void
1485 print_padding_statement (s)
1486 lang_padding_statement_type * s;
1487 {
1488 print_section ("");
1489 print_space ();
1490 print_section ("*fill*");
1491 print_space ();
1492 print_address (s->output_offset + s->output_section->vma);
1493 print_space ();
1494 print_size (s->size);
1495 print_space ();
1496 print_fill (s->fill);
1497 print_nl ();
1498
1499 print_dot = s->output_offset + s->output_section->vma + s->size;
1500
1501 }
1502
1503 static void
1504 print_wild_statement (w, os)
1505 lang_wild_statement_type * w;
1506 lang_output_section_statement_type * os;
1507 {
1508 fprintf (config.map_file, " from ");
1509 if (w->filename != (char *) NULL)
1510 {
1511 fprintf (config.map_file, "%s", w->filename);
1512 }
1513 else
1514 {
1515 fprintf (config.map_file, "*");
1516 }
1517 if (w->section_name != (char *) NULL)
1518 {
1519 fprintf (config.map_file, "(%s)", w->section_name);
1520 }
1521 else
1522 {
1523 fprintf (config.map_file, "(*)");
1524 }
1525 print_nl ();
1526 print_statement (w->children.head, os);
1527
1528 }
1529
1530 /* Print a group statement. */
1531
1532 static void
1533 print_group (s, os)
1534 lang_group_statement_type *s;
1535 lang_output_section_statement_type *os;
1536 {
1537 fprintf (config.map_file, "START GROUP\n");
1538 print_statement (s->children.head, os);
1539 fprintf (config.map_file, "END GROUP\n");
1540 }
1541
1542 static void
1543 print_statement (s, os)
1544 lang_statement_union_type * s;
1545 lang_output_section_statement_type * os;
1546 {
1547 while (s)
1548 {
1549 switch (s->header.type)
1550 {
1551 case lang_constructors_statement_enum:
1552 fprintf (config.map_file, "constructors:\n");
1553 print_statement (constructor_list.head, os);
1554 break;
1555 case lang_wild_statement_enum:
1556 print_wild_statement (&s->wild_statement, os);
1557 break;
1558 default:
1559 fprintf (config.map_file, "Fail with %d\n", s->header.type);
1560 FAIL ();
1561 break;
1562 case lang_address_statement_enum:
1563 fprintf (config.map_file, "address\n");
1564 break;
1565 case lang_object_symbols_statement_enum:
1566 fprintf (config.map_file, "object symbols\n");
1567 break;
1568 case lang_fill_statement_enum:
1569 print_fill_statement (&s->fill_statement);
1570 break;
1571 case lang_data_statement_enum:
1572 print_data_statement (&s->data_statement);
1573 break;
1574 case lang_reloc_statement_enum:
1575 print_reloc_statement (&s->reloc_statement);
1576 break;
1577 case lang_input_section_enum:
1578 print_input_section (&s->input_section);
1579 break;
1580 case lang_padding_statement_enum:
1581 print_padding_statement (&s->padding_statement);
1582 break;
1583 case lang_output_section_statement_enum:
1584 print_output_section_statement (&s->output_section_statement);
1585 break;
1586 case lang_assignment_statement_enum:
1587 print_assignment (&s->assignment_statement,
1588 os);
1589 break;
1590 case lang_target_statement_enum:
1591 fprintf (config.map_file, "TARGET(%s)\n", s->target_statement.target);
1592 break;
1593 case lang_output_statement_enum:
1594 fprintf (config.map_file, "OUTPUT(%s %s)\n",
1595 s->output_statement.name,
1596 output_target ? output_target : "");
1597 break;
1598 case lang_input_statement_enum:
1599 print_input_statement (&s->input_statement);
1600 break;
1601 case lang_group_statement_enum:
1602 print_group (&s->group_statement, os);
1603 break;
1604 case lang_afile_asection_pair_statement_enum:
1605 FAIL ();
1606 break;
1607 }
1608 s = s->next;
1609 }
1610 }
1611
1612
1613 static void
1614 print_statements ()
1615 {
1616 print_statement (statement_list.head,
1617 abs_output_section);
1618
1619 }
1620
1621 static bfd_vma
1622 insert_pad (this_ptr, fill, power, output_section_statement, dot)
1623 lang_statement_union_type ** this_ptr;
1624 fill_type fill;
1625 unsigned int power;
1626 asection * output_section_statement;
1627 bfd_vma dot;
1628 {
1629 /* Align this section first to the
1630 input sections requirement, then
1631 to the output section's requirement.
1632 If this alignment is > than any seen before,
1633 then record it too. Perform the alignment by
1634 inserting a magic 'padding' statement.
1635 */
1636
1637 unsigned int alignment_needed = align_power (dot, power) - dot;
1638
1639 if (alignment_needed != 0)
1640 {
1641 lang_statement_union_type *new =
1642 ((lang_statement_union_type *)
1643 stat_alloc (sizeof (lang_padding_statement_type)));
1644
1645 /* Link into existing chain */
1646 new->header.next = *this_ptr;
1647 *this_ptr = new;
1648 new->header.type = lang_padding_statement_enum;
1649 new->padding_statement.output_section = output_section_statement;
1650 new->padding_statement.output_offset =
1651 dot - output_section_statement->vma;
1652 new->padding_statement.fill = fill;
1653 new->padding_statement.size = alignment_needed;
1654 }
1655
1656
1657 /* Remember the most restrictive alignment */
1658 if (power > output_section_statement->alignment_power)
1659 {
1660 output_section_statement->alignment_power = power;
1661 }
1662 output_section_statement->_raw_size += alignment_needed;
1663 return alignment_needed + dot;
1664
1665 }
1666
1667 /* Work out how much this section will move the dot point */
1668 static bfd_vma
1669 size_input_section (this_ptr, output_section_statement, fill, dot, relax)
1670 lang_statement_union_type ** this_ptr;
1671 lang_output_section_statement_type * output_section_statement;
1672 fill_type fill;
1673 bfd_vma dot;
1674 boolean relax;
1675 {
1676 lang_input_section_type *is = &((*this_ptr)->input_section);
1677 asection *i = is->section;
1678
1679 if (is->ifile->just_syms_flag == false)
1680 {
1681 if (output_section_statement->subsection_alignment != -1)
1682 i->alignment_power =
1683 output_section_statement->subsection_alignment;
1684
1685 dot = insert_pad (this_ptr, fill, i->alignment_power,
1686 output_section_statement->bfd_section, dot);
1687
1688 /* Remember where in the output section this input section goes */
1689
1690 i->output_offset = dot - output_section_statement->bfd_section->vma;
1691
1692 /* Mark how big the output section must be to contain this now
1693 */
1694 if (i->_cooked_size != 0)
1695 dot += i->_cooked_size;
1696 else
1697 dot += i->_raw_size;
1698 output_section_statement->bfd_section->_raw_size = dot - output_section_statement->bfd_section->vma;
1699 }
1700 else
1701 {
1702 i->output_offset = i->vma - output_section_statement->bfd_section->vma;
1703 }
1704
1705 return dot;
1706 }
1707
1708 /* This variable indicates whether bfd_relax_section should be called
1709 again. */
1710
1711 static boolean relax_again;
1712
1713 /* Set the sizes for all the output sections. */
1714
1715 bfd_vma
1716 lang_size_sections (s, output_section_statement, prev, fill, dot, relax)
1717 lang_statement_union_type * s;
1718 lang_output_section_statement_type * output_section_statement;
1719 lang_statement_union_type ** prev;
1720 fill_type fill;
1721 bfd_vma dot;
1722 boolean relax;
1723 {
1724 /* Size up the sections from their constituent parts */
1725 for (; s != (lang_statement_union_type *) NULL; s = s->next)
1726 {
1727 switch (s->header.type)
1728 {
1729
1730 case lang_output_section_statement_enum:
1731 {
1732 bfd_vma after;
1733 lang_output_section_statement_type *os = &s->output_section_statement;
1734
1735 if (os->bfd_section == NULL)
1736 {
1737 /* This section was never actually created. */
1738 break;
1739 }
1740
1741 /* If this is a COFF shared library section, use the size and
1742 address from the input section. FIXME: This is COFF
1743 specific; it would be cleaner if there were some other way
1744 to do this, but nothing simple comes to mind. */
1745 if ((os->bfd_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
1746 {
1747 asection *input;
1748
1749 if (os->children.head == NULL
1750 || os->children.head->next != NULL
1751 || os->children.head->header.type != lang_input_section_enum)
1752 einfo ("%P%X: Internal error on COFF shared library section %s",
1753 os->name);
1754
1755 input = os->children.head->input_section.section;
1756 bfd_set_section_vma (os->bfd_section->owner,
1757 os->bfd_section,
1758 bfd_section_vma (input->owner, input));
1759 os->bfd_section->_raw_size = input->_raw_size;
1760 break;
1761 }
1762
1763 if (bfd_is_abs_section (os->bfd_section))
1764 {
1765 /* No matter what happens, an abs section starts at zero */
1766 ASSERT (os->bfd_section->vma == 0);
1767 }
1768 else
1769 {
1770 if (os->addr_tree == (etree_type *) NULL)
1771 {
1772 /* No address specified for this section, get one
1773 from the region specification
1774 */
1775 if (os->region == (lang_memory_region_type *) NULL)
1776 {
1777 os->region = lang_memory_region_lookup ("*default*");
1778 }
1779 dot = os->region->current;
1780 if (os->section_alignment == -1)
1781 dot = align_power (dot, os->bfd_section->alignment_power);
1782 }
1783 else
1784 {
1785 etree_value_type r;
1786
1787 r = exp_fold_tree (os->addr_tree,
1788 abs_output_section,
1789 lang_allocating_phase_enum,
1790 dot, &dot);
1791 if (r.valid == false)
1792 {
1793 einfo ("%F%S: non constant address expression for section %s\n",
1794 os->name);
1795 }
1796 dot = r.value;
1797 }
1798 /* The section starts here */
1799 /* First, align to what the section needs */
1800
1801 if (os->section_alignment != -1)
1802 dot = align_power (dot, os->section_alignment);
1803
1804 bfd_set_section_vma (0, os->bfd_section, dot);
1805
1806 os->bfd_section->output_offset = 0;
1807 }
1808
1809 (void) lang_size_sections (os->children.head, os, &os->children.head,
1810 os->fill, dot, relax);
1811 /* Ignore the size of the input sections, use the vma and size to */
1812 /* align against */
1813
1814 after = ALIGN_N (os->bfd_section->vma +
1815 os->bfd_section->_raw_size,
1816 /* The coercion here is important, see ld.h. */
1817 (bfd_vma) os->block_value);
1818
1819 if (bfd_is_abs_section (os->bfd_section))
1820 ASSERT (after == os->bfd_section->vma);
1821 else
1822 os->bfd_section->_raw_size = after - os->bfd_section->vma;
1823 dot = os->bfd_section->vma + os->bfd_section->_raw_size;
1824 os->processed = true;
1825
1826 /* Replace into region ? */
1827 if (os->region != (lang_memory_region_type *) NULL)
1828 {
1829 os->region->current = dot;
1830 /* Make sure this isn't silly. */
1831 if ((os->region->current < os->region->origin)
1832 || (os->region->current
1833 > os->region->origin + os->region->length))
1834 {
1835 if (os->addr_tree != (etree_type *) NULL)
1836 {
1837 einfo ("%X%P: address 0x%v of %B section %s is not within region %s\n",
1838 os->region->current,
1839 os->bfd_section->owner,
1840 os->bfd_section->name,
1841 os->region->name);
1842 }
1843 else
1844 {
1845 einfo ("%X%P: region %s is full (%B section %s)\n",
1846 os->region->name,
1847 os->bfd_section->owner,
1848 os->bfd_section->name);
1849 }
1850 /* Reset the region pointer. */
1851 os->region->current = os->region->origin;
1852 }
1853 }
1854 }
1855 break;
1856
1857 case lang_constructors_statement_enum:
1858 dot = lang_size_sections (constructor_list.head,
1859 output_section_statement,
1860 &s->wild_statement.children.head,
1861 fill,
1862 dot, relax);
1863 break;
1864
1865 case lang_data_statement_enum:
1866 {
1867 unsigned int size = 0;
1868
1869 s->data_statement.output_vma = dot - output_section_statement->bfd_section->vma;
1870 s->data_statement.output_section =
1871 output_section_statement->bfd_section;
1872
1873 switch (s->data_statement.type)
1874 {
1875 case QUAD:
1876 size = QUAD_SIZE;
1877 break;
1878 case LONG:
1879 size = LONG_SIZE;
1880 break;
1881 case SHORT:
1882 size = SHORT_SIZE;
1883 break;
1884 case BYTE:
1885 size = BYTE_SIZE;
1886 break;
1887
1888 }
1889 dot += size;
1890 output_section_statement->bfd_section->_raw_size += size;
1891 /* The output section gets contents, and then we inspect for
1892 any flags set in the input script which override any ALLOC */
1893 output_section_statement->bfd_section->flags |= SEC_HAS_CONTENTS;
1894 if (!(output_section_statement->flags & SEC_NEVER_LOAD)) {
1895 output_section_statement->bfd_section->flags |= SEC_ALLOC | SEC_LOAD;
1896 }
1897 }
1898 break;
1899
1900 case lang_reloc_statement_enum:
1901 {
1902 int size;
1903
1904 s->reloc_statement.output_vma =
1905 dot - output_section_statement->bfd_section->vma;
1906 s->reloc_statement.output_section =
1907 output_section_statement->bfd_section;
1908 size = bfd_get_reloc_size (s->reloc_statement.howto);
1909 dot += size;
1910 output_section_statement->bfd_section->_raw_size += size;
1911 }
1912 break;
1913
1914 case lang_wild_statement_enum:
1915
1916 dot = lang_size_sections (s->wild_statement.children.head,
1917 output_section_statement,
1918 &s->wild_statement.children.head,
1919
1920 fill, dot, relax);
1921
1922 break;
1923
1924 case lang_object_symbols_statement_enum:
1925 link_info.create_object_symbols_section =
1926 output_section_statement->bfd_section;
1927 break;
1928 case lang_output_statement_enum:
1929 case lang_target_statement_enum:
1930 break;
1931 case lang_input_section_enum:
1932 {
1933 asection *i;
1934
1935 i = (*prev)->input_section.section;
1936 if (! relax)
1937 i->_cooked_size = i->_raw_size;
1938 else
1939 {
1940 boolean again;
1941
1942 if (! bfd_relax_section (i->owner, i, &link_info, &again))
1943 einfo ("%P%F: can't relax section: %E\n");
1944 if (again)
1945 relax_again = true;
1946 }
1947 dot = size_input_section (prev,
1948 output_section_statement,
1949 output_section_statement->fill,
1950 dot, relax);
1951 }
1952 break;
1953 case lang_input_statement_enum:
1954 break;
1955 case lang_fill_statement_enum:
1956 s->fill_statement.output_section = output_section_statement->bfd_section;
1957
1958 fill = s->fill_statement.fill;
1959 break;
1960 case lang_assignment_statement_enum:
1961 {
1962 bfd_vma newdot = dot;
1963
1964 exp_fold_tree (s->assignment_statement.exp,
1965 output_section_statement,
1966 lang_allocating_phase_enum,
1967 dot,
1968 &newdot);
1969
1970 if (newdot != dot && !relax)
1971 {
1972 /* The assignment changed dot. Insert a pad. */
1973 if (output_section_statement == abs_output_section)
1974 {
1975 /* If we don't have an output section, then just adjust
1976 the default memory address. */
1977 lang_memory_region_lookup ("*default*")->current = newdot;
1978 }
1979 else
1980 {
1981 lang_statement_union_type *new =
1982 ((lang_statement_union_type *)
1983 stat_alloc (sizeof (lang_padding_statement_type)));
1984
1985 /* Link into existing chain */
1986 new->header.next = *prev;
1987 *prev = new;
1988 new->header.type = lang_padding_statement_enum;
1989 new->padding_statement.output_section =
1990 output_section_statement->bfd_section;
1991 new->padding_statement.output_offset =
1992 dot - output_section_statement->bfd_section->vma;
1993 new->padding_statement.fill = fill;
1994 new->padding_statement.size = newdot - dot;
1995 output_section_statement->bfd_section->_raw_size +=
1996 new->padding_statement.size;
1997 }
1998
1999 dot = newdot;
2000 }
2001 }
2002 break;
2003
2004 case lang_padding_statement_enum:
2005 /* If we are relaxing, and this is not the first pass, some
2006 padding statements may have been inserted during previous
2007 passes. We may have to move the padding statement to a new
2008 location if dot has a different value at this point in this
2009 pass than it did at this point in the previous pass. */
2010 s->padding_statement.output_offset =
2011 dot - output_section_statement->bfd_section->vma;
2012 dot += s->padding_statement.size;
2013 break;
2014
2015 case lang_group_statement_enum:
2016 dot = lang_size_sections (s->group_statement.children.head,
2017 output_section_statement,
2018 &s->group_statement.children.head,
2019 fill, dot, relax);
2020 break;
2021
2022 default:
2023 FAIL ();
2024 break;
2025
2026 /* This can only get here when relaxing is turned on */
2027
2028 case lang_address_statement_enum:
2029 break;
2030 }
2031 prev = &s->header.next;
2032 }
2033 return dot;
2034 }
2035
2036 bfd_vma
2037 lang_do_assignments (s, output_section_statement, fill, dot)
2038 lang_statement_union_type * s;
2039 lang_output_section_statement_type * output_section_statement;
2040 fill_type fill;
2041 bfd_vma dot;
2042 {
2043 for (; s != (lang_statement_union_type *) NULL; s = s->next)
2044 {
2045 switch (s->header.type)
2046 {
2047 case lang_constructors_statement_enum:
2048 dot = lang_do_assignments (constructor_list.head,
2049 output_section_statement,
2050 fill,
2051 dot);
2052 break;
2053
2054 case lang_output_section_statement_enum:
2055 {
2056 lang_output_section_statement_type *os =
2057 &(s->output_section_statement);
2058
2059 if (os->bfd_section != NULL)
2060 {
2061 dot = os->bfd_section->vma;
2062 (void) lang_do_assignments (os->children.head, os,
2063 os->fill, dot);
2064 dot = os->bfd_section->vma + os->bfd_section->_raw_size;
2065 }
2066 if (os->load_base)
2067 {
2068 /* If nothing has been placed into the output section then
2069 it won't have a bfd_section. */
2070 if (os->bfd_section)
2071 {
2072 os->bfd_section->lma
2073 = exp_get_abs_int(os->load_base, 0,"load base", lang_final_phase_enum);
2074 }
2075 }
2076 }
2077 break;
2078 case lang_wild_statement_enum:
2079
2080 dot = lang_do_assignments (s->wild_statement.children.head,
2081 output_section_statement,
2082 fill, dot);
2083
2084 break;
2085
2086 case lang_object_symbols_statement_enum:
2087 case lang_output_statement_enum:
2088 case lang_target_statement_enum:
2089 #if 0
2090 case lang_common_statement_enum:
2091 #endif
2092 break;
2093 case lang_data_statement_enum:
2094 {
2095 etree_value_type value;
2096
2097 value = exp_fold_tree (s->data_statement.exp,
2098 abs_output_section,
2099 lang_final_phase_enum, dot, &dot);
2100 s->data_statement.value = value.value;
2101 if (value.valid == false)
2102 einfo ("%F%P: invalid data statement\n");
2103 }
2104 switch (s->data_statement.type)
2105 {
2106 case QUAD:
2107 dot += QUAD_SIZE;
2108 break;
2109 case LONG:
2110 dot += LONG_SIZE;
2111 break;
2112 case SHORT:
2113 dot += SHORT_SIZE;
2114 break;
2115 case BYTE:
2116 dot += BYTE_SIZE;
2117 break;
2118 }
2119 break;
2120
2121 case lang_reloc_statement_enum:
2122 {
2123 etree_value_type value;
2124
2125 value = exp_fold_tree (s->reloc_statement.addend_exp,
2126 abs_output_section,
2127 lang_final_phase_enum, dot, &dot);
2128 s->reloc_statement.addend_value = value.value;
2129 if (value.valid == false)
2130 einfo ("%F%P: invalid reloc statement\n");
2131 }
2132 dot += bfd_get_reloc_size (s->reloc_statement.howto);
2133 break;
2134
2135 case lang_input_section_enum:
2136 {
2137 asection *in = s->input_section.section;
2138
2139 if (in->_cooked_size != 0)
2140 dot += in->_cooked_size;
2141 else
2142 dot += in->_raw_size;
2143 }
2144 break;
2145
2146 case lang_input_statement_enum:
2147 break;
2148 case lang_fill_statement_enum:
2149 fill = s->fill_statement.fill;
2150 break;
2151 case lang_assignment_statement_enum:
2152 {
2153 exp_fold_tree (s->assignment_statement.exp,
2154 output_section_statement,
2155 lang_final_phase_enum,
2156 dot,
2157 &dot);
2158 }
2159
2160 break;
2161 case lang_padding_statement_enum:
2162 dot += s->padding_statement.size;
2163 break;
2164
2165 case lang_group_statement_enum:
2166 dot = lang_do_assignments (s->group_statement.children.head,
2167 output_section_statement,
2168 fill, dot);
2169
2170 break;
2171
2172 default:
2173 FAIL ();
2174 break;
2175 case lang_address_statement_enum:
2176 break;
2177 }
2178
2179 }
2180 return dot;
2181 }
2182
2183 /* Fix any .startof. or .sizeof. symbols. When the assemblers see the
2184 operator .startof. (section_name), it produces an undefined symbol
2185 .startof.section_name. Similarly, when it sees
2186 .sizeof. (section_name), it produces an undefined symbol
2187 .sizeof.section_name. For all the output sections, we look for
2188 such symbols, and set them to the correct value. */
2189
2190 static void
2191 lang_set_startof ()
2192 {
2193 asection *s;
2194
2195 for (s = output_bfd->sections; s != NULL; s = s->next)
2196 {
2197 const char *secname;
2198 char *buf;
2199 struct bfd_link_hash_entry *h;
2200
2201 secname = bfd_get_section_name (output_bfd, s);
2202 buf = xmalloc (10 + strlen (secname));
2203
2204 sprintf (buf, ".startof.%s", secname);
2205 h = bfd_link_hash_lookup (link_info.hash, buf, false, false, true);
2206 if (h != NULL && h->type == bfd_link_hash_undefined)
2207 {
2208 h->type = bfd_link_hash_defined;
2209 h->u.def.value = bfd_get_section_vma (output_bfd, s);
2210 h->u.def.section = bfd_abs_section_ptr;
2211 }
2212
2213 sprintf (buf, ".sizeof.%s", secname);
2214 h = bfd_link_hash_lookup (link_info.hash, buf, false, false, true);
2215 if (h != NULL && h->type == bfd_link_hash_undefined)
2216 {
2217 h->type = bfd_link_hash_defined;
2218 if (s->_cooked_size != 0)
2219 h->u.def.value = s->_cooked_size;
2220 else
2221 h->u.def.value = s->_raw_size;
2222 h->u.def.section = bfd_abs_section_ptr;
2223 }
2224
2225 free (buf);
2226 }
2227 }
2228
2229 static void
2230 lang_finish ()
2231 {
2232 struct bfd_link_hash_entry *h;
2233 boolean warn;
2234
2235 if (link_info.relocateable || link_info.shared)
2236 warn = false;
2237 else
2238 warn = true;
2239
2240 if (entry_symbol == (char *) NULL)
2241 {
2242 /* No entry has been specified. Look for start, but don't warn
2243 if we don't find it. */
2244 entry_symbol = "start";
2245 warn = false;
2246 }
2247
2248 h = bfd_link_hash_lookup (link_info.hash, entry_symbol, false, false, true);
2249 if (h != (struct bfd_link_hash_entry *) NULL
2250 && (h->type == bfd_link_hash_defined
2251 || h->type == bfd_link_hash_defweak)
2252 && h->u.def.section->output_section != NULL)
2253 {
2254 bfd_vma val;
2255
2256 val = (h->u.def.value
2257 + bfd_get_section_vma (output_bfd,
2258 h->u.def.section->output_section)
2259 + h->u.def.section->output_offset);
2260 if (! bfd_set_start_address (output_bfd, val))
2261 einfo ("%P%F:%s: can't set start address\n", entry_symbol);
2262 }
2263 else
2264 {
2265 asection *ts;
2266
2267 /* Can't find the entry symbol. Use the first address in the
2268 text section. */
2269 ts = bfd_get_section_by_name (output_bfd, ".text");
2270 if (ts != (asection *) NULL)
2271 {
2272 if (warn)
2273 einfo ("%P: warning: cannot find entry symbol %s; defaulting to %V\n",
2274 entry_symbol, bfd_get_section_vma (output_bfd, ts));
2275 if (! bfd_set_start_address (output_bfd,
2276 bfd_get_section_vma (output_bfd, ts)))
2277 einfo ("%P%F: can't set start address\n");
2278 }
2279 else
2280 {
2281 if (warn)
2282 einfo ("%P: warning: cannot find entry symbol %s; not setting start address\n",
2283 entry_symbol);
2284 }
2285 }
2286 }
2287
2288 /* Check that the architecture of all the input files is compatible
2289 with the output file. Also call the backend to let it do any
2290 other checking that is needed. */
2291
2292 static void
2293 lang_check ()
2294 {
2295 lang_statement_union_type *file;
2296 bfd *input_bfd;
2297 CONST bfd_arch_info_type *compatible;
2298
2299 for (file = file_chain.head;
2300 file != (lang_statement_union_type *) NULL;
2301 file = file->input_statement.next)
2302 {
2303 input_bfd = file->input_statement.the_bfd;
2304 compatible = bfd_arch_get_compatible (input_bfd,
2305 output_bfd);
2306 if (compatible == NULL)
2307 einfo ("%P: warning: %s architecture of input file `%B' is incompatible with %s output\n",
2308 bfd_printable_name (input_bfd), input_bfd,
2309 bfd_printable_name (output_bfd));
2310
2311 else
2312 bfd_merge_private_bfd_data (input_bfd, output_bfd);
2313 }
2314 }
2315
2316 /* Look through all the global common symbols and attach them to the
2317 correct section. The -sort-common command line switch may be used
2318 to roughly sort the entries by size. */
2319
2320 static void
2321 lang_common ()
2322 {
2323 if (link_info.relocateable
2324 && ! command_line.force_common_definition)
2325 return;
2326
2327 if (! config.sort_common)
2328 bfd_link_hash_traverse (link_info.hash, lang_one_common, (PTR) NULL);
2329 else
2330 {
2331 int power;
2332
2333 for (power = 4; power >= 0; power--)
2334 bfd_link_hash_traverse (link_info.hash, lang_one_common,
2335 (PTR) &power);
2336 }
2337 }
2338
2339 /* Place one common symbol in the correct section. */
2340
2341 static boolean
2342 lang_one_common (h, info)
2343 struct bfd_link_hash_entry *h;
2344 PTR info;
2345 {
2346 unsigned int power_of_two;
2347 bfd_vma size;
2348 asection *section;
2349
2350 if (h->type != bfd_link_hash_common)
2351 return true;
2352
2353 size = h->u.c.size;
2354 power_of_two = h->u.c.p->alignment_power;
2355
2356 if (config.sort_common
2357 && power_of_two < (unsigned int) *(int *) info)
2358 return true;
2359
2360 section = h->u.c.p->section;
2361
2362 /* Increase the size of the section. */
2363 section->_raw_size = ALIGN_N (section->_raw_size,
2364 (bfd_size_type) (1 << power_of_two));
2365
2366 /* Adjust the alignment if necessary. */
2367 if (power_of_two > section->alignment_power)
2368 section->alignment_power = power_of_two;
2369
2370 /* Change the symbol from common to defined. */
2371 h->type = bfd_link_hash_defined;
2372 h->u.def.section = section;
2373 h->u.def.value = section->_raw_size;
2374
2375 /* Increase the size of the section. */
2376 section->_raw_size += size;
2377
2378 /* Make sure the section is allocated in memory. */
2379 section->flags |= SEC_ALLOC;
2380
2381 if (config.map_file != NULL)
2382 fprintf (config.map_file, "Allocating common %s: %lx at %lx %s\n",
2383 h->root.string, (unsigned long) size,
2384 (unsigned long) h->u.def.value, section->owner->filename);
2385
2386 return true;
2387 }
2388
2389 /*
2390 run through the input files and ensure that every input
2391 section has somewhere to go. If one is found without
2392 a destination then create an input request and place it
2393 into the statement tree.
2394 */
2395
2396 static void
2397 lang_place_orphans ()
2398 {
2399 lang_input_statement_type *file;
2400
2401 for (file = (lang_input_statement_type *) file_chain.head;
2402 file != (lang_input_statement_type *) NULL;
2403 file = (lang_input_statement_type *) file->next)
2404 {
2405 asection *s;
2406
2407 for (s = file->the_bfd->sections;
2408 s != (asection *) NULL;
2409 s = s->next)
2410 {
2411 if (s->output_section == (asection *) NULL)
2412 {
2413 /* This section of the file is not attatched, root
2414 around for a sensible place for it to go */
2415
2416 if (file->just_syms_flag)
2417 {
2418 /* We are only retrieving symbol values from this
2419 file. We want the symbols to act as though the
2420 values in the file are absolute. */
2421 s->output_section = bfd_abs_section_ptr;
2422 s->output_offset = s->vma;
2423 }
2424 else if (file->common_section == s)
2425 {
2426 /* This is a lonely common section which must
2427 have come from an archive. We attatch to the
2428 section with the wildcard */
2429 if (! link_info.relocateable
2430 && ! command_line.force_common_definition)
2431 {
2432 if (default_common_section ==
2433 (lang_output_section_statement_type *) NULL)
2434 {
2435 info_msg ("%P: no [COMMON] command, defaulting to .bss\n");
2436
2437 default_common_section =
2438 lang_output_section_statement_lookup (".bss");
2439
2440 }
2441 wild_doit (&default_common_section->children, s,
2442 default_common_section, file);
2443 }
2444 }
2445 else if (ldemul_place_orphan (file, s))
2446 ;
2447 else
2448 {
2449 lang_output_section_statement_type *os =
2450 lang_output_section_statement_lookup (s->name);
2451
2452 wild_doit (&os->children, s, os, file);
2453 }
2454 }
2455 }
2456 }
2457 }
2458
2459
2460 void
2461 lang_set_flags (ptr, flags)
2462 int *ptr;
2463 CONST char *flags;
2464 {
2465 boolean state = false;
2466
2467 *ptr = 0;
2468 while (*flags)
2469 {
2470 if (*flags == '!')
2471 {
2472 state = false;
2473 flags++;
2474 }
2475 else
2476 state = true;
2477 switch (*flags)
2478 {
2479 case 'R':
2480 /* ptr->flag_read = state; */
2481 break;
2482 case 'W':
2483 /* ptr->flag_write = state; */
2484 break;
2485 case 'X':
2486 /* ptr->flag_executable= state;*/
2487 break;
2488 case 'L':
2489 case 'I':
2490 /* ptr->flag_loadable= state;*/
2491 break;
2492 default:
2493 einfo ("%P%F: invalid syntax in flags\n");
2494 break;
2495 }
2496 flags++;
2497 }
2498 }
2499
2500 /* Call a function on each input file. This function will be called
2501 on an archive, but not on the elements. */
2502
2503 void
2504 lang_for_each_input_file (func)
2505 void (*func) PARAMS ((lang_input_statement_type *));
2506 {
2507 lang_input_statement_type *f;
2508
2509 for (f = (lang_input_statement_type *) input_file_chain.head;
2510 f != NULL;
2511 f = (lang_input_statement_type *) f->next_real_file)
2512 func (f);
2513 }
2514
2515 /* Call a function on each file. The function will be called on all
2516 the elements of an archive which are included in the link, but will
2517 not be called on the archive file itself. */
2518
2519 void
2520 lang_for_each_file (func)
2521 void (*func) PARAMS ((lang_input_statement_type *));
2522 {
2523 lang_input_statement_type *f;
2524
2525 for (f = (lang_input_statement_type *) file_chain.head;
2526 f != (lang_input_statement_type *) NULL;
2527 f = (lang_input_statement_type *) f->next)
2528 {
2529 func (f);
2530 }
2531 }
2532
2533 #if 0
2534
2535 /* Not used. */
2536
2537 void
2538 lang_for_each_input_section (func)
2539 void (*func) PARAMS ((bfd * ab, asection * as));
2540 {
2541 lang_input_statement_type *f;
2542
2543 for (f = (lang_input_statement_type *) file_chain.head;
2544 f != (lang_input_statement_type *) NULL;
2545 f = (lang_input_statement_type *) f->next)
2546 {
2547 asection *s;
2548
2549 for (s = f->the_bfd->sections;
2550 s != (asection *) NULL;
2551 s = s->next)
2552 {
2553 func (f->the_bfd, s);
2554 }
2555 }
2556 }
2557
2558 #endif
2559
2560 void
2561 ldlang_add_file (entry)
2562 lang_input_statement_type * entry;
2563 {
2564 bfd **pp;
2565
2566 lang_statement_append (&file_chain,
2567 (lang_statement_union_type *) entry,
2568 &entry->next);
2569
2570 /* The BFD linker needs to have a list of all input BFDs involved in
2571 a link. */
2572 ASSERT (entry->the_bfd->link_next == (bfd *) NULL);
2573 ASSERT (entry->the_bfd != output_bfd);
2574 for (pp = &link_info.input_bfds;
2575 *pp != (bfd *) NULL;
2576 pp = &(*pp)->link_next)
2577 ;
2578 *pp = entry->the_bfd;
2579 entry->the_bfd->usrdata = (PTR) entry;
2580 bfd_set_gp_size (entry->the_bfd, g_switch_value);
2581 }
2582
2583 void
2584 lang_add_output (name, from_script)
2585 CONST char *name;
2586 int from_script;
2587 {
2588 /* Make -o on command line override OUTPUT in script. */
2589 if (had_output_filename == false || !from_script)
2590 {
2591 output_filename = name;
2592 had_output_filename = true;
2593 }
2594 }
2595
2596
2597 static lang_output_section_statement_type *current_section;
2598
2599 static int
2600 topower (x)
2601 int x;
2602 {
2603 unsigned int i = 1;
2604 int l;
2605
2606 if (x < 0)
2607 return -1;
2608
2609 for (l = 0; l < 32; l++)
2610 {
2611 if (i >= (unsigned int) x)
2612 return l;
2613 i <<= 1;
2614 }
2615
2616 return 0;
2617 }
2618 void
2619 lang_enter_output_section_statement (output_section_statement_name,
2620 address_exp, flags, block_value,
2621 align, subalign, ebase)
2622 const char *output_section_statement_name;
2623 etree_type * address_exp;
2624 int flags;
2625 bfd_vma block_value;
2626 etree_type *align;
2627 etree_type *subalign;
2628 etree_type *ebase;
2629 {
2630 lang_output_section_statement_type *os;
2631
2632 current_section =
2633 os =
2634 lang_output_section_statement_lookup (output_section_statement_name);
2635
2636
2637
2638 /* Add this statement to tree */
2639 /* add_statement(lang_output_section_statement_enum,
2640 output_section_statement);*/
2641 /* Make next things chain into subchain of this */
2642
2643 if (os->addr_tree ==
2644 (etree_type *) NULL)
2645 {
2646 os->addr_tree =
2647 address_exp;
2648 }
2649 os->flags = flags;
2650 if (flags & SEC_NEVER_LOAD)
2651 os->loadable = 0;
2652 else
2653 os->loadable = 1;
2654 os->block_value = block_value ? block_value : 1;
2655 stat_ptr = &os->children;
2656
2657 os->subsection_alignment = topower(
2658 exp_get_value_int(subalign, -1,
2659 "subsection alignment",
2660 0));
2661 os->section_alignment = topower(
2662 exp_get_value_int(align, -1,
2663 "section alignment", 0));
2664
2665 os->load_base = ebase;
2666 }
2667
2668
2669 void
2670 lang_final ()
2671 {
2672 lang_output_statement_type *new =
2673 new_stat (lang_output_statement, stat_ptr);
2674
2675 new->name = output_filename;
2676 }
2677
2678 /* Reset the current counters in the regions */
2679 static void
2680 reset_memory_regions ()
2681 {
2682 lang_memory_region_type *p = lang_memory_region_list;
2683
2684 for (p = lang_memory_region_list;
2685 p != (lang_memory_region_type *) NULL;
2686 p = p->next)
2687 {
2688 p->old_length = (bfd_size_type) (p->current - p->origin);
2689 p->current = p->origin;
2690 }
2691 }
2692
2693 void
2694 lang_process ()
2695 {
2696 lang_reasonable_defaults ();
2697 current_target = default_target;
2698
2699 lang_for_each_statement (ldlang_open_output); /* Open the output file */
2700
2701 ldemul_create_output_section_statements ();
2702
2703 /* Add to the hash table all undefineds on the command line */
2704 lang_place_undefineds ();
2705
2706 /* Create a bfd for each input file */
2707 current_target = default_target;
2708 open_input_bfds (statement_list.head, false);
2709
2710 ldemul_after_open ();
2711
2712 /* Build all sets based on the information gathered from the input
2713 files. */
2714 ldctor_build_sets ();
2715
2716 /* Size up the common data */
2717 lang_common ();
2718
2719 /* Run through the contours of the script and attatch input sections
2720 to the correct output sections
2721 */
2722 map_input_to_output_sections (statement_list.head, (char *) NULL,
2723 (lang_output_section_statement_type *) NULL);
2724
2725
2726 /* Find any sections not attatched explicitly and handle them */
2727 lang_place_orphans ();
2728
2729 ldemul_before_allocation ();
2730
2731 /* We must record the program headers before we try to fix the
2732 section positions, since they will affect SIZEOF_HEADERS. */
2733 lang_record_phdrs ();
2734
2735 /* Now run around and relax if we can */
2736 if (command_line.relax)
2737 {
2738 /* First time round is a trial run to get the 'worst case'
2739 addresses of the objects if there was no relaxing. */
2740 lang_size_sections (statement_list.head,
2741 abs_output_section,
2742 &(statement_list.head), 0, (bfd_vma) 0, false);
2743
2744 /* Keep relaxing until bfd_relax_section gives up. */
2745 do
2746 {
2747 reset_memory_regions ();
2748
2749 relax_again = false;
2750
2751 /* Do all the assignments with our current guesses as to
2752 section sizes. */
2753 lang_do_assignments (statement_list.head,
2754 abs_output_section,
2755 (fill_type) 0, (bfd_vma) 0);
2756
2757 /* Perform another relax pass - this time we know where the
2758 globals are, so can make better guess. */
2759 lang_size_sections (statement_list.head,
2760 abs_output_section,
2761 &(statement_list.head), 0, (bfd_vma) 0, true);
2762 }
2763 while (relax_again);
2764 }
2765 else
2766 {
2767 /* Size up the sections. */
2768 lang_size_sections (statement_list.head,
2769 abs_output_section,
2770 &(statement_list.head), 0, (bfd_vma) 0, false);
2771 }
2772
2773 /* See if anything special should be done now we know how big
2774 everything is. */
2775 ldemul_after_allocation ();
2776
2777 /* Fix any .startof. or .sizeof. symbols. */
2778 lang_set_startof ();
2779
2780 /* Do all the assignments, now that we know the final restingplaces
2781 of all the symbols */
2782
2783 lang_do_assignments (statement_list.head,
2784 abs_output_section,
2785 (fill_type) 0, (bfd_vma) 0);
2786
2787 /* Make sure that we're not mixing architectures */
2788
2789 lang_check ();
2790
2791 /* Final stuffs */
2792
2793 ldemul_finish ();
2794 lang_finish ();
2795 }
2796
2797 /* EXPORTED TO YACC */
2798
2799 void
2800 lang_add_wild (section_name, filename)
2801 CONST char *CONST section_name;
2802 CONST char *CONST filename;
2803 {
2804 lang_wild_statement_type *new = new_stat (lang_wild_statement,
2805 stat_ptr);
2806
2807 if (section_name != (char *) NULL && strcmp (section_name, "COMMON") == 0)
2808 {
2809 placed_commons = true;
2810 }
2811 if (filename != (char *) NULL)
2812 {
2813 lang_has_input_file = true;
2814 }
2815 new->section_name = section_name;
2816 new->filename = filename;
2817 lang_list_init (&new->children);
2818 }
2819
2820 void
2821 lang_section_start (name, address)
2822 CONST char *name;
2823 etree_type * address;
2824 {
2825 lang_address_statement_type *ad = new_stat (lang_address_statement, stat_ptr);
2826
2827 ad->section_name = name;
2828 ad->address = address;
2829 }
2830
2831 /* Set the start symbol to NAME. CMDLINE is nonzero if this is called
2832 because of a -e argument on the command line, or zero if this is
2833 called by ENTRY in a linker script. Command line arguments take
2834 precedence. */
2835
2836 /* WINDOWS_NT. When an entry point has been specified, we will also force
2837 this symbol to be defined by calling ldlang_add_undef (equivalent to
2838 having switch -u entry_name on the command line). The reason we do
2839 this is so that the user doesn't have to because they would have to use
2840 the -u switch if they were specifying an entry point other than
2841 _mainCRTStartup. Specifically, if creating a windows application, entry
2842 point _WinMainCRTStartup must be specified.
2843 What I have found for non console applications (entry not _mainCRTStartup)
2844 is that the .obj that contains mainCRTStartup is brought in since it is
2845 the first encountered in libc.lib and it has other symbols in it which will
2846 be pulled in by the link process. To avoid this, adding -u with the entry
2847 point name specified forces the correct .obj to be used. We can avoid
2848 making the user do this by always adding the entry point name as an
2849 undefined symbol. */
2850
2851 void
2852 lang_add_entry (name, cmdline)
2853 CONST char *name;
2854 boolean cmdline;
2855 {
2856 if (entry_symbol == NULL
2857 || cmdline
2858 || ! entry_from_cmdline)
2859 {
2860 entry_symbol = name;
2861 entry_from_cmdline = cmdline;
2862 }
2863 #if 0
2864 /* don't do this yet. It seems to work (the executables run), but the
2865 image created is very different from what I was getting before indicating
2866 that something else is being pulled in. When everything else is working,
2867 then try to put this back in to see if it will do the right thing for
2868 other more complicated applications */
2869 ldlang_add_undef (name);
2870 #endif
2871 }
2872
2873 void
2874 lang_add_target (name)
2875 CONST char *name;
2876 {
2877 lang_target_statement_type *new = new_stat (lang_target_statement,
2878 stat_ptr);
2879
2880 new->target = name;
2881
2882 }
2883
2884 void
2885 lang_add_map (name)
2886 CONST char *name;
2887 {
2888 while (*name)
2889 {
2890 switch (*name)
2891 {
2892 case 'F':
2893 map_option_f = true;
2894 break;
2895 }
2896 name++;
2897 }
2898 }
2899
2900 void
2901 lang_add_fill (exp)
2902 int exp;
2903 {
2904 lang_fill_statement_type *new = new_stat (lang_fill_statement,
2905 stat_ptr);
2906
2907 new->fill = exp;
2908 }
2909
2910 void
2911 lang_add_data (type, exp)
2912 int type;
2913 union etree_union *exp;
2914 {
2915
2916 lang_data_statement_type *new = new_stat (lang_data_statement,
2917 stat_ptr);
2918
2919 new->exp = exp;
2920 new->type = type;
2921
2922 }
2923
2924 /* Create a new reloc statement. RELOC is the BFD relocation type to
2925 generate. HOWTO is the corresponding howto structure (we could
2926 look this up, but the caller has already done so). SECTION is the
2927 section to generate a reloc against, or NAME is the name of the
2928 symbol to generate a reloc against. Exactly one of SECTION and
2929 NAME must be NULL. ADDEND is an expression for the addend. */
2930
2931 void
2932 lang_add_reloc (reloc, howto, section, name, addend)
2933 bfd_reloc_code_real_type reloc;
2934 reloc_howto_type *howto;
2935 asection *section;
2936 const char *name;
2937 union etree_union *addend;
2938 {
2939 lang_reloc_statement_type *p = new_stat (lang_reloc_statement, stat_ptr);
2940
2941 p->reloc = reloc;
2942 p->howto = howto;
2943 p->section = section;
2944 p->name = name;
2945 p->addend_exp = addend;
2946
2947 p->addend_value = 0;
2948 p->output_section = NULL;
2949 p->output_vma = 0;
2950 }
2951
2952 void
2953 lang_add_assignment (exp)
2954 etree_type * exp;
2955 {
2956 lang_assignment_statement_type *new = new_stat (lang_assignment_statement,
2957 stat_ptr);
2958
2959 new->exp = exp;
2960 }
2961
2962 void
2963 lang_add_attribute (attribute)
2964 enum statement_enum attribute;
2965 {
2966 new_statement (attribute, sizeof (lang_statement_union_type), stat_ptr);
2967 }
2968
2969 void
2970 lang_startup (name)
2971 CONST char *name;
2972 {
2973 if (startup_file != (char *) NULL)
2974 {
2975 einfo ("%P%Fmultiple STARTUP files\n");
2976 }
2977 first_file->filename = name;
2978 first_file->local_sym_name = name;
2979 first_file->real = true;
2980
2981 startup_file = name;
2982 }
2983
2984 void
2985 lang_float (maybe)
2986 boolean maybe;
2987 {
2988 lang_float_flag = maybe;
2989 }
2990
2991 void
2992 lang_leave_output_section_statement (fill, memspec)
2993 bfd_vma fill;
2994 CONST char *memspec;
2995 {
2996 current_section->fill = fill;
2997 current_section->region = lang_memory_region_lookup (memspec);
2998 stat_ptr = &statement_list;
2999 }
3000
3001 /*
3002 Create an absolute symbol with the given name with the value of the
3003 address of first byte of the section named.
3004
3005 If the symbol already exists, then do nothing.
3006 */
3007 void
3008 lang_abs_symbol_at_beginning_of (secname, name)
3009 const char *secname;
3010 const char *name;
3011 {
3012 struct bfd_link_hash_entry *h;
3013
3014 h = bfd_link_hash_lookup (link_info.hash, name, true, true, true);
3015 if (h == (struct bfd_link_hash_entry *) NULL)
3016 einfo ("%P%F: bfd_link_hash_lookup failed: %E\n");
3017
3018 if (h->type == bfd_link_hash_new
3019 || h->type == bfd_link_hash_undefined)
3020 {
3021 asection *sec;
3022
3023 h->type = bfd_link_hash_defined;
3024
3025 sec = bfd_get_section_by_name (output_bfd, secname);
3026 if (sec == (asection *) NULL)
3027 h->u.def.value = 0;
3028 else
3029 h->u.def.value = bfd_get_section_vma (output_bfd, sec);
3030
3031 h->u.def.section = bfd_abs_section_ptr;
3032 }
3033 }
3034
3035 /*
3036 Create an absolute symbol with the given name with the value of the
3037 address of the first byte after the end of the section named.
3038
3039 If the symbol already exists, then do nothing.
3040 */
3041 void
3042 lang_abs_symbol_at_end_of (secname, name)
3043 const char *secname;
3044 const char *name;
3045 {
3046 struct bfd_link_hash_entry *h;
3047
3048 h = bfd_link_hash_lookup (link_info.hash, name, true, true, true);
3049 if (h == (struct bfd_link_hash_entry *) NULL)
3050 einfo ("%P%F: bfd_link_hash_lookup failed: %E\n");
3051
3052 if (h->type == bfd_link_hash_new
3053 || h->type == bfd_link_hash_undefined)
3054 {
3055 asection *sec;
3056
3057 h->type = bfd_link_hash_defined;
3058
3059 sec = bfd_get_section_by_name (output_bfd, secname);
3060 if (sec == (asection *) NULL)
3061 h->u.def.value = 0;
3062 else
3063 h->u.def.value = (bfd_get_section_vma (output_bfd, sec)
3064 + bfd_section_size (output_bfd, sec));
3065
3066 h->u.def.section = bfd_abs_section_ptr;
3067 }
3068 }
3069
3070 void
3071 lang_statement_append (list, element, field)
3072 lang_statement_list_type * list;
3073 lang_statement_union_type * element;
3074 lang_statement_union_type ** field;
3075 {
3076 *(list->tail) = element;
3077 list->tail = field;
3078 }
3079
3080 /* Set the output format type. -oformat overrides scripts. */
3081
3082 void
3083 lang_add_output_format (format, big, little, from_script)
3084 const char *format;
3085 const char *big;
3086 const char *little;
3087 int from_script;
3088 {
3089 if (output_target == NULL || !from_script)
3090 {
3091 if (command_line.endian == ENDIAN_BIG
3092 && big != NULL)
3093 format = big;
3094 else if (command_line.endian == ENDIAN_LITTLE
3095 && little != NULL)
3096 format = little;
3097
3098 output_target = format;
3099 }
3100 }
3101
3102 /* Enter a group. This creates a new lang_group_statement, and sets
3103 stat_ptr to build new statements within the group. */
3104
3105 void
3106 lang_enter_group ()
3107 {
3108 lang_group_statement_type *g;
3109
3110 g = new_stat (lang_group_statement, stat_ptr);
3111 lang_list_init (&g->children);
3112 stat_ptr = &g->children;
3113 }
3114
3115 /* Leave a group. This just resets stat_ptr to start writing to the
3116 regular list of statements again. Note that this will not work if
3117 groups can occur inside anything else which can adjust stat_ptr,
3118 but currently they can't. */
3119
3120 void
3121 lang_leave_group ()
3122 {
3123 stat_ptr = &statement_list;
3124 }
3125
3126 /* Add a new program header. This is called for each entry in a PHDRS
3127 command in a linker script. */
3128
3129 void
3130 lang_new_phdr (name, type, hdrs, at)
3131 const char *name;
3132 etree_type *type;
3133 unsigned int hdrs;
3134 etree_type *at;
3135 {
3136 struct lang_phdr *n, **pp;
3137
3138 n = (struct lang_phdr *) stat_alloc (sizeof (struct lang_phdr));
3139 n->next = NULL;
3140 n->name = name;
3141 n->type = exp_get_value_int (type, 0, "program header type",
3142 lang_final_phase_enum);
3143 n->hdrs = hdrs;
3144 n->at = at;
3145
3146 for (pp = &lang_phdr_list; *pp != NULL; pp = &(*pp)->next)
3147 ;
3148 *pp = n;
3149 }
3150
3151 /* Record that a section should be placed in a phdr. */
3152
3153 void
3154 lang_section_in_phdr (name)
3155 const char *name;
3156 {
3157 struct lang_output_section_phdr_list *n;
3158
3159 n = ((struct lang_output_section_phdr_list *)
3160 stat_alloc (sizeof (struct lang_output_section_phdr_list)));
3161 n->name = name;
3162 n->used = false;
3163 n->next = current_section->phdrs;
3164 current_section->phdrs = n;
3165 }
3166
3167 /* Record the program header information in the output BFD. FIXME: We
3168 should not be calling an ELF specific function here. */
3169
3170 static void
3171 lang_record_phdrs ()
3172 {
3173 unsigned int alc;
3174 asection **secs;
3175 struct lang_output_section_phdr_list *last;
3176 struct lang_phdr *l;
3177 lang_statement_union_type *u;
3178
3179 alc = 10;
3180 secs = xmalloc (alc * sizeof (asection *));
3181 last = NULL;
3182 for (l = lang_phdr_list; l != NULL; l = l->next)
3183 {
3184 unsigned int c;
3185 bfd_vma at;
3186
3187 c = 0;
3188 for (u = lang_output_section_statement.head;
3189 u != NULL;
3190 u = u->output_section_statement.next)
3191 {
3192 lang_output_section_statement_type *os;
3193 struct lang_output_section_phdr_list *pl;
3194
3195 os = &u->output_section_statement;
3196
3197 pl = os->phdrs;
3198 if (pl != NULL)
3199 last = pl;
3200 else
3201 {
3202 if (! os->loadable
3203 || os->bfd_section == NULL
3204 || (os->bfd_section->flags & SEC_ALLOC) == 0)
3205 continue;
3206 pl = last;
3207 }
3208
3209 if (os->bfd_section == NULL)
3210 continue;
3211
3212 for (; pl != NULL; pl = pl->next)
3213 {
3214 if (strcmp (pl->name, l->name) == 0)
3215 {
3216 if (c >= alc)
3217 {
3218 alc *= 2;
3219 secs = xrealloc (secs, alc * sizeof (asection *));
3220 }
3221 secs[c] = os->bfd_section;
3222 ++c;
3223 pl->used = true;
3224 }
3225 }
3226 }
3227
3228 if (l->at == NULL)
3229 at = 0;
3230 else
3231 at = exp_get_vma (l->at, 0, "phdr load address",
3232 lang_final_phase_enum);
3233 if (! bfd_record_phdr (output_bfd, l->type, false, 0,
3234 l->at == NULL ? false : true,
3235 at,
3236 (l->hdrs & LANG_PHDR_FILEHDR) ? true : false,
3237 (l->hdrs & LANG_PHDR_PHDRS) ? true : false,
3238 c, secs))
3239 einfo ("%F%P: bfd_record_phdr failed: %E\n");
3240 }
3241
3242 free (secs);
3243
3244 /* Make sure all the phdr assignments succeeded. */
3245 for (u = lang_output_section_statement.head;
3246 u != NULL;
3247 u = u->output_section_statement.next)
3248 {
3249 struct lang_output_section_phdr_list *pl;
3250
3251 if (u->output_section_statement.bfd_section == NULL)
3252 continue;
3253
3254 for (pl = u->output_section_statement.phdrs;
3255 pl != NULL;
3256 pl = pl->next)
3257 if (! pl->used && strcmp (pl->name, "NONE") != 0)
3258 einfo ("%X%P: section `%s' assigned to non-existent phdr `%s'\n",
3259 u->output_section_statement.name, pl->name);
3260 }
3261 }
This page took 0.095006 seconds and 5 git commands to generate.