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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf64-alpha.c] - Blame information for rev 148

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

Line No. Rev Author Line
1 14 khays
/* Alpha specific support for 64-bit ELF
2
   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3
   2006, 2007, 2008, 2009, 2010, 2011  Free Software Foundation, Inc.
4
   Contributed by Richard Henderson <rth@tamu.edu>.
5
 
6
   This file is part of BFD, the Binary File Descriptor library.
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
 
24
/* We need a published ABI spec for this.  Until one comes out, don't
25
   assume this'll remain unchanged forever.  */
26
 
27
#include "sysdep.h"
28
#include "bfd.h"
29
#include "libbfd.h"
30
#include "elf-bfd.h"
31
 
32
#include "elf/alpha.h"
33
 
34
#define ALPHAECOFF
35
 
36
#define NO_COFF_RELOCS
37
#define NO_COFF_SYMBOLS
38
#define NO_COFF_LINENOS
39
 
40
/* Get the ECOFF swapping routines.  Needed for the debug information.  */
41
#include "coff/internal.h"
42
#include "coff/sym.h"
43
#include "coff/symconst.h"
44
#include "coff/ecoff.h"
45
#include "coff/alpha.h"
46
#include "aout/ar.h"
47
#include "libcoff.h"
48
#include "libecoff.h"
49
#define ECOFF_64
50
#include "ecoffswap.h"
51
 
52
 
53
/* Instruction data for plt generation and relaxation.  */
54
 
55
#define OP_LDA          0x08
56
#define OP_LDAH         0x09
57
#define OP_LDQ          0x29
58
#define OP_BR           0x30
59
#define OP_BSR          0x34
60
 
61
#define INSN_LDA        (OP_LDA << 26)
62
#define INSN_LDAH       (OP_LDAH << 26)
63
#define INSN_LDQ        (OP_LDQ << 26)
64
#define INSN_BR         (OP_BR << 26)
65
 
66
#define INSN_ADDQ       0x40000400
67
#define INSN_RDUNIQ     0x0000009e
68
#define INSN_SUBQ       0x40000520
69
#define INSN_S4SUBQ     0x40000560
70
#define INSN_UNOP       0x2ffe0000
71
 
72
#define INSN_JSR        0x68004000
73
#define INSN_JMP        0x68000000
74
#define INSN_JSR_MASK   0xfc00c000
75
 
76
#define INSN_A(I,A)             (I | (A << 21))
77
#define INSN_AB(I,A,B)          (I | (A << 21) | (B << 16))
78
#define INSN_ABC(I,A,B,C)       (I | (A << 21) | (B << 16) | C)
79
#define INSN_ABO(I,A,B,O)       (I | (A << 21) | (B << 16) | ((O) & 0xffff))
80
#define INSN_AD(I,A,D)          (I | (A << 21) | (((D) >> 2) & 0x1fffff))
81
 
82
/* PLT/GOT Stuff */
83
 
84
/* Set by ld emulation.  Putting this into the link_info or hash structure
85
   is simply working too hard.  */
86
#ifdef USE_SECUREPLT
87
bfd_boolean elf64_alpha_use_secureplt = TRUE;
88
#else
89
bfd_boolean elf64_alpha_use_secureplt = FALSE;
90
#endif
91
 
92
#define OLD_PLT_HEADER_SIZE     32
93
#define OLD_PLT_ENTRY_SIZE      12
94
#define NEW_PLT_HEADER_SIZE     36
95
#define NEW_PLT_ENTRY_SIZE      4
96
 
97
#define PLT_HEADER_SIZE \
98
  (elf64_alpha_use_secureplt ? NEW_PLT_HEADER_SIZE : OLD_PLT_HEADER_SIZE)
99
#define PLT_ENTRY_SIZE \
100
  (elf64_alpha_use_secureplt ? NEW_PLT_ENTRY_SIZE : OLD_PLT_ENTRY_SIZE)
101
 
102
#define MAX_GOT_SIZE            (64*1024)
103
 
104
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so"
105
 
106
 
107
/* Used to implement multiple .got subsections.  */
108
struct alpha_elf_got_entry
109
{
110
  struct alpha_elf_got_entry *next;
111
 
112
  /* Which .got subsection?  */
113
  bfd *gotobj;
114
 
115
  /* The addend in effect for this entry.  */
116
  bfd_vma addend;
117
 
118
  /* The .got offset for this entry.  */
119
  int got_offset;
120
 
121
  /* The .plt offset for this entry.  */
122
  int plt_offset;
123
 
124
  /* How many references to this entry?  */
125
  int use_count;
126
 
127
  /* The relocation type of this entry.  */
128
  unsigned char reloc_type;
129
 
130
  /* How a LITERAL is used.  */
131
  unsigned char flags;
132
 
133
  /* Have we initialized the dynamic relocation for this entry?  */
134
  unsigned char reloc_done;
135
 
136
  /* Have we adjusted this entry for SEC_MERGE?  */
137
  unsigned char reloc_xlated;
138
};
139
 
140
struct alpha_elf_reloc_entry
141
{
142
  struct alpha_elf_reloc_entry *next;
143
 
144
  /* Which .reloc section? */
145
  asection *srel;
146
 
147
  /* What kind of relocation? */
148
  unsigned int rtype;
149
 
150
  /* Is this against read-only section? */
151
  unsigned int reltext : 1;
152
 
153
  /* How many did we find?  */
154
  unsigned long count;
155
};
156
 
157
struct alpha_elf_link_hash_entry
158
{
159
  struct elf_link_hash_entry root;
160
 
161
  /* External symbol information.  */
162
  EXTR esym;
163
 
164
  /* Cumulative flags for all the .got entries.  */
165
  int flags;
166
 
167
  /* Contexts in which a literal was referenced.  */
168
#define ALPHA_ELF_LINK_HASH_LU_ADDR      0x01
169
#define ALPHA_ELF_LINK_HASH_LU_MEM       0x02
170
#define ALPHA_ELF_LINK_HASH_LU_BYTE      0x04
171
#define ALPHA_ELF_LINK_HASH_LU_JSR       0x08
172
#define ALPHA_ELF_LINK_HASH_LU_TLSGD     0x10
173
#define ALPHA_ELF_LINK_HASH_LU_TLSLDM    0x20
174
#define ALPHA_ELF_LINK_HASH_LU_JSRDIRECT 0x40
175
#define ALPHA_ELF_LINK_HASH_LU_PLT       0x38
176
#define ALPHA_ELF_LINK_HASH_TLS_IE       0x80
177
 
178
  /* Used to implement multiple .got subsections.  */
179
  struct alpha_elf_got_entry *got_entries;
180
 
181
  /* Used to count non-got, non-plt relocations for delayed sizing
182
     of relocation sections.  */
183
  struct alpha_elf_reloc_entry *reloc_entries;
184
};
185
 
186
/* Alpha ELF linker hash table.  */
187
 
188
struct alpha_elf_link_hash_table
189
{
190
  struct elf_link_hash_table root;
191
 
192
  /* The head of a list of .got subsections linked through
193
     alpha_elf_tdata(abfd)->got_link_next.  */
194
  bfd *got_list;
195
 
196
  /* The most recent relax pass that we've seen.  The GOTs
197
     should be regenerated if this doesn't match.  */
198
  int relax_trip;
199
};
200
 
201
/* Look up an entry in a Alpha ELF linker hash table.  */
202
 
203
#define alpha_elf_link_hash_lookup(table, string, create, copy, follow) \
204
  ((struct alpha_elf_link_hash_entry *)                                 \
205
   elf_link_hash_lookup (&(table)->root, (string), (create),            \
206
                         (copy), (follow)))
207
 
208
/* Traverse a Alpha ELF linker hash table.  */
209
 
210
#define alpha_elf_link_hash_traverse(table, func, info)                 \
211
  (elf_link_hash_traverse                                               \
212
   (&(table)->root,                                                     \
213
    (bfd_boolean (*) (struct elf_link_hash_entry *, PTR)) (func),       \
214
    (info)))
215
 
216
/* Get the Alpha ELF linker hash table from a link_info structure.  */
217
 
218
#define alpha_elf_hash_table(p) \
219
  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
220
  == ALPHA_ELF_DATA ? ((struct alpha_elf_link_hash_table *) ((p)->hash)) : NULL)
221
 
222
/* Get the object's symbols as our own entry type.  */
223
 
224
#define alpha_elf_sym_hashes(abfd) \
225
  ((struct alpha_elf_link_hash_entry **)elf_sym_hashes(abfd))
226
 
227
/* Should we do dynamic things to this symbol?  This differs from the
228
   generic version in that we never need to consider function pointer
229
   equality wrt PLT entries -- we don't create a PLT entry if a symbol's
230
   address is ever taken.  */
231
 
232
static inline bfd_boolean
233
alpha_elf_dynamic_symbol_p (struct elf_link_hash_entry *h,
234
                            struct bfd_link_info *info)
235
{
236
  return _bfd_elf_dynamic_symbol_p (h, info, 0);
237
}
238
 
239
/* Create an entry in a Alpha ELF linker hash table.  */
240
 
241
static struct bfd_hash_entry *
242
elf64_alpha_link_hash_newfunc (struct bfd_hash_entry *entry,
243
                               struct bfd_hash_table *table,
244
                               const char *string)
245
{
246
  struct alpha_elf_link_hash_entry *ret =
247
    (struct alpha_elf_link_hash_entry *) entry;
248
 
249
  /* Allocate the structure if it has not already been allocated by a
250
     subclass.  */
251
  if (ret == (struct alpha_elf_link_hash_entry *) NULL)
252
    ret = ((struct alpha_elf_link_hash_entry *)
253
           bfd_hash_allocate (table,
254
                              sizeof (struct alpha_elf_link_hash_entry)));
255
  if (ret == (struct alpha_elf_link_hash_entry *) NULL)
256
    return (struct bfd_hash_entry *) ret;
257
 
258
  /* Call the allocation method of the superclass.  */
259
  ret = ((struct alpha_elf_link_hash_entry *)
260
         _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
261
                                     table, string));
262
  if (ret != (struct alpha_elf_link_hash_entry *) NULL)
263
    {
264
      /* Set local fields.  */
265
      memset (&ret->esym, 0, sizeof (EXTR));
266
      /* We use -2 as a marker to indicate that the information has
267
         not been set.  -1 means there is no associated ifd.  */
268
      ret->esym.ifd = -2;
269
      ret->flags = 0;
270
      ret->got_entries = NULL;
271
      ret->reloc_entries = NULL;
272
    }
273
 
274
  return (struct bfd_hash_entry *) ret;
275
}
276
 
277
/* Create a Alpha ELF linker hash table.  */
278
 
279
static struct bfd_link_hash_table *
280
elf64_alpha_bfd_link_hash_table_create (bfd *abfd)
281
{
282
  struct alpha_elf_link_hash_table *ret;
283
  bfd_size_type amt = sizeof (struct alpha_elf_link_hash_table);
284
 
285
  ret = (struct alpha_elf_link_hash_table *) bfd_zmalloc (amt);
286
  if (ret == (struct alpha_elf_link_hash_table *) NULL)
287
    return NULL;
288
 
289
  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
290
                                      elf64_alpha_link_hash_newfunc,
291
                                      sizeof (struct alpha_elf_link_hash_entry),
292
                                      ALPHA_ELF_DATA))
293
    {
294
      free (ret);
295
      return NULL;
296
    }
297
 
298
  return &ret->root.root;
299
}
300
 
301
/* We have some private fields hanging off of the elf_tdata structure.  */
302
 
303
struct alpha_elf_obj_tdata
304
{
305
  struct elf_obj_tdata root;
306
 
307
  /* For every input file, these are the got entries for that object's
308
     local symbols.  */
309
  struct alpha_elf_got_entry ** local_got_entries;
310
 
311
  /* For every input file, this is the object that owns the got that
312
     this input file uses.  */
313
  bfd *gotobj;
314
 
315
  /* For every got, this is a linked list through the objects using this got */
316
  bfd *in_got_link_next;
317
 
318
  /* For every got, this is a link to the next got subsegment.  */
319
  bfd *got_link_next;
320
 
321
  /* For every got, this is the section.  */
322
  asection *got;
323
 
324
  /* For every got, this is it's total number of words.  */
325
  int total_got_size;
326
 
327
  /* For every got, this is the sum of the number of words required
328
     to hold all of the member object's local got.  */
329
  int local_got_size;
330
};
331
 
332
#define alpha_elf_tdata(abfd) \
333
  ((struct alpha_elf_obj_tdata *) (abfd)->tdata.any)
334
 
335
#define is_alpha_elf(bfd) \
336
  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
337
   && elf_tdata (bfd) != NULL \
338
   && elf_object_id (bfd) == ALPHA_ELF_DATA)
339
 
340
static bfd_boolean
341
elf64_alpha_mkobject (bfd *abfd)
342
{
343
  return bfd_elf_allocate_object (abfd, sizeof (struct alpha_elf_obj_tdata),
344
                                  ALPHA_ELF_DATA);
345
}
346
 
347
static bfd_boolean
348
elf64_alpha_object_p (bfd *abfd)
349
{
350
  /* Set the right machine number for an Alpha ELF file.  */
351
  return bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0);
352
}
353
 
354
/* A relocation function which doesn't do anything.  */
355
 
