*** empty log message ***
[deliverable/binutils-gdb.git] / bfd / elf64-ia64-vms.c
CommitLineData
202e2356
NC
1/* IA-64 support for OpenVMS
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
3 2008, 2009, 2010, 2012 Free Software Foundation, Inc.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
22#include "sysdep.h"
23#include "bfd.h"
24#include "libbfd.h"
25#include "elf-bfd.h"
26#include "opcode/ia64.h"
27#include "elf/ia64.h"
28#include "objalloc.h"
29#include "hashtab.h"
30#include "elfxx-ia64.h"
31#include "vms.h"
32#include "bfdver.h"
33
34/* THE RULES for all the stuff the linker creates --
35
36 GOT Entries created in response to LTOFF or LTOFF_FPTR
37 relocations. Dynamic relocs created for dynamic
38 symbols in an application; REL relocs for locals
39 in a shared library.
40
41 FPTR The canonical function descriptor. Created for local
42 symbols in applications. Descriptors for dynamic symbols
43 and local symbols in shared libraries are created by
44 ld.so. Thus there are no dynamic relocs against these
45 objects. The FPTR relocs for such _are_ passed through
46 to the dynamic relocation tables.
47
48 FULL_PLT Created for a PCREL21B relocation against a dynamic symbol.
49 Requires the creation of a PLTOFF entry. This does not
50 require any dynamic relocations.
51
52 PLTOFF Created by PLTOFF relocations. For local symbols, this
53 is an alternate function descriptor, and in shared libraries
54 requires two REL relocations. Note that this cannot be
55 transformed into an FPTR relocation, since it must be in
56 range of the GP. For dynamic symbols, this is a function
57 descriptor. */
58
59typedef struct bfd_hash_entry *(*new_hash_entry_func)
60 (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
61
62/* In dynamically (linker-) created sections, we generally need to keep track
63 of the place a symbol or expression got allocated to. This is done via hash
64 tables that store entries of the following type. */
65
66struct elf64_ia64_dyn_sym_info
67{
68 /* The addend for which this entry is relevant. */
69 bfd_vma addend;
70
71 bfd_vma got_offset;
72 bfd_vma fptr_offset;
73 bfd_vma pltoff_offset;
74 bfd_vma plt_offset;
75 bfd_vma plt2_offset;
76
77 /* The symbol table entry, if any, that this was derived from. */
78 struct elf_link_hash_entry *h;
79
80 /* Used to count non-got, non-plt relocations for delayed sizing
81 of relocation sections. */
82 struct elf64_ia64_dyn_reloc_entry
83 {
84 struct elf64_ia64_dyn_reloc_entry *next;
85 asection *srel;
86 int type;
87 int count;
88 } *reloc_entries;
89
90 /* TRUE when the section contents have been updated. */
91 unsigned got_done : 1;
92 unsigned fptr_done : 1;
93 unsigned pltoff_done : 1;
94
95 /* TRUE for the different kinds of linker data we want created. */
96 unsigned want_got : 1;
97 unsigned want_gotx : 1;
98 unsigned want_fptr : 1;
99 unsigned want_ltoff_fptr : 1;
100 unsigned want_plt : 1; /* A MIN_PLT entry. */
101 unsigned want_plt2 : 1; /* A FULL_PLT. */
102 unsigned want_pltoff : 1;
103};
104
105struct elf64_ia64_local_hash_entry
106{
107 int id;
108 unsigned int r_sym;
109 /* The number of elements in elf64_ia64_dyn_sym_info array. */
110 unsigned int count;
111 /* The number of sorted elements in elf64_ia64_dyn_sym_info array. */
112 unsigned int sorted_count;
113 /* The size of elf64_ia64_dyn_sym_info array. */
114 unsigned int size;
115 /* The array of elf64_ia64_dyn_sym_info. */
116 struct elf64_ia64_dyn_sym_info *info;
117
118 /* TRUE if this hash entry's addends was translated for
119 SHF_MERGE optimization. */
120 unsigned sec_merge_done : 1;
121};
122
123struct elf64_ia64_link_hash_entry
124{
125 struct elf_link_hash_entry root;
126
127 /* Set if this symbol is defined in a shared library.
128 We can't use root.u.def.section->owner as the symbol is an absolute
129 symbol. */
130 bfd *shl;
131
132 /* The number of elements in elf64_ia64_dyn_sym_info array. */
133 unsigned int count;
134 /* The number of sorted elements in elf64_ia64_dyn_sym_info array. */
135 unsigned int sorted_count;
136 /* The size of elf64_ia64_dyn_sym_info array. */
137 unsigned int size;
138 /* The array of elf64_ia64_dyn_sym_info. */
139 struct elf64_ia64_dyn_sym_info *info;
140};
141
142struct elf64_ia64_link_hash_table
143{
144 /* The main hash table. */
145 struct elf_link_hash_table root;
146
147 asection *fptr_sec; /* Function descriptor table (or NULL). */
148 asection *rel_fptr_sec; /* Dynamic relocation section for same. */
149 asection *pltoff_sec; /* Private descriptors for plt (or NULL). */
150 asection *fixups_sec; /* Fixups section. */
151 asection *transfer_sec; /* Transfer vector section. */
152 asection *note_sec; /* .note section. */
153
154 /* There are maybe R_IA64_GPREL22 relocations, including those
155 optimized from R_IA64_LTOFF22X, against non-SHF_IA_64_SHORT
156 sections. We need to record those sections so that we can choose
157 a proper GP to cover all R_IA64_GPREL22 relocations. */
158 asection *max_short_sec; /* Maximum short output section. */
159 bfd_vma max_short_offset; /* Maximum short offset. */
160 asection *min_short_sec; /* Minimum short output section. */
161 bfd_vma min_short_offset; /* Minimum short offset. */
162
163 htab_t loc_hash_table;
164 void *loc_hash_memory;
165};
166
167struct elf64_ia64_allocate_data
168{
169 struct bfd_link_info *info;
170 bfd_size_type ofs;
171};
172
173#define elf64_ia64_hash_table(p) \
174 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
175 == IA64_ELF_DATA ? ((struct elf64_ia64_link_hash_table *) ((p)->hash)) : NULL)
176
177struct elf64_ia64_vms_obj_tdata
178{
179 struct elf_obj_tdata root;
180
181 /* Ident for shared library. */
182 bfd_uint64_t ident;
183
184 /* Used only during link: offset in the .fixups section for this bfd. */
185 bfd_vma fixups_off;
186
187 /* Max number of shared libraries. */
188 unsigned int needed_count;
189};
190
191#define elf_ia64_vms_tdata(abfd) \
192 ((struct elf64_ia64_vms_obj_tdata *)((abfd)->tdata.any))
193#define elf_ia64_vms_ident(abfd) (elf_ia64_vms_tdata(abfd)->ident)
194
195struct elf64_vms_transfer
196{
197 unsigned char size[4];
198 unsigned char spare[4];
199 unsigned char tfradr1[8];
200 unsigned char tfradr2[8];
201 unsigned char tfradr3[8];
202 unsigned char tfradr4[8];
203 unsigned char tfradr5[8];
204
205 /* Local function descriptor for tfr3. */
206 unsigned char tfr3_func[8];
207 unsigned char tfr3_gp[8];
208};
209
210typedef struct
211{
212 Elf64_External_Ehdr ehdr;
213 unsigned char vms_needed_count[8];
214} Elf64_External_VMS_Ehdr;
215
216static struct elf64_ia64_dyn_sym_info * get_dyn_sym_info
217 (struct elf64_ia64_link_hash_table *,
218 struct elf_link_hash_entry *,
219 bfd *, const Elf_Internal_Rela *, bfd_boolean);
220static bfd_boolean elf64_ia64_dynamic_symbol_p
221 (struct elf_link_hash_entry *);
222static bfd_boolean elf64_ia64_choose_gp
223 (bfd *, struct bfd_link_info *, bfd_boolean);
224static void elf64_ia64_dyn_sym_traverse
225 (struct elf64_ia64_link_hash_table *,
226 bfd_boolean (*) (struct elf64_ia64_dyn_sym_info *, void *),
227 void *);
228static bfd_boolean allocate_global_data_got
229 (struct elf64_ia64_dyn_sym_info *, void *);
230static bfd_boolean allocate_global_fptr_got
231 (struct elf64_ia64_dyn_sym_info *, void *);
232static bfd_boolean allocate_local_got
233 (struct elf64_ia64_dyn_sym_info *, void *);
234static bfd_boolean allocate_dynrel_entries
235 (struct elf64_ia64_dyn_sym_info *, void *);
236static asection *get_pltoff
237 (bfd *, struct elf64_ia64_link_hash_table *);
238static asection *get_got
239 (bfd *, struct elf64_ia64_link_hash_table *);
240
241
242/* Given a ELF reloc, return the matching HOWTO structure. */
243
244static void
245elf64_ia64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
246 arelent *bfd_reloc,
247 Elf_Internal_Rela *elf_reloc)
248{
249 bfd_reloc->howto
250 = ia64_elf_lookup_howto ((unsigned int) ELF64_R_TYPE (elf_reloc->r_info));
251}
252
253
254#define PLT_FULL_ENTRY_SIZE (2 * 16)
255
256static const bfd_byte plt_full_entry[PLT_FULL_ENTRY_SIZE] =
257{
258 0x0b, 0x78, 0x00, 0x02, 0x00, 0x24, /* [MMI] addl r15=0,r1;; */
259 0x00, 0x41, 0x3c, 0x70, 0x29, 0xc0, /* ld8.acq r16=[r15],8*/
260 0x01, 0x08, 0x00, 0x84, /* mov r14=r1;; */
261 0x11, 0x08, 0x00, 0x1e, 0x18, 0x10, /* [MIB] ld8 r1=[r15] */
262 0x60, 0x80, 0x04, 0x80, 0x03, 0x00, /* mov b6=r16 */
263 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */
264};
265
266static const bfd_byte oor_brl[16] =
267{
268 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, /* [MLX] nop.m 0 */
269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* brl.sptk.few tgt;;*/
270 0x00, 0x00, 0x00, 0xc0
271};
272
273
274/* These functions do relaxation for IA-64 ELF. */
275
276/* Rename some of the generic section flags to better document how they
277 are used here. */
278#define skip_relax_pass_0 sec_flg0
279#define skip_relax_pass_1 sec_flg1
280
281static void
282elf64_ia64_update_short_info (asection *sec, bfd_vma offset,
283 struct elf64_ia64_link_hash_table *ia64_info)
284{
285 /* Skip ABS and SHF_IA_64_SHORT sections. */
286 if (sec == bfd_abs_section_ptr
287 || (sec->flags & SEC_SMALL_DATA) != 0)
288 return;
289
290 if (!ia64_info->min_short_sec)
291 {
292 ia64_info->max_short_sec = sec;
293 ia64_info->max_short_offset = offset;
294 ia64_info->min_short_sec = sec;
295 ia64_info->min_short_offset = offset;
296 }
297 else if (sec == ia64_info->max_short_sec
298 && offset > ia64_info->max_short_offset)
299 ia64_info->max_short_offset = offset;
300 else if (sec == ia64_info->min_short_sec
301 && offset < ia64_info->min_short_offset)
302 ia64_info->min_short_offset = offset;
303 else if (sec->output_section->vma
304 > ia64_info->max_short_sec->vma)
305 {
306 ia64_info->max_short_sec = sec;
307 ia64_info->max_short_offset = offset;
308 }
309 else if (sec->output_section->vma
310 < ia64_info->min_short_sec->vma)
311 {
312 ia64_info->min_short_sec = sec;
313 ia64_info->min_short_offset = offset;
314 }
315}
316
317/* Use a two passes algorithm. In the first pass, branches are relaxed
318 (which may increase the size of the section). In the second pass,
319 the other relaxations are done.
320*/
321
322static bfd_boolean
323elf64_ia64_relax_section (bfd *abfd, asection *sec,
324 struct bfd_link_info *link_info,
325 bfd_boolean *again)
326{
327 struct one_fixup
328 {
329 struct one_fixup *next;
330 asection *tsec;
331 bfd_vma toff;
332 bfd_vma trampoff;
333 };
334
335 Elf_Internal_Shdr *symtab_hdr;
336 Elf_Internal_Rela *internal_relocs;
337 Elf_Internal_Rela *irel, *irelend;
338 bfd_byte *contents;
339 Elf_Internal_Sym *isymbuf = NULL;
340 struct elf64_ia64_link_hash_table *ia64_info;
341 struct one_fixup *fixups = NULL;
342 bfd_boolean changed_contents = FALSE;
343 bfd_boolean changed_relocs = FALSE;
344 bfd_boolean skip_relax_pass_0 = TRUE;
345 bfd_boolean skip_relax_pass_1 = TRUE;
346 bfd_vma gp = 0;
347
348 /* Assume we're not going to change any sizes, and we'll only need
349 one pass. */
350 *again = FALSE;
351
352 if (link_info->relocatable)
353 (*link_info->callbacks->einfo)
354 (_("%P%F: --relax and -r may not be used together\n"));
355
356 /* Don't even try to relax for non-ELF outputs. */
357 if (!is_elf_hash_table (link_info->hash))
358 return FALSE;
359
360 /* Nothing to do if there are no relocations or there is no need for
361 the current pass. */
362 if ((sec->flags & SEC_RELOC) == 0
363 || sec->reloc_count == 0
364 || (link_info->relax_pass == 0 && sec->skip_relax_pass_0)
365 || (link_info->relax_pass == 1 && sec->skip_relax_pass_1))
366 return TRUE;
367
368 ia64_info = elf64_ia64_hash_table (link_info);
369 if (ia64_info == NULL)
370 return FALSE;
371
372 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
373
374 /* Load the relocations for this section. */
375 internal_relocs = (_bfd_elf_link_read_relocs
376 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
377 link_info->keep_memory));
378 if (internal_relocs == NULL)
379 return FALSE;
380
381 irelend = internal_relocs + sec->reloc_count;
382
383 /* Get the section contents. */
384 if (elf_section_data (sec)->this_hdr.contents != NULL)
385 contents = elf_section_data (sec)->this_hdr.contents;
386 else
387 {
388 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
389 goto error_return;
390 }
391
392 for (irel = internal_relocs; irel < irelend; irel++)
393 {
394 unsigned long r_type = ELF64_R_TYPE (irel->r_info);
395 bfd_vma symaddr, reladdr, trampoff, toff, roff;
396 asection *tsec;
397 struct one_fixup *f;
398 bfd_size_type amt;
399 bfd_boolean is_branch;
400 struct elf64_ia64_dyn_sym_info *dyn_i;
401
402 switch (r_type)
403 {
404 case R_IA64_PCREL21B:
405 case R_IA64_PCREL21BI:
406 case R_IA64_PCREL21M:
407 case R_IA64_PCREL21F:
408 /* In pass 1, all br relaxations are done. We can skip it. */
409 if (link_info->relax_pass == 1)
410 continue;
411 skip_relax_pass_0 = FALSE;
412 is_branch = TRUE;
413 break;
414
415 case R_IA64_PCREL60B:
416 /* We can't optimize brl to br in pass 0 since br relaxations
417 will increase the code size. Defer it to pass 1. */
418 if (link_info->relax_pass == 0)
419 {
420 skip_relax_pass_1 = FALSE;
421 continue;
422 }
423 is_branch = TRUE;
424 break;
425
426 case R_IA64_GPREL22:
427 /* Update max_short_sec/min_short_sec. */
428
429 case R_IA64_LTOFF22X:
430 case R_IA64_LDXMOV:
431 /* We can't relax ldx/mov in pass 0 since br relaxations will
432 increase the code size. Defer it to pass 1. */
433 if (link_info->relax_pass == 0)
434 {
435 skip_relax_pass_1 = FALSE;
436 continue;
437 }
438 is_branch = FALSE;
439 break;
440
441 default:
442 continue;
443 }
444
445 /* Get the value of the symbol referred to by the reloc. */
446 if (ELF64_R_SYM (irel->r_info) < symtab_hdr->sh_info)
447 {
448 /* A local symbol. */
449 Elf_Internal_Sym *isym;
450
451 /* Read this BFD's local symbols. */
452 if (isymbuf == NULL)
453 {
454 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
455 if (isymbuf == NULL)
456 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
457 symtab_hdr->sh_info, 0,
458 NULL, NULL, NULL);
459 if (isymbuf == 0)
460 goto error_return;
461 }
462
463 isym = isymbuf + ELF64_R_SYM (irel->r_info);
464 if (isym->st_shndx == SHN_UNDEF)
465 continue; /* We can't do anything with undefined symbols. */
466 else if (isym->st_shndx == SHN_ABS)
467 tsec = bfd_abs_section_ptr;
468 else if (isym->st_shndx == SHN_COMMON)
469 tsec = bfd_com_section_ptr;
470 else if (isym->st_shndx == SHN_IA_64_ANSI_COMMON)
471 tsec = bfd_com_section_ptr;
472 else
473 tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
474
475 toff = isym->st_value;
476 dyn_i = get_dyn_sym_info (ia64_info, NULL, abfd, irel, FALSE);
477 }
478 else
479 {
480 unsigned long indx;
481 struct elf_link_hash_entry *h;
482
483 indx = ELF64_R_SYM (irel->r_info) - symtab_hdr->sh_info;
484 h = elf_sym_hashes (abfd)[indx];
485 BFD_ASSERT (h != NULL);
486
487 while (h->root.type == bfd_link_hash_indirect
488 || h->root.type == bfd_link_hash_warning)
489 h = (struct elf_link_hash_entry *) h->root.u.i.link;
490
491 dyn_i = get_dyn_sym_info (ia64_info, h, abfd, irel, FALSE);
492
493 /* For branches to dynamic symbols, we're interested instead
494 in a branch to the PLT entry. */
495 if (is_branch && dyn_i && dyn_i->want_plt2)
496 {
497 /* Internal branches shouldn't be sent to the PLT.
498 Leave this for now and we'll give an error later. */
499 if (r_type != R_IA64_PCREL21B)
500 continue;
501
502 tsec = ia64_info->root.splt;
503 toff = dyn_i->plt2_offset;
504 BFD_ASSERT (irel->r_addend == 0);
505 }
506
507 /* Can't do anything else with dynamic symbols. */
508 else if (elf64_ia64_dynamic_symbol_p (h))
509 continue;
510
511 else
512 {
513 /* We can't do anything with undefined symbols. */
514 if (h->root.type == bfd_link_hash_undefined
515 || h->root.type == bfd_link_hash_undefweak)
516 continue;
517
518 tsec = h->root.u.def.section;
519 toff = h->root.u.def.value;
520 }
521 }
522
523 toff += irel->r_addend;
524
525 symaddr = tsec->output_section->vma + tsec->output_offset + toff;
526
527 roff = irel->r_offset;
528
529 if (is_branch)
530 {
531 bfd_signed_vma offset;
532
533 reladdr = (sec->output_section->vma
534 + sec->output_offset
535 + roff) & (bfd_vma) -4;
536
537 /* The .plt section is aligned at 32byte and the .text section
538 is aligned at 64byte. The .text section is right after the
539 .plt section. After the first relaxation pass, linker may
540 increase the gap between the .plt and .text sections up
541 to 32byte. We assume linker will always insert 32byte
a8685210 542 between the .plt and .text sections after the first
202e2356
NC
543 relaxation pass. */
544 if (tsec == ia64_info->root.splt)
545 offset = -0x1000000 + 32;
546 else
547 offset = -0x1000000;
548
549 /* If the branch is in range, no need to do anything. */
550 if ((bfd_signed_vma) (symaddr - reladdr) >= offset
551 && (bfd_signed_vma) (symaddr - reladdr) <= 0x0FFFFF0)
552 {
553 /* If the 60-bit branch is in 21-bit range, optimize it. */
554 if (r_type == R_IA64_PCREL60B)
555 {
556 ia64_elf_relax_brl (contents, roff);
557
558 irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
559 R_IA64_PCREL21B);
560
561 /* If the original relocation offset points to slot
562 1, change it to slot 2. */
563 if ((irel->r_offset & 3) == 1)
564 irel->r_offset += 1;
565 }
566
567 continue;
568 }
569 else if (r_type == R_IA64_PCREL60B)
570 continue;
571 else if (ia64_elf_relax_br (contents, roff))
572 {
573 irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
574 R_IA64_PCREL60B);
575
576 /* Make the relocation offset point to slot 1. */
577 irel->r_offset = (irel->r_offset & ~((bfd_vma) 0x3)) + 1;
578 continue;
579 }
580
581 /* We can't put a trampoline in a .init/.fini section. Issue
582 an error. */
583 if (strcmp (sec->output_section->name, ".init") == 0
584 || strcmp (sec->output_section->name, ".fini") == 0)
585 {
586 (*_bfd_error_handler)
587 (_("%B: Can't relax br at 0x%lx in section `%A'. Please use brl or indirect branch."),
588 sec->owner, sec, (unsigned long) roff);
589 bfd_set_error (bfd_error_bad_value);
590 goto error_return;
591 }
592
593 /* If the branch and target are in the same section, you've
594 got one honking big section and we can't help you unless
595 you are branching backwards. You'll get an error message
596 later. */
597 if (tsec == sec && toff > roff)
598 continue;
599
600 /* Look for an existing fixup to this address. */
601 for (f = fixups; f ; f = f->next)
602 if (f->tsec == tsec && f->toff == toff)
603 break;
604
605 if (f == NULL)
606 {
607 /* Two alternatives: If it's a branch to a PLT entry, we can
608 make a copy of the FULL_PLT entry. Otherwise, we'll have
609 to use a `brl' insn to get where we're going. */
610
611 size_t size;
612
613 if (tsec == ia64_info->root.splt)
614 size = sizeof (plt_full_entry);
615 else
616 size = sizeof (oor_brl);
617
618 /* Resize the current section to make room for the new branch. */
619 trampoff = (sec->size + 15) & (bfd_vma) -16;
620
621 /* If trampoline is out of range, there is nothing we
622 can do. */
623 offset = trampoff - (roff & (bfd_vma) -4);
624 if (offset < -0x1000000 || offset > 0x0FFFFF0)
625 continue;
626
627 amt = trampoff + size;
628 contents = (bfd_byte *) bfd_realloc (contents, amt);
629 if (contents == NULL)
630 goto error_return;
631 sec->size = amt;
632
633 if (tsec == ia64_info->root.splt)
634 {
635 memcpy (contents + trampoff, plt_full_entry, size);
636
637 /* Hijack the old relocation for use as the PLTOFF reloc. */
638 irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
639 R_IA64_PLTOFF22);
640 irel->r_offset = trampoff;
641 }
642 else
643 {
644 memcpy (contents + trampoff, oor_brl, size);
645 irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
646 R_IA64_PCREL60B);
647 irel->r_offset = trampoff + 2;
648 }
649
650 /* Record the fixup so we don't do it again this section. */
651 f = (struct one_fixup *)
652 bfd_malloc ((bfd_size_type) sizeof (*f));
653 f->next = fixups;
654 f->tsec = tsec;
655 f->toff = toff;
656 f->trampoff = trampoff;
657 fixups = f;
658 }
659 else
660 {
661 /* If trampoline is out of range, there is nothing we
662 can do. */
663 offset = f->trampoff - (roff & (bfd_vma) -4);
664 if (offset < -0x1000000 || offset > 0x0FFFFF0)
665 continue;
666
667 /* Nop out the reloc, since we're finalizing things here. */
668 irel->r_info = ELF64_R_INFO (0, R_IA64_NONE);
669 }
670
671 /* Fix up the existing branch to hit the trampoline. */
672 if (ia64_elf_install_value (contents + roff, offset, r_type)
673 != bfd_reloc_ok)
674 goto error_return;
675
676 changed_contents = TRUE;
677 changed_relocs = TRUE;
678 }
679 else
680 {
681 /* Fetch the gp. */
682 if (gp == 0)
683 {
684 bfd *obfd = sec->output_section->owner;
685 gp = _bfd_get_gp_value (obfd);
686 if (gp == 0)
687 {
688 if (!elf64_ia64_choose_gp (obfd, link_info, FALSE))
689 goto error_return;
690 gp = _bfd_get_gp_value (obfd);
691 }
692 }
693
694 /* If the data is out of range, do nothing. */
695 if ((bfd_signed_vma) (symaddr - gp) >= 0x200000
696 ||(bfd_signed_vma) (symaddr - gp) < -0x200000)
697 continue;
698
699 if (r_type == R_IA64_GPREL22)
700 elf64_ia64_update_short_info (tsec->output_section,
701 tsec->output_offset + toff,
702 ia64_info);
703 else if (r_type == R_IA64_LTOFF22X)
704 {
705 /* Can't deal yet correctly with ABS symbols. */
706 if (bfd_is_abs_section (tsec))
707 continue;
708
709 irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
710 R_IA64_GPREL22);
711 changed_relocs = TRUE;
712
713 elf64_ia64_update_short_info (tsec->output_section,
714 tsec->output_offset + toff,
715 ia64_info);
716 }
717 else
718 {
719 ia64_elf_relax_ldxmov (contents, roff);
720 irel->r_info = ELF64_R_INFO (0, R_IA64_NONE);
721 changed_contents = TRUE;
722 changed_relocs = TRUE;
723 }
724 }
725 }
726
727 /* ??? If we created fixups, this may push the code segment large
728 enough that the data segment moves, which will change the GP.
729 Reset the GP so that we re-calculate next round. We need to
730 do this at the _beginning_ of the next round; now will not do. */
731
732 /* Clean up and go home. */
733 while (fixups)
734 {
735 struct one_fixup *f = fixups;
736 fixups = fixups->next;
737 free (f);
738 }
739
740 if (isymbuf != NULL
741 && symtab_hdr->contents != (unsigned char *) isymbuf)
742 {
743 if (! link_info->keep_memory)
744 free (isymbuf);
745 else
746 {
747 /* Cache the symbols for elf_link_input_bfd. */
748 symtab_hdr->contents = (unsigned char *) isymbuf;
749 }
750 }
751
752 if (contents != NULL
753 && elf_section_data (sec)->this_hdr.contents != contents)
754 {
755 if (!changed_contents && !link_info->keep_memory)
756 free (contents);
757 else
758 {
759 /* Cache the section contents for elf_link_input_bfd. */
760 elf_section_data (sec)->this_hdr.contents = contents;
761 }
762 }
763
764 if (elf_section_data (sec)->relocs != internal_relocs)
765 {
766 if (!changed_relocs)
767 free (internal_relocs);
768 else
769 elf_section_data (sec)->relocs = internal_relocs;
770 }
771
772 if (link_info->relax_pass == 0)
773 {
774 /* Pass 0 is only needed to relax br. */
775 sec->skip_relax_pass_0 = skip_relax_pass_0;
776 sec->skip_relax_pass_1 = skip_relax_pass_1;
777 }
778
779 *again = changed_contents || changed_relocs;
780 return TRUE;
781
782 error_return:
783 if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
784 free (isymbuf);
785 if (contents != NULL
786 && elf_section_data (sec)->this_hdr.contents != contents)
787 free (contents);
788 if (internal_relocs != NULL
789 && elf_section_data (sec)->relocs != internal_relocs)
790 free (internal_relocs);
791 return FALSE;
792}
793#undef skip_relax_pass_0
794#undef skip_relax_pass_1
795
796/* Return TRUE if NAME is an unwind table section name. */
797
798static inline bfd_boolean
799is_unwind_section_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
800{
801 return ((CONST_STRNEQ (name, ELF_STRING_ia64_unwind)
802 && ! CONST_STRNEQ (name, ELF_STRING_ia64_unwind_info))
803 || CONST_STRNEQ (name, ELF_STRING_ia64_unwind_once));
804}
805
806
807/* Convert IA-64 specific section flags to bfd internal section flags. */
808
809/* ??? There is no bfd internal flag equivalent to the SHF_IA_64_NORECOV
810 flag. */
811
812static bfd_boolean
813elf64_ia64_section_flags (flagword *flags,
814 const Elf_Internal_Shdr *hdr)
815{
816 if (hdr->sh_flags & SHF_IA_64_SHORT)
817 *flags |= SEC_SMALL_DATA;
818
819 return TRUE;
820}
821
822/* Set the correct type for an IA-64 ELF section. We do this by the
823 section name, which is a hack, but ought to work. */
824
825static bfd_boolean
826elf64_ia64_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr,
827 asection *sec)
828{
829 const char *name;
830
831 name = bfd_get_section_name (abfd, sec);
832
833 if (is_unwind_section_name (abfd, name))
834 {
835 /* We don't have the sections numbered at this point, so sh_info
836 is set later, in elf64_ia64_final_write_processing. */
837 hdr->sh_type = SHT_IA_64_UNWIND;
838 hdr->sh_flags |= SHF_LINK_ORDER;
839 }
840 else if (strcmp (name, ELF_STRING_ia64_archext) == 0)
841 hdr->sh_type = SHT_IA_64_EXT;
842
843 if (sec->flags & SEC_SMALL_DATA)
844 hdr->sh_flags |= SHF_IA_64_SHORT;
845
846 return TRUE;
847}
848
849/* Hook called by the linker routine which adds symbols from an object
850 file. We use it to put .comm items in .sbss, and not .bss. */
851
852static bfd_boolean
853elf64_ia64_add_symbol_hook (bfd *abfd,
854 struct bfd_link_info *info,
855 Elf_Internal_Sym *sym,
856 const char **namep ATTRIBUTE_UNUSED,
857 flagword *flagsp ATTRIBUTE_UNUSED,
858 asection **secp,
859 bfd_vma *valp)
860{
861 if (sym->st_shndx == SHN_COMMON
862 && !info->relocatable
863 && sym->st_size <= elf_gp_size (abfd))
864 {
865 /* Common symbols less than or equal to -G nn bytes are
866 automatically put into .sbss. */
867
868 asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
869
870 if (scomm == NULL)
871 {
872 scomm = bfd_make_section_with_flags (abfd, ".scommon",
873 (SEC_ALLOC
874 | SEC_IS_COMMON
875 | SEC_LINKER_CREATED));
876 if (scomm == NULL)
877 return FALSE;
878 }
879
880 *secp = scomm;
881 *valp = sym->st_size;
882 }
883
884 return TRUE;
885}
886
887/* According to the Tahoe assembler spec, all labels starting with a
888 '.' are local. */
889
890static bfd_boolean
891elf64_ia64_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
892 const char *name)
893{
894 return name[0] == '.';
895}
896
897/* Should we do dynamic things to this symbol? */
898
899static bfd_boolean
900elf64_ia64_dynamic_symbol_p (struct elf_link_hash_entry *h)
901{
902 return h != NULL && h->def_dynamic;
903}
904
905static struct bfd_hash_entry*
906elf64_ia64_new_elf_hash_entry (struct bfd_hash_entry *entry,
907 struct bfd_hash_table *table,
908 const char *string)
909{
910 struct elf64_ia64_link_hash_entry *ret;
911 ret = (struct elf64_ia64_link_hash_entry *) entry;
912
913 /* Allocate the structure if it has not already been allocated by a
914 subclass. */
915 if (!ret)
916 ret = bfd_hash_allocate (table, sizeof (*ret));
917
918 if (!ret)
919 return 0;
920
921 /* Call the allocation method of the superclass. */
922 ret = ((struct elf64_ia64_link_hash_entry *)
923 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
924 table, string));
925
926 ret->info = NULL;
927 ret->count = 0;
928 ret->sorted_count = 0;
929 ret->size = 0;
930 return (struct bfd_hash_entry *) ret;
931}
932
933static void
934elf64_ia64_hash_hide_symbol (struct bfd_link_info *info,
935 struct elf_link_hash_entry *xh,
936 bfd_boolean force_local)
937{
938 struct elf64_ia64_link_hash_entry *h;
939 struct elf64_ia64_dyn_sym_info *dyn_i;
940 unsigned int count;
941
942 h = (struct elf64_ia64_link_hash_entry *)xh;
943
944 _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
945
946 for (count = h->count, dyn_i = h->info;
947 count != 0;
948 count--, dyn_i++)
949 {
950 dyn_i->want_plt2 = 0;
951 dyn_i->want_plt = 0;
952 }
953}
954
955/* Compute a hash of a local hash entry. */
956
957static hashval_t
958elf64_ia64_local_htab_hash (const void *ptr)
959{
960 struct elf64_ia64_local_hash_entry *entry
961 = (struct elf64_ia64_local_hash_entry *) ptr;
962
963 return ELF_LOCAL_SYMBOL_HASH (entry->id, entry->r_sym);
964}
965
966/* Compare local hash entries. */
967
968static int
969elf64_ia64_local_htab_eq (const void *ptr1, const void *ptr2)
970{
971 struct elf64_ia64_local_hash_entry *entry1
972 = (struct elf64_ia64_local_hash_entry *) ptr1;
973 struct elf64_ia64_local_hash_entry *entry2
974 = (struct elf64_ia64_local_hash_entry *) ptr2;
975
976 return entry1->id == entry2->id && entry1->r_sym == entry2->r_sym;
977}
978
979/* Create the derived linker hash table. The IA-64 ELF port uses this
980 derived hash table to keep information specific to the IA-64 ElF
981 linker (without using static variables). */
982
983static struct bfd_link_hash_table *
984elf64_ia64_hash_table_create (bfd *abfd)
985{
986 struct elf64_ia64_link_hash_table *ret;
987
988 ret = bfd_zmalloc ((bfd_size_type) sizeof (*ret));
989 if (!ret)
990 return NULL;
991
992 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
993 elf64_ia64_new_elf_hash_entry,
994 sizeof (struct elf64_ia64_link_hash_entry),
995 IA64_ELF_DATA))
996 {
997 free (ret);
998 return NULL;
999 }
1000
1001 ret->loc_hash_table = htab_try_create (1024, elf64_ia64_local_htab_hash,
1002 elf64_ia64_local_htab_eq, NULL);
1003 ret->loc_hash_memory = objalloc_create ();
1004 if (!ret->loc_hash_table || !ret->loc_hash_memory)
1005 {
1006 free (ret);
1007 return NULL;
1008 }
1009
1010 return &ret->root.root;
1011}
1012
1013/* Free the global elf64_ia64_dyn_sym_info array. */
1014
1015static bfd_boolean
1016elf64_ia64_global_dyn_info_free (void **xentry,
1017 void * unused ATTRIBUTE_UNUSED)
1018{
1019 struct elf64_ia64_link_hash_entry *entry
1020 = (struct elf64_ia64_link_hash_entry *) xentry;
1021
1022 if (entry->root.root.type == bfd_link_hash_warning)
1023 entry = (struct elf64_ia64_link_hash_entry *) entry->root.root.u.i.link;
1024
1025 if (entry->info)
1026 {
1027 free (entry->info);
1028 entry->info = NULL;
1029 entry->count = 0;
1030 entry->sorted_count = 0;
1031 entry->size = 0;
1032 }
1033
1034 return TRUE;
1035}
1036
1037/* Free the local elf64_ia64_dyn_sym_info array. */
1038
1039static bfd_boolean
1040elf64_ia64_local_dyn_info_free (void **slot,
1041 void * unused ATTRIBUTE_UNUSED)
1042{
1043 struct elf64_ia64_local_hash_entry *entry
1044 = (struct elf64_ia64_local_hash_entry *) *slot;
1045
1046 if (entry->info)
1047 {
1048 free (entry->info);
1049 entry->info = NULL;
1050 entry->count = 0;
1051 entry->sorted_count = 0;
1052 entry->size = 0;
1053 }
1054
1055 return TRUE;
1056}
1057
1058/* Destroy IA-64 linker hash table. */
1059
1060static void
1061elf64_ia64_hash_table_free (struct bfd_link_hash_table *hash)
1062{
1063 struct elf64_ia64_link_hash_table *ia64_info
1064 = (struct elf64_ia64_link_hash_table *) hash;
1065 if (ia64_info->loc_hash_table)
1066 {
1067 htab_traverse (ia64_info->loc_hash_table,
1068 elf64_ia64_local_dyn_info_free, NULL);
1069 htab_delete (ia64_info->loc_hash_table);
1070 }
1071 if (ia64_info->loc_hash_memory)
1072 objalloc_free ((struct objalloc *) ia64_info->loc_hash_memory);
1073 elf_link_hash_traverse (&ia64_info->root,
1074 elf64_ia64_global_dyn_info_free, NULL);
9f7c3e5e 1075 _bfd_elf_link_hash_table_free (hash);
202e2356
NC
1076}
1077
1078/* Traverse both local and global hash tables. */
1079
1080struct elf64_ia64_dyn_sym_traverse_data
1081{
1082 bfd_boolean (*func) (struct elf64_ia64_dyn_sym_info *, void *);
1083 void * data;
1084};
1085
1086static bfd_boolean
1087elf64_ia64_global_dyn_sym_thunk (struct bfd_hash_entry *xentry,
1088 void * xdata)
1089{
1090 struct elf64_ia64_link_hash_entry *entry
1091 = (struct elf64_ia64_link_hash_entry *) xentry;
1092 struct elf64_ia64_dyn_sym_traverse_data *data
1093 = (struct elf64_ia64_dyn_sym_traverse_data *) xdata;
1094 struct elf64_ia64_dyn_sym_info *dyn_i;
1095 unsigned int count;
1096
1097 if (entry->root.root.type == bfd_link_hash_warning)
1098 entry = (struct elf64_ia64_link_hash_entry *) entry->root.root.u.i.link;
1099
1100 for (count = entry->count, dyn_i = entry->info;
1101 count != 0;
1102 count--, dyn_i++)
1103 if (! (*data->func) (dyn_i, data->data))
1104 return FALSE;
1105 return TRUE;
1106}
1107
1108static bfd_boolean
1109elf64_ia64_local_dyn_sym_thunk (void **slot, void * xdata)
1110{
1111 struct elf64_ia64_local_hash_entry *entry
1112 = (struct elf64_ia64_local_hash_entry *) *slot;
1113 struct elf64_ia64_dyn_sym_traverse_data *data
1114 = (struct elf64_ia64_dyn_sym_traverse_data *) xdata;
1115 struct elf64_ia64_dyn_sym_info *dyn_i;
1116 unsigned int count;
1117
1118 for (count = entry->count, dyn_i = entry->info;
1119 count != 0;
1120 count--, dyn_i++)
1121 if (! (*data->func) (dyn_i, data->data))
1122 return FALSE;
1123 return TRUE;
1124}
1125
1126static void
1127elf64_ia64_dyn_sym_traverse (struct elf64_ia64_link_hash_table *ia64_info,
1128 bfd_boolean (*func) (struct elf64_ia64_dyn_sym_info *, void *),
1129 void * data)
1130{
1131 struct elf64_ia64_dyn_sym_traverse_data xdata;
1132
1133 xdata.func = func;
1134 xdata.data = data;
1135
1136 elf_link_hash_traverse (&ia64_info->root,
1137 elf64_ia64_global_dyn_sym_thunk, &xdata);
1138 htab_traverse (ia64_info->loc_hash_table,
1139 elf64_ia64_local_dyn_sym_thunk, &xdata);
1140}
1141
1142#define NOTE_NAME "IPF/VMS"
1143
1144static bfd_boolean
1145create_ia64_vms_notes (bfd *abfd, struct bfd_link_info *info,
1146 unsigned int time_hi, unsigned int time_lo)
1147{
1148#define NBR_NOTES 7
1149 Elf_Internal_Note notes[NBR_NOTES];
1150 char *module_name;
1151 int module_name_len;
1152 unsigned char cur_time[8];
1153 Elf64_External_VMS_ORIG_DYN_Note *orig_dyn;
1154 unsigned int orig_dyn_size;
1155 unsigned int note_size;
1156 int i;
1157 unsigned char *noteptr;
1158 unsigned char *note_contents;
1159 struct elf64_ia64_link_hash_table *ia64_info;
1160
1161 ia64_info = elf64_ia64_hash_table (info);
1162
1163 module_name = vms_get_module_name (bfd_get_filename (abfd), TRUE);
1164 module_name_len = strlen (module_name) + 1;
1165
1166 bfd_putl32 (time_lo, cur_time + 0);
1167 bfd_putl32 (time_hi, cur_time + 4);
1168
1169 /* Note 0: IMGNAM. */
1170 notes[0].type = NT_VMS_IMGNAM;
1171 notes[0].descdata = module_name;
1172 notes[0].descsz = module_name_len;
1173
1174 /* Note 1: GSTNAM. */
1175 notes[1].type = NT_VMS_GSTNAM;
1176 notes[1].descdata = module_name;
1177 notes[1].descsz = module_name_len;
1178
1179 /* Note 2: IMGID. */
1180#define IMG_ID "V1.0"
1181 notes[2].type = NT_VMS_IMGID;
1182 notes[2].descdata = IMG_ID;
1183 notes[2].descsz = sizeof (IMG_ID);
1184
1185 /* Note 3: Linktime. */
1186 notes[3].type = NT_VMS_LINKTIME;
1187 notes[3].descdata = (char *)cur_time;
1188 notes[3].descsz = sizeof (cur_time);
1189
1190 /* Note 4: Linker id. */
1191 notes[4].type = NT_VMS_LINKID;
1192 notes[4].descdata = "GNU ld " BFD_VERSION_STRING;
1193 notes[4].descsz = strlen (notes[4].descdata) + 1;
1194
1195 /* Note 5: Original dyn. */
1196 orig_dyn_size = (sizeof (*orig_dyn) + sizeof (IMG_ID) - 1 + 7) & ~7;
1197 orig_dyn = bfd_zalloc (abfd, orig_dyn_size);
1198 if (orig_dyn == NULL)
1199 return FALSE;
1200 bfd_putl32 (1, orig_dyn->major_id);
1201 bfd_putl32 (3, orig_dyn->minor_id);
1202 memcpy (orig_dyn->manipulation_date, cur_time, sizeof (cur_time));
1203 bfd_putl64 (VMS_LF_IMGSTA | VMS_LF_MAIN, orig_dyn->link_flags);
1204 bfd_putl32 (EF_IA_64_ABI64, orig_dyn->elf_flags);
1205 memcpy (orig_dyn->imgid, IMG_ID, sizeof (IMG_ID));
1206 notes[5].type = NT_VMS_ORIG_DYN;
1207 notes[5].descdata = (char *)orig_dyn;
1208 notes[5].descsz = orig_dyn_size;
1209
1210 /* Note 3: Patchtime. */
1211 notes[6].type = NT_VMS_PATCHTIME;
1212 notes[6].descdata = (char *)cur_time;
1213 notes[6].descsz = sizeof (cur_time);
1214
1215 /* Compute notes size. */
1216 note_size = 0;
1217 for (i = 0; i < NBR_NOTES; i++)
1218 note_size += sizeof (Elf64_External_VMS_Note) - 1
1219 + ((sizeof (NOTE_NAME) - 1 + 7) & ~7)
1220 + ((notes[i].descsz + 7) & ~7);
1221
1222 /* Malloc a temporary buffer large enough for most notes */
1223 note_contents = (unsigned char *) bfd_zalloc (abfd, note_size);
1224 if (note_contents == NULL)
1225 return FALSE;
1226 noteptr = note_contents;
1227
1228 /* Fill notes. */
1229 for (i = 0; i < NBR_NOTES; i++)
1230 {
1231 Elf64_External_VMS_Note *enote = (Elf64_External_VMS_Note *) noteptr;
1232
1233 bfd_putl64 (sizeof (NOTE_NAME) - 1, enote->namesz);
1234 bfd_putl64 (notes[i].descsz, enote->descsz);
1235 bfd_putl64 (notes[i].type, enote->type);
1236
1237 noteptr = (unsigned char *)enote->name;
1238 memcpy (noteptr, NOTE_NAME, sizeof (NOTE_NAME) - 1);
1239 noteptr += (sizeof (NOTE_NAME) - 1 + 7) & ~7;
1240 memcpy (noteptr, notes[i].descdata, notes[i].descsz);
1241 noteptr += (notes[i].descsz + 7) & ~7;
1242 }
1243
1244 ia64_info->note_sec->contents = note_contents;
1245 ia64_info->note_sec->size = note_size;
1246
1247 free (module_name);
1248
1249 return TRUE;
1250}
1251
1252static bfd_boolean
1253elf64_ia64_create_dynamic_sections (bfd *abfd,
1254 struct bfd_link_info *info)
1255{
1256 struct elf64_ia64_link_hash_table *ia64_info;
1257 asection *s;
1258 flagword flags;
1259 const struct elf_backend_data *bed;
1260
1261 ia64_info = elf64_ia64_hash_table (info);
1262 if (ia64_info == NULL)
1263 return FALSE;
1264
1265 if (elf_hash_table (info)->dynamic_sections_created)
1266 return TRUE;
1267
1268 abfd = elf_hash_table (info)->dynobj;
1269 bed = get_elf_backend_data (abfd);
1270
1271 flags = bed->dynamic_sec_flags;
1272
3d4d4302
AM
1273 s = bfd_make_section_anyway_with_flags (abfd, ".dynamic",
1274 flags | SEC_READONLY);
202e2356
NC
1275 if (s == NULL
1276 || ! bfd_set_section_alignment (abfd, s, bed->s->log_file_align))
1277 return FALSE;
1278
3d4d4302 1279 s = bfd_make_section_anyway_with_flags (abfd, ".plt", flags | SEC_READONLY);
202e2356
NC
1280 if (s == NULL
1281 || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment))
1282 return FALSE;
1283 ia64_info->root.splt = s;
1284
1285 if (!get_got (abfd, ia64_info))
1286 return FALSE;
1287
1288 if (!get_pltoff (abfd, ia64_info))
1289 return FALSE;
1290
3d4d4302
AM
1291 s = bfd_make_section_anyway_with_flags (abfd, ".vmsdynstr",
1292 (SEC_ALLOC
1293 | SEC_HAS_CONTENTS
1294 | SEC_IN_MEMORY
1295 | SEC_LINKER_CREATED));
202e2356
NC
1296 if (s == NULL
1297 || !bfd_set_section_alignment (abfd, s, 0))
1298 return FALSE;
1299
1300 /* Create a fixup section. */
3d4d4302
AM
1301 s = bfd_make_section_anyway_with_flags (abfd, ".fixups",
1302 (SEC_ALLOC
1303 | SEC_HAS_CONTENTS
1304 | SEC_IN_MEMORY
1305 | SEC_LINKER_CREATED));
202e2356
NC
1306 if (s == NULL
1307 || !bfd_set_section_alignment (abfd, s, 3))
1308 return FALSE;
1309 ia64_info->fixups_sec = s;
1310
1311 /* Create the transfer fixup section. */
3d4d4302
AM
1312 s = bfd_make_section_anyway_with_flags (abfd, ".transfer",
1313 (SEC_ALLOC
1314 | SEC_HAS_CONTENTS
1315 | SEC_IN_MEMORY
1316 | SEC_LINKER_CREATED));
202e2356
NC
1317 if (s == NULL
1318 || !bfd_set_section_alignment (abfd, s, 3))
1319 return FALSE;
1320 s->size = sizeof (struct elf64_vms_transfer);
1321 ia64_info->transfer_sec = s;
1322
1323 /* Create note section. */
1324 s = bfd_make_section_anyway_with_flags (abfd, ".vms.note",
1325 (SEC_LINKER_CREATED
1326 | SEC_HAS_CONTENTS
1327 | SEC_IN_MEMORY
1328 | SEC_READONLY));
1329 if (s == NULL
1330 || !bfd_set_section_alignment (abfd, s, 3))
1331 return FALSE;
1332 ia64_info->note_sec = s;
1333
1334 elf_hash_table (info)->dynamic_sections_created = TRUE;
1335 return TRUE;
1336}
1337
1338/* Find and/or create a hash entry for local symbol. */
1339static struct elf64_ia64_local_hash_entry *
1340get_local_sym_hash (struct elf64_ia64_link_hash_table *ia64_info,
1341 bfd *abfd, const Elf_Internal_Rela *rel,
1342 bfd_boolean create)
1343{
1344 struct elf64_ia64_local_hash_entry e, *ret;
1345 asection *sec = abfd->sections;
1346 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
1347 ELF64_R_SYM (rel->r_info));
1348 void **slot;
1349
1350 e.id = sec->id;
1351 e.r_sym = ELF64_R_SYM (rel->r_info);
1352 slot = htab_find_slot_with_hash (ia64_info->loc_hash_table, &e, h,
1353 create ? INSERT : NO_INSERT);
1354
1355 if (!slot)
1356 return NULL;
1357
1358 if (*slot)
1359 return (struct elf64_ia64_local_hash_entry *) *slot;
1360
1361 ret = (struct elf64_ia64_local_hash_entry *)
1362 objalloc_alloc ((struct objalloc *) ia64_info->loc_hash_memory,
1363 sizeof (struct elf64_ia64_local_hash_entry));
1364 if (ret)
1365 {
1366 memset (ret, 0, sizeof (*ret));
1367 ret->id = sec->id;
1368 ret->r_sym = ELF64_R_SYM (rel->r_info);
1369 *slot = ret;
1370 }
1371 return ret;
1372}
1373
1374/* Used to sort elf64_ia64_dyn_sym_info array. */
1375
1376static int
1377addend_compare (const void *xp, const void *yp)
1378{
1379 const struct elf64_ia64_dyn_sym_info *x
1380 = (const struct elf64_ia64_dyn_sym_info *) xp;
1381 const struct elf64_ia64_dyn_sym_info *y
1382 = (const struct elf64_ia64_dyn_sym_info *) yp;
1383
1384 return x->addend < y->addend ? -1 : x->addend > y->addend ? 1 : 0;
1385}
1386
1387/* Sort elf64_ia64_dyn_sym_info array and remove duplicates. */
1388
1389static unsigned int
1390sort_dyn_sym_info (struct elf64_ia64_dyn_sym_info *info,
1391 unsigned int count)
1392{
1393 bfd_vma curr, prev, got_offset;
1394 unsigned int i, kept, dupes, diff, dest, src, len;
1395
1396 qsort (info, count, sizeof (*info), addend_compare);
1397
1398 /* Find the first duplicate. */
1399 prev = info [0].addend;
1400 got_offset = info [0].got_offset;
1401 for (i = 1; i < count; i++)
1402 {
1403 curr = info [i].addend;
1404 if (curr == prev)
1405 {
1406 /* For duplicates, make sure that GOT_OFFSET is valid. */
1407 if (got_offset == (bfd_vma) -1)
1408 got_offset = info [i].got_offset;
1409 break;
1410 }
1411 got_offset = info [i].got_offset;
1412 prev = curr;
1413 }
1414
1415 /* We may move a block of elements to here. */
1416 dest = i++;
1417
1418 /* Remove duplicates. */
1419 if (i < count)
1420 {
1421 while (i < count)
1422 {
1423 /* For duplicates, make sure that the kept one has a valid
1424 got_offset. */
1425 kept = dest - 1;
1426 if (got_offset != (bfd_vma) -1)
1427 info [kept].got_offset = got_offset;
1428
1429 curr = info [i].addend;
1430 got_offset = info [i].got_offset;
1431
1432 /* Move a block of elements whose first one is different from
1433 the previous. */
1434 if (curr == prev)
1435 {
1436 for (src = i + 1; src < count; src++)
1437 {
1438 if (info [src].addend != curr)
1439 break;
1440 /* For duplicates, make sure that GOT_OFFSET is
1441 valid. */
1442 if (got_offset == (bfd_vma) -1)
1443 got_offset = info [src].got_offset;
1444 }
1445
1446 /* Make sure that the kept one has a valid got_offset. */
1447 if (got_offset != (bfd_vma) -1)
1448 info [kept].got_offset = got_offset;
1449 }
1450 else
1451 src = i;
1452
1453 if (src >= count)
1454 break;
1455
1456 /* Find the next duplicate. SRC will be kept. */
1457 prev = info [src].addend;
1458 got_offset = info [src].got_offset;
1459 for (dupes = src + 1; dupes < count; dupes ++)
1460 {
1461 curr = info [dupes].addend;
1462 if (curr == prev)
1463 {
1464 /* Make sure that got_offset is valid. */
1465 if (got_offset == (bfd_vma) -1)
1466 got_offset = info [dupes].got_offset;
1467
1468 /* For duplicates, make sure that the kept one has
1469 a valid got_offset. */
1470 if (got_offset != (bfd_vma) -1)
1471 info [dupes - 1].got_offset = got_offset;
1472 break;
1473 }
1474 got_offset = info [dupes].got_offset;
1475 prev = curr;
1476 }
1477
1478 /* How much to move. */
1479 len = dupes - src;
1480 i = dupes + 1;
1481
1482 if (len == 1 && dupes < count)
1483 {
1484 /* If we only move 1 element, we combine it with the next
1485 one. There must be at least a duplicate. Find the
1486 next different one. */
1487 for (diff = dupes + 1, src++; diff < count; diff++, src++)
1488 {
1489 if (info [diff].addend != curr)
1490 break;
1491 /* Make sure that got_offset is valid. */
1492 if (got_offset == (bfd_vma) -1)
1493 got_offset = info [diff].got_offset;
1494 }
1495
1496 /* Makre sure that the last duplicated one has an valid
1497 offset. */
1498 BFD_ASSERT (curr == prev);
1499 if (got_offset != (bfd_vma) -1)
1500 info [diff - 1].got_offset = got_offset;
1501
1502 if (diff < count)
1503 {
1504 /* Find the next duplicate. Track the current valid
1505 offset. */
1506 prev = info [diff].addend;
1507 got_offset = info [diff].got_offset;
1508 for (dupes = diff + 1; dupes < count; dupes ++)
1509 {
1510 curr = info [dupes].addend;
1511 if (curr == prev)
1512 {
1513 /* For duplicates, make sure that GOT_OFFSET
1514 is valid. */
1515 if (got_offset == (bfd_vma) -1)
1516 got_offset = info [dupes].got_offset;
1517 break;
1518 }
1519 got_offset = info [dupes].got_offset;
1520 prev = curr;
1521 diff++;
1522 }
1523
1524 len = diff - src + 1;
1525 i = diff + 1;
1526 }
1527 }
1528
1529 memmove (&info [dest], &info [src], len * sizeof (*info));
1530
1531 dest += len;
1532 }
1533
1534 count = dest;
1535 }
1536 else
1537 {
1538 /* When we get here, either there is no duplicate at all or
1539 the only duplicate is the last element. */
1540 if (dest < count)
1541 {
1542 /* If the last element is a duplicate, make sure that the
1543 kept one has a valid got_offset. We also update count. */
1544 if (got_offset != (bfd_vma) -1)
1545 info [dest - 1].got_offset = got_offset;
1546 count = dest;
1547 }
1548 }
1549
1550 return count;
1551}
1552
1553/* Find and/or create a descriptor for dynamic symbol info. This will
1554 vary based on global or local symbol, and the addend to the reloc.
1555
1556 We don't sort when inserting. Also, we sort and eliminate
1557 duplicates if there is an unsorted section. Typically, this will
1558 only happen once, because we do all insertions before lookups. We
1559 then use bsearch to do a lookup. This also allows lookups to be
1560 fast. So we have fast insertion (O(log N) due to duplicate check),
1561 fast lookup (O(log N)) and one sort (O(N log N) expected time).
1562 Previously, all lookups were O(N) because of the use of the linked
1563 list and also all insertions were O(N) because of the check for
1564 duplicates. There are some complications here because the array
1565 size grows occasionally, which may add an O(N) factor, but this
1566 should be rare. Also, we free the excess array allocation, which
1567 requires a copy which is O(N), but this only happens once. */
1568
1569static struct elf64_ia64_dyn_sym_info *
1570get_dyn_sym_info (struct elf64_ia64_link_hash_table *ia64_info,
1571 struct elf_link_hash_entry *h, bfd *abfd,
1572 const Elf_Internal_Rela *rel, bfd_boolean create)
1573{
1574 struct elf64_ia64_dyn_sym_info **info_p, *info, *dyn_i, key;
1575 unsigned int *count_p, *sorted_count_p, *size_p;
1576 unsigned int count, sorted_count, size;
1577 bfd_vma addend = rel ? rel->r_addend : 0;
1578 bfd_size_type amt;
1579
1580 if (h)
1581 {
1582 struct elf64_ia64_link_hash_entry *global_h;
1583
1584 global_h = (struct elf64_ia64_link_hash_entry *) h;
1585 info_p = &global_h->info;
1586 count_p = &global_h->count;
1587 sorted_count_p = &global_h->sorted_count;
1588 size_p = &global_h->size;
1589 }
1590 else
1591 {
1592 struct elf64_ia64_local_hash_entry *loc_h;
1593
1594 loc_h = get_local_sym_hash (ia64_info, abfd, rel, create);
1595 if (!loc_h)
1596 {
1597 BFD_ASSERT (!create);
1598 return NULL;
1599 }
1600
1601 info_p = &loc_h->info;
1602 count_p = &loc_h->count;
1603 sorted_count_p = &loc_h->sorted_count;
1604 size_p = &loc_h->size;
1605 }
1606
1607 count = *count_p;
1608 sorted_count = *sorted_count_p;
1609 size = *size_p;
1610 info = *info_p;
1611 if (create)
1612 {
1613 /* When we create the array, we don't check for duplicates,
1614 except in the previously sorted section if one exists, and
1615 against the last inserted entry. This allows insertions to
1616 be fast. */
1617 if (info)
1618 {
1619 if (sorted_count)
1620 {
1621 /* Try bsearch first on the sorted section. */
1622 key.addend = addend;
1623 dyn_i = bsearch (&key, info, sorted_count,
1624 sizeof (*info), addend_compare);
1625
1626 if (dyn_i)
1627 {
1628 return dyn_i;
1629 }
1630 }
1631
1632 /* Do a quick check for the last inserted entry. */
1633 dyn_i = info + count - 1;
1634 if (dyn_i->addend == addend)
1635 {
1636 return dyn_i;
1637 }
1638 }
1639
1640 if (size == 0)
1641 {
1642 /* It is the very first element. We create the array of size
1643 1. */
1644 size = 1;
1645 amt = size * sizeof (*info);
1646 info = bfd_malloc (amt);
1647 }
1648 else if (size <= count)
1649 {
1650 /* We double the array size every time when we reach the
1651 size limit. */
1652 size += size;
1653 amt = size * sizeof (*info);
1654 info = bfd_realloc (info, amt);
1655 }
1656 else
1657 goto has_space;
1658
1659 if (info == NULL)
1660 return NULL;
1661 *size_p = size;
1662 *info_p = info;
1663
1664has_space:
1665 /* Append the new one to the array. */
1666 dyn_i = info + count;
1667 memset (dyn_i, 0, sizeof (*dyn_i));
1668 dyn_i->got_offset = (bfd_vma) -1;
1669 dyn_i->addend = addend;
1670
1671 /* We increment count only since the new ones are unsorted and
1672 may have duplicate. */
1673 (*count_p)++;
1674 }
1675 else
1676 {
1677 /* It is a lookup without insertion. Sort array if part of the
1678 array isn't sorted. */
1679 if (count != sorted_count)
1680 {
1681 count = sort_dyn_sym_info (info, count);
1682 *count_p = count;
1683 *sorted_count_p = count;
1684 }
1685
1686 /* Free unused memory. */
1687 if (size != count)
1688 {
1689 amt = count * sizeof (*info);
1690 info = bfd_malloc (amt);
1691 if (info != NULL)
1692 {
1693 memcpy (info, *info_p, amt);
1694 free (*info_p);
1695 *size_p = count;
1696 *info_p = info;
1697 }
1698 }
1699
1700 key.addend = addend;
1701 dyn_i = bsearch (&key, info, count,
1702 sizeof (*info), addend_compare);
1703 }
1704
1705 return dyn_i;
1706}
1707
1708static asection *
1709get_got (bfd *abfd, struct elf64_ia64_link_hash_table *ia64_info)
1710{
1711 asection *got;
1712 bfd *dynobj;
1713
1714 got = ia64_info->root.sgot;
1715 if (!got)
1716 {
1717 flagword flags;
1718
1719 dynobj = ia64_info->root.dynobj;
1720 if (!dynobj)
1721 ia64_info->root.dynobj = dynobj = abfd;
1722
1723 /* The .got section is always aligned at 8 bytes. */
1724 flags = get_elf_backend_data (dynobj)->dynamic_sec_flags;
3d4d4302
AM
1725 got = bfd_make_section_anyway_with_flags (dynobj, ".got",
1726 flags | SEC_SMALL_DATA);
202e2356
NC
1727 if (got == NULL
1728 || !bfd_set_section_alignment (dynobj, got, 3))
1729 return NULL;
1730 ia64_info->root.sgot = got;
1731 }
1732
1733 return got;
1734}
1735
1736/* Create function descriptor section (.opd). This section is called .opd
1737 because it contains "official procedure descriptors". The "official"
1738 refers to the fact that these descriptors are used when taking the address
1739 of a procedure, thus ensuring a unique address for each procedure. */
1740
1741static asection *
1742get_fptr (bfd *abfd, struct bfd_link_info *info,
1743 struct elf64_ia64_link_hash_table *ia64_info)
1744{
1745 asection *fptr;
1746 bfd *dynobj;
1747
1748 fptr = ia64_info->fptr_sec;
1749 if (!fptr)
1750 {
1751 dynobj = ia64_info->root.dynobj;
1752 if (!dynobj)
1753 ia64_info->root.dynobj = dynobj = abfd;
1754
3d4d4302
AM
1755 fptr = bfd_make_section_anyway_with_flags (dynobj, ".opd",
1756 (SEC_ALLOC
1757 | SEC_LOAD
1758 | SEC_HAS_CONTENTS
1759 | SEC_IN_MEMORY
1760 | (info->pie ? 0
1761 : SEC_READONLY)
1762 | SEC_LINKER_CREATED));
202e2356
NC
1763 if (!fptr
1764 || !bfd_set_section_alignment (dynobj, fptr, 4))
1765 {
1766 BFD_ASSERT (0);
1767 return NULL;
1768 }
1769
1770 ia64_info->fptr_sec = fptr;
1771
1772 if (info->pie)
1773 {
1774 asection *fptr_rel;
3d4d4302
AM
1775 fptr_rel = bfd_make_section_anyway_with_flags (dynobj, ".rela.opd",
1776 (SEC_ALLOC | SEC_LOAD
1777 | SEC_HAS_CONTENTS
1778 | SEC_IN_MEMORY
1779 | SEC_LINKER_CREATED
1780 | SEC_READONLY));
202e2356
NC
1781 if (fptr_rel == NULL
1782 || !bfd_set_section_alignment (dynobj, fptr_rel, 3))
1783 {
1784 BFD_ASSERT (0);
1785 return NULL;
1786 }
1787
1788 ia64_info->rel_fptr_sec = fptr_rel;
1789 }
1790 }
1791
1792 return fptr;
1793}
1794
1795static asection *
1796get_pltoff (bfd *abfd, struct elf64_ia64_link_hash_table *ia64_info)
1797{
1798 asection *pltoff;
1799 bfd *dynobj;
1800
1801 pltoff = ia64_info->pltoff_sec;
1802 if (!pltoff)
1803 {
1804 dynobj = ia64_info->root.dynobj;
1805 if (!dynobj)
1806 ia64_info->root.dynobj = dynobj = abfd;
1807
3d4d4302
AM
1808 pltoff = bfd_make_section_anyway_with_flags (dynobj,
1809 ELF_STRING_ia64_pltoff,
1810 (SEC_ALLOC
1811 | SEC_LOAD
1812 | SEC_HAS_CONTENTS
1813 | SEC_IN_MEMORY
1814 | SEC_SMALL_DATA
1815 | SEC_LINKER_CREATED));
202e2356
NC
1816 if (!pltoff
1817 || !bfd_set_section_alignment (dynobj, pltoff, 4))
1818 {
1819 BFD_ASSERT (0);
1820 return NULL;
1821 }
1822
1823 ia64_info->pltoff_sec = pltoff;
1824 }
1825
1826 return pltoff;
1827}
1828
1829static asection *
1830get_reloc_section (bfd *abfd,
1831 struct elf64_ia64_link_hash_table *ia64_info,
1832 asection *sec, bfd_boolean create)
1833{
1834 const char *srel_name;
1835 asection *srel;
1836 bfd *dynobj;
1837
1838 srel_name = (bfd_elf_string_from_elf_section
1839 (abfd, elf_elfheader(abfd)->e_shstrndx,
1840 _bfd_elf_single_rel_hdr (sec)->sh_name));
1841 if (srel_name == NULL)
1842 return NULL;
1843
1844 BFD_ASSERT ((CONST_STRNEQ (srel_name, ".rela")
1845 && strcmp (bfd_get_section_name (abfd, sec),
1846 srel_name+5) == 0)
1847 || (CONST_STRNEQ (srel_name, ".rel")
1848 && strcmp (bfd_get_section_name (abfd, sec),
1849 srel_name+4) == 0));
1850
1851 dynobj = ia64_info->root.dynobj;
1852 if (!dynobj)
1853 ia64_info->root.dynobj = dynobj = abfd;
1854
3d4d4302 1855 srel = bfd_get_linker_section (dynobj, srel_name);
202e2356
NC
1856 if (srel == NULL && create)
1857 {
3d4d4302
AM
1858 srel = bfd_make_section_anyway_with_flags (dynobj, srel_name,
1859 (SEC_ALLOC | SEC_LOAD
1860 | SEC_HAS_CONTENTS
1861 | SEC_IN_MEMORY
1862 | SEC_LINKER_CREATED
1863 | SEC_READONLY));
202e2356
NC
1864 if (srel == NULL
1865 || !bfd_set_section_alignment (dynobj, srel, 3))
1866 return NULL;
1867 }
1868
1869 return srel;
1870}
1871
1872static bfd_boolean
1873count_dyn_reloc (bfd *abfd, struct elf64_ia64_dyn_sym_info *dyn_i,
1874 asection *srel, int type)
1875{
1876 struct elf64_ia64_dyn_reloc_entry *rent;
1877
1878 for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
1879 if (rent->srel == srel && rent->type == type)
1880 break;
1881
1882 if (!rent)
1883 {
1884 rent = ((struct elf64_ia64_dyn_reloc_entry *)
1885 bfd_alloc (abfd, (bfd_size_type) sizeof (*rent)));
1886 if (!rent)
1887 return FALSE;
1888
1889 rent->next = dyn_i->reloc_entries;
1890 rent->srel = srel;
1891 rent->type = type;
1892 rent->count = 0;
1893 dyn_i->reloc_entries = rent;
1894 }
1895 rent->count++;
1896
1897 return TRUE;
1898}
1899
1900static bfd_boolean
1901elf64_ia64_check_relocs (bfd *abfd, struct bfd_link_info *info,
1902 asection *sec,
1903 const Elf_Internal_Rela *relocs)
1904{
1905 struct elf64_ia64_link_hash_table *ia64_info;
1906 const Elf_Internal_Rela *relend;
1907 Elf_Internal_Shdr *symtab_hdr;
1908 const Elf_Internal_Rela *rel;
1909 asection *got, *fptr, *srel, *pltoff;
1910 enum {
1911 NEED_GOT = 1,
1912 NEED_GOTX = 2,
1913 NEED_FPTR = 4,
1914 NEED_PLTOFF = 8,
1915 NEED_MIN_PLT = 16,
1916 NEED_FULL_PLT = 32,
1917 NEED_DYNREL = 64,
1918 NEED_LTOFF_FPTR = 128
1919 };
1920 int need_entry;
1921 struct elf_link_hash_entry *h;
1922 unsigned long r_symndx;
1923 bfd_boolean maybe_dynamic;
1924
1925 if (info->relocatable)
1926 return TRUE;
1927
1928 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1929 ia64_info = elf64_ia64_hash_table (info);
1930 if (ia64_info == NULL)
1931 return FALSE;
1932
1933 got = fptr = srel = pltoff = NULL;
1934
1935 relend = relocs + sec->reloc_count;
1936
1937 /* We scan relocations first to create dynamic relocation arrays. We
1938 modified get_dyn_sym_info to allow fast insertion and support fast
1939 lookup in the next loop. */
1940 for (rel = relocs; rel < relend; ++rel)
1941 {
1942 r_symndx = ELF64_R_SYM (rel->r_info);
1943 if (r_symndx >= symtab_hdr->sh_info)
1944 {
1945 long indx = r_symndx - symtab_hdr->sh_info;
1946 h = elf_sym_hashes (abfd)[indx];
1947 while (h->root.type == bfd_link_hash_indirect
1948 || h->root.type == bfd_link_hash_warning)
1949 h = (struct elf_link_hash_entry *) h->root.u.i.link;
1950 }
1951 else
1952 h = NULL;
1953
1954 /* We can only get preliminary data on whether a symbol is
1955 locally or externally defined, as not all of the input files
1956 have yet been processed. Do something with what we know, as
1957 this may help reduce memory usage and processing time later. */
1958 maybe_dynamic = (h && ((!info->executable
1959 && (!SYMBOLIC_BIND (info, h)
1960 || info->unresolved_syms_in_shared_libs == RM_IGNORE))
1961 || !h->def_regular
1962 || h->root.type == bfd_link_hash_defweak));
1963
1964 need_entry = 0;
1965 switch (ELF64_R_TYPE (rel->r_info))
1966 {
1967 case R_IA64_TPREL64MSB:
1968 case R_IA64_TPREL64LSB:
1969 case R_IA64_LTOFF_TPREL22:
1970 case R_IA64_DTPREL32MSB:
1971 case R_IA64_DTPREL32LSB:
1972 case R_IA64_DTPREL64MSB:
1973 case R_IA64_DTPREL64LSB:
1974 case R_IA64_LTOFF_DTPREL22:
1975 case R_IA64_DTPMOD64MSB:
1976 case R_IA64_DTPMOD64LSB:
1977 case R_IA64_LTOFF_DTPMOD22:
1978 abort ();
1979 break;
1980
1981 case R_IA64_IPLTMSB:
1982 case R_IA64_IPLTLSB:
1983 break;
1984
1985 case R_IA64_LTOFF_FPTR22:
1986 case R_IA64_LTOFF_FPTR64I:
1987 case R_IA64_LTOFF_FPTR32MSB:
1988 case R_IA64_LTOFF_FPTR32LSB:
1989 case R_IA64_LTOFF_FPTR64MSB:
1990 case R_IA64_LTOFF_FPTR64LSB:
1991 need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
1992 break;
1993
1994 case R_IA64_FPTR64I:
1995 case R_IA64_FPTR32MSB:
1996 case R_IA64_FPTR32LSB:
1997 case R_IA64_FPTR64MSB:
1998 case R_IA64_FPTR64LSB:
1999 if (info->shared || h)
2000 need_entry = NEED_FPTR | NEED_DYNREL;
2001 else
2002 need_entry = NEED_FPTR;
2003 break;
2004
2005 case R_IA64_LTOFF22:
2006 case R_IA64_LTOFF64I:
2007 need_entry = NEED_GOT;
2008 break;
2009
2010 case R_IA64_LTOFF22X:
2011 need_entry = NEED_GOTX;
2012 break;
2013
2014 case R_IA64_PLTOFF22:
2015 case R_IA64_PLTOFF64I:
2016 case R_IA64_PLTOFF64MSB:
2017 case R_IA64_PLTOFF64LSB:
2018 need_entry = NEED_PLTOFF;
2019 if (h)
2020 {
2021 if (maybe_dynamic)
2022 need_entry |= NEED_MIN_PLT;
2023 }
2024 else
2025 {
2026 (*info->callbacks->warning)
2027 (info, _("@pltoff reloc against local symbol"), 0,
2028 abfd, 0, (bfd_vma) 0);
2029 }
2030 break;
2031
2032 case R_IA64_PCREL21B:
2033 case R_IA64_PCREL60B:
2034 /* Depending on where this symbol is defined, we may or may not
2035 need a full plt entry. Only skip if we know we'll not need
2036 the entry -- static or symbolic, and the symbol definition
2037 has already been seen. */
2038 if (maybe_dynamic && rel->r_addend == 0)
2039 need_entry = NEED_FULL_PLT;
2040 break;
2041
2042 case R_IA64_IMM14:
2043 case R_IA64_IMM22:
2044 case R_IA64_IMM64:
2045 case R_IA64_DIR32MSB:
2046 case R_IA64_DIR32LSB:
2047 case R_IA64_DIR64MSB:
2048 case R_IA64_DIR64LSB:
2049 /* Shared objects will always need at least a REL relocation. */
2050 if (info->shared || maybe_dynamic)
2051 need_entry = NEED_DYNREL;
2052 break;
2053
2054 case R_IA64_PCREL22:
2055 case R_IA64_PCREL64I:
2056 case R_IA64_PCREL32MSB:
2057 case R_IA64_PCREL32LSB:
2058 case R_IA64_PCREL64MSB:
2059 case R_IA64_PCREL64LSB:
2060 if (maybe_dynamic)
2061 need_entry = NEED_DYNREL;
2062 break;
2063 }
2064
2065 if (!need_entry)
2066 continue;
2067
2068 if ((need_entry & NEED_FPTR) != 0
2069 && rel->r_addend)
2070 {
2071 (*info->callbacks->warning)
2072 (info, _("non-zero addend in @fptr reloc"), 0,
2073 abfd, 0, (bfd_vma) 0);
2074 }
2075
2076 if (get_dyn_sym_info (ia64_info, h, abfd, rel, TRUE) == NULL)
2077 return FALSE;
2078 }
2079
2080 /* Now, we only do lookup without insertion, which is very fast
2081 with the modified get_dyn_sym_info. */
2082 for (rel = relocs; rel < relend; ++rel)
2083 {
2084 struct elf64_ia64_dyn_sym_info *dyn_i;
2085 int dynrel_type = R_IA64_NONE;
2086
2087 r_symndx = ELF64_R_SYM (rel->r_info);
2088 if (r_symndx >= symtab_hdr->sh_info)
2089 {
2090 /* We're dealing with a global symbol -- find its hash entry
2091 and mark it as being referenced. */
2092 long indx = r_symndx - symtab_hdr->sh_info;
2093 h = elf_sym_hashes (abfd)[indx];
2094 while (h->root.type == bfd_link_hash_indirect
2095 || h->root.type == bfd_link_hash_warning)
2096 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2097
2098 h->ref_regular = 1;
2099 }
2100 else
2101 h = NULL;
2102
2103 /* We can only get preliminary data on whether a symbol is
2104 locally or externally defined, as not all of the input files
2105 have yet been processed. Do something with what we know, as
2106 this may help reduce memory usage and processing time later. */
2107 maybe_dynamic = (h && ((!info->executable
2108 && (!SYMBOLIC_BIND (info, h)
2109 || info->unresolved_syms_in_shared_libs == RM_IGNORE))
2110 || !h->def_regular
2111 || h->root.type == bfd_link_hash_defweak));
2112
2113 need_entry = 0;
2114 switch (ELF64_R_TYPE (rel->r_info))
2115 {
2116 case R_IA64_TPREL64MSB:
2117 case R_IA64_TPREL64LSB:
2118 case R_IA64_LTOFF_TPREL22:
2119 case R_IA64_DTPREL32MSB:
2120 case R_IA64_DTPREL32LSB:
2121 case R_IA64_DTPREL64MSB:
2122 case R_IA64_DTPREL64LSB:
2123 case R_IA64_LTOFF_DTPREL22:
2124 case R_IA64_DTPMOD64MSB:
2125 case R_IA64_DTPMOD64LSB:
2126 case R_IA64_LTOFF_DTPMOD22:
2127 abort ();
2128 break;
2129
2130 case R_IA64_LTOFF_FPTR22:
2131 case R_IA64_LTOFF_FPTR64I:
2132 case R_IA64_LTOFF_FPTR32MSB:
2133 case R_IA64_LTOFF_FPTR32LSB:
2134 case R_IA64_LTOFF_FPTR64MSB:
2135 case R_IA64_LTOFF_FPTR64LSB:
2136 need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
2137 break;
2138
2139 case R_IA64_FPTR64I:
2140 case R_IA64_FPTR32MSB:
2141 case R_IA64_FPTR32LSB:
2142 case R_IA64_FPTR64MSB:
2143 case R_IA64_FPTR64LSB:
2144 if (info->shared || h)
2145 need_entry = NEED_FPTR | NEED_DYNREL;
2146 else
2147 need_entry = NEED_FPTR;
2148 dynrel_type = R_IA64_FPTR64LSB;
2149 break;
2150
2151 case R_IA64_LTOFF22:
2152 case R_IA64_LTOFF64I:
2153 need_entry = NEED_GOT;
2154 break;
2155
2156 case R_IA64_LTOFF22X:
2157 need_entry = NEED_GOTX;
2158 break;
2159
2160 case R_IA64_PLTOFF22:
2161 case R_IA64_PLTOFF64I:
2162 case R_IA64_PLTOFF64MSB:
2163 case R_IA64_PLTOFF64LSB:
2164 need_entry = NEED_PLTOFF;
2165 if (h)
2166 {
2167 if (maybe_dynamic)
2168 need_entry |= NEED_MIN_PLT;
2169 }
2170 break;
2171
2172 case R_IA64_PCREL21B:
2173 case R_IA64_PCREL60B:
2174 /* Depending on where this symbol is defined, we may or may not
2175 need a full plt entry. Only skip if we know we'll not need
2176 the entry -- static or symbolic, and the symbol definition
2177 has already been seen. */
2178 if (maybe_dynamic && rel->r_addend == 0)
2179 need_entry = NEED_FULL_PLT;
2180 break;
2181
2182 case R_IA64_IMM14:
2183 case R_IA64_IMM22:
2184 case R_IA64_IMM64:
2185 case R_IA64_DIR32MSB:
2186 case R_IA64_DIR32LSB:
2187 case R_IA64_DIR64MSB:
2188 case R_IA64_DIR64LSB:
2189 /* Shared objects will always need at least a REL relocation. */
2190 if (info->shared || maybe_dynamic)
2191 need_entry = NEED_DYNREL;
2192 dynrel_type = R_IA64_DIR64LSB;
2193 break;
2194
2195 case R_IA64_IPLTMSB:
2196 case R_IA64_IPLTLSB:
2197 break;
2198
2199 case R_IA64_PCREL22:
2200 case R_IA64_PCREL64I:
2201 case R_IA64_PCREL32MSB:
2202 case R_IA64_PCREL32LSB:
2203 case R_IA64_PCREL64MSB:
2204 case R_IA64_PCREL64LSB:
2205 if (maybe_dynamic)
2206 need_entry = NEED_DYNREL;
2207 dynrel_type = R_IA64_PCREL64LSB;
2208 break;
2209 }
2210
2211 if (!need_entry)
2212 continue;
2213
2214 dyn_i = get_dyn_sym_info (ia64_info, h, abfd, rel, FALSE);
2215
2216 /* Record whether or not this is a local symbol. */
2217 dyn_i->h = h;
2218
2219 /* Create what's needed. */
2220 if (need_entry & (NEED_GOT | NEED_GOTX))
2221 {
2222 if (!got)
2223 {
2224 got = get_got (abfd, ia64_info);
2225 if (!got)
2226 return FALSE;
2227 }
2228 if (need_entry & NEED_GOT)
2229 dyn_i->want_got = 1;
2230 if (need_entry & NEED_GOTX)
2231 dyn_i->want_gotx = 1;
2232 }
2233 if (need_entry & NEED_FPTR)
2234 {
2235 /* Create the .opd section. */
2236 if (!fptr)
2237 {
2238 fptr = get_fptr (abfd, info, ia64_info);
2239 if (!fptr)
2240 return FALSE;
2241 }
2242 dyn_i->want_fptr = 1;
2243 }
2244 if (need_entry & NEED_LTOFF_FPTR)
2245 dyn_i->want_ltoff_fptr = 1;
2246 if (need_entry & (NEED_MIN_PLT | NEED_FULL_PLT))
2247 {
2248 if (!ia64_info->root.dynobj)
2249 ia64_info->root.dynobj = abfd;
2250 h->needs_plt = 1;
2251 dyn_i->want_plt = 1;
2252 }
2253 if (need_entry & NEED_FULL_PLT)
2254 dyn_i->want_plt2 = 1;
2255 if (need_entry & NEED_PLTOFF)
2256 {
2257 /* This is needed here, in case @pltoff is used in a non-shared
2258 link. */
2259 if (!pltoff)
2260 {
2261 pltoff = get_pltoff (abfd, ia64_info);
2262 if (!pltoff)
2263 return FALSE;
2264 }
2265
2266 dyn_i->want_pltoff = 1;
2267 }
2268 if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
2269 {
2270 if (!srel)
2271 {
2272 srel = get_reloc_section (abfd, ia64_info, sec, TRUE);
2273 if (!srel)
2274 return FALSE;
2275 }
2276 if (!count_dyn_reloc (abfd, dyn_i, srel, dynrel_type))
2277 return FALSE;
2278 }
2279 }
2280
2281 return TRUE;
2282}
2283
2284/* For cleanliness, and potentially faster dynamic loading, allocate
2285 external GOT entries first. */
2286
2287static bfd_boolean
2288allocate_global_data_got (struct elf64_ia64_dyn_sym_info *dyn_i,
2289 void * data)
2290{
2291 struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
2292
2293 if ((dyn_i->want_got || dyn_i->want_gotx)
2294 && ! dyn_i->want_fptr
2295 && elf64_ia64_dynamic_symbol_p (dyn_i->h))
2296 {
2297 /* GOT entry with FPTR is done by allocate_global_fptr_got. */
2298 dyn_i->got_offset = x->ofs;
2299 x->ofs += 8;
2300 }
2301 return TRUE;
2302}
2303
2304/* Next, allocate all the GOT entries used by LTOFF_FPTR relocs. */
2305
2306static bfd_boolean
2307allocate_global_fptr_got (struct elf64_ia64_dyn_sym_info *dyn_i,
2308 void * data)
2309{
2310 struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
2311
2312 if (dyn_i->want_got
2313 && dyn_i->want_fptr
2314 && elf64_ia64_dynamic_symbol_p (dyn_i->h))
2315 {
2316 dyn_i->got_offset = x->ofs;
2317 x->ofs += 8;
2318 }
2319 return TRUE;
2320}
2321
2322/* Lastly, allocate all the GOT entries for local data. */
2323
2324static bfd_boolean
2325allocate_local_got (struct elf64_ia64_dyn_sym_info *dyn_i,
2326 void * data)
2327{
2328 struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *) data;
2329
2330 if ((dyn_i->want_got || dyn_i->want_gotx)
2331 && !elf64_ia64_dynamic_symbol_p (dyn_i->h))
2332 {
2333 dyn_i->got_offset = x->ofs;
2334 x->ofs += 8;
2335 }
2336 return TRUE;
2337}
2338
2339/* Allocate function descriptors. We can do these for every function
2340 in a main executable that is not exported. */
2341
2342static bfd_boolean
2343allocate_fptr (struct elf64_ia64_dyn_sym_info *dyn_i, void * data)
2344{
2345 struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *) data;
2346
2347 if (dyn_i->want_fptr)
2348 {
2349 struct elf_link_hash_entry *h = dyn_i->h;
2350
2351 if (h)
2352 while (h->root.type == bfd_link_hash_indirect
2353 || h->root.type == bfd_link_hash_warning)
2354 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2355
2356 if (h == NULL || !h->def_dynamic)
2357 {
2358 /* A non dynamic symbol. */
2359 dyn_i->fptr_offset = x->ofs;
2360 x->ofs += 16;
2361 }
2362 else
2363 dyn_i->want_fptr = 0;
2364 }
2365 return TRUE;
2366}
2367
2368/* Allocate all the minimal PLT entries. */
2369
2370static bfd_boolean
2371allocate_plt_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
2372 void * data ATTRIBUTE_UNUSED)
2373{
2374 if (dyn_i->want_plt)
2375 {
2376 struct elf_link_hash_entry *h = dyn_i->h;
2377
2378 if (h)
2379 while (h->root.type == bfd_link_hash_indirect
2380 || h->root.type == bfd_link_hash_warning)
2381 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2382
2383 /* ??? Versioned symbols seem to lose NEEDS_PLT. */
2384 if (elf64_ia64_dynamic_symbol_p (h))
2385 {
2386 dyn_i->want_pltoff = 1;
2387 }
2388 else
2389 {
2390 dyn_i->want_plt = 0;
2391 dyn_i->want_plt2 = 0;
2392 }
2393 }
2394 return TRUE;
2395}
2396
2397/* Allocate all the full PLT entries. */
2398
2399static bfd_boolean
2400allocate_plt2_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
2401 void * data)
2402{
2403 struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
2404
2405 if (dyn_i->want_plt2)
2406 {
2407 struct elf_link_hash_entry *h = dyn_i->h;
2408 bfd_size_type ofs = x->ofs;
2409
2410 dyn_i->plt2_offset = ofs;
2411 x->ofs = ofs + PLT_FULL_ENTRY_SIZE;
2412
2413 while (h->root.type == bfd_link_hash_indirect
2414 || h->root.type == bfd_link_hash_warning)
2415 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2416 dyn_i->h->plt.offset = ofs;
2417 }
2418 return TRUE;
2419}
2420
2421/* Allocate all the PLTOFF entries requested by relocations and
2422 plt entries. We can't share space with allocated FPTR entries,
2423 because the latter are not necessarily addressable by the GP.
2424 ??? Relaxation might be able to determine that they are. */
2425
2426static bfd_boolean
2427allocate_pltoff_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
2428 void * data)
2429{
2430 struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
2431
2432 if (dyn_i->want_pltoff)
2433 {
2434 dyn_i->pltoff_offset = x->ofs;
2435 x->ofs += 16;
2436 }
2437 return TRUE;
2438}
2439
2440/* Allocate dynamic relocations for those symbols that turned out
2441 to be dynamic. */
2442
2443static bfd_boolean
2444allocate_dynrel_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
2445 void * data)
2446{
2447 struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
2448 struct elf64_ia64_link_hash_table *ia64_info;
2449 struct elf64_ia64_dyn_reloc_entry *rent;
2450 bfd_boolean dynamic_symbol, shared, resolved_zero;
2451 struct elf64_ia64_link_hash_entry *h_ia64;
2452
2453 ia64_info = elf64_ia64_hash_table (x->info);
2454 if (ia64_info == NULL)
2455 return FALSE;
2456
2457 /* Note that this can't be used in relation to FPTR relocs below. */
2458 dynamic_symbol = elf64_ia64_dynamic_symbol_p (dyn_i->h);
2459
2460 shared = x->info->shared;
2461 resolved_zero = (dyn_i->h
2462 && ELF_ST_VISIBILITY (dyn_i->h->other)
2463 && dyn_i->h->root.type == bfd_link_hash_undefweak);
2464
2465 /* Take care of the GOT and PLT relocations. */
2466
2467 if ((!resolved_zero
2468 && (dynamic_symbol || shared)
2469 && (dyn_i->want_got || dyn_i->want_gotx))
2470 || (dyn_i->want_ltoff_fptr
2471 && dyn_i->h
2472 && dyn_i->h->def_dynamic))
2473 {
2474 /* VMS: FIX64. */
2475 if (dyn_i->h != NULL && dyn_i->h->def_dynamic)
2476 {
2477 h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
2478 elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
2479 sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2480 ia64_info->fixups_sec->size +=
2481 sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2482 }
2483 }
2484
2485 if (ia64_info->rel_fptr_sec && dyn_i->want_fptr)
2486 {
2487 /* VMS: only image reloc. */
2488 if (dyn_i->h == NULL || dyn_i->h->root.type != bfd_link_hash_undefweak)
2489 ia64_info->rel_fptr_sec->size += sizeof (Elf64_External_Rela);
2490 }
2491
2492 if (!resolved_zero && dyn_i->want_pltoff)
2493 {
2494 /* VMS: FIXFD. */
2495 if (dyn_i->h != NULL && dyn_i->h->def_dynamic)
2496 {
2497 h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
2498 elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
2499 sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2500 ia64_info->fixups_sec->size +=
2501 sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2502 }
2503 }
2504
2505 /* Take care of the normal data relocations. */
2506
2507 for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
2508 {
2509 int count = rent->count;
2510
2511 switch (rent->type)
2512 {
2513 case R_IA64_FPTR32LSB:
2514 case R_IA64_FPTR64LSB:
2515 /* Allocate one iff !want_fptr and not PIE, which by this point
2516 will be true only if we're actually allocating one statically
2517 in the main executable. Position independent executables
2518 need a relative reloc. */
2519 if (dyn_i->want_fptr && !x->info->pie)
2520 continue;
2521 break;
2522 case R_IA64_PCREL32LSB:
2523 case R_IA64_PCREL64LSB:
2524 if (!dynamic_symbol)
2525 continue;
2526 break;
2527 case R_IA64_DIR32LSB:
2528 case R_IA64_DIR64LSB:
2529 if (!dynamic_symbol && !shared)
2530 continue;
2531 break;
2532 case R_IA64_IPLTLSB:
2533 if (!dynamic_symbol && !shared)
2534 continue;
2535 /* Use two REL relocations for IPLT relocations
2536 against local symbols. */
2537 if (!dynamic_symbol)
2538 count *= 2;
2539 break;
2540 case R_IA64_DTPREL32LSB:
2541 case R_IA64_TPREL64LSB:
2542 case R_IA64_DTPREL64LSB:
2543 case R_IA64_DTPMOD64LSB:
2544 break;
2545 default:
2546 abort ();
2547 }
2548
2549 /* Add a fixup. */
2550 if (!dynamic_symbol)
2551 abort ();
2552
2553 h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
2554 elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
2555 sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2556 ia64_info->fixups_sec->size +=
2557 sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2558 }
2559
2560 return TRUE;
2561}
2562
2563static bfd_boolean
2564elf64_ia64_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2565 struct elf_link_hash_entry *h)
2566{
2567 /* ??? Undefined symbols with PLT entries should be re-defined
2568 to be the PLT entry. */
2569
2570 /* If this is a weak symbol, and there is a real definition, the
2571 processor independent code will have arranged for us to see the
2572 real definition first, and we can just use the same value. */
2573 if (h->u.weakdef != NULL)
2574 {
2575 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2576 || h->u.weakdef->root.type == bfd_link_hash_defweak);
2577 h->root.u.def.section = h->u.weakdef->root.u.def.section;
2578 h->root.u.def.value = h->u.weakdef->root.u.def.value;
2579 return TRUE;
2580 }
2581
2582 /* If this is a reference to a symbol defined by a dynamic object which
2583 is not a function, we might allocate the symbol in our .dynbss section
2584 and allocate a COPY dynamic relocation.
2585
2586 But IA-64 code is canonically PIC, so as a rule we can avoid this sort
2587 of hackery. */
2588
2589 return TRUE;
2590}
2591
2592static bfd_boolean
2593elf64_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2594 struct bfd_link_info *info)
2595{
2596 struct elf64_ia64_allocate_data data;
2597 struct elf64_ia64_link_hash_table *ia64_info;
2598 asection *sec;
2599 bfd *dynobj;
2600 struct elf_link_hash_table *hash_table;
2601
2602 hash_table = elf_hash_table (info);
2603 dynobj = hash_table->dynobj;
2604 ia64_info = elf64_ia64_hash_table (info);
2605 if (ia64_info == NULL)
2606 return FALSE;
2607 BFD_ASSERT(dynobj != NULL);
2608 data.info = info;
2609
2610 /* Allocate the GOT entries. */
2611
2612 if (ia64_info->root.sgot)
2613 {
2614 data.ofs = 0;
2615 elf64_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data);
2616 elf64_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data);
2617 elf64_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data);
2618 ia64_info->root.sgot->size = data.ofs;
2619 }
2620
2621 /* Allocate the FPTR entries. */
2622
2623 if (ia64_info->fptr_sec)
2624 {
2625 data.ofs = 0;
2626 elf64_ia64_dyn_sym_traverse (ia64_info, allocate_fptr, &data);
2627 ia64_info->fptr_sec->size = data.ofs;
2628 }
2629
2630 /* Now that we've seen all of the input files, we can decide which
2631 symbols need plt entries. Allocate the minimal PLT entries first.
2632 We do this even though dynamic_sections_created may be FALSE, because
2633 this has the side-effect of clearing want_plt and want_plt2. */
2634
2635 data.ofs = 0;
2636 elf64_ia64_dyn_sym_traverse (ia64_info, allocate_plt_entries, &data);
2637
2638 /* Align the pointer for the plt2 entries. */
2639 data.ofs = (data.ofs + 31) & (bfd_vma) -32;
2640
2641 elf64_ia64_dyn_sym_traverse (ia64_info, allocate_plt2_entries, &data);
2642 if (data.ofs != 0 || ia64_info->root.dynamic_sections_created)
2643 {
2644 /* FIXME: we always reserve the memory for dynamic linker even if
2645 there are no PLT entries since dynamic linker may assume the
2646 reserved memory always exists. */
2647
2648 BFD_ASSERT (ia64_info->root.dynamic_sections_created);
2649
2650 ia64_info->root.splt->size = data.ofs;
2651 }
2652
2653 /* Allocate the PLTOFF entries. */
2654
2655 if (ia64_info->pltoff_sec)
2656 {
2657 data.ofs = 0;
2658 elf64_ia64_dyn_sym_traverse (ia64_info, allocate_pltoff_entries, &data);
2659 ia64_info->pltoff_sec->size = data.ofs;
2660 }
2661
2662 if (ia64_info->root.dynamic_sections_created)
2663 {
2664 /* Allocate space for the dynamic relocations that turned out to be
2665 required. */
2666 elf64_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries, &data);
2667 }
2668
2669 /* We have now determined the sizes of the various dynamic sections.
2670 Allocate memory for them. */
2671 for (sec = dynobj->sections; sec != NULL; sec = sec->next)
2672 {
2673 bfd_boolean strip;
2674
2675 if (!(sec->flags & SEC_LINKER_CREATED))
2676 continue;
2677
2678 /* If we don't need this section, strip it from the output file.
2679 There were several sections primarily related to dynamic
2680 linking that must be create before the linker maps input
2681 sections to output sections. The linker does that before
2682 bfd_elf_size_dynamic_sections is called, and it is that
2683 function which decides whether anything needs to go into
2684 these sections. */
2685
2686 strip = (sec->size == 0);
2687
2688 if (sec == ia64_info->root.sgot)
2689 strip = FALSE;
2690 else if (sec == ia64_info->root.srelgot)
2691 {
2692 if (strip)
2693 ia64_info->root.srelgot = NULL;
2694 else
2695 /* We use the reloc_count field as a counter if we need to
2696 copy relocs into the output file. */
2697 sec->reloc_count = 0;
2698 }
2699 else if (sec == ia64_info->fptr_sec)
2700 {
2701 if (strip)
2702 ia64_info->fptr_sec = NULL;
2703 }
2704 else if (sec == ia64_info->rel_fptr_sec)
2705 {
2706 if (strip)
2707 ia64_info->rel_fptr_sec = NULL;
2708 else
2709 /* We use the reloc_count field as a counter if we need to
2710 copy relocs into the output file. */
2711 sec->reloc_count = 0;
2712 }
2713 else if (sec == ia64_info->root.splt)
2714 {
2715 if (strip)
2716 ia64_info->root.splt = NULL;
2717 }
2718 else if (sec == ia64_info->pltoff_sec)
2719 {
2720 if (strip)
2721 ia64_info->pltoff_sec = NULL;
2722 }
2723 else if (sec == ia64_info->fixups_sec)
2724 {
2725 if (strip)
2726 ia64_info->fixups_sec = NULL;
2727 }
2728 else if (sec == ia64_info->transfer_sec)
2729 {
2730 ;
2731 }
2732 else
2733 {
2734 const char *name;
2735
2736 /* It's OK to base decisions on the section name, because none
2737 of the dynobj section names depend upon the input files. */
2738 name = bfd_get_section_name (dynobj, sec);
2739
2740 if (strcmp (name, ".got.plt") == 0)
2741 strip = FALSE;
2742 else if (CONST_STRNEQ (name, ".rel"))
2743 {
2744 if (!strip)
2745 {
2746 /* We use the reloc_count field as a counter if we need to
2747 copy relocs into the output file. */
2748 sec->reloc_count = 0;
2749 }
2750 }
2751 else
2752 continue;
2753 }
2754
2755 if (strip)
2756 sec->flags |= SEC_EXCLUDE;
2757 else
2758 {
2759 /* Allocate memory for the section contents. */
2760 sec->contents = (bfd_byte *) bfd_zalloc (dynobj, sec->size);
2761 if (sec->contents == NULL && sec->size != 0)
2762 return FALSE;
2763 }
2764 }
2765
2766 if (elf_hash_table (info)->dynamic_sections_created)
2767 {
2768 bfd *abfd;
2769 asection *dynsec;
2770 asection *dynstrsec;
2771 Elf_Internal_Dyn dyn;
2772 const struct elf_backend_data *bed;
2773 unsigned int shl_num = 0;
2774 bfd_vma fixups_off = 0;
2775 bfd_vma strdyn_off;
2776 unsigned int time_hi, time_lo;
2777
2778 /* The .dynamic section must exist and be empty. */
3d4d4302 2779 dynsec = bfd_get_linker_section (hash_table->dynobj, ".dynamic");
202e2356
NC
2780 BFD_ASSERT (dynsec != NULL);
2781 BFD_ASSERT (dynsec->size == 0);
2782
3d4d4302 2783 dynstrsec = bfd_get_linker_section (hash_table->dynobj, ".vmsdynstr");
202e2356
NC
2784 BFD_ASSERT (dynstrsec != NULL);
2785 BFD_ASSERT (dynstrsec->size == 0);
2786 dynstrsec->size = 1; /* Initial blank. */
2787
2788 /* Ident + link time. */
2789 vms_get_time (&time_hi, &time_lo);
2790
2791 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_IDENT, 0))
2792 return FALSE;
2793 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_LINKTIME,
2794 (((bfd_uint64_t)time_hi) << 32)
2795 + time_lo))
2796 return FALSE;
2797
2798 /* Strtab. */
2799 strdyn_off = dynsec->size;
2800 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_STRTAB_OFFSET, 0))
2801 return FALSE;
2802 if (!_bfd_elf_add_dynamic_entry (info, DT_STRSZ, 0))
2803 return FALSE;
2804
2805 /* PLTGOT */
2806 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_PLTGOT_SEG, 0))
2807 return FALSE;
2808 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_PLTGOT_OFFSET, 0))
2809 return FALSE;
2810
2811 /* Misc. */
2812 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FPMODE, 0x9800000))
2813 return FALSE;
2814 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_LNKFLAGS,
2815 VMS_LF_IMGSTA | VMS_LF_MAIN))
2816 return FALSE;
2817
2818 /* Add entries for shared libraries. */
2819 for (abfd = info->input_bfds; abfd; abfd = abfd->link_next)
2820 {
2821 char *soname;
2822 size_t soname_len;
2823 bfd_size_type strindex;
2824 bfd_byte *newcontents;
2825 bfd_vma fixups_shl_off;
2826
2827 if (!(abfd->flags & DYNAMIC))
2828 continue;
2829 BFD_ASSERT (abfd->xvec == output_bfd->xvec);
2830
2831 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_NEEDED_IDENT,
2832 elf_ia64_vms_ident (abfd)))
2833 return FALSE;
2834
2835 soname = vms_get_module_name (abfd->filename, TRUE);
2836 if (soname == NULL)
2837 return FALSE;
2838 strindex = dynstrsec->size;
2839 soname_len = strlen (soname) + 1;
2840 newcontents = (bfd_byte *) bfd_realloc (dynstrsec->contents,
2841 strindex + soname_len);
2842 if (newcontents == NULL)
2843 return FALSE;
2844 memcpy (newcontents + strindex, soname, soname_len);
2845 dynstrsec->size += soname_len;
2846 dynstrsec->contents = newcontents;
2847
2848 if (!_bfd_elf_add_dynamic_entry (info, DT_NEEDED, strindex))
2849 return FALSE;
2850
2851 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FIXUP_NEEDED,
2852 shl_num))
2853 return FALSE;
2854 shl_num++;
2855
2856 /* The fixups_off was in fact containing the size of the fixup
2857 section. Remap into the offset. */
2858 fixups_shl_off = elf_ia64_vms_tdata (abfd)->fixups_off;
2859 elf_ia64_vms_tdata (abfd)->fixups_off = fixups_off;
2860
2861 if (!_bfd_elf_add_dynamic_entry
2862 (info, DT_IA_64_VMS_FIXUP_RELA_CNT,
2863 fixups_shl_off / sizeof (Elf64_External_VMS_IMAGE_FIXUP)))
2864 return FALSE;
2865 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FIXUP_RELA_OFF,
2866 fixups_off))
2867 return FALSE;
2868 fixups_off += fixups_shl_off;
2869 }
2870
2871 /* Unwind. */
2872 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWINDSZ, 0))
2873 return FALSE;
2874 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_CODSEG, 0))
2875 return FALSE;
2876 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_INFOSEG, 0))
2877 return FALSE;
2878 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_OFFSET, 0))
2879 return FALSE;
2880 if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_SEG, 0))
2881 return FALSE;
2882
2883 if (!_bfd_elf_add_dynamic_entry (info, DT_NULL, 0xdead))
2884 return FALSE;
2885
2886 /* Fix the strtab entries. */
2887 bed = get_elf_backend_data (hash_table->dynobj);
2888
2889 if (dynstrsec->size > 1)
2890 dynstrsec->contents[0] = 0;
2891 else
2892 dynstrsec->size = 0;
2893
2894 /* Note: one 'spare' (ie DT_NULL) entry is added by
2895 bfd_elf_size_dynsym_hash_dynstr. */
2896 dyn.d_tag = DT_IA_64_VMS_STRTAB_OFFSET;
2897 dyn.d_un.d_val = dynsec->size /* + sizeof (Elf64_External_Dyn) */;
2898 bed->s->swap_dyn_out (hash_table->dynobj, &dyn,
2899 dynsec->contents + strdyn_off);
2900
2901 dyn.d_tag = DT_STRSZ;
2902 dyn.d_un.d_val = dynstrsec->size;
2903 bed->s->swap_dyn_out (hash_table->dynobj, &dyn,
2904 dynsec->contents + strdyn_off + bed->s->sizeof_dyn);
2905
2906 elf_ia64_vms_tdata (output_bfd)->needed_count = shl_num;
2907
2908 /* Note section. */
2909 if (!create_ia64_vms_notes (output_bfd, info, time_hi, time_lo))
2910 return FALSE;
2911 }
2912
2913 /* ??? Perhaps force __gp local. */
2914
2915 return TRUE;
2916}
2917
2918static void
2919elf64_ia64_install_fixup (bfd *output_bfd,
2920 struct elf64_ia64_link_hash_table *ia64_info,
2921 struct elf_link_hash_entry *h,
2922 unsigned int type, asection *sec, bfd_vma offset,
2923 bfd_vma addend)
2924{
2925 asection *relsec;
2926 Elf64_External_VMS_IMAGE_FIXUP *fixup;
2927 struct elf64_ia64_link_hash_entry *h_ia64;
2928 bfd_vma fixoff;
2929 Elf_Internal_Phdr *phdr;
2930
2931 if (h == NULL || !h->def_dynamic)
2932 abort ();
2933
2934 h_ia64 = (struct elf64_ia64_link_hash_entry *) h;
2935 fixoff = elf_ia64_vms_tdata (h_ia64->shl)->fixups_off;
2936 elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
2937 sizeof (Elf64_External_VMS_IMAGE_FIXUP);
2938 relsec = ia64_info->fixups_sec;
2939
2940 fixup = (Elf64_External_VMS_IMAGE_FIXUP *)(relsec->contents + fixoff);
2941 offset += sec->output_section->vma + sec->output_offset;
2942
2943 /* FIXME: this is slow. We should cache the last one used, or create a
2944 map. */
2945 phdr = _bfd_elf_find_segment_containing_section
2946 (output_bfd, sec->output_section);
2947 BFD_ASSERT (phdr != NULL);
2948
2949 bfd_putl64 (offset - phdr->p_vaddr, fixup->fixup_offset);
2950 bfd_putl32 (type, fixup->type);
2951 bfd_putl32 (phdr - elf_tdata (output_bfd)->phdr, fixup->fixup_seg);
2952 bfd_putl64 (addend, fixup->addend);
2953 bfd_putl32 (h->root.u.def.value, fixup->symvec_index);
2954 bfd_putl32 (2, fixup->data_type);
2955}
2956
2957/* Store an entry for target address TARGET_ADDR in the linkage table
2958 and return the gp-relative address of the linkage table entry. */
2959
2960static bfd_vma
2961set_got_entry (bfd *abfd, struct bfd_link_info *info,
2962 struct elf64_ia64_dyn_sym_info *dyn_i,
2963 bfd_vma addend, bfd_vma value, unsigned int dyn_r_type)
2964{
2965 struct elf64_ia64_link_hash_table *ia64_info;
2966 asection *got_sec;
2967 bfd_boolean done;
2968 bfd_vma got_offset;
2969
2970 ia64_info = elf64_ia64_hash_table (info);
2971 if (ia64_info == NULL)
2972 return 0;
2973
2974 got_sec = ia64_info->root.sgot;
2975
2976 switch (dyn_r_type)
2977 {
2978 case R_IA64_TPREL64LSB:
2979 case R_IA64_DTPMOD64LSB:
2980 case R_IA64_DTPREL32LSB:
2981 case R_IA64_DTPREL64LSB:
2982 abort ();
2983 break;
2984 default:
2985 done = dyn_i->got_done;
2986 dyn_i->got_done = TRUE;
2987 got_offset = dyn_i->got_offset;
2988 break;
2989 }
2990
2991 BFD_ASSERT ((got_offset & 7) == 0);
2992
2993 if (! done)
2994 {
2995 /* Store the target address in the linkage table entry. */
2996 bfd_put_64 (abfd, value, got_sec->contents + got_offset);
2997
2998 /* Install a dynamic relocation if needed. */
2999 if (((info->shared
3000 && (!dyn_i->h
3001 || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
3002 || dyn_i->h->root.type != bfd_link_hash_undefweak))
3003 || elf64_ia64_dynamic_symbol_p (dyn_i->h))
3004 && (!dyn_i->want_ltoff_fptr
3005 || !info->pie
3006 || !dyn_i->h
3007 || dyn_i->h->root.type != bfd_link_hash_undefweak))
3008 {
3009 if (!dyn_i->h || !dyn_i->h->def_dynamic)
3010 {
3011 dyn_r_type = R_IA64_REL64LSB;
3012 addend = value;
3013 }
3014
3015 /* VMS: install a FIX32 or FIX64. */
3016 switch (dyn_r_type)
3017 {
3018 case R_IA64_DIR32LSB:
3019 case R_IA64_FPTR32LSB:
3020 dyn_r_type = R_IA64_VMS_FIX32;
3021 break;
3022 case R_IA64_DIR64LSB:
3023 case R_IA64_FPTR64LSB:
3024 dyn_r_type = R_IA64_VMS_FIX64;
3025 break;
3026 default:
3027 BFD_ASSERT (FALSE);
3028 break;
3029 }
3030 elf64_ia64_install_fixup
3031 (info->output_bfd, ia64_info, dyn_i->h,
3032 dyn_r_type, got_sec, got_offset, addend);
3033 }
3034 }
3035
3036 /* Return the address of the linkage table entry. */
3037 value = (got_sec->output_section->vma
3038 + got_sec->output_offset
3039 + got_offset);
3040
3041 return value;
3042}
3043
3044/* Fill in a function descriptor consisting of the function's code
3045 address and its global pointer. Return the descriptor's address. */
3046
3047static bfd_vma
3048set_fptr_entry (bfd *abfd, struct bfd_link_info *info,
3049 struct elf64_ia64_dyn_sym_info *dyn_i,
3050 bfd_vma value)
3051{
3052 struct elf64_ia64_link_hash_table *ia64_info;
3053 asection *fptr_sec;
3054
3055 ia64_info = elf64_ia64_hash_table (info);
3056 if (ia64_info == NULL)
3057 return 0;
3058
3059 fptr_sec = ia64_info->fptr_sec;
3060
3061 if (!dyn_i->fptr_done)
3062 {
3063 dyn_i->fptr_done = 1;
3064
3065 /* Fill in the function descriptor. */
3066 bfd_put_64 (abfd, value, fptr_sec->contents + dyn_i->fptr_offset);
3067 bfd_put_64 (abfd, _bfd_get_gp_value (abfd),
3068 fptr_sec->contents + dyn_i->fptr_offset + 8);
3069 }
3070
3071 /* Return the descriptor's address. */
3072 value = (fptr_sec->output_section->vma
3073 + fptr_sec->output_offset
3074 + dyn_i->fptr_offset);
3075
3076 return value;
3077}
3078
3079/* Fill in a PLTOFF entry consisting of the function's code address
3080 and its global pointer. Return the descriptor's address. */
3081
3082static bfd_vma
3083set_pltoff_entry (bfd *abfd, struct bfd_link_info *info,
3084 struct elf64_ia64_dyn_sym_info *dyn_i,
3085 bfd_vma value, bfd_boolean is_plt)
3086{
3087 struct elf64_ia64_link_hash_table *ia64_info;
3088 asection *pltoff_sec;
3089
3090 ia64_info = elf64_ia64_hash_table (info);
3091 if (ia64_info == NULL)
3092 return 0;
3093
3094 pltoff_sec = ia64_info->pltoff_sec;
3095
3096 /* Don't do anything if this symbol uses a real PLT entry. In
3097 that case, we'll fill this in during finish_dynamic_symbol. */
3098 if ((! dyn_i->want_plt || is_plt)
3099 && !dyn_i->pltoff_done)
3100 {
3101 bfd_vma gp = _bfd_get_gp_value (abfd);
3102
3103 /* Fill in the function descriptor. */
3104 bfd_put_64 (abfd, value, pltoff_sec->contents + dyn_i->pltoff_offset);
3105 bfd_put_64 (abfd, gp, pltoff_sec->contents + dyn_i->pltoff_offset + 8);
3106
3107 /* Install dynamic relocations if needed. */
3108 if (!is_plt
3109 && info->shared
3110 && (!dyn_i->h
3111 || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
3112 || dyn_i->h->root.type != bfd_link_hash_undefweak))
3113 {
3114 /* VMS: */
3115 abort ();
3116 }
3117
3118 dyn_i->pltoff_done = 1;
3119 }
3120
3121 /* Return the descriptor's address. */
3122 value = (pltoff_sec->output_section->vma
3123 + pltoff_sec->output_offset
3124 + dyn_i->pltoff_offset);
3125
3126 return value;
3127}
3128
3129/* Called through qsort to sort the .IA_64.unwind section during a
3130 non-relocatable link. Set elf64_ia64_unwind_entry_compare_bfd
3131 to the output bfd so we can do proper endianness frobbing. */
3132
3133static bfd *elf64_ia64_unwind_entry_compare_bfd;
3134
3135static int
3136elf64_ia64_unwind_entry_compare (const void * a, const void * b)
3137{
3138 bfd_vma av, bv;
3139
3140 av = bfd_get_64 (elf64_ia64_unwind_entry_compare_bfd, a);
3141 bv = bfd_get_64 (elf64_ia64_unwind_entry_compare_bfd, b);
3142
3143 return (av < bv ? -1 : av > bv ? 1 : 0);
3144}
3145
3146/* Make sure we've got ourselves a nice fat __gp value. */
3147static bfd_boolean
3148elf64_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info, bfd_boolean final)
3149{
3150 bfd_vma min_vma = (bfd_vma) -1, max_vma = 0;
3151 bfd_vma min_short_vma = min_vma, max_short_vma = 0;
3152 struct elf_link_hash_entry *gp;
3153 bfd_vma gp_val;
3154 asection *os;
3155 struct elf64_ia64_link_hash_table *ia64_info;
3156
3157 ia64_info = elf64_ia64_hash_table (info);
3158 if (ia64_info == NULL)
3159 return FALSE;
3160
3161 /* Find the min and max vma of all sections marked short. Also collect
3162 min and max vma of any type, for use in selecting a nice gp. */
3163 for (os = abfd->sections; os ; os = os->next)
3164 {
3165 bfd_vma lo, hi;
3166
3167 if ((os->flags & SEC_ALLOC) == 0)
3168 continue;
3169
3170 lo = os->vma;
3171 /* When this function is called from elfNN_ia64_final_link
3172 the correct value to use is os->size. When called from
3173 elfNN_ia64_relax_section we are in the middle of section
3174 sizing; some sections will already have os->size set, others
3175 will have os->size zero and os->rawsize the previous size. */
3176 hi = os->vma + (!final && os->rawsize ? os->rawsize : os->size);
3177 if (hi < lo)
3178 hi = (bfd_vma) -1;
3179
3180 if (min_vma > lo)
3181 min_vma = lo;
3182 if (max_vma < hi)
3183 max_vma = hi;
3184 if (os->flags & SEC_SMALL_DATA)
3185 {
3186 if (min_short_vma > lo)
3187 min_short_vma = lo;
3188 if (max_short_vma < hi)
3189 max_short_vma = hi;
3190 }
3191 }
3192
3193 if (ia64_info->min_short_sec)
3194 {
3195 if (min_short_vma
3196 > (ia64_info->min_short_sec->vma
3197 + ia64_info->min_short_offset))
3198 min_short_vma = (ia64_info->min_short_sec->vma
3199 + ia64_info->min_short_offset);
3200 if (max_short_vma
3201 < (ia64_info->max_short_sec->vma
3202 + ia64_info->max_short_offset))
3203 max_short_vma = (ia64_info->max_short_sec->vma
3204 + ia64_info->max_short_offset);
3205 }
3206
3207 /* See if the user wants to force a value. */
3208 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
3209 FALSE, FALSE);
3210
3211 if (gp
3212 && (gp->root.type == bfd_link_hash_defined
3213 || gp->root.type == bfd_link_hash_defweak))
3214 {
3215 asection *gp_sec = gp->root.u.def.section;
3216 gp_val = (gp->root.u.def.value
3217 + gp_sec->output_section->vma
3218 + gp_sec->output_offset);
3219 }
3220 else
3221 {
3222 /* Pick a sensible value. */
3223
3224 if (ia64_info->min_short_sec)
3225 {
3226 bfd_vma short_range = max_short_vma - min_short_vma;
3227
3228 /* If min_short_sec is set, pick one in the middle bewteen
3229 min_short_vma and max_short_vma. */
3230 if (short_range >= 0x400000)
3231 goto overflow;
3232 gp_val = min_short_vma + short_range / 2;
3233 }
3234 else
3235 {
3236 asection *got_sec = ia64_info->root.sgot;
3237
3238 /* Start with just the address of the .got. */
3239 if (got_sec)
3240 gp_val = got_sec->output_section->vma;
3241 else if (max_short_vma != 0)
3242 gp_val = min_short_vma;
3243 else if (max_vma - min_vma < 0x200000)
3244 gp_val = min_vma;
3245 else
3246 gp_val = max_vma - 0x200000 + 8;
3247 }
3248
3249 /* If it is possible to address the entire image, but we
3250 don't with the choice above, adjust. */
3251 if (max_vma - min_vma < 0x400000
3252 && (max_vma - gp_val >= 0x200000
3253 || gp_val - min_vma > 0x200000))
3254 gp_val = min_vma + 0x200000;
3255 else if (max_short_vma != 0)
3256 {
3257 /* If we don't cover all the short data, adjust. */
3258 if (max_short_vma - gp_val >= 0x200000)
3259 gp_val = min_short_vma + 0x200000;
3260
3261 /* If we're addressing stuff past the end, adjust back. */
3262 if (gp_val > max_vma)
3263 gp_val = max_vma - 0x200000 + 8;
3264 }
3265 }
3266
3267 /* Validate whether all SHF_IA_64_SHORT sections are within
3268 range of the chosen GP. */
3269
3270 if (max_short_vma != 0)
3271 {
3272 if (max_short_vma - min_short_vma >= 0x400000)
3273 {
3274overflow:
3275 (*_bfd_error_handler)
3276 (_("%s: short data segment overflowed (0x%lx >= 0x400000)"),
3277 bfd_get_filename (abfd),
3278 (unsigned long) (max_short_vma - min_short_vma));
3279 return FALSE;
3280 }
3281 else if ((gp_val > min_short_vma
3282 && gp_val - min_short_vma > 0x200000)
3283 || (gp_val < max_short_vma
3284 && max_short_vma - gp_val >= 0x200000))
3285 {
3286 (*_bfd_error_handler)
3287 (_("%s: __gp does not cover short data segment"),
3288 bfd_get_filename (abfd));
3289 return FALSE;
3290 }
3291 }
3292
3293 _bfd_set_gp_value (abfd, gp_val);
3294
3295 return TRUE;
3296}
3297
3298static bfd_boolean
3299elf64_ia64_final_link (bfd *abfd, struct bfd_link_info *info)
3300{
3301 struct elf64_ia64_link_hash_table *ia64_info;
3302 asection *unwind_output_sec;
3303
3304 ia64_info = elf64_ia64_hash_table (info);
3305 if (ia64_info == NULL)
3306 return FALSE;
3307
3308 /* Make sure we've got ourselves a nice fat __gp value. */
3309 if (!info->relocatable)
3310 {
3311 bfd_vma gp_val;
3312 struct elf_link_hash_entry *gp;
3313
3314 /* We assume after gp is set, section size will only decrease. We
3315 need to adjust gp for it. */
3316 _bfd_set_gp_value (abfd, 0);
3317 if (! elf64_ia64_choose_gp (abfd, info, TRUE))
3318 return FALSE;
3319 gp_val = _bfd_get_gp_value (abfd);
3320
3321 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
3322 FALSE, FALSE);
3323 if (gp)
3324 {
3325 gp->root.type = bfd_link_hash_defined;
3326 gp->root.u.def.value = gp_val;
3327 gp->root.u.def.section = bfd_abs_section_ptr;
3328 }
3329 }
3330
3331 /* If we're producing a final executable, we need to sort the contents
3332 of the .IA_64.unwind section. Force this section to be relocated
3333 into memory rather than written immediately to the output file. */
3334 unwind_output_sec = NULL;
3335 if (!info->relocatable)
3336 {
3337 asection *s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
3338 if (s)
3339 {
3340 unwind_output_sec = s->output_section;
3341 unwind_output_sec->contents
3342 = bfd_malloc (unwind_output_sec->size);
3343 if (unwind_output_sec->contents == NULL)
3344 return FALSE;
3345 }
3346 }
3347
3348 /* Invoke the regular ELF backend linker to do all the work. */
3349 if (!bfd_elf_final_link (abfd, info))
3350 return FALSE;
3351
3352 if (unwind_output_sec)
3353 {
3354 elf64_ia64_unwind_entry_compare_bfd = abfd;
3355 qsort (unwind_output_sec->contents,
3356 (size_t) (unwind_output_sec->size / 24),
3357 24,
3358 elf64_ia64_unwind_entry_compare);
3359
3360 if (! bfd_set_section_contents (abfd, unwind_output_sec,
3361 unwind_output_sec->contents, (bfd_vma) 0,
3362 unwind_output_sec->size))
3363 return FALSE;
3364 }
3365
3366 return TRUE;
3367}
3368
3369static bfd_boolean
3370elf64_ia64_relocate_section (bfd *output_bfd,
3371 struct bfd_link_info *info,
3372 bfd *input_bfd,
3373 asection *input_section,
3374 bfd_byte *contents,
3375 Elf_Internal_Rela *relocs,
3376 Elf_Internal_Sym *local_syms,
3377 asection **local_sections)
3378{
3379 struct elf64_ia64_link_hash_table *ia64_info;
3380 Elf_Internal_Shdr *symtab_hdr;
3381 Elf_Internal_Rela *rel;
3382 Elf_Internal_Rela *relend;
3383 bfd_boolean ret_val = TRUE; /* for non-fatal errors */
3384 bfd_vma gp_val;
3385
3386 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3387 ia64_info = elf64_ia64_hash_table (info);
3388 if (ia64_info == NULL)
3389 return FALSE;
3390
3391 /* Infect various flags from the input section to the output section. */
3392 if (info->relocatable)
3393 {
3394 bfd_vma flags;
3395
3396 flags = elf_section_data(input_section)->this_hdr.sh_flags;
3397 flags &= SHF_IA_64_NORECOV;
3398
3399 elf_section_data(input_section->output_section)
3400 ->this_hdr.sh_flags |= flags;
3401 }
3402
3403 gp_val = _bfd_get_gp_value (output_bfd);
3404
3405 rel = relocs;
3406 relend = relocs + input_section->reloc_count;
3407 for (; rel < relend; ++rel)
3408 {
3409 struct elf_link_hash_entry *h;
3410 struct elf64_ia64_dyn_sym_info *dyn_i;
3411 bfd_reloc_status_type r;
3412 reloc_howto_type *howto;
3413 unsigned long r_symndx;
3414 Elf_Internal_Sym *sym;
3415 unsigned int r_type;
3416 bfd_vma value;
3417 asection *sym_sec;
3418 bfd_byte *hit_addr;
3419 bfd_boolean dynamic_symbol_p;
3420 bfd_boolean undef_weak_ref;
3421
3422 r_type = ELF64_R_TYPE (rel->r_info);
3423 if (r_type > R_IA64_MAX_RELOC_CODE)
3424 {
3425 (*_bfd_error_handler)
3426 (_("%B: unknown relocation type %d"),
3427 input_bfd, (int) r_type);
3428 bfd_set_error (bfd_error_bad_value);
3429 ret_val = FALSE;
3430 continue;
3431 }
3432
3433 howto = ia64_elf_lookup_howto (r_type);
3434 r_symndx = ELF64_R_SYM (rel->r_info);
3435 h = NULL;
3436 sym = NULL;
3437 sym_sec = NULL;
3438 undef_weak_ref = FALSE;
3439
3440 if (r_symndx < symtab_hdr->sh_info)
3441 {
3442 /* Reloc against local symbol. */
3443 asection *msec;
3444 sym = local_syms + r_symndx;
3445 sym_sec = local_sections[r_symndx];
3446 msec = sym_sec;
3447 value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
3448 if (!info->relocatable
3449 && (sym_sec->flags & SEC_MERGE) != 0
3450 && ELF_ST_TYPE (sym->st_info) == STT_SECTION
dbaa2011 3451 && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
202e2356
NC
3452 {
3453 struct elf64_ia64_local_hash_entry *loc_h;
3454
3455 loc_h = get_local_sym_hash (ia64_info, input_bfd, rel, FALSE);
3456 if (loc_h && ! loc_h->sec_merge_done)
3457 {
3458 struct elf64_ia64_dyn_sym_info *dynent;
3459 unsigned int count;
3460
3461 for (count = loc_h->count, dynent = loc_h->info;
3462 count != 0;
3463 count--, dynent++)
3464 {
3465 msec = sym_sec;
3466 dynent->addend =
3467 _bfd_merged_section_offset (output_bfd, &msec,
3468 elf_section_data (msec)->
3469 sec_info,
3470 sym->st_value
3471 + dynent->addend);
3472 dynent->addend -= sym->st_value;
3473 dynent->addend += msec->output_section->vma
3474 + msec->output_offset
3475 - sym_sec->output_section->vma
3476 - sym_sec->output_offset;
3477 }
3478
3479 /* We may have introduced duplicated entries. We need
3480 to remove them properly. */
3481 count = sort_dyn_sym_info (loc_h->info, loc_h->count);
3482 if (count != loc_h->count)
3483 {
3484 loc_h->count = count;
3485 loc_h->sorted_count = count;
3486 }
3487
3488 loc_h->sec_merge_done = 1;
3489 }
3490 }
3491 }
3492 else
3493 {
3494 bfd_boolean unresolved_reloc;
3495 bfd_boolean warned;
3496 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3497
3498 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3499 r_symndx, symtab_hdr, sym_hashes,
3500 h, sym_sec, value,
3501 unresolved_reloc, warned);
3502
3503 if (h->root.type == bfd_link_hash_undefweak)
3504 undef_weak_ref = TRUE;
3505 else if (warned)
3506 continue;
3507 }
3508
3509 /* For relocs against symbols from removed linkonce sections,
3510 or sections discarded by a linker script, we just want the
3511 section contents zeroed. Avoid any special processing. */
dbaa2011 3512 if (sym_sec != NULL && discarded_section (sym_sec))
202e2356 3513 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
2de5d135 3514 rel, 1, relend, howto, 0, contents);
202e2356
NC
3515
3516 if (info->relocatable)
3517 continue;
3518
3519 hit_addr = contents + rel->r_offset;
3520 value += rel->r_addend;
3521 dynamic_symbol_p = elf64_ia64_dynamic_symbol_p (h);
3522
3523 switch (r_type)
3524 {
3525 case R_IA64_NONE:
3526 case R_IA64_LDXMOV:
3527 continue;
3528
3529 case R_IA64_IMM14:
3530 case R_IA64_IMM22:
3531 case R_IA64_IMM64:
3532 case R_IA64_DIR32MSB:
3533 case R_IA64_DIR32LSB:
3534 case R_IA64_DIR64MSB:
3535 case R_IA64_DIR64LSB:
3536 /* Install a dynamic relocation for this reloc. */
3537 if ((dynamic_symbol_p || info->shared)
3538 && r_symndx != 0
3539 && (input_section->flags & SEC_ALLOC) != 0)
3540 {
3541 unsigned int dyn_r_type;
3542 bfd_vma addend;
3543
3544 switch (r_type)
3545 {
3546 case R_IA64_IMM14:
3547 case R_IA64_IMM22:
3548 case R_IA64_IMM64:
3549 /* ??? People shouldn't be doing non-pic code in
3550 shared libraries nor dynamic executables. */
3551 (*_bfd_error_handler)
3552 (_("%B: non-pic code with imm relocation against dynamic symbol `%s'"),
3553 input_bfd,
3554 h ? h->root.root.string
3555 : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3556 sym_sec));
3557 ret_val = FALSE;
3558 continue;
3559
3560 default:
3561 break;
3562 }
3563
3564 /* If we don't need dynamic symbol lookup, find a
3565 matching RELATIVE relocation. */
3566 dyn_r_type = r_type;
3567 if (dynamic_symbol_p)
3568 {
3569 addend = rel->r_addend;
3570 value = 0;
3571 }
3572 else
3573 {
3574 addend = value;
3575 }
3576
3577 /* VMS: install a FIX64. */
3578 switch (dyn_r_type)
3579 {
3580 case R_IA64_DIR32LSB:
3581 dyn_r_type = R_IA64_VMS_FIX32;
3582 break;
3583 case R_IA64_DIR64LSB:
3584 dyn_r_type = R_IA64_VMS_FIX64;
3585 break;
3586 default:
3587 BFD_ASSERT (FALSE);
3588 break;
3589 }
3590 elf64_ia64_install_fixup
3591 (output_bfd, ia64_info, h,
3592 dyn_r_type, input_section, rel->r_offset, addend);
3593 r = bfd_reloc_ok;
3594 break;
3595 }
3596 /* Fall through. */
3597
3598 case R_IA64_LTV32MSB:
3599 case R_IA64_LTV32LSB:
3600 case R_IA64_LTV64MSB:
3601 case R_IA64_LTV64LSB:
3602 r = ia64_elf_install_value (hit_addr, value, r_type);
3603 break;
3604
3605 case R_IA64_GPREL22:
3606 case R_IA64_GPREL64I:
3607 case R_IA64_GPREL32MSB:
3608 case R_IA64_GPREL32LSB:
3609 case R_IA64_GPREL64MSB:
3610 case R_IA64_GPREL64LSB:
3611 if (dynamic_symbol_p)
3612 {
3613 (*_bfd_error_handler)
3614 (_("%B: @gprel relocation against dynamic symbol %s"),
3615 input_bfd,
3616 h ? h->root.root.string
3617 : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3618 sym_sec));
3619 ret_val = FALSE;
3620 continue;
3621 }
3622 value -= gp_val;
3623 r = ia64_elf_install_value (hit_addr, value, r_type);
3624 break;
3625
3626 case R_IA64_LTOFF22:
3627 case R_IA64_LTOFF22X:
3628 case R_IA64_LTOFF64I:
3629 dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
3630 value = set_got_entry (input_bfd, info, dyn_i,
3631 rel->r_addend, value, R_IA64_DIR64LSB);
3632 value -= gp_val;
3633 r = ia64_elf_install_value (hit_addr, value, r_type);
3634 break;
3635
3636 case R_IA64_PLTOFF22:
3637 case R_IA64_PLTOFF64I:
3638 case R_IA64_PLTOFF64MSB:
3639 case R_IA64_PLTOFF64LSB:
3640 dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
3641 value = set_pltoff_entry (output_bfd, info, dyn_i, value, FALSE);
3642 value -= gp_val;
3643 r = ia64_elf_install_value (hit_addr, value, r_type);
3644 break;
3645
3646 case R_IA64_FPTR64I:
3647 case R_IA64_FPTR32MSB:
3648 case R_IA64_FPTR32LSB:
3649 case R_IA64_FPTR64MSB:
3650 case R_IA64_FPTR64LSB:
3651 dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
3652 if (dyn_i->want_fptr)
3653 {
3654 if (!undef_weak_ref)
3655 value = set_fptr_entry (output_bfd, info, dyn_i, value);
3656 }
3657 if (!dyn_i->want_fptr || info->pie)
3658 {
3659 /* Otherwise, we expect the dynamic linker to create
3660 the entry. */
3661
3662 if (dyn_i->want_fptr)
3663 {
3664 if (r_type == R_IA64_FPTR64I)
3665 {
3666 /* We can't represent this without a dynamic symbol.
3667 Adjust the relocation to be against an output
3668 section symbol, which are always present in the
3669 dynamic symbol table. */
3670 /* ??? People shouldn't be doing non-pic code in
3671 shared libraries. Hork. */
3672 (*_bfd_error_handler)
3673 (_("%B: linking non-pic code in a position independent executable"),
3674 input_bfd);
3675 ret_val = FALSE;
3676 continue;
3677 }
3678 }
3679 else
3680 {
3681 value = 0;
3682 }
3683
3684 /* VMS: FIXFD. */
3685 elf64_ia64_install_fixup
3686 (output_bfd, ia64_info, h, R_IA64_VMS_FIXFD,
3687 input_section, rel->r_offset, 0);
3688 r = bfd_reloc_ok;
3689 break;
3690 }
3691
3692 r = ia64_elf_install_value (hit_addr, value, r_type);
3693 break;
3694
3695 case R_IA64_LTOFF_FPTR22:
3696 case R_IA64_LTOFF_FPTR64I:
3697 case R_IA64_LTOFF_FPTR32MSB:
3698 case R_IA64_LTOFF_FPTR32LSB:
3699 case R_IA64_LTOFF_FPTR64MSB:
3700 case R_IA64_LTOFF_FPTR64LSB:
3701 dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
3702 if (dyn_i->want_fptr)
3703 {
3704 BFD_ASSERT (h == NULL || !h->def_dynamic);
3705 if (!undef_weak_ref)
3706 value = set_fptr_entry (output_bfd, info, dyn_i, value);
3707 }
3708 else
3709 value = 0;
3710
3711 value = set_got_entry (output_bfd, info, dyn_i,
3712 rel->r_addend, value, R_IA64_FPTR64LSB);
3713 value -= gp_val;
3714 r = ia64_elf_install_value (hit_addr, value, r_type);
3715 break;
3716
3717 case R_IA64_PCREL32MSB:
3718 case R_IA64_PCREL32LSB:
3719 case R_IA64_PCREL64MSB:
3720 case R_IA64_PCREL64LSB:
3721 /* Install a dynamic relocation for this reloc. */
3722 if (dynamic_symbol_p && r_symndx != 0)
3723 {
3724 /* VMS: doesn't exist ??? */
3725 abort ();
3726 }
3727 goto finish_pcrel;
3728
3729 case R_IA64_PCREL21B:
3730 case R_IA64_PCREL60B:
3731 /* We should have created a PLT entry for any dynamic symbol. */
3732 dyn_i = NULL;
3733 if (h)
3734 dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, FALSE);
3735
3736 if (dyn_i && dyn_i->want_plt2)
3737 {
3738 /* Should have caught this earlier. */
3739 BFD_ASSERT (rel->r_addend == 0);
3740
3741 value = (ia64_info->root.splt->output_section->vma
3742 + ia64_info->root.splt->output_offset
3743 + dyn_i->plt2_offset);
3744 }
3745 else
3746 {
3747 /* Since there's no PLT entry, Validate that this is
3748 locally defined. */
3749 BFD_ASSERT (undef_weak_ref || sym_sec->output_section != NULL);
3750
3751 /* If the symbol is undef_weak, we shouldn't be trying
3752 to call it. There's every chance that we'd wind up
3753 with an out-of-range fixup here. Don't bother setting
3754 any value at all. */
3755 if (undef_weak_ref)
3756 continue;
3757 }
3758 goto finish_pcrel;
3759
3760 case R_IA64_PCREL21BI:
3761 case R_IA64_PCREL21F:
3762 case R_IA64_PCREL21M:
3763 case R_IA64_PCREL22:
3764 case R_IA64_PCREL64I:
3765 /* The PCREL21BI reloc is specifically not intended for use with
3766 dynamic relocs. PCREL21F and PCREL21M are used for speculation
3767 fixup code, and thus probably ought not be dynamic. The
3768 PCREL22 and PCREL64I relocs aren't emitted as dynamic relocs. */
3769 if (dynamic_symbol_p)
3770 {
3771 const char *msg;
3772
3773 if (r_type == R_IA64_PCREL21BI)
3774 msg = _("%B: @internal branch to dynamic symbol %s");
3775 else if (r_type == R_IA64_PCREL21F || r_type == R_IA64_PCREL21M)
3776 msg = _("%B: speculation fixup to dynamic symbol %s");
3777 else
3778 msg = _("%B: @pcrel relocation against dynamic symbol %s");
3779 (*_bfd_error_handler) (msg, input_bfd,
3780 h ? h->root.root.string
3781 : bfd_elf_sym_name (input_bfd,
3782 symtab_hdr,
3783 sym,
3784 sym_sec));
3785 ret_val = FALSE;
3786 continue;
3787 }
3788 goto finish_pcrel;
3789
3790 finish_pcrel:
3791 /* Make pc-relative. */
3792 value -= (input_section->output_section->vma
3793 + input_section->output_offset
3794 + rel->r_offset) & ~ (bfd_vma) 0x3;
3795 r = ia64_elf_install_value (hit_addr, value, r_type);
3796 break;
3797
3798 case R_IA64_SEGREL32MSB:
3799 case R_IA64_SEGREL32LSB:
3800 case R_IA64_SEGREL64MSB:
3801 case R_IA64_SEGREL64LSB:
3802 {
3803 /* Find the segment that contains the output_section. */
3804 Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section
3805 (output_bfd, sym_sec->output_section);
3806
3807 if (p == NULL)
3808 {
3809 r = bfd_reloc_notsupported;
3810 }
3811 else
3812 {
3813 /* The VMA of the segment is the vaddr of the associated
3814 program header. */
3815 if (value > p->p_vaddr)
3816 value -= p->p_vaddr;
3817 else
3818 value = 0;
3819 r = ia64_elf_install_value (hit_addr, value, r_type);
3820 }
3821 break;
3822 }
3823
3824 case R_IA64_SECREL32MSB:
3825 case R_IA64_SECREL32LSB:
3826 case R_IA64_SECREL64MSB:
3827 case R_IA64_SECREL64LSB:
3828 /* Make output-section relative to section where the symbol
3829 is defined. PR 475 */
3830 if (sym_sec)
3831 value -= sym_sec->output_section->vma;
3832 r = ia64_elf_install_value (hit_addr, value, r_type);
3833 break;
3834
3835 case R_IA64_IPLTMSB:
3836 case R_IA64_IPLTLSB:
3837 /* Install a dynamic relocation for this reloc. */
3838 if ((dynamic_symbol_p || info->shared)
3839 && (input_section->flags & SEC_ALLOC) != 0)
3840 {
3841 /* VMS: FIXFD ?? */
3842 abort ();
3843 }
3844
3845 if (r_type == R_IA64_IPLTMSB)
3846 r_type = R_IA64_DIR64MSB;
3847 else
3848 r_type = R_IA64_DIR64LSB;
3849 ia64_elf_install_value (hit_addr, value, r_type);
3850 r = ia64_elf_install_value (hit_addr + 8, gp_val, r_type);
3851 break;
3852
3853 case R_IA64_TPREL14:
3854 case R_IA64_TPREL22:
3855 case R_IA64_TPREL64I:
3856 r = bfd_reloc_notsupported;
3857 break;
3858
3859 case R_IA64_DTPREL14:
3860 case R_IA64_DTPREL22:
3861 case R_IA64_DTPREL64I:
3862 case R_IA64_DTPREL32LSB:
3863 case R_IA64_DTPREL32MSB:
3864 case R_IA64_DTPREL64LSB:
3865 case R_IA64_DTPREL64MSB:
3866 r = bfd_reloc_notsupported;
3867 break;
3868
3869 case R_IA64_LTOFF_TPREL22:
3870 case R_IA64_LTOFF_DTPMOD22:
3871 case R_IA64_LTOFF_DTPREL22:
3872 r = bfd_reloc_notsupported;
3873 break;
3874
3875 default:
3876 r = bfd_reloc_notsupported;
3877 break;
3878 }
3879
3880 switch (r)
3881 {
3882 case bfd_reloc_ok:
3883 break;
3884
3885 case bfd_reloc_undefined:
3886 /* This can happen for global table relative relocs if
3887 __gp is undefined. This is a panic situation so we
3888 don't try to continue. */
3889 (*info->callbacks->undefined_symbol)
3890 (info, "__gp", input_bfd, input_section, rel->r_offset, 1);
3891 return FALSE;
3892
3893 case bfd_reloc_notsupported:
3894 {
3895 const char *name;
3896
3897 if (h)
3898 name = h->root.root.string;
3899 else
3900 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3901 sym_sec);
3902 if (!(*info->callbacks->warning) (info, _("unsupported reloc"),
3903 name, input_bfd,
3904 input_section, rel->r_offset))
3905 return FALSE;
3906 ret_val = FALSE;
3907 }
3908 break;
3909
3910 case bfd_reloc_dangerous:
3911 case bfd_reloc_outofrange:
3912 case bfd_reloc_overflow:
3913 default:
3914 {
3915 const char *name;
3916
3917 if (h)
3918 name = h->root.root.string;
3919 else
3920 name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3921 sym_sec);
3922
3923 switch (r_type)
3924 {
3925 case R_IA64_TPREL14:
3926 case R_IA64_TPREL22:
3927 case R_IA64_TPREL64I:
3928 case R_IA64_DTPREL14:
3929 case R_IA64_DTPREL22:
3930 case R_IA64_DTPREL64I:
3931 case R_IA64_DTPREL32LSB:
3932 case R_IA64_DTPREL32MSB:
3933 case R_IA64_DTPREL64LSB:
3934 case R_IA64_DTPREL64MSB:
3935 case R_IA64_LTOFF_TPREL22:
3936 case R_IA64_LTOFF_DTPMOD22:
3937 case R_IA64_LTOFF_DTPREL22:
3938 (*_bfd_error_handler)
3939 (_("%B: missing TLS section for relocation %s against `%s' at 0x%lx in section `%A'."),
3940 input_bfd, input_section, howto->name, name,
3941 rel->r_offset);
3942 break;
3943
3944 case R_IA64_PCREL21B:
3945 case R_IA64_PCREL21BI:
3946 case R_IA64_PCREL21M:
3947 case R_IA64_PCREL21F:
3948 if (is_elf_hash_table (info->hash))
3949 {
3950 /* Relaxtion is always performed for ELF output.
3951 Overflow failures for those relocations mean
3952 that the section is too big to relax. */
3953 (*_bfd_error_handler)
3954 (_("%B: Can't relax br (%s) to `%s' at 0x%lx in section `%A' with size 0x%lx (> 0x1000000)."),
3955 input_bfd, input_section, howto->name, name,
3956 rel->r_offset, input_section->size);
3957 break;
3958 }
3959 default:
3960 if (!(*info->callbacks->reloc_overflow) (info,
3961 &h->root,
3962 name,
3963 howto->name,
3964 (bfd_vma) 0,
3965 input_bfd,
3966 input_section,
3967 rel->r_offset))
3968 return FALSE;
3969 break;
3970 }
3971
3972 ret_val = FALSE;
3973 }
3974 break;
3975 }
3976 }
3977
3978 return ret_val;
3979}
3980
3981static bfd_boolean
3982elf64_ia64_finish_dynamic_symbol (bfd *output_bfd,
3983 struct bfd_link_info *info,
3984 struct elf_link_hash_entry *h,
3985 Elf_Internal_Sym *sym)
3986{
3987 struct elf64_ia64_link_hash_table *ia64_info;
3988 struct elf64_ia64_dyn_sym_info *dyn_i;
3989
3990 ia64_info = elf64_ia64_hash_table (info);
3991 if (ia64_info == NULL)
3992 return FALSE;
3993
3994 dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, FALSE);
3995
3996 /* Fill in the PLT data, if required. */
3997 if (dyn_i && dyn_i->want_plt)
3998 {
3999 bfd_byte *loc;
4000 asection *plt_sec;
4001 bfd_vma plt_addr, pltoff_addr, gp_val;
4002
4003 gp_val = _bfd_get_gp_value (output_bfd);
4004
4005 plt_sec = ia64_info->root.splt;
4006 plt_addr = 0; /* Not used as overriden by FIXUPs. */
4007 pltoff_addr = set_pltoff_entry (output_bfd, info, dyn_i, plt_addr, TRUE);
4008
4009 /* Initialize the FULL PLT entry, if needed. */
4010 if (dyn_i->want_plt2)
4011 {
4012 loc = plt_sec->contents + dyn_i->plt2_offset;
4013
4014 memcpy (loc, plt_full_entry, PLT_FULL_ENTRY_SIZE);
4015 ia64_elf_install_value (loc, pltoff_addr - gp_val, R_IA64_IMM22);
4016
4017 /* Mark the symbol as undefined, rather than as defined in the
4018 plt section. Leave the value alone. */
4019 /* ??? We didn't redefine it in adjust_dynamic_symbol in the
4020 first place. But perhaps elflink.c did some for us. */
4021 if (!h->def_regular)
4022 sym->st_shndx = SHN_UNDEF;
4023 }
4024
4025 /* VMS: FIXFD. */
4026 elf64_ia64_install_fixup
4027 (output_bfd, ia64_info, h, R_IA64_VMS_FIXFD, ia64_info->pltoff_sec,
4028 pltoff_addr - (ia64_info->pltoff_sec->output_section->vma
4029 + ia64_info->pltoff_sec->output_offset), 0);
4030 }
4031
4032 /* Mark some specially defined symbols as absolute. */
9637f6ef 4033 if (h == ia64_info->root.hdynamic
202e2356
NC
4034 || h == ia64_info->root.hgot
4035 || h == ia64_info->root.hplt)
4036 sym->st_shndx = SHN_ABS;
4037
4038 return TRUE;
4039}
4040
4041static bfd_boolean
4042elf64_ia64_finish_dynamic_sections (bfd *abfd,
4043 struct bfd_link_info *info)
4044{
4045 struct elf64_ia64_link_hash_table *ia64_info;
4046 bfd *dynobj;
4047
4048 ia64_info = elf64_ia64_hash_table (info);
4049 if (ia64_info == NULL)
4050 return FALSE;
4051
4052 dynobj = ia64_info->root.dynobj;
4053
4054 if (elf_hash_table (info)->dynamic_sections_created)
4055 {
4056 Elf64_External_Dyn *dyncon, *dynconend;
4057 asection *sdyn;
4058 asection *unwind_sec;
4059 bfd_vma gp_val;
4060 unsigned int gp_seg;
4061 bfd_vma gp_off;
4062 Elf_Internal_Phdr *phdr;
4063 Elf_Internal_Phdr *base_phdr;
4064 unsigned int unwind_seg = 0;
4065 unsigned int code_seg = 0;
4066
3d4d4302 4067 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
202e2356
NC
4068 BFD_ASSERT (sdyn != NULL);
4069 dyncon = (Elf64_External_Dyn *) sdyn->contents;
4070 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
4071
4072 gp_val = _bfd_get_gp_value (abfd);
4073 phdr = _bfd_elf_find_segment_containing_section
4074 (info->output_bfd, ia64_info->pltoff_sec->output_section);
4075 BFD_ASSERT (phdr != NULL);
4076 base_phdr = elf_tdata (info->output_bfd)->phdr;
4077 gp_seg = phdr - base_phdr;
4078 gp_off = gp_val - phdr->p_vaddr;
4079
4080 unwind_sec = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
4081 if (unwind_sec != NULL)
4082 {
4083 asection *code_sec;
4084
4085 phdr = _bfd_elf_find_segment_containing_section (abfd, unwind_sec);
4086 BFD_ASSERT (phdr != NULL);
4087 unwind_seg = phdr - base_phdr;
4088
4089 code_sec = bfd_get_section_by_name (abfd, "$CODE$");
4090 phdr = _bfd_elf_find_segment_containing_section (abfd, code_sec);
4091 BFD_ASSERT (phdr != NULL);
4092 code_seg = phdr - base_phdr;
4093 }
4094
4095 for (; dyncon < dynconend; dyncon++)
4096 {
4097 Elf_Internal_Dyn dyn;
4098
4099 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
4100
4101 switch (dyn.d_tag)
4102 {
4103 case DT_IA_64_VMS_FIXUP_RELA_OFF:
4104 dyn.d_un.d_val +=
4105 (ia64_info->fixups_sec->output_section->vma
4106 + ia64_info->fixups_sec->output_offset)
4107 - (sdyn->output_section->vma + sdyn->output_offset);
4108 break;
4109
4110 case DT_IA_64_VMS_PLTGOT_OFFSET:
4111 dyn.d_un.d_val = gp_off;
4112 break;
4113
4114 case DT_IA_64_VMS_PLTGOT_SEG:
4115 dyn.d_un.d_val = gp_seg;
4116 break;
4117
4118 case DT_IA_64_VMS_UNWINDSZ:
4119 if (unwind_sec == NULL)
4120 {
4121 dyn.d_tag = DT_NULL;
4122 dyn.d_un.d_val = 0xdead;
4123 }
4124 else
4125 dyn.d_un.d_val = unwind_sec->size;
4126 break;
4127
4128 case DT_IA_64_VMS_UNWIND_CODSEG:
4129 dyn.d_un.d_val = code_seg;
4130 break;
4131
4132 case DT_IA_64_VMS_UNWIND_INFOSEG:
4133 case DT_IA_64_VMS_UNWIND_SEG:
4134 dyn.d_un.d_val = unwind_seg;
4135 break;
4136
4137 case DT_IA_64_VMS_UNWIND_OFFSET:
4138 break;
4139
4140 default:
4141 /* No need to rewrite the entry. */
4142 continue;
4143 }
4144
4145 bfd_elf64_swap_dyn_out (abfd, &dyn, dyncon);
4146 }
4147 }
4148
4149 /* Handle transfer addresses. */
4150 {
4151 asection *tfr_sec = ia64_info->transfer_sec;
4152 struct elf64_vms_transfer *tfr;
4153 struct elf_link_hash_entry *tfr3;
4154
4155 tfr = (struct elf64_vms_transfer *)tfr_sec->contents;
4156 bfd_putl32 (6 * 8, tfr->size);
4157 bfd_putl64 (tfr_sec->output_section->vma
4158 + tfr_sec->output_offset
4159 + 6 * 8, tfr->tfradr3);
4160
4161 tfr3 = elf_link_hash_lookup (elf_hash_table (info), "ELF$TFRADR", FALSE,
4162 FALSE, FALSE);
4163
4164 if (tfr3
4165 && (tfr3->root.type == bfd_link_hash_defined
4166 || tfr3->root.type == bfd_link_hash_defweak))
4167 {
4168 asection *tfr3_sec = tfr3->root.u.def.section;
4169 bfd_vma tfr3_val;
4170
4171 tfr3_val = (tfr3->root.u.def.value
4172 + tfr3_sec->output_section->vma
4173 + tfr3_sec->output_offset);
4174
4175 bfd_putl64 (tfr3_val, tfr->tfr3_func);
4176 bfd_putl64 (_bfd_get_gp_value (info->output_bfd), tfr->tfr3_gp);
4177 }
4178
4179 /* FIXME: set linker flags,
4180 handle lib$initialize. */
4181 }
4182
4183 return TRUE;
4184}
4185
4186/* ELF file flag handling: */
4187
4188/* Function to keep IA-64 specific file flags. */
4189static bfd_boolean
4190elf64_ia64_set_private_flags (bfd *abfd, flagword flags)
4191{
4192 BFD_ASSERT (!elf_flags_init (abfd)
4193 || elf_elfheader (abfd)->e_flags == flags);
4194
4195 elf_elfheader (abfd)->e_flags = flags;
4196 elf_flags_init (abfd) = TRUE;
4197 return TRUE;
4198}
4199
4200/* Merge backend specific data from an object file to the output
4201 object file when linking. */
4202static bfd_boolean
4203elf64_ia64_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
4204{
4205 flagword out_flags;
4206 flagword in_flags;
4207 bfd_boolean ok = TRUE;
4208
4209 /* Don't even pretend to support mixed-format linking. */
4210 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4211 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4212 return FALSE;
4213
4214 in_flags = elf_elfheader (ibfd)->e_flags;
4215 out_flags = elf_elfheader (obfd)->e_flags;
4216
4217 if (! elf_flags_init (obfd))
4218 {
4219 elf_flags_init (obfd) = TRUE;
4220 elf_elfheader (obfd)->e_flags = in_flags;
4221
4222 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
4223 && bfd_get_arch_info (obfd)->the_default)
4224 {
4225 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
4226 bfd_get_mach (ibfd));
4227 }
4228
4229 return TRUE;
4230 }
4231
4232 /* Check flag compatibility. */
4233 if (in_flags == out_flags)
4234 return TRUE;
4235
4236 /* Output has EF_IA_64_REDUCEDFP set only if all inputs have it set. */
4237 if (!(in_flags & EF_IA_64_REDUCEDFP) && (out_flags & EF_IA_64_REDUCEDFP))
4238 elf_elfheader (obfd)->e_flags &= ~EF_IA_64_REDUCEDFP;
4239
4240 if ((in_flags & EF_IA_64_TRAPNIL) != (out_flags & EF_IA_64_TRAPNIL))
4241 {
4242 (*_bfd_error_handler)
4243 (_("%B: linking trap-on-NULL-dereference with non-trapping files"),
4244 ibfd);
4245
4246 bfd_set_error (bfd_error_bad_value);
4247 ok = FALSE;
4248 }
4249 if ((in_flags & EF_IA_64_BE) != (out_flags & EF_IA_64_BE))
4250 {
4251 (*_bfd_error_handler)
4252 (_("%B: linking big-endian files with little-endian files"),
4253 ibfd);
4254
4255 bfd_set_error (bfd_error_bad_value);
4256 ok = FALSE;
4257 }
4258 if ((in_flags & EF_IA_64_ABI64) != (out_flags & EF_IA_64_ABI64))
4259 {
4260 (*_bfd_error_handler)
4261 (_("%B: linking 64-bit files with 32-bit files"),
4262 ibfd);
4263
4264 bfd_set_error (bfd_error_bad_value);
4265 ok = FALSE;
4266 }
4267 if ((in_flags & EF_IA_64_CONS_GP) != (out_flags & EF_IA_64_CONS_GP))
4268 {
4269 (*_bfd_error_handler)
4270 (_("%B: linking constant-gp files with non-constant-gp files"),
4271 ibfd);
4272
4273 bfd_set_error (bfd_error_bad_value);
4274 ok = FALSE;
4275 }
4276 if ((in_flags & EF_IA_64_NOFUNCDESC_CONS_GP)
4277 != (out_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
4278 {
4279 (*_bfd_error_handler)
4280 (_("%B: linking auto-pic files with non-auto-pic files"),
4281 ibfd);
4282
4283 bfd_set_error (bfd_error_bad_value);
4284 ok = FALSE;
4285 }
4286
4287 return ok;
4288}
4289
4290static bfd_boolean
4291elf64_ia64_print_private_bfd_data (bfd *abfd, void * ptr)
4292{
4293 FILE *file = (FILE *) ptr;
4294 flagword flags = elf_elfheader (abfd)->e_flags;
4295
4296 BFD_ASSERT (abfd != NULL && ptr != NULL);
4297
4298 fprintf (file, "private flags = %s%s%s%s%s%s%s%s\n",
4299 (flags & EF_IA_64_TRAPNIL) ? "TRAPNIL, " : "",
4300 (flags & EF_IA_64_EXT) ? "EXT, " : "",
4301 (flags & EF_IA_64_BE) ? "BE, " : "LE, ",
4302 (flags & EF_IA_64_REDUCEDFP) ? "REDUCEDFP, " : "",
4303 (flags & EF_IA_64_CONS_GP) ? "CONS_GP, " : "",
4304 (flags & EF_IA_64_NOFUNCDESC_CONS_GP) ? "NOFUNCDESC_CONS_GP, " : "",
4305 (flags & EF_IA_64_ABSOLUTE) ? "ABSOLUTE, " : "",
4306 (flags & EF_IA_64_ABI64) ? "ABI64" : "ABI32");
4307
4308 _bfd_elf_print_private_bfd_data (abfd, ptr);
4309 return TRUE;
4310}
4311
4312static enum elf_reloc_type_class
4313elf64_ia64_reloc_type_class (const Elf_Internal_Rela *rela)
4314{
4315 switch ((int) ELF64_R_TYPE (rela->r_info))
4316 {
4317 case R_IA64_REL32MSB:
4318 case R_IA64_REL32LSB:
4319 case R_IA64_REL64MSB:
4320 case R_IA64_REL64LSB:
4321 return reloc_class_relative;
4322 case R_IA64_IPLTMSB:
4323 case R_IA64_IPLTLSB:
4324 return reloc_class_plt;
4325 case R_IA64_COPY:
4326 return reloc_class_copy;
4327 default:
4328 return reloc_class_normal;
4329 }
4330}
4331
4332static const struct bfd_elf_special_section elf64_ia64_special_sections[] =
4333{
4334 { STRING_COMMA_LEN (".sbss"), -1, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
4335 { STRING_COMMA_LEN (".sdata"), -1, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
4336 { NULL, 0, 0, 0, 0 }
4337};
4338
4339static bfd_boolean
4340elf64_ia64_object_p (bfd *abfd)
4341{
4342 asection *sec;
4343 asection *group, *unwi, *unw;
4344 flagword flags;
4345 const char *name;
4346 char *unwi_name, *unw_name;
4347 bfd_size_type amt;
4348
4349 if (abfd->flags & DYNAMIC)
4350 return TRUE;
4351
4352 /* Flags for fake group section. */
4353 flags = (SEC_LINKER_CREATED | SEC_GROUP | SEC_LINK_ONCE
4354 | SEC_EXCLUDE);
4355
4356 /* We add a fake section group for each .gnu.linkonce.t.* section,
4357 which isn't in a section group, and its unwind sections. */
4358 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4359 {
4360 if (elf_sec_group (sec) == NULL
4361 && ((sec->flags & (SEC_LINK_ONCE | SEC_CODE | SEC_GROUP))
4362 == (SEC_LINK_ONCE | SEC_CODE))
4363 && CONST_STRNEQ (sec->name, ".gnu.linkonce.t."))
4364 {
4365 name = sec->name + 16;
4366
4367 amt = strlen (name) + sizeof (".gnu.linkonce.ia64unwi.");
4368 unwi_name = bfd_alloc (abfd, amt);
4369 if (!unwi_name)
4370 return FALSE;
4371
4372 strcpy (stpcpy (unwi_name, ".gnu.linkonce.ia64unwi."), name);
4373 unwi = bfd_get_section_by_name (abfd, unwi_name);
4374
4375 amt = strlen (name) + sizeof (".gnu.linkonce.ia64unw.");
4376 unw_name = bfd_alloc (abfd, amt);
4377 if (!unw_name)
4378 return FALSE;
4379
4380 strcpy (stpcpy (unw_name, ".gnu.linkonce.ia64unw."), name);
4381 unw = bfd_get_section_by_name (abfd, unw_name);
4382
4383 /* We need to create a fake group section for it and its
4384 unwind sections. */
4385 group = bfd_make_section_anyway_with_flags (abfd, name,
4386 flags);
4387 if (group == NULL)
4388 return FALSE;
4389
4390 /* Move the fake group section to the beginning. */
4391 bfd_section_list_remove (abfd, group);
4392 bfd_section_list_prepend (abfd, group);
4393
4394 elf_next_in_group (group) = sec;
4395
4396 elf_group_name (sec) = name;
4397 elf_next_in_group (sec) = sec;
4398 elf_sec_group (sec) = group;
4399
4400 if (unwi)
4401 {
4402 elf_group_name (unwi) = name;
4403 elf_next_in_group (unwi) = sec;
4404 elf_next_in_group (sec) = unwi;
4405 elf_sec_group (unwi) = group;
4406 }
4407
4408 if (unw)
4409 {
4410 elf_group_name (unw) = name;
4411 if (unwi)
4412 {
4413 elf_next_in_group (unw) = elf_next_in_group (unwi);
4414 elf_next_in_group (unwi) = unw;
4415 }
4416 else
4417 {
4418 elf_next_in_group (unw) = sec;
4419 elf_next_in_group (sec) = unw;
4420 }
4421 elf_sec_group (unw) = group;
4422 }
4423
4424 /* Fake SHT_GROUP section header. */
4425 elf_section_data (group)->this_hdr.bfd_section = group;
4426 elf_section_data (group)->this_hdr.sh_type = SHT_GROUP;
4427 }
4428 }
4429 return TRUE;
4430}
4431
4432/* Handle an IA-64 specific section when reading an object file. This
4433 is called when bfd_section_from_shdr finds a section with an unknown
4434 type. */
4435
4436static bfd_boolean
4437elf64_vms_section_from_shdr (bfd *abfd,
4438 Elf_Internal_Shdr *hdr,
4439 const char *name,
4440 int shindex)
4441{
4442 flagword secflags = 0;
4443
4444 switch (hdr->sh_type)
4445 {
4446 case SHT_IA_64_VMS_TRACE:
4447 case SHT_IA_64_VMS_DEBUG:
4448 case SHT_IA_64_VMS_DEBUG_STR:
4449 secflags = SEC_DEBUGGING;
4450 break;
4451
4452 case SHT_IA_64_UNWIND:
4453 case SHT_IA_64_HP_OPT_ANOT:
4454 break;
4455
4456 case SHT_IA_64_EXT:
4457 if (strcmp (name, ELF_STRING_ia64_archext) != 0)
4458 return FALSE;
4459 break;
4460
4461 default:
4462 return FALSE;
4463 }
4464
4465 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
4466 return FALSE;
4467
4468 if (secflags != 0)
4469 {
4470 asection *newsect = hdr->bfd_section;
4471
4472 if (! bfd_set_section_flags
4473 (abfd, newsect, bfd_get_section_flags (abfd, newsect) | secflags))
4474 return FALSE;
4475 }
4476
4477 return TRUE;
4478}
4479
4480static bfd_boolean
4481elf64_vms_object_p (bfd *abfd)
4482{
4483 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
4484 Elf_Internal_Phdr *i_phdr = elf_tdata (abfd)->phdr;
4485 unsigned int i;
4486 unsigned int num_text = 0;
4487 unsigned int num_data = 0;
4488 unsigned int num_rodata = 0;
4489 char name[16];
4490
4491 if (!elf64_ia64_object_p (abfd))
4492 return FALSE;
4493
4494 /* Many VMS compilers do not generate sections for the corresponding
4495 segment. This is boring as binutils tools won't be able to disassemble
4496 the code. So we simply create all the missing sections. */
4497 for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
4498 {
4499 /* Is there a section for this segment? */
4500 bfd_vma base_vma = i_phdr->p_vaddr;
4501 bfd_vma limit_vma = base_vma + i_phdr->p_filesz;
4502
4503 if (i_phdr->p_type != PT_LOAD)
4504 continue;
4505
4506 /* We need to cover from base_vms to limit_vma. */
4507 again:
4508 while (base_vma < limit_vma)
4509 {
4510 bfd_vma next_vma = limit_vma;
4511 asection *nsec;
4512 asection *sec;
4513 flagword flags;
4514 char *nname = NULL;
4515
4516 /* Find a section covering [base_vma;limit_vma) */
4517 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4518 {
4519 /* Skip uninteresting sections (either not in memory or
4520 below base_vma. */
4521 if ((sec->flags & (SEC_ALLOC | SEC_LOAD)) == 0
4522 || sec->vma + sec->size <= base_vma)
4523 continue;
4524 if (sec->vma <= base_vma)
4525 {
4526 /* This section covers (maybe partially) the beginning
4527 of the range. */
4528 base_vma = sec->vma + sec->size;
4529 goto again;
4530 }
4531 if (sec->vma < next_vma)
4532 {
4533 /* This section partially covers the end of the range.
4534 Used to compute the size of the hole. */
4535 next_vma = sec->vma;
4536 }
4537 }
4538
4539 /* No section covering [base_vma; next_vma). Create a fake one. */
4540 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS;
4541 if (i_phdr->p_flags & PF_X)
4542 {
4543 flags |= SEC_CODE;
4544 if (num_text++ == 0)
4545 nname = ".text";
4546 else
4547 sprintf (name, ".text$%u", num_text);
4548 }
4549 else if ((i_phdr->p_flags & (PF_R | PF_W)) == PF_R)
4550 {
4551 flags |= SEC_READONLY;
4552 sprintf (name, ".rodata$%u", num_rodata++);
4553 }
4554 else
4555 {
4556 flags |= SEC_DATA;
4557 sprintf (name, ".data$%u", num_data++);
4558 }
4559
4560 /* Allocate name. */
4561 if (nname == NULL)
4562 {
4563 size_t name_len = strlen (name) + 1;
4564 nname = bfd_alloc (abfd, name_len);
4565 if (nname == NULL)
4566 return FALSE;
4567 memcpy (nname, name, name_len);
4568 }
4569
4570 /* Create and fill new section. */
4571 nsec = bfd_make_section_anyway_with_flags (abfd, nname, flags);
4572 if (nsec == NULL)
4573 return FALSE;
4574 nsec->vma = base_vma;
4575 nsec->size = next_vma - base_vma;
4576 nsec->filepos = i_phdr->p_offset + (base_vma - i_phdr->p_vaddr);
4577
4578 base_vma = next_vma;
4579 }
4580 }
4581 return TRUE;
4582}
4583
4584static void
4585elf64_vms_post_process_headers (bfd *abfd,
4586 struct bfd_link_info *info ATTRIBUTE_UNUSED)
4587{
4588 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
4589
4590 i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_OPENVMS;
4591 i_ehdrp->e_ident[EI_ABIVERSION] = 2;
4592}
4593
4594static bfd_boolean
4595elf64_vms_section_processing (bfd *abfd ATTRIBUTE_UNUSED,
4596 Elf_Internal_Shdr *hdr)
4597{
4598 if (hdr->bfd_section != NULL)
4599 {
4600 const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
4601
4602 if (strcmp (name, ".text") == 0)
4603 hdr->sh_flags |= SHF_IA_64_VMS_SHARED;
4604 else if ((strcmp (name, ".debug") == 0)
4605 || (strcmp (name, ".debug_abbrev") == 0)
4606 || (strcmp (name, ".debug_aranges") == 0)
4607 || (strcmp (name, ".debug_frame") == 0)
4608 || (strcmp (name, ".debug_info") == 0)
4609 || (strcmp (name, ".debug_loc") == 0)
4610 || (strcmp (name, ".debug_macinfo") == 0)
4611 || (strcmp (name, ".debug_pubnames") == 0)
4612 || (strcmp (name, ".debug_pubtypes") == 0))
4613 hdr->sh_type = SHT_IA_64_VMS_DEBUG;
4614 else if ((strcmp (name, ".debug_line") == 0)
4615 || (strcmp (name, ".debug_ranges") == 0)
4616 || (strcmp (name, ".trace_info") == 0)
4617 || (strcmp (name, ".trace_abbrev") == 0)
4618 || (strcmp (name, ".trace_aranges") == 0))
4619 hdr->sh_type = SHT_IA_64_VMS_TRACE;
4620 else if (strcmp (name, ".debug_str") == 0)
4621 hdr->sh_type = SHT_IA_64_VMS_DEBUG_STR;
4622 }
4623
4624 return TRUE;
4625}
4626
4627/* The final processing done just before writing out a VMS IA-64 ELF
4628 object file. */
4629
4630static void
4631elf64_vms_final_write_processing (bfd *abfd,
4632 bfd_boolean linker ATTRIBUTE_UNUSED)
4633{
4634 Elf_Internal_Shdr *hdr;
4635 asection *s;
4636 int unwind_info_sect_idx = 0;
4637
4638 for (s = abfd->sections; s; s = s->next)
4639 {
4640 hdr = &elf_section_data (s)->this_hdr;
4641
4642 if (strcmp (bfd_get_section_name (abfd, hdr->bfd_section),
4643 ".IA_64.unwind_info") == 0)
4644 unwind_info_sect_idx = elf_section_data (s)->this_idx;
4645
4646 switch (hdr->sh_type)
4647 {
4648 case SHT_IA_64_UNWIND:
4649 /* VMS requires sh_info to point to the unwind info section. */
4650 hdr->sh_info = unwind_info_sect_idx;
4651 break;
4652 }
4653 }
4654
4655 if (! elf_flags_init (abfd))
4656 {
4657 unsigned long flags = 0;
4658
4659 if (abfd->xvec->byteorder == BFD_ENDIAN_BIG)
4660 flags |= EF_IA_64_BE;
4661 if (bfd_get_mach (abfd) == bfd_mach_ia64_elf64)
4662 flags |= EF_IA_64_ABI64;
4663
4664 elf_elfheader (abfd)->e_flags = flags;
4665 elf_flags_init (abfd) = TRUE;
4666 }
4667}
4668
4669static bfd_boolean
4670elf64_vms_write_shdrs_and_ehdr (bfd *abfd)
4671{
4672 unsigned char needed_count[8];
4673
4674 if (!bfd_elf64_write_shdrs_and_ehdr (abfd))
4675 return FALSE;
4676
4677 bfd_putl64 (elf_ia64_vms_tdata (abfd)->needed_count, needed_count);
4678
4679 if (bfd_seek (abfd, sizeof (Elf64_External_Ehdr), SEEK_SET) != 0
4680 || bfd_bwrite (needed_count, 8, abfd) != 8)
4681 return FALSE;
4682
4683 return TRUE;
4684}
4685
4686static bfd_boolean
4687elf64_vms_close_and_cleanup (bfd *abfd)
4688{
4689 if (bfd_get_format (abfd) == bfd_object)
4690 {
4691 long isize;
4692
4693 /* Pad to 8 byte boundary for IPF/VMS. */
4694 isize = bfd_get_size (abfd);
4695 if ((isize & 7) != 0)
4696 {
4697 int ishort = 8 - (isize & 7);
4698 bfd_uint64_t pad = 0;
4699
4700 bfd_seek (abfd, isize, SEEK_SET);
4701 bfd_bwrite (&pad, ishort, abfd);
4702 }
4703 }
4704
4705 return _bfd_elf_close_and_cleanup (abfd);
4706}
4707
4708/* Add symbols from an ELF object file to the linker hash table. */
4709
4710static bfd_boolean
4711elf64_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
4712{
4713 Elf_Internal_Shdr *hdr;
4714 bfd_size_type symcount;
4715 bfd_size_type extsymcount;
4716 bfd_size_type extsymoff;
4717 struct elf_link_hash_entry **sym_hash;
4718 bfd_boolean dynamic;
4719 Elf_Internal_Sym *isymbuf = NULL;
4720 Elf_Internal_Sym *isym;
4721 Elf_Internal_Sym *isymend;
4722 const struct elf_backend_data *bed;
4723 struct elf_link_hash_table *htab;
4724 bfd_size_type amt;
4725
4726 htab = elf_hash_table (info);
4727 bed = get_elf_backend_data (abfd);
4728
4729 if ((abfd->flags & DYNAMIC) == 0)
4730 dynamic = FALSE;
4731 else
4732 {
4733 dynamic = TRUE;
4734
4735 /* You can't use -r against a dynamic object. Also, there's no
4736 hope of using a dynamic object which does not exactly match
4737 the format of the output file. */
4738 if (info->relocatable
4739 || !is_elf_hash_table (htab)
4740 || info->output_bfd->xvec != abfd->xvec)
4741 {
4742 if (info->relocatable)
4743 bfd_set_error (bfd_error_invalid_operation);
4744 else
4745 bfd_set_error (bfd_error_wrong_format);
4746 goto error_return;
4747 }
4748 }
4749
4750 if (! dynamic)
4751 {
4752 /* If we are creating a shared library, create all the dynamic
4753 sections immediately. We need to attach them to something,
4754 so we attach them to this BFD, provided it is the right
4755 format. FIXME: If there are no input BFD's of the same
4756 format as the output, we can't make a shared library. */
4757 if (info->shared
4758 && is_elf_hash_table (htab)
4759 && info->output_bfd->xvec == abfd->xvec
4760 && !htab->dynamic_sections_created)
4761 {
4762 if (! elf64_ia64_create_dynamic_sections (abfd, info))
4763 goto error_return;
4764 }
4765 }
4766 else if (!is_elf_hash_table (htab))
4767 goto error_return;
4768 else
4769 {
4770 asection *s;
4771 bfd_byte *dynbuf;
4772 bfd_byte *extdyn;
4773
4774 /* ld --just-symbols and dynamic objects don't mix very well.
4775 ld shouldn't allow it. */
4776 if ((s = abfd->sections) != NULL
dbaa2011 4777 && s->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
202e2356
NC
4778 abort ();
4779
4780 /* Be sure there are dynamic sections. */
4781 if (! elf64_ia64_create_dynamic_sections (htab->dynobj, info))
4782 goto error_return;
4783
4784 s = bfd_get_section_by_name (abfd, ".dynamic");
4785 if (s == NULL)
4786 {
4787 /* VMS libraries do not have dynamic sections. Create one from
4788 the segment. */
4789 Elf_Internal_Phdr *phdr;
4790 unsigned int i, phnum;
4791
4792 phdr = elf_tdata (abfd)->phdr;
4793 if (phdr == NULL)
4794 goto error_return;
4795 phnum = elf_elfheader (abfd)->e_phnum;
4796 for (i = 0; i < phnum; phdr++)
4797 if (phdr->p_type == PT_DYNAMIC)
4798 {
4799 s = bfd_make_section (abfd, ".dynamic");
4800 if (s == NULL)
4801 goto error_return;
4802 s->vma = phdr->p_vaddr;
4803 s->lma = phdr->p_paddr;
4804 s->size = phdr->p_filesz;
4805 s->filepos = phdr->p_offset;
4806 s->flags |= SEC_HAS_CONTENTS;
4807 s->alignment_power = bfd_log2 (phdr->p_align);
4808 break;
4809 }
4810 if (s == NULL)
4811 goto error_return;
4812 }
4813
4814 /* Extract IDENT. */
4815 if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
4816 {
4817error_free_dyn:
4818 free (dynbuf);
4819 goto error_return;
4820 }
4821
4822 for (extdyn = dynbuf;
4823 extdyn < dynbuf + s->size;
4824 extdyn += bed->s->sizeof_dyn)
4825 {
4826 Elf_Internal_Dyn dyn;
4827
4828 bed->s->swap_dyn_in (abfd, extdyn, &dyn);
4829 if (dyn.d_tag == DT_IA_64_VMS_IDENT)
4830 {
4831 bfd_uint64_t tagv = dyn.d_un.d_val;
4832 elf_ia64_vms_ident (abfd) = tagv;
4833 break;
4834 }
4835 }
4836 if (extdyn >= dynbuf + s->size)
4837 {
4838 /* Ident not found. */
4839 goto error_free_dyn;
4840 }
4841 free (dynbuf);
4842
4843 /* We do not want to include any of the sections in a dynamic
4844 object in the output file. We hack by simply clobbering the
4845 list of sections in the BFD. This could be handled more
4846 cleanly by, say, a new section flag; the existing
4847 SEC_NEVER_LOAD flag is not the one we want, because that one
4848 still implies that the section takes up space in the output
4849 file. */
4850 bfd_section_list_clear (abfd);
4851
4852 /* FIXME: should we detect if this library is already included ?
4853 This should be harmless and shouldn't happen in practice. */
4854 }
4855
4856 hdr = &elf_tdata (abfd)->symtab_hdr;
4857 symcount = hdr->sh_size / bed->s->sizeof_sym;
4858
4859 /* The sh_info field of the symtab header tells us where the
4860 external symbols start. We don't care about the local symbols at
4861 this point. */
4862 extsymcount = symcount - hdr->sh_info;
4863 extsymoff = hdr->sh_info;
4864
4865 sym_hash = NULL;
4866 if (extsymcount != 0)
4867 {
4868 isymbuf = bfd_elf_get_elf_syms (abfd, hdr, extsymcount, extsymoff,
4869 NULL, NULL, NULL);
4870 if (isymbuf == NULL)
4871 goto error_return;
4872
4873 /* We store a pointer to the hash table entry for each external
4874 symbol. */
4875 amt = extsymcount * sizeof (struct elf_link_hash_entry *);
4876 sym_hash = (struct elf_link_hash_entry **) bfd_alloc (abfd, amt);
4877 if (sym_hash == NULL)
4878 goto error_free_sym;
4879 elf_sym_hashes (abfd) = sym_hash;
4880 }
4881
4882 for (isym = isymbuf, isymend = isymbuf + extsymcount;
4883 isym < isymend;
4884 isym++, sym_hash++)
4885 {
4886 int bind;
4887 bfd_vma value;
4888 asection *sec, *new_sec;
4889 flagword flags;
4890 const char *name;
4891 struct elf_link_hash_entry *h;
4892 bfd_boolean definition;
4893 bfd_boolean size_change_ok;
4894 bfd_boolean type_change_ok;
4895 bfd_boolean common;
4896 unsigned int old_alignment;
4897 bfd *old_bfd;
4898
4899 flags = BSF_NO_FLAGS;
4900 sec = NULL;
4901 value = isym->st_value;
4902 *sym_hash = NULL;
4903 common = bed->common_definition (isym);
4904
4905 bind = ELF_ST_BIND (isym->st_info);
4906 switch (bind)
4907 {
4908 case STB_LOCAL:
4909 /* This should be impossible, since ELF requires that all
4910 global symbols follow all local symbols, and that sh_info
4911 point to the first global symbol. Unfortunately, Irix 5
4912 screws this up. */
4913 continue;
4914
4915 case STB_GLOBAL:
4916 if (isym->st_shndx != SHN_UNDEF && !common)
4917 flags = BSF_GLOBAL;
4918 break;
4919
4920 case STB_WEAK:
4921 flags = BSF_WEAK;
4922 break;
4923
4924 case STB_GNU_UNIQUE:
4925 flags = BSF_GNU_UNIQUE;
4926 break;
4927
4928 default:
4929 /* Leave it up to the processor backend. */
4930 break;
4931 }
4932
4933 if (isym->st_shndx == SHN_UNDEF)
4934 sec = bfd_und_section_ptr;
4935 else if (isym->st_shndx == SHN_ABS)
4936 sec = bfd_abs_section_ptr;
4937 else if (isym->st_shndx == SHN_COMMON)
4938 {
4939 sec = bfd_com_section_ptr;
4940 /* What ELF calls the size we call the value. What ELF
4941 calls the value we call the alignment. */
4942 value = isym->st_size;
4943 }
4944 else
4945 {
4946 sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
4947 if (sec == NULL)
4948 sec = bfd_abs_section_ptr;
4949 else if (sec->kept_section)
4950 {
4951 /* Symbols from discarded section are undefined. We keep
4952 its visibility. */
4953 sec = bfd_und_section_ptr;
4954 isym->st_shndx = SHN_UNDEF;
4955 }
4956 else if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
4957 value -= sec->vma;
4958 }
4959
4960 name = bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
4961 isym->st_name);
4962 if (name == NULL)
4963 goto error_free_vers;
4964
4965 if (bed->elf_add_symbol_hook)
4966 {
4967 if (! (*bed->elf_add_symbol_hook) (abfd, info, isym, &name, &flags,
4968 &sec, &value))
4969 goto error_free_vers;
4970
4971 /* The hook function sets the name to NULL if this symbol
4972 should be skipped for some reason. */
4973 if (name == NULL)
4974 continue;
4975 }
4976
4977 /* Sanity check that all possibilities were handled. */
4978 if (sec == NULL)
4979 {
4980 bfd_set_error (bfd_error_bad_value);
4981 goto error_free_vers;
4982 }
4983
4984 if (bfd_is_und_section (sec)
4985 || bfd_is_com_section (sec))
4986 definition = FALSE;
4987 else
4988 definition = TRUE;
4989
4990 size_change_ok = FALSE;
4991 type_change_ok = bed->type_change_ok;
4992 old_alignment = 0;
4993 old_bfd = NULL;
4994 new_sec = sec;
4995
4996 if (! bfd_is_und_section (sec))
4997 h = elf_link_hash_lookup (htab, name, TRUE, FALSE, FALSE);
4998 else
4999 h = ((struct elf_link_hash_entry *) bfd_wrapped_link_hash_lookup
5000 (abfd, info, name, TRUE, FALSE, FALSE));
5001 if (h == NULL)
5002 goto error_free_sym;
5003
5004 *sym_hash = h;
5005
5006 if (is_elf_hash_table (htab))
5007 {
5008 while (h->root.type == bfd_link_hash_indirect
5009 || h->root.type == bfd_link_hash_warning)
5010 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5011
5012 /* Remember the old alignment if this is a common symbol, so
5013 that we don't reduce the alignment later on. We can't
5014 check later, because _bfd_generic_link_add_one_symbol
5015 will set a default for the alignment which we want to
5016 override. We also remember the old bfd where the existing
5017 definition comes from. */
5018 switch (h->root.type)
5019 {
5020 default:
5021 break;
5022
5023 case bfd_link_hash_defined:
5024 if (abfd->selective_search)
5025 continue;
5026 /* Fall-through. */
5027 case bfd_link_hash_defweak:
5028 old_bfd = h->root.u.def.section->owner;
5029 break;
5030
5031 case bfd_link_hash_common:
5032 old_bfd = h->root.u.c.p->section->owner;
5033 old_alignment = h->root.u.c.p->alignment_power;
5034 break;
5035 }
5036 }
5037
5038 if (! (_bfd_generic_link_add_one_symbol
5039 (info, abfd, name, flags, sec, value, NULL, FALSE, bed->collect,
5040 (struct bfd_link_hash_entry **) sym_hash)))
5041 goto error_free_vers;
5042
5043 h = *sym_hash;
5044 while (h->root.type == bfd_link_hash_indirect
5045 || h->root.type == bfd_link_hash_warning)
5046 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5047
5048 *sym_hash = h;
5049 h->unique_global = (flags & BSF_GNU_UNIQUE) != 0;
5050
5051 /* Set the alignment of a common symbol. */
5052 if ((common || bfd_is_com_section (sec))
5053 && h->root.type == bfd_link_hash_common)
5054 {
5055 unsigned int align;
5056
5057 if (common)
5058 align = bfd_log2 (isym->st_value);
5059 else
5060 {
5061 /* The new symbol is a common symbol in a shared object.
5062 We need to get the alignment from the section. */
5063 align = new_sec->alignment_power;
5064 }
5065 if (align > old_alignment
5066 /* Permit an alignment power of zero if an alignment of one
5067 is specified and no other alignments have been specified. */
5068 || (isym->st_value == 1 && old_alignment == 0))
5069 h->root.u.c.p->alignment_power = align;
5070 else
5071 h->root.u.c.p->alignment_power = old_alignment;
5072 }
5073
5074 if (is_elf_hash_table (htab))
5075 {
5076 /* Check the alignment when a common symbol is involved. This
5077 can change when a common symbol is overridden by a normal
5078 definition or a common symbol is ignored due to the old
5079 normal definition. We need to make sure the maximum
5080 alignment is maintained. */
5081 if ((old_alignment || common)
5082 && h->root.type != bfd_link_hash_common)
5083 {
5084 unsigned int common_align;
5085 unsigned int normal_align;
5086 unsigned int symbol_align;
5087 bfd *normal_bfd;
5088 bfd *common_bfd;
5089
5090 symbol_align = ffs (h->root.u.def.value) - 1;
5091 if (h->root.u.def.section->owner != NULL
5092 && (h->root.u.def.section->owner->flags & DYNAMIC) == 0)
5093 {
5094 normal_align = h->root.u.def.section->alignment_power;
5095 if (normal_align > symbol_align)
5096 normal_align = symbol_align;
5097 }
5098 else
5099 normal_align = symbol_align;
5100
5101 if (old_alignment)
5102 {
5103 common_align = old_alignment;
5104 common_bfd = old_bfd;
5105 normal_bfd = abfd;
5106 }
5107 else
5108 {
5109 common_align = bfd_log2 (isym->st_value);
5110 common_bfd = abfd;
5111 normal_bfd = old_bfd;
5112 }
5113
5114 if (normal_align < common_align)
5115 {
5116 /* PR binutils/2735 */
5117 if (normal_bfd == NULL)
5118 (*_bfd_error_handler)
5119 (_("Warning: alignment %u of common symbol `%s' in %B"
5120 " is greater than the alignment (%u) of its section %A"),
5121 common_bfd, h->root.u.def.section,
5122 1 << common_align, name, 1 << normal_align);
5123 else
5124 (*_bfd_error_handler)
5125 (_("Warning: alignment %u of symbol `%s' in %B"
5126 " is smaller than %u in %B"),
5127 normal_bfd, common_bfd,
5128 1 << normal_align, name, 1 << common_align);
5129 }
5130 }
5131
5132 /* Remember the symbol size if it isn't undefined. */
5133 if ((isym->st_size != 0 && isym->st_shndx != SHN_UNDEF)
5134 && (definition || h->size == 0))
5135 {
5136 if (h->size != 0
5137 && h->size != isym->st_size
5138 && ! size_change_ok)
5139 (*_bfd_error_handler)
5140 (_("Warning: size of symbol `%s' changed"
5141 " from %lu in %B to %lu in %B"),
5142 old_bfd, abfd,
5143 name, (unsigned long) h->size,
5144 (unsigned long) isym->st_size);
5145
5146 h->size = isym->st_size;
5147 }
5148
5149 /* If this is a common symbol, then we always want H->SIZE
5150 to be the size of the common symbol. The code just above
5151 won't fix the size if a common symbol becomes larger. We
5152 don't warn about a size change here, because that is
5153 covered by --warn-common. Allow changed between different
5154 function types. */
5155 if (h->root.type == bfd_link_hash_common)
5156 h->size = h->root.u.c.size;
5157
5158 if (ELF_ST_TYPE (isym->st_info) != STT_NOTYPE
5159 && (definition || h->type == STT_NOTYPE))
5160 {
5161 unsigned int type = ELF_ST_TYPE (isym->st_info);
5162
5163 if (h->type != type)
5164 {
5165 if (h->type != STT_NOTYPE && ! type_change_ok)
5166 (*_bfd_error_handler)
5167 (_("Warning: type of symbol `%s' changed"
5168 " from %d to %d in %B"),
5169 abfd, name, h->type, type);
5170
5171 h->type = type;
5172 }
5173 }
5174
5175 /* Set a flag in the hash table entry indicating the type of
5176 reference or definition we just found. Keep a count of
5177 the number of dynamic symbols we find. A dynamic symbol
5178 is one which is referenced or defined by both a regular
5179 object and a shared object. */
5180 if (! dynamic)
5181 {
5182 if (! definition)
5183 {
5184 h->ref_regular = 1;
5185 if (bind != STB_WEAK)
5186 h->ref_regular_nonweak = 1;
5187 }
5188 else
5189 {
5190 BFD_ASSERT (!h->def_dynamic);
5191 h->def_regular = 1;
5192 }
5193 }
5194 else
5195 {
5196 BFD_ASSERT (definition);
5197 h->def_dynamic = 1;
5198 h->dynindx = -2;
5199 ((struct elf64_ia64_link_hash_entry *)h)->shl = abfd;
5200 }
5201 }
5202 }
5203
5204 if (isymbuf != NULL)
5205 {
5206 free (isymbuf);
5207 isymbuf = NULL;
5208 }
5209
5210 /* If this object is the same format as the output object, and it is
5211 not a shared library, then let the backend look through the
5212 relocs.
5213
5214 This is required to build global offset table entries and to
5215 arrange for dynamic relocs. It is not required for the
5216 particular common case of linking non PIC code, even when linking
5217 against shared libraries, but unfortunately there is no way of
5218 knowing whether an object file has been compiled PIC or not.
5219 Looking through the relocs is not particularly time consuming.
5220 The problem is that we must either (1) keep the relocs in memory,
5221 which causes the linker to require additional runtime memory or
5222 (2) read the relocs twice from the input file, which wastes time.
5223 This would be a good case for using mmap.
5224
5225 I have no idea how to handle linking PIC code into a file of a
5226 different format. It probably can't be done. */
5227 if (! dynamic
5228 && is_elf_hash_table (htab)
5229 && bed->check_relocs != NULL
5230 && (*bed->relocs_compatible) (abfd->xvec, info->output_bfd->xvec))
5231 {
5232 asection *o;
5233
5234 for (o = abfd->sections; o != NULL; o = o->next)
5235 {
5236 Elf_Internal_Rela *internal_relocs;
5237 bfd_boolean ok;
5238
5239 if ((o->flags & SEC_RELOC) == 0
5240 || o->reloc_count == 0
5241 || ((info->strip == strip_all || info->strip == strip_debugger)
5242 && (o->flags & SEC_DEBUGGING) != 0)
5243 || bfd_is_abs_section (o->output_section))
5244 continue;
5245
5246 internal_relocs = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
5247 info->keep_memory);
5248 if (internal_relocs == NULL)
5249 goto error_return;
5250
5251 ok = (*bed->check_relocs) (abfd, info, o, internal_relocs);
5252
5253 if (elf_section_data (o)->relocs != internal_relocs)
5254 free (internal_relocs);
5255
5256 if (! ok)
5257 goto error_return;
5258 }
5259 }
5260
5261 return TRUE;
5262
5263 error_free_vers:
5264 error_free_sym:
5265 if (isymbuf != NULL)
5266 free (isymbuf);
5267 error_return:
5268 return FALSE;
5269}
5270
5271static bfd_boolean
5272elf64_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
5273{
5274 int pass;
5275 struct bfd_link_hash_entry **pundef;
5276 struct bfd_link_hash_entry **next_pundef;
5277
5278 /* We only accept VMS libraries. */
5279 if (info->output_bfd->xvec != abfd->xvec)
5280 {
5281 bfd_set_error (bfd_error_wrong_format);
5282 return FALSE;
5283 }
5284
5285 /* The archive_pass field in the archive itself is used to
5286 initialize PASS, since we may search the same archive multiple
5287 times. */
5288 pass = ++abfd->archive_pass;
5289
5290 /* Look through the list of undefined symbols. */
5291 for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef)
5292 {
5293 struct bfd_link_hash_entry *h;
5294 symindex symidx;
5295 bfd *element;
5296 bfd *orig_element;
5297
5298 h = *pundef;
5299 next_pundef = &(*pundef)->u.undef.next;
5300
5301 /* When a symbol is defined, it is not necessarily removed from
5302 the list. */
5303 if (h->type != bfd_link_hash_undefined
5304 && h->type != bfd_link_hash_common)
5305 {
5306 /* Remove this entry from the list, for general cleanliness
5307 and because we are going to look through the list again
5308 if we search any more libraries. We can't remove the
5309 entry if it is the tail, because that would lose any
5310 entries we add to the list later on. */
5311 if (*pundef != info->hash->undefs_tail)
5312 {
5313 *pundef = *next_pundef;
5314 next_pundef = pundef;
5315 }
5316 continue;
5317 }
5318
5319 /* Look for this symbol in the archive hash table. */
5320 symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string);
5321 if (symidx == BFD_NO_MORE_SYMBOLS)
5322 {
5323 /* Nothing in this slot. */
5324 continue;
5325 }
5326
5327 element = bfd_get_elt_at_index (abfd, symidx);
5328 if (element == NULL)
5329 return FALSE;
5330
5331 if (element->archive_pass == -1 || element->archive_pass == pass)
5332 {
5333 /* Next symbol if this archive is wrong or already handled. */
5334 continue;
5335 }
5336
5337 orig_element = element;
5338 if (bfd_is_thin_archive (abfd))
5339 {
5340 element = _bfd_vms_lib_get_imagelib_file (element);
5341 if (element == NULL || !bfd_check_format (element, bfd_object))
5342 {
5343 orig_element->archive_pass = -1;
5344 return FALSE;
5345 }
5346 }
5347 else if (! bfd_check_format (element, bfd_object))
5348 {
5349 element->archive_pass = -1;
5350 return FALSE;
5351 }
5352
5353 /* Unlike the generic linker, we know that this element provides
5354 a definition for an undefined symbol and we know that we want
5355 to include it. We don't need to check anything. */
5356 if (! (*info->callbacks->add_archive_element) (info, element,
5357 h->root.string, &element))
5358 return FALSE;
5359 if (! elf64_vms_link_add_object_symbols (element, info))
5360 return FALSE;
5361
5362 orig_element->archive_pass = pass;
5363 }
5364
5365 return TRUE;
5366}
5367
5368static bfd_boolean
5369elf64_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
5370{
5371 switch (bfd_get_format (abfd))
5372 {
5373 case bfd_object:
5374 return elf64_vms_link_add_object_symbols (abfd, info);
5375 break;
5376 case bfd_archive:
5377 return elf64_vms_link_add_archive_symbols (abfd, info);
5378 break;
5379 default:
5380 bfd_set_error (bfd_error_wrong_format);
5381 return FALSE;
5382 }
5383}
5384
5385static bfd_boolean
5386elf64_ia64_vms_mkobject (bfd *abfd)
5387{
5388 return bfd_elf_allocate_object
5389 (abfd, sizeof (struct elf64_ia64_vms_obj_tdata), IA64_ELF_DATA);
5390}
5391
5392
5393/* Size-dependent data and functions. */
5394static const struct elf_size_info elf64_ia64_vms_size_info = {
5395 sizeof (Elf64_External_VMS_Ehdr),
5396 sizeof (Elf64_External_Phdr),
5397 sizeof (Elf64_External_Shdr),
5398 sizeof (Elf64_External_Rel),
5399 sizeof (Elf64_External_Rela),
5400 sizeof (Elf64_External_Sym),
5401 sizeof (Elf64_External_Dyn),
5402 sizeof (Elf_External_Note),
5403 4,
5404 1,
5405 64, 3, /* ARCH_SIZE, LOG_FILE_ALIGN */
5406 ELFCLASS64, EV_CURRENT,
5407 bfd_elf64_write_out_phdrs,
5408 elf64_vms_write_shdrs_and_ehdr,
5409 bfd_elf64_checksum_contents,
5410 bfd_elf64_write_relocs,
5411 bfd_elf64_swap_symbol_in,
5412 bfd_elf64_swap_symbol_out,
5413 bfd_elf64_slurp_reloc_table,
5414 bfd_elf64_slurp_symbol_table,
5415 bfd_elf64_swap_dyn_in,
5416 bfd_elf64_swap_dyn_out,
5417 bfd_elf64_swap_reloc_in,
5418 bfd_elf64_swap_reloc_out,
5419 bfd_elf64_swap_reloca_in,
5420 bfd_elf64_swap_reloca_out
5421};
5422
5423#define ELF_ARCH bfd_arch_ia64
5424#define ELF_MACHINE_CODE EM_IA_64
5425#define ELF_MAXPAGESIZE 0x10000 /* 64KB */
5426#define ELF_COMMONPAGESIZE 0x200 /* 16KB */
5427
5428#define elf_backend_section_from_shdr \
5429 elf64_ia64_section_from_shdr
5430#define elf_backend_section_flags \
5431 elf64_ia64_section_flags
5432#define elf_backend_fake_sections \
5433 elf64_ia64_fake_sections
5434#define elf_backend_final_write_processing \
5435 elf64_ia64_final_write_processing
5436#define elf_backend_add_symbol_hook \
5437 elf64_ia64_add_symbol_hook
5438#define elf_info_to_howto \
5439 elf64_ia64_info_to_howto
5440
5441#define bfd_elf64_bfd_reloc_type_lookup \
5442 ia64_elf_reloc_type_lookup
5443#define bfd_elf64_bfd_reloc_name_lookup \
5444 ia64_elf_reloc_name_lookup
5445#define bfd_elf64_bfd_is_local_label_name \
5446 elf64_ia64_is_local_label_name
5447#define bfd_elf64_bfd_relax_section \
5448 elf64_ia64_relax_section
5449
5450#define elf_backend_object_p \
5451 elf64_ia64_object_p
5452
5453/* Stuff for the BFD linker: */
5454#define bfd_elf64_bfd_link_hash_table_create \
5455 elf64_ia64_hash_table_create
5456#define bfd_elf64_bfd_link_hash_table_free \
5457 elf64_ia64_hash_table_free
5458#define elf_backend_create_dynamic_sections \
5459 elf64_ia64_create_dynamic_sections
5460#define elf_backend_check_relocs \
5461 elf64_ia64_check_relocs
5462#define elf_backend_adjust_dynamic_symbol \
5463 elf64_ia64_adjust_dynamic_symbol
5464#define elf_backend_size_dynamic_sections \
5465 elf64_ia64_size_dynamic_sections
5466#define elf_backend_omit_section_dynsym \
5467 ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5468#define elf_backend_relocate_section \
5469 elf64_ia64_relocate_section
5470#define elf_backend_finish_dynamic_symbol \
5471 elf64_ia64_finish_dynamic_symbol
5472#define elf_backend_finish_dynamic_sections \
5473 elf64_ia64_finish_dynamic_sections
5474#define bfd_elf64_bfd_final_link \
5475 elf64_ia64_final_link
5476
5477#define bfd_elf64_bfd_merge_private_bfd_data \
5478 elf64_ia64_merge_private_bfd_data
5479#define bfd_elf64_bfd_set_private_flags \
5480 elf64_ia64_set_private_flags
5481#define bfd_elf64_bfd_print_private_bfd_data \
5482 elf64_ia64_print_private_bfd_data
5483
5484#define elf_backend_plt_readonly 1
5485#define elf_backend_want_plt_sym 0
5486#define elf_backend_plt_alignment 5
5487#define elf_backend_got_header_size 0
5488#define elf_backend_want_got_plt 1
5489#define elf_backend_may_use_rel_p 1
5490#define elf_backend_may_use_rela_p 1
5491#define elf_backend_default_use_rela_p 1
5492#define elf_backend_want_dynbss 0
5493#define elf_backend_hide_symbol elf64_ia64_hash_hide_symbol
5494#define elf_backend_fixup_symbol _bfd_elf_link_hash_fixup_symbol
5495#define elf_backend_reloc_type_class elf64_ia64_reloc_type_class
5496#define elf_backend_rela_normal 1
5497#define elf_backend_special_sections elf64_ia64_special_sections
5498#define elf_backend_default_execstack 0
5499
5500/* FIXME: PR 290: The Intel C compiler generates SHT_IA_64_UNWIND with
5501 SHF_LINK_ORDER. But it doesn't set the sh_link or sh_info fields.
5502 We don't want to flood users with so many error messages. We turn
5503 off the warning for now. It will be turned on later when the Intel
5504 compiler is fixed. */
5505#define elf_backend_link_order_error_handler NULL
5506
5507/* VMS-specific vectors. */
5508
5509#undef TARGET_LITTLE_SYM
5510#define TARGET_LITTLE_SYM bfd_elf64_ia64_vms_vec
5511#undef TARGET_LITTLE_NAME
5512#define TARGET_LITTLE_NAME "elf64-ia64-vms"
5513#undef TARGET_BIG_SYM
5514#undef TARGET_BIG_NAME
5515
5516/* These are VMS specific functions. */
5517
5518#undef elf_backend_object_p
5519#define elf_backend_object_p elf64_vms_object_p
5520
5521#undef elf_backend_section_from_shdr
5522#define elf_backend_section_from_shdr elf64_vms_section_from_shdr
5523
5524#undef elf_backend_post_process_headers
5525#define elf_backend_post_process_headers elf64_vms_post_process_headers
5526
5527#undef elf_backend_section_processing
5528#define elf_backend_section_processing elf64_vms_section_processing
5529
5530#undef elf_backend_final_write_processing
5531#define elf_backend_final_write_processing elf64_vms_final_write_processing
5532
5533#undef bfd_elf64_close_and_cleanup
5534#define bfd_elf64_close_and_cleanup elf64_vms_close_and_cleanup
5535
5536#undef elf_backend_section_from_bfd_section
5537
5538#undef elf_backend_symbol_processing
5539
5540#undef elf_backend_want_p_paddr_set_to_zero
5541
5542#undef ELF_OSABI
5543#define ELF_OSABI ELFOSABI_OPENVMS
5544
5545#undef ELF_MAXPAGESIZE
5546#define ELF_MAXPAGESIZE 0x10000 /* 64KB */
5547
5548#undef elf64_bed
5549#define elf64_bed elf64_ia64_vms_bed
5550
5551#define elf_backend_size_info elf64_ia64_vms_size_info
5552
5553/* Use VMS-style archives (in particular, don't use the standard coff
5554 archive format). */
5555#define bfd_elf64_archive_functions
5556
5557#undef bfd_elf64_archive_p
5558#define bfd_elf64_archive_p _bfd_vms_lib_ia64_archive_p
5559#undef bfd_elf64_write_archive_contents
5560#define bfd_elf64_write_archive_contents _bfd_vms_lib_write_archive_contents
5561#undef bfd_elf64_mkarchive
5562#define bfd_elf64_mkarchive _bfd_vms_lib_ia64_mkarchive
5563
5564#define bfd_elf64_archive_slurp_armap \
5565 _bfd_vms_lib_slurp_armap
5566#define bfd_elf64_archive_slurp_extended_name_table \
5567 _bfd_vms_lib_slurp_extended_name_table
5568#define bfd_elf64_archive_construct_extended_name_table \
5569 _bfd_vms_lib_construct_extended_name_table
5570#define bfd_elf64_archive_truncate_arname \
5571 _bfd_vms_lib_truncate_arname
5572#define bfd_elf64_archive_write_armap \
5573 _bfd_vms_lib_write_armap
5574#define bfd_elf64_archive_read_ar_hdr \
5575 _bfd_vms_lib_read_ar_hdr
5576#define bfd_elf64_archive_write_ar_hdr \
5577 _bfd_vms_lib_write_ar_hdr
5578#define bfd_elf64_archive_openr_next_archived_file \
5579 _bfd_vms_lib_openr_next_archived_file
5580#define bfd_elf64_archive_get_elt_at_index \
5581 _bfd_vms_lib_get_elt_at_index
5582#define bfd_elf64_archive_generic_stat_arch_elt \
5583 _bfd_vms_lib_generic_stat_arch_elt
5584#define bfd_elf64_archive_update_armap_timestamp \
5585 _bfd_vms_lib_update_armap_timestamp
5586
5587/* VMS link methods. */
5588#undef bfd_elf64_bfd_link_add_symbols
5589#define bfd_elf64_bfd_link_add_symbols elf64_vms_bfd_link_add_symbols
5590
5591#undef elf_backend_want_got_sym
5592#define elf_backend_want_got_sym 0
5593
5594#undef bfd_elf64_mkobject
5595#define bfd_elf64_mkobject elf64_ia64_vms_mkobject
5596
5597/* Redefine to align segments on block size. */
5598#undef ELF_MAXPAGESIZE
5599#define ELF_MAXPAGESIZE 0x200 /* 512B */
5600
5601#undef elf_backend_want_got_plt
5602#define elf_backend_want_got_plt 0
5603
5604#include "elf64-target.h"
This page took 0.265968 seconds and 4 git commands to generate.