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