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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [gold/] [script.cc] - Blame information for rev 263

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

Line No. Rev Author Line
1 27 khays
// script.cc -- handle linker scripts for gold.
2
 
3 159 khays
// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4 27 khays
// Written by Ian Lance Taylor <iant@google.com>.
5
 
6
// This file is part of gold.
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 "gold.h"
24
 
25
#include <cstdio>
26
#include <cstdlib>
27
#include <cstring>
28
#include <fnmatch.h>
29
#include <string>
30
#include <vector>
31
#include "filenames.h"
32
 
33
#include "elfcpp.h"
34
#include "demangle.h"
35
#include "dirsearch.h"
36
#include "options.h"
37
#include "fileread.h"
38
#include "workqueue.h"
39
#include "readsyms.h"
40
#include "parameters.h"
41
#include "layout.h"
42
#include "symtab.h"
43
#include "target-select.h"
44
#include "script.h"
45
#include "script-c.h"
46
#include "incremental.h"
47
 
48
namespace gold
49
{
50
 
51
// A token read from a script file.  We don't implement keywords here;
52
// all keywords are simply represented as a string.
53
 
54
class Token
55
{
56
 public:
57
  // Token classification.
58
  enum Classification
59
  {
60
    // Token is invalid.
61
    TOKEN_INVALID,
62
    // Token indicates end of input.
63
    TOKEN_EOF,
64
    // Token is a string of characters.
65
    TOKEN_STRING,
66
    // Token is a quoted string of characters.
67
    TOKEN_QUOTED_STRING,
68
    // Token is an operator.
69
    TOKEN_OPERATOR,
70
    // Token is a number (an integer).
71
    TOKEN_INTEGER
72
  };
73
 
74
  // We need an empty constructor so that we can put this STL objects.
75
  Token()
76
    : classification_(TOKEN_INVALID), value_(NULL), value_length_(0),
77
      opcode_(0), lineno_(0), charpos_(0)
78
  { }
79
 
80
  // A general token with no value.
81
  Token(Classification classification, int lineno, int charpos)
82
    : classification_(classification), value_(NULL), value_length_(0),
83
      opcode_(0), lineno_(lineno), charpos_(charpos)
84
  {
85
    gold_assert(classification == TOKEN_INVALID
86
                || classification == TOKEN_EOF);
87
  }
88
 
89
  // A general token with a value.
90
  Token(Classification classification, const char* value, size_t length,
91
        int lineno, int charpos)
92
    : classification_(classification), value_(value), value_length_(length),
93
      opcode_(0), lineno_(lineno), charpos_(charpos)
94
  {
95
    gold_assert(classification != TOKEN_INVALID
96
                && classification != TOKEN_EOF);
97
  }
98
 
99
  // A token representing an operator.
100
  Token(int opcode, int lineno, int charpos)
101
    : classification_(TOKEN_OPERATOR), value_(NULL), value_length_(0),
102
      opcode_(opcode), lineno_(lineno), charpos_(charpos)
103
  { }
104
 
105
  // Return whether the token is invalid.
106
  bool
107
  is_invalid() const
108
  { return this->classification_ == TOKEN_INVALID; }
109
 
110
  // Return whether this is an EOF token.
111
  bool
112
  is_eof() const
113
  { return this->classification_ == TOKEN_EOF; }
114
 
115
  // Return the token classification.
116
  Classification
117
  classification() const
118
  { return this->classification_; }
119
 
120
  // Return the line number at which the token starts.
121
  int
122
  lineno() const
123
  { return this->lineno_; }
124
 
125
  // Return the character position at this the token starts.
126
  int
127
  charpos() const
128
  { return this->charpos_; }
129
 
130
  // Get the value of a token.
131
 
132
  const char*
133
  string_value(size_t* length) const
134
  {
135
    gold_assert(this->classification_ == TOKEN_STRING
136
                || this->classification_ == TOKEN_QUOTED_STRING);
137
    *length = this->value_length_;
138
    return this->value_;
139
  }
140
 
141
  int
142
  operator_value() const
143
  {
144
    gold_assert(this->classification_ == TOKEN_OPERATOR);
145
    return this->opcode_;
146
  }
147
 
148
  uint64_t
149 159 khays
  integer_value() const;
150 27 khays
 
151
 private:
152
  // The token classification.
153
  Classification classification_;
154
  // The token value, for TOKEN_STRING or TOKEN_QUOTED_STRING or
155
  // TOKEN_INTEGER.
156
  const char* value_;
157
  // The length of the token value.
158
  size_t value_length_;
159
  // The token value, for TOKEN_OPERATOR.
160
  int opcode_;
161
  // The line number where this token started (one based).
162
  int lineno_;
163
  // The character position within the line where this token started
164
  // (one based).
165
  int charpos_;
166
};
167
 
168 159 khays
// Return the value of a TOKEN_INTEGER.
169
 
170
uint64_t
171
Token::integer_value() const
172
{
173
  gold_assert(this->classification_ == TOKEN_INTEGER);
174
 
175
  size_t len = this->value_length_;
176
 
177
  uint64_t multiplier = 1;
178
  char last = this->value_[len - 1];
179
  if (last == 'm' || last == 'M')
180
    {
181
      multiplier = 1024 * 1024;
182
      --len;
183
    }
184
  else if (last == 'k' || last == 'K')
185
    {
186
      multiplier = 1024;
187
      --len;
188
    }
189
 
190
  char *end;
191
  uint64_t ret = strtoull(this->value_, &end, 0);
192
  gold_assert(static_cast<size_t>(end - this->value_) == len);
193
 
194
  return ret * multiplier;
195
}
196
 
197 27 khays
// This class handles lexing a file into a sequence of tokens.
198
 
199
class Lex
200
{
201
 public:
202
  // We unfortunately have to support different lexing modes, because
203
  // when reading different parts of a linker script we need to parse
204
  // things differently.
205
  enum Mode
206
  {
207
    // Reading an ordinary linker script.
208
    LINKER_SCRIPT,
209
    // Reading an expression in a linker script.
210
    EXPRESSION,
211
    // Reading a version script.
212
    VERSION_SCRIPT,
213
    // Reading a --dynamic-list file.
214
    DYNAMIC_LIST
215
  };
216
 
217
  Lex(const char* input_string, size_t input_length, int parsing_token)
218
    : input_string_(input_string), input_length_(input_length),
219
      current_(input_string), mode_(LINKER_SCRIPT),
220
      first_token_(parsing_token), token_(),
221
      lineno_(1), linestart_(input_string)
222
  { }
223
 
224
  // Read a file into a string.
225
  static void
226
  read_file(Input_file*, std::string*);
227
 
228
  // Return the next token.
229
  const Token*
230
  next_token();
231
 
232
  // Return the current lexing mode.
233
  Lex::Mode
234
  mode() const
235
  { return this->mode_; }
236
 
237
  // Set the lexing mode.
238
  void
239
  set_mode(Mode mode)
240
  { this->mode_ = mode; }
241
 
242
 private:
243
  Lex(const Lex&);
244
  Lex& operator=(const Lex&);
245
 
246
  // Make a general token with no value at the current location.
247
  Token
248
  make_token(Token::Classification c, const char* start) const
249
  { return Token(c, this->lineno_, start - this->linestart_ + 1); }
250
 
251
  // Make a general token with a value at the current location.
252
  Token
253
  make_token(Token::Classification c, const char* v, size_t len,
254
             const char* start)
255
    const
256
  { return Token(c, v, len, this->lineno_, start - this->linestart_ + 1); }
257
 
258
  // Make an operator token at the current location.
259
  Token
260
  make_token(int opcode, const char* start) const
261
  { return Token(opcode, this->lineno_, start - this->linestart_ + 1); }
262
 
263
  // Make an invalid token at the current location.
264
  Token
265
  make_invalid_token(const char* start)
266
  { return this->make_token(Token::TOKEN_INVALID, start); }
267
 
268
  // Make an EOF token at the current location.
269
  Token
270
  make_eof_token(const char* start)
271
  { return this->make_token(Token::TOKEN_EOF, start); }
272
 
273
  // Return whether C can be the first character in a name.  C2 is the
274
  // next character, since we sometimes need that.
275
  inline bool
276
  can_start_name(char c, char c2);
277
 
278
  // If C can appear in a name which has already started, return a
279
  // pointer to a character later in the token or just past
280
  // it. Otherwise, return NULL.
281
  inline const char*
282
  can_continue_name(const char* c);
283
 
284
  // Return whether C, C2, C3 can start a hex number.
285
  inline bool
286
  can_start_hex(char c, char c2, char c3);
287
 
288
  // If C can appear in a hex number which has already started, return
289
  // a pointer to a character later in the token or just past
290
  // it. Otherwise, return NULL.
291
  inline const char*
292
  can_continue_hex(const char* c);
293
 
294
  // Return whether C can start a non-hex number.
295
  static inline bool
296
  can_start_number(char c);
297
 
298
  // If C can appear in a decimal number which has already started,
299
  // return a pointer to a character later in the token or just past
300
  // it. Otherwise, return NULL.
301
  inline const char*
302
  can_continue_number(const char* c)
303
  { return Lex::can_start_number(*c) ? c + 1 : NULL; }
304
 
305
  // If C1 C2 C3 form a valid three character operator, return the
306
  // opcode.  Otherwise return 0.
307
  static inline int
308
  three_char_operator(char c1, char c2, char c3);
309
 
310
  // If C1 C2 form a valid two character operator, return the opcode.
311
  // Otherwise return 0.
312
  static inline int
313
  two_char_operator(char c1, char c2);
314
 
315
  // If C1 is a valid one character operator, return the opcode.
316
  // Otherwise return 0.
317
  static inline int
318
  one_char_operator(char c1);
319
 
320
  // Read the next token.
321
  Token
322
  get_token(const char**);
323
 
324
  // Skip a C style /* */ comment.  Return false if the comment did
325
  // not end.
326
  bool
327
  skip_c_comment(const char**);
328
 
329
  // Skip a line # comment.  Return false if there was no newline.
330
  bool
331
  skip_line_comment(const char**);
332
 
333
  // Build a token CLASSIFICATION from all characters that match
334
  // CAN_CONTINUE_FN.  The token starts at START.  Start matching from
335
  // MATCH.  Set *PP to the character following the token.
336
  inline Token
337
  gather_token(Token::Classification,
338
               const char* (Lex::*can_continue_fn)(const char*),
339
               const char* start, const char* match, const char** pp);
340
 
341
  // Build a token from a quoted string.
342
  Token
343
  gather_quoted_string(const char** pp);
344
 
345
  // The string we are tokenizing.
346
  const char* input_string_;
347
  // The length of the string.
348
  size_t input_length_;
349
  // The current offset into the string.
350
  const char* current_;
351
  // The current lexing mode.
352
  Mode mode_;
353
  // The code to use for the first token.  This is set to 0 after it
354
  // is used.
355
  int first_token_;
356
  // The current token.
357
  Token token_;
358
  // The current line number.
359
  int lineno_;
360
  // The start of the current line in the string.
361
  const char* linestart_;
362
};
363
 
364
// Read the whole file into memory.  We don't expect linker scripts to
365
// be large, so we just use a std::string as a buffer.  We ignore the
366
// data we've already read, so that we read aligned buffers.
367
 
368
void
369
Lex::read_file(Input_file* input_file, std::string* contents)
370
{
371
  off_t filesize = input_file->file().filesize();
372
  contents->clear();
373
  contents->reserve(filesize);
374
 
375
  off_t off = 0;
376
  unsigned char buf[BUFSIZ];
377
  while (off < filesize)
378
    {
379
      off_t get = BUFSIZ;
380
      if (get > filesize - off)
381
        get = filesize - off;
382
      input_file->file().read(off, get, buf);
383
      contents->append(reinterpret_cast<char*>(&buf[0]), get);
384
      off += get;
385
    }
386
}
387
 
388
// Return whether C can be the start of a name, if the next character
389
// is C2.  A name can being with a letter, underscore, period, or
390
// dollar sign.  Because a name can be a file name, we also permit
391
// forward slash, backslash, and tilde.  Tilde is the tricky case
392
// here; GNU ld also uses it as a bitwise not operator.  It is only
393
// recognized as the operator if it is not immediately followed by
394
// some character which can appear in a symbol.  That is, when we
395
// don't know that we are looking at an expression, "~0" is a file
396
// name, and "~ 0" is an expression using bitwise not.  We are
397
// compatible.
398
 
399
inline bool
400
Lex::can_start_name(char c, char c2)
401
{
402
  switch (c)
403
    {
404
    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
405
    case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
406
    case 'M': case 'N': case 'O': case 'Q': case 'P': case 'R':
407
    case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
408
    case 'Y': case 'Z':
409
    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
410
    case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
411
    case 'm': case 'n': case 'o': case 'q': case 'p': case 'r':
412
    case 's': case 't': case 'u': case 'v': case 'w': case 'x':
413
    case 'y': case 'z':
414
    case '_': case '.': case '$':
415
      return true;
416
 
417
    case '/': case '\\':
418
      return this->mode_ == LINKER_SCRIPT;
419
 
420
    case '~':
421
      return this->mode_ == LINKER_SCRIPT && can_continue_name(&c2);
422
 
423
    case '*': case '[':
424
      return (this->mode_ == VERSION_SCRIPT
425
              || this->mode_ == DYNAMIC_LIST
426
              || (this->mode_ == LINKER_SCRIPT
427
                  && can_continue_name(&c2)));
428
 
429
    default:
430
      return false;
431
    }
432
}
433
 
434
// Return whether C can continue a name which has already started.
435
// Subsequent characters in a name are the same as the leading
436
// characters, plus digits and "=+-:[],?*".  So in general the linker
437
// script language requires spaces around operators, unless we know
438
// that we are parsing an expression.
439
 
440
inline const char*
441
Lex::can_continue_name(const char* c)
442
{
443
  switch (*c)
444
    {
445
    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
446
    case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
447
    case 'M': case 'N': case 'O': case 'Q': case 'P': case 'R':
448
    case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
449
    case 'Y': case 'Z':
450
    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
451
    case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
452
    case 'm': case 'n': case 'o': case 'q': case 'p': case 'r':
453
    case 's': case 't': case 'u': case 'v': case 'w': case 'x':
454
    case 'y': case 'z':
455
    case '_': case '.': case '$':
456
    case '0': case '1': case '2': case '3': case '4':
457
    case '5': case '6': case '7': case '8': case '9':
458
      return c + 1;
459
 
460
    // TODO(csilvers): why not allow ~ in names for version-scripts?
461
    case '/': case '\\': case '~':
462
    case '=': case '+':
463
    case ',':
464
      if (this->mode_ == LINKER_SCRIPT)
465
        return c + 1;
466
      return NULL;
467
 
468
    case '[': case ']': case '*': case '?': case '-':
469
      if (this->mode_ == LINKER_SCRIPT || this->mode_ == VERSION_SCRIPT
470
          || this->mode_ == DYNAMIC_LIST)
471
        return c + 1;
472
      return NULL;
473
 
474
    // TODO(csilvers): why allow this?  ^ is meaningless in version scripts.
475
    case '^':
476
      if (this->mode_ == VERSION_SCRIPT || this->mode_ == DYNAMIC_LIST)
477
        return c + 1;
478
      return NULL;
479
 
480
    case ':':
481
      if (this->mode_ == LINKER_SCRIPT)
482
        return c + 1;
483
      else if ((this->mode_ == VERSION_SCRIPT || this->mode_ == DYNAMIC_LIST)
484
               && (c[1] == ':'))
485
        {
486
          // A name can have '::' in it, as that's a c++ namespace
487
          // separator. But a single colon is not part of a name.
488
          return c + 2;
489
        }
490
      return NULL;
491
 
492
    default:
493
      return NULL;
494
    }
495
}
496
 
497
// For a number we accept 0x followed by hex digits, or any sequence
498
// of digits.  The old linker accepts leading '$' for hex, and
499
// trailing HXBOD.  Those are for MRI compatibility and we don't
500 159 khays
// accept them.
501 27 khays
 
502
// Return whether C1 C2 C3 can start a hex number.
503
 
504
inline bool
505
Lex::can_start_hex(char c1, char c2, char c3)
506
{
507
  if (c1 == '0' && (c2 == 'x' || c2 == 'X'))
508
    return this->can_continue_hex(&c3);
509
  return false;
510
}
511
 
512
// Return whether C can appear in a hex number.
513
 
514
inline const char*
515
Lex::can_continue_hex(const char* c)
516
{
517
  switch (*c)
518
    {
519
    case '0': case '1': case '2': case '3': case '4':
520
    case '5': case '6': case '7': case '8': case '9':
521
    case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
522
    case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
523
      return c + 1;
524
 
525
    default:
526
      return NULL;
527
    }
528
}
529
 
530
// Return whether C can start a non-hex number.
531
 
532
inline bool
533
Lex::can_start_number(char c)
534
{
535
  switch (c)
536
    {
537
    case '0': case '1': case '2': case '3': case '4':
538
    case '5': case '6': case '7': case '8': case '9':
539
      return true;
540
 
541
    default:
542
      return false;
543
    }
544
}
545
 
546
// If C1 C2 C3 form a valid three character operator, return the
547
// opcode (defined in the yyscript.h file generated from yyscript.y).
548
// Otherwise return 0.
549
 
550
inline int
551
Lex::three_char_operator(char c1, char c2, char c3)
552
{
553
  switch (c1)
554
    {
555
    case '<':
556
      if (c2 == '<' && c3 == '=')
557
        return LSHIFTEQ;
558
      break;
559
    case '>':
560
      if (c2 == '>' && c3 == '=')
561
        return RSHIFTEQ;
562
      break;
563
    default:
564
      break;
565
    }
566
  return 0;
567
}
568
 
569
// If C1 C2 form a valid two character operator, return the opcode
570
// (defined in the yyscript.h file generated from yyscript.y).
571
// Otherwise return 0.
572
 
573
inline int
574
Lex::two_char_operator(char c1, char c2)
575
{
576
  switch (c1)
577
    {
578
    case '=':
579
      if (c2 == '=')
580
        return EQ;
581
      break;
582
    case '!':
583
      if (c2 == '=')
584
        return NE;
585
      break;
586
    case '+':
587
      if (c2 == '=')
588
        return PLUSEQ;
589
      break;
590
    case '-':
591
      if (c2 == '=')
592
        return MINUSEQ;
593
      break;
594
    case '*':
595
      if (c2 == '=')
596
        return MULTEQ;
597
      break;
598
    case '/':
599
      if (c2 == '=')
600
        return DIVEQ;
601
      break;
602
    case '|':
603
      if (c2 == '=')
604
        return OREQ;
605
      if (c2 == '|')
606
        return OROR;
607
      break;
608
    case '&':
609
      if (c2 == '=')
610
        return ANDEQ;
611
      if (c2 == '&')
612
        return ANDAND;
613
      break;
614
    case '>':
615
      if (c2 == '=')
616
        return GE;
617
      if (c2 == '>')
618
        return RSHIFT;
619
      break;
620
    case '<':
621
      if (c2 == '=')
622
        return LE;
623
      if (c2 == '<')
624
        return LSHIFT;
625
      break;
626
    default:
627
      break;
628
    }
629
  return 0;
630
}
631
 
632
// If C1 is a valid operator, return the opcode.  Otherwise return 0.
633
 
634
inline int
635
Lex::one_char_operator(char c1)
636
{
637
  switch (c1)
638
    {
639
    case '+':
640
    case '-':
641
    case '*':
642
    case '/':
643
    case '%':
644
    case '!':
645
    case '&':
646
    case '|':
647
    case '^':
648
    case '~':
649
    case '<':
650
    case '>':
651
    case '=':
652
    case '?':
653
    case ',':
654
    case '(':
655
    case ')':
656
    case '{':
657
    case '}':
658
    case '[':
659
    case ']':
660
    case ':':
661
    case ';':
662
      return c1;
663
    default:
664
      return 0;
665
    }
666
}
667
 
668
// Skip a C style comment.  *PP points to just after the "/*".  Return
669
// false if the comment did not end.
670
 
671
bool
672
Lex::skip_c_comment(const char** pp)
673
{
674
  const char* p = *pp;
675
  while (p[0] != '*' || p[1] != '/')
676
    {
677
      if (*p == '\0')
678
        {
679
          *pp = p;
680
          return false;
681
        }
682
 
683
      if (*p == '\n')
684
        {
685
          ++this->lineno_;
686
          this->linestart_ = p + 1;
687
        }
688
      ++p;
689
    }
690
 
691
  *pp = p + 2;
692
  return true;
693
}
694
 
695
// Skip a line # comment.  Return false if there was no newline.
696
 
697
bool
698
Lex::skip_line_comment(const char** pp)
699
{
700
  const char* p = *pp;
701
  size_t skip = strcspn(p, "\n");
702
  if (p[skip] == '\0')
703
    {
704
      *pp = p + skip;
705
      return false;
706
    }
707
 
708
  p += skip + 1;
709
  ++this->lineno_;
710
  this->linestart_ = p;
711
  *pp = p;
712
 
713
  return true;
714
}
715
 
716
// Build a token CLASSIFICATION from all characters that match
717
// CAN_CONTINUE_FN.  Update *PP.
718
 
719
inline Token
720
Lex::gather_token(Token::Classification classification,
721
                  const char* (Lex::*can_continue_fn)(const char*),
722
                  const char* start,
723
                  const char* match,
724
                  const char** pp)
725
{
726
  const char* new_match = NULL;
727 159 khays
  while ((new_match = (this->*can_continue_fn)(match)) != NULL)
728 27 khays
    match = new_match;
729 159 khays
 
730
  // A special case: integers may be followed by a single M or K,
731
  // case-insensitive.
732
  if (classification == Token::TOKEN_INTEGER
733
      && (*match == 'm' || *match == 'M' || *match == 'k' || *match == 'K'))
734
    ++match;
735
 
736 27 khays
  *pp = match;
737
  return this->make_token(classification, start, match - start, start);
738
}
739
 
740
// Build a token from a quoted string.
741
 
742
Token
743
Lex::gather_quoted_string(const char** pp)
744
{
745
  const char* start = *pp;
746
  const char* p = start;
747
  ++p;
748
  size_t skip = strcspn(p, "\"\n");
749
  if (p[skip] != '"')
750
    return this->make_invalid_token(start);
751
  *pp = p + skip + 1;
752
  return this->make_token(Token::TOKEN_QUOTED_STRING, p, skip, start);
753
}
754
 
755
// Return the next token at *PP.  Update *PP.  General guideline: we
756
// require linker scripts to be simple ASCII.  No unicode linker
757
// scripts.  In particular we can assume that any '\0' is the end of
758
// the input.
759
 
760
Token
761
Lex::get_token(const char** pp)
762
{
763
  const char* p = *pp;
764
 
765
  while (true)
766
    {
767
      if (*p == '\0')
768
        {
769
          *pp = p;
770
          return this->make_eof_token(p);
771
        }
772
 
773
      // Skip whitespace quickly.
774
      while (*p == ' ' || *p == '\t' || *p == '\r')
775
        ++p;
776
 
777
      if (*p == '\n')
778
        {
779
          ++p;
780
          ++this->lineno_;
781
          this->linestart_ = p;
782
          continue;
783
        }
784
 
785
      // Skip C style comments.
786
      if (p[0] == '/' && p[1] == '*')
787
        {
788
          int lineno = this->lineno_;
789
          int charpos = p - this->linestart_ + 1;
790
 
791
          *pp = p + 2;
792
          if (!this->skip_c_comment(pp))
793
            return Token(Token::TOKEN_INVALID, lineno, charpos);
794
          p = *pp;
795
 
796
          continue;
797
        }
798
 
799
      // Skip line comments.
800
      if (*p == '#')
801
        {
802
          *pp = p + 1;
803
          if (!this->skip_line_comment(pp))
804
            return this->make_eof_token(p);
805
          p = *pp;
806
          continue;
807
        }
808
 
809
      // Check for a name.
810
      if (this->can_start_name(p[0], p[1]))
811
        return this->gather_token(Token::TOKEN_STRING,
812
                                  &Lex::can_continue_name,
813
                                  p, p + 1, pp);
814
 
815
      // We accept any arbitrary name in double quotes, as long as it
816
      // does not cross a line boundary.
817
      if (*p == '"')
818
        {
819
          *pp = p;
820
          return this->gather_quoted_string(pp);
821
        }
822
 
823
      // Check for a number.
824
 
825
      if (this->can_start_hex(p[0], p[1], p[2]))
826
        return this->gather_token(Token::TOKEN_INTEGER,
827
                                  &Lex::can_continue_hex,
828
                                  p, p + 3, pp);
829
 
830
      if (Lex::can_start_number(p[0]))
831
        return this->gather_token(Token::TOKEN_INTEGER,
832
                                  &Lex::can_continue_number,
833
                                  p, p + 1, pp);
834
 
835
      // Check for operators.
836
 
837
      int opcode = Lex::three_char_operator(p[0], p[1], p[2]);
838
      if (opcode != 0)
839
        {
840
          *pp = p + 3;
841
          return this->make_token(opcode, p);
842
        }
843
 
844
      opcode = Lex::two_char_operator(p[0], p[1]);
845
      if (opcode != 0)
846
        {
847
          *pp = p + 2;
848
          return this->make_token(opcode, p);
849
        }
850
 
851
      opcode = Lex::one_char_operator(p[0]);
852
      if (opcode != 0)
853
        {
854
          *pp = p + 1;
855
          return this->make_token(opcode, p);
856
        }
857
 
858
      return this->make_token(Token::TOKEN_INVALID, p);
859
    }
860
}
861
 
862
// Return the next token.
863
 
864
const Token*
865
Lex::next_token()
866
{
867
  // The first token is special.
868
  if (this->first_token_ != 0)
869
    {
870
      this->token_ = Token(this->first_token_, 0, 0);
871
      this->first_token_ = 0;
872
      return &this->token_;
873
    }
874
 
875
  this->token_ = this->get_token(&this->current_);
876
 
877
  // Don't let an early null byte fool us into thinking that we've
878
  // reached the end of the file.
879
  if (this->token_.is_eof()
880
      && (static_cast<size_t>(this->current_ - this->input_string_)
881
          < this->input_length_))
882
    this->token_ = this->make_invalid_token(this->current_);
883
 
884
  return &this->token_;
885
}
886
 
887
// class Symbol_assignment.
888
 
889
// Add the symbol to the symbol table.  This makes sure the symbol is
890
// there and defined.  The actual value is stored later.  We can't
891
// determine the actual value at this point, because we can't
892
// necessarily evaluate the expression until all ordinary symbols have
893
// been finalized.
894
 
895
// The GNU linker lets symbol assignments in the linker script
896
// silently override defined symbols in object files.  We are
897
// compatible.  FIXME: Should we issue a warning?
898
 
899
void
900
Symbol_assignment::add_to_table(Symbol_table* symtab)
901
{
902
  elfcpp::STV vis = this->hidden_ ? elfcpp::STV_HIDDEN : elfcpp::STV_DEFAULT;
903
  this->sym_ = symtab->define_as_constant(this->name_.c_str(),
904
                                          NULL, // version
905
                                          (this->is_defsym_
906
                                           ? Symbol_table::DEFSYM
907
                                           : Symbol_table::SCRIPT),
908
                                          0, // value
909
                                          0, // size
910
                                          elfcpp::STT_NOTYPE,
911
                                          elfcpp::STB_GLOBAL,
912
                                          vis,
913
                                          0, // nonvis
914
                                          this->provide_,
915
                                          true); // force_override
916
}
917
 
918
// Finalize a symbol value.
919
 
920
void
921
Symbol_assignment::finalize(Symbol_table* symtab, const Layout* layout)
922
{
923
  this->finalize_maybe_dot(symtab, layout, false, 0, NULL);
924
}
925
 
926
// Finalize a symbol value which can refer to the dot symbol.
927
 
928
void
929
Symbol_assignment::finalize_with_dot(Symbol_table* symtab,
930
                                     const Layout* layout,
931
                                     uint64_t dot_value,
932
                                     Output_section* dot_section)
933
{
934
  this->finalize_maybe_dot(symtab, layout, true, dot_value, dot_section);
935
}
936
 
937
// Finalize a symbol value, internal version.
938
 
939
void
940
Symbol_assignment::finalize_maybe_dot(Symbol_table* symtab,
941
                                      const Layout* layout,
942
                                      bool is_dot_available,
943
                                      uint64_t dot_value,
944
                                      Output_section* dot_section)
945
{
946
  // If we were only supposed to provide this symbol, the sym_ field
947
  // will be NULL if the symbol was not referenced.
948
  if (this->sym_ == NULL)
949
    {
950
      gold_assert(this->provide_);
951
      return;
952
    }
953
 
954
  if (parameters->target().get_size() == 32)
955
    {
956
#if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
957
      this->sized_finalize<32>(symtab, layout, is_dot_available, dot_value,
958
                               dot_section);
959
#else
960
      gold_unreachable();
961
#endif
962
    }
963
  else if (parameters->target().get_size() == 64)
964
    {
965
#if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
966
      this->sized_finalize<64>(symtab, layout, is_dot_available, dot_value,
967
                               dot_section);
968
#else
969
      gold_unreachable();
970
#endif
971
    }
972
  else
973
    gold_unreachable();
974
}
975
 
976
template<int size>
977
void
978
Symbol_assignment::sized_finalize(Symbol_table* symtab, const Layout* layout,
979
                                  bool is_dot_available, uint64_t dot_value,
980
                                  Output_section* dot_section)
981
{
982
  Output_section* section;
983
  uint64_t final_val = this->val_->eval_maybe_dot(symtab, layout, true,
984
                                                  is_dot_available,
985
                                                  dot_value, dot_section,
986 163 khays
                                                  &section, NULL, false);
987 27 khays
  Sized_symbol<size>* ssym = symtab->get_sized_symbol<size>(this->sym_);
988
  ssym->set_value(final_val);
989
  if (section != NULL)
990
    ssym->set_output_section(section);
991
}
992
 
993 163 khays
// Set the symbol value if the expression yields an absolute value or
994
// a value relative to DOT_SECTION.
995 27 khays
 
996
void
997
Symbol_assignment::set_if_absolute(Symbol_table* symtab, const Layout* layout,
998 163 khays
                                   bool is_dot_available, uint64_t dot_value,
999
                                   Output_section* dot_section)
1000 27 khays
{
1001
  if (this->sym_ == NULL)
1002
    return;
1003
 
1004
  Output_section* val_section;
1005
  uint64_t val = this->val_->eval_maybe_dot(symtab, layout, false,
1006
                                            is_dot_available, dot_value,
1007 163 khays
                                            dot_section, &val_section, NULL,
1008
                                            false);
1009
  if (val_section != NULL && val_section != dot_section)
1010 27 khays
    return;
1011
 
1012
  if (parameters->target().get_size() == 32)
1013
    {
1014
#if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_32_BIG)
1015
      Sized_symbol<32>* ssym = symtab->get_sized_symbol<32>(this->sym_);
1016
      ssym->set_value(val);
1017
#else
1018
      gold_unreachable();
1019
#endif
1020
    }
1021
  else if (parameters->target().get_size() == 64)
1022
    {
1023
#if defined(HAVE_TARGET_64_LITTLE) || defined(HAVE_TARGET_64_BIG)
1024
      Sized_symbol<64>* ssym = symtab->get_sized_symbol<64>(this->sym_);
1025
      ssym->set_value(val);
1026
#else
1027
      gold_unreachable();
1028
#endif
1029
    }
1030
  else
1031
    gold_unreachable();
1032 163 khays
  if (val_section != NULL)
1033
    this->sym_->set_output_section(val_section);
1034 27 khays
}
1035
 
1036
// Print for debugging.
1037
 
1038
void
1039
Symbol_assignment::print(FILE* f) const
1040
{
1041
  if (this->provide_ && this->hidden_)
1042
    fprintf(f, "PROVIDE_HIDDEN(");
1043
  else if (this->provide_)
1044
    fprintf(f, "PROVIDE(");
1045
  else if (this->hidden_)
1046
    gold_unreachable();
1047
 
1048
  fprintf(f, "%s = ", this->name_.c_str());
1049
  this->val_->print(f);
1050
 
1051
  if (this->provide_ || this->hidden_)
1052
    fprintf(f, ")");
1053
 
1054
  fprintf(f, "\n");
1055
}
1056
 
1057
// Class Script_assertion.
1058
 
1059
// Check the assertion.
1060
 
1061
void
1062
Script_assertion::check(const Symbol_table* symtab, const Layout* layout)
1063
{
1064
  if (!this->check_->eval(symtab, layout, true))
1065
    gold_error("%s", this->message_.c_str());
1066
}
1067
 
1068
// Print for debugging.
1069
 
1070
void
1071
Script_assertion::print(FILE* f) const
1072
{
1073
  fprintf(f, "ASSERT(");
1074
  this->check_->print(f);
1075
  fprintf(f, ", \"%s\")\n", this->message_.c_str());
1076
}
1077
 
1078
// Class Script_options.
1079
 
1080
Script_options::Script_options()
1081
  : entry_(), symbol_assignments_(), symbol_definitions_(),
1082
    symbol_references_(), version_script_info_(), script_sections_()
1083
{
1084
}
1085
 
1086
// Returns true if NAME is on the list of symbol assignments waiting
1087
// to be processed.
1088
 
1089
bool
1090
Script_options::is_pending_assignment(const char* name)
1091
{
1092
  for (Symbol_assignments::iterator p = this->symbol_assignments_.begin();
1093
       p != this->symbol_assignments_.end();
1094
       ++p)
1095
    if ((*p)->name() == name)
1096
      return true;
1097
  return false;
1098
}
1099
 
1100
// Add a symbol to be defined.
1101
 
1102
void
1103
Script_options::add_symbol_assignment(const char* name, size_t length,
1104
                                      bool is_defsym, Expression* value,
1105
                                      bool provide, bool hidden)
1106
{
1107
  if (length != 1 || name[0] != '.')
1108
    {
1109
      if (this->script_sections_.in_sections_clause())
1110
        {
1111
          gold_assert(!is_defsym);
1112
          this->script_sections_.add_symbol_assignment(name, length, value,
1113
                                                       provide, hidden);
1114
        }
1115
      else
1116
        {
1117
          Symbol_assignment* p = new Symbol_assignment(name, length, is_defsym,
1118
                                                       value, provide, hidden);
1119
          this->symbol_assignments_.push_back(p);
1120
        }
1121
 
1122
      if (!provide)
1123
        {
1124
          std::string n(name, length);
1125
          this->symbol_definitions_.insert(n);
1126
          this->symbol_references_.erase(n);
1127
        }
1128
    }
1129
  else
1130
    {
1131
      if (provide || hidden)
1132
        gold_error(_("invalid use of PROVIDE for dot symbol"));
1133
 
1134
      // The GNU linker permits assignments to dot outside of SECTIONS
1135
      // clauses and treats them as occurring inside, so we don't
1136
      // check in_sections_clause here.
1137
      this->script_sections_.add_dot_assignment(value);
1138
    }
1139
}
1140
 
1141
// Add a reference to a symbol.
1142
 
1143
void
1144
Script_options::add_symbol_reference(const char* name, size_t length)
1145
{
1146
  if (length != 1 || name[0] != '.')
1147
    {
1148
      std::string n(name, length);
1149
      if (this->symbol_definitions_.find(n) == this->symbol_definitions_.end())
1150
        this->symbol_references_.insert(n);
1151
    }
1152
}
1153
 
1154
// Add an assertion.
1155
 
1156
void
1157
Script_options::add_assertion(Expression* check, const char* message,
1158
                              size_t messagelen)
1159
{
1160
  if (this->script_sections_.in_sections_clause())
1161
    this->script_sections_.add_assertion(check, message, messagelen);
1162
  else
1163
    {
1164
      Script_assertion* p = new Script_assertion(check, message, messagelen);
1165
      this->assertions_.push_back(p);
1166
    }
1167
}
1168
 
1169
// Create sections required by any linker scripts.
1170
 
1171
void
1172
Script_options::create_script_sections(Layout* layout)
1173
{
1174
  if (this->saw_sections_clause())
1175
    this->script_sections_.create_sections(layout);
1176
}
1177
 
1178
// Add any symbols we are defining to the symbol table.
1179
 
1180
void
1181
Script_options::add_symbols_to_table(Symbol_table* symtab)
1182
{
1183
  for (Symbol_assignments::iterator p = this->symbol_assignments_.begin();
1184
       p != this->symbol_assignments_.end();
1185
       ++p)
1186
    (*p)->add_to_table(symtab);
1187
  this->script_sections_.add_symbols_to_table(symtab);
1188
}
1189
 
1190
// Finalize symbol values.  Also check assertions.
1191
 
1192
void
1193
Script_options::finalize_symbols(Symbol_table* symtab, const Layout* layout)
1194
{
1195
  // We finalize the symbols defined in SECTIONS first, because they
1196
  // are the ones which may have changed.  This way if symbol outside
1197
  // SECTIONS are defined in terms of symbols inside SECTIONS, they
1198
  // will get the right value.
1199
  this->script_sections_.finalize_symbols(symtab, layout);
1200
 
1201
  for (Symbol_assignments::iterator p = this->symbol_assignments_.begin();
1202
       p != this->symbol_assignments_.end();
1203
       ++p)
1204
    (*p)->finalize(symtab, layout);
1205
 
1206
  for (Assertions::iterator p = this->assertions_.begin();
1207
       p != this->assertions_.end();
1208
       ++p)
1209
    (*p)->check(symtab, layout);
1210
}
1211
 
1212
// Set section addresses.  We set all the symbols which have absolute
1213
// values.  Then we let the SECTIONS clause do its thing.  This
1214
// returns the segment which holds the file header and segment
1215
// headers, if any.
1216
 
1217
Output_segment*
1218
Script_options::set_section_addresses(Symbol_table* symtab, Layout* layout)
1219
{
1220
  for (Symbol_assignments::iterator p = this->symbol_assignments_.begin();
1221
       p != this->symbol_assignments_.end();
1222
       ++p)
1223 163 khays
    (*p)->set_if_absolute(symtab, layout, false, 0, NULL);
1224 27 khays
 
1225
  return this->script_sections_.set_section_addresses(symtab, layout);
1226
}
1227
 
1228
// This class holds data passed through the parser to the lexer and to
1229
// the parser support functions.  This avoids global variables.  We
1230
// can't use global variables because we need not be called by a
1231
// singleton thread.
1232
 
1233
class Parser_closure
1234
{
1235
 public:
1236
  Parser_closure(const char* filename,
1237
                 const Position_dependent_options& posdep_options,
1238
                 bool parsing_defsym, bool in_group, bool is_in_sysroot,
1239
                 Command_line* command_line,
1240
                 Script_options* script_options,
1241
                 Lex* lex,
1242
                 bool skip_on_incompatible_target,
1243
                 Script_info* script_info)
1244
    : filename_(filename), posdep_options_(posdep_options),
1245
      parsing_defsym_(parsing_defsym), in_group_(in_group),
1246
      is_in_sysroot_(is_in_sysroot),
1247
      skip_on_incompatible_target_(skip_on_incompatible_target),
1248
      found_incompatible_target_(false),
1249
      command_line_(command_line), script_options_(script_options),
1250
      version_script_info_(script_options->version_script_info()),
1251
      lex_(lex), lineno_(0), charpos_(0), lex_mode_stack_(), inputs_(NULL),
1252
      script_info_(script_info)
1253
  {
1254
    // We start out processing C symbols in the default lex mode.
1255
    this->language_stack_.push_back(Version_script_info::LANGUAGE_C);
1256
    this->lex_mode_stack_.push_back(lex->mode());
1257
  }
1258
 
1259
  // Return the file name.
1260
  const char*
1261
  filename() const
1262
  { return this->filename_; }
1263
 
1264
  // Return the position dependent options.  The caller may modify
1265
  // this.
1266
  Position_dependent_options&
1267
  position_dependent_options()
1268
  { return this->posdep_options_; }
1269
 
1270
  // Whether we are parsing a --defsym.
1271
  bool
1272
  parsing_defsym() const
1273
  { return this->parsing_defsym_; }
1274
 
1275
  // Return whether this script is being run in a group.
1276
  bool
1277
  in_group() const
1278
  { return this->in_group_; }
1279
 
1280
  // Return whether this script was found using a directory in the
1281
  // sysroot.
1282
  bool
1283
  is_in_sysroot() const
1284
  { return this->is_in_sysroot_; }
1285
 
1286
  // Whether to skip to the next file with the same name if we find an
1287
  // incompatible target in an OUTPUT_FORMAT statement.
1288
  bool
1289
  skip_on_incompatible_target() const
1290
  { return this->skip_on_incompatible_target_; }
1291
 
1292
  // Stop skipping to the next file on an incompatible target.  This
1293
  // is called when we make some unrevocable change to the data
1294
  // structures.
1295
  void
1296
  clear_skip_on_incompatible_target()
1297
  { this->skip_on_incompatible_target_ = false; }
1298
 
1299
  // Whether we found an incompatible target in an OUTPUT_FORMAT
1300
  // statement.
1301
  bool
1302
  found_incompatible_target() const
1303
  { return this->found_incompatible_target_; }
1304
 
1305
  // Note that we found an incompatible target.
1306
  void
1307
  set_found_incompatible_target()
1308
  { this->found_incompatible_target_ = true; }
1309
 
1310
  // Returns the Command_line structure passed in at constructor time.
1311
  // This value may be NULL.  The caller may modify this, which modifies
1312
  // the passed-in Command_line object (not a copy).
1313
  Command_line*
1314
  command_line()
1315
  { return this->command_line_; }
1316
 
1317
  // Return the options which may be set by a script.
1318
  Script_options*
1319
  script_options()
1320
  { return this->script_options_; }
1321
 
1322
  // Return the object in which version script information should be stored.
1323
  Version_script_info*
1324
  version_script()
1325
  { return this->version_script_info_; }
1326
 
1327
  // Return the next token, and advance.
1328
  const Token*
1329
  next_token()
1330
  {
1331
    const Token* token = this->lex_->next_token();
1332
    this->lineno_ = token->lineno();
1333
    this->charpos_ = token->charpos();
1334
    return token;
1335
  }
1336
 
1337
  // Set a new lexer mode, pushing the current one.
1338
  void
1339
  push_lex_mode(Lex::Mode mode)
1340
  {
1341
    this->lex_mode_stack_.push_back(this->lex_->mode());
1342
    this->lex_->set_mode(mode);
1343
  }
1344
 
1345
  // Pop the lexer mode.
1346
  void
1347
  pop_lex_mode()
1348
  {
1349
    gold_assert(!this->lex_mode_stack_.empty());
1350
    this->lex_->set_mode(this->lex_mode_stack_.back());
1351
    this->lex_mode_stack_.pop_back();
1352
  }
1353
 
1354
  // Return the current lexer mode.
1355
  Lex::Mode
1356
  lex_mode() const
1357
  { return this->lex_mode_stack_.back(); }
1358
 
1359
  // Return the line number of the last token.
1360
  int
1361
  lineno() const
1362
  { return this->lineno_; }
1363
 
1364
  // Return the character position in the line of the last token.
1365
  int
1366
  charpos() const
1367
  { return this->charpos_; }
1368
 
1369
  // Return the list of input files, creating it if necessary.  This
1370
  // is a space leak--we never free the INPUTS_ pointer.
1371
  Input_arguments*
1372
  inputs()
1373
  {
1374
    if (this->inputs_ == NULL)
1375
      this->inputs_ = new Input_arguments();
1376
    return this->inputs_;
1377
  }
1378
 
1379
  // Return whether we saw any input files.
1380
  bool
1381
  saw_inputs() const
1382
  { return this->inputs_ != NULL && !this->inputs_->empty(); }
1383
 
1384
  // Return the current language being processed in a version script
1385
  // (eg, "C++").  The empty string represents unmangled C names.
1386
  Version_script_info::Language
1387
  get_current_language() const
1388
  { return this->language_stack_.back(); }
1389
 
1390
  // Push a language onto the stack when entering an extern block.
1391
  void
1392
  push_language(Version_script_info::Language lang)
1393
  { this->language_stack_.push_back(lang); }
1394
 
1395
  // Pop a language off of the stack when exiting an extern block.
1396
  void
1397
  pop_language()
1398
  {
1399
    gold_assert(!this->language_stack_.empty());
1400
    this->language_stack_.pop_back();
1401
  }
1402
 
1403
  // Return a pointer to the incremental info.
1404
  Script_info*
1405
  script_info()
1406
  { return this->script_info_; }
1407
 
1408
 private:
1409
  // The name of the file we are reading.
1410
  const char* filename_;
1411
  // The position dependent options.
1412
  Position_dependent_options posdep_options_;
1413
  // True if we are parsing a --defsym.
1414
  bool parsing_defsym_;
1415
  // Whether we are currently in a --start-group/--end-group.
1416
  bool in_group_;
1417
  // Whether the script was found in a sysrooted directory.
1418
  bool is_in_sysroot_;
1419
  // If this is true, then if we find an OUTPUT_FORMAT with an
1420
  // incompatible target, then we tell the parser to abort so that we
1421
  // can search for the next file with the same name.
1422
  bool skip_on_incompatible_target_;
1423
  // True if we found an OUTPUT_FORMAT with an incompatible target.
1424
  bool found_incompatible_target_;
1425
  // May be NULL if the user chooses not to pass one in.
1426
  Command_line* command_line_;
1427
  // Options which may be set from any linker script.
1428
  Script_options* script_options_;
1429
  // Information parsed from a version script.
1430
  Version_script_info* version_script_info_;
1431
  // The lexer.
1432
  Lex* lex_;
1433
  // The line number of the last token returned by next_token.
1434
  int lineno_;
1435
  // The column number of the last token returned by next_token.
1436
  int charpos_;
1437
  // A stack of lexer modes.
1438
  std::vector<Lex::Mode> lex_mode_stack_;
1439
  // A stack of which extern/language block we're inside. Can be C++,
1440
  // java, or empty for C.
1441
  std::vector<Version_script_info::Language> language_stack_;
1442
  // New input files found to add to the link.
1443
  Input_arguments* inputs_;
1444
  // Pointer to incremental linking info.
1445
  Script_info* script_info_;
1446
};
1447
 
1448
// FILE was found as an argument on the command line.  Try to read it
1449
// as a script.  Return true if the file was handled.
1450
 
1451
bool
1452
read_input_script(Workqueue* workqueue, Symbol_table* symtab, Layout* layout,
1453
                  Dirsearch* dirsearch, int dirindex,
1454
                  Input_objects* input_objects, Mapfile* mapfile,
1455
                  Input_group* input_group,
1456
                  const Input_argument* input_argument,
1457
                  Input_file* input_file, Task_token* next_blocker,
1458
                  bool* used_next_blocker)
1459
{
1460
  *used_next_blocker = false;
1461
 
1462
  std::string input_string;
1463
  Lex::read_file(input_file, &input_string);
1464
 
1465
  Lex lex(input_string.c_str(), input_string.length(), PARSING_LINKER_SCRIPT);
1466
 
1467
  Script_info* script_info = NULL;
1468
  if (layout->incremental_inputs() != NULL)
1469
    {
1470
      const std::string& filename = input_file->filename();
1471
      Timespec mtime = input_file->file().get_mtime();
1472
      unsigned int arg_serial = input_argument->file().arg_serial();
1473
      script_info = new Script_info(filename);
1474
      layout->incremental_inputs()->report_script(script_info, arg_serial,
1475
                                                  mtime);
1476
    }
1477
 
1478
  Parser_closure closure(input_file->filename().c_str(),
1479
                         input_argument->file().options(),
1480
                         false,
1481
                         input_group != NULL,
1482
                         input_file->is_in_sysroot(),
1483
                         NULL,
1484
                         layout->script_options(),
1485
                         &lex,
1486
                         input_file->will_search_for(),
1487
                         script_info);
1488
 
1489
  bool old_saw_sections_clause =
1490
    layout->script_options()->saw_sections_clause();
1491
 
1492
  if (yyparse(&closure) != 0)
1493
    {
1494
      if (closure.found_incompatible_target())
1495
        {
1496
          Read_symbols::incompatible_warning(input_argument, input_file);
1497
          Read_symbols::requeue(workqueue, input_objects, symtab, layout,
1498
                                dirsearch, dirindex, mapfile, input_argument,
1499
                                input_group, next_blocker);
1500
          return true;
1501
        }
1502
      return false;
1503
    }
1504
 
1505
  if (!old_saw_sections_clause
1506
      && layout->script_options()->saw_sections_clause()
1507
      && layout->have_added_input_section())
1508
    gold_error(_("%s: SECTIONS seen after other input files; try -T/--script"),
1509
               input_file->filename().c_str());
1510
 
1511
  if (!closure.saw_inputs())
1512
    return true;
1513
 
1514
  Task_token* this_blocker = NULL;
1515
  for (Input_arguments::const_iterator p = closure.inputs()->begin();
1516
       p != closure.inputs()->end();
1517
       ++p)
1518
    {
1519
      Task_token* nb;
1520
      if (p + 1 == closure.inputs()->end())
1521
        nb = next_blocker;
1522
      else
1523
        {
1524
          nb = new Task_token(true);
1525
          nb->add_blocker();
1526
        }
1527
      workqueue->queue_soon(new Read_symbols(input_objects, symtab,
1528
                                             layout, dirsearch, 0, mapfile, &*p,
1529
                                             input_group, NULL, this_blocker, nb));
1530
      this_blocker = nb;
1531
    }
1532
 
1533
  *used_next_blocker = true;
1534
 
1535
  return true;
1536
}
1537
 
1538 166 khays
// Helper function for read_version_script(), read_commandline_script() and
1539
// script_include_directive().  Processes the given file in the mode indicated
1540
// by first_token and lex_mode.
1541 27 khays
 
1542
static bool
1543
read_script_file(const char* filename, Command_line* cmdline,
1544
                 Script_options* script_options,
1545
                 int first_token, Lex::Mode lex_mode)
1546
{
1547
  Dirsearch dirsearch;
1548 166 khays
  std::string name = filename;
1549 27 khays
 
1550 166 khays
  // If filename is a relative filename, search for it manually using "." +
1551
  // cmdline->options()->library_path() -- not dirsearch.
1552
  if (!IS_ABSOLUTE_PATH(filename))
1553
    {
1554
      const General_options::Dir_list& search_path =
1555
          cmdline->options().library_path();
1556
      name = Dirsearch::find_file_in_dir_list(name, search_path, ".");
1557
    }
1558
 
1559 27 khays
  // The file locking code wants to record a Task, but we haven't
1560
  // started the workqueue yet.  This is only for debugging purposes,
1561
  // so we invent a fake value.
1562
  const Task* task = reinterpret_cast<const Task*>(-1);
1563
 
1564
  // We don't want this file to be opened in binary mode.
1565
  Position_dependent_options posdep = cmdline->position_dependent_options();
1566
  if (posdep.format_enum() == General_options::OBJECT_FORMAT_BINARY)
1567
    posdep.set_format_enum(General_options::OBJECT_FORMAT_ELF);
1568 166 khays
  Input_file_argument input_argument(name.c_str(),
1569 27 khays
                                     Input_file_argument::INPUT_FILE_TYPE_FILE,
1570
                                     "", false, posdep);
1571
  Input_file input_file(&input_argument);
1572
  int dummy = 0;
1573
  if (!input_file.open(dirsearch, task, &dummy))
1574
    return false;
1575
 
1576
  std::string input_string;
1577
  Lex::read_file(&input_file, &input_string);
1578
 
1579
  Lex lex(input_string.c_str(), input_string.length(), first_token);
1580
  lex.set_mode(lex_mode);
1581
 
1582
  Parser_closure closure(filename,
1583
                         cmdline->position_dependent_options(),
1584
                         first_token == Lex::DYNAMIC_LIST,
1585
                         false,
1586
                         input_file.is_in_sysroot(),
1587
                         cmdline,
1588
                         script_options,
1589
                         &lex,
1590
                         false,
1591
                         NULL);
1592
  if (yyparse(&closure) != 0)
1593
    {
1594
      input_file.file().unlock(task);
1595
      return false;
1596
    }
1597
 
1598
  input_file.file().unlock(task);
1599
 
1600
  gold_assert(!closure.saw_inputs());
1601
 
1602
  return true;
1603
}
1604
 
1605
// FILENAME was found as an argument to --script (-T).
1606
// Read it as a script, and execute its contents immediately.
1607
 
1608
bool
1609
read_commandline_script(const char* filename, Command_line* cmdline)
1610
{
1611
  return read_script_file(filename, cmdline, &cmdline->script_options(),
1612
                          PARSING_LINKER_SCRIPT, Lex::LINKER_SCRIPT);
1613
}
1614
 
1615
// FILENAME was found as an argument to --version-script.  Read it as
1616
// a version script, and store its contents in
1617
// cmdline->script_options()->version_script_info().
1618
 
1619
bool
1620
read_version_script(const char* filename, Command_line* cmdline)
1621
{
1622
  return read_script_file(filename, cmdline, &cmdline->script_options(),
1623
                          PARSING_VERSION_SCRIPT, Lex::VERSION_SCRIPT);
1624
}
1625
 
1626
// FILENAME was found as an argument to --dynamic-list.  Read it as a
1627
// list of symbols, and store its contents in DYNAMIC_LIST.
1628
 
1629
bool
1630
read_dynamic_list(const char* filename, Command_line* cmdline,
1631
                  Script_options* dynamic_list)
1632
{
1633
  return read_script_file(filename, cmdline, dynamic_list,
1634
                          PARSING_DYNAMIC_LIST, Lex::DYNAMIC_LIST);
1635
}
1636
 
1637
// Implement the --defsym option on the command line.  Return true if
1638
// all is well.
1639
 
1640
bool
1641
Script_options::define_symbol(const char* definition)
1642
{
1643
  Lex lex(definition, strlen(definition), PARSING_DEFSYM);
1644
  lex.set_mode(Lex::EXPRESSION);
1645
 
1646
  // Dummy value.
1647
  Position_dependent_options posdep_options;
1648
 
1649
  Parser_closure closure("command line", posdep_options, true,
1650
                         false, false, NULL, this, &lex, false, NULL);
1651
 
1652
  if (yyparse(&closure) != 0)
1653
    return false;
1654
 
1655
  gold_assert(!closure.saw_inputs());
1656
 
1657
  return true;
1658
}
1659
 
1660
// Print the script to F for debugging.
1661
 
1662
void
1663
Script_options::print(FILE* f) const
1664
{
1665
  fprintf(f, "%s: Dumping linker script\n", program_name);
1666
 
1667
  if (!this->entry_.empty())
1668
    fprintf(f, "ENTRY(%s)\n", this->entry_.c_str());
1669
 
1670
  for (Symbol_assignments::const_iterator p =
1671
         this->symbol_assignments_.begin();
1672
       p != this->symbol_assignments_.end();
1673
       ++p)
1674
    (*p)->print(f);
1675
 
1676
  for (Assertions::const_iterator p = this->assertions_.begin();
1677
       p != this->assertions_.end();
1678
       ++p)
1679
    (*p)->print(f);
1680
 
1681
  this->script_sections_.print(f);
1682
 
1683
  this->version_script_info_.print(f);
1684
}
1685
 
1686
// Manage mapping from keywords to the codes expected by the bison
1687
// parser.  We construct one global object for each lex mode with
1688
// keywords.
1689
 
1690
class Keyword_to_parsecode
1691
{
1692
 public:
1693
  // The structure which maps keywords to parsecodes.
1694
  struct Keyword_parsecode
1695
  {
1696
    // Keyword.
1697
    const char* keyword;
1698
    // Corresponding parsecode.
1699
    int parsecode;
1700
  };
1701
 
1702
  Keyword_to_parsecode(const Keyword_parsecode* keywords,
1703
                       int keyword_count)
1704
      : keyword_parsecodes_(keywords), keyword_count_(keyword_count)
1705
  { }
1706
 
1707
  // Return the parsecode corresponding KEYWORD, or 0 if it is not a
1708
  // keyword.
1709
  int
1710
  keyword_to_parsecode(const char* keyword, size_t len) const;
1711
 
1712
 private:
1713
  const Keyword_parsecode* keyword_parsecodes_;
1714
  const int keyword_count_;
1715
};
1716
 
1717
// Mapping from keyword string to keyword parsecode.  This array must
1718
// be kept in sorted order.  Parsecodes are looked up using bsearch.
1719
// This array must correspond to the list of parsecodes in yyscript.y.
1720
 
1721
static const Keyword_to_parsecode::Keyword_parsecode
1722
script_keyword_parsecodes[] =
1723
{
1724
  { "ABSOLUTE", ABSOLUTE },
1725
  { "ADDR", ADDR },
1726
  { "ALIGN", ALIGN_K },
1727
  { "ALIGNOF", ALIGNOF },
1728
  { "ASSERT", ASSERT_K },
1729
  { "AS_NEEDED", AS_NEEDED },
1730
  { "AT", AT },
1731
  { "BIND", BIND },
1732
  { "BLOCK", BLOCK },
1733
  { "BYTE", BYTE },
1734
  { "CONSTANT", CONSTANT },
1735
  { "CONSTRUCTORS", CONSTRUCTORS },
1736
  { "COPY", COPY },
1737
  { "CREATE_OBJECT_SYMBOLS", CREATE_OBJECT_SYMBOLS },
1738
  { "DATA_SEGMENT_ALIGN", DATA_SEGMENT_ALIGN },
1739
  { "DATA_SEGMENT_END", DATA_SEGMENT_END },
1740
  { "DATA_SEGMENT_RELRO_END", DATA_SEGMENT_RELRO_END },
1741
  { "DEFINED", DEFINED },
1742
  { "DSECT", DSECT },
1743
  { "ENTRY", ENTRY },
1744
  { "EXCLUDE_FILE", EXCLUDE_FILE },
1745
  { "EXTERN", EXTERN },
1746
  { "FILL", FILL },
1747
  { "FLOAT", FLOAT },
1748
  { "FORCE_COMMON_ALLOCATION", FORCE_COMMON_ALLOCATION },
1749
  { "GROUP", GROUP },
1750
  { "HLL", HLL },
1751
  { "INCLUDE", INCLUDE },
1752
  { "INFO", INFO },
1753
  { "INHIBIT_COMMON_ALLOCATION", INHIBIT_COMMON_ALLOCATION },
1754
  { "INPUT", INPUT },
1755
  { "KEEP", KEEP },
1756
  { "LENGTH", LENGTH },
1757
  { "LOADADDR", LOADADDR },
1758
  { "LONG", LONG },
1759
  { "MAP", MAP },
1760
  { "MAX", MAX_K },
1761
  { "MEMORY", MEMORY },
1762
  { "MIN", MIN_K },
1763
  { "NEXT", NEXT },
1764
  { "NOCROSSREFS", NOCROSSREFS },
1765
  { "NOFLOAT", NOFLOAT },
1766
  { "NOLOAD", NOLOAD },
1767
  { "ONLY_IF_RO", ONLY_IF_RO },
1768
  { "ONLY_IF_RW", ONLY_IF_RW },
1769
  { "OPTION", OPTION },
1770
  { "ORIGIN", ORIGIN },
1771
  { "OUTPUT", OUTPUT },
1772
  { "OUTPUT_ARCH", OUTPUT_ARCH },
1773
  { "OUTPUT_FORMAT", OUTPUT_FORMAT },
1774
  { "OVERLAY", OVERLAY },
1775
  { "PHDRS", PHDRS },
1776
  { "PROVIDE", PROVIDE },
1777
  { "PROVIDE_HIDDEN", PROVIDE_HIDDEN },
1778
  { "QUAD", QUAD },
1779
  { "SEARCH_DIR", SEARCH_DIR },
1780
  { "SECTIONS", SECTIONS },
1781
  { "SEGMENT_START", SEGMENT_START },
1782
  { "SHORT", SHORT },
1783
  { "SIZEOF", SIZEOF },
1784
  { "SIZEOF_HEADERS", SIZEOF_HEADERS },
1785
  { "SORT", SORT_BY_NAME },
1786
  { "SORT_BY_ALIGNMENT", SORT_BY_ALIGNMENT },
1787
  { "SORT_BY_NAME", SORT_BY_NAME },
1788
  { "SPECIAL", SPECIAL },
1789
  { "SQUAD", SQUAD },
1790
  { "STARTUP", STARTUP },
1791
  { "SUBALIGN", SUBALIGN },
1792
  { "SYSLIB", SYSLIB },
1793
  { "TARGET", TARGET_K },
1794
  { "TRUNCATE", TRUNCATE },
1795
  { "VERSION", VERSIONK },
1796
  { "global", GLOBAL },
1797
  { "l", LENGTH },
1798
  { "len", LENGTH },
1799
  { "local", LOCAL },
1800
  { "o", ORIGIN },
1801
  { "org", ORIGIN },
1802
  { "sizeof_headers", SIZEOF_HEADERS },
1803
};
1804
 
1805
static const Keyword_to_parsecode
1806
script_keywords(&script_keyword_parsecodes[0],
1807
                (sizeof(script_keyword_parsecodes)
1808
                 / sizeof(script_keyword_parsecodes[0])));
1809
 
1810
static const Keyword_to_parsecode::Keyword_parsecode
1811
version_script_keyword_parsecodes[] =
1812
{
1813
  { "extern", EXTERN },
1814
  { "global", GLOBAL },
1815
  { "local", LOCAL },
1816
};
1817
 
1818
static const Keyword_to_parsecode
1819
version_script_keywords(&version_script_keyword_parsecodes[0],
1820
                        (sizeof(version_script_keyword_parsecodes)
1821
                         / sizeof(version_script_keyword_parsecodes[0])));
1822
 
1823
static const Keyword_to_parsecode::Keyword_parsecode
1824
dynamic_list_keyword_parsecodes[] =
1825
{
1826
  { "extern", EXTERN },
1827
};
1828
 
1829
static const Keyword_to_parsecode
1830
dynamic_list_keywords(&dynamic_list_keyword_parsecodes[0],
1831
                      (sizeof(dynamic_list_keyword_parsecodes)
1832
                       / sizeof(dynamic_list_keyword_parsecodes[0])));
1833
 
1834
 
1835
 
1836
// Comparison function passed to bsearch.
1837
 
1838
extern "C"
1839
{
1840
 
1841
struct Ktt_key
1842
{
1843
  const char* str;
1844
  size_t len;
1845
};
1846
 
1847
static int
1848
ktt_compare(const void* keyv, const void* kttv)
1849
{
1850
  const Ktt_key* key = static_cast<const Ktt_key*>(keyv);
1851
  const Keyword_to_parsecode::Keyword_parsecode* ktt =
1852
    static_cast<const Keyword_to_parsecode::Keyword_parsecode*>(kttv);
1853
  int i = strncmp(key->str, ktt->keyword, key->len);
1854
  if (i != 0)
1855
    return i;
1856
  if (ktt->keyword[key->len] != '\0')
1857
    return -1;
1858
  return 0;
1859
}
1860
 
1861
} // End extern "C".
1862
 
1863
int
1864
Keyword_to_parsecode::keyword_to_parsecode(const char* keyword,
1865
                                           size_t len) const
1866
{
1867
  Ktt_key key;
1868
  key.str = keyword;
1869
  key.len = len;
1870
  void* kttv = bsearch(&key,
1871
                       this->keyword_parsecodes_,
1872
                       this->keyword_count_,
1873
                       sizeof(this->keyword_parsecodes_[0]),
1874
                       ktt_compare);
1875
  if (kttv == NULL)
1876
    return 0;
1877
  Keyword_parsecode* ktt = static_cast<Keyword_parsecode*>(kttv);
1878
  return ktt->parsecode;
1879
}
1880
 
1881
// The following structs are used within the VersionInfo class as well
1882
// as in the bison helper functions.  They store the information
1883
// parsed from the version script.
1884
 
1885
// A single version expression.
1886
// For example, pattern="std::map*" and language="C++".
1887
struct Version_expression
1888
{
1889
  Version_expression(const std::string& a_pattern,
1890
                     Version_script_info::Language a_language,
1891
                     bool a_exact_match)
1892
    : pattern(a_pattern), language(a_language), exact_match(a_exact_match),
1893
      was_matched_by_symbol(false)
1894
  { }
1895
 
1896
  std::string pattern;
1897
  Version_script_info::Language language;
1898
  // If false, we use glob() to match pattern.  If true, we use strcmp().
1899
  bool exact_match;
1900
  // True if --no-undefined-version is in effect and we found this
1901
  // version in get_symbol_version.  We use mutable because this
1902
  // struct is generally not modifiable after it has been created.
1903
  mutable bool was_matched_by_symbol;
1904
};
1905
 
1906
// A list of expressions.
1907
struct Version_expression_list
1908
{
1909
  std::vector<struct Version_expression> expressions;
1910
};
1911
 
1912
// A list of which versions upon which another version depends.
1913
// Strings should be from the Stringpool.
1914
struct Version_dependency_list
1915
{
1916
  std::vector<std::string> dependencies;
1917
};
1918
 
1919
// The total definition of a version.  It includes the tag for the
1920
// version, its global and local expressions, and any dependencies.
1921
struct Version_tree
1922
{
1923
  Version_tree()
1924
      : tag(), global(NULL), local(NULL), dependencies(NULL)
1925
  { }
1926
 
1927
  std::string tag;
1928
  const struct Version_expression_list* global;
1929
  const struct Version_expression_list* local;
1930
  const struct Version_dependency_list* dependencies;
1931
};
1932
 
1933
// Helper class that calls cplus_demangle when needed and takes care of freeing
1934
// the result.
1935
 
1936
class Lazy_demangler
1937
{
1938
 public:
1939
  Lazy_demangler(const char* symbol, int options)
1940
    : symbol_(symbol), options_(options), demangled_(NULL), did_demangle_(false)
1941
  { }
1942
 
1943
  ~Lazy_demangler()
1944
  { free(this->demangled_); }
1945
 
1946
  // Return the demangled name. The actual demangling happens on the first call,
1947
  // and the result is later cached.
1948
  inline char*
1949
  get();
1950
 
1951
 private:
1952
  // The symbol to demangle.
1953
  const char* symbol_;
1954
  // Option flags to pass to cplus_demagle.
1955
  const int options_;
1956
  // The cached demangled value, or NULL if demangling didn't happen yet or
1957
  // failed.
1958
  char* demangled_;
1959
  // Whether we already called cplus_demangle
1960
  bool did_demangle_;
1961
};
1962
 
1963
// Return the demangled name. The actual demangling happens on the first call,
1964
// and the result is later cached. Returns NULL if the symbol cannot be
1965
// demangled.
1966
 
1967
inline char*
1968
Lazy_demangler::get()
1969
{
1970
  if (!this->did_demangle_)
1971
    {
1972
      this->demangled_ = cplus_demangle(this->symbol_, this->options_);
1973
      this->did_demangle_ = true;
1974
    }
1975
  return this->demangled_;
1976
}
1977
 
1978
// Class Version_script_info.
1979
 
1980
Version_script_info::Version_script_info()
1981
  : dependency_lists_(), expression_lists_(), version_trees_(), globs_(),
1982
    default_version_(NULL), default_is_global_(false), is_finalized_(false)
1983
{
1984
  for (int i = 0; i < LANGUAGE_COUNT; ++i)
1985
    this->exact_[i] = NULL;
1986
}
1987
 
1988
Version_script_info::~Version_script_info()
1989
{
1990
}
1991
 
1992
// Forget all the known version script information.
1993
 
1994
void
1995
Version_script_info::clear()
1996
{
1997
  for (size_t k = 0; k < this->dependency_lists_.size(); ++k)
1998
    delete this->dependency_lists_[k];
1999
  this->dependency_lists_.clear();
2000
  for (size_t k = 0; k < this->version_trees_.size(); ++k)
2001
    delete this->version_trees_[k];
2002
  this->version_trees_.clear();
2003
  for (size_t k = 0; k < this->expression_lists_.size(); ++k)
2004
    delete this->expression_lists_[k];
2005
  this->expression_lists_.clear();
2006
}
2007
 
2008
// Finalize the version script information.
2009
 
2010
void
2011
Version_script_info::finalize()
2012
{
2013
  if (!this->is_finalized_)
2014
    {
2015
      this->build_lookup_tables();
2016
      this->is_finalized_ = true;
2017
    }
2018
}
2019
 
2020
// Return all the versions.
2021
 
2022
std::vector<std::string>
2023
Version_script_info::get_versions() const
2024
{
2025
  std::vector<std::string> ret;
2026
  for (size_t j = 0; j < this->version_trees_.size(); ++j)
2027
    if (!this->version_trees_[j]->tag.empty())
2028
      ret.push_back(this->version_trees_[j]->tag);
2029
  return ret;
2030
}
2031
 
2032
// Return the dependencies of VERSION.
2033
 
2034
std::vector<std::string>
2035
Version_script_info::get_dependencies(const char* version) const
2036
{
2037
  std::vector<std::string> ret;
2038
  for (size_t j = 0; j < this->version_trees_.size(); ++j)
2039
    if (this->version_trees_[j]->tag == version)
2040
      {
2041
        const struct Version_dependency_list* deps =
2042
          this->version_trees_[j]->dependencies;
2043
        if (deps != NULL)
2044
          for (size_t k = 0; k < deps->dependencies.size(); ++k)
2045
            ret.push_back(deps->dependencies[k]);
2046
        return ret;
2047
      }
2048
  return ret;
2049
}
2050
 
2051
// A version script essentially maps a symbol name to a version tag
2052
// and an indication of whether symbol is global or local within that
2053
// version tag.  Each symbol maps to at most one version tag.
2054
// Unfortunately, in practice, version scripts are ambiguous, and list
2055
// symbols multiple times.  Thus, we have to document the matching
2056
// process.
2057
 
2058
// This is a description of what the GNU linker does as of 2010-01-11.
2059
// It walks through the version tags in the order in which they appear
2060
// in the version script.  For each tag, it first walks through the
2061
// global patterns for that tag, then the local patterns.  When
2062
// looking at a single pattern, it first applies any language specific
2063
// demangling as specified for the pattern, and then matches the
2064
// resulting symbol name to the pattern.  If it finds an exact match
2065
// for a literal pattern (a pattern enclosed in quotes or with no
2066
// wildcard characters), then that is the match that it uses.  If
2067
// finds a match with a wildcard pattern, then it saves it and
2068
// continues searching.  Wildcard patterns that are exactly "*" are
2069
// saved separately.
2070
 
2071
// If no exact match with a literal pattern is ever found, then if a
2072
// wildcard match with a global pattern was found it is used,
2073
// otherwise if a wildcard match with a local pattern was found it is
2074
// used.
2075
 
2076
// This is the result:
2077
//   * If there is an exact match, then we use the first tag in the
2078
//     version script where it matches.
2079
//     + If the exact match in that tag is global, it is used.
2080
//     + Otherwise the exact match in that tag is local, and is used.
2081
//   * Otherwise, if there is any match with a global wildcard pattern:
2082
//     + If there is any match with a wildcard pattern which is not
2083
//       "*", then we use the tag in which the *last* such pattern
2084
//       appears.
2085
//     + Otherwise, we matched "*".  If there is no match with a local
2086
//       wildcard pattern which is not "*", then we use the *last*
2087
//       match with a global "*".  Otherwise, continue.
2088
//   * Otherwise, if there is any match with a local wildcard pattern:
2089
//     + If there is any match with a wildcard pattern which is not
2090
//       "*", then we use the tag in which the *last* such pattern
2091
//       appears.
2092
//     + Otherwise, we matched "*", and we use the tag in which the
2093
//       *last* such match occurred.
2094
 
2095
// There is an additional wrinkle.  When the GNU linker finds a symbol
2096
// with a version defined in an object file due to a .symver
2097
// directive, it looks up that symbol name in that version tag.  If it
2098
// finds it, it matches the symbol name against the patterns for that
2099
// version.  If there is no match with a global pattern, but there is
2100
// a match with a local pattern, then the GNU linker marks the symbol
2101
// as local.
2102
 
2103
// We want gold to be generally compatible, but we also want gold to
2104
// be fast.  These are the rules that gold implements:
2105
//   * If there is an exact match for the mangled name, we use it.
2106
//     + If there is more than one exact match, we give a warning, and
2107
//       we use the first tag in the script which matches.
2108
//     + If a symbol has an exact match as both global and local for
2109
//       the same version tag, we give an error.
2110
//   * Otherwise, we look for an extern C++ or an extern Java exact
2111
//     match.  If we find an exact match, we use it.
2112
//     + If there is more than one exact match, we give a warning, and
2113
//       we use the first tag in the script which matches.
2114
//     + If a symbol has an exact match as both global and local for
2115
//       the same version tag, we give an error.
2116
//   * Otherwise, we look through the wildcard patterns, ignoring "*"
2117
//     patterns.  We look through the version tags in reverse order.
2118
//     For each version tag, we look through the global patterns and
2119
//     then the local patterns.  We use the first match we find (i.e.,
2120
//     the last matching version tag in the file).
2121
//   * Otherwise, we use the "*" pattern if there is one.  We give an
2122
//     error if there are multiple "*" patterns.
2123
 
2124
// At least for now, gold does not look up the version tag for a
2125
// symbol version found in an object file to see if it should be
2126
// forced local.  There are other ways to force a symbol to be local,
2127
// and I don't understand why this one is useful.
2128
 
2129
// Build a set of fast lookup tables for a version script.
2130
 
2131
void
2132
Version_script_info::build_lookup_tables()
2133
{
2134
  size_t size = this->version_trees_.size();
2135
  for (size_t j = 0; j < size; ++j)
2136
    {
2137
      const Version_tree* v = this->version_trees_[j];
2138
      this->build_expression_list_lookup(v->local, v, false);
2139
      this->build_expression_list_lookup(v->global, v, true);
2140
    }
2141
}
2142
 
2143
// If a pattern has backlashes but no unquoted wildcard characters,
2144
// then we apply backslash unquoting and look for an exact match.
2145
// Otherwise we treat it as a wildcard pattern.  This function returns
2146
// true for a wildcard pattern.  Otherwise, it does backslash
2147
// unquoting on *PATTERN and returns false.  If this returns true,
2148
// *PATTERN may have been partially unquoted.
2149
 
2150
bool
2151
Version_script_info::unquote(std::string* pattern) const
2152
{
2153
  bool saw_backslash = false;
2154
  size_t len = pattern->length();
2155
  size_t j = 0;
2156
  for (size_t i = 0; i < len; ++i)
2157
    {
2158
      if (saw_backslash)
2159
        saw_backslash = false;
2160
      else
2161
        {
2162
          switch ((*pattern)[i])
2163
            {
2164
            case '?': case '[': case '*':
2165
              return true;
2166
            case '\\':
2167
              saw_backslash = true;
2168
              continue;
2169
            default:
2170
              break;
2171
            }
2172
        }
2173
 
2174
      if (i != j)
2175
        (*pattern)[j] = (*pattern)[i];
2176
      ++j;
2177
    }
2178
  return false;
2179
}
2180
 
2181
// Add an exact match for MATCH to *PE.  The result of the match is
2182
// V/IS_GLOBAL.
2183
 
2184
void
2185
Version_script_info::add_exact_match(const std::string& match,
2186
                                     const Version_tree* v, bool is_global,
2187
                                     const Version_expression* ve,
2188
                                     Exact* pe)
2189
{
2190
  std::pair<Exact::iterator, bool> ins =
2191
    pe->insert(std::make_pair(match, Version_tree_match(v, is_global, ve)));
2192
  if (ins.second)
2193
    {
2194
      // This is the first time we have seen this match.
2195
      return;
2196
    }
2197
 
2198
  Version_tree_match& vtm(ins.first->second);
2199
  if (vtm.real->tag != v->tag)
2200
    {
2201
      // This is an ambiguous match.  We still return the
2202
      // first version that we found in the script, but we
2203
      // record the new version to issue a warning if we
2204
      // wind up looking up this symbol.
2205
      if (vtm.ambiguous == NULL)
2206
        vtm.ambiguous = v;
2207
    }
2208
  else if (is_global != vtm.is_global)
2209
    {
2210
      // We have a match for both the global and local entries for a
2211
      // version tag.  That's got to be wrong.
2212
      gold_error(_("'%s' appears as both a global and a local symbol "
2213
                   "for version '%s' in script"),
2214
                 match.c_str(), v->tag.c_str());
2215
    }
2216
}
2217
 
2218
// Build fast lookup information for EXPLIST and store it in LOOKUP.
2219
// All matches go to V, and IS_GLOBAL is true if they are global
2220
// matches.
2221
 
2222
void
2223
Version_script_info::build_expression_list_lookup(
2224
    const Version_expression_list* explist,
2225
    const Version_tree* v,
2226
    bool is_global)
2227
{
2228
  if (explist == NULL)
2229
    return;
2230
  size_t size = explist->expressions.size();
2231
  for (size_t i = 0; i < size; ++i)
2232
    {
2233
      const Version_expression& exp(explist->expressions[i]);
2234
 
2235
      if (exp.pattern.length() == 1 && exp.pattern[0] == '*')
2236
        {
2237
          if (this->default_version_ != NULL
2238
              && this->default_version_->tag != v->tag)
2239
            gold_warning(_("wildcard match appears in both version '%s' "
2240
                           "and '%s' in script"),
2241
                         this->default_version_->tag.c_str(), v->tag.c_str());
2242
          else if (this->default_version_ != NULL
2243
                   && this->default_is_global_ != is_global)
2244
            gold_error(_("wildcard match appears as both global and local "
2245
                         "in version '%s' in script"),
2246
                       v->tag.c_str());
2247
          this->default_version_ = v;
2248
          this->default_is_global_ = is_global;
2249
          continue;
2250
        }
2251
 
2252
      std::string pattern = exp.pattern;
2253
      if (!exp.exact_match)
2254
        {
2255
          if (this->unquote(&pattern))
2256
            {
2257
              this->globs_.push_back(Glob(&exp, v, is_global));
2258
              continue;
2259
            }
2260
        }
2261
 
2262
      if (this->exact_[exp.language] == NULL)
2263
        this->exact_[exp.language] = new Exact();
2264
      this->add_exact_match(pattern, v, is_global, &exp,
2265
                            this->exact_[exp.language]);
2266
    }
2267
}
2268
 
2269
// Return the name to match given a name, a language code, and two
2270
// lazy demanglers.
2271
 
2272
const char*
2273
Version_script_info::get_name_to_match(const char* name,
2274
                                       int language,
2275
                                       Lazy_demangler* cpp_demangler,
2276
                                       Lazy_demangler* java_demangler) const
2277
{
2278
  switch (language)
2279
    {
2280
    case LANGUAGE_C:
2281
      return name;
2282
    case LANGUAGE_CXX:
2283
      return cpp_demangler->get();
2284
    case LANGUAGE_JAVA:
2285
      return java_demangler->get();
2286
    default:
2287
      gold_unreachable();
2288
    }
2289
}
2290
 
2291
// Look up SYMBOL_NAME in the list of versions.  Return true if the
2292
// symbol is found, false if not.  If the symbol is found, then if
2293
// PVERSION is not NULL, set *PVERSION to the version tag, and if
2294
// P_IS_GLOBAL is not NULL, set *P_IS_GLOBAL according to whether the
2295
// symbol is global or not.
2296
 
2297
bool
2298
Version_script_info::get_symbol_version(const char* symbol_name,
2299
                                        std::string* pversion,
2300
                                        bool* p_is_global) const
2301
{
2302
  Lazy_demangler cpp_demangled_name(symbol_name, DMGL_ANSI | DMGL_PARAMS);
2303
  Lazy_demangler java_demangled_name(symbol_name,
2304
                                     DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA);
2305
 
2306
  gold_assert(this->is_finalized_);
2307
  for (int i = 0; i < LANGUAGE_COUNT; ++i)
2308
    {
2309
      Exact* exact = this->exact_[i];
2310
      if (exact == NULL)
2311
        continue;
2312
 
2313
      const char* name_to_match = this->get_name_to_match(symbol_name, i,
2314
                                                          &cpp_demangled_name,
2315
                                                          &java_demangled_name);
2316
      if (name_to_match == NULL)
2317
        {
2318
          // If the name can not be demangled, the GNU linker goes
2319
          // ahead and tries to match it anyhow.  That does not
2320
          // make sense to me and I have not implemented it.
2321
          continue;
2322
        }
2323
 
2324
      Exact::const_iterator pe = exact->find(name_to_match);
2325
      if (pe != exact->end())
2326
        {
2327
          const Version_tree_match& vtm(pe->second);
2328
          if (vtm.ambiguous != NULL)
2329
            gold_warning(_("using '%s' as version for '%s' which is also "
2330
                           "named in version '%s' in script"),
2331
                         vtm.real->tag.c_str(), name_to_match,
2332
                         vtm.ambiguous->tag.c_str());
2333
 
2334
          if (pversion != NULL)
2335
            *pversion = vtm.real->tag;
2336
          if (p_is_global != NULL)
2337
            *p_is_global = vtm.is_global;
2338
 
2339
          // If we are using --no-undefined-version, and this is a
2340
          // global symbol, we have to record that we have found this
2341
          // symbol, so that we don't warn about it.  We have to do
2342
          // this now, because otherwise we have no way to get from a
2343
          // non-C language back to the demangled name that we
2344
          // matched.
2345
          if (p_is_global != NULL && vtm.is_global)
2346
            vtm.expression->was_matched_by_symbol = true;
2347
 
2348
          return true;
2349
        }
2350
    }
2351
 
2352
  // Look through the glob patterns in reverse order.
2353
 
2354
  for (Globs::const_reverse_iterator p = this->globs_.rbegin();
2355
       p != this->globs_.rend();
2356
       ++p)
2357
    {
2358
      int language = p->expression->language;
2359
      const char* name_to_match = this->get_name_to_match(symbol_name,
2360
                                                          language,
2361
                                                          &cpp_demangled_name,
2362
                                                          &java_demangled_name);
2363
      if (name_to_match == NULL)
2364
        continue;
2365
 
2366
      if (fnmatch(p->expression->pattern.c_str(), name_to_match,
2367
                  FNM_NOESCAPE) == 0)
2368
        {
2369
          if (pversion != NULL)
2370
            *pversion = p->version->tag;
2371
          if (p_is_global != NULL)
2372
            *p_is_global = p->is_global;
2373
          return true;
2374
        }
2375
    }
2376
 
2377
  // Finally, there may be a wildcard.
2378
  if (this->default_version_ != NULL)
2379
    {
2380
      if (pversion != NULL)
2381
        *pversion = this->default_version_->tag;
2382
      if (p_is_global != NULL)
2383
        *p_is_global = this->default_is_global_;
2384
      return true;
2385
    }
2386
 
2387
  return false;
2388
}
2389
 
2390
// Give an error if any exact symbol names (not wildcards) appear in a
2391
// version script, but there is no such symbol.
2392
 
2393
void
2394
Version_script_info::check_unmatched_names(const Symbol_table* symtab) const
2395
{
2396
  for (size_t i = 0; i < this->version_trees_.size(); ++i)
2397
    {
2398
      const Version_tree* vt = this->version_trees_[i];
2399
      if (vt->global == NULL)
2400
        continue;
2401
      for (size_t j = 0; j < vt->global->expressions.size(); ++j)
2402
        {
2403
          const Version_expression& expression(vt->global->expressions[j]);
2404
 
2405
          // Ignore cases where we used the version because we saw a
2406
          // symbol that we looked up.  Note that
2407
          // WAS_MATCHED_BY_SYMBOL will be true even if the symbol was
2408
          // not a definition.  That's OK as in that case we most
2409
          // likely gave an undefined symbol error anyhow.
2410
          if (expression.was_matched_by_symbol)
2411
            continue;
2412
 
2413
          // Just ignore names which are in languages other than C.
2414
          // We have no way to look them up in the symbol table.
2415
          if (expression.language != LANGUAGE_C)
2416
            continue;
2417
 
2418
          // Remove backslash quoting, and ignore wildcard patterns.
2419
          std::string pattern = expression.pattern;
2420
          if (!expression.exact_match)
2421
            {
2422
              if (this->unquote(&pattern))
2423
                continue;
2424
            }
2425
 
2426
          if (symtab->lookup(pattern.c_str(), vt->tag.c_str()) == NULL)
2427
            gold_error(_("version script assignment of %s to symbol %s "
2428
                         "failed: symbol not defined"),
2429
                       vt->tag.c_str(), pattern.c_str());
2430
        }
2431
    }
2432
}
2433
 
2434
struct Version_dependency_list*
2435
Version_script_info::allocate_dependency_list()
2436
{
2437
  dependency_lists_.push_back(new Version_dependency_list);
2438
  return dependency_lists_.back();
2439
}
2440
 
2441
struct Version_expression_list*
2442
Version_script_info::allocate_expression_list()
2443
{
2444
  expression_lists_.push_back(new Version_expression_list);
2445
  return expression_lists_.back();
2446
}
2447
 
2448
struct Version_tree*
2449
Version_script_info::allocate_version_tree()
2450
{
2451
  version_trees_.push_back(new Version_tree);
2452
  return version_trees_.back();
2453
}
2454
 
2455
// Print for debugging.
2456
 
2457
void
2458
Version_script_info::print(FILE* f) const
2459
{
2460
  if (this->empty())
2461
    return;
2462
 
2463
  fprintf(f, "VERSION {");
2464
 
2465
  for (size_t i = 0; i < this->version_trees_.size(); ++i)
2466
    {
2467
      const Version_tree* vt = this->version_trees_[i];
2468
 
2469
      if (vt->tag.empty())
2470
        fprintf(f, "  {\n");
2471
      else
2472
        fprintf(f, "  %s {\n", vt->tag.c_str());
2473
 
2474
      if (vt->global != NULL)
2475
        {
2476
          fprintf(f, "    global :\n");
2477
          this->print_expression_list(f, vt->global);
2478
        }
2479
 
2480
      if (vt->local != NULL)
2481
        {
2482
          fprintf(f, "    local :\n");
2483
          this->print_expression_list(f, vt->local);
2484
        }
2485
 
2486
      fprintf(f, "  }");
2487
      if (vt->dependencies != NULL)
2488
        {
2489
          const Version_dependency_list* deps = vt->dependencies;
2490
          for (size_t j = 0; j < deps->dependencies.size(); ++j)
2491
            {
2492
              if (j < deps->dependencies.size() - 1)
2493
                fprintf(f, "\n");
2494
              fprintf(f, "    %s", deps->dependencies[j].c_str());
2495
            }
2496
        }
2497
      fprintf(f, ";\n");
2498
    }
2499
 
2500
  fprintf(f, "}\n");
2501
}
2502
 
2503
void
2504
Version_script_info::print_expression_list(
2505
    FILE* f,
2506
    const Version_expression_list* vel) const
2507
{
2508
  Version_script_info::Language current_language = LANGUAGE_C;
2509
  for (size_t i = 0; i < vel->expressions.size(); ++i)
2510
    {
2511
      const Version_expression& ve(vel->expressions[i]);
2512
 
2513
      if (ve.language != current_language)
2514
        {
2515
          if (current_language != LANGUAGE_C)
2516
            fprintf(f, "      }\n");
2517
          switch (ve.language)
2518
            {
2519
            case LANGUAGE_C:
2520
              break;
2521
            case LANGUAGE_CXX:
2522
              fprintf(f, "      extern \"C++\" {\n");
2523
              break;
2524
            case LANGUAGE_JAVA:
2525
              fprintf(f, "      extern \"Java\" {\n");
2526
              break;
2527
            default:
2528
              gold_unreachable();
2529
            }
2530
          current_language = ve.language;
2531
        }
2532
 
2533
      fprintf(f, "      ");
2534
      if (current_language != LANGUAGE_C)
2535
        fprintf(f, "  ");
2536
 
2537
      if (ve.exact_match)
2538
        fprintf(f, "\"");
2539
      fprintf(f, "%s", ve.pattern.c_str());
2540
      if (ve.exact_match)
2541
        fprintf(f, "\"");
2542
 
2543
      fprintf(f, "\n");
2544
    }
2545
 
2546
  if (current_language != LANGUAGE_C)
2547
    fprintf(f, "      }\n");
2548
}
2549
 
2550
} // End namespace gold.
2551
 