356
static bfd_reloc_status_type
357
elf64_alpha_reloc_nil (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc,
358
                       asymbol *sym ATTRIBUTE_UNUSED,
359
                       PTR data ATTRIBUTE_UNUSED, asection *sec,
360
                       bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
361
{
362
  if (output_bfd)
363
    reloc->address += sec->output_offset;
364
  return bfd_reloc_ok;
365
}
366
 
367
/* A relocation function used for an unsupported reloc.  */
368
 
369
static bfd_reloc_status_type
370
elf64_alpha_reloc_bad (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc,
371
                       asymbol *sym ATTRIBUTE_UNUSED,
372
                       PTR data ATTRIBUTE_UNUSED, asection *sec,
373
                       bfd *output_bfd, char **error_message ATTRIBUTE_UNUSED)
374
{
375
  if (output_bfd)
376
    reloc->address += sec->output_offset;
377
  return bfd_reloc_notsupported;
378
}
379
 
380
/* Do the work of the GPDISP relocation.  */
381
 
382
static bfd_reloc_status_type
383
elf64_alpha_do_reloc_gpdisp (bfd *abfd, bfd_vma gpdisp, bfd_byte *p_ldah,
384
                             bfd_byte *p_lda)
385
{
386
  bfd_reloc_status_type ret = bfd_reloc_ok;
387
  bfd_vma addend;
388
  unsigned long i_ldah, i_lda;
389
 
390
  i_ldah = bfd_get_32 (abfd, p_ldah);
391
  i_lda = bfd_get_32 (abfd, p_lda);
392
 
393
  /* Complain if the instructions are not correct.  */
394
  if (((i_ldah >> 26) & 0x3f) != 0x09
395
      || ((i_lda >> 26) & 0x3f) != 0x08)
396
    ret = bfd_reloc_dangerous;
397
 
398
  /* Extract the user-supplied offset, mirroring the sign extensions
399
     that the instructions perform.  */
400
  addend = ((i_ldah & 0xffff) << 16) | (i_lda & 0xffff);
401
  addend = (addend ^ 0x80008000) - 0x80008000;
402
 
403
  gpdisp += addend;
404
 
405
  if ((bfd_signed_vma) gpdisp < -(bfd_signed_vma) 0x80000000
406
      || (bfd_signed_vma) gpdisp >= (bfd_signed_vma) 0x7fff8000)
407
    ret = bfd_reloc_overflow;
408
 
409
  /* compensate for the sign extension again.  */
410
  i_ldah = ((i_ldah & 0xffff0000)
411
            | (((gpdisp >> 16) + ((gpdisp >> 15) & 1)) & 0xffff));
412
  i_lda = (i_lda & 0xffff0000) | (gpdisp & 0xffff);
413
 
414
  bfd_put_32 (abfd, (bfd_vma) i_ldah, p_ldah);
415
  bfd_put_32 (abfd, (bfd_vma) i_lda, p_lda);
416
 
417
  return ret;
418
}
419
 
420
/* The special function for the GPDISP reloc.  */
421
 
422
static bfd_reloc_status_type
423
elf64_alpha_reloc_gpdisp (bfd *abfd, arelent *reloc_entry,
424
                          asymbol *sym ATTRIBUTE_UNUSED, PTR data,
425
                          asection *input_section, bfd *output_bfd,
426
                          char **err_msg)
427
{
428
  bfd_reloc_status_type ret;
429
  bfd_vma gp, relocation;
430
  bfd_vma high_address;
431
  bfd_byte *p_ldah, *p_lda;
432
 
433
  /* Don't do anything if we're not doing a final link.  */
434
  if (output_bfd)
435
    {
436
      reloc_entry->address += input_section->output_offset;
437
      return bfd_reloc_ok;
438
    }
439
 
440
  high_address = bfd_get_section_limit (abfd, input_section);
441
  if (reloc_entry->address > high_address
442
      || reloc_entry->address + reloc_entry->addend > high_address)
443
    return bfd_reloc_outofrange;
444
 
445
  /* The gp used in the portion of the output object to which this
446
     input object belongs is cached on the input bfd.  */
447
  gp = _bfd_get_gp_value (abfd);
448
 
449
  relocation = (input_section->output_section->vma
450
                + input_section->output_offset
451
                + reloc_entry->address);
452
 
453
  p_ldah = (bfd_byte *) data + reloc_entry->address;
454
  p_lda = p_ldah + reloc_entry->addend;
455
 
456
  ret = elf64_alpha_do_reloc_gpdisp (abfd, gp - relocation, p_ldah, p_lda);
457
 
458
  /* Complain if the instructions are not correct.  */
459
  if (ret == bfd_reloc_dangerous)
460
    *err_msg = _("GPDISP relocation did not find ldah and lda instructions");
461
 
462
  return ret;
463
}
464
 
465
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
466
   from smaller values.  Start with zero, widen, *then* decrement.  */
467
#define MINUS_ONE       (((bfd_vma)0) - 1)
468
 
469
 
470
#define SKIP_HOWTO(N) \
471
  HOWTO(N, 0, 0, 0, 0, 0, complain_overflow_dont, elf64_alpha_reloc_bad, 0, 0, 0, 0, 0)
472
 
473
static reloc_howto_type elf64_alpha_howto_table[] =
474
{
475
  HOWTO (R_ALPHA_NONE,          /* type */
476
         0,                      /* rightshift */
477
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
478
         8,                     /* bitsize */
479
         TRUE,                  /* pc_relative */
480
         0,                      /* bitpos */
481
         complain_overflow_dont, /* complain_on_overflow */
482
         elf64_alpha_reloc_nil, /* special_function */
483
         "NONE",                /* name */
484
         FALSE,                 /* partial_inplace */
485
         0,                      /* src_mask */
486
         0,                      /* dst_mask */
487
         TRUE),                 /* pcrel_offset */
488
 
489
  /* A 32 bit reference to a symbol.  */
490
  HOWTO (R_ALPHA_REFLONG,       /* type */
491
         0,                      /* rightshift */
492
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
493
         32,                    /* bitsize */
494
         FALSE,                 /* pc_relative */
495
         0,                      /* bitpos */
496
         complain_overflow_bitfield, /* complain_on_overflow */
497
         bfd_elf_generic_reloc, /* special_function */
498
         "REFLONG",             /* name */
499
         FALSE,                 /* partial_inplace */
500
         0xffffffff,            /* src_mask */
501
         0xffffffff,            /* dst_mask */
502
         FALSE),                /* pcrel_offset */
503
 
504
  /* A 64 bit reference to a symbol.  */
505
  HOWTO (R_ALPHA_REFQUAD,       /* type */
506
         0,                      /* rightshift */
507
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
508
         64,                    /* bitsize */
509
         FALSE,                 /* pc_relative */
510
         0,                      /* bitpos */
511
         complain_overflow_bitfield, /* complain_on_overflow */
512
         bfd_elf_generic_reloc, /* special_function */
513
         "REFQUAD",             /* name */
514
         FALSE,                 /* partial_inplace */
515
         MINUS_ONE,             /* src_mask */
516
         MINUS_ONE,             /* dst_mask */
517
         FALSE),                /* pcrel_offset */
518
 
519
  /* A 32 bit GP relative offset.  This is just like REFLONG except
520
     that when the value is used the value of the gp register will be
521
     added in.  */
522
  HOWTO (R_ALPHA_GPREL32,       /* type */
523
         0,                      /* rightshift */
524
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
525
         32,                    /* bitsize */
526
         FALSE,                 /* pc_relative */
527
         0,                      /* bitpos */
528
         complain_overflow_bitfield, /* complain_on_overflow */
529
         bfd_elf_generic_reloc, /* special_function */
530
         "GPREL32",             /* name */
531
         FALSE,                 /* partial_inplace */
532
         0xffffffff,            /* src_mask */
533
         0xffffffff,            /* dst_mask */
534
         FALSE),                /* pcrel_offset */
535
 
536
  /* Used for an instruction that refers to memory off the GP register.  */
537
  HOWTO (R_ALPHA_LITERAL,       /* type */
538
         0,                      /* rightshift */
539
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
540
         16,                    /* bitsize */
541
         FALSE,                 /* pc_relative */
542
         0,                      /* bitpos */
543
         complain_overflow_signed, /* complain_on_overflow */
544
         bfd_elf_generic_reloc, /* special_function */
545
         "ELF_LITERAL",         /* name */
546
         FALSE,                 /* partial_inplace */
547
         0xffff,                /* src_mask */
548
         0xffff,                /* dst_mask */
549
         FALSE),                /* pcrel_offset */
550
 
551
  /* This reloc only appears immediately following an ELF_LITERAL reloc.
552
     It identifies a use of the literal.  The symbol index is special:
553
     1 means the literal address is in the base register of a memory
554
     format instruction; 2 means the literal address is in the byte
555
     offset register of a byte-manipulation instruction; 3 means the
556
     literal address is in the target register of a jsr instruction.
557
     This does not actually do any relocation.  */
558
  HOWTO (R_ALPHA_LITUSE,        /* type */
559
         0,                      /* rightshift */
560
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
561
         32,                    /* bitsize */
562
         FALSE,                 /* pc_relative */
563
         0,                      /* bitpos */
564
         complain_overflow_dont, /* complain_on_overflow */
565
         elf64_alpha_reloc_nil, /* special_function */
566
         "LITUSE",              /* name */
567
         FALSE,                 /* partial_inplace */
568
         0,                      /* src_mask */
569
         0,                      /* dst_mask */
570
         FALSE),                /* pcrel_offset */
571
 
572
  /* Load the gp register.  This is always used for a ldah instruction
573
     which loads the upper 16 bits of the gp register.  The symbol
574
     index of the GPDISP instruction is an offset in bytes to the lda
575
     instruction that loads the lower 16 bits.  The value to use for
576
     the relocation is the difference between the GP value and the
577
     current location; the load will always be done against a register
578
     holding the current address.
579
 
580
     NOTE: Unlike ECOFF, partial in-place relocation is not done.  If
581
     any offset is present in the instructions, it is an offset from
582
     the register to the ldah instruction.  This lets us avoid any
583
     stupid hackery like inventing a gp value to do partial relocation
584
     against.  Also unlike ECOFF, we do the whole relocation off of
585
     the GPDISP rather than a GPDISP_HI16/GPDISP_LO16 pair.  An odd,
586
     space consuming bit, that, since all the information was present
587
     in the GPDISP_HI16 reloc.  */
588
  HOWTO (R_ALPHA_GPDISP,        /* type */
589
         16,                    /* rightshift */
590
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
591
         16,                    /* bitsize */
592
         FALSE,                 /* pc_relative */
593
         0,                      /* bitpos */
594
         complain_overflow_dont, /* complain_on_overflow */
595
         elf64_alpha_reloc_gpdisp, /* special_function */
596
         "GPDISP",              /* name */
597
         FALSE,                 /* partial_inplace */
598
         0xffff,                /* src_mask */
599
         0xffff,                /* dst_mask */
600
         TRUE),                 /* pcrel_offset */
601
 
602
  /* A 21 bit branch.  */
603
  HOWTO (R_ALPHA_BRADDR,        /* type */
604
         2,                     /* rightshift */
605
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
606
         21,                    /* bitsize */
607
         TRUE,                  /* pc_relative */
608
         0,                      /* bitpos */
609
         complain_overflow_signed, /* complain_on_overflow */
610
         bfd_elf_generic_reloc, /* special_function */
611
         "BRADDR",              /* name */
612
         FALSE,                 /* partial_inplace */
613
         0x1fffff,              /* src_mask */
614
         0x1fffff,              /* dst_mask */
615
         TRUE),                 /* pcrel_offset */
616
 
617
  /* A hint for a jump to a register.  */
618
  HOWTO (R_ALPHA_HINT,          /* type */
619
         2,                     /* rightshift */
620
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
621
         14,                    /* bitsize */
622
         TRUE,                  /* pc_relative */
623
         0,                      /* bitpos */
624
         complain_overflow_dont, /* complain_on_overflow */
625
         bfd_elf_generic_reloc, /* special_function */
626
         "HINT",                /* name */
627
         FALSE,                 /* partial_inplace */
628
         0x3fff,                /* src_mask */
629
         0x3fff,                /* dst_mask */
630
         TRUE),                 /* pcrel_offset */
631
 
632
  /* 16 bit PC relative offset.  */
633
  HOWTO (R_ALPHA_SREL16,        /* type */
634
         0,                      /* rightshift */
635
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
636
         16,                    /* bitsize */
637
         TRUE,                  /* pc_relative */
638
         0,                      /* bitpos */
639
         complain_overflow_signed, /* complain_on_overflow */
640
         bfd_elf_generic_reloc, /* special_function */
641
         "SREL16",              /* name */
642
         FALSE,                 /* partial_inplace */
643
         0xffff,                /* src_mask */
644
         0xffff,                /* dst_mask */
645
         TRUE),                 /* pcrel_offset */
646
 
647
  /* 32 bit PC relative offset.  */
648
  HOWTO (R_ALPHA_SREL32,        /* type */
649
         0,                      /* rightshift */
650
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
651
         32,                    /* bitsize */
652
         TRUE,                  /* pc_relative */
653
         0,                      /* bitpos */
654
         complain_overflow_signed, /* complain_on_overflow */
655
         bfd_elf_generic_reloc, /* special_function */
656
         "SREL32",              /* name */
657
         FALSE,                 /* partial_inplace */
658
         0xffffffff,            /* src_mask */
659
         0xffffffff,            /* dst_mask */
660
         TRUE),                 /* pcrel_offset */
661
 
662
  /* A 64 bit PC relative offset.  */
663
  HOWTO (R_ALPHA_SREL64,        /* type */
664
         0,                      /* rightshift */
665
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
666
         64,                    /* bitsize */
667
         TRUE,                  /* pc_relative */
668
         0,                      /* bitpos */
669
         complain_overflow_signed, /* complain_on_overflow */
670
         bfd_elf_generic_reloc, /* special_function */
671
         "SREL64",              /* name */
672
         FALSE,                 /* partial_inplace */
673
         MINUS_ONE,             /* src_mask */
674
         MINUS_ONE,             /* dst_mask */
675
         TRUE),                 /* pcrel_offset */
676
 
677
  /* Skip 12 - 16; deprecated ECOFF relocs.  */
678
  SKIP_HOWTO (12),
679
  SKIP_HOWTO (13),
680
  SKIP_HOWTO (14),
681
  SKIP_HOWTO (15),
682
  SKIP_HOWTO (16),
683
 
684
  /* The high 16 bits of the displacement from GP to the target.  */
685
  HOWTO (R_ALPHA_GPRELHIGH,
686
         0,                      /* rightshift */
687
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
688
         16,                    /* bitsize */
689
         FALSE,                 /* pc_relative */
690
         0,                      /* bitpos */
691
         complain_overflow_signed, /* complain_on_overflow */
692
         bfd_elf_generic_reloc, /* special_function */
693
         "GPRELHIGH",           /* name */
694
         FALSE,                 /* partial_inplace */
695
         0xffff,                /* src_mask */
696
         0xffff,                /* dst_mask */
697
         FALSE),                /* pcrel_offset */
698
 
699
  /* The low 16 bits of the displacement from GP to the target.  */
700
  HOWTO (R_ALPHA_GPRELLOW,
701
         0,                      /* rightshift */
702
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
703
         16,                    /* bitsize */
704
         FALSE,                 /* pc_relative */
705
         0,                      /* bitpos */
706
         complain_overflow_dont, /* complain_on_overflow */
707
         bfd_elf_generic_reloc, /* special_function */
708
         "GPRELLOW",            /* name */
709
         FALSE,                 /* partial_inplace */
710
         0xffff,                /* src_mask */
711
         0xffff,                /* dst_mask */
712
         FALSE),                /* pcrel_offset */
713
 
714
  /* A 16-bit displacement from the GP to the target.  */
715
  HOWTO (R_ALPHA_GPREL16,
716
         0,                      /* rightshift */
717
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
718
         16,                    /* bitsize */
719
         FALSE,                 /* pc_relative */
720
         0,                      /* bitpos */
721
         complain_overflow_signed, /* complain_on_overflow */
722
         bfd_elf_generic_reloc, /* special_function */
723
         "GPREL16",             /* name */
724
         FALSE,                 /* partial_inplace */
725
         0xffff,                /* src_mask */
726
         0xffff,                /* dst_mask */
727
         FALSE),                /* pcrel_offset */
728
 
729
  /* Skip 20 - 23; deprecated ECOFF relocs.  */
730
  SKIP_HOWTO (20),
731
  SKIP_HOWTO (21),
732
  SKIP_HOWTO (22),
733
  SKIP_HOWTO (23),
734
 
735
  /* Misc ELF relocations.  */
736
 
737
  /* A dynamic relocation to copy the target into our .dynbss section.  */
738
  /* Not generated, as all Alpha objects use PIC, so it is not needed.  It
739
     is present because every other ELF has one, but should not be used
740
     because .dynbss is an ugly thing.  */
741
  HOWTO (R_ALPHA_COPY,
742
         0,
743
         0,
744
         0,
745
         FALSE,
746
         0,
747
         complain_overflow_dont,
748
         bfd_elf_generic_reloc,
749
         "COPY",
750
         FALSE,
751
         0,
752
         0,
753
         TRUE),
754
 
755
  /* A dynamic relocation for a .got entry.  */
756
  HOWTO (R_ALPHA_GLOB_DAT,
757
         0,
758
         0,
759
         0,
760
         FALSE,
761
         0,
762
         complain_overflow_dont,
763
         bfd_elf_generic_reloc,
764
         "GLOB_DAT",
765
         FALSE,
766
         0,
767
         0,
768
         TRUE),
769
 
770
  /* A dynamic relocation for a .plt entry.  */
771
  HOWTO (R_ALPHA_JMP_SLOT,
772
         0,
773
         0,
774
         0,
775
         FALSE,
776
         0,
777
         complain_overflow_dont,
778
         bfd_elf_generic_reloc,
779
         "JMP_SLOT",
780
         FALSE,
781
         0,
782
         0,
783
         TRUE),
784
 
785
  /* A dynamic relocation to add the base of the DSO to a 64-bit field.  */
786
  HOWTO (R_ALPHA_RELATIVE,
787
         0,
788
         0,
789
         0,
790
         FALSE,
791
         0,
792
         complain_overflow_dont,
793
         bfd_elf_generic_reloc,
794
         "RELATIVE",
795
         FALSE,
796
         0,
797
         0,
798
         TRUE),
799
 
800
  /* A 21 bit branch that adjusts for gp loads.  */
801
  HOWTO (R_ALPHA_BRSGP,         /* type */
802
         2,                     /* rightshift */
803
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
804
         21,                    /* bitsize */
805
         TRUE,                  /* pc_relative */
806
         0,                      /* bitpos */
807
         complain_overflow_signed, /* complain_on_overflow */
808
         bfd_elf_generic_reloc, /* special_function */
809
         "BRSGP",               /* name */
810
         FALSE,                 /* partial_inplace */
811
         0x1fffff,              /* src_mask */
812
         0x1fffff,              /* dst_mask */
813
         TRUE),                 /* pcrel_offset */
814
 
815
  /* Creates a tls_index for the symbol in the got.  */
816
  HOWTO (R_ALPHA_TLSGD,         /* type */
817
         0,                      /* rightshift */
818
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
819
         16,                    /* bitsize */
820
         FALSE,                 /* pc_relative */
821
         0,                      /* bitpos */
822
         complain_overflow_signed, /* complain_on_overflow */
823
         bfd_elf_generic_reloc, /* special_function */
824
         "TLSGD",               /* name */
825
         FALSE,                 /* partial_inplace */
826
         0xffff,                /* src_mask */
827
         0xffff,                /* dst_mask */
828
         FALSE),                /* pcrel_offset */
829
 
830
  /* Creates a tls_index for the (current) module in the got.  */
831
  HOWTO (R_ALPHA_TLSLDM,        /* type */
832
         0,                      /* rightshift */
833
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
834
         16,                    /* bitsize */
835
         FALSE,                 /* pc_relative */
836
         0,                      /* bitpos */
837
         complain_overflow_signed, /* complain_on_overflow */
838
         bfd_elf_generic_reloc, /* special_function */
839
         "TLSLDM",              /* name */
840
         FALSE,                 /* partial_inplace */
841
         0xffff,                /* src_mask */
842
         0xffff,                /* dst_mask */
843
         FALSE),                /* pcrel_offset */
844
 
845
  /* A dynamic relocation for a DTP module entry.  */
846
  HOWTO (R_ALPHA_DTPMOD64,      /* type */
847
         0,                      /* rightshift */
848
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
849
         64,                    /* bitsize */
850
         FALSE,                 /* pc_relative */
851
         0,                      /* bitpos */
852
         complain_overflow_bitfield, /* complain_on_overflow */
853
         bfd_elf_generic_reloc, /* special_function */
854
         "DTPMOD64",            /* name */
855
         FALSE,                 /* partial_inplace */
856
         MINUS_ONE,             /* src_mask */
857
         MINUS_ONE,             /* dst_mask */
858
         FALSE),                /* pcrel_offset */
859
 
860
  /* Creates a 64-bit offset in the got for the displacement
861
     from DTP to the target.  */
862
  HOWTO (R_ALPHA_GOTDTPREL,     /* type */
863
         0,                      /* rightshift */
864
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
865
         16,                    /* bitsize */
866
         FALSE,                 /* pc_relative */
867
         0,                      /* bitpos */
868
         complain_overflow_signed, /* complain_on_overflow */
869
         bfd_elf_generic_reloc, /* special_function */
870
         "GOTDTPREL",           /* name */
871
         FALSE,                 /* partial_inplace */
872
         0xffff,                /* src_mask */
873
         0xffff,                /* dst_mask */
874
         FALSE),                /* pcrel_offset */
875
 
876
  /* A dynamic relocation for a displacement from DTP to the target.  */
877
  HOWTO (R_ALPHA_DTPREL64,      /* type */
878
         0,                      /* rightshift */
879
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
880
         64,                    /* bitsize */
881
         FALSE,                 /* pc_relative */
882
         0,                      /* bitpos */
883
         complain_overflow_bitfield, /* complain_on_overflow */
884
         bfd_elf_generic_reloc, /* special_function */
885
         "DTPREL64",            /* name */
886
         FALSE,                 /* partial_inplace */
887
         MINUS_ONE,             /* src_mask */
888
         MINUS_ONE,             /* dst_mask */
889
         FALSE),                /* pcrel_offset */
890
 
891
  /* The high 16 bits of the displacement from DTP to the target.  */
892
  HOWTO (R_ALPHA_DTPRELHI,      /* type */
893
         0,                      /* rightshift */
894
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
895
         16,                    /* bitsize */
896
         FALSE,                 /* pc_relative */
897
         0,                      /* bitpos */
898
         complain_overflow_signed, /* complain_on_overflow */
899
         bfd_elf_generic_reloc, /* special_function */
900
         "DTPRELHI",            /* name */
901
         FALSE,                 /* partial_inplace */
902
         0xffff,                /* src_mask */
903
         0xffff,                /* dst_mask */
904
         FALSE),                /* pcrel_offset */
905
 
906
  /* The low 16 bits of the displacement from DTP to the target.  */
907
  HOWTO (R_ALPHA_DTPRELLO,      /* type */
908
         0,                      /* rightshift */
909
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
910
         16,                    /* bitsize */
911
         FALSE,                 /* pc_relative */
912
         0,                      /* bitpos */
913
         complain_overflow_dont, /* complain_on_overflow */
914
         bfd_elf_generic_reloc, /* special_function */
915
         "DTPRELLO",            /* name */
916
         FALSE,                 /* partial_inplace */
917
         0xffff,                /* src_mask */
918
         0xffff,                /* dst_mask */
919
         FALSE),                /* pcrel_offset */
920
 
921
  /* A 16-bit displacement from DTP to the target.  */
922
  HOWTO (R_ALPHA_DTPREL16,      /* type */
923
         0,                      /* rightshift */
924
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
925
         16,                    /* bitsize */
926
         FALSE,                 /* pc_relative */
927
         0,                      /* bitpos */
928
         complain_overflow_signed, /* complain_on_overflow */
929
         bfd_elf_generic_reloc, /* special_function */
930
         "DTPREL16",            /* name */
931
         FALSE,                 /* partial_inplace */
932
         0xffff,                /* src_mask */
933
         0xffff,                /* dst_mask */
934
         FALSE),                /* pcrel_offset */
935
 
936
  /* Creates a 64-bit offset in the got for the displacement
937
     from TP to the target.  */
938
  HOWTO (R_ALPHA_GOTTPREL,      /* type */
939
         0,                      /* rightshift */
940
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
941
         16,                    /* bitsize */
942
         FALSE,                 /* pc_relative */
943
         0,                      /* bitpos */
944
         complain_overflow_signed, /* complain_on_overflow */
945
         bfd_elf_generic_reloc, /* special_function */
946
         "GOTTPREL",            /* name */
947
         FALSE,                 /* partial_inplace */
948
         0xffff,                /* src_mask */
949
         0xffff,                /* dst_mask */
950
         FALSE),                /* pcrel_offset */
951
 
952
  /* A dynamic relocation for a displacement from TP to the target.  */
953
  HOWTO (R_ALPHA_TPREL64,       /* type */
954
         0,                      /* rightshift */
955
         4,                     /* size (0 = byte, 1 = short, 2 = long) */
956
         64,                    /* bitsize */
957
         FALSE,                 /* pc_relative */
958
         0,                      /* bitpos */
959
         complain_overflow_bitfield, /* complain_on_overflow */
960
         bfd_elf_generic_reloc, /* special_function */
961
         "TPREL64",             /* name */
962
         FALSE,                 /* partial_inplace */
963
         MINUS_ONE,             /* src_mask */
964
         MINUS_ONE,             /* dst_mask */
965
         FALSE),                /* pcrel_offset */
966
 
967
  /* The high 16 bits of the displacement from TP to the target.  */
968
  HOWTO (R_ALPHA_TPRELHI,       /* type */
969
         0,                      /* rightshift */
970
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
971
         16,                    /* bitsize */
972
         FALSE,                 /* pc_relative */
973
         0,                      /* bitpos */
974
         complain_overflow_signed, /* complain_on_overflow */
975
         bfd_elf_generic_reloc, /* special_function */
976
         "TPRELHI",             /* name */
977
         FALSE,                 /* partial_inplace */
978
         0xffff,                /* src_mask */
979
         0xffff,                /* dst_mask */
980
         FALSE),                /* pcrel_offset */
981
 
982
  /* The low 16 bits of the displacement from TP to the target.  */
983
  HOWTO (R_ALPHA_TPRELLO,       /* type */
984
         0,                      /* rightshift */
985
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
986
         16,                    /* bitsize */
987
         FALSE,                 /* pc_relative */
988
         0,                      /* bitpos */
989
         complain_overflow_dont, /* complain_on_overflow */
990
         bfd_elf_generic_reloc, /* special_function */
991
         "TPRELLO",             /* name */
992
         FALSE,                 /* partial_inplace */
993
         0xffff,                /* src_mask */
994
         0xffff,                /* dst_mask */
995
         FALSE),                /* pcrel_offset */
996
 
997
  /* A 16-bit displacement from TP to the target.  */
998
  HOWTO (R_ALPHA_TPREL16,       /* type */
999
         0,                      /* rightshift */
1000
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
1001
         16,                    /* bitsize */
1002
         FALSE,                 /* pc_relative */
1003
         0,                      /* bitpos */
1004
         complain_overflow_signed, /* complain_on_overflow */
1005
         bfd_elf_generic_reloc, /* special_function */
1006
         "TPREL16",             /* name */
1007
         FALSE,                 /* partial_inplace */
1008
         0xffff,                /* src_mask */
1009
         0xffff,                /* dst_mask */
1010
         FALSE),                /* pcrel_offset */
1011
};
1012
 
1013
/* A mapping from BFD reloc types to Alpha ELF reloc types.  */
1014
 
1015
struct elf_reloc_map
1016
{
1017
  bfd_reloc_code_real_type bfd_reloc_val;
1018
  int elf_reloc_val;
1019
};
1020
 
1021
static const struct elf_reloc_map elf64_alpha_reloc_map[] =
1022
{
1023
  {BFD_RELOC_NONE,                      R_ALPHA_NONE},
1024
  {BFD_RELOC_32,                        R_ALPHA_REFLONG},
1025
  {BFD_RELOC_64,                        R_ALPHA_REFQUAD},
1026
  {BFD_RELOC_CTOR,                      R_ALPHA_REFQUAD},
1027
  {BFD_RELOC_GPREL32,                   R_ALPHA_GPREL32},
1028
  {BFD_RELOC_ALPHA_ELF_LITERAL,         R_ALPHA_LITERAL},
1029
  {BFD_RELOC_ALPHA_LITUSE,              R_ALPHA_LITUSE},
1030
  {BFD_RELOC_ALPHA_GPDISP,              R_ALPHA_GPDISP},
1031
  {BFD_RELOC_23_PCREL_S2,               R_ALPHA_BRADDR},
1032
  {BFD_RELOC_ALPHA_HINT,                R_ALPHA_HINT},
1033
  {BFD_RELOC_16_PCREL,                  R_ALPHA_SREL16},
1034
  {BFD_RELOC_32_PCREL,                  R_ALPHA_SREL32},
1035
  {BFD_RELOC_64_PCREL,                  R_ALPHA_SREL64},
1036
  {BFD_RELOC_ALPHA_GPREL_HI16,          R_ALPHA_GPRELHIGH},
1037
  {BFD_RELOC_ALPHA_GPREL_LO16,          R_ALPHA_GPRELLOW},
1038
  {BFD_RELOC_GPREL16,                   R_ALPHA_GPREL16},
1039
  {BFD_RELOC_ALPHA_BRSGP,               R_ALPHA_BRSGP},
1040
  {BFD_RELOC_ALPHA_TLSGD,               R_ALPHA_TLSGD},
1041
  {BFD_RELOC_ALPHA_TLSLDM,              R_ALPHA_TLSLDM},
1042
  {BFD_RELOC_ALPHA_DTPMOD64,            R_ALPHA_DTPMOD64},
1043
  {BFD_RELOC_ALPHA_GOTDTPREL16,         R_ALPHA_GOTDTPREL},
1044
  {BFD_RELOC_ALPHA_DTPREL64,            R_ALPHA_DTPREL64},
1045
  {BFD_RELOC_ALPHA_DTPREL_HI16,         R_ALPHA_DTPRELHI},
1046
  {BFD_RELOC_ALPHA_DTPREL_LO16,         R_ALPHA_DTPRELLO},
1047
  {BFD_RELOC_ALPHA_DTPREL16,            R_ALPHA_DTPREL16},
1048
  {BFD_RELOC_ALPHA_GOTTPREL16,          R_ALPHA_GOTTPREL},
1049
  {BFD_RELOC_ALPHA_TPREL64,             R_ALPHA_TPREL64},
1050
  {BFD_RELOC_ALPHA_TPREL_HI16,          R_ALPHA_TPRELHI},
1051
  {BFD_RELOC_ALPHA_TPREL_LO16,          R_ALPHA_TPRELLO},
1052
  {BFD_RELOC_ALPHA_TPREL16,             R_ALPHA_TPREL16},
1053
};
1054
 
1055
/* Given a BFD reloc type, return a HOWTO structure.  */
1056
 
1057
static reloc_howto_type *
1058
elf64_alpha_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1059
                                   bfd_reloc_code_real_type code)
1060
{
1061
  const struct elf_reloc_map *i, *e;
1062
  i = e = elf64_alpha_reloc_map;
1063
  e += sizeof (elf64_alpha_reloc_map) / sizeof (struct elf_reloc_map);
1064
  for (; i != e; ++i)
1065
    {
1066
      if (i->bfd_reloc_val == code)
1067
        return &elf64_alpha_howto_table[i->elf_reloc_val];
1068
    }
1069
  return 0;
1070
}
1071
 
1072
static reloc_howto_type *
1073
elf64_alpha_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1074
                                   const char *r_name)
1075
{
1076
  unsigned int i;
1077
 
1078
  for (i = 0;
1079
       i < (sizeof (elf64_alpha_howto_table)
1080
            / sizeof (elf64_alpha_howto_table[0]));
1081
       i++)
1082
    if (elf64_alpha_howto_table[i].name != NULL
1083
        && strcasecmp (elf64_alpha_howto_table[i].name, r_name) == 0)
1084
      return &elf64_alpha_howto_table[i];
1085
 
1086
  return NULL;
1087
}
1088
 
1089
/* Given an Alpha ELF reloc type, fill in an arelent structure.  */
1090
 
1091
static void
1092
elf64_alpha_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
1093
                           Elf_Internal_Rela *dst)
1094
{
1095
  unsigned r_type = ELF64_R_TYPE(dst->r_info);
1096
  BFD_ASSERT (r_type < (unsigned int) R_ALPHA_max);
1097
  cache_ptr->howto = &elf64_alpha_howto_table[r_type];
1098
}
1099
 
1100
/* These two relocations create a two-word entry in the got.  */
1101
#define alpha_got_entry_size(r_type) \
1102
  (r_type == R_ALPHA_TLSGD || r_type == R_ALPHA_TLSLDM ? 16 : 8)
1103
 
1104
/* This is PT_TLS segment p_vaddr.  */
1105
#define alpha_get_dtprel_base(info) \
1106
  (elf_hash_table (info)->tls_sec->vma)
1107
 
1108
/* Main program TLS (whose template starts at PT_TLS p_vaddr)
1109
   is assigned offset round(16, PT_TLS p_align).  */
1110
#define alpha_get_tprel_base(info) \
1111
  (elf_hash_table (info)->tls_sec->vma                                  \
1112
   - align_power ((bfd_vma) 16,                                         \
1113
                  elf_hash_table (info)->tls_sec->alignment_power))
1114
 
1115
/* Handle an Alpha specific section when reading an object file.  This
1116
   is called when bfd_section_from_shdr finds a section with an unknown
1117
   type.
1118
   FIXME: We need to handle the SHF_ALPHA_GPREL flag, but I'm not sure
1119
   how to.  */
1120
 
1121
static bfd_boolean
1122
elf64_alpha_section_from_shdr (bfd *abfd,
1123
                               Elf_Internal_Shdr *hdr,
1124
                               const char *name,
1125
                               int shindex)
1126
{
1127
  asection *newsect;
1128
 
1129
  /* There ought to be a place to keep ELF backend specific flags, but
1130
     at the moment there isn't one.  We just keep track of the
1131
     sections by their name, instead.  Fortunately, the ABI gives
1132
     suggested names for all the MIPS specific sections, so we will
1133
     probably get away with this.  */
1134
  switch (hdr->sh_type)
1135
    {
1136
    case SHT_ALPHA_DEBUG:
1137
      if (strcmp (name, ".mdebug") != 0)
1138
        return FALSE;
1139
      break;
1140
    default:
1141
      return FALSE;
1142
    }
1143
 
1144
  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
1145
    return FALSE;
1146
  newsect = hdr->bfd_section;
1147
 
1148
  if (hdr->sh_type == SHT_ALPHA_DEBUG)
1149
    {
1150
      if (! bfd_set_section_flags (abfd, newsect,
1151
                                   (bfd_get_section_flags (abfd, newsect)
1152
                                    | SEC_DEBUGGING)))
1153
        return FALSE;
1154
    }
1155
 
1156
  return TRUE;
1157
}
1158
 
1159
/* Convert Alpha specific section flags to bfd internal section flags.  */
1160
 
1161
static bfd_boolean
1162
elf64_alpha_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr)
1163
{
1164
  if (hdr->sh_flags & SHF_ALPHA_GPREL)
1165
    *flags |= SEC_SMALL_DATA;
1166
 
1167
  return TRUE;
1168
}
1169
 
1170
/* Set the correct type for an Alpha ELF section.  We do this by the
1171
   section name, which is a hack, but ought to work.  */
1172
 
1173
static bfd_boolean
1174
elf64_alpha_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
1175
{
1176
  register const char *name;
1177
 
1178
  name = bfd_get_section_name (abfd, sec);
1179
 
1180
  if (strcmp (name, ".mdebug") == 0)
1181
    {
1182
      hdr->sh_type = SHT_ALPHA_DEBUG;
1183
      /* In a shared object on Irix 5.3, the .mdebug section has an
1184
         entsize of 0.  FIXME: Does this matter?  */
1185
      if ((abfd->flags & DYNAMIC) != 0 )
1186
        hdr->sh_entsize = 0;
1187
      else
1188
        hdr->sh_entsize = 1;
1189
    }
1190
  else if ((sec->flags & SEC_SMALL_DATA)
1191
           || strcmp (name, ".sdata") == 0
1192
           || strcmp (name, ".sbss") == 0
1193
           || strcmp (name, ".lit4") == 0
1194
           || strcmp (name, ".lit8") == 0)
1195
    hdr->sh_flags |= SHF_ALPHA_GPREL;
1196
 
1197
  return TRUE;
1198
}
1199
 
1200
/* Hook called by the linker routine which adds symbols from an object
1201
   file.  We use it to put .comm items in .sbss, and not .bss.  */
1202
 
1203
static bfd_boolean
1204
elf64_alpha_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
1205
                             Elf_Internal_Sym *sym,
1206
                             const char **namep ATTRIBUTE_UNUSED,
1207
                             flagword *flagsp ATTRIBUTE_UNUSED,
1208
                             asection **secp, bfd_vma *valp)
1209
{
1210
  if (sym->st_shndx == SHN_COMMON
1211
      && !info->relocatable
1212
      && sym->st_size <= elf_gp_size (abfd))
1213
    {
1214
      /* Common symbols less than or equal to -G nn bytes are
1215
         automatically put into .sbss.  */
1216
 
1217
      asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
1218
 
1219
      if (scomm == NULL)
1220
        {
1221
          scomm = bfd_make_section_with_flags (abfd, ".scommon",
1222
                                               (SEC_ALLOC
1223
                                                | SEC_IS_COMMON
1224
                                                | SEC_LINKER_CREATED));
1225
          if (scomm == NULL)
1226
            return FALSE;
1227
        }
1228
 
1229
      *secp = scomm;
1230
      *valp = sym->st_size;
1231
    }
1232
 
1233
  return TRUE;
1234
}
1235
 
1236
/* Create the .got section.  */
1237
 
1238
static bfd_boolean
1239
elf64_alpha_create_got_section (bfd *abfd,
1240
                                struct bfd_link_info *info ATTRIBUTE_UNUSED)
1241
{
1242
  flagword flags;
1243
  asection *s;
1244
 
1245
  if (! is_alpha_elf (abfd))
1246
    return FALSE;
1247
 
1248
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1249
           | SEC_LINKER_CREATED);
1250
  s = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
1251
  if (s == NULL
1252
      || !bfd_set_section_alignment (abfd, s, 3))
1253
    return FALSE;
1254
 
1255
  alpha_elf_tdata (abfd)->got = s;
1256
 
1257
  /* Make sure the object's gotobj is set to itself so that we default
1258
     to every object with its own .got.  We'll merge .gots later once
1259
     we've collected each object's info.  */
1260
  alpha_elf_tdata (abfd)->gotobj = abfd;
1261
 
1262
  return TRUE;
1263
}
1264
 
1265
/* Create all the dynamic sections.  */
1266
 
1267
static bfd_boolean
1268
elf64_alpha_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
1269
{
1270
  asection *s;
1271
  flagword flags;
1272
  struct elf_link_hash_entry *h;
1273
 
1274
  if (! is_alpha_elf (abfd))
1275
    return FALSE;
1276
 
1277
  /* We need to create .plt, .rela.plt, .got, and .rela.got sections.  */
1278
 
1279
  flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1280
           | SEC_LINKER_CREATED
1281
           | (elf64_alpha_use_secureplt ? SEC_READONLY : 0));
1282
  s = bfd_make_section_anyway_with_flags (abfd, ".plt", flags);
1283
  if (s == NULL || ! bfd_set_section_alignment (abfd, s, 4))
1284
    return FALSE;
1285
 
1286
  /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
1287
     .plt section.  */
1288
  h = _bfd_elf_define_linkage_sym (abfd, info, s,
1289
                                   "_PROCEDURE_LINKAGE_TABLE_");
1290
  elf_hash_table (info)->hplt = h;
1291
  if (h == NULL)
1292
    return FALSE;
1293
 
1294
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1295
           | SEC_LINKER_CREATED | SEC_READONLY);
1296
  s = bfd_make_section_anyway_with_flags (abfd, ".rela.plt", flags);
1297
  if (s == NULL || ! bfd_set_section_alignment (abfd, s, 3))
1298
    return FALSE;
1299
 
1300
  if (elf64_alpha_use_secureplt)
1301
    {
1302
      flags = SEC_ALLOC | SEC_LINKER_CREATED;
1303
      s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags);
1304
      if (s == NULL || ! bfd_set_section_alignment (abfd, s, 3))
1305
        return FALSE;
1306
    }
1307
 
1308
  /* We may or may not have created a .got section for this object, but
1309
     we definitely havn't done the rest of the work.  */
1310
 
1311
  if (alpha_elf_tdata(abfd)->gotobj == NULL)
1312
    {
1313
      if (!elf64_alpha_create_got_section (abfd, info))
1314
        return FALSE;
1315
    }
1316
 
1317
  flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
1318
           | SEC_LINKER_CREATED | SEC_READONLY);
1319
  s = bfd_make_section_anyway_with_flags (abfd, ".rela.got", flags);
1320
  if (s == NULL
1321
      || !bfd_set_section_alignment (abfd, s, 3))
1322
    return FALSE;
1323
 
1324
  /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the
1325
     dynobj's .got section.  We don't do this in the linker script
1326
     because we don't want to define the symbol if we are not creating
1327
     a global offset table.  */
1328
  h = _bfd_elf_define_linkage_sym (abfd, info, alpha_elf_tdata(abfd)->got,
1329
                                   "_GLOBAL_OFFSET_TABLE_");
1330
  elf_hash_table (info)->hgot = h;
