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

Subversion Repositories open8_urisc

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

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

Line No. Rev Author Line
1 14 khays
/* Support for HPPA 64-bit ELF
2
   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 148 khays
   2010, 2011 Free Software Foundation, Inc.
4 14 khays
 
5
   This file is part of BFD, the Binary File Descriptor library.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
 
22
#include "alloca-conf.h"
23
#include "sysdep.h"
24
#include "bfd.h"
25
#include "libbfd.h"
26
#include "elf-bfd.h"
27
#include "elf/hppa.h"
28
#include "libhppa.h"
29
#include "elf64-hppa.h"
30
 
31
 
32
#define ARCH_SIZE              64
33
 
34
#define PLT_ENTRY_SIZE 0x10
35
#define DLT_ENTRY_SIZE 0x8
36
#define OPD_ENTRY_SIZE 0x20
37
 
38
#define ELF_DYNAMIC_INTERPRETER "/usr/lib/pa20_64/dld.sl"
39
 
40
/* The stub is supposed to load the target address and target's DP
41
   value out of the PLT, then do an external branch to the target
42
   address.
43
 
44
   LDD PLTOFF(%r27),%r1
45
   BVE (%r1)
46
   LDD PLTOFF+8(%r27),%r27
47
 
48
   Note that we must use the LDD with a 14 bit displacement, not the one
49
   with a 5 bit displacement.  */
50
static char plt_stub[] = {0x53, 0x61, 0x00, 0x00, 0xe8, 0x20, 0xd0, 0x00,
51
                          0x53, 0x7b, 0x00, 0x00 };
52
 
53
struct elf64_hppa_link_hash_entry
54
{
55
  struct elf_link_hash_entry eh;
56
 
57
  /* Offsets for this symbol in various linker sections.  */
58
  bfd_vma dlt_offset;
59
  bfd_vma plt_offset;
60
  bfd_vma opd_offset;
61
  bfd_vma stub_offset;
62
 
63
  /* The index of the (possibly local) symbol in the input bfd and its
64
     associated BFD.  Needed so that we can have relocs against local
65
     symbols in shared libraries.  */
66
  long sym_indx;
67
  bfd *owner;
68
 
69
  /* Dynamic symbols may need to have two different values.  One for
70
     the dynamic symbol table, one for the normal symbol table.
71
 
72
     In such cases we store the symbol's real value and section
73
     index here so we can restore the real value before we write
74
     the normal symbol table.  */
75
  bfd_vma st_value;
76
  int st_shndx;
77
 
78
  /* Used to count non-got, non-plt relocations for delayed sizing
79
     of relocation sections.  */
80
  struct elf64_hppa_dyn_reloc_entry
81
  {
82
    /* Next relocation in the chain.  */
83
    struct elf64_hppa_dyn_reloc_entry *next;
84
 
85
    /* The type of the relocation.  */
86
    int type;
87
 
88
    /* The input section of the relocation.  */
89
    asection *sec;
90
 
91
    /* Number of relocs copied in this section.  */
92
    bfd_size_type count;
93
 
94
    /* The index of the section symbol for the input section of
95
       the relocation.  Only needed when building shared libraries.  */
96
    int sec_symndx;
97
 
98
    /* The offset within the input section of the relocation.  */
99
    bfd_vma offset;
100
 
101
    /* The addend for the relocation.  */
102
    bfd_vma addend;
103
 
104
  } *reloc_entries;
105
 
106
  /* Nonzero if this symbol needs an entry in one of the linker
107
     sections.  */
108
  unsigned want_dlt;
109
  unsigned want_plt;
110
  unsigned want_opd;
111
  unsigned want_stub;
112
};
113
 
114
struct elf64_hppa_link_hash_table
115
{
116
  struct elf_link_hash_table root;
117
 
118
  /* Shortcuts to get to the various linker defined sections.  */
119
  asection *dlt_sec;
120
  asection *dlt_rel_sec;
121
  asection *plt_sec;
122
  asection *plt_rel_sec;
123
  asection *opd_sec;
124
  asection *opd_rel_sec;
125
  asection *other_rel_sec;
126
 
127
  /* Offset of __gp within .plt section.  When the PLT gets large we want
128
     to slide __gp into the PLT section so that we can continue to use
129
     single DP relative instructions to load values out of the PLT.  */
130
  bfd_vma gp_offset;
131
 
132
  /* Note this is not strictly correct.  We should create a stub section for
133
     each input section with calls.  The stub section should be placed before
134
     the section with the call.  */
135
  asection *stub_sec;
136
 
137
  bfd_vma text_segment_base;
138
  bfd_vma data_segment_base;
139
 
140
  /* We build tables to map from an input section back to its
141
     symbol index.  This is the BFD for which we currently have
142
     a map.  */
143
  bfd *section_syms_bfd;
144
 
145
  /* Array of symbol numbers for each input section attached to the
146
     current BFD.  */
147
  int *section_syms;
148
};
149
 
150
#define hppa_link_hash_table(p) \
151
  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
152
  == HPPA64_ELF_DATA ? ((struct elf64_hppa_link_hash_table *) ((p)->hash)) : NULL)
153
 
154
#define hppa_elf_hash_entry(ent) \
155
  ((struct elf64_hppa_link_hash_entry *)(ent))
156
 
157
#define eh_name(eh) \
158
  (eh ? eh->root.root.string : "<undef>")
159
 