2552
// The remaining functions are extern "C", so it's clearer to not put
2553
// them in namespace gold.
2554
 
2555
using namespace gold;
2556
 
2557
// This function is called by the bison parser to return the next
2558
// token.
2559
 
2560
extern "C" int
2561
yylex(YYSTYPE* lvalp, void* closurev)
2562
{
2563
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2564
  const Token* token = closure->next_token();
2565
  switch (token->classification())
2566
    {
2567
    default:
2568
      gold_unreachable();
2569
 
2570
    case Token::TOKEN_INVALID:
2571
      yyerror(closurev, "invalid character");
2572
      return 0;
2573
 
2574
    case Token::TOKEN_EOF:
2575
      return 0;
2576
 
2577
    case Token::TOKEN_STRING:
2578
      {
2579
        // This is either a keyword or a STRING.
2580
        size_t len;
2581
        const char* str = token->string_value(&len);
2582
        int parsecode = 0;
2583
        switch (closure->lex_mode())
2584
          {
2585
          case Lex::LINKER_SCRIPT:
2586
            parsecode = script_keywords.keyword_to_parsecode(str, len);
2587
            break;
2588
          case Lex::VERSION_SCRIPT:
2589
            parsecode = version_script_keywords.keyword_to_parsecode(str, len);
2590
            break;
2591
          case Lex::DYNAMIC_LIST:
2592
            parsecode = dynamic_list_keywords.keyword_to_parsecode(str, len);
2593
            break;
2594
          default:
2595
            break;
2596
          }
2597
        if (parsecode != 0)
2598
          return parsecode;
2599
        lvalp->string.value = str;
2600
        lvalp->string.length = len;
2601
        return STRING;
2602
      }
2603
 
2604
    case Token::TOKEN_QUOTED_STRING:
2605
      lvalp->string.value = token->string_value(&lvalp->string.length);
2606
      return QUOTED_STRING;
2607
 
2608
    case Token::TOKEN_OPERATOR:
2609
      return token->operator_value();
2610
 
2611
    case Token::TOKEN_INTEGER:
2612
      lvalp->integer = token->integer_value();
2613
      return INTEGER;
2614
    }
2615
}
2616
 
