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