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