2617
// This function is called by the bison parser to report an error.
2618
 
2619
extern "C" void
2620
yyerror(void* closurev, const char* message)
2621
{
2622
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2623
  gold_error(_("%s:%d:%d: %s"), closure->filename(), closure->lineno(),
2624
             closure->charpos(), message);
2625
}
2626
 
2627
// Called by the bison parser to add an external symbol to the link.
2628
 
2629
extern "C" void
2630
script_add_extern(void* closurev, const char* name, size_t length)
2631
{
2632
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2633
  closure->script_options()->add_symbol_reference(name, length);
2634
}
2635
 
2636
// Called by the bison parser to add a file to the link.
2637
 
2638
extern "C" void
2639
script_add_file(void* closurev, const char* name, size_t length)
2640
{
2641
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2642
 
2643
  // If this is an absolute path, and we found the script in the
2644
  // sysroot, then we want to prepend the sysroot to the file name.
2645
  // For example, this is how we handle a cross link to the x86_64
2646
  // libc.so, which refers to /lib/libc.so.6.
2647
  std::string name_string(name, length);
2648
  const char* extra_search_path = ".";
2649
  std::string script_directory;
2650
  if (IS_ABSOLUTE_PATH(name_string.c_str()))
2651
    {
2652
      if (closure->is_in_sysroot())
2653
        {
2654
          const std::string& sysroot(parameters->options().sysroot());
2655
          gold_assert(!sysroot.empty());
2656
          name_string = sysroot + name_string;
2657
        }
2658
    }
2659
  else
2660
    {
2661
      // In addition to checking the normal library search path, we
2662
      // also want to check in the script-directory.
2663
      const char* slash = strrchr(closure->filename(), '/');
2664
      if (slash != NULL)
2665
        {
2666
          script_directory.assign(closure->filename(),
2667
                                  slash - closure->filename() + 1);
2668
          extra_search_path = script_directory.c_str();
2669
        }
2670
    }
2671
 
2672
  Input_file_argument file(name_string.c_str(),
2673
                           Input_file_argument::INPUT_FILE_TYPE_FILE,
2674
                           extra_search_path, false,
2675
                           closure->position_dependent_options());
2676
  Input_argument& arg = closure->inputs()->add_file(file);
2677
  arg.set_script_info(closure->script_info());
2678
}
2679
 