1331
  if (h == NULL)
1332
    return FALSE;
1333
 
1334
  return TRUE;
1335
}
1336
 
1337
/* Read ECOFF debugging information from a .mdebug section into a
1338
   ecoff_debug_info structure.  */
1339
 
1340
static bfd_boolean
1341
elf64_alpha_read_ecoff_info (bfd *abfd, asection *section,
1342
                             struct ecoff_debug_info *debug)
1343
{
1344
  HDRR *symhdr;
1345
  const struct ecoff_debug_swap *swap;
1346
  char *ext_hdr = NULL;
1347
 
1348
  swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1349
  memset (debug, 0, sizeof (*debug));
1350
 
1351
  ext_hdr = (char *) bfd_malloc (swap->external_hdr_size);
1352
  if (ext_hdr == NULL && swap->external_hdr_size != 0)
1353
    goto error_return;
1354
 
1355
  if (! bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0,
1356
                                  swap->external_hdr_size))
1357
    goto error_return;
1358
 
1359
  symhdr = &debug->symbolic_header;
1360
  (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
1361
 
1362
  /* The symbolic header contains absolute file offsets and sizes to
1363
     read.  */
1364
#define READ(ptr, offset, count, size, type)                            \
1365
  if (symhdr->count == 0)                                                \
1366
    debug->ptr = NULL;                                                  \
1367
  else                                                                  \
1368
    {                                                                   \
1369
      bfd_size_type amt = (bfd_size_type) size * symhdr->count;         \
1370
      debug->ptr = (type) bfd_malloc (amt);                             \
1371
      if (debug->ptr == NULL)                                           \
1372
        goto error_return;                                              \
1373
      if (bfd_seek (abfd, (file_ptr) symhdr->offset, SEEK_SET) != 0      \
1374
          || bfd_bread (debug->ptr, amt, abfd) != amt)                  \
1375
        goto error_return;                                              \
1376
    }
1377
 
1378
  READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
1379
  READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
1380
  READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
1381
  READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
1382
  READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
1383
  READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
1384
        union aux_ext *);
1385
  READ (ss, cbSsOffset, issMax, sizeof (char), char *);
1386
  READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
1387
  READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
1388
  READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
1389
  READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, PTR);
1390
#undef READ
1391
 
1392
  debug->fdr = NULL;
1393
 
1394
  return TRUE;
1395
 
1396
 error_return:
1397
  if (ext_hdr != NULL)
1398
    free (ext_hdr);
1399
  if (debug->line != NULL)
1400
    free (debug->line);
1401
  if (debug->external_dnr != NULL)
1402
    free (debug->external_dnr);
1403
  if (debug->external_pdr != NULL)
1404
    free (debug->external_pdr);
1405
  if (debug->external_sym != NULL)
1406
    free (debug->external_sym);
1407
  if (debug->external_opt != NULL)
1408
    free (debug->external_opt);
1409
  if (debug->external_aux != NULL)
1410
    free (debug->external_aux);
1411
  if (debug->ss != NULL)
1412
    free (debug->ss);
1413
  if (debug->ssext != NULL)
1414
    free (debug->ssext);
1415
  if (debug->external_fdr != NULL)
1416
    free (debug->external_fdr);
1417
  if (debug->external_rfd != NULL)
1418
    free (debug->external_rfd);
1419
  if (debug->external_ext != NULL)
1420
    free (debug->external_ext);
1421
  return FALSE;
1422
}
1423
 
1424
/* Alpha ELF local labels start with '$'.  */
1425
 
1426
static bfd_boolean
1427
elf64_alpha_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
1428
{
1429
  return name[0] == '$';
1430
}
1431
 
1432
/* Alpha ELF follows MIPS ELF in using a special find_nearest_line
1433
   routine in order to handle the ECOFF debugging information.  We
1434
   still call this mips_elf_find_line because of the slot
1435
   find_line_info in elf_obj_tdata is declared that way.  */
1436
 
1437
struct mips_elf_find_line
1438
{
1439
  struct ecoff_debug_info d;
1440
  struct ecoff_find_line i;
1441
};
1442
 
1443
static bfd_boolean
1444
elf64_alpha_find_nearest_line (bfd *abfd, asection *section, asymbol **symbols,
1445
                               bfd_vma offset, const char **filename_ptr,
1446
                               const char **functionname_ptr,
1447
                               unsigned int *line_ptr)
1448
{
1449
  asection *msec;
1450
 
1451
  if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
1452
                                     filename_ptr, functionname_ptr,
1453
                                     line_ptr, 0,
1454
                                     &elf_tdata (abfd)->dwarf2_find_line_info))
1455
    return TRUE;
1456
 
1457
  msec = bfd_get_section_by_name (abfd, ".mdebug");
1458
  if (msec != NULL)
1459
    {
1460
      flagword origflags;
1461
      struct mips_elf_find_line *fi;
1462
      const struct ecoff_debug_swap * const swap =
1463
        get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1464
 
1465
      /* If we are called during a link, alpha_elf_final_link may have
1466
         cleared the SEC_HAS_CONTENTS field.  We force it back on here
1467
         if appropriate (which it normally will be).  */
1468
      origflags = msec->flags;
1469
      if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
1470
        msec->flags |= SEC_HAS_CONTENTS;
1471
 
1472
      fi = elf_tdata (abfd)->find_line_info;
1473
      if (fi == NULL)
1474
        {
1475
          bfd_size_type external_fdr_size;
1476
          char *fraw_src;
1477
          char *fraw_end;
1478
          struct fdr *fdr_ptr;
1479
          bfd_size_type amt = sizeof (struct mips_elf_find_line);
1480
 
1481
          fi = (struct mips_elf_find_line *) bfd_zalloc (abfd, amt);
1482
          if (fi == NULL)
1483
            {
1484
              msec->flags = origflags;
1485
              return FALSE;
1486
            }
1487
 
1488
          if (!elf64_alpha_read_ecoff_info (abfd, msec, &fi->d))
1489
            {
1490
              msec->flags = origflags;
1491
              return FALSE;
1492
            }
1493
 
1494
          /* Swap in the FDR information.  */
1495
          amt = fi->d.symbolic_header.ifdMax * sizeof (struct fdr);
1496
          fi->d.fdr = (struct fdr *) bfd_alloc (abfd, amt);
1497
          if (fi->d.fdr == NULL)
1498
            {
1499
              msec->flags = origflags;
1500
              return FALSE;
1501
            }
1502
          external_fdr_size = swap->external_fdr_size;
1503
          fdr_ptr = fi->d.fdr;
1504
          fraw_src = (char *) fi->d.external_fdr;
1505
          fraw_end = (fraw_src
1506
                      + fi->d.symbolic_header.ifdMax * external_fdr_size);
1507
          for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
1508
            (*swap->swap_fdr_in) (abfd, (PTR) fraw_src, fdr_ptr);
1509
 
1510
          elf_tdata (abfd)->find_line_info = fi;
1511
 
1512
          /* Note that we don't bother to ever free this information.
1513
             find_nearest_line is either called all the time, as in
1514
             objdump -l, so the information should be saved, or it is
1515
             rarely called, as in ld error messages, so the memory
1516
             wasted is unimportant.  Still, it would probably be a
1517
             good idea for free_cached_info to throw it away.  */
1518
        }
1519
 
1520
      if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
1521
                                  &fi->i, filename_ptr, functionname_ptr,
1522
                                  line_ptr))
1523
        {
1524
          msec->flags = origflags;
1525
          return TRUE;
1526
        }
1527
 
1528
      msec->flags = origflags;
1529
    }
1530
 
1531
  /* Fall back on the generic ELF find_nearest_line routine.  */
1532
 
1533
  return _bfd_elf_find_nearest_line (abfd, section, symbols, offset,
1534
                                     filename_ptr, functionname_ptr,
1535
                                     line_ptr);
1536
}
1537
 
1538
/* Structure used to pass information to alpha_elf_output_extsym.  */
1539
 
1540
struct extsym_info
1541
{
1542
  bfd *abfd;
1543
  struct bfd_link_info *info;
1544
  struct ecoff_debug_info *debug;
1545
  const struct ecoff_debug_swap *swap;
1546
  bfd_boolean failed;
1547
};
1548
 
1549
static bfd_boolean
1550
elf64_alpha_output_extsym (struct alpha_elf_link_hash_entry *h, PTR data)
1551
{
1552
  struct extsym_info *einfo = (struct extsym_info *) data;
1553
  bfd_boolean strip;
1554
  asection *sec, *output_section;
1555
 
1556
  if (h->root.indx == -2)
1557
    strip = FALSE;
1558
  else if ((h->root.def_dynamic
1559
            || h->root.ref_dynamic
1560
            || h->root.root.type == bfd_link_hash_new)
1561
           && !h->root.def_regular
1562
           && !h->root.ref_regular)
1563
    strip = TRUE;
1564
  else if (einfo->info->strip == strip_all
1565
           || (einfo->info->strip == strip_some
1566
               && bfd_hash_lookup (einfo->info->keep_hash,
1567
                                   h->root.root.root.string,
1568
                                   FALSE, FALSE) == NULL))
1569
    strip = TRUE;
1570
  else
1571
    strip = FALSE;
1572
 
1573
  if (strip)
1574
    return TRUE;
1575
 
1576
  if (h->esym.ifd == -2)
1577
    {
1578
      h->esym.jmptbl = 0;
1579
      h->esym.cobol_main = 0;
1580
      h->esym.weakext = 0;
1581
      h->esym.reserved = 0;
1582
      h->esym.ifd = ifdNil;
1583
      h->esym.asym.value = 0;
1584
      h->esym.asym.st = stGlobal;
1585
 
1586
      if (h->root.root.type != bfd_link_hash_defined
1587
          && h->root.root.type != bfd_link_hash_defweak)
1588
        h->esym.asym.sc = scAbs;
1589
      else
1590
        {
1591
          const char *name;
1592
 
1593
          sec = h->root.root.u.def.section;
1594
          output_section = sec->output_section;
1595
 
1596
          /* When making a shared library and symbol h is the one from
1597
             the another shared library, OUTPUT_SECTION may be null.  */
1598
          if (output_section == NULL)
1599
            h->esym.asym.sc = scUndefined;
1600
          else
1601
            {
1602
              name = bfd_section_name (output_section->owner, output_section);
1603
 
1604
              if (strcmp (name, ".text") == 0)
1605
                h->esym.asym.sc = scText;
1606
              else if (strcmp (name, ".data") == 0)
1607
                h->esym.asym.sc = scData;
1608
              else if (strcmp (name, ".sdata") == 0)
1609
                h->esym.asym.sc = scSData;
1610
              else if (strcmp (name, ".rodata") == 0
1611
                       || strcmp (name, ".rdata") == 0)
1612
                h->esym.asym.sc = scRData;
1613
              else if (strcmp (name, ".bss") == 0)
1614
                h->esym.asym.sc = scBss;
1615
              else if (strcmp (name, ".sbss") == 0)
1616
                h->esym.asym.sc = scSBss;
1617
              else if (strcmp (name, ".init") == 0)
1618
                h->esym.asym.sc = scInit;
1619
              else if (strcmp (name, ".fini") == 0)
1620
                h->esym.asym.sc = scFini;
1621
              else
1622
                h->esym.asym.sc = scAbs;
1623
            }
1624
        }
1625
 
1626
      h->esym.asym.reserved = 0;
1627
      h->esym.asym.index = indexNil;
1628
    }
1629
 
1630
  if (h->root.root.type == bfd_link_hash_common)
1631
    h->esym.asym.value = h->root.root.u.c.size;
1632
  else if (h->root.root.type == bfd_link_hash_defined
1633
           || h->root.root.type == bfd_link_hash_defweak)
1634
    {
1635
      if (h->esym.asym.sc == scCommon)
1636
        h->esym.asym.sc = scBss;
1637
      else if (h->esym.asym.sc == scSCommon)
1638
        h->esym.asym.sc = scSBss;
1639
 
1640
      sec = h->root.root.u.def.section;
1641
      output_section = sec->output_section;
1642
      if (output_section != NULL)
1643
        h->esym.asym.value = (h->root.root.u.def.value
1644
                              + sec->output_offset
1645
                              + output_section->vma);
1646
      else
1647
        h->esym.asym.value = 0;
1648
    }
1649
 
1650
  if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
1651
                                      h->root.root.root.string,
1652
                                      &h->esym))
1653
    {
1654
      einfo->failed = TRUE;
1655
      return FALSE;
1656
    }
1657
 
1658
  return TRUE;
1659
}
1660
 
1661
/* Search for and possibly create a got entry.  */
1662
 
1663
static struct alpha_elf_got_entry *
1664
get_got_entry (bfd *abfd, struct alpha_elf_link_hash_entry *h,
1665
               unsigned long r_type, unsigned long r_symndx,
1666
               bfd_vma r_addend)
1667
{
1668
  struct alpha_elf_got_entry *gotent;
1669
  struct alpha_elf_got_entry **slot;
1670
 
1671
  if (h)
1672
    slot = &h->got_entries;
1673
  else
1674
    {
1675
      /* This is a local .got entry -- record for merge.  */
1676
 
1677
      struct alpha_elf_got_entry **local_got_entries;
1678
 
1679
      local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
1680
      if (!local_got_entries)
1681
        {
1682
          bfd_size_type size;
1683
          Elf_Internal_Shdr *symtab_hdr;
1684
 
1685
          symtab_hdr = &elf_tdata(abfd)->symtab_hdr;
1686
          size = symtab_hdr->sh_info;
1687
          size *= sizeof (struct alpha_elf_got_entry *);
1688
 
1689
          local_got_entries
1690
            = (struct alpha_elf_got_entry **) bfd_zalloc (abfd, size);
1691
          if (!local_got_entries)
1692
            return NULL;
1693
 
1694
          alpha_elf_tdata (abfd)->local_got_entries = local_got_entries;
1695
        }
1696
 
1697
      slot = &local_got_entries[r_symndx];
1698
    }
1699
 
1700
  for (gotent = *slot; gotent ; gotent = gotent->next)
1701
    if (gotent->gotobj == abfd
1702
        && gotent->reloc_type == r_type
1703
        && gotent->addend == r_addend)
1704
      break;
1705
 
1706
  if (!gotent)
1707
    {
1708
      int entry_size;
1709
      bfd_size_type amt;
1710
 
1711
      amt = sizeof (struct alpha_elf_got_entry);
1712
      gotent = (struct alpha_elf_got_entry *) bfd_alloc (abfd, amt);
1713
      if (!gotent)
1714
        return NULL;
1715
 
1716
      gotent->gotobj = abfd;
1717
      gotent->addend = r_addend;
1718
      gotent->got_offset = -1;
1719
      gotent->plt_offset = -1;
1720
      gotent->use_count = 1;
1721
      gotent->reloc_type = r_type;
1722
      gotent->reloc_done = 0;
1723
      gotent->reloc_xlated = 0;
1724
 
1725
      gotent->next = *slot;
1726
      *slot = gotent;
1727
 
1728
      entry_size = alpha_got_entry_size (r_type);
1729
      alpha_elf_tdata (abfd)->total_got_size += entry_size;
1730
      if (!h)
1731
        alpha_elf_tdata(abfd)->local_got_size += entry_size;
1732
    }
1733
  else
1734
    gotent->use_count += 1;
1735
 
1736
  return gotent;
1737
}
1738
 
1739
static bfd_boolean
1740
elf64_alpha_want_plt (struct alpha_elf_link_hash_entry *ah)
1741
{
1742
  return ((ah->root.type == STT_FUNC
1743
          || ah->root.root.type == bfd_link_hash_undefweak
1744
          || ah->root.root.type == bfd_link_hash_undefined)
1745
          && (ah->flags & ALPHA_ELF_LINK_HASH_LU_PLT) != 0
1746
          && (ah->flags & ~ALPHA_ELF_LINK_HASH_LU_PLT) == 0);
1747
}
1748
 
1749
/* Handle dynamic relocations when doing an Alpha ELF link.  */
1750
 
1751
static bfd_boolean
1752
elf64_alpha_check_relocs (bfd *abfd, struct bfd_link_info *info,
1753
                          asection *sec, const Elf_Internal_Rela *relocs)
1754
{
1755
  bfd *dynobj;
1756
  asection *sreloc;
1757
  Elf_Internal_Shdr *symtab_hdr;
1758
  struct alpha_elf_link_hash_entry **sym_hashes;
1759
  const Elf_Internal_Rela *rel, *relend;
1760
  bfd_size_type amt;
1761
 
1762
  if (info->relocatable)
1763
    return TRUE;
1764
 
1765
  /* Don't do anything special with non-loaded, non-alloced sections.
1766
     In particular, any relocs in such sections should not affect GOT
1767
     and PLT reference counting (ie. we don't allow them to create GOT
1768
     or PLT entries), there's no possibility or desire to optimize TLS
1769
     relocs, and there's not much point in propagating relocs to shared
1770
     libs that the dynamic linker won't relocate.  */
1771
  if ((sec->flags & SEC_ALLOC) == 0)
1772
    return TRUE;
1773
 
1774
  BFD_ASSERT (is_alpha_elf (abfd));
1775
 
1776
  dynobj = elf_hash_table (info)->dynobj;
1777
  if (dynobj == NULL)
1778
    elf_hash_table (info)->dynobj = dynobj = abfd;
1779
 
1780
  sreloc = NULL;
1781
  symtab_hdr = &elf_symtab_hdr (abfd);
1782
  sym_hashes = alpha_elf_sym_hashes (abfd);
1783
 
1784
  relend = relocs + sec->reloc_count;
1785
  for (rel = relocs; rel < relend; ++rel)
1786
    {
1787
      enum {
1788
        NEED_GOT = 1,
1789
        NEED_GOT_ENTRY = 2,
1790
        NEED_DYNREL = 4
1791
      };
1792
 
1793
      unsigned long r_symndx, r_type;
1794
      struct alpha_elf_link_hash_entry *h;
1795
      unsigned int gotent_flags;
1796
      bfd_boolean maybe_dynamic;
1797
      unsigned int need;
1798
      bfd_vma addend;
1799
 
1800
      r_symndx = ELF64_R_SYM (rel->r_info);
1801
      if (r_symndx < symtab_hdr->sh_info)
1802
        h = NULL;
1803
      else
1804
        {
1805
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
1806
 
1807
          while (h->root.root.type == bfd_link_hash_indirect
1808
                 || h->root.root.type == bfd_link_hash_warning)
1809
            h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
1810
 
1811
          h->root.ref_regular = 1;
1812
        }
1813
 
1814
      /* We can only get preliminary data on whether a symbol is
1815
         locally or externally defined, as not all of the input files
1816
         have yet been processed.  Do something with what we know, as
1817
         this may help reduce memory usage and processing time later.  */
1818
      maybe_dynamic = FALSE;
1819
      if (h && ((info->shared
1820
                 && (!info->symbolic
1821
                     || info->unresolved_syms_in_shared_libs == RM_IGNORE))
1822
                || !h->root.def_regular
1823
                || h->root.root.type == bfd_link_hash_defweak))
1824
        maybe_dynamic = TRUE;
1825
 
1826
      need = 0;
1827
      gotent_flags = 0;
1828
      r_type = ELF64_R_TYPE (rel->r_info);
1829
      addend = rel->r_addend;
1830
 
1831
      switch (r_type)
1832
        {
1833
        case R_ALPHA_LITERAL:
1834
          need = NEED_GOT | NEED_GOT_ENTRY;
1835
 
1836
          /* Remember how this literal is used from its LITUSEs.
1837
             This will be important when it comes to decide if we can
1838
             create a .plt entry for a function symbol.  */
1839
          while (++rel < relend && ELF64_R_TYPE (rel->r_info) == R_ALPHA_LITUSE)
1840
            if (rel->r_addend >= 1 && rel->r_addend <= 6)
1841
              gotent_flags |= 1 << rel->r_addend;
1842
          --rel;
1843
 
1844
          /* No LITUSEs -- presumably the address is used somehow.  */
1845
          if (gotent_flags == 0)
1846
            gotent_flags = ALPHA_ELF_LINK_HASH_LU_ADDR;
1847
          break;
1848
 
1849
        case R_ALPHA_GPDISP:
1850
        case R_ALPHA_GPREL16:
1851
        case R_ALPHA_GPREL32:
1852
        case R_ALPHA_GPRELHIGH:
1853
        case R_ALPHA_GPRELLOW:
1854
        case R_ALPHA_BRSGP:
1855
          need = NEED_GOT;
1856
          break;
1857
 
1858
        case R_ALPHA_REFLONG:
1859
        case R_ALPHA_REFQUAD:
1860
          if (info->shared || maybe_dynamic)
1861
            need = NEED_DYNREL;
1862
          break;
1863
 
1864
        case R_ALPHA_TLSLDM:
1865
          /* The symbol for a TLSLDM reloc is ignored.  Collapse the
1866
             reloc to the STN_UNDEF (0) symbol so that they all match.  */
1867
          r_symndx = STN_UNDEF;
1868
          h = 0;
1869
          maybe_dynamic = FALSE;
1870
          /* FALLTHRU */
1871
 
1872
        case R_ALPHA_TLSGD:
1873
        case R_ALPHA_GOTDTPREL:
1874
          need = NEED_GOT | NEED_GOT_ENTRY;
1875
          break;
1876
 
1877
        case R_ALPHA_GOTTPREL:
1878
          need = NEED_GOT | NEED_GOT_ENTRY;
1879
          gotent_flags = ALPHA_ELF_LINK_HASH_TLS_IE;
1880
          if (info->shared)
1881
            info->flags |= DF_STATIC_TLS;
1882
          break;
1883
 
1884
        case R_ALPHA_TPREL64:
1885
          if (info->shared || maybe_dynamic)
1886
            need = NEED_DYNREL;
1887
          if (info->shared)
1888
            info->flags |= DF_STATIC_TLS;
1889
          break;
1890
        }
1891
 
1892
      if (need & NEED_GOT)
1893
        {
1894
          if (alpha_elf_tdata(abfd)->gotobj == NULL)
1895
            {
1896
              if (!elf64_alpha_create_got_section (abfd, info))
1897
                return FALSE;
1898
            }
1899
        }
1900
 
1901
      if (need & NEED_GOT_ENTRY)
1902
        {
1903
          struct alpha_elf_got_entry *gotent;
1904
 
1905
          gotent = get_got_entry (abfd, h, r_type, r_symndx, addend);
1906
          if (!gotent)
1907
            return FALSE;
1908
 
1909
          if (gotent_flags)
1910
            {
1911
              gotent->flags |= gotent_flags;
1912
              if (h)
1913
                {
1914
                  gotent_flags |= h->flags;
1915
                  h->flags = gotent_flags;
1916
 
1917
                  /* Make a guess as to whether a .plt entry is needed.  */
1918
                  /* ??? It appears that we won't make it into
1919
                     adjust_dynamic_symbol for symbols that remain
1920
                     totally undefined.  Copying this check here means
1921
                     we can create a plt entry for them too.  */
1922
                  h->root.needs_plt
1923
                    = (maybe_dynamic && elf64_alpha_want_plt (h));
1924
                }
1925
            }
1926
        }
1927
 
1928
      if (need & NEED_DYNREL)
1929
        {
1930
          /* We need to create the section here now whether we eventually
1931
             use it or not so that it gets mapped to an output section by
1932
             the linker.  If not used, we'll kill it in size_dynamic_sections.  */
1933
          if (sreloc == NULL)
1934
            {
1935
              sreloc = _bfd_elf_make_dynamic_reloc_section
1936
                (sec, dynobj, 3, abfd, /*rela?*/ TRUE);
1937
 
1938
              if (sreloc == NULL)
1939
                return FALSE;
1940
            }
1941
 
1942
          if (h)
1943
            {
1944
              /* Since we havn't seen all of the input symbols yet, we
1945
                 don't know whether we'll actually need a dynamic relocation
1946
                 entry for this reloc.  So make a record of it.  Once we
1947
                 find out if this thing needs dynamic relocation we'll
1948
                 expand the relocation sections by the appropriate amount.  */
1949
 
1950
              struct alpha_elf_reloc_entry *rent;
1951
 
1952
              for (rent = h->reloc_entries; rent; rent = rent->next)
1953
                if (rent->rtype == r_type && rent->srel == sreloc)
1954
                  break;
1955
 
1956
              if (!rent)
1957
                {
1958
                  amt = sizeof (struct alpha_elf_reloc_entry);
1959
                  rent = (struct alpha_elf_reloc_entry *) bfd_alloc (abfd, amt);
1960
                  if (!rent)
1961
                    return FALSE;
1962
 
1963
                  rent->srel = sreloc;
1964
                  rent->rtype = r_type;
1965
                  rent->count = 1;
1966
                  rent->reltext = (sec->flags & SEC_READONLY) != 0;
1967
 
1968
                  rent->next = h->reloc_entries;
1969
                  h->reloc_entries = rent;
1970
                }
1971
              else
1972
                rent->count++;
1973
            }
1974
          else if (info->shared)
1975
            {
1976
              /* If this is a shared library, and the section is to be
1977
                 loaded into memory, we need a RELATIVE reloc.  */
1978
              sreloc->size += sizeof (Elf64_External_Rela);
1979
              if (sec->flags & SEC_READONLY)
1980
                info->flags |= DF_TEXTREL;
1981
            }
1982
        }
1983
    }
1984
 
1985
  return TRUE;
1986
}
1987
 
1988
/* Return the section that should be marked against GC for a given
1989
   relocation.  */
1990
 
1991
static asection *
1992
elf64_alpha_gc_mark_hook (asection *sec, struct bfd_link_info *info,
1993
                          Elf_Internal_Rela *rel,
1994
                          struct elf_link_hash_entry *h, Elf_Internal_Sym *sym)
1995
{
1996
  /* These relocations don't really reference a symbol.  Instead we store
1997
     extra data in their addend slot.  Ignore the symbol.  */
1998
  switch (ELF64_R_TYPE (rel->r_info))
1999
    {
2000
    case R_ALPHA_LITUSE:
2001
    case R_ALPHA_GPDISP:
2002
    case R_ALPHA_HINT:
2003
      return NULL;
2004
    }
2005
 
2006
  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
2007
}
2008
 
2009
/* Update the got entry reference counts for the section being removed.  */
2010
 
2011
static bfd_boolean
2012
elf64_alpha_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
2013
                           asection *sec, const Elf_Internal_Rela *relocs)
2014
{
2015
  Elf_Internal_Shdr *symtab_hdr;
2016
  struct alpha_elf_link_hash_entry **sym_hashes;
2017
  const Elf_Internal_Rela *rel, *relend;
2018
 
2019
  if (info->relocatable)
2020
    return TRUE;
2021
 
2022
  symtab_hdr = &elf_symtab_hdr (abfd);
2023
  sym_hashes = alpha_elf_sym_hashes (abfd);
2024
 
2025
  relend = relocs + sec->reloc_count;
2026
  for (rel = relocs; rel < relend; rel++)
2027
    {
2028
      unsigned long r_symndx, r_type;
2029
      struct alpha_elf_link_hash_entry *h = NULL;
2030
      struct alpha_elf_got_entry *gotent;
2031
 
2032
      r_symndx = ELF64_R_SYM (rel->r_info);
2033
      if (r_symndx >= symtab_hdr->sh_info)
2034
        {
2035
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2036
          while (h->root.root.type == bfd_link_hash_indirect
2037
                 || h->root.root.type == bfd_link_hash_warning)
2038
            h = (struct alpha_elf_link_hash_entry *) h->root.root.u.i.link;
2039
        }
2040
 
2041
      r_type = ELF64_R_TYPE (rel->r_info);
2042
      switch (r_type)
2043
        {
2044
        case R_ALPHA_LITERAL:
2045
          /* ??? Ignore re-computation of gotent_flags.  We're not
2046
             carrying a use-count for each bit in that mask.  */
2047
 
2048
        case R_ALPHA_TLSGD:
2049
        case R_ALPHA_GOTDTPREL:
2050
        case R_ALPHA_GOTTPREL:
2051
          /* Fetch the got entry from the tables.  */
2052
          gotent = get_got_entry (abfd, h, r_type, r_symndx, rel->r_addend);
2053
 
2054
          /* The got entry *must* exist, since we should have created it
2055
             before during check_relocs.  Also note that get_got_entry
2056
             assumed this was going to be another use, and so incremented
2057
             the use count again.  Thus the use count must be at least the
2058
             one real use and the "use" we just added.  */
2059
          if (gotent == NULL || gotent->use_count < 2)
2060
            {
2061
              abort ();
2062
              return FALSE;
2063
            }
2064
          gotent->use_count -= 2;
2065
          break;
2066
 
2067
        default:
2068
          break;
2069
        }
2070
    }
2071
 
2072
  return TRUE;
2073
}
2074
 
