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 279

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 166 khays
          case R_PARISC_TLS_GD21L:
3353
          case R_PARISC_TLS_LDM21L:
3354
          case R_PARISC_TLS_IE21L:
3355 14 khays
            r_type = R_PARISC_DPREL21L;
3356
            break;
3357
 
3358
          case R_PARISC_DLTIND14R:
3359 166 khays
          case R_PARISC_TLS_GD14R:
3360
          case R_PARISC_TLS_LDM14R:
3361
          case R_PARISC_TLS_IE14R:
3362 14 khays
            r_type = R_PARISC_DPREL14R;
3363
            break;
3364
 
3365
          case R_PARISC_DLTIND14F:
3366
            r_type = R_PARISC_DPREL14F;
3367
            break;
3368
        }
3369
    }
3370
 
3371
  switch (r_type)
3372
    {
3373
    case R_PARISC_PCREL12F:
3374
    case R_PARISC_PCREL17F:
3375
    case R_PARISC_PCREL22F:
3376
      /* If this call should go via the plt, find the import stub in
3377
         the stub hash.  */
3378
      if (sym_sec == NULL
3379
          || sym_sec->output_section == NULL
3380
          || (hh != NULL
3381
              && hh->eh.plt.offset != (bfd_vma) -1
3382
              && hh->eh.dynindx != -1
3383
              && !hh->plabel
3384
              && (info->shared
3385
                  || !hh->eh.def_regular
3386
                  || hh->eh.root.type == bfd_link_hash_defweak)))
3387
        {
3388
          hsh = hppa_get_stub_entry (input_section, sym_sec,
3389
                                            hh, rela, htab);
3390
          if (hsh != NULL)
3391
            {
3392
              value = (hsh->stub_offset
3393
                       + hsh->stub_sec->output_offset
3394
                       + hsh->stub_sec->output_section->vma);
3395
              addend = 0;
3396
            }
3397
          else if (sym_sec == NULL && hh != NULL
3398
                   && hh->eh.root.type == bfd_link_hash_undefweak)
3399
            {
3400
              /* It's OK if undefined weak.  Calls to undefined weak
3401
                 symbols behave as if the "called" function
3402
                 immediately returns.  We can thus call to a weak
3403
                 function without first checking whether the function
3404
                 is defined.  */
3405
              value = location;
3406
              addend = 8;
3407
            }
3408
          else
3409
            return bfd_reloc_undefined;
3410
        }
3411
      /* Fall thru.  */
3412
 
3413
    case R_PARISC_PCREL21L:
3414
    case R_PARISC_PCREL17C:
3415
    case R_PARISC_PCREL17R:
3416
    case R_PARISC_PCREL14R:
3417
    case R_PARISC_PCREL14F:
3418
    case R_PARISC_PCREL32:
3419
      /* Make it a pc relative offset.  */
3420
      value -= location;
3421
      addend -= 8;
3422
      break;
3423
 
3424
    case R_PARISC_DPREL21L:
3425
    case R_PARISC_DPREL14R:
3426
    case R_PARISC_DPREL14F:
3427
      /* Convert instructions that use the linkage table pointer (r19) to
3428
         instructions that use the global data pointer (dp).  This is the
3429
         most efficient way of using PIC code in an incomplete executable,
3430
         but the user must follow the standard runtime conventions for
3431
         accessing data for this to work.  */
3432 166 khays
      if (orig_r_type != r_type)
3433 14 khays
        {
3434 166 khays
          if (r_type == R_PARISC_DPREL21L)
3435
            {
3436
              /* GCC sometimes uses a register other than r19 for the
3437
                 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 (r_type == R_PARISC_DPREL14F)
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 14 khays
        }
3460
 
3461 166 khays
      /* For all the DP relative relocations, we need to examine the symbol's
3462
         section.  If it has no section or if it's a code section, then
3463
         "data pointer relative" makes no sense.  In that case we don't
3464
         adjust the "value", and for 21 bit addil instructions, we change the
3465
         source addend register from %dp to %r0.  This situation commonly
3466
         arises for undefined weak symbols and when a variable's "constness"
3467
         is declared differently from the way the variable is defined.  For
3468
         instance: "extern int foo" with foo defined as "const int foo".  */
3469 14 khays
      if (sym_sec == NULL || (sym_sec->flags & SEC_CODE) != 0)
3470
        {
3471
          if ((insn & ((0x3f << 26) | (0x1f << 21)))
3472
              == (((int) OP_ADDIL << 26) | (27 << 21)))
3473
            {
3474
              insn &= ~ (0x1f << 21);
3475
            }
3476
          /* Now try to make things easy for the dynamic linker.  */
3477
 
3478
          break;
3479
        }
3480
      /* Fall thru.  */
3481
 
3482
    case R_PARISC_DLTIND21L:
3483
    case R_PARISC_DLTIND14R:
3484
    case R_PARISC_DLTIND14F:
3485 166 khays
    case R_PARISC_TLS_GD21L:
3486
    case R_PARISC_TLS_LDM21L:
3487
    case R_PARISC_TLS_IE21L:
3488 14 khays
    case R_PARISC_TLS_GD14R:
3489
    case R_PARISC_TLS_LDM14R:
3490
    case R_PARISC_TLS_IE14R:
3491
      value -= elf_gp (input_section->output_section->owner);
3492
      break;
3493
 
3494
    case R_PARISC_SEGREL32:
3495
      if ((sym_sec->flags & SEC_CODE) != 0)
3496
        value -= htab->text_segment_base;
3497
      else
3498
        value -= htab->data_segment_base;
3499
      break;
3500
 
3501
    default:
3502
      break;
3503
    }
3504
 
3505
  switch (r_type)
3506
    {
3507
    case R_PARISC_DIR32:
3508
    case R_PARISC_DIR14F:
3509
    case R_PARISC_DIR17F:
3510
    case R_PARISC_PCREL17C:
3511
    case R_PARISC_PCREL14F:
3512
    case R_PARISC_PCREL32:
3513
    case R_PARISC_DPREL14F:
3514
    case R_PARISC_PLABEL32:
3515
    case R_PARISC_DLTIND14F:
3516
    case R_PARISC_SEGBASE:
3517
    case R_PARISC_SEGREL32:
3518
    case R_PARISC_TLS_DTPMOD32:
3519
    case R_PARISC_TLS_DTPOFF32:
3520
    case R_PARISC_TLS_TPREL32:
3521
      r_field = e_fsel;
3522
      break;
3523
 
3524
    case R_PARISC_DLTIND21L:
3525
    case R_PARISC_PCREL21L:
3526
    case R_PARISC_PLABEL21L:
3527
      r_field = e_lsel;
3528
      break;
3529
 
3530
    case R_PARISC_DIR21L:
3531
    case R_PARISC_DPREL21L:
3532
    case R_PARISC_TLS_GD21L:
3533
    case R_PARISC_TLS_LDM21L:
3534
    case R_PARISC_TLS_LDO21L:
3535
    case R_PARISC_TLS_IE21L:
3536
    case R_PARISC_TLS_LE21L:
3537
      r_field = e_lrsel;
3538
      break;
3539
 
3540
    case R_PARISC_PCREL17R:
3541
    case R_PARISC_PCREL14R:
3542
    case R_PARISC_PLABEL14R:
3543
    case R_PARISC_DLTIND14R:
3544
      r_field = e_rsel;
3545
      break;
3546
 
3547
    case R_PARISC_DIR17R:
3548
    case R_PARISC_DIR14R:
3549
    case R_PARISC_DPREL14R:
3550
    case R_PARISC_TLS_GD14R:
3551
    case R_PARISC_TLS_LDM14R:
3552
    case R_PARISC_TLS_LDO14R:
3553
    case R_PARISC_TLS_IE14R:
3554
    case R_PARISC_TLS_LE14R:
3555
      r_field = e_rrsel;
3556
      break;
3557
 
3558
    case R_PARISC_PCREL12F:
3559
    case R_PARISC_PCREL17F:
3560
    case R_PARISC_PCREL22F:
3561
      r_field = e_fsel;
3562
 
3563
      if (r_type == (unsigned int) R_PARISC_PCREL17F)
3564
        {
3565
          max_branch_offset = (1 << (17-1)) << 2;
3566
        }
3567
      else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3568
        {
3569
          max_branch_offset = (1 << (12-1)) << 2;
3570
        }
3571
      else
3572
        {
3573
          max_branch_offset = (1 << (22-1)) << 2;
3574
        }
3575
 
3576
      /* sym_sec is NULL on undefined weak syms or when shared on
3577
         undefined syms.  We've already checked for a stub for the
3578
         shared undefined case.  */
3579
      if (sym_sec == NULL)
3580
        break;
3581
 
3582
      /* If the branch is out of reach, then redirect the
3583
         call to the local stub for this function.  */
3584
      if (value + addend + max_branch_offset >= 2*max_branch_offset)
3585
        {
3586
          hsh = hppa_get_stub_entry (input_section, sym_sec,
3587
                                            hh, rela, htab);
3588
          if (hsh == NULL)
3589
            return bfd_reloc_undefined;
3590
 
3591
          /* Munge up the value and addend so that we call the stub
3592
             rather than the procedure directly.  */
3593
          value = (hsh->stub_offset
3594
                   + hsh->stub_sec->output_offset
3595
                   + hsh->stub_sec->output_section->vma
3596
                   - location);
3597
          addend = -8;
3598
        }
3599
      break;
3600
 
3601
    /* Something we don't know how to handle.  */
3602
    default:
3603
      return bfd_reloc_notsupported;
3604
    }
3605
 
3606
  /* Make sure we can reach the stub.  */
3607
  if (max_branch_offset != 0
3608
      && value + addend + max_branch_offset >= 2*max_branch_offset)
3609
    {
3610
      (*_bfd_error_handler)
3611
        (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"),
3612
         input_bfd,
3613
         input_section,
3614
         (long) offset,
3615
         hsh->bh_root.string);
3616
      bfd_set_error (bfd_error_bad_value);
3617
      return bfd_reloc_notsupported;
3618
    }
3619
 
3620
  val = hppa_field_adjust (value, addend, r_field);
3621
 
3622
  switch (r_type)
3623
    {
3624
    case R_PARISC_PCREL12F:
3625
    case R_PARISC_PCREL17C:
3626
    case R_PARISC_PCREL17F:
3627
    case R_PARISC_PCREL17R:
3628
    case R_PARISC_PCREL22F:
3629
    case R_PARISC_DIR17F:
3630
    case R_PARISC_DIR17R:
3631
      /* This is a branch.  Divide the offset by four.
3632
         Note that we need to decide whether it's a branch or
3633
         otherwise by inspecting the reloc.  Inspecting insn won't
3634
         work as insn might be from a .word directive.  */
3635
      val >>= 2;
3636
      break;
3637
 
3638
    default:
3639
      break;
3640
    }
3641
 
3642
  insn = hppa_rebuild_insn (insn, val, r_format);
3643
 
3644
  /* Update the instruction word.  */
3645
  bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3646
  return bfd_reloc_ok;
3647
}
3648
 
3649
/* Relocate an HPPA ELF section.  */
3650
 
3651
static bfd_boolean
3652
elf32_hppa_relocate_section (bfd *output_bfd,
3653
                             struct bfd_link_info *info,
3654
                             bfd *input_bfd,
3655
                             asection *input_section,
3656
                             bfd_byte *contents,
3657
                             Elf_Internal_Rela *relocs,
3658
                             Elf_Internal_Sym *local_syms,
3659
                             asection **local_sections)
3660
{
3661
  bfd_vma *local_got_offsets;
3662
  struct elf32_hppa_link_hash_table *htab;
3663
  Elf_Internal_Shdr *symtab_hdr;
3664
  Elf_Internal_Rela *rela;
3665
  Elf_Internal_Rela *relend;
3666
 
3667
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3668
 
3669
  htab = hppa_link_hash_table (info);
3670
  if (htab == NULL)
3671
    return FALSE;
3672
 
3673
  local_got_offsets = elf_local_got_offsets (input_bfd);
3674
 
3675
  rela = relocs;
3676
  relend = relocs + input_section->reloc_count;
3677
  for (; rela < relend; rela++)
3678
    {
3679
      unsigned int r_type;
3680
      reloc_howto_type *howto;
3681
      unsigned int r_symndx;
3682
      struct elf32_hppa_link_hash_entry *hh;
3683
      Elf_Internal_Sym *sym;
3684
      asection *sym_sec;
3685
      bfd_vma relocation;
3686
      bfd_reloc_status_type rstatus;
3687
      const char *sym_name;
3688
      bfd_boolean plabel;
3689
      bfd_boolean warned_undef;
3690
 
3691
      r_type = ELF32_R_TYPE (rela->r_info);
3692
      if (r_type >= (unsigned int) R_PARISC_UNIMPLEMENTED)
3693
        {
3694
          bfd_set_error (bfd_error_bad_value);
3695
          return FALSE;
3696
        }
3697
      if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3698
          || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3699
        continue;
3700
 
3701
      r_symndx = ELF32_R_SYM (rela->r_info);
3702
      hh = NULL;
3703
      sym = NULL;
3704
      sym_sec = NULL;
3705
      warned_undef = FALSE;
3706
      if (r_symndx < symtab_hdr->sh_info)
3707
        {
3708
          /* This is a local symbol, h defaults to NULL.  */
3709
          sym = local_syms + r_symndx;
3710
          sym_sec = local_sections[r_symndx];
3711
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rela);
3712
        }
3713
      else
3714
        {
3715
          struct elf_link_hash_entry *eh;
3716
          bfd_boolean unresolved_reloc;
3717
          struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3718
 
3719
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
3720
                                   r_symndx, symtab_hdr, sym_hashes,
3721
                                   eh, sym_sec, relocation,
3722
                                   unresolved_reloc, warned_undef);
3723
 
3724
          if (!info->relocatable
3725
              && relocation == 0
3726
              && eh->root.type != bfd_link_hash_defined
3727
              && eh->root.type != bfd_link_hash_defweak
3728
              && eh->root.type != bfd_link_hash_undefweak)
3729
            {
3730
              if (info->unresolved_syms_in_objects == RM_IGNORE
3731
                  && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3732
                  && eh->type == STT_PARISC_MILLI)
3733
                {
3734
                  if (! info->callbacks->undefined_symbol
3735
                      (info, eh_name (eh), input_bfd,
3736
                       input_section, rela->r_offset, FALSE))
3737
                    return FALSE;
3738
                  warned_undef = TRUE;
3739
                }
3740
            }
3741
          hh = hppa_elf_hash_entry (eh);
3742
        }
3743
 
3744
      if (sym_sec != NULL && elf_discarded_section (sym_sec))
3745
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3746
                                         rela, relend,
3747
                                         elf_hppa_howto_table + r_type,
3748
                                         contents);