2680
// Called by the bison parser to add a library to the link.
2681
 
2682
extern "C" void
2683
script_add_library(void* closurev, const char* name, size_t length)
2684
{
2685
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2686
  std::string name_string(name, length);
2687
 
2688
  if (name_string[0] != 'l')
2689
    gold_error(_("library name must be prefixed with -l"));
2690
 
2691
  Input_file_argument file(name_string.c_str() + 1,
2692
                           Input_file_argument::INPUT_FILE_TYPE_LIBRARY,
2693
                           "", false,
2694
                           closure->position_dependent_options());
2695
  Input_argument& arg = closure->inputs()->add_file(file);
2696
  arg.set_script_info(closure->script_info());
2697
}
2698
 
2699
// Called by the bison parser to start a group.  If we are already in
2700
// a group, that means that this script was invoked within a
2701
// --start-group --end-group sequence on the command line, or that
2702
// this script was found in a GROUP of another script.  In that case,
2703
// we simply continue the existing group, rather than starting a new
2704
// one.  It is possible to construct a case in which this will do
2705
// something other than what would happen if we did a recursive group,
2706
// but it's hard to imagine why the different behaviour would be
2707
// useful for a real program.  Avoiding recursive groups is simpler
2708
// and more efficient.
2709
 
2710
extern "C" void
2711
script_start_group(void* closurev)
2712
{
2713
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2714
  if (!closure->in_group())
2715
    closure->inputs()->start_group();
2716
}
2717
 
