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