3749
 
3750
      if (info->relocatable)
3751
        continue;
3752
 
3753
      /* Do any required modifications to the relocation value, and
3754
         determine what types of dynamic info we need to output, if
3755
         any.  */
3756
      plabel = 0;
3757
      switch (r_type)
3758
        {
3759
        case R_PARISC_DLTIND14F:
3760
        case R_PARISC_DLTIND14R:
3761
        case R_PARISC_DLTIND21L:
3762
          {
3763
            bfd_vma off;
3764
            bfd_boolean do_got = 0;
3765
 
3766
            /* Relocation is to the entry for this symbol in the
3767
               global offset table.  */
3768
            if (hh != NULL)
3769
              {
3770
                bfd_boolean dyn;
3771
 
3772
                off = hh->eh.got.offset;
3773
                dyn = htab->etab.dynamic_sections_created;
3774
                if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
3775
                                                       &hh->eh))
3776
                  {
3777
                    /* If we aren't going to call finish_dynamic_symbol,
3778
                       then we need to handle initialisation of the .got
3779
                       entry and create needed relocs here.  Since the
3780
                       offset must always be a multiple of 4, we use the
3781
                       least significant bit to record whether we have
3782
                       initialised it already.  */
3783
                    if ((off & 1) != 0)
3784
                      off &= ~1;
3785
                    else
3786
                      {
3787
                        hh->eh.got.offset |= 1;
3788
                        do_got = 1;
3789
                      }
3790
                  }
3791
              }