2718
// Called by the bison parser at the end of a group.
2719
 
2720
extern "C" void
2721
script_end_group(void* closurev)
2722
{
2723
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2724
  if (!closure->in_group())
2725
    closure->inputs()->end_group();
2726
}
2727
 
2728
// Called by the bison parser to start an AS_NEEDED list.
2729
 
2730
extern "C" void
2731
script_start_as_needed(void* closurev)
2732
{
2733
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2734
  closure->position_dependent_options().set_as_needed(true);
2735
}
2736
 
2737
// Called by the bison parser at the end of an AS_NEEDED list.
2738
 
2739
extern "C" void
2740
script_end_as_needed(void* closurev)
2741
{
2742
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2743
  closure->position_dependent_options().set_as_needed(false);
2744
}
2745
 
2746
// Called by the bison parser to set the entry symbol.
2747
 
2748
extern "C" void
2749
script_set_entry(void* closurev, const char* entry, size_t length)
2750
{
2751
  // We'll parse this exactly the same as --entry=ENTRY on the commandline
2752
  // TODO(csilvers): FIXME -- call set_entry directly.
2753
  std::string arg("--entry=");
2754
  arg.append(entry, length);
2755
  script_parse_option(closurev, arg.c_str(), arg.size());
2756
}
2757
 
