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