elfnn-ia64.c revision 1.1.1.10 1 /* IA-64 support for 64-bit ELF
2 Copyright (C) 1998-2026 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->fatal
368 (_("%P: --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->reloc_count == 0
377 || (sec->flags & SEC_RELOC) == 0
378 || (sec->flags & SEC_HAS_CONTENTS) == 0
379 || (link_info->relax_pass == 0 && sec->skip_relax_pass_0)
380 || (link_info->relax_pass == 1 && sec->skip_relax_pass_1))
381 return true;
382
383 ia64_info = elfNN_ia64_hash_table (link_info);
384 if (ia64_info == NULL)
385 return false;
386
387 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
388
389 /* Load the relocations for this section. */
390 internal_relocs = (_bfd_elf_link_read_relocs
391 (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
392 link_info->keep_memory));
393 if (internal_relocs == NULL)
394 return false;
395
396 irelend = internal_relocs + sec->reloc_count;
397
398 /* Get the section contents. */
399 if (elf_section_data (sec)->this_hdr.contents != NULL)
400 contents = elf_section_data (sec)->this_hdr.contents;
401 else
402 {
403 if (!bfd_malloc_and_get_section (abfd, sec, &contents))
404 goto error_return;
405 }
406
407 for (irel = internal_relocs; irel < irelend; irel++)
408 {
409 unsigned long r_type = ELFNN_R_TYPE (irel->r_info);
410 bfd_vma symaddr, reladdr, trampoff, toff, roff;
411 asection *tsec;
412 struct one_fixup *f;
413 bfd_size_type amt;
414 bool is_branch;
415 struct elfNN_ia64_dyn_sym_info *dyn_i;
416 char symtype;
417
418 switch (r_type)
419 {
420 case R_IA64_PCREL21B:
421 case R_IA64_PCREL21BI:
422 case R_IA64_PCREL21M:
423 case R_IA64_PCREL21F:
424 /* In pass 1, all br relaxations are done. We can skip it. */
425 if (link_info->relax_pass == 1)
426 continue;
427 skip_relax_pass_0 = false;
428 is_branch = true;
429 break;
430
431 case R_IA64_PCREL60B:
432 /* We can't optimize brl to br in pass 0 since br relaxations
433 will increase the code size. Defer it to pass 1. */
434 if (link_info->relax_pass == 0)
435 {
436 skip_relax_pass_1 = false;
437 continue;
438 }
439 is_branch = true;
440 break;
441
442 case R_IA64_GPREL22:
443 /* Update max_short_sec/min_short_sec. */
444
445 case R_IA64_LTOFF22X:
446 case R_IA64_LDXMOV:
447 /* We can't relax ldx/mov in pass 0 since br relaxations will
448 increase the code size. Defer it to pass 1. */
449 if (link_info->relax_pass == 0)
450 {
451 skip_relax_pass_1 = false;
452 continue;
453 }
454 is_branch = false;
455 break;
456
457 default:
458 continue;
459 }
460
461 /* Get the value of the symbol referred to by the reloc. */
462 if (ELFNN_R_SYM (irel->r_info) < symtab_hdr->sh_info)
463 {
464 /* A local symbol. */
465 Elf_Internal_Sym *isym;
466
467 /* Read this BFD's local symbols. */
468 if (isymbuf == NULL)
469 {
470 isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
471 if (isymbuf == NULL)
472 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
473 symtab_hdr->sh_info, 0,
474 NULL, NULL, NULL);
475 if (isymbuf == 0)
476 goto error_return;
477 }
478
479 isym = isymbuf + ELFNN_R_SYM (irel->r_info);
480 if (isym->st_shndx == SHN_UNDEF)
481 continue; /* We can't do anything with undefined symbols. */
482 else if (isym->st_shndx == SHN_ABS)
483 tsec = bfd_abs_section_ptr;
484 else if (isym->st_shndx == SHN_COMMON)
485 tsec = bfd_com_section_ptr;
486 else if (isym->st_shndx == SHN_IA_64_ANSI_COMMON)
487 tsec = bfd_com_section_ptr;
488 else
489 tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
490
491 toff = isym->st_value;
492 dyn_i = get_dyn_sym_info (ia64_info, NULL, abfd, irel, false);
493 symtype = ELF_ST_TYPE (isym->st_info);
494 }
495 else
496 {
497 unsigned long indx;
498 struct elf_link_hash_entry *h;
499
500 indx = ELFNN_R_SYM (irel->r_info) - symtab_hdr->sh_info;
501 h = elf_sym_hashes (abfd)[indx];
502 BFD_ASSERT (h != NULL);
503
504 while (h->root.type == bfd_link_hash_indirect
505 || h->root.type == bfd_link_hash_warning)
506 h = (struct elf_link_hash_entry *) h->root.u.i.link;
507
508 dyn_i = get_dyn_sym_info (ia64_info, h, abfd, irel, false);
509
510 /* For branches to dynamic symbols, we're interested instead
511 in a branch to the PLT entry. */
512 if (is_branch && dyn_i && dyn_i->want_plt2)
513 {
514 /* Internal branches shouldn't be sent to the PLT.
515 Leave this for now and we'll give an error later. */
516 if (r_type != R_IA64_PCREL21B)
517 continue;
518
519 tsec = ia64_info->root.splt;
520 toff = dyn_i->plt2_offset;
521 BFD_ASSERT (irel->r_addend == 0);
522 }
523
524 /* Can't do anything else with dynamic symbols. */
525 else if (elfNN_ia64_dynamic_symbol_p (h, link_info, r_type))
526 continue;
527
528 else
529 {
530 /* We can't do anything with undefined symbols. */
531 if (h->root.type == bfd_link_hash_undefined
532 || h->root.type == bfd_link_hash_undefweak)
533 continue;
534
535 tsec = h->root.u.def.section;
536 toff = h->root.u.def.value;
537 }
538
539 symtype = h->type;
540 }
541
542 if (tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
543 {
544 /* At this stage in linking, no SEC_MERGE symbol has been
545 adjusted, so all references to such symbols need to be
546 passed through _bfd_merged_section_offset. (Later, in
547 relocate_section, all SEC_MERGE symbols *except* for
548 section symbols have been adjusted.)
549
550 gas may reduce relocations against symbols in SEC_MERGE
551 sections to a relocation against the section symbol when
552 the original addend was zero. When the reloc is against
553 a section symbol we should include the addend in the
554 offset passed to _bfd_merged_section_offset, since the
555 location of interest is the original symbol. On the
556 other hand, an access to "sym+addend" where "sym" is not
557 a section symbol should not include the addend; Such an
558 access is presumed to be an offset from "sym"; The
559 location of interest is just "sym". */
560 if (symtype == STT_SECTION)
561 toff += irel->r_addend;
562
563 toff = _bfd_merged_section_offset (abfd, &tsec, toff);
564
565 if (symtype != STT_SECTION)
566 toff += irel->r_addend;
567 }
568 else
569 toff += irel->r_addend;
570
571 symaddr = tsec->output_section->vma + tsec->output_offset + toff;
572
573 roff = irel->r_offset;
574
575 if (is_branch)
576 {
577 bfd_signed_vma offset;
578
579 reladdr = (sec->output_section->vma
580 + sec->output_offset
581 + roff) & (bfd_vma) -4;
582
583 /* The .plt section is aligned at 32byte and the .text section
584 is aligned at 64byte. The .text section is right after the
585 .plt section. After the first relaxation pass, linker may
586 increase the gap between the .plt and .text sections up
587 to 32byte. We assume linker will always insert 32byte
588 between the .plt and .text sections after the first
589 relaxation pass. */
590 if (tsec == ia64_info->root.splt)
591 offset = -0x1000000 + 32;
592 else
593 offset = -0x1000000;
594
595 /* If the branch is in range, no need to do anything. */
596 if ((bfd_signed_vma) (symaddr - reladdr) >= offset
597 && (bfd_signed_vma) (symaddr - reladdr) <= 0x0FFFFF0)
598 {
599 /* If the 60-bit branch is in 21-bit range, optimize it. */
600 if (r_type == R_IA64_PCREL60B)
601 {
602 ia64_elf_relax_brl (contents, roff);
603
604 irel->r_info
605 = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
606 R_IA64_PCREL21B);
607
608 /* If the original relocation offset points to slot
609 1, change it to slot 2. */
610 if ((irel->r_offset & 3) == 1)
611 irel->r_offset += 1;
612
613 changed_contents = true;
614 changed_relocs = true;
615 }
616
617 continue;
618 }
619 else if (r_type == R_IA64_PCREL60B)
620 continue;
621 else if (ia64_elf_relax_br (contents, roff))
622 {
623 irel->r_info
624 = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
625 R_IA64_PCREL60B);
626
627 /* Make the relocation offset point to slot 1. */
628 irel->r_offset = (irel->r_offset & ~((bfd_vma) 0x3)) + 1;
629
630 changed_contents = true;
631 changed_relocs = true;
632 continue;
633 }
634
635 /* We can't put a trampoline in a .init/.fini section. Issue
636 an error. */
637 if (strcmp (sec->output_section->name, ".init") == 0
638 || strcmp (sec->output_section->name, ".fini") == 0)
639 {
640 _bfd_error_handler
641 /* xgettext:c-format */
642 (_("%pB: can't relax br at %#" PRIx64 " in section `%pA';"
643 " please use brl or indirect branch"),
644 sec->owner, (uint64_t) roff, sec);
645 bfd_set_error (bfd_error_bad_value);
646 goto error_return;
647 }
648
649 /* If the branch and target are in the same section, you've
650 got one honking big section and we can't help you unless
651 you are branching backwards. You'll get an error message
652 later. */
653 if (tsec == sec && toff > roff)
654 continue;
655
656 /* Look for an existing fixup to this address. */
657 for (f = fixups; f ; f = f->next)
658 if (f->tsec == tsec && f->toff == toff)
659 break;
660
661 if (f == NULL)
662 {
663 /* Two alternatives: If it's a branch to a PLT entry, we can
664 make a copy of the FULL_PLT entry. Otherwise, we'll have
665 to use a `brl' insn to get where we're going. */
666
667 size_t size;
668
669 if (tsec == ia64_info->root.splt)
670 size = sizeof (plt_full_entry);
671 else
672 size = oor_branch_size;
673
674 /* Resize the current section to make room for the new branch. */
675 trampoff = (sec->size + 15) & (bfd_vma) -16;
676
677 /* If trampoline is out of range, there is nothing we
678 can do. */
679 offset = trampoff - (roff & (bfd_vma) -4);
680 if (offset < -0x1000000 || offset > 0x0FFFFF0)
681 continue;
682
683 amt = trampoff + size;
684 contents = (bfd_byte *) bfd_realloc (contents, amt);
685 if (contents == NULL)
686 goto error_return;
687 sec->size = amt;
688
689 if (tsec == ia64_info->root.splt)
690 {
691 memcpy (contents + trampoff, plt_full_entry, size);
692
693 /* Hijack the old relocation for use as the PLTOFF reloc. */
694 irel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
695 R_IA64_PLTOFF22);
696 irel->r_offset = trampoff;
697 }
698 else
699 {
700 if (size == sizeof (oor_ip))
701 {
702 memcpy (contents + trampoff, oor_ip, size);
703 irel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
704 R_IA64_PCREL64I);
705 irel->r_addend -= 16;
706 irel->r_offset = trampoff + 2;
707 }
708 else
709 {
710 memcpy (contents + trampoff, oor_brl, size);
711 irel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
712 R_IA64_PCREL60B);
713 irel->r_offset = trampoff + 2;
714 }
715
716 }
717
718 /* Record the fixup so we don't do it again this section. */
719 f = (struct one_fixup *)
720 bfd_malloc ((bfd_size_type) sizeof (*f));
721 f->next = fixups;
722 f->tsec = tsec;
723 f->toff = toff;
724 f->trampoff = trampoff;
725 fixups = f;
726 }
727 else
728 {
729 /* If trampoline is out of range, there is nothing we
730 can do. */
731 offset = f->trampoff - (roff & (bfd_vma) -4);
732 if (offset < -0x1000000 || offset > 0x0FFFFF0)
733 continue;
734
735 /* Nop out the reloc, since we're finalizing things here. */
736 irel->r_info = ELFNN_R_INFO (0, R_IA64_NONE);
737 }
738
739 /* Fix up the existing branch to hit the trampoline. */
740 if (ia64_elf_install_value (contents + roff, offset, r_type)
741 != bfd_reloc_ok)
742 goto error_return;
743
744 changed_contents = true;
745 changed_relocs = true;
746 }
747 else
748 {
749 /* Fetch the gp. */
750 if (gp == 0)
751 {
752 bfd *obfd = sec->output_section->owner;
753 gp = _bfd_get_gp_value (obfd);
754 if (gp == 0)
755 {
756 if (!elfNN_ia64_choose_gp (obfd, link_info, false))
757 goto error_return;
758 gp = _bfd_get_gp_value (obfd);
759 }
760 }
761
762 /* If the data is out of range, do nothing. */
763 if ((bfd_signed_vma) (symaddr - gp) >= 0x200000
764 ||(bfd_signed_vma) (symaddr - gp) < -0x200000)
765 continue;
766
767 if (r_type == R_IA64_GPREL22)
768 elfNN_ia64_update_short_info (tsec->output_section,
769 tsec->output_offset + toff,
770 ia64_info);
771 else if (r_type == R_IA64_LTOFF22X)
772 {
773 irel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
774 R_IA64_GPREL22);
775 changed_relocs = true;
776 if (dyn_i->want_gotx)
777 {
778 dyn_i->want_gotx = 0;
779 changed_got |= !dyn_i->want_got;
780 }
781
782 elfNN_ia64_update_short_info (tsec->output_section,
783 tsec->output_offset + toff,
784 ia64_info);
785 }
786 else
787 {
788 ia64_elf_relax_ldxmov (contents, roff);
789 irel->r_info = ELFNN_R_INFO (0, R_IA64_NONE);
790 changed_contents = true;
791 changed_relocs = true;
792 }
793 }
794 }
795
796 /* ??? If we created fixups, this may push the code segment large
797 enough that the data segment moves, which will change the GP.
798 Reset the GP so that we re-calculate next round. We need to
799 do this at the _beginning_ of the next round; now will not do. */
800
801 /* Clean up and go home. */
802 while (fixups)
803 {
804 struct one_fixup *f = fixups;
805 fixups = fixups->next;
806 free (f);
807 }
808
809 if (isymbuf != NULL
810 && symtab_hdr->contents != (unsigned char *) isymbuf)
811 {
812 if (! link_info->keep_memory)
813 free (isymbuf);
814 else
815 {
816 /* Cache the symbols for elf_link_input_bfd. */
817 symtab_hdr->contents = (unsigned char *) isymbuf;
818 }
819 }
820
821 if (contents != NULL
822 && elf_section_data (sec)->this_hdr.contents != contents)
823 {
824 if (!changed_contents && !link_info->keep_memory)
825 free (contents);
826 else
827 {
828 /* Cache the section contents for elf_link_input_bfd. */
829 elf_section_data (sec)->this_hdr.contents = contents;
830 }
831 }
832
833 if (elf_section_data (sec)->relocs != internal_relocs)
834 {
835 if (!changed_relocs)
836 free (internal_relocs);
837 else
838 elf_section_data (sec)->relocs = internal_relocs;
839 }
840
841 if (changed_got)
842 {
843 struct elfNN_ia64_allocate_data data;
844 data.info = link_info;
845 data.ofs = 0;
846 ia64_info->self_dtpmod_offset = (bfd_vma) -1;
847
848 elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data);
849 elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data);
850 elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data);
851 ia64_info->root.sgot->size = data.ofs;
852
853 if (ia64_info->root.dynamic_sections_created
854 && ia64_info->root.srelgot != NULL)
855 {
856 /* Resize .rela.got. */
857 ia64_info->root.srelgot->size = 0;
858 if (bfd_link_pic (link_info)
859 && ia64_info->self_dtpmod_offset != (bfd_vma) -1)
860 ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
861 data.only_got = true;
862 elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries,
863 &data);
864 }
865 }
866
867 if (link_info->relax_pass == 0)
868 {
869 /* Pass 0 is only needed to relax br. */
870 sec->skip_relax_pass_0 = skip_relax_pass_0;
871 sec->skip_relax_pass_1 = skip_relax_pass_1;
872 }
873
874 *again = changed_contents || changed_relocs;
875 return true;
876
877 error_return:
878 if ((unsigned char *) isymbuf != symtab_hdr->contents)
879 free (isymbuf);
880 if (elf_section_data (sec)->this_hdr.contents != contents)
881 free (contents);
882 if (elf_section_data (sec)->relocs != internal_relocs)
883 free (internal_relocs);
884 return false;
885 }
886 #undef skip_relax_pass_0
887 #undef skip_relax_pass_1
888
889 /* Return TRUE if NAME is an unwind table section name. */
891
892 static inline bool
893 is_unwind_section_name (bfd *abfd, const char *name)
894 {
895 if (elfNN_ia64_hpux_vec (abfd->xvec)
896 && !strcmp (name, ELF_STRING_ia64_unwind_hdr))
897 return false;
898
899 return ((startswith (name, ELF_STRING_ia64_unwind)
900 && ! startswith (name, ELF_STRING_ia64_unwind_info))
901 || startswith (name, ELF_STRING_ia64_unwind_once));
902 }
903
904 /* Handle an IA-64 specific section when reading an object file. This
905 is called when bfd_section_from_shdr finds a section with an unknown
906 type. */
907
908 static bool
909 elfNN_ia64_section_from_shdr (bfd *abfd,
910 Elf_Internal_Shdr *hdr,
911 const char *name,
912 int shindex)
913 {
914 /* There ought to be a place to keep ELF backend specific flags, but
915 at the moment there isn't one. We just keep track of the
916 sections by their name, instead. Fortunately, the ABI gives
917 suggested names for all the MIPS specific sections, so we will
918 probably get away with this. */
919 switch (hdr->sh_type)
920 {
921 case SHT_IA_64_UNWIND:
922 case SHT_IA_64_HP_OPT_ANOT:
923 break;
924
925 case SHT_IA_64_EXT:
926 if (strcmp (name, ELF_STRING_ia64_archext) != 0)
927 return false;
928 break;
929
930 default:
931 return false;
932 }
933
934 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
935 return false;
936
937 return true;
938 }
939
940 /* Convert IA-64 specific section flags to bfd internal section flags. */
941
942 /* ??? There is no bfd internal flag equivalent to the SHF_IA_64_NORECOV
943 flag. */
944
945 static bool
946 elfNN_ia64_section_flags (const Elf_Internal_Shdr *hdr)
947 {
948 if (hdr->sh_flags & SHF_IA_64_SHORT)
949 hdr->bfd_section->flags |= SEC_SMALL_DATA;
950
951 return true;
952 }
953
954 /* Set the correct type for an IA-64 ELF section. We do this by the
955 section name, which is a hack, but ought to work. */
956
957 static bool
958 elfNN_ia64_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr,
959 asection *sec)
960 {
961 const char *name;
962
963 name = bfd_section_name (sec);
964
965 if (is_unwind_section_name (abfd, name))
966 {
967 /* We don't have the sections numbered at this point, so sh_info
968 is set later, in elfNN_ia64_final_write_processing. */
969 hdr->sh_type = SHT_IA_64_UNWIND;
970 hdr->sh_flags |= SHF_LINK_ORDER;
971 }
972 else if (strcmp (name, ELF_STRING_ia64_archext) == 0)
973 hdr->sh_type = SHT_IA_64_EXT;
974 else if (strcmp (name, ".HP.opt_annot") == 0)
975 hdr->sh_type = SHT_IA_64_HP_OPT_ANOT;
976 else if (strcmp (name, ".reloc") == 0)
977 /* This is an ugly, but unfortunately necessary hack that is
978 needed when producing EFI binaries on IA-64. It tells
979 elf.c:elf_fake_sections() not to consider ".reloc" as a section
980 containing ELF relocation info. We need this hack in order to
981 be able to generate ELF binaries that can be translated into
982 EFI applications (which are essentially COFF objects). Those
983 files contain a COFF ".reloc" section inside an ELFNN object,
984 which would normally cause BFD to segfault because it would
985 attempt to interpret this section as containing relocation
986 entries for section "oc". With this hack enabled, ".reloc"
987 will be treated as a normal data section, which will avoid the
988 segfault. However, you won't be able to create an ELFNN binary
989 with a section named "oc" that needs relocations, but that's
990 the kind of ugly side-effects you get when detecting section
991 types based on their names... In practice, this limitation is
992 unlikely to bite. */
993 hdr->sh_type = SHT_PROGBITS;
994
995 if (sec->flags & SEC_SMALL_DATA)
996 hdr->sh_flags |= SHF_IA_64_SHORT;
997
998 /* Some HP linkers look for the SHF_IA_64_HP_TLS flag instead of SHF_TLS. */
999
1000 if (elfNN_ia64_hpux_vec (abfd->xvec) && (sec->flags & SHF_TLS))
1001 hdr->sh_flags |= SHF_IA_64_HP_TLS;
1002
1003 return true;
1004 }
1005
1006 /* The final processing done just before writing out an IA-64 ELF
1007 object file. */
1008
1009 static bool
1010 elfNN_ia64_final_write_processing (bfd *abfd)
1011 {
1012 Elf_Internal_Shdr *hdr;
1013 asection *s;
1014
1015 for (s = abfd->sections; s; s = s->next)
1016 {
1017 hdr = &elf_section_data (s)->this_hdr;
1018 switch (hdr->sh_type)
1019 {
1020 case SHT_IA_64_UNWIND:
1021 /* The IA-64 processor-specific ABI requires setting sh_link
1022 to the unwind section, whereas HP-UX requires sh_info to
1023 do so. For maximum compatibility, we'll set both for
1024 now... */
1025 hdr->sh_info = hdr->sh_link;
1026 break;
1027 }
1028 }
1029
1030 if (! elf_flags_init (abfd))
1031 {
1032 unsigned long flags = 0;
1033
1034 if (abfd->xvec->byteorder == BFD_ENDIAN_BIG)
1035 flags |= EF_IA_64_BE;
1036 if (bfd_get_mach (abfd) == bfd_mach_ia64_elf64)
1037 flags |= EF_IA_64_ABI64;
1038
1039 elf_elfheader(abfd)->e_flags = flags;
1040 elf_flags_init (abfd) = true;
1041 }
1042 return _bfd_elf_final_write_processing (abfd);
1043 }
1044
1045 /* Hook called by the linker routine which adds symbols from an object
1046 file. We use it to put .comm items in .sbss, and not .bss. */
1047
1048 static bool
1049 elfNN_ia64_add_symbol_hook (bfd *abfd,
1050 struct bfd_link_info *info,
1051 Elf_Internal_Sym *sym,
1052 const char **namep ATTRIBUTE_UNUSED,
1053 flagword *flagsp ATTRIBUTE_UNUSED,
1054 asection **secp,
1055 bfd_vma *valp)
1056 {
1057 if (sym->st_shndx == SHN_COMMON
1058 && !bfd_link_relocatable (info)
1059 && sym->st_size <= elf_gp_size (abfd))
1060 {
1061 /* Common symbols less than or equal to -G nn bytes are
1062 automatically put into .sbss. */
1063
1064 asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
1065
1066 if (scomm == NULL)
1067 {
1068 scomm = bfd_make_section_with_flags (abfd, ".scommon",
1069 (SEC_ALLOC
1070 | SEC_IS_COMMON
1071 | SEC_SMALL_DATA
1072 | SEC_LINKER_CREATED));
1073 if (scomm == NULL)
1074 return false;
1075 }
1076
1077 *secp = scomm;
1078 *valp = sym->st_size;
1079 }
1080
1081 return true;
1082 }
1083
1084 /* Return the number of additional phdrs we will need. */
1085
1086 static int
1087 elfNN_ia64_additional_program_headers (bfd *abfd,
1088 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1089 {
1090 asection *s;
1091 int ret = 0;
1092
1093 /* See if we need a PT_IA_64_ARCHEXT segment. */
1094 s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_archext);
1095 if (s && (s->flags & SEC_LOAD))
1096 ++ret;
1097
1098 /* Count how many PT_IA_64_UNWIND segments we need. */
1099 for (s = abfd->sections; s; s = s->next)
1100 if (is_unwind_section_name (abfd, s->name) && (s->flags & SEC_LOAD))
1101 ++ret;
1102
1103 return ret;
1104 }
1105
1106 static bool
1107 elfNN_ia64_modify_segment_map (bfd *abfd,
1108 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1109 {
1110 struct elf_segment_map *m, **pm;
1111 Elf_Internal_Shdr *hdr;
1112 asection *s;
1113
1114 /* If we need a PT_IA_64_ARCHEXT segment, it must come before
1115 all PT_LOAD segments. */
1116 s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_archext);
1117 if (s && (s->flags & SEC_LOAD))
1118 {
1119 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
1120 if (m->p_type == PT_IA_64_ARCHEXT)
1121 break;
1122 if (m == NULL)
1123 {
1124 m = ((struct elf_segment_map *)
1125 bfd_zalloc (abfd, (bfd_size_type) sizeof *m));
1126 if (m == NULL)
1127 return false;
1128
1129 m->p_type = PT_IA_64_ARCHEXT;
1130 m->count = 1;
1131 m->sections[0] = s;
1132
1133 /* We want to put it after the PHDR and INTERP segments. */
1134 pm = &elf_seg_map (abfd);
1135 while (*pm != NULL
1136 && ((*pm)->p_type == PT_PHDR
1137 || (*pm)->p_type == PT_INTERP))
1138 pm = &(*pm)->next;
1139
1140 m->next = *pm;
1141 *pm = m;
1142 }
1143 }
1144
1145 /* Install PT_IA_64_UNWIND segments, if needed. */
1146 for (s = abfd->sections; s; s = s->next)
1147 {
1148 hdr = &elf_section_data (s)->this_hdr;
1149 if (hdr->sh_type != SHT_IA_64_UNWIND)
1150 continue;
1151
1152 if (s && (s->flags & SEC_LOAD))
1153 {
1154 for (m = elf_seg_map (abfd); m != NULL; m = m->next)
1155 if (m->p_type == PT_IA_64_UNWIND)
1156 {
1157 int i;
1158
1159 /* Look through all sections in the unwind segment
1160 for a match since there may be multiple sections
1161 to a segment. */
1162 for (i = m->count - 1; i >= 0; --i)
1163 if (m->sections[i] == s)
1164 break;
1165
1166 if (i >= 0)
1167 break;
1168 }
1169
1170 if (m == NULL)
1171 {
1172 m = ((struct elf_segment_map *)
1173 bfd_zalloc (abfd, (bfd_size_type) sizeof *m));
1174 if (m == NULL)
1175 return false;
1176
1177 m->p_type = PT_IA_64_UNWIND;
1178 m->count = 1;
1179 m->sections[0] = s;
1180 m->next = NULL;
1181
1182 /* We want to put it last. */
1183 pm = &elf_seg_map (abfd);
1184 while (*pm != NULL)
1185 pm = &(*pm)->next;
1186 *pm = m;
1187 }
1188 }
1189 }
1190
1191 return true;
1192 }
1193
1194 /* Turn on PF_IA_64_NORECOV if needed. This involves traversing all of
1195 the input sections for each output section in the segment and testing
1196 for SHF_IA_64_NORECOV on each. */
1197
1198 static bool
1199 elfNN_ia64_modify_headers (bfd *abfd, struct bfd_link_info *info)
1200 {
1201 struct elf_obj_tdata *tdata = elf_tdata (abfd);
1202 struct elf_segment_map *m;
1203 Elf_Internal_Phdr *p;
1204
1205 for (p = tdata->phdr, m = elf_seg_map (abfd); m != NULL; m = m->next, p++)
1206 if (m->p_type == PT_LOAD)
1207 {
1208 int i;
1209 for (i = m->count - 1; i >= 0; --i)
1210 {
1211 struct bfd_link_order *order = m->sections[i]->map_head.link_order;
1212
1213 while (order != NULL)
1214 {
1215 if (order->type == bfd_indirect_link_order)
1216 {
1217 asection *is = order->u.indirect.section;
1218 bfd_vma flags = elf_section_data(is)->this_hdr.sh_flags;
1219 if (flags & SHF_IA_64_NORECOV)
1220 {
1221 p->p_flags |= PF_IA_64_NORECOV;
1222 goto found;
1223 }
1224 }
1225 order = order->next;
1226 }
1227 }
1228 found:;
1229 }
1230
1231 return _bfd_elf_modify_headers (abfd, info);
1232 }
1233
1234 /* According to the Tahoe assembler spec, all labels starting with a
1235 '.' are local. */
1236
1237 static bool
1238 elfNN_ia64_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
1239 const char *name)
1240 {
1241 return name[0] == '.';
1242 }
1243
1244 /* Should we do dynamic things to this symbol? */
1245
1246 static bool
1247 elfNN_ia64_dynamic_symbol_p (struct elf_link_hash_entry *h,
1248 struct bfd_link_info *info, int r_type)
1249 {
1250 bool ignore_protected
1251 = ((r_type & 0xf8) == 0x40 /* FPTR relocs */
1252 || (r_type & 0xf8) == 0x50); /* LTOFF_FPTR relocs */
1253
1254 return _bfd_elf_dynamic_symbol_p (h, info, ignore_protected);
1255 }
1256
1257 static struct bfd_hash_entry*
1259 elfNN_ia64_new_elf_hash_entry (struct bfd_hash_entry *entry,
1260 struct bfd_hash_table *table,
1261 const char *string)
1262 {
1263 struct elfNN_ia64_link_hash_entry *ret;
1264 ret = (struct elfNN_ia64_link_hash_entry *) entry;
1265
1266 /* Allocate the structure if it has not already been allocated by a
1267 subclass. */
1268 if (!ret)
1269 ret = bfd_hash_allocate (table, sizeof (*ret));
1270
1271 if (!ret)
1272 return 0;
1273
1274 /* Call the allocation method of the superclass. */
1275 ret = ((struct elfNN_ia64_link_hash_entry *)
1276 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1277 table, string));
1278
1279 ret->info = NULL;
1280 ret->count = 0;
1281 ret->sorted_count = 0;
1282 ret->size = 0;
1283 return (struct bfd_hash_entry *) ret;
1284 }
1285
1286 static void
1287 elfNN_ia64_hash_copy_indirect (struct bfd_link_info *info,
1288 struct elf_link_hash_entry *xdir,
1289 struct elf_link_hash_entry *xind)
1290 {
1291 struct elfNN_ia64_link_hash_entry *dir, *ind;
1292
1293 dir = (struct elfNN_ia64_link_hash_entry *) xdir;
1294 ind = (struct elfNN_ia64_link_hash_entry *) xind;
1295
1296 /* Copy down any references that we may have already seen to the
1297 symbol which just became indirect. */
1298
1299 if (dir->root.versioned != versioned_hidden)
1300 dir->root.ref_dynamic |= ind->root.ref_dynamic;
1301 dir->root.ref_regular |= ind->root.ref_regular;
1302 dir->root.ref_regular_nonweak |= ind->root.ref_regular_nonweak;
1303 dir->root.needs_plt |= ind->root.needs_plt;
1304
1305 if (ind->root.root.type != bfd_link_hash_indirect)
1306 return;
1307
1308 /* Copy over the got and plt data. This would have been done
1309 by check_relocs. */
1310
1311 if (ind->info != NULL)
1312 {
1313 struct elfNN_ia64_dyn_sym_info *dyn_i;
1314 unsigned int count;
1315
1316 free (dir->info);
1317
1318 dir->info = ind->info;
1319 dir->count = ind->count;
1320 dir->sorted_count = ind->sorted_count;
1321 dir->size = ind->size;
1322
1323 ind->info = NULL;
1324 ind->count = 0;
1325 ind->sorted_count = 0;
1326 ind->size = 0;
1327
1328 /* Fix up the dyn_sym_info pointers to the global symbol. */
1329 for (count = dir->count, dyn_i = dir->info;
1330 count != 0;
1331 count--, dyn_i++)
1332 dyn_i->h = &dir->root;
1333 }
1334
1335 /* Copy over the dynindx. */
1336
1337 if (ind->root.dynindx != -1)
1338 {
1339 if (dir->root.dynindx != -1)
1340 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1341 dir->root.dynstr_index);
1342 dir->root.dynindx = ind->root.dynindx;
1343 dir->root.dynstr_index = ind->root.dynstr_index;
1344 ind->root.dynindx = -1;
1345 ind->root.dynstr_index = 0;
1346 }
1347 }
1348
1349 static void
1350 elfNN_ia64_hash_hide_symbol (struct bfd_link_info *info,
1351 struct elf_link_hash_entry *xh,
1352 bool force_local)
1353 {
1354 struct elfNN_ia64_link_hash_entry *h;
1355 struct elfNN_ia64_dyn_sym_info *dyn_i;
1356 unsigned int count;
1357
1358 h = (struct elfNN_ia64_link_hash_entry *)xh;
1359
1360 _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
1361
1362 for (count = h->count, dyn_i = h->info;
1363 count != 0;
1364 count--, dyn_i++)
1365 {
1366 dyn_i->want_plt2 = 0;
1367 dyn_i->want_plt = 0;
1368 }
1369 }
1370
1371 /* Compute a hash of a local hash entry. */
1372
1373 static hashval_t
1374 elfNN_ia64_local_htab_hash (const void *ptr)
1375 {
1376 struct elfNN_ia64_local_hash_entry *entry
1377 = (struct elfNN_ia64_local_hash_entry *) ptr;
1378
1379 return ELF_LOCAL_SYMBOL_HASH (entry->id, entry->r_sym);
1380 }
1381
1382 /* Compare local hash entries. */
1383
1384 static int
1385 elfNN_ia64_local_htab_eq (const void *ptr1, const void *ptr2)
1386 {
1387 struct elfNN_ia64_local_hash_entry *entry1
1388 = (struct elfNN_ia64_local_hash_entry *) ptr1;
1389 struct elfNN_ia64_local_hash_entry *entry2
1390 = (struct elfNN_ia64_local_hash_entry *) ptr2;
1391
1392 return entry1->id == entry2->id && entry1->r_sym == entry2->r_sym;
1393 }
1394
1395 /* Free the global elfNN_ia64_dyn_sym_info array. */
1396
1397 static bool
1398 elfNN_ia64_global_dyn_info_free (struct elf_link_hash_entry *xentry,
1399 void *unused ATTRIBUTE_UNUSED)
1400 {
1401 struct elfNN_ia64_link_hash_entry *entry
1402 = (struct elfNN_ia64_link_hash_entry *) xentry;
1403
1404 free (entry->info);
1405 entry->info = NULL;
1406 entry->count = 0;
1407 entry->sorted_count = 0;
1408 entry->size = 0;
1409
1410 return true;
1411 }
1412
1413 /* Free the local elfNN_ia64_dyn_sym_info array. */
1414
1415 static int
1416 elfNN_ia64_local_dyn_info_free (void **slot,
1417 void * unused ATTRIBUTE_UNUSED)
1418 {
1419 struct elfNN_ia64_local_hash_entry *entry
1420 = (struct elfNN_ia64_local_hash_entry *) *slot;
1421
1422 free (entry->info);
1423 entry->info = NULL;
1424 entry->count = 0;
1425 entry->sorted_count = 0;
1426 entry->size = 0;
1427
1428 return true;
1429 }
1430
1431 /* Destroy IA-64 linker hash table. */
1432
1433 static void
1434 elfNN_ia64_link_hash_table_free (bfd *obfd)
1435 {
1436 struct elfNN_ia64_link_hash_table *ia64_info
1437 = (struct elfNN_ia64_link_hash_table *) obfd->link.hash;
1438 if (ia64_info->loc_hash_table)
1439 {
1440 htab_traverse (ia64_info->loc_hash_table,
1441 elfNN_ia64_local_dyn_info_free, NULL);
1442 htab_delete (ia64_info->loc_hash_table);
1443 }
1444 if (ia64_info->loc_hash_memory)
1445 objalloc_free ((struct objalloc *) ia64_info->loc_hash_memory);
1446 elf_link_hash_traverse (&ia64_info->root,
1447 elfNN_ia64_global_dyn_info_free, NULL);
1448 _bfd_elf_link_hash_table_free (obfd);
1449 }
1450
1451 /* Create the derived linker hash table. The IA-64 ELF port uses this
1452 derived hash table to keep information specific to the IA-64 ElF
1453 linker (without using static variables). */
1454
1455 static struct bfd_link_hash_table *
1456 elfNN_ia64_hash_table_create (bfd *abfd)
1457 {
1458 struct elfNN_ia64_link_hash_table *ret;
1459
1460 ret = bfd_zmalloc ((bfd_size_type) sizeof (*ret));
1461 if (!ret)
1462 return NULL;
1463
1464 if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
1465 elfNN_ia64_new_elf_hash_entry,
1466 sizeof (struct elfNN_ia64_link_hash_entry)))
1467 {
1468 free (ret);
1469 return NULL;
1470 }
1471
1472 ret->loc_hash_table = htab_try_create (1024, elfNN_ia64_local_htab_hash,
1473 elfNN_ia64_local_htab_eq, NULL);
1474 ret->loc_hash_memory = objalloc_create ();
1475 if (!ret->loc_hash_table || !ret->loc_hash_memory)
1476 {
1477 elfNN_ia64_link_hash_table_free (abfd);
1478 return NULL;
1479 }
1480 ret->root.root.hash_table_free = elfNN_ia64_link_hash_table_free;
1481 ret->root.dt_pltgot_required = true;
1482
1483 return &ret->root.root;
1484 }
1485
1486 /* Traverse both local and global hash tables. */
1487
1488 struct elfNN_ia64_dyn_sym_traverse_data
1489 {
1490 bool (*func) (struct elfNN_ia64_dyn_sym_info *, void *);
1491 void * data;
1492 };
1493
1494 static bool
1495 elfNN_ia64_global_dyn_sym_thunk (struct elf_link_hash_entry *xentry,
1496 void * xdata)
1497 {
1498 struct elfNN_ia64_link_hash_entry *entry
1499 = (struct elfNN_ia64_link_hash_entry *) xentry;
1500 struct elfNN_ia64_dyn_sym_traverse_data *data
1501 = (struct elfNN_ia64_dyn_sym_traverse_data *) xdata;
1502 struct elfNN_ia64_dyn_sym_info *dyn_i;
1503 unsigned int count;
1504
1505 for (count = entry->count, dyn_i = entry->info;
1506 count != 0;
1507 count--, dyn_i++)
1508 if (! (*data->func) (dyn_i, data->data))
1509 return false;
1510 return true;
1511 }
1512
1513 static int
1514 elfNN_ia64_local_dyn_sym_thunk (void **slot, void * xdata)
1515 {
1516 struct elfNN_ia64_local_hash_entry *entry
1517 = (struct elfNN_ia64_local_hash_entry *) *slot;
1518 struct elfNN_ia64_dyn_sym_traverse_data *data
1519 = (struct elfNN_ia64_dyn_sym_traverse_data *) xdata;
1520 struct elfNN_ia64_dyn_sym_info *dyn_i;
1521 unsigned int count;
1522
1523 for (count = entry->count, dyn_i = entry->info;
1524 count != 0;
1525 count--, dyn_i++)
1526 if (! (*data->func) (dyn_i, data->data))
1527 return false;
1528 return true;
1529 }
1530
1531 static void
1532 elfNN_ia64_dyn_sym_traverse (struct elfNN_ia64_link_hash_table *ia64_info,
1533 bool (*func) (struct elfNN_ia64_dyn_sym_info *,
1534 void *),
1535 void * data)
1536 {
1537 struct elfNN_ia64_dyn_sym_traverse_data xdata;
1538
1539 xdata.func = func;
1540 xdata.data = data;
1541
1542 elf_link_hash_traverse (&ia64_info->root,
1543 elfNN_ia64_global_dyn_sym_thunk, &xdata);
1544 htab_traverse (ia64_info->loc_hash_table,
1545 elfNN_ia64_local_dyn_sym_thunk, &xdata);
1546 }
1547
1548 static bool
1550 elfNN_ia64_create_dynamic_sections (bfd *abfd,
1551 struct bfd_link_info *info)
1552 {
1553 struct elfNN_ia64_link_hash_table *ia64_info;
1554 asection *s;
1555
1556 if (! _bfd_elf_create_dynamic_sections (abfd, info))
1557 return false;
1558
1559 ia64_info = elfNN_ia64_hash_table (info);
1560 if (ia64_info == NULL)
1561 return false;
1562
1563 {
1564 flagword flags = bfd_section_flags (ia64_info->root.sgot);
1565 bfd_set_section_flags (ia64_info->root.sgot, SEC_SMALL_DATA | flags);
1566 /* The .got section is always aligned at 8 bytes. */
1567 if (!bfd_set_section_alignment (ia64_info->root.sgot, 3))
1568 return false;
1569 }
1570
1571 if (!get_pltoff (abfd, info, ia64_info))
1572 return false;
1573
1574 s = bfd_make_section_anyway_with_flags (abfd, ".rela.IA_64.pltoff",
1575 (SEC_ALLOC | SEC_LOAD
1576 | SEC_HAS_CONTENTS
1577 | SEC_IN_MEMORY
1578 | SEC_LINKER_CREATED
1579 | SEC_READONLY));
1580 if (s == NULL
1581 || !bfd_set_section_alignment (s, LOG_SECTION_ALIGN))
1582 return false;
1583 ia64_info->rel_pltoff_sec = s;
1584
1585 return true;
1586 }
1587
1588 /* Find and/or create a hash entry for local symbol. */
1589 static struct elfNN_ia64_local_hash_entry *
1590 get_local_sym_hash (struct elfNN_ia64_link_hash_table *ia64_info,
1591 bfd *abfd, const Elf_Internal_Rela *rel,
1592 bool create)
1593 {
1594 struct elfNN_ia64_local_hash_entry e, *ret;
1595 asection *sec = abfd->sections;
1596 hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
1597 ELFNN_R_SYM (rel->r_info));
1598 void **slot;
1599
1600 e.id = sec->id;
1601 e.r_sym = ELFNN_R_SYM (rel->r_info);
1602 slot = htab_find_slot_with_hash (ia64_info->loc_hash_table, &e, h,
1603 create ? INSERT : NO_INSERT);
1604
1605 if (!slot)
1606 return NULL;
1607
1608 if (*slot)
1609 return (struct elfNN_ia64_local_hash_entry *) *slot;
1610
1611 ret = (struct elfNN_ia64_local_hash_entry *)
1612 objalloc_alloc ((struct objalloc *) ia64_info->loc_hash_memory,
1613 sizeof (struct elfNN_ia64_local_hash_entry));
1614 if (ret)
1615 {
1616 memset (ret, 0, sizeof (*ret));
1617 ret->id = sec->id;
1618 ret->r_sym = ELFNN_R_SYM (rel->r_info);
1619 *slot = ret;
1620 }
1621 return ret;
1622 }
1623
1624 /* Used to sort elfNN_ia64_dyn_sym_info array. */
1625
1626 static int
1627 addend_compare (const void *xp, const void *yp)
1628 {
1629 const struct elfNN_ia64_dyn_sym_info *x
1630 = (const struct elfNN_ia64_dyn_sym_info *) xp;
1631 const struct elfNN_ia64_dyn_sym_info *y
1632 = (const struct elfNN_ia64_dyn_sym_info *) yp;
1633
1634 return x->addend < y->addend ? -1 : x->addend > y->addend ? 1 : 0;
1635 }
1636
1637 /* Sort elfNN_ia64_dyn_sym_info array and remove duplicates. */
1638
1639 static unsigned int
1640 sort_dyn_sym_info (struct elfNN_ia64_dyn_sym_info *info,
1641 unsigned int count)
1642 {
1643 bfd_vma curr, prev, got_offset;
1644 unsigned int i, kept, dupes, diff, dest, src, len;
1645
1646 qsort (info, count, sizeof (*info), addend_compare);
1647
1648 /* Find the first duplicate. */
1649 prev = info [0].addend;
1650 got_offset = info [0].got_offset;
1651 for (i = 1; i < count; i++)
1652 {
1653 curr = info [i].addend;
1654 if (curr == prev)
1655 {
1656 /* For duplicates, make sure that GOT_OFFSET is valid. */
1657 if (got_offset == (bfd_vma) -1)
1658 got_offset = info [i].got_offset;
1659 break;
1660 }
1661 got_offset = info [i].got_offset;
1662 prev = curr;
1663 }
1664
1665 /* We may move a block of elements to here. */
1666 dest = i++;
1667
1668 /* Remove duplicates. */
1669 if (i < count)
1670 {
1671 while (i < count)
1672 {
1673 /* For duplicates, make sure that the kept one has a valid
1674 got_offset. */
1675 kept = dest - 1;
1676 if (got_offset != (bfd_vma) -1)
1677 info [kept].got_offset = got_offset;
1678
1679 curr = info [i].addend;
1680 got_offset = info [i].got_offset;
1681
1682 /* Move a block of elements whose first one is different from
1683 the previous. */
1684 if (curr == prev)
1685 {
1686 for (src = i + 1; src < count; src++)
1687 {
1688 if (info [src].addend != curr)
1689 break;
1690 /* For duplicates, make sure that GOT_OFFSET is
1691 valid. */
1692 if (got_offset == (bfd_vma) -1)
1693 got_offset = info [src].got_offset;
1694 }
1695
1696 /* Make sure that the kept one has a valid got_offset. */
1697 if (got_offset != (bfd_vma) -1)
1698 info [kept].got_offset = got_offset;
1699 }
1700 else
1701 src = i;
1702
1703 if (src >= count)
1704 break;
1705
1706 /* Find the next duplicate. SRC will be kept. */
1707 prev = info [src].addend;
1708 got_offset = info [src].got_offset;
1709 for (dupes = src + 1; dupes < count; dupes ++)
1710 {
1711 curr = info [dupes].addend;
1712 if (curr == prev)
1713 {
1714 /* Make sure that got_offset is valid. */
1715 if (got_offset == (bfd_vma) -1)
1716 got_offset = info [dupes].got_offset;
1717
1718 /* For duplicates, make sure that the kept one has
1719 a valid got_offset. */
1720 if (got_offset != (bfd_vma) -1)
1721 info [dupes - 1].got_offset = got_offset;
1722 break;
1723 }
1724 got_offset = info [dupes].got_offset;
1725 prev = curr;
1726 }
1727
1728 /* How much to move. */
1729 len = dupes - src;
1730 i = dupes + 1;
1731
1732 if (len == 1 && dupes < count)
1733 {
1734 /* If we only move 1 element, we combine it with the next
1735 one. There must be at least a duplicate. Find the
1736 next different one. */
1737 for (diff = dupes + 1, src++; diff < count; diff++, src++)
1738 {
1739 if (info [diff].addend != curr)
1740 break;
1741 /* Make sure that got_offset is valid. */
1742 if (got_offset == (bfd_vma) -1)
1743 got_offset = info [diff].got_offset;
1744 }
1745
1746 /* Makre sure that the last duplicated one has an valid
1747 offset. */
1748 BFD_ASSERT (curr == prev);
1749 if (got_offset != (bfd_vma) -1)
1750 info [diff - 1].got_offset = got_offset;
1751
1752 if (diff < count)
1753 {
1754 /* Find the next duplicate. Track the current valid
1755 offset. */
1756 prev = info [diff].addend;
1757 got_offset = info [diff].got_offset;
1758 for (dupes = diff + 1; dupes < count; dupes ++)
1759 {
1760 curr = info [dupes].addend;
1761 if (curr == prev)
1762 {
1763 /* For duplicates, make sure that GOT_OFFSET
1764 is valid. */
1765 if (got_offset == (bfd_vma) -1)
1766 got_offset = info [dupes].got_offset;
1767 break;
1768 }
1769 got_offset = info [dupes].got_offset;
1770 prev = curr;
1771 diff++;
1772 }
1773
1774 len = diff - src + 1;
1775 i = diff + 1;
1776 }
1777 }
1778
1779 memmove (&info [dest], &info [src], len * sizeof (*info));
1780
1781 dest += len;
1782 }
1783
1784 count = dest;
1785 }
1786 else
1787 {
1788 /* When we get here, either there is no duplicate at all or
1789 the only duplicate is the last element. */
1790 if (dest < count)
1791 {
1792 /* If the last element is a duplicate, make sure that the
1793 kept one has a valid got_offset. We also update count. */
1794 if (got_offset != (bfd_vma) -1)
1795 info [dest - 1].got_offset = got_offset;
1796 count = dest;
1797 }
1798 }
1799
1800 return count;
1801 }
1802
1803 /* Find and/or create a descriptor for dynamic symbol info. This will
1804 vary based on global or local symbol, and the addend to the reloc.
1805
1806 We don't sort when inserting. Also, we sort and eliminate
1807 duplicates if there is an unsorted section. Typically, this will
1808 only happen once, because we do all insertions before lookups. We
1809 then use bsearch to do a lookup. This also allows lookups to be
1810 fast. So we have fast insertion (O(log N) due to duplicate check),
1811 fast lookup (O(log N)) and one sort (O(N log N) expected time).
1812 Previously, all lookups were O(N) because of the use of the linked
1813 list and also all insertions were O(N) because of the check for
1814 duplicates. There are some complications here because the array
1815 size grows occasionally, which may add an O(N) factor, but this
1816 should be rare. Also, we free the excess array allocation, which
1817 requires a copy which is O(N), but this only happens once. */
1818
1819 static struct elfNN_ia64_dyn_sym_info *
1820 get_dyn_sym_info (struct elfNN_ia64_link_hash_table *ia64_info,
1821 struct elf_link_hash_entry *h, bfd *abfd,
1822 const Elf_Internal_Rela *rel, bool create)
1823 {
1824 struct elfNN_ia64_dyn_sym_info **info_p, *info, *dyn_i, key;
1825 unsigned int *count_p, *sorted_count_p, *size_p;
1826 unsigned int count, sorted_count, size;
1827 bfd_vma addend = rel ? rel->r_addend : 0;
1828 bfd_size_type amt;
1829
1830 if (h)
1831 {
1832 struct elfNN_ia64_link_hash_entry *global_h;
1833
1834 global_h = (struct elfNN_ia64_link_hash_entry *) h;
1835 info_p = &global_h->info;
1836 count_p = &global_h->count;
1837 sorted_count_p = &global_h->sorted_count;
1838 size_p = &global_h->size;
1839 }
1840 else
1841 {
1842 struct elfNN_ia64_local_hash_entry *loc_h;
1843
1844 loc_h = get_local_sym_hash (ia64_info, abfd, rel, create);
1845 if (!loc_h)
1846 {
1847 BFD_ASSERT (!create);
1848 return NULL;
1849 }
1850
1851 info_p = &loc_h->info;
1852 count_p = &loc_h->count;
1853 sorted_count_p = &loc_h->sorted_count;
1854 size_p = &loc_h->size;
1855 }
1856
1857 count = *count_p;
1858 sorted_count = *sorted_count_p;
1859 size = *size_p;
1860 info = *info_p;
1861 if (create)
1862 {
1863 /* When we create the array, we don't check for duplicates,
1864 except in the previously sorted section if one exists, and
1865 against the last inserted entry. This allows insertions to
1866 be fast. */
1867 if (info)
1868 {
1869 if (sorted_count)
1870 {
1871 /* Try bsearch first on the sorted section. */
1872 key.addend = addend;
1873 dyn_i = bsearch (&key, info, sorted_count,
1874 sizeof (*info), addend_compare);
1875 if (dyn_i)
1876 return dyn_i;
1877 }
1878
1879 if (count != 0)
1880 {
1881 /* Do a quick check for the last inserted entry. */
1882 dyn_i = info + count - 1;
1883 if (dyn_i->addend == addend)
1884 return dyn_i;
1885 }
1886 }
1887
1888 if (size == 0)
1889 {
1890 /* It is the very first element. We create the array of size
1891 1. */
1892 size = 1;
1893 amt = size * sizeof (*info);
1894 info = bfd_malloc (amt);
1895 }
1896 else if (size <= count)
1897 {
1898 /* We double the array size every time when we reach the
1899 size limit. */
1900 size += size;
1901 amt = size * sizeof (*info);
1902 info = bfd_realloc (info, amt);
1903 }
1904 else
1905 goto has_space;
1906
1907 if (info == NULL)
1908 return NULL;
1909 *size_p = size;
1910 *info_p = info;
1911
1912 has_space:
1913 /* Append the new one to the array. */
1914 dyn_i = info + count;
1915 memset (dyn_i, 0, sizeof (*dyn_i));
1916 dyn_i->got_offset = (bfd_vma) -1;
1917 dyn_i->addend = addend;
1918
1919 /* We increment count only since the new ones are unsorted and
1920 may have duplicate. */
1921 (*count_p)++;
1922 }
1923 else
1924 {
1925 /* It is a lookup without insertion. Sort array if part of the
1926 array isn't sorted. */
1927 if (count != sorted_count)
1928 {
1929 count = sort_dyn_sym_info (info, count);
1930 *count_p = count;
1931 *sorted_count_p = count;
1932 }
1933
1934 /* Free unused memory. */
1935 if (size != count)
1936 {
1937 amt = count * sizeof (*info);
1938 info = bfd_realloc (info, amt);
1939 *size_p = count;
1940 if (info == NULL && count != 0)
1941 /* realloc should never fail since we are reducing size here,
1942 but if it does use the old array. */
1943 info = *info_p;
1944 else
1945 *info_p = info;
1946 }
1947
1948 if (count == 0)
1949 dyn_i = NULL;
1950 else
1951 {
1952 key.addend = addend;
1953 dyn_i = bsearch (&key, info, count, sizeof (*info), addend_compare);
1954 }
1955 }
1956
1957 return dyn_i;
1958 }
1959
1960 static asection *
1961 get_got (bfd *abfd, struct bfd_link_info *info,
1962 struct elfNN_ia64_link_hash_table *ia64_info)
1963 {
1964 asection *got;
1965 bfd *dynobj;
1966
1967 got = ia64_info->root.sgot;
1968 if (!got)
1969 {
1970 flagword flags;
1971
1972 dynobj = ia64_info->root.dynobj;
1973 if (!dynobj)
1974 ia64_info->root.dynobj = dynobj = abfd;
1975 if (!_bfd_elf_create_got_section (dynobj, info))
1976 return NULL;
1977
1978 got = ia64_info->root.sgot;
1979
1980 /* The .got section is always aligned at 8 bytes. */
1981 if (!bfd_set_section_alignment (got, 3))
1982 return NULL;
1983
1984 flags = bfd_section_flags (got);
1985 if (!bfd_set_section_flags (got, SEC_SMALL_DATA | flags))
1986 return NULL;
1987 }
1988
1989 return got;
1990 }
1991
1992 /* Create function descriptor section (.opd). This section is called .opd
1993 because it contains "official procedure descriptors". The "official"
1994 refers to the fact that these descriptors are used when taking the address
1995 of a procedure, thus ensuring a unique address for each procedure. */
1996
1997 static asection *
1998 get_fptr (bfd *abfd, struct bfd_link_info *info,
1999 struct elfNN_ia64_link_hash_table *ia64_info)
2000 {
2001 asection *fptr;
2002 bfd *dynobj;
2003
2004 fptr = ia64_info->fptr_sec;
2005 if (!fptr)
2006 {
2007 dynobj = ia64_info->root.dynobj;
2008 if (!dynobj)
2009 ia64_info->root.dynobj = dynobj = abfd;
2010
2011 fptr = bfd_make_section_anyway_with_flags (dynobj, ".opd",
2012 (SEC_ALLOC
2013 | SEC_LOAD
2014 | SEC_HAS_CONTENTS
2015 | SEC_IN_MEMORY
2016 | (bfd_link_pie (info)
2017 ? 0 : SEC_READONLY)
2018 | SEC_LINKER_CREATED));
2019 if (!fptr
2020 || !bfd_set_section_alignment (fptr, 4))
2021 {
2022 BFD_ASSERT (0);
2023 return NULL;
2024 }
2025
2026 ia64_info->fptr_sec = fptr;
2027
2028 if (bfd_link_pie (info))
2029 {
2030 asection *fptr_rel;
2031 fptr_rel = bfd_make_section_anyway_with_flags (dynobj, ".rela.opd",
2032 (SEC_ALLOC | SEC_LOAD
2033 | SEC_HAS_CONTENTS
2034 | SEC_IN_MEMORY
2035 | SEC_LINKER_CREATED
2036 | SEC_READONLY));
2037 if (fptr_rel == NULL
2038 || !bfd_set_section_alignment (fptr_rel, LOG_SECTION_ALIGN))
2039 {
2040 BFD_ASSERT (0);
2041 return NULL;
2042 }
2043
2044 ia64_info->rel_fptr_sec = fptr_rel;
2045 }
2046 }
2047
2048 return fptr;
2049 }
2050
2051 static asection *
2052 get_pltoff (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED,
2053 struct elfNN_ia64_link_hash_table *ia64_info)
2054 {
2055 asection *pltoff;
2056 bfd *dynobj;
2057
2058 pltoff = ia64_info->pltoff_sec;
2059 if (!pltoff)
2060 {
2061 dynobj = ia64_info->root.dynobj;
2062 if (!dynobj)
2063 ia64_info->root.dynobj = dynobj = abfd;
2064
2065 pltoff = bfd_make_section_anyway_with_flags (dynobj,
2066 ELF_STRING_ia64_pltoff,
2067 (SEC_ALLOC
2068 | SEC_LOAD
2069 | SEC_HAS_CONTENTS
2070 | SEC_IN_MEMORY
2071 | SEC_SMALL_DATA
2072 | SEC_LINKER_CREATED));
2073 if (!pltoff
2074 || !bfd_set_section_alignment (pltoff, 4))
2075 {
2076 BFD_ASSERT (0);
2077 return NULL;
2078 }
2079
2080 ia64_info->pltoff_sec = pltoff;
2081 }
2082
2083 return pltoff;
2084 }
2085
2086 static asection *
2087 get_reloc_section (bfd *abfd,
2088 struct elfNN_ia64_link_hash_table *ia64_info,
2089 asection *sec, bool create)
2090 {
2091 const char *srel_name;
2092 asection *srel;
2093 bfd *dynobj;
2094
2095 srel_name = (bfd_elf_string_from_elf_section
2096 (abfd, elf_elfheader(abfd)->e_shstrndx,
2097 _bfd_elf_single_rel_hdr (sec)->sh_name));
2098 if (srel_name == NULL)
2099 return NULL;
2100
2101 dynobj = ia64_info->root.dynobj;
2102 if (!dynobj)
2103 ia64_info->root.dynobj = dynobj = abfd;
2104
2105 srel = bfd_get_linker_section (dynobj, srel_name);
2106 if (srel == NULL && create)
2107 {
2108 srel = bfd_make_section_anyway_with_flags (dynobj, srel_name,
2109 (SEC_ALLOC | SEC_LOAD
2110 | SEC_HAS_CONTENTS
2111 | SEC_IN_MEMORY
2112 | SEC_LINKER_CREATED
2113 | SEC_READONLY));
2114 if (srel == NULL
2115 || !bfd_set_section_alignment (srel, LOG_SECTION_ALIGN))
2116 return NULL;
2117 }
2118
2119 return srel;
2120 }
2121
2122 static bool
2123 count_dyn_reloc (bfd *abfd, struct elfNN_ia64_dyn_sym_info *dyn_i,
2124 asection *srel, int type, bool reltext)
2125 {
2126 struct elfNN_ia64_dyn_reloc_entry *rent;
2127
2128 for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
2129 if (rent->srel == srel && rent->type == type)
2130 break;
2131
2132 if (!rent)
2133 {
2134 rent = ((struct elfNN_ia64_dyn_reloc_entry *)
2135 bfd_alloc (abfd, (bfd_size_type) sizeof (*rent)));
2136 if (!rent)
2137 return false;
2138
2139 rent->next = dyn_i->reloc_entries;
2140 rent->srel = srel;
2141 rent->type = type;
2142 rent->count = 0;
2143 dyn_i->reloc_entries = rent;
2144 }
2145 rent->reltext = reltext;
2146 rent->count++;
2147
2148 return true;
2149 }
2150
2151 static bool
2152 elfNN_ia64_check_relocs (bfd *abfd, struct bfd_link_info *info,
2153 asection *sec,
2154 const Elf_Internal_Rela *relocs)
2155 {
2156 struct elfNN_ia64_link_hash_table *ia64_info;
2157 const Elf_Internal_Rela *relend;
2158 Elf_Internal_Shdr *symtab_hdr;
2159 const Elf_Internal_Rela *rel;
2160 asection *got, *fptr, *srel, *pltoff;
2161 enum {
2162 NEED_GOT = 1,
2163 NEED_GOTX = 2,
2164 NEED_FPTR = 4,
2165 NEED_PLTOFF = 8,
2166 NEED_MIN_PLT = 16,
2167 NEED_FULL_PLT = 32,
2168 NEED_DYNREL = 64,
2169 NEED_LTOFF_FPTR = 128,
2170 NEED_TPREL = 256,
2171 NEED_DTPMOD = 512,
2172 NEED_DTPREL = 1024
2173 };
2174 int need_entry;
2175 struct elf_link_hash_entry *h;
2176 unsigned long r_symndx;
2177 bool maybe_dynamic;
2178
2179 if (bfd_link_relocatable (info))
2180 return true;
2181
2182 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2183 ia64_info = elfNN_ia64_hash_table (info);
2184 if (ia64_info == NULL)
2185 return false;
2186
2187 got = fptr = srel = pltoff = NULL;
2188
2189 relend = relocs + sec->reloc_count;
2190
2191 /* We scan relocations first to create dynamic relocation arrays. We
2192 modified get_dyn_sym_info to allow fast insertion and support fast
2193 lookup in the next loop. */
2194 for (rel = relocs; rel < relend; ++rel)
2195 {
2196 r_symndx = ELFNN_R_SYM (rel->r_info);
2197 if (r_symndx >= symtab_hdr->sh_info)
2198 {
2199 long indx = r_symndx - symtab_hdr->sh_info;
2200 h = elf_sym_hashes (abfd)[indx];
2201 while (h->root.type == bfd_link_hash_indirect
2202 || h->root.type == bfd_link_hash_warning)
2203 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2204 }
2205 else
2206 h = NULL;
2207
2208 /* We can only get preliminary data on whether a symbol is
2209 locally or externally defined, as not all of the input files
2210 have yet been processed. Do something with what we know, as
2211 this may help reduce memory usage and processing time later. */
2212 maybe_dynamic = (h && ((!bfd_link_executable (info)
2213 && (!SYMBOLIC_BIND (info, h)
2214 || info->unresolved_syms_in_shared_libs == RM_IGNORE))
2215 || !h->def_regular
2216 || h->root.type == bfd_link_hash_defweak));
2217
2218 need_entry = 0;
2219 switch (ELFNN_R_TYPE (rel->r_info))
2220 {
2221 case R_IA64_TPREL64MSB:
2222 case R_IA64_TPREL64LSB:
2223 if (bfd_link_pic (info) || maybe_dynamic)
2224 need_entry = NEED_DYNREL;
2225 break;
2226
2227 case R_IA64_LTOFF_TPREL22:
2228 need_entry = NEED_TPREL;
2229 if (bfd_link_pic (info))
2230 info->flags |= DF_STATIC_TLS;
2231 break;
2232
2233 case R_IA64_DTPREL32MSB:
2234 case R_IA64_DTPREL32LSB:
2235 case R_IA64_DTPREL64MSB:
2236 case R_IA64_DTPREL64LSB:
2237 if (bfd_link_pic (info) || maybe_dynamic)
2238 need_entry = NEED_DYNREL;
2239 break;
2240
2241 case R_IA64_LTOFF_DTPREL22:
2242 need_entry = NEED_DTPREL;
2243 break;
2244
2245 case R_IA64_DTPMOD64MSB:
2246 case R_IA64_DTPMOD64LSB:
2247 if (bfd_link_pic (info) || maybe_dynamic)
2248 need_entry = NEED_DYNREL;
2249 break;
2250
2251 case R_IA64_LTOFF_DTPMOD22:
2252 need_entry = NEED_DTPMOD;
2253 break;
2254
2255 case R_IA64_LTOFF_FPTR22:
2256 case R_IA64_LTOFF_FPTR64I:
2257 case R_IA64_LTOFF_FPTR32MSB:
2258 case R_IA64_LTOFF_FPTR32LSB:
2259 case R_IA64_LTOFF_FPTR64MSB:
2260 case R_IA64_LTOFF_FPTR64LSB:
2261 need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
2262 break;
2263
2264 case R_IA64_FPTR64I:
2265 case R_IA64_FPTR32MSB:
2266 case R_IA64_FPTR32LSB:
2267 case R_IA64_FPTR64MSB:
2268 case R_IA64_FPTR64LSB:
2269 if (bfd_link_pic (info) || h)
2270 need_entry = NEED_FPTR | NEED_DYNREL;
2271 else
2272 need_entry = NEED_FPTR;
2273 break;
2274
2275 case R_IA64_LTOFF22:
2276 case R_IA64_LTOFF64I:
2277 need_entry = NEED_GOT;
2278 break;
2279
2280 case R_IA64_LTOFF22X:
2281 need_entry = NEED_GOTX;
2282 break;
2283
2284 case R_IA64_PLTOFF22:
2285 case R_IA64_PLTOFF64I:
2286 case R_IA64_PLTOFF64MSB:
2287 case R_IA64_PLTOFF64LSB:
2288 need_entry = NEED_PLTOFF;
2289 if (h)
2290 {
2291 if (maybe_dynamic)
2292 need_entry |= NEED_MIN_PLT;
2293 }
2294 else
2295 {
2296 (*info->callbacks->warning)
2297 (info, _("@pltoff reloc against local symbol"), 0,
2298 abfd, 0, (bfd_vma) 0);
2299 }
2300 break;
2301
2302 case R_IA64_PCREL21B:
2303 case R_IA64_PCREL60B:
2304 /* Depending on where this symbol is defined, we may or may not
2305 need a full plt entry. Only skip if we know we'll not need
2306 the entry -- static or symbolic, and the symbol definition
2307 has already been seen. */
2308 if (maybe_dynamic && rel->r_addend == 0)
2309 need_entry = NEED_FULL_PLT;
2310 break;
2311
2312 case R_IA64_IMM14:
2313 case R_IA64_IMM22:
2314 case R_IA64_IMM64:
2315 case R_IA64_DIR32MSB:
2316 case R_IA64_DIR32LSB:
2317 case R_IA64_DIR64MSB:
2318 case R_IA64_DIR64LSB:
2319 /* Shared objects will always need at least a REL relocation. */
2320 if (bfd_link_pic (info) || maybe_dynamic)
2321 need_entry = NEED_DYNREL;
2322 break;
2323
2324 case R_IA64_IPLTMSB:
2325 case R_IA64_IPLTLSB:
2326 /* Shared objects will always need at least a REL relocation. */
2327 if (bfd_link_pic (info) || maybe_dynamic)
2328 need_entry = NEED_DYNREL;
2329 break;
2330
2331 case R_IA64_PCREL22:
2332 case R_IA64_PCREL64I:
2333 case R_IA64_PCREL32MSB:
2334 case R_IA64_PCREL32LSB:
2335 case R_IA64_PCREL64MSB:
2336 case R_IA64_PCREL64LSB:
2337 if (maybe_dynamic)
2338 need_entry = NEED_DYNREL;
2339 break;
2340 }
2341
2342 if (!need_entry)
2343 continue;
2344
2345 if ((need_entry & NEED_FPTR) != 0
2346 && rel->r_addend)
2347 {
2348 (*info->callbacks->warning)
2349 (info, _("non-zero addend in @fptr reloc"), 0,
2350 abfd, 0, (bfd_vma) 0);
2351 }
2352
2353 if (get_dyn_sym_info (ia64_info, h, abfd, rel, true) == NULL)
2354 return false;
2355 }
2356
2357 /* Now, we only do lookup without insertion, which is very fast
2358 with the modified get_dyn_sym_info. */
2359 for (rel = relocs; rel < relend; ++rel)
2360 {
2361 struct elfNN_ia64_dyn_sym_info *dyn_i;
2362 int dynrel_type = R_IA64_NONE;
2363
2364 r_symndx = ELFNN_R_SYM (rel->r_info);
2365 if (r_symndx >= symtab_hdr->sh_info)
2366 {
2367 /* We're dealing with a global symbol -- find its hash entry
2368 and mark it as being referenced. */
2369 long indx = r_symndx - symtab_hdr->sh_info;
2370 h = elf_sym_hashes (abfd)[indx];
2371 while (h->root.type == bfd_link_hash_indirect
2372 || h->root.type == bfd_link_hash_warning)
2373 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2374
2375 /* PR15323, ref flags aren't set for references in the same
2376 object. */
2377 h->ref_regular = 1;
2378 }
2379 else
2380 h = NULL;
2381
2382 /* We can only get preliminary data on whether a symbol is
2383 locally or externally defined, as not all of the input files
2384 have yet been processed. Do something with what we know, as
2385 this may help reduce memory usage and processing time later. */
2386 maybe_dynamic = (h && ((!bfd_link_executable (info)
2387 && (!SYMBOLIC_BIND (info, h)
2388 || info->unresolved_syms_in_shared_libs == RM_IGNORE))
2389 || !h->def_regular
2390 || h->root.type == bfd_link_hash_defweak));
2391
2392 need_entry = 0;
2393 switch (ELFNN_R_TYPE (rel->r_info))
2394 {
2395 case R_IA64_TPREL64MSB:
2396 case R_IA64_TPREL64LSB:
2397 if (bfd_link_pic (info) || maybe_dynamic)
2398 need_entry = NEED_DYNREL;
2399 dynrel_type = R_IA64_TPREL64LSB;
2400 if (bfd_link_pic (info))
2401 info->flags |= DF_STATIC_TLS;
2402 break;
2403
2404 case R_IA64_LTOFF_TPREL22:
2405 need_entry = NEED_TPREL;
2406 if (bfd_link_pic (info))
2407 info->flags |= DF_STATIC_TLS;
2408 break;
2409
2410 case R_IA64_DTPREL32MSB:
2411 case R_IA64_DTPREL32LSB:
2412 case R_IA64_DTPREL64MSB:
2413 case R_IA64_DTPREL64LSB:
2414 if (bfd_link_pic (info) || maybe_dynamic)
2415 need_entry = NEED_DYNREL;
2416 dynrel_type = R_IA64_DTPRELNNLSB;
2417 break;
2418
2419 case R_IA64_LTOFF_DTPREL22:
2420 need_entry = NEED_DTPREL;
2421 break;
2422
2423 case R_IA64_DTPMOD64MSB:
2424 case R_IA64_DTPMOD64LSB:
2425 if (bfd_link_pic (info) || maybe_dynamic)
2426 need_entry = NEED_DYNREL;
2427 dynrel_type = R_IA64_DTPMOD64LSB;
2428 break;
2429
2430 case R_IA64_LTOFF_DTPMOD22:
2431 need_entry = NEED_DTPMOD;
2432 break;
2433
2434 case R_IA64_LTOFF_FPTR22:
2435 case R_IA64_LTOFF_FPTR64I:
2436 case R_IA64_LTOFF_FPTR32MSB:
2437 case R_IA64_LTOFF_FPTR32LSB:
2438 case R_IA64_LTOFF_FPTR64MSB:
2439 case R_IA64_LTOFF_FPTR64LSB:
2440 need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
2441 break;
2442
2443 case R_IA64_FPTR64I:
2444 case R_IA64_FPTR32MSB:
2445 case R_IA64_FPTR32LSB:
2446 case R_IA64_FPTR64MSB:
2447 case R_IA64_FPTR64LSB:
2448 if (bfd_link_pic (info) || h)
2449 need_entry = NEED_FPTR | NEED_DYNREL;
2450 else
2451 need_entry = NEED_FPTR;
2452 dynrel_type = R_IA64_FPTRNNLSB;
2453 break;
2454
2455 case R_IA64_LTOFF22:
2456 case R_IA64_LTOFF64I:
2457 need_entry = NEED_GOT;
2458 break;
2459
2460 case R_IA64_LTOFF22X:
2461 need_entry = NEED_GOTX;
2462 break;
2463
2464 case R_IA64_PLTOFF22:
2465 case R_IA64_PLTOFF64I:
2466 case R_IA64_PLTOFF64MSB:
2467 case R_IA64_PLTOFF64LSB:
2468 need_entry = NEED_PLTOFF;
2469 if (h)
2470 {
2471 if (maybe_dynamic)
2472 need_entry |= NEED_MIN_PLT;
2473 }
2474 break;
2475
2476 case R_IA64_PCREL21B:
2477 case R_IA64_PCREL60B:
2478 /* Depending on where this symbol is defined, we may or may not
2479 need a full plt entry. Only skip if we know we'll not need
2480 the entry -- static or symbolic, and the symbol definition
2481 has already been seen. */
2482 if (maybe_dynamic && rel->r_addend == 0)
2483 need_entry = NEED_FULL_PLT;
2484 break;
2485
2486 case R_IA64_IMM14:
2487 case R_IA64_IMM22:
2488 case R_IA64_IMM64:
2489 case R_IA64_DIR32MSB:
2490 case R_IA64_DIR32LSB:
2491 case R_IA64_DIR64MSB:
2492 case R_IA64_DIR64LSB:
2493 /* Shared objects will always need at least a REL relocation. */
2494 if (bfd_link_pic (info) || maybe_dynamic)
2495 need_entry = NEED_DYNREL;
2496 dynrel_type = R_IA64_DIRNNLSB;
2497 break;
2498
2499 case R_IA64_IPLTMSB:
2500 case R_IA64_IPLTLSB:
2501 /* Shared objects will always need at least a REL relocation. */
2502 if (bfd_link_pic (info) || maybe_dynamic)
2503 need_entry = NEED_DYNREL;
2504 dynrel_type = R_IA64_IPLTLSB;
2505 break;
2506
2507 case R_IA64_PCREL22:
2508 case R_IA64_PCREL64I:
2509 case R_IA64_PCREL32MSB:
2510 case R_IA64_PCREL32LSB:
2511 case R_IA64_PCREL64MSB:
2512 case R_IA64_PCREL64LSB:
2513 if (maybe_dynamic)
2514 need_entry = NEED_DYNREL;
2515 dynrel_type = R_IA64_PCRELNNLSB;
2516 break;
2517 }
2518
2519 if (!need_entry)
2520 continue;
2521
2522 dyn_i = get_dyn_sym_info (ia64_info, h, abfd, rel, false);
2523
2524 /* Record whether or not this is a local symbol. */
2525 dyn_i->h = h;
2526
2527 /* Create what's needed. */
2528 if (need_entry & (NEED_GOT | NEED_GOTX | NEED_TPREL
2529 | NEED_DTPMOD | NEED_DTPREL))
2530 {
2531 if (!got)
2532 {
2533 got = get_got (abfd, info, ia64_info);
2534 if (!got)
2535 return false;
2536 }
2537 if (need_entry & NEED_GOT)
2538 dyn_i->want_got = 1;
2539 if (need_entry & NEED_GOTX)
2540 dyn_i->want_gotx = 1;
2541 if (need_entry & NEED_TPREL)
2542 dyn_i->want_tprel = 1;
2543 if (need_entry & NEED_DTPMOD)
2544 dyn_i->want_dtpmod = 1;
2545 if (need_entry & NEED_DTPREL)
2546 dyn_i->want_dtprel = 1;
2547 }
2548 if (need_entry & NEED_FPTR)
2549 {
2550 if (!fptr)
2551 {
2552 fptr = get_fptr (abfd, info, ia64_info);
2553 if (!fptr)
2554 return false;
2555 }
2556
2557 /* FPTRs for shared libraries are allocated by the dynamic
2558 linker. Make sure this local symbol will appear in the
2559 dynamic symbol table. */
2560 if (!h && bfd_link_pic (info))
2561 {
2562 if (! (bfd_elf_link_record_local_dynamic_symbol
2563 (info, abfd, (long) r_symndx)))
2564 return false;
2565 }
2566
2567 dyn_i->want_fptr = 1;
2568 }
2569 if (need_entry & NEED_LTOFF_FPTR)
2570 dyn_i->want_ltoff_fptr = 1;
2571 if (need_entry & (NEED_MIN_PLT | NEED_FULL_PLT))
2572 {
2573 if (!ia64_info->root.dynobj)
2574 ia64_info->root.dynobj = abfd;
2575 h->needs_plt = 1;
2576 dyn_i->want_plt = 1;
2577 }
2578 if (need_entry & NEED_FULL_PLT)
2579 dyn_i->want_plt2 = 1;
2580 if (need_entry & NEED_PLTOFF)
2581 {
2582 /* This is needed here, in case @pltoff is used in a non-shared
2583 link. */
2584 if (!pltoff)
2585 {
2586 pltoff = get_pltoff (abfd, info, ia64_info);
2587 if (!pltoff)
2588 return false;
2589 }
2590
2591 dyn_i->want_pltoff = 1;
2592 }
2593 if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
2594 {
2595 if (!srel)
2596 {
2597 srel = get_reloc_section (abfd, ia64_info, sec, true);
2598 if (!srel)
2599 return false;
2600 }
2601 if (!count_dyn_reloc (abfd, dyn_i, srel, dynrel_type,
2602 (sec->flags & SEC_READONLY) != 0))
2603 return false;
2604 }
2605 }
2606
2607 return true;
2608 }
2609
2610 /* For cleanliness, and potentially faster dynamic loading, allocate
2611 external GOT entries first. */
2612
2613 static bool
2614 allocate_global_data_got (struct elfNN_ia64_dyn_sym_info *dyn_i,
2615 void * data)
2616 {
2617 struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2618
2619 if ((dyn_i->want_got || dyn_i->want_gotx)
2620 && ! dyn_i->want_fptr
2621 && elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0))
2622 {
2623 dyn_i->got_offset = x->ofs;
2624 x->ofs += 8;
2625 }
2626 if (dyn_i->want_tprel)
2627 {
2628 dyn_i->tprel_offset = x->ofs;
2629 x->ofs += 8;
2630 }
2631 if (dyn_i->want_dtpmod)
2632 {
2633 if (elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0))
2634 {
2635 dyn_i->dtpmod_offset = x->ofs;
2636 x->ofs += 8;
2637 }
2638 else
2639 {
2640 struct elfNN_ia64_link_hash_table *ia64_info;
2641
2642 ia64_info = elfNN_ia64_hash_table (x->info);
2643 if (ia64_info == NULL)
2644 return false;
2645
2646 if (ia64_info->self_dtpmod_offset == (bfd_vma) -1)
2647 {
2648 ia64_info->self_dtpmod_offset = x->ofs;
2649 x->ofs += 8;
2650 }
2651 dyn_i->dtpmod_offset = ia64_info->self_dtpmod_offset;
2652 }
2653 }
2654 if (dyn_i->want_dtprel)
2655 {
2656 dyn_i->dtprel_offset = x->ofs;
2657 x->ofs += 8;
2658 }
2659 return true;
2660 }
2661
2662 /* Next, allocate all the GOT entries used by LTOFF_FPTR relocs. */
2663
2664 static bool
2665 allocate_global_fptr_got (struct elfNN_ia64_dyn_sym_info *dyn_i,
2666 void * data)
2667 {
2668 struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2669
2670 if (dyn_i->want_got
2671 && dyn_i->want_fptr
2672 && elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, R_IA64_FPTRNNLSB))
2673 {
2674 dyn_i->got_offset = x->ofs;
2675 x->ofs += 8;
2676 }
2677 return true;
2678 }
2679
2680 /* Lastly, allocate all the GOT entries for local data. */
2681
2682 static bool
2683 allocate_local_got (struct elfNN_ia64_dyn_sym_info *dyn_i,
2684 void * data)
2685 {
2686 struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2687
2688 if ((dyn_i->want_got || dyn_i->want_gotx)
2689 && !elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0))
2690 {
2691 dyn_i->got_offset = x->ofs;
2692 x->ofs += 8;
2693 }
2694 return true;
2695 }
2696
2697 /* Search for the index of a global symbol in it's defining object file. */
2698
2699 static long
2700 global_sym_index (struct elf_link_hash_entry *h)
2701 {
2702 struct elf_link_hash_entry **p;
2703 bfd *obj;
2704
2705 BFD_ASSERT (h->root.type == bfd_link_hash_defined
2706 || h->root.type == bfd_link_hash_defweak);
2707
2708 obj = h->root.u.def.section->owner;
2709 for (p = elf_sym_hashes (obj); *p != h; ++p)
2710 continue;
2711
2712 return p - elf_sym_hashes (obj) + elf_tdata (obj)->symtab_hdr.sh_info;
2713 }
2714
2715 /* Allocate function descriptors. We can do these for every function
2716 in a main executable that is not exported. */
2717
2718 static bool
2719 allocate_fptr (struct elfNN_ia64_dyn_sym_info *dyn_i, void * data)
2720 {
2721 struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2722
2723 if (dyn_i->want_fptr)
2724 {
2725 struct elf_link_hash_entry *h = dyn_i->h;
2726
2727 if (h)
2728 while (h->root.type == bfd_link_hash_indirect
2729 || h->root.type == bfd_link_hash_warning)
2730 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2731
2732 if (!bfd_link_executable (x->info)
2733 && (!h
2734 || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2735 || (h->root.type != bfd_link_hash_undefweak
2736 && h->root.type != bfd_link_hash_undefined)))
2737 {
2738 if (h && h->dynindx == -1)
2739 {
2740 BFD_ASSERT ((h->root.type == bfd_link_hash_defined)
2741 || (h->root.type == bfd_link_hash_defweak));
2742
2743 if (!bfd_elf_link_record_local_dynamic_symbol
2744 (x->info, h->root.u.def.section->owner,
2745 global_sym_index (h)))
2746 return false;
2747 }
2748
2749 dyn_i->want_fptr = 0;
2750 }
2751 else if (h == NULL || h->dynindx == -1)
2752 {
2753 dyn_i->fptr_offset = x->ofs;
2754 x->ofs += 16;
2755 }
2756 else
2757 dyn_i->want_fptr = 0;
2758 }
2759 return true;
2760 }
2761
2762 /* Allocate all the minimal PLT entries. */
2763
2764 static bool
2765 allocate_plt_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
2766 void * data)
2767 {
2768 struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2769
2770 if (dyn_i->want_plt)
2771 {
2772 struct elf_link_hash_entry *h = dyn_i->h;
2773
2774 if (h)
2775 while (h->root.type == bfd_link_hash_indirect
2776 || h->root.type == bfd_link_hash_warning)
2777 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2778
2779 /* ??? Versioned symbols seem to lose NEEDS_PLT. */
2780 if (elfNN_ia64_dynamic_symbol_p (h, x->info, 0))
2781 {
2782 bfd_size_type offset = x->ofs;
2783 if (offset == 0)
2784 offset = PLT_HEADER_SIZE;
2785 dyn_i->plt_offset = offset;
2786 x->ofs = offset + PLT_MIN_ENTRY_SIZE;
2787
2788 dyn_i->want_pltoff = 1;
2789 }
2790 else
2791 {
2792 dyn_i->want_plt = 0;
2793 dyn_i->want_plt2 = 0;
2794 }
2795 }
2796 return true;
2797 }
2798
2799 /* Allocate all the full PLT entries. */
2800
2801 static bool
2802 allocate_plt2_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
2803 void * data)
2804 {
2805 struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2806
2807 if (dyn_i->want_plt2)
2808 {
2809 struct elf_link_hash_entry *h = dyn_i->h;
2810 bfd_size_type ofs = x->ofs;
2811
2812 dyn_i->plt2_offset = ofs;
2813 x->ofs = ofs + PLT_FULL_ENTRY_SIZE;
2814
2815 while (h->root.type == bfd_link_hash_indirect
2816 || h->root.type == bfd_link_hash_warning)
2817 h = (struct elf_link_hash_entry *) h->root.u.i.link;
2818 dyn_i->h->plt.offset = ofs;
2819 }
2820 return true;
2821 }
2822
2823 /* Allocate all the PLTOFF entries requested by relocations and
2824 plt entries. We can't share space with allocated FPTR entries,
2825 because the latter are not necessarily addressable by the GP.
2826 ??? Relaxation might be able to determine that they are. */
2827
2828 static bool
2829 allocate_pltoff_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
2830 void * data)
2831 {
2832 struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2833
2834 if (dyn_i->want_pltoff)
2835 {
2836 dyn_i->pltoff_offset = x->ofs;
2837 x->ofs += 16;
2838 }
2839 return true;
2840 }
2841
2842 /* Allocate dynamic relocations for those symbols that turned out
2843 to be dynamic. */
2844
2845 static bool
2846 allocate_dynrel_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
2847 void * data)
2848 {
2849 struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2850 struct elfNN_ia64_link_hash_table *ia64_info;
2851 struct elfNN_ia64_dyn_reloc_entry *rent;
2852 bool dynamic_symbol, shared, resolved_zero;
2853
2854 ia64_info = elfNN_ia64_hash_table (x->info);
2855 if (ia64_info == NULL)
2856 return false;
2857
2858 /* Note that this can't be used in relation to FPTR relocs below. */
2859 dynamic_symbol = elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0);
2860
2861 shared = bfd_link_pic (x->info);
2862 resolved_zero = (dyn_i->h
2863 && ELF_ST_VISIBILITY (dyn_i->h->other)
2864 && dyn_i->h->root.type == bfd_link_hash_undefweak);
2865
2866 /* Take care of the GOT and PLT relocations. */
2867
2868 if ((!resolved_zero
2869 && (dynamic_symbol || shared)
2870 && (dyn_i->want_got || dyn_i->want_gotx))
2871 || (dyn_i->want_ltoff_fptr
2872 && dyn_i->h
2873 && dyn_i->h->dynindx != -1))
2874 {
2875 if (!dyn_i->want_ltoff_fptr
2876 || !bfd_link_pie (x->info)
2877 || dyn_i->h == NULL
2878 || dyn_i->h->root.type != bfd_link_hash_undefweak)
2879 ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
2880 }
2881 if ((dynamic_symbol || shared) && dyn_i->want_tprel)
2882 ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
2883 if (dynamic_symbol && dyn_i->want_dtpmod)
2884 ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
2885 if (dynamic_symbol && dyn_i->want_dtprel)
2886 ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
2887
2888 if (x->only_got)
2889 return true;
2890
2891 if (ia64_info->rel_fptr_sec && dyn_i->want_fptr)
2892 {
2893 if (dyn_i->h == NULL || dyn_i->h->root.type != bfd_link_hash_undefweak)
2894 ia64_info->rel_fptr_sec->size += sizeof (ElfNN_External_Rela);
2895 }
2896
2897 if (!resolved_zero && dyn_i->want_pltoff)
2898 {
2899 bfd_size_type t = 0;
2900
2901 /* Dynamic symbols get one IPLT relocation. Local symbols in
2902 shared libraries get two REL relocations. Local symbols in
2903 main applications get nothing. */
2904 if (dynamic_symbol)
2905 t = sizeof (ElfNN_External_Rela);
2906 else if (shared)
2907 t = 2 * sizeof (ElfNN_External_Rela);
2908
2909 ia64_info->rel_pltoff_sec->size += t;
2910 }
2911
2912 /* Take care of the normal data relocations. */
2913
2914 for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
2915 {
2916 int count = rent->count;
2917
2918 switch (rent->type)
2919 {
2920 case R_IA64_FPTR32LSB:
2921 case R_IA64_FPTR64LSB:
2922 /* Allocate one iff !want_fptr and not PIE, which by this point
2923 will be true only if we're actually allocating one statically
2924 in the main executable. Position independent executables
2925 need a relative reloc. */
2926 if (dyn_i->want_fptr && !bfd_link_pie (x->info))
2927 continue;
2928 break;
2929 case R_IA64_PCREL32LSB:
2930 case R_IA64_PCREL64LSB:
2931 if (!dynamic_symbol)
2932 continue;
2933 break;
2934 case R_IA64_DIR32LSB:
2935 case R_IA64_DIR64LSB:
2936 if (!dynamic_symbol && !shared)
2937 continue;
2938 break;
2939 case R_IA64_IPLTLSB:
2940 if (!dynamic_symbol && !shared)
2941 continue;
2942 /* Use two REL relocations for IPLT relocations
2943 against local symbols. */
2944 if (!dynamic_symbol)
2945 count *= 2;
2946 break;
2947 case R_IA64_DTPREL32LSB:
2948 case R_IA64_TPREL64LSB:
2949 case R_IA64_DTPREL64LSB:
2950 case R_IA64_DTPMOD64LSB:
2951 break;
2952 default:
2953 abort ();
2954 }
2955 if (rent->reltext)
2956 x->info->flags |= DF_TEXTREL;
2957 rent->srel->size += sizeof (ElfNN_External_Rela) * count;
2958 }
2959
2960 return true;
2961 }
2962
2963 static bool
2964 elfNN_ia64_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2965 struct elf_link_hash_entry *h)
2966 {
2967 /* ??? Undefined symbols with PLT entries should be re-defined
2968 to be the PLT entry. */
2969
2970 /* If this is a weak symbol, and there is a real definition, the
2971 processor independent code will have arranged for us to see the
2972 real definition first, and we can just use the same value. */
2973 if (h->is_weakalias)
2974 {
2975 struct elf_link_hash_entry *def = weakdef (h);
2976 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
2977 h->root.u.def.section = def->root.u.def.section;
2978 h->root.u.def.value = def->root.u.def.value;
2979 return true;
2980 }
2981
2982 /* If this is a reference to a symbol defined by a dynamic object which
2983 is not a function, we might allocate the symbol in our .dynbss section
2984 and allocate a COPY dynamic relocation.
2985
2986 But IA-64 code is canonically PIC, so as a rule we can avoid this sort
2987 of hackery. */
2988
2989 return true;
2990 }
2991
2992 static bool
2993 elfNN_ia64_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2994 struct bfd_link_info *info)
2995 {
2996 struct elfNN_ia64_allocate_data data;
2997 struct elfNN_ia64_link_hash_table *ia64_info;
2998 asection *sec;
2999 bfd *dynobj;
3000
3001 ia64_info = elfNN_ia64_hash_table (info);
3002 if (ia64_info == NULL)
3003 return false;
3004 dynobj = ia64_info->root.dynobj;
3005 if (dynobj == NULL)
3006 return true;
3007 ia64_info->self_dtpmod_offset = (bfd_vma) -1;
3008 data.info = info;
3009
3010 /* Set the contents of the .interp section to the interpreter. */
3011 if (ia64_info->root.dynamic_sections_created
3012 && bfd_link_executable (info) && !info->nointerp)
3013 {
3014 sec = ia64_info->root.interp;
3015 BFD_ASSERT (sec != NULL);
3016 sec->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
3017 sec->alloced = 1;
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 sec->alloced = 1;
3193 }
3194 }
3195
3196 if (ia64_info->root.dynamic_sections_created)
3197 {
3198 /* Add some entries to the .dynamic section. We fill in the values
3199 later (in finish_dynamic_sections) but we must add the entries now
3200 so that we get the correct size for the .dynamic section. */
3201
3202 #define add_dynamic_entry(TAG, VAL) \
3203 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3204
3205 if (!_bfd_elf_add_dynamic_tags (output_bfd, info, true))
3206 return false;
3207
3208 if (!add_dynamic_entry (DT_IA_64_PLT_RESERVE, 0))
3209 return false;
3210 }
3211
3212 /* ??? Perhaps force __gp local. */
3213
3214 return true;
3215 }
3216
3217 static void
3218 elfNN_ia64_install_dyn_reloc (bfd *abfd, struct bfd_link_info *info,
3219 asection *sec, asection *srel,
3220 bfd_vma offset, unsigned int type,
3221 long dynindx, bfd_vma addend)
3222 {
3223 Elf_Internal_Rela outrel;
3224 bfd_byte *loc;
3225
3226 BFD_ASSERT (dynindx != -1);
3227 outrel.r_info = ELFNN_R_INFO (dynindx, type);
3228 outrel.r_addend = addend;
3229 outrel.r_offset = _bfd_elf_section_offset (abfd, info, sec, offset);
3230 if (outrel.r_offset >= (bfd_vma) -2)
3231 {
3232 /* Run for the hills. We shouldn't be outputting a relocation
3233 for this. So do what everyone else does and output a no-op. */
3234 outrel.r_info = ELFNN_R_INFO (0, R_IA64_NONE);
3235 outrel.r_addend = 0;
3236 outrel.r_offset = 0;
3237 }
3238 else
3239 outrel.r_offset += sec->output_section->vma + sec->output_offset;
3240
3241 loc = srel->contents;
3242 loc += srel->reloc_count++ * sizeof (ElfNN_External_Rela);
3243 bfd_elfNN_swap_reloca_out (abfd, &outrel, loc);
3244 BFD_ASSERT (sizeof (ElfNN_External_Rela) * srel->reloc_count <= srel->size);
3245 }
3246
3247 /* Store an entry for target address TARGET_ADDR in the linkage table
3248 and return the gp-relative address of the linkage table entry. */
3249
3250 static bfd_vma
3251 set_got_entry (bfd *abfd, struct bfd_link_info *info,
3252 struct elfNN_ia64_dyn_sym_info *dyn_i,
3253 long dynindx, bfd_vma addend, bfd_vma value,
3254 unsigned int dyn_r_type)
3255 {
3256 struct elfNN_ia64_link_hash_table *ia64_info;
3257 asection *got_sec;
3258 bool done;
3259 bfd_vma got_offset;
3260
3261 ia64_info = elfNN_ia64_hash_table (info);
3262 if (ia64_info == NULL)
3263 return 0;
3264
3265 got_sec = ia64_info->root.sgot;
3266
3267 switch (dyn_r_type)
3268 {
3269 case R_IA64_TPREL64LSB:
3270 done = dyn_i->tprel_done;
3271 dyn_i->tprel_done = true;
3272 got_offset = dyn_i->tprel_offset;
3273 break;
3274 case R_IA64_DTPMOD64LSB:
3275 if (dyn_i->dtpmod_offset != ia64_info->self_dtpmod_offset)
3276 {
3277 done = dyn_i->dtpmod_done;
3278 dyn_i->dtpmod_done = true;
3279 }
3280 else
3281 {
3282 done = ia64_info->self_dtpmod_done;
3283 ia64_info->self_dtpmod_done = true;
3284 dynindx = 0;
3285 }
3286 got_offset = dyn_i->dtpmod_offset;
3287 break;
3288 case R_IA64_DTPREL32LSB:
3289 case R_IA64_DTPREL64LSB:
3290 done = dyn_i->dtprel_done;
3291 dyn_i->dtprel_done = true;
3292 got_offset = dyn_i->dtprel_offset;
3293 break;
3294 default:
3295 done = dyn_i->got_done;
3296 dyn_i->got_done = true;
3297 got_offset = dyn_i->got_offset;
3298 break;
3299 }
3300
3301 BFD_ASSERT ((got_offset & 7) == 0);
3302
3303 if (! done)
3304 {
3305 /* Store the target address in the linkage table entry. */
3306 bfd_put_64 (abfd, value, got_sec->contents + got_offset);
3307
3308 /* Install a dynamic relocation if needed. */
3309 if (((bfd_link_pic (info)
3310 && (!dyn_i->h
3311 || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
3312 || dyn_i->h->root.type != bfd_link_hash_undefweak)
3313 && dyn_r_type != R_IA64_DTPREL32LSB
3314 && dyn_r_type != R_IA64_DTPREL64LSB)
3315 || elfNN_ia64_dynamic_symbol_p (dyn_i->h, info, dyn_r_type)
3316 || (dynindx != -1
3317 && (dyn_r_type == R_IA64_FPTR32LSB
3318 || dyn_r_type == R_IA64_FPTR64LSB)))
3319 && (!dyn_i->want_ltoff_fptr
3320 || !bfd_link_pie (info)
3321 || !dyn_i->h
3322 || dyn_i->h->root.type != bfd_link_hash_undefweak))
3323 {
3324 if (dynindx == -1
3325 && dyn_r_type != R_IA64_TPREL64LSB
3326 && dyn_r_type != R_IA64_DTPMOD64LSB
3327 && dyn_r_type != R_IA64_DTPREL32LSB
3328 && dyn_r_type != R_IA64_DTPREL64LSB)
3329 {
3330 dyn_r_type = R_IA64_RELNNLSB;
3331 dynindx = 0;
3332 addend = value;
3333 }
3334
3335 if (bfd_big_endian (abfd))
3336 {
3337 switch (dyn_r_type)
3338 {
3339 case R_IA64_REL32LSB:
3340 dyn_r_type = R_IA64_REL32MSB;
3341 break;
3342 case R_IA64_DIR32LSB:
3343 dyn_r_type = R_IA64_DIR32MSB;
3344 break;
3345 case R_IA64_FPTR32LSB:
3346 dyn_r_type = R_IA64_FPTR32MSB;
3347 break;
3348 case R_IA64_DTPREL32LSB:
3349 dyn_r_type = R_IA64_DTPREL32MSB;
3350 break;
3351 case R_IA64_REL64LSB:
3352 dyn_r_type = R_IA64_REL64MSB;
3353 break;
3354 case R_IA64_DIR64LSB:
3355 dyn_r_type = R_IA64_DIR64MSB;
3356 break;
3357 case R_IA64_FPTR64LSB:
3358 dyn_r_type = R_IA64_FPTR64MSB;
3359 break;
3360 case R_IA64_TPREL64LSB:
3361 dyn_r_type = R_IA64_TPREL64MSB;
3362 break;
3363 case R_IA64_DTPMOD64LSB:
3364 dyn_r_type = R_IA64_DTPMOD64MSB;
3365 break;
3366 case R_IA64_DTPREL64LSB:
3367 dyn_r_type = R_IA64_DTPREL64MSB;
3368 break;
3369 default:
3370 BFD_ASSERT (false);
3371 break;
3372 }
3373 }
3374
3375 elfNN_ia64_install_dyn_reloc (abfd, NULL, got_sec,
3376 ia64_info->root.srelgot,
3377 got_offset, dyn_r_type,
3378 dynindx, addend);
3379 }
3380 }
3381
3382 /* Return the address of the linkage table entry. */
3383 value = (got_sec->output_section->vma
3384 + got_sec->output_offset
3385 + got_offset);
3386
3387 return value;
3388 }
3389
3390 /* Fill in a function descriptor consisting of the function's code
3391 address and its global pointer. Return the descriptor's address. */
3392
3393 static bfd_vma
3394 set_fptr_entry (bfd *abfd, struct bfd_link_info *info,
3395 struct elfNN_ia64_dyn_sym_info *dyn_i,
3396 bfd_vma value)
3397 {
3398 struct elfNN_ia64_link_hash_table *ia64_info;
3399 asection *fptr_sec;
3400
3401 ia64_info = elfNN_ia64_hash_table (info);
3402 if (ia64_info == NULL)
3403 return 0;
3404
3405 fptr_sec = ia64_info->fptr_sec;
3406
3407 if (!dyn_i->fptr_done)
3408 {
3409 dyn_i->fptr_done = 1;
3410
3411 /* Fill in the function descriptor. */
3412 bfd_put_64 (abfd, value, fptr_sec->contents + dyn_i->fptr_offset);
3413 bfd_put_64 (abfd, _bfd_get_gp_value (abfd),
3414 fptr_sec->contents + dyn_i->fptr_offset + 8);
3415 if (ia64_info->rel_fptr_sec)
3416 {
3417 Elf_Internal_Rela outrel;
3418 bfd_byte *loc;
3419
3420 if (bfd_little_endian (abfd))
3421 outrel.r_info = ELFNN_R_INFO (0, R_IA64_IPLTLSB);
3422 else
3423 outrel.r_info = ELFNN_R_INFO (0, R_IA64_IPLTMSB);
3424 outrel.r_addend = value;
3425 outrel.r_offset = (fptr_sec->output_section->vma
3426 + fptr_sec->output_offset
3427 + dyn_i->fptr_offset);
3428 loc = ia64_info->rel_fptr_sec->contents;
3429 loc += ia64_info->rel_fptr_sec->reloc_count++
3430 * sizeof (ElfNN_External_Rela);
3431 bfd_elfNN_swap_reloca_out (abfd, &outrel, loc);
3432 }
3433 }
3434
3435 /* Return the descriptor's address. */
3436 value = (fptr_sec->output_section->vma
3437 + fptr_sec->output_offset
3438 + dyn_i->fptr_offset);
3439
3440 return value;
3441 }
3442
3443 /* Fill in a PLTOFF entry consisting of the function's code address
3444 and its global pointer. Return the descriptor's address. */
3445
3446 static bfd_vma
3447 set_pltoff_entry (bfd *abfd, struct bfd_link_info *info,
3448 struct elfNN_ia64_dyn_sym_info *dyn_i,
3449 bfd_vma value, bool is_plt)
3450 {
3451 struct elfNN_ia64_link_hash_table *ia64_info;
3452 asection *pltoff_sec;
3453
3454 ia64_info = elfNN_ia64_hash_table (info);
3455 if (ia64_info == NULL)
3456 return 0;
3457
3458 pltoff_sec = ia64_info->pltoff_sec;
3459
3460 /* Don't do anything if this symbol uses a real PLT entry. In
3461 that case, we'll fill this in during finish_dynamic_symbol. */
3462 if ((! dyn_i->want_plt || is_plt)
3463 && !dyn_i->pltoff_done)
3464 {
3465 bfd_vma gp = _bfd_get_gp_value (abfd);
3466
3467 /* Fill in the function descriptor. */
3468 bfd_put_64 (abfd, value, pltoff_sec->contents + dyn_i->pltoff_offset);
3469 bfd_put_64 (abfd, gp, pltoff_sec->contents + dyn_i->pltoff_offset + 8);
3470
3471 /* Install dynamic relocations if needed. */
3472 if (!is_plt
3473 && bfd_link_pic (info)
3474 && (!dyn_i->h
3475 || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
3476 || dyn_i->h->root.type != bfd_link_hash_undefweak))
3477 {
3478 unsigned int dyn_r_type;
3479
3480 if (bfd_big_endian (abfd))
3481 dyn_r_type = R_IA64_RELNNMSB;
3482 else
3483 dyn_r_type = R_IA64_RELNNLSB;
3484
3485 elfNN_ia64_install_dyn_reloc (abfd, NULL, pltoff_sec,
3486 ia64_info->rel_pltoff_sec,
3487 dyn_i->pltoff_offset,
3488 dyn_r_type, 0, value);
3489 elfNN_ia64_install_dyn_reloc (abfd, NULL, pltoff_sec,
3490 ia64_info->rel_pltoff_sec,
3491 dyn_i->pltoff_offset + ARCH_SIZE / 8,
3492 dyn_r_type, 0, gp);
3493 }
3494
3495 dyn_i->pltoff_done = 1;
3496 }
3497
3498 /* Return the descriptor's address. */
3499 value = (pltoff_sec->output_section->vma
3500 + pltoff_sec->output_offset
3501 + dyn_i->pltoff_offset);
3502
3503 return value;
3504 }
3505
3506 /* Return the base VMA address which should be subtracted from real addresses
3507 when resolving @tprel() relocation.
3508 Main program TLS (whose template starts at PT_TLS p_vaddr)
3509 is assigned offset round(2 * size of pointer, PT_TLS p_align). */
3510
3511 static bfd_vma
3512 elfNN_ia64_tprel_base (struct bfd_link_info *info)
3513 {
3514 asection *tls_sec = elf_hash_table (info)->tls_sec;
3515 return tls_sec->vma - align_power ((bfd_vma) ARCH_SIZE / 4,
3516 tls_sec->alignment_power);
3517 }
3518
3519 /* Return the base VMA address which should be subtracted from real addresses
3520 when resolving @dtprel() relocation.
3521 This is PT_TLS segment p_vaddr. */
3522
3523 static bfd_vma
3524 elfNN_ia64_dtprel_base (struct bfd_link_info *info)
3525 {
3526 return elf_hash_table (info)->tls_sec->vma;
3527 }
3528
3529 /* Called through qsort to sort the .IA_64.unwind section during a
3530 non-relocatable link. Set elfNN_ia64_unwind_entry_compare_bfd
3531 to the output bfd so we can do proper endianness frobbing. */
3532
3533 static bfd *elfNN_ia64_unwind_entry_compare_bfd;
3534
3535 static int
3536 elfNN_ia64_unwind_entry_compare (const void * a, const void * b)
3537 {
3538 bfd_vma av, bv;
3539
3540 av = bfd_get_64 (elfNN_ia64_unwind_entry_compare_bfd, a);
3541 bv = bfd_get_64 (elfNN_ia64_unwind_entry_compare_bfd, b);
3542
3543 return (av < bv ? -1 : av > bv ? 1 : 0);
3544 }
3545
3546 /* Make sure we've got ourselves a nice fat __gp value. */
3547 static bool
3548 elfNN_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info, bool final)
3549 {
3550 bfd_vma min_vma = (bfd_vma) -1, max_vma = 0;
3551 bfd_vma min_short_vma = min_vma, max_short_vma = 0;
3552 struct elf_link_hash_entry *gp;
3553 bfd_vma gp_val;
3554 asection *os;
3555 struct elfNN_ia64_link_hash_table *ia64_info;
3556
3557 ia64_info = elfNN_ia64_hash_table (info);
3558 if (ia64_info == NULL)
3559 return false;
3560
3561 /* Find the min and max vma of all sections marked short. Also collect
3562 min and max vma of any type, for use in selecting a nice gp. */
3563 for (os = abfd->sections; os ; os = os->next)
3564 {
3565 bfd_vma lo, hi;
3566
3567 if ((os->flags & SEC_ALLOC) == 0)
3568 continue;
3569
3570 lo = os->vma;
3571 /* When this function is called from elfNN_ia64_final_link
3572 the correct value to use is os->size. When called from
3573 elfNN_ia64_relax_section we are in the middle of section
3574 sizing; some sections will already have os->size set, others
3575 will have os->size zero and os->rawsize the previous size. */
3576 hi = os->vma + (!final && os->rawsize ? os->rawsize : os->size);
3577 if (hi < lo)
3578 hi = (bfd_vma) -1;
3579
3580 if (min_vma > lo)
3581 min_vma = lo;
3582 if (max_vma < hi)
3583 max_vma = hi;
3584 if (os->flags & SEC_SMALL_DATA)
3585 {
3586 if (min_short_vma > lo)
3587 min_short_vma = lo;
3588 if (max_short_vma < hi)
3589 max_short_vma = hi;
3590 }
3591 }
3592
3593 if (ia64_info->min_short_sec)
3594 {
3595 if (min_short_vma
3596 > (ia64_info->min_short_sec->vma
3597 + ia64_info->min_short_offset))
3598 min_short_vma = (ia64_info->min_short_sec->vma
3599 + ia64_info->min_short_offset);
3600 if (max_short_vma
3601 < (ia64_info->max_short_sec->vma
3602 + ia64_info->max_short_offset))
3603 max_short_vma = (ia64_info->max_short_sec->vma
3604 + ia64_info->max_short_offset);
3605 }
3606
3607 /* See if the user wants to force a value. */
3608 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
3609 false, false);
3610
3611 if (gp
3612 && (gp->root.type == bfd_link_hash_defined
3613 || gp->root.type == bfd_link_hash_defweak))
3614 {
3615 asection *gp_sec = gp->root.u.def.section;
3616 gp_val = (gp->root.u.def.value
3617 + gp_sec->output_section->vma
3618 + gp_sec->output_offset);
3619 }
3620 else
3621 {
3622 /* Pick a sensible value. */
3623
3624 if (ia64_info->min_short_sec)
3625 {
3626 bfd_vma short_range = max_short_vma - min_short_vma;
3627
3628 /* If min_short_sec is set, pick one in the middle bewteen
3629 min_short_vma and max_short_vma. */
3630 if (short_range >= 0x400000)
3631 goto overflow;
3632 gp_val = min_short_vma + short_range / 2;
3633 }
3634 else
3635 {
3636 asection *got_sec = ia64_info->root.sgot;
3637
3638 /* Start with just the address of the .got. */
3639 if (got_sec)
3640 gp_val = got_sec->output_section->vma;
3641 else if (max_short_vma != 0)
3642 gp_val = min_short_vma;
3643 else if (max_vma - min_vma < 0x200000)
3644 gp_val = min_vma;
3645 else
3646 gp_val = max_vma - 0x200000 + 8;
3647 }
3648
3649 /* If it is possible to address the entire image, but we
3650 don't with the choice above, adjust. */
3651 if (max_vma - min_vma < 0x400000
3652 && (max_vma - gp_val >= 0x200000
3653 || gp_val - min_vma > 0x200000))
3654 gp_val = min_vma + 0x200000;
3655 else if (max_short_vma != 0)
3656 {
3657 /* If we don't cover all the short data, adjust. */
3658 if (max_short_vma - gp_val >= 0x200000)
3659 gp_val = min_short_vma + 0x200000;
3660
3661 /* If we're addressing stuff past the end, adjust back. */
3662 if (gp_val > max_vma)
3663 gp_val = max_vma - 0x200000 + 8;
3664 }
3665 }
3666
3667 /* Validate whether all SHF_IA_64_SHORT sections are within
3668 range of the chosen GP. */
3669
3670 if (max_short_vma != 0)
3671 {
3672 if (max_short_vma - min_short_vma >= 0x400000)
3673 {
3674 overflow:
3675 _bfd_error_handler
3676 /* xgettext:c-format */
3677 (_("%pB: short data segment overflowed (%#" PRIx64 " >= 0x400000)"),
3678 abfd, (uint64_t) (max_short_vma - min_short_vma));
3679 return false;
3680 }
3681 else if ((gp_val > min_short_vma
3682 && gp_val - min_short_vma > 0x200000)
3683 || (gp_val < max_short_vma
3684 && max_short_vma - gp_val >= 0x200000))
3685 {
3686 _bfd_error_handler
3687 (_("%pB: __gp does not cover short data segment"), abfd);
3688 return false;
3689 }
3690 }
3691
3692 _bfd_set_gp_value (abfd, gp_val);
3693
3694 return true;
3695 }
3696
3697 static bool
3698 elfNN_ia64_final_link (bfd *abfd, struct bfd_link_info *info)
3699 {
3700 struct elfNN_ia64_link_hash_table *ia64_info;
3701 asection *unwind_output_sec;
3702
3703 ia64_info = elfNN_ia64_hash_table (info);
3704 if (ia64_info == NULL)
3705 return false;
3706
3707 /* Make sure we've got ourselves a nice fat __gp value. */
3708 if (!bfd_link_relocatable (info))
3709 {
3710 bfd_vma gp_val;
3711 struct elf_link_hash_entry *gp;
3712
3713 /* We assume after gp is set, section size will only decrease. We
3714 need to adjust gp for it. */
3715 _bfd_set_gp_value (abfd, 0);
3716 if (! elfNN_ia64_choose_gp (abfd, info, true))
3717 return false;
3718 gp_val = _bfd_get_gp_value (abfd);
3719
3720 gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
3721 false, false);
3722 if (gp)
3723 {
3724 gp->root.type = bfd_link_hash_defined;
3725 gp->root.u.def.value = gp_val;
3726 gp->root.u.def.section = bfd_abs_section_ptr;
3727 }
3728 }
3729
3730 /* If we're producing a final executable, we need to sort the contents
3731 of the .IA_64.unwind section. Force this section to be relocated
3732 into memory rather than written immediately to the output file. */
3733 unwind_output_sec = NULL;
3734 if (!bfd_link_relocatable (info))
3735 {
3736 asection *s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
3737 if (s)
3738 {
3739 unwind_output_sec = s->output_section;
3740 unwind_output_sec->contents
3741 = bfd_malloc (unwind_output_sec->size);
3742 if (unwind_output_sec->contents == NULL)
3743 return false;
3744 }
3745 }
3746
3747 /* Invoke the regular ELF backend linker to do all the work. */
3748 if (!_bfd_elf_final_link (abfd, info))
3749 return false;
3750
3751 if (unwind_output_sec)
3752 {
3753 elfNN_ia64_unwind_entry_compare_bfd = abfd;
3754 qsort (unwind_output_sec->contents,
3755 (size_t) (unwind_output_sec->size / 24),
3756 24,
3757 elfNN_ia64_unwind_entry_compare);
3758
3759 if (! bfd_set_section_contents (abfd, unwind_output_sec,
3760 unwind_output_sec->contents, (bfd_vma) 0,
3761 unwind_output_sec->size))
3762 return false;
3763 }
3764
3765 return true;
3766 }
3767
3768 static int
3769 elfNN_ia64_relocate_section (bfd *output_bfd,
3770 struct bfd_link_info *info,
3771 bfd *input_bfd,
3772 asection *input_section,
3773 bfd_byte *contents,
3774 Elf_Internal_Rela *relocs,
3775 Elf_Internal_Sym *local_syms,
3776 asection **local_sections)
3777 {
3778 struct elfNN_ia64_link_hash_table *ia64_info;
3779 Elf_Internal_Shdr *symtab_hdr;
3780 Elf_Internal_Rela *rel;
3781 Elf_Internal_Rela *relend;
3782 asection *srel;
3783 bool ret_val = true; /* for non-fatal errors */
3784 bfd_vma gp_val;
3785
3786 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3787 ia64_info = elfNN_ia64_hash_table (info);
3788 if (ia64_info == NULL)
3789 return false;
3790
3791 /* Infect various flags from the input section to the output section. */
3792 if (bfd_link_relocatable (info))
3793 {
3794 bfd_vma flags;
3795
3796 flags = elf_section_data(input_section)->this_hdr.sh_flags;
3797 flags &= SHF_IA_64_NORECOV;
3798
3799 elf_section_data(input_section->output_section)
3800 ->this_hdr.sh_flags |= flags;
3801 }
3802
3803 gp_val = _bfd_get_gp_value (output_bfd);
3804 srel = get_reloc_section (input_bfd, ia64_info, input_section, false);
3805
3806 rel = relocs;
3807 relend = relocs + input_section->reloc_count;
3808 for (; rel < relend; ++rel)
3809 {
3810 struct elf_link_hash_entry *h;
3811 struct elfNN_ia64_dyn_sym_info *dyn_i;
3812 bfd_reloc_status_type r;
3813 reloc_howto_type *howto;
3814 unsigned long r_symndx;
3815 Elf_Internal_Sym *sym;
3816 unsigned int r_type;
3817 bfd_vma value;
3818 asection *sym_sec;
3819 bfd_byte *hit_addr;
3820 bool dynamic_symbol_p;
3821 bool undef_weak_ref;
3822
3823 r_type = ELFNN_R_TYPE (rel->r_info);
3824 if (r_type > R_IA64_MAX_RELOC_CODE)
3825 {
3826 /* xgettext:c-format */
3827 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
3828 input_bfd, (int) r_type);
3829 bfd_set_error (bfd_error_bad_value);
3830 ret_val = false;
3831 continue;
3832 }
3833
3834 howto = ia64_elf_lookup_howto (r_type);
3835 if (howto == NULL)
3836 {
3837 ret_val = false;
3838 continue;
3839 }
3840
3841 r_symndx = ELFNN_R_SYM (rel->r_info);
3842 h = NULL;
3843 sym = NULL;
3844 sym_sec = NULL;
3845 undef_weak_ref = false;
3846
3847 if (r_symndx < symtab_hdr->sh_info)
3848 {
3849 /* Reloc against local symbol. */
3850 asection *msec;
3851 sym = local_syms + r_symndx;
3852 sym_sec = local_sections[r_symndx];
3853 msec = sym_sec;
3854 value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
3855 if (!bfd_link_relocatable (info)
3856 && (sym_sec->flags & SEC_MERGE) != 0
3857 && ELF_ST_TYPE (sym->st_info) == STT_SECTION
3858 && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
3859 {
3860 struct elfNN_ia64_local_hash_entry *loc_h;
3861
3862 loc_h = get_local_sym_hash (ia64_info, input_bfd, rel, false);
3863 if (loc_h && ! loc_h->sec_merge_done)
3864 {
3865 struct elfNN_ia64_dyn_sym_info *dynent;
3866 unsigned int count;
3867
3868 for (count = loc_h->count, dynent = loc_h->info;
3869 count != 0;
3870 count--, dynent++)
3871 {
3872 msec = sym_sec;
3873 dynent->addend =
3874 _bfd_merged_section_offset (output_bfd, &msec,
3875 sym->st_value
3876 + dynent->addend);
3877 dynent->addend -= sym->st_value;
3878 dynent->addend += msec->output_section->vma
3879 + msec->output_offset
3880 - sym_sec->output_section->vma
3881 - sym_sec->output_offset;
3882 }
3883
3884 /* We may have introduced duplicated entries. We need
3885 to remove them properly. */
3886 count = sort_dyn_sym_info (loc_h->info, loc_h->count);
3887 if (count != loc_h->count)
3888 {
3889 loc_h->count = count;
3890 loc_h->sorted_count = count;
3891 }
3892
3893 loc_h->sec_merge_done = 1;
3894 }
3895 }
3896 }
3897 else
3898 {
3899 bool unresolved_reloc;
3900 bool warned, ignored;
3901 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3902
3903 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3904 r_symndx, symtab_hdr, sym_hashes,
3905 h, sym_sec, value,
3906 unresolved_reloc, warned, ignored);
3907
3908 if (h->root.type == bfd_link_hash_undefweak)
3909 undef_weak_ref = true;
3910 else if (warned || (ignored && bfd_link_executable (info)))
3911 continue;
3912 }
3913
3914 if (sym_sec != NULL && discarded_section (sym_sec))
3915 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3916 rel, 1, relend, R_IA64_NONE,
3917 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
4526 dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, false);
4527
4528 /* Fill in the PLT data, if required. */
4529 if (dyn_i && dyn_i->want_plt)
4530 {
4531 Elf_Internal_Rela outrel;
4532 bfd_byte *loc;
4533 asection *plt_sec;
4534 bfd_vma plt_addr, pltoff_addr, gp_val, plt_index;
4535
4536 gp_val = _bfd_get_gp_value (output_bfd);
4537
4538 /* Initialize the minimal PLT entry. */
4539
4540 plt_index = (dyn_i->plt_offset - PLT_HEADER_SIZE) / PLT_MIN_ENTRY_SIZE;
4541 plt_sec = ia64_info->root.splt;
4542 loc = plt_sec->contents + dyn_i->plt_offset;
4543
4544 memcpy (loc, plt_min_entry, PLT_MIN_ENTRY_SIZE);
4545 ia64_elf_install_value (loc, plt_index, R_IA64_IMM22);
4546 ia64_elf_install_value (loc+2, -dyn_i->plt_offset, R_IA64_PCREL21B);
4547
4548 plt_addr = (plt_sec->output_section->vma
4549 + plt_sec->output_offset
4550 + dyn_i->plt_offset);
4551 pltoff_addr = set_pltoff_entry (output_bfd, info, dyn_i, plt_addr, true);
4552
4553 /* Initialize the FULL PLT entry, if needed. */
4554 if (dyn_i->want_plt2)
4555 {
4556 loc = plt_sec->contents + dyn_i->plt2_offset;
4557
4558 memcpy (loc, plt_full_entry, PLT_FULL_ENTRY_SIZE);
4559 ia64_elf_install_value (loc, pltoff_addr - gp_val, R_IA64_IMM22);
4560
4561 /* Mark the symbol as undefined, rather than as defined in the
4562 plt section. Leave the value alone. */
4563 /* ??? We didn't redefine it in adjust_dynamic_symbol in the
4564 first place. But perhaps elflink.c did some for us. */
4565 if (!h->def_regular)
4566 sym->st_shndx = SHN_UNDEF;
4567 }
4568
4569 /* Create the dynamic relocation. */
4570 outrel.r_offset = pltoff_addr;
4571 if (bfd_little_endian (output_bfd))
4572 outrel.r_info = ELFNN_R_INFO (h->dynindx, R_IA64_IPLTLSB);
4573 else
4574 outrel.r_info = ELFNN_R_INFO (h->dynindx, R_IA64_IPLTMSB);
4575 outrel.r_addend = 0;
4576
4577 /* This is fun. In the .IA_64.pltoff section, we've got entries
4578 that correspond both to real PLT entries, and those that
4579 happened to resolve to local symbols but need to be created
4580 to satisfy @pltoff relocations. The .rela.IA_64.pltoff
4581 relocations for the real PLT should come at the end of the
4582 section, so that they can be indexed by plt entry at runtime.
4583
4584 We emitted all of the relocations for the non-PLT @pltoff
4585 entries during relocate_section. So we can consider the
4586 existing sec->reloc_count to be the base of the array of
4587 PLT relocations. */
4588
4589 loc = ia64_info->rel_pltoff_sec->contents;
4590 loc += ((ia64_info->rel_pltoff_sec->reloc_count + plt_index)
4591 * sizeof (ElfNN_External_Rela));
4592 bfd_elfNN_swap_reloca_out (output_bfd, &outrel, loc);
4593 }
4594
4595 /* Mark some specially defined symbols as absolute. */
4596 if (h == ia64_info->root.hdynamic
4597 || h == ia64_info->root.hgot
4598 || h == ia64_info->root.hplt)
4599 sym->st_shndx = SHN_ABS;
4600
4601 return true;
4602 }
4603
4604 static bool
4605 elfNN_ia64_finish_dynamic_sections (bfd *abfd,
4606 struct bfd_link_info *info,
4607 bfd_byte *buf ATTRIBUTE_UNUSED)
4608 {
4609 struct elfNN_ia64_link_hash_table *ia64_info;
4610 bfd *dynobj;
4611
4612 ia64_info = elfNN_ia64_hash_table (info);
4613 if (ia64_info == NULL)
4614 return false;
4615
4616 dynobj = ia64_info->root.dynobj;
4617
4618 if (ia64_info->root.dynamic_sections_created)
4619 {
4620 ElfNN_External_Dyn *dyncon, *dynconend;
4621 asection *sdyn, *sgotplt;
4622 bfd_vma gp_val;
4623
4624 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4625 sgotplt = ia64_info->root.sgotplt;
4626 BFD_ASSERT (sdyn != NULL);
4627 dyncon = (ElfNN_External_Dyn *) sdyn->contents;
4628 dynconend = (ElfNN_External_Dyn *) (sdyn->contents + sdyn->size);
4629
4630 gp_val = _bfd_get_gp_value (abfd);
4631
4632 for (; dyncon < dynconend; dyncon++)
4633 {
4634 Elf_Internal_Dyn dyn;
4635
4636 bfd_elfNN_swap_dyn_in (dynobj, dyncon, &dyn);
4637
4638 switch (dyn.d_tag)
4639 {
4640 case DT_PLTGOT:
4641 dyn.d_un.d_ptr = gp_val;
4642 break;
4643
4644 case DT_PLTRELSZ:
4645 dyn.d_un.d_val = (ia64_info->minplt_entries
4646 * sizeof (ElfNN_External_Rela));
4647 break;
4648
4649 case DT_JMPREL:
4650 /* See the comment above in finish_dynamic_symbol. */
4651 dyn.d_un.d_ptr = (ia64_info->rel_pltoff_sec->output_section->vma
4652 + ia64_info->rel_pltoff_sec->output_offset
4653 + (ia64_info->rel_pltoff_sec->reloc_count
4654 * sizeof (ElfNN_External_Rela)));
4655 break;
4656
4657 case DT_IA_64_PLT_RESERVE:
4658 dyn.d_un.d_ptr = (sgotplt->output_section->vma
4659 + sgotplt->output_offset);
4660 break;
4661 }
4662
4663 bfd_elfNN_swap_dyn_out (abfd, &dyn, dyncon);
4664 }
4665
4666 /* Initialize the PLT0 entry. */
4667 if (ia64_info->root.splt)
4668 {
4669 bfd_byte *loc = ia64_info->root.splt->contents;
4670 bfd_vma pltres;
4671
4672 memcpy (loc, plt_header, PLT_HEADER_SIZE);
4673
4674 pltres = (sgotplt->output_section->vma
4675 + sgotplt->output_offset
4676 - gp_val);
4677
4678 ia64_elf_install_value (loc+1, pltres, R_IA64_GPREL22);
4679 }
4680 }
4681
4682 return true;
4683 }
4684
4685 /* ELF file flag handling: */
4687
4688 /* Function to keep IA-64 specific file flags. */
4689 static bool
4690 elfNN_ia64_set_private_flags (bfd *abfd, flagword flags)
4691 {
4692 BFD_ASSERT (!elf_flags_init (abfd)
4693 || elf_elfheader (abfd)->e_flags == flags);
4694
4695 elf_elfheader (abfd)->e_flags = flags;
4696 elf_flags_init (abfd) = true;
4697 return true;
4698 }
4699
4700 /* Merge backend specific data from an object file to the output
4701 object file when linking. */
4702
4703 static bool
4704 elfNN_ia64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
4705 {
4706 bfd *obfd = info->output_bfd;
4707 flagword out_flags;
4708 flagword in_flags;
4709 bool ok = true;
4710
4711 /* FIXME: What should be checked when linking shared libraries? */
4712 if ((ibfd->flags & DYNAMIC) != 0)
4713 return true;
4714
4715 if (!is_ia64_elf (ibfd))
4716 return true;
4717
4718 in_flags = elf_elfheader (ibfd)->e_flags;
4719 out_flags = elf_elfheader (obfd)->e_flags;
4720
4721 if (! elf_flags_init (obfd))
4722 {
4723 elf_flags_init (obfd) = true;
4724 elf_elfheader (obfd)->e_flags = in_flags;
4725
4726 if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
4727 && bfd_get_arch_info (obfd)->the_default)
4728 {
4729 return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
4730 bfd_get_mach (ibfd));
4731 }
4732
4733 return true;
4734 }
4735
4736 /* Check flag compatibility. */
4737 if (in_flags == out_flags)
4738 return true;
4739
4740 /* Output has EF_IA_64_REDUCEDFP set only if all inputs have it set. */
4741 if (!(in_flags & EF_IA_64_REDUCEDFP) && (out_flags & EF_IA_64_REDUCEDFP))
4742 elf_elfheader (obfd)->e_flags &= ~EF_IA_64_REDUCEDFP;
4743
4744 if ((in_flags & EF_IA_64_TRAPNIL) != (out_flags & EF_IA_64_TRAPNIL))
4745 {
4746 _bfd_error_handler
4747 (_("%pB: linking trap-on-NULL-dereference with non-trapping files"),
4748 ibfd);
4749
4750 bfd_set_error (bfd_error_bad_value);
4751 ok = false;
4752 }
4753 if ((in_flags & EF_IA_64_BE) != (out_flags & EF_IA_64_BE))
4754 {
4755 _bfd_error_handler
4756 (_("%pB: linking big-endian files with little-endian files"),
4757 ibfd);
4758
4759 bfd_set_error (bfd_error_bad_value);
4760 ok = false;
4761 }
4762 if ((in_flags & EF_IA_64_ABI64) != (out_flags & EF_IA_64_ABI64))
4763 {
4764 _bfd_error_handler
4765 (_("%pB: linking 64-bit files with 32-bit files"),
4766 ibfd);
4767
4768 bfd_set_error (bfd_error_bad_value);
4769 ok = false;
4770 }
4771 if ((in_flags & EF_IA_64_CONS_GP) != (out_flags & EF_IA_64_CONS_GP))
4772 {
4773 _bfd_error_handler
4774 (_("%pB: linking constant-gp files with non-constant-gp files"),
4775 ibfd);
4776
4777 bfd_set_error (bfd_error_bad_value);
4778 ok = false;
4779 }
4780 if ((in_flags & EF_IA_64_NOFUNCDESC_CONS_GP)
4781 != (out_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
4782 {
4783 _bfd_error_handler
4784 (_("%pB: linking auto-pic files with non-auto-pic files"),
4785 ibfd);
4786
4787 bfd_set_error (bfd_error_bad_value);
4788 ok = false;
4789 }
4790
4791 return ok;
4792 }
4793
4794 static bool
4795 elfNN_ia64_print_private_bfd_data (bfd *abfd, void * ptr)
4796 {
4797 FILE *file = (FILE *) ptr;
4798 flagword flags = elf_elfheader (abfd)->e_flags;
4799
4800 BFD_ASSERT (abfd != NULL && ptr != NULL);
4801
4802 fprintf (file, "private flags = %s%s%s%s%s%s%s%s\n",
4803 (flags & EF_IA_64_TRAPNIL) ? "TRAPNIL, " : "",
4804 (flags & EF_IA_64_EXT) ? "EXT, " : "",
4805 (flags & EF_IA_64_BE) ? "BE, " : "LE, ",
4806 (flags & EF_IA_64_REDUCEDFP) ? "REDUCEDFP, " : "",
4807 (flags & EF_IA_64_CONS_GP) ? "CONS_GP, " : "",
4808 (flags & EF_IA_64_NOFUNCDESC_CONS_GP) ? "NOFUNCDESC_CONS_GP, " : "",
4809 (flags & EF_IA_64_ABSOLUTE) ? "ABSOLUTE, " : "",
4810 (flags & EF_IA_64_ABI64) ? "ABI64" : "ABI32");
4811
4812 _bfd_elf_print_private_bfd_data (abfd, ptr);
4813 return true;
4814 }
4815
4816 static enum elf_reloc_type_class
4817 elfNN_ia64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
4818 const asection *rel_sec ATTRIBUTE_UNUSED,
4819 const Elf_Internal_Rela *rela)
4820 {
4821 switch ((int) ELFNN_R_TYPE (rela->r_info))
4822 {
4823 case R_IA64_REL32MSB:
4824 case R_IA64_REL32LSB:
4825 case R_IA64_REL64MSB:
4826 case R_IA64_REL64LSB:
4827 return reloc_class_relative;
4828 case R_IA64_IPLTMSB:
4829 case R_IA64_IPLTLSB:
4830 return reloc_class_plt;
4831 case R_IA64_COPY:
4832 return reloc_class_copy;
4833 default:
4834 return reloc_class_normal;
4835 }
4836 }
4837
4838 static const struct bfd_elf_special_section elfNN_ia64_special_sections[] =
4839 {
4840 { STRING_COMMA_LEN (".sbss"), -1, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
4841 { STRING_COMMA_LEN (".sdata"), -1, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
4842 { NULL, 0, 0, 0, 0 }
4843 };
4844
4845 static bool
4846 elfNN_ia64_object_p (bfd *abfd)
4847 {
4848 asection *sec;
4849 asection *group, *unwi, *unw;
4850 flagword flags;
4851 const char *name;
4852 char *unwi_name, *unw_name;
4853 size_t amt;
4854
4855 if (abfd->flags & DYNAMIC)
4856 return true;
4857
4858 /* Flags for fake group section. */
4859 flags = (SEC_LINKER_CREATED | SEC_GROUP | SEC_LINK_ONCE
4860 | SEC_EXCLUDE);
4861
4862 /* We add a fake section group for each .gnu.linkonce.t.* section,
4863 which isn't in a section group, and its unwind sections. */
4864 for (sec = abfd->sections; sec != NULL; sec = sec->next)
4865 {
4866 if (elf_sec_group (sec) == NULL
4867 && ((sec->flags & (SEC_LINK_ONCE | SEC_CODE | SEC_GROUP))
4868 == (SEC_LINK_ONCE | SEC_CODE))
4869 && startswith (sec->name, ".gnu.linkonce.t."))
4870 {
4871 name = sec->name + 16;
4872
4873 amt = strlen (name) + sizeof (".gnu.linkonce.ia64unwi.");
4874 unwi_name = bfd_alloc (abfd, amt);
4875 if (!unwi_name)
4876 return false;
4877
4878 strcpy (stpcpy (unwi_name, ".gnu.linkonce.ia64unwi."), name);
4879 unwi = bfd_get_section_by_name (abfd, unwi_name);
4880
4881 amt = strlen (name) + sizeof (".gnu.linkonce.ia64unw.");
4882 unw_name = bfd_alloc (abfd, amt);
4883 if (!unw_name)
4884 return false;
4885
4886 strcpy (stpcpy (unw_name, ".gnu.linkonce.ia64unw."), name);
4887 unw = bfd_get_section_by_name (abfd, unw_name);
4888
4889 /* We need to create a fake group section for it and its
4890 unwind sections. */
4891 group = bfd_make_section_anyway_with_flags (abfd, name,
4892 flags);
4893 if (group == NULL)
4894 return false;
4895
4896 /* Move the fake group section to the beginning. */
4897 bfd_section_list_remove (abfd, group);
4898 bfd_section_list_prepend (abfd, group);
4899
4900 elf_next_in_group (group) = sec;
4901
4902 elf_group_name (sec) = name;
4903 elf_next_in_group (sec) = sec;
4904 elf_sec_group (sec) = group;
4905
4906 if (unwi)
4907 {
4908 elf_group_name (unwi) = name;
4909 elf_next_in_group (unwi) = sec;
4910 elf_next_in_group (sec) = unwi;
4911 elf_sec_group (unwi) = group;
4912 }
4913
4914 if (unw)
4915 {
4916 elf_group_name (unw) = name;
4917 if (unwi)
4918 {
4919 elf_next_in_group (unw) = elf_next_in_group (unwi);
4920 elf_next_in_group (unwi) = unw;
4921 }
4922 else
4923 {
4924 elf_next_in_group (unw) = sec;
4925 elf_next_in_group (sec) = unw;
4926 }
4927 elf_sec_group (unw) = group;
4928 }
4929
4930 /* Fake SHT_GROUP section header. */
4931 elf_section_data (group)->this_hdr.bfd_section = group;
4932 elf_section_data (group)->this_hdr.sh_type = SHT_GROUP;
4933 }
4934 }
4935 return true;
4936 }
4937
4938 static bool
4939 elfNN_ia64_hpux_vec (const bfd_target *vec)
4940 {
4941 extern const bfd_target ia64_elfNN_hpux_be_vec;
4942 return (vec == &ia64_elfNN_hpux_be_vec);
4943 }
4944
4945 static bool
4946 elfNN_hpux_init_file_header (bfd *abfd, struct bfd_link_info *info)
4947 {
4948 Elf_Internal_Ehdr *i_ehdrp;
4949
4950 if (!_bfd_elf_init_file_header (abfd, info))
4951 return false;
4952
4953 i_ehdrp = elf_elfheader (abfd);
4954 i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
4955 i_ehdrp->e_ident[EI_ABIVERSION] = 1;
4956 return true;
4957 }
4958
4959 static bool
4960 elfNN_hpux_backend_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
4961 asection *sec, int *retval)
4962 {
4963 if (bfd_is_com_section (sec))
4964 {
4965 *retval = SHN_IA_64_ANSI_COMMON;
4966 return true;
4967 }
4968 return false;
4969 }
4970
4971 static void
4972 elfNN_hpux_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
4973 asymbol *asym)
4974 {
4975 elf_symbol_type *elfsym = (elf_symbol_type *) asym;
4976
4977 switch (elfsym->internal_elf_sym.st_shndx)
4978 {
4979 case SHN_IA_64_ANSI_COMMON:
4980 asym->section = bfd_com_section_ptr;
4981 asym->value = elfsym->internal_elf_sym.st_size;
4982 asym->flags &= ~BSF_GLOBAL;
4983 break;
4984 }
4985 }
4986
4987 static void
4988 ignore_errors (const char *fmt ATTRIBUTE_UNUSED, ...)
4989 {
4990 }
4991
4992 #define TARGET_LITTLE_SYM ia64_elfNN_le_vec
4994 #define TARGET_LITTLE_NAME "elfNN-ia64-little"
4995 #define TARGET_BIG_SYM ia64_elfNN_be_vec
4996 #define TARGET_BIG_NAME "elfNN-ia64-big"
4997 #define ELF_ARCH bfd_arch_ia64
4998 #define ELF_TARGET_ID IA64_ELF_DATA
4999 #define ELF_MACHINE_CODE EM_IA_64
5000 #define ELF_MACHINE_ALT1 1999 /* EAS2.3 */
5001 #define ELF_MACHINE_ALT2 1998 /* EAS2.2 */
5002 #define ELF_MAXPAGESIZE 0x10000 /* 64KB */
5003 #define ELF_COMMONPAGESIZE 0x4000 /* 16KB */
5004
5005 #define elf_backend_section_from_shdr \
5006 elfNN_ia64_section_from_shdr
5007 #define elf_backend_section_flags \
5008 elfNN_ia64_section_flags
5009 #define elf_backend_fake_sections \
5010 elfNN_ia64_fake_sections
5011 #define elf_backend_final_write_processing \
5012 elfNN_ia64_final_write_processing
5013 #define elf_backend_add_symbol_hook \
5014 elfNN_ia64_add_symbol_hook
5015 #define elf_backend_additional_program_headers \
5016 elfNN_ia64_additional_program_headers
5017 #define elf_backend_modify_segment_map \
5018 elfNN_ia64_modify_segment_map
5019 #define elf_backend_modify_headers \
5020 elfNN_ia64_modify_headers
5021 #define elf_info_to_howto \
5022 elfNN_ia64_info_to_howto
5023
5024 #define bfd_elfNN_bfd_reloc_type_lookup \
5025 ia64_elf_reloc_type_lookup
5026 #define bfd_elfNN_bfd_reloc_name_lookup \
5027 ia64_elf_reloc_name_lookup
5028 #define bfd_elfNN_bfd_is_local_label_name \
5029 elfNN_ia64_is_local_label_name
5030 #define bfd_elfNN_bfd_relax_section \
5031 elfNN_ia64_relax_section
5032
5033 #define elf_backend_object_p \
5034 elfNN_ia64_object_p
5035
5036 /* Stuff for the BFD linker: */
5037 #define bfd_elfNN_bfd_link_hash_table_create \
5038 elfNN_ia64_hash_table_create
5039 #define elf_backend_create_dynamic_sections \
5040 elfNN_ia64_create_dynamic_sections
5041 #define elf_backend_check_relocs \
5042 elfNN_ia64_check_relocs
5043 #define elf_backend_adjust_dynamic_symbol \
5044 elfNN_ia64_adjust_dynamic_symbol
5045 #define elf_backend_late_size_sections \
5046 elfNN_ia64_late_size_sections
5047 #define elf_backend_omit_section_dynsym \
5048 _bfd_elf_omit_section_dynsym_all
5049 #define elf_backend_relocate_section \
5050 elfNN_ia64_relocate_section
5051 #define elf_backend_finish_dynamic_symbol \
5052 elfNN_ia64_finish_dynamic_symbol
5053 #define elf_backend_finish_dynamic_sections \
5054 elfNN_ia64_finish_dynamic_sections
5055 #define bfd_elfNN_bfd_final_link \
5056 elfNN_ia64_final_link
5057
5058 #define bfd_elfNN_bfd_merge_private_bfd_data \
5059 elfNN_ia64_merge_private_bfd_data
5060 #define bfd_elfNN_bfd_set_private_flags \
5061 elfNN_ia64_set_private_flags
5062 #define bfd_elfNN_bfd_print_private_bfd_data \
5063 elfNN_ia64_print_private_bfd_data
5064
5065 #define elf_backend_plt_readonly 1
5066 #define elf_backend_can_gc_sections 1
5067 #define elf_backend_want_plt_sym 0
5068 #define elf_backend_plt_alignment 5
5069 #define elf_backend_got_header_size 0
5070 #define elf_backend_want_got_plt 1
5071 #define elf_backend_may_use_rel_p 1
5072 #define elf_backend_may_use_rela_p 1
5073 #define elf_backend_default_use_rela_p 1
5074 #define elf_backend_want_dynbss 0
5075 #define elf_backend_copy_indirect_symbol elfNN_ia64_hash_copy_indirect
5076 #define elf_backend_hide_symbol elfNN_ia64_hash_hide_symbol
5077 #define elf_backend_fixup_symbol _bfd_elf_link_hash_fixup_symbol
5078 #define elf_backend_reloc_type_class elfNN_ia64_reloc_type_class
5079 #define elf_backend_rela_normal 1
5080 #define elf_backend_dtrel_excludes_plt 1
5081 #define elf_backend_special_sections elfNN_ia64_special_sections
5082 #define elf_backend_default_execstack 0
5083
5084 /* FIXME: PR 290: The Intel C compiler generates SHT_IA_64_UNWIND with
5085 SHF_LINK_ORDER. But it doesn't set the sh_link or sh_info fields.
5086 We don't want to flood users with so many error messages. We turn
5087 off the warning for now. It will be turned on later when the Intel
5088 compiler is fixed. */
5089 #define elf_backend_link_order_error_handler ignore_errors
5090
5091 #include "elfNN-target.h"
5092
5093 /* HPUX-specific vectors. */
5094
5095 #undef TARGET_LITTLE_SYM
5096 #undef TARGET_LITTLE_NAME
5097 #undef TARGET_BIG_SYM
5098 #define TARGET_BIG_SYM ia64_elfNN_hpux_be_vec
5099 #undef TARGET_BIG_NAME
5100 #define TARGET_BIG_NAME "elfNN-ia64-hpux-big"
5101
5102 /* These are HP-UX specific functions. */
5103
5104 #undef elf_backend_init_file_header
5105 #define elf_backend_init_file_header elfNN_hpux_init_file_header
5106
5107 #undef elf_backend_section_from_bfd_section
5108 #define elf_backend_section_from_bfd_section elfNN_hpux_backend_section_from_bfd_section
5109
5110 #undef elf_backend_symbol_processing
5111 #define elf_backend_symbol_processing elfNN_hpux_backend_symbol_processing
5112
5113 #undef elf_backend_want_p_paddr_set_to_zero
5114 #define elf_backend_want_p_paddr_set_to_zero 1
5115
5116 #undef ELF_COMMONPAGESIZE
5117 #undef ELF_OSABI
5118 #define ELF_OSABI ELFOSABI_HPUX
5119 #undef ELF_OSABI_EXACT
5120 #define ELF_OSABI_EXACT 1
5121
5122 #undef elfNN_bed
5123 #define elfNN_bed elfNN_ia64_hpux_bed
5124
5125 #include "elfNN-target.h"
5126