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

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gdb-7.2/] [gdb-7.2-or32-1.0rc1/] [bfd/] [elf32-vax.c] - Blame information for rev 441

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

Line No. Rev Author Line
1 330 jeremybenn
/* VAX series support for 32-bit ELF
2
   Copyright 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3
   2004, 2005, 2006, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
4
   Contributed by Matt Thomas <matt@3am-software.com>.
5
 
6
   This file is part of BFD, the Binary File Descriptor library.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21
   MA 02110-1301, USA.  */
22
 
23
#include "sysdep.h"
24
#include "bfd.h"
25
#include "bfdlink.h"
26
#include "libbfd.h"
27
#include "elf-bfd.h"
28
#include "elf/vax.h"
29
 
30
static reloc_howto_type *reloc_type_lookup (bfd *, bfd_reloc_code_real_type);
31
static void rtype_to_howto (bfd *, arelent *, Elf_Internal_Rela *);
32
static struct bfd_hash_entry *elf_vax_link_hash_newfunc (struct bfd_hash_entry *,
33
                                                         struct bfd_hash_table *,
34
                                                         const char *);
35
static struct bfd_link_hash_table *elf_vax_link_hash_table_create (bfd *);
36
static bfd_boolean elf_vax_check_relocs (bfd *, struct bfd_link_info *,
37
                                         asection *, const Elf_Internal_Rela *);
38
static bfd_boolean elf_vax_adjust_dynamic_symbol (struct bfd_link_info *,
39
                                                  struct elf_link_hash_entry *);
40
static bfd_boolean elf_vax_size_dynamic_sections (bfd *, struct bfd_link_info *);
41
static bfd_boolean elf_vax_relocate_section (bfd *, struct bfd_link_info *,
42
                                             bfd *, asection *, bfd_byte *,
43
                                             Elf_Internal_Rela *,
44
                                             Elf_Internal_Sym *, asection **);
45
static bfd_boolean elf_vax_finish_dynamic_symbol (bfd *, struct bfd_link_info *,
46
                                                  struct elf_link_hash_entry *,
47
                                                  Elf_Internal_Sym *);
48
static bfd_boolean elf_vax_finish_dynamic_sections (bfd *,
49
                                                    struct bfd_link_info *);
50
static bfd_vma elf_vax_plt_sym_val (bfd_vma, const asection *,
51
                                    const arelent *);
52
 
53
static bfd_boolean elf32_vax_set_private_flags (bfd *, flagword);
54
static bfd_boolean elf32_vax_merge_private_bfd_data (bfd *, bfd *);
55
static bfd_boolean elf32_vax_print_private_bfd_data (bfd *, PTR);
56
 
57
static reloc_howto_type howto_table[] = {
58
  HOWTO (R_VAX_NONE,            /* type */
59
         0,                      /* rightshift */
60
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
61
         0,                      /* bitsize */
62
         FALSE,                 /* pc_relative */
63
         0,                      /* bitpos */
64
         complain_overflow_dont, /* complain_on_overflow */
65
         bfd_elf_generic_reloc, /* special_function */
66
         "R_VAX_NONE",          /* name */
67
         FALSE,                 /* partial_inplace */
68
         0,                      /* src_mask */
69
         0x00000000,            /* dst_mask */
70
         FALSE),                /* pcrel_offset */
71
 
72
  HOWTO (R_VAX_32,              /* type */
73
         0,                      /* rightshift */
74
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
75
         32,                    /* bitsize */
76
         FALSE,                 /* pc_relative */
77
         0,                      /* bitpos */
78
         complain_overflow_bitfield, /* complain_on_overflow */
79
         bfd_elf_generic_reloc, /* special_function */
80
         "R_VAX_32",            /* name */
81
         FALSE,                 /* partial_inplace */
82
         0,                      /* src_mask */
83
         0xffffffff,            /* dst_mask */
84
         FALSE),                /* pcrel_offset */
85
 
86
  HOWTO (R_VAX_16,              /* type */
87
         0,                      /* rightshift */
88
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
89
         16,                    /* bitsize */
90
         FALSE,                 /* pc_relative */
91
         0,                      /* bitpos */
92
         complain_overflow_bitfield, /* complain_on_overflow */
93
         bfd_elf_generic_reloc, /* special_function */
94
         "R_VAX_16",            /* name */
95
         FALSE,                 /* partial_inplace */
96
         0,                      /* src_mask */
97
         0x0000ffff,            /* dst_mask */
98
         FALSE),                /* pcrel_offset */
99
 
100
  HOWTO (R_VAX_8,               /* type */
101
         0,                      /* rightshift */
102
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
103
         8,                     /* bitsize */
104
         FALSE,                 /* pc_relative */
105
         0,                      /* bitpos */
106
         complain_overflow_bitfield, /* complain_on_overflow */
107
         bfd_elf_generic_reloc, /* special_function */
108
         "R_VAX_8",             /* name */
109
         FALSE,                 /* partial_inplace */
110
         0,                      /* src_mask */
111
         0x000000ff,            /* dst_mask */
112
         FALSE),                /* pcrel_offset */
113
 
114
  HOWTO (R_VAX_PC32,            /* type */
115
         0,                      /* rightshift */
116
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
117
         32,                    /* bitsize */
118
         TRUE,                  /* pc_relative */
119
         0,                      /* bitpos */
120
         complain_overflow_bitfield, /* complain_on_overflow */
121
         bfd_elf_generic_reloc, /* special_function */
122
         "R_VAX_PC32",          /* name */
123
         FALSE,                 /* partial_inplace */
124
         0,                      /* src_mask */
125
         0xffffffff,            /* dst_mask */
126
         TRUE),                 /* pcrel_offset */
127
 
128
  HOWTO (R_VAX_PC16,            /* type */
129
         0,                      /* rightshift */
130
         1,                     /* size (0 = byte, 1 = short, 2 = long) */
131
         16,                    /* bitsize */
132
         TRUE,                  /* pc_relative */
133
         0,                      /* bitpos */
134
         complain_overflow_signed, /* complain_on_overflow */
135
         bfd_elf_generic_reloc, /* special_function */
136
         "R_VAX_PC16",          /* name */
137
         FALSE,                 /* partial_inplace */
138
         0,                      /* src_mask */
139
         0x0000ffff,            /* dst_mask */
140
         TRUE),                 /* pcrel_offset */
141
 
142
  HOWTO (R_VAX_PC8,             /* type */
143
         0,                      /* rightshift */
144
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
145
         8,                     /* bitsize */
146
         TRUE,                  /* pc_relative */
147
         0,                      /* bitpos */
148
         complain_overflow_signed, /* complain_on_overflow */
149
         bfd_elf_generic_reloc, /* special_function */
150
         "R_VAX_PC8",           /* name */
151
         FALSE,                 /* partial_inplace */
152
         0,                      /* src_mask */
153
         0x000000ff,            /* dst_mask */
154
         TRUE),                 /* pcrel_offset */
155
 
156
  HOWTO (R_VAX_GOT32,           /* type */
157
         0,                      /* rightshift */
158
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
159
         32,                    /* bitsize */
160
         TRUE,                  /* pc_relative */
161
         0,                      /* bitpos */
162
         complain_overflow_bitfield, /* complain_on_overflow */
163
         bfd_elf_generic_reloc, /* special_function */
164
         "R_VAX_GOT32",         /* name */
165
         FALSE,                 /* partial_inplace */
166
         0,                      /* src_mask */
167
         0xffffffff,            /* dst_mask */
168
         TRUE),                 /* pcrel_offset */
169
 
170
  EMPTY_HOWTO (-1),
171
  EMPTY_HOWTO (-1),
172
  EMPTY_HOWTO (-1),
173
  EMPTY_HOWTO (-1),
174
  EMPTY_HOWTO (-1),
175
 
176
  HOWTO (R_VAX_PLT32,           /* type */
177
         0,                      /* rightshift */
178
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
179
         32,                    /* bitsize */
180
         TRUE,                  /* pc_relative */
181
         0,                      /* bitpos */
182
         complain_overflow_bitfield, /* complain_on_overflow */
183
         bfd_elf_generic_reloc, /* special_function */
184
         "R_VAX_PLT32",         /* name */
185
         FALSE,                 /* partial_inplace */
186
         0,                      /* src_mask */
187
         0xffffffff,            /* dst_mask */
188
         TRUE),                 /* pcrel_offset */
189
 
190
  EMPTY_HOWTO (-1),
191
  EMPTY_HOWTO (-1),
192
  EMPTY_HOWTO (-1),
193
  EMPTY_HOWTO (-1),
194
  EMPTY_HOWTO (-1),
195
 
196
  HOWTO (R_VAX_COPY,            /* type */
197
         0,                      /* rightshift */
198
         0,                      /* size (0 = byte, 1 = short, 2 = long) */
199
         0,                      /* bitsize */
200
         FALSE,                 /* pc_relative */
201
         0,                      /* bitpos */
202
         complain_overflow_dont, /* complain_on_overflow */
203
         bfd_elf_generic_reloc, /* special_function */
204
         "R_VAX_COPY",          /* name */
205
         FALSE,                 /* partial_inplace */
206
         0,                      /* src_mask */
207
         0xffffffff,            /* dst_mask */
208
         FALSE),                /* pcrel_offset */
209
 
210
  HOWTO (R_VAX_GLOB_DAT,        /* type */
211
         0,                      /* rightshift */
212
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
213
         32,                    /* bitsize */
214
         FALSE,                 /* pc_relative */
215
         0,                      /* bitpos */
216
         complain_overflow_dont, /* complain_on_overflow */
217
         bfd_elf_generic_reloc, /* special_function */
218
         "R_VAX_GLOB_DAT",      /* name */
219
         FALSE,                 /* partial_inplace */
220
         0,                      /* src_mask */
221
         0xffffffff,            /* dst_mask */
222
         FALSE),                /* pcrel_offset */
223
 
224
  HOWTO (R_VAX_JMP_SLOT,        /* type */
225
         0,                      /* rightshift */
226
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
227
         32,                    /* bitsize */
228
         FALSE,                 /* pc_relative */
229
         0,                      /* bitpos */
230
         complain_overflow_dont, /* complain_on_overflow */
231
         bfd_elf_generic_reloc, /* special_function */
232
         "R_VAX_JMP_SLOT",      /* name */
233
         FALSE,                 /* partial_inplace */
234
         0,                      /* src_mask */
235
         0xffffffff,            /* dst_mask */
236
         FALSE),                /* pcrel_offset */
237
 
238
  HOWTO (R_VAX_RELATIVE,        /* type */
239
         0,                      /* rightshift */
240
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
241
         32,                    /* bitsize */
242
         FALSE,                 /* pc_relative */
243
         0,                      /* bitpos */
244
         complain_overflow_dont, /* complain_on_overflow */
245
         bfd_elf_generic_reloc, /* special_function */
246
         "R_VAX_RELATIVE",      /* name */
247
         FALSE,                 /* partial_inplace */
248
         0,                      /* src_mask */
249
         0xffffffff,            /* dst_mask */
250
         FALSE),                /* pcrel_offset */
251
 
252
  /* GNU extension to record C++ vtable hierarchy */
253
  HOWTO (R_VAX_GNU_VTINHERIT,   /* type */
254
         0,                      /* rightshift */
255
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
256
         0,                      /* bitsize */
257
         FALSE,                 /* pc_relative */
258
         0,                      /* bitpos */
259
         complain_overflow_dont, /* complain_on_overflow */
260
         NULL,                  /* special_function */
261
         "R_VAX_GNU_VTINHERIT", /* name */
262
         FALSE,                 /* partial_inplace */
263
         0,                      /* src_mask */
264
         0,                      /* dst_mask */
265
         FALSE),                /* pcrel_offset */
266
 
267
  /* GNU extension to record C++ vtable member usage */
268
  HOWTO (R_VAX_GNU_VTENTRY,     /* type */
269
         0,                      /* rightshift */
270
         2,                     /* size (0 = byte, 1 = short, 2 = long) */
271
         0,                      /* bitsize */
272
         FALSE,                 /* pc_relative */
273
         0,                      /* bitpos */
274
         complain_overflow_dont, /* complain_on_overflow */
275
         _bfd_elf_rel_vtable_reloc_fn, /* special_function */
276
         "R_VAX_GNU_VTENTRY",   /* name */
277
         FALSE,                 /* partial_inplace */
278
         0,                      /* src_mask */
279
         0,                      /* dst_mask */
280
         FALSE),                /* pcrel_offset */
281
};
282
 
