source: binutils/trunk/ld/ldlang.c@ 1973

Last change on this file since 1973 was 1973, checked in by Silvan Scherrer, 8 years ago

binutils: update trunk to version 2.27

File size: 227.1 KB
Line 
1/* Linker command language support.
2 Copyright (C) 1991-2016 Free Software Foundation, Inc.
3
4 This file is part of the GNU Binutils.
5
6 This program 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 3 of the License, or
9 (at your option) any later version.
10
11 This program 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 this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21#include "sysdep.h"
22#include "bfd.h"
23#include "libiberty.h"
24#include "filenames.h"
25#include "safe-ctype.h"
26#include "obstack.h"
27#include "bfdlink.h"
28
29#include "ld.h"
30#include "ldmain.h"
31#include "ldexp.h"
32#include "ldlang.h"
33#include <ldgram.h>
34#include "ldlex.h"
35#include "ldmisc.h"
36#include "ldctor.h"
37#include "ldfile.h"
38#include "ldemul.h"
39#include "fnmatch.h"
40#include "demangle.h"
41#include "hashtab.h"
42#include "libbfd.h"
43#include "elf-bfd.h"
44#ifdef ENABLE_PLUGINS
45#include "plugin.h"
46#endif /* ENABLE_PLUGINS */
47
48#ifndef offsetof
49#define offsetof(TYPE, MEMBER) ((size_t) & (((TYPE*) 0)->MEMBER))
50#endif
51
52/* Convert between addresses in bytes and sizes in octets.
53 For currently supported targets, octets_per_byte is always a power
54 of two, so we can use shifts. */
55#define TO_ADDR(X) ((X) >> opb_shift)
56#define TO_SIZE(X) ((X) << opb_shift)
57
58/* Local variables. */
59static struct obstack stat_obstack;
60static struct obstack map_obstack;
61
62#define obstack_chunk_alloc xmalloc
63#define obstack_chunk_free free
64static const char *entry_symbol_default = "start";
65static bfd_boolean placed_commons = FALSE;
66static bfd_boolean map_head_is_link_order = FALSE;
67static lang_output_section_statement_type *default_common_section;
68static bfd_boolean map_option_f;
69static bfd_vma print_dot;
70static lang_input_statement_type *first_file;
71static const char *current_target;
72static lang_statement_list_type statement_list;
73static lang_statement_list_type *stat_save[10];
74static lang_statement_list_type **stat_save_ptr = &stat_save[0];
75static struct unique_sections *unique_section_list;
76static struct asneeded_minfo *asneeded_list_head;
77static unsigned int opb_shift = 0;
78
79/* Forward declarations. */
80static void exp_init_os (etree_type *);
81static lang_input_statement_type *lookup_name (const char *);
82static void insert_undefined (const char *);
83static bfd_boolean sort_def_symbol (struct bfd_link_hash_entry *, void *);
84static void print_statement (lang_statement_union_type *,
85 lang_output_section_statement_type *);
86static void print_statement_list (lang_statement_union_type *,
87 lang_output_section_statement_type *);
88static void print_statements (void);
89static void print_input_section (asection *, bfd_boolean);
90static bfd_boolean lang_one_common (struct bfd_link_hash_entry *, void *);
91static void lang_record_phdrs (void);
92static void lang_do_version_exports_section (void);
93static void lang_finalize_version_expr_head
94 (struct bfd_elf_version_expr_head *);
95static void lang_do_memory_regions (void);
96
97/* Exported variables. */
98const char *output_target;
99lang_output_section_statement_type *abs_output_section;
100lang_statement_list_type lang_output_section_statement;
101lang_statement_list_type *stat_ptr = &statement_list;
102lang_statement_list_type file_chain = { NULL, NULL };
103lang_statement_list_type input_file_chain;
104struct bfd_sym_chain entry_symbol = { NULL, NULL };
105const char *entry_section = ".text";
106struct lang_input_statement_flags input_flags;
107bfd_boolean entry_from_cmdline;
108bfd_boolean undef_from_cmdline;
109bfd_boolean lang_has_input_file = FALSE;
110bfd_boolean had_output_filename = FALSE;
111bfd_boolean lang_float_flag = FALSE;
112bfd_boolean delete_output_file_on_failure = FALSE;
113struct lang_phdr *lang_phdr_list;
114struct lang_nocrossrefs *nocrossref_list;
115struct asneeded_minfo **asneeded_list_tail;
116
117 /* Functions that traverse the linker script and might evaluate
118 DEFINED() need to increment this at the start of the traversal. */
119int lang_statement_iteration = 0;
120
121/* Return TRUE if the PATTERN argument is a wildcard pattern.
122 Although backslashes are treated specially if a pattern contains
123 wildcards, we do not consider the mere presence of a backslash to
124 be enough to cause the pattern to be treated as a wildcard.
125 That lets us handle DOS filenames more naturally. */
126#define wildcardp(pattern) (strpbrk ((pattern), "?*[") != NULL)
127
128#define new_stat(x, y) \
129 (x##_type *) new_statement (x##_enum, sizeof (x##_type), y)
130
131#define outside_section_address(q) \
132 ((q)->output_offset + (q)->output_section->vma)
133
134#define outside_symbol_address(q) \
135 ((q)->value + outside_section_address (q->section))
136
137#define SECTION_NAME_MAP_LENGTH (16)
138
139void *
140stat_alloc (size_t size)
141{
142 return obstack_alloc (&stat_obstack, size);
143}
144
145static int
146name_match (const char *pattern, const char *name)
147{
148 if (wildcardp (pattern))
149 return fnmatch (pattern, name, 0);
150 return strcmp (pattern, name);
151}
152
153/* If PATTERN is of the form archive:file, return a pointer to the
154 separator. If not, return NULL. */
155
156static char *
157archive_path (const char *pattern)
158{
159 char *p = NULL;
160
161 if (link_info.path_separator == 0)
162 return p;
163
164 p = strchr (pattern, link_info.path_separator);
165#ifdef HAVE_DOS_BASED_FILE_SYSTEM
166 if (p == NULL || link_info.path_separator != ':')
167 return p;
168
169 /* Assume a match on the second char is part of drive specifier,
170 as in "c:\silly.dos". */
171 if (p == pattern + 1 && ISALPHA (*pattern))
172 p = strchr (p + 1, link_info.path_separator);
173#endif
174 return p;
175}
176
177/* Given that FILE_SPEC results in a non-NULL SEP result from archive_path,
178 return whether F matches FILE_SPEC. */
179
180static bfd_boolean
181input_statement_is_archive_path (const char *file_spec, char *sep,
182 lang_input_statement_type *f)
183{
184 bfd_boolean match = FALSE;
185
186 if ((*(sep + 1) == 0
187 || name_match (sep + 1, f->filename) == 0)
188 && ((sep != file_spec)
189 == (f->the_bfd != NULL && f->the_bfd->my_archive != NULL)))
190 {
191 match = TRUE;
192
193 if (sep != file_spec)
194 {
195 const char *aname = f->the_bfd->my_archive->filename;
196 *sep = 0;
197 match = name_match (file_spec, aname) == 0;
198 *sep = link_info.path_separator;
199 }
200 }
201 return match;
202}
203
204static bfd_boolean
205unique_section_p (const asection *sec,
206 const lang_output_section_statement_type *os)
207{
208 struct unique_sections *unam;
209 const char *secnam;
210
211 if (bfd_link_relocatable (&link_info)
212 && sec->owner != NULL
213 && bfd_is_group_section (sec->owner, sec))
214 return !(os != NULL
215 && strcmp (os->name, DISCARD_SECTION_NAME) == 0);
216
217 secnam = sec->name;
218 for (unam = unique_section_list; unam; unam = unam->next)
219 if (name_match (unam->name, secnam) == 0)
220 return TRUE;
221
222 return FALSE;
223}
224
225/* Generic traversal routines for finding matching sections. */
226
227/* Try processing a section against a wildcard. This just calls
228 the callback unless the filename exclusion list is present
229 and excludes the file. It's hardly ever present so this
230 function is very fast. */
231
232static void
233walk_wild_consider_section (lang_wild_statement_type *ptr,
234 lang_input_statement_type *file,
235 asection *s,
236 struct wildcard_list *sec,
237 callback_t callback,
238 void *data)
239{
240 struct name_list *list_tmp;
241
242 /* Don't process sections from files which were excluded. */
243 for (list_tmp = sec->spec.exclude_name_list;
244 list_tmp;
245 list_tmp = list_tmp->next)
246 {
247 char *p = archive_path (list_tmp->name);
248
249 if (p != NULL)
250 {
251 if (input_statement_is_archive_path (list_tmp->name, p, file))
252 return;
253 }
254
255 else if (name_match (list_tmp->name, file->filename) == 0)
256 return;
257
258 /* FIXME: Perhaps remove the following at some stage? Matching
259 unadorned archives like this was never documented and has
260 been superceded by the archive:path syntax. */
261 else if (file->the_bfd != NULL
262 && file->the_bfd->my_archive != NULL
263 && name_match (list_tmp->name,
264 file->the_bfd->my_archive->filename) == 0)
265 return;
266 }
267
268 (*callback) (ptr, sec, s, ptr->section_flag_list, file, data);
269}
270
271/* Lowest common denominator routine that can handle everything correctly,
272 but slowly. */
273
274static void
275walk_wild_section_general (lang_wild_statement_type *ptr,
276 lang_input_statement_type *file,
277 callback_t callback,
278 void *data)
279{
280 asection *s;
281 struct wildcard_list *sec;
282
283 for (s = file->the_bfd->sections; s != NULL; s = s->next)
284 {
285 sec = ptr->section_list;
286 if (sec == NULL)
287 (*callback) (ptr, sec, s, ptr->section_flag_list, file, data);
288
289 while (sec != NULL)
290 {
291 bfd_boolean skip = FALSE;
292
293 if (sec->spec.name != NULL)
294 {
295 const char *sname = bfd_get_section_name (file->the_bfd, s);
296
297 skip = name_match (sec->spec.name, sname) != 0;
298 }
299
300 if (!skip)
301 walk_wild_consider_section (ptr, file, s, sec, callback, data);
302
303 sec = sec->next;
304 }
305 }
306}
307
308/* Routines to find a single section given its name. If there's more
309 than one section with that name, we report that. */
310
311typedef struct
312{
313 asection *found_section;
314 bfd_boolean multiple_sections_found;
315} section_iterator_callback_data;
316
317static bfd_boolean
318section_iterator_callback (bfd *abfd ATTRIBUTE_UNUSED, asection *s, void *data)
319{
320 section_iterator_callback_data *d = (section_iterator_callback_data *) data;
321
322 if (d->found_section != NULL)
323 {
324 d->multiple_sections_found = TRUE;
325 return TRUE;
326 }
327
328 d->found_section = s;
329 return FALSE;
330}
331
332static asection *
333find_section (lang_input_statement_type *file,
334 struct wildcard_list *sec,
335 bfd_boolean *multiple_sections_found)
336{
337 section_iterator_callback_data cb_data = { NULL, FALSE };
338
339 bfd_get_section_by_name_if (file->the_bfd, sec->spec.name,
340 section_iterator_callback, &cb_data);
341 *multiple_sections_found = cb_data.multiple_sections_found;
342 return cb_data.found_section;
343}
344
345/* Code for handling simple wildcards without going through fnmatch,
346 which can be expensive because of charset translations etc. */
347
348/* A simple wild is a literal string followed by a single '*',
349 where the literal part is at least 4 characters long. */
350
351static bfd_boolean
352is_simple_wild (const char *name)
353{
354 size_t len = strcspn (name, "*?[");
355 return len >= 4 && name[len] == '*' && name[len + 1] == '\0';
356}
357
358static bfd_boolean
359match_simple_wild (const char *pattern, const char *name)
360{
361 /* The first four characters of the pattern are guaranteed valid
362 non-wildcard characters. So we can go faster. */
363 if (pattern[0] != name[0] || pattern[1] != name[1]
364 || pattern[2] != name[2] || pattern[3] != name[3])
365 return FALSE;
366
367 pattern += 4;
368 name += 4;
369 while (*pattern != '*')
370 if (*name++ != *pattern++)
371 return FALSE;
372
373 return TRUE;
374}
375
376/* Return the numerical value of the init_priority attribute from
377 section name NAME. */
378
379static unsigned long
380get_init_priority (const char *name)
381{
382 char *end;
383 unsigned long init_priority;
384
385 /* GCC uses the following section names for the init_priority
386 attribute with numerical values 101 and 65535 inclusive. A
387 lower value means a higher priority.
388
389 1: .init_array.NNNN/.fini_array.NNNN: Where NNNN is the
390 decimal numerical value of the init_priority attribute.
391 The order of execution in .init_array is forward and
392 .fini_array is backward.
393 2: .ctors.NNNN/.dtors.NNNN: Where NNNN is 65535 minus the
394 decimal numerical value of the init_priority attribute.
395 The order of execution in .ctors is backward and .dtors
396 is forward.
397 */
398 if (strncmp (name, ".init_array.", 12) == 0
399 || strncmp (name, ".fini_array.", 12) == 0)
400 {
401 init_priority = strtoul (name + 12, &end, 10);
402 return *end ? 0 : init_priority;
403 }
404 else if (strncmp (name, ".ctors.", 7) == 0
405 || strncmp (name, ".dtors.", 7) == 0)
406 {
407 init_priority = strtoul (name + 7, &end, 10);
408 return *end ? 0 : 65535 - init_priority;
409 }
410
411 return 0;
412}
413
414/* Compare sections ASEC and BSEC according to SORT. */
415
416static int
417compare_section (sort_type sort, asection *asec, asection *bsec)
418{
419 int ret;
420 unsigned long ainit_priority, binit_priority;
421
422 switch (sort)
423 {
424 default:
425 abort ();
426
427 case by_init_priority:
428 ainit_priority
429 = get_init_priority (bfd_get_section_name (asec->owner, asec));
430 binit_priority
431 = get_init_priority (bfd_get_section_name (bsec->owner, bsec));
432 if (ainit_priority == 0 || binit_priority == 0)
433 goto sort_by_name;
434 ret = ainit_priority - binit_priority;
435 if (ret)
436 break;
437 else
438 goto sort_by_name;
439
440 case by_alignment_name:
441 ret = (bfd_section_alignment (bsec->owner, bsec)
442 - bfd_section_alignment (asec->owner, asec));
443 if (ret)
444 break;
445 /* Fall through. */
446
447 case by_name:
448sort_by_name:
449 ret = strcmp (bfd_get_section_name (asec->owner, asec),
450 bfd_get_section_name (bsec->owner, bsec));
451 break;
452
453 case by_name_alignment:
454 ret = strcmp (bfd_get_section_name (asec->owner, asec),
455 bfd_get_section_name (bsec->owner, bsec));
456 if (ret)
457 break;
458 /* Fall through. */
459
460 case by_alignment:
461 ret = (bfd_section_alignment (bsec->owner, bsec)
462 - bfd_section_alignment (asec->owner, asec));
463 break;
464 }
465
466 return ret;
467}
468
469/* Build a Binary Search Tree to sort sections, unlike insertion sort
470 used in wild_sort(). BST is considerably faster if the number of
471 of sections are large. */
472
473static lang_section_bst_type **
474wild_sort_fast (lang_wild_statement_type *wild,
475 struct wildcard_list *sec,
476 lang_input_statement_type *file ATTRIBUTE_UNUSED,
477 asection *section)
478{
479 lang_section_bst_type **tree;
480
481 tree = &wild->tree;
482 if (!wild->filenames_sorted
483 && (sec == NULL || sec->spec.sorted == none))
484 {
485 /* Append at the right end of tree. */
486 while (*tree)
487 tree = &((*tree)->right);
488 return tree;
489 }
490
491 while (*tree)
492 {
493 /* Find the correct node to append this section. */
494 if (compare_section (sec->spec.sorted, section, (*tree)->section) < 0)
495 tree = &((*tree)->left);
496 else
497 tree = &((*tree)->right);
498 }
499
500 return tree;
501}
502
503/* Use wild_sort_fast to build a BST to sort sections. */
504
505static void
506output_section_callback_fast (lang_wild_statement_type *ptr,
507 struct wildcard_list *sec,
508 asection *section,
509 struct flag_info *sflag_list ATTRIBUTE_UNUSED,
510 lang_input_statement_type *file,
511 void *output)
512{
513 lang_section_bst_type *node;
514 lang_section_bst_type **tree;
515 lang_output_section_statement_type *os;
516
517 os = (lang_output_section_statement_type *) output;
518
519 if (unique_section_p (section, os))
520 return;
521
522 node = (lang_section_bst_type *) xmalloc (sizeof (lang_section_bst_type));
523 node->left = 0;
524 node->right = 0;
525 node->section = section;
526
527 tree = wild_sort_fast (ptr, sec, file, section);
528 if (tree != NULL)
529 *tree = node;
530}
531
532/* Convert a sorted sections' BST back to list form. */
533
534static void
535output_section_callback_tree_to_list (lang_wild_statement_type *ptr,
536 lang_section_bst_type *tree,
537 void *output)
538{
539 if (tree->left)
540 output_section_callback_tree_to_list (ptr, tree->left, output);
541
542 lang_add_section (&ptr->children, tree->section, NULL,
543 (lang_output_section_statement_type *) output);
544
545 if (tree->right)
546 output_section_callback_tree_to_list (ptr, tree->right, output);
547
548 free (tree);
549}
550
551/* Specialized, optimized routines for handling different kinds of
552 wildcards */
553
554static void
555walk_wild_section_specs1_wild0 (lang_wild_statement_type *ptr,
556 lang_input_statement_type *file,
557 callback_t callback,
558 void *data)
559{
560 /* We can just do a hash lookup for the section with the right name.
561 But if that lookup discovers more than one section with the name
562 (should be rare), we fall back to the general algorithm because
563 we would otherwise have to sort the sections to make sure they
564 get processed in the bfd's order. */
565 bfd_boolean multiple_sections_found;
566 struct wildcard_list *sec0 = ptr->handler_data[0];
567 asection *s0 = find_section (file, sec0, &multiple_sections_found);
568
569 if (multiple_sections_found)
570 walk_wild_section_general (ptr, file, callback, data);
571 else if (s0)
572 walk_wild_consider_section (ptr, file, s0, sec0, callback, data);
573}
574
575static void
576walk_wild_section_specs1_wild1 (lang_wild_statement_type *ptr,
577 lang_input_statement_type *file,
578 callback_t callback,
579 void *data)
580{
581 asection *s;
582 struct wildcard_list *wildsec0 = ptr->handler_data[0];
583
584 for (s = file->the_bfd->sections; s != NULL; s = s->next)
585 {
586 const char *sname = bfd_get_section_name (file->the_bfd, s);
587 bfd_boolean skip = !match_simple_wild (wildsec0->spec.name, sname);
588
589 if (!skip)
590 walk_wild_consider_section (ptr, file, s, wildsec0, callback, data);
591 }
592}
593
594static void
595walk_wild_section_specs2_wild1 (lang_wild_statement_type *ptr,
596 lang_input_statement_type *file,
597 callback_t callback,
598 void *data)
599{
600 asection *s;
601 struct wildcard_list *sec0 = ptr->handler_data[0];
602 struct wildcard_list *wildsec1 = ptr->handler_data[1];
603 bfd_boolean multiple_sections_found;
604 asection *s0 = find_section (file, sec0, &multiple_sections_found);
605
606 if (multiple_sections_found)
607 {
608 walk_wild_section_general (ptr, file, callback, data);
609 return;
610 }
611
612 /* Note that if the section was not found, s0 is NULL and
613 we'll simply never succeed the s == s0 test below. */
614 for (s = file->the_bfd->sections; s != NULL; s = s->next)
615 {
616 /* Recall that in this code path, a section cannot satisfy more
617 than one spec, so if s == s0 then it cannot match
618 wildspec1. */
619 if (s == s0)
620 walk_wild_consider_section (ptr, file, s, sec0, callback, data);
621 else
622 {
623 const char *sname = bfd_get_section_name (file->the_bfd, s);
624 bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname);
625
626 if (!skip)
627 walk_wild_consider_section (ptr, file, s, wildsec1, callback,
628 data);
629 }
630 }
631}
632
633static void
634walk_wild_section_specs3_wild2 (lang_wild_statement_type *ptr,
635 lang_input_statement_type *file,
636 callback_t callback,
637 void *data)
638{
639 asection *s;
640 struct wildcard_list *sec0 = ptr->handler_data[0];
641 struct wildcard_list *wildsec1 = ptr->handler_data[1];
642 struct wildcard_list *wildsec2 = ptr->handler_data[2];
643 bfd_boolean multiple_sections_found;
644 asection *s0 = find_section (file, sec0, &multiple_sections_found);
645
646 if (multiple_sections_found)
647 {
648 walk_wild_section_general (ptr, file, callback, data);
649 return;
650 }
651
652 for (s = file->the_bfd->sections; s != NULL; s = s->next)
653 {
654 if (s == s0)
655 walk_wild_consider_section (ptr, file, s, sec0, callback, data);
656 else
657 {
658 const char *sname = bfd_get_section_name (file->the_bfd, s);
659 bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname);
660
661 if (!skip)
662 walk_wild_consider_section (ptr, file, s, wildsec1, callback, data);
663 else
664 {
665 skip = !match_simple_wild (wildsec2->spec.name, sname);
666 if (!skip)
667 walk_wild_consider_section (ptr, file, s, wildsec2, callback,
668 data);
669 }
670 }
671 }
672}
673
674static void
675walk_wild_section_specs4_wild2 (lang_wild_statement_type *ptr,
676 lang_input_statement_type *file,
677 callback_t callback,
678 void *data)
679{
680 asection *s;
681 struct wildcard_list *sec0 = ptr->handler_data[0];
682 struct wildcard_list *sec1 = ptr->handler_data[1];
683 struct wildcard_list *wildsec2 = ptr->handler_data[2];
684 struct wildcard_list *wildsec3 = ptr->handler_data[3];
685 bfd_boolean multiple_sections_found;
686 asection *s0 = find_section (file, sec0, &multiple_sections_found), *s1;
687
688 if (multiple_sections_found)
689 {
690 walk_wild_section_general (ptr, file, callback, data);
691 return;
692 }
693
694 s1 = find_section (file, sec1, &multiple_sections_found);
695 if (multiple_sections_found)
696 {
697 walk_wild_section_general (ptr, file, callback, data);
698 return;
699 }
700
701 for (s = file->the_bfd->sections; s != NULL; s = s->next)
702 {
703 if (s == s0)
704 walk_wild_consider_section (ptr, file, s, sec0, callback, data);
705 else
706 if (s == s1)
707 walk_wild_consider_section (ptr, file, s, sec1, callback, data);
708 else
709 {
710 const char *sname = bfd_get_section_name (file->the_bfd, s);
711 bfd_boolean skip = !match_simple_wild (wildsec2->spec.name,
712 sname);
713
714 if (!skip)
715 walk_wild_consider_section (ptr, file, s, wildsec2, callback,
716 data);
717 else
718 {
719 skip = !match_simple_wild (wildsec3->spec.name, sname);
720 if (!skip)
721 walk_wild_consider_section (ptr, file, s, wildsec3,
722 callback, data);
723 }
724 }
725 }
726}
727
728static void
729walk_wild_section (lang_wild_statement_type *ptr,
730 lang_input_statement_type *file,
731 callback_t callback,
732 void *data)
733{
734 if (file->flags.just_syms)
735 return;
736
737 (*ptr->walk_wild_section_handler) (ptr, file, callback, data);
738}
739
740/* Returns TRUE when name1 is a wildcard spec that might match
741 something name2 can match. We're conservative: we return FALSE
742 only if the prefixes of name1 and name2 are different up to the
743 first wildcard character. */
744
745static bfd_boolean
746wild_spec_can_overlap (const char *name1, const char *name2)
747{
748 size_t prefix1_len = strcspn (name1, "?*[");
749 size_t prefix2_len = strcspn (name2, "?*[");
750 size_t min_prefix_len;
751
752 /* Note that if there is no wildcard character, then we treat the
753 terminating 0 as part of the prefix. Thus ".text" won't match
754 ".text." or ".text.*", for example. */
755 if (name1[prefix1_len] == '\0')
756 prefix1_len++;
757 if (name2[prefix2_len] == '\0')
758 prefix2_len++;
759
760 min_prefix_len = prefix1_len < prefix2_len ? prefix1_len : prefix2_len;
761
762 return memcmp (name1, name2, min_prefix_len) == 0;
763}
764
765/* Select specialized code to handle various kinds of wildcard
766 statements. */
767
768static void
769analyze_walk_wild_section_handler (lang_wild_statement_type *ptr)
770{
771 int sec_count = 0;
772 int wild_name_count = 0;
773 struct wildcard_list *sec;
774 int signature;
775 int data_counter;
776
777 ptr->walk_wild_section_handler = walk_wild_section_general;
778 ptr->handler_data[0] = NULL;
779 ptr->handler_data[1] = NULL;
780 ptr->handler_data[2] = NULL;
781 ptr->handler_data[3] = NULL;
782 ptr->tree = NULL;
783
784 /* Count how many wildcard_specs there are, and how many of those
785 actually use wildcards in the name. Also, bail out if any of the
786 wildcard names are NULL. (Can this actually happen?
787 walk_wild_section used to test for it.) And bail out if any
788 of the wildcards are more complex than a simple string
789 ending in a single '*'. */
790 for (sec = ptr->section_list; sec != NULL; sec = sec->next)
791 {
792 ++sec_count;
793 if (sec->spec.name == NULL)
794 return;
795 if (wildcardp (sec->spec.name))
796 {
797 ++wild_name_count;
798 if (!is_simple_wild (sec->spec.name))
799 return;
800 }
801 }
802
803 /* The zero-spec case would be easy to optimize but it doesn't
804 happen in practice. Likewise, more than 4 specs doesn't
805 happen in practice. */
806 if (sec_count == 0 || sec_count > 4)
807 return;
808
809 /* Check that no two specs can match the same section. */
810 for (sec = ptr->section_list; sec != NULL; sec = sec->next)
811 {
812 struct wildcard_list *sec2;
813 for (sec2 = sec->next; sec2 != NULL; sec2 = sec2->next)
814 {
815 if (wild_spec_can_overlap (sec->spec.name, sec2->spec.name))
816 return;
817 }
818 }
819
820 signature = (sec_count << 8) + wild_name_count;
821 switch (signature)
822 {
823 case 0x0100:
824 ptr->walk_wild_section_handler = walk_wild_section_specs1_wild0;
825 break;
826 case 0x0101:
827 ptr->walk_wild_section_handler = walk_wild_section_specs1_wild1;
828 break;
829 case 0x0201:
830 ptr->walk_wild_section_handler = walk_wild_section_specs2_wild1;
831 break;
832 case 0x0302:
833 ptr->walk_wild_section_handler = walk_wild_section_specs3_wild2;
834 break;
835 case 0x0402:
836 ptr->walk_wild_section_handler = walk_wild_section_specs4_wild2;
837 break;
838 default:
839 return;
840 }
841
842 /* Now fill the data array with pointers to the specs, first the
843 specs with non-wildcard names, then the specs with wildcard
844 names. It's OK to process the specs in different order from the
845 given order, because we've already determined that no section
846 will match more than one spec. */
847 data_counter = 0;
848 for (sec = ptr->section_list; sec != NULL; sec = sec->next)
849 if (!wildcardp (sec->spec.name))
850 ptr->handler_data[data_counter++] = sec;
851 for (sec = ptr->section_list; sec != NULL; sec = sec->next)
852 if (wildcardp (sec->spec.name))
853 ptr->handler_data[data_counter++] = sec;
854}
855
856/* Handle a wild statement for a single file F. */
857
858static void
859walk_wild_file (lang_wild_statement_type *s,
860 lang_input_statement_type *f,
861 callback_t callback,
862 void *data)
863{
864 if (f->the_bfd == NULL
865 || !bfd_check_format (f->the_bfd, bfd_archive))
866 walk_wild_section (s, f, callback, data);
867 else
868 {
869 bfd *member;
870
871 /* This is an archive file. We must map each member of the
872 archive separately. */
873 member = bfd_openr_next_archived_file (f->the_bfd, NULL);
874 while (member != NULL)
875 {
876 /* When lookup_name is called, it will call the add_symbols
877 entry point for the archive. For each element of the
878 archive which is included, BFD will call ldlang_add_file,
879 which will set the usrdata field of the member to the
880 lang_input_statement. */
881 if (member->usrdata != NULL)
882 {
883 walk_wild_section (s,
884 (lang_input_statement_type *) member->usrdata,
885 callback, data);
886 }
887
888 member = bfd_openr_next_archived_file (f->the_bfd, member);
889 }
890 }
891}
892
893static void
894walk_wild (lang_wild_statement_type *s, callback_t callback, void *data)
895{
896 const char *file_spec = s->filename;
897 char *p;
898
899 if (file_spec == NULL)
900 {
901 /* Perform the iteration over all files in the list. */
902 LANG_FOR_EACH_INPUT_STATEMENT (f)
903 {
904 walk_wild_file (s, f, callback, data);
905 }
906 }
907 else if ((p = archive_path (file_spec)) != NULL)
908 {
909 LANG_FOR_EACH_INPUT_STATEMENT (f)
910 {
911 if (input_statement_is_archive_path (file_spec, p, f))
912 walk_wild_file (s, f, callback, data);
913 }
914 }
915 else if (wildcardp (file_spec))
916 {
917 LANG_FOR_EACH_INPUT_STATEMENT (f)
918 {
919 if (fnmatch (file_spec, f->filename, 0) == 0)
920 walk_wild_file (s, f, callback, data);
921 }
922 }
923 else
924 {
925 lang_input_statement_type *f;
926
927 /* Perform the iteration over a single file. */
928 f = lookup_name (file_spec);
929 if (f)
930 walk_wild_file (s, f, callback, data);
931 }
932}
933
934/* lang_for_each_statement walks the parse tree and calls the provided
935 function for each node, except those inside output section statements
936 with constraint set to -1. */
937
938void
939lang_for_each_statement_worker (void (*func) (lang_statement_union_type *),
940 lang_statement_union_type *s)
941{
942 for (; s != NULL; s = s->header.next)
943 {
944 func (s);
945
946 switch (s->header.type)
947 {
948 case lang_constructors_statement_enum:
949 lang_for_each_statement_worker (func, constructor_list.head);
950 break;
951 case lang_output_section_statement_enum:
952 if (s->output_section_statement.constraint != -1)
953 lang_for_each_statement_worker
954 (func, s->output_section_statement.children.head);
955 break;
956 case lang_wild_statement_enum:
957 lang_for_each_statement_worker (func,
958 s->wild_statement.children.head);
959 break;
960 case lang_group_statement_enum:
961 lang_for_each_statement_worker (func,
962 s->group_statement.children.head);
963 break;
964 case lang_data_statement_enum:
965 case lang_reloc_statement_enum:
966 case lang_object_symbols_statement_enum:
967 case lang_output_statement_enum:
968 case lang_target_statement_enum:
969 case lang_input_section_enum:
970 case lang_input_statement_enum:
971 case lang_assignment_statement_enum:
972 case lang_padding_statement_enum:
973 case lang_address_statement_enum:
974 case lang_fill_statement_enum:
975 case lang_insert_statement_enum:
976 break;
977 default:
978 FAIL ();
979 break;
980 }
981 }
982}
983
984void
985lang_for_each_statement (void (*func) (lang_statement_union_type *))
986{
987 lang_for_each_statement_worker (func, statement_list.head);
988}
989
990/*----------------------------------------------------------------------*/
991
992void
993lang_list_init (lang_statement_list_type *list)
994{
995 list->head = NULL;
996 list->tail = &list->head;
997}
998
999void
1000push_stat_ptr (lang_statement_list_type *new_ptr)
1001{
1002 if (stat_save_ptr >= stat_save + sizeof (stat_save) / sizeof (stat_save[0]))
1003 abort ();
1004 *stat_save_ptr++ = stat_ptr;
1005 stat_ptr = new_ptr;
1006}
1007
1008void
1009pop_stat_ptr (void)
1010{
1011 if (stat_save_ptr <= stat_save)
1012 abort ();
1013 stat_ptr = *--stat_save_ptr;
1014}
1015
1016/* Build a new statement node for the parse tree. */
1017
1018static lang_statement_union_type *
1019new_statement (enum statement_enum type,
1020 size_t size,
1021 lang_statement_list_type *list)
1022{
1023 lang_statement_union_type *new_stmt;
1024
1025 new_stmt = (lang_statement_union_type *) stat_alloc (size);
1026 new_stmt->header.type = type;
1027 new_stmt->header.next = NULL;
1028 lang_statement_append (list, new_stmt, &new_stmt->header.next);
1029 return new_stmt;
1030}
1031
1032/* Build a new input file node for the language. There are several
1033 ways in which we treat an input file, eg, we only look at symbols,
1034 or prefix it with a -l etc.
1035
1036 We can be supplied with requests for input files more than once;
1037 they may, for example be split over several lines like foo.o(.text)
1038 foo.o(.data) etc, so when asked for a file we check that we haven't
1039 got it already so we don't duplicate the bfd. */
1040
1041static lang_input_statement_type *
1042new_afile (const char *name,
1043 lang_input_file_enum_type file_type,
1044 const char *target,
1045 bfd_boolean add_to_list)
1046{
1047 lang_input_statement_type *p;
1048
1049 lang_has_input_file = TRUE;
1050
1051 if (add_to_list)
1052 p = (lang_input_statement_type *) new_stat (lang_input_statement, stat_ptr);
1053 else
1054 {
1055 p = (lang_input_statement_type *)
1056 stat_alloc (sizeof (lang_input_statement_type));
1057 p->header.type = lang_input_statement_enum;
1058 p->header.next = NULL;
1059 }
1060
1061 memset (&p->the_bfd, 0,
1062 sizeof (*p) - offsetof (lang_input_statement_type, the_bfd));
1063 p->target = target;
1064 p->flags.dynamic = input_flags.dynamic;
1065 p->flags.add_DT_NEEDED_for_dynamic = input_flags.add_DT_NEEDED_for_dynamic;
1066 p->flags.add_DT_NEEDED_for_regular = input_flags.add_DT_NEEDED_for_regular;
1067 p->flags.whole_archive = input_flags.whole_archive;
1068 p->flags.sysrooted = input_flags.sysrooted;
1069
1070 switch (file_type)
1071 {
1072 case lang_input_file_is_symbols_only_enum:
1073 p->filename = name;
1074 p->local_sym_name = name;
1075 p->flags.real = TRUE;
1076 p->flags.just_syms = TRUE;
1077 break;
1078 case lang_input_file_is_fake_enum:
1079 p->filename = name;
1080 p->local_sym_name = name;
1081 break;
1082 case lang_input_file_is_l_enum:
1083 if (name[0] == ':' && name[1] != '\0')
1084 {
1085 p->filename = name + 1;
1086 p->flags.full_name_provided = TRUE;
1087 }
1088 else
1089 p->filename = name;
1090 p->local_sym_name = concat ("-l", name, (const char *) NULL);
1091 p->flags.maybe_archive = TRUE;
1092 p->flags.real = TRUE;
1093 p->flags.search_dirs = TRUE;
1094 break;
1095 case lang_input_file_is_marker_enum:
1096 p->filename = name;
1097 p->local_sym_name = name;
1098 p->flags.search_dirs = TRUE;
1099 break;
1100 case lang_input_file_is_search_file_enum:
1101 p->filename = name;
1102 p->local_sym_name = name;
1103 p->flags.real = TRUE;
1104 p->flags.search_dirs = TRUE;
1105 break;
1106 case lang_input_file_is_file_enum:
1107 p->filename = name;
1108 p->local_sym_name = name;
1109 p->flags.real = TRUE;
1110 break;
1111 default:
1112 FAIL ();
1113 }
1114
1115 lang_statement_append (&input_file_chain,
1116 (lang_statement_union_type *) p,
1117 &p->next_real_file);
1118 return p;
1119}
1120
1121lang_input_statement_type *
1122lang_add_input_file (const char *name,
1123 lang_input_file_enum_type file_type,
1124 const char *target)
1125{
1126 if (name != NULL && *name == '=')
1127 {
1128 lang_input_statement_type *ret;
1129 char *sysrooted_name
1130 = concat (ld_sysroot, name + 1, (const char *) NULL);
1131
1132 /* We've now forcibly prepended the sysroot, making the input
1133 file independent of the context. Therefore, temporarily
1134 force a non-sysrooted context for this statement, so it won't
1135 get the sysroot prepended again when opened. (N.B. if it's a
1136 script, any child nodes with input files starting with "/"
1137 will be handled as "sysrooted" as they'll be found to be
1138 within the sysroot subdirectory.) */
1139 unsigned int outer_sysrooted = input_flags.sysrooted;
1140 input_flags.sysrooted = 0;
1141 ret = new_afile (sysrooted_name, file_type, target, TRUE);
1142 input_flags.sysrooted = outer_sysrooted;
1143 return ret;
1144 }
1145
1146 return new_afile (name, file_type, target, TRUE);
1147}
1148
1149struct out_section_hash_entry
1150{
1151 struct bfd_hash_entry root;
1152 lang_statement_union_type s;
1153};
1154
1155/* The hash table. */
1156
1157static struct bfd_hash_table output_section_statement_table;
1158
1159/* Support routines for the hash table used by lang_output_section_find,
1160 initialize the table, fill in an entry and remove the table. */
1161
1162static struct bfd_hash_entry *
1163output_section_statement_newfunc (struct bfd_hash_entry *entry,
1164 struct bfd_hash_table *table,
1165 const char *string)
1166{
1167 lang_output_section_statement_type **nextp;
1168 struct out_section_hash_entry *ret;
1169
1170 if (entry == NULL)
1171 {
1172 entry = (struct bfd_hash_entry *) bfd_hash_allocate (table,
1173 sizeof (*ret));
1174 if (entry == NULL)
1175 return entry;
1176 }
1177
1178 entry = bfd_hash_newfunc (entry, table, string);
1179 if (entry == NULL)
1180 return entry;
1181
1182 ret = (struct out_section_hash_entry *) entry;
1183 memset (&ret->s, 0, sizeof (ret->s));
1184 ret->s.header.type = lang_output_section_statement_enum;
1185 ret->s.output_section_statement.subsection_alignment = -1;
1186 ret->s.output_section_statement.section_alignment = -1;
1187 ret->s.output_section_statement.block_value = 1;
1188 lang_list_init (&ret->s.output_section_statement.children);
1189 lang_statement_append (stat_ptr, &ret->s, &ret->s.header.next);
1190
1191 /* For every output section statement added to the list, except the
1192 first one, lang_output_section_statement.tail points to the "next"
1193 field of the last element of the list. */
1194 if (lang_output_section_statement.head != NULL)
1195 ret->s.output_section_statement.prev
1196 = ((lang_output_section_statement_type *)
1197 ((char *) lang_output_section_statement.tail
1198 - offsetof (lang_output_section_statement_type, next)));
1199
1200 /* GCC's strict aliasing rules prevent us from just casting the
1201 address, so we store the pointer in a variable and cast that
1202 instead. */
1203 nextp = &ret->s.output_section_statement.next;
1204 lang_statement_append (&lang_output_section_statement,
1205 &ret->s,
1206 (lang_statement_union_type **) nextp);
1207 return &ret->root;
1208}
1209
1210static void
1211output_section_statement_table_init (void)
1212{
1213 if (!bfd_hash_table_init_n (&output_section_statement_table,
1214 output_section_statement_newfunc,
1215 sizeof (struct out_section_hash_entry),
1216 61))
1217 einfo (_("%P%F: can not create hash table: %E\n"));
1218}
1219
1220static void
1221output_section_statement_table_free (void)
1222{
1223 bfd_hash_table_free (&output_section_statement_table);
1224}
1225
1226/* Build enough state so that the parser can build its tree. */
1227
1228void
1229lang_init (void)
1230{
1231 obstack_begin (&stat_obstack, 1000);
1232
1233 stat_ptr = &statement_list;
1234
1235 output_section_statement_table_init ();
1236
1237 lang_list_init (stat_ptr);
1238
1239 lang_list_init (&input_file_chain);
1240 lang_list_init (&lang_output_section_statement);
1241 lang_list_init (&file_chain);
1242 first_file = lang_add_input_file (NULL, lang_input_file_is_marker_enum,
1243 NULL);
1244 abs_output_section =
1245 lang_output_section_statement_lookup (BFD_ABS_SECTION_NAME, 0, TRUE);
1246
1247 abs_output_section->bfd_section = bfd_abs_section_ptr;
1248
1249 asneeded_list_head = NULL;
1250 asneeded_list_tail = &asneeded_list_head;
1251}
1252
1253void
1254lang_finish (void)
1255{
1256 output_section_statement_table_free ();
1257}
1258
1259/*----------------------------------------------------------------------
1260 A region is an area of memory declared with the
1261 MEMORY { name:org=exp, len=exp ... }
1262 syntax.
1263
1264 We maintain a list of all the regions here.
1265
1266 If no regions are specified in the script, then the default is used
1267 which is created when looked up to be the entire data space.
1268
1269 If create is true we are creating a region inside a MEMORY block.
1270 In this case it is probably an error to create a region that has
1271 already been created. If we are not inside a MEMORY block it is
1272 dubious to use an undeclared region name (except DEFAULT_MEMORY_REGION)
1273 and so we issue a warning.
1274
1275 Each region has at least one name. The first name is either
1276 DEFAULT_MEMORY_REGION or the name given in the MEMORY block. You can add
1277 alias names to an existing region within a script with
1278 REGION_ALIAS (alias, region_name). Each name corresponds to at most one
1279 region. */
1280
1281static lang_memory_region_type *lang_memory_region_list;
1282static lang_memory_region_type **lang_memory_region_list_tail
1283 = &lang_memory_region_list;
1284
1285lang_memory_region_type *
1286lang_memory_region_lookup (const char *const name, bfd_boolean create)
1287{
1288 lang_memory_region_name *n;
1289 lang_memory_region_type *r;
1290 lang_memory_region_type *new_region;
1291
1292 /* NAME is NULL for LMA memspecs if no region was specified. */
1293 if (name == NULL)
1294 return NULL;
1295
1296 for (r = lang_memory_region_list; r != NULL; r = r->next)
1297 for (n = &r->name_list; n != NULL; n = n->next)
1298 if (strcmp (n->name, name) == 0)
1299 {
1300 if (create)
1301 einfo (_("%P:%S: warning: redeclaration of memory region `%s'\n"),
1302 NULL, name);
1303 return r;
1304 }
1305
1306 if (!create && strcmp (name, DEFAULT_MEMORY_REGION))
1307 einfo (_("%P:%S: warning: memory region `%s' not declared\n"),
1308 NULL, name);
1309
1310 new_region = (lang_memory_region_type *)
1311 stat_alloc (sizeof (lang_memory_region_type));
1312
1313 new_region->name_list.name = xstrdup (name);
1314 new_region->name_list.next = NULL;
1315 new_region->next = NULL;
1316 new_region->origin_exp = NULL;
1317 new_region->origin = 0;
1318 new_region->length_exp = NULL;
1319 new_region->length = ~(bfd_size_type) 0;
1320 new_region->current = 0;
1321 new_region->last_os = NULL;
1322 new_region->flags = 0;
1323 new_region->not_flags = 0;
1324 new_region->had_full_message = FALSE;
1325
1326 *lang_memory_region_list_tail = new_region;
1327 lang_memory_region_list_tail = &new_region->next;
1328
1329 return new_region;
1330}
1331
1332void
1333lang_memory_region_alias (const char *alias, const char *region_name)
1334{
1335 lang_memory_region_name *n;
1336 lang_memory_region_type *r;
1337 lang_memory_region_type *region;
1338
1339 /* The default region must be unique. This ensures that it is not necessary
1340 to iterate through the name list if someone wants the check if a region is
1341 the default memory region. */
1342 if (strcmp (region_name, DEFAULT_MEMORY_REGION) == 0
1343 || strcmp (alias, DEFAULT_MEMORY_REGION) == 0)
1344 einfo (_("%F%P:%S: error: alias for default memory region\n"), NULL);
1345
1346 /* Look for the target region and check if the alias is not already
1347 in use. */
1348 region = NULL;
1349 for (r = lang_memory_region_list; r != NULL; r = r->next)
1350 for (n = &r->name_list; n != NULL; n = n->next)
1351 {
1352 if (region == NULL && strcmp (n->name, region_name) == 0)
1353 region = r;
1354 if (strcmp (n->name, alias) == 0)
1355 einfo (_("%F%P:%S: error: redefinition of memory region "
1356 "alias `%s'\n"),
1357 NULL, alias);
1358 }
1359
1360 /* Check if the target region exists. */
1361 if (region == NULL)
1362 einfo (_("%F%P:%S: error: memory region `%s' "
1363 "for alias `%s' does not exist\n"),
1364 NULL, region_name, alias);
1365
1366 /* Add alias to region name list. */
1367 n = (lang_memory_region_name *) stat_alloc (sizeof (lang_memory_region_name));
1368 n->name = xstrdup (alias);
1369 n->next = region->name_list.next;
1370 region->name_list.next = n;
1371}
1372
1373static lang_memory_region_type *
1374lang_memory_default (asection *section)
1375{
1376 lang_memory_region_type *p;
1377
1378 flagword sec_flags = section->flags;
1379
1380 /* Override SEC_DATA to mean a writable section. */
1381 if ((sec_flags & (SEC_ALLOC | SEC_READONLY | SEC_CODE)) == SEC_ALLOC)
1382 sec_flags |= SEC_DATA;
1383
1384 for (p = lang_memory_region_list; p != NULL; p = p->next)
1385 {
1386 if ((p->flags & sec_flags) != 0
1387 && (p->not_flags & sec_flags) == 0)
1388 {
1389 return p;
1390 }
1391 }
1392 return lang_memory_region_lookup (DEFAULT_MEMORY_REGION, FALSE);
1393}
1394
1395/* Get the output section statement directly from the userdata. */
1396
1397lang_output_section_statement_type *
1398lang_output_section_get (const asection *output_section)
1399{
1400 return get_userdata (output_section);
1401}
1402
1403/* Find or create an output_section_statement with the given NAME.
1404 If CONSTRAINT is non-zero match one with that constraint, otherwise
1405 match any non-negative constraint. If CREATE, always make a
1406 new output_section_statement for SPECIAL CONSTRAINT. */
1407
1408lang_output_section_statement_type *
1409lang_output_section_statement_lookup (const char *name,
1410 int constraint,
1411 bfd_boolean create)
1412{
1413 struct out_section_hash_entry *entry;
1414
1415 entry = ((struct out_section_hash_entry *)
1416 bfd_hash_lookup (&output_section_statement_table, name,
1417 create, FALSE));
1418 if (entry == NULL)
1419 {
1420 if (create)
1421 einfo (_("%P%F: failed creating section `%s': %E\n"), name);
1422 return NULL;
1423 }
1424
1425 if (entry->s.output_section_statement.name != NULL)
1426 {
1427 /* We have a section of this name, but it might not have the correct
1428 constraint. */
1429 struct out_section_hash_entry *last_ent;
1430
1431 name = entry->s.output_section_statement.name;
1432 if (create && constraint == SPECIAL)
1433 /* Not traversing to the end reverses the order of the second
1434 and subsequent SPECIAL sections in the hash table chain,
1435 but that shouldn't matter. */
1436 last_ent = entry;
1437 else
1438 do
1439 {
1440 if (constraint == entry->s.output_section_statement.constraint
1441 || (constraint == 0
1442 && entry->s.output_section_statement.constraint >= 0))
1443 return &entry->s.output_section_statement;
1444 last_ent = entry;
1445 entry = (struct out_section_hash_entry *) entry->root.next;
1446 }
1447 while (entry != NULL
1448 && name == entry->s.output_section_statement.name);
1449
1450 if (!create)
1451 return NULL;
1452
1453 entry
1454 = ((struct out_section_hash_entry *)
1455 output_section_statement_newfunc (NULL,
1456 &output_section_statement_table,
1457 name));
1458 if (entry == NULL)
1459 {
1460 einfo (_("%P%F: failed creating section `%s': %E\n"), name);
1461 return NULL;
1462 }
1463 entry->root = last_ent->root;
1464 last_ent->root.next = &entry->root;
1465 }
1466
1467 entry->s.output_section_statement.name = name;
1468 entry->s.output_section_statement.constraint = constraint;
1469 return &entry->s.output_section_statement;
1470}
1471
1472/* Find the next output_section_statement with the same name as OS.
1473 If CONSTRAINT is non-zero, find one with that constraint otherwise
1474 match any non-negative constraint. */
1475
1476lang_output_section_statement_type *
1477next_matching_output_section_statement (lang_output_section_statement_type *os,
1478 int constraint)
1479{
1480 /* All output_section_statements are actually part of a
1481 struct out_section_hash_entry. */
1482 struct out_section_hash_entry *entry = (struct out_section_hash_entry *)
1483 ((char *) os
1484 - offsetof (struct out_section_hash_entry, s.output_section_statement));
1485 const char *name = os->name;
1486
1487 ASSERT (name == entry->root.string);
1488 do
1489 {
1490 entry = (struct out_section_hash_entry *) entry->root.next;
1491 if (entry == NULL
1492 || name != entry->s.output_section_statement.name)
1493 return NULL;
1494 }
1495 while (constraint != entry->s.output_section_statement.constraint
1496 && (constraint != 0
1497 || entry->s.output_section_statement.constraint < 0));
1498
1499 return &entry->s.output_section_statement;
1500}
1501
1502/* A variant of lang_output_section_find used by place_orphan.
1503 Returns the output statement that should precede a new output
1504 statement for SEC. If an exact match is found on certain flags,
1505 sets *EXACT too. */
1506
1507lang_output_section_statement_type *
1508lang_output_section_find_by_flags (const asection *sec,
1509 flagword sec_flags,
1510 lang_output_section_statement_type **exact,
1511 lang_match_sec_type_func match_type)
1512{
1513 lang_output_section_statement_type *first, *look, *found;
1514 flagword look_flags, differ;
1515
1516 /* We know the first statement on this list is *ABS*. May as well
1517 skip it. */
1518 first = &lang_output_section_statement.head->output_section_statement;
1519 first = first->next;
1520
1521 /* First try for an exact match. */
1522 found = NULL;
1523 for (look = first; look; look = look->next)
1524 {
1525 look_flags = look->flags;
1526 if (look->bfd_section != NULL)
1527 {
1528 look_flags = look->bfd_section->flags;
1529 if (match_type && !match_type (link_info.output_bfd,
1530 look->bfd_section,
1531 sec->owner, sec))
1532 continue;
1533 }
1534 differ = look_flags ^ sec_flags;
1535 if (!(differ & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY
1536 | SEC_CODE | SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
1537 found = look;
1538 }
1539 if (found != NULL)
1540 {
1541 if (exact != NULL)
1542 *exact = found;
1543 return found;
1544 }
1545
1546 if ((sec_flags & SEC_CODE) != 0
1547 && (sec_flags & SEC_ALLOC) != 0)
1548 {
1549 /* Try for a rw code section. */
1550 for (look = first; look; look = look->next)
1551 {
1552 look_flags = look->flags;
1553 if (look->bfd_section != NULL)
1554 {
1555 look_flags = look->bfd_section->flags;
1556 if (match_type && !match_type (link_info.output_bfd,
1557 look->bfd_section,
1558 sec->owner, sec))
1559 continue;
1560 }
1561 differ = look_flags ^ sec_flags;
1562 if (!(differ & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
1563 | SEC_CODE | SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
1564 found = look;
1565 }
1566 }
1567 else if ((sec_flags & SEC_READONLY) != 0
1568 && (sec_flags & SEC_ALLOC) != 0)
1569 {
1570 /* .rodata can go after .text, .sdata2 after .rodata. */
1571 for (look = first; look; look = look->next)
1572 {
1573 look_flags = look->flags;
1574 if (look->bfd_section != NULL)
1575 {
1576 look_flags = look->bfd_section->flags;
1577 if (match_type && !match_type (link_info.output_bfd,
1578 look->bfd_section,
1579 sec->owner, sec))
1580 continue;
1581 }
1582 differ = look_flags ^ sec_flags;
1583 if (!(differ & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
1584 | SEC_READONLY | SEC_SMALL_DATA))
1585 || (!(differ & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
1586 | SEC_READONLY))
1587 && !(look_flags & SEC_SMALL_DATA)))
1588 found = look;
1589 }
1590 }
1591 else if ((sec_flags & SEC_THREAD_LOCAL) != 0
1592 && (sec_flags & SEC_ALLOC) != 0)
1593 {
1594 /* .tdata can go after .data, .tbss after .tdata. Treat .tbss
1595 as if it were a loaded section, and don't use match_type. */
1596 bfd_boolean seen_thread_local = FALSE;
1597
1598 match_type = NULL;
1599 for (look = first; look; look = look->next)
1600 {
1601 look_flags = look->flags;
1602 if (look->bfd_section != NULL)
1603 look_flags = look->bfd_section->flags;
1604
1605 differ = look_flags ^ (sec_flags | SEC_LOAD | SEC_HAS_CONTENTS);
1606 if (!(differ & (SEC_THREAD_LOCAL | SEC_ALLOC)))
1607 {
1608 /* .tdata and .tbss must be adjacent and in that order. */
1609 if (!(look_flags & SEC_LOAD)
1610 && (sec_flags & SEC_LOAD))
1611 /* ..so if we're at a .tbss section and we're placing
1612 a .tdata section stop looking and return the
1613 previous section. */
1614 break;
1615 found = look;
1616 seen_thread_local = TRUE;
1617 }
1618 else if (seen_thread_local)
1619 break;
1620 else if (!(differ & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD)))
1621 found = look;
1622 }
1623 }
1624 else if ((sec_flags & SEC_SMALL_DATA) != 0
1625 && (sec_flags & SEC_ALLOC) != 0)
1626 {
1627 /* .sdata goes after .data, .sbss after .sdata. */
1628 for (look = first; look; look = look->next)
1629 {
1630 look_flags = look->flags;
1631 if (look->bfd_section != NULL)
1632 {
1633 look_flags = look->bfd_section->flags;
1634 if (match_type && !match_type (link_info.output_bfd,
1635 look->bfd_section,
1636 sec->owner, sec))
1637 continue;
1638 }
1639 differ = look_flags ^ sec_flags;
1640 if (!(differ & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
1641 | SEC_THREAD_LOCAL))
1642 || ((look_flags & SEC_SMALL_DATA)
1643 && !(sec_flags & SEC_HAS_CONTENTS)))
1644 found = look;
1645 }
1646 }
1647 else if ((sec_flags & SEC_HAS_CONTENTS) != 0
1648 && (sec_flags & SEC_ALLOC) != 0)
1649 {
1650 /* .data goes after .rodata. */
1651 for (look = first; look; look = look->next)
1652 {
1653 look_flags = look->flags;
1654 if (look->bfd_section != NULL)
1655 {
1656 look_flags = look->bfd_section->flags;
1657 if (match_type && !match_type (link_info.output_bfd,
1658 look->bfd_section,
1659 sec->owner, sec))
1660 continue;
1661 }
1662 differ = look_flags ^ sec_flags;
1663 if (!(differ & (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
1664 | SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
1665 found = look;
1666 }
1667 }
1668 else if ((sec_flags & SEC_ALLOC) != 0)
1669 {
1670 /* .bss goes after any other alloc section. */
1671 for (look = first; look; look = look->next)
1672 {
1673 look_flags = look->flags;
1674 if (look->bfd_section != NULL)
1675 {
1676 look_flags = look->bfd_section->flags;
1677 if (match_type && !match_type (link_info.output_bfd,
1678 look->bfd_section,
1679 sec->owner, sec))
1680 continue;
1681 }
1682 differ = look_flags ^ sec_flags;
1683 if (!(differ & SEC_ALLOC))
1684 found = look;
1685 }
1686 }
1687 else
1688 {
1689 /* non-alloc go last. */
1690 for (look = first; look; look = look->next)
1691 {
1692 look_flags = look->flags;
1693 if (look->bfd_section != NULL)
1694 look_flags = look->bfd_section->flags;
1695 differ = look_flags ^ sec_flags;
1696 if (!(differ & SEC_DEBUGGING))
1697 found = look;
1698 }
1699 return found;
1700 }
1701
1702 if (found || !match_type)
1703 return found;
1704
1705 return lang_output_section_find_by_flags (sec, sec_flags, NULL, NULL);
1706}
1707
1708/* Find the last output section before given output statement.
1709 Used by place_orphan. */
1710
1711static asection *
1712output_prev_sec_find (lang_output_section_statement_type *os)
1713{
1714 lang_output_section_statement_type *lookup;
1715
1716 for (lookup = os->prev; lookup != NULL; lookup = lookup->prev)
1717 {
1718 if (lookup->constraint < 0)
1719 continue;
1720
1721 if (lookup->bfd_section != NULL && lookup->bfd_section->owner != NULL)
1722 return lookup->bfd_section;
1723 }
1724
1725 return NULL;
1726}
1727
1728/* Look for a suitable place for a new output section statement. The
1729 idea is to skip over anything that might be inside a SECTIONS {}
1730 statement in a script, before we find another output section
1731 statement. Assignments to "dot" before an output section statement
1732 are assumed to belong to it, except in two cases; The first
1733 assignment to dot, and assignments before non-alloc sections.
1734 Otherwise we might put an orphan before . = . + SIZEOF_HEADERS or
1735 similar assignments that set the initial address, or we might
1736 insert non-alloc note sections among assignments setting end of
1737 image symbols. */
1738
1739static lang_statement_union_type **
1740insert_os_after (lang_output_section_statement_type *after)
1741{
1742 lang_statement_union_type **where;
1743 lang_statement_union_type **assign = NULL;
1744 bfd_boolean ignore_first;
1745
1746 ignore_first
1747 = after == &lang_output_section_statement.head->output_section_statement;
1748
1749 for (where = &after->header.next;
1750 *where != NULL;
1751 where = &(*where)->header.next)
1752 {
1753 switch ((*where)->header.type)
1754 {
1755 case lang_assignment_statement_enum:
1756 if (assign == NULL)
1757 {
1758 lang_assignment_statement_type *ass;
1759
1760 ass = &(*where)->assignment_statement;
1761 if (ass->exp->type.node_class != etree_assert
1762 && ass->exp->assign.dst[0] == '.'
1763 && ass->exp->assign.dst[1] == 0
1764 && !ignore_first)
1765 assign = where;
1766 }
1767 ignore_first = FALSE;
1768 continue;
1769 case lang_wild_statement_enum:
1770 case lang_input_section_enum:
1771 case lang_object_symbols_statement_enum:
1772 case lang_fill_statement_enum:
1773 case lang_data_statement_enum:
1774 case lang_reloc_statement_enum:
1775 case lang_padding_statement_enum:
1776 case lang_constructors_statement_enum:
1777 assign = NULL;
1778 continue;
1779 case lang_output_section_statement_enum:
1780 if (assign != NULL)
1781 {
1782 asection *s = (*where)->output_section_statement.bfd_section;
1783
1784 if (s == NULL
1785 || s->map_head.s == NULL
1786 || (s->flags & SEC_ALLOC) != 0)
1787 where = assign;
1788 }
1789 break;
1790 case lang_input_statement_enum:
1791 case lang_address_statement_enum:
1792 case lang_target_statement_enum:
1793 case lang_output_statement_enum:
1794 case lang_group_statement_enum:
1795 case lang_insert_statement_enum:
1796 continue;
1797 }
1798 break;
1799 }
1800
1801 return where;
1802}
1803
1804lang_output_section_statement_type *
1805lang_insert_orphan (asection *s,
1806 const char *secname,
1807 int constraint,
1808 lang_output_section_statement_type *after,
1809 struct orphan_save *place,
1810 etree_type *address,
1811 lang_statement_list_type *add_child)
1812{
1813 lang_statement_list_type add;
1814 const char *ps;
1815 lang_assignment_statement_type *start_assign;
1816 lang_output_section_statement_type *os;
1817 lang_output_section_statement_type **os_tail;
1818
1819 /* If we have found an appropriate place for the output section
1820 statements for this orphan, add them to our own private list,
1821 inserting them later into the global statement list. */
1822 if (after != NULL)
1823 {
1824 lang_list_init (&add);
1825 push_stat_ptr (&add);
1826 }
1827
1828 if (bfd_link_relocatable (&link_info)
1829 || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0)
1830 address = exp_intop (0);
1831
1832 os_tail = ((lang_output_section_statement_type **)
1833 lang_output_section_statement.tail);
1834 os = lang_enter_output_section_statement (secname, address, normal_section,
1835 NULL, NULL, NULL, constraint, 0);
1836
1837 ps = NULL;
1838 start_assign = NULL;
1839 if (config.build_constructors && *os_tail == os)
1840 {
1841 /* If the name of the section is representable in C, then create
1842 symbols to mark the start and the end of the section. */
1843 for (ps = secname; *ps != '\0'; ps++)
1844 if (!ISALNUM ((unsigned char) *ps) && *ps != '_')
1845 break;
1846 if (*ps == '\0')
1847 {
1848 char *symname;
1849
1850 symname = (char *) xmalloc (ps - secname + sizeof "__start_" + 1);
1851 symname[0] = bfd_get_symbol_leading_char (link_info.output_bfd);
1852 sprintf (symname + (symname[0] != 0), "__start_%s", secname);
1853 start_assign
1854 = lang_add_assignment (exp_provide (symname,
1855 exp_nameop (NAME, "."),
1856 FALSE));
1857 }
1858 }
1859
1860 if (add_child == NULL)
1861 add_child = &os->children;
1862 lang_add_section (add_child, s, NULL, os);
1863
1864 if (after && (s->flags & (SEC_LOAD | SEC_ALLOC)) != 0)
1865 {
1866 const char *region = (after->region
1867 ? after->region->name_list.name
1868 : DEFAULT_MEMORY_REGION);
1869 const char *lma_region = (after->lma_region
1870 ? after->lma_region->name_list.name
1871 : NULL);
1872 lang_leave_output_section_statement (NULL, region, after->phdrs,
1873 lma_region);
1874 }
1875 else
1876 lang_leave_output_section_statement (NULL, DEFAULT_MEMORY_REGION, NULL,
1877 NULL);
1878
1879 if (start_assign != NULL)
1880 {
1881 char *symname;
1882 lang_assignment_statement_type *stop_assign;
1883 bfd_vma dot;
1884
1885 symname = (char *) xmalloc (ps - secname + sizeof "__stop_" + 1);
1886 symname[0] = bfd_get_symbol_leading_char (link_info.output_bfd);
1887 sprintf (symname + (symname[0] != 0), "__stop_%s", secname);
1888 stop_assign
1889 = lang_add_assignment (exp_provide (symname,
1890 exp_nameop (NAME, "."),
1891 FALSE));
1892 /* Evaluate the expression to define the symbol if referenced,
1893 before sizing dynamic sections. */
1894 dot = os->bfd_section->vma;
1895 exp_fold_tree (start_assign->exp, os->bfd_section, &dot);
1896 dot += TO_ADDR (s->size);
1897 exp_fold_tree (stop_assign->exp, os->bfd_section, &dot);
1898 }
1899
1900 /* Restore the global list pointer. */
1901 if (after != NULL)
1902 pop_stat_ptr ();
1903
1904 if (after != NULL && os->bfd_section != NULL)
1905 {
1906 asection *snew, *as;
1907
1908 snew = os->bfd_section;
1909
1910 /* Shuffle the bfd section list to make the output file look
1911 neater. This is really only cosmetic. */
1912 if (place->section == NULL
1913 && after != (&lang_output_section_statement.head
1914 ->output_section_statement))
1915 {
1916 asection *bfd_section = after->bfd_section;
1917
1918 /* If the output statement hasn't been used to place any input
1919 sections (and thus doesn't have an output bfd_section),
1920 look for the closest prior output statement having an
1921 output section. */
1922 if (bfd_section == NULL)
1923 bfd_section = output_prev_sec_find (after);
1924
1925 if (bfd_section != NULL && bfd_section != snew)
1926 place->section = &bfd_section->next;
1927 }
1928
1929 if (place->section == NULL)
1930 place->section = &link_info.output_bfd->sections;
1931
1932 as = *place->section;
1933
1934 if (!as)
1935 {
1936 /* Put the section at the end of the list. */
1937
1938 /* Unlink the section. */
1939 bfd_section_list_remove (link_info.output_bfd, snew);
1940
1941 /* Now tack it back on in the right place. */
1942 bfd_section_list_append (link_info.output_bfd, snew);
1943 }
1944 else if (as != snew && as->prev != snew)
1945 {
1946 /* Unlink the section. */
1947 bfd_section_list_remove (link_info.output_bfd, snew);
1948
1949 /* Now tack it back on in the right place. */
1950 bfd_section_list_insert_before (link_info.output_bfd, as, snew);
1951 }
1952
1953 /* Save the end of this list. Further ophans of this type will
1954 follow the one we've just added. */
1955 place->section = &snew->next;
1956
1957 /* The following is non-cosmetic. We try to put the output
1958 statements in some sort of reasonable order here, because they
1959 determine the final load addresses of the orphan sections.
1960 In addition, placing output statements in the wrong order may
1961 require extra segments. For instance, given a typical
1962 situation of all read-only sections placed in one segment and
1963 following that a segment containing all the read-write
1964 sections, we wouldn't want to place an orphan read/write
1965 section before or amongst the read-only ones. */
1966 if (add.head != NULL)
1967 {
1968 lang_output_section_statement_type *newly_added_os;
1969
1970 if (place->stmt == NULL)
1971 {
1972 lang_statement_union_type **where = insert_os_after (after);
1973
1974 *add.tail = *where;
1975 *where = add.head;
1976
1977 place->os_tail = &after->next;
1978 }
1979 else
1980 {
1981 /* Put it after the last orphan statement we added. */
1982 *add.tail = *place->stmt;
1983 *place->stmt = add.head;
1984 }
1985
1986 /* Fix the global list pointer if we happened to tack our
1987 new list at the tail. */
1988 if (*stat_ptr->tail == add.head)
1989 stat_ptr->tail = add.tail;
1990
1991 /* Save the end of this list. */
1992 place->stmt = add.tail;
1993
1994 /* Do the same for the list of output section statements. */
1995 newly_added_os = *os_tail;
1996 *os_tail = NULL;
1997 newly_added_os->prev = (lang_output_section_statement_type *)
1998 ((char *) place->os_tail
1999 - offsetof (lang_output_section_statement_type, next));
2000 newly_added_os->next = *place->os_tail;
2001 if (newly_added_os->next != NULL)
2002 newly_added_os->next->prev = newly_added_os;
2003 *place->os_tail = newly_added_os;
2004 place->os_tail = &newly_added_os->next;
2005
2006 /* Fixing the global list pointer here is a little different.
2007 We added to the list in lang_enter_output_section_statement,
2008 trimmed off the new output_section_statment above when
2009 assigning *os_tail = NULL, but possibly added it back in
2010 the same place when assigning *place->os_tail. */
2011 if (*os_tail == NULL)
2012 lang_output_section_statement.tail
2013 = (lang_statement_union_type **) os_tail;
2014 }
2015 }
2016 return os;
2017}
2018
2019static void
2020lang_print_asneeded (void)
2021{
2022 struct asneeded_minfo *m;
2023 char buf[100];
2024
2025 if (asneeded_list_head == NULL)
2026 return;
2027
2028 sprintf (buf, _("\nAs-needed library included "
2029 "to satisfy reference by file (symbol)\n\n"));
2030 minfo ("%s", buf);
2031
2032 for (m = asneeded_list_head; m != NULL; m = m->next)
2033 {
2034 size_t len;
2035
2036 minfo ("%s", m->soname);
2037 len = strlen (m->soname);
2038
2039 if (len >= 29)
2040 {
2041 print_nl ();
2042 len = 0;
2043 }
2044 while (len < 30)
2045 {
2046 print_space ();
2047 ++len;
2048 }
2049
2050 if (m->ref != NULL)
2051 minfo ("%B ", m->ref);
2052 minfo ("(%T)\n", m->name);
2053 }
2054}
2055
2056static void
2057lang_map_flags (flagword flag)
2058{
2059 if (flag & SEC_ALLOC)
2060 minfo ("a");
2061
2062 if (flag & SEC_CODE)
2063 minfo ("x");
2064
2065 if (flag & SEC_READONLY)
2066 minfo ("r");
2067
2068 if (flag & SEC_DATA)
2069 minfo ("w");
2070
2071 if (flag & SEC_LOAD)
2072 minfo ("l");
2073}
2074
2075void
2076lang_map (void)
2077{
2078 lang_memory_region_type *m;
2079 bfd_boolean dis_header_printed = FALSE;
2080
2081 LANG_FOR_EACH_INPUT_STATEMENT (file)
2082 {
2083 asection *s;
2084
2085 if ((file->the_bfd->flags & (BFD_LINKER_CREATED | DYNAMIC)) != 0
2086 || file->flags.just_syms)
2087 continue;
2088
2089 for (s = file->the_bfd->sections; s != NULL; s = s->next)
2090 if ((s->output_section == NULL
2091 || s->output_section->owner != link_info.output_bfd)
2092 && (s->flags & (SEC_LINKER_CREATED | SEC_KEEP)) == 0)
2093 {
2094 if (!dis_header_printed)
2095 {
2096 fprintf (config.map_file, _("\nDiscarded input sections\n\n"));
2097 dis_header_printed = TRUE;
2098 }
2099
2100 print_input_section (s, TRUE);
2101 }
2102 }
2103
2104 minfo (_("\nMemory Configuration\n\n"));
2105 fprintf (config.map_file, "%-16s %-18s %-18s %s\n",
2106 _("Name"), _("Origin"), _("Length"), _("Attributes"));
2107
2108 for (m = lang_memory_region_list; m != NULL; m = m->next)
2109 {
2110 char buf[100];
2111 int len;
2112
2113 fprintf (config.map_file, "%-16s ", m->name_list.name);
2114
2115 sprintf_vma (buf, m->origin);
2116 minfo ("0x%s ", buf);
2117 len = strlen (buf);
2118 while (len < 16)
2119 {
2120 print_space ();
2121 ++len;
2122 }
2123
2124 minfo ("0x%V", m->length);
2125 if (m->flags || m->not_flags)
2126 {
2127#ifndef BFD64
2128 minfo (" ");
2129#endif
2130 if (m->flags)
2131 {
2132 print_space ();
2133 lang_map_flags (m->flags);
2134 }
2135
2136 if (m->not_flags)
2137 {
2138 minfo (" !");
2139 lang_map_flags (m->not_flags);
2140 }
2141 }
2142
2143 print_nl ();
2144 }
2145
2146 fprintf (config.map_file, _("\nLinker script and memory map\n\n"));
2147
2148 if (!link_info.reduce_memory_overheads)
2149 {
2150 obstack_begin (&map_obstack, 1000);
2151 bfd_link_hash_traverse (link_info.hash, sort_def_symbol, 0);
2152 }
2153 lang_statement_iteration++;
2154 print_statements ();
2155
2156 ldemul_extra_map_file_text (link_info.output_bfd, &link_info,
2157 config.map_file);
2158}
2159
2160static bfd_boolean
2161sort_def_symbol (struct bfd_link_hash_entry *hash_entry,
2162 void *info ATTRIBUTE_UNUSED)
2163{
2164 if ((hash_entry->type == bfd_link_hash_defined
2165 || hash_entry->type == bfd_link_hash_defweak)
2166 && hash_entry->u.def.section->owner != link_info.output_bfd
2167 && hash_entry->u.def.section->owner != NULL)
2168 {
2169 input_section_userdata_type *ud;
2170 struct map_symbol_def *def;
2171
2172 ud = ((input_section_userdata_type *)
2173 get_userdata (hash_entry->u.def.section));
2174 if (!ud)
2175 {
2176 ud = (input_section_userdata_type *) stat_alloc (sizeof (*ud));
2177 get_userdata (hash_entry->u.def.section) = ud;
2178 ud->map_symbol_def_tail = &ud->map_symbol_def_head;
2179 ud->map_symbol_def_count = 0;
2180 }
2181 else if (!ud->map_symbol_def_tail)
2182 ud->map_symbol_def_tail = &ud->map_symbol_def_head;
2183
2184 def = (struct map_symbol_def *) obstack_alloc (&map_obstack, sizeof *def);
2185 def->entry = hash_entry;
2186 *(ud->map_symbol_def_tail) = def;
2187 ud->map_symbol_def_tail = &def->next;
2188 ud->map_symbol_def_count++;
2189 }
2190 return TRUE;
2191}
2192
2193/* Initialize an output section. */
2194
2195static void
2196init_os (lang_output_section_statement_type *s, flagword flags)
2197{
2198 if (strcmp (s->name, DISCARD_SECTION_NAME) == 0)
2199 einfo (_("%P%F: Illegal use of `%s' section\n"), DISCARD_SECTION_NAME);
2200
2201 if (s->constraint != SPECIAL)
2202 s->bfd_section = bfd_get_section_by_name (link_info.output_bfd, s->name);
2203 if (s->bfd_section == NULL)
2204 s->bfd_section = bfd_make_section_anyway_with_flags (link_info.output_bfd,
2205 s->name, flags);
2206 if (s->bfd_section == NULL)
2207 {
2208 einfo (_("%P%F: output format %s cannot represent section"
2209 " called %s: %E\n"),
2210 link_info.output_bfd->xvec->name, s->name);
2211 }
2212 s->bfd_section->output_section = s->bfd_section;
2213 s->bfd_section->output_offset = 0;
2214
2215 /* Set the userdata of the output section to the output section
2216 statement to avoid lookup. */
2217 get_userdata (s->bfd_section) = s;
2218
2219 /* If there is a base address, make sure that any sections it might
2220 mention are initialized. */
2221 if (s->addr_tree != NULL)
2222 exp_init_os (s->addr_tree);
2223
2224 if (s->load_base != NULL)
2225 exp_init_os (s->load_base);
2226
2227 /* If supplied an alignment, set it. */
2228 if (s->section_alignment != -1)
2229 s->bfd_section->alignment_power = s->section_alignment;
2230}
2231
2232/* Make sure that all output sections mentioned in an expression are
2233 initialized. */
2234
2235static void
2236exp_init_os (etree_type *exp)
2237{
2238 switch (exp->type.node_class)
2239 {
2240 case etree_assign:
2241 case etree_provide:
2242 exp_init_os (exp->assign.src);
2243 break;
2244
2245 case etree_binary:
2246 exp_init_os (exp->binary.lhs);
2247 exp_init_os (exp->binary.rhs);
2248 break;
2249
2250 case etree_trinary:
2251 exp_init_os (exp->trinary.cond);
2252 exp_init_os (exp->trinary.lhs);
2253 exp_init_os (exp->trinary.rhs);
2254 break;
2255
2256 case etree_assert:
2257 exp_init_os (exp->assert_s.child);
2258 break;
2259
2260 case etree_unary:
2261 exp_init_os (exp->unary.child);
2262 break;
2263
2264 case etree_name:
2265 switch (exp->type.node_code)
2266 {
2267 case ADDR:
2268 case LOADADDR:
2269 case SIZEOF:
2270 {
2271 lang_output_section_statement_type *os;
2272
2273 os = lang_output_section_find (exp->name.name);
2274 if (os != NULL && os->bfd_section == NULL)
2275 init_os (os, 0);
2276 }
2277 }
2278 break;
2279
2280 default:
2281 break;
2282 }
2283}
2284
2285
2286static void
2287section_already_linked (bfd *abfd, asection *sec, void *data)
2288{
2289 lang_input_statement_type *entry = (lang_input_statement_type *) data;
2290
2291 /* If we are only reading symbols from this object, then we want to
2292 discard all sections. */
2293 if (entry->flags.just_syms)
2294 {
2295 bfd_link_just_syms (abfd, sec, &link_info);
2296 return;
2297 }
2298
2299 if (!(abfd->flags & DYNAMIC))
2300 bfd_section_already_linked (abfd, sec, &link_info);
2301}
2302
2303
2304/* The wild routines.
2305
2306 These expand statements like *(.text) and foo.o to a list of
2307 explicit actions, like foo.o(.text), bar.o(.text) and
2308 foo.o(.text, .data). */
2309
2310/* Add SECTION to the output section OUTPUT. Do this by creating a
2311 lang_input_section statement which is placed at PTR. */
2312
2313void
2314lang_add_section (lang_statement_list_type *ptr,
2315 asection *section,
2316 struct flag_info *sflag_info,
2317 lang_output_section_statement_type *output)
2318{
2319 flagword flags = section->flags;
2320
2321 bfd_boolean discard;
2322 lang_input_section_type *new_section;
2323 bfd *abfd = link_info.output_bfd;
2324
2325 /* Discard sections marked with SEC_EXCLUDE. */
2326 discard = (flags & SEC_EXCLUDE) != 0;
2327
2328 /* Discard input sections which are assigned to a section named
2329 DISCARD_SECTION_NAME. */
2330 if (strcmp (output->name, DISCARD_SECTION_NAME) == 0)
2331 discard = TRUE;
2332
2333 /* Discard debugging sections if we are stripping debugging
2334 information. */
2335 if ((link_info.strip == strip_debugger || link_info.strip == strip_all)
2336 && (flags & SEC_DEBUGGING) != 0)
2337 discard = TRUE;
2338
2339 if (discard)
2340 {
2341 if (section->output_section == NULL)
2342 {
2343 /* This prevents future calls from assigning this section. */
2344 section->output_section = bfd_abs_section_ptr;
2345 }
2346 return;
2347 }
2348
2349 if (sflag_info)
2350 {
2351 bfd_boolean keep;
2352
2353 keep = bfd_lookup_section_flags (&link_info, sflag_info, section);
2354 if (!keep)
2355 return;
2356 }
2357
2358 if (section->output_section != NULL)
2359 return;
2360
2361 /* We don't copy the SEC_NEVER_LOAD flag from an input section
2362 to an output section, because we want to be able to include a
2363 SEC_NEVER_LOAD section in the middle of an otherwise loaded
2364 section (I don't know why we want to do this, but we do).
2365 build_link_order in ldwrite.c handles this case by turning
2366 the embedded SEC_NEVER_LOAD section into a fill. */
2367 flags &= ~ SEC_NEVER_LOAD;
2368
2369 /* If final link, don't copy the SEC_LINK_ONCE flags, they've
2370 already been processed. One reason to do this is that on pe
2371 format targets, .text$foo sections go into .text and it's odd
2372 to see .text with SEC_LINK_ONCE set. */
2373
2374 if (!bfd_link_relocatable (&link_info))
2375 flags &= ~(SEC_LINK_ONCE | SEC_LINK_DUPLICATES | SEC_RELOC);
2376
2377 switch (output->sectype)
2378 {
2379 case normal_section:
2380 case overlay_section:
2381 break;
2382 case noalloc_section:
2383 flags &= ~SEC_ALLOC;
2384 break;
2385 case noload_section:
2386 flags &= ~SEC_LOAD;
2387 flags |= SEC_NEVER_LOAD;
2388 /* Unfortunately GNU ld has managed to evolve two different
2389 meanings to NOLOAD in scripts. ELF gets a .bss style noload,
2390 alloc, no contents section. All others get a noload, noalloc
2391 section. */
2392 if (bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour)
2393 flags &= ~SEC_HAS_CONTENTS;
2394 else
2395 flags &= ~SEC_ALLOC;
2396 break;
2397 }
2398
2399 if (output->bfd_section == NULL)
2400 init_os (output, flags);
2401
2402 /* If SEC_READONLY is not set in the input section, then clear
2403 it from the output section. */
2404 output->bfd_section->flags &= flags | ~SEC_READONLY;
2405
2406 if (output->bfd_section->linker_has_input)
2407 {
2408 /* Only set SEC_READONLY flag on the first input section. */
2409 flags &= ~ SEC_READONLY;
2410
2411 /* Keep SEC_MERGE and SEC_STRINGS only if they are the same. */
2412 if ((output->bfd_section->flags & (SEC_MERGE | SEC_STRINGS))
2413 != (flags & (SEC_MERGE | SEC_STRINGS))
2414 || ((flags & SEC_MERGE) != 0
2415 && output->bfd_section->entsize != section->entsize))
2416 {
2417 output->bfd_section->flags &= ~ (SEC_MERGE | SEC_STRINGS);
2418 flags &= ~ (SEC_MERGE | SEC_STRINGS);
2419 }
2420 }
2421 output->bfd_section->flags |= flags;
2422
2423 if (!output->bfd_section->linker_has_input)
2424 {
2425 output->bfd_section->linker_has_input = 1;
2426 /* This must happen after flags have been updated. The output
2427 section may have been created before we saw its first input
2428 section, eg. for a data statement. */
2429 bfd_init_private_section_data (section->owner, section,
2430 link_info.output_bfd,
2431 output->bfd_section,
2432 &link_info);
2433 if ((flags & SEC_MERGE) != 0)
2434 output->bfd_section->entsize = section->entsize;
2435 }
2436
2437 if ((flags & SEC_TIC54X_BLOCK) != 0
2438 && bfd_get_arch (section->owner) == bfd_arch_tic54x)
2439 {
2440 /* FIXME: This value should really be obtained from the bfd... */
2441 output->block_value = 128;
2442 }
2443
2444 if (section->alignment_power > output->bfd_section->alignment_power)
2445 output->bfd_section->alignment_power = section->alignment_power;
2446
2447 section->output_section = output->bfd_section;
2448
2449 if (!map_head_is_link_order)
2450 {
2451 asection *s = output->bfd_section->map_tail.s;
2452 output->bfd_section->map_tail.s = section;
2453 section->map_head.s = NULL;
2454 section->map_tail.s = s;
2455 if (s != NULL)
2456 s->map_head.s = section;
2457 else
2458 output->bfd_section->map_head.s = section;
2459 }
2460
2461 /* Add a section reference to the list. */
2462 new_section = new_stat (lang_input_section, ptr);
2463 new_section->section = section;
2464}
2465
2466/* Handle wildcard sorting. This returns the lang_input_section which
2467 should follow the one we are going to create for SECTION and FILE,
2468 based on the sorting requirements of WILD. It returns NULL if the
2469 new section should just go at the end of the current list. */
2470
2471static lang_statement_union_type *
2472wild_sort (lang_wild_statement_type *wild,
2473 struct wildcard_list *sec,
2474 lang_input_statement_type *file,
2475 asection *section)
2476{
2477 lang_statement_union_type *l;
2478
2479 if (!wild->filenames_sorted
2480 && (sec == NULL || sec->spec.sorted == none))
2481 return NULL;
2482
2483 for (l = wild->children.head; l != NULL; l = l->header.next)
2484 {
2485 lang_input_section_type *ls;
2486
2487 if (l->header.type != lang_input_section_enum)
2488 continue;
2489 ls = &l->input_section;
2490
2491 /* Sorting by filename takes precedence over sorting by section
2492 name. */
2493
2494 if (wild->filenames_sorted)
2495 {
2496 const char *fn, *ln;
2497 bfd_boolean fa, la;
2498 int i;
2499
2500 /* The PE support for the .idata section as generated by
2501 dlltool assumes that files will be sorted by the name of
2502 the archive and then the name of the file within the
2503 archive. */
2504
2505 if (file->the_bfd != NULL
2506 && file->the_bfd->my_archive != NULL)
2507 {
2508 fn = bfd_get_filename (file->the_bfd->my_archive);
2509 fa = TRUE;
2510 }
2511 else
2512 {
2513 fn = file->filename;
2514 fa = FALSE;
2515 }
2516
2517 if (ls->section->owner->my_archive != NULL)
2518 {
2519 ln = bfd_get_filename (ls->section->owner->my_archive);
2520 la = TRUE;
2521 }
2522 else
2523 {
2524 ln = ls->section->owner->filename;
2525 la = FALSE;
2526 }
2527
2528 i = filename_cmp (fn, ln);
2529 if (i > 0)
2530 continue;
2531 else if (i < 0)
2532 break;
2533
2534 if (fa || la)
2535 {
2536 if (fa)
2537 fn = file->filename;
2538 if (la)
2539 ln = ls->section->owner->filename;
2540
2541 i = filename_cmp (fn, ln);
2542 if (i > 0)
2543 continue;
2544 else if (i < 0)
2545 break;
2546 }
2547 }
2548
2549 /* Here either the files are not sorted by name, or we are
2550 looking at the sections for this file. */
2551
2552 if (sec != NULL
2553 && sec->spec.sorted != none
2554 && sec->spec.sorted != by_none)
2555 if (compare_section (sec->spec.sorted, section, ls->section) < 0)
2556 break;
2557 }
2558
2559 return l;
2560}
2561
2562/* Expand a wild statement for a particular FILE. SECTION may be
2563 NULL, in which case it is a wild card. */
2564
2565static void
2566output_section_callback (lang_wild_statement_type *ptr,
2567 struct wildcard_list *sec,
2568 asection *section,
2569 struct flag_info *sflag_info,
2570 lang_input_statement_type *file,
2571 void *output)
2572{
2573 lang_statement_union_type *before;
2574 lang_output_section_statement_type *os;
2575
2576 os = (lang_output_section_statement_type *) output;
2577
2578 /* Exclude sections that match UNIQUE_SECTION_LIST. */
2579 if (unique_section_p (section, os))
2580 return;
2581
2582 before = wild_sort (ptr, sec, file, section);
2583
2584 /* Here BEFORE points to the lang_input_section which
2585 should follow the one we are about to add. If BEFORE
2586 is NULL, then the section should just go at the end
2587 of the current list. */
2588
2589 if (before == NULL)
2590 lang_add_section (&ptr->children, section, sflag_info, os);
2591 else
2592 {
2593 lang_statement_list_type list;
2594 lang_statement_union_type **pp;
2595
2596 lang_list_init (&list);
2597 lang_add_section (&list, section, sflag_info, os);
2598
2599 /* If we are discarding the section, LIST.HEAD will
2600 be NULL. */
2601 if (list.head != NULL)
2602 {
2603 ASSERT (list.head->header.next == NULL);
2604
2605 for (pp = &ptr->children.head;
2606 *pp != before;
2607 pp = &(*pp)->header.next)
2608 ASSERT (*pp != NULL);
2609
2610 list.head->header.next = *pp;
2611 *pp = list.head;
2612 }
2613 }
2614}
2615
2616/* Check if all sections in a wild statement for a particular FILE
2617 are readonly. */
2618
2619static void
2620check_section_callback (lang_wild_statement_type *ptr ATTRIBUTE_UNUSED,
2621 struct wildcard_list *sec ATTRIBUTE_UNUSED,
2622 asection *section,
2623 struct flag_info *sflag_info ATTRIBUTE_UNUSED,
2624 lang_input_statement_type *file ATTRIBUTE_UNUSED,
2625 void *output)
2626{
2627 lang_output_section_statement_type *os;
2628
2629 os = (lang_output_section_statement_type *) output;
2630
2631 /* Exclude sections that match UNIQUE_SECTION_LIST. */
2632 if (unique_section_p (section, os))
2633 return;
2634
2635 if (section->output_section == NULL && (section->flags & SEC_READONLY) == 0)
2636 os->all_input_readonly = FALSE;
2637}
2638
2639/* This is passed a file name which must have been seen already and
2640 added to the statement tree. We will see if it has been opened
2641 already and had its symbols read. If not then we'll read it. */
2642
2643static lang_input_statement_type *
2644lookup_name (const char *name)
2645{
2646 lang_input_statement_type *search;
2647
2648 for (search = (lang_input_statement_type *) input_file_chain.head;
2649 search != NULL;
2650 search = (lang_input_statement_type *) search->next_real_file)
2651 {
2652 /* Use the local_sym_name as the name of the file that has
2653 already been loaded as filename might have been transformed
2654 via the search directory lookup mechanism. */
2655 const char *filename = search->local_sym_name;
2656
2657 if (filename != NULL
2658 && filename_cmp (filename, name) == 0)
2659 break;
2660 }
2661
2662 if (search == NULL)
2663 search = new_afile (name, lang_input_file_is_search_file_enum,
2664 default_target, FALSE);
2665
2666 /* If we have already added this file, or this file is not real
2667 don't add this file. */
2668 if (search->flags.loaded || !search->flags.real)
2669 return search;
2670
2671 if (!load_symbols (search, NULL))
2672 return NULL;
2673
2674 return search;
2675}
2676
2677/* Save LIST as a list of libraries whose symbols should not be exported. */
2678
2679struct excluded_lib
2680{
2681 char *name;
2682 struct excluded_lib *next;
2683};
2684static struct excluded_lib *excluded_libs;
2685
2686void
2687add_excluded_libs (const char *list)
2688{
2689 const char *p = list, *end;
2690
2691 while (*p != '\0')
2692 {
2693 struct excluded_lib *entry;
2694 end = strpbrk (p, ",:");
2695 if (end == NULL)
2696 end = p + strlen (p);
2697 entry = (struct excluded_lib *) xmalloc (sizeof (*entry));
2698 entry->next = excluded_libs;
2699 entry->name = (char *) xmalloc (end - p + 1);
2700 memcpy (entry->name, p, end - p);
2701 entry->name[end - p] = '\0';
2702 excluded_libs = entry;
2703 if (*end == '\0')
2704 break;
2705 p = end + 1;
2706 }
2707}
2708
2709static void
2710check_excluded_libs (bfd *abfd)
2711{
2712 struct excluded_lib *lib = excluded_libs;
2713
2714 while (lib)
2715 {
2716 int len = strlen (lib->name);
2717 const char *filename = lbasename (abfd->filename);
2718
2719 if (strcmp (lib->name, "ALL") == 0)
2720 {
2721 abfd->no_export = TRUE;
2722 return;
2723 }
2724
2725 if (filename_ncmp (lib->name, filename, len) == 0
2726 && (filename[len] == '\0'
2727 || (filename[len] == '.' && filename[len + 1] == 'a'
2728 && filename[len + 2] == '\0')))
2729 {
2730 abfd->no_export = TRUE;
2731 return;
2732 }
2733
2734 lib = lib->next;
2735 }
2736}
2737
2738/* Get the symbols for an input file. */
2739
2740bfd_boolean
2741load_symbols (lang_input_statement_type *entry,
2742 lang_statement_list_type *place)
2743{
2744 char **matching;
2745
2746 if (entry->flags.loaded)
2747 return TRUE;
2748
2749 ldfile_open_file (entry);
2750
2751 /* Do not process further if the file was missing. */
2752 if (entry->flags.missing_file)
2753 return TRUE;
2754
2755 if (!bfd_check_format (entry->the_bfd, bfd_archive)
2756 && !bfd_check_format_matches (entry->the_bfd, bfd_object, &matching))
2757 {
2758 bfd_error_type err;
2759 struct lang_input_statement_flags save_flags;
2760 extern FILE *yyin;
2761
2762 err = bfd_get_error ();
2763
2764 /* See if the emulation has some special knowledge. */
2765 if (ldemul_unrecognized_file (entry))
2766 return TRUE;
2767
2768 if (err == bfd_error_file_ambiguously_recognized)
2769 {
2770 char **p;
2771
2772 einfo (_("%B: file not recognized: %E\n"), entry->the_bfd);
2773 einfo (_("%B: matching formats:"), entry->the_bfd);
2774 for (p = matching; *p != NULL; p++)
2775 einfo (" %s", *p);
2776 einfo ("%F\n");
2777 }
2778 else if (err != bfd_error_file_not_recognized
2779 || place == NULL)
2780 einfo (_("%F%B: file not recognized: %E\n"), entry->the_bfd);
2781
2782 bfd_close (entry->the_bfd);
2783 entry->the_bfd = NULL;
2784
2785 /* Try to interpret the file as a linker script. */
2786 save_flags = input_flags;
2787 ldfile_open_command_file (entry->filename);
2788
2789 push_stat_ptr (place);
2790 input_flags.add_DT_NEEDED_for_regular
2791 = entry->flags.add_DT_NEEDED_for_regular;
2792 input_flags.add_DT_NEEDED_for_dynamic
2793 = entry->flags.add_DT_NEEDED_for_dynamic;
2794 input_flags.whole_archive = entry->flags.whole_archive;
2795 input_flags.dynamic = entry->flags.dynamic;
2796
2797 ldfile_assumed_script = TRUE;
2798 parser_input = input_script;
2799 yyparse ();
2800 ldfile_assumed_script = FALSE;
2801
2802 /* missing_file is sticky. sysrooted will already have been
2803 restored when seeing EOF in yyparse, but no harm to restore
2804 again. */
2805 save_flags.missing_file |= input_flags.missing_file;
2806 input_flags = save_flags;
2807 pop_stat_ptr ();
2808 fclose (yyin);
2809 yyin = NULL;
2810 entry->flags.loaded = TRUE;
2811
2812 return TRUE;
2813 }
2814
2815 if (ldemul_recognized_file (entry))
2816 return TRUE;
2817
2818 /* We don't call ldlang_add_file for an archive. Instead, the
2819 add_symbols entry point will call ldlang_add_file, via the
2820 add_archive_element callback, for each element of the archive
2821 which is used. */
2822 switch (bfd_get_format (entry->the_bfd))
2823 {
2824 default:
2825 break;
2826
2827 case bfd_object:
2828 if (!entry->flags.reload)
2829 ldlang_add_file (entry);
2830 if (trace_files || verbose)
2831 info_msg ("%I\n", entry);
2832 break;
2833
2834 case bfd_archive:
2835 check_excluded_libs (entry->the_bfd);
2836
2837 if (entry->flags.whole_archive)
2838 {
2839 bfd *member = NULL;
2840 bfd_boolean loaded = TRUE;
2841
2842 for (;;)
2843 {
2844 bfd *subsbfd;
2845 member = bfd_openr_next_archived_file (entry->the_bfd, member);
2846
2847 if (member == NULL)
2848 break;
2849
2850 if (!bfd_check_format (member, bfd_object))
2851 {
2852 einfo (_("%F%B: member %B in archive is not an object\n"),
2853 entry->the_bfd, member);
2854 loaded = FALSE;
2855 }
2856
2857 subsbfd = member;
2858 if (!(*link_info.callbacks
2859 ->add_archive_element) (&link_info, member,
2860 "--whole-archive", &subsbfd))
2861 abort ();
2862
2863 /* Potentially, the add_archive_element hook may have set a
2864 substitute BFD for us. */
2865 if (!bfd_link_add_symbols (subsbfd, &link_info))
2866 {
2867 einfo (_("%F%B: error adding symbols: %E\n"), member);
2868 loaded = FALSE;
2869 }
2870 }
2871
2872 entry->flags.loaded = loaded;
2873 return loaded;
2874 }
2875 break;
2876 }
2877
2878 if (bfd_link_add_symbols (entry->the_bfd, &link_info))
2879 entry->flags.loaded = TRUE;
2880 else
2881 einfo (_("%F%B: error adding symbols: %E\n"), entry->the_bfd);
2882
2883 return entry->flags.loaded;
2884}
2885
2886/* Handle a wild statement. S->FILENAME or S->SECTION_LIST or both
2887 may be NULL, indicating that it is a wildcard. Separate
2888 lang_input_section statements are created for each part of the
2889 expansion; they are added after the wild statement S. OUTPUT is
2890 the output section. */
2891
2892static void
2893wild (lang_wild_statement_type *s,
2894 const char *target ATTRIBUTE_UNUSED,
2895 lang_output_section_statement_type *output)
2896{
2897 struct wildcard_list *sec;
2898
2899 if (s->handler_data[0]
2900 && s->handler_data[0]->spec.sorted == by_name
2901 && !s->filenames_sorted)
2902 {
2903 lang_section_bst_type *tree;
2904
2905 walk_wild (s, output_section_callback_fast, output);
2906
2907 tree = s->tree;
2908 if (tree)
2909 {
2910 output_section_callback_tree_to_list (s, tree, output);
2911 s->tree = NULL;
2912 }
2913 }
2914 else
2915 walk_wild (s, output_section_callback, output);
2916
2917 if (default_common_section == NULL)
2918 for (sec = s->section_list; sec != NULL; sec = sec->next)
2919 if (sec->spec.name != NULL && strcmp (sec->spec.name, "COMMON") == 0)
2920 {
2921 /* Remember the section that common is going to in case we
2922 later get something which doesn't know where to put it. */
2923 default_common_section = output;
2924 break;
2925 }
2926}
2927
2928/* Return TRUE iff target is the sought target. */
2929
2930static int
2931get_target (const bfd_target *target, void *data)
2932{
2933 const char *sought = (const char *) data;
2934
2935 return strcmp (target->name, sought) == 0;
2936}
2937
2938/* Like strcpy() but convert to lower case as well. */
2939
2940static void
2941stricpy (char *dest, char *src)
2942{
2943 char c;
2944
2945 while ((c = *src++) != 0)
2946 *dest++ = TOLOWER (c);
2947
2948 *dest = 0;
2949}
2950
2951/* Remove the first occurrence of needle (if any) in haystack
2952 from haystack. */
2953
2954static void
2955strcut (char *haystack, char *needle)
2956{
2957 haystack = strstr (haystack, needle);
2958
2959 if (haystack)
2960 {
2961 char *src;
2962
2963 for (src = haystack + strlen (needle); *src;)
2964 *haystack++ = *src++;
2965
2966 *haystack = 0;
2967 }
2968}
2969
2970/* Compare two target format name strings.
2971 Return a value indicating how "similar" they are. */
2972
2973static int
2974name_compare (char *first, char *second)
2975{
2976 char *copy1;
2977 char *copy2;
2978 int result;
2979
2980 copy1 = (char *) xmalloc (strlen (first) + 1);
2981 copy2 = (char *) xmalloc (strlen (second) + 1);
2982
2983 /* Convert the names to lower case. */
2984 stricpy (copy1, first);
2985 stricpy (copy2, second);
2986
2987 /* Remove size and endian strings from the name. */
2988 strcut (copy1, "big");
2989 strcut (copy1, "little");
2990 strcut (copy2, "big");
2991 strcut (copy2, "little");
2992
2993 /* Return a value based on how many characters match,
2994 starting from the beginning. If both strings are
2995 the same then return 10 * their length. */
2996 for (result = 0; copy1[result] == copy2[result]; result++)
2997 if (copy1[result] == 0)
2998 {
2999 result *= 10;
3000 break;
3001 }
3002
3003 free (copy1);
3004 free (copy2);
3005
3006 return result;
3007}
3008
3009/* Set by closest_target_match() below. */
3010static const bfd_target *winner;
3011
3012/* Scan all the valid bfd targets looking for one that has the endianness
3013 requirement that was specified on the command line, and is the nearest
3014 match to the original output target. */
3015
3016static int
3017closest_target_match (const bfd_target *target, void *data)
3018{
3019 const bfd_target *original = (const bfd_target *) data;
3020
3021 if (command_line.endian == ENDIAN_BIG
3022 && target->byteorder != BFD_ENDIAN_BIG)
3023 return 0;
3024
3025 if (command_line.endian == ENDIAN_LITTLE
3026 && target->byteorder != BFD_ENDIAN_LITTLE)
3027 return 0;
3028
3029 /* Must be the same flavour. */
3030 if (target->flavour != original->flavour)
3031 return 0;
3032
3033 /* Ignore generic big and little endian elf vectors. */
3034 if (strcmp (target->name, "elf32-big") == 0
3035 || strcmp (target->name, "elf64-big") == 0
3036 || strcmp (target->name, "elf32-little") == 0
3037 || strcmp (target->name, "elf64-little") == 0)
3038 return 0;
3039
3040 /* If we have not found a potential winner yet, then record this one. */
3041 if (winner == NULL)
3042 {
3043 winner = target;
3044 return 0;
3045 }
3046
3047 /* Oh dear, we now have two potential candidates for a successful match.
3048 Compare their names and choose the better one. */
3049 if (name_compare (target->name, original->name)
3050 > name_compare (winner->name, original->name))
3051 winner = target;
3052
3053 /* Keep on searching until wqe have checked them all. */
3054 return 0;
3055}
3056
3057/* Return the BFD target format of the first input file. */
3058
3059static char *
3060get_first_input_target (void)
3061{
3062 char *target = NULL;
3063
3064 LANG_FOR_EACH_INPUT_STATEMENT (s)
3065 {
3066 if (s->header.type == lang_input_statement_enum
3067 && s->flags.real)
3068 {
3069 ldfile_open_file (s);
3070
3071 if (s->the_bfd != NULL
3072 && bfd_check_format (s->the_bfd, bfd_object))
3073 {
3074 target = bfd_get_target (s->the_bfd);
3075
3076 if (target != NULL)
3077 break;
3078 }
3079 }
3080 }
3081
3082 return target;
3083}
3084
3085const char *
3086lang_get_output_target (void)
3087{
3088 const char *target;
3089
3090 /* Has the user told us which output format to use? */
3091 if (output_target != NULL)
3092 return output_target;
3093
3094 /* No - has the current target been set to something other than
3095 the default? */
3096 if (current_target != default_target && current_target != NULL)
3097 return current_target;
3098
3099 /* No - can we determine the format of the first input file? */
3100 target = get_first_input_target ();
3101 if (target != NULL)
3102 return target;
3103
3104 /* Failed - use the default output target. */
3105 return default_target;
3106}
3107
3108/* Open the output file. */
3109
3110static void
3111open_output (const char *name)
3112{
3113 output_target = lang_get_output_target ();
3114
3115 /* Has the user requested a particular endianness on the command
3116 line? */
3117 if (command_line.endian != ENDIAN_UNSET)
3118 {
3119 const bfd_target *target;
3120 enum bfd_endian desired_endian;
3121
3122 /* Get the chosen target. */
3123 target = bfd_search_for_target (get_target, (void *) output_target);
3124
3125 /* If the target is not supported, we cannot do anything. */
3126 if (target != NULL)
3127 {
3128 if (command_line.endian == ENDIAN_BIG)
3129 desired_endian = BFD_ENDIAN_BIG;
3130 else
3131 desired_endian = BFD_ENDIAN_LITTLE;
3132
3133 /* See if the target has the wrong endianness. This should
3134 not happen if the linker script has provided big and
3135 little endian alternatives, but some scrips don't do
3136 this. */
3137 if (target->byteorder != desired_endian)
3138 {
3139 /* If it does, then see if the target provides
3140 an alternative with the correct endianness. */
3141 if (target->alternative_target != NULL
3142 && (target->alternative_target->byteorder == desired_endian))
3143 output_target = target->alternative_target->name;
3144 else
3145 {
3146 /* Try to find a target as similar as possible to
3147 the default target, but which has the desired
3148 endian characteristic. */
3149 bfd_search_for_target (closest_target_match,
3150 (void *) target);
3151
3152 /* Oh dear - we could not find any targets that
3153 satisfy our requirements. */
3154 if (winner == NULL)
3155 einfo (_("%P: warning: could not find any targets"
3156 " that match endianness requirement\n"));
3157 else
3158 output_target = winner->name;
3159 }
3160 }
3161 }
3162 }
3163
3164 link_info.output_bfd = bfd_openw (name, output_target);
3165
3166 if (link_info.output_bfd == NULL)
3167 {
3168 if (bfd_get_error () == bfd_error_invalid_target)
3169 einfo (_("%P%F: target %s not found\n"), output_target);
3170
3171 einfo (_("%P%F: cannot open output file %s: %E\n"), name);
3172 }
3173
3174 delete_output_file_on_failure = TRUE;
3175
3176 if (!bfd_set_format (link_info.output_bfd, bfd_object))
3177 einfo (_("%P%F:%s: can not make object file: %E\n"), name);
3178 if (!bfd_set_arch_mach (link_info.output_bfd,
3179 ldfile_output_architecture,
3180 ldfile_output_machine))
3181 einfo (_("%P%F:%s: can not set architecture: %E\n"), name);
3182
3183 link_info.hash = bfd_link_hash_table_create (link_info.output_bfd);
3184 if (link_info.hash == NULL)
3185 einfo (_("%P%F: can not create hash table: %E\n"));
3186
3187 bfd_set_gp_size (link_info.output_bfd, g_switch_value);
3188}
3189
3190static void
3191ldlang_open_output (lang_statement_union_type *statement)
3192{
3193 switch (statement->header.type)
3194 {
3195 case lang_output_statement_enum:
3196 ASSERT (link_info.output_bfd == NULL);
3197 open_output (statement->output_statement.name);
3198 ldemul_set_output_arch ();
3199 if (config.magic_demand_paged
3200 && !bfd_link_relocatable (&link_info))
3201 link_info.output_bfd->flags |= D_PAGED;
3202 else
3203 link_info.output_bfd->flags &= ~D_PAGED;
3204 if (config.text_read_only)
3205 link_info.output_bfd->flags |= WP_TEXT;
3206 else
3207 link_info.output_bfd->flags &= ~WP_TEXT;
3208 if (link_info.traditional_format)
3209 link_info.output_bfd->flags |= BFD_TRADITIONAL_FORMAT;
3210 else
3211 link_info.output_bfd->flags &= ~BFD_TRADITIONAL_FORMAT;
3212 break;
3213
3214 case lang_target_statement_enum:
3215 current_target = statement->target_statement.target;
3216 break;
3217 default:
3218 break;
3219 }
3220}
3221
3222static void
3223init_opb (void)
3224{
3225 unsigned x = bfd_arch_mach_octets_per_byte (ldfile_output_architecture,
3226 ldfile_output_machine);
3227 opb_shift = 0;
3228 if (x > 1)
3229 while ((x & 1) == 0)
3230 {
3231 x >>= 1;
3232 ++opb_shift;
3233 }
3234 ASSERT (x == 1);
3235}
3236
3237/* Open all the input files. */
3238
3239enum open_bfd_mode
3240 {
3241 OPEN_BFD_NORMAL = 0,
3242 OPEN_BFD_FORCE = 1,
3243 OPEN_BFD_RESCAN = 2
3244 };
3245#ifdef ENABLE_PLUGINS
3246static lang_input_statement_type *plugin_insert = NULL;
3247#endif
3248
3249static void
3250open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode)
3251{
3252 for (; s != NULL; s = s->header.next)
3253 {
3254 switch (s->header.type)
3255 {
3256 case lang_constructors_statement_enum:
3257 open_input_bfds (constructor_list.head, mode);
3258 break;
3259 case lang_output_section_statement_enum:
3260 open_input_bfds (s->output_section_statement.children.head, mode);
3261 break;
3262 case lang_wild_statement_enum:
3263 /* Maybe we should load the file's symbols. */
3264 if ((mode & OPEN_BFD_RESCAN) == 0
3265 && s->wild_statement.filename
3266 && !wildcardp (s->wild_statement.filename)
3267 && !archive_path (s->wild_statement.filename))
3268 lookup_name (s->wild_statement.filename);
3269 open_input_bfds (s->wild_statement.children.head, mode);
3270 break;
3271 case lang_group_statement_enum:
3272 {
3273 struct bfd_link_hash_entry *undefs;
3274
3275 /* We must continually search the entries in the group
3276 until no new symbols are added to the list of undefined
3277 symbols. */
3278
3279 do
3280 {
3281 undefs = link_info.hash->undefs_tail;
3282 open_input_bfds (s->group_statement.children.head,
3283 mode | OPEN_BFD_FORCE);
3284 }
3285 while (undefs != link_info.hash->undefs_tail);
3286 }
3287 break;
3288 case lang_target_statement_enum:
3289 current_target = s->target_statement.target;
3290 break;
3291 case lang_input_statement_enum:
3292 if (s->input_statement.flags.real)
3293 {
3294 lang_statement_union_type **os_tail;
3295 lang_statement_list_type add;
3296 bfd *abfd;
3297
3298 s->input_statement.target = current_target;
3299
3300 /* If we are being called from within a group, and this
3301 is an archive which has already been searched, then
3302 force it to be researched unless the whole archive
3303 has been loaded already. Do the same for a rescan.
3304 Likewise reload --as-needed shared libs. */
3305 if (mode != OPEN_BFD_NORMAL
3306#ifdef ENABLE_PLUGINS
3307 && ((mode & OPEN_BFD_RESCAN) == 0
3308 || plugin_insert == NULL)
3309#endif
3310 && s->input_statement.flags.loaded
3311 && (abfd = s->input_statement.the_bfd) != NULL
3312 && ((bfd_get_format (abfd) == bfd_archive
3313 && !s->input_statement.flags.whole_archive)
3314 || (bfd_get_format (abfd) == bfd_object
3315 && ((abfd->flags) & DYNAMIC) != 0
3316 && s->input_statement.flags.add_DT_NEEDED_for_regular
3317 && bfd_get_flavour (abfd) == bfd_target_elf_flavour
3318 && (elf_dyn_lib_class (abfd) & DYN_AS_NEEDED) != 0)))
3319 {
3320 s->input_statement.flags.loaded = FALSE;
3321 s->input_statement.flags.reload = TRUE;
3322 }
3323
3324 os_tail = lang_output_section_statement.tail;
3325 lang_list_init (&add);
3326
3327 if (!load_symbols (&s->input_statement, &add))
3328 config.make_executable = FALSE;
3329
3330 if (add.head != NULL)
3331 {
3332 /* If this was a script with output sections then
3333 tack any added statements on to the end of the
3334 list. This avoids having to reorder the output
3335 section statement list. Very likely the user
3336 forgot -T, and whatever we do here will not meet
3337 naive user expectations. */
3338 if (os_tail != lang_output_section_statement.tail)
3339 {
3340 einfo (_("%P: warning: %s contains output sections;"
3341 " did you forget -T?\n"),
3342 s->input_statement.filename);
3343 *stat_ptr->tail = add.head;
3344 stat_ptr->tail = add.tail;
3345 }
3346 else
3347 {
3348 *add.tail = s->header.next;
3349 s->header.next = add.head;
3350 }
3351 }
3352 }
3353#ifdef ENABLE_PLUGINS
3354 /* If we have found the point at which a plugin added new
3355 files, clear plugin_insert to enable archive rescan. */
3356 if (&s->input_statement == plugin_insert)
3357 plugin_insert = NULL;
3358#endif
3359 break;
3360 case lang_assignment_statement_enum:
3361 if (s->assignment_statement.exp->assign.defsym)
3362 /* This is from a --defsym on the command line. */
3363 exp_fold_tree_no_dot (s->assignment_statement.exp);
3364 break;
3365 default:
3366 break;
3367 }
3368 }
3369
3370 /* Exit if any of the files were missing. */
3371 if (input_flags.missing_file)
3372 einfo ("%F");
3373}
3374
3375/* Add the supplied name to the symbol table as an undefined reference.
3376 This is a two step process as the symbol table doesn't even exist at
3377 the time the ld command line is processed. First we put the name
3378 on a list, then, once the output file has been opened, transfer the
3379 name to the symbol table. */
3380
3381typedef struct bfd_sym_chain ldlang_undef_chain_list_type;
3382
3383#define ldlang_undef_chain_list_head entry_symbol.next
3384
3385void
3386ldlang_add_undef (const char *const name, bfd_boolean cmdline)
3387{
3388 ldlang_undef_chain_list_type *new_undef;
3389
3390 undef_from_cmdline = undef_from_cmdline || cmdline;
3391 new_undef = (ldlang_undef_chain_list_type *) stat_alloc (sizeof (*new_undef));
3392 new_undef->next = ldlang_undef_chain_list_head;
3393 ldlang_undef_chain_list_head = new_undef;
3394
3395 new_undef->name = xstrdup (name);
3396
3397 if (link_info.output_bfd != NULL)
3398 insert_undefined (new_undef->name);
3399}
3400
3401/* Insert NAME as undefined in the symbol table. */
3402
3403static void
3404insert_undefined (const char *name)
3405{
3406 struct bfd_link_hash_entry *h;
3407
3408 h = bfd_link_hash_lookup (link_info.hash, name, TRUE, FALSE, TRUE);
3409 if (h == NULL)
3410 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
3411 if (h->type == bfd_link_hash_new)
3412 {
3413 h->type = bfd_link_hash_undefined;
3414 h->u.undef.abfd = NULL;
3415 bfd_link_add_undef (link_info.hash, h);
3416 }
3417}
3418
3419/* Run through the list of undefineds created above and place them
3420 into the linker hash table as undefined symbols belonging to the
3421 script file. */
3422
3423static void
3424lang_place_undefineds (void)
3425{
3426 ldlang_undef_chain_list_type *ptr;
3427
3428 for (ptr = ldlang_undef_chain_list_head; ptr != NULL; ptr = ptr->next)
3429 insert_undefined (ptr->name);
3430}
3431
3432/* Structure used to build the list of symbols that the user has required
3433 be defined. */
3434
3435struct require_defined_symbol
3436{
3437 const char *name;
3438 struct require_defined_symbol *next;
3439};
3440
3441/* The list of symbols that the user has required be defined. */
3442
3443static struct require_defined_symbol *require_defined_symbol_list;
3444
3445/* Add a new symbol NAME to the list of symbols that are required to be
3446 defined. */
3447
3448void
3449ldlang_add_require_defined (const char *const name)
3450{
3451 struct require_defined_symbol *ptr;
3452
3453 ldlang_add_undef (name, TRUE);
3454 ptr = (struct require_defined_symbol *) stat_alloc (sizeof (*ptr));
3455 ptr->next = require_defined_symbol_list;
3456 ptr->name = strdup (name);
3457 require_defined_symbol_list = ptr;
3458}
3459
3460/* Check that all symbols the user required to be defined, are defined,
3461 raise an error if we find a symbol that is not defined. */
3462
3463static void
3464ldlang_check_require_defined_symbols (void)
3465{
3466 struct require_defined_symbol *ptr;
3467
3468 for (ptr = require_defined_symbol_list; ptr != NULL; ptr = ptr->next)
3469 {
3470 struct bfd_link_hash_entry *h;
3471
3472 h = bfd_link_hash_lookup (link_info.hash, ptr->name,
3473 FALSE, FALSE, TRUE);
3474 if (h == NULL
3475 || (h->type != bfd_link_hash_defined
3476 && h->type != bfd_link_hash_defweak))
3477 einfo(_("%P%X: required symbol `%s' not defined\n"), ptr->name);
3478 }
3479}
3480
3481/* Check for all readonly or some readwrite sections. */
3482
3483static void
3484check_input_sections
3485 (lang_statement_union_type *s,
3486 lang_output_section_statement_type *output_section_statement)
3487{
3488 for (; s != (lang_statement_union_type *) NULL; s = s->header.next)
3489 {
3490 switch (s->header.type)
3491 {
3492 case lang_wild_statement_enum:
3493 walk_wild (&s->wild_statement, check_section_callback,
3494 output_section_statement);
3495 if (!output_section_statement->all_input_readonly)
3496 return;
3497 break;
3498 case lang_constructors_statement_enum:
3499 check_input_sections (constructor_list.head,
3500 output_section_statement);
3501 if (!output_section_statement->all_input_readonly)
3502 return;
3503 break;
3504 case lang_group_statement_enum:
3505 check_input_sections (s->group_statement.children.head,
3506 output_section_statement);
3507 if (!output_section_statement->all_input_readonly)
3508 return;
3509 break;
3510 default:
3511 break;
3512 }
3513 }
3514}
3515
3516/* Update wildcard statements if needed. */
3517
3518static void
3519update_wild_statements (lang_statement_union_type *s)
3520{
3521 struct wildcard_list *sec;
3522
3523 switch (sort_section)
3524 {
3525 default:
3526 FAIL ();
3527
3528 case none:
3529 break;
3530
3531 case by_name:
3532 case by_alignment:
3533 for (; s != NULL; s = s->header.next)
3534 {
3535 switch (s->header.type)
3536 {
3537 default:
3538 break;
3539
3540 case lang_wild_statement_enum:
3541 for (sec = s->wild_statement.section_list; sec != NULL;
3542 sec = sec->next)
3543 {
3544 switch (sec->spec.sorted)
3545 {
3546 case none:
3547 sec->spec.sorted = sort_section;
3548 break;
3549 case by_name:
3550 if (sort_section == by_alignment)
3551 sec->spec.sorted = by_name_alignment;
3552 break;
3553 case by_alignment:
3554 if (sort_section == by_name)
3555 sec->spec.sorted = by_alignment_name;
3556 break;
3557 default:
3558 break;
3559 }
3560 }
3561 break;
3562
3563 case lang_constructors_statement_enum:
3564 update_wild_statements (constructor_list.head);
3565 break;
3566
3567 case lang_output_section_statement_enum:
3568 /* Don't sort .init/.fini sections. */
3569 if (strcmp (s->output_section_statement.name, ".init") != 0
3570 && strcmp (s->output_section_statement.name, ".fini") != 0)
3571 update_wild_statements
3572 (s->output_section_statement.children.head);
3573 break;
3574
3575 case lang_group_statement_enum:
3576 update_wild_statements (s->group_statement.children.head);
3577 break;
3578 }
3579 }
3580 break;
3581 }
3582}
3583
3584/* Open input files and attach to output sections. */
3585
3586static void
3587map_input_to_output_sections
3588 (lang_statement_union_type *s, const char *target,
3589 lang_output_section_statement_type *os)
3590{
3591 for (; s != NULL; s = s->header.next)
3592 {
3593 lang_output_section_statement_type *tos;
3594 flagword flags;
3595
3596 switch (s->header.type)
3597 {
3598 case lang_wild_statement_enum:
3599 wild (&s->wild_statement, target, os);
3600 break;
3601 case lang_constructors_statement_enum:
3602 map_input_to_output_sections (constructor_list.head,
3603 target,
3604 os);
3605 break;
3606 case lang_output_section_statement_enum:
3607 tos = &s->output_section_statement;
3608 if (tos->constraint != 0)
3609 {
3610 if (tos->constraint != ONLY_IF_RW
3611 && tos->constraint != ONLY_IF_RO)
3612 break;
3613 tos->all_input_readonly = TRUE;
3614 check_input_sections (tos->children.head, tos);
3615 if (tos->all_input_readonly != (tos->constraint == ONLY_IF_RO))
3616 {
3617 tos->constraint = -1;
3618 break;
3619 }
3620 }
3621 map_input_to_output_sections (tos->children.head,
3622 target,
3623 tos);
3624 break;
3625 case lang_output_statement_enum:
3626 break;
3627 case lang_target_statement_enum:
3628 target = s->target_statement.target;
3629 break;
3630 case lang_group_statement_enum:
3631 map_input_to_output_sections (s->group_statement.children.head,
3632 target,
3633 os);
3634 break;
3635 case lang_data_statement_enum:
3636 /* Make sure that any sections mentioned in the expression
3637 are initialized. */
3638 exp_init_os (s->data_statement.exp);
3639 /* The output section gets CONTENTS, ALLOC and LOAD, but
3640 these may be overridden by the script. */
3641 flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD;
3642 switch (os->sectype)
3643 {
3644 case normal_section:
3645 case overlay_section:
3646 break;
3647 case noalloc_section:
3648 flags = SEC_HAS_CONTENTS;
3649 break;
3650 case noload_section:
3651 if (bfd_get_flavour (link_info.output_bfd)
3652 == bfd_target_elf_flavour)
3653 flags = SEC_NEVER_LOAD | SEC_ALLOC;
3654 else
3655 flags = SEC_NEVER_LOAD | SEC_HAS_CONTENTS;
3656 break;
3657 }
3658 if (os->bfd_section == NULL)
3659 init_os (os, flags);
3660 else
3661 os->bfd_section->flags |= flags;
3662 break;
3663 case lang_input_section_enum:
3664 break;
3665 case lang_fill_statement_enum:
3666 case lang_object_symbols_statement_enum:
3667 case lang_reloc_statement_enum:
3668 case lang_padding_statement_enum:
3669 case lang_input_statement_enum:
3670 if (os != NULL && os->bfd_section == NULL)
3671 init_os (os, 0);
3672 break;
3673 case lang_assignment_statement_enum:
3674 if (os != NULL && os->bfd_section == NULL)
3675 init_os (os, 0);
3676
3677 /* Make sure that any sections mentioned in the assignment
3678 are initialized. */
3679 exp_init_os (s->assignment_statement.exp);
3680 break;
3681 case lang_address_statement_enum:
3682 /* Mark the specified section with the supplied address.
3683 If this section was actually a segment marker, then the
3684 directive is ignored if the linker script explicitly
3685 processed the segment marker. Originally, the linker
3686 treated segment directives (like -Ttext on the
3687 command-line) as section directives. We honor the
3688 section directive semantics for backwards compatibilty;
3689 linker scripts that do not specifically check for
3690 SEGMENT_START automatically get the old semantics. */
3691 if (!s->address_statement.segment
3692 || !s->address_statement.segment->used)
3693 {
3694 const char *name = s->address_statement.section_name;
3695
3696 /* Create the output section statement here so that
3697 orphans with a set address will be placed after other
3698 script sections. If we let the orphan placement code
3699 place them in amongst other sections then the address
3700 will affect following script sections, which is
3701 likely to surprise naive users. */
3702 tos = lang_output_section_statement_lookup (name, 0, TRUE);
3703 tos->addr_tree = s->address_statement.address;
3704 if (tos->bfd_section == NULL)
3705 init_os (tos, 0);
3706 }
3707 break;
3708 case lang_insert_statement_enum:
3709 break;
3710 }
3711 }
3712}
3713
3714/* An insert statement snips out all the linker statements from the
3715 start of the list and places them after the output section
3716 statement specified by the insert. This operation is complicated
3717 by the fact that we keep a doubly linked list of output section
3718 statements as well as the singly linked list of all statements. */
3719
3720static void
3721process_insert_statements (void)
3722{
3723 lang_statement_union_type **s;
3724 lang_output_section_statement_type *first_os = NULL;
3725 lang_output_section_statement_type *last_os = NULL;
3726 lang_output_section_statement_type *os;
3727
3728 /* "start of list" is actually the statement immediately after
3729 the special abs_section output statement, so that it isn't
3730 reordered. */
3731 s = &lang_output_section_statement.head;
3732 while (*(s = &(*s)->header.next) != NULL)
3733 {
3734 if ((*s)->header.type == lang_output_section_statement_enum)
3735 {
3736 /* Keep pointers to the first and last output section
3737 statement in the sequence we may be about to move. */
3738 os = &(*s)->output_section_statement;
3739
3740 ASSERT (last_os == NULL || last_os->next == os);
3741 last_os = os;
3742
3743 /* Set constraint negative so that lang_output_section_find
3744 won't match this output section statement. At this
3745 stage in linking constraint has values in the range
3746 [-1, ONLY_IN_RW]. */
3747 last_os->constraint = -2 - last_os->constraint;
3748 if (first_os == NULL)
3749 first_os = last_os;
3750 }
3751 else if ((*s)->header.type == lang_insert_statement_enum)
3752 {
3753 lang_insert_statement_type *i = &(*s)->insert_statement;
3754 lang_output_section_statement_type *where;
3755 lang_statement_union_type **ptr;
3756 lang_statement_union_type *first;
3757
3758 where = lang_output_section_find (i->where);
3759 if (where != NULL && i->is_before)
3760 {
3761 do
3762 where = where->prev;
3763 while (where != NULL && where->constraint < 0);
3764 }
3765 if (where == NULL)
3766 {
3767 einfo (_("%F%P: %s not found for insert\n"), i->where);
3768 return;
3769 }
3770
3771 /* Deal with reordering the output section statement list. */
3772 if (last_os != NULL)
3773 {
3774 asection *first_sec, *last_sec;
3775 struct lang_output_section_statement_struct **next;
3776
3777 /* Snip out the output sections we are moving. */
3778 first_os->prev->next = last_os->next;
3779 if (last_os->next == NULL)
3780 {
3781 next = &first_os->prev->next;
3782 lang_output_section_statement.tail
3783 = (lang_statement_union_type **) next;
3784 }
3785 else
3786 last_os->next->prev = first_os->prev;
3787 /* Add them in at the new position. */
3788 last_os->next = where->next;
3789 if (where->next == NULL)
3790 {
3791 next = &last_os->next;
3792 lang_output_section_statement.tail
3793 = (lang_statement_union_type **) next;
3794 }
3795 else
3796 where->next->prev = last_os;
3797 first_os->prev = where;
3798 where->next = first_os;
3799
3800 /* Move the bfd sections in the same way. */
3801 first_sec = NULL;
3802 last_sec = NULL;
3803 for (os = first_os; os != NULL; os = os->next)
3804 {
3805 os->constraint = -2 - os->constraint;
3806 if (os->bfd_section != NULL
3807 && os->bfd_section->owner != NULL)
3808 {
3809 last_sec = os->bfd_section;
3810 if (first_sec == NULL)
3811 first_sec = last_sec;
3812 }
3813 if (os == last_os)
3814 break;
3815 }
3816 if (last_sec != NULL)
3817 {
3818 asection *sec = where->bfd_section;
3819 if (sec == NULL)
3820 sec = output_prev_sec_find (where);
3821
3822 /* The place we want to insert must come after the
3823 sections we are moving. So if we find no
3824 section or if the section is the same as our
3825 last section, then no move is needed. */
3826 if (sec != NULL && sec != last_sec)
3827 {
3828 /* Trim them off. */
3829 if (first_sec->prev != NULL)
3830 first_sec->prev->next = last_sec->next;
3831 else
3832 link_info.output_bfd->sections = last_sec->next;
3833 if (last_sec->next != NULL)
3834 last_sec->next->prev = first_sec->prev;
3835 else
3836 link_info.output_bfd->section_last = first_sec->prev;
3837 /* Add back. */
3838 last_sec->next = sec->next;
3839 if (sec->next != NULL)
3840 sec->next->prev = last_sec;
3841 else
3842 link_info.output_bfd->section_last = last_sec;
3843 first_sec->prev = sec;
3844 sec->next = first_sec;
3845 }
3846 }
3847
3848 first_os = NULL;
3849 last_os = NULL;
3850 }
3851
3852 ptr = insert_os_after (where);
3853 /* Snip everything after the abs_section output statement we
3854 know is at the start of the list, up to and including
3855 the insert statement we are currently processing. */
3856 first = lang_output_section_statement.head->header.next;
3857 lang_output_section_statement.head->header.next = (*s)->header.next;
3858 /* Add them back where they belong. */
3859 *s = *ptr;
3860 if (*s == NULL)
3861 statement_list.tail = s;
3862 *ptr = first;
3863 s = &lang_output_section_statement.head;
3864 }
3865 }
3866
3867 /* Undo constraint twiddling. */
3868 for (os = first_os; os != NULL; os = os->next)
3869 {
3870 os->constraint = -2 - os->constraint;
3871 if (os == last_os)
3872 break;
3873 }
3874}
3875
3876/* An output section might have been removed after its statement was
3877 added. For example, ldemul_before_allocation can remove dynamic
3878 sections if they turn out to be not needed. Clean them up here. */
3879
3880void
3881strip_excluded_output_sections (void)
3882{
3883 lang_output_section_statement_type *os;
3884
3885 /* Run lang_size_sections (if not already done). */
3886 if (expld.phase != lang_mark_phase_enum)
3887 {
3888 expld.phase = lang_mark_phase_enum;
3889 expld.dataseg.phase = exp_dataseg_none;
3890 one_lang_size_sections_pass (NULL, FALSE);
3891 lang_reset_memory_regions ();
3892 }
3893
3894 for (os = &lang_output_section_statement.head->output_section_statement;
3895 os != NULL;
3896 os = os->next)
3897 {
3898 asection *output_section;
3899 bfd_boolean exclude;
3900
3901 if (os->constraint < 0)
3902 continue;
3903
3904 output_section = os->bfd_section;
3905 if (output_section == NULL)
3906 continue;
3907
3908 exclude = (output_section->rawsize == 0
3909 && (output_section->flags & SEC_KEEP) == 0
3910 && !bfd_section_removed_from_list (link_info.output_bfd,
3911 output_section));
3912
3913 /* Some sections have not yet been sized, notably .gnu.version,
3914 .dynsym, .dynstr and .hash. These all have SEC_LINKER_CREATED
3915 input sections, so don't drop output sections that have such
3916 input sections unless they are also marked SEC_EXCLUDE. */
3917 if (exclude && output_section->map_head.s != NULL)
3918 {
3919 asection *s;
3920
3921 for (s = output_section->map_head.s; s != NULL; s = s->map_head.s)
3922 if ((s->flags & SEC_EXCLUDE) == 0
3923 && ((s->flags & SEC_LINKER_CREATED) != 0
3924 || link_info.emitrelocations))
3925 {
3926 exclude = FALSE;
3927 break;
3928 }
3929 }
3930
3931 if (exclude)
3932 {
3933 /* We don't set bfd_section to NULL since bfd_section of the
3934 removed output section statement may still be used. */
3935 if (!os->update_dot)
3936 os->ignored = TRUE;
3937 output_section->flags |= SEC_EXCLUDE;
3938 bfd_section_list_remove (link_info.output_bfd, output_section);
3939 link_info.output_bfd->section_count--;
3940 }
3941 }
3942}
3943
3944/* Called from ldwrite to clear out asection.map_head and
3945 asection.map_tail for use as link_orders in ldwrite.
3946 FIXME: Except for sh64elf.em which starts creating link_orders in
3947 its after_allocation routine so needs to call it early. */
3948
3949void
3950lang_clear_os_map (void)
3951{
3952 lang_output_section_statement_type *os;
3953
3954 if (map_head_is_link_order)
3955 return;
3956
3957 for (os = &lang_output_section_statement.head->output_section_statement;
3958 os != NULL;
3959 os = os->next)
3960 {
3961 asection *output_section;
3962
3963 if (os->constraint < 0)
3964 continue;
3965
3966 output_section = os->bfd_section;
3967 if (output_section == NULL)
3968 continue;
3969
3970 /* TODO: Don't just junk map_head.s, turn them into link_orders. */
3971 output_section->map_head.link_order = NULL;
3972 output_section->map_tail.link_order = NULL;
3973 }
3974
3975 /* Stop future calls to lang_add_section from messing with map_head
3976 and map_tail link_order fields. */
3977 map_head_is_link_order = TRUE;
3978}
3979
3980static void
3981print_output_section_statement
3982 (lang_output_section_statement_type *output_section_statement)
3983{
3984 asection *section = output_section_statement->bfd_section;
3985 int len;
3986
3987 if (output_section_statement != abs_output_section)
3988 {
3989 minfo ("\n%s", output_section_statement->name);
3990
3991 if (section != NULL)
3992 {
3993 print_dot = section->vma;
3994
3995 len = strlen (output_section_statement->name);
3996 if (len >= SECTION_NAME_MAP_LENGTH - 1)
3997 {
3998 print_nl ();
3999 len = 0;
4000 }
4001 while (len < SECTION_NAME_MAP_LENGTH)
4002 {
4003 print_space ();
4004 ++len;
4005 }
4006
4007 minfo ("0x%V %W", section->vma, TO_ADDR (section->size));
4008
4009 if (section->vma != section->lma)
4010 minfo (_(" load address 0x%V"), section->lma);
4011
4012 if (output_section_statement->update_dot_tree != NULL)
4013 exp_fold_tree (output_section_statement->update_dot_tree,
4014 bfd_abs_section_ptr, &print_dot);
4015 }
4016
4017 print_nl ();
4018 }
4019
4020 print_statement_list (output_section_statement->children.head,
4021 output_section_statement);
4022}
4023
4024static void
4025print_assignment (lang_assignment_statement_type *assignment,
4026 lang_output_section_statement_type *output_section)
4027{
4028 unsigned int i;
4029 bfd_boolean is_dot;
4030 etree_type *tree;
4031 asection *osec;
4032
4033 for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
4034 print_space ();
4035
4036 if (assignment->exp->type.node_class == etree_assert)
4037 {
4038 is_dot = FALSE;
4039 tree = assignment->exp->assert_s.child;
4040 }
4041 else
4042 {
4043 const char *dst = assignment->exp->assign.dst;
4044
4045 is_dot = (dst[0] == '.' && dst[1] == 0);
4046 if (!is_dot)
4047 expld.assign_name = dst;
4048 tree = assignment->exp->assign.src;
4049 }
4050
4051 osec = output_section->bfd_section;
4052 if (osec == NULL)
4053 osec = bfd_abs_section_ptr;
4054
4055 if (assignment->exp->type.node_class != etree_provide)
4056 exp_fold_tree (tree, osec, &print_dot);
4057 else
4058 expld.result.valid_p = FALSE;
4059
4060 if (expld.result.valid_p)
4061 {
4062 bfd_vma value;
4063
4064 if (assignment->exp->type.node_class == etree_assert
4065 || is_dot
4066 || expld.assign_name != NULL)
4067 {
4068 value = expld.result.value;
4069
4070 if (expld.result.section != NULL)
4071 value += expld.result.section->vma;
4072
4073 minfo ("0x%V", value);
4074 if (is_dot)
4075 print_dot = value;
4076 }
4077 else
4078 {
4079 struct bfd_link_hash_entry *h;
4080
4081 h = bfd_link_hash_lookup (link_info.hash, assignment->exp->assign.dst,
4082 FALSE, FALSE, TRUE);
4083 if (h)
4084 {
4085 value = h->u.def.value;
4086 value += h->u.def.section->output_section->vma;
4087 value += h->u.def.section->output_offset;
4088
4089 minfo ("[0x%V]", value);
4090 }
4091 else
4092 minfo ("[unresolved]");
4093 }
4094 }
4095 else
4096 {
4097 if (assignment->exp->type.node_class == etree_provide)
4098 minfo ("[!provide]");
4099 else
4100 minfo ("*undef* ");
4101#ifdef BFD64
4102 minfo (" ");
4103#endif
4104 }
4105 expld.assign_name = NULL;
4106
4107 minfo (" ");
4108 exp_print_tree (assignment->exp);
4109 print_nl ();
4110}
4111
4112static void
4113print_input_statement (lang_input_statement_type *statm)
4114{
4115 if (statm->filename != NULL
4116 && (statm->the_bfd == NULL
4117 || (statm->the_bfd->flags & BFD_LINKER_CREATED) == 0))
4118 fprintf (config.map_file, "LOAD %s\n", statm->filename);
4119}
4120
4121/* Print all symbols defined in a particular section. This is called
4122 via bfd_link_hash_traverse, or by print_all_symbols. */
4123
4124static bfd_boolean
4125print_one_symbol (struct bfd_link_hash_entry *hash_entry, void *ptr)
4126{
4127 asection *sec = (asection *) ptr;
4128
4129 if ((hash_entry->type == bfd_link_hash_defined
4130 || hash_entry->type == bfd_link_hash_defweak)
4131 && sec == hash_entry->u.def.section)
4132 {
4133 int i;
4134
4135 for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
4136 print_space ();
4137 minfo ("0x%V ",
4138 (hash_entry->u.def.value
4139 + hash_entry->u.def.section->output_offset
4140 + hash_entry->u.def.section->output_section->vma));
4141
4142 minfo (" %T\n", hash_entry->root.string);
4143 }
4144
4145 return TRUE;
4146}
4147
4148static int
4149hash_entry_addr_cmp (const void *a, const void *b)
4150{
4151 const struct bfd_link_hash_entry *l = *(const struct bfd_link_hash_entry **)a;
4152 const struct bfd_link_hash_entry *r = *(const struct bfd_link_hash_entry **)b;
4153
4154 if (l->u.def.value < r->u.def.value)
4155 return -1;
4156 else if (l->u.def.value > r->u.def.value)
4157 return 1;
4158 else
4159 return 0;
4160}
4161
4162static void
4163print_all_symbols (asection *sec)
4164{
4165 input_section_userdata_type *ud
4166 = (input_section_userdata_type *) get_userdata (sec);
4167 struct map_symbol_def *def;
4168 struct bfd_link_hash_entry **entries;
4169 unsigned int i;
4170
4171 if (!ud)
4172 return;
4173
4174 *ud->map_symbol_def_tail = 0;
4175
4176 /* Sort the symbols by address. */
4177 entries = (struct bfd_link_hash_entry **)
4178 obstack_alloc (&map_obstack,
4179 ud->map_symbol_def_count * sizeof (*entries));
4180
4181 for (i = 0, def = ud->map_symbol_def_head; def; def = def->next, i++)
4182 entries[i] = def->entry;
4183
4184 qsort (entries, ud->map_symbol_def_count, sizeof (*entries),
4185 hash_entry_addr_cmp);
4186
4187 /* Print the symbols. */
4188 for (i = 0; i < ud->map_symbol_def_count; i++)
4189 print_one_symbol (entries[i], sec);
4190
4191 obstack_free (&map_obstack, entries);
4192}
4193
4194/* Print information about an input section to the map file. */
4195
4196static void
4197print_input_section (asection *i, bfd_boolean is_discarded)
4198{
4199 bfd_size_type size = i->size;
4200 int len;
4201 bfd_vma addr;
4202
4203 init_opb ();
4204
4205 print_space ();
4206 minfo ("%s", i->name);
4207
4208 len = 1 + strlen (i->name);
4209 if (len >= SECTION_NAME_MAP_LENGTH - 1)
4210 {
4211 print_nl ();
4212 len = 0;
4213 }
4214 while (len < SECTION_NAME_MAP_LENGTH)
4215 {
4216 print_space ();
4217 ++len;
4218 }
4219
4220 if (i->output_section != NULL
4221 && i->output_section->owner == link_info.output_bfd)
4222 addr = i->output_section->vma + i->output_offset;
4223 else
4224 {
4225 addr = print_dot;
4226 if (!is_discarded)
4227 size = 0;
4228 }
4229
4230 minfo ("0x%V %W %B\n", addr, size, i->owner);
4231
4232 if (size != i->rawsize && i->rawsize != 0)
4233 {
4234 len = SECTION_NAME_MAP_LENGTH + 3;
4235#ifdef BFD64
4236 len += 16;
4237#else
4238 len += 8;
4239#endif
4240 while (len > 0)
4241 {
4242 print_space ();
4243 --len;
4244 }
4245
4246 minfo (_("%W (size before relaxing)\n"), i->rawsize);
4247 }
4248
4249 if (i->output_section != NULL
4250 && i->output_section->owner == link_info.output_bfd)
4251 {
4252 if (link_info.reduce_memory_overheads)
4253 bfd_link_hash_traverse (link_info.hash, print_one_symbol, i);
4254 else
4255 print_all_symbols (i);
4256
4257 /* Update print_dot, but make sure that we do not move it
4258 backwards - this could happen if we have overlays and a
4259 later overlay is shorter than an earier one. */
4260 if (addr + TO_ADDR (size) > print_dot)
4261 print_dot = addr + TO_ADDR (size);
4262 }
4263}
4264
4265static void
4266print_fill_statement (lang_fill_statement_type *fill)
4267{
4268 size_t size;
4269 unsigned char *p;
4270 fputs (" FILL mask 0x", config.map_file);
4271 for (p = fill->fill->data, size = fill->fill->size; size != 0; p++, size--)
4272 fprintf (config.map_file, "%02x", *p);
4273 fputs ("\n", config.map_file);
4274}
4275
4276static void
4277print_data_statement (lang_data_statement_type *data)
4278{
4279 int i;
4280 bfd_vma addr;
4281 bfd_size_type size;
4282 const char *name;
4283
4284 init_opb ();
4285 for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
4286 print_space ();
4287
4288 addr = data->output_offset;
4289 if (data->output_section != NULL)
4290 addr += data->output_section->vma;
4291
4292 switch (data->type)
4293 {
4294 default:
4295 abort ();
4296 case BYTE:
4297 size = BYTE_SIZE;
4298 name = "BYTE";
4299 break;
4300 case SHORT:
4301 size = SHORT_SIZE;
4302 name = "SHORT";
4303 break;
4304 case LONG:
4305 size = LONG_SIZE;
4306 name = "LONG";
4307 break;
4308 case QUAD:
4309 size = QUAD_SIZE;
4310 name = "QUAD";
4311 break;
4312 case SQUAD:
4313 size = QUAD_SIZE;
4314 name = "SQUAD";
4315 break;
4316 }
4317
4318 if (size < TO_SIZE ((unsigned) 1))
4319 size = TO_SIZE ((unsigned) 1);
4320 minfo ("0x%V %W %s 0x%v", addr, TO_ADDR (size), name, data->value);
4321
4322 if (data->exp->type.node_class != etree_value)
4323 {
4324 print_space ();
4325 exp_print_tree (data->exp);
4326 }
4327
4328 print_nl ();
4329
4330 print_dot = addr + TO_ADDR (size);
4331}
4332
4333/* Print an address statement. These are generated by options like
4334 -Ttext. */
4335
4336static void
4337print_address_statement (lang_address_statement_type *address)
4338{
4339 minfo (_("Address of section %s set to "), address->section_name);
4340 exp_print_tree (address->address);
4341 print_nl ();
4342}
4343
4344/* Print a reloc statement. */
4345
4346static void
4347print_reloc_statement (lang_reloc_statement_type *reloc)
4348{
4349 int i;
4350 bfd_vma addr;
4351 bfd_size_type size;
4352
4353 init_opb ();
4354 for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
4355 print_space ();
4356
4357 addr = reloc->output_offset;
4358 if (reloc->output_section != NULL)
4359 addr += reloc->output_section->vma;
4360
4361 size = bfd_get_reloc_size (reloc->howto);
4362
4363 minfo ("0x%V %W RELOC %s ", addr, TO_ADDR (size), reloc->howto->name);
4364
4365 if (reloc->name != NULL)
4366 minfo ("%s+", reloc->name);
4367 else
4368 minfo ("%s+", reloc->section->name);
4369
4370 exp_print_tree (reloc->addend_exp);
4371
4372 print_nl ();
4373
4374 print_dot = addr + TO_ADDR (size);
4375}
4376
4377static void
4378print_padding_statement (lang_padding_statement_type *s)
4379{
4380 int len;
4381 bfd_vma addr;
4382
4383 init_opb ();
4384 minfo (" *fill*");
4385
4386 len = sizeof " *fill*" - 1;
4387 while (len < SECTION_NAME_MAP_LENGTH)
4388 {
4389 print_space ();
4390 ++len;
4391 }
4392
4393 addr = s->output_offset;
4394 if (s->output_section != NULL)
4395 addr += s->output_section->vma;
4396 minfo ("0x%V %W ", addr, TO_ADDR (s->size));
4397
4398 if (s->fill->size != 0)
4399 {
4400 size_t size;
4401 unsigned char *p;
4402 for (p = s->fill->data, size = s->fill->size; size != 0; p++, size--)
4403 fprintf (config.map_file, "%02x", *p);
4404 }
4405
4406 print_nl ();
4407
4408 print_dot = addr + TO_ADDR (s->size);
4409}
4410
4411static void
4412print_wild_statement (lang_wild_statement_type *w,
4413 lang_output_section_statement_type *os)
4414{
4415 struct wildcard_list *sec;
4416
4417 print_space ();
4418
4419 if (w->filenames_sorted)
4420 minfo ("SORT(");
4421 if (w->filename != NULL)
4422 minfo ("%s", w->filename);
4423 else
4424 minfo ("*");
4425 if (w->filenames_sorted)
4426 minfo (")");
4427
4428 minfo ("(");
4429 for (sec = w->section_list; sec; sec = sec->next)
4430 {
4431 if (sec->spec.sorted)
4432 minfo ("SORT(");
4433 if (sec->spec.exclude_name_list != NULL)
4434 {
4435 name_list *tmp;
4436 minfo ("EXCLUDE_FILE(%s", sec->spec.exclude_name_list->name);
4437 for (tmp = sec->spec.exclude_name_list->next; tmp; tmp = tmp->next)
4438 minfo (" %s", tmp->name);
4439 minfo (") ");
4440 }
4441 if (sec->spec.name != NULL)
4442 minfo ("%s", sec->spec.name);
4443 else
4444 minfo ("*");
4445 if (sec->spec.sorted)
4446 minfo (")");
4447 if (sec->next)
4448 minfo (" ");
4449 }
4450 minfo (")");
4451
4452 print_nl ();
4453
4454 print_statement_list (w->children.head, os);
4455}
4456
4457/* Print a group statement. */
4458
4459static void
4460print_group (lang_group_statement_type *s,
4461 lang_output_section_statement_type *os)
4462{
4463 fprintf (config.map_file, "START GROUP\n");
4464 print_statement_list (s->children.head, os);
4465 fprintf (config.map_file, "END GROUP\n");
4466}
4467
4468/* Print the list of statements in S.
4469 This can be called for any statement type. */
4470
4471static void
4472print_statement_list (lang_statement_union_type *s,
4473 lang_output_section_statement_type *os)
4474{
4475 while (s != NULL)
4476 {
4477 print_statement (s, os);
4478 s = s->header.next;
4479 }
4480}
4481
4482/* Print the first statement in statement list S.
4483 This can be called for any statement type. */
4484
4485static void
4486print_statement (lang_statement_union_type *s,
4487 lang_output_section_statement_type *os)
4488{
4489 switch (s->header.type)
4490 {
4491 default:
4492 fprintf (config.map_file, _("Fail with %d\n"), s->header.type);
4493 FAIL ();
4494 break;
4495 case lang_constructors_statement_enum:
4496 if (constructor_list.head != NULL)
4497 {
4498 if (constructors_sorted)
4499 minfo (" SORT (CONSTRUCTORS)\n");
4500 else
4501 minfo (" CONSTRUCTORS\n");
4502 print_statement_list (constructor_list.head, os);
4503 }
4504 break;
4505 case lang_wild_statement_enum:
4506 print_wild_statement (&s->wild_statement, os);
4507 break;
4508 case lang_address_statement_enum:
4509 print_address_statement (&s->address_statement);
4510 break;
4511 case lang_object_symbols_statement_enum:
4512 minfo (" CREATE_OBJECT_SYMBOLS\n");
4513 break;
4514 case lang_fill_statement_enum:
4515 print_fill_statement (&s->fill_statement);
4516 break;
4517 case lang_data_statement_enum:
4518 print_data_statement (&s->data_statement);
4519 break;
4520 case lang_reloc_statement_enum:
4521 print_reloc_statement (&s->reloc_statement);
4522 break;
4523 case lang_input_section_enum:
4524 print_input_section (s->input_section.section, FALSE);
4525 break;
4526 case lang_padding_statement_enum:
4527 print_padding_statement (&s->padding_statement);
4528 break;
4529 case lang_output_section_statement_enum:
4530 print_output_section_statement (&s->output_section_statement);
4531 break;
4532 case lang_assignment_statement_enum:
4533 print_assignment (&s->assignment_statement, os);
4534 break;
4535 case lang_target_statement_enum:
4536 fprintf (config.map_file, "TARGET(%s)\n", s->target_statement.target);
4537 break;
4538 case lang_output_statement_enum:
4539 minfo ("OUTPUT(%s", s->output_statement.name);
4540 if (output_target != NULL)
4541 minfo (" %s", output_target);
4542 minfo (")\n");
4543 break;
4544 case lang_input_statement_enum:
4545 print_input_statement (&s->input_statement);
4546 break;
4547 case lang_group_statement_enum:
4548 print_group (&s->group_statement, os);
4549 break;
4550 case lang_insert_statement_enum:
4551 minfo ("INSERT %s %s\n",
4552 s->insert_statement.is_before ? "BEFORE" : "AFTER",
4553 s->insert_statement.where);
4554 break;
4555 }
4556}
4557
4558static void
4559print_statements (void)
4560{
4561 print_statement_list (statement_list.head, abs_output_section);
4562}
4563
4564/* Print the first N statements in statement list S to STDERR.
4565 If N == 0, nothing is printed.
4566 If N < 0, the entire list is printed.
4567 Intended to be called from GDB. */
4568
4569void
4570dprint_statement (lang_statement_union_type *s, int n)
4571{
4572 FILE *map_save = config.map_file;
4573
4574 config.map_file = stderr;
4575
4576 if (n < 0)
4577 print_statement_list (s, abs_output_section);
4578 else
4579 {
4580 while (s && --n >= 0)
4581 {
4582 print_statement (s, abs_output_section);
4583 s = s->header.next;
4584 }
4585 }
4586
4587 config.map_file = map_save;
4588}
4589
4590static void
4591insert_pad (lang_statement_union_type **ptr,
4592 fill_type *fill,
4593 bfd_size_type alignment_needed,
4594 asection *output_section,
4595 bfd_vma dot)
4596{
4597 static fill_type zero_fill;
4598 lang_statement_union_type *pad = NULL;
4599
4600 if (ptr != &statement_list.head)
4601 pad = ((lang_statement_union_type *)
4602 ((char *) ptr - offsetof (lang_statement_union_type, header.next)));
4603 if (pad != NULL
4604 && pad->header.type == lang_padding_statement_enum
4605 && pad->padding_statement.output_section == output_section)
4606 {
4607 /* Use the existing pad statement. */
4608 }
4609 else if ((pad = *ptr) != NULL
4610 && pad->header.type == lang_padding_statement_enum
4611 && pad->padding_statement.output_section == output_section)
4612 {
4613 /* Use the existing pad statement. */
4614 }
4615 else
4616 {
4617 /* Make a new padding statement, linked into existing chain. */
4618 pad = (lang_statement_union_type *)
4619 stat_alloc (sizeof (lang_padding_statement_type));
4620 pad->header.next = *ptr;
4621 *ptr = pad;
4622 pad->header.type = lang_padding_statement_enum;
4623 pad->padding_statement.output_section = output_section;
4624 if (fill == NULL)
4625 fill = &zero_fill;
4626 pad->padding_statement.fill = fill;
4627 }
4628 pad->padding_statement.output_offset = dot - output_section->vma;
4629 pad->padding_statement.size = alignment_needed;
4630 output_section->size = TO_SIZE (dot + TO_ADDR (alignment_needed)
4631 - output_section->vma);
4632}
4633
4634/* Work out how much this section will move the dot point. */
4635
4636static bfd_vma
4637size_input_section
4638 (lang_statement_union_type **this_ptr,
4639 lang_output_section_statement_type *output_section_statement,
4640 fill_type *fill,
4641 bfd_vma dot)
4642{
4643 lang_input_section_type *is = &((*this_ptr)->input_section);
4644 asection *i = is->section;
4645 asection *o = output_section_statement->bfd_section;
4646
4647 if (i->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
4648 i->output_offset = i->vma - o->vma;
4649 else if ((i->flags & SEC_EXCLUDE) != 0)
4650 i->output_offset = dot - o->vma;
4651 else
4652 {
4653 bfd_size_type alignment_needed;
4654
4655 /* Align this section first to the input sections requirement,
4656 then to the output section's requirement. If this alignment
4657 is greater than any seen before, then record it too. Perform
4658 the alignment by inserting a magic 'padding' statement. */
4659
4660 if (output_section_statement->subsection_alignment != -1)
4661 i->alignment_power = output_section_statement->subsection_alignment;
4662
4663 if (o->alignment_power < i->alignment_power)
4664 o->alignment_power = i->alignment_power;
4665
4666 alignment_needed = align_power (dot, i->alignment_power) - dot;
4667
4668 if (alignment_needed != 0)
4669 {
4670 insert_pad (this_ptr, fill, TO_SIZE (alignment_needed), o, dot);
4671 dot += alignment_needed;
4672 }
4673
4674 /* Remember where in the output section this input section goes. */
4675 i->output_offset = dot - o->vma;
4676
4677 /* Mark how big the output section must be to contain this now. */
4678 dot += TO_ADDR (i->size);
4679 o->size = TO_SIZE (dot - o->vma);
4680 }
4681
4682 return dot;
4683}
4684
4685struct check_sec
4686{
4687 asection *sec;
4688 bfd_boolean warned;
4689};
4690
4691static int
4692sort_sections_by_lma (const void *arg1, const void *arg2)
4693{
4694 const asection *sec1 = ((const struct check_sec *) arg1)->sec;
4695 const asection *sec2 = ((const struct check_sec *) arg2)->sec;
4696
4697 if (sec1->lma < sec2->lma)
4698 return -1;
4699 else if (sec1->lma > sec2->lma)
4700 return 1;
4701 else if (sec1->id < sec2->id)
4702 return -1;
4703 else if (sec1->id > sec2->id)
4704 return 1;
4705
4706 return 0;
4707}
4708
4709static int
4710sort_sections_by_vma (const void *arg1, const void *arg2)
4711{
4712 const asection *sec1 = ((const struct check_sec *) arg1)->sec;
4713 const asection *sec2 = ((const struct check_sec *) arg2)->sec;
4714
4715 if (sec1->vma < sec2->vma)
4716 return -1;
4717 else if (sec1->vma > sec2->vma)
4718 return 1;
4719 else if (sec1->id < sec2->id)
4720 return -1;
4721 else if (sec1->id > sec2->id)
4722 return 1;
4723
4724 return 0;
4725}
4726
4727#define IS_TBSS(s) \
4728 ((s->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) == SEC_THREAD_LOCAL)
4729
4730#define IGNORE_SECTION(s) \
4731 ((s->flags & SEC_ALLOC) == 0 || IS_TBSS (s))
4732
4733/* Check to see if any allocated sections overlap with other allocated
4734 sections. This can happen if a linker script specifies the output
4735 section addresses of the two sections. Also check whether any memory
4736 region has overflowed. */
4737
4738static void
4739lang_check_section_addresses (void)
4740{
4741 asection *s, *p;
4742 struct check_sec *sections;
4743 size_t i, count;
4744 bfd_vma s_start;
4745 bfd_vma s_end;
4746 bfd_vma p_start = 0;
4747 bfd_vma p_end = 0;
4748 lang_memory_region_type *m;
4749 bfd_boolean overlays;
4750
4751 if (bfd_count_sections (link_info.output_bfd) <= 1)
4752 return;
4753
4754 count = bfd_count_sections (link_info.output_bfd);
4755 sections = XNEWVEC (struct check_sec, count);
4756
4757 /* Scan all sections in the output list. */
4758 count = 0;
4759 for (s = link_info.output_bfd->sections; s != NULL; s = s->next)
4760 {
4761 if (IGNORE_SECTION (s)
4762 || s->size == 0)
4763 continue;
4764
4765 sections[count].sec = s;
4766 sections[count].warned = FALSE;
4767 count++;
4768 }
4769
4770 if (count <= 1)
4771 {
4772 free (sections);
4773 return;
4774 }
4775
4776 qsort (sections, count, sizeof (*sections), sort_sections_by_lma);
4777
4778 /* First check section LMAs. There should be no overlap of LMAs on
4779 loadable sections, even with overlays. */
4780 for (p = NULL, i = 0; i < count; i++)
4781 {
4782 s = sections[i].sec;
4783 if ((s->flags & SEC_LOAD) != 0)
4784 {
4785 s_start = s->lma;
4786 s_end = s_start + TO_ADDR (s->size) - 1;
4787
4788 /* Look for an overlap. We have sorted sections by lma, so
4789 we know that s_start >= p_start. Besides the obvious
4790 case of overlap when the current section starts before
4791 the previous one ends, we also must have overlap if the
4792 previous section wraps around the address space. */
4793 if (p != NULL
4794 && (s_start <= p_end
4795 || p_end < p_start))
4796 {
4797 einfo (_("%X%P: section %s LMA [%V,%V]"
4798 " overlaps section %s LMA [%V,%V]\n"),
4799 s->name, s_start, s_end, p->name, p_start, p_end);
4800 sections[i].warned = TRUE;
4801 }
4802 p = s;
4803 p_start = s_start;
4804 p_end = s_end;
4805 }
4806 }
4807
4808 /* If any non-zero size allocated section (excluding tbss) starts at
4809 exactly the same VMA as another such section, then we have
4810 overlays. Overlays generated by the OVERLAY keyword will have
4811 this property. It is possible to intentionally generate overlays
4812 that fail this test, but it would be unusual. */
4813 qsort (sections, count, sizeof (*sections), sort_sections_by_vma);
4814 overlays = FALSE;
4815 p_start = sections[0].sec->vma;
4816 for (i = 1; i < count; i++)
4817 {
4818 s_start = sections[i].sec->vma;
4819 if (p_start == s_start)
4820 {
4821 overlays = TRUE;
4822 break;
4823 }
4824 p_start = s_start;
4825 }
4826
4827 /* Now check section VMAs if no overlays were detected. */
4828 if (!overlays)
4829 {
4830 for (p = NULL, i = 0; i < count; i++)
4831 {
4832 s = sections[i].sec;
4833 s_start = s->vma;
4834 s_end = s_start + TO_ADDR (s->size) - 1;
4835
4836 if (p != NULL
4837 && !sections[i].warned
4838 && (s_start <= p_end
4839 || p_end < p_start))
4840 einfo (_("%X%P: section %s VMA [%V,%V]"
4841 " overlaps section %s VMA [%V,%V]\n"),
4842 s->name, s_start, s_end, p->name, p_start, p_end);
4843 p = s;
4844 p_start = s_start;
4845 p_end = s_end;
4846 }
4847 }
4848
4849 free (sections);
4850
4851 /* If any memory region has overflowed, report by how much.
4852 We do not issue this diagnostic for regions that had sections
4853 explicitly placed outside their bounds; os_region_check's
4854 diagnostics are adequate for that case.
4855
4856 FIXME: It is conceivable that m->current - (m->origin + m->length)
4857 might overflow a 32-bit integer. There is, alas, no way to print
4858 a bfd_vma quantity in decimal. */
4859 for (m = lang_memory_region_list; m; m = m->next)
4860 if (m->had_full_message)
4861 einfo (_("%X%P: region `%s' overflowed by %ld bytes\n"),
4862 m->name_list.name, (long)(m->current - (m->origin + m->length)));
4863}
4864
4865/* Make sure the new address is within the region. We explicitly permit the
4866 current address to be at the exact end of the region when the address is
4867 non-zero, in case the region is at the end of addressable memory and the
4868 calculation wraps around. */
4869
4870static void
4871os_region_check (lang_output_section_statement_type *os,
4872 lang_memory_region_type *region,
4873 etree_type *tree,
4874 bfd_vma rbase)
4875{
4876 if ((region->current < region->origin
4877 || (region->current - region->origin > region->length))
4878 && ((region->current != region->origin + region->length)
4879 || rbase == 0))
4880 {
4881 if (tree != NULL)
4882 {
4883 einfo (_("%X%P: address 0x%v of %B section `%s'"
4884 " is not within region `%s'\n"),
4885 region->current,
4886 os->bfd_section->owner,
4887 os->bfd_section->name,
4888 region->name_list.name);
4889 }
4890 else if (!region->had_full_message)
4891 {
4892 region->had_full_message = TRUE;
4893
4894 einfo (_("%X%P: %B section `%s' will not fit in region `%s'\n"),
4895 os->bfd_section->owner,
4896 os->bfd_section->name,
4897 region->name_list.name);
4898 }
4899 }
4900}
4901
4902/* Set the sizes for all the output sections. */
4903
4904static bfd_vma
4905lang_size_sections_1
4906 (lang_statement_union_type **prev,
4907 lang_output_section_statement_type *output_section_statement,
4908 fill_type *fill,
4909 bfd_vma dot,
4910 bfd_boolean *relax,
4911 bfd_boolean check_regions)
4912{
4913 lang_statement_union_type *s;
4914
4915 /* Size up the sections from their constituent parts. */
4916 for (s = *prev; s != NULL; s = s->header.next)
4917 {
4918 switch (s->header.type)
4919 {
4920 case lang_output_section_statement_enum:
4921 {
4922 bfd_vma newdot, after, dotdelta;
4923 lang_output_section_statement_type *os;
4924 lang_memory_region_type *r;
4925 int section_alignment = 0;
4926
4927 os = &s->output_section_statement;
4928 if (os->constraint == -1)
4929 break;
4930
4931 /* FIXME: We shouldn't need to zero section vmas for ld -r
4932 here, in lang_insert_orphan, or in the default linker scripts.
4933 This is covering for coff backend linker bugs. See PR6945. */
4934 if (os->addr_tree == NULL
4935 && bfd_link_relocatable (&link_info)
4936 && (bfd_get_flavour (link_info.output_bfd)
4937 == bfd_target_coff_flavour))
4938 os->addr_tree = exp_intop (0);
4939 if (os->addr_tree != NULL)
4940 {
4941 os->processed_vma = FALSE;
4942 exp_fold_tree (os->addr_tree, bfd_abs_section_ptr, &dot);
4943
4944 if (expld.result.valid_p)
4945 {
4946 dot = expld.result.value;
4947 if (expld.result.section != NULL)
4948 dot += expld.result.section->vma;
4949 }
4950 else if (expld.phase != lang_mark_phase_enum)
4951 einfo (_("%F%S: non constant or forward reference"
4952 " address expression for section %s\n"),
4953 os->addr_tree, os->name);
4954 }
4955
4956 if (os->bfd_section == NULL)
4957 /* This section was removed or never actually created. */
4958 break;
4959
4960 /* If this is a COFF shared library section, use the size and
4961 address from the input section. FIXME: This is COFF
4962 specific; it would be cleaner if there were some other way
4963 to do this, but nothing simple comes to mind. */
4964 if (((bfd_get_flavour (link_info.output_bfd)
4965 == bfd_target_ecoff_flavour)
4966 || (bfd_get_flavour (link_info.output_bfd)
4967 == bfd_target_coff_flavour))
4968 && (os->bfd_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
4969 {
4970 asection *input;
4971
4972 if (os->children.head == NULL
4973 || os->children.head->header.next != NULL
4974 || (os->children.head->header.type
4975 != lang_input_section_enum))
4976 einfo (_("%P%X: Internal error on COFF shared library"
4977 " section %s\n"), os->name);
4978
4979 input = os->children.head->input_section.section;
4980 bfd_set_section_vma (os->bfd_section->owner,
4981 os->bfd_section,
4982 bfd_section_vma (input->owner, input));
4983 os->bfd_section->size = input->size;
4984 break;
4985 }
4986
4987 newdot = dot;
4988 dotdelta = 0;
4989 if (bfd_is_abs_section (os->bfd_section))
4990 {
4991 /* No matter what happens, an abs section starts at zero. */
4992 ASSERT (os->bfd_section->vma == 0);
4993 }
4994 else
4995 {
4996 if (os->addr_tree == NULL)
4997 {
4998 /* No address specified for this section, get one
4999 from the region specification. */
5000 if (os->region == NULL
5001 || ((os->bfd_section->flags & (SEC_ALLOC | SEC_LOAD))
5002 && os->region->name_list.name[0] == '*'
5003 && strcmp (os->region->name_list.name,
5004 DEFAULT_MEMORY_REGION) == 0))
5005 {
5006 os->region = lang_memory_default (os->bfd_section);
5007 }
5008
5009 /* If a loadable section is using the default memory
5010 region, and some non default memory regions were
5011 defined, issue an error message. */
5012 if (!os->ignored
5013 && !IGNORE_SECTION (os->bfd_section)
5014 && !bfd_link_relocatable (&link_info)
5015 && check_regions
5016 && strcmp (os->region->name_list.name,
5017 DEFAULT_MEMORY_REGION) == 0
5018 && lang_memory_region_list != NULL
5019 && (strcmp (lang_memory_region_list->name_list.name,
5020 DEFAULT_MEMORY_REGION) != 0
5021 || lang_memory_region_list->next != NULL)
5022 && expld.phase != lang_mark_phase_enum)
5023 {
5024 /* By default this is an error rather than just a
5025 warning because if we allocate the section to the
5026 default memory region we can end up creating an
5027 excessively large binary, or even seg faulting when
5028 attempting to perform a negative seek. See
5029 sources.redhat.com/ml/binutils/2003-04/msg00423.html
5030 for an example of this. This behaviour can be
5031 overridden by the using the --no-check-sections
5032 switch. */
5033 if (command_line.check_section_addresses)
5034 einfo (_("%P%F: error: no memory region specified"
5035 " for loadable section `%s'\n"),
5036 bfd_get_section_name (link_info.output_bfd,
5037 os->bfd_section));
5038 else
5039 einfo (_("%P: warning: no memory region specified"
5040 " for loadable section `%s'\n"),
5041 bfd_get_section_name (link_info.output_bfd,
5042 os->bfd_section));
5043 }
5044
5045 newdot = os->region->current;
5046 section_alignment = os->bfd_section->alignment_power;
5047 }
5048 else
5049 section_alignment = os->section_alignment;
5050
5051 /* Align to what the section needs. */
5052 if (section_alignment > 0)
5053 {
5054 bfd_vma savedot = newdot;
5055 newdot = align_power (newdot, section_alignment);
5056
5057 dotdelta = newdot - savedot;
5058 if (dotdelta != 0
5059 && (config.warn_section_align
5060 || os->addr_tree != NULL)
5061 && expld.phase != lang_mark_phase_enum)
5062 einfo (_("%P: warning: changing start of section"
5063 " %s by %lu bytes\n"),
5064 os->name, (unsigned long) dotdelta);
5065 }
5066
5067 bfd_set_section_vma (0, os->bfd_section, newdot);
5068
5069 os->bfd_section->output_offset = 0;
5070 }
5071
5072 lang_size_sections_1 (&os->children.head, os,
5073 os->fill, newdot, relax, check_regions);
5074
5075 os->processed_vma = TRUE;
5076
5077 if (bfd_is_abs_section (os->bfd_section) || os->ignored)
5078 /* Except for some special linker created sections,
5079 no output section should change from zero size
5080 after strip_excluded_output_sections. A non-zero
5081 size on an ignored section indicates that some
5082 input section was not sized early enough. */
5083 ASSERT (os->bfd_section->size == 0);
5084 else
5085 {
5086 dot = os->bfd_section->vma;
5087
5088 /* Put the section within the requested block size, or
5089 align at the block boundary. */
5090 after = ((dot
5091 + TO_ADDR (os->bfd_section->size)
5092 + os->block_value - 1)
5093 & - (bfd_vma) os->block_value);
5094
5095 os->bfd_section->size = TO_SIZE (after - os->bfd_section->vma);
5096 }
5097
5098 /* Set section lma. */
5099 r = os->region;
5100 if (r == NULL)
5101 r = lang_memory_region_lookup (DEFAULT_MEMORY_REGION, FALSE);
5102
5103 if (os->load_base)
5104 {
5105 bfd_vma lma = exp_get_abs_int (os->load_base, 0, "load base");
5106 os->bfd_section->lma = lma;
5107 }
5108 else if (os->lma_region != NULL)
5109 {
5110 bfd_vma lma = os->lma_region->current;
5111
5112 if (os->align_lma_with_input)
5113 lma += dotdelta;
5114 else
5115 {
5116 /* When LMA_REGION is the same as REGION, align the LMA
5117 as we did for the VMA, possibly including alignment
5118 from the bfd section. If a different region, then
5119 only align according to the value in the output
5120 statement. */
5121 if (os->lma_region != os->region)
5122 section_alignment = os->section_alignment;
5123 if (section_alignment > 0)
5124 lma = align_power (lma, section_alignment);
5125 }
5126 os->bfd_section->lma = lma;
5127 }
5128 else if (r->last_os != NULL
5129 && (os->bfd_section->flags & SEC_ALLOC) != 0)
5130 {
5131 bfd_vma lma;
5132 asection *last;
5133
5134 last = r->last_os->output_section_statement.bfd_section;
5135
5136 /* A backwards move of dot should be accompanied by
5137 an explicit assignment to the section LMA (ie.
5138 os->load_base set) because backwards moves can
5139 create overlapping LMAs. */
5140 if (dot < last->vma
5141 && os->bfd_section->size != 0
5142 && dot + TO_ADDR (os->bfd_section->size) <= last->vma)
5143 {
5144 /* If dot moved backwards then leave lma equal to
5145 vma. This is the old default lma, which might
5146 just happen to work when the backwards move is
5147 sufficiently large. Nag if this changes anything,
5148 so people can fix their linker scripts. */
5149
5150 if (last->vma != last->lma)
5151 einfo (_("%P: warning: dot moved backwards "
5152 "before `%s'\n"), os->name);
5153 }
5154 else
5155 {
5156 /* If this is an overlay, set the current lma to that
5157 at the end of the previous section. */
5158 if (os->sectype == overlay_section)
5159 lma = last->lma + TO_ADDR (last->size);
5160
5161 /* Otherwise, keep the same lma to vma relationship
5162 as the previous section. */
5163 else
5164 lma = dot + last->lma - last->vma;
5165
5166 if (section_alignment > 0)
5167 lma = align_power (lma, section_alignment);
5168 os->bfd_section->lma = lma;
5169 }
5170 }
5171 os->processed_lma = TRUE;
5172
5173 if (bfd_is_abs_section (os->bfd_section) || os->ignored)
5174 break;
5175
5176 /* Keep track of normal sections using the default
5177 lma region. We use this to set the lma for
5178 following sections. Overlays or other linker
5179 script assignment to lma might mean that the
5180 default lma == vma is incorrect.
5181 To avoid warnings about dot moving backwards when using
5182 -Ttext, don't start tracking sections until we find one
5183 of non-zero size or with lma set differently to vma. */
5184 if (!IGNORE_SECTION (os->bfd_section)
5185 && (os->bfd_section->size != 0
5186 || (r->last_os == NULL
5187 && os->bfd_section->vma != os->bfd_section->lma)
5188 || (r->last_os != NULL
5189 && dot >= (r->last_os->output_section_statement
5190 .bfd_section->vma)))
5191 && os->lma_region == NULL
5192 && !bfd_link_relocatable (&link_info))
5193 r->last_os = s;
5194
5195 /* .tbss sections effectively have zero size. */
5196 if (!IS_TBSS (os->bfd_section)
5197 || bfd_link_relocatable (&link_info))
5198 dotdelta = TO_ADDR (os->bfd_section->size);
5199 else
5200 dotdelta = 0;
5201 dot += dotdelta;
5202
5203 if (os->update_dot_tree != 0)
5204 exp_fold_tree (os->update_dot_tree, bfd_abs_section_ptr, &dot);
5205
5206 /* Update dot in the region ?
5207 We only do this if the section is going to be allocated,
5208 since unallocated sections do not contribute to the region's
5209 overall size in memory. */
5210 if (os->region != NULL
5211 && (os->bfd_section->flags & (SEC_ALLOC | SEC_LOAD)))
5212 {
5213 os->region->current = dot;
5214
5215 if (check_regions)
5216 /* Make sure the new address is within the region. */
5217 os_region_check (os, os->region, os->addr_tree,
5218 os->bfd_section->vma);
5219
5220 if (os->lma_region != NULL && os->lma_region != os->region
5221 && ((os->bfd_section->flags & SEC_LOAD)
5222 || os->align_lma_with_input))
5223 {
5224 os->lma_region->current = os->bfd_section->lma + dotdelta;
5225
5226 if (check_regions)
5227 os_region_check (os, os->lma_region, NULL,
5228 os->bfd_section->lma);
5229 }
5230 }
5231 }
5232 break;
5233
5234 case lang_constructors_statement_enum:
5235 dot = lang_size_sections_1 (&constructor_list.head,
5236 output_section_statement,
5237 fill, dot, relax, check_regions);
5238 break;
5239
5240 case lang_data_statement_enum:
5241 {
5242 unsigned int size = 0;
5243
5244 s->data_statement.output_offset =
5245 dot - output_section_statement->bfd_section->vma;
5246 s->data_statement.output_section =
5247 output_section_statement->bfd_section;
5248
5249 /* We might refer to provided symbols in the expression, and
5250 need to mark them as needed. */
5251 exp_fold_tree (s->data_statement.exp, bfd_abs_section_ptr, &dot);
5252
5253 switch (s->data_statement.type)
5254 {
5255 default:
5256 abort ();
5257 case QUAD:
5258 case SQUAD:
5259 size = QUAD_SIZE;
5260 break;
5261 case LONG:
5262 size = LONG_SIZE;
5263 break;
5264 case SHORT:
5265 size = SHORT_SIZE;
5266 break;
5267 case BYTE:
5268 size = BYTE_SIZE;
5269 break;
5270 }
5271 if (size < TO_SIZE ((unsigned) 1))
5272 size = TO_SIZE ((unsigned) 1);
5273 dot += TO_ADDR (size);
5274 output_section_statement->bfd_section->size
5275 = TO_SIZE (dot - output_section_statement->bfd_section->vma);
5276
5277 }
5278 break;
5279
5280 case lang_reloc_statement_enum:
5281 {
5282 int size;
5283
5284 s->reloc_statement.output_offset =
5285 dot - output_section_statement->bfd_section->vma;
5286 s->reloc_statement.output_section =
5287 output_section_statement->bfd_section;
5288 size = bfd_get_reloc_size (s->reloc_statement.howto);
5289 dot += TO_ADDR (size);
5290 output_section_statement->bfd_section->size
5291 = TO_SIZE (dot - output_section_statement->bfd_section->vma);
5292 }
5293 break;
5294
5295 case lang_wild_statement_enum:
5296 dot = lang_size_sections_1 (&s->wild_statement.children.head,
5297 output_section_statement,
5298 fill, dot, relax, check_regions);
5299 break;
5300
5301 case lang_object_symbols_statement_enum:
5302 link_info.create_object_symbols_section =
5303 output_section_statement->bfd_section;
5304 break;
5305
5306 case lang_output_statement_enum:
5307 case lang_target_statement_enum:
5308 break;
5309
5310 case lang_input_section_enum:
5311 {
5312 asection *i;
5313
5314 i = s->input_section.section;
5315 if (relax)
5316 {
5317 bfd_boolean again;
5318
5319 if (!bfd_relax_section (i->owner, i, &link_info, &again))
5320 einfo (_("%P%F: can't relax section: %E\n"));
5321 if (again)
5322 *relax = TRUE;
5323 }
5324 dot = size_input_section (prev, output_section_statement,
5325 fill, dot);
5326 }
5327 break;
5328
5329 case lang_input_statement_enum:
5330 break;
5331
5332 case lang_fill_statement_enum:
5333 s->fill_statement.output_section =
5334 output_section_statement->bfd_section;
5335
5336 fill = s->fill_statement.fill;
5337 break;
5338
5339 case lang_assignment_statement_enum:
5340 {
5341 bfd_vma newdot = dot;
5342 etree_type *tree = s->assignment_statement.exp;
5343
5344 expld.dataseg.relro = exp_dataseg_relro_none;
5345
5346 exp_fold_tree (tree,
5347 output_section_statement->bfd_section,
5348 &newdot);
5349
5350 if (expld.dataseg.relro == exp_dataseg_relro_start)
5351 {
5352 if (!expld.dataseg.relro_start_stat)
5353 expld.dataseg.relro_start_stat = s;
5354 else
5355 {
5356 ASSERT (expld.dataseg.relro_start_stat == s);
5357 }
5358 }
5359 else if (expld.dataseg.relro == exp_dataseg_relro_end)
5360 {
5361 if (!expld.dataseg.relro_end_stat)
5362 expld.dataseg.relro_end_stat = s;
5363 else
5364 {
5365 ASSERT (expld.dataseg.relro_end_stat == s);
5366 }
5367 }
5368 expld.dataseg.relro = exp_dataseg_relro_none;
5369
5370 /* This symbol may be relative to this section. */
5371 if ((tree->type.node_class == etree_provided
5372 || tree->type.node_class == etree_assign)
5373 && (tree->assign.dst [0] != '.'
5374 || tree->assign.dst [1] != '\0'))
5375 output_section_statement->update_dot = 1;
5376
5377 if (!output_section_statement->ignored)
5378 {
5379 if (output_section_statement == abs_output_section)
5380 {
5381 /* If we don't have an output section, then just adjust
5382 the default memory address. */
5383 lang_memory_region_lookup (DEFAULT_MEMORY_REGION,
5384 FALSE)->current = newdot;
5385 }
5386 else if (newdot != dot)
5387 {
5388 /* Insert a pad after this statement. We can't
5389 put the pad before when relaxing, in case the
5390 assignment references dot. */
5391 insert_pad (&s->header.next, fill, TO_SIZE (newdot - dot),
5392 output_section_statement->bfd_section, dot);
5393
5394 /* Don't neuter the pad below when relaxing. */
5395 s = s->header.next;
5396
5397 /* If dot is advanced, this implies that the section
5398 should have space allocated to it, unless the
5399 user has explicitly stated that the section
5400 should not be allocated. */
5401 if (output_section_statement->sectype != noalloc_section
5402 && (output_section_statement->sectype != noload_section
5403 || (bfd_get_flavour (link_info.output_bfd)
5404 == bfd_target_elf_flavour)))
5405 output_section_statement->bfd_section->flags |= SEC_ALLOC;
5406 }
5407 dot = newdot;
5408 }
5409 }
5410 break;
5411
5412 case lang_padding_statement_enum:
5413 /* If this is the first time lang_size_sections is called,
5414 we won't have any padding statements. If this is the
5415 second or later passes when relaxing, we should allow
5416 padding to shrink. If padding is needed on this pass, it
5417 will be added back in. */
5418 s->padding_statement.size = 0;
5419
5420 /* Make sure output_offset is valid. If relaxation shrinks
5421 the section and this pad isn't needed, it's possible to
5422 have output_offset larger than the final size of the
5423 section. bfd_set_section_contents will complain even for
5424 a pad size of zero. */
5425 s->padding_statement.output_offset
5426 = dot - output_section_statement->bfd_section->vma;
5427 break;
5428
5429 case lang_group_statement_enum:
5430 dot = lang_size_sections_1 (&s->group_statement.children.head,
5431 output_section_statement,
5432 fill, dot, relax, check_regions);
5433 break;
5434
5435 case lang_insert_statement_enum:
5436 break;
5437
5438 /* We can only get here when relaxing is turned on. */
5439 case lang_address_statement_enum:
5440 break;
5441
5442 default:
5443 FAIL ();
5444 break;
5445 }
5446 prev = &s->header.next;
5447 }
5448 return dot;
5449}
5450
5451/* Callback routine that is used in _bfd_elf_map_sections_to_segments.
5452 The BFD library has set NEW_SEGMENT to TRUE iff it thinks that
5453 CURRENT_SECTION and PREVIOUS_SECTION ought to be placed into different
5454 segments. We are allowed an opportunity to override this decision. */
5455
5456bfd_boolean
5457ldlang_override_segment_assignment (struct bfd_link_info *info ATTRIBUTE_UNUSED,
5458 bfd *abfd ATTRIBUTE_UNUSED,
5459 asection *current_section,
5460 asection *previous_section,
5461 bfd_boolean new_segment)
5462{
5463 lang_output_section_statement_type *cur;
5464 lang_output_section_statement_type *prev;
5465
5466 /* The checks below are only necessary when the BFD library has decided
5467 that the two sections ought to be placed into the same segment. */
5468 if (new_segment)
5469 return TRUE;
5470
5471 /* Paranoia checks. */
5472 if (current_section == NULL || previous_section == NULL)
5473 return new_segment;
5474
5475 /* If this flag is set, the target never wants code and non-code
5476 sections comingled in the same segment. */
5477 if (config.separate_code
5478 && ((current_section->flags ^ previous_section->flags) & SEC_CODE))
5479 return TRUE;
5480
5481 /* Find the memory regions associated with the two sections.
5482 We call lang_output_section_find() here rather than scanning the list
5483 of output sections looking for a matching section pointer because if
5484 we have a large number of sections then a hash lookup is faster. */
5485 cur = lang_output_section_find (current_section->name);
5486 prev = lang_output_section_find (previous_section->name);
5487
5488 /* More paranoia. */
5489 if (cur == NULL || prev == NULL)
5490 return new_segment;
5491
5492 /* If the regions are different then force the sections to live in
5493 different segments. See the email thread starting at the following
5494 URL for the reasons why this is necessary:
5495 http://sourceware.org/ml/binutils/2007-02/msg00216.html */
5496 return cur->region != prev->region;
5497}
5498
5499void
5500one_lang_size_sections_pass (bfd_boolean *relax, bfd_boolean check_regions)
5501{
5502 lang_statement_iteration++;
5503 lang_size_sections_1 (&statement_list.head, abs_output_section,
5504 0, 0, relax, check_regions);
5505}
5506
5507void
5508lang_size_sections (bfd_boolean *relax, bfd_boolean check_regions)
5509{
5510 expld.phase = lang_allocating_phase_enum;
5511 expld.dataseg.phase = exp_dataseg_none;
5512
5513 one_lang_size_sections_pass (relax, check_regions);
5514 if (expld.dataseg.phase == exp_dataseg_end_seen
5515 && link_info.relro && expld.dataseg.relro_end)
5516 {
5517 bfd_vma initial_base, relro_end, desired_end;
5518 asection *sec;
5519
5520 /* Compute the expected PT_GNU_RELRO segment end. */
5521 relro_end = ((expld.dataseg.relro_end + expld.dataseg.pagesize - 1)
5522 & ~(expld.dataseg.pagesize - 1));
5523
5524 /* Adjust by the offset arg of DATA_SEGMENT_RELRO_END. */
5525 desired_end = relro_end - expld.dataseg.relro_offset;
5526
5527 /* For sections in the relro segment.. */
5528 for (sec = link_info.output_bfd->section_last; sec; sec = sec->prev)
5529 if ((sec->flags & SEC_ALLOC) != 0
5530 && sec->vma >= expld.dataseg.base
5531 && sec->vma < expld.dataseg.relro_end - expld.dataseg.relro_offset)
5532 {
5533 /* Where do we want to put this section so that it ends as
5534 desired? */
5535 bfd_vma start, end, bump;
5536
5537 end = start = sec->vma;
5538 if (!IS_TBSS (sec))
5539 end += TO_ADDR (sec->size);
5540 bump = desired_end - end;
5541 /* We'd like to increase START by BUMP, but we must heed
5542 alignment so the increase might be less than optimum. */
5543 start += bump;
5544 start &= ~(((bfd_vma) 1 << sec->alignment_power) - 1);
5545 /* This is now the desired end for the previous section. */
5546 desired_end = start;
5547 }
5548
5549 expld.dataseg.phase = exp_dataseg_relro_adjust;
5550 ASSERT (desired_end >= expld.dataseg.base);
5551 initial_base = expld.dataseg.base;
5552 expld.dataseg.base = desired_end;
5553 lang_reset_memory_regions ();
5554 one_lang_size_sections_pass (relax, check_regions);
5555
5556 if (expld.dataseg.relro_end > relro_end)
5557 {
5558 /* Assignments to dot, or to output section address in a
5559 user script have increased padding over the original.
5560 Revert. */
5561 expld.dataseg.base = initial_base;
5562 lang_reset_memory_regions ();
5563 one_lang_size_sections_pass (relax, check_regions);
5564 }
5565
5566 link_info.relro_start = expld.dataseg.base;
5567 link_info.relro_end = expld.dataseg.relro_end;
5568 }
5569 else if (expld.dataseg.phase == exp_dataseg_end_seen)
5570 {
5571 /* If DATA_SEGMENT_ALIGN DATA_SEGMENT_END pair was seen, check whether
5572 a page could be saved in the data segment. */
5573 bfd_vma first, last;
5574
5575 first = -expld.dataseg.base & (expld.dataseg.pagesize - 1);
5576 last = expld.dataseg.end & (expld.dataseg.pagesize - 1);
5577 if (first && last
5578 && ((expld.dataseg.base & ~(expld.dataseg.pagesize - 1))
5579 != (expld.dataseg.end & ~(expld.dataseg.pagesize - 1)))
5580 && first + last <= expld.dataseg.pagesize)
5581 {
5582 expld.dataseg.phase = exp_dataseg_adjust;
5583 lang_reset_memory_regions ();
5584 one_lang_size_sections_pass (relax, check_regions);
5585 }
5586 else
5587 expld.dataseg.phase = exp_dataseg_done;
5588 }
5589 else
5590 expld.dataseg.phase = exp_dataseg_done;
5591}
5592
5593static lang_output_section_statement_type *current_section;
5594static lang_assignment_statement_type *current_assign;
5595static bfd_boolean prefer_next_section;
5596
5597/* Worker function for lang_do_assignments. Recursiveness goes here. */
5598
5599static bfd_vma
5600lang_do_assignments_1 (lang_statement_union_type *s,
5601 lang_output_section_statement_type *current_os,
5602 fill_type *fill,
5603 bfd_vma dot,
5604 bfd_boolean *found_end)
5605{
5606 for (; s != NULL; s = s->header.next)
5607 {
5608 switch (s->header.type)
5609 {
5610 case lang_constructors_statement_enum:
5611 dot = lang_do_assignments_1 (constructor_list.head,
5612 current_os, fill, dot, found_end);
5613 break;
5614
5615 case lang_output_section_statement_enum:
5616 {
5617 lang_output_section_statement_type *os;
5618
5619 os = &(s->output_section_statement);
5620 os->after_end = *found_end;
5621 if (os->bfd_section != NULL && !os->ignored)
5622 {
5623 if ((os->bfd_section->flags & SEC_ALLOC) != 0)
5624 {
5625 current_section = os;
5626 prefer_next_section = FALSE;
5627 }
5628 dot = os->bfd_section->vma;
5629
5630 lang_do_assignments_1 (os->children.head,
5631 os, os->fill, dot, found_end);
5632
5633 /* .tbss sections effectively have zero size. */
5634 if (!IS_TBSS (os->bfd_section)
5635 || bfd_link_relocatable (&link_info))
5636 dot += TO_ADDR (os->bfd_section->size);
5637
5638 if (os->update_dot_tree != NULL)
5639 exp_fold_tree (os->update_dot_tree, bfd_abs_section_ptr,
5640 &dot);
5641 }
5642 }
5643 break;
5644
5645 case lang_wild_statement_enum:
5646
5647 dot = lang_do_assignments_1 (s->wild_statement.children.head,
5648 current_os, fill, dot, found_end);
5649 break;
5650
5651 case lang_object_symbols_statement_enum:
5652 case lang_output_statement_enum:
5653 case lang_target_statement_enum:
5654 break;
5655
5656 case lang_data_statement_enum:
5657 exp_fold_tree (s->data_statement.exp, bfd_abs_section_ptr, &dot);
5658 if (expld.result.valid_p)
5659 {
5660 s->data_statement.value = expld.result.value;
5661 if (expld.result.section != NULL)
5662 s->data_statement.value += expld.result.section->vma;
5663 }
5664 else
5665 einfo (_("%F%P: invalid data statement\n"));
5666 {
5667 unsigned int size;
5668 switch (s->data_statement.type)
5669 {
5670 default:
5671 abort ();
5672 case QUAD:
5673 case SQUAD:
5674 size = QUAD_SIZE;
5675 break;
5676 case LONG:
5677 size = LONG_SIZE;
5678 break;
5679 case SHORT:
5680 size = SHORT_SIZE;
5681 break;
5682 case BYTE:
5683 size = BYTE_SIZE;
5684 break;
5685 }
5686 if (size < TO_SIZE ((unsigned) 1))
5687 size = TO_SIZE ((unsigned) 1);
5688 dot += TO_ADDR (size);
5689 }
5690 break;
5691
5692 case lang_reloc_statement_enum:
5693 exp_fold_tree (s->reloc_statement.addend_exp,
5694 bfd_abs_section_ptr, &dot);
5695 if (expld.result.valid_p)
5696 s->reloc_statement.addend_value = expld.result.value;
5697 else
5698 einfo (_("%F%P: invalid reloc statement\n"));
5699 dot += TO_ADDR (bfd_get_reloc_size (s->reloc_statement.howto));
5700 break;
5701
5702 case lang_input_section_enum:
5703 {
5704 asection *in = s->input_section.section;
5705
5706 if ((in->flags & SEC_EXCLUDE) == 0)
5707 dot += TO_ADDR (in->size);
5708 }
5709 break;
5710
5711 case lang_input_statement_enum:
5712 break;
5713
5714 case lang_fill_statement_enum:
5715 fill = s->fill_statement.fill;
5716 break;
5717
5718 case lang_assignment_statement_enum:
5719 current_assign = &s->assignment_statement;
5720 if (current_assign->exp->type.node_class != etree_assert)
5721 {
5722 const char *p = current_assign->exp->assign.dst;
5723
5724 if (current_os == abs_output_section && p[0] == '.' && p[1] == 0)
5725 prefer_next_section = TRUE;
5726
5727 while (*p == '_')
5728 ++p;
5729 if (strcmp (p, "end") == 0)
5730 *found_end = TRUE;
5731 }
5732 exp_fold_tree (s->assignment_statement.exp,
5733 current_os->bfd_section,
5734 &dot);
5735 break;
5736
5737 case lang_padding_statement_enum:
5738 dot += TO_ADDR (s->padding_statement.size);
5739 break;
5740
5741 case lang_group_statement_enum:
5742 dot = lang_do_assignments_1 (s->group_statement.children.head,
5743 current_os, fill, dot, found_end);
5744 break;
5745
5746 case lang_insert_statement_enum:
5747 break;
5748
5749 case lang_address_statement_enum:
5750 break;
5751
5752 default:
5753 FAIL ();
5754 break;
5755 }
5756 }
5757 return dot;
5758}
5759
5760void
5761lang_do_assignments (lang_phase_type phase)
5762{
5763 bfd_boolean found_end = FALSE;
5764
5765 current_section = NULL;
5766 prefer_next_section = FALSE;
5767 expld.phase = phase;
5768 lang_statement_iteration++;
5769 lang_do_assignments_1 (statement_list.head,
5770 abs_output_section, NULL, 0, &found_end);
5771}
5772
5773/* For an assignment statement outside of an output section statement,
5774 choose the best of neighbouring output sections to use for values
5775 of "dot". */
5776
5777asection *
5778section_for_dot (void)
5779{
5780 asection *s;
5781
5782 /* Assignments belong to the previous output section, unless there
5783 has been an assignment to "dot", in which case following
5784 assignments belong to the next output section. (The assumption
5785 is that an assignment to "dot" is setting up the address for the
5786 next output section.) Except that past the assignment to "_end"
5787 we always associate with the previous section. This exception is
5788 for targets like SH that define an alloc .stack or other
5789 weirdness after non-alloc sections. */
5790 if (current_section == NULL || prefer_next_section)
5791 {
5792 lang_statement_union_type *stmt;
5793 lang_output_section_statement_type *os;
5794
5795 for (stmt = (lang_statement_union_type *) current_assign;
5796 stmt != NULL;
5797 stmt = stmt->header.next)
5798 if (stmt->header.type == lang_output_section_statement_enum)
5799 break;
5800
5801 os = &stmt->output_section_statement;
5802 while (os != NULL
5803 && !os->after_end
5804 && (os->bfd_section == NULL
5805 || (os->bfd_section->flags & SEC_EXCLUDE) != 0
5806 || bfd_section_removed_from_list (link_info.output_bfd,
5807 os->bfd_section)))
5808 os = os->next;
5809
5810 if (current_section == NULL || os == NULL || !os->after_end)
5811 {
5812 if (os != NULL)
5813 s = os->bfd_section;
5814 else
5815 s = link_info.output_bfd->section_last;
5816 while (s != NULL
5817 && ((s->flags & SEC_ALLOC) == 0
5818 || (s->flags & SEC_THREAD_LOCAL) != 0))
5819 s = s->prev;
5820 if (s != NULL)
5821 return s;
5822
5823 return bfd_abs_section_ptr;
5824 }
5825 }
5826
5827 s = current_section->bfd_section;
5828
5829 /* The section may have been stripped. */
5830 while (s != NULL
5831 && ((s->flags & SEC_EXCLUDE) != 0
5832 || (s->flags & SEC_ALLOC) == 0
5833 || (s->flags & SEC_THREAD_LOCAL) != 0
5834 || bfd_section_removed_from_list (link_info.output_bfd, s)))
5835 s = s->prev;
5836 if (s == NULL)
5837 s = link_info.output_bfd->sections;
5838 while (s != NULL
5839 && ((s->flags & SEC_ALLOC) == 0
5840 || (s->flags & SEC_THREAD_LOCAL) != 0))
5841 s = s->next;
5842 if (s != NULL)
5843 return s;
5844
5845 return bfd_abs_section_ptr;
5846}
5847
5848/* Fix any .startof. or .sizeof. symbols. When the assemblers see the
5849 operator .startof. (section_name), it produces an undefined symbol
5850 .startof.section_name. Similarly, when it sees
5851 .sizeof. (section_name), it produces an undefined symbol
5852 .sizeof.section_name. For all the output sections, we look for
5853 such symbols, and set them to the correct value. */
5854
5855static void
5856lang_set_startof (void)
5857{
5858 asection *s;
5859
5860 if (bfd_link_relocatable (&link_info))
5861 return;
5862
5863 for (s = link_info.output_bfd->sections; s != NULL; s = s->next)
5864 {
5865 const char *secname;
5866 char *buf;
5867 struct bfd_link_hash_entry *h;
5868
5869 secname = bfd_get_section_name (link_info.output_bfd, s);
5870 buf = (char *) xmalloc (10 + strlen (secname));
5871
5872 sprintf (buf, ".startof.%s", secname);
5873 h = bfd_link_hash_lookup (link_info.hash, buf, FALSE, FALSE, TRUE);
5874 if (h != NULL && h->type == bfd_link_hash_undefined)
5875 {
5876 h->type = bfd_link_hash_defined;
5877 h->u.def.value = 0;
5878 h->u.def.section = s;
5879 }
5880
5881 sprintf (buf, ".sizeof.%s", secname);
5882 h = bfd_link_hash_lookup (link_info.hash, buf, FALSE, FALSE, TRUE);
5883 if (h != NULL && h->type == bfd_link_hash_undefined)
5884 {
5885 h->type = bfd_link_hash_defined;
5886 h->u.def.value = TO_ADDR (s->size);
5887 h->u.def.section = bfd_abs_section_ptr;
5888 }
5889
5890 free (buf);
5891 }
5892}
5893
5894static void
5895lang_end (void)
5896{
5897 struct bfd_link_hash_entry *h;
5898 bfd_boolean warn;
5899
5900 if ((bfd_link_relocatable (&link_info) && !link_info.gc_sections)
5901 || bfd_link_dll (&link_info))
5902 warn = entry_from_cmdline;
5903 else
5904 warn = TRUE;
5905
5906 /* Force the user to specify a root when generating a relocatable with
5907 --gc-sections. */
5908 if (link_info.gc_sections && bfd_link_relocatable (&link_info)
5909 && !(entry_from_cmdline || undef_from_cmdline))
5910 einfo (_("%P%F: gc-sections requires either an entry or "
5911 "an undefined symbol\n"));
5912
5913 if (entry_symbol.name == NULL)
5914 {
5915 /* No entry has been specified. Look for the default entry, but
5916 don't warn if we don't find it. */
5917 entry_symbol.name = entry_symbol_default;
5918 warn = FALSE;
5919 }
5920
5921 h = bfd_link_hash_lookup (link_info.hash, entry_symbol.name,
5922 FALSE, FALSE, TRUE);
5923 if (h != NULL
5924 && (h->type == bfd_link_hash_defined
5925 || h->type == bfd_link_hash_defweak)
5926 && h->u.def.section->output_section != NULL)
5927 {
5928 bfd_vma val;
5929
5930 val = (h->u.def.value
5931 + bfd_get_section_vma (link_info.output_bfd,
5932 h->u.def.section->output_section)
5933 + h->u.def.section->output_offset);
5934 if (!bfd_set_start_address (link_info.output_bfd, val))
5935 einfo (_("%P%F:%s: can't set start address\n"), entry_symbol.name);
5936 }
5937 else
5938 {
5939 bfd_vma val;
5940 const char *send;
5941
5942 /* We couldn't find the entry symbol. Try parsing it as a
5943 number. */
5944 val = bfd_scan_vma (entry_symbol.name, &send, 0);
5945 if (*send == '\0')
5946 {
5947 if (!bfd_set_start_address (link_info.output_bfd, val))
5948 einfo (_("%P%F: can't set start address\n"));
5949 }
5950 else
5951 {
5952 asection *ts;
5953
5954 /* Can't find the entry symbol, and it's not a number. Use
5955 the first address in the text section. */
5956 ts = bfd_get_section_by_name (link_info.output_bfd, entry_section);
5957 if (ts != NULL)
5958 {
5959 if (warn)
5960 einfo (_("%P: warning: cannot find entry symbol %s;"
5961 " defaulting to %V\n"),
5962 entry_symbol.name,
5963 bfd_get_section_vma (link_info.output_bfd, ts));
5964 if (!(bfd_set_start_address
5965 (link_info.output_bfd,
5966 bfd_get_section_vma (link_info.output_bfd, ts))))
5967 einfo (_("%P%F: can't set start address\n"));
5968 }
5969 else
5970 {
5971 if (warn)
5972 einfo (_("%P: warning: cannot find entry symbol %s;"
5973 " not setting start address\n"),
5974 entry_symbol.name);
5975 }
5976 }
5977 }
5978}
5979
5980/* This is a small function used when we want to ignore errors from
5981 BFD. */
5982
5983static void
5984ignore_bfd_errors (const char *s ATTRIBUTE_UNUSED, ...)
5985{
5986 /* Don't do anything. */
5987}
5988
5989/* Check that the architecture of all the input files is compatible
5990 with the output file. Also call the backend to let it do any
5991 other checking that is needed. */
5992
5993static void
5994lang_check (void)
5995{
5996 lang_statement_union_type *file;
5997 bfd *input_bfd;
5998 const bfd_arch_info_type *compatible;
5999
6000 for (file = file_chain.head; file != NULL; file = file->input_statement.next)
6001 {
6002#ifdef ENABLE_PLUGINS
6003 /* Don't check format of files claimed by plugin. */
6004 if (file->input_statement.flags.claimed)
6005 continue;
6006#endif /* ENABLE_PLUGINS */
6007 input_bfd = file->input_statement.the_bfd;
6008 compatible
6009 = bfd_arch_get_compatible (input_bfd, link_info.output_bfd,
6010 command_line.accept_unknown_input_arch);
6011
6012 /* In general it is not possible to perform a relocatable
6013 link between differing object formats when the input
6014 file has relocations, because the relocations in the
6015 input format may not have equivalent representations in
6016 the output format (and besides BFD does not translate
6017 relocs for other link purposes than a final link). */
6018 if ((bfd_link_relocatable (&link_info)
6019 || link_info.emitrelocations)
6020 && (compatible == NULL
6021 || (bfd_get_flavour (input_bfd)
6022 != bfd_get_flavour (link_info.output_bfd)))
6023 && (bfd_get_file_flags (input_bfd) & HAS_RELOC) != 0)
6024 {
6025 einfo (_("%P%F: Relocatable linking with relocations from"
6026 " format %s (%B) to format %s (%B) is not supported\n"),
6027 bfd_get_target (input_bfd), input_bfd,
6028 bfd_get_target (link_info.output_bfd), link_info.output_bfd);
6029 /* einfo with %F exits. */
6030 }
6031
6032 if (compatible == NULL)
6033 {
6034 if (command_line.warn_mismatch)
6035 einfo (_("%P%X: %s architecture of input file `%B'"
6036 " is incompatible with %s output\n"),
6037 bfd_printable_name (input_bfd), input_bfd,
6038 bfd_printable_name (link_info.output_bfd));
6039 }
6040 else if (bfd_count_sections (input_bfd))
6041 {
6042 /* If the input bfd has no contents, it shouldn't set the
6043 private data of the output bfd. */
6044
6045 bfd_error_handler_type pfn = NULL;
6046
6047 /* If we aren't supposed to warn about mismatched input
6048 files, temporarily set the BFD error handler to a
6049 function which will do nothing. We still want to call
6050 bfd_merge_private_bfd_data, since it may set up
6051 information which is needed in the output file. */
6052 if (!command_line.warn_mismatch)
6053 pfn = bfd_set_error_handler (ignore_bfd_errors);
6054 if (!bfd_merge_private_bfd_data (input_bfd, link_info.output_bfd))
6055 {
6056 if (command_line.warn_mismatch)
6057 einfo (_("%P%X: failed to merge target specific data"
6058 " of file %B\n"), input_bfd);
6059 }
6060 if (!command_line.warn_mismatch)
6061 bfd_set_error_handler (pfn);
6062 }
6063 }
6064}
6065
6066/* Look through all the global common symbols and attach them to the
6067 correct section. The -sort-common command line switch may be used
6068 to roughly sort the entries by alignment. */
6069
6070static void
6071lang_common (void)
6072{
6073 if (command_line.inhibit_common_definition)
6074 return;
6075 if (bfd_link_relocatable (&link_info)
6076 && !command_line.force_common_definition)
6077 return;
6078
6079 if (!config.sort_common)
6080 bfd_link_hash_traverse (link_info.hash, lang_one_common, NULL);
6081 else
6082 {
6083 unsigned int power;
6084
6085 if (config.sort_common == sort_descending)
6086 {
6087 for (power = 4; power > 0; power--)
6088 bfd_link_hash_traverse (link_info.hash, lang_one_common, &power);
6089
6090 power = 0;
6091 bfd_link_hash_traverse (link_info.hash, lang_one_common, &power);
6092 }
6093 else
6094 {
6095 for (power = 0; power <= 4; power++)
6096 bfd_link_hash_traverse (link_info.hash, lang_one_common, &power);
6097
6098 power = (unsigned int) -1;
6099 bfd_link_hash_traverse (link_info.hash, lang_one_common, &power);
6100 }
6101 }
6102}
6103
6104/* Place one common symbol in the correct section. */
6105
6106static bfd_boolean
6107lang_one_common (struct bfd_link_hash_entry *h, void *info)
6108{
6109 unsigned int power_of_two;
6110 bfd_vma size;
6111 asection *section;
6112
6113 if (h->type != bfd_link_hash_common)
6114 return TRUE;
6115
6116 size = h->u.c.size;
6117 power_of_two = h->u.c.p->alignment_power;
6118
6119 if (config.sort_common == sort_descending
6120 && power_of_two < *(unsigned int *) info)
6121 return TRUE;
6122 else if (config.sort_common == sort_ascending
6123 && power_of_two > *(unsigned int *) info)
6124 return TRUE;
6125
6126 section = h->u.c.p->section;
6127 if (!bfd_define_common_symbol (link_info.output_bfd, &link_info, h))
6128 einfo (_("%P%F: Could not define common symbol `%T': %E\n"),
6129 h->root.string);
6130
6131 if (config.map_file != NULL)
6132 {
6133 static bfd_boolean header_printed;
6134 int len;
6135 char *name;
6136 char buf[50];
6137
6138 if (!header_printed)
6139 {
6140 minfo (_("\nAllocating common symbols\n"));
6141 minfo (_("Common symbol size file\n\n"));
6142 header_printed = TRUE;
6143 }
6144
6145 name = bfd_demangle (link_info.output_bfd, h->root.string,
6146 DMGL_ANSI | DMGL_PARAMS);
6147 if (name == NULL)
6148 {
6149 minfo ("%s", h->root.string);
6150 len = strlen (h->root.string);
6151 }
6152 else
6153 {
6154 minfo ("%s", name);
6155 len = strlen (name);
6156 free (name);
6157 }
6158
6159 if (len >= 19)
6160 {
6161 print_nl ();
6162 len = 0;
6163 }
6164 while (len < 20)
6165 {
6166 print_space ();
6167 ++len;
6168 }
6169
6170 minfo ("0x");
6171 if (size <= 0xffffffff)
6172 sprintf (buf, "%lx", (unsigned long) size);
6173 else
6174 sprintf_vma (buf, size);
6175 minfo ("%s", buf);
6176 len = strlen (buf);
6177
6178 while (len < 16)
6179 {
6180 print_space ();
6181 ++len;
6182 }
6183
6184 minfo ("%B\n", section->owner);
6185 }
6186
6187 return TRUE;
6188}
6189
6190/* Handle a single orphan section S, placing the orphan into an appropriate
6191 output section. The effects of the --orphan-handling command line
6192 option are handled here. */
6193
6194static void
6195ldlang_place_orphan (asection *s)
6196{
6197 if (config.orphan_handling == orphan_handling_discard)
6198 {
6199 lang_output_section_statement_type *os;
6200 os = lang_output_section_statement_lookup (DISCARD_SECTION_NAME, 0,
6201 TRUE);
6202 if (os->addr_tree == NULL
6203 && (bfd_link_relocatable (&link_info)
6204 || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0))
6205 os->addr_tree = exp_intop (0);
6206 lang_add_section (&os->children, s, NULL, os);
6207 }
6208 else
6209 {
6210 lang_output_section_statement_type *os;
6211 const char *name = s->name;
6212 int constraint = 0;
6213
6214 if (config.orphan_handling == orphan_handling_error)
6215 einfo ("%X%P: error: unplaced orphan section `%A' from `%B'.\n",
6216 s, s->owner);
6217
6218 if (config.unique_orphan_sections || unique_section_p (s, NULL))
6219 constraint = SPECIAL;
6220
6221 os = ldemul_place_orphan (s, name, constraint);
6222 if (os == NULL)
6223 {
6224 os = lang_output_section_statement_lookup (name, constraint, TRUE);
6225 if (os->addr_tree == NULL
6226 && (bfd_link_relocatable (&link_info)
6227 || (s->flags & (SEC_LOAD | SEC_ALLOC)) == 0))
6228 os->addr_tree = exp_intop (0);
6229 lang_add_section (&os->children, s, NULL, os);
6230 }
6231
6232 if (config.orphan_handling == orphan_handling_warn)
6233 einfo ("%P: warning: orphan section `%A' from `%B' being "
6234 "placed in section `%s'.\n",
6235 s, s->owner, os->name);
6236 }
6237}
6238
6239/* Run through the input files and ensure that every input section has
6240 somewhere to go. If one is found without a destination then create
6241 an input request and place it into the statement tree. */
6242
6243static void
6244lang_place_orphans (void)
6245{
6246 LANG_FOR_EACH_INPUT_STATEMENT (file)
6247 {
6248 asection *s;
6249
6250 for (s = file->the_bfd->sections; s != NULL; s = s->next)
6251 {
6252 if (s->output_section == NULL)
6253 {
6254 /* This section of the file is not attached, root
6255 around for a sensible place for it to go. */
6256
6257 if (file->flags.just_syms)
6258 bfd_link_just_syms (file->the_bfd, s, &link_info);
6259 else if ((s->flags & SEC_EXCLUDE) != 0)
6260 s->output_section = bfd_abs_section_ptr;
6261 else if (strcmp (s->name, "COMMON") == 0)
6262 {
6263 /* This is a lonely common section which must have
6264 come from an archive. We attach to the section
6265 with the wildcard. */
6266 if (!bfd_link_relocatable (&link_info)
6267 || command_line.force_common_definition)
6268 {
6269 if (default_common_section == NULL)
6270 default_common_section
6271 = lang_output_section_statement_lookup (".bss", 0,
6272 TRUE);
6273 lang_add_section (&default_common_section->children, s,
6274 NULL, default_common_section);
6275 }
6276 }
6277 else
6278 ldlang_place_orphan (s);
6279 }
6280 }
6281 }
6282}
6283
6284void
6285lang_set_flags (lang_memory_region_type *ptr, const char *flags, int invert)
6286{
6287 flagword *ptr_flags;
6288
6289 ptr_flags = invert ? &ptr->not_flags : &ptr->flags;
6290
6291 while (*flags)
6292 {
6293 switch (*flags)
6294 {
6295 /* PR 17900: An exclamation mark in the attributes reverses
6296 the sense of any of the attributes that follow. */
6297 case '!':
6298 invert = !invert;
6299 ptr_flags = invert ? &ptr->not_flags : &ptr->flags;
6300 break;
6301
6302 case 'A': case 'a':
6303 *ptr_flags |= SEC_ALLOC;
6304 break;
6305
6306 case 'R': case 'r':
6307 *ptr_flags |= SEC_READONLY;
6308 break;
6309
6310 case 'W': case 'w':
6311 *ptr_flags |= SEC_DATA;
6312 break;
6313
6314 case 'X': case 'x':
6315 *ptr_flags |= SEC_CODE;
6316 break;
6317
6318 case 'L': case 'l':
6319 case 'I': case 'i':
6320 *ptr_flags |= SEC_LOAD;
6321 break;
6322
6323 default:
6324 einfo (_("%P%F: invalid character %c (%d) in flags\n"),
6325 *flags, *flags);
6326 break;
6327 }
6328 flags++;
6329 }
6330}
6331
6332/* Call a function on each input file. This function will be called
6333 on an archive, but not on the elements. */
6334
6335void
6336lang_for_each_input_file (void (*func) (lang_input_statement_type *))
6337{
6338 lang_input_statement_type *f;
6339
6340 for (f = (lang_input_statement_type *) input_file_chain.head;
6341 f != NULL;
6342 f = (lang_input_statement_type *) f->next_real_file)
6343 func (f);
6344}
6345
6346/* Call a function on each file. The function will be called on all
6347 the elements of an archive which are included in the link, but will
6348 not be called on the archive file itself. */
6349
6350void
6351lang_for_each_file (void (*func) (lang_input_statement_type *))
6352{
6353 LANG_FOR_EACH_INPUT_STATEMENT (f)
6354 {
6355 func (f);
6356 }
6357}
6358
6359void
6360ldlang_add_file (lang_input_statement_type *entry)
6361{
6362 lang_statement_append (&file_chain,
6363 (lang_statement_union_type *) entry,
6364 &entry->next);
6365
6366 /* The BFD linker needs to have a list of all input BFDs involved in
6367 a link. */
6368 ASSERT (entry->the_bfd->link.next == NULL);
6369 ASSERT (entry->the_bfd != link_info.output_bfd);
6370
6371 *link_info.input_bfds_tail = entry->the_bfd;
6372 link_info.input_bfds_tail = &entry->the_bfd->link.next;
6373 entry->the_bfd->usrdata = entry;
6374 bfd_set_gp_size (entry->the_bfd, g_switch_value);
6375
6376 /* Look through the sections and check for any which should not be
6377 included in the link. We need to do this now, so that we can
6378 notice when the backend linker tries to report multiple
6379 definition errors for symbols which are in sections we aren't
6380 going to link. FIXME: It might be better to entirely ignore
6381 symbols which are defined in sections which are going to be
6382 discarded. This would require modifying the backend linker for
6383 each backend which might set the SEC_LINK_ONCE flag. If we do
6384 this, we should probably handle SEC_EXCLUDE in the same way. */
6385
6386 bfd_map_over_sections (entry->the_bfd, section_already_linked, entry);
6387}
6388
6389void
6390lang_add_output (const char *name, int from_script)
6391{
6392 /* Make -o on command line override OUTPUT in script. */
6393 if (!had_output_filename || !from_script)
6394 {
6395 output_filename = name;
6396 had_output_filename = TRUE;
6397 }
6398}
6399
6400static int
6401topower (int x)
6402{
6403 unsigned int i = 1;
6404 int l;
6405
6406 if (x < 0)
6407 return -1;
6408
6409 for (l = 0; l < 32; l++)
6410 {
6411 if (i >= (unsigned int) x)
6412 return l;
6413 i <<= 1;
6414 }
6415
6416 return 0;
6417}
6418
6419lang_output_section_statement_type *
6420lang_enter_output_section_statement (const char *output_section_statement_name,
6421 etree_type *address_exp,
6422 enum section_type sectype,
6423 etree_type *align,
6424 etree_type *subalign,
6425 etree_type *ebase,
6426 int constraint,
6427 int align_with_input)
6428{
6429 lang_output_section_statement_type *os;
6430
6431 os = lang_output_section_statement_lookup (output_section_statement_name,
6432 constraint, TRUE);
6433 current_section = os;
6434
6435 if (os->addr_tree == NULL)
6436 {
6437 os->addr_tree = address_exp;
6438 }
6439 os->sectype = sectype;
6440 if (sectype != noload_section)
6441 os->flags = SEC_NO_FLAGS;
6442 else
6443 os->flags = SEC_NEVER_LOAD;
6444 os->block_value = 1;
6445
6446 /* Make next things chain into subchain of this. */
6447 push_stat_ptr (&os->children);
6448
6449 os->align_lma_with_input = align_with_input == ALIGN_WITH_INPUT;
6450 if (os->align_lma_with_input && align != NULL)
6451 einfo (_("%F%P:%S: error: align with input and explicit align specified\n"),
6452 NULL);
6453
6454 os->subsection_alignment =
6455 topower (exp_get_value_int (subalign, -1, "subsection alignment"));
6456 os->section_alignment =
6457 topower (exp_get_value_int (align, -1, "section alignment"));
6458
6459 os->load_base = ebase;
6460 return os;
6461}
6462
6463void
6464lang_final (void)
6465{
6466 lang_output_statement_type *new_stmt;
6467
6468 new_stmt = new_stat (lang_output_statement, stat_ptr);
6469 new_stmt->name = output_filename;
6470}
6471
6472/* Reset the current counters in the regions. */
6473
6474void
6475lang_reset_memory_regions (void)
6476{
6477 lang_memory_region_type *p = lang_memory_region_list;
6478 asection *o;
6479 lang_output_section_statement_type *os;
6480
6481 for (p = lang_memory_region_list; p != NULL; p = p->next)
6482 {
6483 p->current = p->origin;
6484 p->last_os = NULL;
6485 }
6486
6487 for (os = &lang_output_section_statement.head->output_section_statement;
6488 os != NULL;
6489 os = os->next)
6490 {
6491 os->processed_vma = FALSE;
6492 os->processed_lma = FALSE;
6493 }
6494
6495 for (o = link_info.output_bfd->sections; o != NULL; o = o->next)
6496 {
6497 /* Save the last size for possible use by bfd_relax_section. */
6498 o->rawsize = o->size;
6499 o->size = 0;
6500 }
6501}
6502
6503/* Worker for lang_gc_sections_1. */
6504
6505static void
6506gc_section_callback (lang_wild_statement_type *ptr,
6507 struct wildcard_list *sec ATTRIBUTE_UNUSED,
6508 asection *section,
6509 struct flag_info *sflag_info ATTRIBUTE_UNUSED,
6510 lang_input_statement_type *file ATTRIBUTE_UNUSED,
6511 void *data ATTRIBUTE_UNUSED)
6512{
6513 /* If the wild pattern was marked KEEP, the member sections
6514 should be as well. */
6515 if (ptr->keep_sections)
6516 section->flags |= SEC_KEEP;
6517}
6518
6519/* Iterate over sections marking them against GC. */
6520
6521static void
6522lang_gc_sections_1 (lang_statement_union_type *s)
6523{
6524 for (; s != NULL; s = s->header.next)
6525 {
6526 switch (s->header.type)
6527 {
6528 case lang_wild_statement_enum:
6529 walk_wild (&s->wild_statement, gc_section_callback, NULL);
6530 break;
6531 case lang_constructors_statement_enum:
6532 lang_gc_sections_1 (constructor_list.head);
6533 break;
6534 case lang_output_section_statement_enum:
6535 lang_gc_sections_1 (s->output_section_statement.children.head);
6536 break;
6537 case lang_group_statement_enum:
6538 lang_gc_sections_1 (s->group_statement.children.head);
6539 break;
6540 default:
6541 break;
6542 }
6543 }
6544}
6545
6546static void
6547lang_gc_sections (void)
6548{
6549 /* Keep all sections so marked in the link script. */
6550 lang_gc_sections_1 (statement_list.head);
6551
6552 /* SEC_EXCLUDE is ignored when doing a relocatable link, except in
6553 the special case of debug info. (See bfd/stabs.c)
6554 Twiddle the flag here, to simplify later linker code. */
6555 if (bfd_link_relocatable (&link_info))
6556 {
6557 LANG_FOR_EACH_INPUT_STATEMENT (f)
6558 {
6559 asection *sec;
6560#ifdef ENABLE_PLUGINS
6561 if (f->flags.claimed)
6562 continue;
6563#endif
6564 for (sec = f->the_bfd->sections; sec != NULL; sec = sec->next)
6565 if ((sec->flags & SEC_DEBUGGING) == 0)
6566 sec->flags &= ~SEC_EXCLUDE;
6567 }
6568 }
6569
6570 if (link_info.gc_sections)
6571 bfd_gc_sections (link_info.output_bfd, &link_info);
6572}
6573
6574/* Worker for lang_find_relro_sections_1. */
6575
6576static void
6577find_relro_section_callback (lang_wild_statement_type *ptr ATTRIBUTE_UNUSED,
6578 struct wildcard_list *sec ATTRIBUTE_UNUSED,
6579 asection *section,
6580 struct flag_info *sflag_info ATTRIBUTE_UNUSED,
6581 lang_input_statement_type *file ATTRIBUTE_UNUSED,
6582 void *data)
6583{
6584 /* Discarded, excluded and ignored sections effectively have zero
6585 size. */
6586 if (section->output_section != NULL
6587 && section->output_section->owner == link_info.output_bfd
6588 && (section->output_section->flags & SEC_EXCLUDE) == 0
6589 && !IGNORE_SECTION (section)
6590 && section->size != 0)
6591 {
6592 bfd_boolean *has_relro_section = (bfd_boolean *) data;
6593 *has_relro_section = TRUE;
6594 }
6595}
6596
6597/* Iterate over sections for relro sections. */
6598
6599static void
6600lang_find_relro_sections_1 (lang_statement_union_type *s,
6601 bfd_boolean *has_relro_section)
6602{
6603 if (*has_relro_section)
6604 return;
6605
6606 for (; s != NULL; s = s->header.next)
6607 {
6608 if (s == expld.dataseg.relro_end_stat)
6609 break;
6610
6611 switch (s->header.type)
6612 {
6613 case lang_wild_statement_enum:
6614 walk_wild (&s->wild_statement,
6615 find_relro_section_callback,
6616 has_relro_section);
6617 break;
6618 case lang_constructors_statement_enum:
6619 lang_find_relro_sections_1 (constructor_list.head,
6620 has_relro_section);
6621 break;
6622 case lang_output_section_statement_enum:
6623 lang_find_relro_sections_1 (s->output_section_statement.children.head,
6624 has_relro_section);
6625 break;
6626 case lang_group_statement_enum:
6627 lang_find_relro_sections_1 (s->group_statement.children.head,
6628 has_relro_section);
6629 break;
6630 default:
6631 break;
6632 }
6633 }
6634}
6635
6636static void
6637lang_find_relro_sections (void)
6638{
6639 bfd_boolean has_relro_section = FALSE;
6640
6641 /* Check all sections in the link script. */
6642
6643 lang_find_relro_sections_1 (expld.dataseg.relro_start_stat,
6644 &has_relro_section);
6645
6646 if (!has_relro_section)
6647 link_info.relro = FALSE;
6648}
6649
6650/* Relax all sections until bfd_relax_section gives up. */
6651
6652void
6653lang_relax_sections (bfd_boolean need_layout)
6654{
6655 if (RELAXATION_ENABLED)
6656 {
6657 /* We may need more than one relaxation pass. */
6658 int i = link_info.relax_pass;
6659
6660 /* The backend can use it to determine the current pass. */
6661 link_info.relax_pass = 0;
6662
6663 while (i--)
6664 {
6665 /* Keep relaxing until bfd_relax_section gives up. */
6666 bfd_boolean relax_again;
6667
6668 link_info.relax_trip = -1;
6669 do
6670 {
6671 link_info.relax_trip++;
6672
6673 /* Note: pe-dll.c does something like this also. If you find
6674 you need to change this code, you probably need to change
6675 pe-dll.c also. DJ */
6676
6677 /* Do all the assignments with our current guesses as to
6678 section sizes. */
6679 lang_do_assignments (lang_assigning_phase_enum);
6680
6681 /* We must do this after lang_do_assignments, because it uses
6682 size. */
6683 lang_reset_memory_regions ();
6684
6685 /* Perform another relax pass - this time we know where the
6686 globals are, so can make a better guess. */
6687 relax_again = FALSE;
6688 lang_size_sections (&relax_again, FALSE);
6689 }
6690 while (relax_again);
6691
6692 link_info.relax_pass++;
6693 }
6694 need_layout = TRUE;
6695 }
6696
6697 if (need_layout)
6698 {
6699 /* Final extra sizing to report errors. */
6700 lang_do_assignments (lang_assigning_phase_enum);
6701 lang_reset_memory_regions ();
6702 lang_size_sections (NULL, TRUE);
6703 }
6704}
6705
6706#ifdef ENABLE_PLUGINS
6707/* Find the insert point for the plugin's replacement files. We
6708 place them after the first claimed real object file, or if the
6709 first claimed object is an archive member, after the last real
6710 object file immediately preceding the archive. In the event
6711 no objects have been claimed at all, we return the first dummy
6712 object file on the list as the insert point; that works, but
6713 the callee must be careful when relinking the file_chain as it
6714 is not actually on that chain, only the statement_list and the
6715 input_file list; in that case, the replacement files must be
6716 inserted at the head of the file_chain. */
6717
6718static lang_input_statement_type *
6719find_replacements_insert_point (void)
6720{
6721 lang_input_statement_type *claim1, *lastobject;
6722 lastobject = &input_file_chain.head->input_statement;
6723 for (claim1 = &file_chain.head->input_statement;
6724 claim1 != NULL;
6725 claim1 = &claim1->next->input_statement)
6726 {
6727 if (claim1->flags.claimed)
6728 return claim1->flags.claim_archive ? lastobject : claim1;
6729 /* Update lastobject if this is a real object file. */
6730 if (claim1->the_bfd != NULL && claim1->the_bfd->my_archive == NULL)
6731 lastobject = claim1;
6732 }
6733 /* No files were claimed by the plugin. Choose the last object
6734 file found on the list (maybe the first, dummy entry) as the
6735 insert point. */
6736 return lastobject;
6737}
6738
6739/* Insert SRCLIST into DESTLIST after given element by chaining
6740 on FIELD as the next-pointer. (Counterintuitively does not need
6741 a pointer to the actual after-node itself, just its chain field.) */
6742
6743static void
6744lang_list_insert_after (lang_statement_list_type *destlist,
6745 lang_statement_list_type *srclist,
6746 lang_statement_union_type **field)
6747{
6748 *(srclist->tail) = *field;
6749 *field = srclist->head;
6750 if (destlist->tail == field)
6751 destlist->tail = srclist->tail;
6752}
6753
6754/* Detach new nodes added to DESTLIST since the time ORIGLIST
6755 was taken as a copy of it and leave them in ORIGLIST. */
6756
6757static void
6758lang_list_remove_tail (lang_statement_list_type *destlist,
6759 lang_statement_list_type *origlist)
6760{
6761 union lang_statement_union **savetail;
6762 /* Check that ORIGLIST really is an earlier state of DESTLIST. */
6763 ASSERT (origlist->head == destlist->head);
6764 savetail = origlist->tail;
6765 origlist->head = *(savetail);
6766 origlist->tail = destlist->tail;
6767 destlist->tail = savetail;
6768 *savetail = NULL;
6769}
6770#endif /* ENABLE_PLUGINS */
6771
6772/* Add NAME to the list of garbage collection entry points. */
6773
6774void
6775lang_add_gc_name (const char *name)
6776{
6777 struct bfd_sym_chain *sym;
6778
6779 if (name == NULL)
6780 return;
6781
6782 sym = (struct bfd_sym_chain *) stat_alloc (sizeof (*sym));
6783
6784 sym->next = link_info.gc_sym_list;
6785 sym->name = name;
6786 link_info.gc_sym_list = sym;
6787}
6788
6789/* Check relocations. */
6790
6791static void
6792lang_check_relocs (void)
6793{
6794 if (link_info.check_relocs_after_open_input)
6795 {
6796 bfd *abfd;
6797
6798 for (abfd = link_info.input_bfds;
6799 abfd != (bfd *) NULL; abfd = abfd->link.next)
6800 if (!bfd_link_check_relocs (abfd, &link_info))
6801 {
6802 /* No object output, fail return. */
6803 config.make_executable = FALSE;
6804 /* Note: we do not abort the loop, but rather
6805 continue the scan in case there are other
6806 bad relocations to report. */
6807 }
6808 }
6809}
6810
6811void
6812lang_process (void)
6813{
6814 /* Finalize dynamic list. */
6815 if (link_info.dynamic_list)
6816 lang_finalize_version_expr_head (&link_info.dynamic_list->head);
6817
6818 current_target = default_target;
6819
6820 /* Open the output file. */
6821 lang_for_each_statement (ldlang_open_output);
6822 init_opb ();
6823
6824 ldemul_create_output_section_statements ();
6825
6826 /* Add to the hash table all undefineds on the command line. */
6827 lang_place_undefineds ();
6828
6829 if (!bfd_section_already_linked_table_init ())
6830 einfo (_("%P%F: Failed to create hash table\n"));
6831
6832 /* Create a bfd for each input file. */
6833 current_target = default_target;
6834 open_input_bfds (statement_list.head, OPEN_BFD_NORMAL);
6835
6836#ifdef ENABLE_PLUGINS
6837 if (link_info.lto_plugin_active)
6838 {
6839 lang_statement_list_type added;
6840 lang_statement_list_type files, inputfiles;
6841
6842 /* Now all files are read, let the plugin(s) decide if there
6843 are any more to be added to the link before we call the
6844 emulation's after_open hook. We create a private list of
6845 input statements for this purpose, which we will eventually
6846 insert into the global statment list after the first claimed
6847 file. */
6848 added = *stat_ptr;
6849 /* We need to manipulate all three chains in synchrony. */
6850 files = file_chain;
6851 inputfiles = input_file_chain;
6852 if (plugin_call_all_symbols_read ())
6853 einfo (_("%P%F: %s: plugin reported error after all symbols read\n"),
6854 plugin_error_plugin ());
6855 /* Open any newly added files, updating the file chains. */
6856 open_input_bfds (*added.tail, OPEN_BFD_NORMAL);
6857 /* Restore the global list pointer now they have all been added. */
6858 lang_list_remove_tail (stat_ptr, &added);
6859 /* And detach the fresh ends of the file lists. */
6860 lang_list_remove_tail (&file_chain, &files);
6861 lang_list_remove_tail (&input_file_chain, &inputfiles);
6862 /* Were any new files added? */
6863 if (added.head != NULL)
6864 {
6865 /* If so, we will insert them into the statement list immediately
6866 after the first input file that was claimed by the plugin. */
6867 plugin_insert = find_replacements_insert_point ();
6868 /* If a plugin adds input files without having claimed any, we
6869 don't really have a good idea where to place them. Just putting
6870 them at the start or end of the list is liable to leave them
6871 outside the crtbegin...crtend range. */
6872 ASSERT (plugin_insert != NULL);
6873 /* Splice the new statement list into the old one. */
6874 lang_list_insert_after (stat_ptr, &added,
6875 &plugin_insert->header.next);
6876 /* Likewise for the file chains. */
6877 lang_list_insert_after (&input_file_chain, &inputfiles,
6878 &plugin_insert->next_real_file);
6879 /* We must be careful when relinking file_chain; we may need to
6880 insert the new files at the head of the list if the insert
6881 point chosen is the dummy first input file. */
6882 if (plugin_insert->filename)
6883 lang_list_insert_after (&file_chain, &files, &plugin_insert->next);
6884 else
6885 lang_list_insert_after (&file_chain, &files, &file_chain.head);
6886
6887 /* Rescan archives in case new undefined symbols have appeared. */
6888 open_input_bfds (statement_list.head, OPEN_BFD_RESCAN);
6889 }
6890 }
6891#endif /* ENABLE_PLUGINS */
6892
6893 /* Make sure that nobody has tried to add a symbol to this list
6894 before now. */
6895 ASSERT (link_info.gc_sym_list == NULL);
6896
6897 link_info.gc_sym_list = &entry_symbol;
6898
6899 if (entry_symbol.name == NULL)
6900 {
6901 link_info.gc_sym_list = ldlang_undef_chain_list_head;
6902
6903 /* entry_symbol is normally initialied by a ENTRY definition in the
6904 linker script or the -e command line option. But if neither of
6905 these have been used, the target specific backend may still have
6906 provided an entry symbol via a call to lang_default_entry().
6907 Unfortunately this value will not be processed until lang_end()
6908 is called, long after this function has finished. So detect this
6909 case here and add the target's entry symbol to the list of starting
6910 points for garbage collection resolution. */
6911 lang_add_gc_name (entry_symbol_default);
6912 }
6913
6914 lang_add_gc_name (link_info.init_function);
6915 lang_add_gc_name (link_info.fini_function);
6916
6917 ldemul_after_open ();
6918 if (config.map_file != NULL)
6919 lang_print_asneeded ();
6920
6921 bfd_section_already_linked_table_free ();
6922
6923 /* Make sure that we're not mixing architectures. We call this
6924 after all the input files have been opened, but before we do any
6925 other processing, so that any operations merge_private_bfd_data
6926 does on the output file will be known during the rest of the
6927 link. */
6928 lang_check ();
6929
6930 /* Handle .exports instead of a version script if we're told to do so. */
6931 if (command_line.version_exports_section)
6932 lang_do_version_exports_section ();
6933
6934 /* Build all sets based on the information gathered from the input
6935 files. */
6936 ldctor_build_sets ();
6937
6938 /* PR 13683: We must rerun the assignments prior to running garbage
6939 collection in order to make sure that all symbol aliases are resolved. */
6940 lang_do_assignments (lang_mark_phase_enum);
6941
6942 lang_do_memory_regions();
6943 expld.phase = lang_first_phase_enum;
6944
6945 /* Size up the common data. */
6946 lang_common ();
6947
6948 /* Remove unreferenced sections if asked to. */
6949 lang_gc_sections ();
6950
6951 /* Check relocations. */
6952 lang_check_relocs ();
6953
6954 /* Update wild statements. */
6955 update_wild_statements (statement_list.head);
6956
6957 /* Run through the contours of the script and attach input sections
6958 to the correct output sections. */
6959 lang_statement_iteration++;
6960 map_input_to_output_sections (statement_list.head, NULL, NULL);
6961
6962 process_insert_statements ();
6963
6964 /* Find any sections not attached explicitly and handle them. */
6965 lang_place_orphans ();
6966
6967 if (!bfd_link_relocatable (&link_info))
6968 {
6969 asection *found;
6970
6971 /* Merge SEC_MERGE sections. This has to be done after GC of
6972 sections, so that GCed sections are not merged, but before
6973 assigning dynamic symbols, since removing whole input sections
6974 is hard then. */
6975 bfd_merge_sections (link_info.output_bfd, &link_info);
6976
6977 /* Look for a text section and set the readonly attribute in it. */
6978 found = bfd_get_section_by_name (link_info.output_bfd, ".text");
6979
6980 if (found != NULL)
6981 {
6982 if (config.text_read_only)
6983 found->flags |= SEC_READONLY;
6984 else
6985 found->flags &= ~SEC_READONLY;
6986 }
6987 }
6988
6989 /* Do anything special before sizing sections. This is where ELF
6990 and other back-ends size dynamic sections. */
6991 ldemul_before_allocation ();
6992
6993 /* We must record the program headers before we try to fix the
6994 section positions, since they will affect SIZEOF_HEADERS. */
6995 lang_record_phdrs ();
6996
6997 /* Check relro sections. */
6998 if (link_info.relro && !bfd_link_relocatable (&link_info))
6999 lang_find_relro_sections ();
7000
7001 /* Size up the sections. */
7002 lang_size_sections (NULL, !RELAXATION_ENABLED);
7003
7004 /* See if anything special should be done now we know how big
7005 everything is. This is where relaxation is done. */
7006 ldemul_after_allocation ();
7007
7008 /* Fix any .startof. or .sizeof. symbols. */
7009 lang_set_startof ();
7010
7011 /* Do all the assignments, now that we know the final resting places
7012 of all the symbols. */
7013 lang_do_assignments (lang_final_phase_enum);
7014
7015 ldemul_finish ();
7016
7017 /* Convert absolute symbols to section relative. */
7018 ldexp_finalize_syms ();
7019
7020 /* Make sure that the section addresses make sense. */
7021 if (command_line.check_section_addresses)
7022 lang_check_section_addresses ();
7023
7024 /* Check any required symbols are known. */
7025 ldlang_check_require_defined_symbols ();
7026
7027 lang_end ();
7028}
7029
7030/* EXPORTED TO YACC */
7031
7032void
7033lang_add_wild (struct wildcard_spec *filespec,
7034 struct wildcard_list *section_list,
7035 bfd_boolean keep_sections)
7036{
7037 struct wildcard_list *curr, *next;
7038 lang_wild_statement_type *new_stmt;
7039
7040 /* Reverse the list as the parser puts it back to front. */
7041 for (curr = section_list, section_list = NULL;
7042 curr != NULL;
7043 section_list = curr, curr = next)
7044 {
7045 if (curr->spec.name != NULL && strcmp (curr->spec.name, "COMMON") == 0)
7046 placed_commons = TRUE;
7047
7048 next = curr->next;
7049 curr->next = section_list;
7050 }
7051
7052 if (filespec != NULL && filespec->name != NULL)
7053 {
7054 if (strcmp (filespec->name, "*") == 0)
7055 filespec->name = NULL;
7056 else if (!wildcardp (filespec->name))
7057 lang_has_input_file = TRUE;
7058 }
7059
7060 new_stmt = new_stat (lang_wild_statement, stat_ptr);
7061 new_stmt->filename = NULL;
7062 new_stmt->filenames_sorted = FALSE;
7063 new_stmt->section_flag_list = NULL;
7064 if (filespec != NULL)
7065 {
7066 new_stmt->filename = filespec->name;
7067 new_stmt->filenames_sorted = filespec->sorted == by_name;
7068 new_stmt->section_flag_list = filespec->section_flag_list;
7069 }
7070 new_stmt->section_list = section_list;
7071 new_stmt->keep_sections = keep_sections;
7072 lang_list_init (&new_stmt->children);
7073 analyze_walk_wild_section_handler (new_stmt);
7074}
7075
7076void
7077lang_section_start (const char *name, etree_type *address,
7078 const segment_type *segment)
7079{
7080 lang_address_statement_type *ad;
7081
7082 ad = new_stat (lang_address_statement, stat_ptr);
7083 ad->section_name = name;
7084 ad->address = address;
7085 ad->segment = segment;
7086}
7087
7088/* Set the start symbol to NAME. CMDLINE is nonzero if this is called
7089 because of a -e argument on the command line, or zero if this is
7090 called by ENTRY in a linker script. Command line arguments take
7091 precedence. */
7092
7093void
7094lang_add_entry (const char *name, bfd_boolean cmdline)
7095{
7096 if (entry_symbol.name == NULL
7097 || cmdline
7098 || !entry_from_cmdline)
7099 {
7100 entry_symbol.name = name;
7101 entry_from_cmdline = cmdline;
7102 }
7103}
7104
7105/* Set the default start symbol to NAME. .em files should use this,
7106 not lang_add_entry, to override the use of "start" if neither the
7107 linker script nor the command line specifies an entry point. NAME
7108 must be permanently allocated. */
7109void
7110lang_default_entry (const char *name)
7111{
7112 entry_symbol_default = name;
7113}
7114
7115void
7116lang_add_target (const char *name)
7117{
7118 lang_target_statement_type *new_stmt;
7119
7120 new_stmt = new_stat (lang_target_statement, stat_ptr);
7121 new_stmt->target = name;
7122}
7123
7124void
7125lang_add_map (const char *name)
7126{
7127 while (*name)
7128 {
7129 switch (*name)
7130 {
7131 case 'F':
7132 map_option_f = TRUE;
7133 break;
7134 }
7135 name++;
7136 }
7137}
7138
7139void
7140lang_add_fill (fill_type *fill)
7141{
7142 lang_fill_statement_type *new_stmt;
7143
7144 new_stmt = new_stat (lang_fill_statement, stat_ptr);
7145 new_stmt->fill = fill;
7146}
7147
7148void
7149lang_add_data (int type, union etree_union *exp)
7150{
7151 lang_data_statement_type *new_stmt;
7152
7153 new_stmt = new_stat (lang_data_statement, stat_ptr);
7154 new_stmt->exp = exp;
7155 new_stmt->type = type;
7156}
7157
7158/* Create a new reloc statement. RELOC is the BFD relocation type to
7159 generate. HOWTO is the corresponding howto structure (we could
7160 look this up, but the caller has already done so). SECTION is the
7161 section to generate a reloc against, or NAME is the name of the
7162 symbol to generate a reloc against. Exactly one of SECTION and
7163 NAME must be NULL. ADDEND is an expression for the addend. */
7164
7165void
7166lang_add_reloc (bfd_reloc_code_real_type reloc,
7167 reloc_howto_type *howto,
7168 asection *section,
7169 const char *name,
7170 union etree_union *addend)
7171{
7172 lang_reloc_statement_type *p = new_stat (lang_reloc_statement, stat_ptr);
7173
7174 p->reloc = reloc;
7175 p->howto = howto;
7176 p->section = section;
7177 p->name = name;
7178 p->addend_exp = addend;
7179
7180 p->addend_value = 0;
7181 p->output_section = NULL;
7182 p->output_offset = 0;
7183}
7184
7185lang_assignment_statement_type *
7186lang_add_assignment (etree_type *exp)
7187{
7188 lang_assignment_statement_type *new_stmt;
7189
7190 new_stmt = new_stat (lang_assignment_statement, stat_ptr);
7191 new_stmt->exp = exp;
7192 return new_stmt;
7193}
7194
7195void
7196lang_add_attribute (enum statement_enum attribute)
7197{
7198 new_statement (attribute, sizeof (lang_statement_header_type), stat_ptr);
7199}
7200
7201void
7202lang_startup (const char *name)
7203{
7204 if (first_file->filename != NULL)
7205 {
7206 einfo (_("%P%F: multiple STARTUP files\n"));
7207 }
7208 first_file->filename = name;
7209 first_file->local_sym_name = name;
7210 first_file->flags.real = TRUE;
7211}
7212
7213void
7214lang_float (bfd_boolean maybe)
7215{
7216 lang_float_flag = maybe;
7217}
7218
7219
7220/* Work out the load- and run-time regions from a script statement, and
7221 store them in *LMA_REGION and *REGION respectively.
7222
7223 MEMSPEC is the name of the run-time region, or the value of
7224 DEFAULT_MEMORY_REGION if the statement didn't specify one.
7225 LMA_MEMSPEC is the name of the load-time region, or null if the
7226 statement didn't specify one.HAVE_LMA_P is TRUE if the statement
7227 had an explicit load address.
7228
7229 It is an error to specify both a load region and a load address. */
7230
7231static void
7232lang_get_regions (lang_memory_region_type **region,
7233 lang_memory_region_type **lma_region,
7234 const char *memspec,
7235 const char *lma_memspec,
7236 bfd_boolean have_lma,
7237 bfd_boolean have_vma)
7238{
7239 *lma_region = lang_memory_region_lookup (lma_memspec, FALSE);
7240
7241 /* If no runtime region or VMA has been specified, but the load region
7242 has been specified, then use the load region for the runtime region
7243 as well. */
7244 if (lma_memspec != NULL
7245 && !have_vma
7246 && strcmp (memspec, DEFAULT_MEMORY_REGION) == 0)
7247 *region = *lma_region;
7248 else
7249 *region = lang_memory_region_lookup (memspec, FALSE);
7250
7251 if (have_lma && lma_memspec != 0)
7252 einfo (_("%X%P:%S: section has both a load address and a load region\n"),
7253 NULL);
7254}
7255
7256void
7257lang_leave_output_section_statement (fill_type *fill, const char *memspec,
7258 lang_output_section_phdr_list *phdrs,
7259 const char *lma_memspec)
7260{
7261 lang_get_regions (&current_section->region,
7262 &current_section->lma_region,
7263 memspec, lma_memspec,
7264 current_section->load_base != NULL,
7265 current_section->addr_tree != NULL);
7266
7267 /* If this section has no load region or base, but uses the same
7268 region as the previous section, then propagate the previous
7269 section's load region. */
7270
7271 if (current_section->lma_region == NULL
7272 && current_section->load_base == NULL
7273 && current_section->addr_tree == NULL
7274 && current_section->region == current_section->prev->region)
7275 current_section->lma_region = current_section->prev->lma_region;
7276
7277 current_section->fill = fill;
7278 current_section->phdrs = phdrs;
7279 pop_stat_ptr ();
7280}
7281
7282void
7283lang_statement_append (lang_statement_list_type *list,
7284 lang_statement_union_type *element,
7285 lang_statement_union_type **field)
7286{
7287 *(list->tail) = element;
7288 list->tail = field;
7289}
7290
7291/* Set the output format type. -oformat overrides scripts. */
7292
7293void
7294lang_add_output_format (const char *format,
7295 const char *big,
7296 const char *little,
7297 int from_script)
7298{
7299 if (output_target == NULL || !from_script)
7300 {
7301 if (command_line.endian == ENDIAN_BIG
7302 && big != NULL)
7303 format = big;
7304 else if (command_line.endian == ENDIAN_LITTLE
7305 && little != NULL)
7306 format = little;
7307
7308 output_target = format;
7309 }
7310}
7311
7312void
7313lang_add_insert (const char *where, int is_before)
7314{
7315 lang_insert_statement_type *new_stmt;
7316
7317 new_stmt = new_stat (lang_insert_statement, stat_ptr);
7318 new_stmt->where = where;
7319 new_stmt->is_before = is_before;
7320 saved_script_handle = previous_script_handle;
7321}
7322
7323/* Enter a group. This creates a new lang_group_statement, and sets
7324 stat_ptr to build new statements within the group. */
7325
7326void
7327lang_enter_group (void)
7328{
7329 lang_group_statement_type *g;
7330
7331 g = new_stat (lang_group_statement, stat_ptr);
7332 lang_list_init (&g->children);
7333 push_stat_ptr (&g->children);
7334}
7335
7336/* Leave a group. This just resets stat_ptr to start writing to the
7337 regular list of statements again. Note that this will not work if
7338 groups can occur inside anything else which can adjust stat_ptr,
7339 but currently they can't. */
7340
7341void
7342lang_leave_group (void)
7343{
7344 pop_stat_ptr ();
7345}
7346
7347/* Add a new program header. This is called for each entry in a PHDRS
7348 command in a linker script. */
7349
7350void
7351lang_new_phdr (const char *name,
7352 etree_type *type,
7353 bfd_boolean filehdr,
7354 bfd_boolean phdrs,
7355 etree_type *at,
7356 etree_type *flags)
7357{
7358 struct lang_phdr *n, **pp;
7359 bfd_boolean hdrs;
7360
7361 n = (struct lang_phdr *) stat_alloc (sizeof (struct lang_phdr));
7362 n->next = NULL;
7363 n->name = name;
7364 n->type = exp_get_value_int (type, 0, "program header type");
7365 n->filehdr = filehdr;
7366 n->phdrs = phdrs;
7367 n->at = at;
7368 n->flags = flags;
7369
7370 hdrs = n->type == 1 && (phdrs || filehdr);
7371
7372 for (pp = &lang_phdr_list; *pp != NULL; pp = &(*pp)->next)
7373 if (hdrs
7374 && (*pp)->type == 1
7375 && !((*pp)->filehdr || (*pp)->phdrs))
7376 {
7377 einfo (_("%X%P:%S: PHDRS and FILEHDR are not supported"
7378 " when prior PT_LOAD headers lack them\n"), NULL);
7379 hdrs = FALSE;
7380 }
7381
7382 *pp = n;
7383}
7384
7385/* Record the program header information in the output BFD. FIXME: We
7386 should not be calling an ELF specific function here. */
7387
7388static void
7389lang_record_phdrs (void)
7390{
7391 unsigned int alc;
7392 asection **secs;
7393 lang_output_section_phdr_list *last;
7394 struct lang_phdr *l;
7395 lang_output_section_statement_type *os;
7396
7397 alc = 10;
7398 secs = (asection **) xmalloc (alc * sizeof (asection *));
7399 last = NULL;
7400
7401 for (l = lang_phdr_list; l != NULL; l = l->next)
7402 {
7403 unsigned int c;
7404 flagword flags;
7405 bfd_vma at;
7406
7407 c = 0;
7408 for (os = &lang_output_section_statement.head->output_section_statement;
7409 os != NULL;
7410 os = os->next)
7411 {
7412 lang_output_section_phdr_list *pl;
7413
7414 if (os->constraint < 0)
7415 continue;
7416
7417 pl = os->phdrs;
7418 if (pl != NULL)
7419 last = pl;
7420 else
7421 {
7422 if (os->sectype == noload_section
7423 || os->bfd_section == NULL
7424 || (os->bfd_section->flags & SEC_ALLOC) == 0)
7425 continue;
7426
7427 /* Don't add orphans to PT_INTERP header. */
7428 if (l->type == 3)
7429 continue;
7430
7431 if (last == NULL)
7432 {
7433 lang_output_section_statement_type *tmp_os;
7434
7435 /* If we have not run across a section with a program
7436 header assigned to it yet, then scan forwards to find
7437 one. This prevents inconsistencies in the linker's
7438 behaviour when a script has specified just a single
7439 header and there are sections in that script which are
7440 not assigned to it, and which occur before the first
7441 use of that header. See here for more details:
7442 http://sourceware.org/ml/binutils/2007-02/msg00291.html */
7443 for (tmp_os = os; tmp_os; tmp_os = tmp_os->next)
7444 if (tmp_os->phdrs)
7445 {
7446 last = tmp_os->phdrs;
7447 break;
7448 }
7449 if (last == NULL)
7450 einfo (_("%F%P: no sections assigned to phdrs\n"));
7451 }
7452 pl = last;
7453 }
7454
7455 if (os->bfd_section == NULL)
7456 continue;
7457
7458 for (; pl != NULL; pl = pl->next)
7459 {
7460 if (strcmp (pl->name, l->name) == 0)
7461 {
7462 if (c >= alc)
7463 {
7464 alc *= 2;
7465 secs = (asection **) xrealloc (secs,
7466 alc * sizeof (asection *));
7467 }
7468 secs[c] = os->bfd_section;
7469 ++c;
7470 pl->used = TRUE;
7471 }
7472 }
7473 }
7474
7475 if (l->flags == NULL)
7476 flags = 0;
7477 else
7478 flags = exp_get_vma (l->flags, 0, "phdr flags");
7479
7480 if (l->at == NULL)
7481 at = 0;
7482 else
7483 at = exp_get_vma (l->at, 0, "phdr load address");
7484
7485 if (!bfd_record_phdr (link_info.output_bfd, l->type,
7486 l->flags != NULL, flags, l->at != NULL,
7487 at, l->filehdr, l->phdrs, c, secs))
7488 einfo (_("%F%P: bfd_record_phdr failed: %E\n"));
7489 }
7490
7491 free (secs);
7492
7493 /* Make sure all the phdr assignments succeeded. */
7494 for (os = &lang_output_section_statement.head->output_section_statement;
7495 os != NULL;
7496 os = os->next)
7497 {
7498 lang_output_section_phdr_list *pl;
7499
7500 if (os->constraint < 0
7501 || os->bfd_section == NULL)
7502 continue;
7503
7504 for (pl = os->phdrs;
7505 pl != NULL;
7506 pl = pl->next)
7507 if (!pl->used && strcmp (pl->name, "NONE") != 0)
7508 einfo (_("%X%P: section `%s' assigned to non-existent phdr `%s'\n"),
7509 os->name, pl->name);
7510 }
7511}
7512
7513/* Record a list of sections which may not be cross referenced. */
7514
7515void
7516lang_add_nocrossref (lang_nocrossref_type *l)
7517{
7518 struct lang_nocrossrefs *n;
7519
7520 n = (struct lang_nocrossrefs *) xmalloc (sizeof *n);
7521 n->next = nocrossref_list;
7522 n->list = l;
7523 n->onlyfirst = FALSE;
7524 nocrossref_list = n;
7525
7526 /* Set notice_all so that we get informed about all symbols. */
7527 link_info.notice_all = TRUE;
7528}
7529
7530/* Record a section that cannot be referenced from a list of sections. */
7531
7532void
7533lang_add_nocrossref_to (lang_nocrossref_type *l)
7534{
7535 lang_add_nocrossref (l);
7536 nocrossref_list->onlyfirst = TRUE;
7537}
7538
7539
7540/* Overlay handling. We handle overlays with some static variables. */
7541
7542/* The overlay virtual address. */
7543static etree_type *overlay_vma;
7544/* And subsection alignment. */
7545static etree_type *overlay_subalign;
7546
7547/* An expression for the maximum section size seen so far. */
7548static etree_type *overlay_max;
7549
7550/* A list of all the sections in this overlay. */
7551
7552struct overlay_list {
7553 struct overlay_list *next;
7554 lang_output_section_statement_type *os;
7555};
7556
7557static struct overlay_list *overlay_list;
7558
7559/* Start handling an overlay. */
7560
7561void
7562lang_enter_overlay (etree_type *vma_expr, etree_type *subalign)
7563{
7564 /* The grammar should prevent nested overlays from occurring. */
7565 ASSERT (overlay_vma == NULL
7566 && overlay_subalign == NULL
7567 && overlay_max == NULL);
7568
7569 overlay_vma = vma_expr;
7570 overlay_subalign = subalign;
7571}
7572
7573/* Start a section in an overlay. We handle this by calling
7574 lang_enter_output_section_statement with the correct VMA.
7575 lang_leave_overlay sets up the LMA and memory regions. */
7576
7577void
7578lang_enter_overlay_section (const char *name)
7579{
7580 struct overlay_list *n;
7581 etree_type *size;
7582
7583 lang_enter_output_section_statement (name, overlay_vma, overlay_section,
7584 0, overlay_subalign, 0, 0, 0);
7585
7586 /* If this is the first section, then base the VMA of future
7587 sections on this one. This will work correctly even if `.' is
7588 used in the addresses. */
7589 if (overlay_list == NULL)
7590 overlay_vma = exp_nameop (ADDR, name);
7591
7592 /* Remember the section. */
7593 n = (struct overlay_list *) xmalloc (sizeof *n);
7594 n->os = current_section;
7595 n->next = overlay_list;
7596 overlay_list = n;
7597
7598 size = exp_nameop (SIZEOF, name);
7599
7600 /* Arrange to work out the maximum section end address. */
7601 if (overlay_max == NULL)
7602 overlay_max = size;
7603 else
7604 overlay_max = exp_binop (MAX_K, overlay_max, size);
7605}
7606
7607/* Finish a section in an overlay. There isn't any special to do
7608 here. */
7609
7610void
7611lang_leave_overlay_section (fill_type *fill,
7612 lang_output_section_phdr_list *phdrs)
7613{
7614 const char *name;
7615 char *clean, *s2;
7616 const char *s1;
7617 char *buf;
7618
7619 name = current_section->name;
7620
7621 /* For now, assume that DEFAULT_MEMORY_REGION is the run-time memory
7622 region and that no load-time region has been specified. It doesn't
7623 really matter what we say here, since lang_leave_overlay will
7624 override it. */
7625 lang_leave_output_section_statement (fill, DEFAULT_MEMORY_REGION, phdrs, 0);
7626
7627 /* Define the magic symbols. */
7628
7629 clean = (char *) xmalloc (strlen (name) + 1);
7630 s2 = clean;
7631 for (s1 = name; *s1 != '\0'; s1++)
7632 if (ISALNUM (*s1) || *s1 == '_')
7633 *s2++ = *s1;
7634 *s2 = '\0';
7635
7636 buf = (char *) xmalloc (strlen (clean) + sizeof "__load_start_");
7637 sprintf (buf, "__load_start_%s", clean);
7638 lang_add_assignment (exp_provide (buf,
7639 exp_nameop (LOADADDR, name),
7640 FALSE));
7641
7642 buf = (char *) xmalloc (strlen (clean) + sizeof "__load_stop_");
7643 sprintf (buf, "__load_stop_%s", clean);
7644 lang_add_assignment (exp_provide (buf,
7645 exp_binop ('+',
7646 exp_nameop (LOADADDR, name),
7647 exp_nameop (SIZEOF, name)),
7648 FALSE));
7649
7650 free (clean);
7651}
7652
7653/* Finish an overlay. If there are any overlay wide settings, this
7654 looks through all the sections in the overlay and sets them. */
7655
7656void
7657lang_leave_overlay (etree_type *lma_expr,
7658 int nocrossrefs,
7659 fill_type *fill,
7660 const char *memspec,
7661 lang_output_section_phdr_list *phdrs,
7662 const char *lma_memspec)
7663{
7664 lang_memory_region_type *region;
7665 lang_memory_region_type *lma_region;
7666 struct overlay_list *l;
7667 lang_nocrossref_type *nocrossref;
7668
7669 lang_get_regions (&region, &lma_region,
7670 memspec, lma_memspec,
7671 lma_expr != NULL, FALSE);
7672
7673 nocrossref = NULL;
7674
7675 /* After setting the size of the last section, set '.' to end of the
7676 overlay region. */
7677 if (overlay_list != NULL)
7678 {
7679 overlay_list->os->update_dot = 1;
7680 overlay_list->os->update_dot_tree
7681 = exp_assign (".", exp_binop ('+', overlay_vma, overlay_max), FALSE);
7682 }
7683
7684 l = overlay_list;
7685 while (l != NULL)
7686 {
7687 struct overlay_list *next;
7688
7689 if (fill != NULL && l->os->fill == NULL)
7690 l->os->fill = fill;
7691
7692 l->os->region = region;
7693 l->os->lma_region = lma_region;
7694
7695 /* The first section has the load address specified in the
7696 OVERLAY statement. The rest are worked out from that.
7697 The base address is not needed (and should be null) if
7698 an LMA region was specified. */
7699 if (l->next == 0)
7700 {
7701 l->os->load_base = lma_expr;
7702 l->os->sectype = normal_section;
7703 }
7704 if (phdrs != NULL && l->os->phdrs == NULL)
7705 l->os->phdrs = phdrs;
7706
7707 if (nocrossrefs)
7708 {
7709 lang_nocrossref_type *nc;
7710
7711 nc = (lang_nocrossref_type *) xmalloc (sizeof *nc);
7712 nc->name = l->os->name;
7713 nc->next = nocrossref;
7714 nocrossref = nc;
7715 }
7716
7717 next = l->next;
7718 free (l);
7719 l = next;
7720 }
7721
7722 if (nocrossref != NULL)
7723 lang_add_nocrossref (nocrossref);
7724
7725 overlay_vma = NULL;
7726 overlay_list = NULL;
7727 overlay_max = NULL;
7728}
7729
7730
7731/* Version handling. This is only useful for ELF. */
7732
7733/* If PREV is NULL, return first version pattern matching particular symbol.
7734 If PREV is non-NULL, return first version pattern matching particular
7735 symbol after PREV (previously returned by lang_vers_match). */
7736
7737static struct bfd_elf_version_expr *
7738lang_vers_match (struct bfd_elf_version_expr_head *head,
7739 struct bfd_elf_version_expr *prev,
7740 const char *sym)
7741{
7742 const char *c_sym;
7743 const char *cxx_sym = sym;
7744 const char *java_sym = sym;
7745 struct bfd_elf_version_expr *expr = NULL;
7746 enum demangling_styles curr_style;
7747
7748 curr_style = CURRENT_DEMANGLING_STYLE;
7749 cplus_demangle_set_style (no_demangling);
7750 c_sym = bfd_demangle (link_info.output_bfd, sym, DMGL_NO_OPTS);
7751 if (!c_sym)
7752 c_sym = sym;
7753 cplus_demangle_set_style (curr_style);
7754
7755 if (head->mask & BFD_ELF_VERSION_CXX_TYPE)
7756 {
7757 cxx_sym = bfd_demangle (link_info.output_bfd, sym,
7758 DMGL_PARAMS | DMGL_ANSI);
7759 if (!cxx_sym)
7760 cxx_sym = sym;
7761 }
7762 if (head->mask & BFD_ELF_VERSION_JAVA_TYPE)
7763 {
7764 java_sym = bfd_demangle (link_info.output_bfd, sym, DMGL_JAVA);
7765 if (!java_sym)
7766 java_sym = sym;
7767 }
7768
7769 if (head->htab && (prev == NULL || prev->literal))
7770 {
7771 struct bfd_elf_version_expr e;
7772
7773 switch (prev ? prev->mask : 0)
7774 {
7775 case 0:
7776 if (head->mask & BFD_ELF_VERSION_C_TYPE)
7777 {
7778 e.pattern = c_sym;
7779 expr = (struct bfd_elf_version_expr *)
7780 htab_find ((htab_t) head->htab, &e);
7781 while (expr && strcmp (expr->pattern, c_sym) == 0)
7782 if (expr->mask == BFD_ELF_VERSION_C_TYPE)
7783 goto out_ret;
7784 else
7785 expr = expr->next;
7786 }
7787 /* Fallthrough */
7788 case BFD_ELF_VERSION_C_TYPE:
7789 if (head->mask & BFD_ELF_VERSION_CXX_TYPE)
7790 {
7791 e.pattern = cxx_sym;
7792 expr = (struct bfd_elf_version_expr *)
7793 htab_find ((htab_t) head->htab, &e);
7794 while (expr && strcmp (expr->pattern, cxx_sym) == 0)
7795 if (expr->mask == BFD_ELF_VERSION_CXX_TYPE)
7796 goto out_ret;
7797 else
7798 expr = expr->next;
7799 }
7800 /* Fallthrough */
7801 case BFD_ELF_VERSION_CXX_TYPE:
7802 if (head->mask & BFD_ELF_VERSION_JAVA_TYPE)
7803 {
7804 e.pattern = java_sym;
7805 expr = (struct bfd_elf_version_expr *)
7806 htab_find ((htab_t) head->htab, &e);
7807 while (expr && strcmp (expr->pattern, java_sym) == 0)
7808 if (expr->mask == BFD_ELF_VERSION_JAVA_TYPE)
7809 goto out_ret;
7810 else
7811 expr = expr->next;
7812 }
7813 /* Fallthrough */
7814 default:
7815 break;
7816 }
7817 }
7818
7819 /* Finally, try the wildcards. */
7820 if (prev == NULL || prev->literal)
7821 expr = head->remaining;
7822 else
7823 expr = prev->next;
7824 for (; expr; expr = expr->next)
7825 {
7826 const char *s;
7827
7828 if (!expr->pattern)
7829 continue;
7830
7831 if (expr->pattern[0] == '*' && expr->pattern[1] == '\0')
7832 break;
7833
7834 if (expr->mask == BFD_ELF_VERSION_JAVA_TYPE)
7835 s = java_sym;
7836 else if (expr->mask == BFD_ELF_VERSION_CXX_TYPE)
7837 s = cxx_sym;
7838 else
7839 s = c_sym;
7840 if (fnmatch (expr->pattern, s, 0) == 0)
7841 break;
7842 }
7843
7844 out_ret:
7845 if (c_sym != sym)
7846 free ((char *) c_sym);
7847 if (cxx_sym != sym)
7848 free ((char *) cxx_sym);
7849 if (java_sym != sym)
7850 free ((char *) java_sym);
7851 return expr;
7852}
7853
7854/* Return NULL if the PATTERN argument is a glob pattern, otherwise,
7855 return a pointer to the symbol name with any backslash quotes removed. */
7856
7857static const char *
7858realsymbol (const char *pattern)
7859{
7860 const char *p;
7861 bfd_boolean changed = FALSE, backslash = FALSE;
7862 char *s, *symbol = (char *) xmalloc (strlen (pattern) + 1);
7863
7864 for (p = pattern, s = symbol; *p != '\0'; ++p)
7865 {
7866 /* It is a glob pattern only if there is no preceding
7867 backslash. */
7868 if (backslash)
7869 {
7870 /* Remove the preceding backslash. */
7871 *(s - 1) = *p;
7872 backslash = FALSE;
7873 changed = TRUE;
7874 }
7875 else
7876 {
7877 if (*p == '?' || *p == '*' || *p == '[')
7878 {
7879 free (symbol);
7880 return NULL;
7881 }
7882
7883 *s++ = *p;
7884 backslash = *p == '\\';
7885 }
7886 }
7887
7888 if (changed)
7889 {
7890 *s = '\0';
7891 return symbol;
7892 }
7893 else
7894 {
7895 free (symbol);
7896 return pattern;
7897 }
7898}
7899
7900/* This is called for each variable name or match expression. NEW_NAME is
7901 the name of the symbol to match, or, if LITERAL_P is FALSE, a glob
7902 pattern to be matched against symbol names. */
7903
7904struct bfd_elf_version_expr *
7905lang_new_vers_pattern (struct bfd_elf_version_expr *orig,
7906 const char *new_name,
7907 const char *lang,
7908 bfd_boolean literal_p)
7909{
7910 struct bfd_elf_version_expr *ret;
7911
7912 ret = (struct bfd_elf_version_expr *) xmalloc (sizeof *ret);
7913 ret->next = orig;
7914 ret->symver = 0;
7915 ret->script = 0;
7916 ret->literal = TRUE;
7917 ret->pattern = literal_p ? new_name : realsymbol (new_name);
7918 if (ret->pattern == NULL)
7919 {
7920 ret->pattern = new_name;
7921 ret->literal = FALSE;
7922 }
7923
7924 if (lang == NULL || strcasecmp (lang, "C") == 0)
7925 ret->mask = BFD_ELF_VERSION_C_TYPE;
7926 else if (strcasecmp (lang, "C++") == 0)
7927 ret->mask = BFD_ELF_VERSION_CXX_TYPE;
7928 else if (strcasecmp (lang, "Java") == 0)
7929 ret->mask = BFD_ELF_VERSION_JAVA_TYPE;
7930 else
7931 {
7932 einfo (_("%X%P: unknown language `%s' in version information\n"),
7933 lang);
7934 ret->mask = BFD_ELF_VERSION_C_TYPE;
7935 }
7936
7937 return ldemul_new_vers_pattern (ret);
7938}
7939
7940/* This is called for each set of variable names and match
7941 expressions. */
7942
7943struct bfd_elf_version_tree *
7944lang_new_vers_node (struct bfd_elf_version_expr *globals,
7945 struct bfd_elf_version_expr *locals)
7946{
7947 struct bfd_elf_version_tree *ret;
7948
7949 ret = (struct bfd_elf_version_tree *) xcalloc (1, sizeof *ret);
7950 ret->globals.list = globals;
7951 ret->locals.list = locals;
7952 ret->match = lang_vers_match;
7953 ret->name_indx = (unsigned int) -1;
7954 return ret;
7955}
7956
7957/* This static variable keeps track of version indices. */
7958
7959static int version_index;
7960
7961static hashval_t
7962version_expr_head_hash (const void *p)
7963{
7964 const struct bfd_elf_version_expr *e =
7965 (const struct bfd_elf_version_expr *) p;
7966
7967 return htab_hash_string (e->pattern);
7968}
7969
7970static int
7971version_expr_head_eq (const void *p1, const void *p2)
7972{
7973 const struct bfd_elf_version_expr *e1 =
7974 (const struct bfd_elf_version_expr *) p1;
7975 const struct bfd_elf_version_expr *e2 =
7976 (const struct bfd_elf_version_expr *) p2;
7977
7978 return strcmp (e1->pattern, e2->pattern) == 0;
7979}
7980
7981static void
7982lang_finalize_version_expr_head (struct bfd_elf_version_expr_head *head)
7983{
7984 size_t count = 0;
7985 struct bfd_elf_version_expr *e, *next;
7986 struct bfd_elf_version_expr **list_loc, **remaining_loc;
7987
7988 for (e = head->list; e; e = e->next)
7989 {
7990 if (e->literal)
7991 count++;
7992 head->mask |= e->mask;
7993 }
7994
7995 if (count)
7996 {
7997 head->htab = htab_create (count * 2, version_expr_head_hash,
7998 version_expr_head_eq, NULL);
7999 list_loc = &head->list;
8000 remaining_loc = &head->remaining;
8001 for (e = head->list; e; e = next)
8002 {
8003 next = e->next;
8004 if (!e->literal)
8005 {
8006 *remaining_loc = e;
8007 remaining_loc = &e->next;
8008 }
8009 else
8010 {
8011 void **loc = htab_find_slot ((htab_t) head->htab, e, INSERT);
8012
8013 if (*loc)
8014 {
8015 struct bfd_elf_version_expr *e1, *last;
8016
8017 e1 = (struct bfd_elf_version_expr *) *loc;
8018 last = NULL;
8019 do
8020 {
8021 if (e1->mask == e->mask)
8022 {
8023 last = NULL;
8024 break;
8025 }
8026 last = e1;
8027 e1 = e1->next;
8028 }
8029 while (e1 && strcmp (e1->pattern, e->pattern) == 0);
8030
8031 if (last == NULL)
8032 {
8033 /* This is a duplicate. */
8034 /* FIXME: Memory leak. Sometimes pattern is not
8035 xmalloced alone, but in larger chunk of memory. */
8036 /* free (e->pattern); */
8037 free (e);
8038 }
8039 else
8040 {
8041 e->next = last->next;
8042 last->next = e;
8043 }
8044 }
8045 else
8046 {
8047 *loc = e;
8048 *list_loc = e;
8049 list_loc = &e->next;
8050 }
8051 }
8052 }
8053 *remaining_loc = NULL;
8054 *list_loc = head->remaining;
8055 }
8056 else
8057 head->remaining = head->list;
8058}
8059
8060/* This is called when we know the name and dependencies of the
8061 version. */
8062
8063void
8064lang_register_vers_node (const char *name,
8065 struct bfd_elf_version_tree *version,
8066 struct bfd_elf_version_deps *deps)
8067{
8068 struct bfd_elf_version_tree *t, **pp;
8069 struct bfd_elf_version_expr *e1;
8070
8071 if (name == NULL)
8072 name = "";
8073
8074 if (link_info.version_info != NULL
8075 && (name[0] == '\0' || link_info.version_info->name[0] == '\0'))
8076 {
8077 einfo (_("%X%P: anonymous version tag cannot be combined"
8078 " with other version tags\n"));
8079 free (version);
8080 return;
8081 }
8082
8083 /* Make sure this node has a unique name. */
8084 for (t = link_info.version_info; t != NULL; t = t->next)
8085 if (strcmp (t->name, name) == 0)
8086 einfo (_("%X%P: duplicate version tag `%s'\n"), name);
8087
8088 lang_finalize_version_expr_head (&version->globals);
8089 lang_finalize_version_expr_head (&version->locals);
8090
8091 /* Check the global and local match names, and make sure there
8092 aren't any duplicates. */
8093
8094 for (e1 = version->globals.list; e1 != NULL; e1 = e1->next)
8095 {
8096 for (t = link_info.version_info; t != NULL; t = t->next)
8097 {
8098 struct bfd_elf_version_expr *e2;
8099
8100 if (t->locals.htab && e1->literal)
8101 {
8102 e2 = (struct bfd_elf_version_expr *)
8103 htab_find ((htab_t) t->locals.htab, e1);
8104 while (e2 && strcmp (e1->pattern, e2->pattern) == 0)
8105 {
8106 if (e1->mask == e2->mask)
8107 einfo (_("%X%P: duplicate expression `%s'"
8108 " in version information\n"), e1->pattern);
8109 e2 = e2->next;
8110 }
8111 }
8112 else if (!e1->literal)
8113 for (e2 = t->locals.remaining; e2 != NULL; e2 = e2->next)
8114 if (strcmp (e1->pattern, e2->pattern) == 0
8115 && e1->mask == e2->mask)
8116 einfo (_("%X%P: duplicate expression `%s'"
8117 " in version information\n"), e1->pattern);
8118 }
8119 }
8120
8121 for (e1 = version->locals.list; e1 != NULL; e1 = e1->next)
8122 {
8123 for (t = link_info.version_info; t != NULL; t = t->next)
8124 {
8125 struct bfd_elf_version_expr *e2;
8126
8127 if (t->globals.htab && e1->literal)
8128 {
8129 e2 = (struct bfd_elf_version_expr *)
8130 htab_find ((htab_t) t->globals.htab, e1);
8131 while (e2 && strcmp (e1->pattern, e2->pattern) == 0)
8132 {
8133 if (e1->mask == e2->mask)
8134 einfo (_("%X%P: duplicate expression `%s'"
8135 " in version information\n"),
8136 e1->pattern);
8137 e2 = e2->next;
8138 }
8139 }
8140 else if (!e1->literal)
8141 for (e2 = t->globals.remaining; e2 != NULL; e2 = e2->next)
8142 if (strcmp (e1->pattern, e2->pattern) == 0
8143 && e1->mask == e2->mask)
8144 einfo (_("%X%P: duplicate expression `%s'"
8145 " in version information\n"), e1->pattern);
8146 }
8147 }
8148
8149 version->deps = deps;
8150 version->name = name;
8151 if (name[0] != '\0')
8152 {
8153 ++version_index;
8154 version->vernum = version_index;
8155 }
8156 else
8157 version->vernum = 0;
8158
8159 for (pp = &link_info.version_info; *pp != NULL; pp = &(*pp)->next)
8160 ;
8161 *pp = version;
8162}
8163
8164/* This is called when we see a version dependency. */
8165
8166struct bfd_elf_version_deps *
8167lang_add_vers_depend (struct bfd_elf_version_deps *list, const char *name)
8168{
8169 struct bfd_elf_version_deps *ret;
8170 struct bfd_elf_version_tree *t;
8171
8172 ret = (struct bfd_elf_version_deps *) xmalloc (sizeof *ret);
8173 ret->next = list;
8174
8175 for (t = link_info.version_info; t != NULL; t = t->next)
8176 {
8177 if (strcmp (t->name, name) == 0)
8178 {
8179 ret->version_needed = t;
8180 return ret;
8181 }
8182 }
8183
8184 einfo (_("%X%P: unable to find version dependency `%s'\n"), name);
8185
8186 ret->version_needed = NULL;
8187 return ret;
8188}
8189
8190static void
8191lang_do_version_exports_section (void)
8192{
8193 struct bfd_elf_version_expr *greg = NULL, *lreg;
8194
8195 LANG_FOR_EACH_INPUT_STATEMENT (is)
8196 {
8197 asection *sec = bfd_get_section_by_name (is->the_bfd, ".exports");
8198 char *contents, *p;
8199 bfd_size_type len;
8200
8201 if (sec == NULL)
8202 continue;
8203
8204 len = sec->size;
8205 contents = (char *) xmalloc (len);
8206 if (!bfd_get_section_contents (is->the_bfd, sec, contents, 0, len))
8207 einfo (_("%X%P: unable to read .exports section contents\n"), sec);
8208
8209 p = contents;
8210 while (p < contents + len)
8211 {
8212 greg = lang_new_vers_pattern (greg, p, NULL, FALSE);
8213 p = strchr (p, '\0') + 1;
8214 }
8215
8216 /* Do not free the contents, as we used them creating the regex. */
8217
8218 /* Do not include this section in the link. */
8219 sec->flags |= SEC_EXCLUDE | SEC_KEEP;
8220 }
8221
8222 lreg = lang_new_vers_pattern (NULL, "*", NULL, FALSE);
8223 lang_register_vers_node (command_line.version_exports_section,
8224 lang_new_vers_node (greg, lreg), NULL);
8225}
8226
8227/* Evaluate LENGTH and ORIGIN parts of MEMORY spec */
8228
8229static void
8230lang_do_memory_regions (void)
8231{
8232 lang_memory_region_type *r = lang_memory_region_list;
8233
8234 for (; r != NULL; r = r->next)
8235 {
8236 if (r->origin_exp)
8237 {
8238 exp_fold_tree_no_dot (r->origin_exp);
8239 if (expld.result.valid_p)
8240 {
8241 r->origin = expld.result.value;
8242 r->current = r->origin;
8243 }
8244 else
8245 einfo (_("%F%P: invalid origin for memory region %s\n"),
8246 r->name_list.name);
8247 }
8248 if (r->length_exp)
8249 {
8250 exp_fold_tree_no_dot (r->length_exp);
8251 if (expld.result.valid_p)
8252 r->length = expld.result.value;
8253 else
8254 einfo (_("%F%P: invalid length for memory region %s\n"),
8255 r->name_list.name);
8256 }
8257 }
8258}
8259
8260void
8261lang_add_unique (const char *name)
8262{
8263 struct unique_sections *ent;
8264
8265 for (ent = unique_section_list; ent; ent = ent->next)
8266 if (strcmp (ent->name, name) == 0)
8267 return;
8268
8269 ent = (struct unique_sections *) xmalloc (sizeof *ent);
8270 ent->name = xstrdup (name);
8271 ent->next = unique_section_list;
8272 unique_section_list = ent;
8273}
8274
8275/* Append the list of dynamic symbols to the existing one. */
8276
8277void
8278lang_append_dynamic_list (struct bfd_elf_version_expr *dynamic)
8279{
8280 if (link_info.dynamic_list)
8281 {
8282 struct bfd_elf_version_expr *tail;
8283 for (tail = dynamic; tail->next != NULL; tail = tail->next)
8284 ;
8285 tail->next = link_info.dynamic_list->head.list;
8286 link_info.dynamic_list->head.list = dynamic;
8287 }
8288 else
8289 {
8290 struct bfd_elf_dynamic_list *d;
8291
8292 d = (struct bfd_elf_dynamic_list *) xcalloc (1, sizeof *d);
8293 d->head.list = dynamic;
8294 d->match = lang_vers_match;
8295 link_info.dynamic_list = d;
8296 }
8297}
8298
8299/* Append the list of C++ typeinfo dynamic symbols to the existing
8300 one. */
8301
8302void
8303lang_append_dynamic_list_cpp_typeinfo (void)
8304{
8305 const char *symbols[] =
8306 {
8307 "typeinfo name for*",
8308 "typeinfo for*"
8309 };
8310 struct bfd_elf_version_expr *dynamic = NULL;
8311 unsigned int i;
8312
8313 for (i = 0; i < ARRAY_SIZE (symbols); i++)
8314 dynamic = lang_new_vers_pattern (dynamic, symbols [i], "C++",
8315 FALSE);
8316
8317 lang_append_dynamic_list (dynamic);
8318}
8319
8320/* Append the list of C++ operator new and delete dynamic symbols to the
8321 existing one. */
8322
8323void
8324lang_append_dynamic_list_cpp_new (void)
8325{
8326 const char *symbols[] =
8327 {
8328 "operator new*",
8329 "operator delete*"
8330 };
8331 struct bfd_elf_version_expr *dynamic = NULL;
8332 unsigned int i;
8333
8334 for (i = 0; i < ARRAY_SIZE (symbols); i++)
8335 dynamic = lang_new_vers_pattern (dynamic, symbols [i], "C++",
8336 FALSE);
8337
8338 lang_append_dynamic_list (dynamic);
8339}
8340
8341/* Scan a space and/or comma separated string of features. */
8342
8343void
8344lang_ld_feature (char *str)
8345{
8346 char *p, *q;
8347
8348 p = str;
8349 while (*p)
8350 {
8351 char sep;
8352 while (*p == ',' || ISSPACE (*p))
8353 ++p;
8354 if (!*p)
8355 break;
8356 q = p + 1;
8357 while (*q && *q != ',' && !ISSPACE (*q))
8358 ++q;
8359 sep = *q;
8360 *q = 0;
8361 if (strcasecmp (p, "SANE_EXPR") == 0)
8362 config.sane_expr = TRUE;
8363 else
8364 einfo (_("%X%P: unknown feature `%s'\n"), p);
8365 *q = sep;
8366 p = q;
8367 }
8368}
8369
8370/* Pretty print memory amount. */
8371
8372static void
8373lang_print_memory_size (bfd_vma sz)
8374{
8375 if ((sz & 0x3fffffff) == 0)
8376 printf ("%10" BFD_VMA_FMT "u GB", sz >> 30);
8377 else if ((sz & 0xfffff) == 0)
8378 printf ("%10" BFD_VMA_FMT "u MB", sz >> 20);
8379 else if ((sz & 0x3ff) == 0)
8380 printf ("%10" BFD_VMA_FMT "u KB", sz >> 10);
8381 else
8382 printf (" %10" BFD_VMA_FMT "u B", sz);
8383}
8384
8385/* Implement --print-memory-usage: disply per region memory usage. */
8386
8387void
8388lang_print_memory_usage (void)
8389{
8390 lang_memory_region_type *r;
8391
8392 printf ("Memory region Used Size Region Size %%age Used\n");
8393 for (r = lang_memory_region_list; r->next != NULL; r = r->next)
8394 {
8395 bfd_vma used_length = r->current - r->origin;
8396 double percent;
8397
8398 printf ("%16s: ",r->name_list.name);
8399 lang_print_memory_size (used_length);
8400 lang_print_memory_size ((bfd_vma) r->length);
8401
8402 percent = used_length * 100.0 / r->length;
8403
8404 printf (" %6.2f%%\n", percent);
8405 }
8406}
Note: See TracBrowser for help on using the repository browser.