* Makefile.am ($(MKDOC)): Append $(EXEEXT_FOR_BUILD) to temp file.
[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 *, void *),
182    void * info);
183 static bfd_boolean allocate_global_data_got
184   (struct elfNN_ia64_dyn_sym_info *dyn_i, void * data);
185 static bfd_boolean allocate_global_fptr_got
186   (struct elfNN_ia64_dyn_sym_info *dyn_i, void * data);
187 static bfd_boolean allocate_local_got
188   (struct elfNN_ia64_dyn_sym_info *dyn_i, void * 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, void * 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 == SEC_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 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_seg_map (abfd); 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_seg_map (abfd);
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_seg_map (abfd); 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_seg_map (abfd);
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 = elf_seg_map (abfd); 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                                  void * 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                                 void * 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_elf_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 *, void *);
1474   void * data;
1475 };
1476
1477 static bfd_boolean
1478 elfNN_ia64_global_dyn_sym_thunk (struct bfd_hash_entry *xentry,
1479                                  void * xdata)
1480 {
1481   struct elfNN_ia64_link_hash_entry *entry
1482     = (struct elfNN_ia64_link_hash_entry *) xentry;
1483   struct elfNN_ia64_dyn_sym_traverse_data *data
1484     = (struct elfNN_ia64_dyn_sym_traverse_data *) xdata;
1485   struct elfNN_ia64_dyn_sym_info *dyn_i;
1486   unsigned int count;
1487
1488   for (count = entry->count, dyn_i = entry->info;
1489        count != 0;
1490        count--, dyn_i++)
1491     if (! (*data->func) (dyn_i, data->data))
1492       return FALSE;
1493   return TRUE;
1494 }
1495
1496 static bfd_boolean
1497 elfNN_ia64_local_dyn_sym_thunk (void **slot, void * xdata)
1498 {
1499   struct elfNN_ia64_local_hash_entry *entry
1500     = (struct elfNN_ia64_local_hash_entry *) *slot;
1501   struct elfNN_ia64_dyn_sym_traverse_data *data
1502     = (struct elfNN_ia64_dyn_sym_traverse_data *) xdata;
1503   struct elfNN_ia64_dyn_sym_info *dyn_i;
1504   unsigned int count;
1505
1506   for (count = entry->count, dyn_i = entry->info;
1507        count != 0;
1508        count--, dyn_i++)
1509     if (! (*data->func) (dyn_i, data->data))
1510       return FALSE;
1511   return TRUE;
1512 }
1513
1514 static void
1515 elfNN_ia64_dyn_sym_traverse (struct elfNN_ia64_link_hash_table *ia64_info,
1516                              bfd_boolean (*func) (struct elfNN_ia64_dyn_sym_info *, void *),
1517                              void * data)
1518 {
1519   struct elfNN_ia64_dyn_sym_traverse_data xdata;
1520
1521   xdata.func = func;
1522   xdata.data = data;
1523
1524   elf_link_hash_traverse (&ia64_info->root,
1525                           elfNN_ia64_global_dyn_sym_thunk, &xdata);
1526   htab_traverse (ia64_info->loc_hash_table,
1527                  elfNN_ia64_local_dyn_sym_thunk, &xdata);
1528 }
1529 \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_anyway_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_anyway_with_flags (dynobj, ".opd",
1990                                                  (SEC_ALLOC
1991                                                   | SEC_LOAD
1992                                                   | SEC_HAS_CONTENTS
1993                                                   | SEC_IN_MEMORY
1994                                                   | (info->pie ? 0
1995                                                      : SEC_READONLY)
1996                                                   | SEC_LINKER_CREATED));
1997       if (!fptr
1998           || !bfd_set_section_alignment (abfd, fptr, 4))
1999         {
2000           BFD_ASSERT (0);
2001           return NULL;
2002         }
2003
2004       ia64_info->fptr_sec = fptr;
2005
2006       if (info->pie)
2007         {
2008           asection *fptr_rel;
2009           fptr_rel = bfd_make_section_anyway_with_flags (dynobj, ".rela.opd",
2010                                                          (SEC_ALLOC | SEC_LOAD
2011                                                           | SEC_HAS_CONTENTS
2012                                                           | SEC_IN_MEMORY
2013                                                           | SEC_LINKER_CREATED
2014                                                           | SEC_READONLY));
2015           if (fptr_rel == NULL
2016               || !bfd_set_section_alignment (abfd, fptr_rel,
2017                                              LOG_SECTION_ALIGN))
2018             {
2019               BFD_ASSERT (0);
2020               return NULL;
2021             }
2022
2023           ia64_info->rel_fptr_sec = fptr_rel;
2024         }
2025     }
2026
2027   return fptr;
2028 }
2029
2030 static asection *
2031 get_pltoff (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED,
2032             struct elfNN_ia64_link_hash_table *ia64_info)
2033 {
2034   asection *pltoff;
2035   bfd *dynobj;
2036
2037   pltoff = ia64_info->pltoff_sec;
2038   if (!pltoff)
2039     {
2040       dynobj = ia64_info->root.dynobj;
2041       if (!dynobj)
2042         ia64_info->root.dynobj = dynobj = abfd;
2043
2044       pltoff = bfd_make_section_anyway_with_flags (dynobj,
2045                                                    ELF_STRING_ia64_pltoff,
2046                                                    (SEC_ALLOC
2047                                                     | SEC_LOAD
2048                                                     | SEC_HAS_CONTENTS
2049                                                     | SEC_IN_MEMORY
2050                                                     | SEC_SMALL_DATA
2051                                                     | SEC_LINKER_CREATED));
2052       if (!pltoff
2053           || !bfd_set_section_alignment (abfd, pltoff, 4))
2054         {
2055           BFD_ASSERT (0);
2056           return NULL;
2057         }
2058
2059       ia64_info->pltoff_sec = pltoff;
2060     }
2061
2062   return pltoff;
2063 }
2064
2065 static asection *
2066 get_reloc_section (bfd *abfd,
2067                    struct elfNN_ia64_link_hash_table *ia64_info,
2068                    asection *sec, bfd_boolean create)
2069 {
2070   const char *srel_name;
2071   asection *srel;
2072   bfd *dynobj;
2073
2074   srel_name = (bfd_elf_string_from_elf_section
2075                (abfd, elf_elfheader(abfd)->e_shstrndx,
2076                 _bfd_elf_single_rel_hdr (sec)->sh_name));
2077   if (srel_name == NULL)
2078     return NULL;
2079
2080   dynobj = ia64_info->root.dynobj;
2081   if (!dynobj)
2082     ia64_info->root.dynobj = dynobj = abfd;
2083
2084   srel = bfd_get_linker_section (dynobj, srel_name);
2085   if (srel == NULL && create)
2086     {
2087       srel = bfd_make_section_anyway_with_flags (dynobj, srel_name,
2088                                                  (SEC_ALLOC | SEC_LOAD
2089                                                   | SEC_HAS_CONTENTS
2090                                                   | SEC_IN_MEMORY
2091                                                   | SEC_LINKER_CREATED
2092                                                   | SEC_READONLY));
2093       if (srel == NULL
2094           || !bfd_set_section_alignment (dynobj, srel,
2095                                          LOG_SECTION_ALIGN))
2096         return NULL;
2097     }
2098
2099   return srel;
2100 }
2101
2102 static bfd_boolean
2103 count_dyn_reloc (bfd *abfd, struct elfNN_ia64_dyn_sym_info *dyn_i,
2104                  asection *srel, int type, bfd_boolean reltext)
2105 {
2106   struct elfNN_ia64_dyn_reloc_entry *rent;
2107
2108   for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
2109     if (rent->srel == srel && rent->type == type)
2110       break;
2111
2112   if (!rent)
2113     {
2114       rent = ((struct elfNN_ia64_dyn_reloc_entry *)
2115               bfd_alloc (abfd, (bfd_size_type) sizeof (*rent)));
2116       if (!rent)
2117         return FALSE;
2118
2119       rent->next = dyn_i->reloc_entries;
2120       rent->srel = srel;
2121       rent->type = type;
2122       rent->count = 0;
2123       dyn_i->reloc_entries = rent;
2124     }
2125   rent->reltext = reltext;
2126   rent->count++;
2127
2128   return TRUE;
2129 }
2130
2131 static bfd_boolean
2132 elfNN_ia64_check_relocs (bfd *abfd, struct bfd_link_info *info,
2133                          asection *sec,
2134                          const Elf_Internal_Rela *relocs)
2135 {
2136   struct elfNN_ia64_link_hash_table *ia64_info;
2137   const Elf_Internal_Rela *relend;
2138   Elf_Internal_Shdr *symtab_hdr;
2139   const Elf_Internal_Rela *rel;
2140   asection *got, *fptr, *srel, *pltoff;
2141   enum {
2142     NEED_GOT = 1,
2143     NEED_GOTX = 2,
2144     NEED_FPTR = 4,
2145     NEED_PLTOFF = 8,
2146     NEED_MIN_PLT = 16,
2147     NEED_FULL_PLT = 32,
2148     NEED_DYNREL = 64,
2149     NEED_LTOFF_FPTR = 128,
2150     NEED_TPREL = 256,
2151     NEED_DTPMOD = 512,
2152     NEED_DTPREL = 1024
2153   };
2154   int need_entry;
2155   struct elf_link_hash_entry *h;
2156   unsigned long r_symndx;
2157   bfd_boolean maybe_dynamic;
2158
2159   if (info->relocatable)
2160     return TRUE;
2161
2162   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2163   ia64_info = elfNN_ia64_hash_table (info);
2164   if (ia64_info == NULL)
2165     return FALSE;
2166
2167   got = fptr = srel = pltoff = NULL;
2168
2169   relend = relocs + sec->reloc_count;
2170
2171   /* We scan relocations first to create dynamic relocation arrays.  We
2172      modified get_dyn_sym_info to allow fast insertion and support fast
2173      lookup in the next loop.  */
2174   for (rel = relocs; rel < relend; ++rel)
2175     {
2176       r_symndx = ELFNN_R_SYM (rel->r_info);
2177       if (r_symndx >= symtab_hdr->sh_info)
2178         {
2179           long indx = r_symndx - symtab_hdr->sh_info;
2180           h = elf_sym_hashes (abfd)[indx];
2181           while (h->root.type == bfd_link_hash_indirect
2182                  || h->root.type == bfd_link_hash_warning)
2183             h = (struct elf_link_hash_entry *) h->root.u.i.link;
2184         }
2185       else
2186         h = NULL;
2187
2188       /* We can only get preliminary data on whether a symbol is
2189          locally or externally defined, as not all of the input files
2190          have yet been processed.  Do something with what we know, as
2191          this may help reduce memory usage and processing time later.  */
2192       maybe_dynamic = (h && ((!info->executable
2193                               && (!SYMBOLIC_BIND (info, h)
2194                                   || info->unresolved_syms_in_shared_libs == RM_IGNORE))
2195                              || !h->def_regular
2196                              || h->root.type == bfd_link_hash_defweak));
2197
2198       need_entry = 0;
2199       switch (ELFNN_R_TYPE (rel->r_info))
2200         {
2201         case R_IA64_TPREL64MSB:
2202         case R_IA64_TPREL64LSB:
2203           if (info->shared || maybe_dynamic)
2204             need_entry = NEED_DYNREL;
2205           break;
2206
2207         case R_IA64_LTOFF_TPREL22:
2208           need_entry = NEED_TPREL;
2209           if (info->shared)
2210             info->flags |= DF_STATIC_TLS;
2211           break;
2212
2213         case R_IA64_DTPREL32MSB:
2214         case R_IA64_DTPREL32LSB:
2215         case R_IA64_DTPREL64MSB:
2216         case R_IA64_DTPREL64LSB:
2217           if (info->shared || maybe_dynamic)
2218             need_entry = NEED_DYNREL;
2219           break;
2220
2221         case R_IA64_LTOFF_DTPREL22:
2222           need_entry = NEED_DTPREL;
2223           break;
2224
2225         case R_IA64_DTPMOD64MSB:
2226         case R_IA64_DTPMOD64LSB:
2227           if (info->shared || maybe_dynamic)
2228             need_entry = NEED_DYNREL;
2229           break;
2230
2231         case R_IA64_LTOFF_DTPMOD22:
2232           need_entry = NEED_DTPMOD;
2233           break;
2234
2235         case R_IA64_LTOFF_FPTR22:
2236         case R_IA64_LTOFF_FPTR64I:
2237         case R_IA64_LTOFF_FPTR32MSB:
2238         case R_IA64_LTOFF_FPTR32LSB:
2239         case R_IA64_LTOFF_FPTR64MSB:
2240         case R_IA64_LTOFF_FPTR64LSB:
2241           need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
2242           break;
2243
2244         case R_IA64_FPTR64I:
2245         case R_IA64_FPTR32MSB:
2246         case R_IA64_FPTR32LSB:
2247         case R_IA64_FPTR64MSB:
2248         case R_IA64_FPTR64LSB:
2249           if (info->shared || h)
2250             need_entry = NEED_FPTR | NEED_DYNREL;
2251           else
2252             need_entry = NEED_FPTR;
2253           break;
2254
2255         case R_IA64_LTOFF22:
2256         case R_IA64_LTOFF64I:
2257           need_entry = NEED_GOT;
2258           break;
2259
2260         case R_IA64_LTOFF22X:
2261           need_entry = NEED_GOTX;
2262           break;
2263
2264         case R_IA64_PLTOFF22:
2265         case R_IA64_PLTOFF64I:
2266         case R_IA64_PLTOFF64MSB:
2267         case R_IA64_PLTOFF64LSB:
2268           need_entry = NEED_PLTOFF;
2269           if (h)
2270             {
2271               if (maybe_dynamic)
2272                 need_entry |= NEED_MIN_PLT;
2273             }
2274           else
2275             {
2276               (*info->callbacks->warning)
2277                 (info, _("@pltoff reloc against local symbol"), 0,
2278                  abfd, 0, (bfd_vma) 0);
2279             }
2280           break;
2281
2282         case R_IA64_PCREL21B:
2283         case R_IA64_PCREL60B:
2284           /* Depending on where this symbol is defined, we may or may not
2285              need a full plt entry.  Only skip if we know we'll not need
2286              the entry -- static or symbolic, and the symbol definition
2287              has already been seen.  */
2288           if (maybe_dynamic && rel->r_addend == 0)
2289             need_entry = NEED_FULL_PLT;
2290           break;
2291
2292         case R_IA64_IMM14:
2293         case R_IA64_IMM22:
2294         case R_IA64_IMM64:
2295         case R_IA64_DIR32MSB:
2296         case R_IA64_DIR32LSB:
2297         case R_IA64_DIR64MSB:
2298         case R_IA64_DIR64LSB:
2299           /* Shared objects will always need at least a REL relocation.  */
2300           if (info->shared || maybe_dynamic)
2301             need_entry = NEED_DYNREL;
2302           break;
2303
2304         case R_IA64_IPLTMSB:
2305         case R_IA64_IPLTLSB:
2306           /* Shared objects will always need at least a REL relocation.  */
2307           if (info->shared || maybe_dynamic)
2308             need_entry = NEED_DYNREL;
2309           break;
2310
2311         case R_IA64_PCREL22:
2312         case R_IA64_PCREL64I:
2313         case R_IA64_PCREL32MSB:
2314         case R_IA64_PCREL32LSB:
2315         case R_IA64_PCREL64MSB:
2316         case R_IA64_PCREL64LSB:
2317           if (maybe_dynamic)
2318             need_entry = NEED_DYNREL;
2319           break;
2320         }
2321
2322       if (!need_entry)
2323         continue;
2324
2325       if ((need_entry & NEED_FPTR) != 0
2326           && rel->r_addend)
2327         {
2328           (*info->callbacks->warning)
2329             (info, _("non-zero addend in @fptr reloc"), 0,
2330              abfd, 0, (bfd_vma) 0);
2331         }
2332
2333       if (get_dyn_sym_info (ia64_info, h, abfd, rel, TRUE) == NULL)
2334         return FALSE;
2335     }
2336
2337   /* Now, we only do lookup without insertion, which is very fast
2338      with the modified get_dyn_sym_info.  */
2339   for (rel = relocs; rel < relend; ++rel)
2340     {
2341       struct elfNN_ia64_dyn_sym_info *dyn_i;
2342       int dynrel_type = R_IA64_NONE;
2343
2344       r_symndx = ELFNN_R_SYM (rel->r_info);
2345       if (r_symndx >= symtab_hdr->sh_info)
2346         {
2347           /* We're dealing with a global symbol -- find its hash entry
2348              and mark it as being referenced.  */
2349           long indx = r_symndx - symtab_hdr->sh_info;
2350           h = elf_sym_hashes (abfd)[indx];
2351           while (h->root.type == bfd_link_hash_indirect
2352                  || h->root.type == bfd_link_hash_warning)
2353             h = (struct elf_link_hash_entry *) h->root.u.i.link;
2354
2355           /* PR15323, ref flags aren't set for references in the same
2356              object.  */
2357           h->root.non_ir_ref = 1;
2358           h->ref_regular = 1;
2359         }
2360       else
2361         h = NULL;
2362
2363       /* We can only get preliminary data on whether a symbol is
2364          locally or externally defined, as not all of the input files
2365          have yet been processed.  Do something with what we know, as
2366          this may help reduce memory usage and processing time later.  */
2367       maybe_dynamic = (h && ((!info->executable
2368                               && (!SYMBOLIC_BIND (info, h)
2369                                   || info->unresolved_syms_in_shared_libs == RM_IGNORE))
2370                              || !h->def_regular
2371                              || h->root.type == bfd_link_hash_defweak));
2372
2373       need_entry = 0;
2374       switch (ELFNN_R_TYPE (rel->r_info))
2375         {
2376         case R_IA64_TPREL64MSB:
2377         case R_IA64_TPREL64LSB:
2378           if (info->shared || maybe_dynamic)
2379             need_entry = NEED_DYNREL;
2380           dynrel_type = R_IA64_TPREL64LSB;
2381           if (info->shared)
2382             info->flags |= DF_STATIC_TLS;
2383           break;
2384
2385         case R_IA64_LTOFF_TPREL22:
2386           need_entry = NEED_TPREL;
2387           if (info->shared)
2388             info->flags |= DF_STATIC_TLS;
2389           break;
2390
2391         case R_IA64_DTPREL32MSB:
2392         case R_IA64_DTPREL32LSB:
2393         case R_IA64_DTPREL64MSB:
2394         case R_IA64_DTPREL64LSB:
2395           if (info->shared || maybe_dynamic)
2396             need_entry = NEED_DYNREL;
2397           dynrel_type = R_IA64_DTPRELNNLSB;
2398           break;
2399
2400         case R_IA64_LTOFF_DTPREL22:
2401           need_entry = NEED_DTPREL;
2402           break;
2403
2404         case R_IA64_DTPMOD64MSB:
2405         case R_IA64_DTPMOD64LSB:
2406           if (info->shared || maybe_dynamic)
2407             need_entry = NEED_DYNREL;
2408           dynrel_type = R_IA64_DTPMOD64LSB;
2409           break;
2410
2411         case R_IA64_LTOFF_DTPMOD22:
2412           need_entry = NEED_DTPMOD;
2413           break;
2414
2415         case R_IA64_LTOFF_FPTR22:
2416         case R_IA64_LTOFF_FPTR64I:
2417         case R_IA64_LTOFF_FPTR32MSB:
2418         case R_IA64_LTOFF_FPTR32LSB:
2419         case R_IA64_LTOFF_FPTR64MSB:
2420         case R_IA64_LTOFF_FPTR64LSB:
2421           need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
2422           break;
2423
2424         case R_IA64_FPTR64I:
2425         case R_IA64_FPTR32MSB:
2426         case R_IA64_FPTR32LSB:
2427         case R_IA64_FPTR64MSB:
2428         case R_IA64_FPTR64LSB:
2429           if (info->shared || h)
2430             need_entry = NEED_FPTR | NEED_DYNREL;
2431           else
2432             need_entry = NEED_FPTR;
2433           dynrel_type = R_IA64_FPTRNNLSB;
2434           break;
2435
2436         case R_IA64_LTOFF22:
2437         case R_IA64_LTOFF64I:
2438           need_entry = NEED_GOT;
2439           break;
2440
2441         case R_IA64_LTOFF22X:
2442           need_entry = NEED_GOTX;
2443           break;
2444
2445         case R_IA64_PLTOFF22:
2446         case R_IA64_PLTOFF64I:
2447         case R_IA64_PLTOFF64MSB:
2448         case R_IA64_PLTOFF64LSB:
2449           need_entry = NEED_PLTOFF;
2450           if (h)
2451             {
2452               if (maybe_dynamic)
2453                 need_entry |= NEED_MIN_PLT;
2454             }
2455           break;
2456
2457         case R_IA64_PCREL21B:
2458         case R_IA64_PCREL60B:
2459           /* Depending on where this symbol is defined, we may or may not
2460              need a full plt entry.  Only skip if we know we'll not need
2461              the entry -- static or symbolic, and the symbol definition
2462              has already been seen.  */
2463           if (maybe_dynamic && rel->r_addend == 0)
2464             need_entry = NEED_FULL_PLT;
2465           break;
2466
2467         case R_IA64_IMM14:
2468         case R_IA64_IMM22:
2469         case R_IA64_IMM64:
2470         case R_IA64_DIR32MSB:
2471         case R_IA64_DIR32LSB:
2472         case R_IA64_DIR64MSB:
2473         case R_IA64_DIR64LSB:
2474           /* Shared objects will always need at least a REL relocation.  */
2475           if (info->shared || maybe_dynamic)
2476             need_entry = NEED_DYNREL;
2477           dynrel_type = R_IA64_DIRNNLSB;
2478           break;
2479
2480         case R_IA64_IPLTMSB:
2481         case R_IA64_IPLTLSB:
2482           /* Shared objects will always need at least a REL relocation.  */
2483           if (info->shared || maybe_dynamic)
2484             need_entry = NEED_DYNREL;
2485           dynrel_type = R_IA64_IPLTLSB;
2486           break;
2487
2488         case R_IA64_PCREL22:
2489         case R_IA64_PCREL64I:
2490         case R_IA64_PCREL32MSB:
2491         case R_IA64_PCREL32LSB:
2492         case R_IA64_PCREL64MSB:
2493         case R_IA64_PCREL64LSB:
2494           if (maybe_dynamic)
2495             need_entry = NEED_DYNREL;
2496           dynrel_type = R_IA64_PCRELNNLSB;
2497           break;
2498         }
2499
2500       if (!need_entry)
2501         continue;
2502
2503       dyn_i = get_dyn_sym_info (ia64_info, h, abfd, rel, FALSE);
2504
2505       /* Record whether or not this is a local symbol.  */
2506       dyn_i->h = h;
2507
2508       /* Create what's needed.  */
2509       if (need_entry & (NEED_GOT | NEED_GOTX | NEED_TPREL
2510                         | NEED_DTPMOD | NEED_DTPREL))
2511         {
2512           if (!got)
2513             {
2514               got = get_got (abfd, info, ia64_info);
2515               if (!got)
2516                 return FALSE;
2517             }
2518           if (need_entry & NEED_GOT)
2519             dyn_i->want_got = 1;
2520           if (need_entry & NEED_GOTX)
2521             dyn_i->want_gotx = 1;
2522           if (need_entry & NEED_TPREL)
2523             dyn_i->want_tprel = 1;
2524           if (need_entry & NEED_DTPMOD)
2525             dyn_i->want_dtpmod = 1;
2526           if (need_entry & NEED_DTPREL)
2527             dyn_i->want_dtprel = 1;
2528         }
2529       if (need_entry & NEED_FPTR)
2530         {
2531           if (!fptr)
2532             {
2533               fptr = get_fptr (abfd, info, ia64_info);
2534               if (!fptr)
2535                 return FALSE;
2536             }
2537
2538           /* FPTRs for shared libraries are allocated by the dynamic
2539              linker.  Make sure this local symbol will appear in the
2540              dynamic symbol table.  */
2541           if (!h && info->shared)
2542             {
2543               if (! (bfd_elf_link_record_local_dynamic_symbol
2544                      (info, abfd, (long) r_symndx)))
2545                 return FALSE;
2546             }
2547
2548           dyn_i->want_fptr = 1;
2549         }
2550       if (need_entry & NEED_LTOFF_FPTR)
2551         dyn_i->want_ltoff_fptr = 1;
2552       if (need_entry & (NEED_MIN_PLT | NEED_FULL_PLT))
2553         {
2554           if (!ia64_info->root.dynobj)
2555             ia64_info->root.dynobj = abfd;
2556           h->needs_plt = 1;
2557           dyn_i->want_plt = 1;
2558         }
2559       if (need_entry & NEED_FULL_PLT)
2560         dyn_i->want_plt2 = 1;
2561       if (need_entry & NEED_PLTOFF)
2562         {
2563           /* This is needed here, in case @pltoff is used in a non-shared
2564              link.  */
2565           if (!pltoff)
2566             {
2567               pltoff = get_pltoff (abfd, info, ia64_info);
2568               if (!pltoff)
2569                 return FALSE;
2570             }
2571
2572           dyn_i->want_pltoff = 1;
2573         }
2574       if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
2575         {
2576           if (!srel)
2577             {
2578               srel = get_reloc_section (abfd, ia64_info, sec, TRUE);
2579               if (!srel)
2580                 return FALSE;
2581             }
2582           if (!count_dyn_reloc (abfd, dyn_i, srel, dynrel_type,
2583                                 (sec->flags & SEC_READONLY) != 0))
2584             return FALSE;
2585         }
2586     }
2587
2588   return TRUE;
2589 }
2590
2591 /* For cleanliness, and potentially faster dynamic loading, allocate
2592    external GOT entries first.  */
2593
2594 static bfd_boolean
2595 allocate_global_data_got (struct elfNN_ia64_dyn_sym_info *dyn_i,
2596                           void * data)
2597 {
2598   struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2599
2600   if ((dyn_i->want_got || dyn_i->want_gotx)
2601       && ! dyn_i->want_fptr
2602       && elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0))
2603      {
2604        dyn_i->got_offset = x->ofs;
2605        x->ofs += 8;
2606      }
2607   if (dyn_i->want_tprel)
2608     {
2609       dyn_i->tprel_offset = x->ofs;
2610       x->ofs += 8;
2611     }
2612   if (dyn_i->want_dtpmod)
2613     {
2614       if (elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0))
2615         {
2616           dyn_i->dtpmod_offset = x->ofs;
2617           x->ofs += 8;
2618         }
2619       else
2620         {
2621           struct elfNN_ia64_link_hash_table *ia64_info;
2622
2623           ia64_info = elfNN_ia64_hash_table (x->info);
2624           if (ia64_info == NULL)
2625             return FALSE;
2626
2627           if (ia64_info->self_dtpmod_offset == (bfd_vma) -1)
2628             {
2629               ia64_info->self_dtpmod_offset = x->ofs;
2630               x->ofs += 8;
2631             }
2632           dyn_i->dtpmod_offset = ia64_info->self_dtpmod_offset;
2633         }
2634     }
2635   if (dyn_i->want_dtprel)
2636     {
2637       dyn_i->dtprel_offset = x->ofs;
2638       x->ofs += 8;
2639     }
2640   return TRUE;
2641 }
2642
2643 /* Next, allocate all the GOT entries used by LTOFF_FPTR relocs.  */
2644
2645 static bfd_boolean
2646 allocate_global_fptr_got (struct elfNN_ia64_dyn_sym_info *dyn_i,
2647                           void * data)
2648 {
2649   struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2650
2651   if (dyn_i->want_got
2652       && dyn_i->want_fptr
2653       && elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, R_IA64_FPTRNNLSB))
2654     {
2655       dyn_i->got_offset = x->ofs;
2656       x->ofs += 8;
2657     }
2658   return TRUE;
2659 }
2660
2661 /* Lastly, allocate all the GOT entries for local data.  */
2662
2663 static bfd_boolean
2664 allocate_local_got (struct elfNN_ia64_dyn_sym_info *dyn_i,
2665                     void * data)
2666 {
2667   struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2668
2669   if ((dyn_i->want_got || dyn_i->want_gotx)
2670       && !elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0))
2671     {
2672       dyn_i->got_offset = x->ofs;
2673       x->ofs += 8;
2674     }
2675   return TRUE;
2676 }
2677
2678 /* Search for the index of a global symbol in it's defining object file.  */
2679
2680 static long
2681 global_sym_index (struct elf_link_hash_entry *h)
2682 {
2683   struct elf_link_hash_entry **p;
2684   bfd *obj;
2685
2686   BFD_ASSERT (h->root.type == bfd_link_hash_defined
2687               || h->root.type == bfd_link_hash_defweak);
2688
2689   obj = h->root.u.def.section->owner;
2690   for (p = elf_sym_hashes (obj); *p != h; ++p)
2691     continue;
2692
2693   return p - elf_sym_hashes (obj) + elf_tdata (obj)->symtab_hdr.sh_info;
2694 }
2695
2696 /* Allocate function descriptors.  We can do these for every function
2697    in a main executable that is not exported.  */
2698
2699 static bfd_boolean
2700 allocate_fptr (struct elfNN_ia64_dyn_sym_info *dyn_i, void * data)
2701 {
2702   struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2703
2704   if (dyn_i->want_fptr)
2705     {
2706       struct elf_link_hash_entry *h = dyn_i->h;
2707
2708       if (h)
2709         while (h->root.type == bfd_link_hash_indirect
2710                || h->root.type == bfd_link_hash_warning)
2711           h = (struct elf_link_hash_entry *) h->root.u.i.link;
2712
2713       if (!x->info->executable
2714           && (!h
2715               || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
2716               || (h->root.type != bfd_link_hash_undefweak
2717                   && h->root.type != bfd_link_hash_undefined)))
2718         {
2719           if (h && h->dynindx == -1)
2720             {
2721               BFD_ASSERT ((h->root.type == bfd_link_hash_defined)
2722                           || (h->root.type == bfd_link_hash_defweak));
2723
2724               if (!bfd_elf_link_record_local_dynamic_symbol
2725                     (x->info, h->root.u.def.section->owner,
2726                      global_sym_index (h)))
2727                 return FALSE;
2728             }
2729
2730           dyn_i->want_fptr = 0;
2731         }
2732       else if (h == NULL || h->dynindx == -1)
2733         {
2734           dyn_i->fptr_offset = x->ofs;
2735           x->ofs += 16;
2736         }
2737       else
2738         dyn_i->want_fptr = 0;
2739     }
2740   return TRUE;
2741 }
2742
2743 /* Allocate all the minimal PLT entries.  */
2744
2745 static bfd_boolean
2746 allocate_plt_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
2747                       void * data)
2748 {
2749   struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2750
2751   if (dyn_i->want_plt)
2752     {
2753       struct elf_link_hash_entry *h = dyn_i->h;
2754
2755       if (h)
2756         while (h->root.type == bfd_link_hash_indirect
2757                || h->root.type == bfd_link_hash_warning)
2758           h = (struct elf_link_hash_entry *) h->root.u.i.link;
2759
2760       /* ??? Versioned symbols seem to lose NEEDS_PLT.  */
2761       if (elfNN_ia64_dynamic_symbol_p (h, x->info, 0))
2762         {
2763           bfd_size_type offset = x->ofs;
2764           if (offset == 0)
2765             offset = PLT_HEADER_SIZE;
2766           dyn_i->plt_offset = offset;
2767           x->ofs = offset + PLT_MIN_ENTRY_SIZE;
2768
2769           dyn_i->want_pltoff = 1;
2770         }
2771       else
2772         {
2773           dyn_i->want_plt = 0;
2774           dyn_i->want_plt2 = 0;
2775         }
2776     }
2777   return TRUE;
2778 }
2779
2780 /* Allocate all the full PLT entries.  */
2781
2782 static bfd_boolean
2783 allocate_plt2_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
2784                        void * data)
2785 {
2786   struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2787
2788   if (dyn_i->want_plt2)
2789     {
2790       struct elf_link_hash_entry *h = dyn_i->h;
2791       bfd_size_type ofs = x->ofs;
2792
2793       dyn_i->plt2_offset = ofs;
2794       x->ofs = ofs + PLT_FULL_ENTRY_SIZE;
2795
2796       while (h->root.type == bfd_link_hash_indirect
2797              || h->root.type == bfd_link_hash_warning)
2798         h = (struct elf_link_hash_entry *) h->root.u.i.link;
2799       dyn_i->h->plt.offset = ofs;
2800     }
2801   return TRUE;
2802 }
2803
2804 /* Allocate all the PLTOFF entries requested by relocations and
2805    plt entries.  We can't share space with allocated FPTR entries,
2806    because the latter are not necessarily addressable by the GP.
2807    ??? Relaxation might be able to determine that they are.  */
2808
2809 static bfd_boolean
2810 allocate_pltoff_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
2811                          void * data)
2812 {
2813   struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2814
2815   if (dyn_i->want_pltoff)
2816     {
2817       dyn_i->pltoff_offset = x->ofs;
2818       x->ofs += 16;
2819     }
2820   return TRUE;
2821 }
2822
2823 /* Allocate dynamic relocations for those symbols that turned out
2824    to be dynamic.  */
2825
2826 static bfd_boolean
2827 allocate_dynrel_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
2828                          void * data)
2829 {
2830   struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
2831   struct elfNN_ia64_link_hash_table *ia64_info;
2832   struct elfNN_ia64_dyn_reloc_entry *rent;
2833   bfd_boolean dynamic_symbol, shared, resolved_zero;
2834
2835   ia64_info = elfNN_ia64_hash_table (x->info);
2836   if (ia64_info == NULL)
2837     return FALSE;
2838
2839   /* Note that this can't be used in relation to FPTR relocs below.  */
2840   dynamic_symbol = elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0);
2841
2842   shared = x->info->shared;
2843   resolved_zero = (dyn_i->h
2844                    && ELF_ST_VISIBILITY (dyn_i->h->other)
2845                    && dyn_i->h->root.type == bfd_link_hash_undefweak);
2846
2847   /* Take care of the GOT and PLT relocations.  */
2848
2849   if ((!resolved_zero
2850        && (dynamic_symbol || shared)
2851        && (dyn_i->want_got || dyn_i->want_gotx))
2852       || (dyn_i->want_ltoff_fptr
2853           && dyn_i->h
2854           && dyn_i->h->dynindx != -1))
2855     {
2856       if (!dyn_i->want_ltoff_fptr
2857           || !x->info->pie
2858           || dyn_i->h == NULL
2859           || dyn_i->h->root.type != bfd_link_hash_undefweak)
2860         ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
2861     }
2862   if ((dynamic_symbol || shared) && dyn_i->want_tprel)
2863     ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
2864   if (dynamic_symbol && dyn_i->want_dtpmod)
2865     ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
2866   if (dynamic_symbol && dyn_i->want_dtprel)
2867     ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
2868
2869   if (x->only_got)
2870     return TRUE;
2871
2872   if (ia64_info->rel_fptr_sec && dyn_i->want_fptr)
2873     {
2874       if (dyn_i->h == NULL || dyn_i->h->root.type != bfd_link_hash_undefweak)
2875         ia64_info->rel_fptr_sec->size += sizeof (ElfNN_External_Rela);
2876     }
2877
2878   if (!resolved_zero && dyn_i->want_pltoff)
2879     {
2880       bfd_size_type t = 0;
2881
2882       /* Dynamic symbols get one IPLT relocation.  Local symbols in
2883          shared libraries get two REL relocations.  Local symbols in
2884          main applications get nothing.  */
2885       if (dynamic_symbol)
2886         t = sizeof (ElfNN_External_Rela);
2887       else if (shared)
2888         t = 2 * sizeof (ElfNN_External_Rela);
2889
2890       ia64_info->rel_pltoff_sec->size += t;
2891     }
2892
2893   /* Take care of the normal data relocations.  */
2894
2895   for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
2896     {
2897       int count = rent->count;
2898
2899       switch (rent->type)
2900         {
2901         case R_IA64_FPTR32LSB:
2902         case R_IA64_FPTR64LSB:
2903           /* Allocate one iff !want_fptr and not PIE, which by this point
2904              will be true only if we're actually allocating one statically
2905              in the main executable.  Position independent executables
2906              need a relative reloc.  */
2907           if (dyn_i->want_fptr && !x->info->pie)
2908             continue;
2909           break;
2910         case R_IA64_PCREL32LSB:
2911         case R_IA64_PCREL64LSB:
2912           if (!dynamic_symbol)
2913             continue;
2914           break;
2915         case R_IA64_DIR32LSB:
2916         case R_IA64_DIR64LSB:
2917           if (!dynamic_symbol && !shared)
2918             continue;
2919           break;
2920         case R_IA64_IPLTLSB:
2921           if (!dynamic_symbol && !shared)
2922             continue;
2923           /* Use two REL relocations for IPLT relocations
2924              against local symbols.  */
2925           if (!dynamic_symbol)
2926             count *= 2;
2927           break;
2928         case R_IA64_DTPREL32LSB:
2929         case R_IA64_TPREL64LSB:
2930         case R_IA64_DTPREL64LSB:
2931         case R_IA64_DTPMOD64LSB:
2932           break;
2933         default:
2934           abort ();
2935         }
2936       if (rent->reltext)
2937         ia64_info->reltext = 1;
2938       rent->srel->size += sizeof (ElfNN_External_Rela) * count;
2939     }
2940
2941   return TRUE;
2942 }
2943
2944 static bfd_boolean
2945 elfNN_ia64_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2946                                   struct elf_link_hash_entry *h)
2947 {
2948   /* ??? Undefined symbols with PLT entries should be re-defined
2949      to be the PLT entry.  */
2950
2951   /* If this is a weak symbol, and there is a real definition, the
2952      processor independent code will have arranged for us to see the
2953      real definition first, and we can just use the same value.  */
2954   if (h->u.weakdef != NULL)
2955     {
2956       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2957                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
2958       h->root.u.def.section = h->u.weakdef->root.u.def.section;
2959       h->root.u.def.value = h->u.weakdef->root.u.def.value;
2960       return TRUE;
2961     }
2962
2963   /* If this is a reference to a symbol defined by a dynamic object which
2964      is not a function, we might allocate the symbol in our .dynbss section
2965      and allocate a COPY dynamic relocation.
2966
2967      But IA-64 code is canonically PIC, so as a rule we can avoid this sort
2968      of hackery.  */
2969
2970   return TRUE;
2971 }
2972
2973 static bfd_boolean
2974 elfNN_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2975                                   struct bfd_link_info *info)
2976 {
2977   struct elfNN_ia64_allocate_data data;
2978   struct elfNN_ia64_link_hash_table *ia64_info;
2979   asection *sec;
2980   bfd *dynobj;
2981   bfd_boolean relplt = FALSE;
2982
2983   dynobj = elf_hash_table(info)->dynobj;
2984   ia64_info = elfNN_ia64_hash_table (info);
2985   if (ia64_info == NULL)
2986     return FALSE;
2987   ia64_info->self_dtpmod_offset = (bfd_vma) -1;
2988   BFD_ASSERT(dynobj != NULL);
2989   data.info = info;
2990
2991   /* Set the contents of the .interp section to the interpreter.  */
2992   if (ia64_info->root.dynamic_sections_created
2993       && info->executable)
2994     {
2995       sec = bfd_get_linker_section (dynobj, ".interp");
2996       BFD_ASSERT (sec != NULL);
2997       sec->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
2998       sec->size = strlen (ELF_DYNAMIC_INTERPRETER) + 1;
2999     }
3000
3001   /* Allocate the GOT entries.  */
3002
3003   if (ia64_info->root.sgot)
3004     {
3005       data.ofs = 0;
3006       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data);
3007       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data);
3008       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data);
3009       ia64_info->root.sgot->size = data.ofs;
3010     }
3011
3012   /* Allocate the FPTR entries.  */
3013
3014   if (ia64_info->fptr_sec)
3015     {
3016       data.ofs = 0;
3017       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_fptr, &data);
3018       ia64_info->fptr_sec->size = data.ofs;
3019     }
3020
3021   /* Now that we've seen all of the input files, we can decide which
3022      symbols need plt entries.  Allocate the minimal PLT entries first.
3023      We do this even though dynamic_sections_created may be FALSE, because
3024      this has the side-effect of clearing want_plt and want_plt2.  */
3025
3026   data.ofs = 0;
3027   elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_plt_entries, &data);
3028
3029   ia64_info->minplt_entries = 0;
3030   if (data.ofs)
3031     {
3032       ia64_info->minplt_entries
3033         = (data.ofs - PLT_HEADER_SIZE) / PLT_MIN_ENTRY_SIZE;
3034     }
3035
3036   /* Align the pointer for the plt2 entries.  */
3037   data.ofs = (data.ofs + 31) & (bfd_vma) -32;
3038
3039   elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_plt2_entries, &data);
3040   if (data.ofs != 0 || ia64_info->root.dynamic_sections_created)
3041     {
3042       /* FIXME: we always reserve the memory for dynamic linker even if
3043          there are no PLT entries since dynamic linker may assume the
3044          reserved memory always exists.  */
3045
3046       BFD_ASSERT (ia64_info->root.dynamic_sections_created);
3047
3048       ia64_info->root.splt->size = data.ofs;
3049
3050       /* If we've got a .plt, we need some extra memory for the dynamic
3051          linker.  We stuff these in .got.plt.  */
3052       sec = bfd_get_linker_section (dynobj, ".got.plt");
3053       sec->size = 8 * PLT_RESERVED_WORDS;
3054     }
3055
3056   /* Allocate the PLTOFF entries.  */
3057
3058   if (ia64_info->pltoff_sec)
3059     {
3060       data.ofs = 0;
3061       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_pltoff_entries, &data);
3062       ia64_info->pltoff_sec->size = data.ofs;
3063     }
3064
3065   if (ia64_info->root.dynamic_sections_created)
3066     {
3067       /* Allocate space for the dynamic relocations that turned out to be
3068          required.  */
3069
3070       if (info->shared && ia64_info->self_dtpmod_offset != (bfd_vma) -1)
3071         ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
3072       data.only_got = FALSE;
3073       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries, &data);
3074     }
3075
3076   /* We have now determined the sizes of the various dynamic sections.
3077      Allocate memory for them.  */
3078   for (sec = dynobj->sections; sec != NULL; sec = sec->next)
3079     {
3080       bfd_boolean strip;
3081
3082       if (!(sec->flags & SEC_LINKER_CREATED))
3083         continue;
3084
3085       /* If we don't need this section, strip it from the output file.
3086          There were several sections primarily related to dynamic
3087          linking that must be create before the linker maps input
3088          sections to output sections.  The linker does that before
3089          bfd_elf_size_dynamic_sections is called, and it is that
3090          function which decides whether anything needs to go into
3091          these sections.  */
3092
3093       strip = (sec->size == 0);
3094
3095       if (sec == ia64_info->root.sgot)
3096         strip = FALSE;
3097       else if (sec == ia64_info->root.srelgot)
3098         {
3099           if (strip)
3100             ia64_info->root.srelgot = NULL;
3101           else
3102             /* We use the reloc_count field as a counter if we need to
3103                copy relocs into the output file.  */
3104             sec->reloc_count = 0;
3105         }
3106       else if (sec == ia64_info->fptr_sec)
3107         {
3108           if (strip)
3109             ia64_info->fptr_sec = NULL;
3110         }
3111       else if (sec == ia64_info->rel_fptr_sec)
3112         {
3113           if (strip)
3114             ia64_info->rel_fptr_sec = NULL;
3115           else
3116             /* We use the reloc_count field as a counter if we need to
3117                copy relocs into the output file.  */
3118             sec->reloc_count = 0;
3119         }
3120       else if (sec == ia64_info->root.splt)
3121         {
3122           if (strip)
3123             ia64_info->root.splt = NULL;
3124         }
3125       else if (sec == ia64_info->pltoff_sec)
3126         {
3127           if (strip)
3128             ia64_info->pltoff_sec = NULL;
3129         }
3130       else if (sec == ia64_info->rel_pltoff_sec)
3131         {
3132           if (strip)
3133             ia64_info->rel_pltoff_sec = NULL;
3134           else
3135             {
3136               relplt = TRUE;
3137               /* We use the reloc_count field as a counter if we need to
3138                  copy relocs into the output file.  */
3139               sec->reloc_count = 0;
3140             }
3141         }
3142       else
3143         {
3144           const char *name;
3145
3146           /* It's OK to base decisions on the section name, because none
3147              of the dynobj section names depend upon the input files.  */
3148           name = bfd_get_section_name (dynobj, sec);
3149
3150           if (strcmp (name, ".got.plt") == 0)
3151             strip = FALSE;
3152           else if (CONST_STRNEQ (name, ".rel"))
3153             {
3154               if (!strip)
3155                 {
3156                   /* We use the reloc_count field as a counter if we need to
3157                      copy relocs into the output file.  */
3158                   sec->reloc_count = 0;
3159                 }
3160             }
3161           else
3162             continue;
3163         }
3164
3165       if (strip)
3166         sec->flags |= SEC_EXCLUDE;
3167       else
3168         {
3169           /* Allocate memory for the section contents.  */
3170           sec->contents = (bfd_byte *) bfd_zalloc (dynobj, sec->size);
3171           if (sec->contents == NULL && sec->size != 0)
3172             return FALSE;
3173         }
3174     }
3175
3176   if (elf_hash_table (info)->dynamic_sections_created)
3177     {
3178       /* Add some entries to the .dynamic section.  We fill in the values
3179          later (in finish_dynamic_sections) but we must add the entries now
3180          so that we get the correct size for the .dynamic section.  */
3181
3182       if (info->executable)
3183         {
3184           /* The DT_DEBUG entry is filled in by the dynamic linker and used
3185              by the debugger.  */
3186 #define add_dynamic_entry(TAG, VAL) \
3187   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3188
3189           if (!add_dynamic_entry (DT_DEBUG, 0))
3190             return FALSE;
3191         }
3192
3193       if (!add_dynamic_entry (DT_IA_64_PLT_RESERVE, 0))
3194         return FALSE;
3195       if (!add_dynamic_entry (DT_PLTGOT, 0))
3196         return FALSE;
3197
3198       if (relplt)
3199         {
3200           if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3201               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3202               || !add_dynamic_entry (DT_JMPREL, 0))
3203             return FALSE;
3204         }
3205
3206       if (!add_dynamic_entry (DT_RELA, 0)
3207           || !add_dynamic_entry (DT_RELASZ, 0)
3208           || !add_dynamic_entry (DT_RELAENT, sizeof (ElfNN_External_Rela)))
3209         return FALSE;
3210
3211       if (ia64_info->reltext)
3212         {
3213           if (!add_dynamic_entry (DT_TEXTREL, 0))
3214             return FALSE;
3215           info->flags |= DF_TEXTREL;
3216         }
3217     }
3218
3219   /* ??? Perhaps force __gp local.  */
3220
3221   return TRUE;
3222 }
3223
3224 static void
3225 elfNN_ia64_install_dyn_reloc (bfd *abfd, struct bfd_link_info *info,
3226                               asection *sec, asection *srel,
3227                               bfd_vma offset, unsigned int type,
3228                               long dynindx, bfd_vma addend)
3229 {
3230   Elf_Internal_Rela outrel;
3231   bfd_byte *loc;
3232
3233   BFD_ASSERT (dynindx != -1);
3234   outrel.r_info = ELFNN_R_INFO (dynindx, type);
3235   outrel.r_addend = addend;
3236   outrel.r_offset = _bfd_elf_section_offset (abfd, info, sec, offset);
3237   if (outrel.r_offset >= (bfd_vma) -2)
3238     {
3239       /* Run for the hills.  We shouldn't be outputting a relocation
3240          for this.  So do what everyone else does and output a no-op.  */
3241       outrel.r_info = ELFNN_R_INFO (0, R_IA64_NONE);
3242       outrel.r_addend = 0;
3243       outrel.r_offset = 0;
3244     }
3245   else
3246     outrel.r_offset += sec->output_section->vma + sec->output_offset;
3247
3248   loc = srel->contents;
3249   loc += srel->reloc_count++ * sizeof (ElfNN_External_Rela);
3250   bfd_elfNN_swap_reloca_out (abfd, &outrel, loc);
3251   BFD_ASSERT (sizeof (ElfNN_External_Rela) * srel->reloc_count <= srel->size);
3252 }
3253
3254 /* Store an entry for target address TARGET_ADDR in the linkage table
3255    and return the gp-relative address of the linkage table entry.  */
3256
3257 static bfd_vma
3258 set_got_entry (bfd *abfd, struct bfd_link_info *info,
3259                struct elfNN_ia64_dyn_sym_info *dyn_i,
3260                long dynindx, bfd_vma addend, bfd_vma value,
3261                unsigned int dyn_r_type)
3262 {
3263   struct elfNN_ia64_link_hash_table *ia64_info;
3264   asection *got_sec;
3265   bfd_boolean done;
3266   bfd_vma got_offset;
3267
3268   ia64_info = elfNN_ia64_hash_table (info);
3269   if (ia64_info == NULL)
3270     return 0;
3271
3272   got_sec = ia64_info->root.sgot;
3273
3274   switch (dyn_r_type)
3275     {
3276     case R_IA64_TPREL64LSB:
3277       done = dyn_i->tprel_done;
3278       dyn_i->tprel_done = TRUE;
3279       got_offset = dyn_i->tprel_offset;
3280       break;
3281     case R_IA64_DTPMOD64LSB:
3282       if (dyn_i->dtpmod_offset != ia64_info->self_dtpmod_offset)
3283         {
3284           done = dyn_i->dtpmod_done;
3285           dyn_i->dtpmod_done = TRUE;
3286         }
3287       else
3288         {
3289           done = ia64_info->self_dtpmod_done;
3290           ia64_info->self_dtpmod_done = TRUE;
3291           dynindx = 0;
3292         }
3293       got_offset = dyn_i->dtpmod_offset;
3294       break;
3295     case R_IA64_DTPREL32LSB:
3296     case R_IA64_DTPREL64LSB:
3297       done = dyn_i->dtprel_done;
3298       dyn_i->dtprel_done = TRUE;
3299       got_offset = dyn_i->dtprel_offset;
3300       break;
3301     default:
3302       done = dyn_i->got_done;
3303       dyn_i->got_done = TRUE;
3304       got_offset = dyn_i->got_offset;
3305       break;
3306     }
3307
3308   BFD_ASSERT ((got_offset & 7) == 0);
3309
3310   if (! done)
3311     {
3312       /* Store the target address in the linkage table entry.  */
3313       bfd_put_64 (abfd, value, got_sec->contents + got_offset);
3314
3315       /* Install a dynamic relocation if needed.  */
3316       if (((info->shared
3317             && (!dyn_i->h
3318                 || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
3319                 || dyn_i->h->root.type != bfd_link_hash_undefweak)
3320             && dyn_r_type != R_IA64_DTPREL32LSB
3321             && dyn_r_type != R_IA64_DTPREL64LSB)
3322            || elfNN_ia64_dynamic_symbol_p (dyn_i->h, info, dyn_r_type)
3323            || (dynindx != -1
3324                && (dyn_r_type == R_IA64_FPTR32LSB
3325                    || dyn_r_type == R_IA64_FPTR64LSB)))
3326           && (!dyn_i->want_ltoff_fptr
3327               || !info->pie
3328               || !dyn_i->h
3329               || dyn_i->h->root.type != bfd_link_hash_undefweak))
3330         {
3331           if (dynindx == -1
3332               && dyn_r_type != R_IA64_TPREL64LSB
3333               && dyn_r_type != R_IA64_DTPMOD64LSB
3334               && dyn_r_type != R_IA64_DTPREL32LSB
3335               && dyn_r_type != R_IA64_DTPREL64LSB)
3336             {
3337               dyn_r_type = R_IA64_RELNNLSB;
3338               dynindx = 0;
3339               addend = value;
3340             }
3341
3342           if (bfd_big_endian (abfd))
3343             {
3344               switch (dyn_r_type)
3345                 {
3346                 case R_IA64_REL32LSB:
3347                   dyn_r_type = R_IA64_REL32MSB;
3348                   break;
3349                 case R_IA64_DIR32LSB:
3350                   dyn_r_type = R_IA64_DIR32MSB;
3351                   break;
3352                 case R_IA64_FPTR32LSB:
3353                   dyn_r_type = R_IA64_FPTR32MSB;
3354                   break;
3355                 case R_IA64_DTPREL32LSB:
3356                   dyn_r_type = R_IA64_DTPREL32MSB;
3357                   break;
3358                 case R_IA64_REL64LSB:
3359                   dyn_r_type = R_IA64_REL64MSB;
3360                   break;
3361                 case R_IA64_DIR64LSB:
3362                   dyn_r_type = R_IA64_DIR64MSB;
3363                   break;
3364                 case R_IA64_FPTR64LSB:
3365                   dyn_r_type = R_IA64_FPTR64MSB;
3366                   break;
3367                 case R_IA64_TPREL64LSB:
3368                   dyn_r_type = R_IA64_TPREL64MSB;
3369                   break;
3370                 case R_IA64_DTPMOD64LSB:
3371                   dyn_r_type = R_IA64_DTPMOD64MSB;
3372                   break;
3373                 case R_IA64_DTPREL64LSB:
3374                   dyn_r_type = R_IA64_DTPREL64MSB;
3375                   break;
3376                 default:
3377                   BFD_ASSERT (FALSE);
3378                   break;
3379                 }
3380             }
3381
3382           elfNN_ia64_install_dyn_reloc (abfd, NULL, got_sec,
3383                                         ia64_info->root.srelgot,
3384                                         got_offset, dyn_r_type,
3385                                         dynindx, addend);
3386         }
3387     }
3388
3389   /* Return the address of the linkage table entry.  */
3390   value = (got_sec->output_section->vma
3391            + got_sec->output_offset
3392            + got_offset);
3393
3394   return value;
3395 }
3396
3397 /* Fill in a function descriptor consisting of the function's code
3398    address and its global pointer.  Return the descriptor's address.  */
3399
3400 static bfd_vma
3401 set_fptr_entry (bfd *abfd, struct bfd_link_info *info,
3402                 struct elfNN_ia64_dyn_sym_info *dyn_i,
3403                 bfd_vma value)
3404 {
3405   struct elfNN_ia64_link_hash_table *ia64_info;
3406   asection *fptr_sec;
3407
3408   ia64_info = elfNN_ia64_hash_table (info);
3409   if (ia64_info == NULL)
3410     return 0;
3411
3412   fptr_sec = ia64_info->fptr_sec;
3413
3414   if (!dyn_i->fptr_done)
3415     {
3416       dyn_i->fptr_done = 1;
3417
3418       /* Fill in the function descriptor.  */
3419       bfd_put_64 (abfd, value, fptr_sec->contents + dyn_i->fptr_offset);
3420       bfd_put_64 (abfd, _bfd_get_gp_value (abfd),
3421                   fptr_sec->contents + dyn_i->fptr_offset + 8);
3422       if (ia64_info->rel_fptr_sec)
3423         {
3424           Elf_Internal_Rela outrel;
3425           bfd_byte *loc;
3426
3427           if (bfd_little_endian (abfd))
3428             outrel.r_info = ELFNN_R_INFO (0, R_IA64_IPLTLSB);
3429           else
3430             outrel.r_info = ELFNN_R_INFO (0, R_IA64_IPLTMSB);
3431           outrel.r_addend = value;
3432           outrel.r_offset = (fptr_sec->output_section->vma
3433                              + fptr_sec->output_offset
3434                              + dyn_i->fptr_offset);
3435           loc = ia64_info->rel_fptr_sec->contents;
3436           loc += ia64_info->rel_fptr_sec->reloc_count++
3437                  * sizeof (ElfNN_External_Rela);
3438           bfd_elfNN_swap_reloca_out (abfd, &outrel, loc);
3439         }
3440     }
3441
3442   /* Return the descriptor's address.  */
3443   value = (fptr_sec->output_section->vma
3444            + fptr_sec->output_offset
3445            + dyn_i->fptr_offset);
3446
3447   return value;
3448 }
3449
3450 /* Fill in a PLTOFF entry consisting of the function's code address
3451    and its global pointer.  Return the descriptor's address.  */
3452
3453 static bfd_vma
3454 set_pltoff_entry (bfd *abfd, struct bfd_link_info *info,
3455                   struct elfNN_ia64_dyn_sym_info *dyn_i,
3456                   bfd_vma value, bfd_boolean is_plt)
3457 {
3458   struct elfNN_ia64_link_hash_table *ia64_info;
3459   asection *pltoff_sec;
3460
3461   ia64_info = elfNN_ia64_hash_table (info);
3462   if (ia64_info == NULL)
3463     return 0;
3464
3465   pltoff_sec = ia64_info->pltoff_sec;
3466
3467   /* Don't do anything if this symbol uses a real PLT entry.  In
3468      that case, we'll fill this in during finish_dynamic_symbol.  */
3469   if ((! dyn_i->want_plt || is_plt)
3470       && !dyn_i->pltoff_done)
3471     {
3472       bfd_vma gp = _bfd_get_gp_value (abfd);
3473
3474       /* Fill in the function descriptor.  */
3475       bfd_put_64 (abfd, value, pltoff_sec->contents + dyn_i->pltoff_offset);
3476       bfd_put_64 (abfd, gp, pltoff_sec->contents + dyn_i->pltoff_offset + 8);
3477
3478       /* Install dynamic relocations if needed.  */
3479       if (!is_plt
3480           && info->shared
3481           && (!dyn_i->h
3482               || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
3483               || dyn_i->h->root.type != bfd_link_hash_undefweak))
3484         {
3485           unsigned int dyn_r_type;
3486
3487           if (bfd_big_endian (abfd))
3488             dyn_r_type = R_IA64_RELNNMSB;
3489           else
3490             dyn_r_type = R_IA64_RELNNLSB;
3491
3492           elfNN_ia64_install_dyn_reloc (abfd, NULL, pltoff_sec,
3493                                         ia64_info->rel_pltoff_sec,
3494                                         dyn_i->pltoff_offset,
3495                                         dyn_r_type, 0, value);
3496           elfNN_ia64_install_dyn_reloc (abfd, NULL, pltoff_sec,
3497                                         ia64_info->rel_pltoff_sec,
3498                                         dyn_i->pltoff_offset + ARCH_SIZE / 8,
3499                                         dyn_r_type, 0, gp);
3500         }
3501
3502       dyn_i->pltoff_done = 1;
3503     }
3504
3505   /* Return the descriptor's address.  */
3506   value = (pltoff_sec->output_section->vma
3507            + pltoff_sec->output_offset
3508            + dyn_i->pltoff_offset);
3509
3510   return value;
3511 }
3512
3513 /* Return the base VMA address which should be subtracted from real addresses
3514    when resolving @tprel() relocation.
3515    Main program TLS (whose template starts at PT_TLS p_vaddr)
3516    is assigned offset round(2 * size of pointer, PT_TLS p_align).  */
3517
3518 static bfd_vma
3519 elfNN_ia64_tprel_base (struct bfd_link_info *info)
3520 {
3521   asection *tls_sec = elf_hash_table (info)->tls_sec;
3522   return tls_sec->vma - align_power ((bfd_vma) ARCH_SIZE / 4,
3523                                      tls_sec->alignment_power);
3524 }
3525
3526 /* Return the base VMA address which should be subtracted from real addresses
3527    when resolving @dtprel() relocation.
3528    This is PT_TLS segment p_vaddr.  */
3529
3530 static bfd_vma
3531 elfNN_ia64_dtprel_base (struct bfd_link_info *info)
3532 {
3533   return elf_hash_table (info)->tls_sec->vma;
3534 }
3535
3536 /* Called through qsort to sort the .IA_64.unwind section during a
3537    non-relocatable link.  Set elfNN_ia64_unwind_entry_compare_bfd
3538    to the output bfd so we can do proper endianness frobbing.  */
3539
3540 static bfd *elfNN_ia64_unwind_entry_compare_bfd;
3541
3542 static int
3543 elfNN_ia64_unwind_entry_compare (const void * a, const void * b)
3544 {
3545   bfd_vma av, bv;
3546
3547   av = bfd_get_64 (elfNN_ia64_unwind_entry_compare_bfd, a);
3548   bv = bfd_get_64 (elfNN_ia64_unwind_entry_compare_bfd, b);
3549
3550   return (av < bv ? -1 : av > bv ? 1 : 0);
3551 }
3552
3553 /* Make sure we've got ourselves a nice fat __gp value.  */
3554 static bfd_boolean
3555 elfNN_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info, bfd_boolean final)
3556 {
3557   bfd_vma min_vma = (bfd_vma) -1, max_vma = 0;
3558   bfd_vma min_short_vma = min_vma, max_short_vma = 0;
3559   struct elf_link_hash_entry *gp;
3560   bfd_vma gp_val;
3561   asection *os;
3562   struct elfNN_ia64_link_hash_table *ia64_info;
3563
3564   ia64_info = elfNN_ia64_hash_table (info);
3565   if (ia64_info == NULL)
3566     return FALSE;
3567
3568   /* Find the min and max vma of all sections marked short.  Also collect
3569      min and max vma of any type, for use in selecting a nice gp.  */
3570   for (os = abfd->sections; os ; os = os->next)
3571     {
3572       bfd_vma lo, hi;
3573
3574       if ((os->flags & SEC_ALLOC) == 0)
3575         continue;
3576
3577       lo = os->vma;
3578       /* When this function is called from elfNN_ia64_final_link
3579          the correct value to use is os->size.  When called from
3580          elfNN_ia64_relax_section we are in the middle of section
3581          sizing; some sections will already have os->size set, others
3582          will have os->size zero and os->rawsize the previous size.  */
3583       hi = os->vma + (!final && os->rawsize ? os->rawsize : os->size);
3584       if (hi < lo)
3585         hi = (bfd_vma) -1;
3586
3587       if (min_vma > lo)
3588         min_vma = lo;
3589       if (max_vma < hi)
3590         max_vma = hi;
3591       if (os->flags & SEC_SMALL_DATA)
3592         {
3593           if (min_short_vma > lo)
3594             min_short_vma = lo;
3595           if (max_short_vma < hi)
3596             max_short_vma = hi;
3597         }
3598     }
3599
3600   if (ia64_info->min_short_sec)
3601     {
3602       if (min_short_vma
3603           > (ia64_info->min_short_sec->vma
3604              + ia64_info->min_short_offset))
3605         min_short_vma = (ia64_info->min_short_sec->vma
3606                          + ia64_info->min_short_offset);
3607       if (max_short_vma
3608           < (ia64_info->max_short_sec->vma
3609              + ia64_info->max_short_offset))
3610         max_short_vma = (ia64_info->max_short_sec->vma
3611                          + ia64_info->max_short_offset);
3612     }
3613
3614   /* See if the user wants to force a value.  */
3615   gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
3616                              FALSE, FALSE);
3617
3618   if (gp
3619       && (gp->root.type == bfd_link_hash_defined
3620           || gp->root.type == bfd_link_hash_defweak))
3621     {
3622       asection *gp_sec = gp->root.u.def.section;
3623       gp_val = (gp->root.u.def.value
3624                 + gp_sec->output_section->vma
3625                 + gp_sec->output_offset);
3626     }
3627   else
3628     {
3629       /* Pick a sensible value.  */
3630
3631       if (ia64_info->min_short_sec)
3632         {
3633           bfd_vma short_range = max_short_vma - min_short_vma;
3634
3635           /* If min_short_sec is set, pick one in the middle bewteen
3636              min_short_vma and max_short_vma.  */
3637           if (short_range >= 0x400000)
3638             goto overflow;
3639           gp_val = min_short_vma + short_range / 2;
3640         }
3641       else
3642         {
3643           asection *got_sec = ia64_info->root.sgot;
3644
3645           /* Start with just the address of the .got.  */
3646           if (got_sec)
3647             gp_val = got_sec->output_section->vma;
3648           else if (max_short_vma != 0)
3649             gp_val = min_short_vma;
3650           else if (max_vma - min_vma < 0x200000)
3651             gp_val = min_vma;
3652           else
3653             gp_val = max_vma - 0x200000 + 8;
3654         }
3655
3656       /* If it is possible to address the entire image, but we
3657          don't with the choice above, adjust.  */
3658       if (max_vma - min_vma < 0x400000
3659           && (max_vma - gp_val >= 0x200000
3660               || gp_val - min_vma > 0x200000))
3661         gp_val = min_vma + 0x200000;
3662       else if (max_short_vma != 0)
3663         {
3664           /* If we don't cover all the short data, adjust.  */
3665           if (max_short_vma - gp_val >= 0x200000)
3666             gp_val = min_short_vma + 0x200000;
3667
3668           /* If we're addressing stuff past the end, adjust back.  */
3669           if (gp_val > max_vma)
3670             gp_val = max_vma - 0x200000 + 8;
3671         }
3672     }
3673
3674   /* Validate whether all SHF_IA_64_SHORT sections are within
3675      range of the chosen GP.  */
3676
3677   if (max_short_vma != 0)
3678     {
3679       if (max_short_vma - min_short_vma >= 0x400000)
3680         {
3681 overflow:
3682           (*_bfd_error_handler)
3683             (_("%s: short data segment overflowed (0x%lx >= 0x400000)"),
3684              bfd_get_filename (abfd),
3685              (unsigned long) (max_short_vma - min_short_vma));
3686           return FALSE;
3687         }
3688       else if ((gp_val > min_short_vma
3689                 && gp_val - min_short_vma > 0x200000)
3690                || (gp_val < max_short_vma
3691                    && max_short_vma - gp_val >= 0x200000))
3692         {
3693           (*_bfd_error_handler)
3694             (_("%s: __gp does not cover short data segment"),
3695              bfd_get_filename (abfd));
3696           return FALSE;
3697         }
3698     }
3699
3700   _bfd_set_gp_value (abfd, gp_val);
3701
3702   return TRUE;
3703 }
3704
3705 static bfd_boolean
3706 elfNN_ia64_final_link (bfd *abfd, struct bfd_link_info *info)
3707 {
3708   struct elfNN_ia64_link_hash_table *ia64_info;
3709   asection *unwind_output_sec;
3710
3711   ia64_info = elfNN_ia64_hash_table (info);
3712   if (ia64_info == NULL)
3713     return FALSE;
3714
3715   /* Make sure we've got ourselves a nice fat __gp value.  */
3716   if (!info->relocatable)
3717     {
3718       bfd_vma gp_val;
3719       struct elf_link_hash_entry *gp;
3720
3721       /* We assume after gp is set, section size will only decrease. We
3722          need to adjust gp for it.  */
3723       _bfd_set_gp_value (abfd, 0);
3724       if (! elfNN_ia64_choose_gp (abfd, info, TRUE))
3725         return FALSE;
3726       gp_val = _bfd_get_gp_value (abfd);
3727
3728       gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
3729                                  FALSE, FALSE);
3730       if (gp)
3731         {
3732           gp->root.type = bfd_link_hash_defined;
3733           gp->root.u.def.value = gp_val;
3734           gp->root.u.def.section = bfd_abs_section_ptr;
3735         }
3736     }
3737
3738   /* If we're producing a final executable, we need to sort the contents
3739      of the .IA_64.unwind section.  Force this section to be relocated
3740      into memory rather than written immediately to the output file.  */
3741   unwind_output_sec = NULL;
3742   if (!info->relocatable)
3743     {
3744       asection *s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
3745       if (s)
3746         {
3747           unwind_output_sec = s->output_section;
3748           unwind_output_sec->contents
3749             = bfd_malloc (unwind_output_sec->size);
3750           if (unwind_output_sec->contents == NULL)
3751             return FALSE;
3752         }
3753     }
3754
3755   /* Invoke the regular ELF backend linker to do all the work.  */
3756   if (!bfd_elf_final_link (abfd, info))
3757     return FALSE;
3758
3759   if (unwind_output_sec)
3760     {
3761       elfNN_ia64_unwind_entry_compare_bfd = abfd;
3762       qsort (unwind_output_sec->contents,
3763              (size_t) (unwind_output_sec->size / 24),
3764              24,
3765              elfNN_ia64_unwind_entry_compare);
3766
3767       if (! bfd_set_section_contents (abfd, unwind_output_sec,
3768                                       unwind_output_sec->contents, (bfd_vma) 0,
3769                                       unwind_output_sec->size))
3770         return FALSE;
3771     }
3772
3773   return TRUE;
3774 }
3775
3776 static bfd_boolean
3777 elfNN_ia64_relocate_section (bfd *output_bfd,
3778                              struct bfd_link_info *info,
3779                              bfd *input_bfd,
3780                              asection *input_section,
3781                              bfd_byte *contents,
3782                              Elf_Internal_Rela *relocs,
3783                              Elf_Internal_Sym *local_syms,
3784                              asection **local_sections)
3785 {
3786   struct elfNN_ia64_link_hash_table *ia64_info;
3787   Elf_Internal_Shdr *symtab_hdr;
3788   Elf_Internal_Rela *rel;
3789   Elf_Internal_Rela *relend;
3790   asection *srel;
3791   bfd_boolean ret_val = TRUE;   /* for non-fatal errors */
3792   bfd_vma gp_val;
3793
3794   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3795   ia64_info = elfNN_ia64_hash_table (info);
3796   if (ia64_info == NULL)
3797     return FALSE;
3798
3799   /* Infect various flags from the input section to the output section.  */
3800   if (info->relocatable)
3801     {
3802       bfd_vma flags;
3803
3804       flags = elf_section_data(input_section)->this_hdr.sh_flags;
3805       flags &= SHF_IA_64_NORECOV;
3806
3807       elf_section_data(input_section->output_section)
3808         ->this_hdr.sh_flags |= flags;
3809     }
3810
3811   gp_val = _bfd_get_gp_value (output_bfd);
3812   srel = get_reloc_section (input_bfd, ia64_info, input_section, FALSE);
3813
3814   rel = relocs;
3815   relend = relocs + input_section->reloc_count;
3816   for (; rel < relend; ++rel)
3817     {
3818       struct elf_link_hash_entry *h;
3819       struct elfNN_ia64_dyn_sym_info *dyn_i;
3820       bfd_reloc_status_type r;
3821       reloc_howto_type *howto;
3822       unsigned long r_symndx;
3823       Elf_Internal_Sym *sym;
3824       unsigned int r_type;
3825       bfd_vma value;
3826       asection *sym_sec;
3827       bfd_byte *hit_addr;
3828       bfd_boolean dynamic_symbol_p;
3829       bfd_boolean undef_weak_ref;
3830
3831       r_type = ELFNN_R_TYPE (rel->r_info);
3832       if (r_type > R_IA64_MAX_RELOC_CODE)
3833         {
3834           (*_bfd_error_handler)
3835             (_("%B: unknown relocation type %d"),
3836              input_bfd, (int) r_type);
3837           bfd_set_error (bfd_error_bad_value);
3838           ret_val = FALSE;
3839           continue;
3840         }
3841
3842       howto = ia64_elf_lookup_howto (r_type);
3843       r_symndx = ELFNN_R_SYM (rel->r_info);
3844       h = NULL;
3845       sym = NULL;
3846       sym_sec = NULL;
3847       undef_weak_ref = FALSE;
3848
3849       if (r_symndx < symtab_hdr->sh_info)
3850         {
3851           /* Reloc against local symbol.  */
3852           asection *msec;
3853           sym = local_syms + r_symndx;
3854           sym_sec = local_sections[r_symndx];
3855           msec = sym_sec;
3856           value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
3857           if (!info->relocatable
3858               && (sym_sec->flags & SEC_MERGE) != 0
3859               && ELF_ST_TYPE (sym->st_info) == STT_SECTION
3860               && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
3861             {
3862               struct elfNN_ia64_local_hash_entry *loc_h;
3863
3864               loc_h = get_local_sym_hash (ia64_info, input_bfd, rel, FALSE);
3865               if (loc_h && ! loc_h->sec_merge_done)
3866                 {
3867                   struct elfNN_ia64_dyn_sym_info *dynent;
3868                   unsigned int count;
3869
3870                   for (count = loc_h->count, dynent = loc_h->info;
3871                        count != 0;
3872                        count--, dynent++)
3873                     {
3874                       msec = sym_sec;
3875                       dynent->addend =
3876                         _bfd_merged_section_offset (output_bfd, &msec,
3877                                                     elf_section_data (msec)->
3878                                                     sec_info,
3879                                                     sym->st_value
3880                                                     + dynent->addend);
3881                       dynent->addend -= sym->st_value;
3882                       dynent->addend += msec->output_section->vma
3883                                         + msec->output_offset
3884                                         - sym_sec->output_section->vma
3885                                         - sym_sec->output_offset;
3886                     }
3887
3888                   /* We may have introduced duplicated entries. We need
3889                      to remove them properly.  */
3890                   count = sort_dyn_sym_info (loc_h->info, loc_h->count);
3891                   if (count != loc_h->count)
3892                     {
3893                       loc_h->count = count;
3894                       loc_h->sorted_count = count;
3895                     }
3896
3897                   loc_h->sec_merge_done = 1;
3898                 }
3899             }
3900         }
3901       else
3902         {
3903           bfd_boolean unresolved_reloc;
3904           bfd_boolean warned;
3905           struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3906
3907           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
3908                                    r_symndx, symtab_hdr, sym_hashes,
3909                                    h, sym_sec, value,
3910                                    unresolved_reloc, warned);
3911
3912           if (h->root.type == bfd_link_hash_undefweak)
3913             undef_weak_ref = TRUE;
3914           else if (warned)
3915             continue;
3916         }
3917
3918       if (sym_sec != NULL && discarded_section (sym_sec))
3919         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3920                                          rel, 1, relend, howto, 0, contents);
3921
3922       if (info->relocatable)
3923         continue;
3924
3925       hit_addr = contents + rel->r_offset;
3926       value += rel->r_addend;
3927       dynamic_symbol_p = elfNN_ia64_dynamic_symbol_p (h, info, r_type);
3928
3929       switch (r_type)
3930         {
3931         case R_IA64_NONE:
3932         case R_IA64_LDXMOV:
3933           continue;
3934
3935         case R_IA64_IMM14:
3936         case R_IA64_IMM22:
3937         case R_IA64_IMM64:
3938         case R_IA64_DIR32MSB:
3939         case R_IA64_DIR32LSB:
3940         case R_IA64_DIR64MSB:
3941         case R_IA64_DIR64LSB:
3942           /* Install a dynamic relocation for this reloc.  */
3943           if ((dynamic_symbol_p || info->shared)
3944               && r_symndx != STN_UNDEF
3945               && (input_section->flags & SEC_ALLOC) != 0)
3946             {
3947               unsigned int dyn_r_type;
3948               long dynindx;
3949               bfd_vma addend;
3950
3951               BFD_ASSERT (srel != NULL);
3952
3953               switch (r_type)
3954                 {
3955                 case R_IA64_IMM14:
3956                 case R_IA64_IMM22:
3957                 case R_IA64_IMM64:
3958                   /* ??? People shouldn't be doing non-pic code in
3959                      shared libraries nor dynamic executables.  */
3960                   (*_bfd_error_handler)
3961                     (_("%B: non-pic code with imm relocation against dynamic symbol `%s'"),
3962                      input_bfd,
3963                      h ? h->root.root.string
3964                        : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
3965                                            sym_sec));
3966                   ret_val = FALSE;
3967                   continue;
3968
3969                 default:
3970                   break;
3971                 }
3972
3973               /* If we don't need dynamic symbol lookup, find a
3974                  matching RELATIVE relocation.  */
3975               dyn_r_type = r_type;
3976               if (dynamic_symbol_p)
3977                 {
3978                   dynindx = h->dynindx;
3979                   addend = rel->r_addend;
3980                   value = 0;
3981                 }
3982               else
3983                 {
3984                   switch (r_type)
3985                     {
3986                     case R_IA64_DIR32MSB:
3987                       dyn_r_type = R_IA64_REL32MSB;
3988                       break;
3989                     case R_IA64_DIR32LSB:
3990                       dyn_r_type = R_IA64_REL32LSB;
3991                       break;
3992                     case R_IA64_DIR64MSB:
3993                       dyn_r_type = R_IA64_REL64MSB;
3994                       break;
3995                     case R_IA64_DIR64LSB:
3996                       dyn_r_type = R_IA64_REL64LSB;
3997                       break;
3998
3999                     default:
4000                       break;
4001                     }
4002                   dynindx = 0;
4003                   addend = value;
4004                 }
4005
4006               elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
4007                                             srel, rel->r_offset, dyn_r_type,
4008                                             dynindx, addend);
4009             }
4010           /* Fall through.  */
4011
4012         case R_IA64_LTV32MSB:
4013         case R_IA64_LTV32LSB:
4014         case R_IA64_LTV64MSB:
4015         case R_IA64_LTV64LSB:
4016           r = ia64_elf_install_value (hit_addr, value, r_type);
4017           break;
4018
4019         case R_IA64_GPREL22:
4020         case R_IA64_GPREL64I:
4021         case R_IA64_GPREL32MSB:
4022         case R_IA64_GPREL32LSB:
4023         case R_IA64_GPREL64MSB:
4024         case R_IA64_GPREL64LSB:
4025           if (dynamic_symbol_p)
4026             {
4027               (*_bfd_error_handler)
4028                 (_("%B: @gprel relocation against dynamic symbol %s"),
4029                  input_bfd,
4030                  h ? h->root.root.string
4031                    : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
4032                                        sym_sec));
4033               ret_val = FALSE;
4034               continue;
4035             }
4036           value -= gp_val;
4037           r = ia64_elf_install_value (hit_addr, value, r_type);
4038           break;
4039
4040         case R_IA64_LTOFF22:
4041         case R_IA64_LTOFF22X:
4042         case R_IA64_LTOFF64I:
4043           dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
4044           value = set_got_entry (input_bfd, info, dyn_i, (h ? h->dynindx : -1),
4045                                  rel->r_addend, value, R_IA64_DIRNNLSB);
4046           value -= gp_val;
4047           r = ia64_elf_install_value (hit_addr, value, r_type);
4048           break;
4049
4050         case R_IA64_PLTOFF22:
4051         case R_IA64_PLTOFF64I:
4052         case R_IA64_PLTOFF64MSB:
4053         case R_IA64_PLTOFF64LSB:
4054           dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
4055           value = set_pltoff_entry (output_bfd, info, dyn_i, value, FALSE);
4056           value -= gp_val;
4057           r = ia64_elf_install_value (hit_addr, value, r_type);
4058           break;
4059
4060         case R_IA64_FPTR64I:
4061         case R_IA64_FPTR32MSB:
4062         case R_IA64_FPTR32LSB:
4063         case R_IA64_FPTR64MSB:
4064         case R_IA64_FPTR64LSB:
4065           dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
4066           if (dyn_i->want_fptr)
4067             {
4068               if (!undef_weak_ref)
4069                 value = set_fptr_entry (output_bfd, info, dyn_i, value);
4070             }
4071           if (!dyn_i->want_fptr || info->pie)
4072             {
4073               long dynindx;
4074               unsigned int dyn_r_type = r_type;
4075               bfd_vma addend = rel->r_addend;
4076
4077               /* Otherwise, we expect the dynamic linker to create
4078                  the entry.  */
4079
4080               if (dyn_i->want_fptr)
4081                 {
4082                   if (r_type == R_IA64_FPTR64I)
4083                     {
4084                       /* We can't represent this without a dynamic symbol.
4085                          Adjust the relocation to be against an output
4086                          section symbol, which are always present in the
4087                          dynamic symbol table.  */
4088                       /* ??? People shouldn't be doing non-pic code in
4089                          shared libraries.  Hork.  */
4090                       (*_bfd_error_handler)
4091                         (_("%B: linking non-pic code in a position independent executable"),
4092                          input_bfd);
4093                       ret_val = FALSE;
4094                       continue;
4095                     }
4096                   dynindx = 0;
4097                   addend = value;
4098                   dyn_r_type = r_type + R_IA64_RELNNLSB - R_IA64_FPTRNNLSB;
4099                 }
4100               else if (h)
4101                 {
4102                   if (h->dynindx != -1)
4103                     dynindx = h->dynindx;
4104                   else
4105                     dynindx = (_bfd_elf_link_lookup_local_dynindx
4106                                (info, h->root.u.def.section->owner,
4107                                 global_sym_index (h)));
4108                   value = 0;
4109                 }
4110               else
4111                 {
4112                   dynindx = (_bfd_elf_link_lookup_local_dynindx
4113                              (info, input_bfd, (long) r_symndx));
4114                   value = 0;
4115                 }
4116
4117               elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
4118                                             srel, rel->r_offset, dyn_r_type,
4119                                             dynindx, addend);
4120             }
4121
4122           r = ia64_elf_install_value (hit_addr, value, r_type);
4123           break;
4124
4125         case R_IA64_LTOFF_FPTR22:
4126         case R_IA64_LTOFF_FPTR64I:
4127         case R_IA64_LTOFF_FPTR32MSB:
4128         case R_IA64_LTOFF_FPTR32LSB:
4129         case R_IA64_LTOFF_FPTR64MSB:
4130         case R_IA64_LTOFF_FPTR64LSB:
4131           {
4132             long dynindx;
4133
4134             dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
4135             if (dyn_i->want_fptr)
4136               {
4137                 BFD_ASSERT (h == NULL || h->dynindx == -1);
4138                 if (!undef_weak_ref)
4139                   value = set_fptr_entry (output_bfd, info, dyn_i, value);
4140                 dynindx = -1;
4141               }
4142             else
4143               {
4144                 /* Otherwise, we expect the dynamic linker to create
4145                    the entry.  */
4146                 if (h)
4147                   {
4148                     if (h->dynindx != -1)
4149                       dynindx = h->dynindx;
4150                     else
4151                       dynindx = (_bfd_elf_link_lookup_local_dynindx
4152                                  (info, h->root.u.def.section->owner,
4153                                   global_sym_index (h)));
4154                   }
4155                 else
4156                   dynindx = (_bfd_elf_link_lookup_local_dynindx
4157                              (info, input_bfd, (long) r_symndx));
4158                 value = 0;
4159               }
4160
4161             value = set_got_entry (output_bfd, info, dyn_i, dynindx,
4162                                    rel->r_addend, value, R_IA64_FPTRNNLSB);
4163             value -= gp_val;
4164             r = ia64_elf_install_value (hit_addr, value, r_type);
4165           }
4166           break;
4167
4168         case R_IA64_PCREL32MSB:
4169         case R_IA64_PCREL32LSB:
4170         case R_IA64_PCREL64MSB:
4171         case R_IA64_PCREL64LSB:
4172           /* Install a dynamic relocation for this reloc.  */
4173           if (dynamic_symbol_p && r_symndx != STN_UNDEF)
4174             {
4175               BFD_ASSERT (srel != NULL);
4176
4177               elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
4178                                             srel, rel->r_offset, r_type,
4179                                             h->dynindx, rel->r_addend);
4180             }
4181           goto finish_pcrel;
4182
4183         case R_IA64_PCREL21B:
4184         case R_IA64_PCREL60B:
4185           /* We should have created a PLT entry for any dynamic symbol.  */
4186           dyn_i = NULL;
4187           if (h)
4188             dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, FALSE);
4189
4190           if (dyn_i && dyn_i->want_plt2)
4191             {
4192               /* Should have caught this earlier.  */
4193               BFD_ASSERT (rel->r_addend == 0);
4194
4195               value = (ia64_info->root.splt->output_section->vma
4196                        + ia64_info->root.splt->output_offset
4197                        + dyn_i->plt2_offset);
4198             }
4199           else
4200             {
4201               /* Since there's no PLT entry, Validate that this is
4202                  locally defined.  */
4203               BFD_ASSERT (undef_weak_ref || sym_sec->output_section != NULL);
4204
4205               /* If the symbol is undef_weak, we shouldn't be trying
4206                  to call it.  There's every chance that we'd wind up
4207                  with an out-of-range fixup here.  Don't bother setting
4208                  any value at all.  */
4209               if (undef_weak_ref)
4210                 continue;
4211             }
4212           goto finish_pcrel;
4213
4214         case R_IA64_PCREL21BI:
4215         case R_IA64_PCREL21F:
4216         case R_IA64_PCREL21M:
4217         case R_IA64_PCREL22:
4218         case R_IA64_PCREL64I:
4219           /* The PCREL21BI reloc is specifically not intended for use with
4220              dynamic relocs.  PCREL21F and PCREL21M are used for speculation
4221              fixup code, and thus probably ought not be dynamic.  The
4222              PCREL22 and PCREL64I relocs aren't emitted as dynamic relocs.  */
4223           if (dynamic_symbol_p)
4224             {
4225               const char *msg;
4226
4227               if (r_type == R_IA64_PCREL21BI)
4228                 msg = _("%B: @internal branch to dynamic symbol %s");
4229               else if (r_type == R_IA64_PCREL21F || r_type == R_IA64_PCREL21M)
4230                 msg = _("%B: speculation fixup to dynamic symbol %s");
4231               else
4232                 msg = _("%B: @pcrel relocation against dynamic symbol %s");
4233               (*_bfd_error_handler) (msg, input_bfd,
4234                                      h ? h->root.root.string
4235                                        : bfd_elf_sym_name (input_bfd,
4236                                                            symtab_hdr,
4237                                                            sym,
4238                                                            sym_sec));
4239               ret_val = FALSE;
4240               continue;
4241             }
4242           goto finish_pcrel;
4243
4244         finish_pcrel:
4245           /* Make pc-relative.  */
4246           value -= (input_section->output_section->vma
4247                     + input_section->output_offset
4248                     + rel->r_offset) & ~ (bfd_vma) 0x3;
4249           r = ia64_elf_install_value (hit_addr, value, r_type);
4250           break;
4251
4252         case R_IA64_SEGREL32MSB:
4253         case R_IA64_SEGREL32LSB:
4254         case R_IA64_SEGREL64MSB:
4255         case R_IA64_SEGREL64LSB:
4256             {
4257               /* Find the segment that contains the output_section.  */
4258               Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section
4259                 (output_bfd, input_section->output_section);
4260
4261               if (p == NULL)
4262                 {
4263                   r = bfd_reloc_notsupported;
4264                 }
4265               else
4266                 {
4267                   /* The VMA of the segment is the vaddr of the associated
4268                      program header.  */
4269                   if (value > p->p_vaddr)
4270                     value -= p->p_vaddr;
4271                   else
4272                     value = 0;
4273                   r = ia64_elf_install_value (hit_addr, value, r_type);
4274                 }
4275               break;
4276             }
4277
4278         case R_IA64_SECREL32MSB:
4279         case R_IA64_SECREL32LSB:
4280         case R_IA64_SECREL64MSB:
4281         case R_IA64_SECREL64LSB:
4282           /* Make output-section relative to section where the symbol
4283              is defined. PR 475  */
4284           if (sym_sec)
4285             value -= sym_sec->output_section->vma;
4286           r = ia64_elf_install_value (hit_addr, value, r_type);
4287           break;
4288
4289         case R_IA64_IPLTMSB:
4290         case R_IA64_IPLTLSB:
4291           /* Install a dynamic relocation for this reloc.  */
4292           if ((dynamic_symbol_p || info->shared)
4293               && (input_section->flags & SEC_ALLOC) != 0)
4294             {
4295               BFD_ASSERT (srel != NULL);
4296
4297               /* If we don't need dynamic symbol lookup, install two
4298                  RELATIVE relocations.  */
4299               if (!dynamic_symbol_p)
4300                 {
4301                   unsigned int dyn_r_type;
4302
4303                   if (r_type == R_IA64_IPLTMSB)
4304                     dyn_r_type = R_IA64_REL64MSB;
4305                   else
4306                     dyn_r_type = R_IA64_REL64LSB;
4307
4308                   elfNN_ia64_install_dyn_reloc (output_bfd, info,
4309                                                 input_section,
4310                                                 srel, rel->r_offset,
4311                                                 dyn_r_type, 0, value);
4312                   elfNN_ia64_install_dyn_reloc (output_bfd, info,
4313                                                 input_section,
4314                                                 srel, rel->r_offset + 8,
4315                                                 dyn_r_type, 0, gp_val);
4316                 }
4317               else
4318                 elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
4319                                               srel, rel->r_offset, r_type,
4320                                               h->dynindx, rel->r_addend);
4321             }
4322
4323           if (r_type == R_IA64_IPLTMSB)
4324             r_type = R_IA64_DIR64MSB;
4325           else
4326             r_type = R_IA64_DIR64LSB;
4327           ia64_elf_install_value (hit_addr, value, r_type);
4328           r = ia64_elf_install_value (hit_addr + 8, gp_val, r_type);
4329           break;
4330
4331         case R_IA64_TPREL14:
4332         case R_IA64_TPREL22:
4333         case R_IA64_TPREL64I:
4334           if (elf_hash_table (info)->tls_sec == NULL)
4335             goto missing_tls_sec;
4336           value -= elfNN_ia64_tprel_base (info);
4337           r = ia64_elf_install_value (hit_addr, value, r_type);
4338           break;
4339
4340         case R_IA64_DTPREL14:
4341         case R_IA64_DTPREL22:
4342         case R_IA64_DTPREL64I:
4343         case R_IA64_DTPREL32LSB:
4344         case R_IA64_DTPREL32MSB:
4345         case R_IA64_DTPREL64LSB:
4346         case R_IA64_DTPREL64MSB:
4347           if (elf_hash_table (info)->tls_sec == NULL)
4348             goto missing_tls_sec;
4349           value -= elfNN_ia64_dtprel_base (info);
4350           r = ia64_elf_install_value (hit_addr, value, r_type);
4351           break;
4352
4353         case R_IA64_LTOFF_TPREL22:
4354         case R_IA64_LTOFF_DTPMOD22:
4355         case R_IA64_LTOFF_DTPREL22:
4356           {
4357             int got_r_type;
4358             long dynindx = h ? h->dynindx : -1;
4359             bfd_vma r_addend = rel->r_addend;
4360
4361             switch (r_type)
4362               {
4363               default:
4364               case R_IA64_LTOFF_TPREL22:
4365                 if (!dynamic_symbol_p)
4366                   {
4367                     if (elf_hash_table (info)->tls_sec == NULL)
4368                       goto missing_tls_sec;
4369                     if (!info->shared)
4370                       value -= elfNN_ia64_tprel_base (info);
4371                     else
4372                       {
4373                         r_addend += value - elfNN_ia64_dtprel_base (info);
4374                         dynindx = 0;
4375                       }
4376                   }
4377                 got_r_type = R_IA64_TPREL64LSB;
4378                 break;
4379               case R_IA64_LTOFF_DTPMOD22:
4380                 if (!dynamic_symbol_p && !info->shared)
4381                   value = 1;
4382                 got_r_type = R_IA64_DTPMOD64LSB;
4383                 break;
4384               case R_IA64_LTOFF_DTPREL22:
4385                 if (!dynamic_symbol_p)
4386                   {
4387                     if (elf_hash_table (info)->tls_sec == NULL)
4388                       goto missing_tls_sec;
4389                     value -= elfNN_ia64_dtprel_base (info);
4390                   }
4391                 got_r_type = R_IA64_DTPRELNNLSB;
4392                 break;
4393               }
4394             dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, FALSE);
4395             value = set_got_entry (input_bfd, info, dyn_i, dynindx, r_addend,
4396                                    value, got_r_type);
4397             value -= gp_val;
4398             r = ia64_elf_install_value (hit_addr, value, r_type);
4399           }
4400           break;
4401
4402         default:
4403           r = bfd_reloc_notsupported;
4404           break;
4405         }
4406
4407       switch (r)
4408         {
4409         case bfd_reloc_ok:
4410           break;
4411
4412         case bfd_reloc_undefined:
4413           /* This can happen for global table relative relocs if
4414              __gp is undefined.  This is a panic situation so we
4415              don't try to continue.  */
4416           (*info->callbacks->undefined_symbol)
4417             (info, "__gp", input_bfd, input_section, rel->r_offset, 1);
4418           return FALSE;
4419
4420         case bfd_reloc_notsupported:
4421           {
4422             const char *name;
4423
4424             if (h)
4425               name = h->root.root.string;
4426             else
4427               name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
4428                                        sym_sec);
4429             if (!(*info->callbacks->warning) (info, _("unsupported reloc"),
4430                                               name, input_bfd,
4431                                               input_section, rel->r_offset))
4432               return FALSE;
4433             ret_val = FALSE;
4434           }
4435           break;
4436
4437         case bfd_reloc_dangerous:
4438         case bfd_reloc_outofrange:
4439         case bfd_reloc_overflow:
4440         default:
4441 missing_tls_sec:
4442           {
4443             const char *name;
4444
4445             if (h)
4446               name = h->root.root.string;
4447             else
4448               name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
4449                                        sym_sec);
4450
4451             switch (r_type)
4452               {
4453               case R_IA64_TPREL14:
4454               case R_IA64_TPREL22:
4455               case R_IA64_TPREL64I:
4456               case R_IA64_DTPREL14:
4457               case R_IA64_DTPREL22:
4458               case R_IA64_DTPREL64I:
4459               case R_IA64_DTPREL32LSB:
4460               case R_IA64_DTPREL32MSB:
4461               case R_IA64_DTPREL64LSB:
4462               case R_IA64_DTPREL64MSB:
4463               case R_IA64_LTOFF_TPREL22:
4464               case R_IA64_LTOFF_DTPMOD22:
4465               case R_IA64_LTOFF_DTPREL22:
4466                 (*_bfd_error_handler)
4467                   (_("%B: missing TLS section for relocation %s against `%s' at 0x%lx in section `%A'."),
4468                    input_bfd, input_section, howto->name, name,
4469                    rel->r_offset);
4470                 break;
4471
4472               case R_IA64_PCREL21B:
4473               case R_IA64_PCREL21BI:
4474               case R_IA64_PCREL21M:
4475               case R_IA64_PCREL21F:
4476                 if (is_elf_hash_table (info->hash))
4477                   {
4478                     /* Relaxtion is always performed for ELF output.
4479                        Overflow failures for those relocations mean
4480                        that the section is too big to relax.  */
4481                     (*_bfd_error_handler)
4482                       (_("%B: Can't relax br (%s) to `%s' at 0x%lx in section `%A' with size 0x%lx (> 0x1000000)."),
4483                        input_bfd, input_section, howto->name, name,
4484                        rel->r_offset, input_section->size);
4485                     break;
4486                   }
4487               default:
4488                 if (!(*info->callbacks->reloc_overflow) (info,
4489                                                          &h->root,
4490                                                          name,
4491                                                          howto->name,
4492                                                          (bfd_vma) 0,
4493                                                          input_bfd,
4494                                                          input_section,
4495                                                          rel->r_offset))
4496                   return FALSE;
4497                 break;
4498               }
4499
4500             ret_val = FALSE;
4501           }
4502           break;
4503         }
4504     }
4505
4506   return ret_val;
4507 }
4508
4509 static bfd_boolean
4510 elfNN_ia64_finish_dynamic_symbol (bfd *output_bfd,
4511                                   struct bfd_link_info *info,
4512                                   struct elf_link_hash_entry *h,
4513                                   Elf_Internal_Sym *sym)
4514 {
4515   struct elfNN_ia64_link_hash_table *ia64_info;
4516   struct elfNN_ia64_dyn_sym_info *dyn_i;
4517
4518   ia64_info = elfNN_ia64_hash_table (info);
4519   if (ia64_info == NULL)
4520     return FALSE;
4521
4522   dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, FALSE);
4523
4524   /* Fill in the PLT data, if required.  */
4525   if (dyn_i && dyn_i->want_plt)
4526     {
4527       Elf_Internal_Rela outrel;
4528       bfd_byte *loc;
4529       asection *plt_sec;
4530       bfd_vma plt_addr, pltoff_addr, gp_val, plt_index;
4531
4532       gp_val = _bfd_get_gp_value (output_bfd);
4533
4534       /* Initialize the minimal PLT entry.  */
4535
4536       plt_index = (dyn_i->plt_offset - PLT_HEADER_SIZE) / PLT_MIN_ENTRY_SIZE;
4537       plt_sec = ia64_info->root.splt;
4538       loc = plt_sec->contents + dyn_i->plt_offset;
4539
4540       memcpy (loc, plt_min_entry, PLT_MIN_ENTRY_SIZE);
4541       ia64_elf_install_value (loc, plt_index, R_IA64_IMM22);
4542       ia64_elf_install_value (loc+2, -dyn_i->plt_offset, R_IA64_PCREL21B);
4543
4544       plt_addr = (plt_sec->output_section->vma
4545                   + plt_sec->output_offset
4546                   + dyn_i->plt_offset);
4547       pltoff_addr = set_pltoff_entry (output_bfd, info, dyn_i, plt_addr, TRUE);
4548
4549       /* Initialize the FULL PLT entry, if needed.  */
4550       if (dyn_i->want_plt2)
4551         {
4552           loc = plt_sec->contents + dyn_i->plt2_offset;
4553
4554           memcpy (loc, plt_full_entry, PLT_FULL_ENTRY_SIZE);
4555           ia64_elf_install_value (loc, pltoff_addr - gp_val, R_IA64_IMM22);
4556
4557           /* Mark the symbol as undefined, rather than as defined in the
4558              plt section.  Leave the value alone.  */
4559           /* ??? We didn't redefine it in adjust_dynamic_symbol in the
4560              first place.  But perhaps elflink.c did some for us.  */
4561           if (!h->def_regular)
4562             sym->st_shndx = SHN_UNDEF;
4563         }
4564
4565       /* Create the dynamic relocation.  */
4566       outrel.r_offset = pltoff_addr;
4567       if (bfd_little_endian (output_bfd))
4568         outrel.r_info = ELFNN_R_INFO (h->dynindx, R_IA64_IPLTLSB);
4569       else
4570         outrel.r_info = ELFNN_R_INFO (h->dynindx, R_IA64_IPLTMSB);
4571       outrel.r_addend = 0;
4572
4573       /* This is fun.  In the .IA_64.pltoff section, we've got entries
4574          that correspond both to real PLT entries, and those that
4575          happened to resolve to local symbols but need to be created
4576          to satisfy @pltoff relocations.  The .rela.IA_64.pltoff
4577          relocations for the real PLT should come at the end of the
4578          section, so that they can be indexed by plt entry at runtime.
4579
4580          We emitted all of the relocations for the non-PLT @pltoff
4581          entries during relocate_section.  So we can consider the
4582          existing sec->reloc_count to be the base of the array of
4583          PLT relocations.  */
4584
4585       loc = ia64_info->rel_pltoff_sec->contents;
4586       loc += ((ia64_info->rel_pltoff_sec->reloc_count + plt_index)
4587               * sizeof (ElfNN_External_Rela));
4588       bfd_elfNN_swap_reloca_out (output_bfd, &outrel, loc);
4589     }
4590
4591   /* Mark some specially defined symbols as absolute.  */
4592   if (h == ia64_info->root.hdynamic
4593       || h == ia64_info->root.hgot
4594       || h == ia64_info->root.hplt)
4595     sym->st_shndx = SHN_ABS;
4596
4597   return TRUE;
4598 }
4599
4600 static bfd_boolean
4601 elfNN_ia64_finish_dynamic_sections (bfd *abfd,
4602                                     struct bfd_link_info *info)
4603 {
4604   struct elfNN_ia64_link_hash_table *ia64_info;
4605   bfd *dynobj;
4606
4607   ia64_info = elfNN_ia64_hash_table (info);
4608   if (ia64_info == NULL)
4609     return FALSE;
4610
4611   dynobj = ia64_info->root.dynobj;
4612
4613   if (elf_hash_table (info)->dynamic_sections_created)
4614     {
4615       ElfNN_External_Dyn *dyncon, *dynconend;
4616       asection *sdyn, *sgotplt;
4617       bfd_vma gp_val;
4618
4619       sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4620       sgotplt = bfd_get_linker_section (dynobj, ".got.plt");
4621       BFD_ASSERT (sdyn != NULL);
4622       dyncon = (ElfNN_External_Dyn *) sdyn->contents;
4623       dynconend = (ElfNN_External_Dyn *) (sdyn->contents + sdyn->size);
4624
4625       gp_val = _bfd_get_gp_value (abfd);
4626
4627       for (; dyncon < dynconend; dyncon++)
4628         {
4629           Elf_Internal_Dyn dyn;
4630
4631           bfd_elfNN_swap_dyn_in (dynobj, dyncon, &dyn);
4632
4633           switch (dyn.d_tag)
4634             {
4635             case DT_PLTGOT:
4636               dyn.d_un.d_ptr = gp_val;
4637               break;
4638
4639             case DT_PLTRELSZ:
4640               dyn.d_un.d_val = (ia64_info->minplt_entries
4641                                 * sizeof (ElfNN_External_Rela));
4642               break;
4643
4644             case DT_JMPREL:
4645               /* See the comment above in finish_dynamic_symbol.  */
4646               dyn.d_un.d_ptr = (ia64_info->rel_pltoff_sec->output_section->vma
4647                                 + ia64_info->rel_pltoff_sec->output_offset
4648                                 + (ia64_info->rel_pltoff_sec->reloc_count
4649                                    * sizeof (ElfNN_External_Rela)));
4650               break;
4651
4652             case DT_IA_64_PLT_RESERVE:
4653               dyn.d_un.d_ptr = (sgotplt->output_section->vma
4654                                 + sgotplt->output_offset);
4655               break;
4656
4657             case DT_RELASZ:
4658               /* Do not have RELASZ include JMPREL.  This makes things
4659                  easier on ld.so.  This is not what the rest of BFD set up.  */
4660               dyn.d_un.d_val -= (ia64_info->minplt_entries
4661                                  * sizeof (ElfNN_External_Rela));
4662               break;
4663             }
4664
4665           bfd_elfNN_swap_dyn_out (abfd, &dyn, dyncon);
4666         }
4667
4668       /* Initialize the PLT0 entry.  */
4669       if (ia64_info->root.splt)
4670         {
4671           bfd_byte *loc = ia64_info->root.splt->contents;
4672           bfd_vma pltres;
4673
4674           memcpy (loc, plt_header, PLT_HEADER_SIZE);
4675
4676           pltres = (sgotplt->output_section->vma
4677                     + sgotplt->output_offset
4678                     - gp_val);
4679
4680           ia64_elf_install_value (loc+1, pltres, R_IA64_GPREL22);
4681         }
4682     }
4683
4684   return TRUE;
4685 }
4686 \f
4687 /* ELF file flag handling:  */
4688
4689 /* Function to keep IA-64 specific file flags.  */
4690 static bfd_boolean
4691 elfNN_ia64_set_private_flags (bfd *abfd, flagword flags)
4692 {
4693   BFD_ASSERT (!elf_flags_init (abfd)
4694               || elf_elfheader (abfd)->e_flags == flags);
4695
4696   elf_elfheader (abfd)->e_flags = flags;
4697   elf_flags_init (abfd) = TRUE;
4698   return TRUE;
4699 }
4700
4701 /* Merge backend specific data from an object file to the output
4702    object file when linking.  */
4703 static bfd_boolean
4704 elfNN_ia64_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
4705 {
4706   flagword out_flags;
4707   flagword in_flags;
4708   bfd_boolean ok = TRUE;
4709
4710   /* Don't even pretend to support mixed-format linking.  */
4711   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
4712       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
4713     return FALSE;
4714
4715   in_flags  = elf_elfheader (ibfd)->e_flags;
4716   out_flags = elf_elfheader (obfd)->e_flags;
4717
4718   if (! elf_flags_init (obfd))
4719     {
4720       elf_flags_init (obfd) = TRUE;
4721       elf_elfheader (obfd)->e_flags = in_flags;
4722
4723       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
4724           && bfd_get_arch_info (obfd)->the_default)
4725         {
4726           return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
4727                                     bfd_get_mach (ibfd));
4728         }
4729
4730       return TRUE;
4731     }
4732
4733   /* Check flag compatibility.  */
4734   if (in_flags == out_flags)
4735     return TRUE;
4736
4737   /* Output has EF_IA_64_REDUCEDFP set only if all inputs have it set.  */
4738   if (!(in_flags & EF_IA_64_REDUCEDFP) && (out_flags & EF_IA_64_REDUCEDFP))
4739     elf_elfheader (obfd)->e_flags &= ~EF_IA_64_REDUCEDFP;
4740
4741   if ((in_flags & EF_IA_64_TRAPNIL) != (out_flags & EF_IA_64_TRAPNIL))
4742     {
4743       (*_bfd_error_handler)
4744         (_("%B: linking trap-on-NULL-dereference with non-trapping files"),
4745          ibfd);
4746
4747       bfd_set_error (bfd_error_bad_value);
4748       ok = FALSE;
4749     }
4750   if ((in_flags & EF_IA_64_BE) != (out_flags & EF_IA_64_BE))
4751     {
4752       (*_bfd_error_handler)
4753         (_("%B: linking big-endian files with little-endian files"),
4754          ibfd);
4755
4756       bfd_set_error (bfd_error_bad_value);
4757       ok = FALSE;
4758     }
4759   if ((in_flags & EF_IA_64_ABI64) != (out_flags & EF_IA_64_ABI64))
4760     {
4761       (*_bfd_error_handler)
4762         (_("%B: linking 64-bit files with 32-bit files"),
4763          ibfd);
4764
4765       bfd_set_error (bfd_error_bad_value);
4766       ok = FALSE;
4767     }
4768   if ((in_flags & EF_IA_64_CONS_GP) != (out_flags & EF_IA_64_CONS_GP))
4769     {
4770       (*_bfd_error_handler)
4771         (_("%B: linking constant-gp files with non-constant-gp files"),
4772          ibfd);
4773
4774       bfd_set_error (bfd_error_bad_value);
4775       ok = FALSE;
4776     }
4777   if ((in_flags & EF_IA_64_NOFUNCDESC_CONS_GP)
4778       != (out_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
4779     {
4780       (*_bfd_error_handler)
4781         (_("%B: linking auto-pic files with non-auto-pic files"),
4782          ibfd);
4783
4784       bfd_set_error (bfd_error_bad_value);
4785       ok = FALSE;
4786     }
4787
4788   return ok;
4789 }
4790
4791 static bfd_boolean
4792 elfNN_ia64_print_private_bfd_data (bfd *abfd, void * ptr)
4793 {
4794   FILE *file = (FILE *) ptr;
4795   flagword flags = elf_elfheader (abfd)->e_flags;
4796
4797   BFD_ASSERT (abfd != NULL && ptr != NULL);
4798
4799   fprintf (file, "private flags = %s%s%s%s%s%s%s%s\n",
4800            (flags & EF_IA_64_TRAPNIL) ? "TRAPNIL, " : "",
4801            (flags & EF_IA_64_EXT) ? "EXT, " : "",
4802            (flags & EF_IA_64_BE) ? "BE, " : "LE, ",
4803            (flags & EF_IA_64_REDUCEDFP) ? "REDUCEDFP, " : "",
4804            (flags & EF_IA_64_CONS_GP) ? "CONS_GP, " : "",
4805            (flags & EF_IA_64_NOFUNCDESC_CONS_GP) ? "NOFUNCDESC_CONS_GP, " : "",
4806            (flags & EF_IA_64_ABSOLUTE) ? "ABSOLUTE, " : "",
4807            (flags & EF_IA_64_ABI64) ? "ABI64" : "ABI32");
4808
4809   _bfd_elf_print_private_bfd_data (abfd, ptr);
4810   return TRUE;
4811 }
4812
4813 static enum elf_reloc_type_class
4814 elfNN_ia64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
4815                              const asection *rel_sec ATTRIBUTE_UNUSED,
4816                              const Elf_Internal_Rela *rela)
4817 {
4818   switch ((int) ELFNN_R_TYPE (rela->r_info))
4819     {
4820     case R_IA64_REL32MSB:
4821     case R_IA64_REL32LSB:
4822     case R_IA64_REL64MSB:
4823     case R_IA64_REL64LSB:
4824       return reloc_class_relative;
4825     case R_IA64_IPLTMSB:
4826     case R_IA64_IPLTLSB:
4827       return reloc_class_plt;
4828     case R_IA64_COPY:
4829       return reloc_class_copy;
4830     default:
4831       return reloc_class_normal;
4832     }
4833 }
4834
4835 static const struct bfd_elf_special_section elfNN_ia64_special_sections[] =
4836 {
4837   { STRING_COMMA_LEN (".sbss"),  -1, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
4838   { STRING_COMMA_LEN (".sdata"), -1, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
4839   { NULL,                    0,   0, 0,            0 }
4840 };
4841
4842 static bfd_boolean
4843 elfNN_ia64_object_p (bfd *abfd)
4844 {
4845   asection *sec;
4846   asection *group, *unwi, *unw;
4847   flagword flags;
4848   const char *name;
4849   char *unwi_name, *unw_name;
4850   bfd_size_type amt;
4851
4852   if (abfd->flags & DYNAMIC)
4853     return TRUE;
4854
4855   /* Flags for fake group section.  */
4856   flags = (SEC_LINKER_CREATED | SEC_GROUP | SEC_LINK_ONCE
4857            | SEC_EXCLUDE);
4858
4859   /* We add a fake section group for each .gnu.linkonce.t.* section,
4860      which isn't in a section group, and its unwind sections.  */
4861   for (sec = abfd->sections; sec != NULL; sec = sec->next)
4862     {
4863       if (elf_sec_group (sec) == NULL
4864           && ((sec->flags & (SEC_LINK_ONCE | SEC_CODE | SEC_GROUP))
4865               == (SEC_LINK_ONCE | SEC_CODE))
4866           && CONST_STRNEQ (sec->name, ".gnu.linkonce.t."))
4867         {
4868           name = sec->name + 16;
4869
4870           amt = strlen (name) + sizeof (".gnu.linkonce.ia64unwi.");
4871           unwi_name = bfd_alloc (abfd, amt);
4872           if (!unwi_name)
4873             return FALSE;
4874
4875           strcpy (stpcpy (unwi_name, ".gnu.linkonce.ia64unwi."), name);
4876           unwi = bfd_get_section_by_name (abfd, unwi_name);
4877
4878           amt = strlen (name) + sizeof (".gnu.linkonce.ia64unw.");
4879           unw_name = bfd_alloc (abfd, amt);
4880           if (!unw_name)
4881             return FALSE;
4882
4883           strcpy (stpcpy (unw_name, ".gnu.linkonce.ia64unw."), name);
4884           unw = bfd_get_section_by_name (abfd, unw_name);
4885
4886           /* We need to create a fake group section for it and its
4887              unwind sections.  */
4888           group = bfd_make_section_anyway_with_flags (abfd, name,
4889                                                       flags);
4890           if (group == NULL)
4891             return FALSE;
4892
4893           /* Move the fake group section to the beginning.  */
4894           bfd_section_list_remove (abfd, group);
4895           bfd_section_list_prepend (abfd, group);
4896
4897           elf_next_in_group (group) = sec;
4898
4899           elf_group_name (sec) = name;
4900           elf_next_in_group (sec) = sec;
4901           elf_sec_group (sec) = group;
4902
4903           if (unwi)
4904             {
4905               elf_group_name (unwi) = name;
4906               elf_next_in_group (unwi) = sec;
4907               elf_next_in_group (sec) = unwi;
4908               elf_sec_group (unwi) = group;
4909             }
4910
4911            if (unw)
4912              {
4913                elf_group_name (unw) = name;
4914                if (unwi)
4915                  {
4916                    elf_next_in_group (unw) = elf_next_in_group (unwi);
4917                    elf_next_in_group (unwi) = unw;
4918                  }
4919                else
4920                  {
4921                    elf_next_in_group (unw) = sec;
4922                    elf_next_in_group (sec) = unw;
4923                  }
4924                elf_sec_group (unw) = group;
4925              }
4926
4927            /* Fake SHT_GROUP section header.  */
4928           elf_section_data (group)->this_hdr.bfd_section = group;
4929           elf_section_data (group)->this_hdr.sh_type = SHT_GROUP;
4930         }
4931     }
4932   return TRUE;
4933 }
4934
4935 static bfd_boolean
4936 elfNN_ia64_hpux_vec (const bfd_target *vec)
4937 {
4938   extern const bfd_target bfd_elfNN_ia64_hpux_big_vec;
4939   return (vec == & bfd_elfNN_ia64_hpux_big_vec);
4940 }
4941
4942 static void
4943 elfNN_hpux_post_process_headers (bfd *abfd,
4944                                  struct bfd_link_info *info ATTRIBUTE_UNUSED)
4945 {
4946   Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
4947
4948   i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
4949   i_ehdrp->e_ident[EI_ABIVERSION] = 1;
4950 }
4951
4952 static bfd_boolean
4953 elfNN_hpux_backend_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
4954                                              asection *sec, int *retval)
4955 {
4956   if (bfd_is_com_section (sec))
4957     {
4958       *retval = SHN_IA_64_ANSI_COMMON;
4959       return TRUE;
4960     }
4961   return FALSE;
4962 }
4963
4964 static void
4965 elfNN_hpux_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
4966                                       asymbol *asym)
4967 {
4968   elf_symbol_type *elfsym = (elf_symbol_type *) asym;
4969
4970   switch (elfsym->internal_elf_sym.st_shndx)
4971     {
4972     case SHN_IA_64_ANSI_COMMON:
4973       asym->section = bfd_com_section_ptr;
4974       asym->value = elfsym->internal_elf_sym.st_size;
4975       asym->flags &= ~BSF_GLOBAL;
4976       break;
4977     }
4978 }
4979 \f
4980 #define TARGET_LITTLE_SYM               bfd_elfNN_ia64_little_vec
4981 #define TARGET_LITTLE_NAME              "elfNN-ia64-little"
4982 #define TARGET_BIG_SYM                  bfd_elfNN_ia64_big_vec
4983 #define TARGET_BIG_NAME                 "elfNN-ia64-big"
4984 #define ELF_ARCH                        bfd_arch_ia64
4985 #define ELF_TARGET_ID                   IA64_ELF_DATA
4986 #define ELF_MACHINE_CODE                EM_IA_64
4987 #define ELF_MACHINE_ALT1                1999    /* EAS2.3 */
4988 #define ELF_MACHINE_ALT2                1998    /* EAS2.2 */
4989 #define ELF_MAXPAGESIZE                 0x10000 /* 64KB */
4990 #define ELF_COMMONPAGESIZE              0x4000  /* 16KB */
4991
4992 #define elf_backend_section_from_shdr \
4993         elfNN_ia64_section_from_shdr
4994 #define elf_backend_section_flags \
4995         elfNN_ia64_section_flags
4996 #define elf_backend_fake_sections \
4997         elfNN_ia64_fake_sections
4998 #define elf_backend_final_write_processing \
4999         elfNN_ia64_final_write_processing
5000 #define elf_backend_add_symbol_hook \
5001         elfNN_ia64_add_symbol_hook
5002 #define elf_backend_additional_program_headers \
5003         elfNN_ia64_additional_program_headers
5004 #define elf_backend_modify_segment_map \
5005         elfNN_ia64_modify_segment_map
5006 #define elf_backend_modify_program_headers \
5007         elfNN_ia64_modify_program_headers
5008 #define elf_info_to_howto \
5009         elfNN_ia64_info_to_howto
5010
5011 #define bfd_elfNN_bfd_reloc_type_lookup \
5012         ia64_elf_reloc_type_lookup
5013 #define bfd_elfNN_bfd_reloc_name_lookup \
5014         ia64_elf_reloc_name_lookup
5015 #define bfd_elfNN_bfd_is_local_label_name \
5016         elfNN_ia64_is_local_label_name
5017 #define bfd_elfNN_bfd_relax_section \
5018         elfNN_ia64_relax_section
5019
5020 #define elf_backend_object_p \
5021         elfNN_ia64_object_p
5022
5023 /* Stuff for the BFD linker: */
5024 #define bfd_elfNN_bfd_link_hash_table_create \
5025         elfNN_ia64_hash_table_create
5026 #define bfd_elfNN_bfd_link_hash_table_free \
5027         elfNN_ia64_hash_table_free
5028 #define elf_backend_create_dynamic_sections \
5029         elfNN_ia64_create_dynamic_sections
5030 #define elf_backend_check_relocs \
5031         elfNN_ia64_check_relocs
5032 #define elf_backend_adjust_dynamic_symbol \
5033         elfNN_ia64_adjust_dynamic_symbol
5034 #define elf_backend_size_dynamic_sections \
5035         elfNN_ia64_size_dynamic_sections
5036 #define elf_backend_omit_section_dynsym \
5037   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
5038 #define elf_backend_relocate_section \
5039         elfNN_ia64_relocate_section
5040 #define elf_backend_finish_dynamic_symbol \
5041         elfNN_ia64_finish_dynamic_symbol
5042 #define elf_backend_finish_dynamic_sections \
5043         elfNN_ia64_finish_dynamic_sections
5044 #define bfd_elfNN_bfd_final_link \
5045         elfNN_ia64_final_link
5046
5047 #define bfd_elfNN_bfd_merge_private_bfd_data \
5048         elfNN_ia64_merge_private_bfd_data
5049 #define bfd_elfNN_bfd_set_private_flags \
5050         elfNN_ia64_set_private_flags
5051 #define bfd_elfNN_bfd_print_private_bfd_data \
5052         elfNN_ia64_print_private_bfd_data
5053
5054 #define elf_backend_plt_readonly        1
5055 #define elf_backend_want_plt_sym        0
5056 #define elf_backend_plt_alignment       5
5057 #define elf_backend_got_header_size     0
5058 #define elf_backend_want_got_plt        1
5059 #define elf_backend_may_use_rel_p       1
5060 #define elf_backend_may_use_rela_p      1
5061 #define elf_backend_default_use_rela_p  1
5062 #define elf_backend_want_dynbss         0
5063 #define elf_backend_copy_indirect_symbol elfNN_ia64_hash_copy_indirect
5064 #define elf_backend_hide_symbol         elfNN_ia64_hash_hide_symbol
5065 #define elf_backend_fixup_symbol        _bfd_elf_link_hash_fixup_symbol
5066 #define elf_backend_reloc_type_class    elfNN_ia64_reloc_type_class
5067 #define elf_backend_rela_normal         1
5068 #define elf_backend_special_sections    elfNN_ia64_special_sections
5069 #define elf_backend_default_execstack   0
5070
5071 /* FIXME: PR 290: The Intel C compiler generates SHT_IA_64_UNWIND with
5072    SHF_LINK_ORDER. But it doesn't set the sh_link or sh_info fields.
5073    We don't want to flood users with so many error messages. We turn
5074    off the warning for now. It will be turned on later when the Intel
5075    compiler is fixed.   */
5076 #define elf_backend_link_order_error_handler NULL
5077
5078 #include "elfNN-target.h"
5079
5080 /* HPUX-specific vectors.  */
5081
5082 #undef  TARGET_LITTLE_SYM
5083 #undef  TARGET_LITTLE_NAME
5084 #undef  TARGET_BIG_SYM
5085 #define TARGET_BIG_SYM                  bfd_elfNN_ia64_hpux_big_vec
5086 #undef  TARGET_BIG_NAME
5087 #define TARGET_BIG_NAME                 "elfNN-ia64-hpux-big"
5088
5089 /* These are HP-UX specific functions.  */
5090
5091 #undef  elf_backend_post_process_headers
5092 #define elf_backend_post_process_headers elfNN_hpux_post_process_headers
5093
5094 #undef  elf_backend_section_from_bfd_section
5095 #define elf_backend_section_from_bfd_section elfNN_hpux_backend_section_from_bfd_section
5096
5097 #undef elf_backend_symbol_processing
5098 #define elf_backend_symbol_processing elfNN_hpux_backend_symbol_processing
5099
5100 #undef  elf_backend_want_p_paddr_set_to_zero
5101 #define elf_backend_want_p_paddr_set_to_zero 1
5102
5103 #undef ELF_COMMONPAGESIZE
5104 #undef ELF_OSABI
5105 #define ELF_OSABI                       ELFOSABI_HPUX
5106
5107 #undef  elfNN_bed
5108 #define elfNN_bed elfNN_ia64_hpux_bed
5109
5110 #include "elfNN-target.h"