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