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