PR ld/2218
[external/binutils.git] / bfd / elf32-hppa.c
1 /* BFD back-end for HP PA-RISC ELF files.
2    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001,
3    2002, 2003, 2004, 2005, 2006 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 (hh->dyn_relocs != NULL
2024           && eh->root.type == bfd_link_hash_undefweak)
2025         {
2026           if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT)
2027             hh->dyn_relocs = NULL;
2028
2029           /* Make sure undefined weak symbols are output as a dynamic
2030              symbol in PIEs.  */
2031           else if (eh->dynindx == -1
2032                    && !eh->forced_local)
2033             {
2034               if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2035                 return FALSE;
2036             }
2037         }
2038     }
2039   else
2040     {
2041       /* For the non-shared case, discard space for relocs against
2042          symbols which turn out to need copy relocs or are not
2043          dynamic.  */
2044       
2045       if (!eh->non_got_ref
2046           && ((ELIMINATE_COPY_RELOCS
2047                && eh->def_dynamic
2048                && !eh->def_regular)
2049                || (htab->etab.dynamic_sections_created
2050                    && (eh->root.type == bfd_link_hash_undefweak
2051                        || eh->root.type == bfd_link_hash_undefined))))
2052         {
2053           /* Make sure this symbol is output as a dynamic symbol.
2054              Undefined weak syms won't yet be marked as dynamic.  */
2055           if (eh->dynindx == -1
2056               && !eh->forced_local
2057               && eh->type != STT_PARISC_MILLI)
2058             {
2059               if (! bfd_elf_link_record_dynamic_symbol (info, eh))
2060                 return FALSE;
2061             }
2062
2063           /* If that succeeded, we know we'll be keeping all the
2064              relocs.  */
2065           if (eh->dynindx != -1)
2066             goto keep;
2067         }
2068
2069       hh->dyn_relocs = NULL;
2070       return TRUE;
2071
2072     keep: ;
2073     }
2074
2075   /* Finally, allocate space.  */
2076   for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2077     {
2078       asection *sreloc = elf_section_data (hdh_p->sec)->sreloc;
2079       sreloc->size += hdh_p->count * sizeof (Elf32_External_Rela);
2080     }
2081
2082   return TRUE;
2083 }
2084
2085 /* This function is called via elf_link_hash_traverse to force
2086    millicode symbols local so they do not end up as globals in the
2087    dynamic symbol table.  We ought to be able to do this in
2088    adjust_dynamic_symbol, but our adjust_dynamic_symbol is not called
2089    for all dynamic symbols.  Arguably, this is a bug in
2090    elf_adjust_dynamic_symbol.  */
2091
2092 static bfd_boolean
2093 clobber_millicode_symbols (struct elf_link_hash_entry *eh,
2094                            struct bfd_link_info *info)
2095 {
2096   if (eh->root.type == bfd_link_hash_warning)
2097     eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2098
2099   if (eh->type == STT_PARISC_MILLI
2100       && !eh->forced_local)
2101     {
2102       elf32_hppa_hide_symbol (info, eh, TRUE);
2103     }
2104   return TRUE;
2105 }
2106
2107 /* Find any dynamic relocs that apply to read-only sections.  */
2108
2109 static bfd_boolean
2110 readonly_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
2111 {
2112   struct elf32_hppa_link_hash_entry *hh;
2113   struct elf32_hppa_dyn_reloc_entry *hdh_p;
2114
2115   if (eh->root.type == bfd_link_hash_warning)
2116     eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
2117
2118   hh = hppa_elf_hash_entry (eh);
2119   for (hdh_p = hh->dyn_relocs; hdh_p != NULL; hdh_p = hdh_p->hdh_next)
2120     {
2121       asection *sec = hdh_p->sec->output_section;
2122
2123       if (sec != NULL && (sec->flags & SEC_READONLY) != 0)
2124         {
2125           struct bfd_link_info *info = inf;
2126
2127           info->flags |= DF_TEXTREL;
2128
2129           /* Not an error, just cut short the traversal.  */
2130           return FALSE;
2131         }
2132     }
2133   return TRUE;
2134 }
2135
2136 /* Set the sizes of the dynamic sections.  */
2137
2138 static bfd_boolean
2139 elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
2140                                   struct bfd_link_info *info)
2141 {
2142   struct elf32_hppa_link_hash_table *htab;
2143   bfd *dynobj;
2144   bfd *ibfd;
2145   asection *sec;
2146   bfd_boolean relocs;
2147
2148   htab = hppa_link_hash_table (info);
2149   dynobj = htab->etab.dynobj;
2150   if (dynobj == NULL)
2151     abort ();
2152
2153   if (htab->etab.dynamic_sections_created)
2154     {
2155       /* Set the contents of the .interp section to the interpreter.  */
2156       if (info->executable)
2157         {
2158           sec = bfd_get_section_by_name (dynobj, ".interp");
2159           if (sec == NULL)
2160             abort ();
2161           sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
2162           sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
2163         }
2164
2165       /* Force millicode symbols local.  */
2166       elf_link_hash_traverse (&htab->etab,
2167                               clobber_millicode_symbols,
2168                               info);
2169     }
2170
2171   /* Set up .got and .plt offsets for local syms, and space for local
2172      dynamic relocs.  */
2173   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2174     {
2175       bfd_signed_vma *local_got;
2176       bfd_signed_vma *end_local_got;
2177       bfd_signed_vma *local_plt;
2178       bfd_signed_vma *end_local_plt;
2179       bfd_size_type locsymcount;
2180       Elf_Internal_Shdr *symtab_hdr;
2181       asection *srel;
2182
2183       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
2184         continue;
2185
2186       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2187         {
2188           struct elf32_hppa_dyn_reloc_entry *hdh_p;
2189
2190           for (hdh_p = ((struct elf32_hppa_dyn_reloc_entry *)
2191                     elf_section_data (sec)->local_dynrel);
2192                hdh_p != NULL;
2193                hdh_p = hdh_p->hdh_next)
2194             {
2195               if (!bfd_is_abs_section (hdh_p->sec)
2196                   && bfd_is_abs_section (hdh_p->sec->output_section))
2197                 {
2198                   /* Input section has been discarded, either because
2199                      it is a copy of a linkonce section or due to
2200                      linker script /DISCARD/, so we'll be discarding
2201                      the relocs too.  */
2202                 }
2203               else if (hdh_p->count != 0)
2204                 {
2205                   srel = elf_section_data (hdh_p->sec)->sreloc;
2206                   srel->size += hdh_p->count * sizeof (Elf32_External_Rela);
2207                   if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
2208                     info->flags |= DF_TEXTREL;
2209                 }
2210             }
2211         }
2212
2213       local_got = elf_local_got_refcounts (ibfd);
2214       if (!local_got)
2215         continue;
2216
2217       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2218       locsymcount = symtab_hdr->sh_info;
2219       end_local_got = local_got + locsymcount;
2220       sec = htab->sgot;
2221       srel = htab->srelgot;
2222       for (; local_got < end_local_got; ++local_got)
2223         {
2224           if (*local_got > 0)
2225             {
2226               *local_got = sec->size;
2227               sec->size += GOT_ENTRY_SIZE;
2228               if (info->shared) 
2229                 srel->size += sizeof (Elf32_External_Rela);
2230             }
2231           else
2232             *local_got = (bfd_vma) -1;
2233         }
2234
2235       local_plt = end_local_got;
2236       end_local_plt = local_plt + locsymcount;
2237       if (! htab->etab.dynamic_sections_created)
2238         {
2239           /* Won't be used, but be safe.  */
2240           for (; local_plt < end_local_plt; ++local_plt)
2241             *local_plt = (bfd_vma) -1;
2242         }
2243       else
2244         {
2245           sec = htab->splt;
2246           srel = htab->srelplt;
2247           for (; local_plt < end_local_plt; ++local_plt)
2248             {
2249               if (*local_plt > 0)
2250                 {
2251                   *local_plt = sec->size;
2252                   sec->size += PLT_ENTRY_SIZE;
2253                   if (info->shared)
2254                     srel->size += sizeof (Elf32_External_Rela);
2255                 }
2256               else
2257                 *local_plt = (bfd_vma) -1;
2258             }
2259         }
2260     }
2261
2262   /* Do all the .plt entries without relocs first.  The dynamic linker
2263      uses the last .plt reloc to find the end of the .plt (and hence
2264      the start of the .got) for lazy linking.  */
2265   elf_link_hash_traverse (&htab->etab, allocate_plt_static, info);
2266
2267   /* Allocate global sym .plt and .got entries, and space for global
2268      sym dynamic relocs.  */
2269   elf_link_hash_traverse (&htab->etab, allocate_dynrelocs, info);
2270
2271   /* The check_relocs and adjust_dynamic_symbol entry points have
2272      determined the sizes of the various dynamic sections.  Allocate
2273      memory for them.  */
2274   relocs = FALSE;
2275   for (sec = dynobj->sections; sec != NULL; sec = sec->next)
2276     {
2277       if ((sec->flags & SEC_LINKER_CREATED) == 0)
2278         continue;
2279
2280       if (sec == htab->splt)
2281         {
2282           if (htab->need_plt_stub)
2283             {
2284               /* Make space for the plt stub at the end of the .plt
2285                  section.  We want this stub right at the end, up
2286                  against the .got section.  */
2287               int gotalign = bfd_section_alignment (dynobj, htab->sgot);
2288               int pltalign = bfd_section_alignment (dynobj, sec);
2289               bfd_size_type mask;
2290
2291               if (gotalign > pltalign)
2292                 bfd_set_section_alignment (dynobj, sec, gotalign);
2293               mask = ((bfd_size_type) 1 << gotalign) - 1;
2294               sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
2295             }
2296         }
2297       else if (sec == htab->sgot
2298                || sec == htab->sdynbss)
2299         ;
2300       else if (strncmp (bfd_get_section_name (dynobj, sec), ".rela", 5) == 0)
2301         {
2302           if (sec->size != 0)
2303             {
2304               /* Remember whether there are any reloc sections other
2305                  than .rela.plt.  */
2306               if (sec != htab->srelplt)
2307                 relocs = TRUE;
2308
2309               /* We use the reloc_count field as a counter if we need
2310                  to copy relocs into the output file.  */
2311               sec->reloc_count = 0;
2312             }
2313         }
2314       else
2315         {
2316           /* It's not one of our sections, so don't allocate space.  */
2317           continue;
2318         }
2319
2320       if (sec->size == 0)
2321         {
2322           /* If we don't need this section, strip it from the
2323              output file.  This is mostly to handle .rela.bss and
2324              .rela.plt.  We must create both sections in
2325              create_dynamic_sections, because they must be created
2326              before the linker maps input sections to output
2327              sections.  The linker does that before
2328              adjust_dynamic_symbol is called, and it is that
2329              function which decides whether anything needs to go
2330              into these sections.  */
2331           sec->flags |= SEC_EXCLUDE;
2332           continue;
2333         }
2334
2335       if ((sec->flags & SEC_HAS_CONTENTS) == 0)
2336         continue;
2337
2338       /* Allocate memory for the section contents.  Zero it, because
2339          we may not fill in all the reloc sections.  */
2340       sec->contents = bfd_zalloc (dynobj, sec->size);
2341       if (sec->contents == NULL)
2342         return FALSE;
2343     }
2344
2345   if (htab->etab.dynamic_sections_created)
2346     {
2347       /* Like IA-64 and HPPA64, always create a DT_PLTGOT.  It
2348          actually has nothing to do with the PLT, it is how we
2349          communicate the LTP value of a load module to the dynamic
2350          linker.  */
2351 #define add_dynamic_entry(TAG, VAL) \
2352   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2353
2354       if (!add_dynamic_entry (DT_PLTGOT, 0))
2355         return FALSE;
2356
2357       /* Add some entries to the .dynamic section.  We fill in the
2358          values later, in elf32_hppa_finish_dynamic_sections, but we
2359          must add the entries now so that we get the correct size for
2360          the .dynamic section.  The DT_DEBUG entry is filled in by the
2361          dynamic linker and used by the debugger.  */
2362       if (info->executable)
2363         {
2364           if (!add_dynamic_entry (DT_DEBUG, 0))
2365             return FALSE;
2366         }
2367
2368       if (htab->srelplt->size != 0)
2369         {
2370           if (!add_dynamic_entry (DT_PLTRELSZ, 0)
2371               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
2372               || !add_dynamic_entry (DT_JMPREL, 0))
2373             return FALSE;
2374         }
2375
2376       if (relocs)
2377         {
2378           if (!add_dynamic_entry (DT_RELA, 0)
2379               || !add_dynamic_entry (DT_RELASZ, 0)
2380               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
2381             return FALSE;
2382
2383           /* If any dynamic relocs apply to a read-only section,
2384              then we need a DT_TEXTREL entry.  */
2385           if ((info->flags & DF_TEXTREL) == 0)
2386             elf_link_hash_traverse (&htab->etab, readonly_dynrelocs, info);
2387
2388           if ((info->flags & DF_TEXTREL) != 0)
2389             {
2390               if (!add_dynamic_entry (DT_TEXTREL, 0))
2391                 return FALSE;
2392             }
2393         }
2394     }
2395 #undef add_dynamic_entry
2396
2397   return TRUE;
2398 }
2399
2400 /* External entry points for sizing and building linker stubs.  */
2401
2402 /* Set up various things so that we can make a list of input sections
2403    for each output section included in the link.  Returns -1 on error,
2404    0 when no stubs will be needed, and 1 on success.  */
2405
2406 int
2407 elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
2408 {
2409   bfd *input_bfd;
2410   unsigned int bfd_count;
2411   int top_id, top_index;
2412   asection *section;
2413   asection **input_list, **list;
2414   bfd_size_type amt;
2415   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2416
2417   /* Count the number of input BFDs and find the top input section id.  */
2418   for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0;
2419        input_bfd != NULL;
2420        input_bfd = input_bfd->link_next)
2421     {
2422       bfd_count += 1;
2423       for (section = input_bfd->sections;
2424            section != NULL;
2425            section = section->next)
2426         {
2427           if (top_id < section->id)
2428             top_id = section->id;
2429         }
2430     }
2431   htab->bfd_count = bfd_count;
2432
2433   amt = sizeof (struct map_stub) * (top_id + 1);
2434   htab->stub_group = bfd_zmalloc (amt);
2435   if (htab->stub_group == NULL)
2436     return -1;
2437
2438   /* We can't use output_bfd->section_count here to find the top output
2439      section index as some sections may have been removed, and
2440      strip_excluded_output_sections doesn't renumber the indices.  */
2441   for (section = output_bfd->sections, top_index = 0;
2442        section != NULL;
2443        section = section->next)
2444     {
2445       if (top_index < section->index)
2446         top_index = section->index;
2447     }
2448
2449   htab->top_index = top_index;
2450   amt = sizeof (asection *) * (top_index + 1);
2451   input_list = bfd_malloc (amt);
2452   htab->input_list = input_list;
2453   if (input_list == NULL)
2454     return -1;
2455
2456   /* For sections we aren't interested in, mark their entries with a
2457      value we can check later.  */
2458   list = input_list + top_index;
2459   do
2460     *list = bfd_abs_section_ptr;
2461   while (list-- != input_list);
2462
2463   for (section = output_bfd->sections;
2464        section != NULL;
2465        section = section->next)
2466     {
2467       if ((section->flags & SEC_CODE) != 0)
2468         input_list[section->index] = NULL;
2469     }
2470
2471   return 1;
2472 }
2473
2474 /* The linker repeatedly calls this function for each input section,
2475    in the order that input sections are linked into output sections.
2476    Build lists of input sections to determine groupings between which
2477    we may insert linker stubs.  */
2478
2479 void
2480 elf32_hppa_next_input_section (struct bfd_link_info *info, asection *isec)
2481 {
2482   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2483
2484   if (isec->output_section->index <= htab->top_index)
2485     {
2486       asection **list = htab->input_list + isec->output_section->index;
2487       if (*list != bfd_abs_section_ptr)
2488         {
2489           /* Steal the link_sec pointer for our list.  */
2490 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
2491           /* This happens to make the list in reverse order,
2492              which is what we want.  */
2493           PREV_SEC (isec) = *list;
2494           *list = isec;
2495         }
2496     }
2497 }
2498
2499 /* See whether we can group stub sections together.  Grouping stub
2500    sections may result in fewer stubs.  More importantly, we need to
2501    put all .init* and .fini* stubs at the beginning of the .init or
2502    .fini output sections respectively, because glibc splits the
2503    _init and _fini functions into multiple parts.  Putting a stub in
2504    the middle of a function is not a good idea.  */
2505
2506 static void
2507 group_sections (struct elf32_hppa_link_hash_table *htab,
2508                 bfd_size_type stub_group_size,
2509                 bfd_boolean stubs_always_before_branch)
2510 {
2511   asection **list = htab->input_list + htab->top_index;
2512   do
2513     {
2514       asection *tail = *list;
2515       if (tail == bfd_abs_section_ptr)
2516         continue;
2517       while (tail != NULL)
2518         {
2519           asection *curr;
2520           asection *prev;
2521           bfd_size_type total;
2522           bfd_boolean big_sec;
2523
2524           curr = tail;
2525           total = tail->size;
2526           big_sec = total >= stub_group_size;
2527
2528           while ((prev = PREV_SEC (curr)) != NULL
2529                  && ((total += curr->output_offset - prev->output_offset)
2530                      < stub_group_size))
2531             curr = prev;
2532
2533           /* OK, the size from the start of CURR to the end is less
2534              than 240000 bytes and thus can be handled by one stub
2535              section.  (or the tail section is itself larger than
2536              240000 bytes, in which case we may be toast.)
2537              We should really be keeping track of the total size of
2538              stubs added here, as stubs contribute to the final output
2539              section size.  That's a little tricky, and this way will
2540              only break if stubs added total more than 22144 bytes, or
2541              2768 long branch stubs.  It seems unlikely for more than
2542              2768 different functions to be called, especially from
2543              code only 240000 bytes long.  This limit used to be
2544              250000, but c++ code tends to generate lots of little
2545              functions, and sometimes violated the assumption.  */
2546           do
2547             {
2548               prev = PREV_SEC (tail);
2549               /* Set up this stub group.  */
2550               htab->stub_group[tail->id].link_sec = curr;
2551             }
2552           while (tail != curr && (tail = prev) != NULL);
2553
2554           /* But wait, there's more!  Input sections up to 240000
2555              bytes before the stub section can be handled by it too.
2556              Don't do this if we have a really large section after the
2557              stubs, as adding more stubs increases the chance that
2558              branches may not reach into the stub section.  */
2559           if (!stubs_always_before_branch && !big_sec)
2560             {
2561               total = 0;
2562               while (prev != NULL
2563                      && ((total += tail->output_offset - prev->output_offset)
2564                          < stub_group_size))
2565                 {
2566                   tail = prev;
2567                   prev = PREV_SEC (tail);
2568                   htab->stub_group[tail->id].link_sec = curr;
2569                 }
2570             }
2571           tail = prev;
2572         }
2573     }
2574   while (list-- != htab->input_list);
2575   free (htab->input_list);
2576 #undef PREV_SEC
2577 }
2578
2579 /* Read in all local syms for all input bfds, and create hash entries
2580    for export stubs if we are building a multi-subspace shared lib.
2581    Returns -1 on error, 1 if export stubs created, 0 otherwise.  */
2582
2583 static int
2584 get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info)
2585 {
2586   unsigned int bfd_indx;
2587   Elf_Internal_Sym *local_syms, **all_local_syms;
2588   int stub_changed = 0;
2589   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2590
2591   /* We want to read in symbol extension records only once.  To do this
2592      we need to read in the local symbols in parallel and save them for
2593      later use; so hold pointers to the local symbols in an array.  */
2594   bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
2595   all_local_syms = bfd_zmalloc (amt);
2596   htab->all_local_syms = all_local_syms;
2597   if (all_local_syms == NULL)
2598     return -1;
2599
2600   /* Walk over all the input BFDs, swapping in local symbols.
2601      If we are creating a shared library, create hash entries for the
2602      export stubs.  */
2603   for (bfd_indx = 0;
2604        input_bfd != NULL;
2605        input_bfd = input_bfd->link_next, bfd_indx++)
2606     {
2607       Elf_Internal_Shdr *symtab_hdr;
2608
2609       /* We'll need the symbol table in a second.  */
2610       symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2611       if (symtab_hdr->sh_info == 0)
2612         continue;
2613
2614       /* We need an array of the local symbols attached to the input bfd.  */
2615       local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2616       if (local_syms == NULL)
2617         {
2618           local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr,
2619                                              symtab_hdr->sh_info, 0,
2620                                              NULL, NULL, NULL);
2621           /* Cache them for elf_link_input_bfd.  */
2622           symtab_hdr->contents = (unsigned char *) local_syms;
2623         }
2624       if (local_syms == NULL)
2625         return -1;
2626
2627       all_local_syms[bfd_indx] = local_syms;
2628
2629       if (info->shared && htab->multi_subspace)
2630         {
2631           struct elf_link_hash_entry **eh_syms;
2632           struct elf_link_hash_entry **eh_symend;
2633           unsigned int symcount;
2634
2635           symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
2636                       - symtab_hdr->sh_info);
2637           eh_syms = (struct elf_link_hash_entry **) elf_sym_hashes (input_bfd);
2638           eh_symend = (struct elf_link_hash_entry **) (eh_syms + symcount);
2639
2640           /* Look through the global syms for functions;  We need to
2641              build export stubs for all globally visible functions.  */
2642           for (; eh_syms < eh_symend; eh_syms++)
2643             {
2644               struct elf32_hppa_link_hash_entry *hh;
2645
2646               hh = hppa_elf_hash_entry (*eh_syms);
2647
2648               while (hh->eh.root.type == bfd_link_hash_indirect
2649                      || hh->eh.root.type == bfd_link_hash_warning)
2650                    hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
2651
2652               /* At this point in the link, undefined syms have been
2653                  resolved, so we need to check that the symbol was
2654                  defined in this BFD.  */
2655               if ((hh->eh.root.type == bfd_link_hash_defined
2656                    || hh->eh.root.type == bfd_link_hash_defweak)
2657                   && hh->eh.type == STT_FUNC
2658                   && hh->eh.root.u.def.section->output_section != NULL
2659                   && (hh->eh.root.u.def.section->output_section->owner
2660                       == output_bfd)
2661                   && hh->eh.root.u.def.section->owner == input_bfd
2662                   && hh->eh.def_regular
2663                   && !hh->eh.forced_local
2664                   && ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT)
2665                 {
2666                   asection *sec;
2667                   const char *stub_name;
2668                   struct elf32_hppa_stub_hash_entry *hsh;
2669
2670                   sec = hh->eh.root.u.def.section;
2671                   stub_name = hh->eh.root.root.string;
2672                   hsh = hppa_stub_hash_lookup (&htab->bstab,
2673                                                       stub_name,
2674                                                       FALSE, FALSE);
2675                   if (hsh == NULL)
2676                     {
2677                       hsh = hppa_add_stub (stub_name, sec, htab);
2678                       if (!hsh)
2679                         return -1;
2680
2681                       hsh->target_value = hh->eh.root.u.def.value;
2682                       hsh->target_section = hh->eh.root.u.def.section;
2683                       hsh->stub_type = hppa_stub_export;
2684                       hsh->hh = hh;
2685                       stub_changed = 1;
2686                     }
2687                   else
2688                     {
2689                       (*_bfd_error_handler) (_("%B: duplicate export stub %s"),
2690                                              input_bfd,
2691                                              stub_name);
2692                     }
2693                 }
2694             }
2695         }
2696     }
2697
2698   return stub_changed;
2699 }
2700
2701 /* Determine and set the size of the stub section for a final link.
2702
2703    The basic idea here is to examine all the relocations looking for
2704    PC-relative calls to a target that is unreachable with a "bl"
2705    instruction.  */
2706
2707 bfd_boolean
2708 elf32_hppa_size_stubs
2709   (bfd *output_bfd, bfd *stub_bfd, struct bfd_link_info *info,
2710    bfd_boolean multi_subspace, bfd_signed_vma group_size,
2711    asection * (*add_stub_section) (const char *, asection *),
2712    void (*layout_sections_again) (void))
2713 {
2714   bfd_size_type stub_group_size;
2715   bfd_boolean stubs_always_before_branch;
2716   bfd_boolean stub_changed;
2717   struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
2718
2719   /* Stash our params away.  */
2720   htab->stub_bfd = stub_bfd;
2721   htab->multi_subspace = multi_subspace;
2722   htab->add_stub_section = add_stub_section;
2723   htab->layout_sections_again = layout_sections_again;
2724   stubs_always_before_branch = group_size < 0;
2725   if (group_size < 0)
2726     stub_group_size = -group_size;
2727   else
2728     stub_group_size = group_size;
2729   if (stub_group_size == 1)
2730     {
2731       /* Default values.  */
2732       if (stubs_always_before_branch)
2733         {
2734           stub_group_size = 7680000;
2735           if (htab->has_17bit_branch || htab->multi_subspace)
2736             stub_group_size = 240000;
2737           if (htab->has_12bit_branch)
2738             stub_group_size = 7500;
2739         }
2740       else
2741         {
2742           stub_group_size = 6971392;
2743           if (htab->has_17bit_branch || htab->multi_subspace)
2744             stub_group_size = 217856;
2745           if (htab->has_12bit_branch)
2746             stub_group_size = 6808;
2747         }
2748     }
2749
2750   group_sections (htab, stub_group_size, stubs_always_before_branch);
2751
2752   switch (get_local_syms (output_bfd, info->input_bfds, info))
2753     {
2754     default:
2755       if (htab->all_local_syms)
2756         goto error_ret_free_local;
2757       return FALSE;
2758
2759     case 0:
2760       stub_changed = FALSE;
2761       break;
2762
2763     case 1:
2764       stub_changed = TRUE;
2765       break;
2766     }
2767
2768   while (1)
2769     {
2770       bfd *input_bfd;
2771       unsigned int bfd_indx;
2772       asection *stub_sec;
2773
2774       for (input_bfd = info->input_bfds, bfd_indx = 0;
2775            input_bfd != NULL;
2776            input_bfd = input_bfd->link_next, bfd_indx++)
2777         {
2778           Elf_Internal_Shdr *symtab_hdr;
2779           asection *section;
2780           Elf_Internal_Sym *local_syms;
2781
2782           /* We'll need the symbol table in a second.  */
2783           symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2784           if (symtab_hdr->sh_info == 0)
2785             continue;
2786
2787           local_syms = htab->all_local_syms[bfd_indx];
2788
2789           /* Walk over each section attached to the input bfd.  */
2790           for (section = input_bfd->sections;
2791                section != NULL;
2792                section = section->next)
2793             {
2794               Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2795
2796               /* If there aren't any relocs, then there's nothing more
2797                  to do.  */
2798               if ((section->flags & SEC_RELOC) == 0
2799                   || section->reloc_count == 0)
2800                 continue;
2801
2802               /* If this section is a link-once section that will be
2803                  discarded, then don't create any stubs.  */
2804               if (section->output_section == NULL
2805                   || section->output_section->owner != output_bfd)
2806                 continue;
2807
2808               /* Get the relocs.  */
2809               internal_relocs
2810                 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
2811                                              info->keep_memory);
2812               if (internal_relocs == NULL)
2813                 goto error_ret_free_local;
2814
2815               /* Now examine each relocation.  */
2816               irela = internal_relocs;
2817               irelaend = irela + section->reloc_count;
2818               for (; irela < irelaend; irela++)
2819                 {
2820                   unsigned int r_type, r_indx;
2821                   enum elf32_hppa_stub_type stub_type;
2822                   struct elf32_hppa_stub_hash_entry *hsh;
2823                   asection *sym_sec;
2824                   bfd_vma sym_value;
2825                   bfd_vma destination;
2826                   struct elf32_hppa_link_hash_entry *hh;
2827                   char *stub_name;
2828                   const asection *id_sec;
2829
2830                   r_type = ELF32_R_TYPE (irela->r_info);
2831                   r_indx = ELF32_R_SYM (irela->r_info);
2832
2833                   if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
2834                     {
2835                       bfd_set_error (bfd_error_bad_value);
2836                     error_ret_free_internal:
2837                       if (elf_section_data (section)->relocs == NULL)
2838                         free (internal_relocs);
2839                       goto error_ret_free_local;
2840                     }
2841
2842                   /* Only look for stubs on call instructions.  */
2843                   if (r_type != (unsigned int) R_PARISC_PCREL12F
2844                       && r_type != (unsigned int) R_PARISC_PCREL17F
2845                       && r_type != (unsigned int) R_PARISC_PCREL22F)
2846                     continue;
2847
2848                   /* Now determine the call target, its name, value,
2849                      section.  */
2850                   sym_sec = NULL;
2851                   sym_value = 0;
2852                   destination = 0;
2853                   hh = NULL;
2854                   if (r_indx < symtab_hdr->sh_info)
2855                     {
2856                       /* It's a local symbol.  */
2857                       Elf_Internal_Sym *sym;
2858                       Elf_Internal_Shdr *hdr;
2859
2860                       sym = local_syms + r_indx;
2861                       hdr = elf_elfsections (input_bfd)[sym->st_shndx];
2862                       sym_sec = hdr->bfd_section;
2863                       if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2864                         sym_value = sym->st_value;
2865                       destination = (sym_value + irela->r_addend
2866                                      + sym_sec->output_offset
2867                                      + sym_sec->output_section->vma);
2868                     }
2869                   else
2870                     {
2871                       /* It's an external symbol.  */
2872                       int e_indx;
2873
2874                       e_indx = r_indx - symtab_hdr->sh_info;
2875                       hh = hppa_elf_hash_entry (elf_sym_hashes (input_bfd)[e_indx]);
2876
2877                       while (hh->eh.root.type == bfd_link_hash_indirect
2878                              || hh->eh.root.type == bfd_link_hash_warning)
2879                         hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
2880
2881                       if (hh->eh.root.type == bfd_link_hash_defined
2882                           || hh->eh.root.type == bfd_link_hash_defweak)
2883                         {
2884                           sym_sec = hh->eh.root.u.def.section;
2885                           sym_value = hh->eh.root.u.def.value;
2886                           if (sym_sec->output_section != NULL)
2887                             destination = (sym_value + irela->r_addend
2888                                            + sym_sec->output_offset
2889                                            + sym_sec->output_section->vma);
2890                         }
2891                       else if (hh->eh.root.type == bfd_link_hash_undefweak)
2892                         {
2893                           if (! info->shared)
2894                             continue;
2895                         }
2896                       else if (hh->eh.root.type == bfd_link_hash_undefined)
2897                         {
2898                           if (! (info->unresolved_syms_in_objects == RM_IGNORE
2899                                  && (ELF_ST_VISIBILITY (hh->eh.other)
2900                                      == STV_DEFAULT)
2901                                  && hh->eh.type != STT_PARISC_MILLI))
2902                             continue;
2903                         }
2904                       else
2905                         {
2906                           bfd_set_error (bfd_error_bad_value);
2907                           goto error_ret_free_internal;
2908                         }
2909                     }
2910
2911                   /* Determine what (if any) linker stub is needed.  */
2912                   stub_type = hppa_type_of_stub (section, irela, hh,
2913                                                  destination, info);
2914                   if (stub_type == hppa_stub_none)
2915                     continue;
2916
2917                   /* Support for grouping stub sections.  */
2918                   id_sec = htab->stub_group[section->id].link_sec;
2919
2920                   /* Get the name of this stub.  */
2921                   stub_name = hppa_stub_name (id_sec, sym_sec, hh, irela);
2922                   if (!stub_name)
2923                     goto error_ret_free_internal;
2924
2925                   hsh = hppa_stub_hash_lookup (&htab->bstab,
2926                                                       stub_name,
2927                                                       FALSE, FALSE);
2928                   if (hsh != NULL)
2929                     {
2930                       /* The proper stub has already been created.  */
2931                       free (stub_name);
2932                       continue;
2933                     }
2934
2935                   hsh = hppa_add_stub (stub_name, section, htab);
2936                   if (hsh == NULL)
2937                     {
2938                       free (stub_name);
2939                       goto error_ret_free_internal;
2940                     }
2941
2942                   hsh->target_value = sym_value;
2943                   hsh->target_section = sym_sec;
2944                   hsh->stub_type = stub_type;
2945                   if (info->shared)
2946                     {
2947                       if (stub_type == hppa_stub_import)
2948                         hsh->stub_type = hppa_stub_import_shared;
2949                       else if (stub_type == hppa_stub_long_branch)
2950                         hsh->stub_type = hppa_stub_long_branch_shared;
2951                     }
2952                   hsh->hh = hh;
2953                   stub_changed = TRUE;
2954                 }
2955
2956               /* We're done with the internal relocs, free them.  */
2957               if (elf_section_data (section)->relocs == NULL)
2958                 free (internal_relocs);
2959             }
2960         }
2961
2962       if (!stub_changed)
2963         break;
2964
2965       /* OK, we've added some stubs.  Find out the new size of the
2966          stub sections.  */
2967       for (stub_sec = htab->stub_bfd->sections;
2968            stub_sec != NULL;
2969            stub_sec = stub_sec->next)
2970         stub_sec->size = 0;
2971
2972       bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab);
2973
2974       /* Ask the linker to do its stuff.  */
2975       (*htab->layout_sections_again) ();
2976       stub_changed = FALSE;
2977     }
2978
2979   free (htab->all_local_syms);
2980   return TRUE;
2981
2982  error_ret_free_local:
2983   free (htab->all_local_syms);
2984   return FALSE;
2985 }
2986
2987 /* For a final link, this function is called after we have sized the
2988    stubs to provide a value for __gp.  */
2989
2990 bfd_boolean
2991 elf32_hppa_set_gp (bfd *abfd, struct bfd_link_info *info)
2992 {
2993   struct bfd_link_hash_entry *h;
2994   asection *sec = NULL;
2995   bfd_vma gp_val = 0;
2996   struct elf32_hppa_link_hash_table *htab;
2997
2998   htab = hppa_link_hash_table (info);
2999   h = bfd_link_hash_lookup (&htab->etab.root, "$global$", FALSE, FALSE, FALSE);
3000
3001   if (h != NULL
3002       && (h->type == bfd_link_hash_defined
3003           || h->type == bfd_link_hash_defweak))
3004     {
3005       gp_val = h->u.def.value;
3006       sec = h->u.def.section;
3007     }
3008   else
3009     {
3010       asection *splt = bfd_get_section_by_name (abfd, ".plt");
3011       asection *sgot = bfd_get_section_by_name (abfd, ".got");
3012
3013       /* Choose to point our LTP at, in this order, one of .plt, .got,
3014          or .data, if these sections exist.  In the case of choosing
3015          .plt try to make the LTP ideal for addressing anywhere in the
3016          .plt or .got with a 14 bit signed offset.  Typically, the end
3017          of the .plt is the start of the .got, so choose .plt + 0x2000
3018          if either the .plt or .got is larger than 0x2000.  If both
3019          the .plt and .got are smaller than 0x2000, choose the end of
3020          the .plt section.  */
3021       sec = strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0
3022           ? NULL : splt;
3023       if (sec != NULL)
3024         {
3025           gp_val = sec->size;
3026           if (gp_val > 0x2000 || (sgot && sgot->size > 0x2000))
3027             {
3028               gp_val = 0x2000;
3029             }
3030         }
3031       else
3032         {
3033           sec = sgot;
3034           if (sec != NULL)
3035             {
3036               if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") != 0)
3037                 {
3038                   /* We know we don't have a .plt.  If .got is large,
3039                      offset our LTP.  */
3040                   if (sec->size > 0x2000)
3041                     gp_val = 0x2000;
3042                 }
3043             }
3044           else
3045             {
3046               /* No .plt or .got.  Who cares what the LTP is?  */
3047               sec = bfd_get_section_by_name (abfd, ".data");
3048             }
3049         }
3050
3051       if (h != NULL)
3052         {
3053           h->type = bfd_link_hash_defined;
3054           h->u.def.value = gp_val;
3055           if (sec != NULL)
3056             h->u.def.section = sec;
3057           else
3058             h->u.def.section = bfd_abs_section_ptr;
3059         }
3060     }
3061
3062   if (sec != NULL && sec->output_section != NULL)
3063     gp_val += sec->output_section->vma + sec->output_offset;
3064
3065   elf_gp (abfd) = gp_val;
3066   return TRUE;
3067 }
3068
3069 /* Build all the stubs associated with the current output file.  The
3070    stubs are kept in a hash table attached to the main linker hash
3071    table.  We also set up the .plt entries for statically linked PIC
3072    functions here.  This function is called via hppaelf_finish in the
3073    linker.  */
3074
3075 bfd_boolean
3076 elf32_hppa_build_stubs (struct bfd_link_info *info)
3077 {
3078   asection *stub_sec;
3079   struct bfd_hash_table *table;
3080   struct elf32_hppa_link_hash_table *htab;
3081
3082   htab = hppa_link_hash_table (info);
3083
3084   for (stub_sec = htab->stub_bfd->sections;
3085        stub_sec != NULL;
3086        stub_sec = stub_sec->next)
3087     {
3088       bfd_size_type size;
3089
3090       /* Allocate memory to hold the linker stubs.  */
3091       size = stub_sec->size;
3092       stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
3093       if (stub_sec->contents == NULL && size != 0)
3094         return FALSE;
3095       stub_sec->size = 0;
3096     }
3097
3098   /* Build the stubs as directed by the stub hash table.  */
3099   table = &htab->bstab;
3100   bfd_hash_traverse (table, hppa_build_one_stub, info);
3101
3102   return TRUE;
3103 }
3104
3105 /* Perform a final link.  */
3106
3107 static bfd_boolean
3108 elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
3109 {
3110   /* Invoke the regular ELF linker to do all the work.  */
3111   if (!bfd_elf_final_link (abfd, info))
3112     return FALSE;
3113
3114   /* If we're producing a final executable, sort the contents of the
3115      unwind section.  */
3116   return elf_hppa_sort_unwind (abfd);
3117 }
3118
3119 /* Record the lowest address for the data and text segments.  */
3120
3121 static void
3122 hppa_record_segment_addr (bfd *abfd ATTRIBUTE_UNUSED,
3123                           asection *section,
3124                           void *data)
3125 {
3126   struct elf32_hppa_link_hash_table *htab;
3127
3128   htab = (struct elf32_hppa_link_hash_table*) data;
3129
3130   if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
3131     {
3132       bfd_vma value = section->vma - section->filepos;
3133
3134       if ((section->flags & SEC_READONLY) != 0)
3135         {
3136           if (value < htab->text_segment_base)
3137             htab->text_segment_base = value;
3138         }
3139       else
3140         {
3141           if (value < htab->data_segment_base)
3142             htab->data_segment_base = value;
3143         }
3144     }
3145 }
3146
3147 /* Perform a relocation as part of a final link.  */
3148
3149 static bfd_reloc_status_type
3150 final_link_relocate (asection *input_section,
3151                      bfd_byte *contents,
3152                      const Elf_Internal_Rela *rela,
3153                      bfd_vma value,
3154                      struct elf32_hppa_link_hash_table *htab,
3155                      asection *sym_sec,
3156                      struct elf32_hppa_link_hash_entry *hh,
3157                      struct bfd_link_info *info)
3158 {
3159   int insn;
3160   unsigned int r_type = ELF32_R_TYPE (rela->r_info);
3161   unsigned int orig_r_type = r_type;
3162   reloc_howto_type *howto = elf_hppa_howto_table + r_type;
3163   int r_format = howto->bitsize;
3164   enum hppa_reloc_field_selector_type_alt r_field;
3165   bfd *input_bfd = input_section->owner;
3166   bfd_vma offset = rela->r_offset;
3167   bfd_vma max_branch_offset = 0;
3168   bfd_byte *hit_data = contents + offset;
3169   bfd_signed_vma addend = rela->r_addend;
3170   bfd_vma location;
3171   struct elf32_hppa_stub_hash_entry *hsh = NULL;
3172   int val;  
3173
3174   if (r_type == R_PARISC_NONE)
3175     return bfd_reloc_ok;
3176
3177   insn = bfd_get_32 (input_bfd, hit_data);
3178
3179   /* Find out where we are and where we're going.  */
3180   location = (offset +
3181               input_section->output_offset +
3182               input_section->output_section->vma);
3183
3184   /* If we are not building a shared library, convert DLTIND relocs to
3185      DPREL relocs.  */
3186   if (!info->shared)
3187     {
3188       switch (r_type)
3189         {
3190           case R_PARISC_DLTIND21L:
3191             r_type = R_PARISC_DPREL21L;
3192             break;
3193
3194           case R_PARISC_DLTIND14R:
3195             r_type = R_PARISC_DPREL14R;
3196             break;
3197
3198           case R_PARISC_DLTIND14F:
3199             r_type = R_PARISC_DPREL14F;
3200             break;
3201         }
3202     }
3203
3204   switch (r_type)
3205     {
3206     case R_PARISC_PCREL12F:
3207     case R_PARISC_PCREL17F:
3208     case R_PARISC_PCREL22F:
3209       /* If this call should go via the plt, find the import stub in
3210          the stub hash.  */
3211       if (sym_sec == NULL
3212           || sym_sec->output_section == NULL
3213           || (hh != NULL
3214               && hh->eh.plt.offset != (bfd_vma) -1
3215               && hh->eh.dynindx != -1
3216               && !hh->plabel
3217               && (info->shared
3218                   || !hh->eh.def_regular
3219                   || hh->eh.root.type == bfd_link_hash_defweak)))
3220         {
3221           hsh = hppa_get_stub_entry (input_section, sym_sec,
3222                                             hh, rela, htab);
3223           if (hsh != NULL)
3224             {
3225               value = (hsh->stub_offset
3226                        + hsh->stub_sec->output_offset
3227                        + hsh->stub_sec->output_section->vma);
3228               addend = 0;
3229             }
3230           else if (sym_sec == NULL && hh != NULL
3231                    && hh->eh.root.type == bfd_link_hash_undefweak)
3232             {
3233               /* It's OK if undefined weak.  Calls to undefined weak
3234                  symbols behave as if the "called" function
3235                  immediately returns.  We can thus call to a weak
3236                  function without first checking whether the function
3237                  is defined.  */
3238               value = location;
3239               addend = 8;
3240             }
3241           else
3242             return bfd_reloc_undefined;
3243         }
3244       /* Fall thru.  */
3245
3246     case R_PARISC_PCREL21L:
3247     case R_PARISC_PCREL17C:
3248     case R_PARISC_PCREL17R:
3249     case R_PARISC_PCREL14R:
3250     case R_PARISC_PCREL14F:
3251     case R_PARISC_PCREL32:
3252       /* Make it a pc relative offset.  */
3253       value -= location;
3254       addend -= 8;
3255       break;
3256
3257     case R_PARISC_DPREL21L:
3258     case R_PARISC_DPREL14R:
3259     case R_PARISC_DPREL14F:
3260       /* Convert instructions that use the linkage table pointer (r19) to
3261          instructions that use the global data pointer (dp).  This is the
3262          most efficient way of using PIC code in an incomplete executable,
3263          but the user must follow the standard runtime conventions for
3264          accessing data for this to work.  */
3265       if (orig_r_type == R_PARISC_DLTIND21L)
3266         {
3267           /* Convert addil instructions if the original reloc was a
3268              DLTIND21L.  GCC sometimes uses a register other than r19 for
3269              the operation, so we must convert any addil instruction
3270              that uses this relocation.  */
3271           if ((insn & 0xfc000000) == ((int) OP_ADDIL << 26))
3272             insn = ADDIL_DP;
3273           else
3274             /* We must have a ldil instruction.  It's too hard to find
3275                and convert the associated add instruction, so issue an
3276                error.  */
3277             (*_bfd_error_handler)
3278               (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"),
3279                input_bfd,
3280                input_section,
3281                offset,
3282                howto->name,
3283                insn);
3284         }
3285       else if (orig_r_type == R_PARISC_DLTIND14F)
3286         {
3287           /* This must be a format 1 load/store.  Change the base
3288              register to dp.  */
3289           insn = (insn & 0xfc1ffff) | (27 << 21);
3290         }
3291
3292     /* For all the DP relative relocations, we need to examine the symbol's
3293        section.  If it has no section or if it's a code section, then
3294        "data pointer relative" makes no sense.  In that case we don't
3295        adjust the "value", and for 21 bit addil instructions, we change the
3296        source addend register from %dp to %r0.  This situation commonly
3297        arises for undefined weak symbols and when a variable's "constness"
3298        is declared differently from the way the variable is defined.  For
3299        instance: "extern int foo" with foo defined as "const int foo".  */
3300       if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
3301         {
3302           if ((insn & ((0x3f << 26) | (0x1f << 21)))
3303               == (((int) OP_ADDIL << 26) | (27 << 21)))
3304             {
3305               insn &= ~ (0x1f << 21);
3306             }
3307           /* Now try to make things easy for the dynamic linker.  */
3308
3309           break;
3310         }
3311       /* Fall thru.  */
3312
3313     case R_PARISC_DLTIND21L:
3314     case R_PARISC_DLTIND14R:
3315     case R_PARISC_DLTIND14F:
3316       value -= elf_gp (input_section->output_section->owner);
3317       break;
3318
3319     case R_PARISC_SEGREL32:
3320       if ((sym_sec->flags & SEC_CODE) != 0)
3321         value -= htab->text_segment_base;
3322       else
3323         value -= htab->data_segment_base;
3324       break;
3325
3326     default:
3327       break;
3328     }
3329
3330   switch (r_type)
3331     {
3332     case R_PARISC_DIR32:
3333     case R_PARISC_DIR14F:
3334     case R_PARISC_DIR17F:
3335     case R_PARISC_PCREL17C:
3336     case R_PARISC_PCREL14F:
3337     case R_PARISC_PCREL32:
3338     case R_PARISC_DPREL14F:
3339     case R_PARISC_PLABEL32:
3340     case R_PARISC_DLTIND14F:
3341     case R_PARISC_SEGBASE:
3342     case R_PARISC_SEGREL32:
3343       r_field = e_fsel;
3344       break;
3345
3346     case R_PARISC_DLTIND21L:
3347     case R_PARISC_PCREL21L:
3348     case R_PARISC_PLABEL21L:
3349       r_field = e_lsel;
3350       break;
3351
3352     case R_PARISC_DIR21L:
3353     case R_PARISC_DPREL21L:
3354       r_field = e_lrsel;
3355       break;
3356
3357     case R_PARISC_PCREL17R:
3358     case R_PARISC_PCREL14R:
3359     case R_PARISC_PLABEL14R:
3360     case R_PARISC_DLTIND14R:
3361       r_field = e_rsel;
3362       break;
3363
3364     case R_PARISC_DIR17R:
3365     case R_PARISC_DIR14R:
3366     case R_PARISC_DPREL14R:
3367       r_field = e_rrsel;
3368       break;
3369
3370     case R_PARISC_PCREL12F:
3371     case R_PARISC_PCREL17F:
3372     case R_PARISC_PCREL22F:
3373       r_field = e_fsel;
3374
3375       if (r_type == (unsigned int) R_PARISC_PCREL17F)
3376         {
3377           max_branch_offset = (1 << (17-1)) << 2;
3378         }
3379       else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3380         {
3381           max_branch_offset = (1 << (12-1)) << 2;
3382         }
3383       else
3384         {
3385           max_branch_offset = (1 << (22-1)) << 2;
3386         }
3387
3388       /* sym_sec is NULL on undefined weak syms or when shared on
3389          undefined syms.  We've already checked for a stub for the
3390          shared undefined case.  */
3391       if (sym_sec == NULL)
3392         break;
3393
3394       /* If the branch is out of reach, then redirect the
3395          call to the local stub for this function.  */
3396       if (value + addend + max_branch_offset >= 2*max_branch_offset)
3397         {
3398           hsh = hppa_get_stub_entry (input_section, sym_sec,
3399                                             hh, rela, htab);
3400           if (hsh == NULL)
3401             return bfd_reloc_undefined;
3402
3403           /* Munge up the value and addend so that we call the stub
3404              rather than the procedure directly.  */
3405           value = (hsh->stub_offset
3406                    + hsh->stub_sec->output_offset
3407                    + hsh->stub_sec->output_section->vma
3408                    - location);
3409           addend = -8;
3410         }
3411       break;
3412
3413     /* Something we don't know how to handle.  */
3414     default:
3415       return bfd_reloc_notsupported;
3416     }
3417
3418   /* Make sure we can reach the stub.  */
3419   if (max_branch_offset != 0
3420       && value + addend + max_branch_offset >= 2*max_branch_offset)
3421     {
3422       (*_bfd_error_handler)
3423         (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
3424          input_bfd,
3425          input_section,
3426          offset,
3427          hsh->bh_root.string);
3428       bfd_set_error (bfd_error_bad_value);
3429       return bfd_reloc_notsupported;
3430     }
3431
3432   val = hppa_field_adjust (value, addend, r_field);
3433
3434   switch (r_type)
3435     {
3436     case R_PARISC_PCREL12F:
3437     case R_PARISC_PCREL17C:
3438     case R_PARISC_PCREL17F:
3439     case R_PARISC_PCREL17R:
3440     case R_PARISC_PCREL22F:
3441     case R_PARISC_DIR17F:
3442     case R_PARISC_DIR17R:
3443       /* This is a branch.  Divide the offset by four.
3444          Note that we need to decide whether it's a branch or
3445          otherwise by inspecting the reloc.  Inspecting insn won't
3446          work as insn might be from a .word directive.  */
3447       val >>= 2;
3448       break;
3449
3450     default:
3451       break;
3452     }
3453
3454   insn = hppa_rebuild_insn (insn, val, r_format);
3455
3456   /* Update the instruction word.  */
3457   bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3458   return bfd_reloc_ok;
3459 }
3460
3461 /* Relocate an HPPA ELF section.  */
3462
3463 static bfd_boolean
3464 elf32_hppa_relocate_section (bfd *output_bfd,
3465                              struct bfd_link_info *info,
3466                              bfd *input_bfd,
3467                              asection *input_section,
3468                              bfd_byte *contents,
3469                              Elf_Internal_Rela *relocs,
3470                              Elf_Internal_Sym *local_syms,
3471                              asection **local_sections)
3472 {
3473   bfd_vma *local_got_offsets;
3474   struct elf32_hppa_link_hash_table *htab;
3475   Elf_Internal_Shdr *symtab_hdr;
3476   Elf_Internal_Rela *rela;
3477   Elf_Internal_Rela *relend;
3478
3479   if (info->relocatable)
3480     return TRUE;
3481
3482   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3483
3484   htab = hppa_link_hash_table (info);
3485   local_got_offsets = elf_local_got_offsets (input_bfd);
3486
3487   rela = relocs;
3488   relend = relocs + input_section->reloc_count;
3489   for (; rela < relend; rela++)
3490     {
3491       unsigned int r_type;
3492       reloc_howto_type *howto;
3493       unsigned int r_symndx;
3494       struct elf32_hppa_link_hash_entry *hh;
3495       Elf_Internal_Sym *sym;
3496       asection *sym_sec;
3497       bfd_vma relocation;
3498       bfd_reloc_status_type rstatus;
3499       const char *sym_name;
3500       bfd_boolean plabel;
3501       bfd_boolean warned_undef;
3502
3503       r_type = ELF32_R_TYPE (rela->r_info);
3504       if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3505         {
3506           bfd_set_error (bfd_error_bad_value);
3507           return FALSE;
3508         }
3509       if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3510           || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3511         continue;
3512
3513       /* This is a final link.  */
3514       r_symndx = ELF32_R_SYM (rela->r_info);
3515       hh = NULL;
3516       sym = NULL;
3517       sym_sec = NULL;
3518       warned_undef = FALSE;
3519       if (r_symndx < symtab_hdr->sh_info)
3520         {
3521           /* This is a local symbol, h defaults to NULL.  */
3522           sym = local_syms + r_symndx;
3523           sym_sec = local_sections[r_symndx];
3524           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rela);
3525         }
3526       else
3527         {
3528           struct elf_link_hash_entry *eh;
3529           bfd_boolean unresolved_reloc;
3530           struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3531
3532           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
3533                                    r_symndx, symtab_hdr, sym_hashes,
3534                                    eh, sym_sec, relocation,
3535                                    unresolved_reloc, warned_undef);
3536
3537           if (relocation == 0
3538               && eh->root.type != bfd_link_hash_defined
3539               && eh->root.type != bfd_link_hash_defweak
3540               && eh->root.type != bfd_link_hash_undefweak)
3541             {
3542               if (info->unresolved_syms_in_objects == RM_IGNORE
3543                   && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3544                   && eh->type == STT_PARISC_MILLI)
3545                 {
3546                   if (! info->callbacks->undefined_symbol
3547                       (info, eh->root.root.string, input_bfd,
3548                        input_section, rela->r_offset, FALSE))
3549                     return FALSE;
3550                   warned_undef = TRUE;
3551                 }
3552             }
3553           hh = hppa_elf_hash_entry (eh);
3554         }
3555
3556       /* Do any required modifications to the relocation value, and
3557          determine what types of dynamic info we need to output, if
3558          any.  */
3559       plabel = 0;
3560       switch (r_type)
3561         {
3562         case R_PARISC_DLTIND14F:
3563         case R_PARISC_DLTIND14R:
3564         case R_PARISC_DLTIND21L:
3565           {
3566             bfd_vma off;
3567             bfd_boolean do_got = 0;
3568
3569             /* Relocation is to the entry for this symbol in the
3570                global offset table.  */
3571             if (hh != NULL)
3572               {
3573                 bfd_boolean dyn;
3574
3575                 off = hh->eh.got.offset;
3576                 dyn = htab->etab.dynamic_sections_created;
3577                 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
3578                                                        &hh->eh))
3579                   {
3580                     /* If we aren't going to call finish_dynamic_symbol,
3581                        then we need to handle initialisation of the .got
3582                        entry and create needed relocs here.  Since the
3583                        offset must always be a multiple of 4, we use the
3584                        least significant bit to record whether we have
3585                        initialised it already.  */
3586                     if ((off & 1) != 0)
3587                       off &= ~1;
3588                     else
3589                       {
3590                         hh->eh.got.offset |= 1;
3591                         do_got = 1;
3592                       }
3593                   }
3594               }
3595             else
3596               {
3597                 /* Local symbol case.  */
3598                 if (local_got_offsets == NULL)
3599                   abort ();
3600
3601                 off = local_got_offsets[r_symndx];
3602
3603                 /* The offset must always be a multiple of 4.  We use
3604                    the least significant bit to record whether we have
3605                    already generated the necessary reloc.  */
3606                 if ((off & 1) != 0)
3607                   off &= ~1;
3608                 else
3609                   {
3610                     local_got_offsets[r_symndx] |= 1;
3611                     do_got = 1;
3612                   }
3613               }
3614
3615             if (do_got)
3616               {
3617                 if (info->shared)
3618                   {
3619                     /* Output a dynamic relocation for this GOT entry.
3620                        In this case it is relative to the base of the
3621                        object because the symbol index is zero.  */
3622                     Elf_Internal_Rela outrel;
3623                     bfd_byte *loc;
3624                     asection *sec = htab->srelgot;
3625
3626                     outrel.r_offset = (off
3627                                        + htab->sgot->output_offset
3628                                        + htab->sgot->output_section->vma);
3629                     outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
3630                     outrel.r_addend = relocation;
3631                     loc = sec->contents;
3632                     loc += sec->reloc_count++ * sizeof (Elf32_External_Rela);
3633                     bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3634                   }
3635                 else
3636                   bfd_put_32 (output_bfd, relocation,
3637                               htab->sgot->contents + off);
3638               }
3639
3640             if (off >= (bfd_vma) -2)
3641               abort ();
3642
3643             /* Add the base of the GOT to the relocation value.  */
3644             relocation = (off
3645                           + htab->sgot->output_offset
3646                           + htab->sgot->output_section->vma);
3647           }
3648           break;
3649
3650         case R_PARISC_SEGREL32:
3651           /* If this is the first SEGREL relocation, then initialize
3652              the segment base values.  */
3653           if (htab->text_segment_base == (bfd_vma) -1)
3654             bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
3655           break;
3656
3657         case R_PARISC_PLABEL14R:
3658         case R_PARISC_PLABEL21L:
3659         case R_PARISC_PLABEL32:
3660           if (htab->etab.dynamic_sections_created)
3661             {
3662               bfd_vma off;
3663               bfd_boolean do_plt = 0;
3664               /* If we have a global symbol with a PLT slot, then
3665                  redirect this relocation to it.  */
3666               if (hh != NULL)
3667                 {
3668                   off = hh->eh.plt.offset;
3669                   if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared,
3670                                                          &hh->eh))
3671                     {
3672                       /* In a non-shared link, adjust_dynamic_symbols
3673                          isn't called for symbols forced local.  We
3674                          need to write out the plt entry here.  */
3675                       if ((off & 1) != 0)
3676                         off &= ~1;
3677                       else
3678                         {
3679                           hh->eh.plt.offset |= 1;
3680                           do_plt = 1;
3681                         }
3682                     }
3683                 }
3684               else
3685                 {
3686                   bfd_vma *local_plt_offsets;
3687
3688                   if (local_got_offsets == NULL)
3689                     abort ();
3690
3691                   local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3692                   off = local_plt_offsets[r_symndx];
3693
3694                   /* As for the local .got entry case, we use the last
3695                      bit to record whether we've already initialised
3696                      this local .plt entry.  */
3697                   if ((off & 1) != 0)
3698                     off &= ~1;
3699                   else
3700                     {
3701                       local_plt_offsets[r_symndx] |= 1;
3702                       do_plt = 1;
3703                     }
3704                 }
3705
3706               if (do_plt)
3707                 {
3708                   if (info->shared)
3709                     {
3710                       /* Output a dynamic IPLT relocation for this
3711                          PLT entry.  */
3712                       Elf_Internal_Rela outrel;
3713                       bfd_byte *loc;
3714                       asection *s = htab->srelplt;
3715
3716                       outrel.r_offset = (off
3717                                          + htab->splt->output_offset
3718                                          + htab->splt->output_section->vma);
3719                       outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3720                       outrel.r_addend = relocation;
3721                       loc = s->contents;
3722                       loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
3723                       bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3724                     }
3725                   else
3726                     {
3727                       bfd_put_32 (output_bfd,
3728                                   relocation,
3729                                   htab->splt->contents + off);
3730                       bfd_put_32 (output_bfd,
3731                                   elf_gp (htab->splt->output_section->owner),
3732                                   htab->splt->contents + off + 4);
3733                     }
3734                 }
3735
3736               if (off >= (bfd_vma) -2)
3737                 abort ();
3738
3739               /* PLABELs contain function pointers.  Relocation is to
3740                  the entry for the function in the .plt.  The magic +2
3741                  offset signals to $$dyncall that the function pointer
3742                  is in the .plt and thus has a gp pointer too.
3743                  Exception:  Undefined PLABELs should have a value of
3744                  zero.  */
3745               if (hh == NULL
3746                   || (hh->eh.root.type != bfd_link_hash_undefweak
3747                       && hh->eh.root.type != bfd_link_hash_undefined))
3748                 {
3749                   relocation = (off
3750                                 + htab->splt->output_offset
3751                                 + htab->splt->output_section->vma
3752                                 + 2);
3753                 }
3754               plabel = 1;
3755             }
3756           /* Fall through and possibly emit a dynamic relocation.  */
3757
3758         case R_PARISC_DIR17F:
3759         case R_PARISC_DIR17R:
3760         case R_PARISC_DIR14F:
3761         case R_PARISC_DIR14R:
3762         case R_PARISC_DIR21L:
3763         case R_PARISC_DPREL14F:
3764         case R_PARISC_DPREL14R:
3765         case R_PARISC_DPREL21L:
3766         case R_PARISC_DIR32:
3767           /* r_symndx will be zero only for relocs against symbols
3768              from removed linkonce sections, or sections discarded by
3769              a linker script.  */
3770           if (r_symndx == 0
3771               || (input_section->flags & SEC_ALLOC) == 0)
3772             break;
3773
3774           /* The reloc types handled here and this conditional
3775              expression must match the code in ..check_relocs and
3776              allocate_dynrelocs.  ie. We need exactly the same condition
3777              as in ..check_relocs, with some extra conditions (dynindx
3778              test in this case) to cater for relocs removed by
3779              allocate_dynrelocs.  If you squint, the non-shared test
3780              here does indeed match the one in ..check_relocs, the
3781              difference being that here we test DEF_DYNAMIC as well as
3782              !DEF_REGULAR.  All common syms end up with !DEF_REGULAR,
3783              which is why we can't use just that test here.
3784              Conversely, DEF_DYNAMIC can't be used in check_relocs as
3785              there all files have not been loaded.  */
3786           if ((info->shared
3787                && (hh == NULL
3788                    || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
3789                    || hh->eh.root.type != bfd_link_hash_undefweak)
3790                && (IS_ABSOLUTE_RELOC (r_type)
3791                    || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
3792               || (!info->shared
3793                   && hh != NULL
3794                   && hh->eh.dynindx != -1
3795                   && !hh->eh.non_got_ref
3796                   && ((ELIMINATE_COPY_RELOCS
3797                        && hh->eh.def_dynamic
3798                        && !hh->eh.def_regular)
3799                       || hh->eh.root.type == bfd_link_hash_undefweak
3800                       || hh->eh.root.type == bfd_link_hash_undefined)))
3801             {
3802               Elf_Internal_Rela outrel;
3803               bfd_boolean skip;
3804               asection *sreloc;
3805               bfd_byte *loc;
3806
3807               /* When generating a shared object, these relocations
3808                  are copied into the output file to be resolved at run
3809                  time.  */
3810
3811               outrel.r_addend = rela->r_addend;
3812               outrel.r_offset =
3813                 _bfd_elf_section_offset (output_bfd, info, input_section,
3814                                          rela->r_offset);
3815               skip = (outrel.r_offset == (bfd_vma) -1
3816                       || outrel.r_offset == (bfd_vma) -2);
3817               outrel.r_offset += (input_section->output_offset
3818                                   + input_section->output_section->vma);
3819                       
3820               if (skip)
3821                 {
3822                   memset (&outrel, 0, sizeof (outrel));
3823                 }
3824               else if (hh != NULL
3825                        && hh->eh.dynindx != -1
3826                        && (plabel
3827                            || !IS_ABSOLUTE_RELOC (r_type)
3828                            || !info->shared
3829                            || !info->symbolic
3830                            || !hh->eh.def_regular))
3831                 {
3832                   outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
3833                 }
3834               else /* It's a local symbol, or one marked to become local.  */
3835                 {
3836                   int indx = 0;
3837
3838                   /* Add the absolute offset of the symbol.  */
3839                   outrel.r_addend += relocation;
3840
3841                   /* Global plabels need to be processed by the
3842                      dynamic linker so that functions have at most one
3843                      fptr.  For this reason, we need to differentiate
3844                      between global and local plabels, which we do by
3845                      providing the function symbol for a global plabel
3846                      reloc, and no symbol for local plabels.  */
3847                   if (! plabel
3848                       && sym_sec != NULL
3849                       && sym_sec->output_section != NULL
3850                       && ! bfd_is_abs_section (sym_sec))
3851                     {
3852                       /* Skip this relocation if the output section has
3853                          been discarded.  */
3854                       if (bfd_is_abs_section (sym_sec->output_section))
3855                         break;
3856
3857                       indx = elf_section_data (sym_sec->output_section)->dynindx;
3858                       /* We are turning this relocation into one
3859                          against a section symbol, so subtract out the
3860                          output section's address but not the offset
3861                          of the input section in the output section.  */
3862                       outrel.r_addend -= sym_sec->output_section->vma;
3863                     }
3864
3865                   outrel.r_info = ELF32_R_INFO (indx, r_type);
3866                 }
3867               sreloc = elf_section_data (input_section)->sreloc;
3868               if (sreloc == NULL)
3869                 abort ();
3870
3871               loc = sreloc->contents;
3872               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
3873               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3874             }
3875           break;
3876
3877         default:
3878           break;
3879         }
3880
3881       rstatus = final_link_relocate (input_section, contents, rela, relocation,
3882                                htab, sym_sec, hh, info);
3883
3884       if (rstatus == bfd_reloc_ok)
3885         continue;
3886
3887       if (hh != NULL)
3888         sym_name = hh->eh.root.root.string;
3889       else
3890         {
3891           sym_name = bfd_elf_string_from_elf_section (input_bfd,
3892                                                       symtab_hdr->sh_link,
3893                                                       sym->st_name);
3894           if (sym_name == NULL)
3895             return FALSE;
3896           if (*sym_name == '\0')
3897             sym_name = bfd_section_name (input_bfd, sym_sec);
3898         }
3899
3900       howto = elf_hppa_howto_table + r_type;
3901
3902       if (rstatus == bfd_reloc_undefined || rstatus == bfd_reloc_notsupported)
3903         {
3904           if (rstatus == bfd_reloc_notsupported || !warned_undef)
3905             {
3906               (*_bfd_error_handler)
3907                 (_("%B(%A+0x%lx): cannot handle %s for %s"),
3908                  input_bfd,
3909                  input_section,
3910                  (long) rela->r_offset,
3911                  howto->name,
3912                  sym_name);
3913               bfd_set_error (bfd_error_bad_value);
3914               return FALSE;
3915             }
3916         }
3917       else
3918         {
3919           if (!((*info->callbacks->reloc_overflow)
3920                 (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
3921                  (bfd_vma) 0, input_bfd, input_section, rela->r_offset)))
3922             return FALSE;
3923         }
3924     }
3925
3926   return TRUE;
3927 }
3928
3929 /* Finish up dynamic symbol handling.  We set the contents of various
3930    dynamic sections here.  */
3931
3932 static bfd_boolean
3933 elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
3934                                   struct bfd_link_info *info,
3935                                   struct elf_link_hash_entry *eh,
3936                                   Elf_Internal_Sym *sym)
3937 {
3938   struct elf32_hppa_link_hash_table *htab;
3939   Elf_Internal_Rela rela;
3940   bfd_byte *loc;
3941
3942   htab = hppa_link_hash_table (info);
3943
3944   if (eh->plt.offset != (bfd_vma) -1)
3945     {
3946       bfd_vma value;
3947
3948       if (eh->plt.offset & 1)
3949         abort ();
3950
3951       /* This symbol has an entry in the procedure linkage table.  Set
3952          it up.
3953
3954          The format of a plt entry is
3955          <funcaddr>
3956          <__gp>
3957       */
3958       value = 0;
3959       if (eh->root.type == bfd_link_hash_defined
3960           || eh->root.type == bfd_link_hash_defweak)
3961         {
3962           value = eh->root.u.def.value;
3963           if (eh->root.u.def.section->output_section != NULL)
3964             value += (eh->root.u.def.section->output_offset
3965                       + eh->root.u.def.section->output_section->vma);
3966         }
3967
3968       /* Create a dynamic IPLT relocation for this entry.  */
3969       rela.r_offset = (eh->plt.offset
3970                       + htab->splt->output_offset
3971                       + htab->splt->output_section->vma);
3972       if (eh->dynindx != -1)
3973         {
3974           rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT);
3975           rela.r_addend = 0;
3976         }
3977       else
3978         {
3979           /* This symbol has been marked to become local, and is
3980              used by a plabel so must be kept in the .plt.  */
3981           rela.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3982           rela.r_addend = value;
3983         }
3984
3985       loc = htab->srelplt->contents;
3986       loc += htab->srelplt->reloc_count++ * sizeof (Elf32_External_Rela);
3987       bfd_elf32_swap_reloca_out (htab->splt->output_section->owner, &rela, loc);
3988
3989       if (!eh->def_regular)
3990         {
3991           /* Mark the symbol as undefined, rather than as defined in
3992              the .plt section.  Leave the value alone.  */
3993           sym->st_shndx = SHN_UNDEF;
3994         }
3995     }
3996
3997   if (eh->got.offset != (bfd_vma) -1)
3998     {
3999       /* This symbol has an entry in the global offset table.  Set it
4000          up.  */
4001
4002       rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
4003                       + htab->sgot->output_offset
4004                       + htab->sgot->output_section->vma);
4005
4006       /* If this is a -Bsymbolic link and the symbol is defined
4007          locally or was forced to be local because of a version file,
4008          we just want to emit a RELATIVE reloc.  The entry in the
4009          global offset table will already have been initialized in the
4010          relocate_section function.  */
4011       if (info->shared
4012           && (info->symbolic || eh->dynindx == -1)
4013           && eh->def_regular)
4014         {
4015           rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
4016           rela.r_addend = (eh->root.u.def.value
4017                           + eh->root.u.def.section->output_offset
4018                           + eh->root.u.def.section->output_section->vma);
4019         }
4020       else
4021         {
4022           if ((eh->got.offset & 1) != 0)
4023             abort ();
4024
4025           bfd_put_32 (output_bfd, 0, htab->sgot->contents + (eh->got.offset & ~1));
4026           rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32);
4027           rela.r_addend = 0;
4028         }
4029
4030       loc = htab->srelgot->contents;
4031       loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4032       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4033     }
4034
4035   if (eh->needs_copy)
4036     {
4037       asection *sec;
4038
4039       /* This symbol needs a copy reloc.  Set it up.  */
4040
4041       if (! (eh->dynindx != -1
4042              && (eh->root.type == bfd_link_hash_defined
4043                  || eh->root.type == bfd_link_hash_defweak)))
4044         abort ();
4045
4046       sec = htab->srelbss;
4047
4048       rela.r_offset = (eh->root.u.def.value
4049                       + eh->root.u.def.section->output_offset
4050                       + eh->root.u.def.section->output_section->vma);
4051       rela.r_addend = 0;
4052       rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY);
4053       loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela);
4054       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4055     }
4056
4057   /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
4058   if (eh->root.root.string[0] == '_'
4059       && (strcmp (eh->root.root.string, "_DYNAMIC") == 0
4060           || strcmp (eh->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0))
4061     {
4062       sym->st_shndx = SHN_ABS;
4063     }
4064
4065   return TRUE;
4066 }
4067
4068 /* Used to decide how to sort relocs in an optimal manner for the
4069    dynamic linker, before writing them out.  */
4070
4071 static enum elf_reloc_type_class
4072 elf32_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
4073 {
4074   if (ELF32_R_SYM (rela->r_info) == 0)
4075     return reloc_class_relative;
4076
4077   switch ((int) ELF32_R_TYPE (rela->r_info))
4078     {
4079     case R_PARISC_IPLT:
4080       return reloc_class_plt;
4081     case R_PARISC_COPY:
4082       return reloc_class_copy;
4083     default:
4084       return reloc_class_normal;
4085     }
4086 }
4087
4088 /* Finish up the dynamic sections.  */
4089
4090 static bfd_boolean
4091 elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
4092                                     struct bfd_link_info *info)
4093 {
4094   bfd *dynobj;
4095   struct elf32_hppa_link_hash_table *htab;
4096   asection *sdyn;
4097
4098   htab = hppa_link_hash_table (info);
4099   dynobj = htab->etab.dynobj;
4100
4101   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4102
4103   if (htab->etab.dynamic_sections_created)
4104     {
4105       Elf32_External_Dyn *dyncon, *dynconend;
4106
4107       if (sdyn == NULL)
4108         abort ();
4109
4110       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4111       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4112       for (; dyncon < dynconend; dyncon++)
4113         {
4114           Elf_Internal_Dyn dyn;
4115           asection *s;
4116
4117           bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4118
4119           switch (dyn.d_tag)
4120             {
4121             default:
4122               continue;
4123
4124             case DT_PLTGOT:
4125               /* Use PLTGOT to set the GOT register.  */
4126               dyn.d_un.d_ptr = elf_gp (output_bfd);
4127               break;
4128
4129             case DT_JMPREL:
4130               s = htab->srelplt;
4131               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4132               break;
4133
4134             case DT_PLTRELSZ:
4135               s = htab->srelplt;
4136               dyn.d_un.d_val = s->size;
4137               break;
4138
4139             case DT_RELASZ:
4140               /* Don't count procedure linkage table relocs in the
4141                  overall reloc count.  */
4142               s = htab->srelplt;
4143               if (s == NULL)
4144                 continue;
4145               dyn.d_un.d_val -= s->size;
4146               break;
4147
4148             case DT_RELA:
4149               /* We may not be using the standard ELF linker script.
4150                  If .rela.plt is the first .rela section, we adjust
4151                  DT_RELA to not include it.  */
4152               s = htab->srelplt;
4153               if (s == NULL)
4154                 continue;
4155               if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
4156                 continue;
4157               dyn.d_un.d_ptr += s->size;
4158               break;
4159             }
4160
4161           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4162         }
4163     }
4164
4165   if (htab->sgot != NULL && htab->sgot->size != 0)
4166     {
4167       /* Fill in the first entry in the global offset table.
4168          We use it to point to our dynamic section, if we have one.  */
4169       bfd_put_32 (output_bfd,
4170                   sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
4171                   htab->sgot->contents);
4172
4173       /* The second entry is reserved for use by the dynamic linker.  */
4174       memset (htab->sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
4175
4176       /* Set .got entry size.  */
4177       elf_section_data (htab->sgot->output_section)
4178         ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
4179     }
4180
4181   if (htab->splt != NULL && htab->splt->size != 0)
4182     {
4183       /* Set plt entry size.  */
4184       elf_section_data (htab->splt->output_section)
4185         ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
4186
4187       if (htab->need_plt_stub)
4188         {
4189           /* Set up the .plt stub.  */
4190           memcpy (htab->splt->contents
4191                   + htab->splt->size - sizeof (plt_stub),
4192                   plt_stub, sizeof (plt_stub));
4193
4194           if ((htab->splt->output_offset
4195                + htab->splt->output_section->vma
4196                + htab->splt->size)
4197               != (htab->sgot->output_offset
4198                   + htab->sgot->output_section->vma))
4199             {
4200               (*_bfd_error_handler)
4201                 (_(".got section not immediately after .plt section"));
4202               return FALSE;
4203             }
4204         }
4205     }
4206
4207   return TRUE;
4208 }
4209
4210 /* Tweak the OSABI field of the elf header.  */
4211
4212 static void
4213 elf32_hppa_post_process_headers (bfd *abfd,
4214                                  struct bfd_link_info *info ATTRIBUTE_UNUSED)
4215 {
4216   Elf_Internal_Ehdr * i_ehdrp;
4217
4218   i_ehdrp = elf_elfheader (abfd);
4219
4220   if (strcmp (bfd_get_target (abfd), "elf32-hppa-linux") == 0)
4221     {
4222       i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_LINUX;
4223     }
4224   else if (strcmp (bfd_get_target (abfd), "elf32-hppa-netbsd") == 0)
4225     {
4226       i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_NETBSD;
4227     }
4228   else
4229     {
4230       i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_HPUX;
4231     }
4232 }
4233
4234 /* Called when writing out an object file to decide the type of a
4235    symbol.  */
4236 static int
4237 elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
4238 {
4239   if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4240     return STT_PARISC_MILLI;
4241   else
4242     return type;
4243 }
4244
4245 /* Misc BFD support code.  */
4246 #define bfd_elf32_bfd_is_local_label_name    elf_hppa_is_local_label_name
4247 #define bfd_elf32_bfd_reloc_type_lookup      elf_hppa_reloc_type_lookup
4248 #define elf_info_to_howto                    elf_hppa_info_to_howto
4249 #define elf_info_to_howto_rel                elf_hppa_info_to_howto_rel
4250
4251 /* Stuff for the BFD linker.  */
4252 #define bfd_elf32_bfd_final_link             elf32_hppa_final_link
4253 #define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
4254 #define bfd_elf32_bfd_link_hash_table_free   elf32_hppa_link_hash_table_free
4255 #define elf_backend_adjust_dynamic_symbol    elf32_hppa_adjust_dynamic_symbol
4256 #define elf_backend_copy_indirect_symbol     elf32_hppa_copy_indirect_symbol
4257 #define elf_backend_check_relocs             elf32_hppa_check_relocs
4258 #define elf_backend_create_dynamic_sections  elf32_hppa_create_dynamic_sections
4259 #define elf_backend_fake_sections            elf_hppa_fake_sections
4260 #define elf_backend_relocate_section         elf32_hppa_relocate_section
4261 #define elf_backend_hide_symbol              elf32_hppa_hide_symbol
4262 #define elf_backend_finish_dynamic_symbol    elf32_hppa_finish_dynamic_symbol
4263 #define elf_backend_finish_dynamic_sections  elf32_hppa_finish_dynamic_sections
4264 #define elf_backend_size_dynamic_sections    elf32_hppa_size_dynamic_sections
4265 #define elf_backend_gc_mark_hook             elf32_hppa_gc_mark_hook
4266 #define elf_backend_gc_sweep_hook            elf32_hppa_gc_sweep_hook
4267 #define elf_backend_grok_prstatus            elf32_hppa_grok_prstatus
4268 #define elf_backend_grok_psinfo              elf32_hppa_grok_psinfo
4269 #define elf_backend_object_p                 elf32_hppa_object_p
4270 #define elf_backend_final_write_processing   elf_hppa_final_write_processing
4271 #define elf_backend_post_process_headers     elf32_hppa_post_process_headers
4272 #define elf_backend_get_symbol_type          elf32_hppa_elf_get_symbol_type
4273 #define elf_backend_reloc_type_class         elf32_hppa_reloc_type_class
4274 #define elf_backend_action_discarded         elf_hppa_action_discarded
4275
4276 #define elf_backend_can_gc_sections          1
4277 #define elf_backend_can_refcount             1
4278 #define elf_backend_plt_alignment            2
4279 #define elf_backend_want_got_plt             0
4280 #define elf_backend_plt_readonly             0
4281 #define elf_backend_want_plt_sym             0
4282 #define elf_backend_got_header_size          8
4283 #define elf_backend_rela_normal              1
4284
4285 #define TARGET_BIG_SYM          bfd_elf32_hppa_vec
4286 #define TARGET_BIG_NAME         "elf32-hppa"
4287 #define ELF_ARCH                bfd_arch_hppa
4288 #define ELF_MACHINE_CODE        EM_PARISC
4289 #define ELF_MAXPAGESIZE         0x1000
4290
4291 #include "elf32-target.h"
4292
4293 #undef TARGET_BIG_SYM
4294 #define TARGET_BIG_SYM                  bfd_elf32_hppa_linux_vec
4295 #undef TARGET_BIG_NAME
4296 #define TARGET_BIG_NAME                 "elf32-hppa-linux"
4297
4298 #define INCLUDED_TARGET_FILE 1
4299 #include "elf32-target.h"
4300
4301 #undef TARGET_BIG_SYM
4302 #define TARGET_BIG_SYM                  bfd_elf32_hppa_nbsd_vec
4303 #undef TARGET_BIG_NAME
4304 #define TARGET_BIG_NAME                 "elf32-hppa-netbsd"
4305
4306 #include "elf32-target.h"