160
typedef struct bfd_hash_entry *(*new_hash_entry_func)
161
  (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
162
 
163
static struct bfd_link_hash_table *elf64_hppa_hash_table_create
164
  (bfd *abfd);
165
 
166
/* This must follow the definitions of the various derived linker
167
   hash tables and shared functions.  */
168
#include "elf-hppa.h"
169
 
170
static bfd_boolean elf64_hppa_object_p
171
  (bfd *);
172
 
173
static void elf64_hppa_post_process_headers
174
  (bfd *, struct bfd_link_info *);
175
 
176
static bfd_boolean elf64_hppa_create_dynamic_sections
177
  (bfd *, struct bfd_link_info *);
178
 
179
static bfd_boolean elf64_hppa_adjust_dynamic_symbol
180
  (struct bfd_link_info *, struct elf_link_hash_entry *);
181
 
182
static bfd_boolean elf64_hppa_mark_milli_and_exported_functions
183
  (struct elf_link_hash_entry *, void *);
184
 
185
static bfd_boolean elf64_hppa_size_dynamic_sections
186
  (bfd *, struct bfd_link_info *);
187
 
188
static int elf64_hppa_link_output_symbol_hook
189
  (struct bfd_link_info *, const char *, Elf_Internal_Sym *,
190
   asection *, struct elf_link_hash_entry *);
191
 
192
static bfd_boolean elf64_hppa_finish_dynamic_symbol
193
  (bfd *, struct bfd_link_info *,
194
   struct elf_link_hash_entry *, Elf_Internal_Sym *);
195
 
196
static enum elf_reloc_type_class elf64_hppa_reloc_type_class
197
  (const Elf_Internal_Rela *);
198
 
199
static bfd_boolean elf64_hppa_finish_dynamic_sections
200
  (bfd *, struct bfd_link_info *);
201
 
202
static bfd_boolean elf64_hppa_check_relocs
203
  (bfd *, struct bfd_link_info *,
204
   asection *, const Elf_Internal_Rela *);
205
 
206
static bfd_boolean elf64_hppa_dynamic_symbol_p
207
  (struct elf_link_hash_entry *, struct bfd_link_info *);
208
 
209
static bfd_boolean elf64_hppa_mark_exported_functions
210
  (struct elf_link_hash_entry *, void *);
211
 
212
static bfd_boolean elf64_hppa_finalize_opd
213
  (struct elf_link_hash_entry *, void *);
214
 
215
static bfd_boolean elf64_hppa_finalize_dlt
216
  (struct elf_link_hash_entry *, void *);
217
 
218
static bfd_boolean allocate_global_data_dlt
219
  (struct elf_link_hash_entry *, void *);
220
 
221
static bfd_boolean allocate_global_data_plt
222
  (struct elf_link_hash_entry *, void *);
223
 
224
static bfd_boolean allocate_global_data_stub
225
  (struct elf_link_hash_entry *, void *);
226
 
227
static bfd_boolean allocate_global_data_opd
228
  (struct elf_link_hash_entry *, void *);
229
 
230
static bfd_boolean get_reloc_section
231
  (bfd *, struct elf64_hppa_link_hash_table *, asection *);
232
 
233
static bfd_boolean count_dyn_reloc
234
  (bfd *, struct elf64_hppa_link_hash_entry *,
235
   int, asection *, int, bfd_vma, bfd_vma);
236
 
237
static bfd_boolean allocate_dynrel_entries
238
  (struct elf_link_hash_entry *, void *);
239
 
240
static bfd_boolean elf64_hppa_finalize_dynreloc
241
  (struct elf_link_hash_entry *, void *);
242
 
243
static bfd_boolean get_opd
244
  (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
245
 
246
static bfd_boolean get_plt
247
  (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
248
 
249
static bfd_boolean get_dlt
250
  (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
251
 
252
static bfd_boolean get_stub
253
  (bfd *, struct bfd_link_info *, struct elf64_hppa_link_hash_table *);
254
 
255
static int elf64_hppa_elf_get_symbol_type
256
  (Elf_Internal_Sym *, int);
257
 
258
/* Initialize an entry in the link hash table.  */
259
 
260
static struct bfd_hash_entry *
261
hppa64_link_hash_newfunc (struct bfd_hash_entry *entry,
262
                          struct bfd_hash_table *table,
263
                          const char *string)
264
{
265
  /* Allocate the structure if it has not already been allocated by a
266
     subclass.  */
267
  if (entry == NULL)
268
    {
269
      entry = bfd_hash_allocate (table,
270
                                 sizeof (struct elf64_hppa_link_hash_entry));
271
      if (entry == NULL)
272
        return entry;
273
    }
274
 
275
  /* Call the allocation method of the superclass.  */
276
  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
277
  if (entry != NULL)
278
    {
279
      struct elf64_hppa_link_hash_entry *hh;
280
 
281
      /* Initialize our local data.  All zeros.  */
282
      hh = hppa_elf_hash_entry (entry);
283
      memset (&hh->dlt_offset, 0,
284
              (sizeof (struct elf64_hppa_link_hash_entry)
285
               - offsetof (struct elf64_hppa_link_hash_entry, dlt_offset)));
286
    }
287
 
288
  return entry;
289
}
290
 
291
/* Create the derived linker hash table.  The PA64 ELF port uses this
292
   derived hash table to keep information specific to the PA ElF
293
   linker (without using static variables).  */
294
 
295
static struct bfd_link_hash_table*
296
elf64_hppa_hash_table_create (bfd *abfd)
297
{
298
  struct elf64_hppa_link_hash_table *htab;
299
  bfd_size_type amt = sizeof (*htab);
300
 
301
  htab = bfd_zalloc (abfd, amt);
302
  if (htab == NULL)
303
    return NULL;
304
 
305
  if (!_bfd_elf_link_hash_table_init (&htab->root, abfd,
306
                                      hppa64_link_hash_newfunc,
307
                                      sizeof (struct elf64_hppa_link_hash_entry),
308
                                      HPPA64_ELF_DATA))
309
    {
310
      bfd_release (abfd, htab);
311
      return NULL;
312
    }
313
 
314
  htab->text_segment_base = (bfd_vma) -1;
315
  htab->data_segment_base = (bfd_vma) -1;
316
 
317
  return &htab->root.root;
318
}
319
 
320
/* Return nonzero if ABFD represents a PA2.0 ELF64 file.
321
 
322
   Additionally we set the default architecture and machine.  */
323
static bfd_boolean
324
elf64_hppa_object_p (bfd *abfd)
325
{
326
  Elf_Internal_Ehdr * i_ehdrp;
327
  unsigned int flags;
328
 
329
  i_ehdrp = elf_elfheader (abfd);
330
  if (strcmp (bfd_get_target (abfd), "elf64-hppa-linux") == 0)
331
    {
332 161 khays
      /* GCC on hppa-linux produces binaries with OSABI=GNU,
333 14 khays
         but the kernel produces corefiles with OSABI=SysV.  */
334 161 khays
      if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_GNU
335 14 khays
          && i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
336
        return FALSE;
337
    }
338
  else
339
    {
340
      /* HPUX produces binaries with OSABI=HPUX,
341
         but the kernel produces corefiles with OSABI=SysV.  */
342
      if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX
343
          && i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
344
        return FALSE;
345
    }
346
 
347
  flags = i_ehdrp->e_flags;
348
  switch (flags & (EF_PARISC_ARCH | EF_PARISC_WIDE))
349
    {
350
    case EFA_PARISC_1_0:
351
      return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 10);
352
    case EFA_PARISC_1_1:
353
      return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
354
    case EFA_PARISC_2_0:
355
      if (i_ehdrp->e_ident[EI_CLASS] == ELFCLASS64)
356
        return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
357
      else
358
        return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
359
    case EFA_PARISC_2_0 | EF_PARISC_WIDE:
360
      return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
361
    }
362
  /* Don't be fussy.  */
363
  return TRUE;
364
}
365
 
366
/* Given section type (hdr->sh_type), return a boolean indicating
367
   whether or not the section is an elf64-hppa specific section.  */
368
static bfd_boolean
369
elf64_hppa_section_from_shdr (bfd *abfd,
370
                              Elf_Internal_Shdr *hdr,
371
                              const char *name,
372
                              int shindex)
373
{
374
  switch (hdr->sh_type)
375
    {
376
    case SHT_PARISC_EXT:
377
      if (strcmp (name, ".PARISC.archext") != 0)
378
        return FALSE;
379
      break;
380
    case SHT_PARISC_UNWIND:
381
      if (strcmp (name, ".PARISC.unwind") != 0)
382
        return FALSE;
383
      break;
384
    case SHT_PARISC_DOC:
385
    case SHT_PARISC_ANNOT:
386
    default:
387
      return FALSE;
388
    }
389
 
390
  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
391
    return FALSE;
392
 
393
  return TRUE;
394
}
395
 
396
/* SEC is a section containing relocs for an input BFD when linking; return
397
   a suitable section for holding relocs in the output BFD for a link.  */
398
 
399
static bfd_boolean
400
get_reloc_section (bfd *abfd,
401
                   struct elf64_hppa_link_hash_table *hppa_info,
402
                   asection *sec)
403
{
404
  const char *srel_name;
405
  asection *srel;
406
  bfd *dynobj;
407
 
408
  srel_name = (bfd_elf_string_from_elf_section
409
               (abfd, elf_elfheader(abfd)->e_shstrndx,
410
                _bfd_elf_single_rel_hdr(sec)->sh_name));
411
  if (srel_name == NULL)
412
    return FALSE;
413
 
414
  dynobj = hppa_info->root.dynobj;
415
  if (!dynobj)
416
    hppa_info->root.dynobj = dynobj = abfd;
417
 
418
  srel = bfd_get_section_by_name (dynobj, srel_name);
419
  if (srel == NULL)
420
    {
421
      srel = bfd_make_section_with_flags (dynobj, srel_name,
422
                                          (SEC_ALLOC
423
                                           | SEC_LOAD
424
                                           | SEC_HAS_CONTENTS
425
                                           | SEC_IN_MEMORY
426
                                           | SEC_LINKER_CREATED
427
                                           | SEC_READONLY));
428
      if (srel == NULL
429
          || !bfd_set_section_alignment (dynobj, srel, 3))
430
        return FALSE;
431
    }
432
 
433
  hppa_info->other_rel_sec = srel;
434
  return TRUE;
435
}
436
 
437
/* Add a new entry to the list of dynamic relocations against DYN_H.
438
 
439
   We use this to keep a record of all the FPTR relocations against a
440
   particular symbol so that we can create FPTR relocations in the
441
   output file.  */
442
 
443
static bfd_boolean
444
count_dyn_reloc (bfd *abfd,
445
                 struct elf64_hppa_link_hash_entry *hh,
446
                 int type,
447
                 asection *sec,
448
                 int sec_symndx,
449
                 bfd_vma offset,
450
                 bfd_vma addend)
451
{
452
  struct elf64_hppa_dyn_reloc_entry *rent;
453
 
454
  rent = (struct elf64_hppa_dyn_reloc_entry *)
455
  bfd_alloc (abfd, (bfd_size_type) sizeof (*rent));
456
  if (!rent)
457
    return FALSE;
458
 
459
  rent->next = hh->reloc_entries;
460
  rent->type = type;
461
  rent->sec = sec;
462
  rent->sec_symndx = sec_symndx;
463
  rent->offset = offset;
464
  rent->addend = addend;
465
  hh->reloc_entries = rent;
466
 
467
  return TRUE;
468
}
469
 
470
/* Return a pointer to the local DLT, PLT and OPD reference counts
471
   for ABFD.  Returns NULL if the storage allocation fails.  */
472
 
473
static bfd_signed_vma *
474
hppa64_elf_local_refcounts (bfd *abfd)
475
{
476
  Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
477
  bfd_signed_vma *local_refcounts;
478
 
479
  local_refcounts = elf_local_got_refcounts (abfd);
480
  if (local_refcounts == NULL)
481
    {
482
      bfd_size_type size;
483
 
484
      /* Allocate space for local DLT, PLT and OPD reference
485
         counts.  Done this way to save polluting elf_obj_tdata
486
         with another target specific pointer.  */
487
      size = symtab_hdr->sh_info;
488
      size *= 3 * sizeof (bfd_signed_vma);
489
      local_refcounts = bfd_zalloc (abfd, size);
490
      elf_local_got_refcounts (abfd) = local_refcounts;
491
    }
492
  return local_refcounts;
493
}
494
 
495
/* Scan the RELOCS and record the type of dynamic entries that each
496
   referenced symbol needs.  */
497
 
498
static bfd_boolean
499
elf64_hppa_check_relocs (bfd *abfd,
500
                         struct bfd_link_info *info,
501
                         asection *sec,
502
                         const Elf_Internal_Rela *relocs)
503
{
504
  struct elf64_hppa_link_hash_table *hppa_info;
505
  const Elf_Internal_Rela *relend;
506
  Elf_Internal_Shdr *symtab_hdr;
507
  const Elf_Internal_Rela *rel;
508
  unsigned int sec_symndx;
509
 
510
  if (info->relocatable)
511
    return TRUE;
512
 
513
  /* If this is the first dynamic object found in the link, create
514
     the special sections required for dynamic linking.  */
515
  if (! elf_hash_table (info)->dynamic_sections_created)
516
    {
517
      if (! _bfd_elf_link_create_dynamic_sections (abfd, info))
518
        return FALSE;
519
    }
520
 
521
  hppa_info = hppa_link_hash_table (info);
522
  if (hppa_info == NULL)
523
    return FALSE;
524
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
525
 
526
  /* If necessary, build a new table holding section symbols indices
527
     for this BFD.  */
528
 
529
  if (info->shared && hppa_info->section_syms_bfd != abfd)
530
    {
531
      unsigned long i;
532
      unsigned int highest_shndx;
533
      Elf_Internal_Sym *local_syms = NULL;
534
      Elf_Internal_Sym *isym, *isymend;
535
      bfd_size_type amt;
536
 
537
      /* We're done with the old cache of section index to section symbol
538
         index information.  Free it.
539
 
540
         ?!? Note we leak the last section_syms array.  Presumably we
541
         could free it in one of the later routines in this file.  */
542
      if (hppa_info->section_syms)
543
        free (hppa_info->section_syms);
544
 
545
      /* Read this BFD's local symbols.  */
546
      if (symtab_hdr->sh_info != 0)
547
        {
548
          local_syms = (Elf_Internal_Sym *) symtab_hdr->contents;
549
          if (local_syms == NULL)
550
            local_syms = bfd_elf_get_elf_syms (abfd, symtab_hdr,
551
                                               symtab_hdr->sh_info, 0,
552
                                               NULL, NULL, NULL);
553
          if (local_syms == NULL)
554
            return FALSE;
555
        }
556
 
557
      /* Record the highest section index referenced by the local symbols.  */
558
      highest_shndx = 0;
559
      isymend = local_syms + symtab_hdr->sh_info;
560
      for (isym = local_syms; isym < isymend; isym++)
561
        {
562
          if (isym->st_shndx > highest_shndx
563
              && isym->st_shndx < SHN_LORESERVE)
564
            highest_shndx = isym->st_shndx;
565
        }
566
 
567
      /* Allocate an array to hold the section index to section symbol index
568
         mapping.  Bump by one since we start counting at zero.  */
569
      highest_shndx++;
570
      amt = highest_shndx;
571
      amt *= sizeof (int);
572
      hppa_info->section_syms = (int *) bfd_malloc (amt);
573
 
574
      /* Now walk the local symbols again.  If we find a section symbol,
575
         record the index of the symbol into the section_syms array.  */
576
      for (i = 0, isym = local_syms; isym < isymend; i++, isym++)
577
        {
578
          if (ELF_ST_TYPE (isym->st_info) == STT_SECTION)
579
            hppa_info->section_syms[isym->st_shndx] = i;
580
        }
581
 
582
      /* We are finished with the local symbols.  */
583
      if (local_syms != NULL
584
          && symtab_hdr->contents != (unsigned char *) local_syms)
585
        {
586
          if (! info->keep_memory)
587
            free (local_syms);
588
          else
589
            {
590
              /* Cache the symbols for elf_link_input_bfd.  */
591
              symtab_hdr->contents = (unsigned char *) local_syms;
592
            }
593
        }
594
 
595
      /* Record which BFD we built the section_syms mapping for.  */
596
      hppa_info->section_syms_bfd = abfd;
597
    }
598
 
599
  /* Record the symbol index for this input section.  We may need it for
600
     relocations when building shared libraries.  When not building shared
601
     libraries this value is never really used, but assign it to zero to
602
     prevent out of bounds memory accesses in other routines.  */
603
  if (info->shared)
604
    {
605
      sec_symndx = _bfd_elf_section_from_bfd_section (abfd, sec);
606
 
607
      /* If we did not find a section symbol for this section, then
608
         something went terribly wrong above.  */
609
      if (sec_symndx == SHN_BAD)
610
        return FALSE;
611
 
612
      if (sec_symndx < SHN_LORESERVE)
613
        sec_symndx = hppa_info->section_syms[sec_symndx];
614
      else
615
        sec_symndx = 0;
616
    }
617
  else
618
    sec_symndx = 0;
619
 
620
  relend = relocs + sec->reloc_count;
621
  for (rel = relocs; rel < relend; ++rel)
622
    {
623
      enum
624
        {
625
          NEED_DLT = 1,
626
          NEED_PLT = 2,
627
          NEED_STUB = 4,
628
          NEED_OPD = 8,
629
          NEED_DYNREL = 16,
630
        };
631
 
632
      unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
633
      struct elf64_hppa_link_hash_entry *hh;
634
      int need_entry;
635
      bfd_boolean maybe_dynamic;
636
      int dynrel_type = R_PARISC_NONE;
637
      static reloc_howto_type *howto;
638
 
639
      if (r_symndx >= symtab_hdr->sh_info)
640
        {
641
          /* We're dealing with a global symbol -- find its hash entry
642
             and mark it as being referenced.  */
643
          long indx = r_symndx - symtab_hdr->sh_info;
644
          hh = hppa_elf_hash_entry (elf_sym_hashes (abfd)[indx]);
645
          while (hh->eh.root.type == bfd_link_hash_indirect
646
                 || hh->eh.root.type == bfd_link_hash_warning)
647
            hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
648
 
649
          hh->eh.ref_regular = 1;
650
        }
651
      else
652
        hh = NULL;
653
 
654
      /* We can only get preliminary data on whether a symbol is
655
         locally or externally defined, as not all of the input files
656
         have yet been processed.  Do something with what we know, as
657
         this may help reduce memory usage and processing time later.  */
658
      maybe_dynamic = FALSE;
659
      if (hh && ((info->shared
660
                 && (!info->symbolic
661
                     || info->unresolved_syms_in_shared_libs == RM_IGNORE))
662
                || !hh->eh.def_regular
663
                || hh->eh.root.type == bfd_link_hash_defweak))
664
        maybe_dynamic = TRUE;
665
 
666
      howto = elf_hppa_howto_table + ELF64_R_TYPE (rel->r_info);
667
      need_entry = 0;
668
      switch (howto->type)
669
        {
670
        /* These are simple indirect references to symbols through the
671
           DLT.  We need to create a DLT entry for any symbols which
672
           appears in a DLTIND relocation.  */
673
        case R_PARISC_DLTIND21L:
674
        case R_PARISC_DLTIND14R:
675
        case R_PARISC_DLTIND14F:
676
        case R_PARISC_DLTIND14WR:
677
        case R_PARISC_DLTIND14DR:
678
          need_entry = NEED_DLT;
679
          break;
680
 
681
        /* ?!?  These need a DLT entry.  But I have no idea what to do with
682
           the "link time TP value.  */
683
        case R_PARISC_LTOFF_TP21L:
684
        case R_PARISC_LTOFF_TP14R:
685
        case R_PARISC_LTOFF_TP14F:
686
        case R_PARISC_LTOFF_TP64:
687
        case R_PARISC_LTOFF_TP14WR:
688
        case R_PARISC_LTOFF_TP14DR:
689
        case R_PARISC_LTOFF_TP16F:
690
        case R_PARISC_LTOFF_TP16WF:
691
        case R_PARISC_LTOFF_TP16DF:
692
          need_entry = NEED_DLT;
693
          break;
694
 
695
        /* These are function calls.  Depending on their precise target we
696
           may need to make a stub for them.  The stub uses the PLT, so we
697
           need to create PLT entries for these symbols too.  */
698
        case R_PARISC_PCREL12F:
699
        case R_PARISC_PCREL17F:
700
        case R_PARISC_PCREL22F:
701
        case R_PARISC_PCREL32:
702
        case R_PARISC_PCREL64:
703
        case R_PARISC_PCREL21L:
704
        case R_PARISC_PCREL17R:
705
        case R_PARISC_PCREL17C:
706
        case R_PARISC_PCREL14R:
707
        case R_PARISC_PCREL14F:
708
        case R_PARISC_PCREL22C:
709
        case R_PARISC_PCREL14WR:
710
        case R_PARISC_PCREL14DR:
711
        case R_PARISC_PCREL16F:
712
        case R_PARISC_PCREL16WF:
713
        case R_PARISC_PCREL16DF:
714
          /* Function calls might need to go through the .plt, and
715
             might need a long branch stub.  */
716
          if (hh != NULL && hh->eh.type != STT_PARISC_MILLI)
717
            need_entry = (NEED_PLT | NEED_STUB);
718
          else
719
            need_entry = 0;
720
          break;
721
 
722
        case R_PARISC_PLTOFF21L:
723
        case R_PARISC_PLTOFF14R:
724
        case R_PARISC_PLTOFF14F:
725
        case R_PARISC_PLTOFF14WR:
726
        case R_PARISC_PLTOFF14DR:
727
        case R_PARISC_PLTOFF16F:
728
        case R_PARISC_PLTOFF16WF:
729
        case R_PARISC_PLTOFF16DF:
730
          need_entry = (NEED_PLT);
731
          break;
732
 
733
        case R_PARISC_DIR64:
734
          if (info->shared || maybe_dynamic)
735
            need_entry = (NEED_DYNREL);
736
          dynrel_type = R_PARISC_DIR64;
737
          break;
738
 
739
        /* This is an indirect reference through the DLT to get the address
740
           of a OPD descriptor.  Thus we need to make a DLT entry that points
741
           to an OPD entry.  */
742
        case R_PARISC_LTOFF_FPTR21L:
743
        case R_PARISC_LTOFF_FPTR14R:
744
        case R_PARISC_LTOFF_FPTR14WR:
745
        case R_PARISC_LTOFF_FPTR14DR:
746
        case R_PARISC_LTOFF_FPTR32:
747
        case R_PARISC_LTOFF_FPTR64:
748
        case R_PARISC_LTOFF_FPTR16F:
749
        case R_PARISC_LTOFF_FPTR16WF:
750
        case R_PARISC_LTOFF_FPTR16DF:
751
          if (info->shared || maybe_dynamic)
752
            need_entry = (NEED_DLT | NEED_OPD | NEED_PLT);
753
          else
754
            need_entry = (NEED_DLT | NEED_OPD | NEED_PLT);
755
          dynrel_type = R_PARISC_FPTR64;
756
          break;
757
 
758
        /* This is a simple OPD entry.  */
759
        case R_PARISC_FPTR64:
760
          if (info->shared || maybe_dynamic)
761
            need_entry = (NEED_OPD | NEED_PLT | NEED_DYNREL);
762
          else
763
            need_entry = (NEED_OPD | NEED_PLT);
764
          dynrel_type = R_PARISC_FPTR64;
765
          break;
766
 
767
        /* Add more cases as needed.  */
768
        }
769
 
770
      if (!need_entry)
771
        continue;
772
 
773
      if (hh)
774
        {
775
          /* Stash away enough information to be able to find this symbol
776
             regardless of whether or not it is local or global.  */
777
          hh->owner = abfd;
778
          hh->sym_indx = r_symndx;
779
        }
780
 
781
      /* Create what's needed.  */
782
      if (need_entry & NEED_DLT)
783
        {
784
          /* Allocate space for a DLT entry, as well as a dynamic
785
             relocation for this entry.  */
786
          if (! hppa_info->dlt_sec
787
              && ! get_dlt (abfd, info, hppa_info))
788
            goto err_out;
789
 
790
          if (hh != NULL)
791
            {
792
              hh->want_dlt = 1;
793
              hh->eh.got.refcount += 1;
794
            }
795
          else
796
            {
797
              bfd_signed_vma *local_dlt_refcounts;
798
 
799
              /* This is a DLT entry for a local symbol.  */
800
              local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
801
              if (local_dlt_refcounts == NULL)
802
                return FALSE;
803
              local_dlt_refcounts[r_symndx] += 1;
804
            }
805
        }
806
 
807
      if (need_entry & NEED_PLT)
808
        {
809
          if (! hppa_info->plt_sec
810
              && ! get_plt (abfd, info, hppa_info))
811
            goto err_out;
812
 
813
          if (hh != NULL)
814
            {
815
              hh->want_plt = 1;
816
              hh->eh.needs_plt = 1;
817
              hh->eh.plt.refcount += 1;
818
            }
819
          else
820
            {
821
              bfd_signed_vma *local_dlt_refcounts;
822
              bfd_signed_vma *local_plt_refcounts;
823
 
824
              /* This is a PLT entry for a local symbol.  */
825
              local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
826
              if (local_dlt_refcounts == NULL)
827
                return FALSE;
828
              local_plt_refcounts = local_dlt_refcounts + symtab_hdr->sh_info;
829
              local_plt_refcounts[r_symndx] += 1;
830
            }
831
        }
832
 
833
      if (need_entry & NEED_STUB)
834
        {
835
          if (! hppa_info->stub_sec
836
              && ! get_stub (abfd, info, hppa_info))
837
            goto err_out;
838
          if (hh)
839
            hh->want_stub = 1;
840
        }
841
 
842
      if (need_entry & NEED_OPD)
843
        {
844
          if (! hppa_info->opd_sec
845
              && ! get_opd (abfd, info, hppa_info))
846
            goto err_out;
847
 
848
          /* FPTRs are not allocated by the dynamic linker for PA64,
849
             though it is possible that will change in the future.  */
850
 
851
          if (hh != NULL)
852
            hh->want_opd = 1;
853
          else
854
            {
855
              bfd_signed_vma *local_dlt_refcounts;
856
              bfd_signed_vma *local_opd_refcounts;
857
 
858
              /* This is a OPD for a local symbol.  */
859
              local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
860
              if (local_dlt_refcounts == NULL)
861
                return FALSE;
862
              local_opd_refcounts = (local_dlt_refcounts
863
                                     + 2 * symtab_hdr->sh_info);
864
              local_opd_refcounts[r_symndx] += 1;
865
            }
866
        }
867
 
868
      /* Add a new dynamic relocation to the chain of dynamic
869
         relocations for this symbol.  */
870
      if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
871
        {
872
          if (! hppa_info->other_rel_sec
873
              && ! get_reloc_section (abfd, hppa_info, sec))
874
            goto err_out;
875
 
876
          /* Count dynamic relocations against global symbols.  */
877
          if (hh != NULL
878
              && !count_dyn_reloc (abfd, hh, dynrel_type, sec,
879
                                   sec_symndx, rel->r_offset, rel->r_addend))
880
            goto err_out;
881
 
882
          /* If we are building a shared library and we just recorded
883
             a dynamic R_PARISC_FPTR64 relocation, then make sure the
884
             section symbol for this section ends up in the dynamic
885
             symbol table.  */
886
          if (info->shared && dynrel_type == R_PARISC_FPTR64
887
              && ! (bfd_elf_link_record_local_dynamic_symbol
888
                    (info, abfd, sec_symndx)))
889
            return FALSE;
890
        }
891
    }
892
 
893
  return TRUE;
894
 
895
 err_out:
896
  return FALSE;
897
}
898
 
899
struct elf64_hppa_allocate_data
900
{
901
  struct bfd_link_info *info;
902
  bfd_size_type ofs;
903
};
904
 
905
/* Should we do dynamic things to this symbol?  */
906
 
907
static bfd_boolean
908
elf64_hppa_dynamic_symbol_p (struct elf_link_hash_entry *eh,
909
                             struct bfd_link_info *info)
910
{
911
  /* ??? What, if anything, needs to happen wrt STV_PROTECTED symbols
912
     and relocations that retrieve a function descriptor?  Assume the
913
     worst for now.  */
914
  if (_bfd_elf_dynamic_symbol_p (eh, info, 1))
915
    {
916
      /* ??? Why is this here and not elsewhere is_local_label_name.  */
917
      if (eh->root.root.string[0] == '$' && eh->root.root.string[1] == '$')
918
        return FALSE;
919
 
920
      return TRUE;
921
    }
922
  else
923
    return FALSE;
924
}
925
 
926
/* Mark all functions exported by this file so that we can later allocate
927
   entries in .opd for them.  */
928
 
929
static bfd_boolean
930
elf64_hppa_mark_exported_functions (struct elf_link_hash_entry *eh, void *data)
931
{
932
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
933
  struct bfd_link_info *info = (struct bfd_link_info *)data;
934
  struct elf64_hppa_link_hash_table *hppa_info;
935
 
936
  hppa_info = hppa_link_hash_table (info);
937
  if (hppa_info == NULL)
938
    return FALSE;
939
 
940
  if (eh
941
      && (eh->root.type == bfd_link_hash_defined
942
          || eh->root.type == bfd_link_hash_defweak)
943
      && eh->root.u.def.section->output_section != NULL
944
      && eh->type == STT_FUNC)
945
    {
946
      if (! hppa_info->opd_sec
947
          && ! get_opd (hppa_info->root.dynobj, info, hppa_info))
948
        return FALSE;
949
 
950
      hh->want_opd = 1;
951
 
952
      /* Put a flag here for output_symbol_hook.  */
953
      hh->st_shndx = -1;
954
      eh->needs_plt = 1;
955
    }
956
 
957
  return TRUE;
958
}
959
 
960
/* Allocate space for a DLT entry.  */
961
 
962
static bfd_boolean
963
allocate_global_data_dlt (struct elf_link_hash_entry *eh, void *data)
964
{
965
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
966
  struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
967
 
968
  if (hh->want_dlt)
969
    {
970
      if (x->info->shared)
971
        {
972
          /* Possibly add the symbol to the local dynamic symbol
973
             table since we might need to create a dynamic relocation
974
             against it.  */
975
          if (eh->dynindx == -1 && eh->type != STT_PARISC_MILLI)
976
            {
977
              bfd *owner = eh->root.u.def.section->owner;
978
 
979
              if (! (bfd_elf_link_record_local_dynamic_symbol
980
                     (x->info, owner, hh->sym_indx)))
981
                return FALSE;
982
            }
983
        }
984
 
985
      hh->dlt_offset = x->ofs;
986
      x->ofs += DLT_ENTRY_SIZE;
987
    }
988
  return TRUE;
989
}
990
 
991
/* Allocate space for a DLT.PLT entry.  */
992
 
993
static bfd_boolean
994
allocate_global_data_plt (struct elf_link_hash_entry *eh, void *data)
995
{
996
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
997
  struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *) data;
998
 
999
  if (hh->want_plt
1000
      && elf64_hppa_dynamic_symbol_p (eh, x->info)
1001
      && !((eh->root.type == bfd_link_hash_defined
1002
            || eh->root.type == bfd_link_hash_defweak)
1003
           && eh->root.u.def.section->output_section != NULL))
1004
    {
1005
      hh->plt_offset = x->ofs;
1006
      x->ofs += PLT_ENTRY_SIZE;
1007
      if (hh->plt_offset < 0x2000)
1008
        {
1009
          struct elf64_hppa_link_hash_table *hppa_info;
1010
 
1011
          hppa_info = hppa_link_hash_table (x->info);
1012
          if (hppa_info == NULL)
1013
            return FALSE;
1014
 
1015
          hppa_info->gp_offset = hh->plt_offset;
1016
        }
1017
    }
1018
  else
1019
    hh->want_plt = 0;
1020
 
1021
  return TRUE;
1022
}
1023
 
1024
/* Allocate space for a STUB entry.  */
1025
 
1026
static bfd_boolean
1027
allocate_global_data_stub (struct elf_link_hash_entry *eh, void *data)
1028
{
1029
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1030
  struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1031
 
1032
  if (hh->want_stub
1033
      && elf64_hppa_dynamic_symbol_p (eh, x->info)
1034
      && !((eh->root.type == bfd_link_hash_defined
1035
            || eh->root.type == bfd_link_hash_defweak)
1036
           && eh->root.u.def.section->output_section != NULL))
1037
    {
1038
      hh->stub_offset = x->ofs;
1039
      x->ofs += sizeof (plt_stub);
1040
    }
1041
  else
1042
    hh->want_stub = 0;
1043
  return TRUE;
1044
}
1045
 
1046
/* Allocate space for a FPTR entry.  */
1047
 
1048
static bfd_boolean
1049
allocate_global_data_opd (struct elf_link_hash_entry *eh, void *data)
1050
{
1051
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1052
  struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1053
 
1054
  if (hh && hh->want_opd)
1055
    {
1056
      /* We never need an opd entry for a symbol which is not
1057
         defined by this output file.  */
1058
      if (hh && (hh->eh.root.type == bfd_link_hash_undefined
1059
                 || hh->eh.root.type == bfd_link_hash_undefweak
1060
                 || hh->eh.root.u.def.section->output_section == NULL))
1061
        hh->want_opd = 0;
1062
 
1063
      /* If we are creating a shared library, took the address of a local
1064
         function or might export this function from this object file, then
1065
         we have to create an opd descriptor.  */
1066
      else if (x->info->shared
1067
               || hh == NULL
1068
               || (hh->eh.dynindx == -1 && hh->eh.type != STT_PARISC_MILLI)
1069
               || (hh->eh.root.type == bfd_link_hash_defined
1070
                   || hh->eh.root.type == bfd_link_hash_defweak))
1071
        {
1072
          /* If we are creating a shared library, then we will have to
1073
             create a runtime relocation for the symbol to properly
1074
             initialize the .opd entry.  Make sure the symbol gets
1075
             added to the dynamic symbol table.  */
1076
          if (x->info->shared
1077
              && (hh == NULL || (hh->eh.dynindx == -1)))
1078
            {
1079
              bfd *owner;
1080
              /* PR 6511: Default to using the dynamic symbol table.  */
1081
              owner = (hh->owner ? hh->owner: eh->root.u.def.section->owner);
1082
 
1083
              if (!bfd_elf_link_record_local_dynamic_symbol
1084
                    (x->info, owner, hh->sym_indx))
1085
                return FALSE;
1086
            }
1087
 
1088
          /* This may not be necessary or desirable anymore now that
1089
             we have some support for dealing with section symbols
1090
             in dynamic relocs.  But name munging does make the result
1091
             much easier to debug.  ie, the EPLT reloc will reference
1092
             a symbol like .foobar, instead of .text + offset.  */
1093
          if (x->info->shared && eh)
1094
            {
1095
              char *new_name;
1096
              struct elf_link_hash_entry *nh;
1097
 
1098
              new_name = alloca (strlen (eh->root.root.string) + 2);
1099
              new_name[0] = '.';
1100
              strcpy (new_name + 1, eh->root.root.string);
1101
 
1102
              nh = elf_link_hash_lookup (elf_hash_table (x->info),
1103
                                         new_name, TRUE, TRUE, TRUE);
1104
 
1105
              nh->root.type = eh->root.type;
1106
              nh->root.u.def.value = eh->root.u.def.value;
1107
              nh->root.u.def.section = eh->root.u.def.section;
1108
 
1109
              if (! bfd_elf_link_record_dynamic_symbol (x->info, nh))
1110
                return FALSE;
1111
 
1112
             }
1113
          hh->opd_offset = x->ofs;
1114
          x->ofs += OPD_ENTRY_SIZE;
1115
        }
1116
 
1117
      /* Otherwise we do not need an opd entry.  */
1118
      else
1119
        hh->want_opd = 0;
1120
    }
1121
  return TRUE;
1122
}
1123
 
1124
/* HP requires the EI_OSABI field to be filled in.  The assignment to
1125
   EI_ABIVERSION may not be strictly necessary.  */
1126
 
1127
static void
1128
elf64_hppa_post_process_headers (bfd *abfd,
1129
                         struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1130
{
1131
  Elf_Internal_Ehdr * i_ehdrp;
1132
 
1133
  i_ehdrp = elf_elfheader (abfd);
1134
 
1135
  i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
1136
  i_ehdrp->e_ident[EI_ABIVERSION] = 1;
1137
}
1138
 
1139
/* Create function descriptor section (.opd).  This section is called .opd
1140
   because it contains "official procedure descriptors".  The "official"
1141
   refers to the fact that these descriptors are used when taking the address
1142
   of a procedure, thus ensuring a unique address for each procedure.  */
1143
 
1144
static bfd_boolean
1145
get_opd (bfd *abfd,
1146
         struct bfd_link_info *info ATTRIBUTE_UNUSED,
1147
         struct elf64_hppa_link_hash_table *hppa_info)
1148
{
1149
  asection *opd;
1150
  bfd *dynobj;
1151
 
1152
  opd = hppa_info->opd_sec;
1153
  if (!opd)
1154
    {
1155
      dynobj = hppa_info->root.dynobj;
1156
      if (!dynobj)
1157
        hppa_info->root.dynobj = dynobj = abfd;
1158
 
1159
      opd = bfd_make_section_with_flags (dynobj, ".opd",
1160
                                         (SEC_ALLOC
1161
                                          | SEC_LOAD
1162
                                          | SEC_HAS_CONTENTS
1163
                                          | SEC_IN_MEMORY
1164
                                          | SEC_LINKER_CREATED));
1165
      if (!opd
1166
          || !bfd_set_section_alignment (abfd, opd, 3))
1167
        {
1168
          BFD_ASSERT (0);
1169
          return FALSE;
1170
        }
1171
 
1172
      hppa_info->opd_sec = opd;
1173
    }
1174
 
1175
  return TRUE;
1176
}
1177
 
1178
/* Create the PLT section.  */
1179
 
1180
static bfd_boolean
1181
get_plt (bfd *abfd,
1182
         struct bfd_link_info *info ATTRIBUTE_UNUSED,
1183
         struct elf64_hppa_link_hash_table *hppa_info)
1184
{
1185
  asection *plt;
1186
  bfd *dynobj;
1187
 
1188
  plt = hppa_info->plt_sec;
1189
  if (!plt)
1190
    {
1191
      dynobj = hppa_info->root.dynobj;
1192
      if (!dynobj)
1193
        hppa_info->root.dynobj = dynobj = abfd;
1194
 
1195
      plt = bfd_make_section_with_flags (dynobj, ".plt",
1196
                                         (SEC_ALLOC
1197
                                          | SEC_LOAD
1198
                                          | SEC_HAS_CONTENTS
1199
                                          | SEC_IN_MEMORY
1200
                                          | SEC_LINKER_CREATED));
1201
      if (!plt
1202
          || !bfd_set_section_alignment (abfd, plt, 3))
1203
        {
1204
          BFD_ASSERT (0);
1205
          return FALSE;
1206
        }
1207
 
1208
      hppa_info->plt_sec = plt;
1209
    }
1210
 
1211
  return TRUE;
1212
}
1213
 
1214
/* Create the DLT section.  */
1215
 
1216
static bfd_boolean
1217
get_dlt (bfd *abfd,
1218
         struct bfd_link_info *info ATTRIBUTE_UNUSED,
1219
         struct elf64_hppa_link_hash_table *hppa_info)
1220
{
1221
  asection *dlt;
1222
  bfd *dynobj;
1223
 
1224
  dlt = hppa_info->dlt_sec;
1225
  if (!dlt)
1226
    {
1227
      dynobj = hppa_info->root.dynobj;
1228
      if (!dynobj)
1229
        hppa_info->root.dynobj = dynobj = abfd;
1230
 
1231
      dlt = bfd_make_section_with_flags (dynobj, ".dlt",
1232
                                         (SEC_ALLOC
1233
                                          | SEC_LOAD
1234
                                          | SEC_HAS_CONTENTS
1235
                                          | SEC_IN_MEMORY
1236
                                          | SEC_LINKER_CREATED));
1237
      if (!dlt
1238
          || !bfd_set_section_alignment (abfd, dlt, 3))
1239
        {
1240
          BFD_ASSERT (0);
1241
          return FALSE;
1242
        }
1243
 
1244
      hppa_info->dlt_sec = dlt;
1245
    }
1246
 
1247
  return TRUE;
1248
}
1249
 
1250
/* Create the stubs section.  */
1251
 
1252
static bfd_boolean
1253
get_stub (bfd *abfd,
1254
          struct bfd_link_info *info ATTRIBUTE_UNUSED,
1255
          struct elf64_hppa_link_hash_table *hppa_info)
1256
{
1257
  asection *stub;
1258
  bfd *dynobj;
1259
 
1260
  stub = hppa_info->stub_sec;
1261
  if (!stub)
1262
    {
1263
      dynobj = hppa_info->root.dynobj;
1264
      if (!dynobj)
1265
        hppa_info->root.dynobj = dynobj = abfd;
1266
 
1267
      stub = bfd_make_section_with_flags (dynobj, ".stub",
1268
                                          (SEC_ALLOC | SEC_LOAD
1269
                                           | SEC_HAS_CONTENTS
1270
                                           | SEC_IN_MEMORY
1271
                                           | SEC_READONLY
1272
                                           | SEC_LINKER_CREATED));
1273
      if (!stub
1274
          || !bfd_set_section_alignment (abfd, stub, 3))
1275
        {
1276
          BFD_ASSERT (0);
1277
          return FALSE;
1278
        }
1279
 
1280
      hppa_info->stub_sec = stub;
1281
    }
1282
 
1283
  return TRUE;
1284
}
1285
 
1286
/* Create sections necessary for dynamic linking.  This is only a rough
1287
   cut and will likely change as we learn more about the somewhat
1288
   unusual dynamic linking scheme HP uses.
1289
 
1290
   .stub:
1291
        Contains code to implement cross-space calls.  The first time one
1292
        of the stubs is used it will call into the dynamic linker, later
1293
        calls will go straight to the target.
1294
 
1295
        The only stub we support right now looks like
1296
 
1297
        ldd OFFSET(%dp),%r1
1298
        bve %r0(%r1)
1299
        ldd OFFSET+8(%dp),%dp
1300
 
1301
        Other stubs may be needed in the future.  We may want the remove
1302
        the break/nop instruction.  It is only used right now to keep the
1303
        offset of a .plt entry and a .stub entry in sync.
1304
 
1305
   .dlt:
1306
        This is what most people call the .got.  HP used a different name.
1307
        Losers.
1308
 
1309
   .rela.dlt:
1310
        Relocations for the DLT.
1311
 
1312
   .plt:
1313
        Function pointers as address,gp pairs.
1314
 
1315
   .rela.plt:
1316
        Should contain dynamic IPLT (and EPLT?) relocations.
1317
 
1318
   .opd:
1319
        FPTRS
1320
 
1321
   .rela.opd:
1322
        EPLT relocations for symbols exported from shared libraries.  */
1323
 
1324
static bfd_boolean
1325
elf64_hppa_create_dynamic_sections (bfd *abfd,
1326
                                    struct bfd_link_info *info)
1327
{
1328
  asection *s;
1329
  struct elf64_hppa_link_hash_table *hppa_info;
1330
 
1331
  hppa_info = hppa_link_hash_table (info);
1332
  if (hppa_info == NULL)
1333
    return FALSE;
1334
 
1335
  if (! get_stub (abfd, info, hppa_info))
1336
    return FALSE;
1337
 
1338
  if (! get_dlt (abfd, info, hppa_info))
1339
    return FALSE;
1340
 
1341
  if (! get_plt (abfd, info, hppa_info))
1342
    return FALSE;
1343
 
1344
  if (! get_opd (abfd, info, hppa_info))
1345
    return FALSE;
1346
 
1347
  s = bfd_make_section_with_flags (abfd, ".rela.dlt",
1348
                                   (SEC_ALLOC | SEC_LOAD
1349
                                    | SEC_HAS_CONTENTS
1350
                                    | SEC_IN_MEMORY
1351
                                    | SEC_READONLY
1352
                                    | SEC_LINKER_CREATED));
1353
  if (s == NULL
1354
      || !bfd_set_section_alignment (abfd, s, 3))
1355
    return FALSE;
1356
  hppa_info->dlt_rel_sec = s;
1357
 
1358
  s = bfd_make_section_with_flags (abfd, ".rela.plt",
1359
                                   (SEC_ALLOC | SEC_LOAD
1360
                                    | SEC_HAS_CONTENTS
1361
                                    | SEC_IN_MEMORY
1362
                                    | SEC_READONLY
1363
                                    | SEC_LINKER_CREATED));
1364
  if (s == NULL
1365
      || !bfd_set_section_alignment (abfd, s, 3))
1366
    return FALSE;
1367
  hppa_info->plt_rel_sec = s;
1368
 
1369
  s = bfd_make_section_with_flags (abfd, ".rela.data",
1370
                                   (SEC_ALLOC | SEC_LOAD
1371
                                    | SEC_HAS_CONTENTS
1372
                                    | SEC_IN_MEMORY
1373
                                    | SEC_READONLY
1374
                                    | SEC_LINKER_CREATED));
1375
  if (s == NULL
1376
      || !bfd_set_section_alignment (abfd, s, 3))
1377
    return FALSE;
1378
  hppa_info->other_rel_sec = s;
1379
 
1380
  s = bfd_make_section_with_flags (abfd, ".rela.opd",
1381
                                   (SEC_ALLOC | SEC_LOAD
1382
                                    | SEC_HAS_CONTENTS
1383
                                    | SEC_IN_MEMORY
1384
                                    | SEC_READONLY
1385
                                    | SEC_LINKER_CREATED));
1386
  if (s == NULL
1387
      || !bfd_set_section_alignment (abfd, s, 3))
1388
    return FALSE;
1389
  hppa_info->opd_rel_sec = s;
1390
 
1391
  return TRUE;
1392
}
1393
 
1394
/* Allocate dynamic relocations for those symbols that turned out
1395
   to be dynamic.  */
1396
 
1397
static bfd_boolean
1398
allocate_dynrel_entries (struct elf_link_hash_entry *eh, void *data)
1399
{
1400
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1401
  struct elf64_hppa_allocate_data *x = (struct elf64_hppa_allocate_data *)data;
1402
  struct elf64_hppa_link_hash_table *hppa_info;
1403
  struct elf64_hppa_dyn_reloc_entry *rent;
1404
  bfd_boolean dynamic_symbol, shared;
1405
 
1406
  hppa_info = hppa_link_hash_table (x->info);
1407
  if (hppa_info == NULL)
1408
    return FALSE;
1409
 
1410
  dynamic_symbol = elf64_hppa_dynamic_symbol_p (eh, x->info);
1411
  shared = x->info->shared;
1412
 
1413
  /* We may need to allocate relocations for a non-dynamic symbol
1414
     when creating a shared library.  */
1415
  if (!dynamic_symbol && !shared)
1416
    return TRUE;
1417
 
1418
  /* Take care of the normal data relocations.  */
1419
 
1420
  for (rent = hh->reloc_entries; rent; rent = rent->next)
1421
    {
1422
      /* Allocate one iff we are building a shared library, the relocation
1423
         isn't a R_PARISC_FPTR64, or we don't want an opd entry.  */
1424
      if (!shared && rent->type == R_PARISC_FPTR64 && hh->want_opd)
1425
        continue;
1426
 
1427
      hppa_info->other_rel_sec->size += sizeof (Elf64_External_Rela);
1428
 
1429
      /* Make sure this symbol gets into the dynamic symbol table if it is
1430
         not already recorded.  ?!? This should not be in the loop since
1431
         the symbol need only be added once.  */
1432
      if (eh->dynindx == -1 && eh->type != STT_PARISC_MILLI)
1433
        if (!bfd_elf_link_record_local_dynamic_symbol
1434
            (x->info, rent->sec->owner, hh->sym_indx))
1435
          return FALSE;
1436
    }
1437
 
1438
  /* Take care of the GOT and PLT relocations.  */
1439
 
1440
  if ((dynamic_symbol || shared) && hh->want_dlt)
1441
    hppa_info->dlt_rel_sec->size += sizeof (Elf64_External_Rela);
1442
 
1443
  /* If we are building a shared library, then every symbol that has an
1444
     opd entry will need an EPLT relocation to relocate the symbol's address
1445
     and __gp value based on the runtime load address.  */
1446
  if (shared && hh->want_opd)
1447
    hppa_info->opd_rel_sec->size += sizeof (Elf64_External_Rela);
1448
 
1449
  if (hh->want_plt && dynamic_symbol)
1450
    {
1451
      bfd_size_type t = 0;
1452
 
1453
      /* Dynamic symbols get one IPLT relocation.  Local symbols in
1454
         shared libraries get two REL relocations.  Local symbols in
1455
         main applications get nothing.  */
1456
      if (dynamic_symbol)
1457
        t = sizeof (Elf64_External_Rela);
1458
      else if (shared)
1459
        t = 2 * sizeof (Elf64_External_Rela);
1460
 
1461
      hppa_info->plt_rel_sec->size += t;
1462
    }
1463
 
1464
  return TRUE;
1465
}
1466
 
1467
/* Adjust a symbol defined by a dynamic object and referenced by a
1468
   regular object.  */
1469
 
1470
static bfd_boolean
1471
elf64_hppa_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1472
                                  struct elf_link_hash_entry *eh)
1473
{
1474
  /* ??? Undefined symbols with PLT entries should be re-defined
1475
     to be the PLT entry.  */
1476
 
1477
  /* If this is a weak symbol, and there is a real definition, the
1478
     processor independent code will have arranged for us to see the
1479
     real definition first, and we can just use the same value.  */
1480
  if (eh->u.weakdef != NULL)
1481
    {
1482
      BFD_ASSERT (eh->u.weakdef->root.type == bfd_link_hash_defined
1483
                  || eh->u.weakdef->root.type == bfd_link_hash_defweak);
1484
      eh->root.u.def.section = eh->u.weakdef->root.u.def.section;
1485
      eh->root.u.def.value = eh->u.weakdef->root.u.def.value;
1486
      return TRUE;
1487
    }
1488
 
1489
  /* If this is a reference to a symbol defined by a dynamic object which
1490
     is not a function, we might allocate the symbol in our .dynbss section
1491
     and allocate a COPY dynamic relocation.
1492
 
1493
     But PA64 code is canonically PIC, so as a rule we can avoid this sort
1494
     of hackery.  */
1495
 
1496
  return TRUE;
1497
}
1498
 
1499
/* This function is called via elf_link_hash_traverse to mark millicode
1500
   symbols with a dynindx of -1 and to remove the string table reference
1501
   from the dynamic symbol table.  If the symbol is not a millicode symbol,
1502
   elf64_hppa_mark_exported_functions is called.  */
1503
 
1504
static bfd_boolean
1505
elf64_hppa_mark_milli_and_exported_functions (struct elf_link_hash_entry *eh,
1506
                                              void *data)
1507
{
1508 148 khays
  struct bfd_link_info *info = (struct bfd_link_info *) data;
1509 14 khays
 
1510 148 khays
  if (eh->type == STT_PARISC_MILLI)
1511 14 khays
    {
1512 148 khays
      if (eh->dynindx != -1)
1513 14 khays
        {
1514 148 khays
          eh->dynindx = -1;
1515 14 khays
          _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
1516 148 khays
                                  eh->dynstr_index);
1517 14 khays
        }
1518
      return TRUE;
1519
    }
1520
 
1521
  return elf64_hppa_mark_exported_functions (eh, data);
1522
}
1523
 
1524
/* Set the final sizes of the dynamic sections and allocate memory for
1525
   the contents of our special sections.  */
1526
 
1527
static bfd_boolean
1528
elf64_hppa_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1529
{
1530
  struct elf64_hppa_link_hash_table *hppa_info;
1531
  struct elf64_hppa_allocate_data data;
1532
  bfd *dynobj;
1533
  bfd *ibfd;
1534
  asection *sec;
1535
  bfd_boolean plt;
1536
  bfd_boolean relocs;
1537
  bfd_boolean reltext;
1538
 
1539
  hppa_info = hppa_link_hash_table (info);
1540
  if (hppa_info == NULL)
1541
    return FALSE;
1542
 
1543
  dynobj = elf_hash_table (info)->dynobj;
1544
  BFD_ASSERT (dynobj != NULL);
1545
 
1546
  /* Mark each function this program exports so that we will allocate
1547
     space in the .opd section for each function's FPTR.  If we are
1548
     creating dynamic sections, change the dynamic index of millicode
1549
     symbols to -1 and remove them from the string table for .dynstr.
1550
 
1551
     We have to traverse the main linker hash table since we have to
1552
     find functions which may not have been mentioned in any relocs.  */
1553
  elf_link_hash_traverse (elf_hash_table (info),
1554
                          (elf_hash_table (info)->dynamic_sections_created
1555
                           ? elf64_hppa_mark_milli_and_exported_functions
1556
                           : elf64_hppa_mark_exported_functions),
1557
                          info);
1558
 
1559
  if (elf_hash_table (info)->dynamic_sections_created)
1560
    {
1561
      /* Set the contents of the .interp section to the interpreter.  */
1562
      if (info->executable)
1563
        {
1564
          sec = bfd_get_section_by_name (dynobj, ".interp");
1565
          BFD_ASSERT (sec != NULL);
1566
          sec->size = sizeof ELF_DYNAMIC_INTERPRETER;
1567
          sec->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1568
        }
1569
    }
1570
  else
1571
    {
1572
      /* We may have created entries in the .rela.got section.
1573
         However, if we are not creating the dynamic sections, we will
1574
         not actually use these entries.  Reset the size of .rela.dlt,
1575
         which will cause it to get stripped from the output file
1576
         below.  */
1577
      sec = bfd_get_section_by_name (dynobj, ".rela.dlt");
1578
      if (sec != NULL)
1579
        sec->size = 0;
1580
    }
1581
 
1582
  /* Set up DLT, PLT and OPD offsets for local syms, and space for local
1583
     dynamic relocs.  */
1584
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1585
    {
1586
      bfd_signed_vma *local_dlt;
1587
      bfd_signed_vma *end_local_dlt;
1588
      bfd_signed_vma *local_plt;
1589
      bfd_signed_vma *end_local_plt;
1590
      bfd_signed_vma *local_opd;
1591
      bfd_signed_vma *end_local_opd;
1592
      bfd_size_type locsymcount;
1593
      Elf_Internal_Shdr *symtab_hdr;
1594
      asection *srel;
1595
 
1596
      if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
1597
        continue;
1598
 
1599
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
1600
        {
1601
          struct elf64_hppa_dyn_reloc_entry *hdh_p;
1602
 
1603
          for (hdh_p = ((struct elf64_hppa_dyn_reloc_entry *)
1604
                    elf_section_data (sec)->local_dynrel);
1605
               hdh_p != NULL;
1606
               hdh_p = hdh_p->next)
1607
            {
1608
              if (!bfd_is_abs_section (hdh_p->sec)
1609
                  && bfd_is_abs_section (hdh_p->sec->output_section))
1610
                {
1611
                  /* Input section has been discarded, either because
1612
                     it is a copy of a linkonce section or due to
1613
                     linker script /DISCARD/, so we'll be discarding
1614
                     the relocs too.  */
1615
                }
1616
              else if (hdh_p->count != 0)
1617
                {
1618
                  srel = elf_section_data (hdh_p->sec)->sreloc;
1619
                  srel->size += hdh_p->count * sizeof (Elf64_External_Rela);
1620
                  if ((hdh_p->sec->output_section->flags & SEC_READONLY) != 0)
1621
                    info->flags |= DF_TEXTREL;
1622
                }
1623
            }
1624
        }
1625
 
1626
      local_dlt = elf_local_got_refcounts (ibfd);
1627
      if (!local_dlt)
1628
        continue;
1629
 
1630
      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1631
      locsymcount = symtab_hdr->sh_info;
1632
      end_local_dlt = local_dlt + locsymcount;
1633
      sec = hppa_info->dlt_sec;
1634
      srel = hppa_info->dlt_rel_sec;
1635
      for (; local_dlt < end_local_dlt; ++local_dlt)
1636
        {
1637
          if (*local_dlt > 0)
1638
            {
1639
              *local_dlt = sec->size;
1640
              sec->size += DLT_ENTRY_SIZE;
1641
              if (info->shared)
1642
                {
1643
                  srel->size += sizeof (Elf64_External_Rela);
1644
                }
1645
            }
1646
          else
1647
            *local_dlt = (bfd_vma) -1;
1648
        }
1649
 
1650
      local_plt = end_local_dlt;
1651
      end_local_plt = local_plt + locsymcount;
1652
      if (! hppa_info->root.dynamic_sections_created)
1653
        {
1654
          /* Won't be used, but be safe.  */
1655
          for (; local_plt < end_local_plt; ++local_plt)
1656
            *local_plt = (bfd_vma) -1;
1657
        }
1658
      else
1659
        {
1660
          sec = hppa_info->plt_sec;
1661
          srel = hppa_info->plt_rel_sec;
1662
          for (; local_plt < end_local_plt; ++local_plt)
1663
            {
1664
              if (*local_plt > 0)
1665
                {
1666
                  *local_plt = sec->size;
1667
                  sec->size += PLT_ENTRY_SIZE;
1668
                  if (info->shared)
1669
                    srel->size += sizeof (Elf64_External_Rela);
1670
                }
1671
              else
1672
                *local_plt = (bfd_vma) -1;
1673
            }
1674
        }
1675
 
1676
      local_opd = end_local_plt;
1677
      end_local_opd = local_opd + locsymcount;
1678
      if (! hppa_info->root.dynamic_sections_created)
1679
        {
1680
          /* Won't be used, but be safe.  */
1681
          for (; local_opd < end_local_opd; ++local_opd)
1682
            *local_opd = (bfd_vma) -1;
1683
        }
1684
      else
1685
        {
1686
          sec = hppa_info->opd_sec;
1687
          srel = hppa_info->opd_rel_sec;
1688
          for (; local_opd < end_local_opd; ++local_opd)
1689
            {
1690
              if (*local_opd > 0)
1691
                {
1692
                  *local_opd = sec->size;
1693
                  sec->size += OPD_ENTRY_SIZE;
1694
                  if (info->shared)
1695
                    srel->size += sizeof (Elf64_External_Rela);
1696
                }
1697
              else
1698
                *local_opd = (bfd_vma) -1;
1699
            }
1700
        }
1701
    }
1702
 
1703
  /* Allocate the GOT entries.  */
1704
 
1705
  data.info = info;
1706
  if (hppa_info->dlt_sec)
1707
    {
1708
      data.ofs = hppa_info->dlt_sec->size;
1709
      elf_link_hash_traverse (elf_hash_table (info),
1710
                              allocate_global_data_dlt, &data);
1711
      hppa_info->dlt_sec->size = data.ofs;
1712
    }
1713
 
1714
  if (hppa_info->plt_sec)
1715
    {
1716
      data.ofs = hppa_info->plt_sec->size;
1717
      elf_link_hash_traverse (elf_hash_table (info),
1718
                              allocate_global_data_plt, &data);
1719
      hppa_info->plt_sec->size = data.ofs;
1720
    }
1721
 
1722
  if (hppa_info->stub_sec)
1723
    {
1724
      data.ofs = 0x0;
1725
      elf_link_hash_traverse (elf_hash_table (info),
1726
                              allocate_global_data_stub, &data);
1727
      hppa_info->stub_sec->size = data.ofs;
1728
    }
1729
 
1730
  /* Allocate space for entries in the .opd section.  */
1731
  if (hppa_info->opd_sec)
1732
    {
1733
      data.ofs = hppa_info->opd_sec->size;
1734
      elf_link_hash_traverse (elf_hash_table (info),
1735
                              allocate_global_data_opd, &data);
1736
      hppa_info->opd_sec->size = data.ofs;
1737
    }
1738
 
1739
  /* Now allocate space for dynamic relocations, if necessary.  */
1740
  if (hppa_info->root.dynamic_sections_created)
1741
    elf_link_hash_traverse (elf_hash_table (info),
1742
                            allocate_dynrel_entries, &data);
1743
 
1744
  /* The sizes of all the sections are set.  Allocate memory for them.  */
1745
  plt = FALSE;
1746
  relocs = FALSE;
1747
  reltext = FALSE;
1748
  for (sec = dynobj->sections; sec != NULL; sec = sec->next)
1749
    {
1750
      const char *name;
1751
 
1752
      if ((sec->flags & SEC_LINKER_CREATED) == 0)
1753
        continue;
1754
 
1755
      /* It's OK to base decisions on the section name, because none
1756
         of the dynobj section names depend upon the input files.  */
1757
      name = bfd_get_section_name (dynobj, sec);
1758
 
1759
      if (strcmp (name, ".plt") == 0)
1760
        {
1761
          /* Remember whether there is a PLT.  */
1762
          plt = sec->size != 0;
1763
        }
1764
      else if (strcmp (name, ".opd") == 0
1765
               || CONST_STRNEQ (name, ".dlt")
1766
               || strcmp (name, ".stub") == 0
1767
               || strcmp (name, ".got") == 0)
1768
        {
1769
          /* Strip this section if we don't need it; see the comment below.  */
1770
        }
1771
      else if (CONST_STRNEQ (name, ".rela"))
1772
        {
1773
          if (sec->size != 0)
1774
            {
1775
              asection *target;
1776
 
1777
              /* Remember whether there are any reloc sections other
1778
                 than .rela.plt.  */
1779
              if (strcmp (name, ".rela.plt") != 0)
1780
                {
1781
                  const char *outname;
1782
 
1783
                  relocs = TRUE;
1784
 
1785
                  /* If this relocation section applies to a read only
1786
                     section, then we probably need a DT_TEXTREL
1787
                     entry.  The entries in the .rela.plt section
1788
                     really apply to the .got section, which we
1789
                     created ourselves and so know is not readonly.  */
1790
                  outname = bfd_get_section_name (output_bfd,
1791
                                                  sec->output_section);
1792
                  target = bfd_get_section_by_name (output_bfd, outname + 4);
1793
                  if (target != NULL
1794
                      && (target->flags & SEC_READONLY) != 0
1795
                      && (target->flags & SEC_ALLOC) != 0)
1796
                    reltext = TRUE;
1797
                }
1798
 
1799
              /* We use the reloc_count field as a counter if we need
1800
                 to copy relocs into the output file.  */
1801
              sec->reloc_count = 0;
1802
            }
1803
        }
1804
      else
1805
        {
1806
          /* It's not one of our sections, so don't allocate space.  */
1807
          continue;
1808
        }
1809
 
1810
      if (sec->size == 0)
1811
        {
1812
          /* If we don't need this section, strip it from the
1813
             output file.  This is mostly to handle .rela.bss and
1814
             .rela.plt.  We must create both sections in
1815
             create_dynamic_sections, because they must be created
1816
             before the linker maps input sections to output
1817
             sections.  The linker does that before
1818
             adjust_dynamic_symbol is called, and it is that
1819
             function which decides whether anything needs to go
1820
             into these sections.  */
1821
          sec->flags |= SEC_EXCLUDE;
1822
          continue;
1823
        }
1824
 
1825
      if ((sec->flags & SEC_HAS_CONTENTS) == 0)
1826
        continue;
1827
 
1828
      /* Allocate memory for the section contents if it has not
1829
         been allocated already.  We use bfd_zalloc here in case
1830
         unused entries are not reclaimed before the section's
1831
         contents are written out.  This should not happen, but this
1832
         way if it does, we get a R_PARISC_NONE reloc instead of
1833
         garbage.  */
1834
      if (sec->contents == NULL)
1835
        {
1836
          sec->contents = (bfd_byte *) bfd_zalloc (dynobj, sec->size);
1837
          if (sec->contents == NULL)
1838
            return FALSE;
1839
        }
1840
    }
1841
 
1842
  if (elf_hash_table (info)->dynamic_sections_created)
1843
    {
1844
      /* Always create a DT_PLTGOT.  It actually has nothing to do with
1845
         the PLT, it is how we communicate the __gp value of a load
1846
         module to the dynamic linker.  */
1847
#define add_dynamic_entry(TAG, VAL) \
1848
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1849
 
1850
      if (!add_dynamic_entry (DT_HP_DLD_FLAGS, 0)
1851
          || !add_dynamic_entry (DT_PLTGOT, 0))
1852
        return FALSE;
1853
 
1854
      /* Add some entries to the .dynamic section.  We fill in the
1855
         values later, in elf64_hppa_finish_dynamic_sections, but we
1856
         must add the entries now so that we get the correct size for
1857
         the .dynamic section.  The DT_DEBUG entry is filled in by the
1858
         dynamic linker and used by the debugger.  */
1859
      if (! info->shared)
1860
        {
1861
          if (!add_dynamic_entry (DT_DEBUG, 0)
1862
              || !add_dynamic_entry (DT_HP_DLD_HOOK, 0)
1863
              || !add_dynamic_entry (DT_HP_LOAD_MAP, 0))
1864
            return FALSE;
1865
        }
1866
 
1867
      /* Force DT_FLAGS to always be set.
1868
         Required by HPUX 11.00 patch PHSS_26559.  */
1869
      if (!add_dynamic_entry (DT_FLAGS, (info)->flags))
1870
        return FALSE;
1871
 
1872
      if (plt)
1873
        {
1874
          if (!add_dynamic_entry (DT_PLTRELSZ, 0)
1875
              || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1876
              || !add_dynamic_entry (DT_JMPREL, 0))
1877
            return FALSE;
1878
        }
1879
 
1880
      if (relocs)
1881
        {
1882
          if (!add_dynamic_entry (DT_RELA, 0)
1883
              || !add_dynamic_entry (DT_RELASZ, 0)
1884
              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
1885
            return FALSE;
1886
        }
1887
 
1888
      if (reltext)
1889
        {
1890
          if (!add_dynamic_entry (DT_TEXTREL, 0))
1891
            return FALSE;
1892
          info->flags |= DF_TEXTREL;
1893
        }
1894
    }
1895
#undef add_dynamic_entry
1896
 
1897
  return TRUE;
1898
}
1899
 
1900
/* Called after we have output the symbol into the dynamic symbol
1901
   table, but before we output the symbol into the normal symbol
1902
   table.
1903
 
1904
   For some symbols we had to change their address when outputting
1905
   the dynamic symbol table.  We undo that change here so that
1906
   the symbols have their expected value in the normal symbol
1907
   table.  Ick.  */
1908
 
1909
static int
1910
elf64_hppa_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
1911
                                    const char *name,
1912
                                    Elf_Internal_Sym *sym,
1913
                                    asection *input_sec ATTRIBUTE_UNUSED,
1914
                                    struct elf_link_hash_entry *eh)
1915
{
1916
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1917
 
1918
  /* We may be called with the file symbol or section symbols.
1919
     They never need munging, so it is safe to ignore them.  */
1920
  if (!name || !eh)
1921
    return 1;
1922
 
1923
  /* Function symbols for which we created .opd entries *may* have been
1924
     munged by finish_dynamic_symbol and have to be un-munged here.
1925
 
1926
     Note that finish_dynamic_symbol sometimes turns dynamic symbols
1927
     into non-dynamic ones, so we initialize st_shndx to -1 in
1928
     mark_exported_functions and check to see if it was overwritten
1929
     here instead of just checking eh->dynindx.  */
1930
  if (hh->want_opd && hh->st_shndx != -1)
1931
    {
1932
      /* Restore the saved value and section index.  */
1933
      sym->st_value = hh->st_value;
1934
      sym->st_shndx = hh->st_shndx;
1935
    }
1936
 
1937
  return 1;
1938
}
1939
 
1940
/* Finish up dynamic symbol handling.  We set the contents of various
1941
   dynamic sections here.  */
1942
 
1943
static bfd_boolean
1944
elf64_hppa_finish_dynamic_symbol (bfd *output_bfd,
1945
                                  struct bfd_link_info *info,
1946
                                  struct elf_link_hash_entry *eh,
1947
                                  Elf_Internal_Sym *sym)
1948
{
1949
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
1950
  asection *stub, *splt, *sopd, *spltrel;
1951
  struct elf64_hppa_link_hash_table *hppa_info;
1952
 
1953
  hppa_info = hppa_link_hash_table (info);
1954
  if (hppa_info == NULL)
1955
    return FALSE;
1956
 
1957
  stub = hppa_info->stub_sec;
1958
  splt = hppa_info->plt_sec;
1959
  sopd = hppa_info->opd_sec;
1960
  spltrel = hppa_info->plt_rel_sec;
1961
 
1962
  /* Incredible.  It is actually necessary to NOT use the symbol's real
1963
     value when building the dynamic symbol table for a shared library.
1964
     At least for symbols that refer to functions.
1965
 
1966
     We will store a new value and section index into the symbol long
1967
     enough to output it into the dynamic symbol table, then we restore
1968
     the original values (in elf64_hppa_link_output_symbol_hook).  */
1969
  if (hh->want_opd)
1970
    {
1971
      BFD_ASSERT (sopd != NULL);
1972
 
1973
      /* Save away the original value and section index so that we
1974
         can restore them later.  */
1975
      hh->st_value = sym->st_value;
1976
      hh->st_shndx = sym->st_shndx;
1977
 
1978
      /* For the dynamic symbol table entry, we want the value to be
1979
         address of this symbol's entry within the .opd section.  */
1980
      sym->st_value = (hh->opd_offset
1981
                       + sopd->output_offset
1982
                       + sopd->output_section->vma);
1983
      sym->st_shndx = _bfd_elf_section_from_bfd_section (output_bfd,
1984
                                                         sopd->output_section);
1985
    }
1986
 
1987
  /* Initialize a .plt entry if requested.  */
1988
  if (hh->want_plt
1989
      && elf64_hppa_dynamic_symbol_p (eh, info))
1990
    {
1991
      bfd_vma value;
1992
      Elf_Internal_Rela rel;
1993
      bfd_byte *loc;
1994
 
1995
      BFD_ASSERT (splt != NULL && spltrel != NULL);
1996
 
1997
      /* We do not actually care about the value in the PLT entry
1998
         if we are creating a shared library and the symbol is
1999
         still undefined, we create a dynamic relocation to fill
2000
         in the correct value.  */
2001
      if (info->shared && eh->root.type == bfd_link_hash_undefined)
2002
        value = 0;
2003
      else
2004
        value = (eh->root.u.def.value + eh->root.u.def.section->vma);
2005
 
2006
      /* Fill in the entry in the procedure linkage table.
2007
 
2008
         The format of a plt entry is
2009
         <funcaddr> <__gp>.
2010
 
2011
         plt_offset is the offset within the PLT section at which to
2012
         install the PLT entry.
2013
 
2014
         We are modifying the in-memory PLT contents here, so we do not add
2015
         in the output_offset of the PLT section.  */
2016
 
2017
      bfd_put_64 (splt->owner, value, splt->contents + hh->plt_offset);
2018
      value = _bfd_get_gp_value (splt->output_section->owner);
2019
      bfd_put_64 (splt->owner, value, splt->contents + hh->plt_offset + 0x8);
2020
 
2021
      /* Create a dynamic IPLT relocation for this entry.
2022
 
2023
         We are creating a relocation in the output file's PLT section,
2024
         which is included within the DLT secton.  So we do need to include
2025
         the PLT's output_offset in the computation of the relocation's
2026
         address.  */
2027
      rel.r_offset = (hh->plt_offset + splt->output_offset
2028
                      + splt->output_section->vma);
2029
      rel.r_info = ELF64_R_INFO (hh->eh.dynindx, R_PARISC_IPLT);
2030
      rel.r_addend = 0;
2031
 
2032
      loc = spltrel->contents;
2033
      loc += spltrel->reloc_count++ * sizeof (Elf64_External_Rela);
2034
      bfd_elf64_swap_reloca_out (splt->output_section->owner, &rel, loc);
2035
    }
2036
 
2037
  /* Initialize an external call stub entry if requested.  */
2038
  if (hh->want_stub
2039
      && elf64_hppa_dynamic_symbol_p (eh, info))
2040
    {
2041
      bfd_vma value;
2042
      int insn;
2043
      unsigned int max_offset;
2044
 
2045
      BFD_ASSERT (stub != NULL);
2046
 
2047
      /* Install the generic stub template.
2048
 
2049
         We are modifying the contents of the stub section, so we do not
2050
         need to include the stub section's output_offset here.  */
2051
      memcpy (stub->contents + hh->stub_offset, plt_stub, sizeof (plt_stub));
2052
 
2053
      /* Fix up the first ldd instruction.
2054
 
2055
         We are modifying the contents of the STUB section in memory,
2056
         so we do not need to include its output offset in this computation.
2057
 
2058
         Note the plt_offset value is the value of the PLT entry relative to
2059
         the start of the PLT section.  These instructions will reference
2060
         data relative to the value of __gp, which may not necessarily have
2061
         the same address as the start of the PLT section.
2062
 
2063
         gp_offset contains the offset of __gp within the PLT section.  */
2064
      value = hh->plt_offset - hppa_info->gp_offset;
2065
 
2066
      insn = bfd_get_32 (stub->owner, stub->contents + hh->stub_offset);
2067
      if (output_bfd->arch_info->mach >= 25)
2068
        {
2069
          /* Wide mode allows 16 bit offsets.  */
2070
          max_offset = 32768;
2071
          insn &= ~ 0xfff1;
2072
          insn |= re_assemble_16 ((int) value);
2073
        }
2074
      else
2075
        {
2076
          max_offset = 8192;
2077
          insn &= ~ 0x3ff1;
2078
          insn |= re_assemble_14 ((int) value);
2079
        }
2080
 
2081
      if ((value & 7) || value + max_offset >= 2*max_offset - 8)
2082
        {
2083
          (*_bfd_error_handler) (_("stub entry for %s cannot load .plt, dp offset = %ld"),
2084
                                 hh->eh.root.root.string,
2085
                                 (long) value);
2086
          return FALSE;
2087
        }
2088
 
2089
      bfd_put_32 (stub->owner, (bfd_vma) insn,
2090
                  stub->contents + hh->stub_offset);
2091
 
2092
      /* Fix up the second ldd instruction.  */
2093
      value += 8;
2094
      insn = bfd_get_32 (stub->owner, stub->contents + hh->stub_offset + 8);
2095
      if (output_bfd->arch_info->mach >= 25)
2096
        {
2097
          insn &= ~ 0xfff1;
2098
          insn |= re_assemble_16 ((int) value);
2099
        }
2100
      else
2101
        {
2102
          insn &= ~ 0x3ff1;
2103
          insn |= re_assemble_14 ((int) value);
2104
        }
2105
      bfd_put_32 (stub->owner, (bfd_vma) insn,
2106
                  stub->contents + hh->stub_offset + 8);
2107
    }
2108
 
2109
  return TRUE;
2110
}
2111
 
2112
/* The .opd section contains FPTRs for each function this file
2113
   exports.  Initialize the FPTR entries.  */
2114
 
2115
static bfd_boolean
2116
elf64_hppa_finalize_opd (struct elf_link_hash_entry *eh, void *data)
2117
{
2118
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
2119
  struct bfd_link_info *info = (struct bfd_link_info *)data;
2120
  struct elf64_hppa_link_hash_table *hppa_info;
2121
  asection *sopd;
2122
  asection *sopdrel;
2123
 
2124
  hppa_info = hppa_link_hash_table (info);
2125
  if (hppa_info == NULL)
2126
    return FALSE;
2127
 
2128
  sopd = hppa_info->opd_sec;
2129
  sopdrel = hppa_info->opd_rel_sec;
2130
 
2131
  if (hh->want_opd)
2132
    {
2133
      bfd_vma value;
2134
 
2135
      /* The first two words of an .opd entry are zero.
2136
 
2137
         We are modifying the contents of the OPD section in memory, so we
2138
         do not need to include its output offset in this computation.  */
2139
      memset (sopd->contents + hh->opd_offset, 0, 16);
2140
 
2141
      value = (eh->root.u.def.value
2142
               + eh->root.u.def.section->output_section->vma
2143
               + eh->root.u.def.section->output_offset);
2144
 
2145
      /* The next word is the address of the function.  */
2146
      bfd_put_64 (sopd->owner, value, sopd->contents + hh->opd_offset + 16);
2147
 
2148
      /* The last word is our local __gp value.  */
2149
      value = _bfd_get_gp_value (sopd->output_section->owner);
2150
      bfd_put_64 (sopd->owner, value, sopd->contents + hh->opd_offset + 24);
2151
    }
2152
 
2153
  /* If we are generating a shared library, we must generate EPLT relocations
2154
     for each entry in the .opd, even for static functions (they may have
2155
     had their address taken).  */
2156
  if (info->shared && hh->want_opd)
2157
    {
2158
      Elf_Internal_Rela rel;
2159
      bfd_byte *loc;
2160
      int dynindx;
2161
 
2162
      /* We may need to do a relocation against a local symbol, in
2163
         which case we have to look up it's dynamic symbol index off
2164
         the local symbol hash table.  */
2165
      if (eh->dynindx != -1)
2166
        dynindx = eh->dynindx;
2167
      else
2168
        dynindx
2169
          = _bfd_elf_link_lookup_local_dynindx (info, hh->owner,
2170
                                                hh->sym_indx);
2171
 
2172
      /* The offset of this relocation is the absolute address of the
2173
         .opd entry for this symbol.  */
2174
      rel.r_offset = (hh->opd_offset + sopd->output_offset
2175
                      + sopd->output_section->vma);
2176
 
2177
      /* If H is non-null, then we have an external symbol.
2178
 
2179
         It is imperative that we use a different dynamic symbol for the
2180
         EPLT relocation if the symbol has global scope.
2181
 
2182
         In the dynamic symbol table, the function symbol will have a value
2183
         which is address of the function's .opd entry.
2184
 
2185
         Thus, we can not use that dynamic symbol for the EPLT relocation
2186
         (if we did, the data in the .opd would reference itself rather
2187
         than the actual address of the function).  Instead we have to use
2188
         a new dynamic symbol which has the same value as the original global
2189
         function symbol.
2190
 
2191
         We prefix the original symbol with a "." and use the new symbol in
2192
         the EPLT relocation.  This new symbol has already been recorded in
2193
         the symbol table, we just have to look it up and use it.
2194
 
2195
         We do not have such problems with static functions because we do
2196
         not make their addresses in the dynamic symbol table point to
2197
         the .opd entry.  Ultimately this should be safe since a static
2198
         function can not be directly referenced outside of its shared
2199
         library.
2200
 
2201
         We do have to play similar games for FPTR relocations in shared
2202
         libraries, including those for static symbols.  See the FPTR
2203
         handling in elf64_hppa_finalize_dynreloc.  */
2204
      if (eh)
2205
        {
2206
          char *new_name;
2207
          struct elf_link_hash_entry *nh;
2208
 
2209
          new_name = alloca (strlen (eh->root.root.string) + 2);
2210
          new_name[0] = '.';
2211
          strcpy (new_name + 1, eh->root.root.string);
2212
 
2213
          nh = elf_link_hash_lookup (elf_hash_table (info),
2214
                                     new_name, TRUE, TRUE, FALSE);
2215
 
2216
          /* All we really want from the new symbol is its dynamic
2217
             symbol index.  */
2218
          if (nh)
2219
            dynindx = nh->dynindx;
2220
        }
2221
 
2222
      rel.r_addend = 0;
2223
      rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_EPLT);
2224
 
2225
      loc = sopdrel->contents;
2226
      loc += sopdrel->reloc_count++ * sizeof (Elf64_External_Rela);
2227
      bfd_elf64_swap_reloca_out (sopd->output_section->owner, &rel, loc);
2228
    }
2229
  return TRUE;
2230
}
2231
 
