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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf32-vax.c] - Blame information for rev 146

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

Line No. Rev Author Line
1 14 khays
/* 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
        RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1457
                                         rel, relend, howto, contents);
1458
 
1459
      if (info->relocatable)
1460
        continue;
1461
 
1462
      switch (r_type)
1463
        {
1464
        case R_VAX_GOT32:
1465
          /* Relocation is to the address of the entry for this symbol
1466
             in the global offset table.  */
1467
          if (h == NULL
1468
              || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1469
              || h->got.offset == (bfd_vma) -1
1470
              || h->forced_local)
1471
            break;
1472
 
1473
          /* Relocation is the offset of the entry for this symbol in
1474
             the global offset table.  */
1475
 
1476
          {
1477
            bfd_boolean dyn;
1478
            bfd_vma off;
1479
 
1480
            if (sgot == NULL)
1481
              {
1482
                sgot = bfd_get_section_by_name (dynobj, ".got");
1483
                BFD_ASSERT (sgot != NULL);
1484
              }
1485
 
1486
            BFD_ASSERT (h != NULL);
1487
            off = h->got.offset;
1488
            BFD_ASSERT (off != (bfd_vma) -1);
1489
            BFD_ASSERT (off < sgot->size);
1490
 
1491
            dyn = elf_hash_table (info)->dynamic_sections_created;
1492
            if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
1493
                || (info->shared
1494
                    && SYMBOL_REFERENCES_LOCAL (info, h)))
1495
              {
1496
                /* The symbol was forced to be local
1497
                   because of a version file..  We must initialize
1498
                   this entry in the global offset table.  Since
1499
                   the offset must always be a multiple of 4, we
1500
                   use the least significant bit to record whether
1501
                   we have initialized it already.
1502
 
1503
                   When doing a dynamic link, we create a .rela.got
1504
                   relocation entry to initialize the value.  This
1505
                   is done in the finish_dynamic_symbol routine.  */
1506
                if ((off & 1) != 0)
1507
                  off &= ~1;
1508
                else
1509
                  {
1510
                    bfd_put_32 (output_bfd, relocation + rel->r_addend,
1511
                                sgot->contents + off);
1512
                    h->got.offset |= 1;
1513
                  }
1514
              } else {
1515
                bfd_put_32 (output_bfd, rel->r_addend, sgot->contents + off);
1516
              }
1517
 
1518
            relocation = sgot->output_offset + off;
1519
            /* The GOT relocation uses the addend.  */
1520
            rel->r_addend = 0;
1521
 
1522
            /* Change the reference to be indirect.  */
1523
            contents[rel->r_offset - 1] |= 0x10;
1524
            relocation += sgot->output_section->vma;
1525
          }
1526
          break;
1527
 
1528
        case R_VAX_PC32:
1529
          /* If we are creating an executable and the function this
1530
             reloc refers to is in a shared lib, then we made a PLT
1531
             entry for this symbol and need to handle the reloc like
1532
             a PLT reloc.  */
1533
          if (info->shared)
1534
             goto r_vax_pc32_shared;
1535
          /* Fall through.  */
1536
        case R_VAX_PLT32:
1537
          /* Relocation is to the entry for this symbol in the
1538
             procedure linkage table.  */
1539
 
1540
          /* Resolve a PLTxx reloc against a local symbol directly,
1541
             without using the procedure linkage table.  */
1542
          if (h == NULL
1543
              || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1544
              || h->forced_local)
1545
            break;
1546
 
1547
          if (h->plt.offset == (bfd_vma) -1
1548
              || !elf_hash_table (info)->dynamic_sections_created)
1549
            {
1550
              /* We didn't make a PLT entry for this symbol.  This
1551
                 happens when statically linking PIC code, or when
1552
                 using -Bsymbolic.  */
1553
              break;
1554
            }
1555
 
1556
          if (splt == NULL)
