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 163

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
// Helper function for read_version_script() and
1539
// read_commandline_script().  Processes the given file in the mode
1540
// indicated by first_token and lex_mode.
1541
 
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
  // TODO: if filename is a relative filename, search for it manually
1548
  // using "." + cmdline->options()->search_path() -- not dirsearch.
1549
  Dirsearch dirsearch;
1550
 
1551
  // The file locking code wants to record a Task, but we haven't
1552
  // started the workqueue yet.  This is only for debugging purposes,
1553
  // so we invent a fake value.
1554
  const Task* task = reinterpret_cast<const Task*>(-1);
1555
 
1556
  // We don't want this file to be opened in binary mode.
1557
  Position_dependent_options posdep = cmdline->position_dependent_options();
1558
  if (posdep.format_enum() == General_options::OBJECT_FORMAT_BINARY)
1559
    posdep.set_format_enum(General_options::OBJECT_FORMAT_ELF);
1560
  Input_file_argument input_argument(filename,
1561
                                     Input_file_argument::INPUT_FILE_TYPE_FILE,
1562
                                     "", false, posdep);
1563
  Input_file input_file(&input_argument);
1564
  int dummy = 0;
1565
  if (!input_file.open(dirsearch, task, &dummy))
1566
    return false;
1567
 
1568
  std::string input_string;
1569
  Lex::read_file(&input_file, &input_string);
1570
 
1571
  Lex lex(input_string.c_str(), input_string.length(), first_token);
1572
  lex.set_mode(lex_mode);
1573
 
1574
  Parser_closure closure(filename,
1575
                         cmdline->position_dependent_options(),
1576
                         first_token == Lex::DYNAMIC_LIST,
1577
                         false,
1578
                         input_file.is_in_sysroot(),
1579
                         cmdline,
1580
                         script_options,
1581
                         &lex,
1582
                         false,
1583
                         NULL);
1584
  if (yyparse(&closure) != 0)
1585
    {
1586
      input_file.file().unlock(task);
1587
      return false;
1588
    }
1589
 
1590
  input_file.file().unlock(task);
1591
 
1592
  gold_assert(!closure.saw_inputs());
1593
 
1594
  return true;
1595
}
1596
 
1597
// FILENAME was found as an argument to --script (-T).
1598
// Read it as a script, and execute its contents immediately.
1599
 
1600
bool
1601
read_commandline_script(const char* filename, Command_line* cmdline)
1602
{
1603
  return read_script_file(filename, cmdline, &cmdline->script_options(),
1604
                          PARSING_LINKER_SCRIPT, Lex::LINKER_SCRIPT);
1605
}
1606
 
1607
// FILENAME was found as an argument to --version-script.  Read it as
1608
// a version script, and store its contents in
1609
// cmdline->script_options()->version_script_info().
1610
 
1611
bool
1612
read_version_script(const char* filename, Command_line* cmdline)
1613
{
1614
  return read_script_file(filename, cmdline, &cmdline->script_options(),
1615
                          PARSING_VERSION_SCRIPT, Lex::VERSION_SCRIPT);
1616
}
1617
 
1618
// FILENAME was found as an argument to --dynamic-list.  Read it as a
1619
// list of symbols, and store its contents in DYNAMIC_LIST.
1620
 
1621
bool
1622
read_dynamic_list(const char* filename, Command_line* cmdline,
1623
                  Script_options* dynamic_list)
1624
{
1625
  return read_script_file(filename, cmdline, dynamic_list,
1626
                          PARSING_DYNAMIC_LIST, Lex::DYNAMIC_LIST);
1627
}
1628
 
1629
// Implement the --defsym option on the command line.  Return true if
1630
// all is well.
1631
 
1632
bool
1633
Script_options::define_symbol(const char* definition)
1634
{
1635
  Lex lex(definition, strlen(definition), PARSING_DEFSYM);
1636
  lex.set_mode(Lex::EXPRESSION);
1637
 
1638
  // Dummy value.
1639
  Position_dependent_options posdep_options;
1640
 
1641
  Parser_closure closure("command line", posdep_options, true,
1642
                         false, false, NULL, this, &lex, false, NULL);
1643
 
1644
  if (yyparse(&closure) != 0)
1645
    return false;
1646
 
1647
  gold_assert(!closure.saw_inputs());
1648
 
1649
  return true;
1650
}
1651
 
1652
// Print the script to F for debugging.
1653
 
1654
void
1655
Script_options::print(FILE* f) const
1656
{
1657
  fprintf(f, "%s: Dumping linker script\n", program_name);
1658
 
1659
  if (!this->entry_.empty())
1660
    fprintf(f, "ENTRY(%s)\n", this->entry_.c_str());
1661
 
1662
  for (Symbol_assignments::const_iterator p =
1663
         this->symbol_assignments_.begin();
1664
       p != this->symbol_assignments_.end();
1665
       ++p)
1666
    (*p)->print(f);
1667
 
1668
  for (Assertions::const_iterator p = this->assertions_.begin();
1669
       p != this->assertions_.end();
1670
       ++p)
1671
    (*p)->print(f);
1672
 
1673
  this->script_sections_.print(f);
1674
 
1675
  this->version_script_info_.print(f);
1676
}
1677
 
1678
// Manage mapping from keywords to the codes expected by the bison
1679
// parser.  We construct one global object for each lex mode with
1680
// keywords.
1681
 
1682
class Keyword_to_parsecode
1683
{
1684
 public:
1685
  // The structure which maps keywords to parsecodes.
1686
  struct Keyword_parsecode
1687
  {
1688
    // Keyword.
1689
    const char* keyword;
1690
    // Corresponding parsecode.
1691
    int parsecode;
1692
  };
1693
 
1694
  Keyword_to_parsecode(const Keyword_parsecode* keywords,
1695
                       int keyword_count)
1696
      : keyword_parsecodes_(keywords), keyword_count_(keyword_count)
1697
  { }
1698
 
1699
  // Return the parsecode corresponding KEYWORD, or 0 if it is not a
1700
  // keyword.
1701
  int
1702
  keyword_to_parsecode(const char* keyword, size_t len) const;
1703
 
1704
 private:
1705
  const Keyword_parsecode* keyword_parsecodes_;
1706
  const int keyword_count_;
1707
};
1708
 
1709
// Mapping from keyword string to keyword parsecode.  This array must
1710
// be kept in sorted order.  Parsecodes are looked up using bsearch.
1711
// This array must correspond to the list of parsecodes in yyscript.y.
1712
 