2075
/* Adjust a symbol defined by a dynamic object and referenced by a
2076
   regular object.  The current definition is in some section of the
2077
   dynamic object, but we're not including those sections.  We have to
2078
   change the definition to something the rest of the link can
2079
   understand.  */
2080
 
2081
static bfd_boolean
2082
elf64_alpha_adjust_dynamic_symbol (struct bfd_link_info *info,
2083
                                   struct elf_link_hash_entry *h)
2084
{
2085
  bfd *dynobj;
2086
  asection *s;
2087
  struct alpha_elf_link_hash_entry *ah;
2088
 
2089
  dynobj = elf_hash_table(info)->dynobj;
2090
  ah = (struct alpha_elf_link_hash_entry *)h;
2091
 
2092
  /* Now that we've seen all of the input symbols, finalize our decision
2093
     about whether this symbol should get a .plt entry.  Irritatingly, it
2094
     is common for folk to leave undefined symbols in shared libraries,
2095
     and they still expect lazy binding; accept undefined symbols in lieu
2096
     of STT_FUNC.  */
2097
  if (alpha_elf_dynamic_symbol_p (h, info) && elf64_alpha_want_plt (ah))
2098
    {
2099
      h->needs_plt = TRUE;
2100
 
2101
      s = bfd_get_section_by_name(dynobj, ".plt");
2102
      if (!s && !elf64_alpha_create_dynamic_sections (dynobj, info))
2103
        return FALSE;
2104
 
2105
      /* We need one plt entry per got subsection.  Delay allocation of
2106
         the actual plt entries until size_plt_section, called from
2107
         size_dynamic_sections or during relaxation.  */
2108
 
2109
      return TRUE;
2110
    }
2111
  else
2112
    h->needs_plt = FALSE;
2113
 
2114
  /* If this is a weak symbol, and there is a real definition, the
2115
     processor independent code will have arranged for us to see the
2116
     real definition first, and we can just use the same value.  */
2117
  if (h->u.weakdef != NULL)
2118
    {
2119
      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2120
                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
2121
      h->root.u.def.section = h->u.weakdef->root.u.def.section;
2122
      h->root.u.def.value = h->u.weakdef->root.u.def.value;
2123
      return TRUE;
2124
    }
2125
 
2126
  /* This is a reference to a symbol defined by a dynamic object which
2127
     is not a function.  The Alpha, since it uses .got entries for all
2128
     symbols even in regular objects, does not need the hackery of a
2129
     .dynbss section and COPY dynamic relocations.  */
2130
 
2131
  return TRUE;
2132
}
2133
 
2134
/* Record STO_ALPHA_NOPV and STO_ALPHA_STD_GPLOAD.  */
2135
 
2136
static void
2137
elf64_alpha_merge_symbol_attribute (struct elf_link_hash_entry *h,
2138
                                    const Elf_Internal_Sym *isym,
2139
                                    bfd_boolean definition,
2140
                                    bfd_boolean dynamic)
2141
{
2142
  if (!dynamic && definition)
2143
    h->other = ((h->other & ELF_ST_VISIBILITY (-1))
2144
                | (isym->st_other & ~ELF_ST_VISIBILITY (-1)));
2145
}
2146
 
2147
/* Symbol versioning can create new symbols, and make our old symbols
2148
   indirect to the new ones.  Consolidate the got and reloc information
2149
   in these situations.  */
2150
 
2151
static bfd_boolean
2152
elf64_alpha_merge_ind_symbols (struct alpha_elf_link_hash_entry *hi,
2153
                               PTR dummy ATTRIBUTE_UNUSED)
2154
{
2155
  struct alpha_elf_link_hash_entry *hs;
2156
 
2157
  if (hi->root.root.type != bfd_link_hash_indirect)
2158
    return TRUE;
2159
  hs = hi;
2160
  do {
2161
    hs = (struct alpha_elf_link_hash_entry *)hs->root.root.u.i.link;
2162
  } while (hs->root.root.type == bfd_link_hash_indirect);
2163
 
2164
  /* Merge the flags.  Whee.  */
2165
 
2166
  hs->flags |= hi->flags;
2167
 
2168
  /* Merge the .got entries.  Cannibalize the old symbol's list in
2169
     doing so, since we don't need it anymore.  */
2170
 
2171
  if (hs->got_entries == NULL)
2172
    hs->got_entries = hi->got_entries;
2173
  else
2174
    {
2175
      struct alpha_elf_got_entry *gi, *gs, *gin, *gsh;
2176
 
2177
      gsh = hs->got_entries;
2178
      for (gi = hi->got_entries; gi ; gi = gin)
2179
        {
2180
          gin = gi->next;
2181
          for (gs = gsh; gs ; gs = gs->next)
2182
            if (gi->gotobj == gs->gotobj
2183
                && gi->reloc_type == gs->reloc_type
2184
                && gi->addend == gs->addend)
2185
              {
2186
                gi->use_count += gs->use_count;
2187
                goto got_found;
2188
              }
2189
          gi->next = hs->got_entries;
2190
          hs->got_entries = gi;
2191
        got_found:;
2192
        }
2193
    }
2194
  hi->got_entries = NULL;
2195
 
2196
  /* And similar for the reloc entries.  */
2197
 
2198
  if (hs->reloc_entries == NULL)
2199
    hs->reloc_entries = hi->reloc_entries;
2200
  else
2201
    {
2202
      struct alpha_elf_reloc_entry *ri, *rs, *rin, *rsh;
2203
 
2204
      rsh = hs->reloc_entries;
2205
      for (ri = hi->reloc_entries; ri ; ri = rin)
2206
        {
2207
          rin = ri->next;
2208
          for (rs = rsh; rs ; rs = rs->next)
2209
            if (ri->rtype == rs->rtype && ri->srel == rs->srel)
2210
              {
2211
                rs->count += ri->count;
2212
                goto found_reloc;
2213
              }
2214
          ri->next = hs->reloc_entries;
2215
          hs->reloc_entries = ri;
2216
        found_reloc:;
2217
        }
2218
    }
2219
  hi->reloc_entries = NULL;
2220
 
2221
  return TRUE;
2222
}
2223
 
2224
/* Is it possible to merge two object file's .got tables?  */
2225
 
2226
static bfd_boolean
2227
elf64_alpha_can_merge_gots (bfd *a, bfd *b)
2228
{
2229
  int total = alpha_elf_tdata (a)->total_got_size;
2230
  bfd *bsub;
2231
 
2232
  /* Trivial quick fallout test.  */
2233
  if (total + alpha_elf_tdata (b)->total_got_size <= MAX_GOT_SIZE)
2234
    return TRUE;
2235
 
2236
  /* By their nature, local .got entries cannot be merged.  */
2237
  if ((total += alpha_elf_tdata (b)->local_got_size) > MAX_GOT_SIZE)
2238
    return FALSE;
2239
 
2240
  /* Failing the common trivial comparison, we must effectively
2241
     perform the merge.  Not actually performing the merge means that
2242
     we don't have to store undo information in case we fail.  */
2243
  for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2244
    {
2245
      struct alpha_elf_link_hash_entry **hashes = alpha_elf_sym_hashes (bsub);
2246
      Elf_Internal_Shdr *symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2247
      int i, n;
2248
 
2249
      n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
2250
      for (i = 0; i < n; ++i)
2251
        {
2252
          struct alpha_elf_got_entry *ae, *be;
2253
          struct alpha_elf_link_hash_entry *h;
2254
 
2255
          h = hashes[i];
2256
          while (h->root.root.type == bfd_link_hash_indirect
2257
                 || h->root.root.type == bfd_link_hash_warning)
2258
            h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2259
 
2260
          for (be = h->got_entries; be ; be = be->next)
2261
            {
2262
              if (be->use_count == 0)
2263
                continue;
2264
              if (be->gotobj != b)
2265
                continue;
2266
 
2267
              for (ae = h->got_entries; ae ; ae = ae->next)
2268
                if (ae->gotobj == a
2269
                    && ae->reloc_type == be->reloc_type
2270
                    && ae->addend == be->addend)
2271
                  goto global_found;
2272
 
2273
              total += alpha_got_entry_size (be->reloc_type);
2274
              if (total > MAX_GOT_SIZE)
2275
                return FALSE;
2276
            global_found:;
2277
            }
2278
        }
2279
    }
2280
 
2281
  return TRUE;
2282
}
2283
 
2284
/* Actually merge two .got tables.  */
2285
 
2286
static void
2287
elf64_alpha_merge_gots (bfd *a, bfd *b)
2288
{
2289
  int total = alpha_elf_tdata (a)->total_got_size;
2290
  bfd *bsub;
2291
 
2292
  /* Remember local expansion.  */
2293
  {
2294
    int e = alpha_elf_tdata (b)->local_got_size;
2295
    total += e;
2296
    alpha_elf_tdata (a)->local_got_size += e;
2297
  }
2298
 
2299
  for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2300
    {
2301
      struct alpha_elf_got_entry **local_got_entries;
2302
      struct alpha_elf_link_hash_entry **hashes;
2303
      Elf_Internal_Shdr *symtab_hdr;
2304
      int i, n;
2305
 
2306
      /* Let the local .got entries know they are part of a new subsegment.  */
2307
      local_got_entries = alpha_elf_tdata (bsub)->local_got_entries;
2308
      if (local_got_entries)
2309
        {
2310
          n = elf_tdata (bsub)->symtab_hdr.sh_info;
2311
          for (i = 0; i < n; ++i)
2312
            {
2313
              struct alpha_elf_got_entry *ent;
2314
              for (ent = local_got_entries[i]; ent; ent = ent->next)
2315
                ent->gotobj = a;
2316
            }
2317
        }
2318
 
2319
      /* Merge the global .got entries.  */
2320
      hashes = alpha_elf_sym_hashes (bsub);
2321
      symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2322
 
2323
      n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
2324
      for (i = 0; i < n; ++i)
2325
        {
2326
          struct alpha_elf_got_entry *ae, *be, **pbe, **start;
2327
          struct alpha_elf_link_hash_entry *h;
2328
 
2329
          h = hashes[i];
2330
          while (h->root.root.type == bfd_link_hash_indirect
2331
                 || h->root.root.type == bfd_link_hash_warning)
2332
            h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2333
 
2334
          pbe = start = &h->got_entries;
2335
          while ((be = *pbe) != NULL)
2336
            {
2337
              if (be->use_count == 0)
2338
                {
2339
                  *pbe = be->next;
2340
                  memset (be, 0xa5, sizeof (*be));
2341
                  goto kill;
2342
                }
2343
              if (be->gotobj != b)
2344
                goto next;
2345
 
2346
              for (ae = *start; ae ; ae = ae->next)
2347
                if (ae->gotobj == a
2348
                    && ae->reloc_type == be->reloc_type
2349
                    && ae->addend == be->addend)
2350
                  {
2351
                    ae->flags |= be->flags;
2352
                    ae->use_count += be->use_count;
2353
                    *pbe = be->next;
2354
                    memset (be, 0xa5, sizeof (*be));
2355
                    goto kill;
2356
                  }
2357
              be->gotobj = a;
2358
              total += alpha_got_entry_size (be->reloc_type);
2359
 
2360
            next:;
2361
              pbe = &be->next;
2362
            kill:;
2363
            }
2364
        }
2365
 
2366
      alpha_elf_tdata (bsub)->gotobj = a;
2367
    }
2368
  alpha_elf_tdata (a)->total_got_size = total;
2369
 
2370
  /* Merge the two in_got chains.  */
2371
  {
2372
    bfd *next;
2373
 
2374
    bsub = a;
2375
    while ((next = alpha_elf_tdata (bsub)->in_got_link_next) != NULL)
2376
      bsub = next;
2377
 
2378
    alpha_elf_tdata (bsub)->in_got_link_next = b;
2379
  }
2380
}
2381
 
2382
/* Calculate the offsets for the got entries.  */
2383
 
2384
static bfd_boolean
2385
elf64_alpha_calc_got_offsets_for_symbol (struct alpha_elf_link_hash_entry *h,
2386
                                         PTR arg ATTRIBUTE_UNUSED)
2387
{
2388
  struct alpha_elf_got_entry *gotent;
2389
 
2390
  for (gotent = h->got_entries; gotent; gotent = gotent->next)
2391
    if (gotent->use_count > 0)
2392
      {
2393
        struct alpha_elf_obj_tdata *td;
2394
        bfd_size_type *plge;
2395
 
2396
        td = alpha_elf_tdata (gotent->gotobj);
2397
        plge = &td->got->size;
2398
        gotent->got_offset = *plge;
2399
        *plge += alpha_got_entry_size (gotent->reloc_type);
2400
      }
2401
 
2402
  return TRUE;
2403
}
2404
 
2405
static void
2406
elf64_alpha_calc_got_offsets (struct bfd_link_info *info)
2407
{
2408
  bfd *i, *got_list;
2409
  struct alpha_elf_link_hash_table * htab;
2410
 
2411
  htab = alpha_elf_hash_table (info);
2412
  if (htab == NULL)
2413
    return;
2414
  got_list = htab->got_list;
2415
 
2416
  /* First, zero out the .got sizes, as we may be recalculating the
2417
     .got after optimizing it.  */
2418
  for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2419
    alpha_elf_tdata(i)->got->size = 0;
2420
 
2421
  /* Next, fill in the offsets for all the global entries.  */
2422
  alpha_elf_link_hash_traverse (htab,
2423
                                elf64_alpha_calc_got_offsets_for_symbol,
2424
                                NULL);
2425
 
2426
  /* Finally, fill in the offsets for the local entries.  */
2427
  for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2428
    {
2429
      bfd_size_type got_offset = alpha_elf_tdata(i)->got->size;
2430
      bfd *j;
2431
 
2432
      for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2433
        {
2434
          struct alpha_elf_got_entry **local_got_entries, *gotent;
2435
          int k, n;
2436
 
2437
          local_got_entries = alpha_elf_tdata(j)->local_got_entries;
2438
          if (!local_got_entries)
2439
            continue;
2440
 
2441
          for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
2442
            for (gotent = local_got_entries[k]; gotent; gotent = gotent->next)
2443
              if (gotent->use_count > 0)
2444
                {
2445
                  gotent->got_offset = got_offset;
2446
                  got_offset += alpha_got_entry_size (gotent->reloc_type);
2447
                }
2448
        }
2449
 
2450
      alpha_elf_tdata(i)->got->size = got_offset;
2451
    }
2452
}
2453
 
2454
/* Constructs the gots.  */
2455
 
2456
static bfd_boolean
2457
elf64_alpha_size_got_sections (struct bfd_link_info *info)
2458
{
2459
  bfd *i, *got_list, *cur_got_obj = NULL;
2460
  struct alpha_elf_link_hash_table * htab;
2461
 
2462
  htab = alpha_elf_hash_table (info);
2463
  if (htab == NULL)
2464
    return FALSE;
2465
  got_list = htab->got_list;
2466
 
2467
  /* On the first time through, pretend we have an existing got list
2468
     consisting of all of the input files.  */
2469
  if (got_list == NULL)
2470
    {
2471
      for (i = info->input_bfds; i ; i = i->link_next)
2472
        {
2473
          bfd *this_got;
2474
 
2475
          if (! is_alpha_elf (i))
2476
            continue;
2477
 
2478
          this_got = alpha_elf_tdata (i)->gotobj;
2479
          if (this_got == NULL)
2480
            continue;
2481
 
2482
          /* We are assuming no merging has yet occurred.  */
2483
          BFD_ASSERT (this_got == i);
2484
 
2485
          if (alpha_elf_tdata (this_got)->total_got_size > MAX_GOT_SIZE)
2486
            {
2487
              /* Yikes! A single object file has too many entries.  */
2488
              (*_bfd_error_handler)
2489
                (_("%B: .got subsegment exceeds 64K (size %d)"),
2490
                 i, alpha_elf_tdata (this_got)->total_got_size);
2491
              return FALSE;
2492
            }
2493
 
2494
          if (got_list == NULL)
2495
            got_list = this_got;
2496
          else
2497
            alpha_elf_tdata(cur_got_obj)->got_link_next = this_got;
2498
          cur_got_obj = this_got;
2499
        }
2500
 
2501
      /* Strange degenerate case of no got references.  */
2502
      if (got_list == NULL)
2503
        return TRUE;
2504
 
2505
      htab->got_list = got_list;
2506
    }
2507
 
2508
  cur_got_obj = got_list;
2509
  if (cur_got_obj == NULL)
2510
    return FALSE;
2511
 
2512
  i = alpha_elf_tdata(cur_got_obj)->got_link_next;
2513
  while (i != NULL)
2514
    {
2515
      if (elf64_alpha_can_merge_gots (cur_got_obj, i))
2516
        {
2517
          elf64_alpha_merge_gots (cur_got_obj, i);
2518
 
2519
          alpha_elf_tdata(i)->got->size = 0;
2520
          i = alpha_elf_tdata(i)->got_link_next;
2521
          alpha_elf_tdata(cur_got_obj)->got_link_next = i;
2522
        }
2523
      else
2524
        {
2525
          cur_got_obj = i;
2526
          i = alpha_elf_tdata(i)->got_link_next;
2527
        }
2528
    }
2529
 
2530
  /* Once the gots have been merged, fill in the got offsets for
2531
     everything therein.  */
2532
  elf64_alpha_calc_got_offsets (info);
2533
 
2534
  return TRUE;
2535
}
2536
 
2537
static bfd_boolean
2538
elf64_alpha_size_plt_section_1 (struct alpha_elf_link_hash_entry *h, PTR data)
2539
{
2540
  asection *splt = (asection *) data;
2541
  struct alpha_elf_got_entry *gotent;
2542
  bfd_boolean saw_one = FALSE;
2543
 
2544
  /* If we didn't need an entry before, we still don't.  */
2545
  if (!h->root.needs_plt)
2546
    return TRUE;
2547
 
2548
  /* For each LITERAL got entry still in use, allocate a plt entry.  */
2549
  for (gotent = h->got_entries; gotent ; gotent = gotent->next)
2550
    if (gotent->reloc_type == R_ALPHA_LITERAL
2551
        && gotent->use_count > 0)
2552
      {
2553
        if (splt->size == 0)
2554
          splt->size = PLT_HEADER_SIZE;
2555
        gotent->plt_offset = splt->size;
2556
        splt->size += PLT_ENTRY_SIZE;
2557
        saw_one = TRUE;
2558
      }
2559
 
2560
  /* If there weren't any, there's no longer a need for the PLT entry.  */
2561
  if (!saw_one)
2562
    h->root.needs_plt = FALSE;
2563
 
2564
  return TRUE;
2565
}
2566
 
2567
/* Called from relax_section to rebuild the PLT in light of potential changes
2568
   in the function's status.  */
2569
 
2570
static void
2571
elf64_alpha_size_plt_section (struct bfd_link_info *info)
2572
{
2573
  asection *splt, *spltrel, *sgotplt;
2574
  unsigned long entries;
2575
  bfd *dynobj;
2576
  struct alpha_elf_link_hash_table * htab;
2577
 
2578
  htab = alpha_elf_hash_table (info);
2579
  if (htab == NULL)
2580
    return;
2581
 
2582
  dynobj = elf_hash_table(info)->dynobj;
2583
  splt = bfd_get_section_by_name (dynobj, ".plt");
2584
  if (splt == NULL)
2585
    return;
2586
 
2587
  splt->size = 0;
2588
 
2589
  alpha_elf_link_hash_traverse (htab,
2590
                                elf64_alpha_size_plt_section_1, splt);
2591
 
2592
  /* Every plt entry requires a JMP_SLOT relocation.  */
2593
  spltrel = bfd_get_section_by_name (dynobj, ".rela.plt");
2594
  entries = 0;
2595
  if (splt->size)
2596
    {
2597
      if (elf64_alpha_use_secureplt)
2598
        entries = (splt->size - NEW_PLT_HEADER_SIZE) / NEW_PLT_ENTRY_SIZE;
2599
      else
2600
        entries = (splt->size - OLD_PLT_HEADER_SIZE) / OLD_PLT_ENTRY_SIZE;
2601
    }
2602
  spltrel->size = entries * sizeof (Elf64_External_Rela);
2603
 
2604
  /* When using the secureplt, we need two words somewhere in the data
2605
     segment for the dynamic linker to tell us where to go.  This is the
2606
     entire contents of the .got.plt section.  */
2607
  if (elf64_alpha_use_secureplt)
2608
    {
2609
      sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
2610
      sgotplt->size = entries ? 16 : 0;
2611
    }
2612
}
2613
 
2614
static bfd_boolean
2615
elf64_alpha_always_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2616
                                  struct bfd_link_info *info)
2617
{
2618
  bfd *i;
2619
  struct alpha_elf_link_hash_table * htab;
2620
 
2621
  if (info->relocatable)
2622
    return TRUE;
2623
 
2624
  htab = alpha_elf_hash_table (info);
2625
  if (htab == NULL)
2626
    return FALSE;
2627
 
2628
  /* First, take care of the indirect symbols created by versioning.  */
2629
  alpha_elf_link_hash_traverse (htab, elf64_alpha_merge_ind_symbols,
2630
                                NULL);
2631
 
2632
  if (!elf64_alpha_size_got_sections (info))
2633
    return FALSE;
2634
 
2635
  /* Allocate space for all of the .got subsections.  */
2636
  i = htab->got_list;
2637
  for ( ; i ; i = alpha_elf_tdata(i)->got_link_next)
2638
    {
2639
      asection *s = alpha_elf_tdata(i)->got;
2640
      if (s->size > 0)
2641
        {
2642
          s->contents = (bfd_byte *) bfd_zalloc (i, s->size);
2643
          if (s->contents == NULL)
2644
            return FALSE;
2645
        }
2646
    }
2647
 
2648
  return TRUE;
2649
}
2650
 
2651
/* The number of dynamic relocations required by a static relocation.  */
2652
 
2653
static int
2654
alpha_dynamic_entries_for_reloc (int r_type, int dynamic, int shared)
2655
{
2656
  switch (r_type)
2657
    {
2658
    /* May appear in GOT entries.  */
2659
    case R_ALPHA_TLSGD:
2660
      return (dynamic ? 2 : shared ? 1 : 0);
2661
    case R_ALPHA_TLSLDM:
2662
      return shared;
2663
    case R_ALPHA_LITERAL:
2664
    case R_ALPHA_GOTTPREL:
2665
      return dynamic || shared;
2666
    case R_ALPHA_GOTDTPREL:
2667
      return dynamic;
2668
 
2669
    /* May appear in data sections.  */
2670
    case R_ALPHA_REFLONG:
2671
    case R_ALPHA_REFQUAD:
2672
    case R_ALPHA_TPREL64:
2673
      return dynamic || shared;
2674
 
2675
    /* Everything else is illegal.  We'll issue an error during
2676
       relocate_section.  */
2677
    default:
2678
      return 0;
2679
    }
2680
}
2681
 
2682
/* Work out the sizes of the dynamic relocation entries.  */
2683
 
2684
static bfd_boolean
2685
elf64_alpha_calc_dynrel_sizes (struct alpha_elf_link_hash_entry *h,
2686
                               struct bfd_link_info *info)
2687
{
2688
  bfd_boolean dynamic;
2689
  struct alpha_elf_reloc_entry *relent;
2690
  unsigned long entries;
2691
 
2692
  /* If the symbol was defined as a common symbol in a regular object
2693
     file, and there was no definition in any dynamic object, then the
2694
     linker will have allocated space for the symbol in a common
2695
     section but the ELF_LINK_HASH_DEF_REGULAR flag will not have been
2696
     set.  This is done for dynamic symbols in
2697
     elf_adjust_dynamic_symbol but this is not done for non-dynamic
2698
     symbols, somehow.  */
2699
  if (!h->root.def_regular
2700
      && h->root.ref_regular
2701
      && !h->root.def_dynamic
2702
      && (h->root.root.type == bfd_link_hash_defined
2703
          || h->root.root.type == bfd_link_hash_defweak)
2704
      && !(h->root.root.u.def.section->owner->flags & DYNAMIC))
2705
    h->root.def_regular = 1;
2706
 
2707
  /* If the symbol is dynamic, we'll need all the relocations in their
2708
     natural form.  If this is a shared object, and it has been forced
2709
     local, we'll need the same number of RELATIVE relocations.  */
2710
  dynamic = alpha_elf_dynamic_symbol_p (&h->root, info);
2711
 
2712
  /* If the symbol is a hidden undefined weak, then we never have any
2713
     relocations.  Avoid the loop which may want to add RELATIVE relocs
2714
     based on info->shared.  */
2715
  if (h->root.root.type == bfd_link_hash_undefweak && !dynamic)
2716
    return TRUE;
2717
 
2718
  for (relent = h->reloc_entries; relent; relent = relent->next)
2719
    {
2720
      entries = alpha_dynamic_entries_for_reloc (relent->rtype, dynamic,
2721
                                                 info->shared);
2722
      if (entries)
2723
        {
2724
          relent->srel->size +=
2725
            entries * sizeof (Elf64_External_Rela) * relent->count;
2726
          if (relent->reltext)
2727
            info->flags |= DT_TEXTREL;
2728
        }
2729
    }
2730
 
2731
  return TRUE;
2732
}
2733
 
2734
/* Subroutine of elf64_alpha_size_rela_got_section for doing the
2735
   global symbols.  */
2736
 
2737
static bfd_boolean
2738
elf64_alpha_size_rela_got_1 (struct alpha_elf_link_hash_entry *h,
2739
                             struct bfd_link_info *info)
2740
{
2741
  bfd_boolean dynamic;
2742
  struct alpha_elf_got_entry *gotent;
2743
  unsigned long entries;
2744
 
2745
  /* If we're using a plt for this symbol, then all of its relocations
2746
     for its got entries go into .rela.plt.  */
2747
  if (h->root.needs_plt)
2748
    return TRUE;
2749
 
2750
  /* If the symbol is dynamic, we'll need all the relocations in their
2751
     natural form.  If this is a shared object, and it has been forced
2752
     local, we'll need the same number of RELATIVE relocations.  */
2753
  dynamic = alpha_elf_dynamic_symbol_p (&h->root, info);
2754
 
2755
  /* If the symbol is a hidden undefined weak, then we never have any
2756
     relocations.  Avoid the loop which may want to add RELATIVE relocs
2757
     based on info->shared.  */
2758
  if (h->root.root.type == bfd_link_hash_undefweak && !dynamic)
2759
    return TRUE;
2760
 
2761
  entries = 0;
2762
  for (gotent = h->got_entries; gotent ; gotent = gotent->next)
2763
    if (gotent->use_count > 0)
2764
      entries += alpha_dynamic_entries_for_reloc (gotent->reloc_type,
2765
                                                  dynamic, info->shared);
2766
 
2767
  if (entries > 0)
2768
    {
2769
      bfd *dynobj = elf_hash_table(info)->dynobj;
2770
      asection *srel = bfd_get_section_by_name (dynobj, ".rela.got");
2771
      BFD_ASSERT (srel != NULL);
2772
      srel->size += sizeof (Elf64_External_Rela) * entries;
2773
    }
2774
 
2775
  return TRUE;
2776
}
2777
 
