* elf-bfd.h (emum elf_object_id): Rename to elf_target_id. Add
[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   asection *stubreloc;
1164   int tls_type = GOT_UNKNOWN, old_tls_type = GOT_UNKNOWN;
1165
1166   if (info->relocatable)
1167     return TRUE;
1168
1169   htab = hppa_link_hash_table (info);
1170   if (htab == NULL)
1171     return FALSE;
1172   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1173   eh_syms = elf_sym_hashes (abfd);
1174   sreloc = NULL;
1175   stubreloc = NULL;
1176
1177   rela_end = relocs + sec->reloc_count;
1178   for (rela = relocs; rela < rela_end; rela++)
1179     {
1180       enum {
1181         NEED_GOT = 1,
1182         NEED_PLT = 2,
1183         NEED_DYNREL = 4,
1184         PLT_PLABEL = 8
1185       };
1186
1187       unsigned int r_symndx, r_type;
1188       struct elf32_hppa_link_hash_entry *hh;
1189       int need_entry = 0;
1190
1191       r_symndx = ELF32_R_SYM (rela->r_info);
1192
1193       if (r_symndx < symtab_hdr->sh_info)
1194         hh = NULL;
1195       else
1196         {
1197           hh =  hppa_elf_hash_entry (eh_syms[r_symndx - symtab_hdr->sh_info]);
1198           while (hh->eh.root.type == bfd_link_hash_indirect
1199                  || hh->eh.root.type == bfd_link_hash_warning)
1200             hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
1201         }
1202
1203       r_type = ELF32_R_TYPE (rela->r_info);
1204       r_type = elf32_hppa_optimized_tls_reloc (info, r_type, hh == NULL);
1205
1206       switch (r_type)
1207         {
1208         case R_PARISC_DLTIND14F:
1209         case R_PARISC_DLTIND14R:
1210         case R_PARISC_DLTIND21L:
1211           /* This symbol requires a global offset table entry.  */
1212           need_entry = NEED_GOT;
1213           break;
1214
1215         case R_PARISC_PLABEL14R: /* "Official" procedure labels.  */
1216         case R_PARISC_PLABEL21L:
1217         case R_PARISC_PLABEL32:
1218           /* If the addend is non-zero, we break badly.  */
1219           if (rela->r_addend != 0)
1220             abort ();
1221
1222           /* If we are creating a shared library, then we need to
1223              create a PLT entry for all PLABELs, because PLABELs with
1224              local symbols may be passed via a pointer to another
1225              object.  Additionally, output a dynamic relocation
1226              pointing to the PLT entry.
1227
1228              For executables, the original 32-bit ABI allowed two
1229              different styles of PLABELs (function pointers):  For
1230              global functions, the PLABEL word points into the .plt
1231              two bytes past a (function address, gp) pair, and for
1232              local functions the PLABEL points directly at the
1233              function.  The magic +2 for the first type allows us to
1234              differentiate between the two.  As you can imagine, this
1235              is a real pain when it comes to generating code to call
1236              functions indirectly or to compare function pointers.
1237              We avoid the mess by always pointing a PLABEL into the
1238              .plt, even for local functions.  */
1239           need_entry = PLT_PLABEL | NEED_PLT | NEED_DYNREL;
1240           break;
1241
1242         case R_PARISC_PCREL12F:
1243           htab->has_12bit_branch = 1;
1244           goto branch_common;
1245
1246         case R_PARISC_PCREL17C:
1247         case R_PARISC_PCREL17F:
1248           htab->has_17bit_branch = 1;
1249           goto branch_common;
1250
1251         case R_PARISC_PCREL22F:
1252           htab->has_22bit_branch = 1;
1253         branch_common:
1254           /* Function calls might need to go through the .plt, and
1255              might require long branch stubs.  */
1256           if (hh == NULL)
1257             {
1258               /* We know local syms won't need a .plt entry, and if
1259                  they need a long branch stub we can't guarantee that
1260                  we can reach the stub.  So just flag an error later
1261                  if we're doing a shared link and find we need a long
1262                  branch stub.  */
1263               continue;
1264             }
1265           else
1266             {
1267               /* Global symbols will need a .plt entry if they remain
1268                  global, and in most cases won't need a long branch
1269                  stub.  Unfortunately, we have to cater for the case
1270                  where a symbol is forced local by versioning, or due
1271                  to symbolic linking, and we lose the .plt entry.  */
1272               need_entry = NEED_PLT;
1273               if (hh->eh.type == STT_PARISC_MILLI)
1274                 need_entry = 0;
1275             }
1276           break;
1277
1278         case R_PARISC_SEGBASE:  /* Used to set segment base.  */
1279         case R_PARISC_SEGREL32: /* Relative reloc, used for unwind.  */
1280         case R_PARISC_PCREL14F: /* PC relative load/store.  */
1281         case R_PARISC_PCREL14R:
1282         case R_PARISC_PCREL17R: /* External branches.  */
1283         case R_PARISC_PCREL21L: /* As above, and for load/store too.  */
1284         case R_PARISC_PCREL32:
1285           /* We don't need to propagate the relocation if linking a
1286              shared object since these are section relative.  */
1287           continue;
1288
1289         case R_PARISC_DPREL14F: /* Used for gp rel data load/store.  */
1290         case R_PARISC_DPREL14R:
1291         case R_PARISC_DPREL21L:
1292           if (info->shared)
1293             {
1294               (*_bfd_error_handler)
1295                 (_("%B: relocation %s can not be used when making a shared object; recompile with -fPIC"),
1296                  abfd,
1297                  elf_hppa_howto_table[r_type].name);
1298               bfd_set_error (bfd_error_bad_value);
1299               return FALSE;
1300             }
1301           /* Fall through.  */
1302
1303         case R_PARISC_DIR17F: /* Used for external branches.  */
1304         case R_PARISC_DIR17R:
1305         case R_PARISC_DIR14F: /* Used for load/store from absolute locn.  */
1306         case R_PARISC_DIR14R:
1307         case R_PARISC_DIR21L: /* As above, and for ext branches too.  */
1308         case R_PARISC_DIR32: /* .word relocs.  */
1309           /* We may want to output a dynamic relocation later.  */
1310           need_entry = NEED_DYNREL;
1311           break;
1312
1313           /* This relocation describes the C++ object vtable hierarchy.
1314              Reconstruct it for later use during GC.  */
1315         case R_PARISC_GNU_VTINHERIT:
1316           if (!bfd_elf_gc_record_vtinherit (abfd, sec, &hh->eh, rela->r_offset))
1317             return FALSE;
1318           continue;
1319
1320           /* This relocation describes which C++ vtable entries are actually
1321              used.  Record for later use during GC.  */
1322         case R_PARISC_GNU_VTENTRY:
1323           BFD_ASSERT (hh != NULL);
1324           if (hh != NULL
1325               && !bfd_elf_gc_record_vtentry (abfd, sec, &hh->eh, rela->r_addend))
1326             return FALSE;
1327           continue;
1328
1329         case R_PARISC_TLS_GD21L:
1330         case R_PARISC_TLS_GD14R:
1331         case R_PARISC_TLS_LDM21L:
1332         case R_PARISC_TLS_LDM14R:
1333           need_entry = NEED_GOT;
1334           break;
1335
1336         case R_PARISC_TLS_IE21L:
1337         case R_PARISC_TLS_IE14R:
1338           if (info->shared)
1339             info->flags |= DF_STATIC_TLS;
1340           need_entry = NEED_GOT;
1341           break;
1342
1343         default:
1344           continue;
1345         }
1346
1347       /* Now carry out our orders.  */
1348       if (need_entry & NEED_GOT)
1349         {
1350           switch (r_type)
1351             {
1352             default:
1353               tls_type = GOT_NORMAL;
1354               break;
1355             case R_PARISC_TLS_GD21L:
1356             case R_PARISC_TLS_GD14R:
1357               tls_type |= GOT_TLS_GD;
1358               break;
1359             case R_PARISC_TLS_LDM21L:
1360             case R_PARISC_TLS_LDM14R:
1361               tls_type |= GOT_TLS_LDM;
1362               break;
1363             case R_PARISC_TLS_IE21L:
1364             case R_PARISC_TLS_IE14R:
1365               tls_type |= GOT_TLS_IE;
1366               break;
1367             }
1368
1369           /* Allocate space for a GOT entry, as well as a dynamic
1370              relocation for this entry.  */
1371           if (htab->sgot == NULL)
1372             {
1373               if (htab->etab.dynobj == NULL)
1374                 htab->etab.dynobj = abfd;
1375               if (!elf32_hppa_create_dynamic_sections (htab->etab.dynobj, info))
1376                 return FALSE;
1377             }
1378
1379           if (r_type == R_PARISC_TLS_LDM21L
1380               || r_type == R_PARISC_TLS_LDM14R)
1381             htab->tls_ldm_got.refcount += 1;
1382           else
1383             {
1384               if (hh != NULL)
1385                 {
1386                   hh->eh.got.refcount += 1;
1387                   old_tls_type = hh->tls_type;
1388                 }
1389               else
1390                 {
1391                   bfd_signed_vma *local_got_refcounts;
1392                   
1393                   /* This is a global offset table entry for a local symbol.  */
1394                   local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1395                   if (local_got_refcounts == NULL)
1396                     return FALSE;
1397                   local_got_refcounts[r_symndx] += 1;
1398
1399                   old_tls_type = hppa_elf_local_got_tls_type (abfd) [r_symndx];
1400                 }
1401
1402               tls_type |= old_tls_type;
1403
1404               if (old_tls_type != tls_type)
1405                 {
1406                   if (hh != NULL)
1407                     hh->tls_type = tls_type;
1408                   else
1409                     hppa_elf_local_got_tls_type (abfd) [r_symndx] = tls_type;
1410                 }
1411
1412             }
1413         }
1414
1415       if (need_entry & NEED_PLT)
1416         {
1417           /* If we are creating a shared library, and this is a reloc
1418              against a weak symbol or a global symbol in a dynamic
1419              object, then we will be creating an import stub and a
1420              .plt entry for the symbol.  Similarly, on a normal link
1421              to symbols defined in a dynamic object we'll need the
1422              import stub and a .plt entry.  We don't know yet whether
1423              the symbol is defined or not, so make an entry anyway and
1424              clean up later in adjust_dynamic_symbol.  */
1425           if ((sec->flags & SEC_ALLOC) != 0)
1426             {
1427               if (hh != NULL)
1428                 {
1429                   hh->eh.needs_plt = 1;
1430                   hh->eh.plt.refcount += 1;
1431
1432                   /* If this .plt entry is for a plabel, mark it so
1433                      that adjust_dynamic_symbol will keep the entry
1434                      even if it appears to be local.  */
1435                   if (need_entry & PLT_PLABEL)
1436                     hh->plabel = 1;
1437                 }
1438               else if (need_entry & PLT_PLABEL)
1439                 {
1440                   bfd_signed_vma *local_got_refcounts;
1441                   bfd_signed_vma *local_plt_refcounts;
1442
1443                   local_got_refcounts = hppa32_elf_local_refcounts (abfd);
1444                   if (local_got_refcounts == NULL)
1445                     return FALSE;
1446                   local_plt_refcounts = (local_got_refcounts
1447                                          + symtab_hdr->sh_info);
1448                   local_plt_refcounts[r_symndx] += 1;
1449                 }
1450             }
1451         }
1452
1453       if (need_entry & NEED_DYNREL)
1454         {
1455           /* Flag this symbol as having a non-got, non-plt reference
1456              so that we generate copy relocs if it turns out to be
1457              dynamic.  */
1458           if (hh != NULL && !info->shared)
1459             hh->eh.non_got_ref = 1;
1460
1461           /* If we are creating a shared library then we need to copy
1462              the reloc into the shared library.  However, if we are
1463              linking with -Bsymbolic, we need only copy absolute
1464              relocs or relocs against symbols that are not defined in
1465              an object we are including in the link.  PC- or DP- or
1466              DLT-relative relocs against any local sym or global sym
1467              with DEF_REGULAR set, can be discarded.  At this point we
1468              have not seen all the input files, so it is possible that
1469              DEF_REGULAR is not set now but will be set later (it is
1470              never cleared).  We account for that possibility below by
1471              storing information in the dyn_relocs field of the
1472              hash table entry.
1473
1474              A similar situation to the -Bsymbolic case occurs when
1475              creating shared libraries and symbol visibility changes
1476              render the symbol local.
1477
1478              As it turns out, all the relocs we will be creating here
1479              are absolute, so we cannot remove them on -Bsymbolic
1480              links or visibility changes anyway.  A STUB_REL reloc
1481              is absolute too, as in that case it is the reloc in the
1482              stub we will be creating, rather than copying the PCREL
1483              reloc in the branch.
1484
1485              If on the other hand, we are creating an executable, we
1486              may need to keep relocations for symbols satisfied by a
1487              dynamic library if we manage to avoid copy relocs for the
1488              symbol.  */
1489           if ((info->shared
1490                && (sec->flags & SEC_ALLOC) != 0
1491                && (IS_ABSOLUTE_RELOC (r_type)
1492                    || (hh != NULL
1493                        && (!info->symbolic
1494                            || hh->eh.root.type == bfd_link_hash_defweak
1495                            || !hh->eh.def_regular))))
1496               || (ELIMINATE_COPY_RELOCS
1497                   && !info->shared
1498                   && (sec->flags & SEC_ALLOC) != 0
1499                   && hh != NULL
1500                   && (hh->eh.root.type == bfd_link_hash_defweak
1501                       || !hh->eh.def_regular)))
1502             {
1503               struct elf32_hppa_dyn_reloc_entry *hdh_p;
1504               struct elf32_hppa_dyn_reloc_entry **hdh_head;
1505
1506               /* Create a reloc section in dynobj and make room for
1507                  this reloc.  */
1508               if (sreloc == NULL)
1509                 {
1510                   if (htab->etab.dynobj == NULL)
1511                     htab->etab.dynobj = abfd;
1512
1513                   sreloc = _bfd_elf_make_dynamic_reloc_section
1514                     (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE);
1515
1516                   if (sreloc == NULL)
1517                     {
1518                       bfd_set_error (bfd_error_bad_value);
1519                       return FALSE;
1520                     }
1521                 }
1522
1523               /* If this is a global symbol, we count the number of
1524                  relocations we need for this symbol.  */
1525               if (hh != NULL)
1526                 {
1527                   hdh_head = &hh->dyn_relocs;
1528                 }
1529               else
1530                 {
1531                   /* Track dynamic relocs needed for local syms too.
1532                      We really need local syms available to do this
1533                      easily.  Oh well.  */
1534                   asection *sr;
1535                   void *vpp;
1536                   Elf_Internal_Sym *isym;
1537
1538                   isym = bfd_sym_from_r_symndx (&htab->sym_cache,
1539                                                 abfd, r_symndx);
1540                   if (isym == NULL)
1541                     return FALSE;
1542
1543                   sr = bfd_section_from_elf_index (abfd, isym->st_shndx);
1544                   if (sr == NULL)
1545                     sr = sec;
1546
1547                   vpp = &elf_section_data (sr)->local_dynrel;
1548                   hdh_head = (struct elf32_hppa_dyn_reloc_entry **) vpp;
1549                 }
1550
1551               hdh_p = *hdh_head;
1552               if (hdh_p == NULL || hdh_p->sec != sec)
1553                 {
1554                   hdh_p = bfd_alloc (htab->etab.dynobj, sizeof *hdh_p);
1555                   if (hdh_p == NULL)
1556                     return FALSE;
1557                   hdh_p->hdh_next = *hdh_head;
1558                   *hdh_head = hdh_p;
1559                   hdh_p->sec = sec;
1560                   hdh_p->count = 0;
1561 #if RELATIVE_DYNRELOCS
1562                   hdh_p->relative_count = 0;
1563 #endif
1564                 }
1565
1566               hdh_p->count += 1;
1567 #if RELATIVE_DYNRELOCS
1568               if (!IS_ABSOLUTE_RELOC (rtype))
1569                 hdh_p->relative_count += 1;
1570 #endif
1571             }
1572         }
1573     }
1574
1575   return TRUE;
1576 }
1577
1578 /* Return the section that should be marked against garbage collection
1579    for a given relocation.  */
1580
1581 static asection *
1582 elf32_hppa_gc_mark_hook (asection *sec,
1583                          struct bfd_link_info *info,
1584                          Elf_Internal_Rela *rela,
1585                          struct elf_link_hash_entry *hh,
1586                          Elf_Internal_Sym *sym)
1587 {
1588   if (hh != NULL)
1589     switch ((unsigned int) ELF32_R_TYPE (rela->r_info))
1590       {
1591       case R_PARISC_GNU_VTINHERIT:
1592       case R_PARISC_GNU_VTENTRY:
1593         return NULL;
1594       }
1595
1596   return _bfd_elf_gc_mark_hook (sec, info, rela, hh, sym);
1597 }
1598
1599 /* Update the got and plt entry reference counts for the section being
1600    removed.  */
1601
1602 static bfd_boolean
1603 elf32_hppa_gc_sweep_hook (bfd *abfd,
1604                           struct bfd_link_info *info ATTRIBUTE_UNUSED,
1605                           asection *sec,
1606                           const Elf_Internal_Rela *relocs)
1607 {
1608   Elf_Internal_Shdr *symtab_hdr;
1609   struct elf_link_hash_entry **eh_syms;
1610   bfd_signed_vma *local_got_refcounts;
1611   bfd_signed_vma *local_plt_refcounts;
1612   const Elf_Internal_Rela *rela, *relend;
1613   struct elf32_hppa_link_hash_table *htab;
1614
1615   if (info->relocatable)
1616     return TRUE;
1617
1618   htab = hppa_link_hash_table (info);
1619   if (htab == NULL)
1620     return FALSE;
1621
1622   elf_section_data (sec)->local_dynrel = NULL;
1623
1624   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1625   eh_syms = elf_sym_hashes (abfd);
1626   local_got_refcounts = elf_local_got_refcounts (abfd);
1627   local_plt_refcounts = local_got_refcounts;
1628   if (local_plt_refcounts != NULL)
1629     local_plt_refcounts += symtab_hdr->sh_info;
1630
1631   relend = relocs + sec->reloc_count;
1632   for (rela = relocs; rela < relend; rela++)
1633     {
1634       unsigned long r_symndx;
1635       unsigned int r_type;
1636       struct elf_link_hash_entry *eh = NULL;
1637
1638       r_symndx = ELF32_R_SYM (rela->r_info);
1639       if (r_symndx >= symtab_hdr->sh_info)
1640         {
1641           struct elf32_hppa_link_hash_entry *hh;
1642           struct elf32_hppa_dyn_reloc_entry **hdh_pp;
1643           struct elf32_hppa_dyn_reloc_entry *hdh_p;
1644
1645           eh = eh_syms[r_symndx - symtab_hdr->sh_info];
1646           while (eh->root.type == bfd_link_hash_indirect
1647                  || eh->root.type == bfd_link_hash_warning)
1648             eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
1649           hh = hppa_elf_hash_entry (eh);
1650
1651           for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; hdh_pp = &hdh_p->hdh_next)
1652             if (hdh_p->sec == sec)
1653               {
1654                 /* Everything must go for SEC.  */
1655                 *hdh_pp = hdh_p->hdh_next;
1656                 break;
1657               }
1658         }
1659
1660       r_type = ELF32_R_TYPE (rela->r_info);
1661       r_type = elf32_hppa_optimized_tls_reloc (info, r_type, eh != NULL);
1662
1663       switch (r_type)
1664         {
1665         case R_PARISC_DLTIND14F:
1666         case R_PARISC_DLTIND14R:
1667         case R_PARISC_DLTIND21L:
1668         case R_PARISC_TLS_GD21L:
1669         case R_PARISC_TLS_GD14R:
1670         case R_PARISC_TLS_IE21L:
1671         case R_PARISC_TLS_IE14R:
1672           if (eh != NULL)
1673             {
1674               if (eh->got.refcount > 0)
1675                 eh->got.refcount -= 1;
1676             }
1677           else if (local_got_refcounts != NULL)
1678             {
1679               if (local_got_refcounts[r_symndx] > 0)
1680                 local_got_refcounts[r_symndx] -= 1;
1681             }
1682           break;
1683
1684         case R_PARISC_TLS_LDM21L:
1685         case R_PARISC_TLS_LDM14R:
1686           htab->tls_ldm_got.refcount -= 1;
1687           break;
1688
1689         case R_PARISC_PCREL12F:
1690         case R_PARISC_PCREL17C:
1691         case R_PARISC_PCREL17F:
1692         case R_PARISC_PCREL22F:
1693           if (eh != NULL)
1694             {
1695               if (eh->plt.refcount > 0)
1696                 eh->plt.refcount -= 1;
1697             }
1698           break;
1699
1700         case R_PARISC_PLABEL14R:
1701         case R_PARISC_PLABEL21L:
1702         case R_PARISC_PLABEL32:
1703           if (eh != NULL)
1704             {
1705               if (eh->plt.refcount > 0)
1706                 eh->plt.refcount -= 1;
1707             }
1708           else if (local_plt_refcounts != NULL)
1709             {
1710               if (local_plt_refcounts[r_symndx] > 0)
1711                 local_plt_refcounts[r_symndx] -= 1;
1712             }
1713           break;
1714
1715         default:
1716           break;
1717         }
1718     }
1719
1720   return TRUE;
1721 }
1722
1723 /* Support for core dump NOTE sections.  */
1724
1725 static bfd_boolean
1726 elf32_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1727 {
1728   int offset;
1729   size_t size;
1730
1731   switch (note->descsz)
1732     {
1733       default:
1734         return FALSE;
1735
1736       case 396:         /* Linux/hppa */
1737         /* pr_cursig */
1738         elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1739
1740         /* pr_pid */
1741         elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1742
1743         /* pr_reg */
1744         offset = 72;
1745         size = 320;
1746
1747         break;
1748     }
1749
1750   /* Make a ".reg/999" section.  */
1751   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1752                                           size, note->descpos + offset);
1753 }
1754
1755 static bfd_boolean
1756 elf32_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1757 {
1758   switch (note->descsz)
1759     {
1760       default:
1761         return FALSE;
1762
1763       case 124:         /* Linux/hppa elf_prpsinfo.  */
1764         elf_tdata (abfd)->core_program
1765           = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
1766         elf_tdata (abfd)->core_command
1767           = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
1768     }
1769
1770   /* Note that for some reason, a spurious space is tacked
1771      onto the end of the args in some (at least one anyway)
1772      implementations, so strip it off if it exists.  */
1773   {
1774     char *command = elf_tdata (abfd)->core_command;
1775     int n = strlen (command);
1776
1777     if (0 < n && command[n - 1] == ' ')
1778       command[n - 1] = '\0';
1779   }
1780
1781   return TRUE;
1782 }
1783
1784 /* Our own version of hide_symbol, so that we can keep plt entries for
1785    plabels.  */
1786
1787 static void
1788 elf32_hppa_hide_symbol (struct bfd_link_info *info,
1789                         struct elf_link_hash_entry *eh,
1790                         bfd_boolean force_local)
1791 {
1792   if (force_local)
1793     {
1794       eh->forced_local = 1;
1795       if (eh->dynindx != -1)
1796         {
1797           eh->dynindx = -1;
1798           _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1799                                   eh->dynstr_index);
1800         }
1801     }
1802
1803   if (! hppa_elf_hash_entry (eh)->plabel)
1804     {
1805       eh->needs_plt = 0;
1806       eh->plt = elf_hash_table (info)->init_plt_refcount;
1807     }
1808 }
1809
1810 /* Adjust a symbol defined by a dynamic object and referenced by a
1811    regular object.  The current definition is in some section of the
1812    dynamic object, but we're not including those sections.  We have to
1813    change the definition to something the rest of the link can
1814    understand.  */
1815
1816 static bfd_boolean
1817 elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
1818                                   struct elf_link_hash_entry *eh)
1819 {
1820   struct elf32_hppa_link_hash_table *htab;
1821   asection *sec;
1822
1823   /* If this is a function, put it in the procedure linkage table.  We
1824      will fill in the contents of the procedure linkage table later.  */
1825   if (eh->type == STT_FUNC
1826       || eh->needs_plt)
1827     {
1828       if (eh->plt.refcount <= 0
1829           || (eh->def_regular
1830               && eh->root.type != bfd_link_hash_defweak
1831               && ! hppa_elf_hash_entry (eh)->plabel
1832               && (!info->shared || info->symbolic)))
1833         {
1834           /* The .plt entry is not needed when:
1835              a) Garbage collection has removed all references to the
1836              symbol, or
1837              b) We know for certain the symbol is defined in this
1838              object, and it's not a weak definition, nor is the symbol
1839              used by a plabel relocation.  Either this object is the
1840              application or we are doing a shared symbolic link.  */
1841
1842           eh->plt.offset = (bfd_vma) -1;
1843           eh->needs_plt = 0;
1844         }
1845
1846       return TRUE;
1847     }
1848   else
1849     eh->plt.offset = (bfd_vma) -1;
1850
1851   /* If this is a weak symbol, and there is a real definition, the
1852      processor independent code will have arranged for us to see the
1853      real definition first, and we can just use the same value.  */
1854   if (eh->u.weakdef != NULL)
1855     {
1856       if (eh->u.weakdef->root.type != bfd_link_hash_defined
1857           && eh->u.weakdef->root.type != bfd_link_hash_defweak)
1858         abort ();
1859       eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
1860       eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
1861       if (ELIMINATE_COPY_RELOCS)
1862         eh->non_got_ref = eh->u.weakdef->non_got_ref;
1863       return TRUE;
1864     }
1865
1866   /* This is a reference to a symbol defined by a dynamic object which
1867      is not a function.  */
1868
1869   /* If we are creating a shared library, we must presume that the
1870      only references to the symbol are via the global offset table.
1871      For such cases we need not do anything here; the relocations will
1872      be handled correctly by relocate_section.  */
1873   if (info->shared)
1874     return TRUE;
1875
1876   /* If there are no references to this symbol that do not use the
1877      GOT, we don't need to generate a copy reloc.  */
1878   if (!eh->non_got_ref)
1879     return TRUE;
1880
1881   if (ELIMINATE_COPY_RELOCS)
1882     {
1883       struct elf32_hppa_link_hash_entry *hh;
1884       struct elf32_hppa_dyn_reloc_entry *hdh_p;
1885
1886       hh = hppa_elf_hash_entry (eh);
1887       for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
1888         {
1889           sec = hdh_p->sec->output_section;
1890           if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
1891             break;
1892         }
1893
1894       /* If we didn't find any dynamic relocs in read-only sections, then
1895          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
1896       if (hdh_p == NULL)
1897         {
1898           eh->non_got_ref = 0;
1899           return TRUE;
1900         }
1901     }
1902
1903   if (eh->size == 0)
1904     {
1905       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1906                              eh->root.root.string);
1907       return TRUE;
1908     }
1909
1910   /* We must allocate the symbol in our .dynbss section, which will
1911      become part of the .bss section of the executable.  There will be
1912      an entry for this symbol in the .dynsym section.  The dynamic
1913      object will contain position independent code, so all references
1914      from the dynamic object to this symbol will go through the global
1915      offset table.  The dynamic linker will use the .dynsym entry to
1916      determine the address it must put in the global offset table, so
1917      both the dynamic object and the regular object will refer to the
1918      same memory location for the variable.  */
1919
1920   htab = hppa_link_hash_table (info);
1921   if (htab == NULL)
1922     return FALSE;
1923
1924   /* We must generate a COPY reloc to tell the dynamic linker to
1925      copy the initial value out of the dynamic object and into the
1926      runtime process image.  */
1927   if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0)
1928     {
1929       htab->srelbss->size += sizeof (Elf32_External_Rela);
1930       eh->needs_copy = 1;
1931     }
1932
1933   sec = htab->sdynbss;
1934
1935   return _bfd_elf_adjust_dynamic_copy (eh, sec);
1936 }
1937
1938 /* Allocate space in the .plt for entries that won't have relocations.
1939    ie. plabel entries.  */
1940
1941 static bfd_boolean
1942 allocate_plt_static (struct elf_link_hash_entry *eh, void *inf)
1943 {
1944   struct bfd_link_info *info;
1945   struct elf32_hppa_link_hash_table *htab;
1946   struct elf32_hppa_link_hash_entry *hh;
1947   asection *sec;
1948
1949   if (eh->root.type == bfd_link_hash_indirect)
1950     return TRUE;
1951
1952   if (eh->root.type == bfd_link_hash_warning)
1953     eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
1954
1955   info = (struct bfd_link_info *) inf;
1956   hh = hppa_elf_hash_entry (eh);
1957   htab = hppa_link_hash_table (info);
1958   if (htab == NULL)
1959     return FALSE;
1960
1961   if (htab->etab.dynamic_sections_created
1962       && eh->plt.refcount > 0)
1963     {
1964       /* Make sure this symbol is output as a dynamic symbol.
1965          Undefined weak syms won't yet be marked as dynamic.  */
1966       if (eh->dynindx == -1
1967           && !eh->forced_local
1968           && eh->type != STT_PARISC_MILLI)
1969         {
1970           if (! bfd_elf_link_record_dynamic_symbol (info, eh))
1971             return FALSE;
1972         }
1973
1974       if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, eh))
1975         {
1976           /* Allocate these later.  From this point on, h->plabel
1977              means that the plt entry is only used by a plabel.
1978              We'll be using a normal plt entry for this symbol, so
1979              clear the plabel indicator.  */
1980           
1981           hh->plabel = 0;
1982         }
1983       else if (hh->plabel)
1984         {
1985           /* Make an entry in the .plt section for plabel references
1986              that won't have a .plt entry for other reasons.  */
1987           sec = htab->splt;
1988           eh->plt.offset = sec->size;
1989           sec->size += PLT_ENTRY_SIZE;
1990         }
1991       else
1992         {
1993           /* No .plt entry needed.  */
1994           eh->plt.offset = (bfd_vma) -1;
1995           eh->needs_plt = 0;
1996         }
1997     }
1998   else
1999     {
2000       eh->plt.offset = (bfd_vma) -1;
2001       eh->needs_plt = 0;
2002     }
2003
2004   return TRUE;
2005 }
2006
2007 /* Allocate space in .plt, .got and associated reloc sections for
2008    global syms.  */
2009
2010 static bfd_boolean
2011 allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2012 {
2013   struct bfd_link_info *info;
2014   struct elf32_hppa_link_hash_table *htab;
2015   asection *sec;
2016   struct elf32_hppa_link_hash_entry *hh;
2017   struct elf32_hppa_dyn_reloc_entry *hdh_p;
2018
2019   if (eh->root.type == bfd_link_hash_indirect)
2020     return TRUE;
2021
2022   if (eh->root.type == bfd_link_hash_warning)
2023     eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2024
2025   info = inf;
2026   htab = hppa_link_hash_table (info);
2027   if (htab == NULL)
2028     return FALSE;
2029
2030   hh = hppa_elf_hash_entry (eh);
2031   
2032   if (htab->etab.dynamic_sections_created
2033       && eh->plt.offset != (bfd_vma) -1
2034       && !hh->plabel
2035       && eh->plt.refcount > 0)
2036     {
2037       /* Make an entry in the .plt section.  */
2038       sec = htab->splt;
2039       eh->plt.offset = sec->size;
2040       sec->size += PLT_ENTRY_SIZE;
2041
2042       /* We also need to make an entry in the .rela.plt section.  */
2043       htab->srelplt->size += sizeof (Elf32_External_Rela);
2044       htab->need_plt_stub = 1;
2045     }
2046
2047   if (eh->got.refcount > 0)
2048     {
2049       /* Make sure this symbol is output as a dynamic symbol.
2050          Undefined weak syms won't yet be marked as dynamic.  */
2051       if (eh->dynindx == -1
2052           && !eh->forced_local
2053           && eh->type != STT_PARISC_MILLI)
2054         {
2055           if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2056             return FALSE;
2057         }
2058
2059       sec = htab->sgot;
2060       eh->got.offset = sec->size;
2061       sec->size += GOT_ENTRY_SIZE;
2062       /* R_PARISC_TLS_GD* needs two GOT entries */
2063       if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2064         sec->size += GOT_ENTRY_SIZE * 2;
2065       else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2066         sec->size += GOT_ENTRY_SIZE;
2067       if (htab->etab.dynamic_sections_created
2068           && (info->shared
2069               || (eh->dynindx != -1
2070                   && !eh->forced_local)))
2071         {
2072           htab->srelgot->size += sizeof (Elf32_External_Rela);
2073           if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2074             htab->srelgot->size += 2 * sizeof (Elf32_External_Rela);
2075           else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2076             htab->srelgot->size += sizeof (Elf32_External_Rela);
2077         }
2078     }
2079   else
2080     eh->got.offset = (bfd_vma) -1;
2081
2082   if (hh->dyn_relocs == NULL)
2083     return TRUE;
2084
2085   /* If this is a -Bsymbolic shared link, then we need to discard all
2086      space allocated for dynamic pc-relative relocs against symbols
2087      defined in a regular object.  For the normal shared case, discard
2088      space for relocs that have become local due to symbol visibility
2089      changes.  */
2090   if (info->shared)
2091     {
2092 #if RELATIVE_DYNRELOCS
2093       if (SYMBOL_CALLS_LOCAL (info, eh))
2094         {
2095           struct elf32_hppa_dyn_reloc_entry **hdh_pp;
2096
2097           for (hdh_pp = &hh->dyn_relocs; (hdh_p = *hdh_pp) != NULL; )
2098             {
2099               hdh_p->count -= hdh_p->relative_count;
2100               hdh_p->relative_count = 0;
2101               if (hdh_p->count == 0)
2102                 *hdh_pp = hdh_p->hdh_next;
2103               else
2104                 hdh_pp = &hdh_p->hdh_next;
2105             }
2106         }
2107 #endif
2108
2109       /* Also discard relocs on undefined weak syms with non-default
2110          visibility.  */
2111       if (hh->dyn_relocs != NULL
2112           && eh->root.type == bfd_link_hash_undefweak)
2113         {
2114           if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
2115             hh->dyn_relocs = NULL;
2116
2117           /* Make sure undefined weak symbols are output as a dynamic
2118              symbol in PIEs.  */
2119           else if (eh->dynindx == -1
2120                    && !eh->forced_local)
2121             {
2122               if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2123                 return FALSE;
2124             }
2125         }
2126     }
2127   else
2128     {
2129       /* For the non-shared case, discard space for relocs against
2130          symbols which turn out to need copy relocs or are not
2131          dynamic.  */
2132       
2133       if (!eh->non_got_ref
2134           && ((ELIMINATE_COPY_RELOCS
2135                && eh->def_dynamic
2136                && !eh->def_regular)
2137                || (htab->etab.dynamic_sections_created
2138                    && (eh->root.type == bfd_link_hash_undefweak
2139                        || eh->root.type == bfd_link_hash_undefined))))
2140         {
2141           /* Make sure this symbol is output as a dynamic symbol.
2142              Undefined weak syms won't yet be marked as dynamic.  */
2143           if (eh->dynindx == -1
2144               && !eh->forced_local
2145               && eh->type != STT_PARISC_MILLI)
2146             {
2147               if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2148                 return FALSE;
2149             }
2150
2151           /* If that succeeded, we know we'll be keeping all the
2152              relocs.  */
2153           if (eh->dynindx != -1)
2154             goto keep;
2155         }
2156
2157       hh->dyn_relocs = NULL;
2158       return TRUE;
2159
2160     keep: ;
2161     }
2162
2163   /* Finally, allocate space.  */
2164   for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2165     {
2166       asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
2167       sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
2168     }
2169
2170   return TRUE;
2171 }
2172
2173 /* This function is called via elf_link_hash_traverse to force
2174    millicode symbols local so they do not end up as globals in the
2175    dynamic symbol table.  We ought to be able to do this in
2176    adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2177    for all dynamic symbols.  Arguably, this is a bug in
2178    elf_adjust_dynamic_symbol.  */
2179
2180 static bfd_boolean
2181 clobber_millicode_symbols (struct elf_link_hash_entry *eh,
2182                            struct bfd_link_info *info)
2183 {
2184   if (eh->root.type == bfd_link_hash_warning)
2185     eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2186
2187   if (eh->type == STT_PARISC_MILLI
2188       && !eh->forced_local)
2189     {
2190       elf32_hppa_hide_symbol (info, eh, TRUE);
2191     }
2192   return TRUE;
2193 }
2194
2195 /* Find any dynamic relocs that apply to read-only sections.  */
2196
2197 static bfd_boolean
2198 readonly_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2199 {
2200   struct elf32_hppa_link_hash_entry *hh;
2201   struct elf32_hppa_dyn_reloc_entry *hdh_p;
2202
2203   if (eh->root.type == bfd_link_hash_warning)
2204     eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2205
2206   hh = hppa_elf_hash_entry (eh);
2207   for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2208     {
2209       asection *sec = hdh_p->sec->output_section;
2210
2211       if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
2212         {
2213           struct bfd_link_info *info = inf;
2214
2215           info->flags |= DF_TEXTREL;
2216
2217           /* Not an error, just cut short the traversal.  */
2218           return FALSE;
2219         }
2220     }
2221   return TRUE;
2222 }
2223
2224 /* Set the sizes of the dynamic sections.  */
2225
2226 static bfd_boolean
2227 elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2228                                   struct bfd_link_info *info)
2229 {
2230   struct elf32_hppa_link_hash_table *htab;
2231   bfd *dynobj;
2232   bfd *ibfd;
2233   asection *sec;
2234   bfd_boolean relocs;
2235
2236   htab = hppa_link_hash_table (info);
2237   if (htab == NULL)
2238     return FALSE;
2239
2240   dynobj = htab->etab.dynobj;
2241   if (dynobj == NULL)
2242     abort ();
2243
2244   if (htab->etab.dynamic_sections_created)
2245     {
2246       /* Set the contents of the .interp section to the interpreter.  */
2247       if (info->executable)
2248         {
2249           sec = bfd_get_section_by_name (dynobj, ".interp");
2250           if (sec == NULL)
2251             abort ();
2252           sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
2253           sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2254         }
2255
2256       /* Force millicode symbols local.  */
2257       elf_link_hash_traverse (&htab->etab,
2258                               clobber_millicode_symbols,
2259                               info);
2260     }
2261
2262   /* Set up .got and .plt offsets for local syms, and space for local
2263      dynamic relocs.  */
2264   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2265     {
2266       bfd_signed_vma *local_got;
2267       bfd_signed_vma *end_local_got;
2268       bfd_signed_vma *local_plt;
2269       bfd_signed_vma *end_local_plt;
2270       bfd_size_type locsymcount;
2271       Elf_Internal_Shdr *symtab_hdr;
2272       asection *srel;
2273       char *local_tls_type;
2274
2275       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2276         continue;
2277
2278       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2279         {
2280           struct elf32_hppa_dyn_reloc_entry *hdh_p;
2281
2282           for (hdh_p = ((struct elf32_hppa_dyn_reloc_entry *)
2283                     elf_section_data (sec)->local_dynrel);
2284                hdh_p != NULL;
2285                hdh_p = hdh_p->hdh_next)
2286             {
2287               if (!bfd_is_abs_section (hdh_p->sec)
2288                   && bfd_is_abs_section (hdh_p->sec->output_section))
2289                 {
2290                   /* Input section has been discarded, either because
2291                      it is a copy of a linkonce section or due to
2292                      linker script /DISCARD/, so we'll be discarding
2293                      the relocs too.  */
2294                 }
2295               else if (hdh_p->count != 0)
2296                 {
2297                   srel = elf_section_data (hdh_p->sec)->sreloc;
2298                   srel->size += hdh_p->count * sizeof (Elf32_External_Rela);
2299                   if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
2300                     info->flags |= DF_TEXTREL;
2301                 }
2302             }
2303         }
2304
2305       local_got = elf_local_got_refcounts (ibfd);
2306       if (!local_got)
2307         continue;
2308
2309       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2310       locsymcount = symtab_hdr->sh_info;
2311       end_local_got = local_got + locsymcount;
2312       local_tls_type = hppa_elf_local_got_tls_type (ibfd);
2313       sec = htab->sgot;
2314       srel = htab->srelgot;
2315       for (; local_got < end_local_got; ++local_got)
2316         {
2317           if (*local_got > 0)
2318             {
2319               *local_got = sec->size;
2320               sec->size += GOT_ENTRY_SIZE;
2321               if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2322                 sec->size += 2 * GOT_ENTRY_SIZE;
2323               else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2324                 sec->size += GOT_ENTRY_SIZE;
2325               if (info->shared) 
2326                 {
2327                   srel->size += sizeof (Elf32_External_Rela);
2328                   if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
2329                     srel->size += 2 * sizeof (Elf32_External_Rela);
2330                   else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
2331                     srel->size += sizeof (Elf32_External_Rela);
2332                 }
2333             }
2334           else
2335             *local_got = (bfd_vma) -1;
2336
2337           ++local_tls_type;
2338         }
2339
2340       local_plt = end_local_got;
2341       end_local_plt = local_plt + locsymcount;
2342       if (! htab->etab.dynamic_sections_created)
2343         {
2344           /* Won't be used, but be safe.  */
2345           for (; local_plt < end_local_plt; ++local_plt)
2346             *local_plt = (bfd_vma) -1;
2347         }
2348       else
2349         {
2350           sec = htab->splt;
2351           srel = htab->srelplt;
2352           for (; local_plt < end_local_plt; ++local_plt)
2353             {
2354               if (*local_plt > 0)
2355                 {
2356                   *local_plt = sec->size;
2357                   sec->size += PLT_ENTRY_SIZE;
2358                   if (info->shared)
2359                     srel->size += sizeof (Elf32_External_Rela);
2360                 }
2361               else
2362                 *local_plt = (bfd_vma) -1;
2363             }
2364         }
2365     }
2366   
2367   if (htab->tls_ldm_got.refcount > 0)
2368     {
2369       /* Allocate 2 got entries and 1 dynamic reloc for 
2370          R_PARISC_TLS_DTPMOD32 relocs.  */
2371       htab->tls_ldm_got.offset = htab->sgot->size;
2372       htab->sgot->size += (GOT_ENTRY_SIZE * 2);
2373       htab->srelgot->size += sizeof (Elf32_External_Rela);
2374     }
2375   else
2376     htab->tls_ldm_got.offset = -1;
2377
2378   /* Do all the .plt entries without relocs first.  The dynamic linker
2379      uses the last .plt reloc to find the end of the .plt (and hence
2380      the start of the .got) for lazy linking.  */
2381   elf_link_hash_traverse (&htab->etab, allocate_plt_static, info);
2382
2383   /* Allocate global sym .plt and .got entries, and space for global
2384      sym dynamic relocs.  */
2385   elf_link_hash_traverse (&htab->etab, allocate_dynrelocs, info);
2386
2387   /* The check_relocs and adjust_dynamic_symbol entry points have
2388      determined the sizes of the various dynamic sections.  Allocate
2389      memory for them.  */
2390   relocs = FALSE;
2391   for (sec = dynobj->sections; sec != NULL; sec = sec->next)
2392     {
2393       if ((sec->flags & SEC_LINKER_CREATED) == 0)
2394         continue;
2395
2396       if (sec == htab->splt)
2397         {
2398           if (htab->need_plt_stub)
2399             {
2400               /* Make space for the plt stub at the end of the .plt
2401                  section.  We want this stub right at the end, up
2402                  against the .got section.  */
2403               int gotalign = bfd_section_alignment (dynobj, htab->sgot);
2404               int pltalign = bfd_section_alignment (dynobj, sec);
2405               bfd_size_type mask;
2406
2407               if (gotalign > pltalign)
2408                 bfd_set_section_alignment (dynobj, sec, gotalign);
2409               mask = ((bfd_size_type) 1 << gotalign) - 1;
2410               sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
2411             }
2412         }
2413       else if (sec == htab->sgot
2414                || sec == htab->sdynbss)
2415         ;
2416       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, sec), ".rela"))
2417         {
2418           if (sec->size != 0)
2419             {
2420               /* Remember whether there are any reloc sections other
2421                  than .rela.plt.  */
2422               if (sec != htab->srelplt)
2423                 relocs = TRUE;
2424
2425               /* We use the reloc_count field as a counter if we need
2426                  to copy relocs into the output file.  */
2427               sec->reloc_count = 0;
2428             }
2429         }
2430       else
2431         {
2432           /* It's not one of our sections, so don't allocate space.  */
2433           continue;
2434         }
2435
2436       if (sec->size == 0)
2437         {
2438           /* If we don't need this section, strip it from the
2439              output file.  This is mostly to handle .rela.bss and
2440              .rela.plt.  We must create both sections in
2441              create_dynamic_sections, because they must be created
2442              before the linker maps input sections to output
2443              sections.  The linker does that before
2444              adjust_dynamic_symbol is called, and it is that
2445              function which decides whether anything needs to go
2446              into these sections.  */
2447           sec->flags |= SEC_EXCLUDE;
2448           continue;
2449         }
2450
2451       if ((sec->flags & SEC_HAS_CONTENTS) == 0)
2452         continue;
2453
2454       /* Allocate memory for the section contents.  Zero it, because
2455          we may not fill in all the reloc sections.  */
2456       sec->contents = bfd_zalloc (dynobj, sec->size);
2457       if (sec->contents == NULL)
2458         return FALSE;
2459     }
2460
2461   if (htab->etab.dynamic_sections_created)
2462     {
2463       /* Like IA-64 and HPPA64, always create a DT_PLTGOT.  It
2464          actually has nothing to do with the PLT, it is how we
2465          communicate the LTP value of a load module to the dynamic
2466          linker.  */
2467 #define add_dynamic_entry(TAG, VAL) \
2468   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2469
2470       if (!add_dynamic_entry (DT_PLTGOT, 0))
2471         return FALSE;
2472
2473       /* Add some entries to the .dynamic section.  We fill in the
2474          values later, in elf32_hppa_finish_dynamic_sections, but we
2475          must add the entries now so that we get the correct size for
2476          the .dynamic section.  The DT_DEBUG entry is filled in by the
2477          dynamic linker and used by the debugger.  */
2478       if (info->executable)
2479         {
2480           if (!add_dynamic_entry (DT_DEBUG, 0))
2481             return FALSE;
2482         }
2483
2484       if (htab->srelplt->size != 0)
2485         {
2486           if (!add_dynamic_entry (DT_PLTRELSZ, 0)
2487               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2488               || !add_dynamic_entry (DT_JMPREL, 0))
2489             return FALSE;
2490         }
2491
2492       if (relocs)
2493         {
2494           if (!add_dynamic_entry (DT_RELA, 0)
2495               || !add_dynamic_entry (DT_RELASZ, 0)
2496               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2497             return FALSE;
2498
2499           /* If any dynamic relocs apply to a read-only section,
2500              then we need a DT_TEXTREL entry.  */
2501           if ((info->flags & DF_TEXTREL) == 0)
2502             elf_link_hash_traverse (&htab->etab, readonly_dynrelocs, info);
2503
2504           if ((info->flags & DF_TEXTREL) != 0)
2505             {
2506               if (!add_dynamic_entry (DT_TEXTREL, 0))
2507                 return FALSE;
2508             }
2509         }
2510     }
2511 #undef add_dynamic_entry
2512
2513   return TRUE;
2514 }
2515
2516 /* External entry points for sizing and building linker stubs.  */
2517
2518 /* Set up various things so that we can make a list of input sections
2519    for each output section included in the link.  Returns -1 on error,
2520    0 when no stubs will be needed, and 1 on success.  */
2521
2522 int
2523 elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2524 {
2525   bfd *input_bfd;
2526   unsigned int bfd_count;
2527   int top_id, top_index;
2528   asection *section;
2529   asection **input_list, **list;
2530   bfd_size_type amt;
2531   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2532
2533   if (htab == NULL)
2534     return -1;
2535
2536   /* Count the number of input BFDs and find the top input section id.  */
2537   for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2538        input_bfd != NULL;
2539        input_bfd = input_bfd->link_next)
2540     {
2541       bfd_count += 1;
2542       for (section = input_bfd->sections;
2543            section != NULL;
2544            section = section->next)
2545         {
2546           if (top_id < section->id)
2547             top_id = section->id;
2548         }
2549     }
2550   htab->bfd_count = bfd_count;
2551
2552   amt = sizeof (struct map_stub) * (top_id + 1);
2553   htab->stub_group = bfd_zmalloc (amt);
2554   if (htab->stub_group == NULL)
2555     return -1;
2556
2557   /* We can't use output_bfd->section_count here to find the top output
2558      section index as some sections may have been removed, and
2559      strip_excluded_output_sections doesn't renumber the indices.  */
2560   for (section = output_bfd->sections, top_index = 0;
2561        section != NULL;
2562        section = section->next)
2563     {
2564       if (top_index < section->index)
2565         top_index = section->index;
2566     }
2567
2568   htab->top_index = top_index;
2569   amt = sizeof (asection *) * (top_index + 1);
2570   input_list = bfd_malloc (amt);
2571   htab->input_list = input_list;
2572   if (input_list == NULL)
2573     return -1;
2574
2575   /* For sections we aren't interested in, mark their entries with a
2576      value we can check later.  */
2577   list = input_list + top_index;
2578   do
2579     *list = bfd_abs_section_ptr;
2580   while (list-- != input_list);
2581
2582   for (section = output_bfd->sections;
2583        section != NULL;
2584        section = section->next)
2585     {
2586       if ((section->flags & SEC_CODE) != 0)
2587         input_list[section->index] = NULL;
2588     }
2589
2590   return 1;
2591 }
2592
2593 /* The linker repeatedly calls this function for each input section,
2594    in the order that input sections are linked into output sections.
2595    Build lists of input sections to determine groupings between which
2596    we may insert linker stubs.  */
2597
2598 void
2599 elf32_hppa_next_input_section (struct bfd_link_info *info, asection *isec)
2600 {
2601   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2602
2603   if (htab == NULL)
2604     return;
2605
2606   if (isec->output_section->index <= htab->top_index)
2607     {
2608       asection **list = htab->input_list + isec->output_section->index;
2609       if (*list != bfd_abs_section_ptr)
2610         {
2611           /* Steal the link_sec pointer for our list.  */
2612 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
2613           /* This happens to make the list in reverse order,
2614              which is what we want.  */
2615           PREV_SEC (isec) = *list;
2616           *list = isec;
2617         }
2618     }
2619 }
2620
2621 /* See whether we can group stub sections together.  Grouping stub
2622    sections may result in fewer stubs.  More importantly, we need to
2623    put all .init* and .fini* stubs at the beginning of the .init or
2624    .fini output sections respectively, because glibc splits the
2625    _init and _fini functions into multiple parts.  Putting a stub in
2626    the middle of a function is not a good idea.  */
2627
2628 static void
2629 group_sections (struct elf32_hppa_link_hash_table *htab,
2630                 bfd_size_type stub_group_size,
2631                 bfd_boolean stubs_always_before_branch)
2632 {
2633   asection **list = htab->input_list + htab->top_index;
2634   do
2635     {
2636       asection *tail = *list;
2637       if (tail == bfd_abs_section_ptr)
2638         continue;
2639       while (tail != NULL)
2640         {
2641           asection *curr;
2642           asection *prev;
2643           bfd_size_type total;
2644           bfd_boolean big_sec;
2645
2646           curr = tail;
2647           total = tail->size;
2648           big_sec = total >= stub_group_size;
2649
2650           while ((prev = PREV_SEC (curr)) != NULL
2651                  && ((total += curr->output_offset - prev->output_offset)
2652                      < stub_group_size))
2653             curr = prev;
2654
2655           /* OK, the size from the start of CURR to the end is less
2656              than 240000 bytes and thus can be handled by one stub
2657              section.  (or the tail section is itself larger than
2658              240000 bytes, in which case we may be toast.)
2659              We should really be keeping track of the total size of
2660              stubs added here, as stubs contribute to the final output
2661              section size.  That's a little tricky, and this way will
2662              only break if stubs added total more than 22144 bytes, or
2663              2768 long branch stubs.  It seems unlikely for more than
2664              2768 different functions to be called, especially from
2665              code only 240000 bytes long.  This limit used to be
2666              250000, but c++ code tends to generate lots of little
2667              functions, and sometimes violated the assumption.  */
2668           do
2669             {
2670               prev = PREV_SEC (tail);
2671               /* Set up this stub group.  */
2672               htab->stub_group[tail->id].link_sec = curr;
2673             }
2674           while (tail != curr && (tail = prev) != NULL);
2675
2676           /* But wait, there's more!  Input sections up to 240000
2677              bytes before the stub section can be handled by it too.
2678              Don't do this if we have a really large section after the
2679              stubs, as adding more stubs increases the chance that
2680              branches may not reach into the stub section.  */
2681           if (!stubs_always_before_branch && !big_sec)
2682             {
2683               total = 0;
2684               while (prev != NULL
2685                      && ((total += tail->output_offset - prev->output_offset)
2686                          < stub_group_size))
2687                 {
2688                   tail = prev;
2689                   prev = PREV_SEC (tail);
2690                   htab->stub_group[tail->id].link_sec = curr;
2691                 }
2692             }
2693           tail = prev;
2694         }
2695     }
2696   while (list-- != htab->input_list);
2697   free (htab->input_list);
2698 #undef PREV_SEC
2699 }
2700
2701 /* Read in all local syms for all input bfds, and create hash entries
2702    for export stubs if we are building a multi-subspace shared lib.
2703    Returns -1 on error, 1 if export stubs created, 0 otherwise.  */
2704
2705 static int
2706 get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info)
2707 {
2708   unsigned int bfd_indx;
2709   Elf_Internal_Sym *local_syms, **all_local_syms;
2710   int stub_changed = 0;
2711   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2712
2713   if (htab == NULL)
2714     return -1;
2715
2716   /* We want to read in symbol extension records only once.  To do this
2717      we need to read in the local symbols in parallel and save them for
2718      later use; so hold pointers to the local symbols in an array.  */
2719   bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2720   all_local_syms = bfd_zmalloc (amt);
2721   htab->all_local_syms = all_local_syms;
2722   if (all_local_syms == NULL)
2723     return -1;
2724
2725   /* Walk over all the input BFDs, swapping in local symbols.
2726      If we are creating a shared library, create hash entries for the
2727      export stubs.  */
2728   for (bfd_indx = 0;
2729        input_bfd != NULL;
2730        input_bfd = input_bfd->link_next, bfd_indx++)
2731     {
2732       Elf_Internal_Shdr *symtab_hdr;
2733
2734       /* We'll need the symbol table in a second.  */
2735       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2736       if (symtab_hdr->sh_info == 0)
2737         continue;
2738
2739       /* We need an array of the local symbols attached to the input bfd.  */
2740       local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2741       if (local_syms == NULL)
2742         {
2743           local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2744                                              symtab_hdr->sh_info, 0,
2745                                              NULL, NULL, NULL);
2746           /* Cache them for elf_link_input_bfd.  */
2747           symtab_hdr->contents = (unsigned char *) local_syms;
2748         }
2749       if (local_syms == NULL)
2750         return -1;
2751
2752       all_local_syms[bfd_indx] = local_syms;
2753
2754       if (info->shared && htab->multi_subspace)
2755         {
2756           struct elf_link_hash_entry **eh_syms;
2757           struct elf_link_hash_entry **eh_symend;
2758           unsigned int symcount;
2759
2760           symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2761                       - symtab_hdr->sh_info);
2762           eh_syms = (struct elf_link_hash_entry **) elf_sym_hashes (input_bfd);
2763           eh_symend = (struct elf_link_hash_entry **) (eh_syms + symcount);
2764
2765           /* Look through the global syms for functions;  We need to
2766              build export stubs for all globally visible functions.  */
2767           for (; eh_syms < eh_symend; eh_syms++)
2768             {
2769               struct elf32_hppa_link_hash_entry *hh;
2770
2771               hh = hppa_elf_hash_entry (*eh_syms);
2772
2773               while (hh->eh.root.type == bfd_link_hash_indirect
2774                      || hh->eh.root.type == bfd_link_hash_warning)
2775                    hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
2776
2777               /* At this point in the link, undefined syms have been
2778                  resolved, so we need to check that the symbol was
2779                  defined in this BFD.  */
2780               if ((hh->eh.root.type == bfd_link_hash_defined
2781                    || hh->eh.root.type == bfd_link_hash_defweak)
2782                   && hh->eh.type == STT_FUNC
2783                   && hh->eh.root.u.def.section->output_section != NULL
2784                   && (hh->eh.root.u.def.section->output_section->owner
2785                       == output_bfd)
2786                   && hh->eh.root.u.def.section->owner == input_bfd
2787                   && hh->eh.def_regular
2788                   && !hh->eh.forced_local
2789                   && ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT)
2790                 {
2791                   asection *sec;
2792                   const char *stub_name;
2793                   struct elf32_hppa_stub_hash_entry *hsh;
2794
2795                   sec = hh->eh.root.u.def.section;
2796                   stub_name = hh_name (hh);
2797                   hsh = hppa_stub_hash_lookup (&htab->bstab,
2798                                                       stub_name,
2799                                                       FALSE, FALSE);
2800                   if (hsh == NULL)
2801                     {
2802                       hsh = hppa_add_stub (stub_name, sec, htab);
2803                       if (!hsh)
2804                         return -1;
2805
2806                       hsh->target_value = hh->eh.root.u.def.value;
2807                       hsh->target_section = hh->eh.root.u.def.section;
2808                       hsh->stub_type = hppa_stub_export;
2809                       hsh->hh = hh;
2810                       stub_changed = 1;
2811                     }
2812                   else
2813                     {
2814                       (*_bfd_error_handler) (_("%B: duplicate export stub %s"),
2815                                              input_bfd,
2816                                              stub_name);
2817                     }
2818                 }
2819             }
2820         }
2821     }
2822
2823   return stub_changed;
2824 }
2825
2826 /* Determine and set the size of the stub section for a final link.
2827
2828    The basic idea here is to examine all the relocations looking for
2829    PC-relative calls to a target that is unreachable with a "bl"
2830    instruction.  */
2831
2832 bfd_boolean
2833 elf32_hppa_size_stubs
2834   (bfd *output_bfd, bfd *stub_bfd, struct bfd_link_info *info,
2835    bfd_boolean multi_subspace, bfd_signed_vma group_size,
2836    asection * (*add_stub_section) (const char *, asection *),
2837    void (*layout_sections_again) (void))
2838 {
2839   bfd_size_type stub_group_size;
2840   bfd_boolean stubs_always_before_branch;
2841   bfd_boolean stub_changed;
2842   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2843
2844   if (htab == NULL)
2845     return FALSE;
2846
2847   /* Stash our params away.  */
2848   htab->stub_bfd = stub_bfd;
2849   htab->multi_subspace = multi_subspace;
2850   htab->add_stub_section = add_stub_section;
2851   htab->layout_sections_again = layout_sections_again;
2852   stubs_always_before_branch = group_size < 0;
2853   if (group_size < 0)
2854     stub_group_size = -group_size;
2855   else
2856     stub_group_size = group_size;
2857   if (stub_group_size == 1)
2858     {
2859       /* Default values.  */
2860       if (stubs_always_before_branch)
2861         {
2862           stub_group_size = 7680000;
2863           if (htab->has_17bit_branch || htab->multi_subspace)
2864             stub_group_size = 240000;
2865           if (htab->has_12bit_branch)
2866             stub_group_size = 7500;
2867         }
2868       else
2869         {
2870           stub_group_size = 6971392;
2871           if (htab->has_17bit_branch || htab->multi_subspace)
2872             stub_group_size = 217856;
2873           if (htab->has_12bit_branch)
2874             stub_group_size = 6808;
2875         }
2876     }
2877
2878   group_sections (htab, stub_group_size, stubs_always_before_branch);
2879
2880   switch (get_local_syms (output_bfd, info->input_bfds, info))
2881     {
2882     default:
2883       if (htab->all_local_syms)
2884         goto error_ret_free_local;
2885       return FALSE;
2886
2887     case 0:
2888       stub_changed = FALSE;
2889       break;
2890
2891     case 1:
2892       stub_changed = TRUE;
2893       break;
2894     }
2895
2896   while (1)
2897     {
2898       bfd *input_bfd;
2899       unsigned int bfd_indx;
2900       asection *stub_sec;
2901
2902       for (input_bfd = info->input_bfds, bfd_indx = 0;
2903            input_bfd != NULL;
2904            input_bfd = input_bfd->link_next, bfd_indx++)
2905         {
2906           Elf_Internal_Shdr *symtab_hdr;
2907           asection *section;
2908           Elf_Internal_Sym *local_syms;
2909
2910           /* We'll need the symbol table in a second.  */
2911           symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2912           if (symtab_hdr->sh_info == 0)
2913             continue;
2914
2915           local_syms = htab->all_local_syms[bfd_indx];
2916
2917           /* Walk over each section attached to the input bfd.  */
2918           for (section = input_bfd->sections;
2919                section != NULL;
2920                section = section->next)
2921             {
2922               Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2923
2924               /* If there aren't any relocs, then there's nothing more
2925                  to do.  */
2926               if ((section->flags & SEC_RELOC) == 0
2927                   || section->reloc_count == 0)
2928                 continue;
2929
2930               /* If this section is a link-once section that will be
2931                  discarded, then don't create any stubs.  */
2932               if (section->output_section == NULL
2933                   || section->output_section->owner != output_bfd)
2934                 continue;
2935
2936               /* Get the relocs.  */
2937               internal_relocs
2938                 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2939                                              info->keep_memory);
2940               if (internal_relocs == NULL)
2941                 goto error_ret_free_local;
2942
2943               /* Now examine each relocation.  */
2944               irela = internal_relocs;
2945               irelaend = irela + section->reloc_count;
2946               for (; irela < irelaend; irela++)
2947                 {
2948                   unsigned int r_type, r_indx;
2949                   enum elf32_hppa_stub_type stub_type;
2950                   struct elf32_hppa_stub_hash_entry *hsh;
2951                   asection *sym_sec;
2952                   bfd_vma sym_value;
2953                   bfd_vma destination;
2954                   struct elf32_hppa_link_hash_entry *hh;
2955                   char *stub_name;
2956                   const asection *id_sec;
2957
2958                   r_type = ELF32_R_TYPE (irela->r_info);
2959                   r_indx = ELF32_R_SYM (irela->r_info);
2960
2961                   if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
2962                     {
2963                       bfd_set_error (bfd_error_bad_value);
2964                     error_ret_free_internal:
2965                       if (elf_section_data (section)->relocs == NULL)
2966                         free (internal_relocs);
2967                       goto error_ret_free_local;
2968                     }
2969
2970                   /* Only look for stubs on call instructions.  */
2971                   if (r_type != (unsigned int) R_PARISC_PCREL12F
2972                       && r_type != (unsigned int) R_PARISC_PCREL17F
2973                       && r_type != (unsigned int) R_PARISC_PCREL22F)
2974                     continue;
2975
2976                   /* Now determine the call target, its name, value,
2977                      section.  */
2978                   sym_sec = NULL;
2979                   sym_value = 0;
2980                   destination = 0;
2981                   hh = NULL;
2982                   if (r_indx < symtab_hdr->sh_info)
2983                     {
2984                       /* It's a local symbol.  */
2985                       Elf_Internal_Sym *sym;
2986                       Elf_Internal_Shdr *hdr;
2987                       unsigned int shndx;
2988
2989                       sym = local_syms + r_indx;
2990                       if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2991                         sym_value = sym->st_value;
2992                       shndx = sym->st_shndx;
2993                       if (shndx < elf_numsections (input_bfd))
2994                         {
2995                           hdr = elf_elfsections (input_bfd)[shndx];
2996                           sym_sec = hdr->bfd_section;
2997                           destination = (sym_value + irela->r_addend
2998                                          + sym_sec->output_offset
2999                                          + sym_sec->output_section->vma);
3000                         }
3001                     }
3002                   else
3003                     {
3004                       /* It's an external symbol.  */
3005                       int e_indx;
3006
3007                       e_indx = r_indx - symtab_hdr->sh_info;
3008                       hh = hppa_elf_hash_entry (elf_sym_hashes (input_bfd)[e_indx]);
3009
3010                       while (hh->eh.root.type == bfd_link_hash_indirect
3011                              || hh->eh.root.type == bfd_link_hash_warning)
3012                         hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
3013
3014                       if (hh->eh.root.type == bfd_link_hash_defined
3015                           || hh->eh.root.type == bfd_link_hash_defweak)
3016                         {
3017                           sym_sec = hh->eh.root.u.def.section;
3018                           sym_value = hh->eh.root.u.def.value;
3019                           if (sym_sec->output_section != NULL)
3020                             destination = (sym_value + irela->r_addend
3021                                            + sym_sec->output_offset
3022                                            + sym_sec->output_section->vma);
3023                         }
3024                       else if (hh->eh.root.type == bfd_link_hash_undefweak)
3025                         {
3026                           if (! info->shared)
3027                             continue;
3028                         }
3029                       else if (hh->eh.root.type == bfd_link_hash_undefined)
3030                         {
3031                           if (! (info->unresolved_syms_in_objects == RM_IGNORE
3032                                  && (ELF_ST_VISIBILITY (hh->eh.other)
3033                                      == STV_DEFAULT)
3034                                  && hh->eh.type != STT_PARISC_MILLI))
3035                             continue;
3036                         }
3037                       else
3038                         {
3039                           bfd_set_error (bfd_error_bad_value);
3040                           goto error_ret_free_internal;
3041                         }
3042                     }
3043
3044                   /* Determine what (if any) linker stub is needed.  */
3045                   stub_type = hppa_type_of_stub (section, irela, hh,
3046                                                  destination, info);
3047                   if (stub_type == hppa_stub_none)
3048                     continue;
3049
3050                   /* Support for grouping stub sections.  */
3051                   id_sec = htab->stub_group[section->id].link_sec;
3052
3053                   /* Get the name of this stub.  */
3054                   stub_name = hppa_stub_name (id_sec, sym_sec, hh, irela);
3055                   if (!stub_name)
3056                     goto error_ret_free_internal;
3057
3058                   hsh = hppa_stub_hash_lookup (&htab->bstab,
3059                                                       stub_name,
3060                                                       FALSE, FALSE);
3061                   if (hsh != NULL)
3062                     {
3063                       /* The proper stub has already been created.  */
3064                       free (stub_name);
3065                       continue;
3066                     }
3067
3068                   hsh = hppa_add_stub (stub_name, section, htab);
3069                   if (hsh == NULL)
3070                     {
3071                       free (stub_name);
3072                       goto error_ret_free_internal;
3073                     }
3074
3075                   hsh->target_value = sym_value;
3076                   hsh->target_section = sym_sec;
3077                   hsh->stub_type = stub_type;
3078                   if (info->shared)
3079                     {
3080                       if (stub_type == hppa_stub_import)
3081                         hsh->stub_type = hppa_stub_import_shared;
3082                       else if (stub_type == hppa_stub_long_branch)
3083                         hsh->stub_type = hppa_stub_long_branch_shared;
3084                     }
3085                   hsh->hh = hh;
3086                   stub_changed = TRUE;
3087                 }
3088
3089               /* We're done with the internal relocs, free them.  */
3090               if (elf_section_data (section)->relocs == NULL)
3091                 free (internal_relocs);
3092             }
3093         }
3094
3095       if (!stub_changed)
3096         break;
3097
3098       /* OK, we've added some stubs.  Find out the new size of the
3099          stub sections.  */
3100       for (stub_sec = htab->stub_bfd->sections;
3101            stub_sec != NULL;
3102            stub_sec = stub_sec->next)
3103         stub_sec->size = 0;
3104
3105       bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
3106
3107       /* Ask the linker to do its stuff.  */
3108       (*htab->layout_sections_again) ();
3109       stub_changed = FALSE;
3110     }
3111
3112   free (htab->all_local_syms);
3113   return TRUE;
3114
3115  error_ret_free_local:
3116   free (htab->all_local_syms);
3117   return FALSE;
3118 }
3119
3120 /* For a final link, this function is called after we have sized the
3121    stubs to provide a value for __gp.  */
3122
3123 bfd_boolean
3124 elf32_hppa_set_gp (bfd *abfd, struct bfd_link_info *info)
3125 {
3126   struct bfd_link_hash_entry *h;
3127   asection *sec = NULL;
3128   bfd_vma gp_val = 0;
3129   struct elf32_hppa_link_hash_table *htab;
3130
3131   htab = hppa_link_hash_table (info);
3132   if (htab == NULL)
3133     return FALSE;
3134
3135   h = bfd_link_hash_lookup (&htab->etab.root, "$global$", FALSE, FALSE, FALSE);
3136
3137   if (h != NULL
3138       && (h->type == bfd_link_hash_defined
3139           || h->type == bfd_link_hash_defweak))
3140     {
3141       gp_val = h->u.def.value;
3142       sec = h->u.def.section;
3143     }
3144   else
3145     {
3146       asection *splt = bfd_get_section_by_name (abfd, ".plt");
3147       asection *sgot = bfd_get_section_by_name (abfd, ".got");
3148
3149       /* Choose to point our LTP at, in this order, one of .plt, .got,
3150          or .data, if these sections exist.  In the case of choosing
3151          .plt try to make the LTP ideal for addressing anywhere in the
3152          .plt or .got with a 14 bit signed offset.  Typically, the end
3153          of the .plt is the start of the .got, so choose .plt + 0x2000
3154          if either the .plt or .got is larger than 0x2000.  If both
3155          the .plt and .got are smaller than 0x2000, choose the end of
3156          the .plt section.  */
3157       sec = strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0
3158           ? NULL : splt;
3159       if (sec != NULL)
3160         {
3161           gp_val = sec->size;
3162           if (gp_val > 0x2000 || (sgot && sgot->size > 0x2000))
3163             {
3164               gp_val = 0x2000;
3165             }
3166         }
3167       else
3168         {
3169           sec = sgot;
3170           if (sec != NULL)
3171             {
3172               if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") != 0)
3173                 {
3174                   /* We know we don't have a .plt.  If .got is large,
3175                      offset our LTP.  */
3176                   if (sec->size > 0x2000)
3177                     gp_val = 0x2000;
3178                 }
3179             }
3180           else
3181             {
3182               /* No .plt or .got.  Who cares what the LTP is?  */
3183               sec = bfd_get_section_by_name (abfd, ".data");
3184             }
3185         }
3186
3187       if (h != NULL)
3188         {
3189           h->type = bfd_link_hash_defined;
3190           h->u.def.value = gp_val;
3191           if (sec != NULL)
3192             h->u.def.section = sec;
3193           else
3194             h->u.def.section = bfd_abs_section_ptr;
3195         }
3196     }
3197
3198   if (sec != NULL && sec->output_section != NULL)
3199     gp_val += sec->output_section->vma + sec->output_offset;
3200
3201   elf_gp (abfd) = gp_val;
3202   return TRUE;
3203 }
3204
3205 /* Build all the stubs associated with the current output file.  The
3206    stubs are kept in a hash table attached to the main linker hash
3207    table.  We also set up the .plt entries for statically linked PIC
3208    functions here.  This function is called via hppaelf_finish in the
3209    linker.  */
3210
3211 bfd_boolean
3212 elf32_hppa_build_stubs (struct bfd_link_info *info)
3213 {
3214   asection *stub_sec;
3215   struct bfd_hash_table *table;
3216   struct elf32_hppa_link_hash_table *htab;
3217
3218   htab = hppa_link_hash_table (info);
3219   if (htab == NULL)
3220     return FALSE;
3221
3222   for (stub_sec = htab->stub_bfd->sections;
3223        stub_sec != NULL;
3224        stub_sec = stub_sec->next)
3225     {
3226       bfd_size_type size;
3227
3228       /* Allocate memory to hold the linker stubs.  */
3229       size = stub_sec->size;
3230       stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3231       if (stub_sec->contents == NULL && size != 0)
3232         return FALSE;
3233       stub_sec->size = 0;
3234     }
3235
3236   /* Build the stubs as directed by the stub hash table.  */
3237   table = &htab->bstab;
3238   bfd_hash_traverse (table, hppa_build_one_stub, info);
3239
3240   return TRUE;
3241 }
3242
3243 /* Return the base vma address which should be subtracted from the real
3244    address when resolving a dtpoff relocation.  
3245    This is PT_TLS segment p_vaddr.  */
3246
3247 static bfd_vma
3248 dtpoff_base (struct bfd_link_info *info)
3249 {
3250   /* If tls_sec is NULL, we should have signalled an error already.  */
3251   if (elf_hash_table (info)->tls_sec == NULL)
3252     return 0;
3253   return elf_hash_table (info)->tls_sec->vma;
3254 }
3255
3256 /* Return the relocation value for R_PARISC_TLS_TPOFF*..  */
3257
3258 static bfd_vma
3259 tpoff (struct bfd_link_info *info, bfd_vma address)
3260 {
3261   struct elf_link_hash_table *htab = elf_hash_table (info);
3262
3263   /* If tls_sec is NULL, we should have signalled an error already.  */
3264   if (htab->tls_sec == NULL)
3265     return 0;
3266   /* hppa TLS ABI is variant I and static TLS block start just after 
3267      tcbhead structure which has 2 pointer fields.  */
3268   return (address - htab->tls_sec->vma 
3269           + align_power ((bfd_vma) 8, htab->tls_sec->alignment_power));
3270 }
3271
3272 /* Perform a final link.  */
3273
3274 static bfd_boolean
3275 elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
3276 {
3277   /* Invoke the regular ELF linker to do all the work.  */
3278   if (!bfd_elf_final_link (abfd, info))
3279     return FALSE;
3280
3281   /* If we're producing a final executable, sort the contents of the
3282      unwind section.  */
3283   if (info->relocatable)
3284     return TRUE;
3285
3286   return elf_hppa_sort_unwind (abfd);
3287 }
3288
3289 /* Record the lowest address for the data and text segments.  */
3290
3291 static void
3292 hppa_record_segment_addr (bfd *abfd, asection *section, void *data)
3293 {
3294   struct elf32_hppa_link_hash_table *htab;
3295
3296   htab = (struct elf32_hppa_link_hash_table*) data;
3297   if (htab == NULL)
3298     return;
3299
3300   if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3301     {
3302       bfd_vma value;
3303       Elf_Internal_Phdr *p;
3304
3305       p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
3306       BFD_ASSERT (p != NULL);
3307       value = p->p_vaddr;
3308
3309       if ((section->flags & SEC_READONLY) != 0)
3310         {
3311           if (value < htab->text_segment_base)
3312             htab->text_segment_base = value;
3313         }
3314       else
3315         {
3316           if (value < htab->data_segment_base)
3317             htab->data_segment_base = value;
3318         }
3319     }
3320 }
3321
3322 /* Perform a relocation as part of a final link.  */
3323
3324 static bfd_reloc_status_type
3325 final_link_relocate (asection *input_section,
3326                      bfd_byte *contents,
3327                      const Elf_Internal_Rela *rela,
3328                      bfd_vma value,
3329                      struct elf32_hppa_link_hash_table *htab,
3330                      asection *sym_sec,
3331                      struct elf32_hppa_link_hash_entry *hh,
3332                      struct bfd_link_info *info)
3333 {
3334   int insn;
3335   unsigned int r_type = ELF32_R_TYPE (rela->r_info);
3336   unsigned int orig_r_type = r_type;
3337   reloc_howto_type *howto = elf_hppa_howto_table + r_type;
3338   int r_format = howto->bitsize;
3339   enum hppa_reloc_field_selector_type_alt r_field;
3340   bfd *input_bfd = input_section->owner;
3341   bfd_vma offset = rela->r_offset;
3342   bfd_vma max_branch_offset = 0;
3343   bfd_byte *hit_data = contents + offset;
3344   bfd_signed_vma addend = rela->r_addend;
3345   bfd_vma location;
3346   struct elf32_hppa_stub_hash_entry *hsh = NULL;
3347   int val;  
3348
3349   if (r_type == R_PARISC_NONE)
3350     return bfd_reloc_ok;
3351
3352   insn = bfd_get_32 (input_bfd, hit_data);
3353
3354   /* Find out where we are and where we're going.  */
3355   location = (offset +
3356               input_section->output_offset +
3357               input_section->output_section->vma);
3358
3359   /* If we are not building a shared library, convert DLTIND relocs to
3360      DPREL relocs.  */
3361   if (!info->shared)
3362     {
3363       switch (r_type)
3364         {
3365           case R_PARISC_DLTIND21L:
3366             r_type = R_PARISC_DPREL21L;
3367             break;
3368
3369           case R_PARISC_DLTIND14R:
3370             r_type = R_PARISC_DPREL14R;
3371             break;
3372
3373           case R_PARISC_DLTIND14F:
3374             r_type = R_PARISC_DPREL14F;
3375             break;
3376         }
3377     }
3378
3379   switch (r_type)
3380     {
3381     case R_PARISC_PCREL12F:
3382     case R_PARISC_PCREL17F:
3383     case R_PARISC_PCREL22F:
3384       /* If this call should go via the plt, find the import stub in
3385          the stub hash.  */
3386       if (sym_sec == NULL
3387           || sym_sec->output_section == NULL
3388           || (hh != NULL
3389               && hh->eh.plt.offset != (bfd_vma) -1
3390               && hh->eh.dynindx != -1
3391               && !hh->plabel
3392               && (info->shared
3393                   || !hh->eh.def_regular
3394                   || hh->eh.root.type == bfd_link_hash_defweak)))
3395         {
3396           hsh = hppa_get_stub_entry (input_section, sym_sec,
3397                                             hh, rela, htab);
3398           if (hsh != NULL)
3399             {
3400               value = (hsh->stub_offset
3401                        + hsh->stub_sec->output_offset
3402                        + hsh->stub_sec->output_section->vma);
3403               addend = 0;
3404             }
3405           else if (sym_sec == NULL && hh != NULL
3406                    && hh->eh.root.type == bfd_link_hash_undefweak)
3407             {
3408               /* It's OK if undefined weak.  Calls to undefined weak
3409                  symbols behave as if the "called" function
3410                  immediately returns.  We can thus call to a weak
3411                  function without first checking whether the function
3412                  is defined.  */
3413               value = location;
3414               addend = 8;
3415             }
3416           else
3417             return bfd_reloc_undefined;
3418         }
3419       /* Fall thru.  */
3420
3421     case R_PARISC_PCREL21L:
3422     case R_PARISC_PCREL17C:
3423     case R_PARISC_PCREL17R:
3424     case R_PARISC_PCREL14R:
3425     case R_PARISC_PCREL14F:
3426     case R_PARISC_PCREL32:
3427       /* Make it a pc relative offset.  */
3428       value -= location;
3429       addend -= 8;
3430       break;
3431
3432     case R_PARISC_DPREL21L:
3433     case R_PARISC_DPREL14R:
3434     case R_PARISC_DPREL14F:
3435     case R_PARISC_TLS_GD21L:
3436     case R_PARISC_TLS_LDM21L:
3437     case R_PARISC_TLS_IE21L:
3438       /* Convert instructions that use the linkage table pointer (r19) to
3439          instructions that use the global data pointer (dp).  This is the
3440          most efficient way of using PIC code in an incomplete executable,
3441          but the user must follow the standard runtime conventions for
3442          accessing data for this to work.  */
3443       if (orig_r_type == R_PARISC_DLTIND21L
3444           || (!info->shared
3445               && (r_type == R_PARISC_TLS_GD21L
3446                   || r_type == R_PARISC_TLS_LDM21L
3447                   || r_type == R_PARISC_TLS_IE21L)))
3448         {
3449           /* Convert addil instructions if the original reloc was a
3450              DLTIND21L.  GCC sometimes uses a register other than r19 for
3451              the operation, so we must convert any addil instruction
3452              that uses this relocation.  */
3453           if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
3454             insn = ADDIL_DP;
3455           else
3456             /* We must have a ldil instruction.  It's too hard to find
3457                and convert the associated add instruction, so issue an
3458                error.  */
3459             (*_bfd_error_handler)
3460               (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
3461                input_bfd,
3462                input_section,
3463                (long) offset,
3464                howto->name,
3465                insn);
3466         }
3467       else if (orig_r_type == R_PARISC_DLTIND14F)
3468         {
3469           /* This must be a format 1 load/store.  Change the base
3470              register to dp.  */
3471           insn = (insn & 0xfc1ffff) | (27 << 21);
3472         }
3473
3474     /* For all the DP relative relocations, we need to examine the symbol's
3475        section.  If it has no section or if it's a code section, then
3476        "data pointer relative" makes no sense.  In that case we don't
3477        adjust the "value", and for 21 bit addil instructions, we change the
3478        source addend register from %dp to %r0.  This situation commonly
3479        arises for undefined weak symbols and when a variable's "constness"
3480        is declared differently from the way the variable is defined.  For
3481        instance: "extern int foo" with foo defined as "const int foo".  */
3482       if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
3483         {
3484           if ((insn & ((0x3f << 26) | (0x1f << 21)))
3485               == (((int) OP_ADDIL << 26) | (27 << 21)))
3486             {
3487               insn &= ~ (0x1f << 21);
3488             }
3489           /* Now try to make things easy for the dynamic linker.  */
3490
3491           break;
3492         }
3493       /* Fall thru.  */
3494
3495     case R_PARISC_DLTIND21L:
3496     case R_PARISC_DLTIND14R:
3497     case R_PARISC_DLTIND14F:
3498     case R_PARISC_TLS_GD14R:
3499     case R_PARISC_TLS_LDM14R:
3500     case R_PARISC_TLS_IE14R:
3501       value -= elf_gp (input_section->output_section->owner);
3502       break;
3503
3504     case R_PARISC_SEGREL32:
3505       if ((sym_sec->flags & SEC_CODE) != 0)
3506         value -= htab->text_segment_base;
3507       else
3508         value -= htab->data_segment_base;
3509       break;
3510
3511     default:
3512       break;
3513     }
3514
3515   switch (r_type)
3516     {
3517     case R_PARISC_DIR32:
3518     case R_PARISC_DIR14F:
3519     case R_PARISC_DIR17F:
3520     case R_PARISC_PCREL17C:
3521     case R_PARISC_PCREL14F:
3522     case R_PARISC_PCREL32:
3523     case R_PARISC_DPREL14F:
3524     case R_PARISC_PLABEL32:
3525     case R_PARISC_DLTIND14F:
3526     case R_PARISC_SEGBASE:
3527     case R_PARISC_SEGREL32:
3528     case R_PARISC_TLS_DTPMOD32:
3529     case R_PARISC_TLS_DTPOFF32:
3530     case R_PARISC_TLS_TPREL32:
3531       r_field = e_fsel;
3532       break;
3533
3534     case R_PARISC_DLTIND21L:
3535     case R_PARISC_PCREL21L:
3536     case R_PARISC_PLABEL21L:
3537       r_field = e_lsel;
3538       break;
3539
3540     case R_PARISC_DIR21L:
3541     case R_PARISC_DPREL21L:
3542     case R_PARISC_TLS_GD21L:
3543     case R_PARISC_TLS_LDM21L:
3544     case R_PARISC_TLS_LDO21L:
3545     case R_PARISC_TLS_IE21L:
3546     case R_PARISC_TLS_LE21L:
3547       r_field = e_lrsel;
3548       break;
3549
3550     case R_PARISC_PCREL17R:
3551     case R_PARISC_PCREL14R:
3552     case R_PARISC_PLABEL14R:
3553     case R_PARISC_DLTIND14R:
3554       r_field = e_rsel;
3555       break;
3556
3557     case R_PARISC_DIR17R:
3558     case R_PARISC_DIR14R:
3559     case R_PARISC_DPREL14R:
3560     case R_PARISC_TLS_GD14R:
3561     case R_PARISC_TLS_LDM14R:
3562     case R_PARISC_TLS_LDO14R:
3563     case R_PARISC_TLS_IE14R:
3564     case R_PARISC_TLS_LE14R:
3565       r_field = e_rrsel;
3566       break;
3567
3568     case R_PARISC_PCREL12F:
3569     case R_PARISC_PCREL17F:
3570     case R_PARISC_PCREL22F:
3571       r_field = e_fsel;
3572
3573       if (r_type == (unsigned int) R_PARISC_PCREL17F)
3574         {
3575           max_branch_offset = (1 << (17-1)) << 2;
3576         }
3577       else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3578         {
3579           max_branch_offset = (1 << (12-1)) << 2;
3580         }
3581       else
3582         {
3583           max_branch_offset = (1 << (22-1)) << 2;
3584         }
3585
3586       /* sym_sec is NULL on undefined weak syms or when shared on
3587          undefined syms.  We've already checked for a stub for the
3588          shared undefined case.  */
3589       if (sym_sec == NULL)
3590         break;
3591
3592       /* If the branch is out of reach, then redirect the
3593          call to the local stub for this function.  */
3594       if (value + addend + max_branch_offset >= 2*max_branch_offset)
3595         {
3596           hsh = hppa_get_stub_entry (input_section, sym_sec,
3597                                             hh, rela, htab);
3598           if (hsh == NULL)
3599             return bfd_reloc_undefined;
3600
3601           /* Munge up the value and addend so that we call the stub
3602              rather than the procedure directly.  */
3603           value = (hsh->stub_offset
3604                    + hsh->stub_sec->output_offset
3605                    + hsh->stub_sec->output_section->vma
3606                    - location);
3607           addend = -8;
3608         }
3609       break;
3610
3611     /* Something we don't know how to handle.  */
3612     default:
3613       return bfd_reloc_notsupported;
3614     }
3615
3616   /* Make sure we can reach the stub.  */
3617   if (max_branch_offset != 0
3618       && value + addend + max_branch_offset >= 2*max_branch_offset)
3619     {
3620       (*_bfd_error_handler)
3621         (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
3622          input_bfd,
3623          input_section,
3624          (long) offset,
3625          hsh->bh_root.string);
3626       bfd_set_error (bfd_error_bad_value);
3627       return bfd_reloc_notsupported;
3628     }
3629
3630   val = hppa_field_adjust (value, addend, r_field);
3631
3632   switch (r_type)
3633     {
3634     case R_PARISC_PCREL12F:
3635     case R_PARISC_PCREL17C:
3636     case R_PARISC_PCREL17F:
3637     case R_PARISC_PCREL17R:
3638     case R_PARISC_PCREL22F:
3639     case R_PARISC_DIR17F:
3640     case R_PARISC_DIR17R:
3641       /* This is a branch.  Divide the offset by four.
3642          Note that we need to decide whether it's a branch or
3643          otherwise by inspecting the reloc.  Inspecting insn won't
3644          work as insn might be from a .word directive.  */
3645       val >>= 2;
3646       break;
3647
3648     default:
3649       break;
3650     }
3651
3652   insn = hppa_rebuild_insn (insn, val, r_format);
3653
3654   /* Update the instruction word.  */
3655   bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3656   return bfd_reloc_ok;
3657 }
3658
3659 /* Relocate an HPPA ELF section.  */
3660
3661 static bfd_boolean
3662 elf32_hppa_relocate_section (bfd *output_bfd,
3663                              struct bfd_link_info *info,
3664                              bfd *input_bfd,
3665                              asection *input_section,
3666                              bfd_byte *contents,
3667                              Elf_Internal_Rela *relocs,
3668                              Elf_Internal_Sym *local_syms,
3669                              asection **local_sections)
3670 {
3671   bfd_vma *local_got_offsets;
3672   struct elf32_hppa_link_hash_table *htab;
3673   Elf_Internal_Shdr *symtab_hdr;
3674   Elf_Internal_Rela *rela;
3675   Elf_Internal_Rela *relend;
3676
3677   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3678
3679   htab = hppa_link_hash_table (info);
3680   if (htab == NULL)
3681     return FALSE;
3682
3683   local_got_offsets = elf_local_got_offsets (input_bfd);
3684
3685   rela = relocs;
3686   relend = relocs + input_section->reloc_count;
3687   for (; rela < relend; rela++)
3688     {
3689       unsigned int r_type;
3690       reloc_howto_type *howto;
3691       unsigned int r_symndx;
3692       struct elf32_hppa_link_hash_entry *hh;
3693       Elf_Internal_Sym *sym;
3694       asection *sym_sec;
3695       bfd_vma relocation;
3696       bfd_reloc_status_type rstatus;
3697       const char *sym_name;
3698       bfd_boolean plabel;
3699       bfd_boolean warned_undef;
3700
3701       r_type = ELF32_R_TYPE (rela->r_info);
3702       if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3703         {
3704           bfd_set_error (bfd_error_bad_value);
3705           return FALSE;
3706         }
3707       if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3708           || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3709         continue;
3710
3711       r_symndx = ELF32_R_SYM (rela->r_info);
3712       hh = NULL;
3713       sym = NULL;
3714       sym_sec = NULL;
3715       warned_undef = FALSE;
3716       if (r_symndx < symtab_hdr->sh_info)
3717         {
3718           /* This is a local symbol, h defaults to NULL.  */
3719           sym = local_syms + r_symndx;
3720           sym_sec = local_sections[r_symndx];
3721           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rela);
3722         }
3723       else
3724         {
3725           struct elf_link_hash_entry *eh;
3726           bfd_boolean unresolved_reloc;
3727           struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3728
3729           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
3730                                    r_symndx, symtab_hdr, sym_hashes,
3731                                    eh, sym_sec, relocation,
3732                                    unresolved_reloc, warned_undef);
3733
3734           if (!info->relocatable
3735               && relocation == 0
3736               && eh->root.type != bfd_link_hash_defined
3737               && eh->root.type != bfd_link_hash_defweak
3738               && eh->root.type != bfd_link_hash_undefweak)
3739             {
3740               if (info->unresolved_syms_in_objects == RM_IGNORE
3741                   && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3742                   && eh->type == STT_PARISC_MILLI)
3743                 {
3744                   if (! info->callbacks->undefined_symbol
3745                       (info, eh_name (eh), input_bfd,
3746                        input_section, rela->r_offset, FALSE))
3747                     return FALSE;
3748                   warned_undef = TRUE;
3749                 }
3750             }
3751           hh = hppa_elf_hash_entry (eh);
3752         }
3753
3754       if (sym_sec != NULL && elf_discarded_section (sym_sec))
3755         {
3756           /* For relocs against symbols from removed linkonce
3757              sections, or sections discarded by a linker script,
3758              we just want the section contents zeroed.  Avoid any
3759              special processing.  */
3760           _bfd_clear_contents (elf_hppa_howto_table + r_type, input_bfd,
3761                                contents + rela->r_offset);
3762           rela->r_info = 0;
3763           rela->r_addend = 0;
3764           continue;
3765         }
3766
3767       if (info->relocatable)
3768         continue;
3769
3770       /* Do any required modifications to the relocation value, and
3771          determine what types of dynamic info we need to output, if
3772          any.  */
3773       plabel = 0;
3774       switch (r_type)
3775         {
3776         case R_PARISC_DLTIND14F:
3777         case R_PARISC_DLTIND14R:
3778         case R_PARISC_DLTIND21L:
3779           {
3780             bfd_vma off;
3781             bfd_boolean do_got = 0;
3782
3783             /* Relocation is to the entry for this symbol in the
3784                global offset table.  */
3785             if (hh != NULL)
3786               {
3787                 bfd_boolean dyn;
3788
3789                 off = hh->eh.got.offset;
3790                 dyn = htab->etab.dynamic_sections_created;
3791                 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
3792                                                        &hh->eh))
3793                   {
3794                     /* If we aren't going to call finish_dynamic_symbol,
3795                        then we need to handle initialisation of the .got
3796                        entry and create needed relocs here.  Since the
3797                        offset must always be a multiple of 4, we use the
3798                        least significant bit to record whether we have
3799                        initialised it already.  */
3800                     if ((off & 1) != 0)
3801                       off &= ~1;
3802                     else
3803                       {
3804                         hh->eh.got.offset |= 1;
3805                         do_got = 1;
3806                       }
3807                   }
3808               }
3809             else
3810               {
3811                 /* Local symbol case.  */
3812                 if (local_got_offsets == NULL)
3813                   abort ();
3814
3815                 off = local_got_offsets[r_symndx];
3816
3817                 /* The offset must always be a multiple of 4.  We use
3818                    the least significant bit to record whether we have
3819                    already generated the necessary reloc.  */
3820                 if ((off & 1) != 0)
3821                   off &= ~1;
3822                 else
3823                   {
3824                     local_got_offsets[r_symndx] |= 1;
3825                     do_got = 1;
3826                   }
3827               }
3828
3829             if (do_got)
3830               {
3831                 if (info->shared)
3832                   {
3833                     /* Output a dynamic relocation for this GOT entry.
3834                        In this case it is relative to the base of the
3835                        object because the symbol index is zero.  */
3836                     Elf_Internal_Rela outrel;
3837                     bfd_byte *loc;
3838                     asection *sec = htab->srelgot;
3839
3840                     outrel.r_offset = (off
3841                                        + htab->sgot->output_offset
3842                                        + htab->sgot->output_section->vma);
3843                     outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
3844                     outrel.r_addend = relocation;
3845                     loc = sec->contents;
3846                     loc += sec->reloc_count++ * sizeof (Elf32_External_Rela);
3847                     bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3848                   }
3849                 else
3850                   bfd_put_32 (output_bfd, relocation,
3851                               htab->sgot->contents + off);
3852               }
3853
3854             if (off >= (bfd_vma) -2)
3855               abort ();
3856
3857             /* Add the base of the GOT to the relocation value.  */
3858             relocation = (off
3859                           + htab->sgot->output_offset
3860                           + htab->sgot->output_section->vma);
3861           }
3862           break;
3863
3864         case R_PARISC_SEGREL32:
3865           /* If this is the first SEGREL relocation, then initialize
3866              the segment base values.  */
3867           if (htab->text_segment_base == (bfd_vma) -1)
3868             bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
3869           break;
3870
3871         case R_PARISC_PLABEL14R:
3872         case R_PARISC_PLABEL21L:
3873         case R_PARISC_PLABEL32:
3874           if (htab->etab.dynamic_sections_created)
3875             {
3876               bfd_vma off;
3877               bfd_boolean do_plt = 0;
3878               /* If we have a global symbol with a PLT slot, then
3879                  redirect this relocation to it.  */
3880               if (hh != NULL)
3881                 {
3882                   off = hh->eh.plt.offset;
3883                   if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared,
3884                                                          &hh->eh))
3885                     {
3886                       /* In a non-shared link, adjust_dynamic_symbols
3887                          isn't called for symbols forced local.  We
3888                          need to write out the plt entry here.  */
3889                       if ((off & 1) != 0)
3890                         off &= ~1;
3891                       else
3892                         {
3893                           hh->eh.plt.offset |= 1;
3894                           do_plt = 1;
3895                         }
3896                     }
3897                 }
3898               else
3899                 {
3900                   bfd_vma *local_plt_offsets;
3901
3902                   if (local_got_offsets == NULL)
3903                     abort ();
3904
3905                   local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3906                   off = local_plt_offsets[r_symndx];
3907
3908                   /* As for the local .got entry case, we use the last
3909                      bit to record whether we've already initialised
3910                      this local .plt entry.  */
3911                   if ((off & 1) != 0)
3912                     off &= ~1;
3913                   else
3914                     {
3915                       local_plt_offsets[r_symndx] |= 1;
3916                       do_plt = 1;
3917                     }
3918                 }
3919
3920               if (do_plt)
3921                 {
3922                   if (info->shared)
3923                     {
3924                       /* Output a dynamic IPLT relocation for this
3925                          PLT entry.  */
3926                       Elf_Internal_Rela outrel;
3927                       bfd_byte *loc;
3928                       asection *s = htab->srelplt;
3929
3930                       outrel.r_offset = (off
3931                                          + htab->splt->output_offset
3932                                          + htab->splt->output_section->vma);
3933                       outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3934                       outrel.r_addend = relocation;
3935                       loc = s->contents;
3936                       loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
3937                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3938                     }
3939                   else
3940                     {
3941                       bfd_put_32 (output_bfd,
3942                                   relocation,
3943                                   htab->splt->contents + off);
3944                       bfd_put_32 (output_bfd,
3945                                   elf_gp (htab->splt->output_section->owner),
3946                                   htab->splt->contents + off + 4);
3947                     }
3948                 }
3949
3950               if (off >= (bfd_vma) -2)
3951                 abort ();
3952
3953               /* PLABELs contain function pointers.  Relocation is to
3954                  the entry for the function in the .plt.  The magic +2
3955                  offset signals to $$dyncall that the function pointer
3956                  is in the .plt and thus has a gp pointer too.
3957                  Exception:  Undefined PLABELs should have a value of
3958                  zero.  */
3959               if (hh == NULL
3960                   || (hh->eh.root.type != bfd_link_hash_undefweak
3961                       && hh->eh.root.type != bfd_link_hash_undefined))
3962                 {
3963                   relocation = (off
3964                                 + htab->splt->output_offset
3965                                 + htab->splt->output_section->vma
3966                                 + 2);
3967                 }
3968               plabel = 1;
3969             }
3970           /* Fall through and possibly emit a dynamic relocation.  */
3971
3972         case R_PARISC_DIR17F:
3973         case R_PARISC_DIR17R:
3974         case R_PARISC_DIR14F:
3975         case R_PARISC_DIR14R:
3976         case R_PARISC_DIR21L:
3977         case R_PARISC_DPREL14F:
3978         case R_PARISC_DPREL14R:
3979         case R_PARISC_DPREL21L:
3980         case R_PARISC_DIR32:
3981           if ((input_section->flags & SEC_ALLOC) == 0)
3982             break;
3983
3984           /* The reloc types handled here and this conditional
3985              expression must match the code in ..check_relocs and
3986              allocate_dynrelocs.  ie. We need exactly the same condition
3987              as in ..check_relocs, with some extra conditions (dynindx
3988              test in this case) to cater for relocs removed by
3989              allocate_dynrelocs.  If you squint, the non-shared test
3990              here does indeed match the one in ..check_relocs, the
3991              difference being that here we test DEF_DYNAMIC as well as
3992              !DEF_REGULAR.  All common syms end up with !DEF_REGULAR,
3993              which is why we can't use just that test here.
3994              Conversely, DEF_DYNAMIC can't be used in check_relocs as
3995              there all files have not been loaded.  */
3996           if ((info->shared
3997                && (hh == NULL
3998                    || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
3999                    || hh->eh.root.type != bfd_link_hash_undefweak)
4000                && (IS_ABSOLUTE_RELOC (r_type)
4001                    || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
4002               || (!info->shared
4003                   && hh != NULL
4004                   && hh->eh.dynindx != -1
4005                   && !hh->eh.non_got_ref
4006                   && ((ELIMINATE_COPY_RELOCS
4007                        && hh->eh.def_dynamic
4008                        && !hh->eh.def_regular)
4009                       || hh->eh.root.type == bfd_link_hash_undefweak
4010                       || hh->eh.root.type == bfd_link_hash_undefined)))
4011             {
4012               Elf_Internal_Rela outrel;
4013               bfd_boolean skip;
4014               asection *sreloc;
4015               bfd_byte *loc;
4016
4017               /* When generating a shared object, these relocations
4018                  are copied into the output file to be resolved at run
4019                  time.  */
4020
4021               outrel.r_addend = rela->r_addend;
4022               outrel.r_offset =
4023                 _bfd_elf_section_offset (output_bfd, info, input_section,
4024                                          rela->r_offset);
4025               skip = (outrel.r_offset == (bfd_vma) -1
4026                       || outrel.r_offset == (bfd_vma) -2);
4027               outrel.r_offset += (input_section->output_offset
4028                                   + input_section->output_section->vma);
4029                       
4030               if (skip)
4031                 {
4032                   memset (&outrel, 0, sizeof (outrel));
4033                 }
4034               else if (hh != NULL
4035                        && hh->eh.dynindx != -1
4036                        && (plabel
4037                            || !IS_ABSOLUTE_RELOC (r_type)
4038                            || !info->shared
4039                            || !info->symbolic
4040                            || !hh->eh.def_regular))
4041                 {
4042                   outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
4043                 }
4044               else /* It's a local symbol, or one marked to become local.  */
4045                 {
4046                   int indx = 0;
4047
4048                   /* Add the absolute offset of the symbol.  */
4049                   outrel.r_addend += relocation;
4050
4051                   /* Global plabels need to be processed by the
4052                      dynamic linker so that functions have at most one
4053                      fptr.  For this reason, we need to differentiate
4054                      between global and local plabels, which we do by
4055                      providing the function symbol for a global plabel
4056                      reloc, and no symbol for local plabels.  */
4057                   if (! plabel
4058                       && sym_sec != NULL
4059                       && sym_sec->output_section != NULL
4060                       && ! bfd_is_abs_section (sym_sec))
4061                     {
4062                       asection *osec;
4063
4064                       osec = sym_sec->output_section;
4065                       indx = elf_section_data (osec)->dynindx;
4066                       if (indx == 0)
4067                         {
4068                           osec = htab->etab.text_index_section;
4069                           indx = elf_section_data (osec)->dynindx;
4070                         }
4071                       BFD_ASSERT (indx != 0);
4072
4073                       /* We are turning this relocation into one
4074                          against a section symbol, so subtract out the
4075                          output section's address but not the offset
4076                          of the input section in the output section.  */
4077                       outrel.r_addend -= osec->vma;
4078                     }
4079
4080                   outrel.r_info = ELF32_R_INFO (indx, r_type);
4081                 }
4082               sreloc = elf_section_data (input_section)->sreloc;
4083               if (sreloc == NULL)
4084                 abort ();
4085
4086               loc = sreloc->contents;
4087               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4088               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4089             }
4090           break;
4091           
4092         case R_PARISC_TLS_LDM21L:
4093         case R_PARISC_TLS_LDM14R:
4094           {
4095             bfd_vma off;
4096         
4097             off = htab->tls_ldm_got.offset;
4098             if (off & 1)
4099               off &= ~1;
4100             else
4101               {
4102                 Elf_Internal_Rela outrel;
4103                 bfd_byte *loc;
4104
4105                 outrel.r_offset = (off 
4106                                    + htab->sgot->output_section->vma
4107                                    + htab->sgot->output_offset);
4108                 outrel.r_addend = 0;
4109                 outrel.r_info = ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32);
4110                 loc = htab->srelgot->contents; 
4111                 loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4112
4113                 bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4114                 htab->tls_ldm_got.offset |= 1;
4115               }
4116
4117             /* Add the base of the GOT to the relocation value.  */
4118             relocation = (off
4119                           + htab->sgot->output_offset
4120                           + htab->sgot->output_section->vma);
4121
4122             break;
4123           }
4124
4125         case R_PARISC_TLS_LDO21L:
4126         case R_PARISC_TLS_LDO14R:
4127           relocation -= dtpoff_base (info);
4128           break;
4129
4130         case R_PARISC_TLS_GD21L:
4131         case R_PARISC_TLS_GD14R:
4132         case R_PARISC_TLS_IE21L:
4133         case R_PARISC_TLS_IE14R:
4134           {
4135             bfd_vma off;
4136             int indx;
4137             char tls_type;
4138
4139             indx = 0;
4140             if (hh != NULL)
4141               {
4142                 bfd_boolean dyn;
4143                 dyn = htab->etab.dynamic_sections_created;
4144
4145                 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &hh->eh)
4146                     && (!info->shared
4147                         || !SYMBOL_REFERENCES_LOCAL (info, &hh->eh)))
4148                   {
4149                     indx = hh->eh.dynindx;
4150                   }
4151                 off = hh->eh.got.offset;
4152                 tls_type = hh->tls_type;
4153               }
4154             else
4155               {
4156                 off = local_got_offsets[r_symndx];
4157                 tls_type = hppa_elf_local_got_tls_type (input_bfd)[r_symndx];
4158               }
4159
4160             if (tls_type == GOT_UNKNOWN)
4161               abort ();
4162
4163             if ((off & 1) != 0)
4164               off &= ~1;
4165             else
4166               {
4167                 bfd_boolean need_relocs = FALSE;
4168                 Elf_Internal_Rela outrel;
4169                 bfd_byte *loc = NULL;
4170                 int cur_off = off;
4171
4172                 /* The GOT entries have not been initialized yet.  Do it
4173                    now, and emit any relocations.  If both an IE GOT and a
4174                    GD GOT are necessary, we emit the GD first.  */
4175
4176                 if ((info->shared || indx != 0)
4177                     && (hh == NULL
4178                         || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
4179                         || hh->eh.root.type != bfd_link_hash_undefweak))
4180                   {
4181                     need_relocs = TRUE;
4182                     loc = htab->srelgot->contents; 
4183                     /* FIXME (CAO): Should this be reloc_count++ ? */
4184                     loc += htab->srelgot->reloc_count * sizeof (Elf32_External_Rela);
4185                   }
4186
4187                 if (tls_type & GOT_TLS_GD)
4188                   {
4189                     if (need_relocs)
4190                       {
4191                         outrel.r_offset = (cur_off
4192                                            + htab->sgot->output_section->vma
4193                                            + htab->sgot->output_offset);
4194                         outrel.r_info = ELF32_R_INFO (indx,R_PARISC_TLS_DTPMOD32);
4195                         outrel.r_addend = 0;
4196                         bfd_put_32 (output_bfd, 0, htab->sgot->contents + cur_off);
4197                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4198                         htab->srelgot->reloc_count++;
4199                         loc += sizeof (Elf32_External_Rela);
4200
4201                         if (indx == 0)
4202                           bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4203                                       htab->sgot->contents + cur_off + 4);
4204                         else
4205                           {
4206                             bfd_put_32 (output_bfd, 0,
4207                                         htab->sgot->contents + cur_off + 4);
4208                             outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_DTPOFF32);
4209                             outrel.r_offset += 4;
4210                             bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
4211                             htab->srelgot->reloc_count++;
4212                             loc += sizeof (Elf32_External_Rela);
4213                           }
4214                       }
4215                     else
4216                       {
4217                         /* If we are not emitting relocations for a
4218                            general dynamic reference, then we must be in a
4219                            static link or an executable link with the
4220                            symbol binding locally.  Mark it as belonging
4221                            to module 1, the executable.  */
4222                         bfd_put_32 (output_bfd, 1,
4223                                     htab->sgot->contents + cur_off);
4224                         bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4225                                     htab->sgot->contents + cur_off + 4);
4226                       }
4227
4228
4229                     cur_off += 8;
4230                   }
4231
4232                 if (tls_type & GOT_TLS_IE)
4233                   {
4234                     if (need_relocs)
4235                       {
4236                         outrel.r_offset = (cur_off
4237                                            + htab->sgot->output_section->vma
4238                                            + htab->sgot->output_offset);
4239                         outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_TPREL32);
4240
4241                         if (indx == 0)
4242                           outrel.r_addend = relocation - dtpoff_base (info);
4243                         else
4244                           outrel.r_addend = 0;
4245
4246                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4247                         htab->srelgot->reloc_count++;
4248                         loc += sizeof (Elf32_External_Rela);
4249                       }
4250                     else
4251                       bfd_put_32 (output_bfd, tpoff (info, relocation),
4252                                   htab->sgot->contents + cur_off);
4253
4254                     cur_off += 4;
4255                   }
4256
4257                 if (hh != NULL)
4258                   hh->eh.got.offset |= 1;
4259                 else
4260                   local_got_offsets[r_symndx] |= 1;
4261               }
4262
4263             if ((tls_type & GOT_TLS_GD)
4264                 && r_type != R_PARISC_TLS_GD21L
4265                 && r_type != R_PARISC_TLS_GD14R)
4266               off += 2 * GOT_ENTRY_SIZE;
4267
4268             /* Add the base of the GOT to the relocation value.  */
4269             relocation = (off
4270                           + htab->sgot->output_offset
4271                           + htab->sgot->output_section->vma);
4272
4273             break;
4274           }
4275
4276         case R_PARISC_TLS_LE21L:
4277         case R_PARISC_TLS_LE14R:
4278           {
4279             relocation = tpoff (info, relocation);
4280             break;
4281           }
4282           break;
4283
4284         default:
4285           break;
4286         }
4287
4288       rstatus = final_link_relocate (input_section, contents, rela, relocation,
4289                                htab, sym_sec, hh, info);
4290
4291       if (rstatus == bfd_reloc_ok)
4292         continue;
4293
4294       if (hh != NULL)
4295         sym_name = hh_name (hh);
4296       else
4297         {
4298           sym_name = bfd_elf_string_from_elf_section (input_bfd,
4299                                                       symtab_hdr->sh_link,
4300                                                       sym->st_name);
4301           if (sym_name == NULL)
4302             return FALSE;
4303           if (*sym_name == '\0')
4304             sym_name = bfd_section_name (input_bfd, sym_sec);
4305         }
4306
4307       howto = elf_hppa_howto_table + r_type;
4308
4309       if (rstatus == bfd_reloc_undefined || rstatus == bfd_reloc_notsupported)
4310         {
4311           if (rstatus == bfd_reloc_notsupported || !warned_undef)
4312             {
4313               (*_bfd_error_handler)
4314                 (_("%B(%A+0x%lx): cannot handle %s for %s"),
4315                  input_bfd,
4316                  input_section,
4317                  (long) rela->r_offset,
4318                  howto->name,
4319                  sym_name);
4320               bfd_set_error (bfd_error_bad_value);
4321               return FALSE;
4322             }
4323         }
4324       else
4325         {
4326           if (!((*info->callbacks->reloc_overflow)
4327                 (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
4328                  (bfd_vma) 0, input_bfd, input_section, rela->r_offset)))
4329             return FALSE;
4330         }
4331     }
4332
4333   return TRUE;
4334 }
4335
4336 /* Finish up dynamic symbol handling.  We set the contents of various
4337    dynamic sections here.  */
4338
4339 static bfd_boolean
4340 elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
4341                                   struct bfd_link_info *info,
4342                                   struct elf_link_hash_entry *eh,
4343                                   Elf_Internal_Sym *sym)
4344 {
4345   struct elf32_hppa_link_hash_table *htab;
4346   Elf_Internal_Rela rela;
4347   bfd_byte *loc;
4348
4349   htab = hppa_link_hash_table (info);
4350   if (htab == NULL)
4351     return FALSE;
4352
4353   if (eh->plt.offset != (bfd_vma) -1)
4354     {
4355       bfd_vma value;
4356
4357       if (eh->plt.offset & 1)
4358         abort ();
4359
4360       /* This symbol has an entry in the procedure linkage table.  Set
4361          it up.
4362
4363          The format of a plt entry is
4364          <funcaddr>
4365          <__gp>
4366       */
4367       value = 0;
4368       if (eh->root.type == bfd_link_hash_defined
4369           || eh->root.type == bfd_link_hash_defweak)
4370         {
4371           value = eh->root.u.def.value;
4372           if (eh->root.u.def.section->output_section != NULL)
4373             value += (eh->root.u.def.section->output_offset
4374                       + eh->root.u.def.section->output_section->vma);
4375         }
4376
4377       /* Create a dynamic IPLT relocation for this entry.  */
4378       rela.r_offset = (eh->plt.offset
4379                       + htab->splt->output_offset
4380                       + htab->splt->output_section->vma);
4381       if (eh->dynindx != -1)
4382         {
4383           rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT);
4384           rela.r_addend = 0;
4385         }
4386       else
4387         {
4388           /* This symbol has been marked to become local, and is
4389              used by a plabel so must be kept in the .plt.  */
4390           rela.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
4391           rela.r_addend = value;
4392         }
4393
4394       loc = htab->srelplt->contents;
4395       loc += htab->srelplt->reloc_count++ * sizeof (Elf32_External_Rela);
4396       bfd_elf32_swap_reloca_out (htab->splt->output_section->owner, &rela, loc);
4397
4398       if (!eh->def_regular)
4399         {
4400           /* Mark the symbol as undefined, rather than as defined in
4401              the .plt section.  Leave the value alone.  */
4402           sym->st_shndx = SHN_UNDEF;
4403         }
4404     }
4405
4406   if (eh->got.offset != (bfd_vma) -1
4407       && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_GD) == 0
4408       && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_IE) == 0)
4409     {
4410       /* This symbol has an entry in the global offset table.  Set it
4411          up.  */
4412
4413       rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
4414                       + htab->sgot->output_offset
4415                       + htab->sgot->output_section->vma);
4416
4417       /* If this is a -Bsymbolic link and the symbol is defined
4418          locally or was forced to be local because of a version file,
4419          we just want to emit a RELATIVE reloc.  The entry in the
4420          global offset table will already have been initialized in the
4421          relocate_section function.  */
4422       if (info->shared
4423           && (info->symbolic || eh->dynindx == -1)
4424           && eh->def_regular)
4425         {
4426           rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
4427           rela.r_addend = (eh->root.u.def.value
4428                           + eh->root.u.def.section->output_offset
4429                           + eh->root.u.def.section->output_section->vma);
4430         }
4431       else
4432         {
4433           if ((eh->got.offset & 1) != 0)
4434             abort ();
4435
4436           bfd_put_32 (output_bfd, 0, htab->sgot->contents + (eh->got.offset & ~1));
4437           rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32);
4438           rela.r_addend = 0;
4439         }
4440
4441       loc = htab->srelgot->contents;
4442       loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4443       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4444     }
4445
4446   if (eh->needs_copy)
4447     {
4448       asection *sec;
4449
4450       /* This symbol needs a copy reloc.  Set it up.  */
4451
4452       if (! (eh->dynindx != -1
4453              && (eh->root.type == bfd_link_hash_defined
4454                  || eh->root.type == bfd_link_hash_defweak)))
4455         abort ();
4456
4457       sec = htab->srelbss;
4458
4459       rela.r_offset = (eh->root.u.def.value
4460                       + eh->root.u.def.section->output_offset
4461                       + eh->root.u.def.section->output_section->vma);
4462       rela.r_addend = 0;
4463       rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY);
4464       loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela);
4465       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4466     }
4467
4468   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
4469   if (eh_name (eh)[0] == '_'
4470       && (strcmp (eh_name (eh), "_DYNAMIC") == 0
4471           || eh == htab->etab.hgot))
4472     {
4473       sym->st_shndx = SHN_ABS;
4474     }
4475
4476   return TRUE;
4477 }
4478
4479 /* Used to decide how to sort relocs in an optimal manner for the
4480    dynamic linker, before writing them out.  */
4481
4482 static enum elf_reloc_type_class
4483 elf32_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
4484 {
4485   /* Handle TLS relocs first; we don't want them to be marked
4486      relative by the "if (ELF32_R_SYM (rela->r_info) == 0)"
4487      check below.  */
4488   switch ((int) ELF32_R_TYPE (rela->r_info))
4489     {
4490       case R_PARISC_TLS_DTPMOD32:
4491       case R_PARISC_TLS_DTPOFF32:
4492       case R_PARISC_TLS_TPREL32:
4493         return reloc_class_normal;
4494     }
4495
4496   if (ELF32_R_SYM (rela->r_info) == 0)
4497     return reloc_class_relative;
4498
4499   switch ((int) ELF32_R_TYPE (rela->r_info))
4500     {
4501     case R_PARISC_IPLT:
4502       return reloc_class_plt;
4503     case R_PARISC_COPY:
4504       return reloc_class_copy;
4505     default:
4506       return reloc_class_normal;
4507     }
4508 }
4509
4510 /* Finish up the dynamic sections.  */
4511
4512 static bfd_boolean
4513 elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
4514                                     struct bfd_link_info *info)
4515 {
4516   bfd *dynobj;
4517   struct elf32_hppa_link_hash_table *htab;
4518   asection *sdyn;
4519
4520   htab = hppa_link_hash_table (info);
4521   if (htab == NULL)
4522     return FALSE;
4523
4524   dynobj = htab->etab.dynobj;
4525
4526   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4527
4528   if (htab->etab.dynamic_sections_created)
4529     {
4530       Elf32_External_Dyn *dyncon, *dynconend;
4531
4532       if (sdyn == NULL)
4533         abort ();
4534
4535       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4536       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4537       for (; dyncon < dynconend; dyncon++)
4538         {
4539           Elf_Internal_Dyn dyn;
4540           asection *s;
4541
4542           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4543
4544           switch (dyn.d_tag)
4545             {
4546             default:
4547               continue;
4548
4549             case DT_PLTGOT:
4550               /* Use PLTGOT to set the GOT register.  */
4551               dyn.d_un.d_ptr = elf_gp (output_bfd);
4552               break;
4553
4554             case DT_JMPREL:
4555               s = htab->srelplt;
4556               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4557               break;
4558
4559             case DT_PLTRELSZ:
4560               s = htab->srelplt;
4561               dyn.d_un.d_val = s->size;
4562               break;
4563
4564             case DT_RELASZ:
4565               /* Don't count procedure linkage table relocs in the
4566                  overall reloc count.  */
4567               s = htab->srelplt;
4568               if (s == NULL)
4569                 continue;
4570               dyn.d_un.d_val -= s->size;
4571               break;
4572
4573             case DT_RELA:
4574               /* We may not be using the standard ELF linker script.
4575                  If .rela.plt is the first .rela section, we adjust
4576                  DT_RELA to not include it.  */
4577               s = htab->srelplt;
4578               if (s == NULL)
4579                 continue;
4580               if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
4581                 continue;
4582               dyn.d_un.d_ptr += s->size;
4583               break;
4584             }
4585
4586           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4587         }
4588     }
4589
4590   if (htab->sgot != NULL && htab->sgot->size != 0)
4591     {
4592       /* Fill in the first entry in the global offset table.
4593          We use it to point to our dynamic section, if we have one.  */
4594       bfd_put_32 (output_bfd,
4595                   sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
4596                   htab->sgot->contents);
4597
4598       /* The second entry is reserved for use by the dynamic linker.  */
4599       memset (htab->sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
4600
4601       /* Set .got entry size.  */
4602       elf_section_data (htab->sgot->output_section)
4603         ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
4604     }
4605
4606   if (htab->splt != NULL && htab->splt->size != 0)
4607     {
4608       /* Set plt entry size.  */
4609       elf_section_data (htab->splt->output_section)
4610         ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
4611
4612       if (htab->need_plt_stub)
4613         {
4614           /* Set up the .plt stub.  */
4615           memcpy (htab->splt->contents
4616                   + htab->splt->size - sizeof (plt_stub),
4617                   plt_stub, sizeof (plt_stub));
4618
4619           if ((htab->splt->output_offset
4620                + htab->splt->output_section->vma
4621                + htab->splt->size)
4622               != (htab->sgot->output_offset
4623                   + htab->sgot->output_section->vma))
4624             {
4625               (*_bfd_error_handler)
4626                 (_(".got section not immediately after .plt section"));
4627               return FALSE;
4628             }
4629         }
4630     }
4631
4632   return TRUE;
4633 }
4634
4635 /* Called when writing out an object file to decide the type of a
4636    symbol.  */
4637 static int
4638 elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
4639 {
4640   if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4641     return STT_PARISC_MILLI;
4642   else
4643     return type;
4644 }
4645
4646 /* Misc BFD support code.  */
4647 #define bfd_elf32_bfd_is_local_label_name    elf_hppa_is_local_label_name
4648 #define bfd_elf32_bfd_reloc_type_lookup      elf_hppa_reloc_type_lookup
4649 #define bfd_elf32_bfd_reloc_name_lookup      elf_hppa_reloc_name_lookup
4650 #define elf_info_to_howto                    elf_hppa_info_to_howto
4651 #define elf_info_to_howto_rel                elf_hppa_info_to_howto_rel
4652
4653 /* Stuff for the BFD linker.  */
4654 #define bfd_elf32_mkobject                   elf32_hppa_mkobject
4655 #define bfd_elf32_bfd_final_link             elf32_hppa_final_link
4656 #define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
4657 #define bfd_elf32_bfd_link_hash_table_free   elf32_hppa_link_hash_table_free
4658 #define elf_backend_adjust_dynamic_symbol    elf32_hppa_adjust_dynamic_symbol
4659 #define elf_backend_copy_indirect_symbol     elf32_hppa_copy_indirect_symbol
4660 #define elf_backend_check_relocs             elf32_hppa_check_relocs
4661 #define elf_backend_create_dynamic_sections  elf32_hppa_create_dynamic_sections
4662 #define elf_backend_fake_sections            elf_hppa_fake_sections
4663 #define elf_backend_relocate_section         elf32_hppa_relocate_section
4664 #define elf_backend_hide_symbol              elf32_hppa_hide_symbol
4665 #define elf_backend_finish_dynamic_symbol    elf32_hppa_finish_dynamic_symbol
4666 #define elf_backend_finish_dynamic_sections  elf32_hppa_finish_dynamic_sections
4667 #define elf_backend_size_dynamic_sections    elf32_hppa_size_dynamic_sections
4668 #define elf_backend_init_index_section       _bfd_elf_init_1_index_section
4669 #define elf_backend_gc_mark_hook             elf32_hppa_gc_mark_hook
4670 #define elf_backend_gc_sweep_hook            elf32_hppa_gc_sweep_hook
4671 #define elf_backend_grok_prstatus            elf32_hppa_grok_prstatus
4672 #define elf_backend_grok_psinfo              elf32_hppa_grok_psinfo
4673 #define elf_backend_object_p                 elf32_hppa_object_p
4674 #define elf_backend_final_write_processing   elf_hppa_final_write_processing
4675 #define elf_backend_post_process_headers     _bfd_elf_set_osabi
4676 #define elf_backend_get_symbol_type          elf32_hppa_elf_get_symbol_type
4677 #define elf_backend_reloc_type_class         elf32_hppa_reloc_type_class
4678 #define elf_backend_action_discarded         elf_hppa_action_discarded
4679
4680 #define elf_backend_can_gc_sections          1
4681 #define elf_backend_can_refcount             1
4682 #define elf_backend_plt_alignment            2
4683 #define elf_backend_want_got_plt             0
4684 #define elf_backend_plt_readonly             0
4685 #define elf_backend_want_plt_sym             0
4686 #define elf_backend_got_header_size          8
4687 #define elf_backend_rela_normal              1
4688
4689 #define TARGET_BIG_SYM          bfd_elf32_hppa_vec
4690 #define TARGET_BIG_NAME         "elf32-hppa"
4691 #define ELF_ARCH                bfd_arch_hppa
4692 #define ELF_MACHINE_CODE        EM_PARISC
4693 #define ELF_MAXPAGESIZE         0x1000
4694 #define ELF_OSABI               ELFOSABI_HPUX
4695 #define elf32_bed               elf32_hppa_hpux_bed
4696
4697 #include "elf32-target.h"
4698
4699 #undef TARGET_BIG_SYM
4700 #define TARGET_BIG_SYM          bfd_elf32_hppa_linux_vec
4701 #undef TARGET_BIG_NAME
4702 #define TARGET_BIG_NAME         "elf32-hppa-linux"
4703 #undef ELF_OSABI
4704 #define ELF_OSABI               ELFOSABI_LINUX
4705 #undef elf32_bed
4706 #define elf32_bed               elf32_hppa_linux_bed
4707
4708 #include "elf32-target.h"
4709
4710 #undef TARGET_BIG_SYM
4711 #define TARGET_BIG_SYM          bfd_elf32_hppa_nbsd_vec
4712 #undef TARGET_BIG_NAME
4713 #define TARGET_BIG_NAME         "elf32-hppa-netbsd"
4714 #undef ELF_OSABI
4715 #define ELF_OSABI               ELFOSABI_NETBSD
4716 #undef elf32_bed
4717 #define elf32_bed               elf32_hppa_netbsd_bed
4718
4719 #include "elf32-target.h"