3792
            else
3793
              {
3794
                /* Local symbol case.  */
3795
                if (local_got_offsets == NULL)
3796
                  abort ();
3797
 
3798
                off = local_got_offsets[r_symndx];
3799
 
3800
                /* The offset must always be a multiple of 4.  We use
3801
                   the least significant bit to record whether we have
3802
                   already generated the necessary reloc.  */
3803
                if ((off & 1) != 0)
3804
                  off &= ~1;
3805
                else
3806
                  {
3807
                    local_got_offsets[r_symndx] |= 1;
3808
                    do_got = 1;
3809
                  }
3810
              }
3811
 
3812
            if (do_got)
3813
              {
3814
                if (info->shared)
3815
                  {
3816
                    /* Output a dynamic relocation for this GOT entry.
3817
                       In this case it is relative to the base of the
3818
                       object because the symbol index is zero.  */
3819
                    Elf_Internal_Rela outrel;
3820
                    bfd_byte *loc;
3821
                    asection *sec = htab->srelgot;
3822
 
3823
                    outrel.r_offset = (off
3824
                                       + htab->sgot->output_offset
3825
                                       + htab->sgot->output_section->vma);
3826
                    outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
3827
                    outrel.r_addend = relocation;
3828
                    loc = sec->contents;
3829
                    loc += sec->reloc_count++ * sizeof (Elf32_External_Rela);
3830
                    bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3831
                  }
3832
                else
3833
                  bfd_put_32 (output_bfd, relocation,
3834
                              htab->sgot->contents + off);
3835
              }
3836
 
3837
            if (off >= (bfd_vma) -2)
3838
              abort ();
3839
 
3840
            /* Add the base of the GOT to the relocation value.  */
3841
            relocation = (off
3842
                          + htab->sgot->output_offset
3843
                          + htab->sgot->output_section->vma);
3844
          }
3845
          break;
3846
 
3847
        case R_PARISC_SEGREL32:
3848
          /* If this is the first SEGREL relocation, then initialize
3849
             the segment base values.  */
3850
          if (htab->text_segment_base == (bfd_vma) -1)
3851
            bfd_map_over_sections (output_bfd, hppa_record_segment_addr, htab);
3852
          break;
3853
 
3854
        case R_PARISC_PLABEL14R:
3855
        case R_PARISC_PLABEL21L:
3856
        case R_PARISC_PLABEL32:
3857
          if (htab->etab.dynamic_sections_created)
3858
            {
3859
              bfd_vma off;
3860
              bfd_boolean do_plt = 0;
3861
              /* If we have a global symbol with a PLT slot, then
3862
                 redirect this relocation to it.  */
3863
              if (hh != NULL)
3864
                {
3865
                  off = hh->eh.plt.offset;
3866
                  if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared,
3867
                                                         &hh->eh))
3868
                    {
3869
                      /* In a non-shared link, adjust_dynamic_symbols
3870
                         isn't called for symbols forced local.  We
3871
                         need to write out the plt entry here.  */
3872
                      if ((off & 1) != 0)
3873
                        off &= ~1;
3874
                      else
3875
                        {
3876
                          hh->eh.plt.offset |= 1;
3877
                          do_plt = 1;
3878
                        }
3879
                    }