1557
            {
1558
              splt = bfd_get_section_by_name (dynobj, ".plt");
1559
              BFD_ASSERT (splt != NULL);
1560
            }
1561
 
1562
          if (sgotplt == NULL)
1563
            {
1564
              sgotplt = bfd_get_section_by_name (dynobj, ".got.plt");
1565
              BFD_ASSERT (sgotplt != NULL);
1566
            }
1567
 
1568
          plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1569
 
1570
          /* Get the offset into the .got table of the entry that
1571
             corresponds to this function.  Each .got entry is 4 bytes.
1572
             The first two are reserved.  */
1573
          got_offset = (plt_index + 3) * 4;
1574
 
1575
          /* We want the relocation to point into the .got.plt instead
1576
             of the plt itself.  */
1577
          relocation = (sgotplt->output_section->vma
1578
                        + sgotplt->output_offset
1579
                        + got_offset);
1580
          contents[rel->r_offset-1] |= 0x10; /* make indirect */
1581
          if (rel->r_addend == 2)
1582
            {
1583
              h->plt.offset |= 1;
1584
            }
1585
          else if (rel->r_addend != 0)
1586
            (*_bfd_error_handler)
1587
              (_("%s: warning: PLT addend of %d to `%s' from %s section ignored"),
1588
                      bfd_get_filename (input_bfd), rel->r_addend,
1589
                      h->root.root.string,
1590
                      bfd_get_section_name (input_bfd, input_section));
1591
          rel->r_addend = 0;
1592
 
1593
          break;
1594
 
1595
        case R_VAX_PC8:
1596
        case R_VAX_PC16:
1597
        r_vax_pc32_shared:
1598
          if (h == NULL
1599
              || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
1600
              || h->forced_local)
1601
            break;
1602
          /* Fall through.  */
1603
        case R_VAX_8:
1604
        case R_VAX_16:
1605
        case R_VAX_32:
1606
          if (info->shared
1607
              && r_symndx != STN_UNDEF
1608
              && (input_section->flags & SEC_ALLOC) != 0
1609
              && ((r_type != R_VAX_PC8
1610
                   && r_type != R_VAX_PC16
1611
                   && r_type != R_VAX_PC32)
1612
                  || ((input_section->flags & SEC_CODE)
1613
                      && (!info->symbolic
1614
                          || (!h->def_regular && h->type != STT_SECTION)))))