1713
static const Keyword_to_parsecode::Keyword_parsecode
1714
script_keyword_parsecodes[] =
1715
{
1716
  { "ABSOLUTE", ABSOLUTE },
1717
  { "ADDR", ADDR },
1718
  { "ALIGN", ALIGN_K },
1719
  { "ALIGNOF", ALIGNOF },
1720
  { "ASSERT", ASSERT_K },
1721
  { "AS_NEEDED", AS_NEEDED },
1722
  { "AT", AT },
1723
  { "BIND", BIND },
1724
  { "BLOCK", BLOCK },
1725
  { "BYTE", BYTE },
1726
  { "CONSTANT", CONSTANT },
1727
  { "CONSTRUCTORS", CONSTRUCTORS },
1728
  { "COPY", COPY },
1729
  { "CREATE_OBJECT_SYMBOLS", CREATE_OBJECT_SYMBOLS },
1730
  { "DATA_SEGMENT_ALIGN", DATA_SEGMENT_ALIGN },
1731
  { "DATA_SEGMENT_END", DATA_SEGMENT_END },
1732
  { "DATA_SEGMENT_RELRO_END", DATA_SEGMENT_RELRO_END },
1733
  { "DEFINED", DEFINED },
1734
  { "DSECT", DSECT },
1735
  { "ENTRY", ENTRY },
1736
  { "EXCLUDE_FILE", EXCLUDE_FILE },
1737
  { "EXTERN", EXTERN },
1738
  { "FILL", FILL },
1739
  { "FLOAT", FLOAT },
1740
  { "FORCE_COMMON_ALLOCATION", FORCE_COMMON_ALLOCATION },
1741
  { "GROUP", GROUP },
1742
  { "HLL", HLL },
1743
  { "INCLUDE", INCLUDE },
1744
  { "INFO", INFO },
1745
  { "INHIBIT_COMMON_ALLOCATION", INHIBIT_COMMON_ALLOCATION },
1746
  { "INPUT", INPUT },
1747
  { "KEEP", KEEP },
1748
  { "LENGTH", LENGTH },
1749
  { "LOADADDR", LOADADDR },
1750
  { "LONG", LONG },
1751
  { "MAP", MAP },
1752
  { "MAX", MAX_K },
1753
  { "MEMORY", MEMORY },
1754
  { "MIN", MIN_K },
1755
  { "NEXT", NEXT },
1756
  { "NOCROSSREFS", NOCROSSREFS },
1757
  { "NOFLOAT", NOFLOAT },
1758
  { "NOLOAD", NOLOAD },
1759
  { "ONLY_IF_RO", ONLY_IF_RO },
1760
  { "ONLY_IF_RW", ONLY_IF_RW },
1761
  { "OPTION", OPTION },
1762
  { "ORIGIN", ORIGIN },
1763
  { "OUTPUT", OUTPUT },
1764
  { "OUTPUT_ARCH", OUTPUT_ARCH },
1765
  { "OUTPUT_FORMAT", OUTPUT_FORMAT },
1766
  { "OVERLAY", OVERLAY },
1767
  { "PHDRS", PHDRS },
1768
  { "PROVIDE", PROVIDE },
1769
  { "PROVIDE_HIDDEN", PROVIDE_HIDDEN },
1770
  { "QUAD", QUAD },
1771
  { "SEARCH_DIR", SEARCH_DIR },
1772
  { "SECTIONS", SECTIONS },
1773
  { "SEGMENT_START", SEGMENT_START },
1774
  { "SHORT", SHORT },
1775
  { "SIZEOF", SIZEOF },
1776
  { "SIZEOF_HEADERS", SIZEOF_HEADERS },
1777
  { "SORT", SORT_BY_NAME },
1778
  { "SORT_BY_ALIGNMENT", SORT_BY_ALIGNMENT },
1779
  { "SORT_BY_NAME", SORT_BY_NAME },
1780
  { "SPECIAL", SPECIAL },
1781
  { "SQUAD", SQUAD },
1782
  { "STARTUP", STARTUP },
1783
  { "SUBALIGN", SUBALIGN },
1784
  { "SYSLIB", SYSLIB },
1785
  { "TARGET", TARGET_K },
1786
  { "TRUNCATE", TRUNCATE },
1787
  { "VERSION", VERSIONK },
1788
  { "global", GLOBAL },
1789
  { "l", LENGTH },
1790
  { "len", LENGTH },
1791
  { "local", LOCAL },
1792
  { "o", ORIGIN },
1793
  { "org", ORIGIN },
1794
  { "sizeof_headers", SIZEOF_HEADERS },
1795
};
1796
 
1797
static const Keyword_to_parsecode
1798
script_keywords(&script_keyword_parsecodes[0],
1799
                (sizeof(script_keyword_parsecodes)
1800
                 / sizeof(script_keyword_parsecodes[0])));
1801
 
1802
static const Keyword_to_parsecode::Keyword_parsecode
1803
version_script_keyword_parsecodes[] =
1804
{
1805
  { "extern", EXTERN },
1806
  { "global", GLOBAL },
1807
  { "local", LOCAL },
1808
};
1809
 
1810
static const Keyword_to_parsecode
1811
version_script_keywords(&version_script_keyword_parsecodes[0],
1812
                        (sizeof(version_script_keyword_parsecodes)
1813
                         / sizeof(version_script_keyword_parsecodes[0])));
1814
 
1815
static const Keyword_to_parsecode::Keyword_parsecode
1816
dynamic_list_keyword_parsecodes[] =
1817
{
1818
  { "extern", EXTERN },
1819
};
1820
 
1821
static const Keyword_to_parsecode
1822
dynamic_list_keywords(&dynamic_list_keyword_parsecodes[0],
1823
                      (sizeof(dynamic_list_keyword_parsecodes)
1824
                       / sizeof(dynamic_list_keyword_parsecodes[0])));
1825
 
1826
 
1827
 
1828
// Comparison function passed to bsearch.
1829
 
1830
extern "C"
1831
{
1832
 
1833
struct Ktt_key
1834
{
1835
  const char* str;
1836
  size_t len;
1837
};
1838
 
1839
static int
1840
ktt_compare(const void* keyv, const void* kttv)
1841
{
1842
  const Ktt_key* key = static_cast<const Ktt_key*>(keyv);
1843
  const Keyword_to_parsecode::Keyword_parsecode* ktt =
1844
    static_cast<const Keyword_to_parsecode::Keyword_parsecode*>(kttv);
1845
  int i = strncmp(key->str, ktt->keyword, key->len);
1846
  if (i != 0)
1847
    return i;
1848
  if (ktt->keyword[key->len] != '\0')
1849
    return -1;
1850
  return 0;
1851
}
1852
 
1853
} // End extern "C".
1854
 
1855
int
1856
Keyword_to_parsecode::keyword_to_parsecode(const char* keyword,
1857
                                           size_t len) const
1858
{
1859
  Ktt_key key;
1860
  key.str = keyword;
1861
  key.len = len;
1862
  void* kttv = bsearch(&key,
1863
                       this->keyword_parsecodes_,
1864
                       this->keyword_count_,
1865
                       sizeof(this->keyword_parsecodes_[0]),
1866
                       ktt_compare);
1867
  if (kttv == NULL)
1868
    return 0;
1869
  Keyword_parsecode* ktt = static_cast<Keyword_parsecode*>(kttv);
1870
  return ktt->parsecode;
1871
}
1872
 
1873
// The following structs are used within the VersionInfo class as well
1874
// as in the bison helper functions.  They store the information
1875
// parsed from the version script.
1876
 
1877
// A single version expression.
1878
// For example, pattern="std::map*" and language="C++".
1879
struct Version_expression
1880
{
1881
  Version_expression(const std::string& a_pattern,
1882
                     Version_script_info::Language a_language,
1883
                     bool a_exact_match)
1884
    : pattern(a_pattern), language(a_language), exact_match(a_exact_match),
1885
      was_matched_by_symbol(false)
1886
  { }
1887
 
1888
  std::string pattern;
1889
  Version_script_info::Language language;
1890
  // If false, we use glob() to match pattern.  If true, we use strcmp().
1891
  bool exact_match;
1892
  // True if --no-undefined-version is in effect and we found this
1893
  // version in get_symbol_version.  We use mutable because this
1894
  // struct is generally not modifiable after it has been created.
1895
  mutable bool was_matched_by_symbol;
1896
};
1897
 
1898
// A list of expressions.
1899
struct Version_expression_list
1900
{
1901
  std::vector<struct Version_expression> expressions;
1902
};
1903
 
1904
// A list of which versions upon which another version depends.
1905
// Strings should be from the Stringpool.
1906
struct Version_dependency_list
1907
{
1908
  std::vector<std::string> dependencies;
1909
};
1910
 
1911
// The total definition of a version.  It includes the tag for the
1912
// version, its global and local expressions, and any dependencies.
1913
struct Version_tree
1914
{
1915
  Version_tree()
1916
      : tag(), global(NULL), local(NULL), dependencies(NULL)
1917
  { }
1918
 
1919
  std::string tag;
1920
  const struct Version_expression_list* global;
1921
  const struct Version_expression_list* local;
1922
  const struct Version_dependency_list* dependencies;
1923
};
1924
 
1925
// Helper class that calls cplus_demangle when needed and takes care of freeing
1926
// the result.
1927
 
1928
class Lazy_demangler
1929
{
1930
 public:
1931
  Lazy_demangler(const char* symbol, int options)
1932
    : symbol_(symbol), options_(options), demangled_(NULL), did_demangle_(false)
1933
  { }
1934
 
1935
  ~Lazy_demangler()
1936
  { free(this->demangled_); }
1937
 
1938
  // Return the demangled name. The actual demangling happens on the first call,
1939
  // and the result is later cached.
1940
  inline char*
1941
  get();
1942
 
1943
 private:
1944
  // The symbol to demangle.
1945
  const char* symbol_;
1946
  // Option flags to pass to cplus_demagle.
1947
  const int options_;
1948
  // The cached demangled value, or NULL if demangling didn't happen yet or
1949
  // failed.
1950
  char* demangled_;
1951
  // Whether we already called cplus_demangle
1952
  bool did_demangle_;
1953
};
1954
 
1955
// Return the demangled name. The actual demangling happens on the first call,
1956
// and the result is later cached. Returns NULL if the symbol cannot be
1957
// demangled.
1958
 
1959
inline char*
1960
Lazy_demangler::get()
1961
{
1962
  if (!this->did_demangle_)
1963
    {
1964
      this->demangled_ = cplus_demangle(this->symbol_, this->options_);
1965
      this->did_demangle_ = true;
1966
    }
1967
  return this->demangled_;
1968
}
1969
 
1970
// Class Version_script_info.
1971
 
1972
Version_script_info::Version_script_info()
1973
  : dependency_lists_(), expression_lists_(), version_trees_(), globs_(),
1974
    default_version_(NULL), default_is_global_(false), is_finalized_(false)
