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