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

Subversion Repositories openrisc

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

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
  lang_statement_union_type *l;
2324
 
2325
  if (!wild->filenames_sorted
2326
      && (sec == NULL || sec->spec.sorted == none))
2327
    return NULL;
2328
 
2329
  for (l = wild->children.head; l != NULL; l = l->header.next)
2330
    {
2331
      lang_input_section_type *ls;
2332
 
2333
      if (l->header.type != lang_input_section_enum)
2334
        continue;
2335
      ls = &l->input_section;
2336
 
2337
      /* Sorting by filename takes precedence over sorting by section
2338
         name.  */
2339
 
2340
      if (wild->filenames_sorted)
2341
        {
2342
          const char *fn, *ln;
2343
          bfd_boolean fa, la;
2344
          int i;
2345
 
2346
          /* The PE support for the .idata section as generated by
2347
             dlltool assumes that files will be sorted by the name of
2348
             the archive and then the name of the file within the
2349
             archive.  */
2350
 
2351
          if (file->the_bfd != NULL
2352
              && bfd_my_archive (file->the_bfd) != NULL)
2353
            {
2354
              fn = bfd_get_filename (bfd_my_archive (file->the_bfd));
2355
              fa = TRUE;
2356
            }
2357
          else
2358
            {
2359
              fn = file->filename;
2360
              fa = FALSE;
2361
            }
2362
 
2363
          if (bfd_my_archive (ls->section->owner) != NULL)
2364
            {
2365
              ln = bfd_get_filename (bfd_my_archive (ls->section->owner));
2366
              la = TRUE;
2367
            }
2368
          else
2369
            {
2370
              ln = ls->section->owner->filename;
2371
              la = FALSE;
2372
            }
2373
 
2374
          i = strcmp (fn, ln);
2375
          if (i > 0)
2376
            continue;
2377
          else if (i < 0)
2378
            break;
2379
 
2380
          if (fa || la)
2381
            {
2382
              if (fa)
2383
                fn = file->filename;
2384
              if (la)
2385
                ln = ls->section->owner->filename;
2386
 
2387
              i = strcmp (fn, ln);
2388
              if (i > 0)
2389
                continue;
2390
              else if (i < 0)
2391
                break;
2392
            }
2393
        }
2394
 
2395
      /* Here either the files are not sorted by name, or we are
2396
         looking at the sections for this file.  */
2397
 
2398
      if (sec != NULL && sec->spec.sorted != none)
2399
        if (compare_section (sec->spec.sorted, section, ls->section) < 0)
2400
          break;
2401
    }
2402
 
2403
  return l;
2404
}
2405
 
2406
/* Expand a wild statement for a particular FILE.  SECTION may be
2407
   NULL, in which case it is a wild card.  */
2408
 
2409
static void
2410
output_section_callback (lang_wild_statement_type *ptr,
2411
                         struct wildcard_list *sec,
2412
                         asection *section,
2413
                         lang_input_statement_type *file,
2414
                         void *output)
2415
{
2416
  lang_statement_union_type *before;
2417
 
2418
  /* Exclude sections that match UNIQUE_SECTION_LIST.  */
2419
  if (unique_section_p (section))
2420
    return;
2421
 
2422
  before = wild_sort (ptr, sec, file, section);
2423
 
2424
  /* Here BEFORE points to the lang_input_section which
2425
     should follow the one we are about to add.  If BEFORE
2426
     is NULL, then the section should just go at the end
2427
     of the current list.  */
2428
 
2429
  if (before == NULL)
2430
    lang_add_section (&ptr->children, section,
2431
                      (lang_output_section_statement_type *) output);
2432
  else
2433
    {
2434
      lang_statement_list_type list;
2435
      lang_statement_union_type **pp;
2436
 
2437
      lang_list_init (&list);
2438
      lang_add_section (&list, section,
2439
                        (lang_output_section_statement_type *) output);
2440
 
2441
      /* If we are discarding the section, LIST.HEAD will
2442
         be NULL.  */
2443
      if (list.head != NULL)
2444
        {
2445
          ASSERT (list.head->header.next == NULL);
2446
 
2447
          for (pp = &ptr->children.head;
2448
               *pp != before;
2449
               pp = &(*pp)->header.next)
2450
            ASSERT (*pp != NULL);
2451
 
2452
          list.head->header.next = *pp;
2453
          *pp = list.head;
2454
        }
2455
    }
2456
}
2457
 
2458
/* Check if all sections in a wild statement for a particular FILE
2459
   are readonly.  */
2460
 
2461
static void
2462
check_section_callback (lang_wild_statement_type *ptr ATTRIBUTE_UNUSED,
2463
                        struct wildcard_list *sec ATTRIBUTE_UNUSED,
2464
                        asection *section,
2465
                        lang_input_statement_type *file ATTRIBUTE_UNUSED,
2466
                        void *data)
2467
{
2468
  /* Exclude sections that match UNIQUE_SECTION_LIST.  */
2469
  if (unique_section_p (section))
2470
    return;
2471
 
2472
  if (section->output_section == NULL && (section->flags & SEC_READONLY) == 0)
2473
    ((lang_output_section_statement_type *) data)->all_input_readonly = FALSE;
2474
}
2475
 
2476
/* This is passed a file name which must have been seen already and
2477
   added to the statement tree.  We will see if it has been opened
2478
   already and had its symbols read.  If not then we'll read it.  */
2479
 
2480
static lang_input_statement_type *
2481
lookup_name (const char *name)
2482
{
2483
  lang_input_statement_type *search;
2484
 
2485
  for (search = (lang_input_statement_type *) input_file_chain.head;
2486
       search != NULL;
2487
       search = (lang_input_statement_type *) search->next_real_file)
2488
    {
2489
      /* Use the local_sym_name as the name of the file that has
2490
         already been loaded as filename might have been transformed
2491
         via the search directory lookup mechanism.  */
2492
      const char *filename = search->local_sym_name;
2493
 
2494
      if (filename != NULL
2495
          && strcmp (filename, name) == 0)
2496
        break;
2497
    }
2498
 
2499
  if (search == NULL)
2500
    search = new_afile (name, lang_input_file_is_search_file_enum,
2501
                        default_target, FALSE);
2502
 
2503
  /* If we have already added this file, or this file is not real
2504
     don't add this file.  */
2505
  if (search->loaded || !search->real)
2506
    return search;
2507
 
2508
  if (! load_symbols (search, NULL))
2509
    return NULL;
2510
 
2511
  return search;
2512
}
2513
 
2514
/* Save LIST as a list of libraries whose symbols should not be exported.  */
2515
 
2516
struct excluded_lib
2517
{
2518
  char *name;
2519
  struct excluded_lib *next;
2520
};
2521
static struct excluded_lib *excluded_libs;
2522
 
2523
void
2524
add_excluded_libs (const char *list)
2525
{
2526
  const char *p = list, *end;
2527
 
2528
  while (*p != '\0')
2529
    {
2530
      struct excluded_lib *entry;
2531
      end = strpbrk (p, ",:");
2532
      if (end == NULL)
2533
        end = p + strlen (p);
2534
      entry = (struct excluded_lib *) xmalloc (sizeof (*entry));
2535
      entry->next = excluded_libs;
2536
      entry->name = (char *) xmalloc (end - p + 1);
2537
      memcpy (entry->name, p, end - p);
2538
      entry->name[end - p] = '\0';
2539
      excluded_libs = entry;
2540
      if (*end == '\0')
2541
        break;
2542
      p = end + 1;
2543
    }
2544
}
2545
 
2546
static void
2547
check_excluded_libs (bfd *abfd)
2548
{
2549
  struct excluded_lib *lib = excluded_libs;
2550
 
2551
  while (lib)
2552
    {
2553
      int len = strlen (lib->name);
2554
      const char *filename = lbasename (abfd->filename);
2555
 
2556
      if (strcmp (lib->name, "ALL") == 0)
2557
        {
2558
          abfd->no_export = TRUE;
2559
          return;
2560
        }
2561
 
2562
      if (strncmp (lib->name, filename, len) == 0
2563
          && (filename[len] == '\0'
2564
              || (filename[len] == '.' && filename[len + 1] == 'a'
2565
                  && filename[len + 2] == '\0')))
2566
        {
2567
          abfd->no_export = TRUE;
2568
          return;
2569
        }
2570
 
2571
      lib = lib->next;
2572
    }
2573
}
2574
 
2575
/* Get the symbols for an input file.  */
2576
 
2577
bfd_boolean
2578
load_symbols (lang_input_statement_type *entry,
2579
              lang_statement_list_type *place)
2580
{
2581
  char **matching;
2582
 
2583
  if (entry->loaded)
2584
    return TRUE;
2585
 
2586
  ldfile_open_file (entry);
2587
 
2588
  if (! bfd_check_format (entry->the_bfd, bfd_archive)
2589
      && ! bfd_check_format_matches (entry->the_bfd, bfd_object, &matching))
2590
    {
2591
      bfd_error_type err;
2592
      bfd_boolean save_ldlang_sysrooted_script;
2593
      bfd_boolean save_as_needed, save_add_needed, save_whole_archive;
2594
 
2595
      err = bfd_get_error ();
2596
 
2597
      /* See if the emulation has some special knowledge.  */
2598
      if (ldemul_unrecognized_file (entry))
2599
        return TRUE;
2600
 
2601
      if (err == bfd_error_file_ambiguously_recognized)
2602
        {
2603
          char **p;
2604
 
2605
          einfo (_("%B: file not recognized: %E\n"), entry->the_bfd);
2606
          einfo (_("%B: matching formats:"), entry->the_bfd);
2607
          for (p = matching; *p != NULL; p++)
2608
            einfo (" %s", *p);
2609
          einfo ("%F\n");
2610
        }
2611
      else if (err != bfd_error_file_not_recognized
2612
               || place == NULL)
2613
        einfo (_("%F%B: file not recognized: %E\n"), entry->the_bfd);
2614
 
2615
      bfd_close (entry->the_bfd);
2616
      entry->the_bfd = NULL;
2617
 
2618
      /* Try to interpret the file as a linker script.  */
2619
      ldfile_open_command_file (entry->filename);
2620
 
2621
      push_stat_ptr (place);
2622
      save_ldlang_sysrooted_script = ldlang_sysrooted_script;
2623
      ldlang_sysrooted_script = entry->sysrooted;
2624
      save_as_needed = as_needed;
2625
      as_needed = entry->as_needed;
2626
      save_add_needed = add_needed;
2627
      add_needed = entry->add_needed;
2628
      save_whole_archive = whole_archive;
2629
      whole_archive = entry->whole_archive;
2630
 
2631
      ldfile_assumed_script = TRUE;
2632
      parser_input = input_script;
2633
      /* We want to use the same -Bdynamic/-Bstatic as the one for
2634
         ENTRY.  */
2635
      config.dynamic_link = entry->dynamic;
2636
      yyparse ();
2637
      ldfile_assumed_script = FALSE;
2638
 
2639
      ldlang_sysrooted_script = save_ldlang_sysrooted_script;
2640
      as_needed = save_as_needed;
2641
      add_needed = save_add_needed;
2642
      whole_archive = save_whole_archive;
2643
      pop_stat_ptr ();
2644
 
2645
      return TRUE;
2646
    }
2647
 
2648
  if (ldemul_recognized_file (entry))
2649
    return TRUE;
2650
 
2651
  /* We don't call ldlang_add_file for an archive.  Instead, the
2652
     add_symbols entry point will call ldlang_add_file, via the
2653
     add_archive_element callback, for each element of the archive
2654
     which is used.  */
2655
  switch (bfd_get_format (entry->the_bfd))
2656
    {
2657
    default:
2658
      break;
2659
 
2660
    case bfd_object:
2661
      ldlang_add_file (entry);
2662
      if (trace_files || trace_file_tries)
2663
        info_msg ("%I\n", entry);
2664
      break;
2665
 
2666
    case bfd_archive:
2667
      check_excluded_libs (entry->the_bfd);
2668
 
2669
      if (entry->whole_archive)
2670
        {
2671
          bfd *member = NULL;
2672
          bfd_boolean loaded = TRUE;
2673
 
2674
          for (;;)
2675
            {
2676
              member = bfd_openr_next_archived_file (entry->the_bfd, member);
2677
 
2678
              if (member == NULL)
2679
                break;
2680
 
2681
              if (! bfd_check_format (member, bfd_object))
2682
                {
2683
                  einfo (_("%F%B: member %B in archive is not an object\n"),
2684
                         entry->the_bfd, member);
2685
                  loaded = FALSE;
2686
                }
2687
 
2688
              if (! ((*link_info.callbacks->add_archive_element)
2689
                     (&link_info, member, "--whole-archive")))
2690
                abort ();
2691
 
2692
              if (! bfd_link_add_symbols (member, &link_info))
2693
                {
2694
                  einfo (_("%F%B: could not read symbols: %E\n"), member);
2695
                  loaded = FALSE;
2696
                }
2697
            }
2698
 
2699
          entry->loaded = loaded;
2700
          return loaded;
2701
        }
2702
      break;
2703
    }
2704
 
2705
  if (bfd_link_add_symbols (entry->the_bfd, &link_info))
2706
    entry->loaded = TRUE;
2707
  else
2708
    einfo (_("%F%B: could not read symbols: %E\n"), entry->the_bfd);
2709
 
2710
  return entry->loaded;
2711
}
2712
 
2713
/* Handle a wild statement.  S->FILENAME or S->SECTION_LIST or both
2714
   may be NULL, indicating that it is a wildcard.  Separate
2715
   lang_input_section statements are created for each part of the
2716
   expansion; they are added after the wild statement S.  OUTPUT is
2717
   the output section.  */
2718
 
2719
static void
2720
wild (lang_wild_statement_type *s,
2721
      const char *target ATTRIBUTE_UNUSED,
2722
      lang_output_section_statement_type *output)
2723
{
2724
  struct wildcard_list *sec;
2725
 
2726
  if (s->handler_data[0]
2727
      && s->handler_data[0]->spec.sorted == by_name
2728
      && !s->filenames_sorted)
2729
    {
2730
      lang_section_bst_type *tree;
2731
 
2732
      walk_wild (s, output_section_callback_fast, output);
2733
 
2734
      tree = s->tree;
2735
      if (tree)
2736
        {
2737
          output_section_callback_tree_to_list (s, tree, output);
2738
          s->tree = NULL;
2739
        }
2740
    }
2741
  else
2742
    walk_wild (s, output_section_callback, output);
2743
 
2744
  if (default_common_section == NULL)
2745
    for (sec = s->section_list; sec != NULL; sec = sec->next)
2746
      if (sec->spec.name != NULL && strcmp (sec->spec.name, "COMMON") == 0)
2747
        {
2748
          /* Remember the section that common is going to in case we
2749
             later get something which doesn't know where to put it.  */
2750
          default_common_section = output;
2751
          break;
2752
        }
2753
}
2754
 
2755
/* Return TRUE iff target is the sought target.  */
2756
 
2757
static int
2758
get_target (const bfd_target *target, void *data)
2759
{
2760
  const char *sought = (const char *) data;
2761
 
2762
  return strcmp (target->name, sought) == 0;
2763
}
2764
 
2765
/* Like strcpy() but convert to lower case as well.  */
2766
 
2767
static void
2768
stricpy (char *dest, char *src)
2769
{
2770
  char c;
2771
 
2772
  while ((c = *src++) != 0)
2773
    *dest++ = TOLOWER (c);
2774
 
2775
  *dest = 0;
2776
}
2777
 
2778
/* Remove the first occurrence of needle (if any) in haystack
2779
   from haystack.  */
2780
 
2781
static void
2782
strcut (char *haystack, char *needle)
2783
{
2784
  haystack = strstr (haystack, needle);
2785
 
2786
  if (haystack)
2787
    {
2788
      char *src;
2789
 
2790
      for (src = haystack + strlen (needle); *src;)
2791
        *haystack++ = *src++;
2792
 
2793
      *haystack = 0;
2794
    }
2795
}
2796
 
2797
/* Compare two target format name strings.
2798
   Return a value indicating how "similar" they are.  */
2799
 
2800
static int
2801
name_compare (char *first, char *second)
2802
{
2803
  char *copy1;
2804
  char *copy2;
2805
  int result;
2806
 
2807
  copy1 = (char *) xmalloc (strlen (first) + 1);
2808
  copy2 = (char *) xmalloc (strlen (second) + 1);
2809
 
2810
  /* Convert the names to lower case.  */
2811
  stricpy (copy1, first);
2812
  stricpy (copy2, second);
2813
 
2814
  /* Remove size and endian strings from the name.  */
2815
  strcut (copy1, "big");
2816
  strcut (copy1, "little");
2817
  strcut (copy2, "big");
2818
  strcut (copy2, "little");
2819
 
2820
  /* Return a value based on how many characters match,
2821
     starting from the beginning.   If both strings are
2822
     the same then return 10 * their length.  */
2823
  for (result = 0; copy1[result] == copy2[result]; result++)
2824
    if (copy1[result] == 0)
2825
      {
2826
        result *= 10;
2827
        break;
2828
      }
2829
 
2830
  free (copy1);
2831
  free (copy2);
2832
 
2833
  return result;
2834
}
2835
 
2836
/* Set by closest_target_match() below.  */
2837
static const bfd_target *winner;
2838
 
2839
/* Scan all the valid bfd targets looking for one that has the endianness
2840
   requirement that was specified on the command line, and is the nearest
2841
   match to the original output target.  */
2842
 
2843
static int
2844
closest_target_match (const bfd_target *target, void *data)
2845
{
2846
  const bfd_target *original = (const bfd_target *) data;
2847
 
2848
  if (command_line.endian == ENDIAN_BIG
2849
      && target->byteorder != BFD_ENDIAN_BIG)
2850
    return 0;
2851
 
2852
  if (command_line.endian == ENDIAN_LITTLE
2853
      && target->byteorder != BFD_ENDIAN_LITTLE)
2854
    return 0;
2855
 
2856
  /* Must be the same flavour.  */
2857
  if (target->flavour != original->flavour)
2858
    return 0;
2859
 
2860
  /* Ignore generic big and little endian elf vectors.  */
2861
  if (strcmp (target->name, "elf32-big") == 0
2862
      || strcmp (target->name, "elf64-big") == 0
2863
      || strcmp (target->name, "elf32-little") == 0
2864
      || strcmp (target->name, "elf64-little") == 0)
2865
    return 0;
2866
 
2867
  /* If we have not found a potential winner yet, then record this one.  */
2868
  if (winner == NULL)
2869
    {
2870
      winner = target;
2871
      return 0;
2872
    }
2873
 
2874
  /* Oh dear, we now have two potential candidates for a successful match.
2875
     Compare their names and choose the better one.  */
2876
  if (name_compare (target->name, original->name)
2877
      > name_compare (winner->name, original->name))
2878
    winner = target;
2879
 
2880
  /* Keep on searching until wqe have checked them all.  */
2881
  return 0;
2882
}
2883
 
2884
/* Return the BFD target format of the first input file.  */
2885
 
2886
static char *
2887
get_first_input_target (void)
2888
{
2889
  char *target = NULL;
2890
 
2891
  LANG_FOR_EACH_INPUT_STATEMENT (s)
2892
    {
2893
      if (s->header.type == lang_input_statement_enum
2894
          && s->real)
2895
        {
2896
          ldfile_open_file (s);
2897
 
2898
          if (s->the_bfd != NULL
2899
              && bfd_check_format (s->the_bfd, bfd_object))
2900
            {
2901
              target = bfd_get_target (s->the_bfd);
2902
 
2903
              if (target != NULL)
2904
                break;
2905
            }
2906
        }
2907
    }
2908
 
2909
  return target;
2910
}
2911
 
2912
const char *
2913
lang_get_output_target (void)
2914
{
2915
  const char *target;
2916
 
2917
  /* Has the user told us which output format to use?  */
2918
  if (output_target != NULL)
2919
    return output_target;
2920
 
2921
  /* No - has the current target been set to something other than
2922
     the default?  */
2923
  if (current_target != default_target)
2924
    return current_target;
2925
 
2926
  /* No - can we determine the format of the first input file?  */
2927
  target = get_first_input_target ();
2928
  if (target != NULL)
2929
    return target;
2930
 
2931
  /* Failed - use the default output target.  */
2932
  return default_target;
2933
}
2934
 
2935
/* Open the output file.  */
2936
 
2937
static void
2938
open_output (const char *name)
2939
{
2940
  output_target = lang_get_output_target ();
2941
 
2942
  /* Has the user requested a particular endianness on the command
2943
     line?  */
2944
  if (command_line.endian != ENDIAN_UNSET)
2945
    {
2946
      const bfd_target *target;
2947
      enum bfd_endian desired_endian;
2948
 
2949
      /* Get the chosen target.  */
2950
      target = bfd_search_for_target (get_target, (void *) output_target);
2951
 
2952
      /* If the target is not supported, we cannot do anything.  */
2953
      if (target != NULL)
2954
        {
2955
          if (command_line.endian == ENDIAN_BIG)
2956
            desired_endian = BFD_ENDIAN_BIG;
2957
          else
2958
            desired_endian = BFD_ENDIAN_LITTLE;
2959
 
2960
          /* See if the target has the wrong endianness.  This should
2961
             not happen if the linker script has provided big and
2962
             little endian alternatives, but some scrips don't do
2963
             this.  */
2964
          if (target->byteorder != desired_endian)
2965
            {
2966
              /* If it does, then see if the target provides
2967
                 an alternative with the correct endianness.  */
2968
              if (target->alternative_target != NULL
2969
                  && (target->alternative_target->byteorder == desired_endian))
2970
                output_target = target->alternative_target->name;
2971
              else
2972
                {
2973
                  /* Try to find a target as similar as possible to
2974
                     the default target, but which has the desired
2975
                     endian characteristic.  */
2976
                  bfd_search_for_target (closest_target_match,
2977
                                         (void *) target);
2978
 
2979
                  /* Oh dear - we could not find any targets that
2980
                     satisfy our requirements.  */
2981
                  if (winner == NULL)
2982
                    einfo (_("%P: warning: could not find any targets"
2983
                             " that match endianness requirement\n"));
2984
                  else
2985
                    output_target = winner->name;
2986
                }
2987
            }
2988
        }
2989
    }
2990
 
2991
  link_info.output_bfd = bfd_openw (name, output_target);
2992
 
2993
  if (link_info.output_bfd == NULL)
2994
    {
2995
      if (bfd_get_error () == bfd_error_invalid_target)
2996
        einfo (_("%P%F: target %s not found\n"), output_target);
2997
 
2998
      einfo (_("%P%F: cannot open output file %s: %E\n"), name);
2999
    }
3000
 
3001
  delete_output_file_on_failure = TRUE;
3002
 
3003
  if (! bfd_set_format (link_info.output_bfd, bfd_object))
3004
    einfo (_("%P%F:%s: can not make object file: %E\n"), name);
3005
  if (! bfd_set_arch_mach (link_info.output_bfd,
3006
                           ldfile_output_architecture,
3007
                           ldfile_output_machine))
3008
    einfo (_("%P%F:%s: can not set architecture: %E\n"), name);
3009
 
3010
  link_info.hash = bfd_link_hash_table_create (link_info.output_bfd);
3011
  if (link_info.hash == NULL)
3012
    einfo (_("%P%F: can not create hash table: %E\n"));
3013
 
3014
  bfd_set_gp_size (link_info.output_bfd, g_switch_value);
3015
}
3016
 
3017
static void
3018
ldlang_open_output (lang_statement_union_type *statement)
3019
{
3020
  switch (statement->header.type)
3021
    {
3022
    case lang_output_statement_enum:
3023
      ASSERT (link_info.output_bfd == NULL);
3024
      open_output (statement->output_statement.name);
3025
      ldemul_set_output_arch ();
3026
      if (config.magic_demand_paged && !link_info.relocatable)
3027
        link_info.output_bfd->flags |= D_PAGED;
3028
      else
3029
        link_info.output_bfd->flags &= ~D_PAGED;
3030
      if (config.text_read_only)
3031
        link_info.output_bfd->flags |= WP_TEXT;
3032
      else
3033
        link_info.output_bfd->flags &= ~WP_TEXT;
3034
      if (link_info.traditional_format)
3035
        link_info.output_bfd->flags |= BFD_TRADITIONAL_FORMAT;
3036
      else
3037
        link_info.output_bfd->flags &= ~BFD_TRADITIONAL_FORMAT;
3038
      break;
3039
 
3040
    case lang_target_statement_enum:
3041
      current_target = statement->target_statement.target;
3042
      break;
3043
    default:
3044
      break;
3045
    }
3046
}
3047
 
