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