1615
            {
1616
              Elf_Internal_Rela outrel;
1617
              bfd_byte *loc;
1618
              bfd_boolean skip, relocate;
1619
 
1620
              /* When generating a shared object, these relocations
1621
                 are copied into the output file to be resolved at run
1622
                 time.  */
1623
              if (sreloc == NULL)
1624
                {
1625
                  sreloc = _bfd_elf_get_dynamic_reloc_section
1626
                    (input_bfd, input_section, /*rela?*/ TRUE);
1627
                  if (sreloc == NULL)
1628
                    return FALSE;
1629
                }
1630
 
1631
              skip = FALSE;
1632
              relocate = FALSE;
1633
 
1634
              outrel.r_offset =
1635
                _bfd_elf_section_offset (output_bfd, info, input_section,
1636
                                         rel->r_offset);
1637
              if (outrel.r_offset == (bfd_vma) -1)
1638
                skip = TRUE;
1639
              if (outrel.r_offset == (bfd_vma) -2)
1640
                skip = TRUE, relocate = TRUE;
1641
              outrel.r_offset += (input_section->output_section->vma
1642
                                  + input_section->output_offset);
1643
 
1644
              if (skip)
1645
                  memset (&outrel, 0, sizeof outrel);
1646
              /* h->dynindx may be -1 if the symbol was marked to
1647
                 become local.  */
1648
              else if (h != NULL
1649
                       && ((! info->symbolic && h->dynindx != -1)
1650
                           || !h->def_regular))
1651
                {
1652
                  BFD_ASSERT (h->dynindx != -1);
1653
                  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
1654
                  outrel.r_addend = relocation + rel->r_addend;
1655
                }
1656
              else
1657
                {
1658
                  if (r_type == R_VAX_32)
1659
                    {
1660
                      relocate = TRUE;
1661
                      outrel.r_info = ELF32_R_INFO (0, R_VAX_RELATIVE);
1662
                      BFD_ASSERT (bfd_get_signed_32 (input_bfd,
1663
                                                     &contents[rel->r_offset]) == 0);
1664
                      outrel.r_addend = relocation + rel->r_addend;
1665
                    }
1666
                  else
1667
                    {
1668
                      long indx;
1669
 
1670
                      if (bfd_is_abs_section (sec))
1671
                        indx = 0;
1672
                      else if (sec == NULL || sec->owner == NULL)
1673
                        {
1674
                          bfd_set_error (bfd_error_bad_value);
1675
                          return FALSE;
1676
                        }
1677
                      else
1678
                        {
1679
                          asection *osec;
1680
 
1681
                          /* We are turning this relocation into one
1682
                             against a section symbol.  It would be
1683
                             proper to subtract the symbol's value,
1684
                             osec->vma, from the emitted reloc addend,
1685
                             but ld.so expects buggy relocs.  */
1686
                          osec = sec->output_section;
1687
                          indx = elf_section_data (osec)->dynindx;
1688
                          if (indx == 0)
1689
                            {
1690
                              struct elf_link_hash_table *htab;
1691
                              htab = elf_hash_table (info);
1692
                              osec = htab->text_index_section;
1693
                              indx = elf_section_data (osec)->dynindx;
1694
                            }
1695
                          BFD_ASSERT (indx != 0);
1696
                        }
1697
 
1698
                      outrel.r_info = ELF32_R_INFO (indx, r_type);
1699
                      outrel.r_addend = relocation + rel->r_addend;
1700
                    }
1701
                }
1702
 
1703
              if (!strcmp (bfd_get_section_name (input_bfd, input_section),
1704
                           ".text") != 0 ||
1705
                  (info->shared
1706
                   && ELF32_R_TYPE(outrel.r_info) != R_VAX_32
1707
                   && ELF32_R_TYPE(outrel.r_info) != R_VAX_RELATIVE
1708
                   && ELF32_R_TYPE(outrel.r_info) != R_VAX_COPY
1709
                   && ELF32_R_TYPE(outrel.r_info) != R_VAX_JMP_SLOT
1710
                   && ELF32_R_TYPE(outrel.r_info) != R_VAX_GLOB_DAT))
1711
                {
1712
                  if (h != NULL)
1713
                    (*_bfd_error_handler)
1714
                      (_("%s: warning: %s relocation against symbol `%s' from %s section"),
1715
                      bfd_get_filename (input_bfd), howto->name,
1716
                      h->root.root.string,
1717
                      bfd_get_section_name (input_bfd, input_section));
1718
                  else
1719
                    (*_bfd_error_handler)
1720
                      (_("%s: warning: %s relocation to 0x%x from %s section"),
1721
                      bfd_get_filename (input_bfd), howto->name,
1722
                      outrel.r_addend,
1723
                      bfd_get_section_name (input_bfd, input_section));
1724
                }
1725
              loc = sreloc->contents;
1726
              loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
1727
              bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
1728
 
1729
              /* This reloc will be computed at runtime, so there's no
1730
                 need to do anything now, except for R_VAX_32
1731
                 relocations that have been turned into
1732
                 R_VAX_RELATIVE.  */
1733
              if (!relocate)
1734
                continue;
1735
            }
1736
 
1737
          break;
1738
 
1739
        case R_VAX_GNU_VTINHERIT:
1740
        case R_VAX_GNU_VTENTRY:
1741
          /* These are no-ops in the end.  */
1742
          continue;
1743
 
1744
        default:
1745
          break;
1746
        }