3880
                }
3881
              else
3882
                {
3883
                  bfd_vma *local_plt_offsets;
3884
 
3885
                  if (local_got_offsets == NULL)
3886
                    abort ();
3887
 
3888
                  local_plt_offsets = local_got_offsets + symtab_hdr->sh_info;
3889
                  off = local_plt_offsets[r_symndx];
3890
 
3891
                  /* As for the local .got entry case, we use the last
3892
                     bit to record whether we've already initialised
3893
                     this local .plt entry.  */
3894
                  if ((off & 1) != 0)
3895
                    off &= ~1;
3896
                  else
3897
                    {
3898
                      local_plt_offsets[r_symndx] |= 1;
3899
                      do_plt = 1;
3900
                    }
3901
                }
3902
 
3903
              if (do_plt)
3904
                {
3905
                  if (info->shared)
3906
                    {
3907
                      /* Output a dynamic IPLT relocation for this
3908
                         PLT entry.  */
3909
                      Elf_Internal_Rela outrel;
3910
                      bfd_byte *loc;
3911
                      asection *s = htab->srelplt;
3912
 
3913
                      outrel.r_offset = (off
3914
                                         + htab->splt->output_offset
3915
                                         + htab->splt->output_section->vma);
3916
                      outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
3917
                      outrel.r_addend = relocation;
3918
                      loc = s->contents;
3919
                      loc += s->reloc_count++ * sizeof (Elf32_External_Rela);
3920
                      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
3921
                    }
3922
                  else
3923
                    {
3924
                      bfd_put_32 (output_bfd,
3925
                                  relocation,
3926
                                  htab->splt->contents + off);
3927
                      bfd_put_32 (output_bfd,
3928
                                  elf_gp (htab->splt->output_section->owner),
3929
                                  htab->splt->contents + off + 4);
3930
                    }
3931
                }
3932
 
3933
              if (off >= (bfd_vma) -2)
3934
                abort ();
3935
 
3936
              /* PLABELs contain function pointers.  Relocation is to
3937
                 the entry for the function in the .plt.  The magic +2
3938
                 offset signals to $$dyncall that the function pointer
3939
                 is in the .plt and thus has a gp pointer too.
3940
                 Exception:  Undefined PLABELs should have a value of
3941
                 zero.  */
3942
              if (hh == NULL
3943
                  || (hh->eh.root.type != bfd_link_hash_undefweak
3944
                      && hh->eh.root.type != bfd_link_hash_undefined))
3945
                {
3946
                  relocation = (off
3947
                                + htab->splt->output_offset
3948
                                + htab->splt->output_section->vma
3949
                                + 2);
3950
                }
3951
              plabel = 1;
3952
            }
3953
          /* Fall through and possibly emit a dynamic relocation.  */
3954
 
3955
        case R_PARISC_DIR17F:
3956
        case R_PARISC_DIR17R:
3957
        case R_PARISC_DIR14F:
3958
        case R_PARISC_DIR14R:
3959
        case R_PARISC_DIR21L:
3960
        case R_PARISC_DPREL14F:
3961
        case R_PARISC_DPREL14R:
3962
        case R_PARISC_DPREL21L:
3963
        case R_PARISC_DIR32:
3964
          if ((input_section->flags & SEC_ALLOC) == 0)
3965
            break;
3966
 
3967
          /* The reloc types handled here and this conditional
3968
             expression must match the code in ..check_relocs and
3969
             allocate_dynrelocs.  ie. We need exactly the same condition
3970
             as in ..check_relocs, with some extra conditions (dynindx
3971
             test in this case) to cater for relocs removed by
3972
             allocate_dynrelocs.  If you squint, the non-shared test
3973
             here does indeed match the one in ..check_relocs, the
3974
             difference being that here we test DEF_DYNAMIC as well as
3975
             !DEF_REGULAR.  All common syms end up with !DEF_REGULAR,
3976
             which is why we can't use just that test here.
3977
             Conversely, DEF_DYNAMIC can't be used in check_relocs as
3978
             there all files have not been loaded.  */
3979
          if ((info->shared
3980
               && (hh == NULL
3981
                   || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
3982
                   || hh->eh.root.type != bfd_link_hash_undefweak)
3983
               && (IS_ABSOLUTE_RELOC (r_type)
3984
                   || !SYMBOL_CALLS_LOCAL (info, &hh->eh)))
3985
              || (!info->shared
3986
                  && hh != NULL
3987
                  && hh->eh.dynindx != -1
3988
                  && !hh->eh.non_got_ref
3989
                  && ((ELIMINATE_COPY_RELOCS
3990
                       && hh->eh.def_dynamic
3991
                       && !hh->eh.def_regular)
3992
                      || hh->eh.root.type == bfd_link_hash_undefweak
3993
                      || hh->eh.root.type == bfd_link_hash_undefined)))
3994
            {
3995
              Elf_Internal_Rela outrel;
3996
              bfd_boolean skip;
3997
              asection *sreloc;
3998
              bfd_byte *loc;
3999
 
4000
              /* When generating a shared object, these relocations
4001
                 are copied into the output file to be resolved at run
4002
                 time.  */
4003
 
4004
              outrel.r_addend = rela->r_addend;
4005
              outrel.r_offset =
4006
                _bfd_elf_section_offset (output_bfd, info, input_section,
4007
                                         rela->r_offset);
4008
              skip = (outrel.r_offset == (bfd_vma) -1
4009
                      || outrel.r_offset == (bfd_vma) -2);
4010
              outrel.r_offset += (input_section->output_offset
4011
                                  + input_section->output_section->vma);
4012
 
4013
              if (skip)
4014
                {
4015
                  memset (&outrel, 0, sizeof (outrel));
4016
                }
4017
              else if (hh != NULL
4018
                       && hh->eh.dynindx != -1
4019
                       && (plabel
4020
                           || !IS_ABSOLUTE_RELOC (r_type)
4021
                           || !info->shared
4022
                           || !info->symbolic
4023
                           || !hh->eh.def_regular))
4024
                {
4025
                  outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type);
4026
                }
4027
              else /* It's a local symbol, or one marked to become local.  */
