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 148

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

powered by: WebSVN 2.1.0

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