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