1975
{
1976
  for (int i = 0; i < LANGUAGE_COUNT; ++i)
1977
    this->exact_[i] = NULL;
1978
}
1979
 
1980
Version_script_info::~Version_script_info()
1981
{
1982
}
1983
 
1984
// Forget all the known version script information.
1985
 
1986
void
1987
Version_script_info::clear()
1988
{
1989
  for (size_t k = 0; k < this->dependency_lists_.size(); ++k)
1990
    delete this->dependency_lists_[k];
1991
  this->dependency_lists_.clear();
1992
  for (size_t k = 0; k < this->version_trees_.size(); ++k)
1993
    delete this->version_trees_[k];
1994
  this->version_trees_.clear();
1995
  for (size_t k = 0; k < this->expression_lists_.size(); ++k)
1996
    delete this->expression_lists_[k];
1997
  this->expression_lists_.clear();
1998
}
1999
 
2000
// Finalize the version script information.
2001
 
2002
void
2003
Version_script_info::finalize()
2004
{
2005
  if (!this->is_finalized_)
2006
    {
2007
      this->build_lookup_tables();
2008
      this->is_finalized_ = true;
2009
    }
2010
}
2011
 
2012
// Return all the versions.
2013
 
2014
std::vector<std::string>
2015
Version_script_info::get_versions() const
2016
{
2017
  std::vector<std::string> ret;
2018
  for (size_t j = 0; j < this->version_trees_.size(); ++j)
2019
    if (!this->version_trees_[j]->tag.empty())
2020
      ret.push_back(this->version_trees_[j]->tag);
2021
  return ret;
2022
}
2023
 
2024
// Return the dependencies of VERSION.
2025
 
2026
std::vector<std::string>
2027
Version_script_info::get_dependencies(const char* version) const
2028
{
2029
  std::vector<std::string> ret;
2030
  for (size_t j = 0; j < this->version_trees_.size(); ++j)
2031
    if (this->version_trees_[j]->tag == version)
2032
      {
2033
        const struct Version_dependency_list* deps =
2034
          this->version_trees_[j]->dependencies;
2035
        if (deps != NULL)
2036
          for (size_t k = 0; k < deps->dependencies.size(); ++k)
2037
            ret.push_back(deps->dependencies[k]);
2038
        return ret;
2039
      }
2040
  return ret;
2041
}
2042
 
2043
// A version script essentially maps a symbol name to a version tag
2044
// and an indication of whether symbol is global or local within that
2045
// version tag.  Each symbol maps to at most one version tag.
2046
// Unfortunately, in practice, version scripts are ambiguous, and list
2047
// symbols multiple times.  Thus, we have to document the matching
2048
// process.
2049
 
2050
// This is a description of what the GNU linker does as of 2010-01-11.
2051
// It walks through the version tags in the order in which they appear
2052
// in the version script.  For each tag, it first walks through the
2053
// global patterns for that tag, then the local patterns.  When
2054
// looking at a single pattern, it first applies any language specific
2055
// demangling as specified for the pattern, and then matches the
2056
// resulting symbol name to the pattern.  If it finds an exact match
2057
// for a literal pattern (a pattern enclosed in quotes or with no
2058
// wildcard characters), then that is the match that it uses.  If
2059
// finds a match with a wildcard pattern, then it saves it and
2060
// continues searching.  Wildcard patterns that are exactly "*" are
2061
// saved separately.
2062
 
2063
// If no exact match with a literal pattern is ever found, then if a
2064
// wildcard match with a global pattern was found it is used,
2065
// otherwise if a wildcard match with a local pattern was found it is
2066
// used.
2067
 
2068
// This is the result:
2069
//   * If there is an exact match, then we use the first tag in the
2070
//     version script where it matches.
2071
//     + If the exact match in that tag is global, it is used.
2072
//     + Otherwise the exact match in that tag is local, and is used.
2073
//   * Otherwise, if there is any match with a global wildcard pattern:
2074
//     + If there is any match with a wildcard pattern which is not
2075
//       "*", then we use the tag in which the *last* such pattern
2076
//       appears.
2077
//     + Otherwise, we matched "*".  If there is no match with a local
2078
//       wildcard pattern which is not "*", then we use the *last*
2079
//       match with a global "*".  Otherwise, continue.
2080
//   * Otherwise, if there is any match with a local wildcard pattern:
2081
//     + If there is any match with a wildcard pattern which is not
2082
//       "*", then we use the tag in which the *last* such pattern
2083
//       appears.
2084
//     + Otherwise, we matched "*", and we use the tag in which the
2085
//       *last* such match occurred.
2086
 
2087
// There is an additional wrinkle.  When the GNU linker finds a symbol
2088
// with a version defined in an object file due to a .symver
2089
// directive, it looks up that symbol name in that version tag.  If it
2090
// finds it, it matches the symbol name against the patterns for that
2091
// version.  If there is no match with a global pattern, but there is
2092
// a match with a local pattern, then the GNU linker marks the symbol
2093
// as local.
2094
 
2095
// We want gold to be generally compatible, but we also want gold to
2096
// be fast.  These are the rules that gold implements:
2097
//   * If there is an exact match for the mangled name, we use it.
2098
//     + If there is more than one exact match, we give a warning, and
2099
//       we use the first tag in the script which matches.
2100
//     + If a symbol has an exact match as both global and local for
2101
//       the same version tag, we give an error.
2102
//   * Otherwise, we look for an extern C++ or an extern Java exact
2103
//     match.  If we find an exact match, we use it.
2104
//     + If there is more than one exact match, we give a warning, and
2105
//       we use the first tag in the script which matches.
2106
//     + If a symbol has an exact match as both global and local for
2107
//       the same version tag, we give an error.
2108
//   * Otherwise, we look through the wildcard patterns, ignoring "*"
2109
//     patterns.  We look through the version tags in reverse order.
2110
//     For each version tag, we look through the global patterns and
2111
//     then the local patterns.  We use the first match we find (i.e.,
2112
//     the last matching version tag in the file).
2113
//   * Otherwise, we use the "*" pattern if there is one.  We give an
2114
//     error if there are multiple "*" patterns.
2115
 
2116
// At least for now, gold does not look up the version tag for a
2117
// symbol version found in an object file to see if it should be
2118
// forced local.  There are other ways to force a symbol to be local,
2119
// and I don't understand why this one is useful.
2120
 
2121
// Build a set of fast lookup tables for a version script.
2122
 
2123
void
2124
Version_script_info::build_lookup_tables()
2125
{
2126
  size_t size = this->version_trees_.size();
2127
  for (size_t j = 0; j < size; ++j)
2128
    {
2129
      const Version_tree* v = this->version_trees_[j];
2130
      this->build_expression_list_lookup(v->local, v, false);
2131
      this->build_expression_list_lookup(v->global, v, true);
2132
    }
2133
}
2134
 
2135
// If a pattern has backlashes but no unquoted wildcard characters,
2136
// then we apply backslash unquoting and look for an exact match.
2137
// Otherwise we treat it as a wildcard pattern.  This function returns
2138
// true for a wildcard pattern.  Otherwise, it does backslash
2139
// unquoting on *PATTERN and returns false.  If this returns true,
2140
// *PATTERN may have been partially unquoted.
2141
 
2142
bool
2143
Version_script_info::unquote(std::string* pattern) const
2144
{
2145
  bool saw_backslash = false;
2146
  size_t len = pattern->length();
2147
  size_t j = 0;
2148
  for (size_t i = 0; i < len; ++i)
2149
    {
2150
      if (saw_backslash)
2151
        saw_backslash = false;
2152
      else
2153
        {
2154
          switch ((*pattern)[i])
2155
            {
2156
            case '?': case '[': case '*':
2157
              return true;
2158
            case '\\':
2159
              saw_backslash = true;
2160
              continue;
2161
            default:
2162
              break;
2163
            }
2164
        }
2165
 
2166
      if (i != j)
2167
        (*pattern)[j] = (*pattern)[i];
2168
      ++j;
2169
    }
2170
  return false;
2171
}
2172
 
2173
// Add an exact match for MATCH to *PE.  The result of the match is
2174
// V/IS_GLOBAL.
2175
 
2176
void
2177
Version_script_info::add_exact_match(const std::string& match,
2178
                                     const Version_tree* v, bool is_global,
2179
                                     const Version_expression* ve,
2180
                                     Exact* pe)
