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