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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [bfd/] [elf64-alpha.c] - Blame information for rev 104

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

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

powered by: WebSVN 2.1.0

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