2232
/* The .dlt section contains addresses for items referenced through the
2233
   dlt.  Note that we can have a DLTIND relocation for a local symbol, thus
2234
   we can not depend on finish_dynamic_symbol to initialize the .dlt.  */
2235
 
2236
static bfd_boolean
2237
elf64_hppa_finalize_dlt (struct elf_link_hash_entry *eh, void *data)
2238
{
2239
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
2240
  struct bfd_link_info *info = (struct bfd_link_info *)data;
2241
  struct elf64_hppa_link_hash_table *hppa_info;
2242
  asection *sdlt, *sdltrel;
2243
 
2244
  hppa_info = hppa_link_hash_table (info);
2245
  if (hppa_info == NULL)
2246
    return FALSE;
2247
 
2248
  sdlt = hppa_info->dlt_sec;
2249
  sdltrel = hppa_info->dlt_rel_sec;
2250
 
2251
  /* H/DYN_H may refer to a local variable and we know it's
2252
     address, so there is no need to create a relocation.  Just install
2253
     the proper value into the DLT, note this shortcut can not be
2254
     skipped when building a shared library.  */
2255
  if (! info->shared && hh && hh->want_dlt)
2256
    {
2257
      bfd_vma value;
2258
 
2259
      /* If we had an LTOFF_FPTR style relocation we want the DLT entry
2260
         to point to the FPTR entry in the .opd section.
2261
 
2262
         We include the OPD's output offset in this computation as
2263
         we are referring to an absolute address in the resulting
2264
         object file.  */
2265
      if (hh->want_opd)
2266
        {
2267
          value = (hh->opd_offset
2268
                   + hppa_info->opd_sec->output_offset
2269
                   + hppa_info->opd_sec->output_section->vma);
2270
        }
2271
      else if ((eh->root.type == bfd_link_hash_defined
2272
                || eh->root.type == bfd_link_hash_defweak)
2273
               && eh->root.u.def.section)
2274
        {
2275
          value = eh->root.u.def.value + eh->root.u.def.section->output_offset;
2276
          if (eh->root.u.def.section->output_section)
2277
            value += eh->root.u.def.section->output_section->vma;
2278
          else
2279
            value += eh->root.u.def.section->vma;
2280
        }
2281
      else
2282
        /* We have an undefined function reference.  */
2283
        value = 0;
2284
 
2285
      /* We do not need to include the output offset of the DLT section
2286
         here because we are modifying the in-memory contents.  */
2287
      bfd_put_64 (sdlt->owner, value, sdlt->contents + hh->dlt_offset);
2288
    }
2289
 
2290
  /* Create a relocation for the DLT entry associated with this symbol.
2291
     When building a shared library the symbol does not have to be dynamic.  */
2292
  if (hh->want_dlt
2293
      && (elf64_hppa_dynamic_symbol_p (eh, info) || info->shared))
2294
    {
2295
      Elf_Internal_Rela rel;
2296
      bfd_byte *loc;
2297
      int dynindx;
2298
 
2299
      /* We may need to do a relocation against a local symbol, in
2300
         which case we have to look up it's dynamic symbol index off
2301
         the local symbol hash table.  */
2302
      if (eh && eh->dynindx != -1)
2303
        dynindx = eh->dynindx;
2304
      else
2305
        dynindx
2306
          = _bfd_elf_link_lookup_local_dynindx (info, hh->owner,
2307
                                                hh->sym_indx);
2308
 
2309
      /* Create a dynamic relocation for this entry.  Do include the output
2310
         offset of the DLT entry since we need an absolute address in the
2311
         resulting object file.  */
2312
      rel.r_offset = (hh->dlt_offset + sdlt->output_offset
2313
                      + sdlt->output_section->vma);
2314
      if (eh && eh->type == STT_FUNC)
2315
          rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_FPTR64);
2316
      else
2317
          rel.r_info = ELF64_R_INFO (dynindx, R_PARISC_DIR64);
2318
      rel.r_addend = 0;
2319
 
2320
      loc = sdltrel->contents;
2321
      loc += sdltrel->reloc_count++ * sizeof (Elf64_External_Rela);
2322
      bfd_elf64_swap_reloca_out (sdlt->output_section->owner, &rel, loc);
2323
    }