4028
                {
4029
                  int indx = 0;
4030
 
4031
                  /* Add the absolute offset of the symbol.  */
4032
                  outrel.r_addend += relocation;
4033
 
4034
                  /* Global plabels need to be processed by the
4035
                     dynamic linker so that functions have at most one
4036
                     fptr.  For this reason, we need to differentiate
4037
                     between global and local plabels, which we do by
4038
                     providing the function symbol for a global plabel
4039
                     reloc, and no symbol for local plabels.  */
4040
                  if (! plabel
4041
                      && sym_sec != NULL
4042
                      && sym_sec->output_section != NULL
4043
                      && ! bfd_is_abs_section (sym_sec))
4044
                    {
4045
                      asection *osec;
4046
 
4047
                      osec = sym_sec->output_section;
4048
                      indx = elf_section_data (osec)->dynindx;
4049
                      if (indx == 0)
4050
                        {
4051
                          osec = htab->etab.text_index_section;
4052
                          indx = elf_section_data (osec)->dynindx;
4053
                        }
4054
                      BFD_ASSERT (indx != 0);
4055
 
4056
                      /* We are turning this relocation into one
4057
                         against a section symbol, so subtract out the
4058
                         output section's address but not the offset
4059
                         of the input section in the output section.  */
4060
                      outrel.r_addend -= osec->vma;
4061
                    }
4062
 
4063
                  outrel.r_info = ELF32_R_INFO (indx, r_type);
4064
                }
4065
              sreloc = elf_section_data (input_section)->sreloc;
4066
              if (sreloc == NULL)
4067
                abort ();
4068
 
4069
              loc = sreloc->contents;
4070
              loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
4071
              bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4072
            }
4073
          break;
4074
 
4075
        case R_PARISC_TLS_LDM21L:
4076
        case R_PARISC_TLS_LDM14R:
4077
          {
4078
            bfd_vma off;
4079
 
4080
            off = htab->tls_ldm_got.offset;
4081
            if (off & 1)
4082
              off &= ~1;
4083
            else
4084
              {
4085
                Elf_Internal_Rela outrel;
4086
                bfd_byte *loc;
4087
 
4088
                outrel.r_offset = (off
4089
                                   + htab->sgot->output_section->vma
4090
                                   + htab->sgot->output_offset);
4091
                outrel.r_addend = 0;
4092
                outrel.r_info = ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32);
4093
                loc = htab->srelgot->contents;
4094
                loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4095
 
4096
                bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4097
                htab->tls_ldm_got.offset |= 1;
4098
              }
4099
 
4100
            /* Add the base of the GOT to the relocation value.  */
4101
            relocation = (off
4102
                          + htab->sgot->output_offset
4103
                          + htab->sgot->output_section->vma);
4104
 
4105
            break;
4106
          }
4107
 
4108
        case R_PARISC_TLS_LDO21L:
4109
        case R_PARISC_TLS_LDO14R:
4110
          relocation -= dtpoff_base (info);
4111
          break;
4112
 
4113
        case R_PARISC_TLS_GD21L:
4114
        case R_PARISC_TLS_GD14R:
4115
        case R_PARISC_TLS_IE21L:
4116
        case R_PARISC_TLS_IE14R:
4117
          {
4118
            bfd_vma off;
4119
            int indx;
4120
            char tls_type;
4121
 
4122
            indx = 0;
4123
            if (hh != NULL)
4124
              {
4125
                bfd_boolean dyn;
4126
                dyn = htab->etab.dynamic_sections_created;
4127
 
4128
                if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &hh->eh)
4129
                    && (!info->shared
4130
                        || !SYMBOL_REFERENCES_LOCAL (info, &hh->eh)))
4131
                  {
4132
                    indx = hh->eh.dynindx;
4133
                  }
4134
                off = hh->eh.got.offset;
4135
                tls_type = hh->tls_type;
4136
              }
4137
            else
4138
              {
4139
                off = local_got_offsets[r_symndx];
4140
                tls_type = hppa_elf_local_got_tls_type (input_bfd)[r_symndx];
4141
              }
4142
 
4143
            if (tls_type == GOT_UNKNOWN)
4144
              abort ();
4145
 
4146
            if ((off & 1) != 0)
4147
              off &= ~1;
4148
            else
4149
              {
4150
                bfd_boolean need_relocs = FALSE;
4151
                Elf_Internal_Rela outrel;
4152
                bfd_byte *loc = NULL;
4153
                int cur_off = off;
4154
 
4155
                /* The GOT entries have not been initialized yet.  Do it
4156
                   now, and emit any relocations.  If both an IE GOT and a
4157
                   GD GOT are necessary, we emit the GD first.  */
4158
 
4159
                if ((info->shared || indx != 0)
4160
                    && (hh == NULL
4161
                        || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT
4162
                        || hh->eh.root.type != bfd_link_hash_undefweak))
4163
                  {
4164
                    need_relocs = TRUE;
4165
                    loc = htab->srelgot->contents;
4166
                    /* FIXME (CAO): Should this be reloc_count++ ? */
4167
                    loc += htab->srelgot->reloc_count * sizeof (Elf32_External_Rela);
4168
                  }
4169
 
4170
                if (tls_type & GOT_TLS_GD)
4171
                  {
4172
                    if (need_relocs)
4173
                      {
4174
                        outrel.r_offset = (cur_off
4175
                                           + htab->sgot->output_section->vma
4176
                                           + htab->sgot->output_offset);
4177
                        outrel.r_info = ELF32_R_INFO (indx,R_PARISC_TLS_DTPMOD32);
4178
                        outrel.r_addend = 0;
4179
                        bfd_put_32 (output_bfd, 0, htab->sgot->contents + cur_off);
4180
                        bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4181
                        htab->srelgot->reloc_count++;
4182
                        loc += sizeof (Elf32_External_Rela);
4183
 
4184
                        if (indx == 0)
4185
                          bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4186
                                      htab->sgot->contents + cur_off + 4);
4187
                        else
4188
                          {
4189
                            bfd_put_32 (output_bfd, 0,
4190
                                        htab->sgot->contents + cur_off + 4);
4191
                            outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_DTPOFF32);
4192
                            outrel.r_offset += 4;
4193
                            bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc);
4194
                            htab->srelgot->reloc_count++;
4195
                            loc += sizeof (Elf32_External_Rela);
4196
                          }
4197
                      }
4198
                    else
4199
                      {
4200
                        /* If we are not emitting relocations for a
4201
                           general dynamic reference, then we must be in a
4202
                           static link or an executable link with the
4203
                           symbol binding locally.  Mark it as belonging
4204
                           to module 1, the executable.  */
4205
                        bfd_put_32 (output_bfd, 1,
4206
                                    htab->sgot->contents + cur_off);
4207
                        bfd_put_32 (output_bfd, relocation - dtpoff_base (info),
4208
                                    htab->sgot->contents + cur_off + 4);
4209
                      }
4210
 
4211
 
4212
                    cur_off += 8;
4213
                  }
4214
 
