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