283
static void
284
rtype_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
285
                Elf_Internal_Rela *dst)
286
{
287
  BFD_ASSERT (ELF32_R_TYPE(dst->r_info) < (unsigned int) R_VAX_max);
288
  cache_ptr->howto = &howto_table[ELF32_R_TYPE(dst->r_info)];
289
}
290
 
291
#define elf_info_to_howto rtype_to_howto
292
 
293
static const struct
294
{
295
  bfd_reloc_code_real_type bfd_val;
296
  int elf_val;
297
} reloc_map[] = {
298
  { BFD_RELOC_NONE, R_VAX_NONE },
299
  { BFD_RELOC_32, R_VAX_32 },
300
  { BFD_RELOC_16, R_VAX_16 },
301
  { BFD_RELOC_8, R_VAX_8 },
302
  { BFD_RELOC_32_PCREL, R_VAX_PC32 },
303
  { BFD_RELOC_16_PCREL, R_VAX_PC16 },
304
  { BFD_RELOC_8_PCREL, R_VAX_PC8 },
305
  { BFD_RELOC_32_GOT_PCREL, R_VAX_GOT32 },
306
  { BFD_RELOC_32_PLT_PCREL, R_VAX_PLT32 },
307
  { BFD_RELOC_NONE, R_VAX_COPY },
308
  { BFD_RELOC_VAX_GLOB_DAT, R_VAX_GLOB_DAT },
309
  { BFD_RELOC_VAX_JMP_SLOT, R_VAX_JMP_SLOT },
310
  { BFD_RELOC_VAX_RELATIVE, R_VAX_RELATIVE },
311
  { BFD_RELOC_CTOR, R_VAX_32 },
312
  { BFD_RELOC_VTABLE_INHERIT, R_VAX_GNU_VTINHERIT },
313
  { BFD_RELOC_VTABLE_ENTRY, R_VAX_GNU_VTENTRY },
314
};
315
 
316
static reloc_howto_type *
317
reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED, bfd_reloc_code_real_type code)
318
{
319
  unsigned int i;
320
  for (i = 0; i < sizeof (reloc_map) / sizeof (reloc_map[0]); i++)
321
    {
322
      if (reloc_map[i].bfd_val == code)
323
        return &howto_table[reloc_map[i].elf_val];
324
    }
325
  return 0;
326
}
327
 
328
static reloc_howto_type *
329
reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
330
                   const char *r_name)
331
{
332
  unsigned int i;
333
 
334
  for (i = 0; i < sizeof (howto_table) / sizeof (howto_table[0]); i++)
335
    if (howto_table[i].name != NULL
336
        && strcasecmp (howto_table[i].name, r_name) == 0)
337
      return &howto_table[i];
338
 
339
  return NULL;
340
}
341
 
342
#define bfd_elf32_bfd_reloc_type_lookup reloc_type_lookup
343
#define bfd_elf32_bfd_reloc_name_lookup reloc_name_lookup
344
#define ELF_ARCH bfd_arch_vax
345
/* end code generated by elf.el */
346
 
347
/* Functions for the VAX ELF linker.  */
348
 
349
/* The name of the dynamic interpreter.  This is put in the .interp
350
   section.  */
351
 
352
#define ELF_DYNAMIC_INTERPRETER "/usr/libexec/ld.elf_so"
353
 
354
/* The size in bytes of an entry in the procedure linkage table.  */
355
 
356
#define PLT_ENTRY_SIZE 12
357
 
358
/* The first entry in a procedure linkage table looks like this.  See
359
   the SVR4 ABI VAX supplement to see how this works.  */
360
 
361
static const bfd_byte elf_vax_plt0_entry[PLT_ENTRY_SIZE] =
362
{
363
  0xdd, 0xef,           /* pushl l^ */
364
  0, 0, 0, 0,               /* offset to .plt.got + 4 */
365
  0x17, 0xff,           /* jmp @L^(pc) */
366
  0, 0, 0, 0,               /* offset to .plt.got + 8 */
367
};
368
 
369
/* Subsequent entries in a procedure linkage table look like this.  */
370
 
371
static const bfd_byte elf_vax_plt_entry[PLT_ENTRY_SIZE] =
372
{
373
  0xfc, 0x0f,           /* .word ^M<r11:r2> */
374
  0x16, 0xef,           /* jsb L^(pc) */
375
  0, 0, 0, 0,               /* replaced with offset to start of .plt  */
376
  0, 0, 0, 0,               /* index into .rela.plt */
377
};
378
 
379
/* The VAX linker needs to keep track of the number of relocs that it
380
   decides to copy in check_relocs for each symbol.  This is so that it
381
   can discard PC relative relocs if it doesn't need them when linking
382
   with -Bsymbolic.  We store the information in a field extending the
383
   regular ELF linker hash table.  */
384
 
385
/* This structure keeps track of the number of PC relative relocs we have
386
   copied for a given symbol.  */
387
 
388
struct elf_vax_pcrel_relocs_copied
389
{
390
  /* Next section.  */
391
  struct elf_vax_pcrel_relocs_copied *next;
392
  /* A section in dynobj.  */
393
  asection *section;
394
  /* Number of relocs copied in this section.  */
395
  bfd_size_type count;
396
};
397
 
398
/* VAX ELF linker hash entry.  */
399
 
400
struct elf_vax_link_hash_entry
401
{
402
  struct elf_link_hash_entry root;
403
 
404
  /* Number of PC relative relocs copied for this symbol.  */
405
  struct elf_vax_pcrel_relocs_copied *pcrel_relocs_copied;
406
 
407
  bfd_vma got_addend;
408
};
409
 
410
/* Declare this now that the above structures are defined.  */
411
 
412
static bfd_boolean elf_vax_discard_copies (struct elf_vax_link_hash_entry *,
413
                                           void *);
414
 
415
/* Declare this now that the above structures are defined.  */
416
 
417
static bfd_boolean elf_vax_instantiate_got_entries (struct elf_link_hash_entry *,
418
                                                    void *);
419
 
420
/* Traverse an VAX ELF linker hash table.  */
421
 
422
#define elf_vax_link_hash_traverse(table, func, info)                   \
423
  (elf_link_hash_traverse                                               \
424
   ((table),                                                            \
425
    (bfd_boolean (*) (struct elf_link_hash_entry *, PTR)) (func),       \
426
    (info)))
427
 
428
/* Create an entry in an VAX ELF linker hash table.  */
429
 
430
static struct bfd_hash_entry *
431
elf_vax_link_hash_newfunc (struct bfd_hash_entry *entry,
432
                           struct bfd_hash_table *table,
433
                           const char *string)
434
{
435
  struct elf_vax_link_hash_entry *ret =
436
    (struct elf_vax_link_hash_entry *) entry;
437
 
438
  /* Allocate the structure if it has not already been allocated by a
439
     subclass.  */
440
  if (ret == NULL)
441
    ret = ((struct elf_vax_link_hash_entry *)
442
           bfd_hash_allocate (table,
443
                              sizeof (struct elf_vax_link_hash_entry)));
444
  if (ret == NULL)
445
    return (struct bfd_hash_entry *) ret;
446
 
447
  /* Call the allocation method of the superclass.  */
448
  ret = ((struct elf_vax_link_hash_entry *)
449
         _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
450
                                     table, string));
451
  if (ret != NULL)
452
    {
453
      ret->pcrel_relocs_copied = NULL;
454
    }
455
 
456
  return (struct bfd_hash_entry *) ret;
457
}
458
 
459
/* Create an VAX ELF linker hash table.  */
460
 
461
static struct bfd_link_hash_table *
462
elf_vax_link_hash_table_create (bfd *abfd)
463
{
464
  struct elf_link_hash_table *ret;
465
  bfd_size_type amt = sizeof (struct elf_link_hash_table);
466
 
467
  ret = bfd_malloc (amt);
468
  if (ret == NULL)
469
    return NULL;
470
 
471
  if (!_bfd_elf_link_hash_table_init (ret, abfd,
472
                                      elf_vax_link_hash_newfunc,
473
                                      sizeof (struct elf_vax_link_hash_entry),
474
                                      GENERIC_ELF_DATA))
475
    {
476
      free (ret);
477
      return NULL;
478
    }
479
 
480
  return &ret->root;
481
}
482
 
