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