4215
                if (tls_type & GOT_TLS_IE)
4216
                  {
4217
                    if (need_relocs)
4218
                      {
4219
                        outrel.r_offset = (cur_off
4220
                                           + htab->sgot->output_section->vma
4221
                                           + htab->sgot->output_offset);
4222
                        outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_TPREL32);
4223
 
4224
                        if (indx == 0)
4225
                          outrel.r_addend = relocation - dtpoff_base (info);
4226
                        else
4227
                          outrel.r_addend = 0;
4228
 
4229
                        bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
4230
                        htab->srelgot->reloc_count++;
4231
                        loc += sizeof (Elf32_External_Rela);
4232
                      }
4233
                    else
4234
                      bfd_put_32 (output_bfd, tpoff (info, relocation),
4235
                                  htab->sgot->contents + cur_off);
4236
 
4237
                    cur_off += 4;
4238
                  }
4239
 
4240
                if (hh != NULL)
4241
                  hh->eh.got.offset |= 1;
4242
                else
4243
                  local_got_offsets[r_symndx] |= 1;
4244
              }
4245
 
4246
            if ((tls_type & GOT_TLS_GD)
4247
                && r_type != R_PARISC_TLS_GD21L
4248
                && r_type != R_PARISC_TLS_GD14R)
4249
              off += 2 * GOT_ENTRY_SIZE;
4250
 
4251
            /* Add the base of the GOT to the relocation value.  */
4252
            relocation = (off
4253
                          + htab->sgot->output_offset
4254
                          + htab->sgot->output_section->vma);
4255
 
4256
            break;
4257
          }
4258
 
4259
        case R_PARISC_TLS_LE21L:
4260
        case R_PARISC_TLS_LE14R:
4261
          {
4262
            relocation = tpoff (info, relocation);
4263
            break;
4264
          }
4265
          break;
4266
 
4267
        default:
4268
          break;
4269
        }
4270
 
4271
      rstatus = final_link_relocate (input_section, contents, rela, relocation,
4272
                               htab, sym_sec, hh, info);
4273
 
4274
      if (rstatus == bfd_reloc_ok)
4275
        continue;
4276
 
4277
      if (hh != NULL)
4278
        sym_name = hh_name (hh);
4279
      else
4280
        {
4281
          sym_name = bfd_elf_string_from_elf_section (input_bfd,
4282
                                                      symtab_hdr->sh_link,
4283
                                                      sym->st_name);
4284
          if (sym_name == NULL)
4285
            return FALSE;
4286
          if (*sym_name == '\0')
4287
            sym_name = bfd_section_name (input_bfd, sym_sec);
4288
        }
4289
 
4290
      howto = elf_hppa_howto_table + r_type;
4291
 
4292
      if (rstatus == bfd_reloc_undefined || rstatus == bfd_reloc_notsupported)
4293
        {
4294
          if (rstatus == bfd_reloc_notsupported || !warned_undef)
4295
            {
4296
              (*_bfd_error_handler)
4297
                (_("%B(%A+0x%lx): cannot handle %s for %s"),
4298
                 input_bfd,
4299
                 input_section,
4300
                 (long) rela->r_offset,
4301
                 howto->name,
4302
                 sym_name);
4303
              bfd_set_error (bfd_error_bad_value);
4304
              return FALSE;
4305
            }
4306
        }
4307
      else
4308
        {
4309
          if (!((*info->callbacks->reloc_overflow)
4310
                (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name,
4311
                 (bfd_vma) 0, input_bfd, input_section, rela->r_offset)))
4312
            return FALSE;
4313
        }
4314
    }
4315
 
4316
  return TRUE;
4317
}
4318
 
4319
/* Finish up dynamic symbol handling.  We set the contents of various
4320
   dynamic sections here.  */
4321
 
4322
static bfd_boolean
4323
elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
4324
                                  struct bfd_link_info *info,
4325
                                  struct elf_link_hash_entry *eh,
4326
                                  Elf_Internal_Sym *sym)
4327
{
4328
  struct elf32_hppa_link_hash_table *htab;
4329
  Elf_Internal_Rela rela;
4330
  bfd_byte *loc;
4331
 
4332
  htab = hppa_link_hash_table (info);
4333
  if (htab == NULL)
4334
    return FALSE;
4335
 
4336
  if (eh->plt.offset != (bfd_vma) -1)
4337
    {
4338
      bfd_vma value;
4339
 
4340
      if (eh->plt.offset & 1)
4341
        abort ();
4342
 
4343
      /* This symbol has an entry in the procedure linkage table.  Set
4344
         it up.
4345
 
4346
         The format of a plt entry is
4347
         <funcaddr>
4348
         <__gp>
4349
      */
4350
      value = 0;
4351
      if (eh->root.type == bfd_link_hash_defined
4352
          || eh->root.type == bfd_link_hash_defweak)
4353
        {
4354
          value = eh->root.u.def.value;
4355
          if (eh->root.u.def.section->output_section != NULL)
4356
            value += (eh->root.u.def.section->output_offset
4357
                      + eh->root.u.def.section->output_section->vma);
4358
        }
4359
 
4360
      /* Create a dynamic IPLT relocation for this entry.  */
4361
      rela.r_offset = (eh->plt.offset
4362
                      + htab->splt->output_offset
4363
                      + htab->splt->output_section->vma);
4364
      if (eh->dynindx != -1)
4365
        {
4366
          rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT);
4367
          rela.r_addend = 0;
4368
        }
4369
      else
4370
        {
4371
          /* This symbol has been marked to become local, and is
4372
             used by a plabel so must be kept in the .plt.  */
4373
          rela.r_info = ELF32_R_INFO (0, R_PARISC_IPLT);
4374
          rela.r_addend = value;
4375
        }
4376
 
4377
      loc = htab->srelplt->contents;
4378
      loc += htab->srelplt->reloc_count++ * sizeof (Elf32_External_Rela);
4379
      bfd_elf32_swap_reloca_out (htab->splt->output_section->owner, &rela, loc);
4380
 
4381
      if (!eh->def_regular)
4382
        {
4383
          /* Mark the symbol as undefined, rather than as defined in
4384
             the .plt section.  Leave the value alone.  */
4385
          sym->st_shndx = SHN_UNDEF;
4386
        }
4387
    }
4388
 
4389
  if (eh->got.offset != (bfd_vma) -1
4390
      && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_GD) == 0
4391
      && (hppa_elf_hash_entry (eh)->tls_type & GOT_TLS_IE) == 0)
4392
    {
4393
      /* This symbol has an entry in the global offset table.  Set it
4394
         up.  */
4395
 
4396
      rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1)
