Add 16-bit immediate tests.
[deliverable/binutils-gdb.git] / bfd / elf64-alpha.c
CommitLineData
252b5132
RH
1/* 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
5This file is part of BFD, the Binary File Descriptor library.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, 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
49static boolean elf64_alpha_mkobject PARAMS ((bfd *));
50static struct bfd_hash_entry * elf64_alpha_link_hash_newfunc
51 PARAMS((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
52static struct bfd_link_hash_table * elf64_alpha_bfd_link_hash_table_create
53 PARAMS((bfd *));
54
55static bfd_reloc_status_type elf64_alpha_reloc_nil
56 PARAMS((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
57static bfd_reloc_status_type elf64_alpha_reloc_bad
58 PARAMS((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
59static bfd_reloc_status_type elf64_alpha_do_reloc_gpdisp
60 PARAMS((bfd *, bfd_vma, bfd_byte *, bfd_byte *));
61static bfd_reloc_status_type elf64_alpha_reloc_gpdisp
62 PARAMS((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
63
64static reloc_howto_type * elf64_alpha_bfd_reloc_type_lookup
65 PARAMS((bfd *, bfd_reloc_code_real_type));
66static void elf64_alpha_info_to_howto
67 PARAMS((bfd *, arelent *, Elf64_Internal_Rela *));
68
69static boolean elf64_alpha_object_p
70 PARAMS((bfd *));
71static boolean elf64_alpha_section_from_shdr
72 PARAMS((bfd *, Elf64_Internal_Shdr *, char *));
73static boolean elf64_alpha_fake_sections
74 PARAMS((bfd *, Elf64_Internal_Shdr *, asection *));
75static boolean elf64_alpha_create_got_section
76 PARAMS((bfd *, struct bfd_link_info *));
77static boolean elf64_alpha_create_dynamic_sections
78 PARAMS((bfd *, struct bfd_link_info *));
79
80static boolean elf64_alpha_read_ecoff_info
81 PARAMS((bfd *, asection *, struct ecoff_debug_info *));
82static boolean elf64_alpha_is_local_label_name
83 PARAMS((bfd *, const char *));
84static 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)
89struct alpha_elf_link_hash_entry;
90#endif
91
92static boolean elf64_alpha_output_extsym
93 PARAMS((struct alpha_elf_link_hash_entry *, PTR));
94
95static boolean elf64_alpha_can_merge_gots
96 PARAMS((bfd *, bfd *));
97static void elf64_alpha_merge_gots
98 PARAMS((bfd *, bfd *));
99static boolean elf64_alpha_calc_got_offsets_for_symbol
100 PARAMS ((struct alpha_elf_link_hash_entry *, PTR));
101static void elf64_alpha_calc_got_offsets PARAMS ((struct bfd_link_info *));
102static boolean elf64_alpha_size_got_sections
103 PARAMS ((bfd *, struct bfd_link_info *));
104static boolean elf64_alpha_always_size_sections
105 PARAMS ((bfd *, struct bfd_link_info *));
106static boolean elf64_alpha_calc_dynrel_sizes
107 PARAMS ((struct alpha_elf_link_hash_entry *, struct bfd_link_info *));
108static boolean elf64_alpha_add_symbol_hook
109 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
110 const char **, flagword *, asection **, bfd_vma *));
111static boolean elf64_alpha_check_relocs
112 PARAMS((bfd *, struct bfd_link_info *, asection *sec,
113 const Elf_Internal_Rela *));
114static boolean elf64_alpha_adjust_dynamic_symbol
115 PARAMS((struct bfd_link_info *, struct elf_link_hash_entry *));
116static boolean elf64_alpha_size_dynamic_sections
117 PARAMS((bfd *, struct bfd_link_info *));
252b5132
RH
118static boolean elf64_alpha_relocate_section
119 PARAMS((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
120 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
121static boolean elf64_alpha_finish_dynamic_symbol
122 PARAMS((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
123 Elf_Internal_Sym *));
124static boolean elf64_alpha_finish_dynamic_sections
125 PARAMS((bfd *, struct bfd_link_info *));
126static boolean elf64_alpha_final_link
127 PARAMS((bfd *, struct bfd_link_info *));
cd6f9321
L
128static boolean elf64_alpha_merge_ind_symbols
129 PARAMS((struct alpha_elf_link_hash_entry *, PTR));
130static Elf_Internal_Rela * elf64_alpha_find_reloc_at_ofs
131 PARAMS ((Elf_Internal_Rela *, Elf_Internal_Rela *, bfd_vma, int));
252b5132
RH
132
133\f
134struct 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
191struct 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
238static struct bfd_hash_entry *
239elf64_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
277static struct bfd_link_hash_table *
278elf64_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\f
298/* We have some private fields hanging off of the elf_tdata structure. */
299
300struct 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
332static boolean
333elf64_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
342static boolean
343elf64_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\f
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
362static 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
833static bfd_reloc_status_type
834elf64_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
850static bfd_reloc_status_type
851elf64_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
867static bfd_reloc_status_type
868elf64_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
910static bfd_reloc_status_type
911elf64_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
958struct elf_reloc_map
959{
960 bfd_reloc_code_real_type bfd_reloc_val;
961 int elf_reloc_val;
962};
963
964static 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},
fe174262
MM
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},
252b5132
RH
990};
991
992/* Given a BFD reloc type, return a HOWTO structure. */
993
994static reloc_howto_type *
995elf64_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
1012static void
1013elf64_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\f
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
1047struct 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
1064static 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
1068static boolean elf64_alpha_relax_without_lituse
1069 PARAMS((struct alpha_relax_info *info, bfd_vma symval,
1070 Elf_Internal_Rela *irel));
1071
1072static bfd_vma elf64_alpha_relax_opt_call
1073 PARAMS((struct alpha_relax_info *info, bfd_vma symval));
1074
1075static boolean elf64_alpha_relax_section
1076 PARAMS((bfd *abfd, asection *sec, struct bfd_link_info *link_info,
1077 boolean *again));
1078
1079static Elf_Internal_Rela *
1080elf64_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
1094static Elf_Internal_Rela *
1095elf64_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
1287static bfd_vma
1288elf64_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
1359static boolean
1360elf64_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
1421static boolean
1422elf64_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\f
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\f
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
1681static boolean
1682elf64_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
1746static boolean
1747elf64_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
1802static boolean
1803elf64_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
1840static boolean
1841elf64_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
1866static boolean
1867elf64_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\f
1951/* Read ECOFF debugging information from a .mdebug section into a
1952 ecoff_debug_info structure. */
1953
1954static boolean
1955elf64_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
2044static boolean
2045elf64_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
2057struct mips_elf_find_line
2058{
2059 struct ecoff_debug_info d;
2060 struct ecoff_find_line i;
2061};
2062
2063static boolean
2064elf64_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\f
2159/* Structure used to pass information to alpha_elf_output_extsym. */
2160
2161struct 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
2170static boolean
2171elf64_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
2306static boolean
2307mips_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\f
2315/* Handle dynamic relocations when doing an Alpha ELF link. */
2316
2317static boolean
2318elf64_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)
2585 {
2586 /* If this is a shared library, we need a RELATIVE reloc. */
2587 sreloc->_raw_size += sizeof (Elf64_External_Rela);
2588 }
2589 break;
2590 }
2591 }
2592
2593 return true;
2594}
2595
2596/* Adjust a symbol defined by a dynamic object and referenced by a
2597 regular object. The current definition is in some section of the
2598 dynamic object, but we're not including those sections. We have to
2599 change the definition to something the rest of the link can
2600 understand. */
2601
2602static boolean
2603elf64_alpha_adjust_dynamic_symbol (info, h)
2604 struct bfd_link_info *info;
2605 struct elf_link_hash_entry *h;
2606{
2607 bfd *dynobj;
2608 asection *s;
2609 struct alpha_elf_link_hash_entry *ah;
2610
2611 dynobj = elf_hash_table(info)->dynobj;
2612 ah = (struct alpha_elf_link_hash_entry *)h;
2613
2614 /* Now that we've seen all of the input symbols, finalize our decision
2615 about whether this symbol should get a .plt entry. */
2616
2617 if (h->root.type != bfd_link_hash_undefweak
2618 && alpha_elf_dynamic_symbol_p (h, info)
2619 && ((h->type == STT_FUNC
2620 && !(ah->flags & ALPHA_ELF_LINK_HASH_LU_ADDR))
2621 || (h->type == STT_NOTYPE
2622 && ah->flags == ALPHA_ELF_LINK_HASH_LU_FUNC))
2623 /* Don't prevent otherwise valid programs from linking by attempting
2624 to create a new .got entry somewhere. A Correct Solution would be
2625 to add a new .got section to a new object file and let it be merged
2626 somewhere later. But for now don't bother. */
2627 && ah->got_entries)
2628 {
2629 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2630
2631 s = bfd_get_section_by_name(dynobj, ".plt");
2632 if (!s && !elf64_alpha_create_dynamic_sections (dynobj, info))
2633 return false;
2634
2635 /* The first bit of the .plt is reserved. */
2636 if (s->_raw_size == 0)
2637 s->_raw_size = PLT_HEADER_SIZE;
2638
2639 h->plt.offset = s->_raw_size;
2640 s->_raw_size += PLT_ENTRY_SIZE;
2641
2642 /* If this symbol is not defined in a regular file, and we are not
2643 generating a shared library, then set the symbol to the location
2644 in the .plt. This is required to make function pointers compare
2645 equal between the normal executable and the shared library. */
2646 if (! info->shared
2647 && h->root.type != bfd_link_hash_defweak)
2648 {
2649 h->root.u.def.section = s;
2650 h->root.u.def.value = h->plt.offset;
2651 }
2652
2653 /* We also need a JMP_SLOT entry in the .rela.plt section. */
2654 s = bfd_get_section_by_name (dynobj, ".rela.plt");
2655 BFD_ASSERT (s != NULL);
2656 s->_raw_size += sizeof (Elf64_External_Rela);
2657
2658 return true;
2659 }
2660 else
2661 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2662
2663 /* If this is a weak symbol, and there is a real definition, the
2664 processor independent code will have arranged for us to see the
2665 real definition first, and we can just use the same value. */
2666 if (h->weakdef != NULL)
2667 {
2668 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
2669 || h->weakdef->root.type == bfd_link_hash_defweak);
2670 h->root.u.def.section = h->weakdef->root.u.def.section;
2671 h->root.u.def.value = h->weakdef->root.u.def.value;
2672 return true;
2673 }
2674
2675 /* This is a reference to a symbol defined by a dynamic object which
2676 is not a function. The Alpha, since it uses .got entries for all
2677 symbols even in regular objects, does not need the hackery of a
2678 .dynbss section and COPY dynamic relocations. */
2679
2680 return true;
2681}
2682
2683/* Symbol versioning can create new symbols, and make our old symbols
2684 indirect to the new ones. Consolidate the got and reloc information
2685 in these situations. */
2686
2687static boolean
2688elf64_alpha_merge_ind_symbols (hi, dummy)
2689 struct alpha_elf_link_hash_entry *hi;
2690 PTR dummy;
2691{
2692 struct alpha_elf_link_hash_entry *hs;
2693
2694 if (hi->root.root.type != bfd_link_hash_indirect)
2695 return true;
2696 hs = hi;
2697 do {
2698 hs = (struct alpha_elf_link_hash_entry *)hs->root.root.u.i.link;
2699 } while (hs->root.root.type == bfd_link_hash_indirect);
2700
2701 /* Merge the flags. Whee. */
2702
2703 hs->flags |= hi->flags;
2704
2705 /* Merge the .got entries. Cannibalize the old symbol's list in
2706 doing so, since we don't need it anymore. */
2707
2708 if (hs->got_entries == NULL)
2709 hs->got_entries = hi->got_entries;
2710 else
2711 {
2712 struct alpha_elf_got_entry *gi, *gs, *gin, *gsh;
2713
2714 gsh = hs->got_entries;
2715 for (gi = hi->got_entries; gi ; gi = gin)
2716 {
2717 gin = gi->next;
2718 for (gs = gsh; gs ; gs = gs->next)
2719 if (gi->gotobj == gs->gotobj && gi->addend == gs->addend)
2720 goto got_found;
2721 gi->next = hs->got_entries;
2722 hs->got_entries = gi;
2723 got_found:;
2724 }
2725 }
2726 hi->got_entries = NULL;
2727
2728 /* And similar for the reloc entries. */
2729
2730 if (hs->reloc_entries == NULL)
2731 hs->reloc_entries = hi->reloc_entries;
2732 else
2733 {
2734 struct alpha_elf_reloc_entry *ri, *rs, *rin, *rsh;
2735
2736 rsh = hs->reloc_entries;
2737 for (ri = hi->reloc_entries; ri ; ri = rin)
2738 {
2739 rin = ri->next;
2740 for (rs = rsh; rs ; rs = rs->next)
2741 if (ri->rtype == rs->rtype)
2742 {
2743 rs->count += ri->count;
2744 goto found_reloc;
2745 }
2746 ri->next = hs->reloc_entries;
2747 hs->reloc_entries = ri;
2748 found_reloc:;
2749 }
2750 }
2751 hi->reloc_entries = NULL;
2752
2753 return true;
2754}
2755
2756/* Is it possible to merge two object file's .got tables? */
2757
2758static boolean
2759elf64_alpha_can_merge_gots (a, b)
2760 bfd *a, *b;
2761{
2762 int total = alpha_elf_tdata (a)->total_got_entries;
2763 bfd *bsub;
2764
2765 /* Trivial quick fallout test. */
2766 if (total + alpha_elf_tdata (b)->total_got_entries <= MAX_GOT_ENTRIES)
2767 return true;
2768
2769 /* By their nature, local .got entries cannot be merged. */
2770 if ((total += alpha_elf_tdata (b)->n_local_got_entries) > MAX_GOT_ENTRIES)
2771 return false;
2772
2773 /* Failing the common trivial comparison, we must effectively
2774 perform the merge. Not actually performing the merge means that
2775 we don't have to store undo information in case we fail. */
2776 for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2777 {
2778 struct alpha_elf_link_hash_entry **hashes = alpha_elf_sym_hashes (bsub);
2779 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2780 int i, n;
2781
2782 n = symtab_hdr->sh_size / symtab_hdr->sh_entsize - symtab_hdr->sh_info;
2783 for (i = 0; i < n; ++i)
2784 {
2785 struct alpha_elf_got_entry *ae, *be;
2786 struct alpha_elf_link_hash_entry *h;
2787
2788 h = hashes[i];
2789 while (h->root.root.type == bfd_link_hash_indirect
2790 || h->root.root.type == bfd_link_hash_warning)
2791 h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2792
2793 for (be = h->got_entries; be ; be = be->next)
2794 {
2795 if (be->use_count == 0)
2796 continue;
2797 if (be->gotobj != b)
2798 continue;
2799
2800 for (ae = h->got_entries; ae ; ae = ae->next)
2801 if (ae->gotobj == a && ae->addend == be->addend)
2802 goto global_found;
2803
2804 if (++total > MAX_GOT_ENTRIES)
2805 return false;
2806 global_found:;
2807 }
2808 }
2809 }
2810
2811 return true;
2812}
2813
2814/* Actually merge two .got tables. */
2815
2816static void
2817elf64_alpha_merge_gots (a, b)
2818 bfd *a, *b;
2819{
2820 int total = alpha_elf_tdata (a)->total_got_entries;
2821 bfd *bsub;
2822
2823 /* Remember local expansion. */
2824 {
2825 int e = alpha_elf_tdata (b)->n_local_got_entries;
2826 total += e;
2827 alpha_elf_tdata (a)->n_local_got_entries += e;
2828 }
2829
2830 for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2831 {
2832 struct alpha_elf_got_entry **local_got_entries;
2833 struct alpha_elf_link_hash_entry **hashes;
2834 Elf_Internal_Shdr *symtab_hdr;
2835 int i, n;
2836
2837 /* Let the local .got entries know they are part of a new subsegment. */
2838 local_got_entries = alpha_elf_tdata (bsub)->local_got_entries;
2839 if (local_got_entries)
2840 {
2841 n = elf_tdata (bsub)->symtab_hdr.sh_info;
2842 for (i = 0; i < n; ++i)
2843 {
2844 struct alpha_elf_got_entry *ent;
2845 for (ent = local_got_entries[i]; ent; ent = ent->next)
2846 ent->gotobj = a;
2847 }
2848 }
2849
2850 /* Merge the global .got entries. */
2851 hashes = alpha_elf_sym_hashes (bsub);
2852 symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2853
2854 n = symtab_hdr->sh_size / symtab_hdr->sh_entsize - symtab_hdr->sh_info;
2855 for (i = 0; i < n; ++i)
2856 {
2857 struct alpha_elf_got_entry *ae, *be, **pbe, **start;
2858 struct alpha_elf_link_hash_entry *h;
2859
2860 h = hashes[i];
2861 while (h->root.root.type == bfd_link_hash_indirect
2862 || h->root.root.type == bfd_link_hash_warning)
2863 h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2864
2865 start = &h->got_entries;
2866 for (pbe = start, be = *start; be ; pbe = &be->next, be = be->next)
2867 {
2868 if (be->use_count == 0)
2869 {
2870 *pbe = be->next;
2871 continue;
2872 }
2873 if (be->gotobj != b)
2874 continue;
2875
2876 for (ae = *start; ae ; ae = ae->next)
2877 if (ae->gotobj == a && ae->addend == be->addend)
2878 {
2879 ae->flags |= be->flags;
2880 ae->use_count += be->use_count;
2881 *pbe = be->next;
2882 goto global_found;
2883 }
2884 be->gotobj = a;
2885 total += 1;
2886
2887 global_found:;
2888 }
2889 }
2890
2891 alpha_elf_tdata (bsub)->gotobj = a;
2892 }
2893 alpha_elf_tdata (a)->total_got_entries = total;
2894
2895 /* Merge the two in_got chains. */
2896 {
2897 bfd *next;
2898
2899 bsub = a;
2900 while ((next = alpha_elf_tdata (bsub)->in_got_link_next) != NULL)
2901 bsub = next;
2902
2903 alpha_elf_tdata (bsub)->in_got_link_next = b;
2904 }
2905}
2906
2907/* Calculate the offsets for the got entries. */
2908
2909static boolean
2910elf64_alpha_calc_got_offsets_for_symbol (h, arg)
2911 struct alpha_elf_link_hash_entry *h;
2912 PTR arg;
2913{
2914 struct alpha_elf_got_entry *gotent;
2915
2916 for (gotent = h->got_entries; gotent; gotent = gotent->next)
2917 if (gotent->use_count > 0)
2918 {
2919 bfd_size_type *plge
2920 = &alpha_elf_tdata (gotent->gotobj)->got->_raw_size;
2921
2922 gotent->got_offset = *plge;
2923 *plge += 8;
2924 }
2925
2926 return true;
2927}
2928
2929static void
2930elf64_alpha_calc_got_offsets (info)
2931 struct bfd_link_info *info;
2932{
2933 bfd *i, *got_list = alpha_elf_hash_table(info)->got_list;
2934
2935 /* First, zero out the .got sizes, as we may be recalculating the
2936 .got after optimizing it. */
2937 for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2938 alpha_elf_tdata(i)->got->_raw_size = 0;
2939
2940 /* Next, fill in the offsets for all the global entries. */
2941 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info),
2942 elf64_alpha_calc_got_offsets_for_symbol,
2943 NULL);
2944
2945 /* Finally, fill in the offsets for the local entries. */
2946 for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2947 {
2948 bfd_size_type got_offset = alpha_elf_tdata(i)->got->_raw_size;
2949 bfd *j;
2950
2951 for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2952 {
2953 struct alpha_elf_got_entry **local_got_entries, *gotent;
2954 int k, n;
2955
2956 local_got_entries = alpha_elf_tdata(j)->local_got_entries;
2957 if (!local_got_entries)
2958 continue;
2959
2960 for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
2961 for (gotent = local_got_entries[k]; gotent; gotent = gotent->next)
2962 if (gotent->use_count > 0)
2963 {
2964 gotent->got_offset = got_offset;
2965 got_offset += 8;
2966 }
2967 }
2968
2969 alpha_elf_tdata(i)->got->_raw_size = got_offset;
2970 alpha_elf_tdata(i)->got->_cooked_size = got_offset;
2971 }
2972}
2973
2974/* Constructs the gots. */
2975
2976static boolean
2977elf64_alpha_size_got_sections (output_bfd, info)
2978 bfd *output_bfd;
2979 struct bfd_link_info *info;
2980{
2981 bfd *i, *got_list, *cur_got_obj;
2982 int something_changed = 0;
2983
2984 got_list = alpha_elf_hash_table (info)->got_list;
2985
2986 /* On the first time through, pretend we have an existing got list
2987 consisting of all of the input files. */
2988 if (got_list == NULL)
2989 {
2990 for (i = info->input_bfds; i ; i = i->link_next)
2991 {
2992 bfd *this_got = alpha_elf_tdata (i)->gotobj;
2993 if (this_got == NULL)
2994 continue;
2995
2996 /* We are assuming no merging has yet ocurred. */
2997 BFD_ASSERT (this_got == i);
2998
2999 if (alpha_elf_tdata (this_got)->total_got_entries > MAX_GOT_ENTRIES)
3000 {
3001 /* Yikes! A single object file has too many entries. */
3002 (*_bfd_error_handler)
3003 (_("%s: .got subsegment exceeds 64K (size %d)"),
3004 bfd_get_filename (i),
3005 alpha_elf_tdata (this_got)->total_got_entries * 8);
3006 return false;
3007 }
3008
3009 if (got_list == NULL)
3010 got_list = this_got;
3011 else
3012 alpha_elf_tdata(cur_got_obj)->got_link_next = this_got;
3013 cur_got_obj = this_got;
3014 }
3015
3016 /* Strange degenerate case of no got references. */
3017 if (got_list == NULL)
3018 return true;
3019
3020 alpha_elf_hash_table (info)->got_list = got_list;
3021
3022 /* Force got offsets to be recalculated. */
3023 something_changed = 1;
3024 }
3025
3026 cur_got_obj = got_list;
3027 i = alpha_elf_tdata(cur_got_obj)->got_link_next;
3028 while (i != NULL)
3029 {
3030 if (elf64_alpha_can_merge_gots (cur_got_obj, i))
3031 {
3032 elf64_alpha_merge_gots (cur_got_obj, i);
3033 i = alpha_elf_tdata(i)->got_link_next;
3034 alpha_elf_tdata(cur_got_obj)->got_link_next = i;
3035 something_changed = 1;
3036 }
3037 else
3038 {
3039 cur_got_obj = i;
3040 i = alpha_elf_tdata(i)->got_link_next;
3041 }
3042 }
3043
3044 /* Once the gots have been merged, fill in the got offsets for
3045 everything therein. */
3046 if (1 || something_changed)
3047 elf64_alpha_calc_got_offsets (info);
3048
3049 return true;
3050}
3051
3052static boolean
3053elf64_alpha_always_size_sections (output_bfd, info)
3054 bfd *output_bfd;
3055 struct bfd_link_info *info;
3056{
3057 bfd *i;
3058
3059 if (info->relocateable)
3060 return true;
3061
3062 /* First, take care of the indirect symbols created by versioning. */
3063 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info),
3064 elf64_alpha_merge_ind_symbols,
3065 NULL);
3066
3067 if (!elf64_alpha_size_got_sections (output_bfd, info))
3068 return false;
3069
3070 /* Allocate space for all of the .got subsections. */
3071 i = alpha_elf_hash_table (info)->got_list;
3072 for ( ; i ; i = alpha_elf_tdata(i)->got_link_next)
3073 {
3074 asection *s = alpha_elf_tdata(i)->got;
3075 if (s->_raw_size > 0)
3076 {
3077 s->contents = (bfd_byte *) bfd_zalloc (i, s->_raw_size);
3078 if (s->contents == NULL)
3079 return false;
3080 }
3081 }
3082
3083 return true;
3084}
3085
3086/* Work out the sizes of the dynamic relocation entries. */
3087
3088static boolean
3089elf64_alpha_calc_dynrel_sizes (h, info)
3090 struct alpha_elf_link_hash_entry *h;
3091 struct bfd_link_info *info;
3092{
3093 /* If the symbol was defined as a common symbol in a regular object
3094 file, and there was no definition in any dynamic object, then the
3095 linker will have allocated space for the symbol in a common
3096 section but the ELF_LINK_HASH_DEF_REGULAR flag will not have been
3097 set. This is done for dynamic symbols in
3098 elf_adjust_dynamic_symbol but this is not done for non-dynamic
3099 symbols, somehow. */
3100 if (((h->root.elf_link_hash_flags
3101 & (ELF_LINK_HASH_DEF_REGULAR
3102 | ELF_LINK_HASH_REF_REGULAR
3103 | ELF_LINK_HASH_DEF_DYNAMIC))
3104 == ELF_LINK_HASH_REF_REGULAR)
3105 && (h->root.root.type == bfd_link_hash_defined
3106 || h->root.root.type == bfd_link_hash_defweak)
3107 && !(h->root.root.u.def.section->owner->flags & DYNAMIC))
3108 {
3109 h->root.elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
3110 }
3111
3112 /* If the symbol is dynamic, we'll need all the relocations in their
3113 natural form. If this is a shared object, and it has been forced
3114 local, we'll need the same number of RELATIVE relocations. */
3115
3116 if (alpha_elf_dynamic_symbol_p (&h->root, info) || info->shared)
3117 {
3118 struct alpha_elf_reloc_entry *relent;
3119 bfd *dynobj;
3120 struct alpha_elf_got_entry *gotent;
3121 bfd_size_type count;
3122 asection *srel;
3123
3124 for (relent = h->reloc_entries; relent; relent = relent->next)
3125 if (relent->rtype == R_ALPHA_REFLONG
3126 || relent->rtype == R_ALPHA_REFQUAD)
3127 {
3128 relent->srel->_raw_size +=
3129 sizeof(Elf64_External_Rela) * relent->count;
3130 }
3131
3132 dynobj = elf_hash_table(info)->dynobj;
3133 count = 0;
3134
3135 for (gotent = h->got_entries; gotent ; gotent = gotent->next)
3136 count++;
3137
3138 /* If we are using a .plt entry, subtract one, as the first
3139 reference uses a .rela.plt entry instead. */
3140 if (h->root.plt.offset != MINUS_ONE)
3141 count--;
3142
3143 if (count > 0)
3144 {
3145 srel = bfd_get_section_by_name (dynobj, ".rela.got");
3146 BFD_ASSERT (srel != NULL);
3147 srel->_raw_size += sizeof (Elf64_External_Rela) * count;
3148 }
3149 }
3150
3151 return true;
3152}
3153
3154/* Set the sizes of the dynamic sections. */
3155
3156static boolean
3157elf64_alpha_size_dynamic_sections (output_bfd, info)
3158 bfd *output_bfd;
3159 struct bfd_link_info *info;
3160{
3161 bfd *dynobj;
3162 asection *s;
3163 boolean reltext;
3164 boolean relplt;
3165
3166 dynobj = elf_hash_table(info)->dynobj;
3167 BFD_ASSERT(dynobj != NULL);
3168
3169 if (elf_hash_table (info)->dynamic_sections_created)
3170 {
3171 /* Set the contents of the .interp section to the interpreter. */
3172 if (!info->shared)
3173 {
3174 s = bfd_get_section_by_name (dynobj, ".interp");
3175 BFD_ASSERT (s != NULL);
3176 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
3177 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3178 }
3179
3180 /* Now that we've seen all of the input files, we can decide which
3181 symbols need dynamic relocation entries and which don't. We've
3182 collected information in check_relocs that we can now apply to
3183 size the dynamic relocation sections. */
3184 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info),
3185 elf64_alpha_calc_dynrel_sizes,
3186 info);
3187
3188 /* When building shared libraries, each local .got entry needs a
3189 RELATIVE reloc. */
3190 if (info->shared)
3191 {
3192 bfd *i;
3193 asection *srel;
3194 bfd_size_type count;
3195
3196 srel = bfd_get_section_by_name (dynobj, ".rela.got");
3197 BFD_ASSERT (srel != NULL);
3198
3199 for (i = alpha_elf_hash_table(info)->got_list, count = 0;
3200 i != NULL;
3201 i = alpha_elf_tdata(i)->got_link_next)
3202 count += alpha_elf_tdata(i)->n_local_got_entries;
3203
3204 srel->_raw_size += count * sizeof(Elf64_External_Rela);
3205 }
3206 }
3207 /* else we're not dynamic and by definition we don't need such things. */
3208
3209 /* The check_relocs and adjust_dynamic_symbol entry points have
3210 determined the sizes of the various dynamic sections. Allocate
3211 memory for them. */
3212 reltext = false;
3213 relplt = false;
3214 for (s = dynobj->sections; s != NULL; s = s->next)
3215 {
3216 const char *name;
3217 boolean strip;
3218
3219 if (!(s->flags & SEC_LINKER_CREATED))
3220 continue;
3221
3222 /* It's OK to base decisions on the section name, because none
3223 of the dynobj section names depend upon the input files. */
3224 name = bfd_get_section_name (dynobj, s);
3225
3226 /* If we don't need this section, strip it from the output file.
3227 This is to handle .rela.bss and .rela.plt. We must create it
3228 in create_dynamic_sections, because it must be created before
3229 the linker maps input sections to output sections. The
3230 linker does that before adjust_dynamic_symbol is called, and
3231 it is that function which decides whether anything needs to
3232 go into these sections. */
3233
3234 strip = false;
3235
3236 if (strncmp (name, ".rela", 5) == 0)
3237 {
3238 strip = (s->_raw_size == 0);
3239
3240 if (!strip)
3241 {
3242 const char *outname;
3243 asection *target;
3244
3245 /* If this relocation section applies to a read only
3246 section, then we probably need a DT_TEXTREL entry. */
3247 outname = bfd_get_section_name (output_bfd,
3248 s->output_section);
3249 target = bfd_get_section_by_name (output_bfd, outname + 5);
3250 if (target != NULL
3251 && (target->flags & SEC_READONLY) != 0
3252 && (target->flags & SEC_ALLOC) != 0)
3253 reltext = true;
3254
3255 if (strcmp(name, ".rela.plt") == 0)
3256 relplt = true;
3257
3258 /* We use the reloc_count field as a counter if we need
3259 to copy relocs into the output file. */
3260 s->reloc_count = 0;
3261 }
3262 }
3263 else if (strcmp (name, ".plt") != 0)
3264 {
3265 /* It's not one of our dynamic sections, so don't allocate space. */
3266 continue;
3267 }
3268
3269 if (strip)
7f8d5fc9 3270 _bfd_strip_section_from_output (info, s);
252b5132
RH
3271 else
3272 {
3273 /* Allocate memory for the section contents. */
3274 s->contents = (bfd_byte *) bfd_zalloc(dynobj, s->_raw_size);
3275 if (s->contents == NULL && s->_raw_size != 0)
3276 return false;
3277 }
3278 }
3279
252b5132
RH
3280 if (elf_hash_table (info)->dynamic_sections_created)
3281 {
3282 /* Add some entries to the .dynamic section. We fill in the
3283 values later, in elf64_alpha_finish_dynamic_sections, but we
3284 must add the entries now so that we get the correct size for
3285 the .dynamic section. The DT_DEBUG entry is filled in by the
3286 dynamic linker and used by the debugger. */
3287 if (!info->shared)
3288 {
3289 if (!bfd_elf64_add_dynamic_entry (info, DT_DEBUG, 0))
3290 return false;
3291 }
3292
3293 if (! bfd_elf64_add_dynamic_entry (info, DT_PLTGOT, 0))
3294 return false;
3295
3296 if (relplt)
3297 {
3298 if (! bfd_elf64_add_dynamic_entry (info, DT_PLTRELSZ, 0)
3299 || ! bfd_elf64_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
3300 || ! bfd_elf64_add_dynamic_entry (info, DT_JMPREL, 0))
3301 return false;
3302 }
3303
3304 if (! bfd_elf64_add_dynamic_entry (info, DT_RELA, 0)
3305 || ! bfd_elf64_add_dynamic_entry (info, DT_RELASZ, 0)
3306 || ! bfd_elf64_add_dynamic_entry (info, DT_RELAENT,
3307 sizeof(Elf64_External_Rela)))
3308 return false;
3309
3310 if (reltext)
3311 {
3312 if (! bfd_elf64_add_dynamic_entry (info, DT_TEXTREL, 0))
3313 return false;
3314 }
3315 }
3316
3317 return true;
3318}
3319
252b5132
RH
3320/* Relocate an Alpha ELF section. */
3321
3322static boolean
3323elf64_alpha_relocate_section (output_bfd, info, input_bfd, input_section,
3324 contents, relocs, local_syms, local_sections)
3325 bfd *output_bfd;
3326 struct bfd_link_info *info;
3327 bfd *input_bfd;
3328 asection *input_section;
3329 bfd_byte *contents;
3330 Elf_Internal_Rela *relocs;
3331 Elf_Internal_Sym *local_syms;
3332 asection **local_sections;
3333{
3334 Elf_Internal_Shdr *symtab_hdr;
3335 Elf_Internal_Rela *rel;
3336 Elf_Internal_Rela *relend;
3337 asection *sec, *sgot, *srel, *srelgot;
3338 bfd *dynobj, *gotobj;
3339 bfd_vma gp;
3340
3341 srelgot = srel = NULL;
3342 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3343 dynobj = elf_hash_table (info)->dynobj;
3344 if (dynobj)
3345 {
3346 srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
3347 }
3348
3349 /* Find the gp value for this input bfd. */
3350 sgot = NULL;
3351 gp = 0;
3352 gotobj = alpha_elf_tdata (input_bfd)->gotobj;
3353 if (gotobj)
3354 {
3355 sgot = alpha_elf_tdata (gotobj)->got;
3356 gp = _bfd_get_gp_value (gotobj);
3357 if (gp == 0)
3358 {
3359 gp = (sgot->output_section->vma
3360 + sgot->output_offset
3361 + 0x8000);
3362 _bfd_set_gp_value (gotobj, gp);
3363 }
3364 }
3365
3366 rel = relocs;
3367 relend = relocs + input_section->reloc_count;
3368 for (; rel < relend; rel++)
3369 {
3370 int r_type;
3371 reloc_howto_type *howto;
3372 unsigned long r_symndx;
3373 struct alpha_elf_link_hash_entry *h;
3374 Elf_Internal_Sym *sym;
3375 bfd_vma relocation;
3376 bfd_vma addend;
3377 bfd_reloc_status_type r;
3378
3379 r_type = ELF64_R_TYPE(rel->r_info);
3380 if (r_type < 0 || r_type >= (int) R_ALPHA_max)
3381 {
3382 bfd_set_error (bfd_error_bad_value);
3383 return false;
3384 }
3385 howto = elf64_alpha_howto_table + r_type;
3386
3387 r_symndx = ELF64_R_SYM(rel->r_info);
3388
3389 if (info->relocateable)
3390 {
3391 /* This is a relocateable link. We don't have to change
3392 anything, unless the reloc is against a section symbol,
3393 in which case we have to adjust according to where the
3394 section symbol winds up in the output section. */
72b60c23
RH
3395
3396 /* The symbol associated with GPDISP and LITUSE is
3397 immaterial. Only the addend is significant. */
3398 if (r_type == R_ALPHA_GPDISP || r_type == R_ALPHA_LITUSE)
3399 continue;
3400
252b5132
RH
3401 if (r_symndx < symtab_hdr->sh_info)
3402 {
3403 sym = local_syms + r_symndx;
3404 if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
3405 {
3406 sec = local_sections[r_symndx];
3407 rel->r_addend += sec->output_offset + sym->st_value;
3408 }
3409 }
3410
3411 continue;
3412 }
3413
3414 /* This is a final link. */
3415
3416 h = NULL;
3417 sym = NULL;
3418 sec = NULL;
3419
3420 if (r_symndx < symtab_hdr->sh_info)
3421 {
3422 sym = local_syms + r_symndx;
3423 sec = local_sections[r_symndx];
3424 relocation = (sec->output_section->vma
3425 + sec->output_offset
3426 + sym->st_value);
3427 }
3428 else
3429 {
3430 h = alpha_elf_sym_hashes (input_bfd)[r_symndx - symtab_hdr->sh_info];
3431
3432 while (h->root.root.type == bfd_link_hash_indirect
3433 || h->root.root.type == bfd_link_hash_warning)
3434 h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
3435
3436 if (h->root.root.type == bfd_link_hash_defined
3437 || h->root.root.type == bfd_link_hash_defweak)
3438 {
3439 sec = h->root.root.u.def.section;
3440
3441#if rth_notdef
3442 if ((r_type == R_ALPHA_LITERAL
3443 && elf_hash_table(info)->dynamic_sections_created
3444 && (!info->shared
3445 || !info->symbolic
3446 || !(h->root.elf_link_hash_flags
3447 & ELF_LINK_HASH_DEF_REGULAR)))
3448 || (info->shared
3449 && (!info->symbolic
3450 || !(h->root.elf_link_hash_flags
3451 & ELF_LINK_HASH_DEF_REGULAR))
3452 && (input_section->flags & SEC_ALLOC)
3453 && (r_type == R_ALPHA_REFLONG
3454 || r_type == R_ALPHA_REFQUAD
3455 || r_type == R_ALPHA_LITERAL)))
3456 {
3457 /* In these cases, we don't need the relocation value.
3458 We check specially because in some obscure cases
3459 sec->output_section will be NULL. */
3460 relocation = 0;
3461 }
3462#else
3463 /* FIXME: Are not these obscure cases simply bugs? Let's
3464 get something working and come back to this. */
3465 if (sec->output_section == NULL)
3466 relocation = 0;
3467#endif /* rth_notdef */
3468 else
3469 {
3470 relocation = (h->root.root.u.def.value
3471 + sec->output_section->vma
3472 + sec->output_offset);
3473 }
3474 }
3475 else if (h->root.root.type == bfd_link_hash_undefweak)
3476 relocation = 0;
3477 else if (info->shared && !info->symbolic && !info->no_undefined)
3478 relocation = 0;
3479 else
3480 {
3481 if (!((*info->callbacks->undefined_symbol)
3482 (info, h->root.root.root.string, input_bfd,
5cc7c785
L
3483 input_section, rel->r_offset,
3484 (!info->shared || info->no_undefined))))
252b5132
RH
3485 return false;
3486 relocation = 0;
3487 }
3488 }
3489 addend = rel->r_addend;
3490
3491 switch (r_type)
3492 {
3493 case R_ALPHA_GPDISP:
3494 {
3495 bfd_byte *p_ldah, *p_lda;
3496
3497 BFD_ASSERT(gp != 0);
3498
3499 relocation = (input_section->output_section->vma
3500 + input_section->output_offset
3501 + rel->r_offset);
3502
3503 p_ldah = contents + rel->r_offset - input_section->vma;
3504 p_lda = p_ldah + rel->r_addend;
3505
3506 r = elf64_alpha_do_reloc_gpdisp (input_bfd, gp - relocation,
3507 p_ldah, p_lda);
3508 }
3509 break;
3510
3511 case R_ALPHA_OP_PUSH:
3512 case R_ALPHA_OP_STORE:
3513 case R_ALPHA_OP_PSUB:
3514 case R_ALPHA_OP_PRSHIFT:
3515 /* We hate these silly beasts. */
3516 abort();
3517
3518 case R_ALPHA_LITERAL:
3519 {
3520 struct alpha_elf_got_entry *gotent;
3521 boolean dynamic_symbol;
3522
3523 BFD_ASSERT(sgot != NULL);
3524 BFD_ASSERT(gp != 0);
3525
3526 if (h != NULL)
3527 {
3528 gotent = h->got_entries;
3529 dynamic_symbol = alpha_elf_dynamic_symbol_p (&h->root, info);
3530 }
3531 else
3532 {
3533 gotent = (alpha_elf_tdata(input_bfd)->
3534 local_got_entries[r_symndx]);
3535 dynamic_symbol = false;
3536 }
3537
3538 BFD_ASSERT(gotent != NULL);
3539
3540 while (gotent->gotobj != gotobj || gotent->addend != addend)
3541 gotent = gotent->next;
3542
3543 BFD_ASSERT(gotent->use_count >= 1);
3544
3545 /* Initialize the .got entry's value. */
3546 if (!(gotent->flags & ALPHA_ELF_GOT_ENTRY_RELOCS_DONE))
3547 {
3548 bfd_put_64 (output_bfd, relocation+addend,
3549 sgot->contents + gotent->got_offset);
3550
3551 /* If the symbol has been forced local, output a
3552 RELATIVE reloc, otherwise it will be handled in
3553 finish_dynamic_symbol. */
3554 if (info->shared && !dynamic_symbol)
3555 {
3556 Elf_Internal_Rela outrel;
3557
3558 BFD_ASSERT(srelgot != NULL);
3559
3560 outrel.r_offset = (sgot->output_section->vma
3561 + sgot->output_offset
3562 + gotent->got_offset);
3563 outrel.r_info = ELF64_R_INFO(0, R_ALPHA_RELATIVE);
3564 outrel.r_addend = 0;
3565
3566 bfd_elf64_swap_reloca_out (output_bfd, &outrel,
3567 ((Elf64_External_Rela *)
3568 srelgot->contents)
3569 + srelgot->reloc_count++);
3570 BFD_ASSERT (sizeof(Elf64_External_Rela)
3571 * srelgot->reloc_count
3572 <= srelgot->_cooked_size);
3573 }
3574
3575 gotent->flags |= ALPHA_ELF_GOT_ENTRY_RELOCS_DONE;
3576 }
3577
3578 /* Figure the gprel relocation. */
3579 addend = 0;
3580 relocation = (sgot->output_section->vma
3581 + sgot->output_offset
3582 + gotent->got_offset);
3583 relocation -= gp;
3584 }
3585 /* overflow handled by _bfd_final_link_relocate */
3586 goto default_reloc;
3587
3588 case R_ALPHA_GPREL32:
3589 case R_ALPHA_GPRELLOW:
3590 BFD_ASSERT(gp != 0);
3591 relocation -= gp;
3592 goto default_reloc;
3593
3594 case R_ALPHA_GPRELHIGH:
3595 BFD_ASSERT(gp != 0);
3596 relocation -= gp;
3597 relocation += addend;
3598 addend = 0;
3599 relocation = (((bfd_signed_vma) relocation >> 16)
3600 + ((relocation >> 15) & 1));
3601 goto default_reloc;
3602
3603 case R_ALPHA_BRADDR:
3604 case R_ALPHA_HINT:
3605 /* The regular PC-relative stuff measures from the start of
3606 the instruction rather than the end. */
3607 addend -= 4;
3608 goto default_reloc;
3609
3610 case R_ALPHA_REFLONG:
3611 case R_ALPHA_REFQUAD:
3612 {
3613 Elf_Internal_Rela outrel;
3614 boolean skip;
3615
3616 /* Careful here to remember RELATIVE relocations for global
3617 variables for symbolic shared objects. */
3618
3619 if (h && alpha_elf_dynamic_symbol_p (&h->root, info))
3620 {
3621 BFD_ASSERT(h->root.dynindx != -1);
3622 outrel.r_info = ELF64_R_INFO(h->root.dynindx, r_type);
3623 outrel.r_addend = addend;
3624 addend = 0, relocation = 0;
3625 }
3626 else if (info->shared)
3627 {
3628 outrel.r_info = ELF64_R_INFO(0, R_ALPHA_RELATIVE);
3629 outrel.r_addend = 0;
3630 }
3631 else
3632 goto default_reloc;
3633
3634 if (!srel)
3635 {
3636 const char *name;
3637
3638 name = (bfd_elf_string_from_elf_section
3639 (input_bfd, elf_elfheader(input_bfd)->e_shstrndx,
3640 elf_section_data(input_section)->rel_hdr.sh_name));
3641 BFD_ASSERT(name != NULL);
3642
3643 srel = bfd_get_section_by_name (dynobj, name);
3644 BFD_ASSERT(srel != NULL);
3645 }
3646
3647 skip = false;
3648
3649 if (elf_section_data (input_section)->stab_info == NULL)
3650 outrel.r_offset = rel->r_offset;
3651 else
3652 {
3653 bfd_vma off;
3654
3655 off = (_bfd_stab_section_offset
3656 (output_bfd, &elf_hash_table (info)->stab_info,
3657 input_section,
3658 &elf_section_data (input_section)->stab_info,
3659 rel->r_offset));
3660 if (off == (bfd_vma) -1)
3661 skip = true;
3662 outrel.r_offset = off;
3663 }
3664
3665 if (! skip)
3666 outrel.r_offset += (input_section->output_section->vma
3667 + input_section->output_offset);
3668 else
3669 memset (&outrel, 0, sizeof outrel);
3670
3671 bfd_elf64_swap_reloca_out (output_bfd, &outrel,
3672 ((Elf64_External_Rela *)
3673 srel->contents)
3674 + srel->reloc_count++);
3675 BFD_ASSERT (sizeof(Elf64_External_Rela) * srel->reloc_count
3676 <= srel->_cooked_size);
3677 }
3678 goto default_reloc;
3679
3680 default:
3681 default_reloc:
3682 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3683 contents, rel->r_offset, relocation,
3684 addend);
3685 break;
3686 }
3687
3688 switch (r)
3689 {
3690 case bfd_reloc_ok:
3691 break;
3692
3693 case bfd_reloc_overflow:
3694 {
3695 const char *name;
3696
3697 if (h != NULL)
3698 name = h->root.root.root.string;
3699 else
3700 {
3701 name = (bfd_elf_string_from_elf_section
3702 (input_bfd, symtab_hdr->sh_link, sym->st_name));
3703 if (name == NULL)
3704 return false;
3705 if (*name == '\0')
3706 name = bfd_section_name (input_bfd, sec);
3707 }
3708 if (! ((*info->callbacks->reloc_overflow)
3709 (info, name, howto->name, (bfd_vma) 0,
3710 input_bfd, input_section, rel->r_offset)))
3711 return false;
3712 }
3713 break;
3714
3715 default:
3716 case bfd_reloc_outofrange:
3717 abort ();
3718 }
3719 }
3720
3721 return true;
3722}
3723
3724/* Finish up dynamic symbol handling. We set the contents of various
3725 dynamic sections here. */
3726
3727static boolean
3728elf64_alpha_finish_dynamic_symbol (output_bfd, info, h, sym)
3729 bfd *output_bfd;
3730 struct bfd_link_info *info;
3731 struct elf_link_hash_entry *h;
3732 Elf_Internal_Sym *sym;
3733{
3734 bfd *dynobj = elf_hash_table(info)->dynobj;
3735
3736 if (h->plt.offset != MINUS_ONE)
3737 {
3738 /* Fill in the .plt entry for this symbol. */
3739 asection *splt, *sgot, *srel;
3740 Elf_Internal_Rela outrel;
3741 bfd_vma got_addr, plt_addr;
3742 bfd_vma plt_index;
3743 struct alpha_elf_got_entry *gotent;
3744
3745 BFD_ASSERT (h->dynindx != -1);
3746
3747 /* The first .got entry will be updated by the .plt with the
3748 address of the target function. */
3749 gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
3750 BFD_ASSERT (gotent && gotent->addend == 0);
3751
3752 splt = bfd_get_section_by_name (dynobj, ".plt");
3753 BFD_ASSERT (splt != NULL);
3754 srel = bfd_get_section_by_name (dynobj, ".rela.plt");
3755 BFD_ASSERT (srel != NULL);
3756 sgot = alpha_elf_tdata (gotent->gotobj)->got;
3757 BFD_ASSERT (sgot != NULL);
3758
3759 got_addr = (sgot->output_section->vma
3760 + sgot->output_offset
3761 + gotent->got_offset);
3762 plt_addr = (splt->output_section->vma
3763 + splt->output_offset
3764 + h->plt.offset);
3765
3766 plt_index = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
3767
3768 /* Fill in the entry in the procedure linkage table. */
3769 {
3770 unsigned insn1, insn2, insn3;
3771
3772 insn1 = PLT_ENTRY_WORD1 | ((-(h->plt.offset + 4) >> 2) & 0x1fffff);
3773 insn2 = PLT_ENTRY_WORD2;
3774 insn3 = PLT_ENTRY_WORD3;
3775
3776 bfd_put_32 (output_bfd, insn1, splt->contents + h->plt.offset);
3777 bfd_put_32 (output_bfd, insn2, splt->contents + h->plt.offset + 4);
3778 bfd_put_32 (output_bfd, insn3, splt->contents + h->plt.offset + 8);
3779 }
3780
3781 /* Fill in the entry in the .rela.plt section. */
3782 outrel.r_offset = got_addr;
3783 outrel.r_info = ELF64_R_INFO(h->dynindx, R_ALPHA_JMP_SLOT);
3784 outrel.r_addend = 0;
3785
3786 bfd_elf64_swap_reloca_out (output_bfd, &outrel,
3787 ((Elf64_External_Rela *)srel->contents
3788 + plt_index));
3789
3790 if (!(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
3791 {
3792 /* Mark the symbol as undefined, rather than as defined in the
3793 .plt section. Leave the value alone. */
3794 sym->st_shndx = SHN_UNDEF;
3795 }
3796
3797 /* Fill in the entries in the .got. */
3798 bfd_put_64 (output_bfd, plt_addr, sgot->contents + gotent->got_offset);
3799
3800 /* Subsequent .got entries will continue to bounce through the .plt. */
3801 if (gotent->next)
3802 {
3803 srel = bfd_get_section_by_name (dynobj, ".rela.got");
3804 BFD_ASSERT (! info->shared || srel != NULL);
3805
3806 gotent = gotent->next;
3807 do
3808 {
3809 sgot = alpha_elf_tdata(gotent->gotobj)->got;
3810 BFD_ASSERT(sgot != NULL);
3811 BFD_ASSERT(gotent->addend == 0);
3812
3813 bfd_put_64 (output_bfd, plt_addr,
3814 sgot->contents + gotent->got_offset);
3815
3816 if (info->shared)
3817 {
3818 outrel.r_offset = (sgot->output_section->vma
3819 + sgot->output_offset
3820 + gotent->got_offset);
3821 outrel.r_info = ELF64_R_INFO(0, R_ALPHA_RELATIVE);
3822 outrel.r_addend = 0;
3823
3824 bfd_elf64_swap_reloca_out (output_bfd, &outrel,
3825 ((Elf64_External_Rela *)
3826 srel->contents)
3827 + srel->reloc_count++);
3828 BFD_ASSERT (sizeof(Elf64_External_Rela) * srel->reloc_count
3829 <= srel->_cooked_size);
3830 }
3831
3832 gotent = gotent->next;
3833 }
3834 while (gotent != NULL);
3835 }
3836 }
3837 else if (alpha_elf_dynamic_symbol_p (h, info))
3838 {
3839 /* Fill in the dynamic relocations for this symbol's .got entries. */
3840 asection *srel;
3841 Elf_Internal_Rela outrel;
3842 struct alpha_elf_got_entry *gotent;
3843
3844 srel = bfd_get_section_by_name (dynobj, ".rela.got");
3845 BFD_ASSERT (srel != NULL);
3846
3847 outrel.r_info = ELF64_R_INFO (h->dynindx, R_ALPHA_GLOB_DAT);
3848 for (gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
3849 gotent != NULL;
3850 gotent = gotent->next)
3851 {
3852 asection *sgot = alpha_elf_tdata (gotent->gotobj)->got;
3853 outrel.r_offset = (sgot->output_section->vma
3854 + sgot->output_offset
3855 + gotent->got_offset);
3856 outrel.r_addend = gotent->addend;
3857
3858 bfd_elf64_swap_reloca_out (output_bfd, &outrel,
3859 ((Elf64_External_Rela *)srel->contents
3860 + srel->reloc_count++));
3861 BFD_ASSERT (sizeof(Elf64_External_Rela) * srel->reloc_count
3862 <= srel->_cooked_size);
3863 }
3864 }
3865
3866 /* Mark some specially defined symbols as absolute. */
3867 if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3868 || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
3869 || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
3870 sym->st_shndx = SHN_ABS;
3871
3872 return true;
3873}
3874
3875/* Finish up the dynamic sections. */
3876
3877static boolean
3878elf64_alpha_finish_dynamic_sections (output_bfd, info)
3879 bfd *output_bfd;
3880 struct bfd_link_info *info;
3881{
3882 bfd *dynobj;
3883 asection *sdyn;
3884
3885 dynobj = elf_hash_table (info)->dynobj;
3886 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3887
3888 if (elf_hash_table (info)->dynamic_sections_created)
3889 {
3890 asection *splt;
3891 Elf64_External_Dyn *dyncon, *dynconend;
3892
3893 splt = bfd_get_section_by_name (dynobj, ".plt");
3894 BFD_ASSERT (splt != NULL && sdyn != NULL);
3895
3896 dyncon = (Elf64_External_Dyn *) sdyn->contents;
3897 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
3898 for (; dyncon < dynconend; dyncon++)
3899 {
3900 Elf_Internal_Dyn dyn;
3901 const char *name;
3902 asection *s;
3903
3904 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3905
3906 switch (dyn.d_tag)
3907 {
3908 case DT_PLTGOT:
3909 name = ".plt";
3910 goto get_vma;
3911 case DT_PLTRELSZ:
3912 name = ".rela.plt";
3913 goto get_size;
3914 case DT_JMPREL:
3915 name = ".rela.plt";
3916 goto get_vma;
3917
3918 case DT_RELASZ:
3919 /* My interpretation of the TIS v1.1 ELF document indicates
3920 that RELASZ should not include JMPREL. This is not what
3921 the rest of the BFD does. It is, however, what the
3922 glibc ld.so wants. Do this fixup here until we found
3923 out who is right. */
3924 s = bfd_get_section_by_name (output_bfd, ".rela.plt");
3925 if (s)
3926 {
3927 dyn.d_un.d_val -=
3928 (s->_cooked_size ? s->_cooked_size : s->_raw_size);
3929 }
3930 break;
3931
3932 get_vma:
3933 s = bfd_get_section_by_name (output_bfd, name);
3934 dyn.d_un.d_ptr = (s ? s->vma : 0);
3935 break;
3936
3937 get_size:
3938 s = bfd_get_section_by_name (output_bfd, name);
3939 dyn.d_un.d_val =
3940 (s->_cooked_size ? s->_cooked_size : s->_raw_size);
3941 break;
3942 }
3943
3944 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3945 }
3946
3947 /* Initialize the PLT0 entry */
3948 if (splt->_raw_size > 0)
3949 {
3950 bfd_put_32 (output_bfd, PLT_HEADER_WORD1, splt->contents);
3951 bfd_put_32 (output_bfd, PLT_HEADER_WORD2, splt->contents + 4);
3952 bfd_put_32 (output_bfd, PLT_HEADER_WORD3, splt->contents + 8);
3953 bfd_put_32 (output_bfd, PLT_HEADER_WORD4, splt->contents + 12);
3954
3955 /* The next two words will be filled in by ld.so */
3956 bfd_put_64 (output_bfd, 0, splt->contents + 16);
3957 bfd_put_64 (output_bfd, 0, splt->contents + 24);
3958
3959 elf_section_data (splt->output_section)->this_hdr.sh_entsize =
3960 PLT_HEADER_SIZE;
3961 }
3962 }
3963
252b5132
RH
3964 return true;
3965}
3966
3967/* We need to use a special link routine to handle the .reginfo and
3968 the .mdebug sections. We need to merge all instances of these
3969 sections together, not write them all out sequentially. */
3970
3971static boolean
3972elf64_alpha_final_link (abfd, info)
3973 bfd *abfd;
3974 struct bfd_link_info *info;
3975{
3976 asection *o;
3977 struct bfd_link_order *p;
3978 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
3979 struct ecoff_debug_info debug;
3980 const struct ecoff_debug_swap *swap
3981 = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
3982 HDRR *symhdr = &debug.symbolic_header;
3983 PTR mdebug_handle = NULL;
3984
3985#if 0
3986 if (++ngots == 2)
3987 {
3988 (*info->callbacks->warning)
3989 (info, _("using multiple gp values"), (char *) NULL,
3990 output_bfd, (asection *) NULL, (bfd_vma) 0);
3991 }
3992#endif
3993
3994 /* Go through the sections and collect the .reginfo and .mdebug
3995 information. */
3996 reginfo_sec = NULL;
3997 mdebug_sec = NULL;
3998 gptab_data_sec = NULL;
3999 gptab_bss_sec = NULL;
4000 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4001 {
4002#ifdef ERIC_neverdef
4003 if (strcmp (o->name, ".reginfo") == 0)
4004 {
4005 memset (&reginfo, 0, sizeof reginfo);
4006
4007 /* We have found the .reginfo section in the output file.
4008 Look through all the link_orders comprising it and merge
4009 the information together. */
4010 for (p = o->link_order_head;
4011 p != (struct bfd_link_order *) NULL;
4012 p = p->next)
4013 {
4014 asection *input_section;
4015 bfd *input_bfd;
4016 Elf64_External_RegInfo ext;
4017 Elf64_RegInfo sub;
4018
4019 if (p->type != bfd_indirect_link_order)
4020 {
4021 if (p->type == bfd_fill_link_order)
4022 continue;
4023 abort ();
4024 }
4025
4026 input_section = p->u.indirect.section;
4027 input_bfd = input_section->owner;
4028
4029 /* The linker emulation code has probably clobbered the
4030 size to be zero bytes. */
4031 if (input_section->_raw_size == 0)
4032 input_section->_raw_size = sizeof (Elf64_External_RegInfo);
4033
4034 if (! bfd_get_section_contents (input_bfd, input_section,
4035 (PTR) &ext,
4036 (file_ptr) 0,
4037 sizeof ext))
4038 return false;
4039
4040 bfd_alpha_elf64_swap_reginfo_in (input_bfd, &ext, &sub);
4041
4042 reginfo.ri_gprmask |= sub.ri_gprmask;
4043 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
4044 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
4045 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
4046 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
4047
4048 /* ri_gp_value is set by the function
4049 alpha_elf_section_processing when the section is
4050 finally written out. */
4051
4052 /* Hack: reset the SEC_HAS_CONTENTS flag so that
4053 elf_link_input_bfd ignores this section. */
4054 input_section->flags &=~ SEC_HAS_CONTENTS;
4055 }
4056
4057 /* Force the section size to the value we want. */
4058 o->_raw_size = sizeof (Elf64_External_RegInfo);
4059
4060 /* Skip this section later on (I don't think this currently
4061 matters, but someday it might). */
4062 o->link_order_head = (struct bfd_link_order *) NULL;
4063
4064 reginfo_sec = o;
4065 }
4066#endif
4067
4068 if (strcmp (o->name, ".mdebug") == 0)
4069 {
4070 struct extsym_info einfo;
4071
4072 /* We have found the .mdebug section in the output file.
4073 Look through all the link_orders comprising it and merge
4074 the information together. */
4075 symhdr->magic = swap->sym_magic;
4076 /* FIXME: What should the version stamp be? */
4077 symhdr->vstamp = 0;
4078 symhdr->ilineMax = 0;
4079 symhdr->cbLine = 0;
4080 symhdr->idnMax = 0;
4081 symhdr->ipdMax = 0;
4082 symhdr->isymMax = 0;
4083 symhdr->ioptMax = 0;
4084 symhdr->iauxMax = 0;
4085 symhdr->issMax = 0;
4086 symhdr->issExtMax = 0;
4087 symhdr->ifdMax = 0;
4088 symhdr->crfd = 0;
4089 symhdr->iextMax = 0;
4090
4091 /* We accumulate the debugging information itself in the
4092 debug_info structure. */
4093 debug.line = NULL;
4094 debug.external_dnr = NULL;
4095 debug.external_pdr = NULL;
4096 debug.external_sym = NULL;
4097 debug.external_opt = NULL;
4098 debug.external_aux = NULL;
4099 debug.ss = NULL;
4100 debug.ssext = debug.ssext_end = NULL;
4101 debug.external_fdr = NULL;
4102 debug.external_rfd = NULL;
4103 debug.external_ext = debug.external_ext_end = NULL;
4104
4105 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
4106 if (mdebug_handle == (PTR) NULL)
4107 return false;
4108
4109 if (1)
4110 {
4111 asection *s;
4112 EXTR esym;
4113 bfd_vma last;
4114 unsigned int i;
4115 static const char * const name[] =
4116 {
4117 ".text", ".init", ".fini", ".data",
4118 ".rodata", ".sdata", ".sbss", ".bss"
4119 };
4120 static const int sc[] = { scText, scInit, scFini, scData,
4121 scRData, scSData, scSBss, scBss };
4122
4123 esym.jmptbl = 0;
4124 esym.cobol_main = 0;
4125 esym.weakext = 0;
4126 esym.reserved = 0;
4127 esym.ifd = ifdNil;
4128 esym.asym.iss = issNil;
4129 esym.asym.st = stLocal;
4130 esym.asym.reserved = 0;
4131 esym.asym.index = indexNil;
4132 for (i = 0; i < 8; i++)
4133 {
4134 esym.asym.sc = sc[i];
4135 s = bfd_get_section_by_name (abfd, name[i]);
4136 if (s != NULL)
4137 {
4138 esym.asym.value = s->vma;
4139 last = s->vma + s->_raw_size;
4140 }
4141 else
4142 esym.asym.value = last;
4143
4144 if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
4145 name[i], &esym))
4146 return false;
4147 }
4148 }
4149
4150 for (p = o->link_order_head;
4151 p != (struct bfd_link_order *) NULL;
4152 p = p->next)
4153 {
4154 asection *input_section;
4155 bfd *input_bfd;
4156 const struct ecoff_debug_swap *input_swap;
4157 struct ecoff_debug_info input_debug;
4158 char *eraw_src;
4159 char *eraw_end;
4160
4161 if (p->type != bfd_indirect_link_order)
4162 {
4163 if (p->type == bfd_fill_link_order)
4164 continue;
4165 abort ();
4166 }
4167
4168 input_section = p->u.indirect.section;
4169 input_bfd = input_section->owner;
4170
4171 if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
4172 || (get_elf_backend_data (input_bfd)
4173 ->elf_backend_ecoff_debug_swap) == NULL)
4174 {
4175 /* I don't know what a non ALPHA ELF bfd would be
4176 doing with a .mdebug section, but I don't really
4177 want to deal with it. */
4178 continue;
4179 }
4180
4181 input_swap = (get_elf_backend_data (input_bfd)
4182 ->elf_backend_ecoff_debug_swap);
4183
4184 BFD_ASSERT (p->size == input_section->_raw_size);
4185
4186 /* The ECOFF linking code expects that we have already
4187 read in the debugging information and set up an
4188 ecoff_debug_info structure, so we do that now. */
4189 if (!elf64_alpha_read_ecoff_info (input_bfd, input_section,
4190 &input_debug))
4191 return false;
4192
4193 if (! (bfd_ecoff_debug_accumulate
4194 (mdebug_handle, abfd, &debug, swap, input_bfd,
4195 &input_debug, input_swap, info)))
4196 return false;
4197
4198 /* Loop through the external symbols. For each one with
4199 interesting information, try to find the symbol in
4200 the linker global hash table and save the information
4201 for the output external symbols. */
4202 eraw_src = input_debug.external_ext;
4203 eraw_end = (eraw_src
4204 + (input_debug.symbolic_header.iextMax
4205 * input_swap->external_ext_size));
4206 for (;
4207 eraw_src < eraw_end;
4208 eraw_src += input_swap->external_ext_size)
4209 {
4210 EXTR ext;
4211 const char *name;
4212 struct alpha_elf_link_hash_entry *h;
4213
4214 (*input_swap->swap_ext_in) (input_bfd, (PTR) eraw_src, &ext);
4215 if (ext.asym.sc == scNil
4216 || ext.asym.sc == scUndefined
4217 || ext.asym.sc == scSUndefined)
4218 continue;
4219
4220 name = input_debug.ssext + ext.asym.iss;
4221 h = alpha_elf_link_hash_lookup (alpha_elf_hash_table (info),
4222 name, false, false, true);
4223 if (h == NULL || h->esym.ifd != -2)
4224 continue;
4225
4226 if (ext.ifd != -1)
4227 {
4228 BFD_ASSERT (ext.ifd
4229 < input_debug.symbolic_header.ifdMax);
4230 ext.ifd = input_debug.ifdmap[ext.ifd];
4231 }
4232
4233 h->esym = ext;
4234 }
4235
4236 /* Free up the information we just read. */
4237 free (input_debug.line);
4238 free (input_debug.external_dnr);
4239 free (input_debug.external_pdr);
4240 free (input_debug.external_sym);
4241 free (input_debug.external_opt);
4242 free (input_debug.external_aux);
4243 free (input_debug.ss);
4244 free (input_debug.ssext);
4245 free (input_debug.external_fdr);
4246 free (input_debug.external_rfd);
4247 free (input_debug.external_ext);
4248
4249 /* Hack: reset the SEC_HAS_CONTENTS flag so that
4250 elf_link_input_bfd ignores this section. */
4251 input_section->flags &=~ SEC_HAS_CONTENTS;
4252 }
4253
4254#ifdef ERIC_neverdef
4255 if (info->shared)
4256 {
4257 /* Create .rtproc section. */
4258 rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
4259 if (rtproc_sec == NULL)
4260 {
4261 flagword flags = (SEC_HAS_CONTENTS
4262 | SEC_IN_MEMORY
4263 | SEC_LINKER_CREATED
4264 | SEC_READONLY);
4265
4266 rtproc_sec = bfd_make_section (abfd, ".rtproc");
4267 if (rtproc_sec == NULL
4268 || ! bfd_set_section_flags (abfd, rtproc_sec, flags)
4269 || ! bfd_set_section_alignment (abfd, rtproc_sec, 12))
4270 return false;
4271 }
4272
4273 if (! alpha_elf_create_procedure_table (mdebug_handle, abfd,
4274 info, rtproc_sec, &debug))
4275 return false;
4276 }
4277#endif
4278
4279
4280 /* Build the external symbol information. */
4281 einfo.abfd = abfd;
4282 einfo.info = info;
4283 einfo.debug = &debug;
4284 einfo.swap = swap;
4285 einfo.failed = false;
4286 elf_link_hash_traverse (elf_hash_table (info),
4287 elf64_alpha_output_extsym,
4288 (PTR) &einfo);
4289 if (einfo.failed)
4290 return false;
4291
4292 /* Set the size of the .mdebug section. */
4293 o->_raw_size = bfd_ecoff_debug_size (abfd, &debug, swap);
4294
4295 /* Skip this section later on (I don't think this currently
4296 matters, but someday it might). */
4297 o->link_order_head = (struct bfd_link_order *) NULL;
4298
4299 mdebug_sec = o;
4300 }
4301
4302#ifdef ERIC_neverdef
4303 if (strncmp (o->name, ".gptab.", sizeof ".gptab." - 1) == 0)
4304 {
4305 const char *subname;
4306 unsigned int c;
4307 Elf64_gptab *tab;
4308 Elf64_External_gptab *ext_tab;
4309 unsigned int i;
4310
4311 /* The .gptab.sdata and .gptab.sbss sections hold
4312 information describing how the small data area would
4313 change depending upon the -G switch. These sections
4314 not used in executables files. */
4315 if (! info->relocateable)
4316 {
4317 asection **secpp;
4318
4319 for (p = o->link_order_head;
4320 p != (struct bfd_link_order *) NULL;
4321 p = p->next)
4322 {
4323 asection *input_section;
4324
4325 if (p->type != bfd_indirect_link_order)
4326 {
4327 if (p->type == bfd_fill_link_order)
4328 continue;
4329 abort ();
4330 }
4331
4332 input_section = p->u.indirect.section;
4333
4334 /* Hack: reset the SEC_HAS_CONTENTS flag so that
4335 elf_link_input_bfd ignores this section. */
4336 input_section->flags &=~ SEC_HAS_CONTENTS;
4337 }
4338
4339 /* Skip this section later on (I don't think this
4340 currently matters, but someday it might). */
4341 o->link_order_head = (struct bfd_link_order *) NULL;
4342
4343 /* Really remove the section. */
4344 for (secpp = &abfd->sections;
4345 *secpp != o;
4346 secpp = &(*secpp)->next)
4347 ;
4348 *secpp = (*secpp)->next;
4349 --abfd->section_count;
4350
4351 continue;
4352 }
4353
4354 /* There is one gptab for initialized data, and one for
4355 uninitialized data. */
4356 if (strcmp (o->name, ".gptab.sdata") == 0)
4357 gptab_data_sec = o;
4358 else if (strcmp (o->name, ".gptab.sbss") == 0)
4359 gptab_bss_sec = o;
4360 else
4361 {
4362 (*_bfd_error_handler)
4363 (_("%s: illegal section name `%s'"),
4364 bfd_get_filename (abfd), o->name);
4365 bfd_set_error (bfd_error_nonrepresentable_section);
4366 return false;
4367 }
4368
4369 /* The linker script always combines .gptab.data and
4370 .gptab.sdata into .gptab.sdata, and likewise for
4371 .gptab.bss and .gptab.sbss. It is possible that there is
4372 no .sdata or .sbss section in the output file, in which
4373 case we must change the name of the output section. */
4374 subname = o->name + sizeof ".gptab" - 1;
4375 if (bfd_get_section_by_name (abfd, subname) == NULL)
4376 {
4377 if (o == gptab_data_sec)
4378 o->name = ".gptab.data";
4379 else
4380 o->name = ".gptab.bss";
4381 subname = o->name + sizeof ".gptab" - 1;
4382 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
4383 }
4384
4385 /* Set up the first entry. */
4386 c = 1;
4387 tab = (Elf64_gptab *) bfd_malloc (c * sizeof (Elf64_gptab));
4388 if (tab == NULL)
4389 return false;
4390 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
4391 tab[0].gt_header.gt_unused = 0;
4392
4393 /* Combine the input sections. */
4394 for (p = o->link_order_head;
4395 p != (struct bfd_link_order *) NULL;
4396 p = p->next)
4397 {
4398 asection *input_section;
4399 bfd *input_bfd;
4400 bfd_size_type size;
4401 unsigned long last;
4402 bfd_size_type gpentry;
4403
4404 if (p->type != bfd_indirect_link_order)
4405 {
4406 if (p->type == bfd_fill_link_order)
4407 continue;
4408 abort ();
4409 }
4410
4411 input_section = p->u.indirect.section;
4412 input_bfd = input_section->owner;
4413
4414 /* Combine the gptab entries for this input section one
4415 by one. We know that the input gptab entries are
4416 sorted by ascending -G value. */
4417 size = bfd_section_size (input_bfd, input_section);
4418 last = 0;
4419 for (gpentry = sizeof (Elf64_External_gptab);
4420 gpentry < size;
4421 gpentry += sizeof (Elf64_External_gptab))
4422 {
4423 Elf64_External_gptab ext_gptab;
4424 Elf64_gptab int_gptab;
4425 unsigned long val;
4426 unsigned long add;
4427 boolean exact;
4428 unsigned int look;
4429
4430 if (! (bfd_get_section_contents
4431 (input_bfd, input_section, (PTR) &ext_gptab,
4432 gpentry, sizeof (Elf64_External_gptab))))
4433 {
4434 free (tab);
4435 return false;
4436 }
4437
4438 bfd_alpha_elf64_swap_gptab_in (input_bfd, &ext_gptab,
4439 &int_gptab);
4440 val = int_gptab.gt_entry.gt_g_value;
4441 add = int_gptab.gt_entry.gt_bytes - last;
4442
4443 exact = false;
4444 for (look = 1; look < c; look++)
4445 {
4446 if (tab[look].gt_entry.gt_g_value >= val)
4447 tab[look].gt_entry.gt_bytes += add;
4448
4449 if (tab[look].gt_entry.gt_g_value == val)
4450 exact = true;
4451 }
4452
4453 if (! exact)
4454 {
4455 Elf64_gptab *new_tab;
4456 unsigned int max;
4457
4458 /* We need a new table entry. */
4459 new_tab = ((Elf64_gptab *)
4460 bfd_realloc ((PTR) tab,
4461 (c + 1) * sizeof (Elf64_gptab)));
4462 if (new_tab == NULL)
4463 {
4464 free (tab);
4465 return false;
4466 }
4467 tab = new_tab;
4468 tab[c].gt_entry.gt_g_value = val;
4469 tab[c].gt_entry.gt_bytes = add;
4470
4471 /* Merge in the size for the next smallest -G
4472 value, since that will be implied by this new
4473 value. */
4474 max = 0;
4475 for (look = 1; look < c; look++)
4476 {
4477 if (tab[look].gt_entry.gt_g_value < val
4478 && (max == 0
4479 || (tab[look].gt_entry.gt_g_value
4480 > tab[max].gt_entry.gt_g_value)))
4481 max = look;
4482 }
4483 if (max != 0)
4484 tab[c].gt_entry.gt_bytes +=
4485 tab[max].gt_entry.gt_bytes;
4486
4487 ++c;
4488 }
4489
4490 last = int_gptab.gt_entry.gt_bytes;
4491 }
4492
4493 /* Hack: reset the SEC_HAS_CONTENTS flag so that
4494 elf_link_input_bfd ignores this section. */
4495 input_section->flags &=~ SEC_HAS_CONTENTS;
4496 }
4497
4498 /* The table must be sorted by -G value. */
4499 if (c > 2)
4500 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
4501
4502 /* Swap out the table. */
4503 ext_tab = ((Elf64_External_gptab *)
4504 bfd_alloc (abfd, c * sizeof (Elf64_External_gptab)));
4505 if (ext_tab == NULL)
4506 {
4507 free (tab);
4508 return false;
4509 }
4510
4511 for (i = 0; i < c; i++)
4512 bfd_alpha_elf64_swap_gptab_out (abfd, tab + i, ext_tab + i);
4513 free (tab);
4514
4515 o->_raw_size = c * sizeof (Elf64_External_gptab);
4516 o->contents = (bfd_byte *) ext_tab;
4517
4518 /* Skip this section later on (I don't think this currently
4519 matters, but someday it might). */
4520 o->link_order_head = (struct bfd_link_order *) NULL;
4521 }
4522#endif
4523
4524 }
4525
4526 /* Invoke the regular ELF backend linker to do all the work. */
4527 if (! bfd_elf64_bfd_final_link (abfd, info))
4528 return false;
4529
4530 /* Now write out the computed sections. */
4531
4532 /* The .got subsections... */
4533 {
4534 bfd *i, *dynobj = elf_hash_table(info)->dynobj;
4535 for (i = alpha_elf_hash_table(info)->got_list;
4536 i != NULL;
4537 i = alpha_elf_tdata(i)->got_link_next)
4538 {
4539 asection *sgot;
4540
4541 /* elf_bfd_final_link already did everything in dynobj. */
4542 if (i == dynobj)
4543 continue;
4544
4545 sgot = alpha_elf_tdata(i)->got;
4546 if (! bfd_set_section_contents (abfd, sgot->output_section,
4547 sgot->contents, sgot->output_offset,
4548 sgot->_raw_size))
4549 return false;
4550 }
4551 }
4552
4553#ifdef ERIC_neverdef
4554 if (reginfo_sec != (asection *) NULL)
4555 {
4556 Elf64_External_RegInfo ext;
4557
4558 bfd_alpha_elf64_swap_reginfo_out (abfd, &reginfo, &ext);
4559 if (! bfd_set_section_contents (abfd, reginfo_sec, (PTR) &ext,
4560 (file_ptr) 0, sizeof ext))
4561 return false;
4562 }
4563#endif
4564
4565 if (mdebug_sec != (asection *) NULL)
4566 {
4567 BFD_ASSERT (abfd->output_has_begun);
4568 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
4569 swap, info,
4570 mdebug_sec->filepos))
4571 return false;
4572
4573 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
4574 }
4575
4576 if (gptab_data_sec != (asection *) NULL)
4577 {
4578 if (! bfd_set_section_contents (abfd, gptab_data_sec,
4579 gptab_data_sec->contents,
4580 (file_ptr) 0,
4581 gptab_data_sec->_raw_size))
4582 return false;
4583 }
4584
4585 if (gptab_bss_sec != (asection *) NULL)
4586 {
4587 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
4588 gptab_bss_sec->contents,
4589 (file_ptr) 0,
4590 gptab_bss_sec->_raw_size))
4591 return false;
4592 }
4593
4594 return true;
4595}
4596\f
4597/* ECOFF swapping routines. These are used when dealing with the
4598 .mdebug section, which is in the ECOFF debugging format. Copied
4599 from elf32-mips.c. */
4600static const struct ecoff_debug_swap
4601elf64_alpha_ecoff_debug_swap =
4602{
4603 /* Symbol table magic number. */
4604 magicSym2,
4605 /* Alignment of debugging information. E.g., 4. */
4606 8,
4607 /* Sizes of external symbolic information. */
4608 sizeof (struct hdr_ext),
4609 sizeof (struct dnr_ext),
4610 sizeof (struct pdr_ext),
4611 sizeof (struct sym_ext),
4612 sizeof (struct opt_ext),
4613 sizeof (struct fdr_ext),
4614 sizeof (struct rfd_ext),
4615 sizeof (struct ext_ext),
4616 /* Functions to swap in external symbolic data. */
4617 ecoff_swap_hdr_in,
4618 ecoff_swap_dnr_in,
4619 ecoff_swap_pdr_in,
4620 ecoff_swap_sym_in,
4621 ecoff_swap_opt_in,
4622 ecoff_swap_fdr_in,
4623 ecoff_swap_rfd_in,
4624 ecoff_swap_ext_in,
4625 _bfd_ecoff_swap_tir_in,
4626 _bfd_ecoff_swap_rndx_in,
4627 /* Functions to swap out external symbolic data. */
4628 ecoff_swap_hdr_out,
4629 ecoff_swap_dnr_out,
4630 ecoff_swap_pdr_out,
4631 ecoff_swap_sym_out,
4632 ecoff_swap_opt_out,
4633 ecoff_swap_fdr_out,
4634 ecoff_swap_rfd_out,
4635 ecoff_swap_ext_out,
4636 _bfd_ecoff_swap_tir_out,
4637 _bfd_ecoff_swap_rndx_out,
4638 /* Function to read in symbolic data. */
4639 elf64_alpha_read_ecoff_info
4640};
4641\f
4642#define TARGET_LITTLE_SYM bfd_elf64_alpha_vec
4643#define TARGET_LITTLE_NAME "elf64-alpha"
4644#define ELF_ARCH bfd_arch_alpha
4645#define ELF_MACHINE_CODE EM_ALPHA
4646#define ELF_MAXPAGESIZE 0x10000
4647
4648#define bfd_elf64_bfd_link_hash_table_create \
4649 elf64_alpha_bfd_link_hash_table_create
4650
4651#define bfd_elf64_bfd_reloc_type_lookup \
4652 elf64_alpha_bfd_reloc_type_lookup
4653#define elf_info_to_howto \
4654 elf64_alpha_info_to_howto
4655
4656#define bfd_elf64_mkobject \
4657 elf64_alpha_mkobject
4658#define elf_backend_object_p \
4659 elf64_alpha_object_p
4660
4661#define elf_backend_section_from_shdr \
4662 elf64_alpha_section_from_shdr
4663#define elf_backend_fake_sections \
4664 elf64_alpha_fake_sections
4665
4666#define bfd_elf64_bfd_is_local_label_name \
4667 elf64_alpha_is_local_label_name
4668#define bfd_elf64_find_nearest_line \
4669 elf64_alpha_find_nearest_line
4670#define bfd_elf64_bfd_relax_section \
4671 elf64_alpha_relax_section
4672
4673#define elf_backend_add_symbol_hook \
4674 elf64_alpha_add_symbol_hook
4675#define elf_backend_check_relocs \
4676 elf64_alpha_check_relocs
4677#define elf_backend_create_dynamic_sections \
4678 elf64_alpha_create_dynamic_sections
4679#define elf_backend_adjust_dynamic_symbol \
4680 elf64_alpha_adjust_dynamic_symbol
4681#define elf_backend_always_size_sections \
4682 elf64_alpha_always_size_sections
4683#define elf_backend_size_dynamic_sections \
4684 elf64_alpha_size_dynamic_sections
4685#define elf_backend_relocate_section \
4686 elf64_alpha_relocate_section
4687#define elf_backend_finish_dynamic_symbol \
4688 elf64_alpha_finish_dynamic_symbol
4689#define elf_backend_finish_dynamic_sections \
4690 elf64_alpha_finish_dynamic_sections
4691#define bfd_elf64_bfd_final_link \
4692 elf64_alpha_final_link
4693
4694#define elf_backend_ecoff_debug_swap \
4695 &elf64_alpha_ecoff_debug_swap
4696
4697/*
4698 * A few constants that determine how the .plt section is set up.
4699 */
4700#define elf_backend_want_got_plt 0
4701#define elf_backend_plt_readonly 0
4702#define elf_backend_want_plt_sym 1
4703#define elf_backend_got_header_size 0
4704#define elf_backend_plt_header_size PLT_HEADER_SIZE
4705
4706#include "elf64-target.h"
This page took 0.325037 seconds and 4 git commands to generate.