2181
{
2182
  std::pair<Exact::iterator, bool> ins =
2183
    pe->insert(std::make_pair(match, Version_tree_match(v, is_global, ve)));
2184
  if (ins.second)
2185
    {
2186
      // This is the first time we have seen this match.
2187
      return;
2188
    }
2189
 
2190
  Version_tree_match& vtm(ins.first->second);
2191
  if (vtm.real->tag != v->tag)
2192
    {
2193
      // This is an ambiguous match.  We still return the
2194
      // first version that we found in the script, but we
2195
      // record the new version to issue a warning if we
2196
      // wind up looking up this symbol.
2197
      if (vtm.ambiguous == NULL)
2198
        vtm.ambiguous = v;
2199
    }
2200
  else if (is_global != vtm.is_global)
2201
    {
2202
      // We have a match for both the global and local entries for a
2203
      // version tag.  That's got to be wrong.
2204
      gold_error(_("'%s' appears as both a global and a local symbol "
2205
                   "for version '%s' in script"),
2206
                 match.c_str(), v->tag.c_str());
2207
    }
2208
}
2209
 
2210
// Build fast lookup information for EXPLIST and store it in LOOKUP.
2211
// All matches go to V, and IS_GLOBAL is true if they are global
2212
// matches.
2213
 
2214
void
2215
Version_script_info::build_expression_list_lookup(
2216
    const Version_expression_list* explist,
2217
    const Version_tree* v,
2218
    bool is_global)
2219
{
2220
  if (explist == NULL)
2221
    return;
2222
  size_t size = explist->expressions.size();
2223
  for (size_t i = 0; i < size; ++i)
2224
    {
2225
      const Version_expression& exp(explist->expressions[i]);
2226
 
2227
      if (exp.pattern.length() == 1 && exp.pattern[0] == '*')
2228
        {
2229
          if (this->default_version_ != NULL
2230
              && this->default_version_->tag != v->tag)
2231
            gold_warning(_("wildcard match appears in both version '%s' "
2232
                           "and '%s' in script"),
2233
                         this->default_version_->tag.c_str(), v->tag.c_str());
2234
          else if (this->default_version_ != NULL
2235
                   && this->default_is_global_ != is_global)
2236
            gold_error(_("wildcard match appears as both global and local "
2237
                         "in version '%s' in script"),
2238
                       v->tag.c_str());
2239
          this->default_version_ = v;
2240
          this->default_is_global_ = is_global;
2241
          continue;
2242
        }
2243
 
2244
      std::string pattern = exp.pattern;
2245
      if (!exp.exact_match)
2246
        {
2247
          if (this->unquote(&pattern))
2248
            {
2249
              this->globs_.push_back(Glob(&exp, v, is_global));
2250
              continue;
2251
            }
2252
        }
2253
 
2254
      if (this->exact_[exp.language] == NULL)
2255
        this->exact_[exp.language] = new Exact();
2256
      this->add_exact_match(pattern, v, is_global, &exp,
2257
                            this->exact_[exp.language]);
2258
    }
2259
}
2260
 
2261
// Return the name to match given a name, a language code, and two
2262
// lazy demanglers.
2263
 
2264
const char*
2265
Version_script_info::get_name_to_match(const char* name,
2266
                                       int language,
2267
                                       Lazy_demangler* cpp_demangler,
2268
                                       Lazy_demangler* java_demangler) const
2269
{
2270
  switch (language)
2271
    {
2272
    case LANGUAGE_C:
2273
      return name;
2274
    case LANGUAGE_CXX:
2275
      return cpp_demangler->get();
2276
    case LANGUAGE_JAVA:
2277
      return java_demangler->get();
2278
    default:
2279
      gold_unreachable();
2280
    }
2281
}
2282
 
2283
// Look up SYMBOL_NAME in the list of versions.  Return true if the
2284
// symbol is found, false if not.  If the symbol is found, then if
2285
// PVERSION is not NULL, set *PVERSION to the version tag, and if
2286
// P_IS_GLOBAL is not NULL, set *P_IS_GLOBAL according to whether the
2287
// symbol is global or not.
2288
 
2289
bool
2290
Version_script_info::get_symbol_version(const char* symbol_name,
2291
                                        std::string* pversion,
2292
                                        bool* p_is_global) const
2293
{
2294
  Lazy_demangler cpp_demangled_name(symbol_name, DMGL_ANSI | DMGL_PARAMS);
2295
  Lazy_demangler java_demangled_name(symbol_name,
2296
                                     DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA);
2297
 
2298
  gold_assert(this->is_finalized_);
2299
  for (int i = 0; i < LANGUAGE_COUNT; ++i)
2300
    {
2301
      Exact* exact = this->exact_[i];
2302
      if (exact == NULL)
2303
        continue;
2304
 
2305
      const char* name_to_match = this->get_name_to_match(symbol_name, i,
2306
                                                          &cpp_demangled_name,
2307
                                                          &java_demangled_name);
2308
      if (name_to_match == NULL)
2309
        {
2310
          // If the name can not be demangled, the GNU linker goes
2311
          // ahead and tries to match it anyhow.  That does not
2312
          // make sense to me and I have not implemented it.
2313
          continue;
2314
        }
2315
 
2316
      Exact::const_iterator pe = exact->find(name_to_match);
2317
      if (pe != exact->end())
2318
        {
2319
          const Version_tree_match& vtm(pe->second);
2320
          if (vtm.ambiguous != NULL)
2321
            gold_warning(_("using '%s' as version for '%s' which is also "
2322
                           "named in version '%s' in script"),
2323
                         vtm.real->tag.c_str(), name_to_match,
2324
                         vtm.ambiguous->tag.c_str());
2325
 
2326
          if (pversion != NULL)
2327
            *pversion = vtm.real->tag;
2328
          if (p_is_global != NULL)
2329
            *p_is_global = vtm.is_global;
2330
 
2331
          // If we are using --no-undefined-version, and this is a
2332
          // global symbol, we have to record that we have found this
2333
          // symbol, so that we don't warn about it.  We have to do
2334
          // this now, because otherwise we have no way to get from a
2335
          // non-C language back to the demangled name that we
2336
          // matched.
2337
          if (p_is_global != NULL && vtm.is_global)
2338
            vtm.expression->was_matched_by_symbol = true;
2339
 
2340
          return true;
2341
        }
2342
    }
2343
 
2344
  // Look through the glob patterns in reverse order.
2345
 
2346
  for (Globs::const_reverse_iterator p = this->globs_.rbegin();
2347
       p != this->globs_.rend();
2348
       ++p)
2349
    {
2350
      int language = p->expression->language;
2351
      const char* name_to_match = this->get_name_to_match(symbol_name,
2352
                                                          language,
2353
                                                          &cpp_demangled_name,
2354
                                                          &java_demangled_name);
2355
      if (name_to_match == NULL)
2356
        continue;
2357
 
2358
      if (fnmatch(p->expression->pattern.c_str(), name_to_match,
2359
                  FNM_NOESCAPE) == 0)
2360
        {
2361
          if (pversion != NULL)
2362
            *pversion = p->version->tag;
2363
          if (p_is_global != NULL)
2364
            *p_is_global = p->is_global;
2365
          return true;
2366
        }
2367
    }
2368
 
2369
  // Finally, there may be a wildcard.
2370
  if (this->default_version_ != NULL)
2371
    {
2372
      if (pversion != NULL)
2373
        *pversion = this->default_version_->tag;
2374
      if (p_is_global != NULL)
2375
        *p_is_global = this->default_is_global_;
2376
      return true;
2377
    }
2378
 
2379
  return false;
2380
}
2381
 
2382
// Give an error if any exact symbol names (not wildcards) appear in a
2383
// version script, but there is no such symbol.
2384
 
2385
void
2386
Version_script_info::check_unmatched_names(const Symbol_table* symtab) const
2387
{
2388
  for (size_t i = 0; i < this->version_trees_.size(); ++i)
2389
    {
2390
      const Version_tree* vt = this->version_trees_[i];
2391
      if (vt->global == NULL)
2392
        continue;
2393
      for (size_t j = 0; j < vt->global->expressions.size(); ++j)
2394
        {
2395
          const Version_expression& expression(vt->global->expressions[j]);
2396
 
2397
          // Ignore cases where we used the version because we saw a
2398
          // symbol that we looked up.  Note that
2399
          // WAS_MATCHED_BY_SYMBOL will be true even if the symbol was
2400
          // not a definition.  That's OK as in that case we most
2401
          // likely gave an undefined symbol error anyhow.
2402
          if (expression.was_matched_by_symbol)
2403
            continue;
2404
 
2405
          // Just ignore names which are in languages other than C.
2406
          // We have no way to look them up in the symbol table.
2407
          if (expression.language != LANGUAGE_C)
2408
            continue;
2409
 
2410
          // Remove backslash quoting, and ignore wildcard patterns.
2411
          std::string pattern = expression.pattern;
2412
          if (!expression.exact_match)
2413
            {
2414
              if (this->unquote(&pattern))
2415
                continue;
2416
            }
2417
 
2418
          if (symtab->lookup(pattern.c_str(), vt->tag.c_str()) == NULL)
2419
            gold_error(_("version script assignment of %s to symbol %s "
2420
                         "failed: symbol not defined"),
2421
                       vt->tag.c_str(), pattern.c_str());
2422
        }
2423
    }
2424
}
2425
 