2758
// Called by the bison parser to set whether to define common symbols.
2759
 
2760
extern "C" void
2761
script_set_common_allocation(void* closurev, int set)
2762
{
2763
  const char* arg = set != 0 ? "--define-common" : "--no-define-common";
2764
  script_parse_option(closurev, arg, strlen(arg));
2765
}
2766
 
2767
// Called by the bison parser to refer to a symbol.
2768
 
2769
extern "C" Expression*
2770
script_symbol(void* closurev, const char* name, size_t length)
2771
{
2772
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2773
  if (length != 1 || name[0] != '.')
2774
    closure->script_options()->add_symbol_reference(name, length);
2775
  return script_exp_string(name, length);
2776
}
2777
 
2778
// Called by the bison parser to define a symbol.
2779
 
2780
extern "C" void
2781
script_set_symbol(void* closurev, const char* name, size_t length,
2782
                  Expression* value, int providei, int hiddeni)
2783
{
2784
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2785
  const bool provide = providei != 0;
2786
  const bool hidden = hiddeni != 0;
2787
  closure->script_options()->add_symbol_assignment(name, length,
2788
                                                   closure->parsing_defsym(),
2789
                                                   value, provide, hidden);
2790
  closure->clear_skip_on_incompatible_target();
2791
}
2792
 
