OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf32-hppa.c] - Blame information for rev 163

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.