3048
/* Convert between addresses in bytes and sizes in octets.
3049
   For currently supported targets, octets_per_byte is always a power
3050
   of two, so we can use shifts.  */
3051
#define TO_ADDR(X) ((X) >> opb_shift)
3052
#define TO_SIZE(X) ((X) << opb_shift)
3053
 
3054
/* Support the above.  */
3055
static unsigned int opb_shift = 0;
3056
 
3057
static void
3058
init_opb (void)
3059
{
3060
  unsigned x = bfd_arch_mach_octets_per_byte (ldfile_output_architecture,
3061
                                              ldfile_output_machine);
3062
  opb_shift = 0;
3063
  if (x > 1)
3064
    while ((x & 1) == 0)
3065
      {
3066
        x >>= 1;
3067
        ++opb_shift;
3068
      }
3069
  ASSERT (x == 1);
3070
}
3071
 
3072
/* Open all the input files.  */
3073
 
3074
static void
3075
open_input_bfds (lang_statement_union_type *s, bfd_boolean force)
3076
{
3077
  for (; s != NULL; s = s->header.next)
3078
    {
3079
      switch (s->header.type)
3080
        {
3081
        case lang_constructors_statement_enum:
3082
          open_input_bfds (constructor_list.head, force);
3083
          break;
3084
        case lang_output_section_statement_enum:
3085
          open_input_bfds (s->output_section_statement.children.head, force);
3086
          break;
3087
        case lang_wild_statement_enum:
3088
          /* Maybe we should load the file's symbols.  */
3089
          if (s->wild_statement.filename
3090
              && !wildcardp (s->wild_statement.filename)
3091
              && !archive_path (s->wild_statement.filename))
3092
            lookup_name (s->wild_statement.filename);
3093
          open_input_bfds (s->wild_statement.children.head, force);
3094
          break;
3095
        case lang_group_statement_enum:
3096
          {
3097
            struct bfd_link_hash_entry *undefs;
3098
 
3099
            /* We must continually search the entries in the group
3100
               until no new symbols are added to the list of undefined
3101
               symbols.  */
3102
 
3103
            do
3104
              {
3105
                undefs = link_info.hash->undefs_tail;
3106
                open_input_bfds (s->group_statement.children.head, TRUE);
3107
              }
3108
            while (undefs != link_info.hash->undefs_tail);
3109
          }
3110
          break;
3111
        case lang_target_statement_enum:
3112
          current_target = s->target_statement.target;
3113
          break;
3114
        case lang_input_statement_enum:
3115
          if (s->input_statement.real)
3116
            {
3117
              lang_statement_union_type **os_tail;
3118
              lang_statement_list_type add;
3119
 
3120
              s->input_statement.target = current_target;
3121
 
3122
              /* If we are being called from within a group, and this
3123
                 is an archive which has already been searched, then
3124
                 force it to be researched unless the whole archive
3125
                 has been loaded already.  */
3126
              if (force
3127
                  && !s->input_statement.whole_archive
3128
                  && s->input_statement.loaded
3129
                  && bfd_check_format (s->input_statement.the_bfd,
3130
                                       bfd_archive))
3131
                s->input_statement.loaded = FALSE;
3132
 
3133
              os_tail = lang_output_section_statement.tail;
3134
              lang_list_init (&add);
3135
 
3136
              if (! load_symbols (&s->input_statement, &add))
3137
                config.make_executable = FALSE;
3138
 
3139
              if (add.head != NULL)
3140
                {
3141
                  /* If this was a script with output sections then
3142
                     tack any added statements on to the end of the
3143
                     list.  This avoids having to reorder the output
3144
                     section statement list.  Very likely the user
3145
                     forgot -T, and whatever we do here will not meet
3146
                     naive user expectations.  */
3147
                  if (os_tail != lang_output_section_statement.tail)
3148
                    {
3149
                      einfo (_("%P: warning: %s contains output sections;"
3150
                               " did you forget -T?\n"),
3151
                             s->input_statement.filename);
3152
                      *stat_ptr->tail = add.head;
3153
                      stat_ptr->tail = add.tail;
3154
                    }
3155
                  else
3156
                    {
3157
                      *add.tail = s->header.next;
3158
                      s->header.next = add.head;
3159
                    }
3160
                }
3161
            }
3162
          break;
3163
        default:
3164
          break;
3165
        }
3166
    }
3167
}
3168
 
3169
/* Add a symbol to a hash of symbols used in DEFINED (NAME) expressions.  */
3170
 
3171
void
3172
lang_track_definedness (const char *name)
3173
{
3174
  if (bfd_hash_lookup (&lang_definedness_table, name, TRUE, FALSE) == NULL)
3175
    einfo (_("%P%F: bfd_hash_lookup failed creating symbol %s\n"), name);
3176
}
3177
 
3178
/* New-function for the definedness hash table.  */
3179
 
3180
static struct bfd_hash_entry *
3181
lang_definedness_newfunc (struct bfd_hash_entry *entry,
3182
                          struct bfd_hash_table *table ATTRIBUTE_UNUSED,
3183
                          const char *name ATTRIBUTE_UNUSED)
3184
{
3185
  struct lang_definedness_hash_entry *ret
3186
    = (struct lang_definedness_hash_entry *) entry;
3187
 
3188
  if (ret == NULL)
3189
    ret = (struct lang_definedness_hash_entry *)
3190
      bfd_hash_allocate (table, sizeof (struct lang_definedness_hash_entry));
3191
 
3192
  if (ret == NULL)
3193
    einfo (_("%P%F: bfd_hash_allocate failed creating symbol %s\n"), name);
3194
 
3195
  ret->iteration = -1;
3196
  return &ret->root;
3197
}
3198
 
3199
/* Return the iteration when the definition of NAME was last updated.  A
3200
   value of -1 means that the symbol is not defined in the linker script
3201
   or the command line, but may be defined in the linker symbol table.  */
3202
 
3203
int
3204
lang_symbol_definition_iteration (const char *name)
3205
{
3206
  struct lang_definedness_hash_entry *defentry
3207
    = (struct lang_definedness_hash_entry *)
3208
    bfd_hash_lookup (&lang_definedness_table, name, FALSE, FALSE);
3209
 
3210
  /* We've already created this one on the presence of DEFINED in the
3211
     script, so it can't be NULL unless something is borked elsewhere in
3212
     the code.  */
3213
  if (defentry == NULL)
3214
    FAIL ();
3215
 
3216
  return defentry->iteration;
3217
}
3218
 
3219
/* Update the definedness state of NAME.  */
3220
 
3221
void
3222
lang_update_definedness (const char *name, struct bfd_link_hash_entry *h)
3223
{
3224
  struct lang_definedness_hash_entry *defentry
3225
    = (struct lang_definedness_hash_entry *)
3226
    bfd_hash_lookup (&lang_definedness_table, name, FALSE, FALSE);
3227
 
3228
  /* We don't keep track of symbols not tested with DEFINED.  */
3229
  if (defentry == NULL)
3230
    return;
3231
 
3232
  /* If the symbol was already defined, and not from an earlier statement
3233
     iteration, don't update the definedness iteration, because that'd
3234
     make the symbol seem defined in the linker script at this point, and
3235
     it wasn't; it was defined in some object.  If we do anyway, DEFINED
3236
     would start to yield false before this point and the construct "sym =
3237
     DEFINED (sym) ? sym : X;" would change sym to X despite being defined
3238
     in an object.  */
3239
  if (h->type != bfd_link_hash_undefined
3240
      && h->type != bfd_link_hash_common
3241
      && h->type != bfd_link_hash_new
3242
      && defentry->iteration == -1)
3243
    return;
3244
 
3245
  defentry->iteration = lang_statement_iteration;
3246
}
3247
 
3248
/* Add the supplied name to the symbol table as an undefined reference.
3249
   This is a two step process as the symbol table doesn't even exist at
3250
   the time the ld command line is processed.  First we put the name
3251
   on a list, then, once the output file has been opened, transfer the
3252
   name to the symbol table.  */
3253
 
3254
typedef struct bfd_sym_chain ldlang_undef_chain_list_type;
3255
 
3256
#define ldlang_undef_chain_list_head entry_symbol.next
3257
 
3258
void
3259
ldlang_add_undef (const char *const name)
3260
{
3261
  ldlang_undef_chain_list_type *new_undef = (ldlang_undef_chain_list_type *)
3262
      stat_alloc (sizeof (ldlang_undef_chain_list_type));
3263
 
3264
  new_undef->next = ldlang_undef_chain_list_head;
3265
  ldlang_undef_chain_list_head = new_undef;
3266
 
3267
  new_undef->name = xstrdup (name);
3268
 
3269
  if (link_info.output_bfd != NULL)
3270
    insert_undefined (new_undef->name);
3271
}
3272
 
3273
/* Insert NAME as undefined in the symbol table.  */
3274
 
3275
static void
3276
insert_undefined (const char *name)
3277
{
3278
  struct bfd_link_hash_entry *h;
3279
 
3280
  h = bfd_link_hash_lookup (link_info.hash, name, TRUE, FALSE, TRUE);
3281
  if (h == NULL)
3282
    einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
3283
  if (h->type == bfd_link_hash_new)
3284
    {
3285
      h->type = bfd_link_hash_undefined;
3286
      h->u.undef.abfd = NULL;
3287
      bfd_link_add_undef (link_info.hash, h);
3288
    }
3289
}
3290
 
3291
/* Run through the list of undefineds created above and place them
3292
   into the linker hash table as undefined symbols belonging to the
3293
   script file.  */
3294
 
3295
static void
3296
lang_place_undefineds (void)
3297
{
3298
  ldlang_undef_chain_list_type *ptr;
3299
 
3300
  for (ptr = ldlang_undef_chain_list_head; ptr != NULL; ptr = ptr->next)
3301
    insert_undefined (ptr->name);
3302
}
3303
 
3304
/* Check for all readonly or some readwrite sections.  */
3305
 
3306
static void
3307
check_input_sections
3308
  (lang_statement_union_type *s,
3309
   lang_output_section_statement_type *output_section_statement)
3310
{
3311
  for (; s != (lang_statement_union_type *) NULL; s = s->header.next)
3312
    {
3313
      switch (s->header.type)
3314
        {
3315
        case lang_wild_statement_enum:
3316
          walk_wild (&s->wild_statement, check_section_callback,
3317
                     output_section_statement);
3318
          if (! output_section_statement->all_input_readonly)
3319
            return;
3320
          break;
3321
        case lang_constructors_statement_enum:
3322
          check_input_sections (constructor_list.head,
3323
                                output_section_statement);
3324
          if (! output_section_statement->all_input_readonly)
3325
            return;
3326
          break;
3327
        case lang_group_statement_enum:
3328
          check_input_sections (s->group_statement.children.head,
3329
                                output_section_statement);
3330
          if (! output_section_statement->all_input_readonly)
3331
            return;
3332
          break;
3333
        default:
3334
          break;
3335
        }
3336
    }
3337
}
3338
 
3339
/* Update wildcard statements if needed.  */
3340
 
3341
static void
3342
update_wild_statements (lang_statement_union_type *s)
3343
{
3344
  struct wildcard_list *sec;
3345
 
3346
  switch (sort_section)
3347
    {
3348
    default:
3349
      FAIL ();
3350
 
3351
    case none:
3352
      break;
3353
 
3354
    case by_name:
3355
    case by_alignment:
3356
      for (; s != NULL; s = s->header.next)
3357
        {
3358
          switch (s->header.type)
3359
            {
3360
            default:
3361
              break;
3362
 
3363
            case lang_wild_statement_enum:
3364
              sec = s->wild_statement.section_list;
3365
              for (sec = s->wild_statement.section_list; sec != NULL;
3366
                   sec = sec->next)
3367
                {
3368
                  switch (sec->spec.sorted)
3369
                    {
3370
                    case none:
3371
                      sec->spec.sorted = sort_section;
3372
                      break;
3373
                    case by_name:
3374
                      if (sort_section == by_alignment)
3375
                        sec->spec.sorted = by_name_alignment;
3376
                      break;
3377
                    case by_alignment:
3378
                      if (sort_section == by_name)
3379
                        sec->spec.sorted = by_alignment_name;
3380
                      break;
3381
                    default:
3382
                      break;
3383
                    }
3384
                }
3385
              break;
3386
 
3387
            case lang_constructors_statement_enum:
3388
              update_wild_statements (constructor_list.head);
3389
              break;
3390
 
3391
            case lang_output_section_statement_enum:
3392
              update_wild_statements
3393
                (s->output_section_statement.children.head);
3394
              break;
3395
 
3396
            case lang_group_statement_enum:
3397
              update_wild_statements (s->group_statement.children.head);
3398
              break;
3399
            }
3400
        }
3401
      break;
3402
    }
3403
}
3404
 
3405
/* Open input files and attach to output sections.  */
3406
 
3407
static void
3408
map_input_to_output_sections
3409
  (lang_statement_union_type *s, const char *target,
3410
   lang_output_section_statement_type *os)
3411
{
3412
  flagword flags;
3413
 
3414
  for (; s != NULL; s = s->header.next)
3415
    {
3416
      switch (s->header.type)
3417
        {
3418
        case lang_wild_statement_enum:
3419
          wild (&s->wild_statement, target, os);
3420
          break;
3421
        case lang_constructors_statement_enum:
3422
          map_input_to_output_sections (constructor_list.head,
3423
                                        target,
3424
                                        os);
3425
          break;
3426
        case lang_output_section_statement_enum:
3427
          if (s->output_section_statement.constraint)
3428
            {
3429
              if (s->output_section_statement.constraint != ONLY_IF_RW
3430
                  && s->output_section_statement.constraint != ONLY_IF_RO)
3431
                break;
3432
              s->output_section_statement.all_input_readonly = TRUE;
3433
              check_input_sections (s->output_section_statement.children.head,
3434
                                    &s->output_section_statement);
3435
              if ((s->output_section_statement.all_input_readonly
3436
                   && s->output_section_statement.constraint == ONLY_IF_RW)
3437
                  || (!s->output_section_statement.all_input_readonly
3438
                      && s->output_section_statement.constraint == ONLY_IF_RO))
3439
                {
3440
                  s->output_section_statement.constraint = -1;
3441
                  break;
3442
                }
3443
            }
3444
 
3445
          map_input_to_output_sections (s->output_section_statement.children.head,
3446
                                        target,
3447
                                        &s->output_section_statement);
3448
          break;
3449
        case lang_output_statement_enum:
3450
          break;
3451
        case lang_target_statement_enum:
3452
          target = s->target_statement.target;
3453
          break;
3454
        case lang_group_statement_enum:
3455
          map_input_to_output_sections (s->group_statement.children.head,
3456
                                        target,
3457
                                        os);
3458
          break;
3459
        case lang_data_statement_enum:
3460
          /* Make sure that any sections mentioned in the expression
3461
             are initialized.  */
3462
          exp_init_os (s->data_statement.exp);
3463
          flags = SEC_HAS_CONTENTS;
3464
          /* The output section gets contents, and then we inspect for
3465
             any flags set in the input script which override any ALLOC.  */
3466
          if (!(os->flags & SEC_NEVER_LOAD))
3467
            flags |= SEC_ALLOC | SEC_LOAD;
3468
          if (os->bfd_section == NULL)
3469
            init_os (os, NULL, flags);
3470
          else
3471
            os->bfd_section->flags |= flags;
3472
          break;
3473
        case lang_input_section_enum:
3474
          break;
3475
        case lang_fill_statement_enum:
3476
        case lang_object_symbols_statement_enum:
3477
        case lang_reloc_statement_enum:
3478
        case lang_padding_statement_enum:
3479
        case lang_input_statement_enum:
3480
          if (os != NULL && os->bfd_section == NULL)
3481
            init_os (os, NULL, 0);
3482
          break;
3483
        case lang_assignment_statement_enum:
3484
          if (os != NULL && os->bfd_section == NULL)
3485
            init_os (os, NULL, 0);
3486
 
3487
          /* Make sure that any sections mentioned in the assignment
3488
             are initialized.  */
3489
          exp_init_os (s->assignment_statement.exp);
3490
          break;
3491
        case lang_address_statement_enum:
3492
          /* Mark the specified section with the supplied address.
3493
             If this section was actually a segment marker, then the
3494
             directive is ignored if the linker script explicitly
3495
             processed the segment marker.  Originally, the linker
3496
             treated segment directives (like -Ttext on the
3497
             command-line) as section directives.  We honor the
3498
             section directive semantics for backwards compatibilty;
3499
             linker scripts that do not specifically check for
3500
             SEGMENT_START automatically get the old semantics.  */
3501
          if (!s->address_statement.segment
3502
              || !s->address_statement.segment->used)
3503
            {
3504
              lang_output_section_statement_type *aos
3505
                = (lang_output_section_statement_lookup
3506
                   (s->address_statement.section_name, 0, TRUE));
3507
 
3508
              if (aos->bfd_section == NULL)
3509
                init_os (aos, NULL, 0);
3510
              aos->addr_tree = s->address_statement.address;
3511
            }
3512
          break;
3513
        case lang_insert_statement_enum:
3514
          break;
3515
        }
3516
    }
3517
}
3518
 
3519
/* An insert statement snips out all the linker statements from the
3520
   start of the list and places them after the output section
3521
   statement specified by the insert.  This operation is complicated
3522
   by the fact that we keep a doubly linked list of output section
3523
   statements as well as the singly linked list of all statements.  */
3524
 
3525
static void
3526
process_insert_statements (void)
3527
{
3528
  lang_statement_union_type **s;
3529
  lang_output_section_statement_type *first_os = NULL;
3530
  lang_output_section_statement_type *last_os = NULL;
3531
  lang_output_section_statement_type *os;
3532
 
3533
  /* "start of list" is actually the statement immediately after
3534
     the special abs_section output statement, so that it isn't
3535
     reordered.  */
3536
  s = &lang_output_section_statement.head;
3537
  while (*(s = &(*s)->header.next) != NULL)
3538
    {
3539
      if ((*s)->header.type == lang_output_section_statement_enum)
3540
        {
3541
          /* Keep pointers to the first and last output section
3542
             statement in the sequence we may be about to move.  */
3543
          os = &(*s)->output_section_statement;
3544
 
3545
          ASSERT (last_os == NULL || last_os->next == os);
3546
          last_os = os;
3547
 
3548
          /* Set constraint negative so that lang_output_section_find
3549
             won't match this output section statement.  At this
3550
             stage in linking constraint has values in the range
3551
             [-1, ONLY_IN_RW].  */
3552
          last_os->constraint = -2 - last_os->constraint;
3553
          if (first_os == NULL)
3554
            first_os = last_os;
3555
        }
3556
      else if ((*s)->header.type == lang_insert_statement_enum)
3557
        {
3558
          lang_insert_statement_type *i = &(*s)->insert_statement;
3559
          lang_output_section_statement_type *where;
3560
          lang_statement_union_type **ptr;
3561
          lang_statement_union_type *first;
3562
 
3563
          where = lang_output_section_find (i->where);
3564
          if (where != NULL && i->is_before)
3565
            {
3566
              do
3567
                where = where->prev;
3568
              while (where != NULL && where->constraint < 0);
3569
            }
3570
          if (where == NULL)
3571
            {
3572
              einfo (_("%F%P: %s not found for insert\n"), i->where);
3573
              return;
3574
            }
3575
 
3576
          /* Deal with reordering the output section statement list.  */
3577
          if (last_os != NULL)
3578
            {
3579
              asection *first_sec, *last_sec;
3580
              struct lang_output_section_statement_struct **next;
3581
 
3582
              /* Snip out the output sections we are moving.  */
3583
              first_os->prev->next = last_os->next;
3584
              if (last_os->next == NULL)
3585
                {
3586
                  next = &first_os->prev->next;
3587
                  lang_output_section_statement.tail
3588
                    = (lang_statement_union_type **) next;
3589
                }
3590
              else
3591
                last_os->next->prev = first_os->prev;
3592
              /* Add them in at the new position.  */
3593
              last_os->next = where->next;
3594
              if (where->next == NULL)
3595
                {
3596
                  next = &last_os->next;
3597
                  lang_output_section_statement.tail
3598
                    = (lang_statement_union_type **) next;
3599
                }
3600
              else
3601
                where->next->prev = last_os;
3602
              first_os->prev = where;
3603
              where->next = first_os;
3604
 
3605
              /* Move the bfd sections in the same way.  */
3606
              first_sec = NULL;
3607
              last_sec = NULL;
3608
              for (os = first_os; os != NULL; os = os->next)
3609
                {
3610
                  os->constraint = -2 - os->constraint;
3611
                  if (os->bfd_section != NULL
3612
                      && os->bfd_section->owner != NULL)
3613
                    {
3614
                      last_sec = os->bfd_section;
3615
                      if (first_sec == NULL)
3616
                        first_sec = last_sec;
3617
                    }
3618
                  if (os == last_os)
3619
                    break;
3620
                }
3621
              if (last_sec != NULL)
3622
                {
3623
                  asection *sec = where->bfd_section;
3624
                  if (sec == NULL)
3625
                    sec = output_prev_sec_find (where);
3626
 
3627
                  /* The place we want to insert must come after the
3628
                     sections we are moving.  So if we find no
3629
                     section or if the section is the same as our
3630
                     last section, then no move is needed.  */
3631
                  if (sec != NULL && sec != last_sec)
3632
                    {
3633
                      /* Trim them off.  */
3634
                      if (first_sec->prev != NULL)
3635
                        first_sec->prev->next = last_sec->next;
3636
                      else
3637
                        link_info.output_bfd->sections = last_sec->next;
3638
                      if (last_sec->next != NULL)
3639
                        last_sec->next->prev = first_sec->prev;
3640
                      else
3641
                        link_info.output_bfd->section_last = first_sec->prev;
3642
                      /* Add back.  */
3643
                      last_sec->next = sec->next;
3644
                      if (sec->next != NULL)
3645
                        sec->next->prev = last_sec;
3646
                      else
3647
                        link_info.output_bfd->section_last = last_sec;
3648
                      first_sec->prev = sec;
3649
                      sec->next = first_sec;
3650
                    }
3651
                }
3652
 
3653
              first_os = NULL;
3654
              last_os = NULL;
3655
            }
3656
 
3657
          ptr = insert_os_after (where);
3658
          /* Snip everything after the abs_section output statement we
3659
             know is at the start of the list, up to and including
3660
             the insert statement we are currently processing.  */
3661
          first = lang_output_section_statement.head->header.next;
3662
          lang_output_section_statement.head->header.next = (*s)->header.next;
3663
          /* Add them back where they belong.  */
3664
          *s = *ptr;
3665
          if (*s == NULL)
3666
            statement_list.tail = s;
3667
          *ptr = first;
3668
          s = &lang_output_section_statement.head;
3669
        }
3670
    }
3671
 
3672
  /* Undo constraint twiddling.  */
3673
  for (os = first_os; os != NULL; os = os->next)
3674
    {
3675
      os->constraint = -2 - os->constraint;
3676
      if (os == last_os)
3677
        break;
3678
    }
3679
}
3680
 
3681
/* An output section might have been removed after its statement was
3682
   added.  For example, ldemul_before_allocation can remove dynamic
3683
   sections if they turn out to be not needed.  Clean them up here.  */
3684
 
