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