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 159

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

powered by: WebSVN 2.1.0

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