OSDN Git Service

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