1747
 
1748
      /* VAX PCREL relocations are from the end of relocation, not the start.
1749
         So subtract the difference from the relocation amount since we can't
1750
         add it to the offset.  */
1751
      if (howto->pc_relative && howto->pcrel_offset)
1752
        relocation -= bfd_get_reloc_size(howto);
1753
 
1754
      r = _bfd_final_link_relocate (howto, input_bfd, input_section,
1755
                                    contents, rel->r_offset,
1756
                                    relocation, rel->r_addend);
1757
 
1758
      if (r != bfd_reloc_ok)
1759
        {
1760
          switch (r)
1761
            {
1762
            default:
1763
            case bfd_reloc_outofrange:
1764
              abort ();
1765
            case bfd_reloc_overflow:
1766
              {
1767
                const char *name;
1768
 
1769
                if (h != NULL)
1770
                  name = NULL;
1771
                else
1772
                  {
1773
                    name = bfd_elf_string_from_elf_section (input_bfd,
1774
                                                            symtab_hdr->sh_link,
1775
                                                            sym->st_name);
1776
                    if (name == NULL)
1777
                      return FALSE;
1778
                    if (*name == '\0')
1779
                      name = bfd_section_name (input_bfd, sec);
1780
                  }
1781
                if (!(info->callbacks->reloc_overflow
1782
                      (info, (h ? &h->root : NULL), name, howto->name,
1783
                       (bfd_vma) 0, input_bfd, input_section,
1784
                       rel->r_offset)))
1785
                  return FALSE;
1786
              }
1787
              break;
1788
            }
1789
        }
1790
    }
1791
 
1792
  return TRUE;
1793
}
1794
 
1795
/* Finish up dynamic symbol handling.  We set the contents of various
1796
   dynamic sections here.  */
1797
 
1798
static bfd_boolean
1799
elf_vax_finish_dynamic_symbol (bfd *output_bfd, struct bfd_link_info *info,
1800
                               struct elf_link_hash_entry *h,
1801
                               Elf_Internal_Sym *sym)