3685
void
3686
strip_excluded_output_sections (void)
3687
{
3688
  lang_output_section_statement_type *os;
3689
 
3690
  /* Run lang_size_sections (if not already done).  */
3691
  if (expld.phase != lang_mark_phase_enum)
3692
    {
3693
      expld.phase = lang_mark_phase_enum;
3694
      expld.dataseg.phase = exp_dataseg_none;
3695
      one_lang_size_sections_pass (NULL, FALSE);
3696
      lang_reset_memory_regions ();
3697
    }
3698
 
3699
  for (os = &lang_output_section_statement.head->output_section_statement;
3700
       os != NULL;
3701
       os = os->next)
3702
    {
3703
      asection *output_section;
3704
      bfd_boolean exclude;
3705
 
3706
      if (os->constraint < 0)
3707
        continue;
3708
 
3709
      output_section = os->bfd_section;
3710
      if (output_section == NULL)
3711
        continue;
3712
 
3713
      exclude = (output_section->rawsize == 0
3714
                 && (output_section->flags & SEC_KEEP) == 0
3715
                 && !bfd_section_removed_from_list (link_info.output_bfd,
3716
                                                    output_section));
3717
 
3718
      /* Some sections have not yet been sized, notably .gnu.version,
3719
         .dynsym, .dynstr and .hash.  These all have SEC_LINKER_CREATED
3720
         input sections, so don't drop output sections that have such
3721
         input sections unless they are also marked SEC_EXCLUDE.  */
3722
      if (exclude && output_section->map_head.s != NULL)
3723
        {
3724
          asection *s;
3725
 
3726
          for (s = output_section->map_head.s; s != NULL; s = s->map_head.s)
3727
            if ((s->flags & SEC_LINKER_CREATED) != 0
3728
                && (s->flags & SEC_EXCLUDE) == 0)
3729
              {
3730
                exclude = FALSE;
3731
                break;
3732
              }
3733
        }
3734
 
3735
      /* TODO: Don't just junk map_head.s, turn them into link_orders.  */
3736
      output_section->map_head.link_order = NULL;
3737
      output_section->map_tail.link_order = NULL;
3738
 
3739
      if (exclude)
3740
        {
3741
          /* We don't set bfd_section to NULL since bfd_section of the
3742
             removed output section statement may still be used.  */
3743
          if (!os->section_relative_symbol
3744
              && !os->update_dot_tree)
3745
            os->ignored = TRUE;
3746
          output_section->flags |= SEC_EXCLUDE;
3747
          bfd_section_list_remove (link_info.output_bfd, output_section);
3748
          link_info.output_bfd->section_count--;
3749
        }
3750
    }
3751
 
3752
  /* Stop future calls to lang_add_section from messing with map_head
3753
     and map_tail link_order fields.  */
3754
  stripped_excluded_sections = TRUE;
3755
}
3756
 
3757
static void
3758
print_output_section_statement
3759
  (lang_output_section_statement_type *output_section_statement)
3760
{
3761
  asection *section = output_section_statement->bfd_section;
3762
  int len;
3763
 
3764
  if (output_section_statement != abs_output_section)
3765
    {
3766
      minfo ("\n%s", output_section_statement->name);
3767
 
3768
      if (section != NULL)
3769
        {
3770
          print_dot = section->vma;
3771
 
3772
          len = strlen (output_section_statement->name);
3773
          if (len >= SECTION_NAME_MAP_LENGTH - 1)
3774
            {
3775
              print_nl ();
3776
              len = 0;
3777
            }
3778
          while (len < SECTION_NAME_MAP_LENGTH)
3779
            {
3780
              print_space ();
3781
              ++len;
3782
            }
3783
 
3784
          minfo ("0x%V %W", section->vma, section->size);
3785
 
3786
          if (section->vma != section->lma)
3787
            minfo (_(" load address 0x%V"), section->lma);
3788
 
3789
          if (output_section_statement->update_dot_tree != NULL)
3790
            exp_fold_tree (output_section_statement->update_dot_tree,
3791
                           bfd_abs_section_ptr, &print_dot);
3792
        }
3793
 
3794
      print_nl ();
3795
    }
3796
 
3797
  print_statement_list (output_section_statement->children.head,
3798
                        output_section_statement);
3799
}
3800
 
3801
/* Scan for the use of the destination in the right hand side
3802
   of an expression.  In such cases we will not compute the
3803
   correct expression, since the value of DST that is used on
3804
   the right hand side will be its final value, not its value
3805
   just before this expression is evaluated.  */
3806
 
3807
static bfd_boolean
3808
scan_for_self_assignment (const char * dst, etree_type * rhs)
3809
{
3810
  if (rhs == NULL || dst == NULL)
3811
    return FALSE;
3812
 
3813
  switch (rhs->type.node_class)
3814
    {
3815
    case etree_binary:
3816
      return scan_for_self_assignment (dst, rhs->binary.lhs)
3817
        ||   scan_for_self_assignment (dst, rhs->binary.rhs);
3818
 
3819
    case etree_trinary:
3820
      return scan_for_self_assignment (dst, rhs->trinary.lhs)
3821
        ||   scan_for_self_assignment (dst, rhs->trinary.rhs);
3822
 
3823
    case etree_assign:
3824
    case etree_provided:
3825
    case etree_provide:
3826
      if (strcmp (dst, rhs->assign.dst) == 0)
3827
        return TRUE;
3828
      return scan_for_self_assignment (dst, rhs->assign.src);
3829
 
3830
    case etree_unary:
3831
      return scan_for_self_assignment (dst, rhs->unary.child);
3832
 
3833
    case etree_value:
3834
      if (rhs->value.str)
3835
        return strcmp (dst, rhs->value.str) == 0;
3836
      return FALSE;
3837
 
3838
    case etree_name:
3839
      if (rhs->name.name)
3840
        return strcmp (dst, rhs->name.name) == 0;
3841
      return FALSE;
3842
 
3843
    default:
3844
      break;
3845
    }
3846
 
3847
  return FALSE;
3848
}
3849
 
3850
 
3851
static void
3852
print_assignment (lang_assignment_statement_type *assignment,
3853
                  lang_output_section_statement_type *output_section)
3854
{
3855
  unsigned int i;
3856
  bfd_boolean is_dot;
3857
  bfd_boolean computation_is_valid = TRUE;
3858
  etree_type *tree;
3859
 
3860
  for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
3861
    print_space ();
3862
 
3863
  if (assignment->exp->type.node_class == etree_assert)
3864
    {
3865
      is_dot = FALSE;
3866
      tree = assignment->exp->assert_s.child;
3867
      computation_is_valid = TRUE;
3868
    }
3869
  else
3870
    {
3871
      const char *dst = assignment->exp->assign.dst;
3872
 
3873
      is_dot = (dst[0] == '.' && dst[1] == 0);
3874
      tree = assignment->exp->assign.src;
3875
      computation_is_valid = is_dot || (scan_for_self_assignment (dst, tree) == FALSE);
3876
    }
3877
 
3878
  exp_fold_tree (tree, output_section->bfd_section, &print_dot);
3879
  if (expld.result.valid_p)
3880
    {
3881
      bfd_vma value;
3882
 
3883
      if (computation_is_valid)
3884
        {
3885
          value = expld.result.value;
3886
 
3887
          if (expld.result.section)
3888
            value += expld.result.section->vma;
3889
 
3890
          minfo ("0x%V", value);
3891
          if (is_dot)
3892
            print_dot = value;
3893
        }
3894
      else
3895
        {
3896
          struct bfd_link_hash_entry *h;
3897
 
3898
          h = bfd_link_hash_lookup (link_info.hash, assignment->exp->assign.dst,
3899
                                    FALSE, FALSE, TRUE);
3900
          if (h)
3901
            {
3902
              value = h->u.def.value;
3903
 
3904
              if (expld.result.section)
3905
                value += expld.result.section->vma;
3906
 
3907
              minfo ("[0x%V]", value);
3908
            }
3909
          else
3910
            minfo ("[unresolved]");
3911
        }
3912
    }
3913
  else
3914
    {
3915
      minfo ("*undef*   ");
3916
#ifdef BFD64
3917
      minfo ("        ");
3918
#endif
3919
    }
3920
 
3921
  minfo ("                ");
3922
  exp_print_tree (assignment->exp);
3923
  print_nl ();
3924
}
3925
 
3926
static void
3927
print_input_statement (lang_input_statement_type *statm)
3928
{
3929
  if (statm->filename != NULL
3930
      && (statm->the_bfd == NULL
3931
          || (statm->the_bfd->flags & BFD_LINKER_CREATED) == 0))
3932
    fprintf (config.map_file, "LOAD %s\n", statm->filename);
3933
}
3934
 
3935
/* Print all symbols defined in a particular section.  This is called
3936
   via bfd_link_hash_traverse, or by print_all_symbols.  */
3937
 
3938
static bfd_boolean
3939
print_one_symbol (struct bfd_link_hash_entry *hash_entry, void *ptr)
3940
{
3941
  asection *sec = (asection *) ptr;
3942
 
3943
  if ((hash_entry->type == bfd_link_hash_defined
3944
       || hash_entry->type == bfd_link_hash_defweak)
3945
      && sec == hash_entry->u.def.section)
3946
    {
3947
      int i;
3948
 
3949
      for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
3950
        print_space ();
3951
      minfo ("0x%V   ",
3952
             (hash_entry->u.def.value
3953
              + hash_entry->u.def.section->output_offset
3954
              + hash_entry->u.def.section->output_section->vma));
3955
 
3956
      minfo ("             %T\n", hash_entry->root.string);
3957
    }
3958
 
3959
  return TRUE;
3960
}
3961
 
3962
static int
3963
hash_entry_addr_cmp (const void *a, const void *b)
3964
{
3965
  const struct bfd_link_hash_entry *l = *(const struct bfd_link_hash_entry **)a;
3966
  const struct bfd_link_hash_entry *r = *(const struct bfd_link_hash_entry **)b;
3967
 
3968
  if (l->u.def.value < r->u.def.value)
3969
    return -1;
3970
  else if (l->u.def.value > r->u.def.value)
3971
    return 1;
3972
  else
3973
    return 0;
3974
}
3975
 
3976
static void
3977
print_all_symbols (asection *sec)
3978
{
3979
  struct fat_user_section_struct *ud =
3980
      (struct fat_user_section_struct *) get_userdata (sec);
3981
  struct map_symbol_def *def;
3982
  struct bfd_link_hash_entry **entries;
3983
  unsigned int i;
3984
 
3985
  if (!ud)
3986
    return;
3987
 
3988
  *ud->map_symbol_def_tail = 0;
3989
 
3990
  /* Sort the symbols by address.  */
3991
  entries = (struct bfd_link_hash_entry **)
3992
      obstack_alloc (&map_obstack, ud->map_symbol_def_count * sizeof (*entries));
3993
 
3994
  for (i = 0, def = ud->map_symbol_def_head; def; def = def->next, i++)
3995
    entries[i] = def->entry;
3996
 
3997
  qsort (entries, ud->map_symbol_def_count, sizeof (*entries),
3998
         hash_entry_addr_cmp);
3999
 
4000
  /* Print the symbols.  */
4001
  for (i = 0; i < ud->map_symbol_def_count; i++)
4002
    print_one_symbol (entries[i], sec);
4003
 
4004
  obstack_free (&map_obstack, entries);
4005
}
4006
 
4007
/* Print information about an input section to the map file.  */
4008
 
4009
static void
4010
print_input_section (asection *i, bfd_boolean is_discarded)
4011
{
4012
  bfd_size_type size = i->size;
4013
  int len;
4014
  bfd_vma addr;
4015
 
4016
  init_opb ();
4017
 
4018
  print_space ();
4019
  minfo ("%s", i->name);
4020
 
4021
  len = 1 + strlen (i->name);
4022
  if (len >= SECTION_NAME_MAP_LENGTH - 1)
4023
    {
4024
      print_nl ();
4025
      len = 0;
4026
    }
4027
  while (len < SECTION_NAME_MAP_LENGTH)
4028
    {
4029
      print_space ();
4030
      ++len;
4031
    }
4032
 
4033
  if (i->output_section != NULL
4034
      && i->output_section->owner == link_info.output_bfd)
4035
    addr = i->output_section->vma + i->output_offset;
4036
  else
4037
    {
4038
      addr = print_dot;
4039
      if (!is_discarded)
4040
        size = 0;
4041
    }
4042
 
4043
  minfo ("0x%V %W %B\n", addr, TO_ADDR (size), i->owner);
4044
 
4045
  if (size != i->rawsize && i->rawsize != 0)
4046
    {
4047
      len = SECTION_NAME_MAP_LENGTH + 3;
4048
#ifdef BFD64
4049
      len += 16;
4050
#else
4051
      len += 8;
4052
#endif
4053
      while (len > 0)
4054
        {
4055
          print_space ();
4056
          --len;
4057
        }
4058
 
4059
      minfo (_("%W (size before relaxing)\n"), i->rawsize);
4060
    }
4061
 
4062
  if (i->output_section != NULL
4063
      && i->output_section->owner == link_info.output_bfd)
4064
    {
4065
      if (link_info.reduce_memory_overheads)
4066
        bfd_link_hash_traverse (link_info.hash, print_one_symbol, i);
4067
      else
4068
        print_all_symbols (i);
4069
 
4070
      /* Update print_dot, but make sure that we do not move it
4071
         backwards - this could happen if we have overlays and a
4072
         later overlay is shorter than an earier one.  */
4073
      if (addr + TO_ADDR (size) > print_dot)
4074
        print_dot = addr + TO_ADDR (size);
4075
    }
4076
}
4077
 
4078
static void
4079
print_fill_statement (lang_fill_statement_type *fill)
4080
{
4081
  size_t size;
4082
  unsigned char *p;
4083
  fputs (" FILL mask 0x", config.map_file);
4084
  for (p = fill->fill->data, size = fill->fill->size; size != 0; p++, size--)
4085
    fprintf (config.map_file, "%02x", *p);
4086
  fputs ("\n", config.map_file);
4087
}
4088
 
4089
static void
4090
print_data_statement (lang_data_statement_type *data)
4091
{
4092
  int i;
4093
  bfd_vma addr;
4094
  bfd_size_type size;
4095
  const char *name;
4096
 
4097
  init_opb ();
4098
  for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
4099
    print_space ();
4100
 
4101
  addr = data->output_offset;
4102
  if (data->output_section != NULL)
4103
    addr += data->output_section->vma;
4104
 
4105
  switch (data->type)
4106
    {
4107
    default:
4108
      abort ();
4109
    case BYTE:
4110
      size = BYTE_SIZE;
4111
      name = "BYTE";
4112
      break;
4113
    case SHORT:
4114
      size = SHORT_SIZE;
4115
      name = "SHORT";
4116
      break;
4117
    case LONG:
4118
      size = LONG_SIZE;
4119
      name = "LONG";
4120
      break;
4121
    case QUAD:
4122
      size = QUAD_SIZE;
4123
      name = "QUAD";
4124
      break;
4125
    case SQUAD:
4126
      size = QUAD_SIZE;
4127
      name = "SQUAD";
4128
      break;
4129
    }
4130
 
4131
  minfo ("0x%V %W %s 0x%v", addr, size, name, data->value);
4132
 
4133
  if (data->exp->type.node_class != etree_value)
4134
    {
4135
      print_space ();
4136
      exp_print_tree (data->exp);
4137
    }
4138
 
4139
  print_nl ();
4140
 
4141
  print_dot = addr + TO_ADDR (size);
4142
}
4143
 
4144
/* Print an address statement.  These are generated by options like
4145
   -Ttext.  */
4146
 
4147
static void
4148
print_address_statement (lang_address_statement_type *address)
4149
{
4150
  minfo (_("Address of section %s set to "), address->section_name);
4151
  exp_print_tree (address->address);
4152
  print_nl ();
4153
}
4154
 
4155
/* Print a reloc statement.  */
4156
 
4157
static void
4158
print_reloc_statement (lang_reloc_statement_type *reloc)
4159
{
4160
  int i;
4161
  bfd_vma addr;
4162
  bfd_size_type size;
4163
 
4164
  init_opb ();
4165
  for (i = 0; i < SECTION_NAME_MAP_LENGTH; i++)
4166
    print_space ();
4167
 
4168
  addr = reloc->output_offset;
4169
  if (reloc->output_section != NULL)
4170
    addr += reloc->output_section->vma;
4171
 
4172
  size = bfd_get_reloc_size (reloc->howto);
4173
 
4174
  minfo ("0x%V %W RELOC %s ", addr, size, reloc->howto->name);
4175
 
4176
  if (reloc->name != NULL)
4177
    minfo ("%s+", reloc->name);
4178
  else
4179
    minfo ("%s+", reloc->section->name);
4180
 
4181
  exp_print_tree (reloc->addend_exp);
4182
 
4183
  print_nl ();
4184
 
4185
  print_dot = addr + TO_ADDR (size);
4186
}
4187
 
4188
static void
4189
print_padding_statement (lang_padding_statement_type *s)
4190
{
4191
  int len;
4192
  bfd_vma addr;
4193
 
4194
  init_opb ();
4195
  minfo (" *fill*");
4196
 
4197
  len = sizeof " *fill*" - 1;
4198
  while (len < SECTION_NAME_MAP_LENGTH)
4199
    {
4200
      print_space ();
4201
      ++len;
4202
    }
4203
 
4204
  addr = s->output_offset;
4205
  if (s->output_section != NULL)
4206
    addr += s->output_section->vma;
4207
  minfo ("0x%V %W ", addr, (bfd_vma) s->size);
4208
 
4209
  if (s->fill->size != 0)
4210
    {
4211
      size_t size;
4212
      unsigned char *p;
4213
      for (p = s->fill->data, size = s->fill->size; size != 0; p++, size--)
4214
        fprintf (config.map_file, "%02x", *p);
4215
    }
4216
 
4217
  print_nl ();
4218
 
4219
  print_dot = addr + TO_ADDR (s->size);
4220
}
4221
 
4222
static void
4223
print_wild_statement (lang_wild_statement_type *w,
4224
                      lang_output_section_statement_type *os)
4225
{
4226
  struct wildcard_list *sec;
4227
 
4228
  print_space ();
4229
 
4230
  if (w->filenames_sorted)
4231
    minfo ("SORT(");
4232
  if (w->filename != NULL)
4233
    minfo ("%s", w->filename);
4234
  else
4235
    minfo ("*");
4236
  if (w->filenames_sorted)
4237
    minfo (")");
4238
 
4239
  minfo ("(");
4240
  for (sec = w->section_list; sec; sec = sec->next)
4241
    {
4242
      if (sec->spec.sorted)
4243
        minfo ("SORT(");
4244
      if (sec->spec.exclude_name_list != NULL)
4245
        {
4246
          name_list *tmp;
4247
          minfo ("EXCLUDE_FILE(%s", sec->spec.exclude_name_list->name);
4248
          for (tmp = sec->spec.exclude_name_list->next; tmp; tmp = tmp->next)
4249
            minfo (" %s", tmp->name);
4250
          minfo (") ");
4251
        }
4252
      if (sec->spec.name != NULL)
4253
        minfo ("%s", sec->spec.name);
4254
      else
4255
        minfo ("*");
4256
      if (sec->spec.sorted)
4257
        minfo (")");
4258
      if (sec->next)
4259
        minfo (" ");
4260
    }
4261
  minfo (")");
4262
 
4263
  print_nl ();
4264
 
4265
  print_statement_list (w->children.head, os);
4266
}
4267
 
4268
/* Print a group statement.  */
4269
 
4270
static void
4271
print_group (lang_group_statement_type *s,
4272
             lang_output_section_statement_type *os)
4273
{
4274
  fprintf (config.map_file, "START GROUP\n");
4275
  print_statement_list (s->children.head, os);
4276
  fprintf (config.map_file, "END GROUP\n");
4277
}
4278
 
4279
/* Print the list of statements in S.
4280
   This can be called for any statement type.  */
4281
 
4282
static void
4283
print_statement_list (lang_statement_union_type *s,
4284
                      lang_output_section_statement_type *os)
4285
{
4286
  while (s != NULL)
4287
    {
4288
      print_statement (s, os);
4289
      s = s->header.next;
4290
    }
4291
}
4292
 
4293
/* Print the first statement in statement list S.
4294
   This can be called for any statement type.  */
4295
 
4296
static void
4297
print_statement (lang_statement_union_type *s,
4298
                 lang_output_section_statement_type *os)
4299
{
4300
  switch (s->header.type)
4301
    {
4302
    default:
4303
      fprintf (config.map_file, _("Fail with %d\n"), s->header.type);
4304
      FAIL ();
4305
      break;
4306
    case lang_constructors_statement_enum:
4307
      if (constructor_list.head != NULL)
4308
        {
4309
          if (constructors_sorted)
4310
            minfo (" SORT (CONSTRUCTORS)\n");
4311
          else
4312
            minfo (" CONSTRUCTORS\n");
4313
          print_statement_list (constructor_list.head, os);
4314
        }
4315
      break;
4316
    case lang_wild_statement_enum:
4317
      print_wild_statement (&s->wild_statement, os);
4318
      break;
4319
    case lang_address_statement_enum:
4320
      print_address_statement (&s->address_statement);
4321
      break;
4322
    case lang_object_symbols_statement_enum:
4323
      minfo (" CREATE_OBJECT_SYMBOLS\n");
4324
      break;
4325
    case lang_fill_statement_enum:
4326
      print_fill_statement (&s->fill_statement);
4327
      break;
4328
    case lang_data_statement_enum:
4329
      print_data_statement (&s->data_statement);
4330
      break;
4331
    case lang_reloc_statement_enum:
4332
      print_reloc_statement (&s->reloc_statement);
4333
      break;
4334
    case lang_input_section_enum:
4335
      print_input_section (s->input_section.section, FALSE);
4336
      break;
4337
    case lang_padding_statement_enum:
4338
      print_padding_statement (&s->padding_statement);
4339
      break;
4340
    case lang_output_section_statement_enum:
4341
      print_output_section_statement (&s->output_section_statement);
4342
      break;
4343
    case lang_assignment_statement_enum:
4344
      print_assignment (&s->assignment_statement, os);
4345
      break;
4346
    case lang_target_statement_enum:
4347
      fprintf (config.map_file, "TARGET(%s)\n", s->target_statement.target);
4348
      break;
4349
    case lang_output_statement_enum:
4350
      minfo ("OUTPUT(%s", s->output_statement.name);
4351
      if (output_target != NULL)
4352
        minfo (" %s", output_target);
4353
      minfo (")\n");
4354
      break;
4355
    case lang_input_statement_enum:
4356
      print_input_statement (&s->input_statement);
4357
      break;
4358
    case lang_group_statement_enum:
4359
      print_group (&s->group_statement, os);
4360
      break;
4361
    case lang_insert_statement_enum:
4362
      minfo ("INSERT %s %s\n",
4363
             s->insert_statement.is_before ? "BEFORE" : "AFTER",
4364
             s->insert_statement.where);
4365
      break;
4366
    }
4367
}
4368
 
4369
static void
4370
print_statements (void)
4371
{
4372
  print_statement_list (statement_list.head, abs_output_section);
4373
}
4374
 
4375
/* Print the first N statements in statement list S to STDERR.
4376
   If N == 0, nothing is printed.
4377
   If N < 0, the entire list is printed.
4378
   Intended to be called from GDB.  */
4379
 
4380
void
4381
dprint_statement (lang_statement_union_type *s, int n)
4382
{
4383
  FILE *map_save = config.map_file;
4384
 
4385
  config.map_file = stderr;
4386
 
4387
  if (n < 0)
4388
    print_statement_list (s, abs_output_section);
4389
  else
4390
    {
4391
      while (s && --n >= 0)
4392
        {
4393
          print_statement (s, abs_output_section);
4394
          s = s->header.next;
4395
        }
4396
    }
4397
 
4398
  config.map_file = map_save;
4399
}
4400
 
4401
static void
4402
insert_pad (lang_statement_union_type **ptr,
4403
            fill_type *fill,
4404
            unsigned int alignment_needed,
4405
            asection *output_section,
4406
            bfd_vma dot)
