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