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