483
/* Keep vax-specific flags in the ELF header */
484
static bfd_boolean
485
elf32_vax_set_private_flags (bfd *abfd, flagword flags)
486
{
487
  elf_elfheader (abfd)->e_flags = flags;
488
  elf_flags_init (abfd) = TRUE;
489
  return TRUE;
490
}
491
 
492
/* Merge backend specific data from an object file to the output
493
   object file when linking.  */
494
static bfd_boolean
495
elf32_vax_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
496
{
497
  flagword in_flags;
498
 
499
  if (   bfd_get_flavour (ibfd) != bfd_target_elf_flavour
500
      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
501
    return TRUE;
502
 
503
  in_flags  = elf_elfheader (ibfd)->e_flags;
504
 
505
  if (!elf_flags_init (obfd))
506
    {
507
      elf_flags_init (obfd) = TRUE;
508
      elf_elfheader (obfd)->e_flags = in_flags;
509
    }
510
 
511
  return TRUE;
512
}
513
 
514
/* Display the flags field */
515
static bfd_boolean
516
elf32_vax_print_private_bfd_data (bfd *abfd, PTR ptr)
517
{
518
  FILE *file = (FILE *) ptr;
519
 
520
  BFD_ASSERT (abfd != NULL && ptr != NULL);
521
 
522
  /* Print normal ELF private data.  */
523
  _bfd_elf_print_private_bfd_data (abfd, ptr);
524
 
525
  /* Ignore init flag - it may not be set, despite the flags field containing valid data.  */
526
 
527
  /* xgettext:c-format */
528
  fprintf (file, _("private flags = %lx:"), elf_elfheader (abfd)->e_flags);
529
 
530
  if (elf_elfheader (abfd)->e_flags & EF_VAX_NONPIC)
531
    fprintf (file, _(" [nonpic]"));
532
 
533
  if (elf_elfheader (abfd)->e_flags & EF_VAX_DFLOAT)
534
    fprintf (file, _(" [d-float]"));
535
 
536
  if (elf_elfheader (abfd)->e_flags & EF_VAX_GFLOAT)
537
    fprintf (file, _(" [g-float]"));
538
 
539
  fputc ('\n', file);
540
 
541
  return TRUE;
542
}
543
/* Look through the relocs for a section during the first phase, and
544
   allocate space in the global offset table or procedure linkage
545
   table.  */
546
 
547
static bfd_boolean
548
elf_vax_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec,
549
                      const Elf_Internal_Rela *relocs)
550
{
551
  bfd *dynobj;
552
  Elf_Internal_Shdr *symtab_hdr;
553
  struct elf_link_hash_entry **sym_hashes;
554
  const Elf_Internal_Rela *rel;
555
  const Elf_Internal_Rela *rel_end;
556
  asection *sgot;
557
  asection *srelgot;
558
  asection *sreloc;
559
 
560
  if (info->relocatable)
561
    return TRUE;
562
 
563
  dynobj = elf_hash_table (info)->dynobj;
564
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
565
  sym_hashes = elf_sym_hashes (abfd);
566
 
567
  sgot = NULL;
568
  srelgot = NULL;
569
  sreloc = NULL;
570
 
571
  rel_end = relocs + sec->reloc_count;
572
  for (rel = relocs; rel < rel_end; rel++)
573
    {
574
      unsigned long r_symndx;
575
      struct elf_link_hash_entry *h;
576
 
577
      r_symndx = ELF32_R_SYM (rel->r_info);
578
 
579
      if (r_symndx < symtab_hdr->sh_info)
580
        h = NULL;
581
      else
582
        {
583
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
584
          while (h->root.type == bfd_link_hash_indirect
585
                 || h->root.type == bfd_link_hash_warning)
586
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
587
        }
588
 
589
      switch (ELF32_R_TYPE (rel->r_info))
590
        {
591
        case R_VAX_GOT32:
592
          BFD_ASSERT (h != NULL);
593
          if (h->forced_local
594
              || h == elf_hash_table (info)->hgot
595
              || h == elf_hash_table (info)->hplt)
596
            break;
597
 
598
          /* If this is a local symbol, we resolve it directly without
599
             creating a global offset table entry.  */
600
          if (h == NULL || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
601
            break;
602
 
603
          /* This symbol requires a global offset table entry.  */
604
 
605
          if (dynobj == NULL)
606
            {
607
              /* Create the .got section.  */
608
              elf_hash_table (info)->dynobj = dynobj = abfd;
609
              if (!_bfd_elf_create_got_section (dynobj, info))
610
                return FALSE;
611
            }
612
 
613
          if (sgot == NULL)
614
            {
615
              sgot = bfd_get_section_by_name (dynobj, ".got");
616
              BFD_ASSERT (sgot != NULL);
617
            }
618
 
619
          if (srelgot == NULL
620
              && (h != NULL || info->shared))
621
            {
622
              srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
623
              if (srelgot == NULL)
624
                {
625
                  srelgot = bfd_make_section_with_flags (dynobj,
626
                                                         ".rela.got",
627
                                                         (SEC_ALLOC
628
                                                          | SEC_LOAD
629
                                                          | SEC_HAS_CONTENTS
630
                                                          | SEC_IN_MEMORY
631
                                                          | SEC_LINKER_CREATED
632
                                                          | SEC_READONLY));
633
                  if (srelgot == NULL
634
                      || !bfd_set_section_alignment (dynobj, srelgot, 2))
635
                    return FALSE;
636
                }
637
            }
638
 
639
          if (h != NULL)
640
            {
641
              struct elf_vax_link_hash_entry *eh;
642
 
643
              eh = (struct elf_vax_link_hash_entry *) h;
644
              if (h->got.refcount == -1)
645
                {
646
                  h->got.refcount = 1;
647
                  eh->got_addend = rel->r_addend;
648
                }
649
              else
650
                {
651
                  h->got.refcount++;
652
                  if (eh->got_addend != (bfd_vma) rel->r_addend)
653
                    (*_bfd_error_handler)
654
                      (_("%s: warning: GOT addend of %ld to `%s' does"
655
                         " not match previous GOT addend of %ld"),
656
                         bfd_get_filename (abfd), rel->r_addend,
657
                         h->root.root.string,
658
                         eh->got_addend);
659
 
660
                }
661
            }
662
          break;
663
 
664
        case R_VAX_PLT32:
665
          /* This symbol requires a procedure linkage table entry.  We
666
             actually build the entry in adjust_dynamic_symbol,
667
             because this might be a case of linking PIC code which is
668
             never referenced by a dynamic object, in which case we
669
             don't need to generate a procedure linkage table entry
670
             after all.  */
671
 
672
          /* If this is a local symbol, we resolve it directly without
673
             creating a procedure linkage table entry.  */
674
          BFD_ASSERT (h != NULL);
675
          if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT || h->forced_local)
676
            break;
677
 
678
          h->needs_plt = 1;
679
          if (h->plt.refcount == -1)
680
            h->plt.refcount = 1;
681
          else
682
            h->plt.refcount++;
683
          break;
684
 
685
        case R_VAX_PC8:
686
        case R_VAX_PC16:
687
        case R_VAX_PC32:
688
          /* If we are creating a shared library and this is not a local
689
             symbol, we need to copy the reloc into the shared library.
690
             However when linking with -Bsymbolic and this is a global
691
             symbol which is defined in an object we are including in the
692
             link (i.e., DEF_REGULAR is set), then we can resolve the
693
             reloc directly.  At this point we have not seen all the input
694
             files, so it is possible that DEF_REGULAR is not set now but
695
             will be set later (it is never cleared).  We account for that
696
             possibility below by storing information in the
697
             pcrel_relocs_copied field of the hash table entry.  */
698
          if (!(info->shared
699
                && (sec->flags & SEC_ALLOC) != 0
700
                && h != NULL
701
                && (!info->symbolic
702
                    || !h->def_regular)))
703
            {
704
              if (h != NULL
705
                  && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
706
                  && !h->forced_local)
707
                {
708
                  /* Make sure a plt entry is created for this symbol if
709
                     it turns out to be a function defined by a dynamic
710
                     object.  */
711
                  if (h->plt.refcount == -1)
712
                    h->plt.refcount = 1;
713
                  else
714
                    h->plt.refcount++;
715
                }
716
              break;
717
            }
718
          /* If this is a local symbol, we can resolve it directly.  */
719
          if (h != NULL
720
              && (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
721
                  || h->forced_local))
722
            break;
723
 
724
          /* Fall through.  */
725
        case R_VAX_8:
726
        case R_VAX_16:
727
        case R_VAX_32:
728
          if (h != NULL && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
729
            {
730
              /* Make sure a plt entry is created for this symbol if it
731
                 turns out to be a function defined by a dynamic object.  */
732
              if (h->plt.refcount == -1)
733
                h->plt.refcount = 1;
734
              else
735
                h->plt.refcount++;
736
            }
737
 
738
          /* If we are creating a shared library, we need to copy the
739
             reloc into the shared library.  */
740
          if (info->shared
741
              && (sec->flags & SEC_ALLOC) != 0)
742
            {
743
              /* When creating a shared object, we must copy these
744
                 reloc types into the output file.  We create a reloc
745
                 section in dynobj and make room for this reloc.  */
746
              if (sreloc == NULL)
747
                {
748
                  sreloc = _bfd_elf_make_dynamic_reloc_section
749
                    (sec, dynobj, 2, abfd, /*rela?*/ TRUE);
750
 
751
                  if (sreloc == NULL)
752
                    return FALSE;
753
 
754
                  if (sec->flags & SEC_READONLY)
755
                    info->flags |= DF_TEXTREL;
756
                }
757
 
758
              sreloc->size += sizeof (Elf32_External_Rela);
759
 
760
              /* If we are linking with -Bsymbolic, we count the number of
761
                 PC relative relocations we have entered for this symbol,
762
                 so that we can discard them again if the symbol is later
763
                 defined by a regular object.  Note that this function is
764
                 only called if we are using a vaxelf linker hash table,
765
                 which means that h is really a pointer to an
766
                 elf_vax_link_hash_entry.  */
767
              if ((ELF32_R_TYPE (rel->r_info) == R_VAX_PC8
768
                   || ELF32_R_TYPE (rel->r_info) == R_VAX_PC16
769
                   || ELF32_R_TYPE (rel->r_info) == R_VAX_PC32)
770
                  && info->symbolic)
771
                {
772
                  struct elf_vax_link_hash_entry *eh;
773
                  struct elf_vax_pcrel_relocs_copied *p;
774
 
775
                  eh = (struct elf_vax_link_hash_entry *) h;
776
 
777
                  for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next)
778
                    if (p->section == sreloc)
779
                      break;
780
 
781
                  if (p == NULL)
782
                    {
783
                      p = ((struct elf_vax_pcrel_relocs_copied *)
784
                           bfd_alloc (dynobj, (bfd_size_type) sizeof *p));
785
                      if (p == NULL)
786
                        return FALSE;
787
                      p->next = eh->pcrel_relocs_copied;
788
                      eh->pcrel_relocs_copied = p;
789
                      p->section = sreloc;
790
                      p->count = 0;
791
                    }
792
 
793
                  ++p->count;
794
                }
795
            }
796
 
797
          break;
798
 
799
          /* This relocation describes the C++ object vtable hierarchy.
800
             Reconstruct it for later use during GC.  */
801
        case R_VAX_GNU_VTINHERIT:
802
          if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
803
            return FALSE;
804
          break;
805
 
806
          /* This relocation describes which C++ vtable entries are actually
807
             used.  Record for later use during GC.  */
808
        case R_VAX_GNU_VTENTRY:
809
          BFD_ASSERT (h != NULL);
810
          if (h != NULL
811
              && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
812
            return FALSE;
813
          break;
814
 
815
        default:
816
          break;
817
        }
818
    }
819
 
820
  return TRUE;
821
}
822
 
823
/* Return the section that should be marked against GC for a given
824
   relocation.  */
825
 
826
static asection *
827
elf_vax_gc_mark_hook (asection *sec,
828
                      struct bfd_link_info *info,
829
                      Elf_Internal_Rela *rel,
830
                      struct elf_link_hash_entry *h,
831
                      Elf_Internal_Sym *sym)
832
{
833
  if (h != NULL)
834
    switch (ELF32_R_TYPE (rel->r_info))
835
      {
836
      case R_VAX_GNU_VTINHERIT:
837
      case R_VAX_GNU_VTENTRY:
838
        return NULL;
839
      }
840
 
841
  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
842
}
843
 
844
/* Update the got entry reference counts for the section being removed.  */
845
 
846
static bfd_boolean
847
elf_vax_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info, asection *sec,
848
                       const Elf_Internal_Rela *relocs)