2426
struct Version_dependency_list*
2427
Version_script_info::allocate_dependency_list()
2428
{
2429
  dependency_lists_.push_back(new Version_dependency_list);
2430
  return dependency_lists_.back();
2431
}
2432
 
2433
struct Version_expression_list*
2434
Version_script_info::allocate_expression_list()
2435
{
2436
  expression_lists_.push_back(new Version_expression_list);
2437
  return expression_lists_.back();
2438
}
2439
 
2440
struct Version_tree*
2441
Version_script_info::allocate_version_tree()
2442
{
2443
  version_trees_.push_back(new Version_tree);
2444
  return version_trees_.back();
2445
}
2446
 
2447
// Print for debugging.
2448
 
2449
void
2450
Version_script_info::print(FILE* f) const
2451
{
2452
  if (this->empty())
2453
    return;
2454
 
2455
  fprintf(f, "VERSION {");
2456
 
2457
  for (size_t i = 0; i < this->version_trees_.size(); ++i)
2458
    {
2459
      const Version_tree* vt = this->version_trees_[i];
2460
 
2461
      if (vt->tag.empty())
2462
        fprintf(f, "  {\n");
2463
      else
2464
        fprintf(f, "  %s {\n", vt->tag.c_str());
2465
 
2466
      if (vt->global != NULL)
2467
        {
2468
          fprintf(f, "    global :\n");
2469
          this->print_expression_list(f, vt->global);
2470
        }
2471
 
2472
      if (vt->local != NULL)
2473
        {
2474
          fprintf(f, "    local :\n");
2475
          this->print_expression_list(f, vt->local);
2476
        }
2477
 
2478
      fprintf(f, "  }");
2479
      if (vt->dependencies != NULL)
2480
        {
2481
          const Version_dependency_list* deps = vt->dependencies;
2482
          for (size_t j = 0; j < deps->dependencies.size(); ++j)
2483
            {
2484
              if (j < deps->dependencies.size() - 1)
2485
                fprintf(f, "\n");
2486
              fprintf(f, "    %s", deps->dependencies[j].c_str());
2487
            }
2488
        }
2489
      fprintf(f, ";\n");
2490
    }
2491
 
2492
  fprintf(f, "}\n");
2493
}
2494
 
2495
void
2496
Version_script_info::print_expression_list(
2497
    FILE* f,
2498
    const Version_expression_list* vel) const
2499
{
2500
  Version_script_info::Language current_language = LANGUAGE_C;
2501
  for (size_t i = 0; i < vel->expressions.size(); ++i)
2502
    {
2503
      const Version_expression& ve(vel->expressions[i]);
2504
 
2505
      if (ve.language != current_language)
2506
        {
2507
          if (current_language != LANGUAGE_C)
2508
            fprintf(f, "      }\n");
2509
          switch (ve.language)
2510
            {
2511
            case LANGUAGE_C:
2512
              break;
2513
            case LANGUAGE_CXX:
2514
              fprintf(f, "      extern \"C++\" {\n");
2515
              break;
2516
            case LANGUAGE_JAVA:
2517
              fprintf(f, "      extern \"Java\" {\n");
2518
              break;
2519
            default:
2520
              gold_unreachable();
2521
            }
2522
          current_language = ve.language;
2523
        }
2524
 
2525
      fprintf(f, "      ");
2526
      if (current_language != LANGUAGE_C)
2527
        fprintf(f, "  ");
2528
 
2529
      if (ve.exact_match)
2530
        fprintf(f, "\"");
2531
      fprintf(f, "%s", ve.pattern.c_str());
2532
      if (ve.exact_match)
2533
        fprintf(f, "\"");
2534
 
2535
      fprintf(f, "\n");
2536
    }
2537
 
2538
  if (current_language != LANGUAGE_C)
2539
    fprintf(f, "      }\n");
2540
}
2541
 
2542
} // End namespace gold.
2543
 
2544
// The remaining functions are extern "C", so it's clearer to not put
2545
// them in namespace gold.
2546
 
2547
using namespace gold;
2548
 
2549
// This function is called by the bison parser to return the next
2550
// token.
2551
 
2552
extern "C" int
2553
yylex(YYSTYPE* lvalp, void* closurev)
2554
{
2555
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2556
  const Token* token = closure->next_token();
2557
  switch (token->classification())
2558
    {
2559
    default:
2560
      gold_unreachable();
2561
 
2562
    case Token::TOKEN_INVALID:
2563
      yyerror(closurev, "invalid character");
2564
      return 0;
2565
 
2566
    case Token::TOKEN_EOF:
2567
      return 0;
2568
 
2569
    case Token::TOKEN_STRING:
2570
      {
2571
        // This is either a keyword or a STRING.
2572
        size_t len;
2573
        const char* str = token->string_value(&len);
2574
        int parsecode = 0;
2575
        switch (closure->lex_mode())
2576
          {
2577
          case Lex::LINKER_SCRIPT:
2578
            parsecode = script_keywords.keyword_to_parsecode(str, len);
2579
            break;
2580
          case Lex::VERSION_SCRIPT:
2581
            parsecode = version_script_keywords.keyword_to_parsecode(str, len);
2582
            break;
2583
          case Lex::DYNAMIC_LIST:
2584
            parsecode = dynamic_list_keywords.keyword_to_parsecode(str, len);
2585
            break;
2586
          default:
2587
            break;
2588
          }
2589
        if (parsecode != 0)
2590
          return parsecode;
2591
        lvalp->string.value = str;
2592
        lvalp->string.length = len;
2593
        return STRING;
2594
      }
2595
 
2596
    case Token::TOKEN_QUOTED_STRING:
2597
      lvalp->string.value = token->string_value(&lvalp->string.length);
2598
      return QUOTED_STRING;
2599
 
2600
    case Token::TOKEN_OPERATOR:
2601
      return token->operator_value();
2602
 
2603
    case Token::TOKEN_INTEGER:
2604
      lvalp->integer = token->integer_value();
2605
      return INTEGER;
2606
    }
2607
}
2608
 
2609
// This function is called by the bison parser to report an error.
2610
 
2611
extern "C" void
2612
yyerror(void* closurev, const char* message)
2613
{
2614
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2615
  gold_error(_("%s:%d:%d: %s"), closure->filename(), closure->lineno(),
2616
             closure->charpos(), message);
2617
}
2618
 
2619
// Called by the bison parser to add an external symbol to the link.
2620
 
2621
extern "C" void
2622
script_add_extern(void* closurev, const char* name, size_t length)
2623
{
2624
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2625
  closure->script_options()->add_symbol_reference(name, length);
2626
}
2627
 
2628
// Called by the bison parser to add a file to the link.
2629
 
2630
extern "C" void
2631
script_add_file(void* closurev, const char* name, size_t length)
2632
{
2633
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2634
 
2635
  // If this is an absolute path, and we found the script in the
2636
  // sysroot, then we want to prepend the sysroot to the file name.
2637
  // For example, this is how we handle a cross link to the x86_64
2638
  // libc.so, which refers to /lib/libc.so.6.
2639
  std::string name_string(name, length);
2640
  const char* extra_search_path = ".";
2641
  std::string script_directory;
2642
  if (IS_ABSOLUTE_PATH(name_string.c_str()))
2643
    {
2644
      if (closure->is_in_sysroot())
2645
        {
2646
          const std::string& sysroot(parameters->options().sysroot());
2647
          gold_assert(!sysroot.empty());
2648
          name_string = sysroot + name_string;
2649
        }
2650
    }
2651
  else
2652
    {
2653
      // In addition to checking the normal library search path, we
2654
      // also want to check in the script-directory.
2655
      const char* slash = strrchr(closure->filename(), '/');
2656
      if (slash != NULL)
2657
        {
2658
          script_directory.assign(closure->filename(),
2659
                                  slash - closure->filename() + 1);
2660
          extra_search_path = script_directory.c_str();
2661
        }
2662
    }
2663
 
2664
  Input_file_argument file(name_string.c_str(),
2665
                           Input_file_argument::INPUT_FILE_TYPE_FILE,
2666
                           extra_search_path, false,
2667
                           closure->position_dependent_options());
2668
  Input_argument& arg = closure->inputs()->add_file(file);
2669
  arg.set_script_info(closure->script_info());
2670
}
2671
 
2672
// Called by the bison parser to add a library to the link.
2673
 