4397
                      + htab->sgot->output_offset
4398
                      + htab->sgot->output_section->vma);
4399
 
4400
      /* If this is a -Bsymbolic link and the symbol is defined
4401
         locally or was forced to be local because of a version file,
4402
         we just want to emit a RELATIVE reloc.  The entry in the
4403
         global offset table will already have been initialized in the
4404
         relocate_section function.  */
4405
      if (info->shared
4406
          && (info->symbolic || eh->dynindx == -1)
4407
          && eh->def_regular)
4408
        {
4409
          rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32);
4410
          rela.r_addend = (eh->root.u.def.value
4411
                          + eh->root.u.def.section->output_offset
4412
                          + eh->root.u.def.section->output_section->vma);
4413
        }
4414
      else
4415
        {
4416
          if ((eh->got.offset & 1) != 0)
4417
            abort ();
4418
 
4419
          bfd_put_32 (output_bfd, 0, htab->sgot->contents + (eh->got.offset & ~1));
4420
          rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32);
4421
          rela.r_addend = 0;
4422
        }
4423
 
4424
      loc = htab->srelgot->contents;
4425
      loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
4426
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4427
    }
4428
 
4429
  if (eh->needs_copy)
4430
    {
4431
      asection *sec;
4432
 
4433
      /* This symbol needs a copy reloc.  Set it up.  */
4434
 
4435
      if (! (eh->dynindx != -1
4436
             && (eh->root.type == bfd_link_hash_defined
4437
                 || eh->root.type == bfd_link_hash_defweak)))
4438
        abort ();
4439
 
4440
      sec = htab->srelbss;
4441
 
4442
      rela.r_offset = (eh->root.u.def.value
4443
                      + eh->root.u.def.section->output_offset
4444
                      + eh->root.u.def.section->output_section->vma);
4445
      rela.r_addend = 0;
4446
      rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY);
4447
      loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela);
4448
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4449
    }
4450
 
4451
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
4452
  if (eh_name (eh)[0] == '_'
4453
      && (strcmp (eh_name (eh), "_DYNAMIC") == 0
4454
          || eh == htab->etab.hgot))
4455
    {
4456
      sym->st_shndx = SHN_ABS;
4457
    }
4458
 
4459
  return TRUE;
4460
}
4461
 
4462
/* Used to decide how to sort relocs in an optimal manner for the
4463
   dynamic linker, before writing them out.  */
4464
 
4465
static enum elf_reloc_type_class
4466
elf32_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
4467
{
4468
  /* Handle TLS relocs first; we don't want them to be marked
4469
     relative by the "if (ELF32_R_SYM (rela->r_info) == STN_UNDEF)"
4470
     check below.  */
4471
  switch ((int) ELF32_R_TYPE (rela->r_info))
4472
    {
4473
      case R_PARISC_TLS_DTPMOD32:
4474
      case R_PARISC_TLS_DTPOFF32:
4475
      case R_PARISC_TLS_TPREL32:
4476
        return reloc_class_normal;
4477
    }
4478
 
4479
  if (ELF32_R_SYM (rela->r_info) == STN_UNDEF)
4480
    return reloc_class_relative;
4481
 
4482
  switch ((int) ELF32_R_TYPE (rela->r_info))
4483
    {
4484
    case R_PARISC_IPLT:
4485
      return reloc_class_plt;
4486
    case R_PARISC_COPY:
4487
      return reloc_class_copy;
4488
    default:
4489
      return reloc_class_normal;
4490
    }
4491
}
4492
 
4493
/* Finish up the dynamic sections.  */
4494
 
4495
static bfd_boolean
4496
elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
4497
                                    struct bfd_link_info *info)
4498
{
4499
  bfd *dynobj;
4500
  struct elf32_hppa_link_hash_table *htab;
4501
  asection *sdyn;
4502 148 khays
  asection * sgot;
4503 14 khays
 
4504
  htab = hppa_link_hash_table (info);
4505
  if (htab == NULL)
4506
    return FALSE;
4507
 
4508
  dynobj = htab->etab.dynobj;
4509
 
4510 148 khays
  sgot = htab->sgot;
4511
  /* A broken linker script might have discarded the dynamic sections.
4512
     Catch this here so that we do not seg-fault later on.  */
4513
  if (sgot != NULL && bfd_is_abs_section (sgot->output_section))
4514
    return FALSE;
4515
 
4516 14 khays
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4517
 
4518
  if (htab->etab.dynamic_sections_created)
4519
    {
4520
      Elf32_External_Dyn *dyncon, *dynconend;
4521
 
4522
      if (sdyn == NULL)
4523
        abort ();
4524
 
4525
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
4526
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4527
      for (; dyncon < dynconend; dyncon++)
4528
        {
4529
          Elf_Internal_Dyn dyn;
4530
          asection *s;
4531
 
4532
          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
4533
 
4534
          switch (dyn.d_tag)
4535
            {
4536
            default:
4537
              continue;
4538
 
4539
            case DT_PLTGOT:
4540
              /* Use PLTGOT to set the GOT register.  */
4541
              dyn.d_un.d_ptr = elf_gp (output_bfd);
4542
              break;
4543
 
4544
            case DT_JMPREL:
4545
              s = htab->srelplt;
4546
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4547
              break;
4548
 
4549
            case DT_PLTRELSZ:
4550
              s = htab->srelplt;
4551
              dyn.d_un.d_val = s->size;
4552
              break;
4553
 
4554
            case DT_RELASZ:
4555
              /* Don't count procedure linkage table relocs in the
4556
                 overall reloc count.  */
4557
              s = htab->srelplt;
4558
              if (s == NULL)
4559
                continue;
4560
              dyn.d_un.d_val -= s->size;
4561
              break;
4562
 
4563
            case DT_RELA:
4564
              /* We may not be using the standard ELF linker script.
4565
                 If .rela.plt is the first .rela section, we adjust
4566
                 DT_RELA to not include it.  */
4567
              s = htab->srelplt;
4568
              if (s == NULL)
4569
                continue;
4570
              if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
4571
                continue;
4572
              dyn.d_un.d_ptr += s->size;
4573
              break;
4574
            }
4575
 
4576
          bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4577
        }
4578
    }
4579
 
4580 148 khays
  if (sgot != NULL && sgot->size != 0)
4581 14 khays
    {
4582
      /* Fill in the first entry in the global offset table.
4583
         We use it to point to our dynamic section, if we have one.  */
4584
      bfd_put_32 (output_bfd,
4585
                  sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
4586 148 khays
                  sgot->contents);
4587 14 khays
 
4588
      /* The second entry is reserved for use by the dynamic linker.  */
4589 148 khays
      memset (sgot->contents + GOT_ENTRY_SIZE, 0, GOT_ENTRY_SIZE);
4590 14 khays
 
4591
      /* Set .got entry size.  */
4592 148 khays
      elf_section_data (sgot->output_section)
4593 14 khays
        ->this_hdr.sh_entsize = GOT_ENTRY_SIZE;
4594
    }
4595
 
4596
  if (htab->splt != NULL && htab->splt->size != 0)
4597
    {
4598
      /* Set plt entry size.  */
4599
      elf_section_data (htab->splt->output_section)
4600
        ->this_hdr.sh_entsize = PLT_ENTRY_SIZE;
4601
 
4602
      if (htab->need_plt_stub)
4603
        {
4604
          /* Set up the .plt stub.  */
4605
          memcpy (htab->splt->contents
4606
                  + htab->splt->size - sizeof (plt_stub),
4607
                  plt_stub, sizeof (plt_stub));
4608
 
4609
          if ((htab->splt->output_offset
4610
               + htab->splt->output_section->vma
4611
               + htab->splt->size)
4612 148 khays
              != (sgot->output_offset
4613
                  + sgot->output_section->vma))
4614 14 khays
            {
4615
              (*_bfd_error_handler)
4616
                (_(".got section not immediately after .plt section"));
4617
              return FALSE;
4618
            }
4619
        }
4620
    }
4621
 
4622
  return TRUE;
4623
}
4624
 
