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