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