2324
  return TRUE;
2325
}
2326
 
2327
/* Finalize the dynamic relocations.  Specifically the FPTR relocations
2328
   for dynamic functions used to initialize static data.  */
2329
 
2330
static bfd_boolean
2331
elf64_hppa_finalize_dynreloc (struct elf_link_hash_entry *eh,
2332
                              void *data)
2333
{
2334
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
2335
  struct bfd_link_info *info = (struct bfd_link_info *)data;
2336
  struct elf64_hppa_link_hash_table *hppa_info;
2337
  int dynamic_symbol;
2338
 
2339
  dynamic_symbol = elf64_hppa_dynamic_symbol_p (eh, info);
2340
 
2341
  if (!dynamic_symbol && !info->shared)
2342
    return TRUE;
2343
 
2344
  if (hh->reloc_entries)
2345
    {
2346
      struct elf64_hppa_dyn_reloc_entry *rent;
2347
      int dynindx;
2348
 
2349
      hppa_info = hppa_link_hash_table (info);
2350
      if (hppa_info == NULL)
2351
        return FALSE;
2352
 
2353
      /* We may need to do a relocation against a local symbol, in
2354
         which case we have to look up it's dynamic symbol index off
2355
         the local symbol hash table.  */
2356
      if (eh->dynindx != -1)
2357
        dynindx = eh->dynindx;
2358
      else
2359
        dynindx
2360
          = _bfd_elf_link_lookup_local_dynindx (info, hh->owner,
2361
                                                hh->sym_indx);
2362
 
2363
      for (rent = hh->reloc_entries; rent; rent = rent->next)
2364
        {
2365
          Elf_Internal_Rela rel;
2366
          bfd_byte *loc;
2367
 
2368
          /* Allocate one iff we are building a shared library, the relocation
2369
             isn't a R_PARISC_FPTR64, or we don't want an opd entry.  */
2370
          if (!info->shared && rent->type == R_PARISC_FPTR64 && hh->want_opd)
2371
            continue;
2372
 
2373
          /* Create a dynamic relocation for this entry.
2374
 
2375
             We need the output offset for the reloc's section because
2376
             we are creating an absolute address in the resulting object
2377
             file.  */
2378
          rel.r_offset = (rent->offset + rent->sec->output_offset
2379
                          + rent->sec->output_section->vma);
2380
 
2381
          /* An FPTR64 relocation implies that we took the address of
2382
             a function and that the function has an entry in the .opd
2383
             section.  We want the FPTR64 relocation to reference the
2384
             entry in .opd.
2385
 
2386
             We could munge the symbol value in the dynamic symbol table
2387
             (in fact we already do for functions with global scope) to point
2388
             to the .opd entry.  Then we could use that dynamic symbol in
2389
             this relocation.
2390
 
2391
             Or we could do something sensible, not munge the symbol's
2392
             address and instead just use a different symbol to reference
2393
             the .opd entry.  At least that seems sensible until you
2394
             realize there's no local dynamic symbols we can use for that
2395
             purpose.  Thus the hair in the check_relocs routine.
2396
 
2397
             We use a section symbol recorded by check_relocs as the
2398
             base symbol for the relocation.  The addend is the difference
2399
             between the section symbol and the address of the .opd entry.  */
2400
          if (info->shared && rent->type == R_PARISC_FPTR64 && hh->want_opd)
2401
            {
2402
              bfd_vma value, value2;
2403
 
2404
              /* First compute the address of the opd entry for this symbol.  */
2405
              value = (hh->opd_offset
2406
                       + hppa_info->opd_sec->output_section->vma
2407
                       + hppa_info->opd_sec->output_offset);
2408
 
2409
              /* Compute the value of the start of the section with
2410
                 the relocation.  */
2411
              value2 = (rent->sec->output_section->vma
2412
                        + rent->sec->output_offset);
2413
 
2414
              /* Compute the difference between the start of the section
2415
                 with the relocation and the opd entry.  */
2416
              value -= value2;
2417
 
2418
              /* The result becomes the addend of the relocation.  */
2419
              rel.r_addend = value;
2420
 
2421
              /* The section symbol becomes the symbol for the dynamic
2422
                 relocation.  */
2423
              dynindx
2424
                = _bfd_elf_link_lookup_local_dynindx (info,
2425
                                                      rent->sec->owner,
2426
                                                      rent->sec_symndx);
2427
            }
2428
          else
2429
            rel.r_addend = rent->addend;
2430
 
2431
          rel.r_info = ELF64_R_INFO (dynindx, rent->type);
2432
 
2433
          loc = hppa_info->other_rel_sec->contents;
2434
          loc += (hppa_info->other_rel_sec->reloc_count++
2435
                  * sizeof (Elf64_External_Rela));
2436
          bfd_elf64_swap_reloca_out (hppa_info->other_rel_sec->output_section->owner,
2437
                                     &rel, loc);
2438
        }
2439
    }
2440
 
2441
  return TRUE;
2442
}
2443
 
