Coverage Report

Created: 2025-06-24 06:45

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