Coverage Report

Created: 2026-09-14 08:07

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