2444
/* Used to decide how to sort relocs in an optimal manner for the
2445
   dynamic linker, before writing them out.  */
2446
 
2447
static enum elf_reloc_type_class
2448
elf64_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
2449
{
2450
  if (ELF64_R_SYM (rela->r_info) == STN_UNDEF)
2451
    return reloc_class_relative;
2452
 
2453
  switch ((int) ELF64_R_TYPE (rela->r_info))
2454
    {
2455
    case R_PARISC_IPLT:
2456
      return reloc_class_plt;
2457
    case R_PARISC_COPY:
2458
      return reloc_class_copy;
2459
    default:
2460
      return reloc_class_normal;
2461
    }
2462
}
2463
 
2464
/* Finish up the dynamic sections.  */
2465
 
2466
static bfd_boolean
2467
elf64_hppa_finish_dynamic_sections (bfd *output_bfd,
2468
                                    struct bfd_link_info *info)
2469
{
2470
  bfd *dynobj;
2471
  asection *sdyn;
2472
  struct elf64_hppa_link_hash_table *hppa_info;
2473
 
2474
  hppa_info = hppa_link_hash_table (info);
2475
  if (hppa_info == NULL)
2476
    return FALSE;
2477
 
2478
  /* Finalize the contents of the .opd section.  */
2479
  elf_link_hash_traverse (elf_hash_table (info),
2480
                          elf64_hppa_finalize_opd,
2481
                          info);
2482
 
2483
  elf_link_hash_traverse (elf_hash_table (info),
2484
                          elf64_hppa_finalize_dynreloc,
2485
                          info);
2486
 
2487
  /* Finalize the contents of the .dlt section.  */
2488
  dynobj = elf_hash_table (info)->dynobj;
2489
  /* Finalize the contents of the .dlt section.  */
2490
  elf_link_hash_traverse (elf_hash_table (info),
2491
                          elf64_hppa_finalize_dlt,
2492
                          info);
2493
 
2494
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
2495
 
2496
  if (elf_hash_table (info)->dynamic_sections_created)
2497
    {
2498
      Elf64_External_Dyn *dyncon, *dynconend;
2499
 
2500
      BFD_ASSERT (sdyn != NULL);
2501
 
2502
      dyncon = (Elf64_External_Dyn *) sdyn->contents;
2503
      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
2504
      for (; dyncon < dynconend; dyncon++)
2505
        {
2506
          Elf_Internal_Dyn dyn;
2507
          asection *s;
2508
 
2509
          bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
2510
 
2511
          switch (dyn.d_tag)
2512
            {
2513
            default:
2514
              break;
2515
 
2516
            case DT_HP_LOAD_MAP:
2517
              /* Compute the absolute address of 16byte scratchpad area
2518
                 for the dynamic linker.
2519
 
2520
                 By convention the linker script will allocate the scratchpad
2521
                 area at the start of the .data section.  So all we have to
2522
                 to is find the start of the .data section.  */
2523
              s = bfd_get_section_by_name (output_bfd, ".data");
2524
              dyn.d_un.d_ptr = s->vma;
2525
              bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2526
              break;
2527
 
2528
            case DT_PLTGOT:
2529
              /* HP's use PLTGOT to set the GOT register.  */
2530
              dyn.d_un.d_ptr = _bfd_get_gp_value (output_bfd);
2531
              bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2532
              break;
2533
 
2534
            case DT_JMPREL:
2535
              s = hppa_info->plt_rel_sec;
2536
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2537
              bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2538
              break;
2539
 
2540
            case DT_PLTRELSZ:
2541
              s = hppa_info->plt_rel_sec;
2542
              dyn.d_un.d_val = s->size;
2543
              bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2544
              break;
2545
 
2546
            case DT_RELA:
2547
              s = hppa_info->other_rel_sec;
2548
              if (! s || ! s->size)
2549
                s = hppa_info->dlt_rel_sec;
2550
              if (! s || ! s->size)
2551
                s = hppa_info->opd_rel_sec;
2552
              dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
2553
              bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2554
              break;
2555
 
2556
            case DT_RELASZ:
2557
              s = hppa_info->other_rel_sec;
2558
              dyn.d_un.d_val = s->size;
2559
              s = hppa_info->dlt_rel_sec;
2560
              dyn.d_un.d_val += s->size;
2561
              s = hppa_info->opd_rel_sec;
2562
              dyn.d_un.d_val += s->size;
2563
              /* There is some question about whether or not the size of
2564
                 the PLT relocs should be included here.  HP's tools do
2565
                 it, so we'll emulate them.  */
2566
              s = hppa_info->plt_rel_sec;
2567
              dyn.d_un.d_val += s->size;
2568
              bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
2569
              break;
2570
 
2571
            }
2572
        }
2573
    }
2574
 
2575
  return TRUE;
2576
}
2577
 
2578
/* Support for core dump NOTE sections.  */
2579
 
2580
static bfd_boolean
2581
elf64_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2582
{
2583
  int offset;
2584
  size_t size;
2585
 
2586
  switch (note->descsz)
2587
    {
2588
      default:
2589
        return FALSE;
2590
 
2591
      case 760:         /* Linux/hppa */
2592
        /* pr_cursig */
2593
        elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2594
 
2595
        /* pr_pid */
2596
        elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32);
2597
 
2598
        /* pr_reg */
2599
        offset = 112;
2600
        size = 640;
2601
 
2602
        break;
2603
    }
2604
 
2605
  /* Make a ".reg/999" section.  */
2606
  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2607
                                          size, note->descpos + offset);
2608
}
2609
 
2610
static bfd_boolean
2611
elf64_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2612
{
2613
  char * command;
2614
  int n;
2615
 
2616
  switch (note->descsz)
2617
    {
2618
    default:
2619
      return FALSE;
2620
 
2621
    case 136:           /* Linux/hppa elf_prpsinfo.  */
2622
      elf_tdata (abfd)->core_program
2623
        = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2624
      elf_tdata (abfd)->core_command
2625
        = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2626
    }
2627
 
2628
  /* Note that for some reason, a spurious space is tacked
2629
     onto the end of the args in some (at least one anyway)
2630
     implementations, so strip it off if it exists.  */
2631
  command = elf_tdata (abfd)->core_command;
2632
  n = strlen (command);
2633
 
2634
  if (0 < n && command[n - 1] == ' ')
2635
    command[n - 1] = '\0';
2636
 
2637
  return TRUE;
2638
}
2639
 
2640
/* Return the number of additional phdrs we will need.
2641
 
2642
   The generic ELF code only creates PT_PHDRs for executables.  The HP
2643
   dynamic linker requires PT_PHDRs for dynamic libraries too.
2644
 
2645
   This routine indicates that the backend needs one additional program
2646
   header for that case.
2647
 
2648
   Note we do not have access to the link info structure here, so we have
2649
   to guess whether or not we are building a shared library based on the
2650
   existence of a .interp section.  */
2651
 
2652
static int
2653
elf64_hppa_additional_program_headers (bfd *abfd,
2654
                                struct bfd_link_info *info ATTRIBUTE_UNUSED)
2655
{
2656
  asection *s;
2657
 
2658
  /* If we are creating a shared library, then we have to create a
2659
     PT_PHDR segment.  HP's dynamic linker chokes without it.  */
2660
  s = bfd_get_section_by_name (abfd, ".interp");
2661
  if (! s)
2662
    return 1;
2663
  return 0;
2664
}
2665
 
2666
/* Allocate and initialize any program headers required by this
2667
   specific backend.
2668
 
2669
   The generic ELF code only creates PT_PHDRs for executables.  The HP
2670
   dynamic linker requires PT_PHDRs for dynamic libraries too.
2671
 
2672
   This allocates the PT_PHDR and initializes it in a manner suitable
2673
   for the HP linker.
2674
 
2675
   Note we do not have access to the link info structure here, so we have
2676
   to guess whether or not we are building a shared library based on the
2677
   existence of a .interp section.  */
2678
 