2674
extern "C" void
2675
script_add_library(void* closurev, const char* name, size_t length)
2676
{
2677
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2678
  std::string name_string(name, length);
2679
 
2680
  if (name_string[0] != 'l')
2681
    gold_error(_("library name must be prefixed with -l"));
2682
 
2683
  Input_file_argument file(name_string.c_str() + 1,
2684
                           Input_file_argument::INPUT_FILE_TYPE_LIBRARY,
2685
                           "", false,
2686
                           closure->position_dependent_options());
2687
  Input_argument& arg = closure->inputs()->add_file(file);
2688
  arg.set_script_info(closure->script_info());
2689
}
2690
 
2691
// Called by the bison parser to start a group.  If we are already in
2692
// a group, that means that this script was invoked within a
2693
// --start-group --end-group sequence on the command line, or that
2694
// this script was found in a GROUP of another script.  In that case,
2695
// we simply continue the existing group, rather than starting a new
2696
// one.  It is possible to construct a case in which this will do
2697
// something other than what would happen if we did a recursive group,
2698
// but it's hard to imagine why the different behaviour would be
2699
// useful for a real program.  Avoiding recursive groups is simpler
2700
// and more efficient.
2701
 
2702
extern "C" void
2703
script_start_group(void* closurev)
2704
{
2705
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2706
  if (!closure->in_group())
2707
    closure->inputs()->start_group();
2708
}
2709
 
2710
// Called by the bison parser at the end of a group.
2711
 
2712
extern "C" void
2713
script_end_group(void* closurev)
2714
{
2715
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2716
  if (!closure->in_group())
2717
    closure->inputs()->end_group();
2718
}
2719
 
2720
// Called by the bison parser to start an AS_NEEDED list.
2721
 
2722
extern "C" void
2723
script_start_as_needed(void* closurev)
2724
{
2725
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2726
  closure->position_dependent_options().set_as_needed(true);
2727
}
2728
 
2729
// Called by the bison parser at the end of an AS_NEEDED list.
2730
 
2731
extern "C" void
2732
script_end_as_needed(void* closurev)
2733
{
2734
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2735
  closure->position_dependent_options().set_as_needed(false);
2736
}
2737
 
2738
// Called by the bison parser to set the entry symbol.
2739
 
2740
extern "C" void
2741
script_set_entry(void* closurev, const char* entry, size_t length)
2742
{
2743
  // We'll parse this exactly the same as --entry=ENTRY on the commandline
2744
  // TODO(csilvers): FIXME -- call set_entry directly.
2745
  std::string arg("--entry=");
2746
  arg.append(entry, length);
2747
  script_parse_option(closurev, arg.c_str(), arg.size());
2748
}
2749
 
2750
// Called by the bison parser to set whether to define common symbols.
2751
 
2752
extern "C" void
2753
script_set_common_allocation(void* closurev, int set)
2754
{
2755
  const char* arg = set != 0 ? "--define-common" : "--no-define-common";
2756
  script_parse_option(closurev, arg, strlen(arg));
2757
}
2758
 
2759
// Called by the bison parser to refer to a symbol.
2760
 
2761
extern "C" Expression*
2762
script_symbol(void* closurev, const char* name, size_t length)
2763
{
2764
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2765
  if (length != 1 || name[0] != '.')
2766
    closure->script_options()->add_symbol_reference(name, length);
2767
  return script_exp_string(name, length);
2768
}
2769
 
2770
// Called by the bison parser to define a symbol.
2771
 
2772
extern "C" void
2773
script_set_symbol(void* closurev, const char* name, size_t length,
2774
                  Expression* value, int providei, int hiddeni)
2775
{
2776
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2777
  const bool provide = providei != 0;
2778
  const bool hidden = hiddeni != 0;
2779
  closure->script_options()->add_symbol_assignment(name, length,
2780
                                                   closure->parsing_defsym(),
2781
                                                   value, provide, hidden);
2782
  closure->clear_skip_on_incompatible_target();
2783
}
2784
 
2785
// Called by the bison parser to add an assertion.
2786
 
2787
extern "C" void
2788
script_add_assertion(void* closurev, Expression* check, const char* message,
2789
                     size_t messagelen)
2790
{
2791
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2792
  closure->script_options()->add_assertion(check, message, messagelen);
2793
  closure->clear_skip_on_incompatible_target();
2794
}
2795
 
2796
// Called by the bison parser to parse an OPTION.
2797
 
2798
extern "C" void
2799
script_parse_option(void* closurev, const char* option, size_t length)
2800
{
2801
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2802
  // We treat the option as a single command-line option, even if
2803
  // it has internal whitespace.
2804
  if (closure->command_line() == NULL)
2805
    {
2806
      // There are some options that we could handle here--e.g.,
2807
      // -lLIBRARY.  Should we bother?
2808
      gold_warning(_("%s:%d:%d: ignoring command OPTION; OPTION is only valid"
2809
                     " for scripts specified via -T/--script"),
2810
                   closure->filename(), closure->lineno(), closure->charpos());
2811
    }
2812
  else
2813
    {
2814
      bool past_a_double_dash_option = false;
2815
      const char* mutable_option = strndup(option, length);
2816
      gold_assert(mutable_option != NULL);
2817
      closure->command_line()->process_one_option(1, &mutable_option, 0,
2818
                                                  &past_a_double_dash_option);
2819
      // The General_options class will quite possibly store a pointer
2820
      // into mutable_option, so we can't free it.  In cases the class
2821
      // does not store such a pointer, this is a memory leak.  Alas. :(
2822
    }
2823
  closure->clear_skip_on_incompatible_target();
2824
}
2825
 
2826
// Called by the bison parser to handle OUTPUT_FORMAT.  OUTPUT_FORMAT
2827
// takes either one or three arguments.  In the three argument case,
2828
// the format depends on the endianness option, which we don't
2829
// currently support (FIXME).  If we see an OUTPUT_FORMAT for the
2830
// wrong format, then we want to search for a new file.  Returning 0
2831
// here will cause the parser to immediately abort.
2832
 
2833
extern "C" int
2834
script_check_output_format(void* closurev,
2835
                           const char* default_name, size_t default_length,
2836
                           const char*, size_t, const char*, size_t)
2837
{
2838
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2839
  std::string name(default_name, default_length);
2840 159 khays
  Target* target = select_target_by_bfd_name(name.c_str());
2841 27 khays
  if (target == NULL || !parameters->is_compatible_target(target))
2842
    {
2843
      if (closure->skip_on_incompatible_target())
2844
        {
2845
          closure->set_found_incompatible_target();
2846
          return 0;
2847
        }
2848
      // FIXME: Should we warn about the unknown target?
2849
    }
2850
  return 1;
2851
}
2852
 
2853
// Called by the bison parser to handle TARGET.
2854
 
2855
extern "C" void
2856
script_set_target(void* closurev, const char* target, size_t len)
2857
{
2858
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2859
  std::string s(target, len);
2860
  General_options::Object_format format_enum;
2861
  format_enum = General_options::string_to_object_format(s.c_str());
2862
  closure->position_dependent_options().set_format_enum(format_enum);
2863
}
2864
 
2865
// Called by the bison parser to handle SEARCH_DIR.  This is handled
2866
// exactly like a -L option.
2867
 
2868
extern "C" void
2869
script_add_search_dir(void* closurev, const char* option, size_t length)
2870
{
2871
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2872
  if (closure->command_line() == NULL)
2873
    gold_warning(_("%s:%d:%d: ignoring SEARCH_DIR; SEARCH_DIR is only valid"
2874
                   " for scripts specified via -T/--script"),
2875
                 closure->filename(), closure->lineno(), closure->charpos());
2876
  else if (!closure->command_line()->options().nostdlib())
2877
    {
2878
      std::string s = "-L" + std::string(option, length);
2879
      script_parse_option(closurev, s.c_str(), s.size());
2880
    }
2881
}
2882
 
2883
/* Called by the bison parser to push the lexer into expression
2884
   mode.  */
2885
 
2886
extern "C" void
2887
script_push_lex_into_expression_mode(void* closurev)
2888
{
2889
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2890
  closure->push_lex_mode(Lex::EXPRESSION);
2891
}
2892
 
2893
/* Called by the bison parser to push the lexer into version
2894
   mode.  */
2895
 
2896
extern "C" void
2897
script_push_lex_into_version_mode(void* closurev)
2898
{
2899
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2900
  if (closure->version_script()->is_finalized())
2901
    gold_error(_("%s:%d:%d: invalid use of VERSION in input file"),
2902
               closure->filename(), closure->lineno(), closure->charpos());
2903
  closure->push_lex_mode(Lex::VERSION_SCRIPT);
2904
}
2905
 
