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