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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gdb-7.2/] [bfd/] [elf32-hppa.c] - Blame information for rev 841

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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