849
{
850
  Elf_Internal_Shdr *symtab_hdr;
851
  struct elf_link_hash_entry **sym_hashes;
852
  const Elf_Internal_Rela *rel, *relend;
853
  bfd *dynobj;
854
 
855
  if (info->relocatable)
856
    return TRUE;
857
 
858
  dynobj = elf_hash_table (info)->dynobj;
859
  if (dynobj == NULL)
860
    return TRUE;
861
 
862
  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
863
  sym_hashes = elf_sym_hashes (abfd);
864
 
865
  relend = relocs + sec->reloc_count;
866
  for (rel = relocs; rel < relend; rel++)
867
    {
868
      unsigned long r_symndx;
869
      struct elf_link_hash_entry *h = NULL;
870
 
871
      r_symndx = ELF32_R_SYM (rel->r_info);
872
      if (r_symndx >= symtab_hdr->sh_info)
873
        {
874
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
875
          while (h->root.type == bfd_link_hash_indirect
876
                 || h->root.type == bfd_link_hash_warning)
877
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
878
        }
879
 
880
      switch (ELF32_R_TYPE (rel->r_info))
881
        {
882
        case R_VAX_GOT32:
883
          if (h != NULL && h->got.refcount > 0)
884
            --h->got.refcount;
885
          break;
886
 
887
        case R_VAX_PLT32:
888
        case R_VAX_PC8:
889
        case R_VAX_PC16:
890
        case R_VAX_PC32:
891
        case R_VAX_8:
892
        case R_VAX_16:
893
        case R_VAX_32:
894
          if (h != NULL && h->plt.refcount > 0)
895
            --h->plt.refcount;
896
          break;
897
 
898
        default:
899
          break;
900
        }
901
    }
902
 
903
  return TRUE;
904
}
905
 
906
/* Adjust a symbol defined by a dynamic object and referenced by a
907
   regular object.  The current definition is in some section of the
908
   dynamic object, but we're not including those sections.  We have to
909
   change the definition to something the rest of the link can
910
   understand.  */
911
 
912
static bfd_boolean
913
elf_vax_adjust_dynamic_symbol (info, h)
914
     struct bfd_link_info *info;
915
     struct elf_link_hash_entry *h;
916
{
917
  bfd *dynobj;
918
  asection *s;
919
 
920
  dynobj = elf_hash_table (info)->dynobj;
921
 
922
  /* Make sure we know what is going on here.  */
923
  BFD_ASSERT (dynobj != NULL
924
              && (h->needs_plt
925
                  || h->u.weakdef != NULL
926
                  || (h->def_dynamic
927
                      && h->ref_regular
928
                      && !h->def_regular)));
929
 
930
  /* If this is a function, put it in the procedure linkage table.  We
931
     will fill in the contents of the procedure linkage table later,
932
     when we know the address of the .got section.  */
933
  if (h->type == STT_FUNC
934
      || h->needs_plt)
935
    {
936
      if (! info->shared
937
          && !h->def_dynamic
938
          && !h->ref_dynamic
939
          /* We must always create the plt entry if it was referenced
940
             by a PLTxxO relocation.  In this case we already recorded
941
             it as a dynamic symbol.  */
942
          && h->dynindx == -1)
943
        {
944
          /* This case can occur if we saw a PLTxx reloc in an input
945
             file, but the symbol was never referred to by a dynamic
946
             object.  In such a case, we don't actually need to build
947
             a procedure linkage table, and we can just do a PCxx
948
             reloc instead.  */
949
          BFD_ASSERT (h->needs_plt);
950
          h->plt.offset = (bfd_vma) -1;
951
          return TRUE;
952
        }
953
 
954
      /* GC may have rendered this entry unused.  */
955
      if (h->plt.refcount <= 0)
956
        {
957
          h->needs_plt = 0;
958
          h->plt.offset = (bfd_vma) -1;
959
          return TRUE;
960
        }
961
 
962
      /* Make sure this symbol is output as a dynamic symbol.  */
963
      if (h->dynindx == -1)
964
        {
965
          if (! bfd_elf_link_record_dynamic_symbol (info, h))
966
            return FALSE;
967
        }
968
 
969
      s = bfd_get_section_by_name (dynobj, ".plt");
970
      BFD_ASSERT (s != NULL);
971
 
972
      /* If this is the first .plt entry, make room for the special
973
         first entry.  */
974
      if (s->size == 0)
975
        {
976
          s->size += PLT_ENTRY_SIZE;
977
        }
978
 
979
      /* If this symbol is not defined in a regular file, and we are
980
         not generating a shared library, then set the symbol to this
981
         location in the .plt.  This is required to make function
982
         pointers compare as equal between the normal executable and
983
         the shared library.  */
984
      if (!info->shared
985
          && !h->def_regular)
986
        {
987
          h->root.u.def.section = s;
988
          h->root.u.def.value = s->size;
989
        }
990
 
991
      h->plt.offset = s->size;
992
 
993
      /* Make room for this entry.  */
994
      s->size += PLT_ENTRY_SIZE;
995
 
996
      /* We also need to make an entry in the .got.plt section, which
997
         will be placed in the .got section by the linker script.  */
998
 
999
      s = bfd_get_section_by_name (dynobj, ".got.plt");
1000
      BFD_ASSERT (s != NULL);
1001
      s->size += 4;
1002
 
1003
      /* We also need to make an entry in the .rela.plt section.  */
1004
 
1005
      s = bfd_get_section_by_name (dynobj, ".rela.plt");
1006
      BFD_ASSERT (s != NULL);
1007
      s->size += sizeof (Elf32_External_Rela);
1008
 
1009
      return TRUE;
1010
    }
1011
 
1012
  /* Reinitialize the plt offset now that it is not used as a reference
1013
     count any more.  */
1014
  h->plt.offset = (bfd_vma) -1;
1015
 
1016
  /* If this is a weak symbol, and there is a real definition, the
1017
     processor independent code will have arranged for us to see the
1018
     real definition first, and we can just use the same value.  */
1019
  if (h->u.weakdef != NULL)
1020
    {
1021
      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
1022
                  || h->u.weakdef->root.type == bfd_link_hash_defweak);
1023
      h->root.u.def.section = h->u.weakdef->root.u.def.section;
1024
      h->root.u.def.value = h->u.weakdef->root.u.def.value;
1025
      return TRUE;
1026
    }
1027
 
1028
  /* This is a reference to a symbol defined by a dynamic object which
1029
     is not a function.  */
1030
 
1031
  /* If we are creating a shared library, we must presume that the
1032
     only references to the symbol are via the global offset table.
1033
     For such cases we need not do anything here; the relocations will
1034
     be handled correctly by relocate_section.  */
1035
  if (info->shared)
1036
    return TRUE;
1037
 
1038
  if (h->size == 0)
1039
    {
1040
      (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
1041
                             h->root.root.string);
1042
      return TRUE;
1043
    }
1044
 
1045
  /* We must allocate the symbol in our .dynbss section, which will
1046
     become part of the .bss section of the executable.  There will be
1047
     an entry for this symbol in the .dynsym section.  The dynamic
1048
     object will contain position independent code, so all references
1049
     from the dynamic object to this symbol will go through the global
1050
     offset table.  The dynamic linker will use the .dynsym entry to
1051
     determine the address it must put in the global offset table, so
1052
     both the dynamic object and the regular object will refer to the
1053
     same memory location for the variable.  */
1054
 
1055
  s = bfd_get_section_by_name (dynobj, ".dynbss");
1056
  BFD_ASSERT (s != NULL);
1057
 
1058
  /* We must generate a R_VAX_COPY reloc to tell the dynamic linker to
1059
     copy the initial value out of the dynamic object and into the
1060
     runtime process image.  We need to remember the offset into the
1061
     .rela.bss section we are going to use.  */
1062
  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