2778
/* Set the sizes of the dynamic relocation sections.  */
2779
 
2780
static void
2781
elf64_alpha_size_rela_got_section (struct bfd_link_info *info)
2782
{
2783
  unsigned long entries;
2784
  bfd *i, *dynobj;
2785
  asection *srel;
2786
  struct alpha_elf_link_hash_table * htab;
2787
 
2788
  htab = alpha_elf_hash_table (info);
2789
  if (htab == NULL)
2790
    return;
2791
 
2792
  /* Shared libraries often require RELATIVE relocs, and some relocs
2793
     require attention for the main application as well.  */
2794
 
2795
  entries = 0;
2796
  for (i = htab->got_list;
2797
       i ; i = alpha_elf_tdata(i)->got_link_next)
2798
    {
2799
      bfd *j;
2800
 
2801
      for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2802
        {
2803
          struct alpha_elf_got_entry **local_got_entries, *gotent;
2804
          int k, n;
2805
 
2806
          local_got_entries = alpha_elf_tdata(j)->local_got_entries;
2807
          if (!local_got_entries)
2808
            continue;
2809
 
2810
          for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
2811
            for (gotent = local_got_entries[k];
2812
                 gotent ; gotent = gotent->next)
2813
              if (gotent->use_count > 0)
2814
                entries += (alpha_dynamic_entries_for_reloc
2815
                            (gotent->reloc_type, 0, info->shared));
2816
        }
2817
    }
2818
 
2819
  dynobj = elf_hash_table(info)->dynobj;
2820
  srel = bfd_get_section_by_name (dynobj, ".rela.got");
2821
  if (!srel)
2822
    {
2823
      BFD_ASSERT (entries == 0);
2824
      return;
2825
    }
2826
  srel->size = sizeof (Elf64_External_Rela) * entries;
2827
 
2828
  /* Now do the non-local symbols.  */
2829
  alpha_elf_link_hash_traverse (htab,
2830
                                elf64_alpha_size_rela_got_1, info);
2831
}
2832
 
2833
/* Set the sizes of the dynamic sections.  */
2834
 
2835
static bfd_boolean
2836
elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2837
                                   struct bfd_link_info *info)
2838
{
2839
  bfd *dynobj;
2840
  asection *s;
2841
  bfd_boolean relplt;
2842
  struct alpha_elf_link_hash_table * htab;
2843
 
2844
  htab = alpha_elf_hash_table (info);
2845
  if (htab == NULL)
2846
    return FALSE;
2847
 
2848
  dynobj = elf_hash_table(info)->dynobj;
2849
  BFD_ASSERT(dynobj != NULL);
2850
 
2851
  if (elf_hash_table (info)->dynamic_sections_created)
2852
    {
2853
      /* Set the contents of the .interp section to the interpreter.  */
2854
      if (info->executable)
2855
        {
2856
          s = bfd_get_section_by_name (dynobj, ".interp");
2857
          BFD_ASSERT (s != NULL);
2858
          s->size = sizeof ELF_DYNAMIC_INTERPRETER;
2859
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2860
        }
2861
 
2862
      /* Now that we've seen all of the input files, we can decide which
2863
         symbols need dynamic relocation entries and which don't.  We've
2864
         collected information in check_relocs that we can now apply to
2865
         size the dynamic relocation sections.  */
2866
      alpha_elf_link_hash_traverse (htab,
2867
                                    elf64_alpha_calc_dynrel_sizes, info);
2868
 
2869
      elf64_alpha_size_rela_got_section (info);
2870
      elf64_alpha_size_plt_section (info);
2871
    }
2872
  /* else we're not dynamic and by definition we don't need such things.  */
2873
 
2874
  /* The check_relocs and adjust_dynamic_symbol entry points have
2875
     determined the sizes of the various dynamic sections.  Allocate
2876
     memory for them.  */
2877
  relplt = FALSE;
2878
  for (s = dynobj->sections; s != NULL; s = s->next)
2879
    {
2880
      const char *name;
2881
 
2882
      if (!(s->flags & SEC_LINKER_CREATED))
2883
        continue;
2884
 
2885
      /* It's OK to base decisions on the section name, because none
2886
         of the dynobj section names depend upon the input files.  */
2887
      name = bfd_get_section_name (dynobj, s);
2888
 
2889
      if (CONST_STRNEQ (name, ".rela"))
2890
        {
2891
          if (s->size != 0)
2892
            {
2893
              if (strcmp (name, ".rela.plt") == 0)
2894
                relplt = TRUE;
2895
 
2896
              /* We use the reloc_count field as a counter if we need
2897
                 to copy relocs into the output file.  */
2898
              s->reloc_count = 0;
2899
            }
2900
        }
2901
      else if (! CONST_STRNEQ (name, ".got")
2902
               && strcmp (name, ".plt") != 0
2903
               && strcmp (name, ".dynbss") != 0)
2904
        {
2905
          /* It's not one of our dynamic sections, so don't allocate space.  */
2906
          continue;
2907
        }
2908
 
2909
      if (s->size == 0)
2910
        {
2911
          /* If we don't need this section, strip it from the output file.
2912
             This is to handle .rela.bss and .rela.plt.  We must create it
2913
             in create_dynamic_sections, because it must be created before
2914
             the linker maps input sections to output sections.  The
2915
             linker does that before adjust_dynamic_symbol is called, and
2916
             it is that function which decides whether anything needs to
2917
             go into these sections.  */
2918
          if (!CONST_STRNEQ (name, ".got"))
2919
            s->flags |= SEC_EXCLUDE;
2920
        }
2921
      else if ((s->flags & SEC_HAS_CONTENTS) != 0)
2922
        {
2923
          /* Allocate memory for the section contents.  */
2924
          s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size);
2925
          if (s->contents == NULL)
2926
            return FALSE;
2927
        }
2928
    }
2929
 
2930
  if (elf_hash_table (info)->dynamic_sections_created)
2931
    {
2932
      /* Add some entries to the .dynamic section.  We fill in the
2933
         values later, in elf64_alpha_finish_dynamic_sections, but we
2934
         must add the entries now so that we get the correct size for
2935
         the .dynamic section.  The DT_DEBUG entry is filled in by the
2936
         dynamic linker and used by the debugger.  */
2937
#define add_dynamic_entry(TAG, VAL) \
2938
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2939
 
2940
      if (info->executable)
2941
        {
2942
          if (!add_dynamic_entry (DT_DEBUG, 0))
2943
            return FALSE;
2944
        }
2945
 
2946
      if (relplt)
2947
        {
2948
          if (!add_dynamic_entry (DT_PLTGOT, 0)
2949
              || !add_dynamic_entry (DT_PLTRELSZ, 0)
2950
              || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2951
              || !add_dynamic_entry (DT_JMPREL, 0))
2952
            return FALSE;
2953
 
2954
          if (elf64_alpha_use_secureplt
2955
              && !add_dynamic_entry (DT_ALPHA_PLTRO, 1))
2956
            return FALSE;
2957
        }
2958
 
2959
      if (!add_dynamic_entry (DT_RELA, 0)
2960
          || !add_dynamic_entry (DT_RELASZ, 0)
2961
          || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
2962
        return FALSE;
2963
 
2964
      if (info->flags & DF_TEXTREL)
2965
        {
2966
          if (!add_dynamic_entry (DT_TEXTREL, 0))
2967
            return FALSE;
2968
        }
2969
    }
2970
#undef add_dynamic_entry
2971
 
2972
  return TRUE;
2973
}
2974
 
2975
/* These functions do relaxation for Alpha ELF.
2976
 
2977
   Currently I'm only handling what I can do with existing compiler
2978
   and assembler support, which means no instructions are removed,
2979
   though some may be nopped.  At this time GCC does not emit enough
2980
   information to do all of the relaxing that is possible.  It will
2981
   take some not small amount of work for that to happen.
2982
 
2983
   There are a couple of interesting papers that I once read on this
2984
   subject, that I cannot find references to at the moment, that
2985
   related to Alpha in particular.  They are by David Wall, then of
2986
   DEC WRL.  */
2987
 
2988
struct alpha_relax_info
2989
{
2990
  bfd *abfd;
2991
  asection *sec;
2992
  bfd_byte *contents;
2993
  Elf_Internal_Shdr *symtab_hdr;
2994
  Elf_Internal_Rela *relocs, *relend;
2995
  struct bfd_link_info *link_info;
2996
  bfd_vma gp;
2997
  bfd *gotobj;
2998
  asection *tsec;
2999
  struct alpha_elf_link_hash_entry *h;
3000
  struct alpha_elf_got_entry **first_gotent;
3001
  struct alpha_elf_got_entry *gotent;
3002
  bfd_boolean changed_contents;
3003
  bfd_boolean changed_relocs;
3004
  unsigned char other;
3005
};
3006
 
3007
static Elf_Internal_Rela *
3008
elf64_alpha_find_reloc_at_ofs (Elf_Internal_Rela *rel,
3009
                               Elf_Internal_Rela *relend,
3010
                               bfd_vma offset, int type)
3011
{
3012
  while (rel < relend)
3013
    {
3014
      if (rel->r_offset == offset
3015
          && ELF64_R_TYPE (rel->r_info) == (unsigned int) type)
3016
        return rel;
3017
      ++rel;
3018
    }
3019
  return NULL;
3020
}
3021
 
3022
static bfd_boolean
3023
elf64_alpha_relax_got_load (struct alpha_relax_info *info, bfd_vma symval,
3024
                            Elf_Internal_Rela *irel, unsigned long r_type)
3025
{
3026
  unsigned int insn;
3027
  bfd_signed_vma disp;
3028
 
3029
  /* Get the instruction.  */
3030
  insn = bfd_get_32 (info->abfd, info->contents + irel->r_offset);
3031
 
3032
  if (insn >> 26 != OP_LDQ)
3033
    {
3034
      reloc_howto_type *howto = elf64_alpha_howto_table + r_type;
3035
      ((*_bfd_error_handler)
3036
       ("%B: %A+0x%lx: warning: %s relocation against unexpected insn",
3037
        info->abfd, info->sec,
3038
        (unsigned long) irel->r_offset, howto->name));
3039
      return TRUE;
3040
    }
3041
 
3042
  /* Can't relax dynamic symbols.  */
3043
  if (alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3044
    return TRUE;
3045
 
3046
  /* Can't use local-exec relocations in shared libraries.  */
3047
  if (r_type == R_ALPHA_GOTTPREL && info->link_info->shared)
3048
    return TRUE;
3049
 
3050
  if (r_type == R_ALPHA_LITERAL)
3051
    {
3052
      /* Look for nice constant addresses.  This includes the not-uncommon
3053
         special case of 0 for undefweak symbols.  */
3054
      if ((info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3055
          || (!info->link_info->shared
3056
              && (symval >= (bfd_vma)-0x8000 || symval < 0x8000)))
3057
        {
3058
          disp = 0;
3059
          insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3060
          insn |= (symval & 0xffff);
3061
          r_type = R_ALPHA_NONE;
3062
        }
3063
      else
3064
        {
3065
          disp = symval - info->gp;
3066
          insn = (OP_LDA << 26) | (insn & 0x03ff0000);
3067
          r_type = R_ALPHA_GPREL16;
3068
        }
3069
    }
3070
  else
3071
    {
3072
      bfd_vma dtp_base, tp_base;
3073
 
3074
      BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3075
      dtp_base = alpha_get_dtprel_base (info->link_info);
3076
      tp_base = alpha_get_tprel_base (info->link_info);
3077
      disp = symval - (r_type == R_ALPHA_GOTDTPREL ? dtp_base : tp_base);
3078
 
3079
      insn = (OP_LDA << 26) | (insn & (31 << 21)) | (31 << 16);
3080
 
3081
      switch (r_type)
3082
        {
3083
        case R_ALPHA_GOTDTPREL:
3084
          r_type = R_ALPHA_DTPREL16;
3085
          break;
3086
        case R_ALPHA_GOTTPREL:
3087
          r_type = R_ALPHA_TPREL16;
3088
          break;
3089
        default:
3090
          BFD_ASSERT (0);
3091
          return FALSE;
3092
        }
3093
    }
3094
 
3095
  if (disp < -0x8000 || disp >= 0x8000)
3096
    return TRUE;
3097
 
3098
  bfd_put_32 (info->abfd, (bfd_vma) insn, info->contents + irel->r_offset);
3099
  info->changed_contents = TRUE;
3100
 
3101
  /* Reduce the use count on this got entry by one, possibly
3102
     eliminating it.  */
3103
  if (--info->gotent->use_count == 0)
3104
    {
3105
      int sz = alpha_got_entry_size (r_type);
3106
      alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3107
      if (!info->h)
3108
        alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3109
    }
3110
 
3111
  /* Smash the existing GOT relocation for its 16-bit immediate pair.  */
3112
  irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), r_type);
3113
  info->changed_relocs = TRUE;
3114
 
3115
  /* ??? Search forward through this basic block looking for insns
3116
     that use the target register.  Stop after an insn modifying the
3117
     register is seen, or after a branch or call.
3118
 
3119
     Any such memory load insn may be substituted by a load directly
3120
     off the GP.  This allows the memory load insn to be issued before
3121
     the calculated GP register would otherwise be ready.
3122
 
3123
     Any such jsr insn can be replaced by a bsr if it is in range.
3124
 
3125
     This would mean that we'd have to _add_ relocations, the pain of
3126
     which gives one pause.  */
3127
 
3128
  return TRUE;
3129
}
3130
 
3131
static bfd_vma
3132
elf64_alpha_relax_opt_call (struct alpha_relax_info *info, bfd_vma symval)
3133
{
3134
  /* If the function has the same gp, and we can identify that the
3135
     function does not use its function pointer, we can eliminate the
3136
     address load.  */
3137
 
3138
  /* If the symbol is marked NOPV, we are being told the function never
3139
     needs its procedure value.  */
3140
  if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_NOPV)
3141
    return symval;
3142
 
3143
  /* If the symbol is marked STD_GP, we are being told the function does
3144
     a normal ldgp in the first two words.  */
3145
  else if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_STD_GPLOAD)
3146
    ;
3147
 
3148
  /* Otherwise, we may be able to identify a GP load in the first two
3149
     words, which we can then skip.  */
3150
  else
3151
    {
3152
      Elf_Internal_Rela *tsec_relocs, *tsec_relend, *tsec_free, *gpdisp;
3153
      bfd_vma ofs;
3154
 
3155
      /* Load the relocations from the section that the target symbol is in.  */
3156
      if (info->sec == info->tsec)
3157
        {
3158
          tsec_relocs = info->relocs;
3159
          tsec_relend = info->relend;
3160
          tsec_free = NULL;
3161
        }
3162
      else
3163
        {
3164
          tsec_relocs = (_bfd_elf_link_read_relocs
3165
                         (info->abfd, info->tsec, (PTR) NULL,
3166
                         (Elf_Internal_Rela *) NULL,
3167
                         info->link_info->keep_memory));
3168
          if (tsec_relocs == NULL)
3169
            return 0;
3170
          tsec_relend = tsec_relocs + info->tsec->reloc_count;
3171
          tsec_free = (info->link_info->keep_memory ? NULL : tsec_relocs);
3172
        }
3173
 
3174
      /* Recover the symbol's offset within the section.  */
3175
      ofs = (symval - info->tsec->output_section->vma
3176
             - info->tsec->output_offset);
3177
 
3178
      /* Look for a GPDISP reloc.  */
3179
      gpdisp = (elf64_alpha_find_reloc_at_ofs
3180
                (tsec_relocs, tsec_relend, ofs, R_ALPHA_GPDISP));
3181
 
3182
      if (!gpdisp || gpdisp->r_addend != 4)
3183
        {
3184
          if (tsec_free)
3185
            free (tsec_free);
3186
          return 0;
3187
        }
3188
      if (tsec_free)
3189
        free (tsec_free);
3190
    }
3191
 
3192
  /* We've now determined that we can skip an initial gp load.  Verify
3193
     that the call and the target use the same gp.   */
3194
  if (info->link_info->output_bfd->xvec != info->tsec->owner->xvec
3195
      || info->gotobj != alpha_elf_tdata (info->tsec->owner)->gotobj)
3196
    return 0;
3197
 
3198
  return symval + 8;
3199
}
3200
 
3201
static bfd_boolean
3202
elf64_alpha_relax_with_lituse (struct alpha_relax_info *info,
3203
                               bfd_vma symval, Elf_Internal_Rela *irel)
3204
{
3205
  Elf_Internal_Rela *urel, *irelend = info->relend;
3206
  int flags, count, i;
3207
  bfd_signed_vma disp;
3208
  bfd_boolean fits16;
3209
  bfd_boolean fits32;
3210
  bfd_boolean lit_reused = FALSE;
3211
  bfd_boolean all_optimized = TRUE;
3212
  unsigned int lit_insn;
3213
 
3214
  lit_insn = bfd_get_32 (info->abfd, info->contents + irel->r_offset);
3215
  if (lit_insn >> 26 != OP_LDQ)
3216
    {
3217
      ((*_bfd_error_handler)
3218
       ("%B: %A+0x%lx: warning: LITERAL relocation against unexpected insn",
3219
        info->abfd, info->sec,
3220
        (unsigned long) irel->r_offset));
3221
      return TRUE;
3222
    }
3223
 
3224
  /* Can't relax dynamic symbols.  */
3225
  if (alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info))
3226
    return TRUE;
3227
 
3228
  /* Summarize how this particular LITERAL is used.  */
3229
  for (urel = irel+1, flags = count = 0; urel < irelend; ++urel, ++count)
3230
    {
3231
      if (ELF64_R_TYPE (urel->r_info) != R_ALPHA_LITUSE)
3232
        break;
3233
      if (urel->r_addend <= 6)
3234
        flags |= 1 << urel->r_addend;
3235
    }
3236
 
3237
  /* A little preparation for the loop...  */
3238
  disp = symval - info->gp;
3239
 
3240
  for (urel = irel+1, i = 0; i < count; ++i, ++urel)
3241
    {
3242
      unsigned int insn;
3243
      int insn_disp;
3244
      bfd_signed_vma xdisp;
3245
 
3246
      insn = bfd_get_32 (info->abfd, info->contents + urel->r_offset);
3247
 
3248
      switch (urel->r_addend)
3249
        {
3250
        case LITUSE_ALPHA_ADDR:
3251
        default:
3252
          /* This type is really just a placeholder to note that all
3253
             uses cannot be optimized, but to still allow some.  */
3254
          all_optimized = FALSE;
3255
          break;
3256
 
3257
        case LITUSE_ALPHA_BASE:
3258
          /* We can always optimize 16-bit displacements.  */
3259
 
3260
          /* Extract the displacement from the instruction, sign-extending
3261
             it if necessary, then test whether it is within 16 or 32 bits
3262
             displacement from GP.  */
3263
          insn_disp = ((insn & 0xffff) ^ 0x8000) - 0x8000;
3264
 
3265
          xdisp = disp + insn_disp;
3266
          fits16 = (xdisp >= - (bfd_signed_vma) 0x8000 && xdisp < 0x8000);
3267
          fits32 = (xdisp >= - (bfd_signed_vma) 0x80000000
3268
                    && xdisp < 0x7fff8000);
3269
 
3270
          if (fits16)
3271
            {
3272
              /* Take the op code and dest from this insn, take the base
3273
                 register from the literal insn.  Leave the offset alone.  */
3274
              insn = (insn & 0xffe0ffff) | (lit_insn & 0x001f0000);
3275
              urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3276
                                           R_ALPHA_GPREL16);
3277
              urel->r_addend = irel->r_addend;
3278
              info->changed_relocs = TRUE;
3279
 
3280
              bfd_put_32 (info->abfd, (bfd_vma) insn,
3281
                          info->contents + urel->r_offset);
3282
              info->changed_contents = TRUE;
3283
            }
3284
 
3285
          /* If all mem+byte, we can optimize 32-bit mem displacements.  */
3286
          else if (fits32 && !(flags & ~6))
3287
            {
3288
              /* FIXME: sanity check that lit insn Ra is mem insn Rb.  */
3289
 
3290
              irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3291
                                           R_ALPHA_GPRELHIGH);
3292
              lit_insn = (OP_LDAH << 26) | (lit_insn & 0x03ff0000);
3293
              bfd_put_32 (info->abfd, (bfd_vma) lit_insn,
3294
                          info->contents + irel->r_offset);
3295
              lit_reused = TRUE;
3296
              info->changed_contents = TRUE;
3297
 
3298
              urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3299
                                           R_ALPHA_GPRELLOW);
3300
              urel->r_addend = irel->r_addend;
3301
              info->changed_relocs = TRUE;
3302
            }
3303
          else
3304
            all_optimized = FALSE;
3305
          break;
3306
 
3307
        case LITUSE_ALPHA_BYTOFF:
3308
          /* We can always optimize byte instructions.  */
3309
 
3310
          /* FIXME: sanity check the insn for byte op.  Check that the
3311
             literal dest reg is indeed Rb in the byte insn.  */
3312
 
3313
          insn &= ~ (unsigned) 0x001ff000;
3314
          insn |= ((symval & 7) << 13) | 0x1000;
3315
 
3316
          urel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3317
          urel->r_addend = 0;
3318
          info->changed_relocs = TRUE;
3319
 
3320
          bfd_put_32 (info->abfd, (bfd_vma) insn,
3321
                      info->contents + urel->r_offset);
3322
          info->changed_contents = TRUE;
3323
          break;
3324
 
3325
        case LITUSE_ALPHA_JSR:
3326
        case LITUSE_ALPHA_TLSGD:
3327
        case LITUSE_ALPHA_TLSLDM:
3328
        case LITUSE_ALPHA_JSRDIRECT:
3329
          {
3330
            bfd_vma optdest, org;
3331
            bfd_signed_vma odisp;
3332
 
3333
            /* For undefined weak symbols, we're mostly interested in getting
3334
               rid of the got entry whenever possible, so optimize this to a
3335
               use of the zero register.  */
3336
            if (info->h && info->h->root.root.type == bfd_link_hash_undefweak)
3337
              {
3338
                insn |= 31 << 16;
3339
                bfd_put_32 (info->abfd, (bfd_vma) insn,
3340
                            info->contents + urel->r_offset);
3341
 
3342
                info->changed_contents = TRUE;
3343
                break;
3344
              }
3345
 
3346
            /* If not zero, place to jump without needing pv.  */
3347
            optdest = elf64_alpha_relax_opt_call (info, symval);
3348
            org = (info->sec->output_section->vma
3349
                   + info->sec->output_offset
3350
                   + urel->r_offset + 4);
3351
            odisp = (optdest ? optdest : symval) - org;
3352
 
3353
            if (odisp >= -0x400000 && odisp < 0x400000)
3354
              {
3355
                Elf_Internal_Rela *xrel;
3356
 
3357
                /* Preserve branch prediction call stack when possible.  */
3358
                if ((insn & INSN_JSR_MASK) == INSN_JSR)
3359
                  insn = (OP_BSR << 26) | (insn & 0x03e00000);
3360
                else
3361
                  insn = (OP_BR << 26) | (insn & 0x03e00000);
3362
 
3363
                urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
3364
                                             R_ALPHA_BRADDR);
3365
                urel->r_addend = irel->r_addend;
3366
 
3367
                if (optdest)
3368
                  urel->r_addend += optdest - symval;
3369
                else
3370
                  all_optimized = FALSE;
3371
 
3372
                bfd_put_32 (info->abfd, (bfd_vma) insn,
3373
                            info->contents + urel->r_offset);
3374
 
3375
                /* Kill any HINT reloc that might exist for this insn.  */
3376
                xrel = (elf64_alpha_find_reloc_at_ofs
3377
                        (info->relocs, info->relend, urel->r_offset,
3378
                         R_ALPHA_HINT));
3379
                if (xrel)
3380
                  xrel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3381
 
3382
                info->changed_contents = TRUE;
3383
                info->changed_relocs = TRUE;
3384
              }
3385
            else
3386
              all_optimized = FALSE;
3387
 
3388
            /* Even if the target is not in range for a direct branch,
3389
               if we share a GP, we can eliminate the gp reload.  */
3390
            if (optdest)
3391
              {
3392
                Elf_Internal_Rela *gpdisp
3393
                  = (elf64_alpha_find_reloc_at_ofs
3394
                     (info->relocs, irelend, urel->r_offset + 4,
3395
                      R_ALPHA_GPDISP));
3396
                if (gpdisp)
3397
                  {
3398
                    bfd_byte *p_ldah = info->contents + gpdisp->r_offset;
3399
                    bfd_byte *p_lda = p_ldah + gpdisp->r_addend;
3400
                    unsigned int ldah = bfd_get_32 (info->abfd, p_ldah);
3401
                    unsigned int lda = bfd_get_32 (info->abfd, p_lda);
3402
 
3403
                    /* Verify that the instruction is "ldah $29,0($26)".
3404
                       Consider a function that ends in a noreturn call,
3405
                       and that the next function begins with an ldgp,
3406
                       and that by accident there is no padding between.
3407
                       In that case the insn would use $27 as the base.  */
3408
                    if (ldah == 0x27ba0000 && lda == 0x23bd0000)
3409
                      {
3410
                        bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, p_ldah);
3411
                        bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, p_lda);
3412
 
3413
                        gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3414
                        info->changed_contents = TRUE;
3415
                        info->changed_relocs = TRUE;
3416
                      }
3417
                  }
3418
              }
3419
          }
3420
          break;
3421
        }
3422
    }
3423
 
3424
  /* If all cases were optimized, we can reduce the use count on this
3425
     got entry by one, possibly eliminating it.  */
3426
  if (all_optimized)
3427
    {
3428
      if (--info->gotent->use_count == 0)
3429
        {
3430
          int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3431
          alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3432
          if (!info->h)
3433
            alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3434
        }
3435
 
3436
      /* If the literal instruction is no longer needed (it may have been
3437
         reused.  We can eliminate it.  */
3438
      /* ??? For now, I don't want to deal with compacting the section,
3439
         so just nop it out.  */
3440
      if (!lit_reused)
3441
        {
3442
          irel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3443
          info->changed_relocs = TRUE;
3444
 
3445
          bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP,
3446
                      info->contents + irel->r_offset);
3447
          info->changed_contents = TRUE;
3448
        }
3449
 
3450
      return TRUE;
3451
    }
3452
  else
3453
    return elf64_alpha_relax_got_load (info, symval, irel, R_ALPHA_LITERAL);
3454
}
3455
 
3456
static bfd_boolean
3457
elf64_alpha_relax_tls_get_addr (struct alpha_relax_info *info, bfd_vma symval,
3458
                                Elf_Internal_Rela *irel, bfd_boolean is_gd)
