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