1063
    {
1064
      asection *srel;
1065
 
1066
      srel = bfd_get_section_by_name (dynobj, ".rela.bss");
1067
      BFD_ASSERT (srel != NULL);
1068
      srel->size += sizeof (Elf32_External_Rela);
1069
      h->needs_copy = 1;
1070
    }
1071
 
1072
  return _bfd_elf_adjust_dynamic_copy (h, s);
1073
}
1074
 
1075
/* Set the sizes of the dynamic sections.  */
1076
 
1077
static bfd_boolean
1078
elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1079
{
1080
  bfd *dynobj;
1081
  asection *s;
1082
  bfd_boolean plt;
1083
  bfd_boolean relocs;
1084
  bfd_boolean reltext;
1085
 
1086
  dynobj = elf_hash_table (info)->dynobj;
1087
  BFD_ASSERT (dynobj != NULL);
1088
 
1089
  if (elf_hash_table (info)->dynamic_sections_created)
1090
    {
1091
      /* Set the contents of the .interp section to the interpreter.  */
1092
      if (info->executable)
1093
        {
1094
          s = bfd_get_section_by_name (dynobj, ".interp");
1095
          BFD_ASSERT (s != NULL);
1096
          s->size = sizeof ELF_DYNAMIC_INTERPRETER;
1097
          s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
1098
        }
1099
    }
1100
  else
1101
    {
1102
      /* We may have created entries in the .rela.got and .got sections.
1103
         However, if we are not creating the dynamic sections, we will
1104
         not actually use these entries.  Reset the size of .rela.got
1105
         and .got, which will cause it to get stripped from the output
1106
         file below.  */
1107
      s = bfd_get_section_by_name (dynobj, ".rela.got");
1108
      if (s != NULL)
1109
        s->size = 0;
1110
      s = bfd_get_section_by_name (dynobj, ".got.plt");
1111
      if (s != NULL)
1112
        s->size = 0;
1113
      s = bfd_get_section_by_name (dynobj, ".got");
1114
      if (s != NULL)
1115
        s->size = 0;
1116
    }
1117
 
1118
  /* If this is a -Bsymbolic shared link, then we need to discard all PC
1119
     relative relocs against symbols defined in a regular object.  We
1120
     allocated space for them in the check_relocs routine, but we will not
1121
     fill them in in the relocate_section routine.  */
1122
  if (info->shared && info->symbolic)
1123
    elf_vax_link_hash_traverse (elf_hash_table (info),
1124
                                elf_vax_discard_copies,
1125
                                NULL);
1126
 
1127
  /* If this is a -Bsymbolic shared link or a static link, we need to
1128
     discard all the got entries we've recorded.  Otherwise, we need to
1129
     instantiate (allocate space for them).  */
1130
  elf_link_hash_traverse (elf_hash_table (info),
1131
                          elf_vax_instantiate_got_entries,
1132
                          (PTR) info);
1133
 
1134
  /* The check_relocs and adjust_dynamic_symbol entry points have
1135
     determined the sizes of the various dynamic sections.  Allocate
1136
     memory for them.  */
1137
  plt = FALSE;
1138
  relocs = FALSE;
1139
  reltext = FALSE;
1140
  for (s = dynobj->sections; s != NULL; s = s->next)
1141
    {
1142
      const char *name;
1143
 
1144
      if ((s->flags & SEC_LINKER_CREATED) == 0)
1145
        continue;
1146
 
1147
      /* It's OK to base decisions on the section name, because none
1148
         of the dynobj section names depend upon the input files.  */
1149
      name = bfd_get_section_name (dynobj, s);
1150
 
1151
      if (strcmp (name, ".plt") == 0)
1152
        {
1153
          /* Remember whether there is a PLT.  */
1154
          plt = s->size != 0;
1155
        }
1156
      else if (CONST_STRNEQ (name, ".rela"))
1157
        {
1158
          if (s->size != 0)
1159
            {
1160
              asection *target;
1161
 
1162
              /* Remember whether there are any reloc sections other
1163
                 than .rela.plt.  */
1164
              if (strcmp (name, ".rela.plt") != 0)
1165
                {
1166
                  const char *outname;
1167
 
1168
                  relocs = TRUE;
1169
 
1170
                  /* If this relocation section applies to a read only
1171
                     section, then we probably need a DT_TEXTREL
1172
                     entry.  .rela.plt is actually associated with
1173
                     .got.plt, which is never readonly.  */
1174
                  outname = bfd_get_section_name (output_bfd,
1175
                                                  s->output_section);
1176
                  target = bfd_get_section_by_name (output_bfd, outname + 5);
1177
                  if (target != NULL
1178
                      && (target->flags & SEC_READONLY) != 0
1179
                      && (target->flags & SEC_ALLOC) != 0)
1180
                    reltext = TRUE;
1181
                }
1182
 
1183
              /* We use the reloc_count field as a counter if we need
1184
                 to copy relocs into the output file.  */
1185
              s->reloc_count = 0;
1186
            }
1187
        }
1188
      else if (! CONST_STRNEQ (name, ".got")
1189
               && strcmp (name, ".dynbss") != 0)
1190
        {
1191
          /* It's not one of our sections, so don't allocate space.  */
1192
          continue;
1193
        }
1194
 
1195
      if (s->size == 0)
1196
        {
1197
          /* If we don't need this section, strip it from the
1198
             output file.  This is mostly to handle .rela.bss and
1199
             .rela.plt.  We must create both sections in
1200
             create_dynamic_sections, because they must be created
1201
             before the linker maps input sections to output
1202
             sections.  The linker does that before
1203
             adjust_dynamic_symbol is called, and it is that
1204
             function which decides whether anything needs to go
1205
             into these sections.  */
1206
          s->flags |= SEC_EXCLUDE;
1207
          continue;
1208
        }
1209
 
1210
      if ((s->flags & SEC_HAS_CONTENTS) == 0)
1211
        continue;
1212
 
1213
      /* Allocate memory for the section contents.  */
1214
      s->contents = (bfd_byte *) bfd_alloc (dynobj, s->size);
1215
      if (s->contents == NULL)
1216
        return FALSE;
1217
    }
1218
 
1219
  if (elf_hash_table (info)->dynamic_sections_created)
1220
    {
1221
      /* Add some entries to the .dynamic section.  We fill in the
1222
         values later, in elf_vax_finish_dynamic_sections, but we
1223
         must add the entries now so that we get the correct size for
1224
         the .dynamic section.  The DT_DEBUG entry is filled in by the
1225
         dynamic linker and used by the debugger.  */
1226
#define add_dynamic_entry(TAG, VAL) \
1227
  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
1228
 
1229
      if (!info->shared)
1230
        {
1231
          if (!add_dynamic_entry (DT_DEBUG, 0))
1232
            return FALSE;
1233
        }
1234
 
1235
      if (plt)
1236
        {
1237
          if (!add_dynamic_entry (DT_PLTGOT, 0)
1238
              || !add_dynamic_entry (DT_PLTRELSZ, 0)
1239
              || !add_dynamic_entry (DT_PLTREL, DT_RELA)
1240
              || !add_dynamic_entry (DT_JMPREL, 0))
1241
            return FALSE;
1242
        }
1243
 
1244
      if (relocs)
1245
        {
1246
          if (!add_dynamic_entry (DT_RELA, 0)
1247
              || !add_dynamic_entry (DT_RELASZ, 0)
1248
              || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
1249
            return FALSE;
1250
        }
1251
 
1252
      if (reltext || (info->flags & DF_TEXTREL) != 0)
1253
        {
1254
          if (!add_dynamic_entry (DT_TEXTREL, 0))
1255
            return FALSE;
1256
        }
1257
    }
1258
#undef add_dynamic_entry
1259
 
1260
  return TRUE;
1261
}
1262
 
1263
/* This function is called via elf_vax_link_hash_traverse if we are
1264
   creating a shared object with -Bsymbolic.  It discards the space
1265
   allocated to copy PC relative relocs against symbols which are defined
1266
   in regular objects.  We allocated space for them in the check_relocs
1267
   routine, but we won't fill them in in the relocate_section routine.  */
1268
 
1269
static bfd_boolean
1270
elf_vax_discard_copies (struct elf_vax_link_hash_entry *h,
1271
                        PTR ignore ATTRIBUTE_UNUSED)
1272
{
1273
  struct elf_vax_pcrel_relocs_copied *s;
1274
 
1275
  if (h->root.root.type == bfd_link_hash_warning)
1276
    h = (struct elf_vax_link_hash_entry *) h->root.root.u.i.link;
1277
 
1278
  /* We only discard relocs for symbols defined in a regular object.  */
1279
  if (!h->root.def_regular)
1280
    return TRUE;
1281
 
1282
  for (s = h->pcrel_relocs_copied; s != NULL; s = s->next)
1283
    s->section->size -= s->count * sizeof (Elf32_External_Rela);
1284
 
1285
  return TRUE;
1286
}
1287
 
1288
/* This function is called via elf_link_hash_traverse.  It looks for entries
1289
   that have GOT or PLT (.GOT) references.  If creating a static object or a
1290
   shared object with -Bsymbolic, it resets the reference count back to 0
1291
   and sets the offset to -1 so normal PC32 relocation will be done.  If
1292
   creating a shared object or executable, space in the .got and .rela.got
1293
   will be reserved for the symbol.  */
1294
 
1295
static bfd_boolean
1296
elf_vax_instantiate_got_entries (struct elf_link_hash_entry *h, PTR infoptr)
1297
{
1298
  struct bfd_link_info *info = (struct bfd_link_info *) infoptr;
1299
  bfd *dynobj;
1300
  asection *sgot;
1301
  asection *srelgot;
1302
 
1303
  /* We don't care about non-GOT (and non-PLT) entries.  */
1304
  if (h->got.refcount <= 0 && h->plt.refcount <= 0)
1305
    return TRUE;
1306
 
1307
  dynobj = elf_hash_table (info)->dynobj;
1308
  if (dynobj == NULL)
1309
    return TRUE;
1310
 
1311
  sgot = bfd_get_section_by_name (dynobj, ".got");
1312
  srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
1313
 
1314
  if (!elf_hash_table (info)->dynamic_sections_created
1315
      || (info->shared && info->symbolic)
1316
      || h->forced_local)
1317
    {
1318
      h->got.refcount = 0;
1319
      h->got.offset = (bfd_vma) -1;
1320
      h->plt.refcount = 0;
1321
      h->plt.offset = (bfd_vma) -1;
1322
    }
1323
  else if (h->got.refcount > 0)
1324
    {
1325
      bfd_boolean dyn;
1326
 
1327
      /* Make sure this symbol is output as a dynamic symbol.  */
1328
      if (h->dynindx == -1)
1329
        {
1330
          if (!bfd_elf_link_record_dynamic_symbol (info, h))
1331
            return FALSE;
1332
        }
1333
 
1334
      dyn = elf_hash_table (info)->dynamic_sections_created;
1335
      /* Allocate space in the .got and .rela.got sections.  */
1336
      if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
1337
          && (info->shared
1338
              || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)))
1339
        {
1340
          sgot->size += 4;
1341
          srelgot->size += sizeof (Elf32_External_Rela);
1342
        }
1343
    }