2793
// Called by the bison parser to add an assertion.
2794
 
2795
extern "C" void
2796
script_add_assertion(void* closurev, Expression* check, const char* message,
2797
                     size_t messagelen)
2798
{
2799
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2800
  closure->script_options()->add_assertion(check, message, messagelen);
2801
  closure->clear_skip_on_incompatible_target();
2802
}
2803
 
2804
// Called by the bison parser to parse an OPTION.
2805
 
2806
extern "C" void
2807
script_parse_option(void* closurev, const char* option, size_t length)
2808
{
2809
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2810
  // We treat the option as a single command-line option, even if
2811
  // it has internal whitespace.
2812
  if (closure->command_line() == NULL)
2813
    {
2814
      // There are some options that we could handle here--e.g.,
2815
      // -lLIBRARY.  Should we bother?
2816
      gold_warning(_("%s:%d:%d: ignoring command OPTION; OPTION is only valid"
2817
                     " for scripts specified via -T/--script"),
2818
                   closure->filename(), closure->lineno(), closure->charpos());
2819
    }
2820
  else
2821
    {
2822
      bool past_a_double_dash_option = false;
2823
      const char* mutable_option = strndup(option, length);
2824
      gold_assert(mutable_option != NULL);
2825
      closure->command_line()->process_one_option(1, &mutable_option, 0,
2826
                                                  &past_a_double_dash_option);
2827
      // The General_options class will quite possibly store a pointer
2828
      // into mutable_option, so we can't free it.  In cases the class
2829
      // does not store such a pointer, this is a memory leak.  Alas. :(
2830
    }
2831
  closure->clear_skip_on_incompatible_target();
2832
}
2833
 
2834
// Called by the bison parser to handle OUTPUT_FORMAT.  OUTPUT_FORMAT
2835
// takes either one or three arguments.  In the three argument case,
2836
// the format depends on the endianness option, which we don't
2837
// currently support (FIXME).  If we see an OUTPUT_FORMAT for the
2838
// wrong format, then we want to search for a new file.  Returning 0
2839
// here will cause the parser to immediately abort.
2840
 
2841
extern "C" int
2842
script_check_output_format(void* closurev,
2843
                           const char* default_name, size_t default_length,
2844
                           const char*, size_t, const char*, size_t)
2845
{
2846
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2847
  std::string name(default_name, default_length);
2848 159 khays
  Target* target = select_target_by_bfd_name(name.c_str());
2849 27 khays
  if (target == NULL || !parameters->is_compatible_target(target))
2850
    {
2851
      if (closure->skip_on_incompatible_target())
2852
        {
2853
          closure->set_found_incompatible_target();
2854
          return 0;
2855
        }
2856
      // FIXME: Should we warn about the unknown target?
2857
    }
2858
  return 1;
2859
}
2860
 
2861
// Called by the bison parser to handle TARGET.
2862
 
2863
extern "C" void
2864
script_set_target(void* closurev, const char* target, size_t len)
2865
{
2866
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2867
  std::string s(target, len);
2868
  General_options::Object_format format_enum;
2869
  format_enum = General_options::string_to_object_format(s.c_str());
2870
  closure->position_dependent_options().set_format_enum(format_enum);
2871
}
2872
 
2873
// Called by the bison parser to handle SEARCH_DIR.  This is handled
2874
// exactly like a -L option.
2875
 
2876
extern "C" void
2877
script_add_search_dir(void* closurev, const char* option, size_t length)
2878
{
2879
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2880
  if (closure->command_line() == NULL)
2881
    gold_warning(_("%s:%d:%d: ignoring SEARCH_DIR; SEARCH_DIR is only valid"
2882
                   " for scripts specified via -T/--script"),
2883
                 closure->filename(), closure->lineno(), closure->charpos());
2884
  else if (!closure->command_line()->options().nostdlib())
2885
    {
2886
      std::string s = "-L" + std::string(option, length);
2887
      script_parse_option(closurev, s.c_str(), s.size());
2888
    }
2889
}
2890
 
2891
/* Called by the bison parser to push the lexer into expression
2892
   mode.  */
2893
 
2894
extern "C" void
2895
script_push_lex_into_expression_mode(void* closurev)
2896
{
2897
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2898
  closure->push_lex_mode(Lex::EXPRESSION);
2899
}
2900
 
2901
/* Called by the bison parser to push the lexer into version
2902
   mode.  */
2903
 
2904
extern "C" void
2905
script_push_lex_into_version_mode(void* closurev)
2906
{
2907
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2908
  if (closure->version_script()->is_finalized())
2909
    gold_error(_("%s:%d:%d: invalid use of VERSION in input file"),
2910
               closure->filename(), closure->lineno(), closure->charpos());
2911
  closure->push_lex_mode(Lex::VERSION_SCRIPT);
2912
}
2913
 
2914
/* Called by the bison parser to pop the lexer mode.  */
2915
 
2916
extern "C" void
2917
script_pop_lex_mode(void* closurev)
2918
{
2919
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2920
  closure->pop_lex_mode();
2921
}
2922
 
2923
// Register an entire version node. For example:
2924
//
2925
// GLIBC_2.1 {
2926
//   global: foo;
2927
// } GLIBC_2.0;
2928
//
2929
// - tag is "GLIBC_2.1"
2930
// - tree contains the information "global: foo"
2931
// - deps contains "GLIBC_2.0"
2932
 
2933
extern "C" void
2934
script_register_vers_node(void*,
2935
                          const char* tag,
2936
                          int taglen,
2937
                          struct Version_tree* tree,
2938
                          struct Version_dependency_list* deps)
2939
{
2940
  gold_assert(tree != NULL);
2941
  tree->dependencies = deps;
2942
  if (tag != NULL)
2943
    tree->tag = std::string(tag, taglen);
2944
}
2945
 
2946
// Add a dependencies to the list of existing dependencies, if any,
2947
// and return the expanded list.
2948
 
2949
extern "C" struct Version_dependency_list*
2950
script_add_vers_depend(void* closurev,
2951
                       struct Version_dependency_list* all_deps,
2952
                       const char* depend_to_add, int deplen)
2953
{
2954
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2955
  if (all_deps == NULL)
2956
    all_deps = closure->version_script()->allocate_dependency_list();
2957
  all_deps->dependencies.push_back(std::string(depend_to_add, deplen));
2958
  return all_deps;
2959
}
2960
 
2961
// Add a pattern expression to an existing list of expressions, if any.
2962
 
2963
extern "C" struct Version_expression_list*
2964
script_new_vers_pattern(void* closurev,
2965
                        struct Version_expression_list* expressions,
2966
                        const char* pattern, int patlen, int exact_match)
2967
{
2968
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2969
  if (expressions == NULL)
2970
    expressions = closure->version_script()->allocate_expression_list();
2971
  expressions->expressions.push_back(
2972
      Version_expression(std::string(pattern, patlen),
2973
                         closure->get_current_language(),
2974
                         static_cast<bool>(exact_match)));
2975
  return expressions;
2976
}
2977
 
2978
// Attaches b to the end of a, and clears b.  So a = a + b and b = {}.
2979
 
2980
extern "C" struct Version_expression_list*
2981
script_merge_expressions(struct Version_expression_list* a,
2982
                         struct Version_expression_list* b)
