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