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