4407
{
4408
  static fill_type zero_fill = { 1, { 0 } };
4409
  lang_statement_union_type *pad = NULL;
4410
 
4411
  if (ptr != &statement_list.head)
4412
    pad = ((lang_statement_union_type *)
4413
           ((char *) ptr - offsetof (lang_statement_union_type, header.next)));
4414
  if (pad != NULL
4415
      && pad->header.type == lang_padding_statement_enum
4416
      && pad->padding_statement.output_section == output_section)
4417
    {
4418
      /* Use the existing pad statement.  */
4419
    }
4420
  else if ((pad = *ptr) != NULL
4421
           && pad->header.type == lang_padding_statement_enum
4422
           && pad->padding_statement.output_section == output_section)
4423
    {
4424
      /* Use the existing pad statement.  */
4425
    }
4426
  else
4427
    {
4428
      /* Make a new padding statement, linked into existing chain.  */
4429
      pad = (lang_statement_union_type *)
4430
          stat_alloc (sizeof (lang_padding_statement_type));
4431
      pad->header.next = *ptr;
4432
      *ptr = pad;
4433
      pad->header.type = lang_padding_statement_enum;
4434
      pad->padding_statement.output_section = output_section;
4435
      if (fill == NULL)
4436
        fill = &zero_fill;
4437
      pad->padding_statement.fill = fill;
4438
    }
4439
  pad->padding_statement.output_offset = dot - output_section->vma;
4440
  pad->padding_statement.size = alignment_needed;
4441
  output_section->size += alignment_needed;
4442
}
4443
 
4444
/* Work out how much this section will move the dot point.  */
4445
 
4446
static bfd_vma
4447
size_input_section
4448
  (lang_statement_union_type **this_ptr,
4449
   lang_output_section_statement_type *output_section_statement,
4450
   fill_type *fill,
4451
   bfd_vma dot)
4452
{
4453
  lang_input_section_type *is = &((*this_ptr)->input_section);
4454
  asection *i = is->section;
4455
 
4456
  if (!((lang_input_statement_type *) i->owner->usrdata)->just_syms_flag
4457
      && (i->flags & SEC_EXCLUDE) == 0)
4458
    {
4459
      unsigned int alignment_needed;
4460
      asection *o;
4461
 
4462
      /* Align this section first to the input sections requirement,
4463
         then to the output section's requirement.  If this alignment
4464
         is greater than any seen before, then record it too.  Perform
4465
         the alignment by inserting a magic 'padding' statement.  */
4466
 
4467
      if (output_section_statement->subsection_alignment != -1)
4468
        i->alignment_power = output_section_statement->subsection_alignment;
4469
 
4470
      o = output_section_statement->bfd_section;
4471
      if (o->alignment_power < i->alignment_power)
4472
        o->alignment_power = i->alignment_power;
4473
 
4474
      alignment_needed = align_power (dot, i->alignment_power) - dot;
4475
 
4476
      if (alignment_needed != 0)
4477
        {
4478
          insert_pad (this_ptr, fill, TO_SIZE (alignment_needed), o, dot);
4479
          dot += alignment_needed;
4480
        }
4481
 
4482
      /* Remember where in the output section this input section goes.  */
4483
 
4484
      i->output_offset = dot - o->vma;
4485
 
4486
      /* Mark how big the output section must be to contain this now.  */
4487
      dot += TO_ADDR (i->size);
4488
      o->size = TO_SIZE (dot - o->vma);
4489
    }
4490
  else
4491
    {
4492
      i->output_offset = i->vma - output_section_statement->bfd_section->vma;
4493
    }
4494
 
4495
  return dot;
4496
}
4497
 
4498
static int
4499
sort_sections_by_lma (const void *arg1, const void *arg2)
4500
{
4501
  const asection *sec1 = *(const asection **) arg1;
4502
  const asection *sec2 = *(const asection **) arg2;
4503
 
4504
  if (bfd_section_lma (sec1->owner, sec1)
4505
      < bfd_section_lma (sec2->owner, sec2))
4506
    return -1;
4507
  else if (bfd_section_lma (sec1->owner, sec1)
4508
           > bfd_section_lma (sec2->owner, sec2))
4509
    return 1;
4510
  else if (sec1->id < sec2->id)
4511
    return -1;
4512
  else if (sec1->id > sec2->id)
4513
    return 1;
4514
 
4515
  return 0;
4516
}
4517
 
4518
#define IGNORE_SECTION(s) \
4519
  ((s->flags & SEC_NEVER_LOAD) != 0                              \
4520
   || (s->flags & SEC_ALLOC) == 0                                \
4521
   || ((s->flags & SEC_THREAD_LOCAL) != 0                        \
4522
        && (s->flags & SEC_LOAD) == 0))
4523
 
4524
/* Check to see if any allocated sections overlap with other allocated
4525
   sections.  This can happen if a linker script specifies the output
4526
   section addresses of the two sections.  Also check whether any memory
4527
   region has overflowed.  */
4528
 
4529
static void
4530
lang_check_section_addresses (void)
4531
{
4532
  asection *s, *os;
4533
  asection **sections, **spp;
4534
  unsigned int count;
4535
  bfd_vma s_start;
4536
  bfd_vma s_end;
4537
  bfd_vma os_start;
4538
  bfd_vma os_end;
4539
  bfd_size_type amt;
4540
  lang_memory_region_type *m;
4541
 
4542
  if (bfd_count_sections (link_info.output_bfd) <= 1)
4543
    return;
4544
 
4545
  amt = bfd_count_sections (link_info.output_bfd) * sizeof (asection *);
4546
  sections = (asection **) xmalloc (amt);
4547
 
4548
  /* Scan all sections in the output list.  */
4549
  count = 0;
4550
  for (s = link_info.output_bfd->sections; s != NULL; s = s->next)
4551
    {
4552
      /* Only consider loadable sections with real contents.  */
4553
      if ((s->flags & SEC_NEVER_LOAD)
4554
          || !(s->flags & SEC_LOAD)
4555
          || !(s->flags & SEC_ALLOC)
4556
          || s->size == 0)
4557
        continue;
4558
 
4559
      sections[count] = s;
4560
      count++;
4561
    }
4562
 
4563
  if (count <= 1)
4564
    return;
4565
 
4566
  qsort (sections, (size_t) count, sizeof (asection *),
4567
         sort_sections_by_lma);
4568
 
4569
  spp = sections;
4570
  s = *spp++;
4571
  s_start = bfd_section_lma (link_info.output_bfd, s);
4572
  s_end = s_start + TO_ADDR (s->size) - 1;
4573
  for (count--; count; count--)
4574
    {
4575
      /* We must check the sections' LMA addresses not their VMA
4576
         addresses because overlay sections can have overlapping VMAs
4577
         but they must have distinct LMAs.  */
4578
      os = s;
4579
      os_start = s_start;
4580
      os_end = s_end;
4581
      s = *spp++;
4582
      s_start = bfd_section_lma (link_info.output_bfd, s);
4583
      s_end = s_start + TO_ADDR (s->size) - 1;
4584
 
4585
      /* Look for an overlap.  */
4586
      if (s_end >= os_start && s_start <= os_end)
4587
        einfo (_("%X%P: section %s loaded at [%V,%V] overlaps section %s loaded at [%V,%V]\n"),
4588
               s->name, s_start, s_end, os->name, os_start, os_end);
4589
    }
4590
 
4591
  free (sections);
4592
 
4593
  /* If any memory region has overflowed, report by how much.
4594
     We do not issue this diagnostic for regions that had sections
4595
     explicitly placed outside their bounds; os_region_check's
4596
     diagnostics are adequate for that case.
4597
 
4598
     FIXME: It is conceivable that m->current - (m->origin + m->length)
4599
     might overflow a 32-bit integer.  There is, alas, no way to print
4600
     a bfd_vma quantity in decimal.  */
4601
  for (m = lang_memory_region_list; m; m = m->next)
4602
    if (m->had_full_message)
4603
      einfo (_("%X%P: region `%s' overflowed by %ld bytes\n"),
4604
             m->name_list.name, (long)(m->current - (m->origin + m->length)));
4605
 
4606
}
4607
 
4608
/* Make sure the new address is within the region.  We explicitly permit the
4609
   current address to be at the exact end of the region when the address is
4610
   non-zero, in case the region is at the end of addressable memory and the
4611
   calculation wraps around.  */
4612
 
4613
static void
4614
os_region_check (lang_output_section_statement_type *os,
4615
                 lang_memory_region_type *region,
4616
                 etree_type *tree,
4617
                 bfd_vma base)
4618
{
4619
  if ((region->current < region->origin
4620
       || (region->current - region->origin > region->length))
4621
      && ((region->current != region->origin + region->length)
4622
          || base == 0))
4623
    {
4624
      if (tree != NULL)
4625
        {
4626
          einfo (_("%X%P: address 0x%v of %B section `%s'"
4627
                   " is not within region `%s'\n"),
4628
                 region->current,
4629
                 os->bfd_section->owner,
4630
                 os->bfd_section->name,
4631
                 region->name_list.name);
4632
        }
4633
      else if (!region->had_full_message)
4634
        {
4635
          region->had_full_message = TRUE;
4636
 
4637
          einfo (_("%X%P: %B section `%s' will not fit in region `%s'\n"),
4638
                 os->bfd_section->owner,
4639
                 os->bfd_section->name,
4640
                 region->name_list.name);
4641
        }
4642
    }
4643
}
4644
 
4645
/* Set the sizes for all the output sections.  */
4646
 
4647
static bfd_vma
4648
lang_size_sections_1
4649
  (lang_statement_union_type *s,
4650
   lang_output_section_statement_type *output_section_statement,
4651
   lang_statement_union_type **prev,
4652
   fill_type *fill,
4653
   bfd_vma dot,
4654
   bfd_boolean *relax,
4655
   bfd_boolean check_regions)
