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