OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.20.1/] [ld/] [ldlang.c] - Blame information for rev 234

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.