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