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