2983
{
2984
  a->expressions.insert(a->expressions.end(),
2985
                        b->expressions.begin(), b->expressions.end());
2986
  // We could delete b and remove it from expressions_lists_, but
2987
  // that's a lot of work.  This works just as well.
2988
  b->expressions.clear();
2989
  return a;
2990
}
2991
 
2992
// Combine the global and local expressions into a a Version_tree.
2993
 
2994
extern "C" struct Version_tree*
2995
script_new_vers_node(void* closurev,
2996
                     struct Version_expression_list* global,
2997
                     struct Version_expression_list* local)
2998
{
2999
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3000
  Version_tree* tree = closure->version_script()->allocate_version_tree();
3001
  tree->global = global;
3002
  tree->local = local;
3003
  return tree;
3004
}
3005
 
3006
// Handle a transition in language, such as at the
3007
// start or end of 'extern "C++"'
3008
 
3009
extern "C" void
3010
version_script_push_lang(void* closurev, const char* lang, int langlen)
3011
{
3012
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3013
  std::string language(lang, langlen);
3014
  Version_script_info::Language code;
3015
  if (language.empty() || language == "C")
3016
    code = Version_script_info::LANGUAGE_C;
3017
  else if (language == "C++")
3018
    code = Version_script_info::LANGUAGE_CXX;
3019
  else if (language == "Java")
3020
    code = Version_script_info::LANGUAGE_JAVA;
3021
  else
3022
    {
3023
      char* buf = new char[langlen + 100];
3024
      snprintf(buf, langlen + 100,
3025
               _("unrecognized version script language '%s'"),
3026
               language.c_str());
3027
      yyerror(closurev, buf);
3028
      delete[] buf;
3029
      code = Version_script_info::LANGUAGE_C;
3030
    }
3031
  closure->push_language(code);
3032
}
3033
 
3034
extern "C" void
3035
version_script_pop_lang(void* closurev)
3036
{
3037
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3038
  closure->pop_language();
3039
}
3040
 
3041
// Called by the bison parser to start a SECTIONS clause.
3042
 
3043
extern "C" void
3044
script_start_sections(void* closurev)
3045
{
3046
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3047
  closure->script_options()->script_sections()->start_sections();
3048
  closure->clear_skip_on_incompatible_target();
3049
}
3050
 
3051
// Called by the bison parser to finish a SECTIONS clause.
3052
 
3053
extern "C" void
3054
script_finish_sections(void* closurev)
3055
{
3056
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3057
  closure->script_options()->script_sections()->finish_sections();
3058
}
3059
 
3060
// Start processing entries for an output section.
3061
 
3062
extern "C" void
3063
script_start_output_section(void* closurev, const char* name, size_t namelen,
3064
                            const struct Parser_output_section_header* header)
3065
{
3066
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3067
  closure->script_options()->script_sections()->start_output_section(name,
3068
                                                                     namelen,
3069
                                                                     header);
3070
}
3071
 
3072
// Finish processing entries for an output section.
3073
 
3074
extern "C" void
3075
script_finish_output_section(void* closurev,
3076
                             const struct Parser_output_section_trailer* trail)
3077
{
3078
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3079
  closure->script_options()->script_sections()->finish_output_section(trail);
3080
}
3081
 
3082
// Add a data item (e.g., "WORD (0)") to the current output section.
3083
 
3084
extern "C" void
3085
script_add_data(void* closurev, int data_token, Expression* val)
3086
{
3087
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3088
  int size;
3089
  bool is_signed = true;
3090
  switch (data_token)
3091
    {
3092
    case QUAD:
3093
      size = 8;
3094
      is_signed = false;
3095
      break;
3096
    case SQUAD:
3097
      size = 8;
3098
      break;
3099
    case LONG:
3100
      size = 4;
3101
      break;
3102
    case SHORT:
3103
      size = 2;
3104
      break;
3105
    case BYTE:
3106
      size = 1;
3107
      break;
3108
    default:
3109
      gold_unreachable();
3110
    }
3111
  closure->script_options()->script_sections()->add_data(size, is_signed, val);
3112
}
3113
 
3114
// Add a clause setting the fill value to the current output section.
3115
 
3116
extern "C" void
3117
script_add_fill(void* closurev, Expression* val)
3118
{
3119
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3120
  closure->script_options()->script_sections()->add_fill(val);
3121
}
3122
 
3123
// Add a new input section specification to the current output
3124
// section.
3125
 
3126
extern "C" void
3127
script_add_input_section(void* closurev,
3128
                         const struct Input_section_spec* spec,
3129
                         int keepi)
3130
{
3131
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3132
  bool keep = keepi != 0;
3133
  closure->script_options()->script_sections()->add_input_section(spec, keep);
3134
}
3135
 
3136
// When we see DATA_SEGMENT_ALIGN we record that following output
3137
// sections may be relro.
3138
 
3139
extern "C" void
3140
script_data_segment_align(void* closurev)
3141
{
3142
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3143
  if (!closure->script_options()->saw_sections_clause())
3144
    gold_error(_("%s:%d:%d: DATA_SEGMENT_ALIGN not in SECTIONS clause"),
3145
               closure->filename(), closure->lineno(), closure->charpos());
3146
  else
3147
    closure->script_options()->script_sections()->data_segment_align();
3148
}
3149
 
3150
// When we see DATA_SEGMENT_RELRO_END we know that all output sections
3151
// since DATA_SEGMENT_ALIGN should be relro.
3152
 
3153
extern "C" void
3154
script_data_segment_relro_end(void* closurev)
3155
{
3156
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3157
  if (!closure->script_options()->saw_sections_clause())
3158
    gold_error(_("%s:%d:%d: DATA_SEGMENT_ALIGN not in SECTIONS clause"),
3159
               closure->filename(), closure->lineno(), closure->charpos());
3160
  else
3161
    closure->script_options()->script_sections()->data_segment_relro_end();
3162
}
3163
 
3164
// Create a new list of string/sort pairs.
3165
 
3166
extern "C" String_sort_list_ptr
3167
script_new_string_sort_list(const struct Wildcard_section* string_sort)
3168
{
3169
  return new String_sort_list(1, *string_sort);
3170
}
3171
 
3172
// Add an entry to a list of string/sort pairs.  The way the parser
3173
// works permits us to simply modify the first parameter, rather than
3174
// copy the vector.
3175
 
3176
extern "C" String_sort_list_ptr
3177
script_string_sort_list_add(String_sort_list_ptr pv,
3178
                            const struct Wildcard_section* string_sort)
3179
{
3180
  if (pv == NULL)
3181
    return script_new_string_sort_list(string_sort);
3182
  else
3183
    {
3184
      pv->push_back(*string_sort);
3185
      return pv;
3186
    }
3187
}
3188
 
3189
// Create a new list of strings.
3190
 
3191
extern "C" String_list_ptr
3192
script_new_string_list(const char* str, size_t len)
3193
{
3194
  return new String_list(1, std::string(str, len));
3195
}
3196
 
3197
// Add an element to a list of strings.  The way the parser works
3198
// permits us to simply modify the first parameter, rather than copy
3199
// the vector.
3200
 
3201
extern "C" String_list_ptr
3202
script_string_list_push_back(String_list_ptr pv, const char* str, size_t len)
3203
{
3204
  if (pv == NULL)
3205
    return script_new_string_list(str, len);
3206
  else
3207
    {
3208
      pv->push_back(std::string(str, len));
3209
      return pv;
3210
    }
3211
}
3212
 
3213
// Concatenate two string lists.  Either or both may be NULL.  The way
3214
// the parser works permits us to modify the parameters, rather than
3215
// copy the vector.
3216
 
3217
extern "C" String_list_ptr
3218
script_string_list_append(String_list_ptr pv1, String_list_ptr pv2)
3219
{
3220
  if (pv1 == NULL)
3221
    return pv2;
3222
  if (pv2 == NULL)
3223
    return pv1;
3224
  pv1->insert(pv1->end(), pv2->begin(), pv2->end());
3225
  return pv1;
3226
}
3227
 
3228
// Add a new program header.
3229
 
3230
extern "C" void
3231
script_add_phdr(void* closurev, const char* name, size_t namelen,
3232
                unsigned int type, const Phdr_info* info)
3233
{
3234
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3235
  bool includes_filehdr = info->includes_filehdr != 0;
3236
  bool includes_phdrs = info->includes_phdrs != 0;
3237
  bool is_flags_valid = info->is_flags_valid != 0;
3238
  Script_sections* ss = closure->script_options()->script_sections();
3239
  ss->add_phdr(name, namelen, type, includes_filehdr, includes_phdrs,
3240
               is_flags_valid, info->flags, info->load_address);
3241
  closure->clear_skip_on_incompatible_target();
3242
}
3243
 
3244
// Convert a program header string to a type.
3245
 
3246
#define PHDR_TYPE(NAME) { #NAME, sizeof(#NAME) - 1, elfcpp::NAME }
3247
 
3248
static struct
3249
{
3250
  const char* name;
3251
  size_t namelen;
3252
  unsigned int val;
3253
} phdr_type_names[] =
3254
{
3255
  PHDR_TYPE(PT_NULL),
3256
  PHDR_TYPE(PT_LOAD),
3257
  PHDR_TYPE(PT_DYNAMIC),
3258
  PHDR_TYPE(PT_INTERP),
3259
  PHDR_TYPE(PT_NOTE),
3260
  PHDR_TYPE(PT_SHLIB),
3261
  PHDR_TYPE(PT_PHDR),
3262
  PHDR_TYPE(PT_TLS),
3263
  PHDR_TYPE(PT_GNU_EH_FRAME),
3264
  PHDR_TYPE(PT_GNU_STACK),
3265
  PHDR_TYPE(PT_GNU_RELRO)
3266
};
3267
 
3268
extern "C" unsigned int
3269
script_phdr_string_to_type(void* closurev, const char* name, size_t namelen)
3270
{
3271
  for (unsigned int i = 0;
3272
       i < sizeof(phdr_type_names) / sizeof(phdr_type_names[0]);
3273
       ++i)
3274
    if (namelen == phdr_type_names[i].namelen
3275
        && strncmp(name, phdr_type_names[i].name, namelen) == 0)
3276
      return phdr_type_names[i].val;
3277
  yyerror(closurev, _("unknown PHDR type (try integer)"));
3278
  return elfcpp::PT_NULL;
3279
}
3280
 
3281
extern "C" void
3282
script_saw_segment_start_expression(void* closurev)
3283
{
3284
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3285
  Script_sections* ss = closure->script_options()->script_sections();
3286
  ss->set_saw_segment_start_expression(true);
3287
}
3288
 
3289
extern "C" void
3290
script_set_section_region(void* closurev, const char* name, size_t namelen,
3291
                          int set_vma)
3292
{
3293
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3294
  if (!closure->script_options()->saw_sections_clause())
3295
    {
3296
      gold_error(_("%s:%d:%d: MEMORY region '%.*s' referred to outside of "
3297
                   "SECTIONS clause"),
3298
                 closure->filename(), closure->lineno(), closure->charpos(),
3299
                 static_cast<int>(namelen), name);
3300
      return;
3301
    }
3302
 
3303
  Script_sections* ss = closure->script_options()->script_sections();
3304
  Memory_region* mr = ss->find_memory_region(name, namelen);
3305
  if (mr == NULL)
3306
    {
3307
      gold_error(_("%s:%d:%d: MEMORY region '%.*s' not declared"),
3308
                 closure->filename(), closure->lineno(), closure->charpos(),
3309
                 static_cast<int>(namelen), name);
3310
      return;
3311
    }
3312
 
3313
  ss->set_memory_region(mr, set_vma);
3314
}
3315
 
3316
extern "C" void
3317
script_add_memory(void* closurev, const char* name, size_t namelen,
3318
                  unsigned int attrs, Expression* origin, Expression* length)
3319
{
3320
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3321
  Script_sections* ss = closure->script_options()->script_sections();
3322
  ss->add_memory_region(name, namelen, attrs, origin, length);
3323
}
3324
 
3325
extern "C" unsigned int
3326
script_parse_memory_attr(void* closurev, const char* attrs, size_t attrlen,
3327
                         int invert)
3328
{
3329
  int attributes = 0;
3330
 
3331
  while (attrlen--)
3332
    switch (*attrs++)
3333
      {
3334
      case 'R':
3335
      case 'r':
3336
        attributes |= MEM_READABLE; break;
3337
      case 'W':
3338
      case 'w':
3339
        attributes |= MEM_READABLE | MEM_WRITEABLE; break;
3340
      case 'X':
3341
      case 'x':
3342
        attributes |= MEM_EXECUTABLE; break;
3343
      case 'A':
3344
      case 'a':
3345
        attributes |= MEM_ALLOCATABLE; break;
3346
      case 'I':
3347
      case 'i':
3348
      case 'L':
3349
      case 'l':
3350
        attributes |= MEM_INITIALIZED; break;
3351
      default:
3352
        yyerror(closurev, _("unknown MEMORY attribute"));
3353
      }
3354
 
3355
  if (invert)
3356
    attributes = (~ attributes) & MEM_ATTR_MASK;
3357
 
3358
  return attributes;
3359
}
3360
 
3361
extern "C" void
3362 166 khays
script_include_directive(void* closurev, const char* filename, size_t length)
3363 27 khays
{
3364 166 khays
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3365
  std::string name(filename, length);
3366
  Command_line* cmdline = closure->command_line();
3367
  read_script_file(name.c_str(), cmdline, &cmdline->script_options(),
3368
                   PARSING_LINKER_SCRIPT, Lex::LINKER_SCRIPT);
3369 27 khays
}
3370
 
3371
// Functions for memory regions.
3372
 
3373
extern "C" Expression*
3374
script_exp_function_origin(void* closurev, const char* name, size_t namelen)
3375
{
3376
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3377
  Script_sections* ss = closure->script_options()->script_sections();
3378
  Expression* origin = ss->find_memory_region_origin(name, namelen);
3379
 
3380
  if (origin == NULL)
3381
    {
3382
      gold_error(_("undefined memory region '%s' referenced "
3383
                   "in ORIGIN expression"),
3384
                 name);
3385
      // Create a dummy expression to prevent crashes later on.
3386
      origin = script_exp_integer(0);
3387
    }
3388
 
3389
  return origin;
3390
}
3391
 
3392
extern "C" Expression*
3393
script_exp_function_length(void* closurev, const char* name, size_t namelen)
3394
{
3395
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3396
  Script_sections* ss = closure->script_options()->script_sections();
3397
  Expression* length = ss->find_memory_region_length(name, namelen);
3398
 
3399
  if (length == NULL)
3400
    {
3401
      gold_error(_("undefined memory region '%s' referenced "
3402
                   "in LENGTH expression"),
3403
                 name);
3404
      // Create a dummy expression to prevent crashes later on.
3405
      length = script_exp_integer(0);
3406
    }
3407
 
3408
  return length;
3409
}

powered by: WebSVN 2.1.0

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