4656
{
4657
  /* Size up the sections from their constituent parts.  */
4658
  for (; s != NULL; s = s->header.next)
4659
    {
4660
      switch (s->header.type)
4661
        {
4662
        case lang_output_section_statement_enum:
4663
          {
4664
            bfd_vma newdot, after;
4665
            lang_output_section_statement_type *os;
4666
            lang_memory_region_type *r;
4667
 
4668
            os = &s->output_section_statement;
4669
            /* FIXME: We shouldn't need to zero section vmas for ld -r
4670
               here, in lang_insert_orphan, or in the default linker scripts.
4671
               This is covering for coff backend linker bugs.  See PR6945.  */
4672
            if (os->addr_tree == NULL
4673
                && link_info.relocatable
4674
                && (bfd_get_flavour (link_info.output_bfd)
4675
                    == bfd_target_coff_flavour))
4676
              os->addr_tree = exp_intop (0);
4677
            if (os->addr_tree != NULL)
4678
              {
4679
                os->processed_vma = FALSE;
4680
                exp_fold_tree (os->addr_tree, bfd_abs_section_ptr, &dot);
4681
 
4682
                if (expld.result.valid_p)
4683
                  dot = expld.result.value + expld.result.section->vma;
4684
                else if (expld.phase != lang_mark_phase_enum)
4685
                  einfo (_("%F%S: non constant or forward reference"
4686
                           " address expression for section %s\n"),
4687
                         os->name);
4688
              }
4689
 
4690
            if (os->bfd_section == NULL)
4691
              /* This section was removed or never actually created.  */
4692
              break;
4693
 
4694
            /* If this is a COFF shared library section, use the size and
4695
               address from the input section.  FIXME: This is COFF
4696
               specific; it would be cleaner if there were some other way
4697
               to do this, but nothing simple comes to mind.  */
4698
            if (((bfd_get_flavour (link_info.output_bfd)
4699
                  == bfd_target_ecoff_flavour)
4700
                 || (bfd_get_flavour (link_info.output_bfd)
4701
                     == bfd_target_coff_flavour))
4702
                && (os->bfd_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
4703
              {
4704
                asection *input;
4705
 
4706
                if (os->children.head == NULL
4707
                    || os->children.head->header.next != NULL
4708
                    || (os->children.head->header.type
4709
                        != lang_input_section_enum))
4710
                  einfo (_("%P%X: Internal error on COFF shared library"
4711
                           " section %s\n"), os->name);
4712
 
4713
                input = os->children.head->input_section.section;
4714
                bfd_set_section_vma (os->bfd_section->owner,
4715
                                     os->bfd_section,
4716
                                     bfd_section_vma (input->owner, input));
4717
                os->bfd_section->size = input->size;
4718
                break;
4719
              }
4720
 
4721
            newdot = dot;
4722
            if (bfd_is_abs_section (os->bfd_section))
4723
              {
4724
                /* No matter what happens, an abs section starts at zero.  */
4725
                ASSERT (os->bfd_section->vma == 0);
4726
              }
4727
            else
4728
              {
4729
                int align;
4730
 
4731
                if (os->addr_tree == NULL)
4732
                  {
4733
                    /* No address specified for this section, get one
4734
                       from the region specification.  */
4735
                    if (os->region == NULL
4736
                        || ((os->bfd_section->flags & (SEC_ALLOC | SEC_LOAD))
4737
                            && os->region->name_list.name[0] == '*'
4738
                            && strcmp (os->region->name_list.name,
4739
                                       DEFAULT_MEMORY_REGION) == 0))
4740
                      {
4741
                        os->region = lang_memory_default (os->bfd_section);
4742
                      }
4743
 
4744
                    /* If a loadable section is using the default memory
4745
                       region, and some non default memory regions were
4746
                       defined, issue an error message.  */
4747
                    if (!os->ignored
4748
                        && !IGNORE_SECTION (os->bfd_section)
4749
                        && ! link_info.relocatable
4750
                        && check_regions
4751
                        && strcmp (os->region->name_list.name,
4752
                                   DEFAULT_MEMORY_REGION) == 0
4753
                        && lang_memory_region_list != NULL
4754
                        && (strcmp (lang_memory_region_list->name_list.name,
4755
                                    DEFAULT_MEMORY_REGION) != 0
4756
                            || lang_memory_region_list->next != NULL)
4757
                        && expld.phase != lang_mark_phase_enum)
4758
                      {
4759
                        /* By default this is an error rather than just a
4760
                           warning because if we allocate the section to the
4761
                           default memory region we can end up creating an
4762
                           excessively large binary, or even seg faulting when
4763
                           attempting to perform a negative seek.  See
4764
                           sources.redhat.com/ml/binutils/2003-04/msg00423.html
4765
                           for an example of this.  This behaviour can be
4766
                           overridden by the using the --no-check-sections
4767
                           switch.  */
4768
                        if (command_line.check_section_addresses)
4769
                          einfo (_("%P%F: error: no memory region specified"
4770
                                   " for loadable section `%s'\n"),
4771
                                 bfd_get_section_name (link_info.output_bfd,
4772
                                                       os->bfd_section));
4773
                        else
4774
                          einfo (_("%P: warning: no memory region specified"
4775
                                   " for loadable section `%s'\n"),
4776
                                 bfd_get_section_name (link_info.output_bfd,
4777
                                                       os->bfd_section));
4778
                      }
4779
 
4780
                    newdot = os->region->current;
4781
                    align = os->bfd_section->alignment_power;
4782
                  }
4783
                else
4784
                  align = os->section_alignment;
4785
 
4786
                /* Align to what the section needs.  */
4787
                if (align > 0)
4788
                  {
4789
                    bfd_vma savedot = newdot;
4790
                    newdot = align_power (newdot, align);
4791
 
4792
                    if (newdot != savedot
4793
                        && (config.warn_section_align
4794
                            || os->addr_tree != NULL)
4795
                        && expld.phase != lang_mark_phase_enum)
4796
                      einfo (_("%P: warning: changing start of section"
4797
                               " %s by %lu bytes\n"),
4798
                             os->name, (unsigned long) (newdot - savedot));
4799
                  }
4800
 
4801
                bfd_set_section_vma (0, os->bfd_section, newdot);
4802
 
4803
                os->bfd_section->output_offset = 0;
4804
              }
4805
 
4806
            lang_size_sections_1 (os->children.head, os, &os->children.head,
4807
                                  os->fill, newdot, relax, check_regions);
4808
 
4809
            os->processed_vma = TRUE;
4810
 
4811
            if (bfd_is_abs_section (os->bfd_section) || os->ignored)
4812
              /* Except for some special linker created sections,
4813
                 no output section should change from zero size
4814
                 after strip_excluded_output_sections.  A non-zero
4815
                 size on an ignored section indicates that some
4816
                 input section was not sized early enough.  */
4817
              ASSERT (os->bfd_section->size == 0);
4818
            else
4819
              {
4820
                dot = os->bfd_section->vma;
4821
 
4822
                /* Put the section within the requested block size, or
4823
                   align at the block boundary.  */
4824
                after = ((dot
4825
                          + TO_ADDR (os->bfd_section->size)
4826
                          + os->block_value - 1)
4827
                         & - (bfd_vma) os->block_value);
4828
 
4829
                os->bfd_section->size = TO_SIZE (after - os->bfd_section->vma);
4830
              }
4831
 
4832
            /* Set section lma.  */
4833
            r = os->region;
4834
            if (r == NULL)
4835
              r = lang_memory_region_lookup (DEFAULT_MEMORY_REGION, FALSE);
4836
 
4837
            if (os->load_base)
4838
              {
4839
                bfd_vma lma = exp_get_abs_int (os->load_base, 0, "load base");
4840
                os->bfd_section->lma = lma;
4841
              }
4842
            else if (os->lma_region != NULL)
4843
              {
4844
                bfd_vma lma = os->lma_region->current;
4845
 
4846
                if (os->section_alignment != -1)
4847
                  lma = align_power (lma, os->section_alignment);
4848
                os->bfd_section->lma = lma;
4849
              }
4850
            else if (r->last_os != NULL
4851
                     && (os->bfd_section->flags & SEC_ALLOC) != 0)
4852
              {
4853
                bfd_vma lma;
4854
                asection *last;
4855
 
4856
                last = r->last_os->output_section_statement.bfd_section;
4857
 
4858
                /* A backwards move of dot should be accompanied by
4859
                   an explicit assignment to the section LMA (ie.
4860
                   os->load_base set) because backwards moves can
4861
                   create overlapping LMAs.  */
4862
                if (dot < last->vma
4863
                    && os->bfd_section->size != 0
4864
                    && dot + os->bfd_section->size <= last->vma)
4865
                  {
4866
                    /* If dot moved backwards then leave lma equal to
4867
                       vma.  This is the old default lma, which might
4868
                       just happen to work when the backwards move is
4869
                       sufficiently large.  Nag if this changes anything,
4870
                       so people can fix their linker scripts.  */
4871
 
4872
                    if (last->vma != last->lma)
4873
                      einfo (_("%P: warning: dot moved backwards before `%s'\n"),
4874
                             os->name);
4875
                  }
4876
                else
4877
                  {
4878
                    /* If this is an overlay, set the current lma to that
4879
                       at the end of the previous section.  */
4880
                    if (os->sectype == overlay_section)
4881
                      lma = last->lma + last->size;
4882
 
4883
                    /* Otherwise, keep the same lma to vma relationship
4884
                       as the previous section.  */
4885
                    else
4886
                      lma = dot + last->lma - last->vma;
4887
 
4888
                    if (os->section_alignment != -1)
4889
                      lma = align_power (lma, os->section_alignment);
4890
                    os->bfd_section->lma = lma;
4891
                  }
4892
              }
4893
            os->processed_lma = TRUE;
4894
 
4895
            if (bfd_is_abs_section (os->bfd_section) || os->ignored)
4896
              break;
4897
 
4898
            /* Keep track of normal sections using the default
4899
               lma region.  We use this to set the lma for
4900
               following sections.  Overlays or other linker
4901
               script assignment to lma might mean that the
4902
               default lma == vma is incorrect.
4903
               To avoid warnings about dot moving backwards when using
4904
               -Ttext, don't start tracking sections until we find one
4905
               of non-zero size or with lma set differently to vma.  */
4906
            if (((os->bfd_section->flags & SEC_HAS_CONTENTS) != 0
4907
                 || (os->bfd_section->flags & SEC_THREAD_LOCAL) == 0)
4908
                && (os->bfd_section->flags & SEC_ALLOC) != 0
4909
                && (os->bfd_section->size != 0
4910
                    || (r->last_os == NULL
4911
                        && os->bfd_section->vma != os->bfd_section->lma)
4912
                    || (r->last_os != NULL
4913
                        && dot >= (r->last_os->output_section_statement
4914
                                   .bfd_section->vma)))
4915
                && os->lma_region == NULL
4916
                && !link_info.relocatable)
4917
              r->last_os = s;
4918
 
4919
            /* .tbss sections effectively have zero size.  */
4920
            if ((os->bfd_section->flags & SEC_HAS_CONTENTS) != 0
4921
                || (os->bfd_section->flags & SEC_THREAD_LOCAL) == 0
4922
                || link_info.relocatable)
4923
              dot += TO_ADDR (os->bfd_section->size);
4924
 
4925
            if (os->update_dot_tree != 0)
4926
              exp_fold_tree (os->update_dot_tree, bfd_abs_section_ptr, &dot);
4927
 
4928
            /* Update dot in the region ?
4929
               We only do this if the section is going to be allocated,
4930
               since unallocated sections do not contribute to the region's
4931
               overall size in memory.
4932
 
4933
               If the SEC_NEVER_LOAD bit is not set, it will affect the
4934
               addresses of sections after it. We have to update
4935
               dot.  */
4936
            if (os->region != NULL
4937
                && ((os->bfd_section->flags & SEC_NEVER_LOAD) == 0
4938
                    || (os->bfd_section->flags & (SEC_ALLOC | SEC_LOAD))))
4939
              {
4940
                os->region->current = dot;
4941
 
4942
                if (check_regions)
4943
                  /* Make sure the new address is within the region.  */
4944
                  os_region_check (os, os->region, os->addr_tree,
4945
                                   os->bfd_section->vma);
4946
 
4947
                if (os->lma_region != NULL && os->lma_region != os->region
4948
                    && (os->bfd_section->flags & SEC_LOAD))
4949
                  {
4950
                    os->lma_region->current
4951
                      = os->bfd_section->lma + TO_ADDR (os->bfd_section->size);
4952
 
4953
                    if (check_regions)
4954
                      os_region_check (os, os->lma_region, NULL,
4955
                                       os->bfd_section->lma);
4956
                  }
4957
              }
4958
          }
4959
          break;
4960
 
4961
        case lang_constructors_statement_enum:
4962
          dot = lang_size_sections_1 (constructor_list.head,
4963
                                      output_section_statement,
4964
                                      &s->wild_statement.children.head,
4965
                                      fill, dot, relax, check_regions);
4966
          break;
4967
 
4968
        case lang_data_statement_enum:
4969
          {
4970
            unsigned int size = 0;
4971
 
4972
            s->data_statement.output_offset =
4973
              dot - output_section_statement->bfd_section->vma;
4974
            s->data_statement.output_section =
4975
              output_section_statement->bfd_section;
4976
 
4977
            /* We might refer to provided symbols in the expression, and
4978
               need to mark them as needed.  */
4979
            exp_fold_tree (s->data_statement.exp, bfd_abs_section_ptr, &dot);
4980
 
4981
            switch (s->data_statement.type)
4982
              {
4983
              default:
4984
                abort ();
4985
              case QUAD:
4986
              case SQUAD:
4987
                size = QUAD_SIZE;
4988
                break;
4989
              case LONG:
4990
                size = LONG_SIZE;
4991
                break;
4992
              case SHORT:
4993
                size = SHORT_SIZE;
4994
                break;
4995
              case BYTE:
4996
                size = BYTE_SIZE;
4997
                break;
4998
              }
4999
            if (size < TO_SIZE ((unsigned) 1))
5000
              size = TO_SIZE ((unsigned) 1);
5001
            dot += TO_ADDR (size);
5002
            output_section_statement->bfd_section->size += size;
5003
          }
5004
          break;
5005
 
5006
        case lang_reloc_statement_enum:
5007
          {
5008
            int size;
5009
 
5010
            s->reloc_statement.output_offset =
5011
              dot - output_section_statement->bfd_section->vma;
5012
            s->reloc_statement.output_section =
5013
              output_section_statement->bfd_section;
5014
            size = bfd_get_reloc_size (s->reloc_statement.howto);
5015
            dot += TO_ADDR (size);
5016
            output_section_statement->bfd_section->size += size;
5017
          }
5018
          break;
5019
 
5020
        case lang_wild_statement_enum:
5021
          dot = lang_size_sections_1 (s->wild_statement.children.head,
5022
                                      output_section_statement,
5023
                                      &s->wild_statement.children.head,
5024
                                      fill, dot, relax, check_regions);
5025
          break;
5026
 
5027
        case lang_object_symbols_statement_enum:
5028
          link_info.create_object_symbols_section =
5029
            output_section_statement->bfd_section;
5030
          break;
5031
 
5032
        case lang_output_statement_enum:
5033
        case lang_target_statement_enum:
5034
          break;
5035
 
5036
        case lang_input_section_enum:
5037
          {
5038
            asection *i;
5039
 
5040
            i = (*prev)->input_section.section;
5041
            if (relax)
5042
              {
5043
                bfd_boolean again;
5044
 
5045
                if (! bfd_relax_section (i->owner, i, &link_info, &again))
5046
                  einfo (_("%P%F: can't relax section: %E\n"));
5047
                if (again)
5048
                  *relax = TRUE;
5049
              }
5050
            dot = size_input_section (prev, output_section_statement,
5051
                                      output_section_statement->fill, dot);
5052
          }
5053
          break;
5054
 
5055
        case lang_input_statement_enum:
5056
          break;
5057
 
5058
        case lang_fill_statement_enum:
5059
          s->fill_statement.output_section =
5060
            output_section_statement->bfd_section;
5061
 
5062
          fill = s->fill_statement.fill;
5063
          break;
5064
 
5065
        case lang_assignment_statement_enum:
5066
          {
5067
            bfd_vma newdot = dot;
5068
            etree_type *tree = s->assignment_statement.exp;
5069
 
5070
            expld.dataseg.relro = exp_dataseg_relro_none;
5071
 
5072
            exp_fold_tree (tree,
5073
                           output_section_statement->bfd_section,
5074
                           &newdot);
5075
 
5076
            if (expld.dataseg.relro == exp_dataseg_relro_start)
5077
              {
5078
                if (!expld.dataseg.relro_start_stat)
5079
                  expld.dataseg.relro_start_stat = s;
5080
                else
5081
                  {
5082
                    ASSERT (expld.dataseg.relro_start_stat == s);
5083
                  }
5084
              }
5085
            else if (expld.dataseg.relro == exp_dataseg_relro_end)
5086
              {
5087
                if (!expld.dataseg.relro_end_stat)
5088
                  expld.dataseg.relro_end_stat = s;
5089
                else
5090
                  {
5091
                    ASSERT (expld.dataseg.relro_end_stat == s);
5092
                  }
5093
              }
5094
            expld.dataseg.relro = exp_dataseg_relro_none;
5095
 
5096
            /* This symbol is relative to this section.  */
5097
            if ((tree->type.node_class == etree_provided
5098
                 || tree->type.node_class == etree_assign)
5099
                && (tree->assign.dst [0] != '.'
5100
                    || tree->assign.dst [1] != '\0'))
5101
              output_section_statement->section_relative_symbol = 1;
5102
 
5103
            if (!output_section_statement->ignored)
5104
              {
5105
                if (output_section_statement == abs_output_section)
5106
                  {
5107
                    /* If we don't have an output section, then just adjust
5108
                       the default memory address.  */
5109
                    lang_memory_region_lookup (DEFAULT_MEMORY_REGION,
5110
                                               FALSE)->current = newdot;
5111
                  }
5112
                else if (newdot != dot)
5113
                  {
5114
                    /* Insert a pad after this statement.  We can't
5115
                       put the pad before when relaxing, in case the
5116
                       assignment references dot.  */
5117
                    insert_pad (&s->header.next, fill, TO_SIZE (newdot - dot),
5118
                                output_section_statement->bfd_section, dot);
5119
 
5120
                    /* Don't neuter the pad below when relaxing.  */
5121
                    s = s->header.next;
5122
 
5123
                    /* If dot is advanced, this implies that the section
5124
                       should have space allocated to it, unless the
5125
                       user has explicitly stated that the section
5126
                       should never be loaded.  */
5127
                    if (!(output_section_statement->flags & SEC_NEVER_LOAD))
5128
                      output_section_statement->bfd_section->flags |= SEC_ALLOC;
5129
                  }
5130
                dot = newdot;
5131
              }
5132
          }
5133
          break;
5134
 
5135
        case lang_padding_statement_enum:
5136
          /* If this is the first time lang_size_sections is called,
5137
             we won't have any padding statements.  If this is the
5138
             second or later passes when relaxing, we should allow
5139
             padding to shrink.  If padding is needed on this pass, it
5140
             will be added back in.  */
5141
          s->padding_statement.size = 0;
5142
 
5143
          /* Make sure output_offset is valid.  If relaxation shrinks
5144
             the section and this pad isn't needed, it's possible to
5145
             have output_offset larger than the final size of the
5146
             section.  bfd_set_section_contents will complain even for
5147
             a pad size of zero.  */
5148
          s->padding_statement.output_offset
5149
            = dot - output_section_statement->bfd_section->vma;
5150
          break;
5151
 
5152
        case lang_group_statement_enum:
5153
          dot = lang_size_sections_1 (s->group_statement.children.head,
5154
                                      output_section_statement,
5155
                                      &s->group_statement.children.head,
5156
                                      fill, dot, relax, check_regions);
5157
          break;
5158
 
5159
        case lang_insert_statement_enum:
5160
          break;
5161
 
5162
          /* We can only get here when relaxing is turned on.  */
5163
        case lang_address_statement_enum:
5164
          break;
5165
 
5166
        default:
5167
          FAIL ();
5168
          break;
5169
        }
5170
      prev = &s->header.next;
5171
    }
5172
  return dot;
5173
}
5174
 
5175
/* Callback routine that is used in _bfd_elf_map_sections_to_segments.
5176
   The BFD library has set NEW_SEGMENT to TRUE iff it thinks that
5177
   CURRENT_SECTION and PREVIOUS_SECTION ought to be placed into different
5178
   segments.  We are allowed an opportunity to override this decision.  */
5179
 
5180
bfd_boolean
5181
ldlang_override_segment_assignment (struct bfd_link_info * info ATTRIBUTE_UNUSED,
5182
                                    bfd * abfd ATTRIBUTE_UNUSED,
5183
                                    asection * current_section,
5184
                                    asection * previous_section,
5185
                                    bfd_boolean new_segment)
5186
{
5187
  lang_output_section_statement_type * cur;
5188
  lang_output_section_statement_type * prev;
5189
 
5190
  /* The checks below are only necessary when the BFD library has decided
5191
     that the two sections ought to be placed into the same segment.  */
5192
  if (new_segment)
5193
    return TRUE;
5194
 
5195
  /* Paranoia checks.  */
5196
  if (current_section == NULL || previous_section == NULL)
5197
    return new_segment;
5198
 
5199
  /* Find the memory regions associated with the two sections.
5200
     We call lang_output_section_find() here rather than scanning the list
5201
     of output sections looking for a matching section pointer because if
5202
     we have a large number of sections then a hash lookup is faster.  */
5203
  cur  = lang_output_section_find (current_section->name);
5204
  prev = lang_output_section_find (previous_section->name);
5205
 
5206
  /* More paranoia.  */
5207
  if (cur == NULL || prev == NULL)
5208
    return new_segment;
5209
 
5210
  /* If the regions are different then force the sections to live in
5211
     different segments.  See the email thread starting at the following
5212
     URL for the reasons why this is necessary:
5213
     http://sourceware.org/ml/binutils/2007-02/msg00216.html  */
5214
  return cur->region != prev->region;
5215
}
5216
 
5217
void
5218
one_lang_size_sections_pass (bfd_boolean *relax, bfd_boolean check_regions)
5219
{
5220
  lang_statement_iteration++;
5221
  lang_size_sections_1 (statement_list.head, abs_output_section,
5222
                        &statement_list.head, 0, 0, relax, check_regions);
5223
}
5224
 
5225
void
5226
lang_size_sections (bfd_boolean *relax, bfd_boolean check_regions)
5227
{
5228
  expld.phase = lang_allocating_phase_enum;
5229
  expld.dataseg.phase = exp_dataseg_none;
5230
 
5231
  one_lang_size_sections_pass (relax, check_regions);
5232
  if (expld.dataseg.phase == exp_dataseg_end_seen
5233
      && link_info.relro && expld.dataseg.relro_end)
5234
    {
5235
      /* If DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END pair was seen, try
5236
         to put expld.dataseg.relro on a (common) page boundary.  */
5237
      bfd_vma min_base, old_base, relro_end, maxpage;
5238
 
5239
      expld.dataseg.phase = exp_dataseg_relro_adjust;
5240
      maxpage = expld.dataseg.maxpagesize;
5241
      /* MIN_BASE is the absolute minimum address we are allowed to start the
5242
         read-write segment (byte before will be mapped read-only).  */
5243
      min_base = (expld.dataseg.min_base + maxpage - 1) & ~(maxpage - 1);
5244
      /* OLD_BASE is the address for a feasible minimum address which will
5245
         still not cause a data overlap inside MAXPAGE causing file offset skip
5246
         by MAXPAGE.  */
5247
      old_base = expld.dataseg.base;
5248
      expld.dataseg.base += (-expld.dataseg.relro_end
5249
                             & (expld.dataseg.pagesize - 1));
5250
      /* Compute the expected PT_GNU_RELRO segment end.  */
5251
      relro_end = ((expld.dataseg.relro_end + expld.dataseg.pagesize - 1)
5252
                   & ~(expld.dataseg.pagesize - 1));
5253
      if (min_base + maxpage < expld.dataseg.base)
5254
        {
5255
          expld.dataseg.base -= maxpage;
5256
          relro_end -= maxpage;
5257
        }
5258
      lang_reset_memory_regions ();
5259
      one_lang_size_sections_pass (relax, check_regions);
5260
      if (expld.dataseg.relro_end > relro_end)
5261
        {
5262
          /* The alignment of sections between DATA_SEGMENT_ALIGN
5263
             and DATA_SEGMENT_RELRO_END caused huge padding to be
5264
             inserted at DATA_SEGMENT_RELRO_END.  Try to start a bit lower so
5265
             that the section alignments will fit in.  */
5266
          asection *sec;
5267
          unsigned int max_alignment_power = 0;
5268
 
5269
          /* Find maximum alignment power of sections between
5270
             DATA_SEGMENT_ALIGN and DATA_SEGMENT_RELRO_END.  */
5271
          for (sec = link_info.output_bfd->sections; sec; sec = sec->next)
5272
            if (sec->vma >= expld.dataseg.base
5273
                && sec->vma < expld.dataseg.relro_end
5274
                && sec->alignment_power > max_alignment_power)
5275
              max_alignment_power = sec->alignment_power;
5276
 
5277
          if (((bfd_vma) 1 << max_alignment_power) < expld.dataseg.pagesize)
5278
            {
5279
              if (expld.dataseg.base - (1 << max_alignment_power) < old_base)
5280
                expld.dataseg.base += expld.dataseg.pagesize;
5281
              expld.dataseg.base -= (1 << max_alignment_power);
5282
              lang_reset_memory_regions ();
5283
              one_lang_size_sections_pass (relax, check_regions);
5284
            }
5285
        }
5286
      link_info.relro_start = expld.dataseg.base;
5287
      link_info.relro_end = expld.dataseg.relro_end;
5288
    }
5289
  else if (expld.dataseg.phase == exp_dataseg_end_seen)
5290
    {
5291
      /* If DATA_SEGMENT_ALIGN DATA_SEGMENT_END pair was seen, check whether
5292
         a page could be saved in the data segment.  */
5293
      bfd_vma first, last;
5294
 
5295
      first = -expld.dataseg.base & (expld.dataseg.pagesize - 1);
5296
      last = expld.dataseg.end & (expld.dataseg.pagesize - 1);
5297
      if (first && last
5298
          && ((expld.dataseg.base & ~(expld.dataseg.pagesize - 1))
5299
              != (expld.dataseg.end & ~(expld.dataseg.pagesize - 1)))
5300
          && first + last <= expld.dataseg.pagesize)
5301
        {
5302
          expld.dataseg.phase = exp_dataseg_adjust;
5303
          lang_reset_memory_regions ();
5304
          one_lang_size_sections_pass (relax, check_regions);
5305
        }
5306
    }
5307
 
5308
  expld.phase = lang_final_phase_enum;
5309
}
5310
 
5311
/* Worker function for lang_do_assignments.  Recursiveness goes here.  */
5312
 
5313
static bfd_vma
5314
lang_do_assignments_1 (lang_statement_union_type *s,
5315
                       lang_output_section_statement_type *current_os,
5316
                       fill_type *fill,
5317
                       bfd_vma dot)
5318
{
5319
  for (; s != NULL; s = s->header.next)
5320
    {
5321
      switch (s->header.type)
5322
        {
5323
        case lang_constructors_statement_enum:
5324
          dot = lang_do_assignments_1 (constructor_list.head,
5325
                                       current_os, fill, dot);
5326
          break;
5327
 
5328
        case lang_output_section_statement_enum:
5329
          {
5330
            lang_output_section_statement_type *os;
5331
 
5332
            os = &(s->output_section_statement);
5333
            if (os->bfd_section != NULL && !os->ignored)
5334
              {
5335
                dot = os->bfd_section->vma;
5336
 
5337
                lang_do_assignments_1 (os->children.head, os, os->fill, dot);
5338
 
5339
                /* .tbss sections effectively have zero size.  */
5340
                if ((os->bfd_section->flags & SEC_HAS_CONTENTS) != 0
5341
                    || (os->bfd_section->flags & SEC_THREAD_LOCAL) == 0
5342
                    || link_info.relocatable)
5343
                  dot += TO_ADDR (os->bfd_section->size);
5344
 
5345
                if (os->update_dot_tree != NULL)
5346
                  exp_fold_tree (os->update_dot_tree, bfd_abs_section_ptr, &dot);
5347
              }
5348
          }
5349
          break;
5350
 
5351
        case lang_wild_statement_enum:
5352
 
5353
          dot = lang_do_assignments_1 (s->wild_statement.children.head,
5354
                                       current_os, fill, dot);
5355
          break;
5356
 
5357
        case lang_object_symbols_statement_enum:
5358
        case lang_output_statement_enum:
5359
        case lang_target_statement_enum:
5360
          break;
5361
 
5362
        case lang_data_statement_enum:
5363
          exp_fold_tree (s->data_statement.exp, bfd_abs_section_ptr, &dot);
5364
          if (expld.result.valid_p)
5365
            s->data_statement.value = (expld.result.value
5366
                                       + expld.result.section->vma);
5367
          else
5368
            einfo (_("%F%P: invalid data statement\n"));
5369
          {
5370
            unsigned int size;
5371
            switch (s->data_statement.type)
5372
              {
5373
              default:
5374
                abort ();
5375
              case QUAD:
5376
              case SQUAD:
5377
                size = QUAD_SIZE;
5378
                break;
5379
              case LONG:
5380
                size = LONG_SIZE;
5381
                break;
5382
              case SHORT:
5383
                size = SHORT_SIZE;
5384
                break;
5385
              case BYTE:
5386
                size = BYTE_SIZE;
5387
                break;
5388
              }
5389
            if (size < TO_SIZE ((unsigned) 1))
5390
              size = TO_SIZE ((unsigned) 1);
5391
            dot += TO_ADDR (size);
5392
          }
5393
          break;
5394
 
5395
        case lang_reloc_statement_enum:
5396
          exp_fold_tree (s->reloc_statement.addend_exp,
5397
                         bfd_abs_section_ptr, &dot);
5398
          if (expld.result.valid_p)
5399
            s->reloc_statement.addend_value = expld.result.value;
5400
          else
5401
            einfo (_("%F%P: invalid reloc statement\n"));
5402
          dot += TO_ADDR (bfd_get_reloc_size (s->reloc_statement.howto));
5403
          break;
5404
 
5405
        case lang_input_section_enum:
5406
          {
5407
            asection *in = s->input_section.section;
5408
 
5409
            if ((in->flags & SEC_EXCLUDE) == 0)
5410
              dot += TO_ADDR (in->size);
5411
          }
5412
          break;
5413
 
5414
        case lang_input_statement_enum:
5415
          break;
5416
 
5417
        case lang_fill_statement_enum:
5418
          fill = s->fill_statement.fill;
5419
          break;
5420
 
5421
        case lang_assignment_statement_enum:
5422
          exp_fold_tree (s->assignment_statement.exp,
5423
                         current_os->bfd_section,
5424
                         &dot);
5425
          break;
5426
 
5427
        case lang_padding_statement_enum:
5428
          dot += TO_ADDR (s->padding_statement.size);
5429
          break;
5430
 
5431
        case lang_group_statement_enum:
5432
          dot = lang_do_assignments_1 (s->group_statement.children.head,
5433
                                       current_os, fill, dot);
5434
          break;
5435
 
5436
        case lang_insert_statement_enum:
5437
          break;
5438
 
5439
        case lang_address_statement_enum:
5440
          break;
5441
 
5442
        default:
5443
          FAIL ();
5444
          break;
5445
        }
5446
    }
5447
  return dot;
5448
}
5449
 
5450
void
5451
lang_do_assignments (void)
5452
{
5453
  lang_statement_iteration++;
5454
  lang_do_assignments_1 (statement_list.head, abs_output_section, NULL, 0);
5455
}
5456
 
5457
/* Fix any .startof. or .sizeof. symbols.  When the assemblers see the
5458
   operator .startof. (section_name), it produces an undefined symbol
5459
   .startof.section_name.  Similarly, when it sees
5460
   .sizeof. (section_name), it produces an undefined symbol
5461
   .sizeof.section_name.  For all the output sections, we look for
5462
   such symbols, and set them to the correct value.  */
5463
 
5464
static void
5465
lang_set_startof (void)
5466
{
5467
  asection *s;
5468
 
5469
  if (link_info.relocatable)
5470
    return;
5471
 
5472
  for (s = link_info.output_bfd->sections; s != NULL; s = s->next)
5473
    {
5474
      const char *secname;
5475
      char *buf;
5476
      struct bfd_link_hash_entry *h;
5477
 
5478
      secname = bfd_get_section_name (link_info.output_bfd, s);
5479
      buf = (char *) xmalloc (10 + strlen (secname));
5480
 
5481
      sprintf (buf, ".startof.%s", secname);
5482
      h = bfd_link_hash_lookup (link_info.hash, buf, FALSE, FALSE, TRUE);
5483
      if (h != NULL && h->type == bfd_link_hash_undefined)
5484
        {
5485
          h->type = bfd_link_hash_defined;
5486
          h->u.def.value = bfd_get_section_vma (link_info.output_bfd, s);
5487
          h->u.def.section = bfd_abs_section_ptr;
5488
        }
5489
 
5490
      sprintf (buf, ".sizeof.%s", secname);
5491
      h = bfd_link_hash_lookup (link_info.hash, buf, FALSE, FALSE, TRUE);
5492
      if (h != NULL && h->type == bfd_link_hash_undefined)
5493
        {
5494
          h->type = bfd_link_hash_defined;
5495
          h->u.def.value = TO_ADDR (s->size);
5496
          h->u.def.section = bfd_abs_section_ptr;
5497
        }
5498
 
5499
      free (buf);
5500
    }
5501
}
5502
 
5503
static void
5504
lang_end (void)
5505
{
5506
  struct bfd_link_hash_entry *h;
5507
  bfd_boolean warn;
5508
 
5509
  if ((link_info.relocatable && !link_info.gc_sections)
5510
      || (link_info.shared && !link_info.executable))
5511
    warn = entry_from_cmdline;
5512
  else
5513
    warn = TRUE;
5514
 
5515
  /* Force the user to specify a root when generating a relocatable with
5516
     --gc-sections.  */
5517
  if (link_info.gc_sections && link_info.relocatable
5518
      && (entry_symbol.name == NULL
5519
          && ldlang_undef_chain_list_head == NULL))
5520
    einfo (_("%P%F: gc-sections requires either an entry or "
5521
             "an undefined symbol\n"));
5522
 
5523
  if (entry_symbol.name == NULL)
5524
    {
5525
      /* No entry has been specified.  Look for the default entry, but
5526
         don't warn if we don't find it.  */
5527
      entry_symbol.name = entry_symbol_default;
5528
      warn = FALSE;
5529
    }
5530
 
5531
  h = bfd_link_hash_lookup (link_info.hash, entry_symbol.name,
5532
                            FALSE, FALSE, TRUE);
5533
  if (h != NULL
5534
      && (h->type == bfd_link_hash_defined
5535
          || h->type == bfd_link_hash_defweak)
5536
      && h->u.def.section->output_section != NULL)
5537
    {
5538
      bfd_vma val;
5539
 
5540
      val = (h->u.def.value
5541
             + bfd_get_section_vma (link_info.output_bfd,
5542
                                    h->u.def.section->output_section)
5543
             + h->u.def.section->output_offset);
5544
      if (! bfd_set_start_address (link_info.output_bfd, val))
5545
        einfo (_("%P%F:%s: can't set start address\n"), entry_symbol.name);
5546
    }
5547
  else
5548
    {
5549
      bfd_vma val;
5550
      const char *send;
5551
 
5552
      /* We couldn't find the entry symbol.  Try parsing it as a
5553
         number.  */
5554
      val = bfd_scan_vma (entry_symbol.name, &send, 0);
5555
      if (*send == '\0')
5556
        {
5557
          if (! bfd_set_start_address (link_info.output_bfd, val))
5558
            einfo (_("%P%F: can't set start address\n"));
5559
        }
5560
      else
5561
        {
5562
          asection *ts;
5563
 
5564
          /* Can't find the entry symbol, and it's not a number.  Use
5565
             the first address in the text section.  */
5566
          ts = bfd_get_section_by_name (link_info.output_bfd, entry_section);
5567
          if (ts != NULL)
5568
            {
5569
              if (warn)
5570
                einfo (_("%P: warning: cannot find entry symbol %s;"
5571
                         " defaulting to %V\n"),
5572
                       entry_symbol.name,
5573
                       bfd_get_section_vma (link_info.output_bfd, ts));
5574
              if (!(bfd_set_start_address
5575
                    (link_info.output_bfd,
5576
                     bfd_get_section_vma (link_info.output_bfd, ts))))
5577
                einfo (_("%P%F: can't set start address\n"));
5578
            }
5579
          else
5580
            {
5581
              if (warn)
5582
                einfo (_("%P: warning: cannot find entry symbol %s;"
5583
                         " not setting start address\n"),
5584
                       entry_symbol.name);
5585
            }
5586
        }
5587
    }
5588
 
5589
  /* Don't bfd_hash_table_free (&lang_definedness_table);
5590
     map file output may result in a call of lang_track_definedness.  */
5591
}
5592
 
5593
/* This is a small function used when we want to ignore errors from
5594
   BFD.  */
5595
 
5596
static void
5597
ignore_bfd_errors (const char *s ATTRIBUTE_UNUSED, ...)
5598
{
5599
  /* Don't do anything.  */
5600
}
5601
 
5602
/* Check that the architecture of all the input files is compatible
5603
   with the output file.  Also call the backend to let it do any
5604
   other checking that is needed.  */
5605
 
5606
static void
5607
lang_check (void)
5608
{
5609
  lang_statement_union_type *file;
5610
  bfd *input_bfd;
5611
  const bfd_arch_info_type *compatible;
5612
 
5613
  for (file = file_chain.head; file != NULL; file = file->input_statement.next)
5614
    {
5615
      input_bfd = file->input_statement.the_bfd;
5616
      compatible
5617
        = bfd_arch_get_compatible (input_bfd, link_info.output_bfd,
5618
                                   command_line.accept_unknown_input_arch);
5619
 
5620
      /* In general it is not possible to perform a relocatable
5621
         link between differing object formats when the input
5622
         file has relocations, because the relocations in the
5623
         input format may not have equivalent representations in
5624
         the output format (and besides BFD does not translate
5625
         relocs for other link purposes than a final link).  */
5626
      if ((link_info.relocatable || link_info.emitrelocations)
5627
          && (compatible == NULL
5628
              || (bfd_get_flavour (input_bfd)
5629
                  != bfd_get_flavour (link_info.output_bfd)))
5630
          && (bfd_get_file_flags (input_bfd) & HAS_RELOC) != 0)
5631
        {
5632
          einfo (_("%P%F: Relocatable linking with relocations from"
5633
                   " format %s (%B) to format %s (%B) is not supported\n"),
5634
                 bfd_get_target (input_bfd), input_bfd,
5635
                 bfd_get_target (link_info.output_bfd), link_info.output_bfd);
5636
          /* einfo with %F exits.  */
5637
        }
5638
 
5639
      if (compatible == NULL)
5640
        {
5641
          if (command_line.warn_mismatch)
5642
            einfo (_("%P%X: %s architecture of input file `%B'"
5643
                     " is incompatible with %s output\n"),
5644
                   bfd_printable_name (input_bfd), input_bfd,
5645
                   bfd_printable_name (link_info.output_bfd));
5646
        }
5647
      else if (bfd_count_sections (input_bfd))
5648
        {
5649
          /* If the input bfd has no contents, it shouldn't set the
5650
             private data of the output bfd.  */
5651
 
5652
          bfd_error_handler_type pfn = NULL;
5653
 
5654
          /* If we aren't supposed to warn about mismatched input
5655
             files, temporarily set the BFD error handler to a
5656
             function which will do nothing.  We still want to call
5657
             bfd_merge_private_bfd_data, since it may set up
5658
             information which is needed in the output file.  */
5659
          if (! command_line.warn_mismatch)
5660
            pfn = bfd_set_error_handler (ignore_bfd_errors);
5661
          if (! bfd_merge_private_bfd_data (input_bfd, link_info.output_bfd))
5662
            {
5663
              if (command_line.warn_mismatch)
5664
                einfo (_("%P%X: failed to merge target specific data"
5665
                         " of file %B\n"), input_bfd);
5666
            }
5667
          if (! command_line.warn_mismatch)
5668
            bfd_set_error_handler (pfn);
5669
        }
5670
    }
5671
}
5672
 
5673
/* Look through all the global common symbols and attach them to the
5674
   correct section.  The -sort-common command line switch may be used
5675
   to roughly sort the entries by alignment.  */
5676
 
5677
static void
5678
lang_common (void)
5679
{
5680
  if (command_line.inhibit_common_definition)
5681
    return;
5682
  if (link_info.relocatable
5683
      && ! command_line.force_common_definition)
5684
    return;
5685
 
5686
  if (! config.sort_common)
5687
    bfd_link_hash_traverse (link_info.hash, lang_one_common, NULL);
5688
  else
5689
    {
5690
      unsigned int power;
5691
 
5692
      if (config.sort_common == sort_descending)
5693
        {
5694
          for (power = 4; power > 0; power--)
5695
            bfd_link_hash_traverse (link_info.hash, lang_one_common, &power);
5696
 
5697
          power = 0;
5698
          bfd_link_hash_traverse (link_info.hash, lang_one_common, &power);
5699
        }
5700
      else
5701
        {
5702
          for (power = 0; power <= 4; power++)
5703
            bfd_link_hash_traverse (link_info.hash, lang_one_common, &power);
5704
 
5705
          power = UINT_MAX;
5706
          bfd_link_hash_traverse (link_info.hash, lang_one_common, &power);
5707
        }
5708
    }
5709
}
5710
 
5711
/* Place one common symbol in the correct section.  */
5712
 
5713
static bfd_boolean
5714
lang_one_common (struct bfd_link_hash_entry *h, void *info)
5715
{
5716
  unsigned int power_of_two;
5717
  bfd_vma size;
5718
  asection *section;
5719
 
5720
  if (h->type != bfd_link_hash_common)
5721
    return TRUE;
5722
 
5723
  size = h->u.c.size;
5724
  power_of_two = h->u.c.p->alignment_power;
5725
 
5726
  if (config.sort_common == sort_descending
5727
      && power_of_two < *(unsigned int *) info)
5728
    return TRUE;
5729
  else if (config.sort_common == sort_ascending
5730
           && power_of_two > *(unsigned int *) info)
5731
    return TRUE;
5732
 
5733
  section = h->u.c.p->section;
5734
  if (!bfd_define_common_symbol (link_info.output_bfd, &link_info, h))
5735
    einfo (_("%P%F: Could not define common symbol `%T': %E\n"),
5736
           h->root.string);
5737
 
5738
  if (config.map_file != NULL)
5739
    {
5740
      static bfd_boolean header_printed;
5741
      int len;
5742
      char *name;
5743
      char buf[50];
5744
 
5745
      if (! header_printed)
5746
        {
5747
          minfo (_("\nAllocating common symbols\n"));
5748
          minfo (_("Common symbol       size              file\n\n"));
5749
          header_printed = TRUE;
5750
        }
5751
 
5752
      name = bfd_demangle (link_info.output_bfd, h->root.string,
5753
                           DMGL_ANSI | DMGL_PARAMS);
5754
      if (name == NULL)
5755
        {
5756
          minfo ("%s", h->root.string);
5757
          len = strlen (h->root.string);
5758
        }
5759
      else
5760
        {
5761
          minfo ("%s", name);
5762
          len = strlen (name);
5763
          free (name);
5764
        }
5765
 
5766
      if (len >= 19)
5767
        {
5768
          print_nl ();
5769
          len = 0;
5770
        }
5771
      while (len < 20)
5772
        {
5773
          print_space ();
5774
          ++len;
5775
        }
5776
 
5777
      minfo ("0x");
5778
      if (size <= 0xffffffff)
5779
        sprintf (buf, "%lx", (unsigned long) size);
5780
      else
5781
        sprintf_vma (buf, size);
5782
      minfo ("%s", buf);
5783
      len = strlen (buf);
5784
 
5785
      while (len < 16)
5786
        {
5787
          print_space ();
5788
          ++len;
5789
        }
5790
 
5791
      minfo ("%B\n", section->owner);
5792
    }
5793
 
5794
  return TRUE;
5795
}
5796
 
5797
/* Run through the input files and ensure that every input section has
5798
   somewhere to go.  If one is found without a destination then create
5799
   an input request and place it into the statement tree.  */
5800
 
5801
static void
5802
lang_place_orphans (void)
5803
{
5804
  LANG_FOR_EACH_INPUT_STATEMENT (file)
5805
    {
5806
      asection *s;
5807
 
5808
      for (s = file->the_bfd->sections; s != NULL; s = s->next)
5809
        {
5810
          if (s->output_section == NULL)
5811
            {
5812
              /* This section of the file is not attached, root
5813
                 around for a sensible place for it to go.  */
5814
 
5815
              if (file->just_syms_flag)
5816
                bfd_link_just_syms (file->the_bfd, s, &link_info);
5817
              else if ((s->flags & SEC_EXCLUDE) != 0)
5818
                s->output_section = bfd_abs_section_ptr;
5819
              else if (strcmp (s->name, "COMMON") == 0)
5820
                {
5821
                  /* This is a lonely common section which must have
5822
                     come from an archive.  We attach to the section
5823
                     with the wildcard.  */
5824
                  if (! link_info.relocatable
5825
                      || command_line.force_common_definition)
5826
                    {
5827
                      if (default_common_section == NULL)
5828
                        default_common_section
5829
                          = lang_output_section_statement_lookup (".bss", 0,
5830
                                                                  TRUE);
5831
                      lang_add_section (&default_common_section->children, s,
5832
                                        default_common_section);
5833
                    }
5834
                }
5835
              else
5836
                {
5837
                  const char *name = s->name;
5838
                  int constraint = 0;
5839
 
5840
                  if (config.unique_orphan_sections || unique_section_p (s))
5841
                    constraint = SPECIAL;
5842
 
5843
                  if (!ldemul_place_orphan (s, name, constraint))
5844
                    {
5845
                      lang_output_section_statement_type *os;
5846
                      os = lang_output_section_statement_lookup (name,
5847
                                                                 constraint,
5848
                                                                 TRUE);
5849
                      lang_add_section (&os->children, s, os);
5850
                    }
5851
                }
5852
            }
5853
        }
5854
    }
5855
}
5856
 
5857
void
5858
lang_set_flags (lang_memory_region_type *ptr, const char *flags, int invert)
5859
{
5860
  flagword *ptr_flags;
5861
 
5862
  ptr_flags = invert ? &ptr->not_flags : &ptr->flags;
5863
  while (*flags)
5864
    {
5865
      switch (*flags)
5866
        {
5867
        case 'A': case 'a':
5868
          *ptr_flags |= SEC_ALLOC;
5869
          break;
5870
 
5871
        case 'R': case 'r':
5872
          *ptr_flags |= SEC_READONLY;
5873
          break;
5874
 
5875
        case 'W': case 'w':
5876
          *ptr_flags |= SEC_DATA;
5877
          break;
5878
 
5879
        case 'X': case 'x':
5880
          *ptr_flags |= SEC_CODE;
5881
          break;
5882
 
5883
        case 'L': case 'l':
5884
        case 'I': case 'i':
5885
          *ptr_flags |= SEC_LOAD;
5886
          break;
5887
 
5888
        default:
5889
          einfo (_("%P%F: invalid syntax in flags\n"));
5890
          break;
5891
        }
5892
      flags++;
5893
    }
5894
}
5895
 
5896
/* Call a function on each input file.  This function will be called
5897
   on an archive, but not on the elements.  */
5898
 
5899
void
5900
lang_for_each_input_file (void (*func) (lang_input_statement_type *))
5901
{
5902
  lang_input_statement_type *f;
5903
 
5904
  for (f = (lang_input_statement_type *) input_file_chain.head;
5905
       f != NULL;
5906
       f = (lang_input_statement_type *) f->next_real_file)
5907
    func (f);
5908
}
5909
 
5910
/* Call a function on each file.  The function will be called on all
5911
   the elements of an archive which are included in the link, but will
5912
   not be called on the archive file itself.  */
5913
 
5914
void
5915
lang_for_each_file (void (*func) (lang_input_statement_type *))
5916
{
5917
  LANG_FOR_EACH_INPUT_STATEMENT (f)
5918
    {
5919
      func (f);
5920
    }
5921
}
5922
 
5923
void
5924
ldlang_add_file (lang_input_statement_type *entry)
5925
{
5926
  lang_statement_append (&file_chain,
5927
                         (lang_statement_union_type *) entry,
5928
                         &entry->next);
5929
 
5930
  /* The BFD linker needs to have a list of all input BFDs involved in
5931
     a link.  */
5932
  ASSERT (entry->the_bfd->link_next == NULL);
5933
  ASSERT (entry->the_bfd != link_info.output_bfd);
5934
 
5935
  *link_info.input_bfds_tail = entry->the_bfd;
5936
  link_info.input_bfds_tail = &entry->the_bfd->link_next;
5937
  entry->the_bfd->usrdata = entry;
5938
  bfd_set_gp_size (entry->the_bfd, g_switch_value);
5939
 
5940
  /* Look through the sections and check for any which should not be
5941
     included in the link.  We need to do this now, so that we can
5942
     notice when the backend linker tries to report multiple
5943
     definition errors for symbols which are in sections we aren't
5944
     going to link.  FIXME: It might be better to entirely ignore
5945
     symbols which are defined in sections which are going to be
5946
     discarded.  This would require modifying the backend linker for
5947
     each backend which might set the SEC_LINK_ONCE flag.  If we do
5948
     this, we should probably handle SEC_EXCLUDE in the same way.  */
5949
 
5950
  bfd_map_over_sections (entry->the_bfd, section_already_linked, entry);
5951
}
5952
 
5953
void
5954
lang_add_output (const char *name, int from_script)
5955
{
5956
  /* Make -o on command line override OUTPUT in script.  */
5957
  if (!had_output_filename || !from_script)
5958
    {
5959
      output_filename = name;
5960
      had_output_filename = TRUE;
5961
    }
5962
}
5963
 
5964
static lang_output_section_statement_type *current_section;
5965
 
5966
static int
5967
topower (int x)
5968
{
5969
  unsigned int i = 1;
5970
  int l;
5971
 
5972
  if (x < 0)
5973
    return -1;
5974
 
5975
  for (l = 0; l < 32; l++)
5976
    {
5977
      if (i >= (unsigned int) x)
5978
        return l;
5979
      i <<= 1;
5980
    }
5981
 
5982
  return 0;
5983
}
5984
 
5985
lang_output_section_statement_type *
5986
lang_enter_output_section_statement (const char *output_section_statement_name,
5987
                                     etree_type *address_exp,
5988
                                     enum section_type sectype,
5989
                                     etree_type *align,
5990
                                     etree_type *subalign,
5991
                                     etree_type *ebase,
5992
                                     int constraint)
5993
{
5994
  lang_output_section_statement_type *os;
5995
 
5996
  os = lang_output_section_statement_lookup (output_section_statement_name,
5997
                                             constraint, TRUE);
5998
  current_section = os;
5999
 
6000
  if (os->addr_tree == NULL)
6001
    {
6002
      os->addr_tree = address_exp;
6003
    }
6004
  os->sectype = sectype;
6005
  if (sectype != noload_section)
6006
    os->flags = SEC_NO_FLAGS;
6007
  else
6008
    os->flags = SEC_NEVER_LOAD;
6009
  os->block_value = 1;
6010
 
6011
  /* Make next things chain into subchain of this.  */
6012
  push_stat_ptr (&os->children);
6013
 
6014
  os->subsection_alignment =
6015
    topower (exp_get_value_int (subalign, -1, "subsection alignment"));
6016
  os->section_alignment =
6017
    topower (exp_get_value_int (align, -1, "section alignment"));
6018
 
6019
  os->load_base = ebase;
6020
  return os;
6021
}
6022
 
6023
void
6024
lang_final (void)
6025
{
6026
  lang_output_statement_type *new_stmt;
6027
 
6028
  new_stmt = new_stat (lang_output_statement, stat_ptr);
6029
  new_stmt->name = output_filename;
6030
 
6031
}
6032
 
6033
/* Reset the current counters in the regions.  */
6034
 
6035
void
6036
lang_reset_memory_regions (void)
6037
{
6038
  lang_memory_region_type *p = lang_memory_region_list;
6039
  asection *o;
6040
  lang_output_section_statement_type *os;
6041
 
6042
  for (p = lang_memory_region_list; p != NULL; p = p->next)
6043
    {
6044
      p->current = p->origin;
6045
      p->last_os = NULL;
6046
    }
6047
 
6048
  for (os = &lang_output_section_statement.head->output_section_statement;
6049
       os != NULL;
6050
       os = os->next)
6051
    {
6052
      os->processed_vma = FALSE;
6053
      os->processed_lma = FALSE;
6054
    }
6055
 
6056
  for (o = link_info.output_bfd->sections; o != NULL; o = o->next)
6057
    {
6058
      /* Save the last size for possible use by bfd_relax_section.  */
6059
      o->rawsize = o->size;
6060
      o->size = 0;
6061
    }
6062
}
6063
 
6064
/* Worker for lang_gc_sections_1.  */
6065
 
6066
static void
6067
gc_section_callback (lang_wild_statement_type *ptr,
6068
                     struct wildcard_list *sec ATTRIBUTE_UNUSED,
6069
                     asection *section,
6070
                     lang_input_statement_type *file ATTRIBUTE_UNUSED,
6071
                     void *data ATTRIBUTE_UNUSED)
6072
{
6073
  /* If the wild pattern was marked KEEP, the member sections
6074
     should be as well.  */
6075
  if (ptr->keep_sections)
6076
    section->flags |= SEC_KEEP;
6077
}
6078
 
6079
/* Iterate over sections marking them against GC.  */
6080
 
6081
static void
6082
lang_gc_sections_1 (lang_statement_union_type *s)
6083
{
6084
  for (; s != NULL; s = s->header.next)
6085
    {
6086
      switch (s->header.type)
6087
        {
6088
        case lang_wild_statement_enum:
6089
          walk_wild (&s->wild_statement, gc_section_callback, NULL);
6090
          break;
6091
        case lang_constructors_statement_enum:
6092
          lang_gc_sections_1 (constructor_list.head);
6093
          break;
6094
        case lang_output_section_statement_enum:
6095
          lang_gc_sections_1 (s->output_section_statement.children.head);
6096
          break;
6097
        case lang_group_statement_enum:
6098
          lang_gc_sections_1 (s->group_statement.children.head);
6099
          break;
6100
        default:
6101
          break;
6102
        }
6103
    }
6104
}
6105
 
6106
static void
6107
lang_gc_sections (void)
6108
{
6109
  /* Keep all sections so marked in the link script.  */
6110
 
6111
  lang_gc_sections_1 (statement_list.head);
6112
 
6113
  /* SEC_EXCLUDE is ignored when doing a relocatable link, except in
6114
     the special case of debug info.  (See bfd/stabs.c)
6115
     Twiddle the flag here, to simplify later linker code.  */
6116
  if (link_info.relocatable)
6117
    {
6118
      LANG_FOR_EACH_INPUT_STATEMENT (f)
6119
        {
6120
          asection *sec;
6121
          for (sec = f->the_bfd->sections; sec != NULL; sec = sec->next)
6122
            if ((sec->flags & SEC_DEBUGGING) == 0)
6123
              sec->flags &= ~SEC_EXCLUDE;
6124
        }
6125
    }
6126
 
6127
  if (link_info.gc_sections)
6128
    bfd_gc_sections (link_info.output_bfd, &link_info);
6129
}
6130
 
6131
/* Worker for lang_find_relro_sections_1.  */
6132
 
6133
static void
6134
find_relro_section_callback (lang_wild_statement_type *ptr ATTRIBUTE_UNUSED,
6135
                             struct wildcard_list *sec ATTRIBUTE_UNUSED,
6136
                             asection *section,
6137
                             lang_input_statement_type *file ATTRIBUTE_UNUSED,
6138
                             void *data)
6139
{
6140
  /* Discarded, excluded and ignored sections effectively have zero
6141
     size.  */
6142
  if (section->output_section != NULL
6143
      && section->output_section->owner == link_info.output_bfd
6144
      && (section->output_section->flags & SEC_EXCLUDE) == 0
6145
      && !IGNORE_SECTION (section)
6146
      && section->size != 0)
6147
    {
6148
      bfd_boolean *has_relro_section = (bfd_boolean *) data;
6149
      *has_relro_section = TRUE;
6150
    }
6151
}
6152
 
6153
/* Iterate over sections for relro sections.  */
6154
 
6155
static void
6156
lang_find_relro_sections_1 (lang_statement_union_type *s,
6157
                            bfd_boolean *has_relro_section)
6158
{
6159
  if (*has_relro_section)
6160
    return;
6161
 
6162
  for (; s != NULL; s = s->header.next)
6163
    {
6164
      if (s == expld.dataseg.relro_end_stat)
6165
        break;
6166
 
6167
      switch (s->header.type)
6168
        {
6169
        case lang_wild_statement_enum:
6170
          walk_wild (&s->wild_statement,
6171
                     find_relro_section_callback,
6172
                     has_relro_section);
6173
          break;
6174
        case lang_constructors_statement_enum:
6175
          lang_find_relro_sections_1 (constructor_list.head,
6176
                                      has_relro_section);
6177
          break;
6178
        case lang_output_section_statement_enum:
6179
          lang_find_relro_sections_1 (s->output_section_statement.children.head,
6180
                                      has_relro_section);
6181
          break;
6182
        case lang_group_statement_enum:
6183
          lang_find_relro_sections_1 (s->group_statement.children.head,
6184
                                      has_relro_section);
6185
          break;
6186
        default:
6187
          break;
6188
        }
6189
    }
6190
}
6191
 
6192
static void
6193
lang_find_relro_sections (void)
6194
{
6195
  bfd_boolean has_relro_section = FALSE;
6196
 
6197
  /* Check all sections in the link script.  */
6198
 
6199
  lang_find_relro_sections_1 (expld.dataseg.relro_start_stat,
6200
                              &has_relro_section);
6201
 
6202
  if (!has_relro_section)
6203
    link_info.relro = FALSE;
6204
}
6205
 
6206
/* Relax all sections until bfd_relax_section gives up.  */
6207
 
6208
void
6209
lang_relax_sections (bfd_boolean need_layout)
6210
{
6211
  if (command_line.relax)
6212
    {
6213
      /* We may need more than one relaxation pass.  */
6214
      int i = link_info.relax_pass;
6215
 
6216
      /* The backend can use it to determine the current pass.  */
6217
      link_info.relax_pass = 0;
6218
 
6219
      while (i--)
6220
        {
6221
          /* Keep relaxing until bfd_relax_section gives up.  */
6222
          bfd_boolean relax_again;
6223
 
6224
          link_info.relax_trip = -1;
6225
          do
6226
            {
6227
              link_info.relax_trip++;
6228
 
6229
              /* Note: pe-dll.c does something like this also.  If you find
6230
                 you need to change this code, you probably need to change
6231
                 pe-dll.c also.  DJ  */
6232
 
6233
              /* Do all the assignments with our current guesses as to
6234
                 section sizes.  */
6235
              lang_do_assignments ();
6236
 
6237
              /* We must do this after lang_do_assignments, because it uses
6238
                 size.  */
6239
              lang_reset_memory_regions ();
6240
 
6241
              /* Perform another relax pass - this time we know where the
6242
                 globals are, so can make a better guess.  */
6243
              relax_again = FALSE;
6244
              lang_size_sections (&relax_again, FALSE);
6245
            }
6246
          while (relax_again);
6247
 
6248
          link_info.relax_pass++;
6249
        }
6250
      need_layout = TRUE;
6251
    }
6252
 
6253
  if (need_layout)
6254
    {
6255
      /* Final extra sizing to report errors.  */
6256
      lang_do_assignments ();
6257
      lang_reset_memory_regions ();
6258
      lang_size_sections (NULL, TRUE);
6259
    }
6260
}
6261
 
6262
void
6263
lang_process (void)
6264
{
6265
  /* Finalize dynamic list.  */
6266
  if (link_info.dynamic_list)
6267
    lang_finalize_version_expr_head (&link_info.dynamic_list->head);
6268
 
6269
  current_target = default_target;
6270
 
6271
  /* Open the output file.  */
6272
  lang_for_each_statement (ldlang_open_output);
6273
  init_opb ();
6274
 
6275
  ldemul_create_output_section_statements ();
6276
 
6277
  /* Add to the hash table all undefineds on the command line.  */
6278
  lang_place_undefineds ();
6279
 
6280
  if (!bfd_section_already_linked_table_init ())
6281
    einfo (_("%P%F: Failed to create hash table\n"));
6282
 
6283
  /* Create a bfd for each input file.  */
6284
  current_target = default_target;
6285
  open_input_bfds (statement_list.head, FALSE);
6286
 
6287
  link_info.gc_sym_list = &entry_symbol;
6288
  if (entry_symbol.name == NULL)
6289
    link_info.gc_sym_list = ldlang_undef_chain_list_head;
6290
 
6291
  ldemul_after_open ();
6292
 
6293
  bfd_section_already_linked_table_free ();
6294
 
6295
  /* Make sure that we're not mixing architectures.  We call this
6296
     after all the input files have been opened, but before we do any
6297
     other processing, so that any operations merge_private_bfd_data
6298
     does on the output file will be known during the rest of the
6299
     link.  */
6300
  lang_check ();
6301
 
6302
  /* Handle .exports instead of a version script if we're told to do so.  */
6303
  if (command_line.version_exports_section)
6304
    lang_do_version_exports_section ();
6305
 
6306
  /* Build all sets based on the information gathered from the input
6307
     files.  */
6308
  ldctor_build_sets ();
6309
 
6310
  /* Remove unreferenced sections if asked to.  */
6311
  lang_gc_sections ();
6312
 
6313
  /* Size up the common data.  */
6314
  lang_common ();
6315
 
6316
  /* Update wild statements.  */
6317
  update_wild_statements (statement_list.head);
6318
 
6319
  /* Run through the contours of the script and attach input sections
6320
     to the correct output sections.  */
6321
  map_input_to_output_sections (statement_list.head, NULL, NULL);
6322
 
6323
  process_insert_statements ();
6324
 
6325
  /* Find any sections not attached explicitly and handle them.  */
6326
  lang_place_orphans ();
6327
 
6328
  if (! link_info.relocatable)
6329
    {
6330
      asection *found;
6331
 
6332
      /* Merge SEC_MERGE sections.  This has to be done after GC of
6333
         sections, so that GCed sections are not merged, but before
6334
         assigning dynamic symbols, since removing whole input sections
6335
         is hard then.  */
6336
      bfd_merge_sections (link_info.output_bfd, &link_info);
6337
 
6338
      /* Look for a text section and set the readonly attribute in it.  */
6339
      found = bfd_get_section_by_name (link_info.output_bfd, ".text");
6340
 
6341
      if (found != NULL)
6342
        {
6343
          if (config.text_read_only)
6344
            found->flags |= SEC_READONLY;
6345
          else
6346
            found->flags &= ~SEC_READONLY;
6347
        }
6348
    }
6349
 
6350
  /* Do anything special before sizing sections.  This is where ELF
6351
     and other back-ends size dynamic sections.  */
6352
  ldemul_before_allocation ();
6353
 
6354
  /* We must record the program headers before we try to fix the
6355
     section positions, since they will affect SIZEOF_HEADERS.  */
6356
  lang_record_phdrs ();
6357
 
6358
  /* Check relro sections.  */
6359
  if (link_info.relro && ! link_info.relocatable)
6360
    lang_find_relro_sections ();
6361
 
6362
  /* Size up the sections.  */
6363
  lang_size_sections (NULL, !command_line.relax);
6364
 
6365
  /* See if anything special should be done now we know how big
6366
     everything is.  This is where relaxation is done.  */
6367
  ldemul_after_allocation ();
6368
 
6369
  /* Fix any .startof. or .sizeof. symbols.  */
6370
  lang_set_startof ();
6371
 
6372
  /* Do all the assignments, now that we know the final resting places
6373
     of all the symbols.  */
6374
 
6375
  lang_do_assignments ();
6376
 
6377
  ldemul_finish ();
6378
 
6379
  /* Make sure that the section addresses make sense.  */
6380
  if (command_line.check_section_addresses)
6381
    lang_check_section_addresses ();
6382
 
6383
  lang_end ();
6384
}
6385
 
6386
/* EXPORTED TO YACC */
6387
 
6388
void
6389
lang_add_wild (struct wildcard_spec *filespec,
6390
               struct wildcard_list *section_list,
6391
               bfd_boolean keep_sections)
6392
{
6393
  struct wildcard_list *curr, *next;
6394
  lang_wild_statement_type *new_stmt;
6395
 
6396
  /* Reverse the list as the parser puts it back to front.  */
6397
  for (curr = section_list, section_list = NULL;
6398
       curr != NULL;
6399
       section_list = curr, curr = next)
6400
    {
6401
      if (curr->spec.name != NULL && strcmp (curr->spec.name, "COMMON") == 0)
6402
        placed_commons = TRUE;
6403
 
6404
      next = curr->next;
6405
      curr->next = section_list;
6406
    }
6407
 
6408
  if (filespec != NULL && filespec->name != NULL)
6409
    {
6410
      if (strcmp (filespec->name, "*") == 0)
6411
        filespec->name = NULL;
6412
      else if (! wildcardp (filespec->name))
6413
        lang_has_input_file = TRUE;
6414
    }
6415
 
6416
  new_stmt = new_stat (lang_wild_statement, stat_ptr);
6417
  new_stmt->filename = NULL;
6418
  new_stmt->filenames_sorted = FALSE;
6419
  if (filespec != NULL)
6420
    {
6421
      new_stmt->filename = filespec->name;
6422
      new_stmt->filenames_sorted = filespec->sorted == by_name;
6423
    }
6424
  new_stmt->section_list = section_list;
6425
  new_stmt->keep_sections = keep_sections;
6426
  lang_list_init (&new_stmt->children);
6427
  analyze_walk_wild_section_handler (new_stmt);
6428
}
6429
 
6430
void
6431
lang_section_start (const char *name, etree_type *address,
6432
                    const segment_type *segment)
6433
{
6434
  lang_address_statement_type *ad;
6435
 
6436
  ad = new_stat (lang_address_statement, stat_ptr);
6437
  ad->section_name = name;
6438
  ad->address = address;
6439
  ad->segment = segment;
6440
}
6441
 
6442
/* Set the start symbol to NAME.  CMDLINE is nonzero if this is called
6443
   because of a -e argument on the command line, or zero if this is
6444
   called by ENTRY in a linker script.  Command line arguments take
6445
   precedence.  */
6446
 
6447
void
6448
lang_add_entry (const char *name, bfd_boolean cmdline)
6449
{
6450
  if (entry_symbol.name == NULL
6451
      || cmdline
6452
      || ! entry_from_cmdline)
6453
    {
6454
      entry_symbol.name = name;
6455
      entry_from_cmdline = cmdline;
6456
    }
6457
}
6458
 
6459
/* Set the default start symbol to NAME.  .em files should use this,
6460
   not lang_add_entry, to override the use of "start" if neither the
6461
   linker script nor the command line specifies an entry point.  NAME
6462
   must be permanently allocated.  */
6463
void
6464
lang_default_entry (const char *name)
6465
{
6466
  entry_symbol_default = name;
6467
}
6468
 
6469
void
6470
lang_add_target (const char *name)
6471
{
6472
  lang_target_statement_type *new_stmt;
6473
 
6474
  new_stmt = new_stat (lang_target_statement, stat_ptr);
6475
  new_stmt->target = name;
6476
}
6477
 
6478
void
6479
lang_add_map (const char *name)
6480
{
6481
  while (*name)
6482
    {
6483
      switch (*name)
6484
        {
6485
        case 'F':
6486
          map_option_f = TRUE;
6487
          break;
6488
        }
6489
      name++;
6490
    }
6491
}
6492
 
6493
void
6494
lang_add_fill (fill_type *fill)
6495
{
6496
  lang_fill_statement_type *new_stmt;
6497
 
6498
  new_stmt = new_stat (lang_fill_statement, stat_ptr);
6499
  new_stmt->fill = fill;
6500
}
6501
 
6502
void
6503
lang_add_data (int type, union etree_union *exp)
6504
{
6505
  lang_data_statement_type *new_stmt;
6506
 
6507
  new_stmt = new_stat (lang_data_statement, stat_ptr);
6508
  new_stmt->exp = exp;
6509
  new_stmt->type = type;
6510
}
6511
 
6512
/* Create a new reloc statement.  RELOC is the BFD relocation type to
6513
   generate.  HOWTO is the corresponding howto structure (we could
6514
   look this up, but the caller has already done so).  SECTION is the
6515
   section to generate a reloc against, or NAME is the name of the
6516
   symbol to generate a reloc against.  Exactly one of SECTION and
6517
   NAME must be NULL.  ADDEND is an expression for the addend.  */
6518
 
6519
void
6520
lang_add_reloc (bfd_reloc_code_real_type reloc,
6521
                reloc_howto_type *howto,
6522
                asection *section,
6523
                const char *name,
6524
                union etree_union *addend)
6525
{
6526
  lang_reloc_statement_type *p = new_stat (lang_reloc_statement, stat_ptr);
6527
 
6528
  p->reloc = reloc;
6529
  p->howto = howto;
6530
  p->section = section;
6531
  p->name = name;
6532
  p->addend_exp = addend;
6533
 
6534
  p->addend_value = 0;
6535
  p->output_section = NULL;
6536
  p->output_offset = 0;
6537
}
6538
 
6539
lang_assignment_statement_type *
6540
lang_add_assignment (etree_type *exp)
6541
{
6542
  lang_assignment_statement_type *new_stmt;
6543
 
6544
  new_stmt = new_stat (lang_assignment_statement, stat_ptr);
6545
  new_stmt->exp = exp;
6546
  return new_stmt;
6547
}
6548
 
6549
void
6550
lang_add_attribute (enum statement_enum attribute)
6551
{
6552
  new_statement (attribute, sizeof (lang_statement_header_type), stat_ptr);
6553
}
6554
 
6555
void
6556
lang_startup (const char *name)
6557
{
6558
  if (startup_file != NULL)
6559
    {
6560
      einfo (_("%P%F: multiple STARTUP files\n"));
6561
    }
6562
  first_file->filename = name;
6563
  first_file->local_sym_name = name;
6564
  first_file->real = TRUE;
6565
 
6566
  startup_file = name;
6567
}
6568
 
6569
void
6570
lang_float (bfd_boolean maybe)
6571
{
6572
  lang_float_flag = maybe;
6573
}
6574
 
6575
 
6576
/* Work out the load- and run-time regions from a script statement, and
6577
   store them in *LMA_REGION and *REGION respectively.
6578
 
6579
   MEMSPEC is the name of the run-time region, or the value of
6580
   DEFAULT_MEMORY_REGION if the statement didn't specify one.
6581
   LMA_MEMSPEC is the name of the load-time region, or null if the
6582
   statement didn't specify one.HAVE_LMA_P is TRUE if the statement
6583
   had an explicit load address.
6584
 
6585
   It is an error to specify both a load region and a load address.  */
6586
 
6587
static void
6588
lang_get_regions (lang_memory_region_type **region,
6589
                  lang_memory_region_type **lma_region,
6590
                  const char *memspec,
6591
                  const char *lma_memspec,
6592
                  bfd_boolean have_lma,
6593
                  bfd_boolean have_vma)
6594
{
6595
  *lma_region = lang_memory_region_lookup (lma_memspec, FALSE);
6596
 
6597
  /* If no runtime region or VMA has been specified, but the load region
6598
     has been specified, then use the load region for the runtime region
6599
     as well.  */
6600
  if (lma_memspec != NULL
6601
      && ! have_vma
6602
      && strcmp (memspec, DEFAULT_MEMORY_REGION) == 0)
6603
    *region = *lma_region;
6604
  else
6605
    *region = lang_memory_region_lookup (memspec, FALSE);
6606
 
6607
  if (have_lma && lma_memspec != 0)
6608
    einfo (_("%X%P:%S: section has both a load address and a load region\n"));
6609
}
6610
 
6611
void
6612
lang_leave_output_section_statement (fill_type *fill, const char *memspec,
6613
                                     lang_output_section_phdr_list *phdrs,
6614
                                     const char *lma_memspec)
6615
{
6616
  lang_get_regions (&current_section->region,
6617
                    &current_section->lma_region,
6618
                    memspec, lma_memspec,
6619
                    current_section->load_base != NULL,
6620
                    current_section->addr_tree != NULL);
6621
 
6622
  /* If this section has no load region or base, but has the same
6623
     region as the previous section, then propagate the previous
6624
     section's load region.  */
6625
 
6626
  if (!current_section->lma_region && !current_section->load_base
6627
      && current_section->region == current_section->prev->region)
6628
    current_section->lma_region = current_section->prev->lma_region;
6629
 
6630
  current_section->fill = fill;
6631
  current_section->phdrs = phdrs;
6632
  pop_stat_ptr ();
6633
}
6634
 
6635
/* Create an absolute symbol with the given name with the value of the
6636
   address of first byte of the section named.
6637
 
6638
   If the symbol already exists, then do nothing.  */
6639
 
6640
void
6641
lang_abs_symbol_at_beginning_of (const char *secname, const char *name)
6642
{
6643
  struct bfd_link_hash_entry *h;
6644
 
6645
  h = bfd_link_hash_lookup (link_info.hash, name, TRUE, TRUE, TRUE);
6646
  if (h == NULL)
6647
    einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
6648
 
6649
  if (h->type == bfd_link_hash_new
6650
      || h->type == bfd_link_hash_undefined)
6651
    {
6652
      asection *sec;
6653
 
6654
      h->type = bfd_link_hash_defined;
6655
 
6656
      sec = bfd_get_section_by_name (link_info.output_bfd, secname);
6657
      if (sec == NULL)
6658
        h->u.def.value = 0;
6659
      else
6660
        h->u.def.value = bfd_get_section_vma (link_info.output_bfd, sec);
6661
 
6662
      h->u.def.section = bfd_abs_section_ptr;
6663
    }
6664
}
6665
 
6666
/* Create an absolute symbol with the given name with the value of the
6667
   address of the first byte after the end of the section named.
6668
 
6669
   If the symbol already exists, then do nothing.  */
6670
 
6671
void
6672
lang_abs_symbol_at_end_of (const char *secname, const char *name)
6673
{
6674
  struct bfd_link_hash_entry *h;
6675
 
6676
  h = bfd_link_hash_lookup (link_info.hash, name, TRUE, TRUE, TRUE);
6677
  if (h == NULL)
6678
    einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
6679
 
6680
  if (h->type == bfd_link_hash_new
6681
      || h->type == bfd_link_hash_undefined)
6682
    {
6683
      asection *sec;
6684
 
6685
      h->type = bfd_link_hash_defined;
6686
 
6687
      sec = bfd_get_section_by_name (link_info.output_bfd, secname);
6688
      if (sec == NULL)
6689
        h->u.def.value = 0;
6690
      else
6691
        h->u.def.value = (bfd_get_section_vma (link_info.output_bfd, sec)
6692
                          + TO_ADDR (sec->size));
6693
 
6694
      h->u.def.section = bfd_abs_section_ptr;
6695
    }
6696
}
6697
 
6698
void
6699
lang_statement_append (lang_statement_list_type *list,
6700
                       lang_statement_union_type *element,
6701
                       lang_statement_union_type **field)
6702
{
6703
  *(list->tail) = element;
6704
  list->tail = field;
6705
}
6706
 
6707
/* Set the output format type.  -oformat overrides scripts.  */
6708
 
6709
void
6710
lang_add_output_format (const char *format,
6711
                        const char *big,
6712
                        const char *little,
6713
                        int from_script)
6714
{
6715
  if (output_target == NULL || !from_script)
6716
    {
6717
      if (command_line.endian == ENDIAN_BIG
6718
          && big != NULL)
6719
        format = big;
6720
      else if (command_line.endian == ENDIAN_LITTLE
6721
               && little != NULL)
6722
        format = little;
6723
 
6724
      output_target = format;
6725
    }
6726
}
6727
 
6728
void
6729
lang_add_insert (const char *where, int is_before)
6730
{
6731
  lang_insert_statement_type *new_stmt;
6732
 
6733
  new_stmt = new_stat (lang_insert_statement, stat_ptr);
6734
  new_stmt->where = where;
6735
  new_stmt->is_before = is_before;
6736
  saved_script_handle = previous_script_handle;
6737
}
6738
 
6739
/* Enter a group.  This creates a new lang_group_statement, and sets
6740
   stat_ptr to build new statements within the group.  */
6741
 
6742
void
6743
lang_enter_group (void)
6744
{
6745
  lang_group_statement_type *g;
6746
 
6747
  g = new_stat (lang_group_statement, stat_ptr);
6748
  lang_list_init (&g->children);
6749
  push_stat_ptr (&g->children);
6750
}
6751
 
6752
/* Leave a group.  This just resets stat_ptr to start writing to the
6753
   regular list of statements again.  Note that this will not work if
6754
   groups can occur inside anything else which can adjust stat_ptr,
6755
   but currently they can't.  */
6756
 
6757
void
6758
lang_leave_group (void)
6759
{
6760
  pop_stat_ptr ();
6761
}
6762
 
6763
/* Add a new program header.  This is called for each entry in a PHDRS
6764
   command in a linker script.  */
6765
 
6766
void
6767
lang_new_phdr (const char *name,
6768
               etree_type *type,
6769
               bfd_boolean filehdr,
6770
               bfd_boolean phdrs,
6771
               etree_type *at,
6772
               etree_type *flags)
6773
{
6774
  struct lang_phdr *n, **pp;
6775
 
6776
  n = (struct lang_phdr *) stat_alloc (sizeof (struct lang_phdr));
6777
  n->next = NULL;
6778
  n->name = name;
6779
  n->type = exp_get_value_int (type, 0, "program header type");
6780
  n->filehdr = filehdr;
6781
  n->phdrs = phdrs;
6782
  n->at = at;
6783
  n->flags = flags;
6784
 
6785
  for (pp = &lang_phdr_list; *pp != NULL; pp = &(*pp)->next)
6786
    ;
6787
  *pp = n;
6788
}
6789
 
6790
/* Record the program header information in the output BFD.  FIXME: We
6791
   should not be calling an ELF specific function here.  */
6792
 
6793
static void
6794
lang_record_phdrs (void)
6795
{
6796
  unsigned int alc;
6797
  asection **secs;
6798
  lang_output_section_phdr_list *last;
6799
  struct lang_phdr *l;
6800
  lang_output_section_statement_type *os;
6801
 
6802
  alc = 10;
6803
  secs = (asection **) xmalloc (alc * sizeof (asection *));
6804
  last = NULL;
6805
 
6806
  for (l = lang_phdr_list; l != NULL; l = l->next)
6807
    {
6808
      unsigned int c;
6809
      flagword flags;
6810
      bfd_vma at;
6811
 
6812
      c = 0;
6813
      for (os = &lang_output_section_statement.head->output_section_statement;
6814
           os != NULL;
6815
           os = os->next)
6816
        {
6817
          lang_output_section_phdr_list *pl;
6818
 
6819
          if (os->constraint < 0)
6820
            continue;
6821
 
6822
          pl = os->phdrs;
6823
          if (pl != NULL)
6824
            last = pl;
6825
          else
6826
            {
6827
              if (os->sectype == noload_section
6828
                  || os->bfd_section == NULL
6829
                  || (os->bfd_section->flags & SEC_ALLOC) == 0)
6830
                continue;
6831
 
6832
              /* Don't add orphans to PT_INTERP header.  */
6833
              if (l->type == 3)
6834
                continue;
6835
 
6836
              if (last == NULL)
6837
                {
6838
                  lang_output_section_statement_type * tmp_os;
6839
 
6840
                  /* If we have not run across a section with a program
6841
                     header assigned to it yet, then scan forwards to find
6842
                     one.  This prevents inconsistencies in the linker's
6843
                     behaviour when a script has specified just a single
6844
                     header and there are sections in that script which are
6845
                     not assigned to it, and which occur before the first
6846
                     use of that header. See here for more details:
6847
                     http://sourceware.org/ml/binutils/2007-02/msg00291.html  */
6848
                  for (tmp_os = os; tmp_os; tmp_os = tmp_os->next)
6849
                    if (tmp_os->phdrs)
6850
                      {
6851
                        last = tmp_os->phdrs;
6852
                        break;
6853
                      }
6854
                  if (last == NULL)
6855
                    einfo (_("%F%P: no sections assigned to phdrs\n"));
6856
                }
6857
              pl = last;
6858
            }
6859
 
6860
          if (os->bfd_section == NULL)
6861
            continue;
6862
 
6863
          for (; pl != NULL; pl = pl->next)
6864
            {
6865
              if (strcmp (pl->name, l->name) == 0)
6866
                {
6867
                  if (c >= alc)
6868
                    {
6869
                      alc *= 2;
6870
                      secs = (asection **) xrealloc (secs,
6871
                                                     alc * sizeof (asection *));
6872
                    }
6873
                  secs[c] = os->bfd_section;
6874
                  ++c;
6875
                  pl->used = TRUE;
6876
                }
6877
            }
6878
        }
6879
 
6880
      if (l->flags == NULL)
6881
        flags = 0;
6882
      else
6883
        flags = exp_get_vma (l->flags, 0, "phdr flags");
6884
 
6885
      if (l->at == NULL)
6886
        at = 0;
6887
      else
6888
        at = exp_get_vma (l->at, 0, "phdr load address");
6889
 
6890
      if (! bfd_record_phdr (link_info.output_bfd, l->type,
6891
                             l->flags != NULL, flags, l->at != NULL,
6892
                             at, l->filehdr, l->phdrs, c, secs))
6893
        einfo (_("%F%P: bfd_record_phdr failed: %E\n"));
6894
    }
6895
 
6896
  free (secs);
6897
 
6898
  /* Make sure all the phdr assignments succeeded.  */
6899
  for (os = &lang_output_section_statement.head->output_section_statement;
6900
       os != NULL;
6901
       os = os->next)
6902
    {
6903
      lang_output_section_phdr_list *pl;
6904
 
6905
      if (os->constraint < 0
6906
          || os->bfd_section == NULL)
6907
        continue;
6908
 
6909
      for (pl = os->phdrs;
6910
           pl != NULL;
6911
           pl = pl->next)
6912
        if (! pl->used && strcmp (pl->name, "NONE") != 0)
6913
          einfo (_("%X%P: section `%s' assigned to non-existent phdr `%s'\n"),
6914
                 os->name, pl->name);
6915
    }
6916
}
6917
 
6918
/* Record a list of sections which may not be cross referenced.  */
6919
 
6920
void
6921
lang_add_nocrossref (lang_nocrossref_type *l)
6922
{
6923
  struct lang_nocrossrefs *n;
6924
 
6925
  n = (struct lang_nocrossrefs *) xmalloc (sizeof *n);
6926
  n->next = nocrossref_list;
6927
  n->list = l;
6928
  nocrossref_list = n;
6929
 
6930
  /* Set notice_all so that we get informed about all symbols.  */
6931
  link_info.notice_all = TRUE;
6932
}
6933
 
6934
/* Overlay handling.  We handle overlays with some static variables.  */
6935
 
6936
/* The overlay virtual address.  */
6937
static etree_type *overlay_vma;
6938
/* And subsection alignment.  */
6939
static etree_type *overlay_subalign;
6940
 
6941
/* An expression for the maximum section size seen so far.  */
6942
static etree_type *overlay_max;
6943
 
6944
/* A list of all the sections in this overlay.  */
6945
 
6946
struct overlay_list {
6947
  struct overlay_list *next;
6948
  lang_output_section_statement_type *os;
6949
};
6950
 
6951
static struct overlay_list *overlay_list;
6952
 
6953
/* Start handling an overlay.  */
6954
 
6955
void
6956
lang_enter_overlay (etree_type *vma_expr, etree_type *subalign)
6957
{
6958
  /* The grammar should prevent nested overlays from occurring.  */
6959
  ASSERT (overlay_vma == NULL
6960
          && overlay_subalign == NULL
6961
          && overlay_max == NULL);
6962
 
6963
  overlay_vma = vma_expr;
6964
  overlay_subalign = subalign;
6965
}
6966
 
6967
/* Start a section in an overlay.  We handle this by calling
6968
   lang_enter_output_section_statement with the correct VMA.
6969
   lang_leave_overlay sets up the LMA and memory regions.  */
6970
 
6971
void
6972
lang_enter_overlay_section (const char *name)
6973
{
6974
  struct overlay_list *n;
6975
  etree_type *size;
6976
 
6977
  lang_enter_output_section_statement (name, overlay_vma, overlay_section,
6978
                                       0, overlay_subalign, 0, 0);
6979
 
6980
  /* If this is the first section, then base the VMA of future
6981
     sections on this one.  This will work correctly even if `.' is
6982
     used in the addresses.  */
6983
  if (overlay_list == NULL)
6984
    overlay_vma = exp_nameop (ADDR, name);
6985
 
6986
  /* Remember the section.  */
6987
  n = (struct overlay_list *) xmalloc (sizeof *n);
6988
  n->os = current_section;
6989
  n->next = overlay_list;
6990
  overlay_list = n;
6991
 
6992
  size = exp_nameop (SIZEOF, name);
6993
 
6994
  /* Arrange to work out the maximum section end address.  */
6995
  if (overlay_max == NULL)
6996
    overlay_max = size;
6997
  else
6998
    overlay_max = exp_binop (MAX_K, overlay_max, size);
6999
}
7000
 
7001
/* Finish a section in an overlay.  There isn't any special to do
7002
   here.  */
7003
 
7004
void
7005
lang_leave_overlay_section (fill_type *fill,
7006
                            lang_output_section_phdr_list *phdrs)
7007
{
7008
  const char *name;
7009
  char *clean, *s2;
7010
  const char *s1;
7011
  char *buf;
7012
 
7013
  name = current_section->name;
7014
 
7015
  /* For now, assume that DEFAULT_MEMORY_REGION is the run-time memory
7016
     region and that no load-time region has been specified.  It doesn't
7017
     really matter what we say here, since lang_leave_overlay will
7018
     override it.  */
7019
  lang_leave_output_section_statement (fill, DEFAULT_MEMORY_REGION, phdrs, 0);
7020
 
7021
  /* Define the magic symbols.  */
7022
 
7023
  clean = (char *) xmalloc (strlen (name) + 1);
7024
  s2 = clean;
7025
  for (s1 = name; *s1 != '\0'; s1++)
7026
    if (ISALNUM (*s1) || *s1 == '_')
7027
      *s2++ = *s1;
7028
  *s2 = '\0';
7029
 
7030
  buf = (char *) xmalloc (strlen (clean) + sizeof "__load_start_");
7031
  sprintf (buf, "__load_start_%s", clean);
7032
  lang_add_assignment (exp_provide (buf,
7033
                                    exp_nameop (LOADADDR, name),
7034
                                    FALSE));
7035
 
7036
  buf = (char *) xmalloc (strlen (clean) + sizeof "__load_stop_");
7037
  sprintf (buf, "__load_stop_%s", clean);
7038
  lang_add_assignment (exp_provide (buf,
7039
                                    exp_binop ('+',
7040
                                               exp_nameop (LOADADDR, name),
7041
                                               exp_nameop (SIZEOF, name)),
7042
                                    FALSE));
7043
 
7044
  free (clean);
7045
}
7046
 
7047
/* Finish an overlay.  If there are any overlay wide settings, this
7048
   looks through all the sections in the overlay and sets them.  */
7049
 
7050
void
7051
lang_leave_overlay (etree_type *lma_expr,
7052
                    int nocrossrefs,
7053
                    fill_type *fill,
7054
                    const char *memspec,
7055
                    lang_output_section_phdr_list *phdrs,
7056
                    const char *lma_memspec)
7057
{
7058
  lang_memory_region_type *region;
7059
  lang_memory_region_type *lma_region;
7060
  struct overlay_list *l;
7061
  lang_nocrossref_type *nocrossref;
7062
 
7063
  lang_get_regions (&region, &lma_region,
7064
                    memspec, lma_memspec,
7065
                    lma_expr != NULL, FALSE);
7066
 
7067
  nocrossref = NULL;
7068
 
7069
  /* After setting the size of the last section, set '.' to end of the
7070
     overlay region.  */
7071
  if (overlay_list != NULL)
7072
    overlay_list->os->update_dot_tree
7073
      = exp_assop ('=', ".", exp_binop ('+', overlay_vma, overlay_max));
7074
 
7075
  l = overlay_list;
7076
  while (l != NULL)
7077
    {
7078
      struct overlay_list *next;
7079
 
7080
      if (fill != NULL && l->os->fill == NULL)
7081
        l->os->fill = fill;
7082
 
7083
      l->os->region = region;
7084
      l->os->lma_region = lma_region;
7085
 
7086
      /* The first section has the load address specified in the
7087
         OVERLAY statement.  The rest are worked out from that.
7088
         The base address is not needed (and should be null) if
7089
         an LMA region was specified.  */
7090
      if (l->next == 0)
7091
        {
7092
          l->os->load_base = lma_expr;
7093
          l->os->sectype = normal_section;
7094
        }
7095
      if (phdrs != NULL && l->os->phdrs == NULL)
7096
        l->os->phdrs = phdrs;
7097
 
7098
      if (nocrossrefs)
7099
        {
7100
          lang_nocrossref_type *nc;
7101
 
7102
          nc = (lang_nocrossref_type *) xmalloc (sizeof *nc);
7103
          nc->name = l->os->name;
7104
          nc->next = nocrossref;
7105
          nocrossref = nc;
7106
        }
7107
 
7108
      next = l->next;
7109
      free (l);
7110
      l = next;
7111
    }
7112
 
7113
  if (nocrossref != NULL)
7114
    lang_add_nocrossref (nocrossref);
7115
 
7116
  overlay_vma = NULL;
7117
  overlay_list = NULL;
7118
  overlay_max = NULL;
7119
}
7120
 
7121
/* Version handling.  This is only useful for ELF.  */
7122
 
7123
/* This global variable holds the version tree that we build.  */
7124
 
7125
struct bfd_elf_version_tree *lang_elf_version_info;
7126
 
7127
/* If PREV is NULL, return first version pattern matching particular symbol.
7128
   If PREV is non-NULL, return first version pattern matching particular
7129
   symbol after PREV (previously returned by lang_vers_match).  */
7130
 
7131
static struct bfd_elf_version_expr *
7132
lang_vers_match (struct bfd_elf_version_expr_head *head,
7133
                 struct bfd_elf_version_expr *prev,
7134
                 const char *sym)
7135
{
7136
  const char *cxx_sym = sym;
7137
  const char *java_sym = sym;
7138
  struct bfd_elf_version_expr *expr = NULL;
7139
 
7140
  if (head->mask & BFD_ELF_VERSION_CXX_TYPE)
7141
    {
7142
      cxx_sym = cplus_demangle (sym, DMGL_PARAMS | DMGL_ANSI);
7143
      if (!cxx_sym)
7144
        cxx_sym = sym;
7145
    }
7146
  if (head->mask & BFD_ELF_VERSION_JAVA_TYPE)
7147
    {
7148
      java_sym = cplus_demangle (sym, DMGL_JAVA);
7149
      if (!java_sym)
7150
        java_sym = sym;
7151
    }
7152
 
7153
  if (head->htab && (prev == NULL || prev->literal))
7154
    {
7155
      struct bfd_elf_version_expr e;
7156
 
7157
      switch (prev ? prev->mask : 0)
7158
        {
7159
        case 0:
7160
          if (head->mask & BFD_ELF_VERSION_C_TYPE)
7161
            {
7162
              e.pattern = sym;
7163
              expr = (struct bfd_elf_version_expr *)
7164
                  htab_find ((htab_t) head->htab, &e);
7165
              while (expr && strcmp (expr->pattern, sym) == 0)
7166
                if (expr->mask == BFD_ELF_VERSION_C_TYPE)
7167
                  goto out_ret;
7168
                else
7169
                  expr = expr->next;
7170
            }
7171
          /* Fallthrough */
7172
        case BFD_ELF_VERSION_C_TYPE:
7173
          if (head->mask & BFD_ELF_VERSION_CXX_TYPE)
7174
            {
7175
              e.pattern = cxx_sym;
7176
              expr = (struct bfd_elf_version_expr *)
7177
                  htab_find ((htab_t) head->htab, &e);
7178
              while (expr && strcmp (expr->pattern, cxx_sym) == 0)
7179
                if (expr->mask == BFD_ELF_VERSION_CXX_TYPE)
7180
                  goto out_ret;
7181
                else
7182
                  expr = expr->next;
7183
            }
7184
          /* Fallthrough */
7185
        case BFD_ELF_VERSION_CXX_TYPE:
7186
          if (head->mask & BFD_ELF_VERSION_JAVA_TYPE)
7187
            {
7188
              e.pattern = java_sym;
7189
              expr = (struct bfd_elf_version_expr *)
7190
                  htab_find ((htab_t) head->htab, &e);
7191
              while (expr && strcmp (expr->pattern, java_sym) == 0)
7192
                if (expr->mask == BFD_ELF_VERSION_JAVA_TYPE)
7193
                  goto out_ret;
7194
                else
7195
                  expr = expr->next;
7196
            }
7197
          /* Fallthrough */
7198
        default:
7199
          break;
7200
        }
7201
    }
7202
 
7203
  /* Finally, try the wildcards.  */
7204
  if (prev == NULL || prev->literal)
7205
    expr = head->remaining;
7206
  else
7207
    expr = prev->next;
7208
  for (; expr; expr = expr->next)
7209
    {
7210
      const char *s;
7211
 
7212
      if (!expr->pattern)
7213
        continue;
7214
 
7215
      if (expr->pattern[0] == '*' && expr->pattern[1] == '\0')
7216
        break;
7217
 
7218
      if (expr->mask == BFD_ELF_VERSION_JAVA_TYPE)
7219
        s = java_sym;
7220
      else if (expr->mask == BFD_ELF_VERSION_CXX_TYPE)
7221
        s = cxx_sym;
7222
      else
7223
        s = sym;
7224
      if (fnmatch (expr->pattern, s, 0) == 0)
7225
        break;
7226
    }
7227
 
7228
 out_ret:
7229
  if (cxx_sym != sym)
7230
    free ((char *) cxx_sym);
7231
  if (java_sym != sym)
7232
    free ((char *) java_sym);
7233
  return expr;
7234
}
7235
 
7236
/* Return NULL if the PATTERN argument is a glob pattern, otherwise,
7237
   return a pointer to the symbol name with any backslash quotes removed.  */
7238
 
7239
static const char *
7240
realsymbol (const char *pattern)
7241
{
7242
  const char *p;
7243
  bfd_boolean changed = FALSE, backslash = FALSE;
7244
  char *s, *symbol = (char *) xmalloc (strlen (pattern) + 1);
7245
 
7246
  for (p = pattern, s = symbol; *p != '\0'; ++p)
7247
    {
7248
      /* It is a glob pattern only if there is no preceding
7249
         backslash.  */
7250
      if (backslash)
7251
        {
7252
          /* Remove the preceding backslash.  */
7253
          *(s - 1) = *p;
7254
          backslash = FALSE;
7255
          changed = TRUE;
7256
        }
7257
      else
7258
        {
7259
          if (*p == '?' || *p == '*' || *p == '[')
7260
            {
7261
              free (symbol);
7262
              return NULL;
7263
            }
7264
 
7265
          *s++ = *p;
7266
          backslash = *p == '\\';
7267
        }
7268
    }
7269
 
7270
  if (changed)
7271
    {
7272
      *s = '\0';
7273
      return symbol;
7274
    }
7275
  else
7276
    {
7277
      free (symbol);
7278
      return pattern;
7279
    }
7280
}
7281
 
7282
/* This is called for each variable name or match expression.  NEW_NAME is
7283
   the name of the symbol to match, or, if LITERAL_P is FALSE, a glob
7284
   pattern to be matched against symbol names.  */
7285
 
7286
struct bfd_elf_version_expr *
7287
lang_new_vers_pattern (struct bfd_elf_version_expr *orig,
7288
                       const char *new_name,
7289
                       const char *lang,
7290
                       bfd_boolean literal_p)
7291
{
7292
  struct bfd_elf_version_expr *ret;
7293
 
7294
  ret = (struct bfd_elf_version_expr *) xmalloc (sizeof *ret);
7295
  ret->next = orig;
7296
  ret->symver = 0;
7297
  ret->script = 0;
7298
  ret->literal = TRUE;
7299
  ret->pattern = literal_p ? new_name : realsymbol (new_name);
7300
  if (ret->pattern == NULL)
7301
    {
7302
      ret->pattern = new_name;
7303
      ret->literal = FALSE;
7304
    }
7305
 
7306
  if (lang == NULL || strcasecmp (lang, "C") == 0)
7307
    ret->mask = BFD_ELF_VERSION_C_TYPE;
7308
  else if (strcasecmp (lang, "C++") == 0)
7309
    ret->mask = BFD_ELF_VERSION_CXX_TYPE;
7310
  else if (strcasecmp (lang, "Java") == 0)
7311
    ret->mask = BFD_ELF_VERSION_JAVA_TYPE;
7312
  else
7313
    {
7314
      einfo (_("%X%P: unknown language `%s' in version information\n"),
7315
             lang);
7316
      ret->mask = BFD_ELF_VERSION_C_TYPE;
7317
    }
7318
 
7319
  return ldemul_new_vers_pattern (ret);
7320
}
7321
 
7322
/* This is called for each set of variable names and match
7323
   expressions.  */
7324
 
7325
struct bfd_elf_version_tree *
7326
lang_new_vers_node (struct bfd_elf_version_expr *globals,
7327
                    struct bfd_elf_version_expr *locals)
7328
{
7329
  struct bfd_elf_version_tree *ret;
7330
 
7331
  ret = (struct bfd_elf_version_tree *) xcalloc (1, sizeof *ret);
7332
  ret->globals.list = globals;
7333
  ret->locals.list = locals;
7334
  ret->match = lang_vers_match;
7335
  ret->name_indx = (unsigned int) -1;
7336
  return ret;
7337
}
7338
 
7339
/* This static variable keeps track of version indices.  */
7340
 
7341
static int version_index;
7342
 
7343
static hashval_t
7344
version_expr_head_hash (const void *p)
7345
{
7346
  const struct bfd_elf_version_expr *e =
7347
      (const struct bfd_elf_version_expr *) p;
7348
 
7349
  return htab_hash_string (e->pattern);
7350
}
7351
 
7352
static int
7353
version_expr_head_eq (const void *p1, const void *p2)
7354
{
7355
  const struct bfd_elf_version_expr *e1 =
7356
      (const struct bfd_elf_version_expr *) p1;
7357
  const struct bfd_elf_version_expr *e2 =
7358
      (const struct bfd_elf_version_expr *) p2;
7359
 
7360
  return strcmp (e1->pattern, e2->pattern) == 0;
7361
}
7362
 
7363
static void
7364
lang_finalize_version_expr_head (struct bfd_elf_version_expr_head *head)
7365
{
7366
  size_t count = 0;
7367
  struct bfd_elf_version_expr *e, *next;
7368
  struct bfd_elf_version_expr **list_loc, **remaining_loc;
7369
 
7370
  for (e = head->list; e; e = e->next)
7371
    {
7372
      if (e->literal)
7373
        count++;
7374
      head->mask |= e->mask;
7375
    }
7376
 
7377
  if (count)
7378
    {
7379
      head->htab = htab_create (count * 2, version_expr_head_hash,
7380
                                version_expr_head_eq, NULL);
7381
      list_loc = &head->list;
7382
      remaining_loc = &head->remaining;
7383
      for (e = head->list; e; e = next)
7384
        {
7385
          next = e->next;
7386
          if (!e->literal)
7387
            {
7388
              *remaining_loc = e;
7389
              remaining_loc = &e->next;
7390
            }
7391
          else
7392
            {
7393
              void **loc = htab_find_slot ((htab_t) head->htab, e, INSERT);
7394
 
7395
              if (*loc)
7396
                {
7397
                  struct bfd_elf_version_expr *e1, *last;
7398
 
7399
                  e1 = (struct bfd_elf_version_expr *) *loc;
7400
                  last = NULL;
7401
                  do
7402
                    {
7403
                      if (e1->mask == e->mask)
7404
                        {
7405
                          last = NULL;
7406
                          break;
7407
                        }
7408
                      last = e1;
7409
                      e1 = e1->next;
7410
                    }
7411
                  while (e1 && strcmp (e1->pattern, e->pattern) == 0);
7412
 
7413
                  if (last == NULL)
7414
                    {
7415
                      /* This is a duplicate.  */
7416
                      /* FIXME: Memory leak.  Sometimes pattern is not
7417
                         xmalloced alone, but in larger chunk of memory.  */
7418
                      /* free (e->pattern); */
7419
                      free (e);
7420
                    }
7421
                  else
7422
                    {
7423
                      e->next = last->next;
7424
                      last->next = e;
7425
                    }
7426
                }
7427
              else
7428
                {
7429
                  *loc = e;
7430
                  *list_loc = e;
7431
                  list_loc = &e->next;
7432
                }
7433
            }
7434
        }
7435
      *remaining_loc = NULL;
7436
      *list_loc = head->remaining;
7437
    }
7438
  else
7439
    head->remaining = head->list;
7440
}
7441
 
7442
/* This is called when we know the name and dependencies of the
7443
   version.  */
7444
 
7445
void
7446
lang_register_vers_node (const char *name,
7447
                         struct bfd_elf_version_tree *version,
7448
                         struct bfd_elf_version_deps *deps)
7449
{
7450
  struct bfd_elf_version_tree *t, **pp;
7451
  struct bfd_elf_version_expr *e1;
7452
 
7453
  if (name == NULL)
7454
    name = "";
7455
 
7456
  if ((name[0] == '\0' && lang_elf_version_info != NULL)
7457
      || (lang_elf_version_info && lang_elf_version_info->name[0] == '\0'))
7458
    {
7459
      einfo (_("%X%P: anonymous version tag cannot be combined"
7460
               " with other version tags\n"));
7461
      free (version);
7462
      return;
7463
    }
7464
 
7465
  /* Make sure this node has a unique name.  */
7466
  for (t = lang_elf_version_info; t != NULL; t = t->next)
7467
    if (strcmp (t->name, name) == 0)
7468
      einfo (_("%X%P: duplicate version tag `%s'\n"), name);
7469
 
7470
  lang_finalize_version_expr_head (&version->globals);
7471
  lang_finalize_version_expr_head (&version->locals);
7472
 
7473
  /* Check the global and local match names, and make sure there
7474
     aren't any duplicates.  */
7475
 
7476
  for (e1 = version->globals.list; e1 != NULL; e1 = e1->next)
7477
    {
7478
      for (t = lang_elf_version_info; t != NULL; t = t->next)
7479
        {
7480
          struct bfd_elf_version_expr *e2;
7481
 
7482
          if (t->locals.htab && e1->literal)
7483
            {
7484
              e2 = (struct bfd_elf_version_expr *)
7485
                  htab_find ((htab_t) t->locals.htab, e1);
7486
              while (e2 && strcmp (e1->pattern, e2->pattern) == 0)
7487
                {
7488
                  if (e1->mask == e2->mask)
7489
                    einfo (_("%X%P: duplicate expression `%s'"
7490
                             " in version information\n"), e1->pattern);
7491
                  e2 = e2->next;
7492
                }
7493
            }
7494
          else if (!e1->literal)
7495
            for (e2 = t->locals.remaining; e2 != NULL; e2 = e2->next)
7496
              if (strcmp (e1->pattern, e2->pattern) == 0
7497
                  && e1->mask == e2->mask)
7498
                einfo (_("%X%P: duplicate expression `%s'"
7499
                         " in version information\n"), e1->pattern);
7500
        }
7501
    }
7502
 
7503
  for (e1 = version->locals.list; e1 != NULL; e1 = e1->next)
7504
    {
7505
      for (t = lang_elf_version_info; t != NULL; t = t->next)
7506
        {
7507
          struct bfd_elf_version_expr *e2;
7508
 
7509
          if (t->globals.htab && e1->literal)
7510
            {
7511
              e2 = (struct bfd_elf_version_expr *)
7512
                  htab_find ((htab_t) t->globals.htab, e1);
7513
              while (e2 && strcmp (e1->pattern, e2->pattern) == 0)
7514
                {
7515
                  if (e1->mask == e2->mask)
7516
                    einfo (_("%X%P: duplicate expression `%s'"
7517
                             " in version information\n"),
7518
                           e1->pattern);
7519
                  e2 = e2->next;
7520
                }
7521
            }
7522
          else if (!e1->literal)
7523
            for (e2 = t->globals.remaining; e2 != NULL; e2 = e2->next)
7524
              if (strcmp (e1->pattern, e2->pattern) == 0
7525
                  && e1->mask == e2->mask)
7526
                einfo (_("%X%P: duplicate expression `%s'"
7527
                         " in version information\n"), e1->pattern);
7528
        }
7529
    }
7530
 
7531
  version->deps = deps;
7532
  version->name = name;
7533
  if (name[0] != '\0')
7534
    {
7535
      ++version_index;
7536
      version->vernum = version_index;
7537
    }
7538
  else
7539
    version->vernum = 0;
7540
 
7541
  for (pp = &lang_elf_version_info; *pp != NULL; pp = &(*pp)->next)
7542
    ;
7543
  *pp = version;
7544
}
7545
 
7546
/* This is called when we see a version dependency.  */
7547
 
7548
struct bfd_elf_version_deps *
7549
lang_add_vers_depend (struct bfd_elf_version_deps *list, const char *name)
7550
{
7551
  struct bfd_elf_version_deps *ret;
7552
  struct bfd_elf_version_tree *t;
7553
 
7554
  ret = (struct bfd_elf_version_deps *) xmalloc (sizeof *ret);
7555
  ret->next = list;
7556
 
7557
  for (t = lang_elf_version_info; t != NULL; t = t->next)
7558
    {
7559
      if (strcmp (t->name, name) == 0)
7560
        {
7561
          ret->version_needed = t;
7562
          return ret;
7563
        }
7564
    }
7565
 
7566
  einfo (_("%X%P: unable to find version dependency `%s'\n"), name);
7567
 
7568
  return ret;
7569
}
7570
 
7571
static void
7572
lang_do_version_exports_section (void)
7573
{
7574
  struct bfd_elf_version_expr *greg = NULL, *lreg;
7575
 
7576
  LANG_FOR_EACH_INPUT_STATEMENT (is)
7577
    {
7578
      asection *sec = bfd_get_section_by_name (is->the_bfd, ".exports");
7579
      char *contents, *p;
7580
      bfd_size_type len;
7581
 
7582
      if (sec == NULL)
7583
        continue;
7584
 
7585
      len = sec->size;
7586
      contents = (char *) xmalloc (len);
7587
      if (!bfd_get_section_contents (is->the_bfd, sec, contents, 0, len))
7588
        einfo (_("%X%P: unable to read .exports section contents\n"), sec);
7589
 
7590
      p = contents;
7591
      while (p < contents + len)
7592
        {
7593
          greg = lang_new_vers_pattern (greg, p, NULL, FALSE);
7594
          p = strchr (p, '\0') + 1;
7595
        }
7596
 
7597
      /* Do not free the contents, as we used them creating the regex.  */
7598
 
7599
      /* Do not include this section in the link.  */
7600
      sec->flags |= SEC_EXCLUDE | SEC_KEEP;
7601
    }
7602
 
7603
  lreg = lang_new_vers_pattern (NULL, "*", NULL, FALSE);
7604
  lang_register_vers_node (command_line.version_exports_section,
7605
                           lang_new_vers_node (greg, lreg), NULL);
7606
}
7607
 
7608
void
7609
lang_add_unique (const char *name)
7610
{
7611
  struct unique_sections *ent;
7612
 
7613
  for (ent = unique_section_list; ent; ent = ent->next)
7614
    if (strcmp (ent->name, name) == 0)
7615
      return;
7616
 
7617
  ent = (struct unique_sections *) xmalloc (sizeof *ent);
7618
  ent->name = xstrdup (name);
7619
  ent->next = unique_section_list;
7620
  unique_section_list = ent;
7621
}
7622
 
7623
/* Append the list of dynamic symbols to the existing one.  */
7624
 
7625
void
7626
lang_append_dynamic_list (struct bfd_elf_version_expr *dynamic)
7627
{
7628
  if (link_info.dynamic_list)
7629
    {
7630
      struct bfd_elf_version_expr *tail;
7631
      for (tail = dynamic; tail->next != NULL; tail = tail->next)
7632
        ;
7633
      tail->next = link_info.dynamic_list->head.list;
7634
      link_info.dynamic_list->head.list = dynamic;
7635
    }
7636
  else
7637
    {
7638
      struct bfd_elf_dynamic_list *d;
7639
 
7640
      d = (struct bfd_elf_dynamic_list *) xcalloc (1, sizeof *d);
7641
      d->head.list = dynamic;
7642
      d->match = lang_vers_match;
7643
      link_info.dynamic_list = d;
7644
    }
7645
}
7646
 
7647
/* Append the list of C++ typeinfo dynamic symbols to the existing
7648
   one.  */
7649
 
7650
void
7651
lang_append_dynamic_list_cpp_typeinfo (void)
7652
{
7653
  const char * symbols [] =
7654
    {
7655
      "typeinfo name for*",
7656
      "typeinfo for*"
7657
    };
7658
  struct bfd_elf_version_expr *dynamic = NULL;
7659
  unsigned int i;
7660
 
7661
  for (i = 0; i < ARRAY_SIZE (symbols); i++)
7662
    dynamic = lang_new_vers_pattern (dynamic, symbols [i], "C++",
7663
                                     FALSE);
7664
 
7665
  lang_append_dynamic_list (dynamic);
7666
}
7667
 
7668
/* Append the list of C++ operator new and delete dynamic symbols to the
7669
   existing one.  */
7670
 
7671
void
7672
lang_append_dynamic_list_cpp_new (void)
7673
{
7674
  const char * symbols [] =
7675
    {
7676
      "operator new*",
7677
      "operator delete*"
7678
    };
7679
  struct bfd_elf_version_expr *dynamic = NULL;
7680
  unsigned int i;
7681
 
7682
  for (i = 0; i < ARRAY_SIZE (symbols); i++)
7683
    dynamic = lang_new_vers_pattern (dynamic, symbols [i], "C++",
7684
                                     FALSE);
7685
 
7686
  lang_append_dynamic_list (dynamic);
7687
}

powered by: WebSVN 2.1.0

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