1344
 
1345
  return TRUE;
1346
}
1347
 
1348
/* Relocate an VAX ELF section.  */
1349
 
1350
static bfd_boolean
1351
elf_vax_relocate_section (bfd *output_bfd,
1352
                          struct bfd_link_info *info,
1353
                          bfd *input_bfd,
1354
                          asection *input_section,
1355
                          bfd_byte *contents,
1356
                          Elf_Internal_Rela *relocs,
1357
                          Elf_Internal_Sym *local_syms,
1358
                          asection **local_sections)
1359
{
1360
  bfd *dynobj;
1361
  Elf_Internal_Shdr *symtab_hdr;
1362
  struct elf_link_hash_entry **sym_hashes;
1363
  bfd_vma plt_index;
1364
  bfd_vma got_offset;
1365
  asection *sgot;
1366
  asection *splt;
1367
  asection *sgotplt;
1368
  asection *sreloc;
1369
  Elf_Internal_Rela *rel;
1370
  Elf_Internal_Rela *relend;
1371
 
1372
  dynobj = elf_hash_table (info)->dynobj;
1373
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1374
  sym_hashes = elf_sym_hashes (input_bfd);
1375
 
1376
  sgot = NULL;
1377
  splt = NULL;
1378
  sgotplt = NULL;
1379
  sreloc = NULL;
1380
 
1381
  rel = relocs;
1382
  relend = relocs + input_section->reloc_count;
1383
  for (; rel < relend; rel++)
1384
    {
1385
      int r_type;
1386
      reloc_howto_type *howto;
1387
      unsigned long r_symndx;
1388
      struct elf_link_hash_entry *h;
1389
      Elf_Internal_Sym *sym;
1390
      asection *sec;
1391
      bfd_vma relocation;
1392
      bfd_reloc_status_type r;
1393
 
1394
      r_type = ELF32_R_TYPE (rel->r_info);
1395
      if (r_type < 0 || r_type >= (int) R_VAX_max)
1396
        {
1397
          bfd_set_error (bfd_error_bad_value);
1398
          return FALSE;
1399
        }
1400
      howto = howto_table + r_type;
1401
 
1402
      r_symndx = ELF32_R_SYM (rel->r_info);
1403
      h = NULL;
1404
      sym = NULL;
1405
      sec = NULL;
1406
      if (r_symndx < symtab_hdr->sh_info)
1407
        {
1408
          sym = local_syms + r_symndx;
1409
          sec = local_sections[r_symndx];
1410
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1411
        }
1412
      else
1413
        {
1414
          bfd_boolean unresolved_reloc;
1415
          bfd_boolean warned;
1416
 
1417
          RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1418
                                   r_symndx, symtab_hdr, sym_hashes,
1419
                                   h, sec, relocation,
1420
                                   unresolved_reloc, warned);
1421
 
1422
          if ((h->root.type == bfd_link_hash_defined
1423
              || h->root.type == bfd_link_hash_defweak)
1424
              && ((r_type == R_VAX_PLT32
1425
                   && h->plt.offset != (bfd_vma) -1
1426
                   && !h->forced_local
1427
                   && elf_hash_table (info)->dynamic_sections_created)
1428
                  || (r_type == R_VAX_GOT32
1429
                      && h->got.offset != (bfd_vma) -1
1430
                      && !h->forced_local
1431
                      && elf_hash_table (info)->dynamic_sections_created
1432
                      && (! info->shared
1433
                          || (! info->symbolic && h->dynindx != -1)
1434
                          || !h->def_regular))
1435
                  || (info->shared
1436
                      && ((! info->symbolic && h->dynindx != -1)
1437
                          || !h->def_regular)
1438
                      && ((input_section->flags & SEC_ALLOC) != 0
1439
                          /* DWARF will emit R_VAX_32 relocations in its
1440
                             sections against symbols defined externally
1441
                             in shared libraries.  We can't do anything
1442
                             with them here.  */
1443
 
1444
                          || ((input_section->flags & SEC_DEBUGGING) != 0
1445
                              && h->def_dynamic))
1446
                      && (r_type == R_VAX_8
1447
                          || r_type == R_VAX_16
1448
                          || r_type == R_VAX_32))))
1449
            /* In these cases, we don't need the relocation
1450
               value.  We check specially because in some
1451
               obscure cases sec->output_section will be NULL.  */
1452
            relocation = 0;
1453
        }
1454
 
1455
      if (sec != NULL && elf_discarded_section (sec))
1456
        {
1457
          /* For relocs against symbols from removed linkonce sections,
1458
             or sections discarded by a linker script, we just want the
1459
             section contents zeroed.  Avoid any special processing.  */
1460
          _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
1461
          rel->r_info = 0;
1462
          rel->r_addend = 0;
1463
          continue;
1464
        }
1465
 
1466
      if (info->relocatable)
1467
        continue;
1468
 
1469
      switch (r_type)
1470
        {
1471
        case R_VAX_GOT32:
1472
          /* Relocation is to the address of the entry for this symbol
1473
             in the global offset table.  */
1474
          if (h == NULL
1475
              || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1476
              || h->got.offset == (bfd_vma) -1
1477
              || h->forced_local)
1478
            break;
1479
 
1480
          /* Relocation is the offset of the entry for this symbol in
1481
             the global offset table.  */
1482
 
1483
          {
1484
            bfd_boolean dyn;
1485
            bfd_vma off;
1486
 
1487
            if (sgot == NULL)
1488
              {
1489
                sgot = bfd_get_section_by_name (dynobj, ".got");
1490
                BFD_ASSERT (sgot != NULL);
1491
              }
1492
 
1493
            BFD_ASSERT (h != NULL);
1494
            off = h->got.offset;
1495
            BFD_ASSERT (off != (bfd_vma) -1);
1496
            BFD_ASSERT (off < sgot->size);
1497
 
1498
            dyn = elf_hash_table (info)->dynamic_sections_created;
1499
            if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
1500
                || (info->shared
1501
                    && SYMBOL_REFERENCES_LOCAL (info, h)))
1502
              {
1503
                /* The symbol was forced to be local
1504
                   because of a version file..  We must initialize
1505
                   this entry in the global offset table.  Since
1506
                   the offset must always be a multiple of 4, we
1507
                   use the least significant bit to record whether
1508
                   we have initialized it already.
1509
 
1510
                   When doing a dynamic link, we create a .rela.got
1511
                   relocation entry to initialize the value.  This
1512
                   is done in the finish_dynamic_symbol routine.  */
1513
                if ((off & 1) != 0)
1514
                  off &= ~1;
1515
                else
1516
                  {
1517
                    bfd_put_32 (output_bfd, relocation + rel->r_addend,
1518
                                sgot->contents + off);
1519
                    h->got.offset |= 1;
1520
                  }
1521
              } else {
1522
                bfd_put_32 (output_bfd, rel->r_addend, sgot->contents + off);
1523
              }
1524
 
1525
            relocation = sgot->output_offset + off;
1526
            /* The GOT relocation uses the addend.  */
1527
            rel->r_addend = 0;
1528
 
1529
            /* Change the reference to be indirect.  */
1530
            contents[rel->r_offset - 1] |= 0x10;
1531
            relocation += sgot->output_section->vma;
1532
          }
1533
          break;
1534
 
1535
        case R_VAX_PC32:
1536
          /* If we are creating an executable and the function this
1537
             reloc refers to is in a shared lib, then we made a PLT
1538
             entry for this symbol and need to handle the reloc like
1539
             a PLT reloc.  */
1540
          if (info->shared)
1541
             goto r_vax_pc32_shared;
1542
          /* Fall through.  */
1543
        case R_VAX_PLT32:
1544
          /* Relocation is to the entry for this symbol in the
1545
             procedure linkage table.  */
1546
 
1547
          /* Resolve a PLTxx reloc against a local symbol directly,
1548
             without using the procedure linkage table.  */
1549
          if (h == NULL
1550
              || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1551
              || h->forced_local)
1552
            break;
1553
 
1554
          if (h->plt.offset == (bfd_vma) -1
1555
              || !elf_hash_table (info)->dynamic_sections_created)
1556
            {
1557
              /* We didn't make a PLT entry for this symbol.  This
1558
                 happens when statically linking PIC code, or when
1559
                 using -Bsymbolic.  */
1560
              break;
1561
            }
1562
 
1563
          if (splt == NULL)
1564
            {
1565
              splt = bfd_get_section_by_name (dynobj, ".plt");
1566
              BFD_ASSERT (splt != NULL);
1567
            }
1568
 
1569
          if (sgotplt == NULL)
1570
            {
1571
              sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1572
              BFD_ASSERT (sgotplt != NULL);
1573
            }
1574
 
1575
          plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1576
 
1577
          /* Get the offset into the .got table of the entry that
1578
             corresponds to this function.  Each .got entry is 4 bytes.
1579
             The first two are reserved.  */
1580
          got_offset = (plt_index + 3) * 4;
1581
 
1582
          /* We want the relocation to point into the .got.plt instead
1583
             of the plt itself.  */
1584
          relocation = (sgotplt->output_section->vma
1585
                        + sgotplt->output_offset
1586
                        + got_offset);
1587
          contents[rel->r_offset-1] |= 0x10; /* make indirect */
1588
          if (rel->r_addend == 2)
1589
            {
1590
              h->plt.offset |= 1;
1591
            }
1592
          else if (rel->r_addend != 0)
1593
            (*_bfd_error_handler)
1594
              (_("%s: warning: PLT addend of %d to `%s' from %s section ignored"),
1595
                      bfd_get_filename (input_bfd), rel->r_addend,
1596
                      h->root.root.string,
1597
                      bfd_get_section_name (input_bfd, input_section));
1598
          rel->r_addend = 0;
1599
 
1600
          break;
1601
 
1602
        case R_VAX_PC8:
1603
        case R_VAX_PC16:
1604
        r_vax_pc32_shared:
1605
          if (h == NULL
1606
              || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1607
              || h->forced_local)
1608
            break;
1609
          /* Fall through.  */
1610
        case R_VAX_8:
1611
        case R_VAX_16:
1612
        case R_VAX_32:
1613
          if (info->shared
1614
              && r_symndx != 0
1615
              && (input_section->flags & SEC_ALLOC) != 0
1616
              && ((r_type != R_VAX_PC8
1617
                   && r_type != R_VAX_PC16
1618
                   && r_type != R_VAX_PC32)
1619
                  || ((input_section->flags & SEC_CODE)
1620
                      && (!info->symbolic
1621
                          || (!h->def_regular && h->type != STT_SECTION)))))
1622
            {
1623
              Elf_Internal_Rela outrel;
1624
              bfd_byte *loc;
1625
              bfd_boolean skip, relocate;
1626
 
1627
              /* When generating a shared object, these relocations
1628
                 are copied into the output file to be resolved at run
1629
                 time.  */
1630
              if (sreloc == NULL)
1631
                {
1632
                  sreloc = _bfd_elf_get_dynamic_reloc_section
1633
                    (input_bfd, input_section, /*rela?*/ TRUE);
1634
                  if (sreloc == NULL)
1635
                    return FALSE;
1636
                }
1637
 
1638
              skip = FALSE;
1639
              relocate = FALSE;
1640
 
1641
              outrel.r_offset =
1642
                _bfd_elf_section_offset (output_bfd, info, input_section,
1643
                                         rel->r_offset);
1644
              if (outrel.r_offset == (bfd_vma) -1)
1645
                skip = TRUE;
1646
              if (outrel.r_offset == (bfd_vma) -2)
1647
                skip = TRUE, relocate = TRUE;
1648
              outrel.r_offset += (input_section->output_section->vma
1649
                                  + input_section->output_offset);
1650
 
1651
              if (skip)
1652
                  memset (&outrel, 0, sizeof outrel);
1653
              /* h->dynindx may be -1 if the symbol was marked to
1654
                 become local.  */
1655
              else if (h != NULL
1656
                       && ((! info->symbolic && h->dynindx != -1)
1657
                           || !h->def_regular))
1658
                {
1659
                  BFD_ASSERT (h->dynindx != -1);
1660
                  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1661
                  outrel.r_addend = relocation + rel->r_addend;
1662
                }
1663
              else
1664
                {
1665
                  if (r_type == R_VAX_32)
1666
                    {
1667
                      relocate = TRUE;
1668
                      outrel.r_info = ELF32_R_INFO (0, R_VAX_RELATIVE);
1669
                      BFD_ASSERT (bfd_get_signed_32 (input_bfd,
1670
                                                     &contents[rel->r_offset]) == 0);
1671
                      outrel.r_addend = relocation + rel->r_addend;
1672
                    }
1673
                  else
1674
                    {
1675
                      long indx;
1676
 
1677
                      if (bfd_is_abs_section (sec))
1678
                        indx = 0;
1679
                      else if (sec == NULL || sec->owner == NULL)
1680
                        {
1681
                          bfd_set_error (bfd_error_bad_value);
1682
                          return FALSE;
1683
                        }
1684
                      else
1685
                        {
1686
                          asection *osec;
1687
 
1688
                          /* We are turning this relocation into one
1689
                             against a section symbol.  It would be
1690
                             proper to subtract the symbol's value,
1691
                             osec->vma, from the emitted reloc addend,
1692
                             but ld.so expects buggy relocs.  */
1693
                          osec = sec->output_section;
1694
                          indx = elf_section_data (osec)->dynindx;
1695
                          if (indx == 0)
1696
                            {
1697
                              struct elf_link_hash_table *htab;
1698
                              htab = elf_hash_table (info);
1699
                              osec = htab->text_index_section;
1700
                              indx = elf_section_data (osec)->dynindx;
1701
                            }
1702
                          BFD_ASSERT (indx != 0);
1703
                        }
1704
 
1705
                      outrel.r_info = ELF32_R_INFO (indx, r_type);
1706
                      outrel.r_addend = relocation + rel->r_addend;
1707
                    }
1708
                }
1709
 
1710
              if (!strcmp (bfd_get_section_name (input_bfd, input_section),
1711
                           ".text") != 0 ||
1712
                  (info->shared
1713
                   && ELF32_R_TYPE(outrel.r_info) != R_VAX_32
1714
                   && ELF32_R_TYPE(outrel.r_info) != R_VAX_RELATIVE
1715
                   && ELF32_R_TYPE(outrel.r_info) != R_VAX_COPY
1716
                   && ELF32_R_TYPE(outrel.r_info) != R_VAX_JMP_SLOT
1717
                   && ELF32_R_TYPE(outrel.r_info) != R_VAX_GLOB_DAT))
1718
                {
1719
                  if (h != NULL)
1720
                    (*_bfd_error_handler)
1721
                      (_("%s: warning: %s relocation against symbol `%s' from %s section"),
1722
                      bfd_get_filename (input_bfd), howto->name,
1723
                      h->root.root.string,
1724
                      bfd_get_section_name (input_bfd, input_section));
1725
                  else
1726
                    (*_bfd_error_handler)
1727
                      (_("%s: warning: %s relocation to 0x%x from %s section"),
1728
                      bfd_get_filename (input_bfd), howto->name,
1729
                      outrel.r_addend,
1730
                      bfd_get_section_name (input_bfd, input_section));
1731
                }
1732
              loc = sreloc->contents;
1733
              loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
1734
              bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1735
 
1736
              /* This reloc will be computed at runtime, so there's no
1737
                 need to do anything now, except for R_VAX_32
1738
                 relocations that have been turned into
1739
                 R_VAX_RELATIVE.  */
1740
              if (!relocate)
1741
                continue;
1742
            }
1743
 
1744
          break;
1745
 
1746
        case R_VAX_GNU_VTINHERIT:
1747
        case R_VAX_GNU_VTENTRY:
1748
          /* These are no-ops in the end.  */
1749
          continue;
1750
 
1751
        default:
1752
          break;
1753
        }
