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