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