3459
{
3460
  bfd_byte *pos[5];
3461
  unsigned int insn, tlsgd_reg;
3462
  Elf_Internal_Rela *gpdisp, *hint;
3463
  bfd_boolean dynamic, use_gottprel;
3464
  unsigned long new_symndx;
3465
 
3466
  dynamic = alpha_elf_dynamic_symbol_p (&info->h->root, info->link_info);
3467
 
3468
  /* If a TLS symbol is accessed using IE at least once, there is no point
3469
     to use dynamic model for it.  */
3470
  if (is_gd && info->h && (info->h->flags & ALPHA_ELF_LINK_HASH_TLS_IE))
3471
    ;
3472
 
3473
  /* If the symbol is local, and we've already committed to DF_STATIC_TLS,
3474
     then we might as well relax to IE.  */
3475
  else if (info->link_info->shared && !dynamic
3476
           && (info->link_info->flags & DF_STATIC_TLS))
3477
    ;
3478
 
3479
  /* Otherwise we must be building an executable to do anything.  */
3480
  else if (info->link_info->shared)
3481
    return TRUE;
3482
 
3483
  /* The TLSGD/TLSLDM relocation must be followed by a LITERAL and
3484
     the matching LITUSE_TLS relocations.  */
3485
  if (irel + 2 >= info->relend)
3486
    return TRUE;
3487
  if (ELF64_R_TYPE (irel[1].r_info) != R_ALPHA_LITERAL
3488
      || ELF64_R_TYPE (irel[2].r_info) != R_ALPHA_LITUSE
3489
      || irel[2].r_addend != (is_gd ? LITUSE_ALPHA_TLSGD : LITUSE_ALPHA_TLSLDM))
3490
    return TRUE;
3491
 
3492
  /* There must be a GPDISP relocation positioned immediately after the
3493
     LITUSE relocation.  */
3494
  gpdisp = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3495
                                          irel[2].r_offset + 4, R_ALPHA_GPDISP);
3496
  if (!gpdisp)
3497
    return TRUE;
3498
 
3499
  pos[0] = info->contents + irel[0].r_offset;
3500
  pos[1] = info->contents + irel[1].r_offset;
3501
  pos[2] = info->contents + irel[2].r_offset;
3502
  pos[3] = info->contents + gpdisp->r_offset;
3503
  pos[4] = pos[3] + gpdisp->r_addend;
3504
 
3505
  /* Generally, the positions are not allowed to be out of order, lest the
3506
     modified insn sequence have different register lifetimes.  We can make
3507
     an exception when pos 1 is adjacent to pos 0.  */
3508
  if (pos[1] + 4 == pos[0])
3509
    {
3510
      bfd_byte *tmp = pos[0];
3511
      pos[0] = pos[1];
3512
      pos[1] = tmp;
3513
    }
3514
  if (pos[1] >= pos[2] || pos[2] >= pos[3])
3515
    return TRUE;
3516
 
3517
  /* Reduce the use count on the LITERAL relocation.  Do this before we
3518
     smash the symndx when we adjust the relocations below.  */
3519
  {
3520
    struct alpha_elf_got_entry *lit_gotent;
3521
    struct alpha_elf_link_hash_entry *lit_h;
3522
    unsigned long indx;
3523
 
3524
    BFD_ASSERT (ELF64_R_SYM (irel[1].r_info) >= info->symtab_hdr->sh_info);
3525
    indx = ELF64_R_SYM (irel[1].r_info) - info->symtab_hdr->sh_info;
3526
    lit_h = alpha_elf_sym_hashes (info->abfd)[indx];
3527
 
3528
    while (lit_h->root.root.type == bfd_link_hash_indirect
3529
           || lit_h->root.root.type == bfd_link_hash_warning)
3530
      lit_h = (struct alpha_elf_link_hash_entry *) lit_h->root.root.u.i.link;
3531
 
3532
    for (lit_gotent = lit_h->got_entries; lit_gotent ;
3533
         lit_gotent = lit_gotent->next)
3534
      if (lit_gotent->gotobj == info->gotobj
3535
          && lit_gotent->reloc_type == R_ALPHA_LITERAL
3536
          && lit_gotent->addend == irel[1].r_addend)
3537
        break;
3538
    BFD_ASSERT (lit_gotent);
3539
 
3540
    if (--lit_gotent->use_count == 0)
3541
      {
3542
        int sz = alpha_got_entry_size (R_ALPHA_LITERAL);
3543
        alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3544
      }
3545
  }
3546
 
3547
  /* Change
3548
 
3549
        lda     $16,x($gp)                      !tlsgd!1
3550
        ldq     $27,__tls_get_addr($gp)         !literal!1
3551
        jsr     $26,($27),__tls_get_addr        !lituse_tlsgd!1
3552
        ldah    $29,0($26)                      !gpdisp!2
3553
        lda     $29,0($29)                      !gpdisp!2
3554
     to
3555
        ldq     $16,x($gp)                      !gottprel
3556
        unop
3557
        call_pal rduniq
3558
        addq    $16,$0,$0
3559
        unop
3560
     or the first pair to
3561
        lda     $16,x($gp)                      !tprel
3562
        unop
3563
     or
3564
        ldah    $16,x($gp)                      !tprelhi
3565
        lda     $16,x($16)                      !tprello
3566
 
3567
     as appropriate.  */
3568
 
3569
  use_gottprel = FALSE;
3570
  new_symndx = is_gd ? ELF64_R_SYM (irel->r_info) : STN_UNDEF;
3571
 
3572
  /* Beware of the compiler hoisting part of the sequence out a loop
3573
     and adjusting the destination register for the TLSGD insn.  If this
3574
     happens, there will be a move into $16 before the JSR insn, so only
3575
     transformations of the first insn pair should use this register.  */
3576
  tlsgd_reg = bfd_get_32 (info->abfd, pos[0]);
3577
  tlsgd_reg = (tlsgd_reg >> 21) & 31;
3578
 
3579
  switch (!dynamic && !info->link_info->shared)
3580
    {
3581
    case 1:
3582
      {
3583
        bfd_vma tp_base;
3584
        bfd_signed_vma disp;
3585
 
3586
        BFD_ASSERT (elf_hash_table (info->link_info)->tls_sec != NULL);
3587
        tp_base = alpha_get_tprel_base (info->link_info);
3588
        disp = symval - tp_base;
3589
 
3590
        if (disp >= -0x8000 && disp < 0x8000)
3591
          {
3592
            insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (31 << 16);
3593
            bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3594
            bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3595
 
3596
            irel[0].r_offset = pos[0] - info->contents;
3597
            irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPREL16);
3598
            irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3599
            break;
3600
          }
3601
        else if (disp >= -(bfd_signed_vma) 0x80000000
3602
                 && disp < (bfd_signed_vma) 0x7fff8000
3603
                 && pos[0] + 4 == pos[1])
3604
          {
3605
            insn = (OP_LDAH << 26) | (tlsgd_reg << 21) | (31 << 16);
3606
            bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3607
            insn = (OP_LDA << 26) | (tlsgd_reg << 21) | (tlsgd_reg << 16);
3608
            bfd_put_32 (info->abfd, (bfd_vma) insn, pos[1]);
3609
 
3610
            irel[0].r_offset = pos[0] - info->contents;
3611
            irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELHI);
3612
            irel[1].r_offset = pos[1] - info->contents;
3613
            irel[1].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_TPRELLO);
3614
            break;
3615
          }
3616
      }
3617
      /* FALLTHRU */
3618
 
3619
    default:
3620
      use_gottprel = TRUE;
3621
 
3622
      insn = (OP_LDQ << 26) | (tlsgd_reg << 21) | (29 << 16);
3623
      bfd_put_32 (info->abfd, (bfd_vma) insn, pos[0]);
3624
      bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[1]);
3625
 
3626
      irel[0].r_offset = pos[0] - info->contents;
3627
      irel[0].r_info = ELF64_R_INFO (new_symndx, R_ALPHA_GOTTPREL);
3628
      irel[1].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3629
      break;
3630
    }
3631
 
3632
  bfd_put_32 (info->abfd, (bfd_vma) INSN_RDUNIQ, pos[2]);
3633
 
3634
  insn = INSN_ADDQ | (16 << 21) | (0 << 16) | (0 << 0);
3635
  bfd_put_32 (info->abfd, (bfd_vma) insn, pos[3]);
3636
 
3637
  bfd_put_32 (info->abfd, (bfd_vma) INSN_UNOP, pos[4]);
3638
 
3639
  irel[2].r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3640
  gpdisp->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3641
 
3642
  hint = elf64_alpha_find_reloc_at_ofs (info->relocs, info->relend,
3643
                                        irel[2].r_offset, R_ALPHA_HINT);
3644
  if (hint)
3645
    hint->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
3646
 
3647
  info->changed_contents = TRUE;
3648
  info->changed_relocs = TRUE;
3649
 
3650
  /* Reduce the use count on the TLSGD/TLSLDM relocation.  */
3651
  if (--info->gotent->use_count == 0)
3652
    {
3653
      int sz = alpha_got_entry_size (info->gotent->reloc_type);
3654
      alpha_elf_tdata (info->gotobj)->total_got_size -= sz;
3655
      if (!info->h)
3656
        alpha_elf_tdata (info->gotobj)->local_got_size -= sz;
3657
    }
3658
 
3659
  /* If we've switched to a GOTTPREL relocation, increment the reference
3660
     count on that got entry.  */
3661
  if (use_gottprel)
3662
    {
3663
      struct alpha_elf_got_entry *tprel_gotent;
3664
 
3665
      for (tprel_gotent = *info->first_gotent; tprel_gotent ;
3666
           tprel_gotent = tprel_gotent->next)
3667
        if (tprel_gotent->gotobj == info->gotobj
3668
            && tprel_gotent->reloc_type == R_ALPHA_GOTTPREL
3669
            && tprel_gotent->addend == irel->r_addend)
3670
          break;
3671
      if (tprel_gotent)
3672
        tprel_gotent->use_count++;
3673
      else
3674
        {
3675
          if (info->gotent->use_count == 0)
3676
            tprel_gotent = info->gotent;
3677
          else
3678
            {
3679
              tprel_gotent = (struct alpha_elf_got_entry *)
3680
                bfd_alloc (info->abfd, sizeof (struct alpha_elf_got_entry));
3681
              if (!tprel_gotent)
3682
                return FALSE;
3683
 
3684
              tprel_gotent->next = *info->first_gotent;
3685
              *info->first_gotent = tprel_gotent;
3686
 
3687
              tprel_gotent->gotobj = info->gotobj;
3688
              tprel_gotent->addend = irel->r_addend;
3689
              tprel_gotent->got_offset = -1;
3690
              tprel_gotent->reloc_done = 0;
3691
              tprel_gotent->reloc_xlated = 0;
3692
            }
3693
 
3694
          tprel_gotent->use_count = 1;
3695
          tprel_gotent->reloc_type = R_ALPHA_GOTTPREL;
3696
        }
3697
    }
3698
 
3699
  return TRUE;
3700
}
3701
 
3702
static bfd_boolean
3703
elf64_alpha_relax_section (bfd *abfd, asection *sec,
3704
                           struct bfd_link_info *link_info, bfd_boolean *again)
3705
{
3706
  Elf_Internal_Shdr *symtab_hdr;
3707
  Elf_Internal_Rela *internal_relocs;
3708
  Elf_Internal_Rela *irel, *irelend;
3709
  Elf_Internal_Sym *isymbuf = NULL;
3710
  struct alpha_elf_got_entry **local_got_entries;
3711
  struct alpha_relax_info info;
3712
  struct alpha_elf_link_hash_table * htab;
3713
 
3714
  htab = alpha_elf_hash_table (link_info);
3715
  if (htab == NULL)
3716
    return FALSE;
3717
 
3718
  /* There's nothing to change, yet.  */
3719
  *again = FALSE;
3720
 
3721
  if (link_info->relocatable
3722
      || ((sec->flags & (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3723
          != (SEC_CODE | SEC_RELOC | SEC_ALLOC))
3724
      || sec->reloc_count == 0)
3725
    return TRUE;
3726
 
3727
  BFD_ASSERT (is_alpha_elf (abfd));
3728
 
3729
  /* Make sure our GOT and PLT tables are up-to-date.  */
3730
  if (htab->relax_trip != link_info->relax_trip)
3731
    {
3732
      htab->relax_trip = link_info->relax_trip;
3733
 
3734
      /* This should never fail after the initial round, since the only
3735
         error is GOT overflow, and relaxation only shrinks the table.  */
3736
      if (!elf64_alpha_size_got_sections (link_info))
3737
        abort ();
3738
      if (elf_hash_table (link_info)->dynamic_sections_created)
3739
        {
3740
          elf64_alpha_size_plt_section (link_info);
3741
          elf64_alpha_size_rela_got_section (link_info);
3742
        }
3743
    }
3744
 
3745
  symtab_hdr = &elf_symtab_hdr (abfd);
3746
  local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
3747
 
3748
  /* Load the relocations for this section.  */
3749
  internal_relocs = (_bfd_elf_link_read_relocs
3750
                     (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
3751
                      link_info->keep_memory));
3752
  if (internal_relocs == NULL)
3753
    return FALSE;
3754
 
3755
  memset(&info, 0, sizeof (info));
3756
  info.abfd = abfd;
3757
  info.sec = sec;
3758
  info.link_info = link_info;
3759
  info.symtab_hdr = symtab_hdr;
3760
  info.relocs = internal_relocs;
3761
  info.relend = irelend = internal_relocs + sec->reloc_count;
3762
 
3763
  /* Find the GP for this object.  Do not store the result back via
3764
     _bfd_set_gp_value, since this could change again before final.  */
3765
  info.gotobj = alpha_elf_tdata (abfd)->gotobj;
3766
  if (info.gotobj)
3767
    {
3768
      asection *sgot = alpha_elf_tdata (info.gotobj)->got;
3769
      info.gp = (sgot->output_section->vma
3770
                 + sgot->output_offset
3771
                 + 0x8000);
3772
    }
3773
 
3774
  /* Get the section contents.  */
3775
  if (elf_section_data (sec)->this_hdr.contents != NULL)
3776
    info.contents = elf_section_data (sec)->this_hdr.contents;
3777
  else
3778
    {
3779
      if (!bfd_malloc_and_get_section (abfd, sec, &info.contents))
3780
        goto error_return;
3781
    }
3782
 
3783
  for (irel = internal_relocs; irel < irelend; irel++)
3784
    {
3785
      bfd_vma symval;
3786
      struct alpha_elf_got_entry *gotent;
3787
      unsigned long r_type = ELF64_R_TYPE (irel->r_info);
3788
      unsigned long r_symndx = ELF64_R_SYM (irel->r_info);
3789
 
3790
      /* Early exit for unhandled or unrelaxable relocations.  */
3791
      switch (r_type)
3792
        {
3793
        case R_ALPHA_LITERAL:
3794
        case R_ALPHA_GPRELHIGH:
3795
        case R_ALPHA_GPRELLOW:
3796
        case R_ALPHA_GOTDTPREL:
3797
        case R_ALPHA_GOTTPREL:
3798
        case R_ALPHA_TLSGD:
3799
          break;
3800
 
3801
        case R_ALPHA_TLSLDM:
3802
          /* The symbol for a TLSLDM reloc is ignored.  Collapse the
3803
             reloc to the STN_UNDEF (0) symbol so that they all match.  */
3804
          r_symndx = STN_UNDEF;
3805
          break;
3806
 
3807
        default:
3808
          continue;
3809
        }
3810
 
3811
      /* Get the value of the symbol referred to by the reloc.  */
3812
      if (r_symndx < symtab_hdr->sh_info)
3813
        {
3814
          /* A local symbol.  */
3815
          Elf_Internal_Sym *isym;
3816
 
3817
          /* Read this BFD's local symbols.  */
3818
          if (isymbuf == NULL)
3819
            {
3820
              isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
3821
              if (isymbuf == NULL)
3822
                isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
3823
                                                symtab_hdr->sh_info, 0,
3824
                                                NULL, NULL, NULL);
3825
              if (isymbuf == NULL)
3826
                goto error_return;
3827
            }
3828
 
3829
          isym = isymbuf + r_symndx;
3830
 
3831
          /* Given the symbol for a TLSLDM reloc is ignored, this also
3832
             means forcing the symbol value to the tp base.  */
3833
          if (r_type == R_ALPHA_TLSLDM)
3834
            {
3835
              info.tsec = bfd_abs_section_ptr;
3836
              symval = alpha_get_tprel_base (info.link_info);
3837
            }
3838
          else
3839
            {
3840
              symval = isym->st_value;
3841
              if (isym->st_shndx == SHN_UNDEF)
3842
                continue;
3843
              else if (isym->st_shndx == SHN_ABS)
3844
                info.tsec = bfd_abs_section_ptr;
3845
              else if (isym->st_shndx == SHN_COMMON)
3846
                info.tsec = bfd_com_section_ptr;
3847
              else
3848
                info.tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
3849
            }
3850
 
3851
          info.h = NULL;
3852
          info.other = isym->st_other;
3853
          if (local_got_entries)
3854
            info.first_gotent = &local_got_entries[r_symndx];
3855
          else
3856
            {
3857
              info.first_gotent = &info.gotent;
3858
              info.gotent = NULL;
3859
            }
3860
        }
3861
      else
3862
        {
3863
          unsigned long indx;
3864
          struct alpha_elf_link_hash_entry *h;
3865
 
3866
          indx = r_symndx - symtab_hdr->sh_info;
3867
          h = alpha_elf_sym_hashes (abfd)[indx];
3868
          BFD_ASSERT (h != NULL);
3869
 
3870
          while (h->root.root.type == bfd_link_hash_indirect
3871
                 || h->root.root.type == bfd_link_hash_warning)
3872
            h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
3873
 
3874
          /* If the symbol is undefined, we can't do anything with it.  */
3875
          if (h->root.root.type == bfd_link_hash_undefined)
3876
            continue;
3877
 
3878
          /* If the symbol isn't defined in the current module,
3879
             again we can't do anything.  */
3880
          if (h->root.root.type == bfd_link_hash_undefweak)
3881
            {
3882
              info.tsec = bfd_abs_section_ptr;
3883
              symval = 0;
3884
            }
3885
          else if (!h->root.def_regular)
3886
            {
3887
              /* Except for TLSGD relocs, which can sometimes be
3888
                 relaxed to GOTTPREL relocs.  */
3889
              if (r_type != R_ALPHA_TLSGD)
3890
                continue;
3891
              info.tsec = bfd_abs_section_ptr;
3892
              symval = 0;
3893
            }
3894
          else
3895
            {
3896
              info.tsec = h->root.root.u.def.section;
3897
              symval = h->root.root.u.def.value;
3898
            }
3899
 
3900
          info.h = h;
3901
          info.other = h->root.other;
3902
          info.first_gotent = &h->got_entries;
3903
        }
3904
 
3905
      /* Search for the got entry to be used by this relocation.  */
3906
      for (gotent = *info.first_gotent; gotent ; gotent = gotent->next)
3907
        if (gotent->gotobj == info.gotobj
3908
            && gotent->reloc_type == r_type
3909
            && gotent->addend == irel->r_addend)
3910
          break;
3911
      info.gotent = gotent;
3912
 
3913
      symval += info.tsec->output_section->vma + info.tsec->output_offset;
3914
      symval += irel->r_addend;
3915
 
3916
      switch (r_type)
3917
        {
3918
        case R_ALPHA_LITERAL:
3919
          BFD_ASSERT(info.gotent != NULL);
3920
 
3921
          /* If there exist LITUSE relocations immediately following, this
3922
             opens up all sorts of interesting optimizations, because we
3923
             now know every location that this address load is used.  */
3924
          if (irel+1 < irelend
3925
              && ELF64_R_TYPE (irel[1].r_info) == R_ALPHA_LITUSE)
3926
            {
3927
              if (!elf64_alpha_relax_with_lituse (&info, symval, irel))
3928
                goto error_return;
3929
            }
3930
          else
3931
            {
3932
              if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3933
                goto error_return;
3934
            }
3935
          break;
3936
 
3937
        case R_ALPHA_GOTDTPREL:
3938
        case R_ALPHA_GOTTPREL:
3939
          BFD_ASSERT(info.gotent != NULL);
3940
          if (!elf64_alpha_relax_got_load (&info, symval, irel, r_type))
3941
            goto error_return;
3942
          break;
3943
 
3944
        case R_ALPHA_TLSGD:
3945
        case R_ALPHA_TLSLDM:
3946
          BFD_ASSERT(info.gotent != NULL);
3947
          if (!elf64_alpha_relax_tls_get_addr (&info, symval, irel,
3948
                                               r_type == R_ALPHA_TLSGD))
3949
            goto error_return;
3950
          break;
3951
        }
3952
    }
3953
 
3954
  if (isymbuf != NULL
3955
      && symtab_hdr->contents != (unsigned char *) isymbuf)
3956
    {
3957
      if (!link_info->keep_memory)
3958
        free (isymbuf);
3959
      else
3960
        {
3961
          /* Cache the symbols for elf_link_input_bfd.  */
3962
          symtab_hdr->contents = (unsigned char *) isymbuf;
3963
        }
3964
    }
3965
 
3966
  if (info.contents != NULL
3967
      && elf_section_data (sec)->this_hdr.contents != info.contents)
3968
    {
3969
      if (!info.changed_contents && !link_info->keep_memory)
3970
        free (info.contents);
3971
      else
3972
        {
3973
          /* Cache the section contents for elf_link_input_bfd.  */
3974
          elf_section_data (sec)->this_hdr.contents = info.contents;
3975
        }
3976
    }
3977
 
3978
  if (elf_section_data (sec)->relocs != internal_relocs)
3979
    {
3980
      if (!info.changed_relocs)
3981
        free (internal_relocs);
3982
      else
3983
        elf_section_data (sec)->relocs = internal_relocs;
3984
    }
3985
 
3986
  *again = info.changed_contents || info.changed_relocs;
3987
 
3988
  return TRUE;
3989
 
3990
 error_return:
3991
  if (isymbuf != NULL
3992
      && symtab_hdr->contents != (unsigned char *) isymbuf)
3993
    free (isymbuf);
3994
  if (info.contents != NULL
3995
      && elf_section_data (sec)->this_hdr.contents != info.contents)
3996
    free (info.contents);
3997
  if (internal_relocs != NULL
3998
      && elf_section_data (sec)->relocs != internal_relocs)
3999
    free (internal_relocs);
4000
  return FALSE;
4001
}
4002
 
4003
/* Emit a dynamic relocation for (DYNINDX, RTYPE, ADDEND) at (SEC, OFFSET)
4004
   into the next available slot in SREL.  */
4005
 
4006
static void
4007
elf64_alpha_emit_dynrel (bfd *abfd, struct bfd_link_info *info,
4008
                         asection *sec, asection *srel, bfd_vma offset,
4009
                         long dynindx, long rtype, bfd_vma addend)
4010
{
4011
  Elf_Internal_Rela outrel;
4012
  bfd_byte *loc;
4013
 
4014
  BFD_ASSERT (srel != NULL);
4015
 
4016
  outrel.r_info = ELF64_R_INFO (dynindx, rtype);
4017
  outrel.r_addend = addend;
4018
 
4019
  offset = _bfd_elf_section_offset (abfd, info, sec, offset);
4020
  if ((offset | 1) != (bfd_vma) -1)
4021
    outrel.r_offset = sec->output_section->vma + sec->output_offset + offset;
4022
  else
4023
    memset (&outrel, 0, sizeof (outrel));
4024
 
4025
  loc = srel->contents;
4026
  loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
4027
  bfd_elf64_swap_reloca_out (abfd, &outrel, loc);
4028
  BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count <= srel->size);
4029
}
4030
 
4031
/* Relocate an Alpha ELF section for a relocatable link.
4032
 
4033
   We don't have to change anything unless the reloc is against a section
4034
   symbol, in which case we have to adjust according to where the section
4035
   symbol winds up in the output section.  */
4036
 
4037
static bfd_boolean
4038
elf64_alpha_relocate_section_r (bfd *output_bfd ATTRIBUTE_UNUSED,
4039
                                struct bfd_link_info *info ATTRIBUTE_UNUSED,
4040
                                bfd *input_bfd, asection *input_section,
4041
                                bfd_byte *contents ATTRIBUTE_UNUSED,
4042
                                Elf_Internal_Rela *relocs,
4043
                                Elf_Internal_Sym *local_syms,
4044
                                asection **local_sections)
4045
{
4046
  unsigned long symtab_hdr_sh_info;
4047
  Elf_Internal_Rela *rel;
4048
  Elf_Internal_Rela *relend;
4049
  struct elf_link_hash_entry **sym_hashes;
4050
  bfd_boolean ret_val = TRUE;
4051
 
4052
  symtab_hdr_sh_info = elf_symtab_hdr (input_bfd).sh_info;
4053
  sym_hashes = elf_sym_hashes (input_bfd);
4054
 
4055
  relend = relocs + input_section->reloc_count;
4056
  for (rel = relocs; rel < relend; rel++)
4057
    {
4058
      unsigned long r_symndx;
4059
      Elf_Internal_Sym *sym;
4060
      asection *sec;
4061
      unsigned long r_type;
4062
 
4063
      r_type = ELF64_R_TYPE (rel->r_info);
4064
      if (r_type >= R_ALPHA_max)
4065
        {
4066
          (*_bfd_error_handler)
4067
            (_("%B: unknown relocation type %d"),
4068
             input_bfd, (int) r_type);
4069
          bfd_set_error (bfd_error_bad_value);
4070
          ret_val = FALSE;
4071
          continue;
4072
        }
4073
 
4074
      /* The symbol associated with GPDISP and LITUSE is
4075
         immaterial.  Only the addend is significant.  */
4076
      if (r_type == R_ALPHA_GPDISP || r_type == R_ALPHA_LITUSE)
4077
        continue;
4078
 
4079
      r_symndx = ELF64_R_SYM (rel->r_info);
4080
      if (r_symndx < symtab_hdr_sh_info)
4081
        {
4082
          sym = local_syms + r_symndx;
4083
          sec = local_sections[r_symndx];
4084
        }
4085
      else
4086
        {
4087
          struct elf_link_hash_entry *h;
4088
 
4089
          h = sym_hashes[r_symndx - symtab_hdr_sh_info];
4090
 
4091
          while (h->root.type == bfd_link_hash_indirect
4092
                 || h->root.type == bfd_link_hash_warning)
4093
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
4094
 
4095
          if (h->root.type != bfd_link_hash_defined
4096
              && h->root.type != bfd_link_hash_defweak)
4097
            continue;
4098
 
4099
          sym = NULL;
4100
          sec = h->root.u.def.section;
4101
        }
4102
 
4103
      if (sec != NULL && elf_discarded_section (sec))
4104
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4105
                                         rel, relend,
4106
                                         elf64_alpha_howto_table + r_type,
4107
                                         contents);
4108
 
4109
      if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
4110
        rel->r_addend += sec->output_offset;
4111
    }
4112
 
4113
  return ret_val;
4114
}
4115
 
4116
/* Relocate an Alpha ELF section.  */
4117
 
4118
static bfd_boolean
4119
elf64_alpha_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
4120
                              bfd *input_bfd, asection *input_section,
4121
                              bfd_byte *contents, Elf_Internal_Rela *relocs,
4122
                              Elf_Internal_Sym *local_syms,
4123
                              asection **local_sections)