4625
/* Called when writing out an object file to decide the type of a
4626
   symbol.  */
4627
static int
4628
elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
4629
{
4630
  if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
4631
    return STT_PARISC_MILLI;
4632
  else
4633
    return type;
4634
}
4635
 
4636
/* Misc BFD support code.  */
4637
#define bfd_elf32_bfd_is_local_label_name    elf_hppa_is_local_label_name
4638
#define bfd_elf32_bfd_reloc_type_lookup      elf_hppa_reloc_type_lookup
4639
#define bfd_elf32_bfd_reloc_name_lookup      elf_hppa_reloc_name_lookup
4640
#define elf_info_to_howto                    elf_hppa_info_to_howto
4641
#define elf_info_to_howto_rel                elf_hppa_info_to_howto_rel
4642
 
4643
/* Stuff for the BFD linker.  */
4644
#define bfd_elf32_bfd_final_link             elf32_hppa_final_link
4645
#define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
4646
#define bfd_elf32_bfd_link_hash_table_free   elf32_hppa_link_hash_table_free
4647
#define elf_backend_adjust_dynamic_symbol    elf32_hppa_adjust_dynamic_symbol
4648
#define elf_backend_copy_indirect_symbol     elf32_hppa_copy_indirect_symbol
4649
#define elf_backend_check_relocs             elf32_hppa_check_relocs
4650
#define elf_backend_create_dynamic_sections  elf32_hppa_create_dynamic_sections
4651
#define elf_backend_fake_sections            elf_hppa_fake_sections
4652
#define elf_backend_relocate_section         elf32_hppa_relocate_section
4653
#define elf_backend_hide_symbol              elf32_hppa_hide_symbol
4654
#define elf_backend_finish_dynamic_symbol    elf32_hppa_finish_dynamic_symbol
4655
#define elf_backend_finish_dynamic_sections  elf32_hppa_finish_dynamic_sections
4656
#define elf_backend_size_dynamic_sections    elf32_hppa_size_dynamic_sections
4657
#define elf_backend_init_index_section       _bfd_elf_init_1_index_section
4658
#define elf_backend_gc_mark_hook             elf32_hppa_gc_mark_hook
4659
#define elf_backend_gc_sweep_hook            elf32_hppa_gc_sweep_hook
4660
#define elf_backend_grok_prstatus            elf32_hppa_grok_prstatus
4661
#define elf_backend_grok_psinfo              elf32_hppa_grok_psinfo
4662
#define elf_backend_object_p                 elf32_hppa_object_p
4663
#define elf_backend_final_write_processing   elf_hppa_final_write_processing
4664
#define elf_backend_post_process_headers     _bfd_elf_set_osabi
4665
#define elf_backend_get_symbol_type          elf32_hppa_elf_get_symbol_type
4666
#define elf_backend_reloc_type_class         elf32_hppa_reloc_type_class
4667
#define elf_backend_action_discarded         elf_hppa_action_discarded
4668
 
4669
#define elf_backend_can_gc_sections          1
4670
#define elf_backend_can_refcount             1
4671
#define elf_backend_plt_alignment            2
4672
#define elf_backend_want_got_plt             0
4673
#define elf_backend_plt_readonly             0
4674
#define elf_backend_want_plt_sym             0
4675
#define elf_backend_got_header_size          8
4676
#define elf_backend_rela_normal              1
4677
 
4678
#define TARGET_BIG_SYM          bfd_elf32_hppa_vec
4679
#define TARGET_BIG_NAME         "elf32-hppa"
4680
#define ELF_ARCH                bfd_arch_hppa
4681
#define ELF_TARGET_ID           HPPA32_ELF_DATA
4682
#define ELF_MACHINE_CODE        EM_PARISC
4683
#define ELF_MAXPAGESIZE         0x1000
4684
#define ELF_OSABI               ELFOSABI_HPUX
4685
#define elf32_bed               elf32_hppa_hpux_bed
4686
 
4687
#include "elf32-target.h"
4688
 
4689
#undef TARGET_BIG_SYM
4690
#define TARGET_BIG_SYM          bfd_elf32_hppa_linux_vec
4691
#undef TARGET_BIG_NAME
4692
#define TARGET_BIG_NAME         "elf32-hppa-linux"
4693
#undef ELF_OSABI
4694 161 khays
#define ELF_OSABI               ELFOSABI_GNU
4695 14 khays
#undef elf32_bed
4696
#define elf32_bed               elf32_hppa_linux_bed
4697
 
4698
#include "elf32-target.h"
4699
 
4700
#undef TARGET_BIG_SYM
4701
#define TARGET_BIG_SYM          bfd_elf32_hppa_nbsd_vec
4702
#undef TARGET_BIG_NAME
4703
#define TARGET_BIG_NAME         "elf32-hppa-netbsd"
4704
#undef ELF_OSABI
4705
#define ELF_OSABI               ELFOSABI_NETBSD
4706
#undef elf32_bed
4707
#define elf32_bed               elf32_hppa_netbsd_bed
4708
 
4709
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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