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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [bfd/] [elf64-alpha.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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