2679
static bfd_boolean
2680
elf64_hppa_modify_segment_map (bfd *abfd,
2681
                               struct bfd_link_info *info ATTRIBUTE_UNUSED)
2682
{
2683
  struct elf_segment_map *m;
2684
  asection *s;
2685
 
2686
  s = bfd_get_section_by_name (abfd, ".interp");
2687
  if (! s)
2688
    {
2689
      for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2690
        if (m->p_type == PT_PHDR)
2691
          break;
2692
      if (m == NULL)
2693
        {
2694
          m = ((struct elf_segment_map *)
2695
               bfd_zalloc (abfd, (bfd_size_type) sizeof *m));
2696
          if (m == NULL)
2697
            return FALSE;
2698
 
2699
          m->p_type = PT_PHDR;
2700
          m->p_flags = PF_R | PF_X;
2701
          m->p_flags_valid = 1;
2702
          m->p_paddr_valid = 1;
2703
          m->includes_phdrs = 1;
2704
 
2705
          m->next = elf_tdata (abfd)->segment_map;
2706
          elf_tdata (abfd)->segment_map = m;
2707
        }
2708
    }
2709
 
2710
  for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2711
    if (m->p_type == PT_LOAD)
2712
      {
2713
        unsigned int i;
2714
 
2715
        for (i = 0; i < m->count; i++)
2716
          {
2717
            /* The code "hint" is not really a hint.  It is a requirement
2718
               for certain versions of the HP dynamic linker.  Worse yet,
2719
               it must be set even if the shared library does not have
2720
               any code in its "text" segment (thus the check for .hash
2721
               to catch this situation).  */
2722
            if (m->sections[i]->flags & SEC_CODE
2723
                || (strcmp (m->sections[i]->name, ".hash") == 0))
2724
              m->p_flags |= (PF_X | PF_HP_CODE);
2725
          }
2726
      }
2727
 
2728
  return TRUE;
2729
}
2730
 
2731
/* Called when writing out an object file to decide the type of a
2732
   symbol.  */
2733
static int
2734
elf64_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym,
2735
                                int type)
2736
{
2737
  if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
2738
    return STT_PARISC_MILLI;
2739
  else
2740
    return type;
2741
}
2742
 
2743
/* Support HP specific sections for core files.  */
2744
 
2745
static bfd_boolean
2746
elf64_hppa_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int sec_index,
2747
                              const char *typename)
2748
{
2749
  if (hdr->p_type == PT_HP_CORE_KERNEL)
2750
    {
2751
      asection *sect;
2752
 
2753
      if (!_bfd_elf_make_section_from_phdr (abfd, hdr, sec_index, typename))
2754
        return FALSE;
2755
 
2756
      sect = bfd_make_section_anyway (abfd, ".kernel");
2757
      if (sect == NULL)
2758
        return FALSE;
2759
      sect->size = hdr->p_filesz;
2760
      sect->filepos = hdr->p_offset;
2761
      sect->flags = SEC_HAS_CONTENTS | SEC_READONLY;
2762
      return TRUE;
2763
    }
2764
 
2765
  if (hdr->p_type == PT_HP_CORE_PROC)
2766
    {
2767
      int sig;
2768
 
2769
      if (bfd_seek (abfd, hdr->p_offset, SEEK_SET) != 0)
2770
        return FALSE;
2771
      if (bfd_bread (&sig, 4, abfd) != 4)
2772
        return FALSE;
2773
 
2774
      elf_tdata (abfd)->core_signal = sig;
2775
 
2776
      if (!_bfd_elf_make_section_from_phdr (abfd, hdr, sec_index, typename))
2777
        return FALSE;
2778
 
2779
      /* GDB uses the ".reg" section to read register contents.  */
2780
      return _bfd_elfcore_make_pseudosection (abfd, ".reg", hdr->p_filesz,
2781
                                              hdr->p_offset);
2782
    }
2783
 
2784
  if (hdr->p_type == PT_HP_CORE_LOADABLE
2785
      || hdr->p_type == PT_HP_CORE_STACK
2786
      || hdr->p_type == PT_HP_CORE_MMF)
2787
    hdr->p_type = PT_LOAD;
2788
 
2789
  return _bfd_elf_make_section_from_phdr (abfd, hdr, sec_index, typename);
2790
}
2791
 
2792
/* Hook called by the linker routine which adds symbols from an object
2793
   file.  HP's libraries define symbols with HP specific section
2794
   indices, which we have to handle.  */
2795
 
2796
static bfd_boolean
2797
elf_hppa_add_symbol_hook (bfd *abfd,
2798
                          struct bfd_link_info *info ATTRIBUTE_UNUSED,
2799
                          Elf_Internal_Sym *sym,
2800
                          const char **namep ATTRIBUTE_UNUSED,
2801
                          flagword *flagsp ATTRIBUTE_UNUSED,
2802
                          asection **secp,
2803
                          bfd_vma *valp)
2804
{
2805
  unsigned int sec_index = sym->st_shndx;
2806
 
2807
  switch (sec_index)
2808
    {
2809
    case SHN_PARISC_ANSI_COMMON:
2810
      *secp = bfd_make_section_old_way (abfd, ".PARISC.ansi.common");
2811
      (*secp)->flags |= SEC_IS_COMMON;
2812
      *valp = sym->st_size;
2813
      break;
2814
 
2815
    case SHN_PARISC_HUGE_COMMON:
2816
      *secp = bfd_make_section_old_way (abfd, ".PARISC.huge.common");
2817
      (*secp)->flags |= SEC_IS_COMMON;
2818
      *valp = sym->st_size;
2819
      break;
2820
    }
2821
 
2822
  return TRUE;
2823
}
2824
 
2825
static bfd_boolean
2826
elf_hppa_unmark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
2827
                                         void *data)
2828
{
2829
  struct bfd_link_info *info = data;
2830
 
2831
  /* If we are not creating a shared library, and this symbol is
2832
     referenced by a shared library but is not defined anywhere, then
2833
     the generic code will warn that it is undefined.
2834
 
2835
     This behavior is undesirable on HPs since the standard shared
2836
     libraries contain references to undefined symbols.
2837
 
2838
     So we twiddle the flags associated with such symbols so that they
2839
     will not trigger the warning.  ?!? FIXME.  This is horribly fragile.
2840
 
2841
     Ultimately we should have better controls over the generic ELF BFD
2842
     linker code.  */
2843
  if (! info->relocatable
2844
      && info->unresolved_syms_in_shared_libs != RM_IGNORE
2845
      && h->root.type == bfd_link_hash_undefined
2846
      && h->ref_dynamic
2847
      && !h->ref_regular)
2848
    {
2849
      h->ref_dynamic = 0;
2850
      h->pointer_equality_needed = 1;
2851
    }
2852
 
2853
  return TRUE;
2854
}
2855
 
2856
static bfd_boolean
2857
elf_hppa_remark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
2858
                                         void *data)
2859
{
2860
  struct bfd_link_info *info = data;
2861
 
2862
  /* If we are not creating a shared library, and this symbol is
2863
     referenced by a shared library but is not defined anywhere, then
2864
     the generic code will warn that it is undefined.
2865
 
2866
     This behavior is undesirable on HPs since the standard shared
2867
     libraries contain references to undefined symbols.
2868
 
2869
     So we twiddle the flags associated with such symbols so that they
2870
     will not trigger the warning.  ?!? FIXME.  This is horribly fragile.
2871
 
2872
     Ultimately we should have better controls over the generic ELF BFD
2873
     linker code.  */
2874
  if (! info->relocatable
2875
      && info->unresolved_syms_in_shared_libs != RM_IGNORE
2876
      && h->root.type == bfd_link_hash_undefined
2877
      && !h->ref_dynamic
2878
      && !h->ref_regular
2879
      && h->pointer_equality_needed)
2880
    {
2881
      h->ref_dynamic = 1;
2882
      h->pointer_equality_needed = 0;
2883
    }
2884
 
2885
  return TRUE;
2886
}
2887
 
2888
static bfd_boolean
2889
elf_hppa_is_dynamic_loader_symbol (const char *name)
2890
{
2891
  return (! strcmp (name, "__CPU_REVISION")
2892
          || ! strcmp (name, "__CPU_KEYBITS_1")
2893
          || ! strcmp (name, "__SYSTEM_ID_D")
2894
          || ! strcmp (name, "__FPU_MODEL")
2895
          || ! strcmp (name, "__FPU_REVISION")
2896
          || ! strcmp (name, "__ARGC")
2897
          || ! strcmp (name, "__ARGV")
2898
          || ! strcmp (name, "__ENVP")
2899
          || ! strcmp (name, "__TLS_SIZE_D")
2900
          || ! strcmp (name, "__LOAD_INFO")
2901
          || ! strcmp (name, "__systab"));
2902
}
2903
 
2904
/* Record the lowest address for the data and text segments.  */
2905
static void
2906
elf_hppa_record_segment_addrs (bfd *abfd,
2907
                               asection *section,
2908
                               void *data)
2909
{
2910
  struct elf64_hppa_link_hash_table *hppa_info = data;
2911
 
2912
  if ((section->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD))
2913
    {
2914
      bfd_vma value;
2915
      Elf_Internal_Phdr *p;
2916
 
2917
      p = _bfd_elf_find_segment_containing_section (abfd, section->output_section);
2918
      BFD_ASSERT (p != NULL);
2919
      value = p->p_vaddr;
2920
 
2921
      if (section->flags & SEC_READONLY)
2922
        {
2923
          if (value < hppa_info->text_segment_base)
2924
            hppa_info->text_segment_base = value;
2925
        }
2926
      else
2927
        {
2928
          if (value < hppa_info->data_segment_base)
2929
            hppa_info->data_segment_base = value;
2930
        }
2931
    }
2932
}
2933
 
2934
/* Called after we have seen all the input files/sections, but before
2935
   final symbol resolution and section placement has been determined.
2936
 
2937
   We use this hook to (possibly) provide a value for __gp, then we
2938
   fall back to the generic ELF final link routine.  */
2939
 
2940
static bfd_boolean
2941
elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
2942
{
2943
  bfd_boolean retval;
2944
  struct elf64_hppa_link_hash_table *hppa_info = hppa_link_hash_table (info);
2945
 
2946
  if (hppa_info == NULL)
2947
    return FALSE;
2948
 
2949
  if (! info->relocatable)
2950
    {
2951
      struct elf_link_hash_entry *gp;
2952
      bfd_vma gp_val;
2953
 
2954
      /* The linker script defines a value for __gp iff it was referenced
2955
         by one of the objects being linked.  First try to find the symbol
2956
         in the hash table.  If that fails, just compute the value __gp
2957
         should have had.  */
2958
      gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", FALSE,
2959
                                 FALSE, FALSE);
2960
 
2961
      if (gp)
2962
        {
2963
 
2964
          /* Adjust the value of __gp as we may want to slide it into the
2965
             .plt section so that the stubs can access PLT entries without
2966
             using an addil sequence.  */
2967
          gp->root.u.def.value += hppa_info->gp_offset;
2968
 
2969
          gp_val = (gp->root.u.def.section->output_section->vma
2970
                    + gp->root.u.def.section->output_offset
2971
                    + gp->root.u.def.value);
2972
        }
2973
      else
2974
        {
2975
          asection *sec;
2976
 
2977
          /* First look for a .plt section.  If found, then __gp is the
2978
             address of the .plt + gp_offset.
2979
 
2980
             If no .plt is found, then look for .dlt, .opd and .data (in
2981
             that order) and set __gp to the base address of whichever
2982
             section is found first.  */
2983
 
2984
          sec = hppa_info->plt_sec;
2985
          if (sec && ! (sec->flags & SEC_EXCLUDE))
2986
            gp_val = (sec->output_offset
2987
                      + sec->output_section->vma
2988
                      + hppa_info->gp_offset);
2989
          else
2990
            {
2991
              sec = hppa_info->dlt_sec;
2992
              if (!sec || (sec->flags & SEC_EXCLUDE))
2993
                sec = hppa_info->opd_sec;
2994
              if (!sec || (sec->flags & SEC_EXCLUDE))
2995
                sec = bfd_get_section_by_name (abfd, ".data");
2996
              if (!sec || (sec->flags & SEC_EXCLUDE))
2997
                gp_val = 0;
2998
              else
2999
                gp_val = sec->output_offset + sec->output_section->vma;
3000
            }
3001
        }
3002
 
3003
      /* Install whatever value we found/computed for __gp.  */
3004
      _bfd_set_gp_value (abfd, gp_val);
3005
    }
3006
 
3007
  /* We need to know the base of the text and data segments so that we
3008
     can perform SEGREL relocations.  We will record the base addresses
3009
     when we encounter the first SEGREL relocation.  */
3010
  hppa_info->text_segment_base = (bfd_vma)-1;
3011
  hppa_info->data_segment_base = (bfd_vma)-1;
3012
 
3013
  /* HP's shared libraries have references to symbols that are not
3014
     defined anywhere.  The generic ELF BFD linker code will complain
3015
     about such symbols.
3016
 
3017
     So we detect the losing case and arrange for the flags on the symbol
3018
     to indicate that it was never referenced.  This keeps the generic
3019
     ELF BFD link code happy and appears to not create any secondary
3020
     problems.  Ultimately we need a way to control the behavior of the
3021
     generic ELF BFD link code better.  */
3022
  elf_link_hash_traverse (elf_hash_table (info),
3023
                          elf_hppa_unmark_useless_dynamic_symbols,
3024
                          info);
3025
 
3026
  /* Invoke the regular ELF backend linker to do all the work.  */
3027
  retval = bfd_elf_final_link (abfd, info);
3028
 
3029
  elf_link_hash_traverse (elf_hash_table (info),
3030
                          elf_hppa_remark_useless_dynamic_symbols,
3031
                          info);
3032
 
3033
  /* If we're producing a final executable, sort the contents of the
3034
     unwind section. */
3035
  if (retval && !info->relocatable)
3036
    retval = elf_hppa_sort_unwind (abfd);
3037
 
3038
  return retval;
3039
}
3040
 
3041
/* Relocate the given INSN.  VALUE should be the actual value we want
3042
   to insert into the instruction, ie by this point we should not be
3043
   concerned with computing an offset relative to the DLT, PC, etc.
3044
   Instead this routine is meant to handle the bit manipulations needed
3045
   to insert the relocation into the given instruction.  */
3046
 
3047
static int
3048
elf_hppa_relocate_insn (int insn, int sym_value, unsigned int r_type)
3049
{
3050
  switch (r_type)
3051
    {
3052
    /* This is any 22 bit branch.  In PA2.0 syntax it corresponds to
3053
       the "B" instruction.  */
3054
    case R_PARISC_PCREL22F:
3055
    case R_PARISC_PCREL22C:
3056
      return (insn & ~0x3ff1ffd) | re_assemble_22 (sym_value);
3057
 
3058
      /* This is any 12 bit branch.  */
3059
    case R_PARISC_PCREL12F:
3060
      return (insn & ~0x1ffd) | re_assemble_12 (sym_value);
3061
 
3062
    /* This is any 17 bit branch.  In PA2.0 syntax it also corresponds
3063
       to the "B" instruction as well as BE.  */
3064
    case R_PARISC_PCREL17F:
3065
    case R_PARISC_DIR17F:
3066
    case R_PARISC_DIR17R:
3067
    case R_PARISC_PCREL17C:
3068
    case R_PARISC_PCREL17R:
3069
      return (insn & ~0x1f1ffd) | re_assemble_17 (sym_value);
3070
 
3071
    /* ADDIL or LDIL instructions.  */
3072
    case R_PARISC_DLTREL21L:
3073
    case R_PARISC_DLTIND21L:
3074
    case R_PARISC_LTOFF_FPTR21L:
3075
    case R_PARISC_PCREL21L:
3076
    case R_PARISC_LTOFF_TP21L:
3077
    case R_PARISC_DPREL21L:
3078
    case R_PARISC_PLTOFF21L:
3079
    case R_PARISC_DIR21L:
3080
      return (insn & ~0x1fffff) | re_assemble_21 (sym_value);
3081
 
3082
    /* LDO and integer loads/stores with 14 bit displacements.  */
3083
    case R_PARISC_DLTREL14R:
3084
    case R_PARISC_DLTREL14F:
3085
    case R_PARISC_DLTIND14R:
3086
    case R_PARISC_DLTIND14F:
3087
    case R_PARISC_LTOFF_FPTR14R:
3088
    case R_PARISC_PCREL14R:
3089
    case R_PARISC_PCREL14F:
3090
    case R_PARISC_LTOFF_TP14R:
3091
    case R_PARISC_LTOFF_TP14F:
3092
    case R_PARISC_DPREL14R:
3093
    case R_PARISC_DPREL14F:
3094
    case R_PARISC_PLTOFF14R:
3095
    case R_PARISC_PLTOFF14F:
3096
    case R_PARISC_DIR14R:
3097
    case R_PARISC_DIR14F:
3098
      return (insn & ~0x3fff) | low_sign_unext (sym_value, 14);
3099
 
3100
    /* PA2.0W LDO and integer loads/stores with 16 bit displacements.  */
3101
    case R_PARISC_LTOFF_FPTR16F:
3102
    case R_PARISC_PCREL16F:
3103
    case R_PARISC_LTOFF_TP16F:
3104
    case R_PARISC_GPREL16F:
3105
    case R_PARISC_PLTOFF16F:
3106
    case R_PARISC_DIR16F:
3107
    case R_PARISC_LTOFF16F:
3108
      return (insn & ~0xffff) | re_assemble_16 (sym_value);
3109
 
3110
    /* Doubleword loads and stores with a 14 bit displacement.  */
3111
    case R_PARISC_DLTREL14DR:
3112
    case R_PARISC_DLTIND14DR:
3113
    case R_PARISC_LTOFF_FPTR14DR:
3114
    case R_PARISC_LTOFF_FPTR16DF:
3115
    case R_PARISC_PCREL14DR:
3116
    case R_PARISC_PCREL16DF:
3117
    case R_PARISC_LTOFF_TP14DR:
3118
    case R_PARISC_LTOFF_TP16DF:
3119
    case R_PARISC_DPREL14DR:
3120
    case R_PARISC_GPREL16DF:
3121
    case R_PARISC_PLTOFF14DR:
3122
    case R_PARISC_PLTOFF16DF:
3123
    case R_PARISC_DIR14DR:
3124
    case R_PARISC_DIR16DF:
3125
    case R_PARISC_LTOFF16DF:
3126
      return (insn & ~0x3ff1) | (((sym_value & 0x2000) >> 13)
3127
                                 | ((sym_value & 0x1ff8) << 1));
3128
 
3129
    /* Floating point single word load/store instructions.  */
3130
    case R_PARISC_DLTREL14WR:
3131
    case R_PARISC_DLTIND14WR:
3132
    case R_PARISC_LTOFF_FPTR14WR:
3133
    case R_PARISC_LTOFF_FPTR16WF:
3134
    case R_PARISC_PCREL14WR:
3135
    case R_PARISC_PCREL16WF:
3136
    case R_PARISC_LTOFF_TP14WR:
3137
    case R_PARISC_LTOFF_TP16WF:
3138
    case R_PARISC_DPREL14WR:
3139
    case R_PARISC_GPREL16WF:
3140
    case R_PARISC_PLTOFF14WR:
3141
    case R_PARISC_PLTOFF16WF:
3142
    case R_PARISC_DIR16WF:
3143
    case R_PARISC_DIR14WR:
3144
    case R_PARISC_LTOFF16WF:
3145
      return (insn & ~0x3ff9) | (((sym_value & 0x2000) >> 13)
3146
                                 | ((sym_value & 0x1ffc) << 1));
3147
 
3148
    default:
3149
      return insn;
3150
    }
3151
}
3152
 
3153
/* Compute the value for a relocation (REL) during a final link stage,
3154
   then insert the value into the proper location in CONTENTS.
3155
 
3156
   VALUE is a tentative value for the relocation and may be overridden
3157
   and modified here based on the specific relocation to be performed.
3158
 
3159
   For example we do conversions for PC-relative branches in this routine
3160
   or redirection of calls to external routines to stubs.
3161
 
3162
   The work of actually applying the relocation is left to a helper
3163
   routine in an attempt to reduce the complexity and size of this
3164
   function.  */
3165
 
3166
static bfd_reloc_status_type
3167
elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
3168
                              bfd *input_bfd,
3169
                              bfd *output_bfd,
3170
                              asection *input_section,
3171
                              bfd_byte *contents,
3172
                              bfd_vma value,
3173
                              struct bfd_link_info *info,