1802
{
1803
  bfd *dynobj;
1804
 
1805
  dynobj = elf_hash_table (info)->dynobj;
1806
 
1807
  if (h->plt.offset != (bfd_vma) -1)
1808
    {
1809
      asection *splt;
1810
      asection *sgot;
1811
      asection *srela;
1812
      bfd_vma plt_index;
1813
      bfd_vma got_offset;
1814
      bfd_vma addend;
1815
      Elf_Internal_Rela rela;
1816
      bfd_byte *loc;
1817
 
1818
      /* This symbol has an entry in the procedure linkage table.  Set
1819
         it up.  */
1820
      BFD_ASSERT (h->dynindx != -1);
1821
 
1822
      splt = bfd_get_section_by_name (dynobj, ".plt");
1823
      sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1824
      srela = bfd_get_section_by_name (dynobj, ".rela.plt");
1825
      BFD_ASSERT (splt != NULL && sgot != NULL && srela != NULL);
1826
 
1827
      addend = 2 * (h->plt.offset & 1);
1828
      h->plt.offset &= ~1;
1829
 
1830
      /* Get the index in the procedure linkage table which
1831
         corresponds to this symbol.  This is the index of this symbol
1832
         in all the symbols for which we are making plt entries.  The
1833
         first entry in the procedure linkage table is reserved.  */
1834
      plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1;
1835
 
1836
      /* Get the offset into the .got table of the entry that
1837
         corresponds to this function.  Each .got entry is 4 bytes.
1838
         The first two are reserved.  */
1839
      got_offset = (plt_index + 3) * 4;
1840
 
1841
      /* Fill in the entry in the procedure linkage table.  */
1842
      memcpy (splt->contents + h->plt.offset, elf_vax_plt_entry,
1843
                  PLT_ENTRY_SIZE);
1844
 
1845
      /* The offset is relative to the first extension word.  */
1846
      bfd_put_32 (output_bfd,
1847
                  -(h->plt.offset + 8),
1848
                  splt->contents + h->plt.offset + 4);
1849
 
1850
      bfd_put_32 (output_bfd, plt_index * sizeof (Elf32_External_Rela),
1851
                  splt->contents + h->plt.offset + 8);
1852
 
1853
      /* Fill in the entry in the global offset table.  */
1854
      bfd_put_32 (output_bfd,
1855
                  (splt->output_section->vma
1856
                   + splt->output_offset
1857
                   + h->plt.offset) + addend,
1858
                  sgot->contents + got_offset);
1859
 
1860
      /* Fill in the entry in the .rela.plt section.  */
1861
      rela.r_offset = (sgot->output_section->vma
1862
                       + sgot->output_offset
1863
                       + got_offset);
1864
      rela.r_info = ELF32_R_INFO (h->dynindx, R_VAX_JMP_SLOT);
1865
      rela.r_addend = addend;
1866
      loc = srela->contents + plt_index * sizeof (Elf32_External_Rela);
1867
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1868
 
1869
      if (!h->def_regular)
1870
        {
1871
          /* Mark the symbol as undefined, rather than as defined in
1872
             the .plt section.  Leave the value alone.  */
1873
          sym->st_shndx = SHN_UNDEF;
1874
        }
1875
    }
1876
 
1877
  if (h->got.offset != (bfd_vma) -1)
1878
    {
1879
      asection *sgot;
1880
      asection *srela;
1881
      Elf_Internal_Rela rela;
1882
      bfd_byte *loc;
1883
 
1884
      /* This symbol has an entry in the global offset table.  Set it
1885
         up.  */
1886
      sgot = bfd_get_section_by_name (dynobj, ".got");
1887
      srela = bfd_get_section_by_name (dynobj, ".rela.got");
1888
      BFD_ASSERT (sgot != NULL && srela != NULL);
1889
 
1890
      rela.r_offset = (sgot->output_section->vma
1891
                       + sgot->output_offset
1892
                       + (h->got.offset &~ 1));
1893
 
1894
      /* If the symbol was forced to be local because of a version file
1895
         locally we just want to emit a RELATIVE reloc.  The entry in
1896
         the global offset table will already have been initialized in
1897
         the relocate_section function.  */
1898
      if (info->shared
1899
          && h->dynindx == -1
1900
          && h->def_regular)
1901
        {
1902
          rela.r_info = ELF32_R_INFO (0, R_VAX_RELATIVE);
1903
        }
1904
      else
1905
        {
1906
          rela.r_info = ELF32_R_INFO (h->dynindx, R_VAX_GLOB_DAT);
1907
        }
1908
      rela.r_addend = bfd_get_signed_32 (output_bfd,
1909
                                         (sgot->contents
1910
                                          + (h->got.offset & ~1)));
1911
 
1912
      loc = srela->contents;
1913
      loc += srela->reloc_count++ * sizeof (Elf32_External_Rela);
1914
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1915
    }
1916
 
1917
  if (h->needs_copy)
1918
    {
1919
      asection *s;
1920
      Elf_Internal_Rela rela;
1921
      bfd_byte *loc;
1922
 
1923
      /* This symbol needs a copy reloc.  Set it up.  */
1924
      BFD_ASSERT (h->dynindx != -1
1925
                  && (h->root.type == bfd_link_hash_defined
1926
                      || h->root.type == bfd_link_hash_defweak));
1927
 
1928
      s = bfd_get_section_by_name (h->root.u.def.section->owner,
1929
                                   ".rela.bss");
1930
      BFD_ASSERT (s != NULL);
1931
 
1932
      rela.r_offset = (h->root.u.def.value
1933
                       + h->root.u.def.section->output_section->vma
1934
                       + h->root.u.def.section->output_offset);
1935
      rela.r_info = ELF32_R_INFO (h->dynindx, R_VAX_COPY);
1936
      rela.r_addend = 0;
1937
      loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
1938
      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
1939
    }
1940
 
1941
  /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute.  */
1942
  if (strcmp (h->root.root.string, "_DYNAMIC") == 0
1943
      || h == elf_hash_table (info)->hgot)
1944
    sym->st_shndx = SHN_ABS;
1945
 
1946
  return TRUE;
1947
}
1948
 
