Automatic date update in version.in
[external/binutils.git] / bfd / elf32-hppa.c
1 /* BFD back-end for HP PA-RISC ELF files.
2    Copyright (C) 1990-2018 Free Software Foundation, Inc.
3
4    Original code by
5         Center for Software Science
6         Department of Computer Science
7         University of Utah
8    Largely rewritten by Alan Modra <alan@linuxcare.com.au>
9    Naming cleanup by Carlos O'Donell <carlos@systemhalted.org>
10    TLS support written by Randolph Chung <tausq@debian.org>
11
12    This file is part of BFD, the Binary File Descriptor library.
13
14    This program is free software; you can redistribute it and/or modify
15    it under the terms of the GNU General Public License as published by
16    the Free Software Foundation; either version 3 of the License, or
17    (at your option) any later version.
18
19    This program is distributed in the hope that it will be useful,
20    but WITHOUT ANY WARRANTY; without even the implied warranty of
21    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22    GNU General Public License for more details.
23
24    You should have received a copy of the GNU General Public License
25    along with this program; if not, write to the Free Software
26    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
27    MA 02110-1301, USA.  */
28
29 #include "sysdep.h"
30 #include "bfd.h"
31 #include "libbfd.h"
32 #include "elf-bfd.h"
33 #include "elf/hppa.h"
34 #include "libhppa.h"
35 #include "elf32-hppa.h"
36 #define ARCH_SIZE               32
37 #include "elf32-hppa.h"
38 #include "elf-hppa.h"
39
40 /* In order to gain some understanding of code in this file without
41    knowing all the intricate details of the linker, note the
42    following:
43
44    Functions named elf32_hppa_* are called by external routines, other
45    functions are only called locally.  elf32_hppa_* functions appear
46    in this file more or less in the order in which they are called
47    from external routines.  eg. elf32_hppa_check_relocs is called
48    early in the link process, elf32_hppa_finish_dynamic_sections is
49    one of the last functions.  */
50
51 /* We use two hash tables to hold information for linking PA ELF objects.
52
53    The first is the elf32_hppa_link_hash_table which is derived
54    from the standard ELF linker hash table.  We use this as a place to
55    attach other hash tables and static information.
56
57    The second is the stub hash table which is derived from the
58    base BFD hash table.  The stub hash table holds the information
59    necessary to build the linker stubs during a link.
60
61    There are a number of different stubs generated by the linker.
62
63    Long branch stub:
64    :            ldil LR'X,%r1
65    :            be,n RR'X(%sr4,%r1)
66
67    PIC long branch stub:
68    :            b,l .+8,%r1
69    :            addil LR'X - ($PIC_pcrel$0 - 4),%r1
70    :            be,n RR'X - ($PIC_pcrel$0 - 8)(%sr4,%r1)
71
72    Import stub to call shared library routine from normal object file
73    (single sub-space version)
74    :            addil LR'lt_ptr+ltoff,%dp       ; get procedure entry point
75    :            ldw RR'lt_ptr+ltoff(%r1),%r21
76    :            bv %r0(%r21)
77    :            ldw RR'lt_ptr+ltoff+4(%r1),%r19 ; get new dlt value.
78
79    Import stub to call shared library routine from shared library
80    (single sub-space version)
81    :            addil LR'ltoff,%r19             ; get procedure entry point
82    :            ldw RR'ltoff(%r1),%r21
83    :            bv %r0(%r21)
84    :            ldw RR'ltoff+4(%r1),%r19        ; get new dlt value.
85
86    Import stub to call shared library routine from normal object file
87    (multiple sub-space support)
88    :            addil LR'lt_ptr+ltoff,%dp       ; get procedure entry point
89    :            ldw RR'lt_ptr+ltoff(%r1),%r21
90    :            ldw RR'lt_ptr+ltoff+4(%r1),%r19 ; get new dlt value.
91    :            ldsid (%r21),%r1
92    :            mtsp %r1,%sr0
93    :            be 0(%sr0,%r21)                 ; branch to target
94    :            stw %rp,-24(%sp)                ; save rp
95
96    Import stub to call shared library routine from shared library
97    (multiple sub-space support)
98    :            addil LR'ltoff,%r19             ; get procedure entry point
99    :            ldw RR'ltoff(%r1),%r21
100    :            ldw RR'ltoff+4(%r1),%r19        ; get new dlt value.
101    :            ldsid (%r21),%r1
102    :            mtsp %r1,%sr0
103    :            be 0(%sr0,%r21)                 ; branch to target
104    :            stw %rp,-24(%sp)                ; save rp
105
106    Export stub to return from shared lib routine (multiple sub-space support)
107    One of these is created for each exported procedure in a shared
108    library (and stored in the shared lib).  Shared lib routines are
109    called via the first instruction in the export stub so that we can
110    do an inter-space return.  Not required for single sub-space.
111    :            bl,n X,%rp                      ; trap the return
112    :            nop
113    :            ldw -24(%sp),%rp                ; restore the original rp
114    :            ldsid (%rp),%r1
115    :            mtsp %r1,%sr0
116    :            be,n 0(%sr0,%rp)                ; inter-space return.  */
117
118
119 /* Variable names follow a coding style.
120    Please follow this (Apps Hungarian) style:
121
122    Structure/Variable                   Prefix
123    elf_link_hash_table                  "etab"
124    elf_link_hash_entry                  "eh"
125
126    elf32_hppa_link_hash_table           "htab"
127    elf32_hppa_link_hash_entry           "hh"
128
129    bfd_hash_table                       "btab"
130    bfd_hash_entry                       "bh"
131
132    bfd_hash_table containing stubs      "bstab"
133    elf32_hppa_stub_hash_entry           "hsh"
134
135    Always remember to use GNU Coding Style. */
136
137 #define PLT_ENTRY_SIZE 8
138 #define GOT_ENTRY_SIZE 4
139 #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
140
141 static const bfd_byte plt_stub[] =
142 {
143   0x0e, 0x80, 0x10, 0x96,  /* 1: ldw    0(%r20),%r22            */
144   0xea, 0xc0, 0xc0, 0x00,  /*    bv     %r0(%r22)               */
145   0x0e, 0x88, 0x10, 0x95,  /*    ldw    4(%r20),%r21            */
146 #define PLT_STUB_ENTRY (3*4)
147   0xea, 0x9f, 0x1f, 0xdd,  /*    b,l    1b,%r20                 */
148   0xd6, 0x80, 0x1c, 0x1e,  /*    depi   0,31,2,%r20             */
149   0x00, 0xc0, 0xff, 0xee,  /* 9: .word  fixup_func              */
150   0xde, 0xad, 0xbe, 0xef   /*    .word  fixup_ltp               */
151 };
152
153 /* Section name for stubs is the associated section name plus this
154    string.  */
155 #define STUB_SUFFIX ".stub"
156
157 /* We don't need to copy certain PC- or GP-relative dynamic relocs
158    into a shared object's dynamic section.  All the relocs of the
159    limited class we are interested in, are absolute.  */
160 #ifndef RELATIVE_DYNRELOCS
161 #define RELATIVE_DYNRELOCS 0
162 #define IS_ABSOLUTE_RELOC(r_type) 1
163 #define pc_dynrelocs(hh) 0
164 #endif
165
166 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
167    copying dynamic variables from a shared lib into an app's dynbss
168    section, and instead use a dynamic relocation to point into the
169    shared lib.  */
170 #define ELIMINATE_COPY_RELOCS 1
171
172 enum elf32_hppa_stub_type
173 {
174   hppa_stub_long_branch,
175   hppa_stub_long_branch_shared,
176   hppa_stub_import,
177   hppa_stub_import_shared,
178   hppa_stub_export,
179   hppa_stub_none
180 };
181
182 struct elf32_hppa_stub_hash_entry
183 {
184   /* Base hash table entry structure.  */
185   struct bfd_hash_entry bh_root;
186
187   /* The stub section.  */
188   asection *stub_sec;
189
190   /* Offset within stub_sec of the beginning of this stub.  */
191   bfd_vma stub_offset;
192
193   /* Given the symbol's value and its section we can determine its final
194      value when building the stubs (so the stub knows where to jump.  */
195   bfd_vma target_value;
196   asection *target_section;
197
198   enum elf32_hppa_stub_type stub_type;
199
200   /* The symbol table entry, if any, that this was derived from.  */
201   struct elf32_hppa_link_hash_entry *hh;
202
203   /* Where this stub is being called from, or, in the case of combined
204      stub sections, the first input section in the group.  */
205   asection *id_sec;
206 };
207
208 enum _tls_type
209   {
210     GOT_UNKNOWN = 0,
211     GOT_NORMAL = 1,
212     GOT_TLS_GD = 2,
213     GOT_TLS_LDM = 4,
214     GOT_TLS_IE = 8
215   };
216
217 struct elf32_hppa_link_hash_entry
218 {
219   struct elf_link_hash_entry eh;
220
221   /* A pointer to the most recently used stub hash entry against this
222      symbol.  */
223   struct elf32_hppa_stub_hash_entry *hsh_cache;
224
225   /* Used to count relocations for delayed sizing of relocation
226      sections.  */
227   struct elf_dyn_relocs *dyn_relocs;
228
229   ENUM_BITFIELD (_tls_type) tls_type : 8;
230
231   /* Set if this symbol is used by a plabel reloc.  */
232   unsigned int plabel:1;
233 };
234
235 struct elf32_hppa_link_hash_table
236 {
237   /* The main hash table.  */
238   struct elf_link_hash_table etab;
239
240   /* The stub hash table.  */
241   struct bfd_hash_table bstab;
242
243   /* Linker stub bfd.  */
244   bfd *stub_bfd;
245
246   /* Linker call-backs.  */
247   asection * (*add_stub_section) (const char *, asection *);
248   void (*layout_sections_again) (void);
249
250   /* Array to keep track of which stub sections have been created, and
251      information on stub grouping.  */
252   struct map_stub
253   {
254     /* This is the section to which stubs in the group will be
255        attached.  */
256     asection *link_sec;
257     /* The stub section.  */
258     asection *stub_sec;
259   } *stub_group;
260
261   /* Assorted information used by elf32_hppa_size_stubs.  */
262   unsigned int bfd_count;
263   unsigned int top_index;
264   asection **input_list;
265   Elf_Internal_Sym **all_local_syms;
266
267   /* Used during a final link to store the base of the text and data
268      segments so that we can perform SEGREL relocations.  */
269   bfd_vma text_segment_base;
270   bfd_vma data_segment_base;
271
272   /* Whether we support multiple sub-spaces for shared libs.  */
273   unsigned int multi_subspace:1;
274
275   /* Flags set when various size branches are detected.  Used to
276      select suitable defaults for the stub group size.  */
277   unsigned int has_12bit_branch:1;
278   unsigned int has_17bit_branch:1;
279   unsigned int has_22bit_branch:1;
280
281   /* Set if we need a .plt stub to support lazy dynamic linking.  */
282   unsigned int need_plt_stub:1;
283
284   /* Small local sym cache.  */
285   struct sym_cache sym_cache;
286
287   /* Data for LDM relocations.  */
288   union
289   {
290     bfd_signed_vma refcount;
291     bfd_vma offset;
292   } tls_ldm_got;
293 };
294
295 /* Various hash macros and functions.  */
296 #define hppa_link_hash_table(p) \
297   (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
298   == HPPA32_ELF_DATA ? ((struct elf32_hppa_link_hash_table *) ((p)->hash)) : NULL)
299
300 #define hppa_elf_hash_entry(ent) \
301   ((struct elf32_hppa_link_hash_entry *)(ent))
302
303 #define hppa_stub_hash_entry(ent) \
304   ((struct elf32_hppa_stub_hash_entry *)(ent))
305
306 #define hppa_stub_hash_lookup(table, string, create, copy) \
307   ((struct elf32_hppa_stub_hash_entry *) \
308    bfd_hash_lookup ((table), (string), (create), (copy)))
309
310 #define hppa_elf_local_got_tls_type(abfd) \
311   ((char *)(elf_local_got_offsets (abfd) + (elf_tdata (abfd)->symtab_hdr.sh_info * 2)))
312
313 #define hh_name(hh) \
314   (hh ? hh->eh.root.root.string : "<undef>")
315
316 #define eh_name(eh) \
317   (eh ? eh->root.root.string : "<undef>")
318
319 /* Assorted hash table functions.  */
320
321 /* Initialize an entry in the stub hash table.  */
322
323 static struct bfd_hash_entry *
324 stub_hash_newfunc (struct bfd_hash_entry *entry,
325                    struct bfd_hash_table *table,
326                    const char *string)
327 {
328   /* Allocate the structure if it has not already been allocated by a
329      subclass.  */
330   if (entry == NULL)
331     {
332       entry = bfd_hash_allocate (table,
333                                  sizeof (struct elf32_hppa_stub_hash_entry));
334       if (entry == NULL)
335         return entry;
336     }
337
338   /* Call the allocation method of the superclass.  */
339   entry = bfd_hash_newfunc (entry, table, string);
340   if (entry != NULL)
341     {
342       struct elf32_hppa_stub_hash_entry *hsh;
343
344       /* Initialize the local fields.  */
345       hsh = hppa_stub_hash_entry (entry);
346       hsh->stub_sec = NULL;
347       hsh->stub_offset = 0;
348       hsh->target_value = 0;
349       hsh->target_section = NULL;
350       hsh->stub_type = hppa_stub_long_branch;
351       hsh->hh = NULL;
352       hsh->id_sec = NULL;
353     }
354
355   return entry;
356 }
357
358 /* Initialize an entry in the link hash table.  */
359
360 static struct bfd_hash_entry *
361 hppa_link_hash_newfunc (struct bfd_hash_entry *entry,
362                         struct bfd_hash_table *table,
363                         const char *string)
364 {
365   /* Allocate the structure if it has not already been allocated by a
366      subclass.  */
367   if (entry == NULL)
368     {
369       entry = bfd_hash_allocate (table,
370                                  sizeof (struct elf32_hppa_link_hash_entry));
371       if (entry == NULL)
372         return entry;
373     }
374
375   /* Call the allocation method of the superclass.  */
376   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
377   if (entry != NULL)
378     {
379       struct elf32_hppa_link_hash_entry *hh;
380
381       /* Initialize the local fields.  */
382       hh = hppa_elf_hash_entry (entry);
383       hh->hsh_cache = NULL;
384       hh->dyn_relocs = NULL;
385       hh->plabel = 0;
386       hh->tls_type = GOT_UNKNOWN;
387     }
388
389   return entry;
390 }
391
392 /* Free the derived linker hash table.  */
393
394 static void
395 elf32_hppa_link_hash_table_free (bfd *obfd)
396 {
397   struct elf32_hppa_link_hash_table *htab
398     = (struct elf32_hppa_link_hash_table *) obfd->link.hash;
399
400   bfd_hash_table_free (&htab->bstab);
401   _bfd_elf_link_hash_table_free (obfd);
402 }
403
404 /* Create the derived linker hash table.  The PA ELF port uses the derived
405    hash table to keep information specific to the PA ELF linker (without
406    using static variables).  */
407
408 static struct bfd_link_hash_table *
409 elf32_hppa_link_hash_table_create (bfd *abfd)
410 {
411   struct elf32_hppa_link_hash_table *htab;
412   bfd_size_type amt = sizeof (*htab);
413
414   htab = bfd_zmalloc (amt);
415   if (htab == NULL)
416     return NULL;
417
418   if (!_bfd_elf_link_hash_table_init (&htab->etab, abfd, hppa_link_hash_newfunc,
419                                       sizeof (struct elf32_hppa_link_hash_entry),
420                                       HPPA32_ELF_DATA))
421     {
422       free (htab);
423       return NULL;
424     }
425
426   /* Init the stub hash table too.  */
427   if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc,
428                             sizeof (struct elf32_hppa_stub_hash_entry)))
429     {
430       _bfd_elf_link_hash_table_free (abfd);
431       return NULL;
432     }
433   htab->etab.root.hash_table_free = elf32_hppa_link_hash_table_free;
434
435   htab->text_segment_base = (bfd_vma) -1;
436   htab->data_segment_base = (bfd_vma) -1;
437   return &htab->etab.root;
438 }
439
440 /* Initialize the linker stubs BFD so that we can use it for linker
441    created dynamic sections.  */
442
443 void
444 elf32_hppa_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
445 {
446   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
447
448   elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS32;
449   htab->etab.dynobj = abfd;
450 }
451
452 /* Build a name for an entry in the stub hash table.  */
453
454 static char *
455 hppa_stub_name (const asection *input_section,
456                 const asection *sym_sec,
457                 const struct elf32_hppa_link_hash_entry *hh,
458                 const Elf_Internal_Rela *rela)
459 {
460   char *stub_name;
461   bfd_size_type len;
462
463   if (hh)
464     {
465       len = 8 + 1 + strlen (hh_name (hh)) + 1 + 8 + 1;
466       stub_name = bfd_malloc (len);
467       if (stub_name != NULL)
468         sprintf (stub_name, "%08x_%s+%x",
469                  input_section->id & 0xffffffff,
470                  hh_name (hh),
471                  (int) rela->r_addend & 0xffffffff);
472     }
473   else
474     {
475       len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
476       stub_name = bfd_malloc (len);
477       if (stub_name != NULL)
478         sprintf (stub_name, "%08x_%x:%x+%x",
479                  input_section->id & 0xffffffff,
480                  sym_sec->id & 0xffffffff,
481                  (int) ELF32_R_SYM (rela->r_info) & 0xffffffff,
482                  (int) rela->r_addend & 0xffffffff);
483     }
484   return stub_name;
485 }
486
487 /* Look up an entry in the stub hash.  Stub entries are cached because
488    creating the stub name takes a bit of time.  */
489
490 static struct elf32_hppa_stub_hash_entry *
491 hppa_get_stub_entry (const asection *input_section,
492                      const asection *sym_sec,
493                      struct elf32_hppa_link_hash_entry *hh,
494                      const Elf_Internal_Rela *rela,
495                      struct elf32_hppa_link_hash_table *htab)
496 {
497   struct elf32_hppa_stub_hash_entry *hsh_entry;
498   const asection *id_sec;
499
500   /* If this input section is part of a group of sections sharing one
501      stub section, then use the id of the first section in the group.
502      Stub names need to include a section id, as there may well be
503      more than one stub used to reach say, printf, and we need to
504      distinguish between them.  */
505   id_sec = htab->stub_group[input_section->id].link_sec;
506
507   if (hh != NULL && hh->hsh_cache != NULL
508       && hh->hsh_cache->hh == hh
509       && hh->hsh_cache->id_sec == id_sec)
510     {
511       hsh_entry = hh->hsh_cache;
512     }
513   else
514     {
515       char *stub_name;
516
517       stub_name = hppa_stub_name (id_sec, sym_sec, hh, rela);
518       if (stub_name == NULL)
519         return NULL;
520
521       hsh_entry = hppa_stub_hash_lookup (&htab->bstab,
522                                           stub_name, FALSE, FALSE);
523       if (hh != NULL)
524         hh->hsh_cache = hsh_entry;
525
526       free (stub_name);
527     }
528
529   return hsh_entry;
530 }
531
532 /* Add a new stub entry to the stub hash.  Not all fields of the new
533    stub entry are initialised.  */
534
535 static struct elf32_hppa_stub_hash_entry *
536 hppa_add_stub (const char *stub_name,
537                asection *section,
538                struct elf32_hppa_link_hash_table *htab)
539 {
540   asection *link_sec;
541   asection *stub_sec;
542   struct elf32_hppa_stub_hash_entry *hsh;
543
544   link_sec = htab->stub_group[section->id].link_sec;
545   stub_sec = htab->stub_group[section->id].stub_sec;
546   if (stub_sec == NULL)
547     {
548       stub_sec = htab->stub_group[link_sec->id].stub_sec;
549       if (stub_sec == NULL)
550         {
551           size_t namelen;
552           bfd_size_type len;
553           char *s_name;
554
555           namelen = strlen (link_sec->name);
556           len = namelen + sizeof (STUB_SUFFIX);
557           s_name = bfd_alloc (htab->stub_bfd, len);
558           if (s_name == NULL)
559             return NULL;
560
561           memcpy (s_name, link_sec->name, namelen);
562           memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
563           stub_sec = (*htab->add_stub_section) (s_name, link_sec);
564           if (stub_sec == NULL)
565             return NULL;
566           htab->stub_group[link_sec->id].stub_sec = stub_sec;
567         }
568       htab->stub_group[section->id].stub_sec = stub_sec;
569     }
570
571   /* Enter this entry into the linker stub hash table.  */
572   hsh = hppa_stub_hash_lookup (&htab->bstab, stub_name,
573                                       TRUE, FALSE);
574   if (hsh == NULL)
575     {
576       /* xgettext:c-format */
577       _bfd_error_handler (_("%pB: cannot create stub entry %s"),
578                           section->owner, stub_name);
579       return NULL;
580     }
581
582   hsh->stub_sec = stub_sec;
583   hsh->stub_offset = 0;
584   hsh->id_sec = link_sec;
585   return hsh;
586 }
587
588 /* Determine the type of stub needed, if any, for a call.  */
589
590 static enum elf32_hppa_stub_type
591 hppa_type_of_stub (asection *input_sec,
592                    const Elf_Internal_Rela *rela,
593                    struct elf32_hppa_link_hash_entry *hh,
594                    bfd_vma destination,
595                    struct bfd_link_info *info)
596 {
597   bfd_vma location;
598   bfd_vma branch_offset;
599   bfd_vma max_branch_offset;
600   unsigned int r_type;
601
602   if (hh != NULL
603       && hh->eh.plt.offset != (bfd_vma) -1
604       && hh->eh.dynindx != -1
605       && !hh->plabel
606       && (bfd_link_pic (info)
607           || !hh->eh.def_regular
608           || hh->eh.root.type == bfd_link_hash_defweak))
609     {
610       /* We need an import stub.  Decide between hppa_stub_import
611          and hppa_stub_import_shared later.  */
612       return hppa_stub_import;
613     }
614
615   if (destination == (bfd_vma) -1)
616     return hppa_stub_none;
617
618   /* Determine where the call point is.  */
619   location = (input_sec->output_offset
620               + input_sec->output_section->vma
621               + rela->r_offset);
622
623   branch_offset = destination - location - 8;
624   r_type = ELF32_R_TYPE (rela->r_info);
625
626   /* Determine if a long branch stub is needed.  parisc branch offsets
627      are relative to the second instruction past the branch, ie. +8
628      bytes on from the branch instruction location.  The offset is
629      signed and counts in units of 4 bytes.  */
630   if (r_type == (unsigned int) R_PARISC_PCREL17F)
631     max_branch_offset = (1 << (17 - 1)) << 2;
632
633   else if (r_type == (unsigned int) R_PARISC_PCREL12F)
634     max_branch_offset = (1 << (12 - 1)) << 2;
635
636   else /* R_PARISC_PCREL22F.  */
637     max_branch_offset = (1 << (22 - 1)) << 2;
638
639   if (branch_offset + max_branch_offset >= 2*max_branch_offset)
640     return hppa_stub_long_branch;
641
642   return hppa_stub_none;
643 }
644
645 /* Build one linker stub as defined by the stub hash table entry GEN_ENTRY.
646    IN_ARG contains the link info pointer.  */
647
648 #define LDIL_R1         0x20200000      /* ldil  LR'XXX,%r1             */
649 #define BE_SR4_R1       0xe0202002      /* be,n  RR'XXX(%sr4,%r1)       */
650
651 #define BL_R1           0xe8200000      /* b,l   .+8,%r1                */
652 #define ADDIL_R1        0x28200000      /* addil LR'XXX,%r1,%r1         */
653 #define DEPI_R1         0xd4201c1e      /* depi  0,31,2,%r1             */
654
655 #define ADDIL_DP        0x2b600000      /* addil LR'XXX,%dp,%r1         */
656 #define LDW_R1_R21      0x48350000      /* ldw   RR'XXX(%sr0,%r1),%r21  */
657 #define BV_R0_R21       0xeaa0c000      /* bv    %r0(%r21)              */
658 #define LDW_R1_R19      0x48330000      /* ldw   RR'XXX(%sr0,%r1),%r19  */
659
660 #define ADDIL_R19       0x2a600000      /* addil LR'XXX,%r19,%r1        */
661 #define LDW_R1_DP       0x483b0000      /* ldw   RR'XXX(%sr0,%r1),%dp   */
662
663 #define LDSID_R21_R1    0x02a010a1      /* ldsid (%sr0,%r21),%r1        */
664 #define MTSP_R1         0x00011820      /* mtsp  %r1,%sr0               */
665 #define BE_SR0_R21      0xe2a00000      /* be    0(%sr0,%r21)           */
666 #define STW_RP          0x6bc23fd1      /* stw   %rp,-24(%sr0,%sp)      */
667
668 #define BL22_RP         0xe800a002      /* b,l,n XXX,%rp                */
669 #define BL_RP           0xe8400002      /* b,l,n XXX,%rp                */
670 #define NOP             0x08000240      /* nop                          */
671 #define LDW_RP          0x4bc23fd1      /* ldw   -24(%sr0,%sp),%rp      */
672 #define LDSID_RP_R1     0x004010a1      /* ldsid (%sr0,%rp),%r1         */
673 #define BE_SR0_RP       0xe0400002      /* be,n  0(%sr0,%rp)            */
674
675 #ifndef R19_STUBS
676 #define R19_STUBS 1
677 #endif
678
679 #if R19_STUBS
680 #define LDW_R1_DLT      LDW_R1_R19
681 #else
682 #define LDW_R1_DLT      LDW_R1_DP
683 #endif
684
685 static bfd_boolean
686 hppa_build_one_stub (struct bfd_hash_entry *bh, void *in_arg)
687 {
688   struct elf32_hppa_stub_hash_entry *hsh;
689   struct bfd_link_info *info;
690   struct elf32_hppa_link_hash_table *htab;
691   asection *stub_sec;
692   bfd *stub_bfd;
693   bfd_byte *loc;
694   bfd_vma sym_value;
695   bfd_vma insn;
696   bfd_vma off;
697   int val;
698   int size;
699
700   /* Massage our args to the form they really have.  */
701   hsh = hppa_stub_hash_entry (bh);
702   info = (struct bfd_link_info *)in_arg;
703
704   htab = hppa_link_hash_table (info);
705   if (htab == NULL)
706     return FALSE;
707
708   stub_sec = hsh->stub_sec;
709
710   /* Make a note of the offset within the stubs for this entry.  */
711   hsh->stub_offset = stub_sec->size;
712   loc = stub_sec->contents + hsh->stub_offset;
713
714   stub_bfd = stub_sec->owner;
715
716   switch (hsh->stub_type)
717     {
718     case hppa_stub_long_branch:
719       /* Create the long branch.  A long branch is formed with "ldil"
720          loading the upper bits of the target address into a register,
721          then branching with "be" which adds in the lower bits.
722          The "be" has its delay slot nullified.  */
723       sym_value = (hsh->target_value
724                    + hsh->target_section->output_offset
725                    + hsh->target_section->output_section->vma);
726
727       val = hppa_field_adjust (sym_value, 0, e_lrsel);
728       insn = hppa_rebuild_insn ((int) LDIL_R1, val, 21);
729       bfd_put_32 (stub_bfd, insn, loc);
730
731       val = hppa_field_adjust (sym_value, 0, e_rrsel) >> 2;
732       insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17);
733       bfd_put_32 (stub_bfd, insn, loc + 4);
734
735       size = 8;
736       break;
737
738     case hppa_stub_long_branch_shared:
739       /* Branches are relative.  This is where we are going to.  */
740       sym_value = (hsh->target_value
741                    + hsh->target_section->output_offset
742                    + hsh->target_section->output_section->vma);
743
744       /* And this is where we are coming from, more or less.  */
745       sym_value -= (hsh->stub_offset
746                     + stub_sec->output_offset
747                     + stub_sec->output_section->vma);
748
749       bfd_put_32 (stub_bfd, (bfd_vma) BL_R1, loc);
750       val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_lrsel);
751       insn = hppa_rebuild_insn ((int) ADDIL_R1, val, 21);
752       bfd_put_32 (stub_bfd, insn, loc + 4);
753
754       val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_rrsel) >> 2;
755       insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17);
756       bfd_put_32 (stub_bfd, insn, loc + 8);
757       size = 12;
758       break;
759
760     case hppa_stub_import:
761     case hppa_stub_import_shared:
762       off = hsh->hh->eh.plt.offset;
763       if (off >= (bfd_vma) -2)
764         abort ();
765
766       off &= ~ (bfd_vma) 1;
767       sym_value = (off
768                    + htab->etab.splt->output_offset
769                    + htab->etab.splt->output_section->vma
770                    - elf_gp (htab->etab.splt->output_section->owner));
771
772       insn = ADDIL_DP;
773 #if R19_STUBS
774       if (hsh->stub_type == hppa_stub_import_shared)
775         insn = ADDIL_R19;
776 #endif
777       val = hppa_field_adjust (sym_value, 0, e_lrsel),
778       insn = hppa_rebuild_insn ((int) insn, val, 21);
779       bfd_put_32 (stub_bfd, insn, loc);
780
781       /* It is critical to use lrsel/rrsel here because we are using
782          two different offsets (+0 and +4) from sym_value.  If we use
783          lsel/rsel then with unfortunate sym_values we will round
784          sym_value+4 up to the next 2k block leading to a mis-match
785          between the lsel and rsel value.  */
786       val = hppa_field_adjust (sym_value, 0, e_rrsel);
787       insn = hppa_rebuild_insn ((int) LDW_R1_R21, val, 14);
788       bfd_put_32 (stub_bfd, insn, loc + 4);
789
790       if (htab->multi_subspace)
791         {
792           val = hppa_field_adjust (sym_value, (bfd_signed_vma) 4, e_rrsel);
793           insn = hppa_rebuild_insn ((int) LDW_R1_DLT, val, 14);
794           bfd_put_32 (stub_bfd, insn, loc + 8);
795
796           bfd_put_32 (stub_bfd, (bfd_vma) LDSID_R21_R1, loc + 12);
797           bfd_put_32 (stub_bfd, (bfd_vma) MTSP_R1,      loc + 16);
798           bfd_put_32 (stub_bfd, (bfd_vma) BE_SR0_R21,   loc + 20);
799           bfd_put_32 (stub_bfd, (bfd_vma) STW_RP,       loc + 24);
800
801           size = 28;
802         }
803       else
804         {
805           bfd_put_32 (stub_bfd, (bfd_vma) BV_R0_R21, loc + 8);
806           val = hppa_field_adjust (sym_value, (bfd_signed_vma) 4, e_rrsel);
807           insn = hppa_rebuild_insn ((int) LDW_R1_DLT, val, 14);
808           bfd_put_32 (stub_bfd, insn, loc + 12);
809
810           size = 16;
811         }
812
813       break;
814
815     case hppa_stub_export:
816       /* Branches are relative.  This is where we are going to.  */
817       sym_value = (hsh->target_value
818                    + hsh->target_section->output_offset
819                    + hsh->target_section->output_section->vma);
820
821       /* And this is where we are coming from.  */
822       sym_value -= (hsh->stub_offset
823                     + stub_sec->output_offset
824                     + stub_sec->output_section->vma);
825
826       if (sym_value - 8 + (1 << (17 + 1)) >= (1 << (17 + 2))
827           && (!htab->has_22bit_branch
828               || sym_value - 8 + (1 << (22 + 1)) >= (1 << (22 + 2))))
829         {
830           _bfd_error_handler
831             /* xgettext:c-format */
832             (_("%pB(%pA+%#" PRIx64 "): "
833                "cannot reach %s, recompile with -ffunction-sections"),
834              hsh->target_section->owner,
835              stub_sec,
836              (uint64_t) hsh->stub_offset,
837              hsh->bh_root.string);
838           bfd_set_error (bfd_error_bad_value);
839           return FALSE;
840         }
841
842       val = hppa_field_adjust (sym_value, (bfd_signed_vma) -8, e_fsel) >> 2;
843       if (!htab->has_22bit_branch)
844         insn = hppa_rebuild_insn ((int) BL_RP, val, 17);
845       else
846         insn = hppa_rebuild_insn ((int) BL22_RP, val, 22);
847       bfd_put_32 (stub_bfd, insn, loc);
848
849       bfd_put_32 (stub_bfd, (bfd_vma) NOP,         loc + 4);
850       bfd_put_32 (stub_bfd, (bfd_vma) LDW_RP,      loc + 8);
851       bfd_put_32 (stub_bfd, (bfd_vma) LDSID_RP_R1, loc + 12);
852       bfd_put_32 (stub_bfd, (bfd_vma) MTSP_R1,     loc + 16);
853       bfd_put_32 (stub_bfd, (bfd_vma) BE_SR0_RP,   loc + 20);
854
855       /* Point the function symbol at the stub.  */
856       hsh->hh->eh.root.u.def.section = stub_sec;
857       hsh->hh->eh.root.u.def.value = stub_sec->size;
858
859       size = 24;
860       break;
861
862     default:
863       BFD_FAIL ();
864       return FALSE;
865     }
866
867   stub_sec->size += size;
868   return TRUE;
869 }
870
871 #undef LDIL_R1
872 #undef BE_SR4_R1
873 #undef BL_R1
874 #undef ADDIL_R1
875 #undef DEPI_R1
876 #undef LDW_R1_R21
877 #undef LDW_R1_DLT
878 #undef LDW_R1_R19
879 #undef ADDIL_R19
880 #undef LDW_R1_DP
881 #undef LDSID_R21_R1
882 #undef MTSP_R1
883 #undef BE_SR0_R21
884 #undef STW_RP
885 #undef BV_R0_R21
886 #undef BL_RP
887 #undef NOP
888 #undef LDW_RP
889 #undef LDSID_RP_R1
890 #undef BE_SR0_RP
891
892 /* As above, but don't actually build the stub.  Just bump offset so
893    we know stub section sizes.  */
894
895 static bfd_boolean
896 hppa_size_one_stub (struct bfd_hash_entry *bh, void *in_arg)
897 {
898   struct elf32_hppa_stub_hash_entry *hsh;
899   struct elf32_hppa_link_hash_table *htab;
900   int size;
901
902   /* Massage our args to the form they really have.  */
903   hsh = hppa_stub_hash_entry (bh);
904   htab = in_arg;
905
906   if (hsh->stub_type == hppa_stub_long_branch)
907     size = 8;
908   else if (hsh->stub_type == hppa_stub_long_branch_shared)
909     size = 12;
910   else if (hsh->stub_type == hppa_stub_export)
911     size = 24;
912   else /* hppa_stub_import or hppa_stub_import_shared.  */
913     {
914       if (htab->multi_subspace)
915         size = 28;
916       else
917         size = 16;
918     }
919
920   hsh->stub_sec->size += size;
921   return TRUE;
922 }
923
924 /* Return nonzero if ABFD represents an HPPA ELF32 file.
925    Additionally we set the default architecture and machine.  */
926
927 static bfd_boolean
928 elf32_hppa_object_p (bfd *abfd)
929 {
930   Elf_Internal_Ehdr * i_ehdrp;
931   unsigned int flags;
932
933   i_ehdrp = elf_elfheader (abfd);
934   if (strcmp (bfd_get_target (abfd), "elf32-hppa-linux") == 0)
935     {
936       /* GCC on hppa-linux produces binaries with OSABI=GNU,
937          but the kernel produces corefiles with OSABI=SysV.  */
938       if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_GNU &&
939           i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
940         return FALSE;
941     }
942   else if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0)
943     {
944       /* GCC on hppa-netbsd produces binaries with OSABI=NetBSD,
945          but the kernel produces corefiles with OSABI=SysV.  */
946       if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NETBSD &&
947           i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
948         return FALSE;
949     }
950   else
951     {
952       if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX)
953         return FALSE;
954     }
955
956   flags = i_ehdrp->e_flags;
957   switch (flags & (EF_PARISC_ARCH | EF_PARISC_WIDE))
958     {
959     case EFA_PARISC_1_0:
960       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 10);
961     case EFA_PARISC_1_1:
962       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
963     case EFA_PARISC_2_0:
964       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
965     case EFA_PARISC_2_0 | EF_PARISC_WIDE:
966       return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
967     }
968   return TRUE;
969 }
970
971 /* Create the .plt and .got sections, and set up our hash table
972    short-cuts to various dynamic sections.  */
973
974 static bfd_boolean
975 elf32_hppa_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
976 {
977   struct elf32_hppa_link_hash_table *htab;
978   struct elf_link_hash_entry *eh;
979
980   /* Don't try to create the .plt and .got twice.  */
981   htab = hppa_link_hash_table (info);
982   if (htab == NULL)
983     return FALSE;
984   if (htab->etab.splt != NULL)
985     return TRUE;
986
987   /* Call the generic code to do most of the work.  */
988   if (! _bfd_elf_create_dynamic_sections (abfd, info))
989     return FALSE;
990
991   /* hppa-linux needs _GLOBAL_OFFSET_TABLE_ to be visible from the main
992      application, because __canonicalize_funcptr_for_compare needs it.  */
993   eh = elf_hash_table (info)->hgot;
994   eh->forced_local = 0;
995   eh->other = STV_DEFAULT;
996   return bfd_elf_link_record_dynamic_symbol (info, eh);
997 }
998
999 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
1000
1001 static void
1002 elf32_hppa_copy_indirect_symbol (struct bfd_link_info *info,
1003                                  struct elf_link_hash_entry *eh_dir,
1004                                  struct elf_link_hash_entry *eh_ind)
1005 {
1006   struct elf32_hppa_link_hash_entry *hh_dir, *hh_ind;
1007
1008   hh_dir = hppa_elf_hash_entry (eh_dir);
1009   hh_ind = hppa_elf_hash_entry (eh_ind);
1010
1011   if (hh_ind->dyn_relocs != NULL
1012       && eh_ind->root.type == bfd_link_hash_indirect)
1013     {
1014       if (hh_dir->dyn_relocs != NULL)
1015         {
1016           struct elf_dyn_relocs **hdh_pp;
1017           struct elf_dyn_relocs *hdh_p;
1018
1019           /* Add reloc counts against the indirect sym to the direct sym
1020              list.  Merge any entries against the same section.  */
1021           for (hdh_pp = &hh_ind->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
1022             {
1023               struct elf_dyn_relocs *hdh_q;
1024
1025               for (hdh_q = hh_dir->dyn_relocs;
1026                    hdh_q != NULL;
1027                    hdh_q = hdh_q->next)
1028                 if (hdh_q->sec == hdh_p->sec)
1029                   {
1030 #if RELATIVE_DYNRELOCS
1031                     hdh_q->pc_count += hdh_p->pc_count;
1032 #endif
1033                     hdh_q->count += hdh_p->count;
1034                     *hdh_pp = hdh_p->next;
1035                     break;
1036                   }
1037               if (hdh_q == NULL)
1038                 hdh_pp = &hdh_p->next;
1039             }
1040           *hdh_pp = hh_dir->dyn_relocs;
1041         }
1042
1043       hh_dir->dyn_relocs = hh_ind->dyn_relocs;
1044       hh_ind->dyn_relocs = NULL;
1045     }
1046
1047   if (eh_ind->root.type == bfd_link_hash_indirect)
1048     {
1049       hh_dir->plabel |= hh_ind->plabel;
1050       hh_dir->tls_type |= hh_ind->tls_type;
1051       hh_ind->tls_type = GOT_UNKNOWN;
1052     }
1053
1054   _bfd_elf_link_hash_copy_indirect (info, eh_dir, eh_ind);
1055 }
1056
1057 static int
1058 elf32_hppa_optimized_tls_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1059                                 int r_type, int is_local ATTRIBUTE_UNUSED)
1060 {
1061   /* For now we don't support linker optimizations.  */
1062   return r_type;
1063 }
1064
1065 /* Return a pointer to the local GOT, PLT and TLS reference counts
1066    for ABFD.  Returns NULL if the storage allocation fails.  */
1067
1068 static bfd_signed_vma *
1069 hppa32_elf_local_refcounts (bfd *abfd)
1070 {
1071   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1072   bfd_signed_vma *local_refcounts;
1073
1074   local_refcounts = elf_local_got_refcounts (abfd);
1075   if (local_refcounts == NULL)
1076     {
1077       bfd_size_type size;
1078
1079       /* Allocate space for local GOT and PLT reference
1080          counts.  Done this way to save polluting elf_obj_tdata
1081          with another target specific pointer.  */
1082       size = symtab_hdr->sh_info;
1083       size *= 2 * sizeof (bfd_signed_vma);
1084       /* Add in space to store the local GOT TLS types.  */
1085       size += symtab_hdr->sh_info;
1086       local_refcounts = bfd_zalloc (abfd, size);
1087       if (local_refcounts == NULL)
1088         return NULL;
1089       elf_local_got_refcounts (abfd) = local_refcounts;
1090       memset (hppa_elf_local_got_tls_type (abfd), GOT_UNKNOWN,
1091               symtab_hdr->sh_info);
1092     }
1093   return local_refcounts;
1094 }
1095
1096
1097 /* Look through the relocs for a section during the first phase, and
1098    calculate needed space in the global offset table, procedure linkage
1099    table, and dynamic reloc sections.  At this point we haven't
1100    necessarily read all the input files.  */
1101
1102 static bfd_boolean
1103 elf32_hppa_check_relocs (bfd *abfd,
1104                          struct bfd_link_info *info,
1105                          asection *sec,
1106                          const Elf_Internal_Rela *relocs)
1107 {
1108   Elf_Internal_Shdr *symtab_hdr;
1109   struct elf_link_hash_entry **eh_syms;
1110   const Elf_Internal_Rela *rela;
1111   const Elf_Internal_Rela *rela_end;
1112   struct elf32_hppa_link_hash_table *htab;
1113   asection *sreloc;
1114
1115   if (bfd_link_relocatable (info))
1116     return TRUE;
1117
1118   htab = hppa_link_hash_table (info);
1119   if (htab == NULL)
1120     return FALSE;
1121   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1122   eh_syms = elf_sym_hashes (abfd);
1123   sreloc = NULL;
1124
1125   rela_end = relocs + sec->reloc_count;
1126   for (rela = relocs; rela < rela_end; rela++)
1127     {
1128       enum {
1129         NEED_GOT = 1,
1130         NEED_PLT = 2,
1131         NEED_DYNREL = 4,
1132         PLT_PLABEL = 8
1133       };
1134
1135       unsigned int r_symndx, r_type;
1136       struct elf32_hppa_link_hash_entry *hh;
1137       int need_entry = 0;
1138
1139       r_symndx = ELF32_R_SYM (rela->r_info);
1140
1141       if (r_symndx < symtab_hdr->sh_info)
1142         hh = NULL;
1143       else
1144         {
1145           hh =  hppa_elf_hash_entry (eh_syms[r_symndx - symtab_hdr->sh_info]);
1146           while (hh->eh.root.type == bfd_link_hash_indirect
1147                  || hh->eh.root.type == bfd_link_hash_warning)
1148             hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
1149         }
1150
1151       r_type = ELF32_R_TYPE (rela->r_info);
1152       r_type = elf32_hppa_optimized_tls_reloc (info, r_type, hh == NULL);
1153
1154       switch (r_type)
1155         {
1156         case R_PARISC_DLTIND14F:
1157         case R_PARISC_DLTIND14R:
1158         case R_PARISC_DLTIND21L:
1159           /* This symbol requires a global offset table entry.  */
1160           need_entry = NEED_GOT;
1161           break;
1162
1163         case R_PARISC_PLABEL14R: /* "Official" procedure labels.  */
1164         case R_PARISC_PLABEL21L:
1165         case R_PARISC_PLABEL32:
1166           /* If the addend is non-zero, we break badly.  */
1167           if (rela->r_addend != 0)
1168             abort ();
1169
1170           /* If we are creating a shared library, then we need to
1171              create a PLT entry for all PLABELs, because PLABELs with
1172              local symbols may be passed via a pointer to another
1173              object.  Additionally, output a dynamic relocation
1174              pointing to the PLT entry.
1175
1176              For executables, the original 32-bit ABI allowed two
1177              different styles of PLABELs (function pointers):  For
1178              global functions, the PLABEL word points into the .plt
1179              two bytes past a (function address, gp) pair, and for
1180              local functions the PLABEL points directly at the
1181              function.  The magic +2 for the first type allows us to
1182              differentiate between the two.  As you can imagine, this
1183              is a real pain when it comes to generating code to call
1184              functions indirectly or to compare function pointers.
1185              We avoid the mess by always pointing a PLABEL into the
1186              .plt, even for local functions.  */
1187           need_entry = PLT_PLABEL | NEED_PLT;
1188           if (bfd_link_pic (info))
1189             need_entry |= NEED_DYNREL;
1190           break;
1191
1192         case R_PARISC_PCREL12F:
1193           htab->has_12bit_branch = 1;
1194           goto branch_common;
1195
1196         case R_PARISC_PCREL17C:
1197         case R_PARISC_PCREL17F:
1198           htab->has_17bit_branch = 1;
1199           goto branch_common;
1200
1201         case R_PARISC_PCREL22F:
1202           htab->has_22bit_branch = 1;
1203         branch_common:
1204           /* Function calls might need to go through the .plt, and
1205              might require long branch stubs.  */
1206           if (hh == NULL)
1207             {
1208               /* We know local syms won't need a .plt entry, and if
1209                  they need a long branch stub we can't guarantee that
1210                  we can reach the stub.  So just flag an error later
1211                  if we're doing a shared link and find we need a long
1212                  branch stub.  */
1213               continue;
1214             }
1215           else
1216             {
1217               /* Global symbols will need a .plt entry if they remain
1218                  global, and in most cases won't need a long branch
1219                  stub.  Unfortunately, we have to cater for the case
1220                  where a symbol is forced local by versioning, or due
1221                  to symbolic linking, and we lose the .plt entry.  */
1222               need_entry = NEED_PLT;
1223               if (hh->eh.type == STT_PARISC_MILLI)
1224                 need_entry = 0;
1225             }
1226           break;
1227
1228         case R_PARISC_SEGBASE:  /* Used to set segment base.  */
1229         case R_PARISC_SEGREL32: /* Relative reloc, used for unwind.  */
1230         case R_PARISC_PCREL14F: /* PC relative load/store.  */
1231         case R_PARISC_PCREL14R:
1232         case R_PARISC_PCREL17R: /* External branches.  */
1233         case R_PARISC_PCREL21L: /* As above, and for load/store too.  */
1234         case R_PARISC_PCREL32:
1235           /* We don't need to propagate the relocation if linking a
1236              shared object since these are section relative.  */
1237           continue;
1238
1239         case R_PARISC_DPREL14F: /* Used for gp rel data load/store.  */
1240         case R_PARISC_DPREL14R:
1241         case R_PARISC_DPREL21L:
1242           if (bfd_link_pic (info))
1243             {
1244               _bfd_error_handler
1245                 /* xgettext:c-format */
1246                 (_("%pB: relocation %s can not be used when making a shared object; recompile with -fPIC"),
1247                  abfd,
1248                  elf_hppa_howto_table[r_type].name);
1249               bfd_set_error (bfd_error_bad_value);
1250               return FALSE;
1251             }
1252           /* Fall through.  */
1253
1254         case R_PARISC_DIR17F: /* Used for external branches.  */
1255         case R_PARISC_DIR17R:
1256         case R_PARISC_DIR14F: /* Used for load/store from absolute locn.  */
1257         case R_PARISC_DIR14R:
1258         case R_PARISC_DIR21L: /* As above, and for ext branches too.  */
1259         case R_PARISC_DIR32: /* .word relocs.  */
1260           /* We may want to output a dynamic relocation later.  */
1261           need_entry = NEED_DYNREL;
1262           break;
1263
1264           /* This relocation describes the C++ object vtable hierarchy.
1265              Reconstruct it for later use during GC.  */
1266         case R_PARISC_GNU_VTINHERIT:
1267           if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh, rela->r_offset))
1268             return FALSE;
1269           continue;
1270
1271           /* This relocation describes which C++ vtable entries are actually
1272              used.  Record for later use during GC.  */
1273         case R_PARISC_GNU_VTENTRY:
1274           BFD_ASSERT (hh != NULL);
1275           if (hh != NULL
1276               && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rela->r_addend))
1277             return FALSE;
1278           continue;
1279
1280         case R_PARISC_TLS_GD21L:
1281         case R_PARISC_TLS_GD14R:
1282         case R_PARISC_TLS_LDM21L:
1283         case R_PARISC_TLS_LDM14R:
1284           need_entry = NEED_GOT;
1285           break;
1286
1287         case R_PARISC_TLS_IE21L:
1288         case R_PARISC_TLS_IE14R:
1289           if (bfd_link_dll (info))
1290             info->flags |= DF_STATIC_TLS;
1291           need_entry = NEED_GOT;
1292           break;
1293
1294         default:
1295           continue;
1296         }
1297
1298       /* Now carry out our orders.  */
1299       if (need_entry & NEED_GOT)
1300         {
1301           int tls_type = GOT_NORMAL;
1302
1303           switch (r_type)
1304             {
1305             default:
1306               break;
1307             case R_PARISC_TLS_GD21L:
1308             case R_PARISC_TLS_GD14R:
1309               tls_type = GOT_TLS_GD;
1310               break;
1311             case R_PARISC_TLS_LDM21L:
1312             case R_PARISC_TLS_LDM14R:
1313               tls_type = GOT_TLS_LDM;
1314               break;
1315             case R_PARISC_TLS_IE21L:
1316             case R_PARISC_TLS_IE14R:
1317               tls_type = GOT_TLS_IE;
1318               break;
1319             }
1320
1321           /* Allocate space for a GOT entry, as well as a dynamic
1322              relocation for this entry.  */
1323           if (htab->etab.sgot == NULL)
1324             {
1325               if (!elf32_hppa_create_dynamic_sections (htab->etab.dynobj, info))
1326                 return FALSE;
1327             }
1328
1329           if (hh != NULL)
1330             {
1331               if (tls_type == GOT_TLS_LDM)
1332                 htab->tls_ldm_got.refcount += 1;
1333               else
1334                 hh->eh.got.refcount += 1;
1335               hh->tls_type |= tls_type;
1336             }
1337           else
1338             {
1339               bfd_signed_vma *local_got_refcounts;
1340
1341               /* This is a global offset table entry for a local symbol.  */
1342               local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1343               if (local_got_refcounts == NULL)
1344                 return FALSE;
1345               if (tls_type == GOT_TLS_LDM)
1346                 htab->tls_ldm_got.refcount += 1;
1347               else
1348                 local_got_refcounts[r_symndx] += 1;
1349
1350               hppa_elf_local_got_tls_type (abfd) [r_symndx] |= tls_type;
1351             }
1352         }
1353
1354       if (need_entry & NEED_PLT)
1355         {
1356           /* If we are creating a shared library, and this is a reloc
1357              against a weak symbol or a global symbol in a dynamic
1358              object, then we will be creating an import stub and a
1359              .plt entry for the symbol.  Similarly, on a normal link
1360              to symbols defined in a dynamic object we'll need the
1361              import stub and a .plt entry.  We don't know yet whether
1362              the symbol is defined or not, so make an entry anyway and
1363              clean up later in adjust_dynamic_symbol.  */
1364           if ((sec->flags & SEC_ALLOC) != 0)
1365             {
1366               if (hh != NULL)
1367                 {
1368                   hh->eh.needs_plt = 1;
1369                   hh->eh.plt.refcount += 1;
1370
1371                   /* If this .plt entry is for a plabel, mark it so
1372                      that adjust_dynamic_symbol will keep the entry
1373                      even if it appears to be local.  */
1374                   if (need_entry & PLT_PLABEL)
1375                     hh->plabel = 1;
1376                 }
1377               else if (need_entry & PLT_PLABEL)
1378                 {
1379                   bfd_signed_vma *local_got_refcounts;
1380                   bfd_signed_vma *local_plt_refcounts;
1381
1382                   local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1383                   if (local_got_refcounts == NULL)
1384                     return FALSE;
1385                   local_plt_refcounts = (local_got_refcounts
1386                                          + symtab_hdr->sh_info);
1387                   local_plt_refcounts[r_symndx] += 1;
1388                 }
1389             }
1390         }
1391
1392       if ((need_entry & NEED_DYNREL) != 0
1393           && (sec->flags & SEC_ALLOC) != 0)
1394         {
1395           /* Flag this symbol as having a non-got, non-plt reference
1396              so that we generate copy relocs if it turns out to be
1397              dynamic.  */
1398           if (hh != NULL)
1399             hh->eh.non_got_ref = 1;
1400
1401           /* If we are creating a shared library then we need to copy
1402              the reloc into the shared library.  However, if we are
1403              linking with -Bsymbolic, we need only copy absolute
1404              relocs or relocs against symbols that are not defined in
1405              an object we are including in the link.  PC- or DP- or
1406              DLT-relative relocs against any local sym or global sym
1407              with DEF_REGULAR set, can be discarded.  At this point we
1408              have not seen all the input files, so it is possible that
1409              DEF_REGULAR is not set now but will be set later (it is
1410              never cleared).  We account for that possibility below by
1411              storing information in the dyn_relocs field of the
1412              hash table entry.
1413
1414              A similar situation to the -Bsymbolic case occurs when
1415              creating shared libraries and symbol visibility changes
1416              render the symbol local.
1417
1418              As it turns out, all the relocs we will be creating here
1419              are absolute, so we cannot remove them on -Bsymbolic
1420              links or visibility changes anyway.  A STUB_REL reloc
1421              is absolute too, as in that case it is the reloc in the
1422              stub we will be creating, rather than copying the PCREL
1423              reloc in the branch.
1424
1425              If on the other hand, we are creating an executable, we
1426              may need to keep relocations for symbols satisfied by a
1427              dynamic library if we manage to avoid copy relocs for the
1428              symbol.  */
1429           if ((bfd_link_pic (info)
1430                && (IS_ABSOLUTE_RELOC (r_type)
1431                    || (hh != NULL
1432                        && (!SYMBOLIC_BIND (info, &hh->eh)
1433                            || hh->eh.root.type == bfd_link_hash_defweak
1434                            || !hh->eh.def_regular))))
1435               || (ELIMINATE_COPY_RELOCS
1436                   && !bfd_link_pic (info)
1437                   && hh != NULL
1438                   && (hh->eh.root.type == bfd_link_hash_defweak
1439                       || !hh->eh.def_regular)))
1440             {
1441               struct elf_dyn_relocs *hdh_p;
1442               struct elf_dyn_relocs **hdh_head;
1443
1444               /* Create a reloc section in dynobj and make room for
1445                  this reloc.  */
1446               if (sreloc == NULL)
1447                 {
1448                   sreloc = _bfd_elf_make_dynamic_reloc_section
1449                     (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
1450
1451                   if (sreloc == NULL)
1452                     {
1453                       bfd_set_error (bfd_error_bad_value);
1454                       return FALSE;
1455                     }
1456                 }
1457
1458               /* If this is a global symbol, we count the number of
1459                  relocations we need for this symbol.  */
1460               if (hh != NULL)
1461                 {
1462                   hdh_head = &hh->dyn_relocs;
1463                 }
1464               else
1465                 {
1466                   /* Track dynamic relocs needed for local syms too.
1467                      We really need local syms available to do this
1468                      easily.  Oh well.  */
1469                   asection *sr;
1470                   void *vpp;
1471                   Elf_Internal_Sym *isym;
1472
1473                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1474                                                 abfd, r_symndx);
1475                   if (isym == NULL)
1476                     return FALSE;
1477
1478                   sr = bfd_section_from_elf_index (abfd, isym->st_shndx);
1479                   if (sr == NULL)
1480                     sr = sec;
1481
1482                   vpp = &elf_section_data (sr)->local_dynrel;
1483                   hdh_head = (struct elf_dyn_relocs **) vpp;
1484                 }
1485
1486               hdh_p = *hdh_head;
1487               if (hdh_p == NULL || hdh_p->sec != sec)
1488                 {
1489                   hdh_p = bfd_alloc (htab->etab.dynobj, sizeof *hdh_p);
1490                   if (hdh_p == NULL)
1491                     return FALSE;
1492                   hdh_p->next = *hdh_head;
1493                   *hdh_head = hdh_p;
1494                   hdh_p->sec = sec;
1495                   hdh_p->count = 0;
1496 #if RELATIVE_DYNRELOCS
1497                   hdh_p->pc_count = 0;
1498 #endif
1499                 }
1500
1501               hdh_p->count += 1;
1502 #if RELATIVE_DYNRELOCS
1503               if (!IS_ABSOLUTE_RELOC (rtype))
1504                 hdh_p->pc_count += 1;
1505 #endif
1506             }
1507         }
1508     }
1509
1510   return TRUE;
1511 }
1512
1513 /* Return the section that should be marked against garbage collection
1514    for a given relocation.  */
1515
1516 static asection *
1517 elf32_hppa_gc_mark_hook (asection *sec,
1518                          struct bfd_link_info *info,
1519                          Elf_Internal_Rela *rela,
1520                          struct elf_link_hash_entry *hh,
1521                          Elf_Internal_Sym *sym)
1522 {
1523   if (hh != NULL)
1524     switch ((unsigned int) ELF32_R_TYPE (rela->r_info))
1525       {
1526       case R_PARISC_GNU_VTINHERIT:
1527       case R_PARISC_GNU_VTENTRY:
1528         return NULL;
1529       }
1530
1531   return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
1532 }
1533
1534 /* Support for core dump NOTE sections.  */
1535
1536 static bfd_boolean
1537 elf32_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1538 {
1539   int offset;
1540   size_t size;
1541
1542   switch (note->descsz)
1543     {
1544       default:
1545         return FALSE;
1546
1547       case 396:         /* Linux/hppa */
1548         /* pr_cursig */
1549         elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
1550
1551         /* pr_pid */
1552         elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
1553
1554         /* pr_reg */
1555         offset = 72;
1556         size = 320;
1557
1558         break;
1559     }
1560
1561   /* Make a ".reg/999" section.  */
1562   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1563                                           size, note->descpos + offset);
1564 }
1565
1566 static bfd_boolean
1567 elf32_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1568 {
1569   switch (note->descsz)
1570     {
1571       default:
1572         return FALSE;
1573
1574       case 124:         /* Linux/hppa elf_prpsinfo.  */
1575         elf_tdata (abfd)->core->program
1576           = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1577         elf_tdata (abfd)->core->command
1578           = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1579     }
1580
1581   /* Note that for some reason, a spurious space is tacked
1582      onto the end of the args in some (at least one anyway)
1583      implementations, so strip it off if it exists.  */
1584   {
1585     char *command = elf_tdata (abfd)->core->command;
1586     int n = strlen (command);
1587
1588     if (0 < n && command[n - 1] == ' ')
1589       command[n - 1] = '\0';
1590   }
1591
1592   return TRUE;
1593 }
1594
1595 /* Our own version of hide_symbol, so that we can keep plt entries for
1596    plabels.  */
1597
1598 static void
1599 elf32_hppa_hide_symbol (struct bfd_link_info *info,
1600                         struct elf_link_hash_entry *eh,
1601                         bfd_boolean force_local)
1602 {
1603   if (force_local)
1604     {
1605       eh->forced_local = 1;
1606       if (eh->dynindx != -1)
1607         {
1608           eh->dynindx = -1;
1609           _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1610                                   eh->dynstr_index);
1611         }
1612
1613       /* PR 16082: Remove version information from hidden symbol.  */
1614       eh->verinfo.verdef = NULL;
1615       eh->verinfo.vertree = NULL;
1616     }
1617
1618   /* STT_GNU_IFUNC symbol must go through PLT.  */
1619   if (! hppa_elf_hash_entry (eh)->plabel
1620       && eh->type != STT_GNU_IFUNC)
1621     {
1622       eh->needs_plt = 0;
1623       eh->plt = elf_hash_table (info)->init_plt_offset;
1624     }
1625 }
1626
1627 /* Find any dynamic relocs that apply to read-only sections.  */
1628
1629 static asection *
1630 readonly_dynrelocs (struct elf_link_hash_entry *eh)
1631 {
1632   struct elf32_hppa_link_hash_entry *hh;
1633   struct elf_dyn_relocs *hdh_p;
1634
1635   hh = hppa_elf_hash_entry (eh);
1636   for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->next)
1637     {
1638       asection *sec = hdh_p->sec->output_section;
1639
1640       if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
1641         return hdh_p->sec;
1642     }
1643   return NULL;
1644 }
1645
1646 /* Return true if we have dynamic relocs against H or any of its weak
1647    aliases, that apply to read-only sections.  Cannot be used after
1648    size_dynamic_sections.  */
1649
1650 static bfd_boolean
1651 alias_readonly_dynrelocs (struct elf_link_hash_entry *eh)
1652 {
1653   struct elf32_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1654   do
1655     {
1656       if (readonly_dynrelocs (&hh->eh))
1657         return TRUE;
1658       hh = hppa_elf_hash_entry (hh->eh.u.alias);
1659     } while (hh != NULL && &hh->eh != eh);
1660
1661   return FALSE;
1662 }
1663
1664 /* Adjust a symbol defined by a dynamic object and referenced by a
1665    regular object.  The current definition is in some section of the
1666    dynamic object, but we're not including those sections.  We have to
1667    change the definition to something the rest of the link can
1668    understand.  */
1669
1670 static bfd_boolean
1671 elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
1672                                   struct elf_link_hash_entry *eh)
1673 {
1674   struct elf32_hppa_link_hash_table *htab;
1675   asection *sec, *srel;
1676
1677   /* If this is a function, put it in the procedure linkage table.  We
1678      will fill in the contents of the procedure linkage table later.  */
1679   if (eh->type == STT_FUNC
1680       || eh->needs_plt)
1681     {
1682       bfd_boolean local = (SYMBOL_CALLS_LOCAL (info, eh)
1683                            || UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh));
1684       /* Discard dyn_relocs when non-pic if we've decided that a
1685          function symbol is local.  */
1686       if (!bfd_link_pic (info) && local)
1687         hppa_elf_hash_entry (eh)->dyn_relocs = NULL;
1688
1689       /* If the symbol is used by a plabel, we must allocate a PLT slot.
1690          The refcounts are not reliable when it has been hidden since
1691          hide_symbol can be called before the plabel flag is set.  */
1692       if (hppa_elf_hash_entry (eh)->plabel)
1693         eh->plt.refcount = 1;
1694
1695       /* Note that unlike some other backends, the refcount is not
1696          incremented for a non-call (and non-plabel) function reference.  */
1697       else if (eh->plt.refcount <= 0
1698                || local)
1699         {
1700           /* The .plt entry is not needed when:
1701              a) Garbage collection has removed all references to the
1702              symbol, or
1703              b) We know for certain the symbol is defined in this
1704              object, and it's not a weak definition, nor is the symbol
1705              used by a plabel relocation.  Either this object is the
1706              application or we are doing a shared symbolic link.  */
1707           eh->plt.offset = (bfd_vma) -1;
1708           eh->needs_plt = 0;
1709         }
1710
1711       /* Unlike other targets, elf32-hppa.c does not define a function
1712          symbol in a non-pic executable on PLT stub code, so we don't
1713          have a local definition in that case.  ie. dyn_relocs can't
1714          be discarded.  */
1715
1716       /* Function symbols can't have copy relocs.  */
1717       return TRUE;
1718     }
1719   else
1720     eh->plt.offset = (bfd_vma) -1;
1721
1722   htab = hppa_link_hash_table (info);
1723   if (htab == NULL)
1724     return FALSE;
1725
1726   /* If this is a weak symbol, and there is a real definition, the
1727      processor independent code will have arranged for us to see the
1728      real definition first, and we can just use the same value.  */
1729   if (eh->is_weakalias)
1730     {
1731       struct elf_link_hash_entry *def = weakdef (eh);
1732       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
1733       eh->root.u.def.section = def->root.u.def.section;
1734       eh->root.u.def.value = def->root.u.def.value;
1735       if (def->root.u.def.section == htab->etab.sdynbss
1736           || def->root.u.def.section == htab->etab.sdynrelro)
1737         hppa_elf_hash_entry (eh)->dyn_relocs = NULL;
1738       return TRUE;
1739     }
1740
1741   /* This is a reference to a symbol defined by a dynamic object which
1742      is not a function.  */
1743
1744   /* If we are creating a shared library, we must presume that the
1745      only references to the symbol are via the global offset table.
1746      For such cases we need not do anything here; the relocations will
1747      be handled correctly by relocate_section.  */
1748   if (bfd_link_pic (info))
1749     return TRUE;
1750
1751   /* If there are no references to this symbol that do not use the
1752      GOT, we don't need to generate a copy reloc.  */
1753   if (!eh->non_got_ref)
1754     return TRUE;
1755
1756   /* If -z nocopyreloc was given, we won't generate them either.  */
1757   if (info->nocopyreloc)
1758     return TRUE;
1759
1760   /* If we don't find any dynamic relocs in read-only sections, then
1761      we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1762   if (ELIMINATE_COPY_RELOCS
1763       && !alias_readonly_dynrelocs (eh))
1764     return TRUE;
1765
1766   /* We must allocate the symbol in our .dynbss section, which will
1767      become part of the .bss section of the executable.  There will be
1768      an entry for this symbol in the .dynsym section.  The dynamic
1769      object will contain position independent code, so all references
1770      from the dynamic object to this symbol will go through the global
1771      offset table.  The dynamic linker will use the .dynsym entry to
1772      determine the address it must put in the global offset table, so
1773      both the dynamic object and the regular object will refer to the
1774      same memory location for the variable.  */
1775   if ((eh->root.u.def.section->flags & SEC_READONLY) != 0)
1776     {
1777       sec = htab->etab.sdynrelro;
1778       srel = htab->etab.sreldynrelro;
1779     }
1780   else
1781     {
1782       sec = htab->etab.sdynbss;
1783       srel = htab->etab.srelbss;
1784     }
1785   if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0 && eh->size != 0)
1786     {
1787       /* We must generate a COPY reloc to tell the dynamic linker to
1788          copy the initial value out of the dynamic object and into the
1789          runtime process image.  */
1790       srel->size += sizeof (Elf32_External_Rela);
1791       eh->needs_copy = 1;
1792     }
1793
1794   /* We no longer want dyn_relocs.  */
1795   hppa_elf_hash_entry (eh)->dyn_relocs = NULL;
1796   return _bfd_elf_adjust_dynamic_copy (info, eh, sec);
1797 }
1798
1799 /* If EH is undefined, make it dynamic if that makes sense.  */
1800
1801 static bfd_boolean
1802 ensure_undef_dynamic (struct bfd_link_info *info,
1803                       struct elf_link_hash_entry *eh)
1804 {
1805   struct elf_link_hash_table *htab = elf_hash_table (info);
1806
1807   if (htab->dynamic_sections_created
1808       && (eh->root.type == bfd_link_hash_undefweak
1809           || eh->root.type == bfd_link_hash_undefined)
1810       && eh->dynindx == -1
1811       && !eh->forced_local
1812       && eh->type != STT_PARISC_MILLI
1813       && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh)
1814       && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT)
1815     return bfd_elf_link_record_dynamic_symbol (info, eh);
1816   return TRUE;
1817 }
1818
1819 /* Allocate space in the .plt for entries that won't have relocations.
1820    ie. plabel entries.  */
1821
1822 static bfd_boolean
1823 allocate_plt_static (struct elf_link_hash_entry *eh, void *inf)
1824 {
1825   struct bfd_link_info *info;
1826   struct elf32_hppa_link_hash_table *htab;
1827   struct elf32_hppa_link_hash_entry *hh;
1828   asection *sec;
1829
1830   if (eh->root.type == bfd_link_hash_indirect)
1831     return TRUE;
1832
1833   info = (struct bfd_link_info *) inf;
1834   hh = hppa_elf_hash_entry (eh);
1835   htab = hppa_link_hash_table (info);
1836   if (htab == NULL)
1837     return FALSE;
1838
1839   if (htab->etab.dynamic_sections_created
1840       && eh->plt.refcount > 0)
1841     {
1842       if (!ensure_undef_dynamic (info, eh))
1843         return FALSE;
1844
1845       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), eh))
1846         {
1847           /* Allocate these later.  From this point on, h->plabel
1848              means that the plt entry is only used by a plabel.
1849              We'll be using a normal plt entry for this symbol, so
1850              clear the plabel indicator.  */
1851
1852           hh->plabel = 0;
1853         }
1854       else if (hh->plabel)
1855         {
1856           /* Make an entry in the .plt section for plabel references
1857              that won't have a .plt entry for other reasons.  */
1858           sec = htab->etab.splt;
1859           eh->plt.offset = sec->size;
1860           sec->size += PLT_ENTRY_SIZE;
1861           if (bfd_link_pic (info))
1862             htab->etab.srelplt->size += sizeof (Elf32_External_Rela);
1863         }
1864       else
1865         {
1866           /* No .plt entry needed.  */
1867           eh->plt.offset = (bfd_vma) -1;
1868           eh->needs_plt = 0;
1869         }
1870     }
1871   else
1872     {
1873       eh->plt.offset = (bfd_vma) -1;
1874       eh->needs_plt = 0;
1875     }
1876
1877   return TRUE;
1878 }
1879
1880 /* Calculate size of GOT entries for symbol given its TLS_TYPE.  */
1881
1882 static inline unsigned int
1883 got_entries_needed (int tls_type)
1884 {
1885   unsigned int need = 0;
1886
1887   if ((tls_type & GOT_NORMAL) != 0)
1888     need += GOT_ENTRY_SIZE;
1889   if ((tls_type & GOT_TLS_GD) != 0)
1890     need += GOT_ENTRY_SIZE * 2;
1891   if ((tls_type & GOT_TLS_IE) != 0)
1892     need += GOT_ENTRY_SIZE;
1893   return need;
1894 }
1895
1896 /* Calculate size of relocs needed for symbol given its TLS_TYPE and
1897    NEEDed GOT entries.  KNOWN says a TPREL offset can be calculated
1898    at link time.  */
1899
1900 static inline unsigned int
1901 got_relocs_needed (int tls_type, unsigned int need, bfd_boolean known)
1902 {
1903   /* All the entries we allocated need relocs.
1904      Except IE in executable with a local symbol.  We could also omit
1905      the DTPOFF reloc on the second word of a GD entry under the same
1906      condition as that for IE, but ld.so might want to differentiate
1907      LD and GD entries at some stage.  */
1908   if ((tls_type & GOT_TLS_IE) != 0 && known)
1909     need -= GOT_ENTRY_SIZE;
1910   return need * sizeof (Elf32_External_Rela) / GOT_ENTRY_SIZE;
1911 }
1912
1913 /* Allocate space in .plt, .got and associated reloc sections for
1914    global syms.  */
1915
1916 static bfd_boolean
1917 allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
1918 {
1919   struct bfd_link_info *info;
1920   struct elf32_hppa_link_hash_table *htab;
1921   asection *sec;
1922   struct elf32_hppa_link_hash_entry *hh;
1923   struct elf_dyn_relocs *hdh_p;
1924
1925   if (eh->root.type == bfd_link_hash_indirect)
1926     return TRUE;
1927
1928   info = inf;
1929   htab = hppa_link_hash_table (info);
1930   if (htab == NULL)
1931     return FALSE;
1932
1933   hh = hppa_elf_hash_entry (eh);
1934
1935   if (htab->etab.dynamic_sections_created
1936       && eh->plt.offset != (bfd_vma) -1
1937       && !hh->plabel
1938       && eh->plt.refcount > 0)
1939     {
1940       /* Make an entry in the .plt section.  */
1941       sec = htab->etab.splt;
1942       eh->plt.offset = sec->size;
1943       sec->size += PLT_ENTRY_SIZE;
1944
1945       /* We also need to make an entry in the .rela.plt section.  */
1946       htab->etab.srelplt->size += sizeof (Elf32_External_Rela);
1947       htab->need_plt_stub = 1;
1948     }
1949
1950   if (eh->got.refcount > 0)
1951     {
1952       unsigned int need;
1953
1954       if (!ensure_undef_dynamic (info, eh))
1955         return FALSE;
1956
1957       sec = htab->etab.sgot;
1958       eh->got.offset = sec->size;
1959       need = got_entries_needed (hh->tls_type);
1960       sec->size += need;
1961       if (htab->etab.dynamic_sections_created
1962           && (bfd_link_pic (info)
1963               || (eh->dynindx != -1
1964                   && !SYMBOL_REFERENCES_LOCAL (info, eh)))
1965           && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh))
1966         {
1967           bfd_boolean tprel_known = (bfd_link_executable (info)
1968                                      && SYMBOL_REFERENCES_LOCAL (info, eh));
1969           htab->etab.srelgot->size
1970             += got_relocs_needed (hh->tls_type, need, tprel_known);
1971         }
1972     }
1973   else
1974     eh->got.offset = (bfd_vma) -1;
1975
1976   /* If no dynamic sections we can't have dynamic relocs.  */
1977   if (!htab->etab.dynamic_sections_created)
1978     hh->dyn_relocs = NULL;
1979
1980   /* Discard relocs on undefined syms with non-default visibility.  */
1981   else if ((eh->root.type == bfd_link_hash_undefined
1982             && ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
1983            || UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh))
1984     hh->dyn_relocs = NULL;
1985
1986   if (hh->dyn_relocs == NULL)
1987     return TRUE;
1988
1989   /* If this is a -Bsymbolic shared link, then we need to discard all
1990      space allocated for dynamic pc-relative relocs against symbols
1991      defined in a regular object.  For the normal shared case, discard
1992      space for relocs that have become local due to symbol visibility
1993      changes.  */
1994   if (bfd_link_pic (info))
1995     {
1996 #if RELATIVE_DYNRELOCS
1997       if (SYMBOL_CALLS_LOCAL (info, eh))
1998         {
1999           struct elf_dyn_relocs **hdh_pp;
2000
2001           for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
2002             {
2003               hdh_p->count -= hdh_p->pc_count;
2004               hdh_p->pc_count = 0;
2005               if (hdh_p->count == 0)
2006                 *hdh_pp = hdh_p->next;
2007               else
2008                 hdh_pp = &hdh_p->next;
2009             }
2010         }
2011 #endif
2012
2013       if (hh->dyn_relocs != NULL)
2014         {
2015           if (!ensure_undef_dynamic (info, eh))
2016             return FALSE;
2017         }
2018     }
2019   else if (ELIMINATE_COPY_RELOCS)
2020     {
2021       /* For the non-shared case, discard space for relocs against
2022          symbols which turn out to need copy relocs or are not
2023          dynamic.  */
2024
2025       if (eh->dynamic_adjusted
2026           && !eh->def_regular
2027           && !ELF_COMMON_DEF_P (eh))
2028         {
2029           if (!ensure_undef_dynamic (info, eh))
2030             return FALSE;
2031
2032           if (eh->dynindx == -1)
2033             hh->dyn_relocs = NULL;
2034         }
2035       else
2036         hh->dyn_relocs = NULL;
2037     }
2038
2039   /* Finally, allocate space.  */
2040   for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->next)
2041     {
2042       asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
2043       sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
2044     }
2045
2046   return TRUE;
2047 }
2048
2049 /* This function is called via elf_link_hash_traverse to force
2050    millicode symbols local so they do not end up as globals in the
2051    dynamic symbol table.  We ought to be able to do this in
2052    adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2053    for all dynamic symbols.  Arguably, this is a bug in
2054    elf_adjust_dynamic_symbol.  */
2055
2056 static bfd_boolean
2057 clobber_millicode_symbols (struct elf_link_hash_entry *eh,
2058                            struct bfd_link_info *info)
2059 {
2060   if (eh->type == STT_PARISC_MILLI
2061       && !eh->forced_local)
2062     {
2063       elf32_hppa_hide_symbol (info, eh, TRUE);
2064     }
2065   return TRUE;
2066 }
2067
2068 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
2069    read-only sections.  */
2070
2071 static bfd_boolean
2072 maybe_set_textrel (struct elf_link_hash_entry *eh, void *inf)
2073 {
2074   asection *sec;
2075
2076   if (eh->root.type == bfd_link_hash_indirect)
2077     return TRUE;
2078
2079   sec = readonly_dynrelocs (eh);
2080   if (sec != NULL)
2081     {
2082       struct bfd_link_info *info = (struct bfd_link_info *) inf;
2083
2084       info->flags |= DF_TEXTREL;
2085       info->callbacks->minfo
2086         (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
2087          sec->owner, eh->root.root.string, sec);
2088
2089       /* Not an error, just cut short the traversal.  */
2090       return FALSE;
2091     }
2092   return TRUE;
2093 }
2094
2095 /* Set the sizes of the dynamic sections.  */
2096
2097 static bfd_boolean
2098 elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2099                                   struct bfd_link_info *info)
2100 {
2101   struct elf32_hppa_link_hash_table *htab;
2102   bfd *dynobj;
2103   bfd *ibfd;
2104   asection *sec;
2105   bfd_boolean relocs;
2106
2107   htab = hppa_link_hash_table (info);
2108   if (htab == NULL)
2109     return FALSE;
2110
2111   dynobj = htab->etab.dynobj;
2112   if (dynobj == NULL)
2113     abort ();
2114
2115   if (htab->etab.dynamic_sections_created)
2116     {
2117       /* Set the contents of the .interp section to the interpreter.  */
2118       if (bfd_link_executable (info) && !info->nointerp)
2119         {
2120           sec = bfd_get_linker_section (dynobj, ".interp");
2121           if (sec == NULL)
2122             abort ();
2123           sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
2124           sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2125         }
2126
2127       /* Force millicode symbols local.  */
2128       elf_link_hash_traverse (&htab->etab,
2129                               clobber_millicode_symbols,
2130                               info);
2131     }
2132
2133   /* Set up .got and .plt offsets for local syms, and space for local
2134      dynamic relocs.  */
2135   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2136     {
2137       bfd_signed_vma *local_got;
2138       bfd_signed_vma *end_local_got;
2139       bfd_signed_vma *local_plt;
2140       bfd_signed_vma *end_local_plt;
2141       bfd_size_type locsymcount;
2142       Elf_Internal_Shdr *symtab_hdr;
2143       asection *srel;
2144       char *local_tls_type;
2145
2146       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2147         continue;
2148
2149       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2150         {
2151           struct elf_dyn_relocs *hdh_p;
2152
2153           for (hdh_p = ((struct elf_dyn_relocs *)
2154                     elf_section_data (sec)->local_dynrel);
2155                hdh_p != NULL;
2156                hdh_p = hdh_p->next)
2157             {
2158               if (!bfd_is_abs_section (hdh_p->sec)
2159                   && bfd_is_abs_section (hdh_p->sec->output_section))
2160                 {
2161                   /* Input section has been discarded, either because
2162                      it is a copy of a linkonce section or due to
2163                      linker script /DISCARD/, so we'll be discarding
2164                      the relocs too.  */
2165                 }
2166               else if (hdh_p->count != 0)
2167                 {
2168                   srel = elf_section_data (hdh_p->sec)->sreloc;
2169                   srel->size += hdh_p->count * sizeof (Elf32_External_Rela);
2170                   if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
2171                     info->flags |= DF_TEXTREL;
2172                 }
2173             }
2174         }
2175
2176       local_got = elf_local_got_refcounts (ibfd);
2177       if (!local_got)
2178         continue;
2179
2180       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2181       locsymcount = symtab_hdr->sh_info;
2182       end_local_got = local_got + locsymcount;
2183       local_tls_type = hppa_elf_local_got_tls_type (ibfd);
2184       sec = htab->etab.sgot;
2185       srel = htab->etab.srelgot;
2186       for (; local_got < end_local_got; ++local_got)
2187         {
2188           if (*local_got > 0)
2189             {
2190               unsigned int need;
2191
2192               *local_got = sec->size;
2193               need = got_entries_needed (*local_tls_type);
2194               sec->size += need;
2195               if (bfd_link_pic (info))
2196                 {
2197                   bfd_boolean tprel_known = bfd_link_executable (info);
2198                   htab->etab.srelgot->size
2199                     += got_relocs_needed (*local_tls_type, need, tprel_known);
2200                 }
2201             }
2202           else
2203             *local_got = (bfd_vma) -1;
2204
2205           ++local_tls_type;
2206         }
2207
2208       local_plt = end_local_got;
2209       end_local_plt = local_plt + locsymcount;
2210       if (! htab->etab.dynamic_sections_created)
2211         {
2212           /* Won't be used, but be safe.  */
2213           for (; local_plt < end_local_plt; ++local_plt)
2214             *local_plt = (bfd_vma) -1;
2215         }
2216       else
2217         {
2218           sec = htab->etab.splt;
2219           srel = htab->etab.srelplt;
2220           for (; local_plt < end_local_plt; ++local_plt)
2221             {
2222               if (*local_plt > 0)
2223                 {
2224                   *local_plt = sec->size;
2225                   sec->size += PLT_ENTRY_SIZE;
2226                   if (bfd_link_pic (info))
2227                     srel->size += sizeof (Elf32_External_Rela);
2228                 }
2229               else
2230                 *local_plt = (bfd_vma) -1;
2231             }
2232         }
2233     }
2234
2235   if (htab->tls_ldm_got.refcount > 0)
2236     {
2237       /* Allocate 2 got entries and 1 dynamic reloc for
2238          R_PARISC_TLS_DTPMOD32 relocs.  */
2239       htab->tls_ldm_got.offset = htab->etab.sgot->size;
2240       htab->etab.sgot->size += (GOT_ENTRY_SIZE * 2);
2241       htab->etab.srelgot->size += sizeof (Elf32_External_Rela);
2242     }
2243   else
2244     htab->tls_ldm_got.offset = -1;
2245
2246   /* Do all the .plt entries without relocs first.  The dynamic linker
2247      uses the last .plt reloc to find the end of the .plt (and hence
2248      the start of the .got) for lazy linking.  */
2249   elf_link_hash_traverse (&htab->etab, allocate_plt_static, info);
2250
2251   /* Allocate global sym .plt and .got entries, and space for global
2252      sym dynamic relocs.  */
2253   elf_link_hash_traverse (&htab->etab, allocate_dynrelocs, info);
2254
2255   /* The check_relocs and adjust_dynamic_symbol entry points have
2256      determined the sizes of the various dynamic sections.  Allocate
2257      memory for them.  */
2258   relocs = FALSE;
2259   for (sec = dynobj->sections; sec != NULL; sec = sec->next)
2260     {
2261       if ((sec->flags & SEC_LINKER_CREATED) == 0)
2262         continue;
2263
2264       if (sec == htab->etab.splt)
2265         {
2266           if (htab->need_plt_stub)
2267             {
2268               /* Make space for the plt stub at the end of the .plt
2269                  section.  We want this stub right at the end, up
2270                  against the .got section.  */
2271               int gotalign = bfd_section_alignment (dynobj, htab->etab.sgot);
2272               int pltalign = bfd_section_alignment (dynobj, sec);
2273               bfd_size_type mask;
2274
2275               if (gotalign > pltalign)
2276                 (void) bfd_set_section_alignment (dynobj, sec, gotalign);
2277               mask = ((bfd_size_type) 1 << gotalign) - 1;
2278               sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
2279             }
2280         }
2281       else if (sec == htab->etab.sgot
2282                || sec == htab->etab.sdynbss
2283                || sec == htab->etab.sdynrelro)
2284         ;
2285       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, sec), ".rela"))
2286         {
2287           if (sec->size != 0)
2288             {
2289               /* Remember whether there are any reloc sections other
2290                  than .rela.plt.  */
2291               if (sec != htab->etab.srelplt)
2292                 relocs = TRUE;
2293
2294               /* We use the reloc_count field as a counter if we need
2295                  to copy relocs into the output file.  */
2296               sec->reloc_count = 0;
2297             }
2298         }
2299       else
2300         {
2301           /* It's not one of our sections, so don't allocate space.  */
2302           continue;
2303         }
2304
2305       if (sec->size == 0)
2306         {
2307           /* If we don't need this section, strip it from the
2308              output file.  This is mostly to handle .rela.bss and
2309              .rela.plt.  We must create both sections in
2310              create_dynamic_sections, because they must be created
2311              before the linker maps input sections to output
2312              sections.  The linker does that before
2313              adjust_dynamic_symbol is called, and it is that
2314              function which decides whether anything needs to go
2315              into these sections.  */
2316           sec->flags |= SEC_EXCLUDE;
2317           continue;
2318         }
2319
2320       if ((sec->flags & SEC_HAS_CONTENTS) == 0)
2321         continue;
2322
2323       /* Allocate memory for the section contents.  Zero it, because
2324          we may not fill in all the reloc sections.  */
2325       sec->contents = bfd_zalloc (dynobj, sec->size);
2326       if (sec->contents == NULL)
2327         return FALSE;
2328     }
2329
2330   if (htab->etab.dynamic_sections_created)
2331     {
2332       /* Like IA-64 and HPPA64, always create a DT_PLTGOT.  It
2333          actually has nothing to do with the PLT, it is how we
2334          communicate the LTP value of a load module to the dynamic
2335          linker.  */
2336 #define add_dynamic_entry(TAG, VAL) \
2337   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2338
2339       if (!add_dynamic_entry (DT_PLTGOT, 0))
2340         return FALSE;
2341
2342       /* Add some entries to the .dynamic section.  We fill in the
2343          values later, in elf32_hppa_finish_dynamic_sections, but we
2344          must add the entries now so that we get the correct size for
2345          the .dynamic section.  The DT_DEBUG entry is filled in by the
2346          dynamic linker and used by the debugger.  */
2347       if (bfd_link_executable (info))
2348         {
2349           if (!add_dynamic_entry (DT_DEBUG, 0))
2350             return FALSE;
2351         }
2352
2353       if (htab->etab.srelplt->size != 0)
2354         {
2355           if (!add_dynamic_entry (DT_PLTRELSZ, 0)
2356               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2357               || !add_dynamic_entry (DT_JMPREL, 0))
2358             return FALSE;
2359         }
2360
2361       if (relocs)
2362         {
2363           if (!add_dynamic_entry (DT_RELA, 0)
2364               || !add_dynamic_entry (DT_RELASZ, 0)
2365               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2366             return FALSE;
2367
2368           /* If any dynamic relocs apply to a read-only section,
2369              then we need a DT_TEXTREL entry.  */
2370           if ((info->flags & DF_TEXTREL) == 0)
2371             elf_link_hash_traverse (&htab->etab, maybe_set_textrel, info);
2372
2373           if ((info->flags & DF_TEXTREL) != 0)
2374             {
2375               if (!add_dynamic_entry (DT_TEXTREL, 0))
2376                 return FALSE;
2377             }
2378         }
2379     }
2380 #undef add_dynamic_entry
2381
2382   return TRUE;
2383 }
2384
2385 /* External entry points for sizing and building linker stubs.  */
2386
2387 /* Set up various things so that we can make a list of input sections
2388    for each output section included in the link.  Returns -1 on error,
2389    0 when no stubs will be needed, and 1 on success.  */
2390
2391 int
2392 elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2393 {
2394   bfd *input_bfd;
2395   unsigned int bfd_count;
2396   unsigned int top_id, top_index;
2397   asection *section;
2398   asection **input_list, **list;
2399   bfd_size_type amt;
2400   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2401
2402   if (htab == NULL)
2403     return -1;
2404
2405   /* Count the number of input BFDs and find the top input section id.  */
2406   for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2407        input_bfd != NULL;
2408        input_bfd = input_bfd->link.next)
2409     {
2410       bfd_count += 1;
2411       for (section = input_bfd->sections;
2412            section != NULL;
2413            section = section->next)
2414         {
2415           if (top_id < section->id)
2416             top_id = section->id;
2417         }
2418     }
2419   htab->bfd_count = bfd_count;
2420
2421   amt = sizeof (struct map_stub) * (top_id + 1);
2422   htab->stub_group = bfd_zmalloc (amt);
2423   if (htab->stub_group == NULL)
2424     return -1;
2425
2426   /* We can't use output_bfd->section_count here to find the top output
2427      section index as some sections may have been removed, and
2428      strip_excluded_output_sections doesn't renumber the indices.  */
2429   for (section = output_bfd->sections, top_index = 0;
2430        section != NULL;
2431        section = section->next)
2432     {
2433       if (top_index < section->index)
2434         top_index = section->index;
2435     }
2436
2437   htab->top_index = top_index;
2438   amt = sizeof (asection *) * (top_index + 1);
2439   input_list = bfd_malloc (amt);
2440   htab->input_list = input_list;
2441   if (input_list == NULL)
2442     return -1;
2443
2444   /* For sections we aren't interested in, mark their entries with a
2445      value we can check later.  */
2446   list = input_list + top_index;
2447   do
2448     *list = bfd_abs_section_ptr;
2449   while (list-- != input_list);
2450
2451   for (section = output_bfd->sections;
2452        section != NULL;
2453        section = section->next)
2454     {
2455       if ((section->flags & SEC_CODE) != 0)
2456         input_list[section->index] = NULL;
2457     }
2458
2459   return 1;
2460 }
2461
2462 /* The linker repeatedly calls this function for each input section,
2463    in the order that input sections are linked into output sections.
2464    Build lists of input sections to determine groupings between which
2465    we may insert linker stubs.  */
2466
2467 void
2468 elf32_hppa_next_input_section (struct bfd_link_info *info, asection *isec)
2469 {
2470   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2471
2472   if (htab == NULL)
2473     return;
2474
2475   if (isec->output_section->index <= htab->top_index)
2476     {
2477       asection **list = htab->input_list + isec->output_section->index;
2478       if (*list != bfd_abs_section_ptr)
2479         {
2480           /* Steal the link_sec pointer for our list.  */
2481 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
2482           /* This happens to make the list in reverse order,
2483              which is what we want.  */
2484           PREV_SEC (isec) = *list;
2485           *list = isec;
2486         }
2487     }
2488 }
2489
2490 /* See whether we can group stub sections together.  Grouping stub
2491    sections may result in fewer stubs.  More importantly, we need to
2492    put all .init* and .fini* stubs at the beginning of the .init or
2493    .fini output sections respectively, because glibc splits the
2494    _init and _fini functions into multiple parts.  Putting a stub in
2495    the middle of a function is not a good idea.  */
2496
2497 static void
2498 group_sections (struct elf32_hppa_link_hash_table *htab,
2499                 bfd_size_type stub_group_size,
2500                 bfd_boolean stubs_always_before_branch)
2501 {
2502   asection **list = htab->input_list + htab->top_index;
2503   do
2504     {
2505       asection *tail = *list;
2506       if (tail == bfd_abs_section_ptr)
2507         continue;
2508       while (tail != NULL)
2509         {
2510           asection *curr;
2511           asection *prev;
2512           bfd_size_type total;
2513           bfd_boolean big_sec;
2514
2515           curr = tail;
2516           total = tail->size;
2517           big_sec = total >= stub_group_size;
2518
2519           while ((prev = PREV_SEC (curr)) != NULL
2520                  && ((total += curr->output_offset - prev->output_offset)
2521                      < stub_group_size))
2522             curr = prev;
2523
2524           /* OK, the size from the start of CURR to the end is less
2525              than 240000 bytes and thus can be handled by one stub
2526              section.  (or the tail section is itself larger than
2527              240000 bytes, in which case we may be toast.)
2528              We should really be keeping track of the total size of
2529              stubs added here, as stubs contribute to the final output
2530              section size.  That's a little tricky, and this way will
2531              only break if stubs added total more than 22144 bytes, or
2532              2768 long branch stubs.  It seems unlikely for more than
2533              2768 different functions to be called, especially from
2534              code only 240000 bytes long.  This limit used to be
2535              250000, but c++ code tends to generate lots of little
2536              functions, and sometimes violated the assumption.  */
2537           do
2538             {
2539               prev = PREV_SEC (tail);
2540               /* Set up this stub group.  */
2541               htab->stub_group[tail->id].link_sec = curr;
2542             }
2543           while (tail != curr && (tail = prev) != NULL);
2544
2545           /* But wait, there's more!  Input sections up to 240000
2546              bytes before the stub section can be handled by it too.
2547              Don't do this if we have a really large section after the
2548              stubs, as adding more stubs increases the chance that
2549              branches may not reach into the stub section.  */
2550           if (!stubs_always_before_branch && !big_sec)
2551             {
2552               total = 0;
2553               while (prev != NULL
2554                      && ((total += tail->output_offset - prev->output_offset)
2555                          < stub_group_size))
2556                 {
2557                   tail = prev;
2558                   prev = PREV_SEC (tail);
2559                   htab->stub_group[tail->id].link_sec = curr;
2560                 }
2561             }
2562           tail = prev;
2563         }
2564     }
2565   while (list-- != htab->input_list);
2566   free (htab->input_list);
2567 #undef PREV_SEC
2568 }
2569
2570 /* Read in all local syms for all input bfds, and create hash entries
2571    for export stubs if we are building a multi-subspace shared lib.
2572    Returns -1 on error, 1 if export stubs created, 0 otherwise.  */
2573
2574 static int
2575 get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info)
2576 {
2577   unsigned int bfd_indx;
2578   Elf_Internal_Sym *local_syms, **all_local_syms;
2579   int stub_changed = 0;
2580   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2581
2582   if (htab == NULL)
2583     return -1;
2584
2585   /* We want to read in symbol extension records only once.  To do this
2586      we need to read in the local symbols in parallel and save them for
2587      later use; so hold pointers to the local symbols in an array.  */
2588   bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2589   all_local_syms = bfd_zmalloc (amt);
2590   htab->all_local_syms = all_local_syms;
2591   if (all_local_syms == NULL)
2592     return -1;
2593
2594   /* Walk over all the input BFDs, swapping in local symbols.
2595      If we are creating a shared library, create hash entries for the
2596      export stubs.  */
2597   for (bfd_indx = 0;
2598        input_bfd != NULL;
2599        input_bfd = input_bfd->link.next, bfd_indx++)
2600     {
2601       Elf_Internal_Shdr *symtab_hdr;
2602
2603       /* We'll need the symbol table in a second.  */
2604       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2605       if (symtab_hdr->sh_info == 0)
2606         continue;
2607
2608       /* We need an array of the local symbols attached to the input bfd.  */
2609       local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2610       if (local_syms == NULL)
2611         {
2612           local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2613                                              symtab_hdr->sh_info, 0,
2614                                              NULL, NULL, NULL);
2615           /* Cache them for elf_link_input_bfd.  */
2616           symtab_hdr->contents = (unsigned char *) local_syms;
2617         }
2618       if (local_syms == NULL)
2619         return -1;
2620
2621       all_local_syms[bfd_indx] = local_syms;
2622
2623       if (bfd_link_pic (info) && htab->multi_subspace)
2624         {
2625           struct elf_link_hash_entry **eh_syms;
2626           struct elf_link_hash_entry **eh_symend;
2627           unsigned int symcount;
2628
2629           symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2630                       - symtab_hdr->sh_info);
2631           eh_syms = (struct elf_link_hash_entry **) elf_sym_hashes (input_bfd);
2632           eh_symend = (struct elf_link_hash_entry **) (eh_syms + symcount);
2633
2634           /* Look through the global syms for functions;  We need to
2635              build export stubs for all globally visible functions.  */
2636           for (; eh_syms < eh_symend; eh_syms++)
2637             {
2638               struct elf32_hppa_link_hash_entry *hh;
2639
2640               hh = hppa_elf_hash_entry (*eh_syms);
2641
2642               while (hh->eh.root.type == bfd_link_hash_indirect
2643                      || hh->eh.root.type == bfd_link_hash_warning)
2644                    hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
2645
2646               /* At this point in the link, undefined syms have been
2647                  resolved, so we need to check that the symbol was
2648                  defined in this BFD.  */
2649               if ((hh->eh.root.type == bfd_link_hash_defined
2650                    || hh->eh.root.type == bfd_link_hash_defweak)
2651                   && hh->eh.type == STT_FUNC
2652                   && hh->eh.root.u.def.section->output_section != NULL
2653                   && (hh->eh.root.u.def.section->output_section->owner
2654                       == output_bfd)
2655                   && hh->eh.root.u.def.section->owner == input_bfd
2656                   && hh->eh.def_regular
2657                   && !hh->eh.forced_local
2658                   && ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT)
2659                 {
2660                   asection *sec;
2661                   const char *stub_name;
2662                   struct elf32_hppa_stub_hash_entry *hsh;
2663
2664                   sec = hh->eh.root.u.def.section;
2665                   stub_name = hh_name (hh);
2666                   hsh = hppa_stub_hash_lookup (&htab->bstab,
2667                                                       stub_name,
2668                                                       FALSE, FALSE);
2669                   if (hsh == NULL)
2670                     {
2671                       hsh = hppa_add_stub (stub_name, sec, htab);
2672                       if (!hsh)
2673                         return -1;
2674
2675                       hsh->target_value = hh->eh.root.u.def.value;
2676                       hsh->target_section = hh->eh.root.u.def.section;
2677                       hsh->stub_type = hppa_stub_export;
2678                       hsh->hh = hh;
2679                       stub_changed = 1;
2680                     }
2681                   else
2682                     {
2683                       /* xgettext:c-format */
2684                       _bfd_error_handler (_("%pB: duplicate export stub %s"),
2685                                           input_bfd, stub_name);
2686                     }
2687                 }
2688             }
2689         }
2690     }
2691
2692   return stub_changed;
2693 }
2694
2695 /* Determine and set the size of the stub section for a final link.
2696
2697    The basic idea here is to examine all the relocations looking for
2698    PC-relative calls to a target that is unreachable with a "bl"
2699    instruction.  */
2700
2701 bfd_boolean
2702 elf32_hppa_size_stubs
2703   (bfd *output_bfd, bfd *stub_bfd, struct bfd_link_info *info,
2704    bfd_boolean multi_subspace, bfd_signed_vma group_size,
2705    asection * (*add_stub_section) (const char *, asection *),
2706    void (*layout_sections_again) (void))
2707 {
2708   bfd_size_type stub_group_size;
2709   bfd_boolean stubs_always_before_branch;
2710   bfd_boolean stub_changed;
2711   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2712
2713   if (htab == NULL)
2714     return FALSE;
2715
2716   /* Stash our params away.  */
2717   htab->stub_bfd = stub_bfd;
2718   htab->multi_subspace = multi_subspace;
2719   htab->add_stub_section = add_stub_section;
2720   htab->layout_sections_again = layout_sections_again;
2721   stubs_always_before_branch = group_size < 0;
2722   if (group_size < 0)
2723     stub_group_size = -group_size;
2724   else
2725     stub_group_size = group_size;
2726   if (stub_group_size == 1)
2727     {
2728       /* Default values.  */
2729       if (stubs_always_before_branch)
2730         {
2731           stub_group_size = 7680000;
2732           if (htab->has_17bit_branch || htab->multi_subspace)
2733             stub_group_size = 240000;
2734           if (htab->has_12bit_branch)
2735             stub_group_size = 7500;
2736         }
2737       else
2738         {
2739           stub_group_size = 6971392;
2740           if (htab->has_17bit_branch || htab->multi_subspace)
2741             stub_group_size = 217856;
2742           if (htab->has_12bit_branch)
2743             stub_group_size = 6808;
2744         }
2745     }
2746
2747   group_sections (htab, stub_group_size, stubs_always_before_branch);
2748
2749   switch (get_local_syms (output_bfd, info->input_bfds, info))
2750     {
2751     default:
2752       if (htab->all_local_syms)
2753         goto error_ret_free_local;
2754       return FALSE;
2755
2756     case 0:
2757       stub_changed = FALSE;
2758       break;
2759
2760     case 1:
2761       stub_changed = TRUE;
2762       break;
2763     }
2764
2765   while (1)
2766     {
2767       bfd *input_bfd;
2768       unsigned int bfd_indx;
2769       asection *stub_sec;
2770
2771       for (input_bfd = info->input_bfds, bfd_indx = 0;
2772            input_bfd != NULL;
2773            input_bfd = input_bfd->link.next, bfd_indx++)
2774         {
2775           Elf_Internal_Shdr *symtab_hdr;
2776           asection *section;
2777           Elf_Internal_Sym *local_syms;
2778
2779           /* We'll need the symbol table in a second.  */
2780           symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2781           if (symtab_hdr->sh_info == 0)
2782             continue;
2783
2784           local_syms = htab->all_local_syms[bfd_indx];
2785
2786           /* Walk over each section attached to the input bfd.  */
2787           for (section = input_bfd->sections;
2788                section != NULL;
2789                section = section->next)
2790             {
2791               Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2792
2793               /* If there aren't any relocs, then there's nothing more
2794                  to do.  */
2795               if ((section->flags & SEC_RELOC) == 0
2796                   || section->reloc_count == 0)
2797                 continue;
2798
2799               /* If this section is a link-once section that will be
2800                  discarded, then don't create any stubs.  */
2801               if (section->output_section == NULL
2802                   || section->output_section->owner != output_bfd)
2803                 continue;
2804
2805               /* Get the relocs.  */
2806               internal_relocs
2807                 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2808                                              info->keep_memory);
2809               if (internal_relocs == NULL)
2810                 goto error_ret_free_local;
2811
2812               /* Now examine each relocation.  */
2813               irela = internal_relocs;
2814               irelaend = irela + section->reloc_count;
2815               for (; irela < irelaend; irela++)
2816                 {
2817                   unsigned int r_type, r_indx;
2818                   enum elf32_hppa_stub_type stub_type;
2819                   struct elf32_hppa_stub_hash_entry *hsh;
2820                   asection *sym_sec;
2821                   bfd_vma sym_value;
2822                   bfd_vma destination;
2823                   struct elf32_hppa_link_hash_entry *hh;
2824                   char *stub_name;
2825                   const asection *id_sec;
2826
2827                   r_type = ELF32_R_TYPE (irela->r_info);
2828                   r_indx = ELF32_R_SYM (irela->r_info);
2829
2830                   if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
2831                     {
2832                       bfd_set_error (bfd_error_bad_value);
2833                     error_ret_free_internal:
2834                       if (elf_section_data (section)->relocs == NULL)
2835                         free (internal_relocs);
2836                       goto error_ret_free_local;
2837                     }
2838
2839                   /* Only look for stubs on call instructions.  */
2840                   if (r_type != (unsigned int) R_PARISC_PCREL12F
2841                       && r_type != (unsigned int) R_PARISC_PCREL17F
2842                       && r_type != (unsigned int) R_PARISC_PCREL22F)
2843                     continue;
2844
2845                   /* Now determine the call target, its name, value,
2846                      section.  */
2847                   sym_sec = NULL;
2848                   sym_value = 0;
2849                   destination = -1;
2850                   hh = NULL;
2851                   if (r_indx < symtab_hdr->sh_info)
2852                     {
2853                       /* It's a local symbol.  */
2854                       Elf_Internal_Sym *sym;
2855                       Elf_Internal_Shdr *hdr;
2856                       unsigned int shndx;
2857
2858                       sym = local_syms + r_indx;
2859                       if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2860                         sym_value = sym->st_value;
2861                       shndx = sym->st_shndx;
2862                       if (shndx < elf_numsections (input_bfd))
2863                         {
2864                           hdr = elf_elfsections (input_bfd)[shndx];
2865                           sym_sec = hdr->bfd_section;
2866                           destination = (sym_value + irela->r_addend
2867                                          + sym_sec->output_offset
2868                                          + sym_sec->output_section->vma);
2869                         }
2870                     }
2871                   else
2872                     {
2873                       /* It's an external symbol.  */
2874                       int e_indx;
2875
2876                       e_indx = r_indx - symtab_hdr->sh_info;
2877                       hh = hppa_elf_hash_entry (elf_sym_hashes (input_bfd)[e_indx]);
2878
2879                       while (hh->eh.root.type == bfd_link_hash_indirect
2880                              || hh->eh.root.type == bfd_link_hash_warning)
2881                         hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
2882
2883                       if (hh->eh.root.type == bfd_link_hash_defined
2884                           || hh->eh.root.type == bfd_link_hash_defweak)
2885                         {
2886                           sym_sec = hh->eh.root.u.def.section;
2887                           sym_value = hh->eh.root.u.def.value;
2888                           if (sym_sec->output_section != NULL)
2889                             destination = (sym_value + irela->r_addend
2890                                            + sym_sec->output_offset
2891                                            + sym_sec->output_section->vma);
2892                         }
2893                       else if (hh->eh.root.type == bfd_link_hash_undefweak)
2894                         {
2895                           if (! bfd_link_pic (info))
2896                             continue;
2897                         }
2898                       else if (hh->eh.root.type == bfd_link_hash_undefined)
2899                         {
2900                           if (! (info->unresolved_syms_in_objects == RM_IGNORE
2901                                  && (ELF_ST_VISIBILITY (hh->eh.other)
2902                                      == STV_DEFAULT)
2903                                  && hh->eh.type != STT_PARISC_MILLI))
2904                             continue;
2905                         }
2906                       else
2907                         {
2908                           bfd_set_error (bfd_error_bad_value);
2909                           goto error_ret_free_internal;
2910                         }
2911                     }
2912
2913                   /* Determine what (if any) linker stub is needed.  */
2914                   stub_type = hppa_type_of_stub (section, irela, hh,
2915                                                  destination, info);
2916                   if (stub_type == hppa_stub_none)
2917                     continue;
2918
2919                   /* Support for grouping stub sections.  */
2920                   id_sec = htab->stub_group[section->id].link_sec;
2921
2922                   /* Get the name of this stub.  */
2923                   stub_name = hppa_stub_name (id_sec, sym_sec, hh, irela);
2924                   if (!stub_name)
2925                     goto error_ret_free_internal;
2926
2927                   hsh = hppa_stub_hash_lookup (&htab->bstab,
2928                                                       stub_name,
2929                                                       FALSE, FALSE);
2930                   if (hsh != NULL)
2931                     {
2932                       /* The proper stub has already been created.  */
2933                       free (stub_name);
2934                       continue;
2935                     }
2936
2937                   hsh = hppa_add_stub (stub_name, section, htab);
2938                   if (hsh == NULL)
2939                     {
2940                       free (stub_name);
2941                       goto error_ret_free_internal;
2942                     }
2943
2944                   hsh->target_value = sym_value;
2945                   hsh->target_section = sym_sec;
2946                   hsh->stub_type = stub_type;
2947                   if (bfd_link_pic (info))
2948                     {
2949                       if (stub_type == hppa_stub_import)
2950                         hsh->stub_type = hppa_stub_import_shared;
2951                       else if (stub_type == hppa_stub_long_branch)
2952                         hsh->stub_type = hppa_stub_long_branch_shared;
2953                     }
2954                   hsh->hh = hh;
2955                   stub_changed = TRUE;
2956                 }
2957
2958               /* We're done with the internal relocs, free them.  */
2959               if (elf_section_data (section)->relocs == NULL)
2960                 free (internal_relocs);
2961             }
2962         }
2963
2964       if (!stub_changed)
2965         break;
2966
2967       /* OK, we've added some stubs.  Find out the new size of the
2968          stub sections.  */
2969       for (stub_sec = htab->stub_bfd->sections;
2970            stub_sec != NULL;
2971            stub_sec = stub_sec->next)
2972         if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
2973           stub_sec->size = 0;
2974
2975       bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
2976
2977       /* Ask the linker to do its stuff.  */
2978       (*htab->layout_sections_again) ();
2979       stub_changed = FALSE;
2980     }
2981
2982   free (htab->all_local_syms);
2983   return TRUE;
2984
2985  error_ret_free_local:
2986   free (htab->all_local_syms);
2987   return FALSE;
2988 }
2989
2990 /* For a final link, this function is called after we have sized the
2991    stubs to provide a value for __gp.  */
2992
2993 bfd_boolean
2994 elf32_hppa_set_gp (bfd *abfd, struct bfd_link_info *info)
2995 {
2996   struct bfd_link_hash_entry *h;
2997   asection *sec = NULL;
2998   bfd_vma gp_val = 0;
2999
3000   h = bfd_link_hash_lookup (info->hash, "$global$", FALSE, FALSE, FALSE);
3001
3002   if (h != NULL
3003       && (h->type == bfd_link_hash_defined
3004           || h->type == bfd_link_hash_defweak))
3005     {
3006       gp_val = h->u.def.value;
3007       sec = h->u.def.section;
3008     }
3009   else
3010     {
3011       asection *splt = bfd_get_section_by_name (abfd, ".plt");
3012       asection *sgot = bfd_get_section_by_name (abfd, ".got");
3013
3014       /* Choose to point our LTP at, in this order, one of .plt, .got,
3015          or .data, if these sections exist.  In the case of choosing
3016          .plt try to make the LTP ideal for addressing anywhere in the
3017          .plt or .got with a 14 bit signed offset.  Typically, the end
3018          of the .plt is the start of the .got, so choose .plt + 0x2000
3019          if either the .plt or .got is larger than 0x2000.  If both
3020          the .plt and .got are smaller than 0x2000, choose the end of
3021          the .plt section.  */
3022       sec = strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0
3023           ? NULL : splt;
3024       if (sec != NULL)
3025         {
3026           gp_val = sec->size;
3027           if (gp_val > 0x2000 || (sgot && sgot->size > 0x2000))
3028             {
3029               gp_val = 0x2000;
3030             }
3031         }
3032       else
3033         {
3034           sec = sgot;
3035           if (sec != NULL)
3036             {
3037               if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") != 0)
3038                 {
3039                   /* We know we don't have a .plt.  If .got is large,
3040                      offset our LTP.  */
3041                   if (sec->size > 0x2000)
3042                     gp_val = 0x2000;
3043                 }
3044             }
3045           else
3046             {
3047               /* No .plt or .got.  Who cares what the LTP is?  */
3048               sec = bfd_get_section_by_name (abfd, ".data");
3049             }
3050         }
3051
3052       if (h != NULL)
3053         {
3054           h->type = bfd_link_hash_defined;
3055           h->u.def.value = gp_val;
3056           if (sec != NULL)
3057             h->u.def.section = sec;
3058           else
3059             h->u.def.section = bfd_abs_section_ptr;
3060         }
3061     }
3062
3063   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
3064     {
3065       if (sec != NULL && sec->output_section != NULL)
3066         gp_val += sec->output_section->vma + sec->output_offset;
3067
3068       elf_gp (abfd) = gp_val;
3069     }
3070   return TRUE;
3071 }
3072
3073 /* Build all the stubs associated with the current output file.  The
3074    stubs are kept in a hash table attached to the main linker hash
3075    table.  We also set up the .plt entries for statically linked PIC
3076    functions here.  This function is called via hppaelf_finish in the
3077    linker.  */
3078
3079 bfd_boolean
3080 elf32_hppa_build_stubs (struct bfd_link_info *info)
3081 {
3082   asection *stub_sec;
3083   struct bfd_hash_table *table;
3084   struct elf32_hppa_link_hash_table *htab;
3085
3086   htab = hppa_link_hash_table (info);
3087   if (htab == NULL)
3088     return FALSE;
3089
3090   for (stub_sec = htab->stub_bfd->sections;
3091        stub_sec != NULL;
3092        stub_sec = stub_sec->next)
3093     if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
3094         && stub_sec->size != 0)
3095       {
3096         /* Allocate memory to hold the linker stubs.  */
3097         stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
3098         if (stub_sec->contents == NULL)
3099           return FALSE;
3100         stub_sec->size = 0;
3101       }
3102
3103   /* Build the stubs as directed by the stub hash table.  */
3104   table = &htab->bstab;
3105   bfd_hash_traverse (table, hppa_build_one_stub, info);
3106
3107   return TRUE;
3108 }
3109
3110 /* Return the base vma address which should be subtracted from the real
3111    address when resolving a dtpoff relocation.
3112    This is PT_TLS segment p_vaddr.  */
3113
3114 static bfd_vma
3115 dtpoff_base (struct bfd_link_info *info)
3116 {
3117   /* If tls_sec is NULL, we should have signalled an error already.  */
3118   if (elf_hash_table (info)->tls_sec == NULL)
3119     return 0;
3120   return elf_hash_table (info)->tls_sec->vma;
3121 }
3122
3123 /* Return the relocation value for R_PARISC_TLS_TPOFF*..  */
3124
3125 static bfd_vma
3126 tpoff (struct bfd_link_info *info, bfd_vma address)
3127 {
3128   struct elf_link_hash_table *htab = elf_hash_table (info);
3129
3130   /* If tls_sec is NULL, we should have signalled an error already.  */
3131   if (htab->tls_sec == NULL)
3132     return 0;
3133   /* hppa TLS ABI is variant I and static TLS block start just after
3134      tcbhead structure which has 2 pointer fields.  */
3135   return (address - htab->tls_sec->vma
3136           + align_power ((bfd_vma) 8, htab->tls_sec->alignment_power));
3137 }
3138
3139 /* Perform a final link.  */
3140
3141 static bfd_boolean
3142 elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
3143 {
3144   struct stat buf;
3145
3146   /* Invoke the regular ELF linker to do all the work.  */
3147   if (!bfd_elf_final_link (abfd, info))
3148     return FALSE;
3149
3150   /* If we're producing a final executable, sort the contents of the
3151      unwind section.  */
3152   if (bfd_link_relocatable (info))
3153     return TRUE;
3154
3155   /* Do not attempt to sort non-regular files.  This is here
3156      especially for configure scripts and kernel builds which run
3157      tests with "ld [...] -o /dev/null".  */
3158   if (stat (abfd->filename, &buf) != 0
3159       || !S_ISREG(buf.st_mode))
3160     return TRUE;
3161
3162   return elf_hppa_sort_unwind (abfd);
3163 }
3164
3165 /* Record the lowest address for the data and text segments.  */
3166
3167 static void
3168 hppa_record_segment_addr (bfd *abfd, asection *section, void *data)
3169 {
3170   struct elf32_hppa_link_hash_table *htab;
3171
3172   htab = (struct elf32_hppa_link_hash_table*) data;
3173   if (htab == NULL)
3174     return;
3175
3176   if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3177     {
3178       bfd_vma value;
3179       Elf_Internal_Phdr *p;
3180
3181       p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
3182       BFD_ASSERT (p != NULL);
3183       value = p->p_vaddr;
3184
3185       if ((section->flags & SEC_READONLY) != 0)
3186         {
3187           if (value < htab->text_segment_base)
3188             htab->text_segment_base = value;
3189         }
3190       else
3191         {
3192           if (value < htab->data_segment_base)
3193             htab->data_segment_base = value;
3194         }
3195     }
3196 }
3197
3198 /* Perform a relocation as part of a final link.  */
3199
3200 static bfd_reloc_status_type
3201 final_link_relocate (asection *input_section,
3202                      bfd_byte *contents,
3203                      const Elf_Internal_Rela *rela,
3204                      bfd_vma value,
3205                      struct elf32_hppa_link_hash_table *htab,
3206                      asection *sym_sec,
3207                      struct elf32_hppa_link_hash_entry *hh,
3208                      struct bfd_link_info *info)
3209 {
3210   int insn;
3211   unsigned int r_type = ELF32_R_TYPE (rela->r_info);
3212   unsigned int orig_r_type = r_type;
3213   reloc_howto_type *howto = elf_hppa_howto_table + r_type;
3214   int r_format = howto->bitsize;
3215   enum hppa_reloc_field_selector_type_alt r_field;
3216   bfd *input_bfd = input_section->owner;
3217   bfd_vma offset = rela->r_offset;
3218   bfd_vma max_branch_offset = 0;
3219   bfd_byte *hit_data = contents + offset;
3220   bfd_signed_vma addend = rela->r_addend;
3221   bfd_vma location;
3222   struct elf32_hppa_stub_hash_entry *hsh = NULL;
3223   int val;
3224
3225   if (r_type == R_PARISC_NONE)
3226     return bfd_reloc_ok;
3227
3228   insn = bfd_get_32 (input_bfd, hit_data);
3229
3230   /* Find out where we are and where we're going.  */
3231   location = (offset +
3232               input_section->output_offset +
3233               input_section->output_section->vma);
3234
3235   /* If we are not building a shared library, convert DLTIND relocs to
3236      DPREL relocs.  */
3237   if (!bfd_link_pic (info))
3238     {
3239       switch (r_type)
3240         {
3241           case R_PARISC_DLTIND21L:
3242           case R_PARISC_TLS_GD21L:
3243           case R_PARISC_TLS_LDM21L:
3244           case R_PARISC_TLS_IE21L:
3245             r_type = R_PARISC_DPREL21L;
3246             break;
3247
3248           case R_PARISC_DLTIND14R:
3249           case R_PARISC_TLS_GD14R:
3250           case R_PARISC_TLS_LDM14R:
3251           case R_PARISC_TLS_IE14R:
3252             r_type = R_PARISC_DPREL14R;
3253             break;
3254
3255           case R_PARISC_DLTIND14F:
3256             r_type = R_PARISC_DPREL14F;
3257             break;
3258         }
3259     }
3260
3261   switch (r_type)
3262     {
3263     case R_PARISC_PCREL12F:
3264     case R_PARISC_PCREL17F:
3265     case R_PARISC_PCREL22F:
3266       /* If this call should go via the plt, find the import stub in
3267          the stub hash.  */
3268       if (sym_sec == NULL
3269           || sym_sec->output_section == NULL
3270           || (hh != NULL
3271               && hh->eh.plt.offset != (bfd_vma) -1
3272               && hh->eh.dynindx != -1
3273               && !hh->plabel
3274               && (bfd_link_pic (info)
3275                   || !hh->eh.def_regular
3276                   || hh->eh.root.type == bfd_link_hash_defweak)))
3277         {
3278           hsh = hppa_get_stub_entry (input_section, sym_sec,
3279                                             hh, rela, htab);
3280           if (hsh != NULL)
3281             {
3282               value = (hsh->stub_offset
3283                        + hsh->stub_sec->output_offset
3284                        + hsh->stub_sec->output_section->vma);
3285               addend = 0;
3286             }
3287           else if (sym_sec == NULL && hh != NULL
3288                    && hh->eh.root.type == bfd_link_hash_undefweak)
3289             {
3290               /* It's OK if undefined weak.  Calls to undefined weak
3291                  symbols behave as if the "called" function
3292                  immediately returns.  We can thus call to a weak
3293                  function without first checking whether the function
3294                  is defined.  */
3295               value = location;
3296               addend = 8;
3297             }
3298           else
3299             return bfd_reloc_undefined;
3300         }
3301       /* Fall thru.  */
3302
3303     case R_PARISC_PCREL21L:
3304     case R_PARISC_PCREL17C:
3305     case R_PARISC_PCREL17R:
3306     case R_PARISC_PCREL14R:
3307     case R_PARISC_PCREL14F:
3308     case R_PARISC_PCREL32:
3309       /* Make it a pc relative offset.  */
3310       value -= location;
3311       addend -= 8;
3312       break;
3313
3314     case R_PARISC_DPREL21L:
3315     case R_PARISC_DPREL14R:
3316     case R_PARISC_DPREL14F:
3317       /* Convert instructions that use the linkage table pointer (r19) to
3318          instructions that use the global data pointer (dp).  This is the
3319          most efficient way of using PIC code in an incomplete executable,
3320          but the user must follow the standard runtime conventions for
3321          accessing data for this to work.  */
3322       if (orig_r_type != r_type)
3323         {
3324           if (r_type == R_PARISC_DPREL21L)
3325             {
3326               /* GCC sometimes uses a register other than r19 for the
3327                  operation, so we must convert any addil instruction
3328                  that uses this relocation.  */
3329               if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
3330                 insn = ADDIL_DP;
3331               else
3332                 /* We must have a ldil instruction.  It's too hard to find
3333                    and convert the associated add instruction, so issue an
3334                    error.  */
3335                 _bfd_error_handler
3336                   /* xgettext:c-format */
3337                   (_("%pB(%pA+%#" PRIx64 "): %s fixup for insn %#x "
3338                      "is not supported in a non-shared link"),
3339                    input_bfd,
3340                    input_section,
3341                    (uint64_t) offset,
3342                    howto->name,
3343                    insn);
3344             }
3345           else if (r_type == R_PARISC_DPREL14F)
3346             {
3347               /* This must be a format 1 load/store.  Change the base
3348                  register to dp.  */
3349               insn = (insn & 0xfc1ffff) | (27 << 21);
3350             }
3351         }
3352
3353       /* For all the DP relative relocations, we need to examine the symbol's
3354          section.  If it has no section or if it's a code section, then
3355          "data pointer relative" makes no sense.  In that case we don't
3356          adjust the "value", and for 21 bit addil instructions, we change the
3357          source addend register from %dp to %r0.  This situation commonly
3358          arises for undefined weak symbols and when a variable's "constness"
3359          is declared differently from the way the variable is defined.  For
3360          instance: "extern int foo" with foo defined as "const int foo".  */
3361       if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
3362         {
3363           if ((insn & ((0x3f << 26) | (0x1f << 21)))
3364               == (((int) OP_ADDIL << 26) | (27 << 21)))
3365             {
3366               insn &= ~ (0x1f << 21);
3367             }
3368           /* Now try to make things easy for the dynamic linker.  */
3369
3370           break;
3371         }
3372       /* Fall thru.  */
3373
3374     case R_PARISC_DLTIND21L:
3375     case R_PARISC_DLTIND14R:
3376     case R_PARISC_DLTIND14F:
3377     case R_PARISC_TLS_GD21L:
3378     case R_PARISC_TLS_LDM21L:
3379     case R_PARISC_TLS_IE21L:
3380     case R_PARISC_TLS_GD14R:
3381     case R_PARISC_TLS_LDM14R:
3382     case R_PARISC_TLS_IE14R:
3383       value -= elf_gp (input_section->output_section->owner);
3384       break;
3385
3386     case R_PARISC_SEGREL32:
3387       if ((sym_sec->flags & SEC_CODE) != 0)
3388         value -= htab->text_segment_base;
3389       else
3390         value -= htab->data_segment_base;
3391       break;
3392
3393     default:
3394       break;
3395     }
3396
3397   switch (r_type)
3398     {
3399     case R_PARISC_DIR32:
3400     case R_PARISC_DIR14F:
3401     case R_PARISC_DIR17F:
3402     case R_PARISC_PCREL17C:
3403     case R_PARISC_PCREL14F:
3404     case R_PARISC_PCREL32:
3405     case R_PARISC_DPREL14F:
3406     case R_PARISC_PLABEL32:
3407     case R_PARISC_DLTIND14F:
3408     case R_PARISC_SEGBASE:
3409     case R_PARISC_SEGREL32:
3410     case R_PARISC_TLS_DTPMOD32:
3411     case R_PARISC_TLS_DTPOFF32:
3412     case R_PARISC_TLS_TPREL32:
3413       r_field = e_fsel;
3414       break;
3415
3416     case R_PARISC_DLTIND21L:
3417     case R_PARISC_PCREL21L:
3418     case R_PARISC_PLABEL21L:
3419       r_field = e_lsel;
3420       break;
3421
3422     case R_PARISC_DIR21L:
3423     case R_PARISC_DPREL21L:
3424     case R_PARISC_TLS_GD21L:
3425     case R_PARISC_TLS_LDM21L:
3426     case R_PARISC_TLS_LDO21L:
3427     case R_PARISC_TLS_IE21L:
3428     case R_PARISC_TLS_LE21L:
3429       r_field = e_lrsel;
3430       break;
3431
3432     case R_PARISC_PCREL17R:
3433     case R_PARISC_PCREL14R:
3434     case R_PARISC_PLABEL14R:
3435     case R_PARISC_DLTIND14R:
3436       r_field = e_rsel;
3437       break;
3438
3439     case R_PARISC_DIR17R:
3440     case R_PARISC_DIR14R:
3441     case R_PARISC_DPREL14R:
3442     case R_PARISC_TLS_GD14R:
3443     case R_PARISC_TLS_LDM14R:
3444     case R_PARISC_TLS_LDO14R:
3445     case R_PARISC_TLS_IE14R:
3446     case R_PARISC_TLS_LE14R:
3447       r_field = e_rrsel;
3448       break;
3449
3450     case R_PARISC_PCREL12F:
3451     case R_PARISC_PCREL17F:
3452     case R_PARISC_PCREL22F:
3453       r_field = e_fsel;
3454
3455       if (r_type == (unsigned int) R_PARISC_PCREL17F)
3456         {
3457           max_branch_offset = (1 << (17-1)) << 2;
3458         }
3459       else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3460         {
3461           max_branch_offset = (1 << (12-1)) << 2;
3462         }
3463       else
3464         {
3465           max_branch_offset = (1 << (22-1)) << 2;
3466         }
3467
3468       /* sym_sec is NULL on undefined weak syms or when shared on
3469          undefined syms.  We've already checked for a stub for the
3470          shared undefined case.  */
3471       if (sym_sec == NULL)
3472         break;
3473
3474       /* If the branch is out of reach, then redirect the
3475          call to the local stub for this function.  */
3476       if (value + addend + max_branch_offset >= 2*max_branch_offset)
3477         {
3478           hsh = hppa_get_stub_entry (input_section, sym_sec,
3479                                             hh, rela, htab);
3480           if (hsh == NULL)
3481             return bfd_reloc_undefined;
3482
3483           /* Munge up the value and addend so that we call the stub
3484              rather than the procedure directly.  */
3485           value = (hsh->stub_offset
3486                    + hsh->stub_sec->output_offset
3487                    + hsh->stub_sec->output_section->vma
3488                    - location);
3489           addend = -8;
3490         }
3491       break;
3492
3493     /* Something we don't know how to handle.  */
3494     default:
3495       return bfd_reloc_notsupported;
3496     }
3497
3498   /* Make sure we can reach the stub.  */
3499   if (max_branch_offset != 0
3500       && value + addend + max_branch_offset >= 2*max_branch_offset)
3501     {
3502       _bfd_error_handler
3503         /* xgettext:c-format */
3504         (_("%pB(%pA+%#" PRIx64 "): cannot reach %s, "
3505            "recompile with -ffunction-sections"),
3506          input_bfd,
3507          input_section,
3508          (uint64_t) offset,
3509          hsh->bh_root.string);
3510       bfd_set_error (bfd_error_bad_value);
3511       return bfd_reloc_notsupported;
3512     }
3513
3514   val = hppa_field_adjust (value, addend, r_field);
3515
3516   switch (r_type)
3517     {
3518     case R_PARISC_PCREL12F:
3519     case R_PARISC_PCREL17C:
3520     case R_PARISC_PCREL17F:
3521     case R_PARISC_PCREL17R:
3522     case R_PARISC_PCREL22F:
3523     case R_PARISC_DIR17F:
3524     case R_PARISC_DIR17R:
3525       /* This is a branch.  Divide the offset by four.
3526          Note that we need to decide whether it's a branch or
3527          otherwise by inspecting the reloc.  Inspecting insn won't
3528          work as insn might be from a .word directive.  */
3529       val >>= 2;
3530       break;
3531
3532     default:
3533       break;
3534     }
3535
3536   insn = hppa_rebuild_insn (insn, val, r_format);
3537
3538   /* Update the instruction word.  */
3539   bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3540   return bfd_reloc_ok;
3541 }
3542
3543 /* Relocate an HPPA ELF section.  */
3544
3545 static bfd_boolean
3546 elf32_hppa_relocate_section (bfd *output_bfd,
3547                              struct bfd_link_info *info,
3548                              bfd *input_bfd,
3549                              asection *input_section,
3550                              bfd_byte *contents,
3551                              Elf_Internal_Rela *relocs,
3552                              Elf_Internal_Sym *local_syms,
3553                              asection **local_sections)
3554 {
3555   bfd_vma *local_got_offsets;
3556   struct elf32_hppa_link_hash_table *htab;
3557   Elf_Internal_Shdr *symtab_hdr;
3558   Elf_Internal_Rela *rela;
3559   Elf_Internal_Rela *relend;
3560
3561   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3562
3563   htab = hppa_link_hash_table (info);
3564   if (htab == NULL)
3565     return FALSE;
3566
3567   local_got_offsets = elf_local_got_offsets (input_bfd);
3568
3569   rela = relocs;
3570   relend = relocs + input_section->reloc_count;
3571   for (; rela < relend; rela++)
3572     {
3573       unsigned int r_type;
3574       reloc_howto_type *howto;
3575       unsigned int r_symndx;
3576       struct elf32_hppa_link_hash_entry *hh;
3577       Elf_Internal_Sym *sym;
3578       asection *sym_sec;
3579       bfd_vma relocation;
3580       bfd_reloc_status_type rstatus;
3581       const char *sym_name;
3582       bfd_boolean plabel;
3583       bfd_boolean warned_undef;
3584
3585       r_type = ELF32_R_TYPE (rela->r_info);
3586       if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3587         {
3588           bfd_set_error (bfd_error_bad_value);
3589           return FALSE;
3590         }
3591       if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3592           || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3593         continue;
3594
3595       r_symndx = ELF32_R_SYM (rela->r_info);
3596       hh = NULL;
3597       sym = NULL;
3598       sym_sec = NULL;
3599       warned_undef = FALSE;
3600       if (r_symndx < symtab_hdr->sh_info)
3601         {
3602           /* This is a local symbol, h defaults to NULL.  */
3603           sym = local_syms + r_symndx;
3604           sym_sec = local_sections[r_symndx];
3605           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rela);
3606         }
3607       else
3608         {
3609           struct elf_link_hash_entry *eh;
3610           bfd_boolean unresolved_reloc, ignored;
3611           struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3612
3613           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
3614                                    r_symndx, symtab_hdr, sym_hashes,
3615                                    eh, sym_sec, relocation,
3616                                    unresolved_reloc, warned_undef,
3617                                    ignored);
3618
3619           if (!bfd_link_relocatable (info)
3620               && relocation == 0
3621               && eh->root.type != bfd_link_hash_defined
3622               && eh->root.type != bfd_link_hash_defweak
3623               && eh->root.type != bfd_link_hash_undefweak)
3624             {
3625               if (info->unresolved_syms_in_objects == RM_IGNORE
3626                   && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3627                   && eh->type == STT_PARISC_MILLI)
3628                 {
3629                   (*info->callbacks->undefined_symbol)
3630                     (info, eh_name (eh), input_bfd,
3631                      input_section, rela->r_offset, FALSE);
3632                   warned_undef = TRUE;
3633                 }
3634             }
3635           hh = hppa_elf_hash_entry (eh);
3636         }
3637
3638       if (sym_sec != NULL && discarded_section (sym_sec))
3639         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3640                                          rela, 1, relend,
3641                                          elf_hppa_howto_table + r_type, 0,
3642                                          contents);
3643
3644       if (bfd_link_relocatable (info))
3645         continue;
3646
3647       /* Do any required modifications to the relocation value, and
3648          determine what types of dynamic info we need to output, if
3649          any.  */
3650       plabel = 0;
3651       switch (r_type)
3652         {
3653         case R_PARISC_DLTIND14F:
3654         case R_PARISC_DLTIND14R:
3655         case R_PARISC_DLTIND21L:
3656           {
3657             bfd_vma off;
3658             bfd_boolean do_got = FALSE;
3659             bfd_boolean reloc = bfd_link_pic (info);
3660
3661             /* Relocation is to the entry for this symbol in the
3662                global offset table.  */
3663             if (hh != NULL)
3664               {
3665                 bfd_boolean dyn;
3666
3667                 off = hh->eh.got.offset;
3668                 dyn = htab->etab.dynamic_sections_created;
3669                 reloc = (!UNDEFWEAK_NO_DYNAMIC_RELOC (info, &hh->eh)
3670                          && (reloc
3671                              || (hh->eh.dynindx != -1
3672                                  && !SYMBOL_REFERENCES_LOCAL (info, &hh->eh))));
3673                 if (!reloc
3674                     || !WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn,
3675                                                          bfd_link_pic (info),
3676                                                          &hh->eh))
3677                   {
3678                     /* If we aren't going to call finish_dynamic_symbol,
3679                        then we need to handle initialisation of the .got
3680                        entry and create needed relocs here.  Since the
3681                        offset must always be a multiple of 4, we use the
3682                        least significant bit to record whether we have
3683                        initialised it already.  */
3684                     if ((off & 1) != 0)
3685                       off &= ~1;
3686                     else
3687                       {
3688                         hh->eh.got.offset |= 1;
3689                         do_got = TRUE;
3690                       }
3691                   }
3692               }
3693             else
3694               {
3695                 /* Local symbol case.  */
3696                 if (local_got_offsets == NULL)
3697                   abort ();
3698
3699                 off = local_got_offsets[r_symndx];
3700
3701                 /* The offset must always be a multiple of 4.  We use
3702                    the least significant bit to record whether we have
3703                    already generated the necessary reloc.  */
3704                 if ((off & 1) != 0)
3705                   off &= ~1;
3706                 else
3707                   {
3708                     local_got_offsets[r_symndx] |= 1;
3709                     do_got = TRUE;
3710                   }
3711               }
3712
3713             if (do_got)
3714               {
3715                 if (reloc)
3716                   {
3717                     /* Output a dynamic relocation for this GOT entry.
3718                        In this case it is relative to the base of the
3719                        object because the symbol index is zero.  */
3720                     Elf_Internal_Rela outrel;
3721                     bfd_byte *loc;
3722                     asection *sec = htab->etab.srelgot;
3723
3724                     outrel.r_offset = (off
3725                                        + htab->etab.sgot->output_offset
3726                                        + htab->etab.sgot->output_section->vma);
3727                     outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
3728                     outrel.r_addend = relocation;
3729                     loc = sec->contents;
3730                     loc += sec->reloc_count++ * sizeof (Elf32_External_Rela);
3731                     bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3732                   }
3733                 else
3734                   bfd_put_32 (output_bfd, relocation,
3735                               htab->etab.sgot->contents + off);
3736               }
3737
3738             if (off >= (bfd_vma) -2)
3739               abort ();
3740
3741             /* Add the base of the GOT to the relocation value.  */
3742             relocation = (off
3743                           + htab->etab.sgot->output_offset
3744                           + htab->etab.sgot->output_section->vma);
3745           }
3746           break;
3747
3748         case R_PARISC_SEGREL32:
3749           /* If this is the first SEGREL relocation, then initialize
3750              the segment base values.  */
3751           if (htab->text_segment_base == (bfd_vma) -1)
3752             bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
3753           break;
3754
3755         case R_PARISC_PLABEL14R:
3756         case R_PARISC_PLABEL21L:
3757         case R_PARISC_PLABEL32:
3758           if (htab->etab.dynamic_sections_created)
3759             {
3760               bfd_vma off;
3761               bfd_boolean do_plt = 0;
3762               /* If we have a global symbol with a PLT slot, then
3763                  redirect this relocation to it.  */
3764               if (hh != NULL)
3765                 {
3766                   off = hh->eh.plt.offset;
3767                   if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1,
3768                                                          bfd_link_pic (info),
3769                                                          &hh->eh))
3770                     {
3771                       /* In a non-shared link, adjust_dynamic_symbol
3772                          isn't called for symbols forced local.  We
3773                          need to write out the plt entry here.  */
3774                       if ((off & 1) != 0)
3775                         off &= ~1;
3776                       else
3777                         {
3778                           hh->eh.plt.offset |= 1;
3779                           do_plt = 1;
3780                         }
3781                     }
3782                 }
3783               else
3784                 {
3785                   bfd_vma *local_plt_offsets;
3786
3787                   if (local_got_offsets == NULL)
3788                     abort ();
3789
3790                   local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3791                   off = local_plt_offsets[r_symndx];
3792
3793                   /* As for the local .got entry case, we use the last
3794                      bit to record whether we've already initialised
3795                      this local .plt entry.  */
3796                   if ((off & 1) != 0)
3797                     off &= ~1;
3798                   else
3799                     {
3800                       local_plt_offsets[r_symndx] |= 1;
3801                       do_plt = 1;
3802                     }
3803                 }
3804
3805               if (do_plt)
3806                 {
3807                   if (bfd_link_pic (info))
3808                     {
3809                       /* Output a dynamic IPLT relocation for this
3810                          PLT entry.  */
3811                       Elf_Internal_Rela outrel;
3812                       bfd_byte *loc;
3813                       asection *s = htab->etab.srelplt;
3814
3815                       outrel.r_offset = (off
3816                                          + htab->etab.splt->output_offset
3817                                          + htab->etab.splt->output_section->vma);
3818                       outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3819                       outrel.r_addend = relocation;
3820                       loc = s->contents;
3821                       loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
3822                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3823                     }
3824                   else
3825                     {
3826                       bfd_put_32 (output_bfd,
3827                                   relocation,
3828                                   htab->etab.splt->contents + off);
3829                       bfd_put_32 (output_bfd,
3830                                   elf_gp (htab->etab.splt->output_section->owner),
3831                                   htab->etab.splt->contents + off + 4);
3832                     }
3833                 }
3834
3835               if (off >= (bfd_vma) -2)
3836                 abort ();
3837
3838               /* PLABELs contain function pointers.  Relocation is to
3839                  the entry for the function in the .plt.  The magic +2
3840                  offset signals to $$dyncall that the function pointer
3841                  is in the .plt and thus has a gp pointer too.
3842                  Exception:  Undefined PLABELs should have a value of
3843                  zero.  */
3844               if (hh == NULL
3845                   || (hh->eh.root.type != bfd_link_hash_undefweak
3846                       && hh->eh.root.type != bfd_link_hash_undefined))
3847                 {
3848                   relocation = (off
3849                                 + htab->etab.splt->output_offset
3850                                 + htab->etab.splt->output_section->vma
3851                                 + 2);
3852                 }
3853               plabel = 1;
3854             }
3855           /* Fall through.  */
3856
3857         case R_PARISC_DIR17F:
3858         case R_PARISC_DIR17R:
3859         case R_PARISC_DIR14F:
3860         case R_PARISC_DIR14R:
3861         case R_PARISC_DIR21L:
3862         case R_PARISC_DPREL14F:
3863         case R_PARISC_DPREL14R:
3864         case R_PARISC_DPREL21L:
3865         case R_PARISC_DIR32:
3866           if ((input_section->flags & SEC_ALLOC) == 0)
3867             break;
3868
3869           if (bfd_link_pic (info)
3870               ? ((hh == NULL
3871                   || hh->dyn_relocs != NULL)
3872                  && ((hh != NULL && pc_dynrelocs (hh))
3873                      || IS_ABSOLUTE_RELOC (r_type)))
3874               : (hh != NULL
3875                  && hh->dyn_relocs != NULL))
3876             {
3877               Elf_Internal_Rela outrel;
3878               bfd_boolean skip;
3879               asection *sreloc;
3880               bfd_byte *loc;
3881
3882               /* When generating a shared object, these relocations
3883                  are copied into the output file to be resolved at run
3884                  time.  */
3885
3886               outrel.r_addend = rela->r_addend;
3887               outrel.r_offset =
3888                 _bfd_elf_section_offset (output_bfd, info, input_section,
3889                                          rela->r_offset);
3890               skip = (outrel.r_offset == (bfd_vma) -1
3891                       || outrel.r_offset == (bfd_vma) -2);
3892               outrel.r_offset += (input_section->output_offset
3893                                   + input_section->output_section->vma);
3894
3895               if (skip)
3896                 {
3897                   memset (&outrel, 0, sizeof (outrel));
3898                 }
3899               else if (hh != NULL
3900                        && hh->eh.dynindx != -1
3901                        && (plabel
3902                            || !IS_ABSOLUTE_RELOC (r_type)
3903                            || !bfd_link_pic (info)
3904                            || !SYMBOLIC_BIND (info, &hh->eh)
3905                            || !hh->eh.def_regular))
3906                 {
3907                   outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
3908                 }
3909               else /* It's a local symbol, or one marked to become local.  */
3910                 {
3911                   int indx = 0;
3912
3913                   /* Add the absolute offset of the symbol.  */
3914                   outrel.r_addend += relocation;
3915
3916                   /* Global plabels need to be processed by the
3917                      dynamic linker so that functions have at most one
3918                      fptr.  For this reason, we need to differentiate
3919                      between global and local plabels, which we do by
3920                      providing the function symbol for a global plabel
3921                      reloc, and no symbol for local plabels.  */
3922                   if (! plabel
3923                       && sym_sec != NULL
3924                       && sym_sec->output_section != NULL
3925                       && ! bfd_is_abs_section (sym_sec))
3926                     {
3927                       asection *osec;
3928
3929                       osec = sym_sec->output_section;
3930                       indx = elf_section_data (osec)->dynindx;
3931                       if (indx == 0)
3932                         {
3933                           osec = htab->etab.text_index_section;
3934                           indx = elf_section_data (osec)->dynindx;
3935                         }
3936                       BFD_ASSERT (indx != 0);
3937
3938                       /* We are turning this relocation into one
3939                          against a section symbol, so subtract out the
3940                          output section's address but not the offset
3941                          of the input section in the output section.  */
3942                       outrel.r_addend -= osec->vma;
3943                     }
3944
3945                   outrel.r_info = ELF32_R_INFO (indx, r_type);
3946                 }
3947               sreloc = elf_section_data (input_section)->sreloc;
3948               if (sreloc == NULL)
3949                 abort ();
3950
3951               loc = sreloc->contents;
3952               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
3953               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3954             }
3955           break;
3956
3957         case R_PARISC_TLS_LDM21L:
3958         case R_PARISC_TLS_LDM14R:
3959           {
3960             bfd_vma off;
3961
3962             off = htab->tls_ldm_got.offset;
3963             if (off & 1)
3964               off &= ~1;
3965             else
3966               {
3967                 Elf_Internal_Rela outrel;
3968                 bfd_byte *loc;
3969
3970                 outrel.r_offset = (off
3971                                    + htab->etab.sgot->output_section->vma
3972                                    + htab->etab.sgot->output_offset);
3973                 outrel.r_addend = 0;
3974                 outrel.r_info = ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32);
3975                 loc = htab->etab.srelgot->contents;
3976                 loc += htab->etab.srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
3977
3978                 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3979                 htab->tls_ldm_got.offset |= 1;
3980               }
3981
3982             /* Add the base of the GOT to the relocation value.  */
3983             relocation = (off
3984                           + htab->etab.sgot->output_offset
3985                           + htab->etab.sgot->output_section->vma);
3986
3987             break;
3988           }
3989
3990         case R_PARISC_TLS_LDO21L:
3991         case R_PARISC_TLS_LDO14R:
3992           relocation -= dtpoff_base (info);
3993           break;
3994
3995         case R_PARISC_TLS_GD21L:
3996         case R_PARISC_TLS_GD14R:
3997         case R_PARISC_TLS_IE21L:
3998         case R_PARISC_TLS_IE14R:
3999           {
4000             bfd_vma off;
4001             int indx;
4002             char tls_type;
4003
4004             indx = 0;
4005             if (hh != NULL)
4006               {
4007                 if (!htab->etab.dynamic_sections_created
4008                     || hh->eh.dynindx == -1
4009                     || SYMBOL_REFERENCES_LOCAL (info, &hh->eh)
4010                     || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &hh->eh))
4011                   /* This is actually a static link, or it is a
4012                      -Bsymbolic link and the symbol is defined
4013                      locally, or the symbol was forced to be local
4014                      because of a version file.  */
4015                   ;
4016                 else
4017                   indx = hh->eh.dynindx;
4018                 off = hh->eh.got.offset;
4019                 tls_type = hh->tls_type;
4020               }
4021             else
4022               {
4023                 off = local_got_offsets[r_symndx];
4024                 tls_type = hppa_elf_local_got_tls_type (input_bfd)[r_symndx];
4025               }
4026
4027             if (tls_type == GOT_UNKNOWN)
4028               abort ();
4029
4030             if ((off & 1) != 0)
4031               off &= ~1;
4032             else
4033               {
4034                 bfd_boolean need_relocs = FALSE;
4035                 Elf_Internal_Rela outrel;
4036                 bfd_byte *loc = NULL;
4037                 int cur_off = off;
4038
4039                 /* The GOT entries have not been initialized yet.  Do it
4040                    now, and emit any relocations.  If both an IE GOT and a
4041                    GD GOT are necessary, we emit the GD first.  */
4042
4043                 if (indx != 0
4044                     || (bfd_link_pic (info)
4045                         && (hh == NULL
4046                             || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &hh->eh))))
4047                   {
4048                     need_relocs = TRUE;
4049                     loc = htab->etab.srelgot->contents;
4050                     loc += (htab->etab.srelgot->reloc_count
4051                             * sizeof (Elf32_External_Rela));
4052                   }
4053
4054                 if (tls_type & GOT_TLS_GD)
4055                   {
4056                     if (need_relocs)
4057                       {
4058                         outrel.r_offset
4059                           = (cur_off
4060                              + htab->etab.sgot->output_section->vma
4061                              + htab->etab.sgot->output_offset);
4062                         outrel.r_info
4063                           = ELF32_R_INFO (indx, R_PARISC_TLS_DTPMOD32);
4064                         outrel.r_addend = 0;
4065                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4066                         htab->etab.srelgot->reloc_count++;
4067                         loc += sizeof (Elf32_External_Rela);
4068                         outrel.r_info
4069                           = ELF32_R_INFO (indx, R_PARISC_TLS_DTPOFF32);
4070                         outrel.r_offset += 4;
4071                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4072                         htab->etab.srelgot->reloc_count++;
4073                         loc += sizeof (Elf32_External_Rela);
4074                         bfd_put_32 (output_bfd, 0,
4075                                     htab->etab.sgot->contents + cur_off);
4076                         bfd_put_32 (output_bfd, 0,
4077                                     htab->etab.sgot->contents + cur_off + 4);
4078                       }
4079                     else
4080                       {
4081                         /* If we are not emitting relocations for a
4082                            general dynamic reference, then we must be in a
4083                            static link or an executable link with the
4084                            symbol binding locally.  Mark it as belonging
4085                            to module 1, the executable.  */
4086                         bfd_put_32 (output_bfd, 1,
4087                                     htab->etab.sgot->contents + cur_off);
4088                         bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4089                                     htab->etab.sgot->contents + cur_off + 4);
4090                       }
4091                     cur_off += 8;
4092                   }
4093
4094                 if (tls_type & GOT_TLS_IE)
4095                   {
4096                     if (need_relocs
4097                         && !(bfd_link_executable (info)
4098                              && SYMBOL_REFERENCES_LOCAL (info, &hh->eh)))
4099                       {
4100                         outrel.r_offset
4101                           = (cur_off
4102                              + htab->etab.sgot->output_section->vma
4103                              + htab->etab.sgot->output_offset);
4104                         outrel.r_info = ELF32_R_INFO (indx,
4105                                                       R_PARISC_TLS_TPREL32);
4106                         if (indx == 0)
4107                           outrel.r_addend = relocation - dtpoff_base (info);
4108                         else
4109                           outrel.r_addend = 0;
4110                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4111                         htab->etab.srelgot->reloc_count++;
4112                         loc += sizeof (Elf32_External_Rela);
4113                       }
4114                     else
4115                       bfd_put_32 (output_bfd, tpoff (info, relocation),
4116                                   htab->etab.sgot->contents + cur_off);
4117                     cur_off += 4;
4118                   }
4119
4120                 if (hh != NULL)
4121                   hh->eh.got.offset |= 1;
4122                 else
4123                   local_got_offsets[r_symndx] |= 1;
4124               }
4125
4126             if ((tls_type & GOT_NORMAL) != 0
4127                 && (tls_type & (GOT_TLS_GD | GOT_TLS_LDM | GOT_TLS_IE)) != 0)
4128               {
4129                 if (hh != NULL)
4130                   _bfd_error_handler (_("%s has both normal and TLS relocs"),
4131                                       hh_name (hh));
4132                 else
4133                   {
4134                     Elf_Internal_Sym *isym
4135                       = bfd_sym_from_r_symndx (&htab->sym_cache,
4136                                                input_bfd, r_symndx);
4137                     if (isym == NULL)
4138                       return FALSE;
4139                     sym_name
4140                       = bfd_elf_string_from_elf_section (input_bfd,
4141                                                          symtab_hdr->sh_link,
4142                                                          isym->st_name);
4143                     if (sym_name == NULL)
4144                       return FALSE;
4145                     if (*sym_name == '\0')
4146                       sym_name = bfd_section_name (input_bfd, sym_sec);
4147                     _bfd_error_handler
4148                       (_("%pB:%s has both normal and TLS relocs"),
4149                        input_bfd, sym_name);
4150                   }
4151                 bfd_set_error (bfd_error_bad_value);
4152                 return FALSE;
4153               }
4154
4155             if ((tls_type & GOT_TLS_GD)
4156                 && r_type != R_PARISC_TLS_GD21L
4157                 && r_type != R_PARISC_TLS_GD14R)
4158               off += 2 * GOT_ENTRY_SIZE;
4159
4160             /* Add the base of the GOT to the relocation value.  */
4161             relocation = (off
4162                           + htab->etab.sgot->output_offset
4163                           + htab->etab.sgot->output_section->vma);
4164
4165             break;
4166           }
4167
4168         case R_PARISC_TLS_LE21L:
4169         case R_PARISC_TLS_LE14R:
4170           {
4171             relocation = tpoff (info, relocation);
4172             break;
4173           }
4174           break;
4175
4176         default:
4177           break;
4178         }
4179
4180       rstatus = final_link_relocate (input_section, contents, rela, relocation,
4181                                htab, sym_sec, hh, info);
4182
4183       if (rstatus == bfd_reloc_ok)
4184         continue;
4185
4186       if (hh != NULL)
4187         sym_name = hh_name (hh);
4188       else
4189         {
4190           sym_name = bfd_elf_string_from_elf_section (input_bfd,
4191                                                       symtab_hdr->sh_link,
4192                                                       sym->st_name);
4193           if (sym_name == NULL)
4194             return FALSE;
4195           if (*sym_name == '\0')
4196             sym_name = bfd_section_name (input_bfd, sym_sec);
4197         }
4198
4199       howto = elf_hppa_howto_table + r_type;
4200
4201       if (rstatus == bfd_reloc_undefined || rstatus == bfd_reloc_notsupported)
4202         {
4203           if (rstatus == bfd_reloc_notsupported || !warned_undef)
4204             {
4205               _bfd_error_handler
4206                 /* xgettext:c-format */
4207                 (_("%pB(%pA+%#" PRIx64 "): cannot handle %s for %s"),
4208                  input_bfd,
4209                  input_section,
4210                  (uint64_t) rela->r_offset,
4211                  howto->name,
4212                  sym_name);
4213               bfd_set_error (bfd_error_bad_value);
4214               return FALSE;
4215             }
4216         }
4217       else
4218         (*info->callbacks->reloc_overflow)
4219           (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
4220            (bfd_vma) 0, input_bfd, input_section, rela->r_offset);
4221     }
4222
4223   return TRUE;
4224 }
4225
4226 /* Finish up dynamic symbol handling.  We set the contents of various
4227    dynamic sections here.  */
4228
4229 static bfd_boolean
4230 elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
4231                                   struct bfd_link_info *info,
4232                                   struct elf_link_hash_entry *eh,
4233                                   Elf_Internal_Sym *sym)
4234 {
4235   struct elf32_hppa_link_hash_table *htab;
4236   Elf_Internal_Rela rela;
4237   bfd_byte *loc;
4238
4239   htab = hppa_link_hash_table (info);
4240   if (htab == NULL)
4241     return FALSE;
4242
4243   if (eh->plt.offset != (bfd_vma) -1)
4244     {
4245       bfd_vma value;
4246
4247       if (eh->plt.offset & 1)
4248         abort ();
4249
4250       /* This symbol has an entry in the procedure linkage table.  Set
4251          it up.
4252
4253          The format of a plt entry is
4254          <funcaddr>
4255          <__gp>
4256       */
4257       value = 0;
4258       if (eh->root.type == bfd_link_hash_defined
4259           || eh->root.type == bfd_link_hash_defweak)
4260         {
4261           value = eh->root.u.def.value;
4262           if (eh->root.u.def.section->output_section != NULL)
4263             value += (eh->root.u.def.section->output_offset
4264                       + eh->root.u.def.section->output_section->vma);
4265         }
4266
4267       /* Create a dynamic IPLT relocation for this entry.  */
4268       rela.r_offset = (eh->plt.offset
4269                       + htab->etab.splt->output_offset
4270                       + htab->etab.splt->output_section->vma);
4271       if (eh->dynindx != -1)
4272         {
4273           rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT);
4274           rela.r_addend = 0;
4275         }
4276       else
4277         {
4278           /* This symbol has been marked to become local, and is
4279              used by a plabel so must be kept in the .plt.  */
4280           rela.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
4281           rela.r_addend = value;
4282         }
4283
4284       loc = htab->etab.srelplt->contents;
4285       loc += htab->etab.srelplt->reloc_count++ * sizeof (Elf32_External_Rela);
4286       bfd_elf32_swap_reloca_out (htab->etab.splt->output_section->owner, &rela, loc);
4287
4288       if (!eh->def_regular)
4289         {
4290           /* Mark the symbol as undefined, rather than as defined in
4291              the .plt section.  Leave the value alone.  */
4292           sym->st_shndx = SHN_UNDEF;
4293         }
4294     }
4295
4296   if (eh->got.offset != (bfd_vma) -1
4297       && (hppa_elf_hash_entry (eh)->tls_type & GOT_NORMAL) != 0
4298       && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, eh))
4299     {
4300       bfd_boolean is_dyn = (eh->dynindx != -1
4301                             && !SYMBOL_REFERENCES_LOCAL (info, eh));
4302
4303       if (is_dyn || bfd_link_pic (info))
4304         {
4305           /* This symbol has an entry in the global offset table.  Set
4306              it up.  */
4307
4308           rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
4309                            + htab->etab.sgot->output_offset
4310                            + htab->etab.sgot->output_section->vma);
4311
4312           /* If this is a -Bsymbolic link and the symbol is defined
4313              locally or was forced to be local because of a version
4314              file, we just want to emit a RELATIVE reloc.  The entry
4315              in the global offset table will already have been
4316              initialized in the relocate_section function.  */
4317           if (!is_dyn)
4318             {
4319               rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
4320               rela.r_addend = (eh->root.u.def.value
4321                                + eh->root.u.def.section->output_offset
4322                                + eh->root.u.def.section->output_section->vma);
4323             }
4324           else
4325             {
4326               if ((eh->got.offset & 1) != 0)
4327                 abort ();
4328
4329               bfd_put_32 (output_bfd, 0,
4330                           htab->etab.sgot->contents + (eh->got.offset & ~1));
4331               rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32);
4332               rela.r_addend = 0;
4333             }
4334
4335           loc = htab->etab.srelgot->contents;
4336           loc += (htab->etab.srelgot->reloc_count++
4337                   * sizeof (Elf32_External_Rela));
4338           bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4339         }
4340     }
4341
4342   if (eh->needs_copy)
4343     {
4344       asection *sec;
4345
4346       /* This symbol needs a copy reloc.  Set it up.  */
4347
4348       if (! (eh->dynindx != -1
4349              && (eh->root.type == bfd_link_hash_defined
4350                  || eh->root.type == bfd_link_hash_defweak)))
4351         abort ();
4352
4353       rela.r_offset = (eh->root.u.def.value
4354                       + eh->root.u.def.section->output_offset
4355                       + eh->root.u.def.section->output_section->vma);
4356       rela.r_addend = 0;
4357       rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY);
4358       if (eh->root.u.def.section == htab->etab.sdynrelro)
4359         sec = htab->etab.sreldynrelro;
4360       else
4361         sec = htab->etab.srelbss;
4362       loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela);
4363       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4364     }
4365
4366   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
4367   if (eh == htab->etab.hdynamic || eh == htab->etab.hgot)
4368     {
4369       sym->st_shndx = SHN_ABS;
4370     }
4371
4372   return TRUE;
4373 }
4374
4375 /* Used to decide how to sort relocs in an optimal manner for the
4376    dynamic linker, before writing them out.  */
4377
4378 static enum elf_reloc_type_class
4379 elf32_hppa_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
4380                              const asection *rel_sec ATTRIBUTE_UNUSED,
4381                              const Elf_Internal_Rela *rela)
4382 {
4383   /* Handle TLS relocs first; we don't want them to be marked
4384      relative by the "if (ELF32_R_SYM (rela->r_info) == STN_UNDEF)"
4385      check below.  */
4386   switch ((int) ELF32_R_TYPE (rela->r_info))
4387     {
4388       case R_PARISC_TLS_DTPMOD32:
4389       case R_PARISC_TLS_DTPOFF32:
4390       case R_PARISC_TLS_TPREL32:
4391         return reloc_class_normal;
4392     }
4393
4394   if (ELF32_R_SYM (rela->r_info) == STN_UNDEF)
4395     return reloc_class_relative;
4396
4397   switch ((int) ELF32_R_TYPE (rela->r_info))
4398     {
4399     case R_PARISC_IPLT:
4400       return reloc_class_plt;
4401     case R_PARISC_COPY:
4402       return reloc_class_copy;
4403     default:
4404       return reloc_class_normal;
4405     }
4406 }
4407
4408 /* Finish up the dynamic sections.  */
4409
4410 static bfd_boolean
4411 elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
4412                                     struct bfd_link_info *info)
4413 {
4414   bfd *dynobj;
4415   struct elf32_hppa_link_hash_table *htab;
4416   asection *sdyn;
4417   asection * sgot;
4418
4419   htab = hppa_link_hash_table (info);
4420   if (htab == NULL)
4421     return FALSE;
4422
4423   dynobj = htab->etab.dynobj;
4424
4425   sgot = htab->etab.sgot;
4426   /* A broken linker script might have discarded the dynamic sections.
4427      Catch this here so that we do not seg-fault later on.  */
4428   if (sgot != NULL && bfd_is_abs_section (sgot->output_section))
4429     return FALSE;
4430
4431   sdyn = bfd_get_linker_section (dynobj, ".dynamic");
4432
4433   if (htab->etab.dynamic_sections_created)
4434     {
4435       Elf32_External_Dyn *dyncon, *dynconend;
4436
4437       if (sdyn == NULL)
4438         abort ();
4439
4440       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4441       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4442       for (; dyncon < dynconend; dyncon++)
4443         {
4444           Elf_Internal_Dyn dyn;
4445           asection *s;
4446
4447           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4448
4449           switch (dyn.d_tag)
4450             {
4451             default:
4452               continue;
4453
4454             case DT_PLTGOT:
4455               /* Use PLTGOT to set the GOT register.  */
4456               dyn.d_un.d_ptr = elf_gp (output_bfd);
4457               break;
4458
4459             case DT_JMPREL:
4460               s = htab->etab.srelplt;
4461               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4462               break;
4463
4464             case DT_PLTRELSZ:
4465               s = htab->etab.srelplt;
4466               dyn.d_un.d_val = s->size;
4467               break;
4468             }
4469
4470           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4471         }
4472     }
4473
4474   if (sgot != NULL && sgot->size != 0)
4475     {
4476       /* Fill in the first entry in the global offset table.
4477          We use it to point to our dynamic section, if we have one.  */
4478       bfd_put_32 (output_bfd,
4479                   sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
4480                   sgot->contents);
4481
4482       /* The second entry is reserved for use by the dynamic linker.  */
4483       memset (sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
4484
4485       /* Set .got entry size.  */
4486       elf_section_data (sgot->output_section)
4487         ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
4488     }
4489
4490   if (htab->etab.splt != NULL && htab->etab.splt->size != 0)
4491     {
4492       /* Set plt entry size to 0 instead of PLT_ENTRY_SIZE, since we add the
4493          plt stubs and as such the section does not hold a table of fixed-size
4494          entries.  */
4495       elf_section_data (htab->etab.splt->output_section)->this_hdr.sh_entsize = 0;
4496
4497       if (htab->need_plt_stub)
4498         {
4499           /* Set up the .plt stub.  */
4500           memcpy (htab->etab.splt->contents
4501                   + htab->etab.splt->size - sizeof (plt_stub),
4502                   plt_stub, sizeof (plt_stub));
4503
4504           if ((htab->etab.splt->output_offset
4505                + htab->etab.splt->output_section->vma
4506                + htab->etab.splt->size)
4507               != (sgot->output_offset
4508                   + sgot->output_section->vma))
4509             {
4510               _bfd_error_handler
4511                 (_(".got section not immediately after .plt section"));
4512               return FALSE;
4513             }
4514         }
4515     }
4516
4517   return TRUE;
4518 }
4519
4520 /* Called when writing out an object file to decide the type of a
4521    symbol.  */
4522 static int
4523 elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
4524 {
4525   if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4526     return STT_PARISC_MILLI;
4527   else
4528     return type;
4529 }
4530
4531 /* Misc BFD support code.  */
4532 #define bfd_elf32_bfd_is_local_label_name    elf_hppa_is_local_label_name
4533 #define bfd_elf32_bfd_reloc_type_lookup      elf_hppa_reloc_type_lookup
4534 #define bfd_elf32_bfd_reloc_name_lookup      elf_hppa_reloc_name_lookup
4535 #define elf_info_to_howto                    elf_hppa_info_to_howto
4536 #define elf_info_to_howto_rel                elf_hppa_info_to_howto_rel
4537
4538 /* Stuff for the BFD linker.  */
4539 #define bfd_elf32_bfd_final_link             elf32_hppa_final_link
4540 #define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
4541 #define elf_backend_adjust_dynamic_symbol    elf32_hppa_adjust_dynamic_symbol
4542 #define elf_backend_copy_indirect_symbol     elf32_hppa_copy_indirect_symbol
4543 #define elf_backend_check_relocs             elf32_hppa_check_relocs
4544 #define elf_backend_relocs_compatible        _bfd_elf_relocs_compatible
4545 #define elf_backend_create_dynamic_sections  elf32_hppa_create_dynamic_sections
4546 #define elf_backend_fake_sections            elf_hppa_fake_sections
4547 #define elf_backend_relocate_section         elf32_hppa_relocate_section
4548 #define elf_backend_hide_symbol              elf32_hppa_hide_symbol
4549 #define elf_backend_finish_dynamic_symbol    elf32_hppa_finish_dynamic_symbol
4550 #define elf_backend_finish_dynamic_sections  elf32_hppa_finish_dynamic_sections
4551 #define elf_backend_size_dynamic_sections    elf32_hppa_size_dynamic_sections
4552 #define elf_backend_init_index_section       _bfd_elf_init_1_index_section
4553 #define elf_backend_gc_mark_hook             elf32_hppa_gc_mark_hook
4554 #define elf_backend_grok_prstatus            elf32_hppa_grok_prstatus
4555 #define elf_backend_grok_psinfo              elf32_hppa_grok_psinfo
4556 #define elf_backend_object_p                 elf32_hppa_object_p
4557 #define elf_backend_final_write_processing   elf_hppa_final_write_processing
4558 #define elf_backend_get_symbol_type          elf32_hppa_elf_get_symbol_type
4559 #define elf_backend_reloc_type_class         elf32_hppa_reloc_type_class
4560 #define elf_backend_action_discarded         elf_hppa_action_discarded
4561
4562 #define elf_backend_can_gc_sections          1
4563 #define elf_backend_can_refcount             1
4564 #define elf_backend_plt_alignment            2
4565 #define elf_backend_want_got_plt             0
4566 #define elf_backend_plt_readonly             0
4567 #define elf_backend_want_plt_sym             0
4568 #define elf_backend_got_header_size          8
4569 #define elf_backend_want_dynrelro            1
4570 #define elf_backend_rela_normal              1
4571 #define elf_backend_dtrel_excludes_plt       1
4572 #define elf_backend_no_page_alias            1
4573
4574 #define TARGET_BIG_SYM          hppa_elf32_vec
4575 #define TARGET_BIG_NAME         "elf32-hppa"
4576 #define ELF_ARCH                bfd_arch_hppa
4577 #define ELF_TARGET_ID           HPPA32_ELF_DATA
4578 #define ELF_MACHINE_CODE        EM_PARISC
4579 #define ELF_MAXPAGESIZE         0x1000
4580 #define ELF_OSABI               ELFOSABI_HPUX
4581 #define elf32_bed               elf32_hppa_hpux_bed
4582
4583 #include "elf32-target.h"
4584
4585 #undef TARGET_BIG_SYM
4586 #define TARGET_BIG_SYM          hppa_elf32_linux_vec
4587 #undef TARGET_BIG_NAME
4588 #define TARGET_BIG_NAME         "elf32-hppa-linux"
4589 #undef ELF_OSABI
4590 #define ELF_OSABI               ELFOSABI_GNU
4591 #undef elf32_bed
4592 #define elf32_bed               elf32_hppa_linux_bed
4593
4594 #include "elf32-target.h"
4595
4596 #undef TARGET_BIG_SYM
4597 #define TARGET_BIG_SYM          hppa_elf32_nbsd_vec
4598 #undef TARGET_BIG_NAME
4599 #define TARGET_BIG_NAME         "elf32-hppa-netbsd"
4600 #undef ELF_OSABI
4601 #define ELF_OSABI               ELFOSABI_NETBSD
4602 #undef elf32_bed
4603 #define elf32_bed               elf32_hppa_netbsd_bed
4604
4605 #include "elf32-target.h"