3174
                              asection *sym_sec,
3175
                              struct elf_link_hash_entry *eh)
3176
{
3177
  struct elf64_hppa_link_hash_table *hppa_info = hppa_link_hash_table (info);
3178
  struct elf64_hppa_link_hash_entry *hh = hppa_elf_hash_entry (eh);
3179
  bfd_vma *local_offsets;
3180
  Elf_Internal_Shdr *symtab_hdr;
3181
  int insn;
3182
  bfd_vma max_branch_offset = 0;
3183
  bfd_vma offset = rel->r_offset;
3184
  bfd_signed_vma addend = rel->r_addend;
3185
  reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
3186
  unsigned int r_symndx = ELF_R_SYM (rel->r_info);
3187
  unsigned int r_type = howto->type;
3188
  bfd_byte *hit_data = contents + offset;
3189
 
3190
  if (hppa_info == NULL)
3191
    return bfd_reloc_notsupported;
3192
 
3193
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3194
  local_offsets = elf_local_got_offsets (input_bfd);
3195
  insn = bfd_get_32 (input_bfd, hit_data);
3196
 
3197
  switch (r_type)
3198
    {
3199
    case R_PARISC_NONE:
3200
      break;
3201
 
3202
    /* Basic function call support.
3203
 
3204
       Note for a call to a function defined in another dynamic library
3205
       we want to redirect the call to a stub.  */
3206
 
3207
    /* PC relative relocs without an implicit offset.  */
3208
    case R_PARISC_PCREL21L:
3209
    case R_PARISC_PCREL14R:
3210
    case R_PARISC_PCREL14F:
3211
    case R_PARISC_PCREL14WR:
3212
    case R_PARISC_PCREL14DR:
3213
    case R_PARISC_PCREL16F:
3214
    case R_PARISC_PCREL16WF:
3215
    case R_PARISC_PCREL16DF:
3216
      {
3217
        /* If this is a call to a function defined in another dynamic
3218
           library, then redirect the call to the local stub for this
3219
           function.  */
3220
        if (sym_sec == NULL || sym_sec->output_section == NULL)
3221
          value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3222
                   + hppa_info->stub_sec->output_section->vma);
3223
 
3224
        /* Turn VALUE into a proper PC relative address.  */
3225
        value -= (offset + input_section->output_offset
3226
                  + input_section->output_section->vma);
3227
 
3228
        /* Adjust for any field selectors.  */
3229
        if (r_type == R_PARISC_PCREL21L)
3230
          value = hppa_field_adjust (value, -8 + addend, e_lsel);
3231
        else if (r_type == R_PARISC_PCREL14F
3232
                 || r_type == R_PARISC_PCREL16F
3233
                 || r_type == R_PARISC_PCREL16WF
3234
                 || r_type == R_PARISC_PCREL16DF)
3235
          value = hppa_field_adjust (value, -8 + addend, e_fsel);
3236
        else
3237
          value = hppa_field_adjust (value, -8 + addend, e_rsel);
3238
 
3239
        /* Apply the relocation to the given instruction.  */
3240
        insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3241
        break;
3242
      }
3243
 
3244
    case R_PARISC_PCREL12F:
3245
    case R_PARISC_PCREL22F:
3246
    case R_PARISC_PCREL17F:
3247
    case R_PARISC_PCREL22C:
3248
    case R_PARISC_PCREL17C:
3249
    case R_PARISC_PCREL17R:
3250
      {
3251
        /* If this is a call to a function defined in another dynamic
3252
           library, then redirect the call to the local stub for this
3253
           function.  */
3254
        if (sym_sec == NULL || sym_sec->output_section == NULL)
3255
          value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3256
                   + hppa_info->stub_sec->output_section->vma);
3257
 
3258
        /* Turn VALUE into a proper PC relative address.  */
3259
        value -= (offset + input_section->output_offset
3260
                  + input_section->output_section->vma);
3261
        addend -= 8;
3262
 
3263
        if (r_type == (unsigned int) R_PARISC_PCREL22F)
3264
          max_branch_offset = (1 << (22-1)) << 2;
3265
        else if (r_type == (unsigned int) R_PARISC_PCREL17F)
3266
          max_branch_offset = (1 << (17-1)) << 2;
3267
        else if (r_type == (unsigned int) R_PARISC_PCREL12F)
3268
          max_branch_offset = (1 << (12-1)) << 2;
3269
 
3270
        /* Make sure we can reach the branch target.  */
3271
        if (max_branch_offset != 0
3272
            && value + addend + max_branch_offset >= 2*max_branch_offset)
3273
          {
3274
            (*_bfd_error_handler)
3275 161 khays
              (_("%B(%A+0x" BFD_VMA_FMT "x): cannot reach %s"),
3276 14 khays
              input_bfd,
3277
              input_section,
3278
              offset,
3279 161 khays
              eh ? eh->root.root.string : "unknown");
3280 14 khays
            bfd_set_error (bfd_error_bad_value);
3281 161 khays
            return bfd_reloc_overflow;
3282 14 khays
          }
3283
 
3284
        /* Adjust for any field selectors.  */
3285
        if (r_type == R_PARISC_PCREL17R)
3286
          value = hppa_field_adjust (value, addend, e_rsel);
3287
        else
3288
          value = hppa_field_adjust (value, addend, e_fsel);
3289
 
3290
        /* All branches are implicitly shifted by 2 places.  */
3291
        value >>= 2;
3292
 
3293
        /* Apply the relocation to the given instruction.  */
3294
        insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3295
        break;
3296
      }
3297
 
3298
    /* Indirect references to data through the DLT.  */
3299
    case R_PARISC_DLTIND14R:
3300
    case R_PARISC_DLTIND14F:
3301
    case R_PARISC_DLTIND14DR:
3302
    case R_PARISC_DLTIND14WR:
3303
    case R_PARISC_DLTIND21L:
3304
    case R_PARISC_LTOFF_FPTR14R:
3305
    case R_PARISC_LTOFF_FPTR14DR:
3306
    case R_PARISC_LTOFF_FPTR14WR:
3307
    case R_PARISC_LTOFF_FPTR21L:
3308
    case R_PARISC_LTOFF_FPTR16F:
3309
    case R_PARISC_LTOFF_FPTR16WF:
3310
    case R_PARISC_LTOFF_FPTR16DF:
3311
    case R_PARISC_LTOFF_TP21L:
3312
    case R_PARISC_LTOFF_TP14R:
3313
    case R_PARISC_LTOFF_TP14F:
3314
    case R_PARISC_LTOFF_TP14WR:
3315
    case R_PARISC_LTOFF_TP14DR:
3316
    case R_PARISC_LTOFF_TP16F:
3317
    case R_PARISC_LTOFF_TP16WF:
3318
    case R_PARISC_LTOFF_TP16DF:
3319
    case R_PARISC_LTOFF16F:
3320
    case R_PARISC_LTOFF16WF:
3321
    case R_PARISC_LTOFF16DF:
3322
      {
3323
        bfd_vma off;
3324
 
3325
        /* If this relocation was against a local symbol, then we still
3326
           have not set up the DLT entry (it's not convenient to do so
3327
           in the "finalize_dlt" routine because it is difficult to get
3328
           to the local symbol's value).
3329
 
3330
           So, if this is a local symbol (h == NULL), then we need to
3331
           fill in its DLT entry.
3332
 
3333
           Similarly we may still need to set up an entry in .opd for
3334
           a local function which had its address taken.  */
3335
        if (hh == NULL)
3336
          {
3337
            bfd_vma *local_opd_offsets, *local_dlt_offsets;
3338
 
3339
            if (local_offsets == NULL)
3340
              abort ();
3341
 
3342
            /* Now do .opd creation if needed.  */
3343
            if (r_type == R_PARISC_LTOFF_FPTR14R
3344
                || r_type == R_PARISC_LTOFF_FPTR14DR
3345
                || r_type == R_PARISC_LTOFF_FPTR14WR
3346
                || r_type == R_PARISC_LTOFF_FPTR21L
3347
                || r_type == R_PARISC_LTOFF_FPTR16F
3348
                || r_type == R_PARISC_LTOFF_FPTR16WF
3349
                || r_type == R_PARISC_LTOFF_FPTR16DF)
3350
              {
3351
                local_opd_offsets = local_offsets + 2 * symtab_hdr->sh_info;
3352
                off = local_opd_offsets[r_symndx];
3353
 
3354
                /* The last bit records whether we've already initialised
3355
                   this local .opd entry.  */
3356
                if ((off & 1) != 0)
3357
                  {
3358
                    BFD_ASSERT (off != (bfd_vma) -1);
3359
                    off &= ~1;
3360
                  }
3361
                else
3362
                  {
3363
                    local_opd_offsets[r_symndx] |= 1;
3364
 
3365
                    /* The first two words of an .opd entry are zero.  */
3366
                    memset (hppa_info->opd_sec->contents + off, 0, 16);
3367
 
3368
                    /* The next word is the address of the function.  */
3369
                    bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3370
                                (hppa_info->opd_sec->contents + off + 16));
3371
 
3372
                    /* The last word is our local __gp value.  */
3373
                    value = _bfd_get_gp_value
3374
                              (hppa_info->opd_sec->output_section->owner);
3375
                    bfd_put_64 (hppa_info->opd_sec->owner, value,
3376
                                (hppa_info->opd_sec->contents + off + 24));
3377
                  }
3378
 
3379
                /* The DLT value is the address of the .opd entry.  */
3380
                value = (off
3381
                         + hppa_info->opd_sec->output_offset
3382
                         + hppa_info->opd_sec->output_section->vma);
3383
                addend = 0;
3384
              }
3385
 
3386
            local_dlt_offsets = local_offsets;
3387
            off = local_dlt_offsets[r_symndx];
3388
 
3389
            if ((off & 1) != 0)
3390
              {
3391
                BFD_ASSERT (off != (bfd_vma) -1);
3392
                off &= ~1;
3393
              }
3394
            else
3395
              {
3396
                local_dlt_offsets[r_symndx] |= 1;
3397
                bfd_put_64 (hppa_info->dlt_sec->owner,
3398
                            value + addend,
3399
                            hppa_info->dlt_sec->contents + off);
3400
              }
3401
          }
3402
        else
3403
          off = hh->dlt_offset;
3404
 
3405
        /* We want the value of the DLT offset for this symbol, not
3406
           the symbol's actual address.  Note that __gp may not point
3407
           to the start of the DLT, so we have to compute the absolute
3408
           address, then subtract out the value of __gp.  */
3409
        value = (off
3410
                 + hppa_info->dlt_sec->output_offset
3411
                 + hppa_info->dlt_sec->output_section->vma);
3412
        value -= _bfd_get_gp_value (output_bfd);
3413
 
3414
        /* All DLTIND relocations are basically the same at this point,
3415
           except that we need different field selectors for the 21bit
3416
           version vs the 14bit versions.  */
3417
        if (r_type == R_PARISC_DLTIND21L
3418
            || r_type == R_PARISC_LTOFF_FPTR21L
3419
            || r_type == R_PARISC_LTOFF_TP21L)
3420
          value = hppa_field_adjust (value, 0, e_lsel);
3421
        else if (r_type == R_PARISC_DLTIND14F
3422
                 || r_type == R_PARISC_LTOFF_FPTR16F
3423
                 || r_type == R_PARISC_LTOFF_FPTR16WF
3424
                 || r_type == R_PARISC_LTOFF_FPTR16DF
3425
                 || r_type == R_PARISC_LTOFF16F
3426
                 || r_type == R_PARISC_LTOFF16DF
3427
                 || r_type == R_PARISC_LTOFF16WF
3428
                 || r_type == R_PARISC_LTOFF_TP16F
3429
                 || r_type == R_PARISC_LTOFF_TP16WF
3430
                 || r_type == R_PARISC_LTOFF_TP16DF)
3431
          value = hppa_field_adjust (value, 0, e_fsel);
3432
        else
3433
          value = hppa_field_adjust (value, 0, e_rsel);
3434
 
3435
        insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3436
        break;
3437
      }
3438
 
3439
    case R_PARISC_DLTREL14R:
3440
    case R_PARISC_DLTREL14F:
3441
    case R_PARISC_DLTREL14DR:
3442
    case R_PARISC_DLTREL14WR:
3443
    case R_PARISC_DLTREL21L:
3444
    case R_PARISC_DPREL21L:
3445
    case R_PARISC_DPREL14WR:
3446
    case R_PARISC_DPREL14DR:
3447
    case R_PARISC_DPREL14R:
3448
    case R_PARISC_DPREL14F:
3449
    case R_PARISC_GPREL16F:
3450
    case R_PARISC_GPREL16WF:
3451
    case R_PARISC_GPREL16DF:
3452
      {
3453
        /* Subtract out the global pointer value to make value a DLT
3454
           relative address.  */
3455
        value -= _bfd_get_gp_value (output_bfd);
3456
 
3457
        /* All DLTREL relocations are basically the same at this point,
3458
           except that we need different field selectors for the 21bit
3459
           version vs the 14bit versions.  */
3460
        if (r_type == R_PARISC_DLTREL21L
3461
            || r_type == R_PARISC_DPREL21L)
3462
          value = hppa_field_adjust (value, addend, e_lrsel);
3463
        else if (r_type == R_PARISC_DLTREL14F
3464
                 || r_type == R_PARISC_DPREL14F
3465
                 || r_type == R_PARISC_GPREL16F
3466
                 || r_type == R_PARISC_GPREL16WF
3467
                 || r_type == R_PARISC_GPREL16DF)
3468
          value = hppa_field_adjust (value, addend, e_fsel);
3469
        else
3470
          value = hppa_field_adjust (value, addend, e_rrsel);
3471
 
3472
        insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3473
        break;
3474
      }
3475
 
3476
    case R_PARISC_DIR21L:
3477
    case R_PARISC_DIR17R:
3478
    case R_PARISC_DIR17F:
3479
    case R_PARISC_DIR14R:
3480
    case R_PARISC_DIR14F:
3481
    case R_PARISC_DIR14WR:
3482
    case R_PARISC_DIR14DR:
3483
    case R_PARISC_DIR16F:
3484
    case R_PARISC_DIR16WF:
3485
    case R_PARISC_DIR16DF:
3486
      {
3487
        /* All DIR relocations are basically the same at this point,
3488
           except that branch offsets need to be divided by four, and
3489
           we need different field selectors.  Note that we don't
3490
           redirect absolute calls to local stubs.  */
3491
 
3492
        if (r_type == R_PARISC_DIR21L)
3493
          value = hppa_field_adjust (value, addend, e_lrsel);
3494
        else if (r_type == R_PARISC_DIR17F
3495
                 || r_type == R_PARISC_DIR16F
3496
                 || r_type == R_PARISC_DIR16WF
3497
                 || r_type == R_PARISC_DIR16DF
3498
                 || r_type == R_PARISC_DIR14F)
3499
          value = hppa_field_adjust (value, addend, e_fsel);
3500
        else
3501
          value = hppa_field_adjust (value, addend, e_rrsel);
3502
 
3503
        if (r_type == R_PARISC_DIR17R || r_type == R_PARISC_DIR17F)
3504
          /* All branches are implicitly shifted by 2 places.  */
3505
          value >>= 2;
3506
 
3507
        insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3508
        break;
3509
      }
3510
 
3511
    case R_PARISC_PLTOFF21L:
3512
    case R_PARISC_PLTOFF14R:
3513
    case R_PARISC_PLTOFF14F:
3514
    case R_PARISC_PLTOFF14WR:
3515
    case R_PARISC_PLTOFF14DR:
3516
    case R_PARISC_PLTOFF16F:
3517
    case R_PARISC_PLTOFF16WF:
3518
    case R_PARISC_PLTOFF16DF:
3519
      {
3520
        /* We want the value of the PLT offset for this symbol, not
3521
           the symbol's actual address.  Note that __gp may not point
3522
           to the start of the DLT, so we have to compute the absolute
3523
           address, then subtract out the value of __gp.  */
3524
        value = (hh->plt_offset
3525
                 + hppa_info->plt_sec->output_offset
3526
                 + hppa_info->plt_sec->output_section->vma);
3527
        value -= _bfd_get_gp_value (output_bfd);
3528
 
3529
        /* All PLTOFF relocations are basically the same at this point,
3530
           except that we need different field selectors for the 21bit
3531
           version vs the 14bit versions.  */
3532
        if (r_type == R_PARISC_PLTOFF21L)
3533
          value = hppa_field_adjust (value, addend, e_lrsel);
3534
        else if (r_type == R_PARISC_PLTOFF14F
3535
                 || r_type == R_PARISC_PLTOFF16F
3536
                 || r_type == R_PARISC_PLTOFF16WF
3537
                 || r_type == R_PARISC_PLTOFF16DF)
3538
          value = hppa_field_adjust (value, addend, e_fsel);
3539
        else
3540
          value = hppa_field_adjust (value, addend, e_rrsel);
3541
 
3542
        insn = elf_hppa_relocate_insn (insn, (int) value, r_type);
3543
        break;
3544
      }
3545
 
3546
    case R_PARISC_LTOFF_FPTR32:
3547
      {
3548
        /* We may still need to create the FPTR itself if it was for
3549
           a local symbol.  */
3550
        if (hh == NULL)
3551
          {
3552
            /* The first two words of an .opd entry are zero.  */
3553
            memset (hppa_info->opd_sec->contents + hh->opd_offset, 0, 16);
3554
 
3555
            /* The next word is the address of the function.  */
3556
            bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3557
                        (hppa_info->opd_sec->contents
3558
                         + hh->opd_offset + 16));
3559
 
3560
            /* The last word is our local __gp value.  */
3561
            value = _bfd_get_gp_value
3562
                      (hppa_info->opd_sec->output_section->owner);
3563
            bfd_put_64 (hppa_info->opd_sec->owner, value,
3564
                        hppa_info->opd_sec->contents + hh->opd_offset + 24);
3565
 
3566
            /* The DLT value is the address of the .opd entry.  */
3567
            value = (hh->opd_offset
3568
                     + hppa_info->opd_sec->output_offset
3569
                     + hppa_info->opd_sec->output_section->vma);
3570
 
3571
            bfd_put_64 (hppa_info->dlt_sec->owner,
3572
                        value,
3573
                        hppa_info->dlt_sec->contents + hh->dlt_offset);
3574
          }
3575
 
3576
        /* We want the value of the DLT offset for this symbol, not
3577
           the symbol's actual address.  Note that __gp may not point
3578
           to the start of the DLT, so we have to compute the absolute
3579
           address, then subtract out the value of __gp.  */
3580
        value = (hh->dlt_offset
3581
                 + hppa_info->dlt_sec->output_offset
3582
                 + hppa_info->dlt_sec->output_section->vma);
3583
        value -= _bfd_get_gp_value (output_bfd);
3584
        bfd_put_32 (input_bfd, value, hit_data);
3585
        return bfd_reloc_ok;
3586
      }
3587
 
3588
    case R_PARISC_LTOFF_FPTR64:
3589
    case R_PARISC_LTOFF_TP64:
3590
      {
3591
        /* We may still need to create the FPTR itself if it was for
3592
           a local symbol.  */
3593
        if (eh == NULL && r_type == R_PARISC_LTOFF_FPTR64)
3594
          {
3595
            /* The first two words of an .opd entry are zero.  */
3596
            memset (hppa_info->opd_sec->contents + hh->opd_offset, 0, 16);
3597
 
3598
            /* The next word is the address of the function.  */
3599
            bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3600
                        (hppa_info->opd_sec->contents
3601
                         + hh->opd_offset + 16));
3602
 
3603
            /* The last word is our local __gp value.  */
3604
            value = _bfd_get_gp_value
3605
                      (hppa_info->opd_sec->output_section->owner);
3606
            bfd_put_64 (hppa_info->opd_sec->owner, value,
3607
                        hppa_info->opd_sec->contents + hh->opd_offset + 24);
3608
 
3609
            /* The DLT value is the address of the .opd entry.  */
3610
            value = (hh->opd_offset
3611
                     + hppa_info->opd_sec->output_offset
3612
                     + hppa_info->opd_sec->output_section->vma);
3613
 
3614
            bfd_put_64 (hppa_info->dlt_sec->owner,
3615
                        value,
3616
                        hppa_info->dlt_sec->contents + hh->dlt_offset);
3617
          }
3618
 
3619
        /* We want the value of the DLT offset for this symbol, not
3620
           the symbol's actual address.  Note that __gp may not point
3621
           to the start of the DLT, so we have to compute the absolute
3622
           address, then subtract out the value of __gp.  */
