~ubuntu-branches/ubuntu/quantal/gclcvs/quantal

« back to all changes in this revision

Viewing changes to binutils/bfd/elf32-hppa.c

  • Committer: Bazaar Package Importer
  • Author(s): Camm Maguire
  • Date: 2004-06-24 15:13:46 UTC
  • Revision ID: james.westby@ubuntu.com-20040624151346-xh0xaaktyyp7aorc
Tags: 2.7.0-26
C_GC_OFFSET is 2 on m68k-linux

Show diffs side-by-side

added added

removed removed

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