1949
/* Finish up the dynamic sections.  */
1950
 
1951
static bfd_boolean
1952
elf_vax_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
1953
{
1954
  bfd *dynobj;
1955
  asection *sgot;
1956
  asection *sdyn;
1957
 
1958
  dynobj = elf_hash_table (info)->dynobj;
1959
 
1960
  sgot = bfd_get_section_by_name (dynobj, ".got.plt");
1961
  BFD_ASSERT (sgot != NULL);
1962
  sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
1963
 
1964
  if (elf_hash_table (info)->dynamic_sections_created)
1965
    {
1966
      asection *splt;
1967
      Elf32_External_Dyn *dyncon, *dynconend;
1968
 
1969
      splt = bfd_get_section_by_name (dynobj, ".plt");
1970
      BFD_ASSERT (splt != NULL && sdyn != NULL);
1971
 
1972
      dyncon = (Elf32_External_Dyn *) sdyn->contents;
1973
      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
1974
      for (; dyncon < dynconend; dyncon++)
1975
        {
1976
          Elf_Internal_Dyn dyn;
1977
          const char *name;
1978
          asection *s;
1979
 
1980
          bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
1981
 
1982
          switch (dyn.d_tag)
1983
            {
1984
            default:
1985
              break;
1986
 
1987
            case DT_PLTGOT:
1988
              name = ".got";
1989
              goto get_vma;
1990
            case DT_JMPREL:
1991
              name = ".rela.plt";
1992
            get_vma:
1993
              s = bfd_get_section_by_name (output_bfd, name);
1994
              BFD_ASSERT (s != NULL);
1995
              dyn.d_un.d_ptr = s->vma;
1996
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
1997
              break;
1998
 
1999
            case DT_PLTRELSZ:
2000
              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2001
              BFD_ASSERT (s != NULL);
2002
              dyn.d_un.d_val = s->size;
2003
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2004
              break;
2005
 
2006
            case DT_RELASZ:
2007
              /* The procedure linkage table relocs (DT_JMPREL) should
2008
                 not be included in the overall relocs (DT_RELA).
2009
                 Therefore, we override the DT_RELASZ entry here to
2010
                 make it not include the JMPREL relocs.  Since the
2011
                 linker script arranges for .rela.plt to follow all
2012
                 other relocation sections, we don't have to worry
2013
                 about changing the DT_RELA entry.  */
2014
              s = bfd_get_section_by_name (output_bfd, ".rela.plt");
2015
              if (s != NULL)
2016
                dyn.d_un.d_val -= s->size;
2017
              bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
2018
              break;
2019
            }
2020
        }
2021
 
2022
      /* Fill in the first entry in the procedure linkage table.  */
2023
      if (splt->size > 0)
2024
        {
2025
          memcpy (splt->contents, elf_vax_plt0_entry, PLT_ENTRY_SIZE);
2026
          bfd_put_32 (output_bfd,
2027
                          (sgot->output_section->vma
2028
                           + sgot->output_offset + 4
2029
                           - (splt->output_section->vma + 6)),
2030
                          splt->contents + 2);
2031
          bfd_put_32 (output_bfd,
2032
                          (sgot->output_section->vma
2033
                           + sgot->output_offset + 8
2034
                           - (splt->output_section->vma + 12)),
2035
                          splt->contents + 8);
2036
          elf_section_data (splt->output_section)->this_hdr.sh_entsize
2037
           = PLT_ENTRY_SIZE;
2038
        }
2039
    }
2040
 
2041
  /* Fill in the first three entries in the global offset table.  */
2042
  if (sgot->size > 0)
2043
    {
2044
      if (sdyn == NULL)
2045
        bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents);
2046
      else
2047
        bfd_put_32 (output_bfd,
2048
                    sdyn->output_section->vma + sdyn->output_offset,
2049
                    sgot->contents);
2050
      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 4);
