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