2906
/* Called by the bison parser to pop the lexer mode.  */
2907
 
2908
extern "C" void
2909
script_pop_lex_mode(void* closurev)
2910
{
2911
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2912
  closure->pop_lex_mode();
2913
}
2914
 
2915
// Register an entire version node. For example:
2916
//
2917
// GLIBC_2.1 {
2918
//   global: foo;
2919
// } GLIBC_2.0;
2920
//
2921
// - tag is "GLIBC_2.1"
2922
// - tree contains the information "global: foo"
2923
// - deps contains "GLIBC_2.0"
2924
 
2925
extern "C" void
2926
script_register_vers_node(void*,
2927
                          const char* tag,
2928
                          int taglen,
2929
                          struct Version_tree* tree,
2930
                          struct Version_dependency_list* deps)
2931
{
2932
  gold_assert(tree != NULL);
2933
  tree->dependencies = deps;
2934
  if (tag != NULL)
2935
    tree->tag = std::string(tag, taglen);
2936
}
2937
 
2938
// Add a dependencies to the list of existing dependencies, if any,
2939
// and return the expanded list.
2940
 
2941
extern "C" struct Version_dependency_list*
2942
script_add_vers_depend(void* closurev,
2943
                       struct Version_dependency_list* all_deps,
2944
                       const char* depend_to_add, int deplen)
2945
{
2946
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2947
  if (all_deps == NULL)
2948
    all_deps = closure->version_script()->allocate_dependency_list();
2949
  all_deps->dependencies.push_back(std::string(depend_to_add, deplen));
2950
  return all_deps;
2951
}
2952
 
2953
// Add a pattern expression to an existing list of expressions, if any.
2954
 
2955
extern "C" struct Version_expression_list*
2956
script_new_vers_pattern(void* closurev,
2957
                        struct Version_expression_list* expressions,
2958
                        const char* pattern, int patlen, int exact_match)
2959
{
2960
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2961
  if (expressions == NULL)
2962
    expressions = closure->version_script()->allocate_expression_list();
2963
  expressions->expressions.push_back(
2964
      Version_expression(std::string(pattern, patlen),
2965
                         closure->get_current_language(),
2966
                         static_cast<bool>(exact_match)));
2967
  return expressions;
2968
}
2969
 
2970
// Attaches b to the end of a, and clears b.  So a = a + b and b = {}.
2971
 
2972
extern "C" struct Version_expression_list*
2973
script_merge_expressions(struct Version_expression_list* a,
2974
                         struct Version_expression_list* b)
2975
{
2976
  a->expressions.insert(a->expressions.end(),
2977
                        b->expressions.begin(), b->expressions.end());
2978
  // We could delete b and remove it from expressions_lists_, but
2979
  // that's a lot of work.  This works just as well.
2980
  b->expressions.clear();
2981
  return a;
2982
}
2983
 
2984
// Combine the global and local expressions into a a Version_tree.
2985
 
2986
extern "C" struct Version_tree*
2987
script_new_vers_node(void* closurev,
2988
                     struct Version_expression_list* global,
2989
                     struct Version_expression_list* local)
2990
{
2991
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
2992
  Version_tree* tree = closure->version_script()->allocate_version_tree();
2993
  tree->global = global;
2994
  tree->local = local;
2995
  return tree;
2996
}
2997
 
2998
// Handle a transition in language, such as at the
2999
// start or end of 'extern "C++"'
3000
 
3001
extern "C" void
3002
version_script_push_lang(void* closurev, const char* lang, int langlen)
3003
{
3004
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3005
  std::string language(lang, langlen);
3006
  Version_script_info::Language code;
3007
  if (language.empty() || language == "C")
3008
    code = Version_script_info::LANGUAGE_C;
3009
  else if (language == "C++")
3010
    code = Version_script_info::LANGUAGE_CXX;
3011
  else if (language == "Java")
3012
    code = Version_script_info::LANGUAGE_JAVA;
3013
  else
3014
    {
3015
      char* buf = new char[langlen + 100];
3016
      snprintf(buf, langlen + 100,
3017
               _("unrecognized version script language '%s'"),
3018
               language.c_str());
3019
      yyerror(closurev, buf);
3020
      delete[] buf;
3021
      code = Version_script_info::LANGUAGE_C;
3022
    }
3023
  closure->push_language(code);
3024
}
3025
 
3026
extern "C" void
3027
version_script_pop_lang(void* closurev)
3028
{
3029
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3030
  closure->pop_language();
3031
}
3032
 
3033
// Called by the bison parser to start a SECTIONS clause.
3034
 
3035
extern "C" void
3036
script_start_sections(void* closurev)
3037
{
3038
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3039
  closure->script_options()->script_sections()->start_sections();
3040
  closure->clear_skip_on_incompatible_target();
3041
}
3042
 
3043
// Called by the bison parser to finish a SECTIONS clause.
3044
 
3045
extern "C" void
3046
script_finish_sections(void* closurev)
3047
{
3048
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3049
  closure->script_options()->script_sections()->finish_sections();
3050
}
3051
 
3052
// Start processing entries for an output section.
3053
 
3054
extern "C" void
3055
script_start_output_section(void* closurev, const char* name, size_t namelen,
3056
                            const struct Parser_output_section_header* header)
3057
{
3058
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3059
  closure->script_options()->script_sections()->start_output_section(name,
3060
                                                                     namelen,
3061
                                                                     header);
3062
}
3063
 
3064
// Finish processing entries for an output section.
3065
 
3066
extern "C" void
3067
script_finish_output_section(void* closurev,
3068
                             const struct Parser_output_section_trailer* trail)
3069
{
3070
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3071
  closure->script_options()->script_sections()->finish_output_section(trail);
3072
}
3073
 
3074
// Add a data item (e.g., "WORD (0)") to the current output section.
3075
 
3076
extern "C" void
3077
script_add_data(void* closurev, int data_token, Expression* val)
3078
{
3079
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3080
  int size;
3081
  bool is_signed = true;
3082
  switch (data_token)
3083
    {
3084
    case QUAD:
3085
      size = 8;
3086
      is_signed = false;
3087
      break;
3088
    case SQUAD:
3089
      size = 8;
3090
      break;
3091
    case LONG:
3092
      size = 4;
3093
      break;
3094
    case SHORT:
3095
      size = 2;
3096
      break;
3097
    case BYTE:
3098
      size = 1;
3099
      break;
3100
    default:
3101
      gold_unreachable();
3102
    }
3103
  closure->script_options()->script_sections()->add_data(size, is_signed, val);
3104
}
3105
 
3106
// Add a clause setting the fill value to the current output section.
3107
 
3108
extern "C" void
3109
script_add_fill(void* closurev, Expression* val)
3110
{
3111
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3112
  closure->script_options()->script_sections()->add_fill(val);
3113
}
3114
 
3115
// Add a new input section specification to the current output
3116
// section.
3117
 
3118
extern "C" void
3119
script_add_input_section(void* closurev,
3120
                         const struct Input_section_spec* spec,
3121
                         int keepi)
3122
{
3123
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3124
  bool keep = keepi != 0;
3125
  closure->script_options()->script_sections()->add_input_section(spec, keep);
3126
}
3127
 
3128
// When we see DATA_SEGMENT_ALIGN we record that following output
3129
// sections may be relro.
3130
 
3131
extern "C" void
3132
script_data_segment_align(void* closurev)
3133
{
3134
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3135
  if (!closure->script_options()->saw_sections_clause())
3136
    gold_error(_("%s:%d:%d: DATA_SEGMENT_ALIGN not in SECTIONS clause"),
3137
               closure->filename(), closure->lineno(), closure->charpos());
3138
  else
3139
    closure->script_options()->script_sections()->data_segment_align();
3140
}
3141
 
3142
// When we see DATA_SEGMENT_RELRO_END we know that all output sections
3143
// since DATA_SEGMENT_ALIGN should be relro.
3144
 
3145
extern "C" void
3146
script_data_segment_relro_end(void* closurev)
3147
{
3148
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3149
  if (!closure->script_options()->saw_sections_clause())
3150
    gold_error(_("%s:%d:%d: DATA_SEGMENT_ALIGN not in SECTIONS clause"),
3151
               closure->filename(), closure->lineno(), closure->charpos());
3152
  else
3153
    closure->script_options()->script_sections()->data_segment_relro_end();
3154
}
3155
 
3156
// Create a new list of string/sort pairs.
3157
 
3158
extern "C" String_sort_list_ptr
3159
script_new_string_sort_list(const struct Wildcard_section* string_sort)
3160
{
3161
  return new String_sort_list(1, *string_sort);
3162
}
3163
 
3164
// Add an entry to a list of string/sort pairs.  The way the parser
3165
// works permits us to simply modify the first parameter, rather than
3166
// copy the vector.
3167
 