2051
      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + 8);
2052
    }
2053
 
2054
  elf_section_data (sgot->output_section)->this_hdr.sh_entsize = 4;
2055
 
2056
  return TRUE;
2057
}
2058
 
2059
static enum elf_reloc_type_class
2060
elf_vax_reloc_type_class (const Elf_Internal_Rela *rela)
2061
{
2062
  switch ((int) ELF32_R_TYPE (rela->r_info))
2063
    {
2064
    case R_VAX_RELATIVE:
2065
      return reloc_class_relative;
2066
    case R_VAX_JMP_SLOT:
2067
      return reloc_class_plt;
2068
    case R_VAX_COPY:
2069
      return reloc_class_copy;
2070
    default:
2071
      return reloc_class_normal;
2072
    }
2073
}
2074
 
2075
static bfd_vma
2076
elf_vax_plt_sym_val (bfd_vma i, const asection *plt,
2077
                     const arelent *rel ATTRIBUTE_UNUSED)
2078
{
2079
  return plt->vma + (i + 1) * PLT_ENTRY_SIZE;
2080
}
2081
 
2082
#define TARGET_LITTLE_SYM               bfd_elf32_vax_vec
2083
#define TARGET_LITTLE_NAME              "elf32-vax"
2084
#define ELF_MACHINE_CODE                EM_VAX
2085
#define ELF_MAXPAGESIZE                 0x1000
2086
 
2087
#define elf_backend_create_dynamic_sections \
2088
                                        _bfd_elf_create_dynamic_sections
2089
#define bfd_elf32_bfd_link_hash_table_create \
2090
                                        elf_vax_link_hash_table_create
2091
#define bfd_elf32_bfd_final_link        bfd_elf_gc_common_final_link
2092
 
2093
#define elf_backend_check_relocs        elf_vax_check_relocs
2094
#define elf_backend_adjust_dynamic_symbol \
2095
                                        elf_vax_adjust_dynamic_symbol
2096
#define elf_backend_size_dynamic_sections \
2097
                                        elf_vax_size_dynamic_sections
2098
#define elf_backend_init_index_section  _bfd_elf_init_1_index_section
2099
#define elf_backend_relocate_section    elf_vax_relocate_section
2100
#define elf_backend_finish_dynamic_symbol \
2101
                                        elf_vax_finish_dynamic_symbol
2102
#define elf_backend_finish_dynamic_sections \
2103
                                        elf_vax_finish_dynamic_sections
2104
#define elf_backend_reloc_type_class    elf_vax_reloc_type_class
2105
#define elf_backend_gc_mark_hook        elf_vax_gc_mark_hook
2106
#define elf_backend_gc_sweep_hook       elf_vax_gc_sweep_hook
2107
#define elf_backend_plt_sym_val         elf_vax_plt_sym_val
2108
#define bfd_elf32_bfd_merge_private_bfd_data \
2109
                                        elf32_vax_merge_private_bfd_data
2110
#define bfd_elf32_bfd_set_private_flags \
2111
                                        elf32_vax_set_private_flags
2112
#define bfd_elf32_bfd_print_private_bfd_data \
2113
                                        elf32_vax_print_private_bfd_data
2114
 
2115
#define elf_backend_can_gc_sections     1
2116
#define elf_backend_want_got_plt        1
2117
#define elf_backend_plt_readonly        1
2118
#define elf_backend_want_plt_sym        0
2119
#define elf_backend_got_header_size     16
2120
#define elf_backend_rela_normal         1
2121
 
2122
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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