3623
        value = (hh->dlt_offset
3624
                 + hppa_info->dlt_sec->output_offset
3625
                 + hppa_info->dlt_sec->output_section->vma);
3626
        value -= _bfd_get_gp_value (output_bfd);
3627
        bfd_put_64 (input_bfd, value, hit_data);
3628
        return bfd_reloc_ok;
3629
      }
3630
 
3631
    case R_PARISC_DIR32:
3632
      bfd_put_32 (input_bfd, value + addend, hit_data);
3633
      return bfd_reloc_ok;
3634
 
3635
    case R_PARISC_DIR64:
3636
      bfd_put_64 (input_bfd, value + addend, hit_data);
3637
      return bfd_reloc_ok;
3638
 
3639
    case R_PARISC_GPREL64:
3640
      /* Subtract out the global pointer value to make value a DLT
3641
         relative address.  */
3642
      value -= _bfd_get_gp_value (output_bfd);
3643
 
3644
      bfd_put_64 (input_bfd, value + addend, hit_data);
3645
      return bfd_reloc_ok;
3646
 
3647
    case R_PARISC_LTOFF64:
3648
        /* We want the value of the DLT offset for this symbol, not
3649
           the symbol's actual address.  Note that __gp may not point
3650
           to the start of the DLT, so we have to compute the absolute
3651
           address, then subtract out the value of __gp.  */
3652
      value = (hh->dlt_offset
3653
               + hppa_info->dlt_sec->output_offset
3654
               + hppa_info->dlt_sec->output_section->vma);
3655
      value -= _bfd_get_gp_value (output_bfd);
3656
 
3657
      bfd_put_64 (input_bfd, value + addend, hit_data);
3658
      return bfd_reloc_ok;
3659
 
3660
    case R_PARISC_PCREL32:
3661
      {
3662
        /* If this is a call to a function defined in another dynamic
3663
           library, then redirect the call to the local stub for this
3664
           function.  */
3665
        if (sym_sec == NULL || sym_sec->output_section == NULL)
3666
          value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3667
                   + hppa_info->stub_sec->output_section->vma);
3668
 
3669
        /* Turn VALUE into a proper PC relative address.  */
3670
        value -= (offset + input_section->output_offset
3671
                  + input_section->output_section->vma);
3672
 
3673
        value += addend;
3674
        value -= 8;
3675
        bfd_put_32 (input_bfd, value, hit_data);
3676
        return bfd_reloc_ok;
3677
      }
3678
 
3679
    case R_PARISC_PCREL64:
3680
      {
3681
        /* If this is a call to a function defined in another dynamic
3682
           library, then redirect the call to the local stub for this
3683
           function.  */
3684
        if (sym_sec == NULL || sym_sec->output_section == NULL)
3685
          value = (hh->stub_offset + hppa_info->stub_sec->output_offset
3686
                   + hppa_info->stub_sec->output_section->vma);
3687
 
3688
        /* Turn VALUE into a proper PC relative address.  */
3689
        value -= (offset + input_section->output_offset
3690
                  + input_section->output_section->vma);
3691
 
3692
        value += addend;
3693
        value -= 8;
3694
        bfd_put_64 (input_bfd, value, hit_data);
3695
        return bfd_reloc_ok;
3696
      }
3697
 
3698
    case R_PARISC_FPTR64:
3699
      {
3700
        bfd_vma off;
3701
 
3702
        /* We may still need to create the FPTR itself if it was for
3703
           a local symbol.  */
3704
        if (hh == NULL)
3705
          {
3706
            bfd_vma *local_opd_offsets;
3707
 
3708
            if (local_offsets == NULL)
3709
              abort ();
3710
 
3711
            local_opd_offsets = local_offsets + 2 * symtab_hdr->sh_info;
3712
            off = local_opd_offsets[r_symndx];
3713
 
3714
            /* The last bit records whether we've already initialised
3715
               this local .opd entry.  */
3716
            if ((off & 1) != 0)
3717
              {
3718
                BFD_ASSERT (off != (bfd_vma) -1);
3719
                off &= ~1;
3720
              }
3721
            else
3722
              {
3723
                /* The first two words of an .opd entry are zero.  */
3724
                memset (hppa_info->opd_sec->contents + off, 0, 16);
3725
 
3726
                /* The next word is the address of the function.  */
3727
                bfd_put_64 (hppa_info->opd_sec->owner, value + addend,
3728
                            (hppa_info->opd_sec->contents + off + 16));
3729
 
3730
                /* The last word is our local __gp value.  */
3731
                value = _bfd_get_gp_value
3732
                          (hppa_info->opd_sec->output_section->owner);
3733
                bfd_put_64 (hppa_info->opd_sec->owner, value,
3734
                            hppa_info->opd_sec->contents + off + 24);
3735
              }
3736
          }
3737
        else
3738
          off = hh->opd_offset;
3739
 
3740
        if (hh == NULL || hh->want_opd)
3741
          /* We want the value of the OPD offset for this symbol.  */
3742
          value = (off
3743
                   + hppa_info->opd_sec->output_offset
3744
                   + hppa_info->opd_sec->output_section->vma);
3745
        else
3746
          /* We want the address of the symbol.  */
3747
          value += addend;
3748
 
3749
        bfd_put_64 (input_bfd, value, hit_data);
3750
        return bfd_reloc_ok;
3751
      }
3752
 
3753
    case R_PARISC_SECREL32:
3754
      if (sym_sec)
3755
        value -= sym_sec->output_section->vma;
3756
      bfd_put_32 (input_bfd, value + addend, hit_data);
3757
      return bfd_reloc_ok;
3758
 
3759
    case R_PARISC_SEGREL32:
3760
    case R_PARISC_SEGREL64:
3761
      {
3762
        /* If this is the first SEGREL relocation, then initialize
3763
           the segment base values.  */
3764
        if (hppa_info->text_segment_base == (bfd_vma) -1)
3765
          bfd_map_over_sections (output_bfd, elf_hppa_record_segment_addrs,
3766
                                 hppa_info);
3767
 
3768
        /* VALUE holds the absolute address.  We want to include the
3769
           addend, then turn it into a segment relative address.
3770
 
3771
           The segment is derived from SYM_SEC.  We assume that there are
3772
           only two segments of note in the resulting executable/shlib.
3773
           A readonly segment (.text) and a readwrite segment (.data).  */
3774
        value += addend;
3775
 
3776
        if (sym_sec->flags & SEC_CODE)
3777
          value -= hppa_info->text_segment_base;
3778
        else
3779
          value -= hppa_info->data_segment_base;
3780
 
3781
        if (r_type == R_PARISC_SEGREL32)
3782
          bfd_put_32 (input_bfd, value, hit_data);
3783
        else
3784
          bfd_put_64 (input_bfd, value, hit_data);
3785
        return bfd_reloc_ok;
3786
      }
3787
 
3788
    /* Something we don't know how to handle.  */
3789
    default:
3790
      return bfd_reloc_notsupported;
3791
    }
3792
 
3793
  /* Update the instruction word.  */
3794
  bfd_put_32 (input_bfd, (bfd_vma) insn, hit_data);
3795
  return bfd_reloc_ok;
3796
}
3797
 
3798
/* Relocate an HPPA ELF section.  */
3799
 
3800
static bfd_boolean
3801
elf64_hppa_relocate_section (bfd *output_bfd,
3802
                           struct bfd_link_info *info,
3803
                           bfd *input_bfd,
3804
                           asection *input_section,
3805
                           bfd_byte *contents,
3806
                           Elf_Internal_Rela *relocs,
3807
                           Elf_Internal_Sym *local_syms,
3808
                           asection **local_sections)
3809
{
3810
  Elf_Internal_Shdr *symtab_hdr;
3811
  Elf_Internal_Rela *rel;
3812
  Elf_Internal_Rela *relend;
3813
  struct elf64_hppa_link_hash_table *hppa_info;
3814
 
3815
  hppa_info = hppa_link_hash_table (info);
3816
  if (hppa_info == NULL)
3817
    return FALSE;
3818
 
3819
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3820
 
3821
  rel = relocs;
3822
  relend = relocs + input_section->reloc_count;
3823
  for (; rel < relend; rel++)
3824
    {
3825
      int r_type;
3826
      reloc_howto_type *howto = elf_hppa_howto_table + ELF_R_TYPE (rel->r_info);
3827
      unsigned long r_symndx;
3828
      struct elf_link_hash_entry *eh;
3829
      Elf_Internal_Sym *sym;
3830
      asection *sym_sec;
3831
      bfd_vma relocation;
3832
      bfd_reloc_status_type r;
3833
 
3834
      r_type = ELF_R_TYPE (rel->r_info);
3835
      if (r_type < 0 || r_type >= (int) R_PARISC_UNIMPLEMENTED)
3836
        {
3837
          bfd_set_error (bfd_error_bad_value);
3838
          return FALSE;
3839
        }
3840
      if (r_type == (unsigned int) R_PARISC_GNU_VTENTRY
3841
          || r_type == (unsigned int) R_PARISC_GNU_VTINHERIT)
3842
        continue;
3843
 
3844
      /* This is a final link.  */
3845
      r_symndx = ELF_R_SYM (rel->r_info);
3846
      eh = NULL;
3847
      sym = NULL;
3848
      sym_sec = NULL;
3849
      if (r_symndx < symtab_hdr->sh_info)
3850
        {
3851
          /* This is a local symbol, hh defaults to NULL.  */
3852
          sym = local_syms + r_symndx;
3853
          sym_sec = local_sections[r_symndx];
3854
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel);
3855
        }
3856
      else
3857
        {
3858
          /* This is not a local symbol.  */
3859
          struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
3860
 
3861
          /* It seems this can happen with erroneous or unsupported
3862
             input (mixing a.out and elf in an archive, for example.)  */
3863
          if (sym_hashes == NULL)
3864
            return FALSE;
3865
 
3866
          eh = sym_hashes[r_symndx - symtab_hdr->sh_info];
3867
 
3868
          while (eh->root.type == bfd_link_hash_indirect
3869
                 || eh->root.type == bfd_link_hash_warning)
3870
            eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
3871
 
3872
          relocation = 0;
3873
          if (eh->root.type == bfd_link_hash_defined
3874
              || eh->root.type == bfd_link_hash_defweak)
3875
            {
3876
              sym_sec = eh->root.u.def.section;
3877
              if (sym_sec != NULL
3878
                  && sym_sec->output_section != NULL)
3879
                relocation = (eh->root.u.def.value
3880
                              + sym_sec->output_section->vma
3881
                              + sym_sec->output_offset);
3882
            }
3883
          else if (eh->root.type == bfd_link_hash_undefweak)
3884
            ;
3885
          else if (info->unresolved_syms_in_objects == RM_IGNORE
3886
                   && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT)
3887
            ;
3888
          else if (!info->relocatable
3889
                   && elf_hppa_is_dynamic_loader_symbol (eh->root.root.string))
3890
            continue;
3891
          else if (!info->relocatable)
3892
            {
3893
              bfd_boolean err;
3894
              err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
3895
                     || ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT);
3896
              if (!info->callbacks->undefined_symbol (info,
3897
                                                      eh->root.root.string,
3898
                                                      input_bfd,
3899
                                                      input_section,
3900
                                                      rel->r_offset, err))
3901
                return FALSE;
3902
            }
3903
 
3904
          if (!info->relocatable
3905
              && relocation == 0
3906
              && eh->root.type != bfd_link_hash_defined
3907
              && eh->root.type != bfd_link_hash_defweak
3908
              && eh->root.type != bfd_link_hash_undefweak)
3909
            {
3910
              if (info->unresolved_syms_in_objects == RM_IGNORE
3911
                  && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT
3912
                  && eh->type == STT_PARISC_MILLI)
3913
                {
3914
                  if (! info->callbacks->undefined_symbol
3915
                      (info, eh_name (eh), input_bfd,
3916
                       input_section, rel->r_offset, FALSE))
3917
                    return FALSE;
3918
                }
3919
            }
3920
        }
3921
 
3922
      if (sym_sec != NULL && elf_discarded_section (sym_sec))
3923
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
3924
                                         rel, relend, howto, contents);
3925
 
3926
      if (info->relocatable)
3927
        continue;
3928
 
3929
      r = elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
3930
                                        input_section, contents,
3931
                                        relocation, info, sym_sec,
3932
                                        eh);
3933
 
3934
      if (r != bfd_reloc_ok)
3935
        {
3936
          switch (r)
3937
            {
3938
            default:
3939
              abort ();
3940
            case bfd_reloc_overflow:
3941
              {
3942
                const char *sym_name;
3943
 
3944
                if (eh != NULL)
3945
                  sym_name = NULL;
3946
                else
3947
                  {
3948
                    sym_name = bfd_elf_string_from_elf_section (input_bfd,
3949
                                                                symtab_hdr->sh_link,
3950
                                                                sym->st_name);
3951
                    if (sym_name == NULL)
3952
                      return FALSE;
3953
                    if (*sym_name == '\0')
3954
                      sym_name = bfd_section_name (input_bfd, sym_sec);
3955
                  }
3956
 
3957
                if (!((*info->callbacks->reloc_overflow)
3958
                      (info, (eh ? &eh->root : NULL), sym_name,
3959
                       howto->name, (bfd_vma) 0, input_bfd,
3960
                       input_section, rel->r_offset)))
3961
                  return FALSE;
3962
              }
3963
              break;
3964
            }
3965
        }
3966
    }
3967
  return TRUE;
3968
}
3969
 
3970
static const struct bfd_elf_special_section elf64_hppa_special_sections[] =
3971
{
3972
  { STRING_COMMA_LEN (".fini"),  0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3973
  { STRING_COMMA_LEN (".init"),  0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3974
  { STRING_COMMA_LEN (".plt"),   0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3975
  { STRING_COMMA_LEN (".dlt"),   0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3976
  { STRING_COMMA_LEN (".sdata"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3977
  { STRING_COMMA_LEN (".sbss"),  0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_PARISC_SHORT },
3978
  { STRING_COMMA_LEN (".tbss"),  0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE + SHF_HP_TLS },
3979
  { NULL,                    0,  0, 0,            0 }
3980
};
3981
 
3982
/* The hash bucket size is the standard one, namely 4.  */
3983
 
3984
const struct elf_size_info hppa64_elf_size_info =
3985
{
3986
  sizeof (Elf64_External_Ehdr),
3987
  sizeof (Elf64_External_Phdr),
3988
  sizeof (Elf64_External_Shdr),
3989
  sizeof (Elf64_External_Rel),
3990
  sizeof (Elf64_External_Rela),
3991
  sizeof (Elf64_External_Sym),
3992
  sizeof (Elf64_External_Dyn),
3993
  sizeof (Elf_External_Note),
3994
  4,
3995
  1,
3996
  64, 3,
3997
  ELFCLASS64, EV_CURRENT,
3998
  bfd_elf64_write_out_phdrs,
3999
  bfd_elf64_write_shdrs_and_ehdr,
4000
  bfd_elf64_checksum_contents,
4001
  bfd_elf64_write_relocs,
4002
  bfd_elf64_swap_symbol_in,
4003
  bfd_elf64_swap_symbol_out,
4004
  bfd_elf64_slurp_reloc_table,
4005
  bfd_elf64_slurp_symbol_table,
4006
  bfd_elf64_swap_dyn_in,
4007
  bfd_elf64_swap_dyn_out,
4008
  bfd_elf64_swap_reloc_in,
4009
  bfd_elf64_swap_reloc_out,
4010
  bfd_elf64_swap_reloca_in,
4011
  bfd_elf64_swap_reloca_out
4012
};
4013
 
4014
#define TARGET_BIG_SYM                  bfd_elf64_hppa_vec
4015
#define TARGET_BIG_NAME                 "elf64-hppa"
4016
#define ELF_ARCH                        bfd_arch_hppa
4017
#define ELF_TARGET_ID                   HPPA64_ELF_DATA
4018
#define ELF_MACHINE_CODE                EM_PARISC
4019
/* This is not strictly correct.  The maximum page size for PA2.0 is
4020
   64M.  But everything still uses 4k.  */
4021
#define ELF_MAXPAGESIZE                 0x1000
4022
#define ELF_OSABI                       ELFOSABI_HPUX
4023
 
4024
#define bfd_elf64_bfd_reloc_type_lookup elf_hppa_reloc_type_lookup
4025
#define bfd_elf64_bfd_reloc_name_lookup elf_hppa_reloc_name_lookup
4026
#define bfd_elf64_bfd_is_local_label_name       elf_hppa_is_local_label_name
4027
#define elf_info_to_howto               elf_hppa_info_to_howto
4028
#define elf_info_to_howto_rel           elf_hppa_info_to_howto_rel
4029
 
4030
#define elf_backend_section_from_shdr   elf64_hppa_section_from_shdr
4031
#define elf_backend_object_p            elf64_hppa_object_p
4032
#define elf_backend_final_write_processing \
4033
                                        elf_hppa_final_write_processing
4034
#define elf_backend_fake_sections       elf_hppa_fake_sections
4035
#define elf_backend_add_symbol_hook     elf_hppa_add_symbol_hook
4036
 
4037
#define elf_backend_relocate_section    elf_hppa_relocate_section
4038
 
4039
#define bfd_elf64_bfd_final_link        elf_hppa_final_link
4040
 
4041
#define elf_backend_create_dynamic_sections \
4042
                                        elf64_hppa_create_dynamic_sections
4043
#define elf_backend_post_process_headers        elf64_hppa_post_process_headers
4044
 
4045
#define elf_backend_omit_section_dynsym \
4046
  ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
4047
#define elf_backend_adjust_dynamic_symbol \
4048
                                        elf64_hppa_adjust_dynamic_symbol
4049
 
4050
#define elf_backend_size_dynamic_sections \
4051
                                        elf64_hppa_size_dynamic_sections
4052
 
4053
#define elf_backend_finish_dynamic_symbol \
4054
                                        elf64_hppa_finish_dynamic_symbol
4055
#define elf_backend_finish_dynamic_sections \
4056
                                        elf64_hppa_finish_dynamic_sections
4057
#define elf_backend_grok_prstatus       elf64_hppa_grok_prstatus
4058
#define elf_backend_grok_psinfo         elf64_hppa_grok_psinfo
4059
 
4060
/* Stuff for the BFD linker: */
4061
#define bfd_elf64_bfd_link_hash_table_create \
4062
        elf64_hppa_hash_table_create
4063
 
4064
#define elf_backend_check_relocs \
4065
        elf64_hppa_check_relocs
4066
 
4067
#define elf_backend_size_info \
4068
  hppa64_elf_size_info
4069
 
4070
#define elf_backend_additional_program_headers \
4071
        elf64_hppa_additional_program_headers
4072
 
4073
#define elf_backend_modify_segment_map \
4074
        elf64_hppa_modify_segment_map
4075
 
4076
#define elf_backend_link_output_symbol_hook \
4077
        elf64_hppa_link_output_symbol_hook
4078
 
4079
#define elf_backend_want_got_plt        0
4080
#define elf_backend_plt_readonly        0
4081
#define elf_backend_want_plt_sym        0
4082
#define elf_backend_got_header_size     0
4083
#define elf_backend_type_change_ok      TRUE
4084
#define elf_backend_get_symbol_type     elf64_hppa_elf_get_symbol_type
4085
#define elf_backend_reloc_type_class    elf64_hppa_reloc_type_class
4086
#define elf_backend_rela_normal         1
4087
#define elf_backend_special_sections    elf64_hppa_special_sections
4088
#define elf_backend_action_discarded    elf_hppa_action_discarded
4089
#define elf_backend_section_from_phdr   elf64_hppa_section_from_phdr
4090
 
4091
#define elf64_bed                       elf64_hppa_hpux_bed
4092
 
4093
#include "elf64-target.h"
4094
 
4095
#undef TARGET_BIG_SYM
4096
#define TARGET_BIG_SYM                  bfd_elf64_hppa_linux_vec
4097
#undef TARGET_BIG_NAME
4098
#define TARGET_BIG_NAME                 "elf64-hppa-linux"
4099
#undef ELF_OSABI
4100 161 khays
#define ELF_OSABI                       ELFOSABI_GNU
4101 14 khays
#undef elf_backend_post_process_headers
4102
#define elf_backend_post_process_headers _bfd_elf_set_osabi
4103
#undef elf64_bed
4104
#define elf64_bed                       elf64_hppa_linux_bed
4105
 
4106
#include "elf64-target.h"

powered by: WebSVN 2.1.0

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