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