4124
{
4125
  Elf_Internal_Shdr *symtab_hdr;
4126
  Elf_Internal_Rela *rel;
4127
  Elf_Internal_Rela *relend;
4128
  asection *sgot, *srel, *srelgot;
4129
  bfd *dynobj, *gotobj;
4130
  bfd_vma gp, tp_base, dtp_base;
4131
  struct alpha_elf_got_entry **local_got_entries;
4132
  bfd_boolean ret_val;
4133
 
4134
  BFD_ASSERT (is_alpha_elf (input_bfd));
4135
 
4136
  /* Handle relocatable links with a smaller loop.  */
4137
  if (info->relocatable)
4138
    return elf64_alpha_relocate_section_r (output_bfd, info, input_bfd,
4139
                                           input_section, contents, relocs,
4140
                                           local_syms, local_sections);
4141
 
4142
  /* This is a final link.  */
4143
 
4144
  ret_val = TRUE;
4145
 
4146
  symtab_hdr = &elf_symtab_hdr (input_bfd);
4147
 
4148
  dynobj = elf_hash_table (info)->dynobj;
4149
  if (dynobj)
4150
    srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
4151
  else
4152
    srelgot = NULL;
4153
 
4154
  if (input_section->flags & SEC_ALLOC)
4155
    {
4156
      const char *section_name;
4157
      section_name = (bfd_elf_string_from_elf_section
4158
                      (input_bfd, elf_elfheader(input_bfd)->e_shstrndx,
4159
                       _bfd_elf_single_rel_hdr (input_section)->sh_name));
4160
      BFD_ASSERT(section_name != NULL);
4161
      srel = bfd_get_section_by_name (dynobj, section_name);
4162
    }
4163
  else
4164
    srel = NULL;
4165
 
4166
  /* Find the gp value for this input bfd.  */
4167
  gotobj = alpha_elf_tdata (input_bfd)->gotobj;
4168
  if (gotobj)
4169
    {
4170
      sgot = alpha_elf_tdata (gotobj)->got;
4171
      gp = _bfd_get_gp_value (gotobj);
4172
      if (gp == 0)
4173
        {
4174
          gp = (sgot->output_section->vma
4175
                + sgot->output_offset
4176
                + 0x8000);
4177
          _bfd_set_gp_value (gotobj, gp);
4178
        }
4179
    }
4180
  else
4181
    {
4182
      sgot = NULL;
4183
      gp = 0;
4184
    }
4185
 
4186
  local_got_entries = alpha_elf_tdata(input_bfd)->local_got_entries;
4187
 
4188
  if (elf_hash_table (info)->tls_sec != NULL)
4189
    {
4190
      dtp_base = alpha_get_dtprel_base (info);
4191
      tp_base = alpha_get_tprel_base (info);
4192
    }
4193
  else
4194
    dtp_base = tp_base = 0;
4195
 
4196
  relend = relocs + input_section->reloc_count;
4197
  for (rel = relocs; rel < relend; rel++)
4198
    {
4199
      struct alpha_elf_link_hash_entry *h = NULL;
4200
      struct alpha_elf_got_entry *gotent;
4201
      bfd_reloc_status_type r;
4202
      reloc_howto_type *howto;
4203
      unsigned long r_symndx;
4204
      Elf_Internal_Sym *sym = NULL;
4205
      asection *sec = NULL;
4206
      bfd_vma value;
4207
      bfd_vma addend;
4208
      bfd_boolean dynamic_symbol_p;
4209
      bfd_boolean undef_weak_ref = FALSE;
4210
      unsigned long r_type;
4211
 
4212
      r_type = ELF64_R_TYPE(rel->r_info);
4213
      if (r_type >= R_ALPHA_max)
4214
        {
4215
          (*_bfd_error_handler)
4216
            (_("%B: unknown relocation type %d"),
4217
             input_bfd, (int) r_type);
4218
          bfd_set_error (bfd_error_bad_value);
4219
          ret_val = FALSE;
4220
          continue;
4221
        }
4222
 
4223
      howto = elf64_alpha_howto_table + r_type;
4224
      r_symndx = ELF64_R_SYM(rel->r_info);
4225
 
4226
      /* The symbol for a TLSLDM reloc is ignored.  Collapse the
4227
         reloc to the STN_UNDEF (0) symbol so that they all match.  */
4228
      if (r_type == R_ALPHA_TLSLDM)
4229
        r_symndx = STN_UNDEF;
4230
 
4231
      if (r_symndx < symtab_hdr->sh_info)
4232
        {
4233
          asection *msec;
4234
          sym = local_syms + r_symndx;
4235
          sec = local_sections[r_symndx];
4236
          msec = sec;
4237
          value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
4238
 
4239
          /* If this is a tp-relative relocation against sym STN_UNDEF (0),
4240
             this is hackery from relax_section.  Force the value to
4241
             be the tls module base.  */
4242
          if (r_symndx == STN_UNDEF
4243
              && (r_type == R_ALPHA_TLSLDM
4244
                  || r_type == R_ALPHA_GOTTPREL
4245
                  || r_type == R_ALPHA_TPREL64
4246
                  || r_type == R_ALPHA_TPRELHI
4247
                  || r_type == R_ALPHA_TPRELLO
4248
                  || r_type == R_ALPHA_TPREL16))
4249
            value = dtp_base;
4250
 
4251
          if (local_got_entries)
4252
            gotent = local_got_entries[r_symndx];
4253
          else
4254
            gotent = NULL;
4255
 
4256
          /* Need to adjust local GOT entries' addends for SEC_MERGE
4257
             unless it has been done already.  */
4258
          if ((sec->flags & SEC_MERGE)
4259
              && ELF_ST_TYPE (sym->st_info) == STT_SECTION
4260
              && sec->sec_info_type == ELF_INFO_TYPE_MERGE
4261
              && gotent
4262
              && !gotent->reloc_xlated)
4263
            {
4264
              struct alpha_elf_got_entry *ent;
4265
 
4266
              for (ent = gotent; ent; ent = ent->next)
4267
                {
4268
                  ent->reloc_xlated = 1;
4269
                  if (ent->use_count == 0)
4270
                    continue;
4271
                  msec = sec;
4272
                  ent->addend =
4273
                    _bfd_merged_section_offset (output_bfd, &msec,
4274
                                                elf_section_data (sec)->
4275
                                                  sec_info,
4276
                                                sym->st_value + ent->addend);
4277
                  ent->addend -= sym->st_value;
4278
                  ent->addend += msec->output_section->vma
4279
                                 + msec->output_offset
4280
                                 - sec->output_section->vma
4281
                                 - sec->output_offset;
4282
                }
4283
            }
4284
 
4285
          dynamic_symbol_p = FALSE;
4286
        }
4287
      else
4288
        {
4289
          bfd_boolean warned;
4290
          bfd_boolean unresolved_reloc;
4291
          struct elf_link_hash_entry *hh;
4292
          struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
4293
 
4294
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4295
                                   r_symndx, symtab_hdr, sym_hashes,
4296
                                   hh, sec, value,
4297
                                   unresolved_reloc, warned);
4298
 
4299
          if (warned)
4300
            continue;
4301
 
4302
          if (value == 0
4303
              && ! unresolved_reloc
4304
              && hh->root.type == bfd_link_hash_undefweak)
4305
            undef_weak_ref = TRUE;
4306
 
4307
          h = (struct alpha_elf_link_hash_entry *) hh;
4308
          dynamic_symbol_p = alpha_elf_dynamic_symbol_p (&h->root, info);
4309
          gotent = h->got_entries;
4310
        }
4311
 
4312
      if (sec != NULL && elf_discarded_section (sec))
4313
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
4314
                                         rel, relend, howto, contents);
4315
 
4316
      addend = rel->r_addend;
4317
      value += addend;
4318
 
4319
      /* Search for the proper got entry.  */
4320
      for (; gotent ; gotent = gotent->next)
4321
        if (gotent->gotobj == gotobj
4322
            && gotent->reloc_type == r_type
4323
            && gotent->addend == addend)
4324
          break;
4325
 
4326
      switch (r_type)
4327
        {
4328
        case R_ALPHA_GPDISP:
4329
          {
4330
            bfd_byte *p_ldah, *p_lda;
4331
 
4332
            BFD_ASSERT(gp != 0);
4333
 
4334
            value = (input_section->output_section->vma
4335
                     + input_section->output_offset
4336
                     + rel->r_offset);
4337
 
4338
            p_ldah = contents + rel->r_offset;
4339
            p_lda = p_ldah + rel->r_addend;
4340
 
4341
            r = elf64_alpha_do_reloc_gpdisp (input_bfd, gp - value,
4342
                                             p_ldah, p_lda);
4343
          }
4344
          break;
4345
 
4346
        case R_ALPHA_LITERAL:
4347
          BFD_ASSERT(sgot != NULL);
4348
          BFD_ASSERT(gp != 0);
4349
          BFD_ASSERT(gotent != NULL);
4350
          BFD_ASSERT(gotent->use_count >= 1);
4351
 
4352
          if (!gotent->reloc_done)
4353
            {
4354
              gotent->reloc_done = 1;
4355
 
4356
              bfd_put_64 (output_bfd, value,
4357
                          sgot->contents + gotent->got_offset);
4358
 
4359
              /* If the symbol has been forced local, output a
4360
                 RELATIVE reloc, otherwise it will be handled in
4361
                 finish_dynamic_symbol.  */
4362
              if (info->shared && !dynamic_symbol_p && !undef_weak_ref)
4363
                elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4364
                                         gotent->got_offset, 0,
4365
                                         R_ALPHA_RELATIVE, value);
4366
            }
4367
 
4368
          value = (sgot->output_section->vma
4369
                   + sgot->output_offset
4370
                   + gotent->got_offset);
4371
          value -= gp;
4372
          goto default_reloc;
4373
 
4374
        case R_ALPHA_GPREL32:
4375
        case R_ALPHA_GPREL16:
4376
        case R_ALPHA_GPRELLOW:
4377
          if (dynamic_symbol_p)
4378
            {
4379
              (*_bfd_error_handler)
4380
                (_("%B: gp-relative relocation against dynamic symbol %s"),
4381
                 input_bfd, h->root.root.root.string);
4382
              ret_val = FALSE;
4383
            }
4384
          BFD_ASSERT(gp != 0);
4385
          value -= gp;
4386
          goto default_reloc;
4387
 
4388
        case R_ALPHA_GPRELHIGH:
4389
          if (dynamic_symbol_p)
4390
            {
4391
              (*_bfd_error_handler)
4392
                (_("%B: gp-relative relocation against dynamic symbol %s"),
4393
                 input_bfd, h->root.root.root.string);
4394
              ret_val = FALSE;
4395
            }
4396
          BFD_ASSERT(gp != 0);
4397
          value -= gp;
4398
          value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4399
          goto default_reloc;
4400
 
4401
        case R_ALPHA_HINT:
4402
          /* A call to a dynamic symbol is definitely out of range of
4403
             the 16-bit displacement.  Don't bother writing anything.  */
4404
          if (dynamic_symbol_p)
4405
            {
4406
              r = bfd_reloc_ok;
4407
              break;
4408
            }
4409
          /* The regular PC-relative stuff measures from the start of
4410
             the instruction rather than the end.  */
4411
          value -= 4;
4412
          goto default_reloc;
4413
 
4414
        case R_ALPHA_BRADDR:
4415
          if (dynamic_symbol_p)
4416
            {
4417
              (*_bfd_error_handler)
4418
                (_("%B: pc-relative relocation against dynamic symbol %s"),
4419
                 input_bfd, h->root.root.root.string);
4420
              ret_val = FALSE;
4421
            }
4422
          /* The regular PC-relative stuff measures from the start of
4423
             the instruction rather than the end.  */
4424
          value -= 4;
4425
          goto default_reloc;
4426
 
4427
        case R_ALPHA_BRSGP:
4428
          {
4429
            int other;
4430
            const char *name;
4431
 
4432
            /* The regular PC-relative stuff measures from the start of
4433
               the instruction rather than the end.  */
4434
            value -= 4;
4435
 
4436
            /* The source and destination gp must be the same.  Note that
4437
               the source will always have an assigned gp, since we forced
4438
               one in check_relocs, but that the destination may not, as
4439
               it might not have had any relocations at all.  Also take
4440
               care not to crash if H is an undefined symbol.  */
4441
            if (h != NULL && sec != NULL
4442
                && alpha_elf_tdata (sec->owner)->gotobj
4443
                && gotobj != alpha_elf_tdata (sec->owner)->gotobj)
4444
              {
4445
                (*_bfd_error_handler)
4446
                  (_("%B: change in gp: BRSGP %s"),
4447
                   input_bfd, h->root.root.root.string);
4448
                ret_val = FALSE;
4449
              }
4450
 
4451
            /* The symbol should be marked either NOPV or STD_GPLOAD.  */
4452
            if (h != NULL)
4453
              other = h->root.other;
4454
            else
4455
              other = sym->st_other;
4456
            switch (other & STO_ALPHA_STD_GPLOAD)
4457
              {
4458
              case STO_ALPHA_NOPV:
4459
                break;
4460
              case STO_ALPHA_STD_GPLOAD:
4461
                value += 8;
4462
                break;
4463
              default:
4464
                if (h != NULL)
4465
                  name = h->root.root.root.string;
4466
                else
4467
                  {
4468
                    name = (bfd_elf_string_from_elf_section
4469
                            (input_bfd, symtab_hdr->sh_link, sym->st_name));
4470
                    if (name == NULL)
4471
                      name = _("<unknown>");
4472
                    else if (name[0] == 0)
4473
                      name = bfd_section_name (input_bfd, sec);
4474
                  }
4475
                (*_bfd_error_handler)
4476
                  (_("%B: !samegp reloc against symbol without .prologue: %s"),
4477
                   input_bfd, name);
4478
                ret_val = FALSE;
4479
                break;
4480
              }
4481
 
4482
            goto default_reloc;
4483
          }
4484
 
4485
        case R_ALPHA_REFLONG:
4486
        case R_ALPHA_REFQUAD:
4487
        case R_ALPHA_DTPREL64:
4488
        case R_ALPHA_TPREL64:
4489
          {
4490
            long dynindx, dyntype = r_type;
4491
            bfd_vma dynaddend;
4492
 
4493
            /* Careful here to remember RELATIVE relocations for global
4494
               variables for symbolic shared objects.  */
4495
 
4496
            if (dynamic_symbol_p)
4497
              {
4498
                BFD_ASSERT(h->root.dynindx != -1);
4499
                dynindx = h->root.dynindx;
4500
                dynaddend = addend;
4501
                addend = 0, value = 0;
4502
              }
4503
            else if (r_type == R_ALPHA_DTPREL64)
4504
              {
4505
                BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4506
                value -= dtp_base;
4507
                goto default_reloc;
4508
              }
4509
            else if (r_type == R_ALPHA_TPREL64)
4510
              {
4511
                BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4512
                if (!info->shared)
4513
                  {
4514
                    value -= tp_base;
4515
                    goto default_reloc;
4516
                  }
4517
                dynindx = 0;
4518
                dynaddend = value - dtp_base;
4519
              }
4520
            else if (info->shared
4521
                     && r_symndx != STN_UNDEF
4522
                     && (input_section->flags & SEC_ALLOC)
4523
                     && !undef_weak_ref)
4524
              {
4525
                if (r_type == R_ALPHA_REFLONG)
4526
                  {
4527
                    (*_bfd_error_handler)
4528
                      (_("%B: unhandled dynamic relocation against %s"),
4529
                       input_bfd,
4530
                       h->root.root.root.string);
4531
                    ret_val = FALSE;
4532
                  }
4533
                dynindx = 0;
4534
                dyntype = R_ALPHA_RELATIVE;
4535
                dynaddend = value;
4536
              }
4537
            else
4538
              goto default_reloc;
4539
 
4540
            if (input_section->flags & SEC_ALLOC)
4541
              elf64_alpha_emit_dynrel (output_bfd, info, input_section,
4542
                                       srel, rel->r_offset, dynindx,
4543
                                       dyntype, dynaddend);
4544
          }
4545
          goto default_reloc;
4546
 
4547
        case R_ALPHA_SREL16:
4548
        case R_ALPHA_SREL32:
4549
        case R_ALPHA_SREL64:
4550
          if (dynamic_symbol_p)
4551
            {
4552
              (*_bfd_error_handler)
4553
                (_("%B: pc-relative relocation against dynamic symbol %s"),
4554
                 input_bfd, h->root.root.root.string);
4555
              ret_val = FALSE;
4556
            }
4557
          else if ((info->shared || info->pie) && undef_weak_ref)
4558
            {
4559
              (*_bfd_error_handler)
4560
                (_("%B: pc-relative relocation against undefined weak symbol %s"),
4561
                 input_bfd, h->root.root.root.string);
4562
              ret_val = FALSE;
4563
            }
4564
 
4565
 
4566
          /* ??? .eh_frame references to discarded sections will be smashed
4567
             to relocations against SHN_UNDEF.  The .eh_frame format allows
4568
             NULL to be encoded as 0 in any format, so this works here.  */
4569
          if (r_symndx == STN_UNDEF)
4570
            howto = (elf64_alpha_howto_table
4571
                     + (r_type - R_ALPHA_SREL32 + R_ALPHA_REFLONG));
4572
          goto default_reloc;
4573
 
4574
        case R_ALPHA_TLSLDM:
4575
          /* Ignore the symbol for the relocation.  The result is always
4576
             the current module.  */
4577
          dynamic_symbol_p = 0;
4578
          /* FALLTHRU */
4579
 
4580
        case R_ALPHA_TLSGD:
4581
          if (!gotent->reloc_done)
4582
            {
4583
              gotent->reloc_done = 1;
4584
 
4585
              /* Note that the module index for the main program is 1.  */
4586
              bfd_put_64 (output_bfd, !info->shared && !dynamic_symbol_p,
4587
                          sgot->contents + gotent->got_offset);
4588
 
4589
              /* If the symbol has been forced local, output a
4590
                 DTPMOD64 reloc, otherwise it will be handled in
4591
                 finish_dynamic_symbol.  */
4592
              if (info->shared && !dynamic_symbol_p)
4593
                elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4594
                                         gotent->got_offset, 0,
4595
                                         R_ALPHA_DTPMOD64, 0);
4596
 
4597
              if (dynamic_symbol_p || r_type == R_ALPHA_TLSLDM)
4598
                value = 0;
4599
              else
4600
                {
4601
                  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4602
                  value -= dtp_base;
4603
                }
4604
              bfd_put_64 (output_bfd, value,
4605
                          sgot->contents + gotent->got_offset + 8);
4606
            }
4607
 
4608
          value = (sgot->output_section->vma
4609
                   + sgot->output_offset
4610
                   + gotent->got_offset);
4611
          value -= gp;
4612
          goto default_reloc;
4613
 
4614
        case R_ALPHA_DTPRELHI:
4615
        case R_ALPHA_DTPRELLO:
4616
        case R_ALPHA_DTPREL16:
4617
          if (dynamic_symbol_p)
4618
            {
4619
              (*_bfd_error_handler)
4620
                (_("%B: dtp-relative relocation against dynamic symbol %s"),
4621
                 input_bfd, h->root.root.root.string);
4622
              ret_val = FALSE;
4623
            }
4624
          BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4625
          value -= dtp_base;
4626
          if (r_type == R_ALPHA_DTPRELHI)
4627
            value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4628
          goto default_reloc;
4629
 
4630
        case R_ALPHA_TPRELHI:
4631
        case R_ALPHA_TPRELLO:
4632
        case R_ALPHA_TPREL16:
4633
          if (info->shared)
4634
            {
4635
              (*_bfd_error_handler)
4636
                (_("%B: TLS local exec code cannot be linked into shared objects"),
4637
                input_bfd);
4638
              ret_val = FALSE;
4639
            }
4640
          else if (dynamic_symbol_p)
4641
            {
4642
              (*_bfd_error_handler)
4643
                (_("%B: tp-relative relocation against dynamic symbol %s"),
4644
                 input_bfd, h->root.root.root.string);
4645
              ret_val = FALSE;
4646
            }
4647
          BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4648
          value -= tp_base;
4649
          if (r_type == R_ALPHA_TPRELHI)
4650
            value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
4651
          goto default_reloc;
4652
 
4653
        case R_ALPHA_GOTDTPREL:
4654
        case R_ALPHA_GOTTPREL:
4655
          BFD_ASSERT(sgot != NULL);
4656
          BFD_ASSERT(gp != 0);
4657
          BFD_ASSERT(gotent != NULL);
4658
          BFD_ASSERT(gotent->use_count >= 1);
4659
 
4660
          if (!gotent->reloc_done)
4661
            {
4662
              gotent->reloc_done = 1;
4663
 
4664
              if (dynamic_symbol_p)
4665
                value = 0;
4666
              else
4667
                {
4668
                  BFD_ASSERT (elf_hash_table (info)->tls_sec != NULL);
4669
                  if (r_type == R_ALPHA_GOTDTPREL)
4670
                    value -= dtp_base;
4671
                  else if (!info->shared)
4672
                    value -= tp_base;
4673
                  else
4674
                    {
4675
                      elf64_alpha_emit_dynrel (output_bfd, info, sgot, srelgot,
4676
                                               gotent->got_offset, 0,
4677
                                               R_ALPHA_TPREL64,
4678
                                               value - dtp_base);
4679
                      value = 0;
4680
                    }
4681
                }
4682
              bfd_put_64 (output_bfd, value,
4683
                          sgot->contents + gotent->got_offset);
4684
            }
4685
 
4686
          value = (sgot->output_section->vma
4687
                   + sgot->output_offset
4688
                   + gotent->got_offset);
4689
          value -= gp;
4690
          goto default_reloc;
4691
 
4692
        default:
4693
        default_reloc:
4694
          r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4695
                                        contents, rel->r_offset, value, 0);
4696
          break;
4697
        }
4698
 
4699
      switch (r)
4700
        {
4701
        case bfd_reloc_ok:
4702
          break;
4703
 
4704
        case bfd_reloc_overflow:
4705
          {
4706
            const char *name;
4707
 
4708
            /* Don't warn if the overflow is due to pc relative reloc
4709
               against discarded section.  Section optimization code should
4710
               handle it.  */
4711
 
4712
            if (r_symndx < symtab_hdr->sh_info
4713
                && sec != NULL && howto->pc_relative
4714
                && elf_discarded_section (sec))
4715
              break;
4716
 
4717
            if (h != NULL)
4718
              name = NULL;
4719
            else
4720
              {
4721
                name = (bfd_elf_string_from_elf_section
4722
                        (input_bfd, symtab_hdr->sh_link, sym->st_name));
4723
                if (name == NULL)
4724
                  return FALSE;
4725
                if (*name == '\0')
4726
                  name = bfd_section_name (input_bfd, sec);
4727
              }
4728
            if (! ((*info->callbacks->reloc_overflow)
4729
                   (info, (h ? &h->root.root : NULL), name, howto->name,
4730
                    (bfd_vma) 0, input_bfd, input_section,
4731
                    rel->r_offset)))
4732
              ret_val = FALSE;
4733
          }
4734
          break;
4735
 
4736
        default:
4737
        case bfd_reloc_outofrange:
4738
          abort ();
4739
        }
4740
    }
4741
 
4742
  return ret_val;
4743
}
4744
 
4745
/* Finish up dynamic symbol handling.  We set the contents of various
4746
   dynamic sections here.  */
4747
 
4748
static bfd_boolean
4749
elf64_alpha_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
4750
                                   struct elf_link_hash_entry *h,
4751
                                   Elf_Internal_Sym *sym)
4752
{
4753
  struct alpha_elf_link_hash_entry *ah = (struct alpha_elf_link_hash_entry *)h;
4754
  bfd *dynobj = elf_hash_table(info)->dynobj;
4755
 
4756
  if (h->needs_plt)
4757
    {
4758
      /* Fill in the .plt entry for this symbol.  */
4759
      asection *splt, *sgot, *srel;
4760
      Elf_Internal_Rela outrel;
4761
      bfd_byte *loc;
4762
      bfd_vma got_addr, plt_addr;
4763
      bfd_vma plt_index;
4764
      struct alpha_elf_got_entry *gotent;
4765
 
4766
      BFD_ASSERT (h->dynindx != -1);
4767
 
4768
      splt = bfd_get_section_by_name (dynobj, ".plt");
4769
      BFD_ASSERT (splt != NULL);
4770
      srel = bfd_get_section_by_name (dynobj, ".rela.plt");
4771
      BFD_ASSERT (srel != NULL);
4772
 
4773
      for (gotent = ah->got_entries; gotent ; gotent = gotent->next)
4774
        if (gotent->reloc_type == R_ALPHA_LITERAL
4775
            && gotent->use_count > 0)
4776
          {
4777
            unsigned int insn;
4778
            int disp;
4779
 
4780
            sgot = alpha_elf_tdata (gotent->gotobj)->got;
4781
            BFD_ASSERT (sgot != NULL);
4782
 
4783
            BFD_ASSERT (gotent->got_offset != -1);
4784
            BFD_ASSERT (gotent->plt_offset != -1);
4785
 
4786
            got_addr = (sgot->output_section->vma
4787
                        + sgot->output_offset
4788
                        + gotent->got_offset);
4789
            plt_addr = (splt->output_section->vma
4790
                        + splt->output_offset
4791
                        + gotent->plt_offset);
4792
 
4793
            plt_index = (gotent->plt_offset-PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
4794
 
4795
            /* Fill in the entry in the procedure linkage table.  */
4796
            if (elf64_alpha_use_secureplt)
4797
              {
4798
                disp = (PLT_HEADER_SIZE - 4) - (gotent->plt_offset + 4);
4799
                insn = INSN_AD (INSN_BR, 31, disp);
4800
                bfd_put_32 (output_bfd, insn,
4801
                            splt->contents + gotent->plt_offset);
4802
 
4803
                plt_index = ((gotent->plt_offset - NEW_PLT_HEADER_SIZE)
4804
                             / NEW_PLT_ENTRY_SIZE);
4805
              }
4806
            else
4807
              {
4808
                disp = -(gotent->plt_offset + 4);
4809
                insn = INSN_AD (INSN_BR, 28, disp);
4810
                bfd_put_32 (output_bfd, insn,
4811
                            splt->contents + gotent->plt_offset);
4812
                bfd_put_32 (output_bfd, INSN_UNOP,
4813
                            splt->contents + gotent->plt_offset + 4);
4814
                bfd_put_32 (output_bfd, INSN_UNOP,
4815
                            splt->contents + gotent->plt_offset + 8);
4816
 
4817
                plt_index = ((gotent->plt_offset - OLD_PLT_HEADER_SIZE)
4818
                             / OLD_PLT_ENTRY_SIZE);
4819
              }
4820
 
4821
            /* Fill in the entry in the .rela.plt section.  */
4822
            outrel.r_offset = got_addr;
4823
            outrel.r_info = ELF64_R_INFO(h->dynindx, R_ALPHA_JMP_SLOT);
4824
            outrel.r_addend = 0;
4825
 
4826
            loc = srel->contents + plt_index * sizeof (Elf64_External_Rela);
4827
            bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
4828
 
4829
            /* Fill in the entry in the .got.  */
4830
            bfd_put_64 (output_bfd, plt_addr,
4831
                        sgot->contents + gotent->got_offset);
4832
          }
4833
    }
4834
  else if (alpha_elf_dynamic_symbol_p (h, info))
4835
    {
4836
      /* Fill in the dynamic relocations for this symbol's .got entries.  */
4837
      asection *srel;
4838
      struct alpha_elf_got_entry *gotent;
4839
 
4840
      srel = bfd_get_section_by_name (dynobj, ".rela.got");
4841
      BFD_ASSERT (srel != NULL);
4842
 
4843
      for (gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
4844
           gotent != NULL;
4845
           gotent = gotent->next)
4846
        {
4847
          asection *sgot;
4848
          long r_type;
4849
 
4850
          if (gotent->use_count == 0)
4851
            continue;
4852
 
4853
          sgot = alpha_elf_tdata (gotent->gotobj)->got;
4854
 
4855
          r_type = gotent->reloc_type;
4856
          switch (r_type)
4857
            {
4858
            case R_ALPHA_LITERAL:
4859
              r_type = R_ALPHA_GLOB_DAT;
4860
              break;
4861
            case R_ALPHA_TLSGD:
4862
              r_type = R_ALPHA_DTPMOD64;
4863
              break;
4864
            case R_ALPHA_GOTDTPREL:
4865
              r_type = R_ALPHA_DTPREL64;
4866
              break;
4867
            case R_ALPHA_GOTTPREL:
4868
              r_type = R_ALPHA_TPREL64;
4869
              break;
4870
            case R_ALPHA_TLSLDM:
4871
            default:
4872
              abort ();
4873
            }
4874
 
4875
          elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4876
                                   gotent->got_offset, h->dynindx,
4877
                                   r_type, gotent->addend);
4878
 
4879
          if (gotent->reloc_type == R_ALPHA_TLSGD)
4880
            elf64_alpha_emit_dynrel (output_bfd, info, sgot, srel,
4881
                                     gotent->got_offset + 8, h->dynindx,
4882
                                     R_ALPHA_DTPREL64, gotent->addend);
4883
        }
4884
    }
4885
 
4886
  /* Mark some specially defined symbols as absolute.  */
4887
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
4888
      || h == elf_hash_table (info)->hgot
4889
      || h == elf_hash_table (info)->hplt)