1754
 
1755
      /* VAX PCREL relocations are from the end of relocation, not the start.
1756
         So subtract the difference from the relocation amount since we can't
1757
         add it to the offset.  */
1758
      if (howto->pc_relative && howto->pcrel_offset)
1759
        relocation -= bfd_get_reloc_size(howto);
1760
 
1761
      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1762
                                    contents, rel->r_offset,
1763
                                    relocation, rel->r_addend);
1764
 
1765
      if (r != bfd_reloc_ok)
1766
        {
1767
          switch (r)
1768
            {
1769
            default:
1770
            case bfd_reloc_outofrange:
1771
              abort ();
1772
            case bfd_reloc_overflow:
1773
              {
1774
                const char *name;
1775
 
1776
                if (h != NULL)
1777
                  name = NULL;
1778
                else
1779
                  {
1780
                    name = bfd_elf_string_from_elf_section (input_bfd,
1781
                                                            symtab_hdr->sh_link,
1782
                                                            sym->st_name);
1783
                    if (name == NULL)
1784
                      return FALSE;
1785
                    if (*name == '\0')
1786
                      name = bfd_section_name (input_bfd, sec);
1787
                  }
1788
                if (!(info->callbacks->reloc_overflow
1789
                      (info, (h ? &h->root : NULL), name, howto->name,
1790
                       (bfd_vma) 0, input_bfd, input_section,
1791
                       rel->r_offset)))
1792
                  return FALSE;
1793
              }
1794
              break;
1795
            }
1796
        }
1797
    }
1798
 
1799
  return TRUE;
1800
}
1801
 
1802
/* Finish up dynamic symbol handling.  We set the contents of various
1803
   dynamic sections here.  */
1804
 
1805
static bfd_boolean
1806
elf_vax_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
1807
                               struct elf_link_hash_entry *h,
1808
                               Elf_Internal_Sym *sym)
1809
{
1810
  bfd *dynobj;
1811
 
1812
  dynobj = elf_hash_table (info)->dynobj;
1813
 
1814
  if (h->plt.offset != (bfd_vma) -1)
1815
    {
1816
      asection *splt;
1817
      asection *sgot;
1818
      asection *srela;
1819
      bfd_vma plt_index;
1820
      bfd_vma got_offset;
1821
      bfd_vma addend;
1822
      Elf_Internal_Rela rela;
1823
      bfd_byte *loc;
1824
 
1825
      /* This symbol has an entry in the procedure linkage table.  Set
1826
         it up.  */
1827
      BFD_ASSERT (h->dynindx != -1);
1828
 
1829
      splt = bfd_get_section_by_name (dynobj, ".plt");
1830
      sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1831
      srela = bfd_get_section_by_name (dynobj, ".rela.plt");
1832
      BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
1833
 
1834
      addend = 2 * (h->plt.offset & 1);
1835
      h->plt.offset &= ~1;
1836
 
1837
      /* Get the index in the procedure linkage table which
1838
         corresponds to this symbol.  This is the index of this symbol
1839
         in all the symbols for which we are making plt entries.  The
1840
         first entry in the procedure linkage table is reserved.  */
1841
      plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1842
 
1843
      /* Get the offset into the .got table of the entry that
1844
         corresponds to this function.  Each .got entry is 4 bytes.
1845
         The first two are reserved.  */
1846
      got_offset = (plt_index + 3) * 4;
1847
 
1848
      /* Fill in the entry in the procedure linkage table.  */
1849
      memcpy (splt->contents + h->plt.offset, elf_vax_plt_entry,
1850
                  PLT_ENTRY_SIZE);
1851
 
1852
      /* The offset is relative to the first extension word.  */
1853
      bfd_put_32 (output_bfd,
1854
                  -(h->plt.offset + 8),
1855
                  splt->contents + h->plt.offset + 4);
1856
 
1857
      bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
1858
                  splt->contents + h->plt.offset + 8);
1859
 
1860
      /* Fill in the entry in the global offset table.  */
1861
      bfd_put_32 (output_bfd,
1862
                  (splt->output_section->vma
1863
                   + splt->output_offset
1864
                   + h->plt.offset) + addend,
1865
                  sgot->contents + got_offset);
1866
 
1867
      /* Fill in the entry in the .rela.plt section.  */
1868
      rela.r_offset = (sgot->output_section->vma
1869
                       + sgot->output_offset
1870
                       + got_offset);
1871
      rela.r_info = ELF32_R_INFO (h->dynindx, R_VAX_JMP_SLOT);
1872
      rela.r_addend = addend;
1873
      loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
1874
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1875
 
1876
      if (!h->def_regular)
1877
        {
1878
          /* Mark the symbol as undefined, rather than as defined in
1879
             the .plt section.  Leave the value alone.  */
1880
          sym->st_shndx = SHN_UNDEF;
1881
        }
1882
    }