3168
extern "C" String_sort_list_ptr
3169
script_string_sort_list_add(String_sort_list_ptr pv,
3170
                            const struct Wildcard_section* string_sort)
3171
{
3172
  if (pv == NULL)
3173
    return script_new_string_sort_list(string_sort);
3174
  else
3175
    {
3176
      pv->push_back(*string_sort);
3177
      return pv;
3178
    }
3179
}
3180
 
3181
// Create a new list of strings.
3182
 
3183
extern "C" String_list_ptr
3184
script_new_string_list(const char* str, size_t len)
3185
{
3186
  return new String_list(1, std::string(str, len));
3187
}
3188
 
3189
// Add an element to a list of strings.  The way the parser works
3190
// permits us to simply modify the first parameter, rather than copy
3191
// the vector.
3192
 
3193
extern "C" String_list_ptr
3194
script_string_list_push_back(String_list_ptr pv, const char* str, size_t len)
3195
{
3196
  if (pv == NULL)
3197
    return script_new_string_list(str, len);
3198
  else
3199
    {
3200
      pv->push_back(std::string(str, len));
3201
      return pv;
3202
    }
3203
}
3204
 
3205
// Concatenate two string lists.  Either or both may be NULL.  The way
3206
// the parser works permits us to modify the parameters, rather than
3207
// copy the vector.
3208
 
3209
extern "C" String_list_ptr
3210
script_string_list_append(String_list_ptr pv1, String_list_ptr pv2)
3211
{
3212
  if (pv1 == NULL)
3213
    return pv2;
3214
  if (pv2 == NULL)
3215
    return pv1;
3216
  pv1->insert(pv1->end(), pv2->begin(), pv2->end());
3217
  return pv1;
3218
}
3219
 
3220
// Add a new program header.
3221
 
3222
extern "C" void
3223
script_add_phdr(void* closurev, const char* name, size_t namelen,
3224
                unsigned int type, const Phdr_info* info)
3225
{
3226
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3227
  bool includes_filehdr = info->includes_filehdr != 0;
3228
  bool includes_phdrs = info->includes_phdrs != 0;
3229
  bool is_flags_valid = info->is_flags_valid != 0;
3230
  Script_sections* ss = closure->script_options()->script_sections();
3231
  ss->add_phdr(name, namelen, type, includes_filehdr, includes_phdrs,
3232
               is_flags_valid, info->flags, info->load_address);
3233
  closure->clear_skip_on_incompatible_target();
3234
}
3235
 
3236
// Convert a program header string to a type.
3237
 
3238
#define PHDR_TYPE(NAME) { #NAME, sizeof(#NAME) - 1, elfcpp::NAME }
3239
 
3240
static struct
3241
{
3242
  const char* name;
3243
  size_t namelen;
3244
  unsigned int val;
3245
} phdr_type_names[] =
3246
{
3247
  PHDR_TYPE(PT_NULL),
3248
  PHDR_TYPE(PT_LOAD),
3249
  PHDR_TYPE(PT_DYNAMIC),
3250
  PHDR_TYPE(PT_INTERP),
3251
  PHDR_TYPE(PT_NOTE),
3252
  PHDR_TYPE(PT_SHLIB),
3253
  PHDR_TYPE(PT_PHDR),
3254
  PHDR_TYPE(PT_TLS),
3255
  PHDR_TYPE(PT_GNU_EH_FRAME),
3256
  PHDR_TYPE(PT_GNU_STACK),
3257
  PHDR_TYPE(PT_GNU_RELRO)
3258
};
3259
 
3260
extern "C" unsigned int
3261
script_phdr_string_to_type(void* closurev, const char* name, size_t namelen)
3262
{
3263
  for (unsigned int i = 0;
3264
       i < sizeof(phdr_type_names) / sizeof(phdr_type_names[0]);
3265
       ++i)
3266
    if (namelen == phdr_type_names[i].namelen
3267
        && strncmp(name, phdr_type_names[i].name, namelen) == 0)
3268
      return phdr_type_names[i].val;
3269
  yyerror(closurev, _("unknown PHDR type (try integer)"));
3270
  return elfcpp::PT_NULL;
3271
}
3272
 
3273
extern "C" void
3274
script_saw_segment_start_expression(void* closurev)
3275
{
3276
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3277
  Script_sections* ss = closure->script_options()->script_sections();
3278
  ss->set_saw_segment_start_expression(true);
3279
}
3280
 
3281
extern "C" void
3282
script_set_section_region(void* closurev, const char* name, size_t namelen,
3283
                          int set_vma)
3284
{
3285
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3286
  if (!closure->script_options()->saw_sections_clause())
3287
    {
3288
      gold_error(_("%s:%d:%d: MEMORY region '%.*s' referred to outside of "
3289
                   "SECTIONS clause"),
3290
                 closure->filename(), closure->lineno(), closure->charpos(),
3291
                 static_cast<int>(namelen), name);
3292
      return;
3293
    }
3294
 
3295
  Script_sections* ss = closure->script_options()->script_sections();
3296
  Memory_region* mr = ss->find_memory_region(name, namelen);
3297
  if (mr == NULL)
3298
    {
3299
      gold_error(_("%s:%d:%d: MEMORY region '%.*s' not declared"),
3300
                 closure->filename(), closure->lineno(), closure->charpos(),
3301
                 static_cast<int>(namelen), name);
3302
      return;
3303
    }
3304
 
3305
  ss->set_memory_region(mr, set_vma);
3306
}
3307
 
3308
extern "C" void
3309
script_add_memory(void* closurev, const char* name, size_t namelen,
3310
                  unsigned int attrs, Expression* origin, Expression* length)
3311
{
3312
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3313
  Script_sections* ss = closure->script_options()->script_sections();
3314
  ss->add_memory_region(name, namelen, attrs, origin, length);
3315
}
3316
 
3317
extern "C" unsigned int
3318
script_parse_memory_attr(void* closurev, const char* attrs, size_t attrlen,
3319
                         int invert)
3320
{
3321
  int attributes = 0;
3322
 
3323
  while (attrlen--)
3324
    switch (*attrs++)
3325
      {
3326
      case 'R':
3327
      case 'r':
3328
        attributes |= MEM_READABLE; break;
3329
      case 'W':
3330
      case 'w':
3331
        attributes |= MEM_READABLE | MEM_WRITEABLE; break;
3332
      case 'X':
3333
      case 'x':
3334
        attributes |= MEM_EXECUTABLE; break;
3335
      case 'A':
3336
      case 'a':
3337
        attributes |= MEM_ALLOCATABLE; break;
3338
      case 'I':
3339
      case 'i':
3340
      case 'L':
3341
      case 'l':
3342
        attributes |= MEM_INITIALIZED; break;
3343
      default:
3344
        yyerror(closurev, _("unknown MEMORY attribute"));
3345
      }
3346
 
3347
  if (invert)
3348
    attributes = (~ attributes) & MEM_ATTR_MASK;
3349
 
3350
  return attributes;
3351
}
3352
 
3353
extern "C" void
3354
script_include_directive(void* closurev, const char*, size_t)
3355
{
3356
  // FIXME: Implement ?
3357
  yyerror (closurev, _("GOLD does not currently support INCLUDE directives"));
3358
}
3359
 
3360
// Functions for memory regions.
3361
 
3362
extern "C" Expression*
3363
script_exp_function_origin(void* closurev, const char* name, size_t namelen)
3364
{
3365
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3366
  Script_sections* ss = closure->script_options()->script_sections();
3367
  Expression* origin = ss->find_memory_region_origin(name, namelen);
3368
 
3369
  if (origin == NULL)
3370
    {
3371
      gold_error(_("undefined memory region '%s' referenced "
3372
                   "in ORIGIN expression"),
3373
                 name);
3374
      // Create a dummy expression to prevent crashes later on.
3375
      origin = script_exp_integer(0);
3376
    }
3377
 
3378
  return origin;
3379
}
3380
 
3381
extern "C" Expression*
3382
script_exp_function_length(void* closurev, const char* name, size_t namelen)
3383
{
3384
  Parser_closure* closure = static_cast<Parser_closure*>(closurev);
3385
  Script_sections* ss = closure->script_options()->script_sections();
3386
  Expression* length = ss->find_memory_region_length(name, namelen);
3387
 
3388
  if (length == NULL)
3389
    {
3390
      gold_error(_("undefined memory region '%s' referenced "
3391
                   "in LENGTH expression"),
3392
                 name);
3393
      // Create a dummy expression to prevent crashes later on.
3394
      length = script_exp_integer(0);
3395
    }
3396
 
3397
  return length;
3398
}

powered by: WebSVN 2.1.0

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