4890
    sym->st_shndx = SHN_ABS;
4891
 
4892
  return TRUE;
4893
}
4894
 
4895
/* Finish up the dynamic sections.  */
4896
 
4897
static bfd_boolean
4898
elf64_alpha_finish_dynamic_sections (bfd *output_bfd,
4899
                                     struct bfd_link_info *info)
4900
{
4901
  bfd *dynobj;
4902
  asection *sdyn;
4903
 
4904
  dynobj = elf_hash_table (info)->dynobj;
4905
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4906
 
4907
  if (elf_hash_table (info)->dynamic_sections_created)
4908
    {
4909
      asection *splt, *sgotplt, *srelaplt;
4910
      Elf64_External_Dyn *dyncon, *dynconend;
4911
      bfd_vma plt_vma, gotplt_vma;
4912
 
4913
      splt = bfd_get_section_by_name (dynobj, ".plt");
4914
      srelaplt = bfd_get_section_by_name (output_bfd, ".rela.plt");
4915
      BFD_ASSERT (splt != NULL && sdyn != NULL);
4916
 
4917
      plt_vma = splt->output_section->vma + splt->output_offset;
4918
 
4919
      gotplt_vma = 0;
4920
      if (elf64_alpha_use_secureplt)
4921
        {
4922
          sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
4923
          BFD_ASSERT (sgotplt != NULL);
4924
          if (sgotplt->size > 0)
4925
            gotplt_vma = sgotplt->output_section->vma + sgotplt->output_offset;
4926
        }
4927
 
4928
      dyncon = (Elf64_External_Dyn *) sdyn->contents;
4929
      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
4930
      for (; dyncon < dynconend; dyncon++)
4931
        {
4932
          Elf_Internal_Dyn dyn;
4933
 
4934
          bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
4935
 
4936
          switch (dyn.d_tag)
4937
            {
4938
            case DT_PLTGOT:
4939
              dyn.d_un.d_ptr
4940
                = elf64_alpha_use_secureplt ? gotplt_vma : plt_vma;
4941
              break;
4942
            case DT_PLTRELSZ:
4943
              dyn.d_un.d_val = srelaplt ? srelaplt->size : 0;
4944
              break;
4945
            case DT_JMPREL:
4946
              dyn.d_un.d_ptr = srelaplt ? srelaplt->vma : 0;
4947
              break;
4948
 
4949
            case DT_RELASZ:
4950
              /* My interpretation of the TIS v1.1 ELF document indicates
4951
                 that RELASZ should not include JMPREL.  This is not what
4952
                 the rest of the BFD does.  It is, however, what the
4953
                 glibc ld.so wants.  Do this fixup here until we found
4954
                 out who is right.  */
4955
              if (srelaplt)
4956
                dyn.d_un.d_val -= srelaplt->size;
4957
              break;
4958
            }
4959
 
4960
          bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
4961
        }
4962
 
4963
      /* Initialize the plt header.  */
4964
      if (splt->size > 0)
4965
        {
4966
          unsigned int insn;
4967
          int ofs;
4968
 
4969
          if (elf64_alpha_use_secureplt)
4970
            {
4971
              ofs = gotplt_vma - (plt_vma + PLT_HEADER_SIZE);
4972
 
4973
              insn = INSN_ABC (INSN_SUBQ, 27, 28, 25);
4974
              bfd_put_32 (output_bfd, insn, splt->contents);
4975
 
4976
              insn = INSN_ABO (INSN_LDAH, 28, 28, (ofs + 0x8000) >> 16);
4977
              bfd_put_32 (output_bfd, insn, splt->contents + 4);
4978
 
4979
              insn = INSN_ABC (INSN_S4SUBQ, 25, 25, 25);
4980
              bfd_put_32 (output_bfd, insn, splt->contents + 8);
4981
 
4982
              insn = INSN_ABO (INSN_LDA, 28, 28, ofs);
4983
              bfd_put_32 (output_bfd, insn, splt->contents + 12);
4984
 
4985
              insn = INSN_ABO (INSN_LDQ, 27, 28, 0);
4986
              bfd_put_32 (output_bfd, insn, splt->contents + 16);
4987
 
4988
              insn = INSN_ABC (INSN_ADDQ, 25, 25, 25);
4989
              bfd_put_32 (output_bfd, insn, splt->contents + 20);
4990
 
4991
              insn = INSN_ABO (INSN_LDQ, 28, 28, 8);
4992
              bfd_put_32 (output_bfd, insn, splt->contents + 24);
4993
 
4994
              insn = INSN_AB (INSN_JMP, 31, 27);
4995
              bfd_put_32 (output_bfd, insn, splt->contents + 28);
4996
 
4997
              insn = INSN_AD (INSN_BR, 28, -PLT_HEADER_SIZE);
4998
              bfd_put_32 (output_bfd, insn, splt->contents + 32);
4999
            }
5000
          else
5001
            {
5002
              insn = INSN_AD (INSN_BR, 27, 0);   /* br $27, .+4 */
5003
              bfd_put_32 (output_bfd, insn, splt->contents);
5004
 
5005
              insn = INSN_ABO (INSN_LDQ, 27, 27, 12);
5006
              bfd_put_32 (output_bfd, insn, splt->contents + 4);
5007
 
5008
              insn = INSN_UNOP;
5009
              bfd_put_32 (output_bfd, insn, splt->contents + 8);
5010
 
5011
              insn = INSN_AB (INSN_JMP, 27, 27);
5012
              bfd_put_32 (output_bfd, insn, splt->contents + 12);
5013
 
5014
              /* The next two words will be filled in by ld.so.  */
5015
              bfd_put_64 (output_bfd, 0, splt->contents + 16);
5016
              bfd_put_64 (output_bfd, 0, splt->contents + 24);
5017
            }
5018
 
5019
          elf_section_data (splt->output_section)->this_hdr.sh_entsize = 0;
5020
        }
5021
    }
5022
 
5023
  return TRUE;
5024
}
5025
 
5026
/* We need to use a special link routine to handle the .mdebug section.
5027
   We need to merge all instances of these sections together, not write
5028
   them all out sequentially.  */
5029
 
5030
static bfd_boolean
5031
elf64_alpha_final_link (bfd *abfd, struct bfd_link_info *info)
5032
{
5033
  asection *o;
5034
  struct bfd_link_order *p;
5035
  asection *mdebug_sec;
5036
  struct ecoff_debug_info debug;
5037
  const struct ecoff_debug_swap *swap
5038
    = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
5039
  HDRR *symhdr = &debug.symbolic_header;
5040
  void * mdebug_handle = NULL;
5041
  struct alpha_elf_link_hash_table * htab;
5042
 
5043
  htab = alpha_elf_hash_table (info);
5044
  if (htab == NULL)
5045
    return FALSE;
5046
 
5047
  /* Go through the sections and collect the mdebug information.  */
5048
  mdebug_sec = NULL;
5049
  for (o = abfd->sections; o != (asection *) NULL; o = o->next)
5050
    {
5051
      if (strcmp (o->name, ".mdebug") == 0)
5052
        {
5053
          struct extsym_info einfo;
5054
 
5055
          /* We have found the .mdebug section in the output file.
5056
             Look through all the link_orders comprising it and merge
5057
             the information together.  */
5058
          symhdr->magic = swap->sym_magic;
5059
          /* FIXME: What should the version stamp be?  */
5060
          symhdr->vstamp = 0;
5061
          symhdr->ilineMax = 0;
5062
          symhdr->cbLine = 0;
5063
          symhdr->idnMax = 0;
5064
          symhdr->ipdMax = 0;
5065
          symhdr->isymMax = 0;
5066
          symhdr->ioptMax = 0;
5067
          symhdr->iauxMax = 0;
5068
          symhdr->issMax = 0;
5069
          symhdr->issExtMax = 0;
5070
          symhdr->ifdMax = 0;
5071
          symhdr->crfd = 0;
5072
          symhdr->iextMax = 0;
5073
 
5074
          /* We accumulate the debugging information itself in the
5075
             debug_info structure.  */
5076
          debug.line = NULL;
5077
          debug.external_dnr = NULL;
5078
          debug.external_pdr = NULL;
5079
          debug.external_sym = NULL;
5080
          debug.external_opt = NULL;
5081
          debug.external_aux = NULL;
5082
          debug.ss = NULL;
5083
          debug.ssext = debug.ssext_end = NULL;
5084
          debug.external_fdr = NULL;
5085
          debug.external_rfd = NULL;
5086
          debug.external_ext = debug.external_ext_end = NULL;
5087
 
5088
          mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
5089
          if (mdebug_handle == (PTR) NULL)
5090
            return FALSE;
5091
 
5092
          if (1)
5093
            {
5094
              asection *s;
5095
              EXTR esym;
5096
              bfd_vma last = 0;
5097
              unsigned int i;
5098
              static const char * const name[] =
5099
                {
5100
                  ".text", ".init", ".fini", ".data",
5101
                  ".rodata", ".sdata", ".sbss", ".bss"
5102
                };
5103
              static const int sc[] = { scText, scInit, scFini, scData,
5104
                                          scRData, scSData, scSBss, scBss };
5105
 
5106
              esym.jmptbl = 0;
5107
              esym.cobol_main = 0;
5108
              esym.weakext = 0;
5109
              esym.reserved = 0;
5110
              esym.ifd = ifdNil;
5111
              esym.asym.iss = issNil;
5112
              esym.asym.st = stLocal;
5113
              esym.asym.reserved = 0;
5114
              esym.asym.index = indexNil;
5115
              for (i = 0; i < 8; i++)
5116
                {
5117
                  esym.asym.sc = sc[i];
5118
                  s = bfd_get_section_by_name (abfd, name[i]);
5119
                  if (s != NULL)
5120
                    {
5121
                      esym.asym.value = s->vma;
5122
                      last = s->vma + s->size;
5123
                    }
5124
                  else
5125
                    esym.asym.value = last;
5126
 
5127
                  if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
5128
                                                      name[i], &esym))
5129
                    return FALSE;
5130
                }
5131
            }
5132
 
5133
          for (p = o->map_head.link_order;
5134
               p != (struct bfd_link_order *) NULL;
5135
               p = p->next)
5136
            {
5137
              asection *input_section;
5138
              bfd *input_bfd;
5139
              const struct ecoff_debug_swap *input_swap;
5140
              struct ecoff_debug_info input_debug;
5141
              char *eraw_src;
5142
              char *eraw_end;
5143
 
5144
              if (p->type != bfd_indirect_link_order)
5145
                {
5146
                  if (p->type == bfd_data_link_order)
5147
                    continue;
5148
                  abort ();
5149
                }
5150
 
5151
              input_section = p->u.indirect.section;
5152
              input_bfd = input_section->owner;
5153
 
5154
              if (! is_alpha_elf (input_bfd))
5155
                /* I don't know what a non ALPHA ELF bfd would be
5156
                   doing with a .mdebug section, but I don't really
5157
                   want to deal with it.  */
5158
                continue;
5159
 
5160
              input_swap = (get_elf_backend_data (input_bfd)
5161
                            ->elf_backend_ecoff_debug_swap);
5162
 
5163
              BFD_ASSERT (p->size == input_section->size);
5164
 
5165
              /* The ECOFF linking code expects that we have already
5166
                 read in the debugging information and set up an
5167
                 ecoff_debug_info structure, so we do that now.  */
5168
              if (!elf64_alpha_read_ecoff_info (input_bfd, input_section,
5169
                                                &input_debug))
5170
                return FALSE;
5171
 
5172
              if (! (bfd_ecoff_debug_accumulate
5173
                     (mdebug_handle, abfd, &debug, swap, input_bfd,
5174
                      &input_debug, input_swap, info)))
5175
                return FALSE;
5176
 
5177
              /* Loop through the external symbols.  For each one with
5178
                 interesting information, try to find the symbol in
5179
                 the linker global hash table and save the information
5180
                 for the output external symbols.  */
5181
              eraw_src = (char *) input_debug.external_ext;
5182
              eraw_end = (eraw_src
5183
                          + (input_debug.symbolic_header.iextMax
5184
                             * input_swap->external_ext_size));
5185
              for (;
5186
                   eraw_src < eraw_end;
5187
                   eraw_src += input_swap->external_ext_size)
5188
                {
5189
                  EXTR ext;
5190
                  const char *name;
5191
                  struct alpha_elf_link_hash_entry *h;
5192
 
5193
                  (*input_swap->swap_ext_in) (input_bfd, (PTR) eraw_src, &ext);
5194
                  if (ext.asym.sc == scNil
5195
                      || ext.asym.sc == scUndefined
5196
                      || ext.asym.sc == scSUndefined)
5197
                    continue;
5198
 
5199
                  name = input_debug.ssext + ext.asym.iss;
5200
                  h = alpha_elf_link_hash_lookup (htab, name, FALSE, FALSE, TRUE);
5201
                  if (h == NULL || h->esym.ifd != -2)
5202
                    continue;
5203
 
5204
                  if (ext.ifd != -1)
5205
                    {
5206
                      BFD_ASSERT (ext.ifd
5207
                                  < input_debug.symbolic_header.ifdMax);
5208
                      ext.ifd = input_debug.ifdmap[ext.ifd];
5209
                    }
5210
 
5211
                  h->esym = ext;
5212
                }
5213
 
5214
              /* Free up the information we just read.  */
5215
              free (input_debug.line);
5216
              free (input_debug.external_dnr);
5217
              free (input_debug.external_pdr);
5218
              free (input_debug.external_sym);
5219
              free (input_debug.external_opt);
5220
              free (input_debug.external_aux);
5221
              free (input_debug.ss);
5222
              free (input_debug.ssext);
5223
              free (input_debug.external_fdr);
5224
              free (input_debug.external_rfd);
5225
              free (input_debug.external_ext);
5226
 
5227
              /* Hack: reset the SEC_HAS_CONTENTS flag so that
5228
                 elf_link_input_bfd ignores this section.  */
5229
              input_section->flags &=~ SEC_HAS_CONTENTS;
5230
            }
5231
 
5232
          /* Build the external symbol information.  */
5233
          einfo.abfd = abfd;
5234
          einfo.info = info;
5235
          einfo.debug = &debug;
5236
          einfo.swap = swap;
5237
          einfo.failed = FALSE;
5238
          elf_link_hash_traverse (elf_hash_table (info),
5239
                                  elf64_alpha_output_extsym,
5240
                                  (PTR) &einfo);
5241
          if (einfo.failed)
5242
            return FALSE;
5243
 
5244
          /* Set the size of the .mdebug section.  */
5245
          o->size = bfd_ecoff_debug_size (abfd, &debug, swap);
5246
 
5247
          /* Skip this section later on (I don't think this currently
5248
             matters, but someday it might).  */
5249
          o->map_head.link_order = (struct bfd_link_order *) NULL;
5250
 
5251
          mdebug_sec = o;
5252
        }
5253
    }
5254
 
5255
  /* Invoke the regular ELF backend linker to do all the work.  */
5256
  if (! bfd_elf_final_link (abfd, info))
5257
    return FALSE;
5258
 
5259
  /* Now write out the computed sections.  */
5260
 
5261
  /* The .got subsections...  */
5262
  {
5263
    bfd *i, *dynobj = elf_hash_table(info)->dynobj;
5264
    for (i = htab->got_list;
5265
         i != NULL;
5266
         i = alpha_elf_tdata(i)->got_link_next)
5267
      {
5268
        asection *sgot;
5269
 
5270
        /* elf_bfd_final_link already did everything in dynobj.  */
5271
        if (i == dynobj)
5272
          continue;
5273
 
5274
        sgot = alpha_elf_tdata(i)->got;
5275
        if (! bfd_set_section_contents (abfd, sgot->output_section,
5276
                                        sgot->contents,
5277
                                        (file_ptr) sgot->output_offset,
5278
                                        sgot->size))
5279
          return FALSE;
5280
      }
5281
  }
5282
 
5283
  if (mdebug_sec != (asection *) NULL)
5284
    {
5285
      BFD_ASSERT (abfd->output_has_begun);
5286
      if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
5287
                                               swap, info,
5288
                                               mdebug_sec->filepos))
5289
        return FALSE;
5290
 
5291
      bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
5292
    }
5293
 
5294
  return TRUE;
5295
}
5296
 
5297
static enum elf_reloc_type_class
5298
elf64_alpha_reloc_type_class (const Elf_Internal_Rela *rela)
5299
{
5300
  switch ((int) ELF64_R_TYPE (rela->r_info))
5301
    {
5302
    case R_ALPHA_RELATIVE:
5303
      return reloc_class_relative;
5304
    case R_ALPHA_JMP_SLOT:
5305
      return reloc_class_plt;
5306
    case R_ALPHA_COPY:
5307
      return reloc_class_copy;
5308
    default:
5309
      return reloc_class_normal;
5310
    }
5311
}
5312
 
5313
static const struct bfd_elf_special_section elf64_alpha_special_sections[] =
5314
{
5315
  { STRING_COMMA_LEN (".sbss"),  -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5316
  { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_ALPHA_GPREL },
5317
  { NULL,                     0,  0, 0,            0 }
5318
};
5319
 
5320
/* ECOFF swapping routines.  These are used when dealing with the
5321
   .mdebug section, which is in the ECOFF debugging format.  Copied
5322
   from elf32-mips.c.  */
5323
static const struct ecoff_debug_swap
5324
elf64_alpha_ecoff_debug_swap =
5325
{
5326
  /* Symbol table magic number.  */
5327
  magicSym2,
5328
  /* Alignment of debugging information.  E.g., 4.  */
5329
  8,
5330
  /* Sizes of external symbolic information.  */
5331
  sizeof (struct hdr_ext),
5332
  sizeof (struct dnr_ext),
5333
  sizeof (struct pdr_ext),
5334
  sizeof (struct sym_ext),
5335
  sizeof (struct opt_ext),
5336
  sizeof (struct fdr_ext),
5337
  sizeof (struct rfd_ext),
5338
  sizeof (struct ext_ext),
5339
  /* Functions to swap in external symbolic data.  */
5340
  ecoff_swap_hdr_in,
5341
  ecoff_swap_dnr_in,
5342
  ecoff_swap_pdr_in,
5343
  ecoff_swap_sym_in,
5344
  ecoff_swap_opt_in,
5345
  ecoff_swap_fdr_in,
5346
  ecoff_swap_rfd_in,
5347
  ecoff_swap_ext_in,
5348
  _bfd_ecoff_swap_tir_in,
5349
  _bfd_ecoff_swap_rndx_in,
5350
  /* Functions to swap out external symbolic data.  */
5351
  ecoff_swap_hdr_out,
5352
  ecoff_swap_dnr_out,
5353
  ecoff_swap_pdr_out,
5354
  ecoff_swap_sym_out,
5355
  ecoff_swap_opt_out,
5356
  ecoff_swap_fdr_out,
5357
  ecoff_swap_rfd_out,
5358
  ecoff_swap_ext_out,
5359
  _bfd_ecoff_swap_tir_out,
5360
  _bfd_ecoff_swap_rndx_out,
5361
  /* Function to read in symbolic data.  */
5362
  elf64_alpha_read_ecoff_info
5363
};
5364
 
5365
/* Use a non-standard hash bucket size of 8.  */
5366
 
5367
static const struct elf_size_info alpha_elf_size_info =
5368
{
5369
  sizeof (Elf64_External_Ehdr),
5370
  sizeof (Elf64_External_Phdr),
5371
  sizeof (Elf64_External_Shdr),
5372
  sizeof (Elf64_External_Rel),
5373
  sizeof (Elf64_External_Rela),
5374
  sizeof (Elf64_External_Sym),
5375
  sizeof (Elf64_External_Dyn),
5376
  sizeof (Elf_External_Note),
5377
  8,
5378
  1,
5379
  64, 3,
5380
  ELFCLASS64, EV_CURRENT,
5381
  bfd_elf64_write_out_phdrs,
5382
  bfd_elf64_write_shdrs_and_ehdr,
5383
  bfd_elf64_checksum_contents,
5384
  bfd_elf64_write_relocs,
5385
  bfd_elf64_swap_symbol_in,
5386
  bfd_elf64_swap_symbol_out,
5387
  bfd_elf64_slurp_reloc_table,
5388
  bfd_elf64_slurp_symbol_table,
5389
  bfd_elf64_swap_dyn_in,
5390
  bfd_elf64_swap_dyn_out,
5391
  bfd_elf64_swap_reloc_in,
5392
  bfd_elf64_swap_reloc_out,
5393
  bfd_elf64_swap_reloca_in,
5394
  bfd_elf64_swap_reloca_out
5395
};
5396
 
5397
#define TARGET_LITTLE_SYM       bfd_elf64_alpha_vec
5398
#define TARGET_LITTLE_NAME      "elf64-alpha"
5399
#define ELF_ARCH                bfd_arch_alpha
5400
#define ELF_TARGET_ID           ALPHA_ELF_DATA
5401
#define ELF_MACHINE_CODE        EM_ALPHA
5402
#define ELF_MAXPAGESIZE 0x10000
5403
#define ELF_COMMONPAGESIZE      0x2000
5404
 
5405
#define bfd_elf64_bfd_link_hash_table_create \
5406
  elf64_alpha_bfd_link_hash_table_create
5407
 
5408
#define bfd_elf64_bfd_reloc_type_lookup \
5409
  elf64_alpha_bfd_reloc_type_lookup
5410
#define bfd_elf64_bfd_reloc_name_lookup \
5411
  elf64_alpha_bfd_reloc_name_lookup
5412
#define elf_info_to_howto \
5413
  elf64_alpha_info_to_howto
5414
 
5415
#define bfd_elf64_mkobject \
5416
  elf64_alpha_mkobject
5417
#define elf_backend_object_p \
5418
  elf64_alpha_object_p
5419
 
5420
#define elf_backend_section_from_shdr \
5421
  elf64_alpha_section_from_shdr
5422
#define elf_backend_section_flags \
5423
  elf64_alpha_section_flags
5424
#define elf_backend_fake_sections \
5425
  elf64_alpha_fake_sections
5426
 
5427
#define bfd_elf64_bfd_is_local_label_name \
5428
  elf64_alpha_is_local_label_name
5429
#define bfd_elf64_find_nearest_line \
5430
  elf64_alpha_find_nearest_line
5431
#define bfd_elf64_bfd_relax_section \
5432
  elf64_alpha_relax_section
5433
 
5434
#define elf_backend_add_symbol_hook \
5435
  elf64_alpha_add_symbol_hook
5436
#define elf_backend_relocs_compatible \
5437
  _bfd_elf_relocs_compatible
5438
#define elf_backend_check_relocs \
5439
  elf64_alpha_check_relocs
5440
#define elf_backend_create_dynamic_sections \
5441
  elf64_alpha_create_dynamic_sections
5442
#define elf_backend_adjust_dynamic_symbol \
5443
  elf64_alpha_adjust_dynamic_symbol
5444
#define elf_backend_merge_symbol_attribute \
5445
  elf64_alpha_merge_symbol_attribute
5446
#define elf_backend_always_size_sections \
5447
  elf64_alpha_always_size_sections
5448
#define elf_backend_size_dynamic_sections \
5449
  elf64_alpha_size_dynamic_sections
5450
#define elf_backend_omit_section_dynsym \
5451
  ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5452
#define elf_backend_relocate_section \
5453
  elf64_alpha_relocate_section
5454
#define elf_backend_finish_dynamic_symbol \
5455
  elf64_alpha_finish_dynamic_symbol
5456
#define elf_backend_finish_dynamic_sections \
5457
  elf64_alpha_finish_dynamic_sections
5458
#define bfd_elf64_bfd_final_link \
5459
  elf64_alpha_final_link
5460
#define elf_backend_reloc_type_class \
5461
  elf64_alpha_reloc_type_class
5462
 
5463
#define elf_backend_can_gc_sections     1
5464
#define elf_backend_gc_mark_hook        elf64_alpha_gc_mark_hook
5465
#define elf_backend_gc_sweep_hook       elf64_alpha_gc_sweep_hook
5466
 
5467
#define elf_backend_ecoff_debug_swap \
5468
  &elf64_alpha_ecoff_debug_swap
5469
 
5470
#define elf_backend_size_info \
5471
  alpha_elf_size_info
5472
 
5473
#define elf_backend_special_sections \
5474
  elf64_alpha_special_sections
5475
 
5476
/* A few constants that determine how the .plt section is set up.  */
5477
#define elf_backend_want_got_plt 0
5478
#define elf_backend_plt_readonly 0
5479
#define elf_backend_want_plt_sym 1
5480
#define elf_backend_got_header_size 0
5481
 
5482
#include "elf64-target.h"
5483
 
5484
/* FreeBSD support.  */
5485
 
5486
#undef TARGET_LITTLE_SYM
5487
#define TARGET_LITTLE_SYM       bfd_elf64_alpha_freebsd_vec
5488
#undef TARGET_LITTLE_NAME
5489
#define TARGET_LITTLE_NAME      "elf64-alpha-freebsd"
5490
#undef  ELF_OSABI
5491
#define ELF_OSABI               ELFOSABI_FREEBSD
5492
 
5493
/* The kernel recognizes executables as valid only if they carry a
5494
   "FreeBSD" label in the ELF header.  So we put this label on all
5495
   executables and (for simplicity) also all other object files.  */
5496
 
5497
static void
5498
elf64_alpha_fbsd_post_process_headers (bfd * abfd,
5499
        struct bfd_link_info * link_info ATTRIBUTE_UNUSED)
5500
{
5501
  Elf_Internal_Ehdr * i_ehdrp;  /* ELF file header, internal form.  */
5502
 
5503
  i_ehdrp = elf_elfheader (abfd);
5504
 
5505
  /* Put an ABI label supported by FreeBSD >= 4.1.  */
5506
  i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
5507
#ifdef OLD_FREEBSD_ABI_LABEL
5508
  /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard.  */
5509
  memcpy (&i_ehdrp->e_ident[EI_ABIVERSION], "FreeBSD", 8);
5510
#endif
5511
}
5512
 
5513
#undef elf_backend_post_process_headers
5514
#define elf_backend_post_process_headers \
5515
  elf64_alpha_fbsd_post_process_headers
5516
 
5517
#undef  elf64_bed
5518
#define elf64_bed elf64_alpha_fbsd_bed
5519
 
5520
#include "elf64-target.h"

powered by: WebSVN 2.1.0

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