1883
 
1884
  if (h->got.offset != (bfd_vma) -1)
1885
    {
1886
      asection *sgot;
1887
      asection *srela;
1888
      Elf_Internal_Rela rela;
1889
      bfd_byte *loc;
1890
 
1891
      /* This symbol has an entry in the global offset table.  Set it
1892
         up.  */
1893
      sgot = bfd_get_section_by_name (dynobj, ".got");
1894
      srela = bfd_get_section_by_name (dynobj, ".rela.got");
1895
      BFD_ASSERT (sgot != NULL && srela != NULL);
1896
 
1897
      rela.r_offset = (sgot->output_section->vma
1898
                       + sgot->output_offset
1899
                       + (h->got.offset &~ 1));
1900
 
1901
      /* If the symbol was forced to be local because of a version file
1902
         locally we just want to emit a RELATIVE reloc.  The entry in
1903
         the global offset table will already have been initialized in
1904
         the relocate_section function.  */
1905
      if (info->shared
1906
          && h->dynindx == -1
1907
          && h->def_regular)
1908
        {
1909
          rela.r_info = ELF32_R_INFO (0, R_VAX_RELATIVE);
1910
        }
1911
      else
1912
        {
1913
          rela.r_info = ELF32_R_INFO (h->dynindx, R_VAX_GLOB_DAT);
1914
        }
1915
      rela.r_addend = bfd_get_signed_32 (output_bfd,
1916
                                         (sgot->contents
1917
                                          + (h->got.offset & ~1)));
1918
 
1919
      loc = srela->contents;
1920
      loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
1921
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1922
    }
1923
 
1924
  if (h->needs_copy)
1925
    {
1926
      asection *s;
1927
      Elf_Internal_Rela rela;
1928
      bfd_byte *loc;
1929
 
1930
      /* This symbol needs a copy reloc.  Set it up.  */
1931
      BFD_ASSERT (h->dynindx != -1
1932
                  && (h->root.type == bfd_link_hash_defined
1933
                      || h->root.type == bfd_link_hash_defweak));
1934
 
1935
      s = bfd_get_section_by_name (h->root.u.def.section->owner,
1936
                                   ".rela.bss");
1937
      BFD_ASSERT (s != NULL);
1938
 
1939
      rela.r_offset = (h->root.u.def.value
1940
                       + h->root.u.def.section->output_section->vma
1941
                       + h->root.u.def.section->output_offset);
1942
      rela.r_info = ELF32_R_INFO (h->dynindx, R_VAX_COPY);
1943
      rela.r_addend = 0;
1944
      loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
1945
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1946
    }
1947
 
1948
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
1949
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
1950
      || h == elf_hash_table (info)->hgot)
1951
    sym->st_shndx = SHN_ABS;
1952
 
1953
  return TRUE;
1954
}
1955
 
1956
/* Finish up the dynamic sections.  */
1957
 
1958
static bfd_boolean
1959
elf_vax_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1960
{
1961
  bfd *dynobj;
1962
  asection *sgot;
1963
  asection *sdyn;
1964
 
1965
  dynobj = elf_hash_table (info)->dynobj;
1966
 
1967
  sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1968
  BFD_ASSERT (sgot != NULL);
1969
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1970
 
1971
  if (elf_hash_table (info)->dynamic_sections_created)
1972
    {
1973
      asection *splt;
1974
      Elf32_External_Dyn *dyncon, *dynconend;
1975
 
1976
      splt = bfd_get_section_by_name (dynobj, ".plt");
1977
      BFD_ASSERT (splt != NULL && sdyn != NULL);
1978
 
1979
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
1980
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
1981
      for (; dyncon < dynconend; dyncon++)
1982
        {
1983
          Elf_Internal_Dyn dyn;
1984
          const char *name;
1985
          asection *s;
1986
 
1987
          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1988
 
1989
          switch (dyn.d_tag)
1990
            {
1991
            default:
1992
              break;
1993
 
1994
            case DT_PLTGOT:
1995
              name = ".got";
1996
              goto get_vma;
1997
            case DT_JMPREL:
1998
              name = ".rela.plt";
1999
            get_vma:
2000
              s = bfd_get_section_by_name (output_bfd, name);
2001
              BFD_ASSERT (s != NULL);
2002
              dyn.d_un.d_ptr = s->vma;
2003
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2004
              break;
2005
 
2006
            case DT_PLTRELSZ:
2007
              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2008
              BFD_ASSERT (s != NULL);
2009
              dyn.d_un.d_val = s->size;
2010
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2011
              break;
2012
 
2013
            case DT_RELASZ:
2014
              /* The procedure linkage table relocs (DT_JMPREL) should
2015
                 not be included in the overall relocs (DT_RELA).
2016
                 Therefore, we override the DT_RELASZ entry here to
2017
                 make it not include the JMPREL relocs.  Since the
2018
                 linker script arranges for .rela.plt to follow all
2019
                 other relocation sections, we don't have to worry
2020
                 about changing the DT_RELA entry.  */
2021
              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2022
              if (s != NULL)
2023
                dyn.d_un.d_val -= s->size;
2024
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2025
              break;
2026
            }
2027
        }
2028
 
2029
      /* Fill in the first entry in the procedure linkage table.  */
2030
      if (splt->size > 0)
2031
        {
2032
          memcpy (splt->contents, elf_vax_plt0_entry, PLT_ENTRY_SIZE);
2033
          bfd_put_32 (output_bfd,
2034
                          (sgot->output_section->vma
2035
                           + sgot->output_offset + 4
2036
                           - (splt->output_section->vma + 6)),
2037
                          splt->contents + 2);
2038
          bfd_put_32 (output_bfd,
2039
                          (sgot->output_section->vma
2040
                           + sgot->output_offset + 8
2041
                           - (splt->output_section->vma + 12)),
2042
                          splt->contents + 8);
2043
          elf_section_data (splt->output_section)->this_hdr.sh_entsize
2044
           = PLT_ENTRY_SIZE;
2045
        }
2046
    }
2047
 
2048
  /* Fill in the first three entries in the global offset table.  */
2049
  if (sgot->size > 0)
2050
    {
2051
      if (sdyn == NULL)
2052
        bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
2053
      else
2054
        bfd_put_32 (output_bfd,
2055
                    sdyn->output_section->vma + sdyn->output_offset,
2056
                    sgot->contents);
2057
      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
2058
      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
2059
    }
2060
 
2061
  elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
2062
 
2063
  return TRUE;
2064
}
2065
 
2066
static enum elf_reloc_type_class
2067
elf_vax_reloc_type_class (const Elf_Internal_Rela *rela)
2068
{
2069
  switch ((int) ELF32_R_TYPE (rela->r_info))
2070
    {
2071
    case R_VAX_RELATIVE:
2072
      return reloc_class_relative;
2073
    case R_VAX_JMP_SLOT:
2074
      return reloc_class_plt;
2075
    case R_VAX_COPY:
2076
      return reloc_class_copy;
2077
    default:
2078
      return reloc_class_normal;
2079
    }
2080
}
2081
 
2082
static bfd_vma
2083
elf_vax_plt_sym_val (bfd_vma i, const asection *plt,
2084
                     const arelent *rel ATTRIBUTE_UNUSED)
2085
{
2086
  return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
2087
}
2088
 
2089
#define TARGET_LITTLE_SYM               bfd_elf32_vax_vec
2090
#define TARGET_LITTLE_NAME              "elf32-vax"
2091
#define ELF_MACHINE_CODE                EM_VAX
2092
#define ELF_MAXPAGESIZE                 0x1000
2093
 
2094
#define elf_backend_create_dynamic_sections \
2095
                                        _bfd_elf_create_dynamic_sections
2096
#define bfd_elf32_bfd_link_hash_table_create \
2097
                                        elf_vax_link_hash_table_create
2098
#define bfd_elf32_bfd_final_link        bfd_elf_gc_common_final_link
2099
 
2100
#define elf_backend_check_relocs        elf_vax_check_relocs
2101
#define elf_backend_adjust_dynamic_symbol \
2102
                                        elf_vax_adjust_dynamic_symbol
2103
#define elf_backend_size_dynamic_sections \
2104
                                        elf_vax_size_dynamic_sections
2105
#define elf_backend_init_index_section  _bfd_elf_init_1_index_section
2106
#define elf_backend_relocate_section    elf_vax_relocate_section
2107
#define elf_backend_finish_dynamic_symbol \
2108
                                        elf_vax_finish_dynamic_symbol
2109
#define elf_backend_finish_dynamic_sections \
2110
                                        elf_vax_finish_dynamic_sections
2111
#define elf_backend_reloc_type_class    elf_vax_reloc_type_class
2112
#define elf_backend_gc_mark_hook        elf_vax_gc_mark_hook
2113
#define elf_backend_gc_sweep_hook       elf_vax_gc_sweep_hook
2114
#define elf_backend_plt_sym_val         elf_vax_plt_sym_val
2115
#define bfd_elf32_bfd_merge_private_bfd_data \
2116
                                        elf32_vax_merge_private_bfd_data
2117
#define bfd_elf32_bfd_set_private_flags \
2118
                                        elf32_vax_set_private_flags
2119
#define bfd_elf32_bfd_print_private_bfd_data \
2120
                                        elf32_vax_print_private_bfd_data
2121
 
2122
#define elf_backend_can_gc_sections     1
2123
#define elf_backend_want_got_plt        1
2124
#define elf_backend_plt_readonly        1
2125
#define elf_backend_want_plt_sym        0
2126
#define elf_backend_got_header_size     16
2127
#define elf_backend_rela_normal         1
2128
 
2129
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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