xref: /netbsd-src/external/gpl3/binutils.old/dist/bfd/vms-alpha.c (revision cef8759bd76c1b621f8eab8faa6f208faabc2e15)
1 /* vms.c -- BFD back-end for EVAX (openVMS/Alpha) files.
2    Copyright (C) 1996-2018 Free Software Foundation, Inc.
3 
4    Initial version written by Klaus Kaempf (kkaempf@rmi.de)
5    Major rewrite by Adacore.
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 /* TODO:
23    o  overlayed sections
24    o  PIC
25    o  Generation of shared image
26    o  Relocation optimizations
27    o  EISD for the stack
28    o  Vectors isect
29    o  64 bits sections
30    o  Entry point
31    o  LIB$INITIALIZE
32    o  protected sections (for messages)
33    ...
34 */
35 
36 #include "sysdep.h"
37 #include "bfd.h"
38 #include "bfdlink.h"
39 #include "libbfd.h"
40 #include "bfdver.h"
41 
42 #include "vms.h"
43 #include "vms/eihd.h"
44 #include "vms/eiha.h"
45 #include "vms/eihi.h"
46 #include "vms/eihs.h"
47 #include "vms/eisd.h"
48 #include "vms/dmt.h"
49 #include "vms/dst.h"
50 #include "vms/eihvn.h"
51 #include "vms/eobjrec.h"
52 #include "vms/egsd.h"
53 #include "vms/egps.h"
54 #include "vms/esgps.h"
55 #include "vms/eeom.h"
56 #include "vms/emh.h"
57 #include "vms/eiaf.h"
58 #include "vms/shl.h"
59 #include "vms/eicp.h"
60 #include "vms/etir.h"
61 #include "vms/egsy.h"
62 #include "vms/esdf.h"
63 #include "vms/esdfm.h"
64 #include "vms/esdfv.h"
65 #include "vms/esrf.h"
66 #include "vms/egst.h"
67 #include "vms/eidc.h"
68 #include "vms/dsc.h"
69 #include "vms/prt.h"
70 #include "vms/internal.h"
71 
72 
73 #define MIN(a,b) ((a) < (b) ? (a) : (b))
74 
75 /* The r_type field in a reloc is one of the following values.  */
76 #define ALPHA_R_IGNORE		0
77 #define ALPHA_R_REFQUAD		1
78 #define ALPHA_R_BRADDR		2
79 #define ALPHA_R_HINT		3
80 #define ALPHA_R_SREL16		4
81 #define ALPHA_R_SREL32		5
82 #define ALPHA_R_SREL64		6
83 #define ALPHA_R_OP_PUSH		7
84 #define ALPHA_R_OP_STORE	8
85 #define ALPHA_R_OP_PSUB		9
86 #define ALPHA_R_OP_PRSHIFT	10
87 #define ALPHA_R_LINKAGE		11
88 #define ALPHA_R_REFLONG		12
89 #define ALPHA_R_CODEADDR	13
90 #define ALPHA_R_NOP		14
91 #define ALPHA_R_BSR		15
92 #define ALPHA_R_LDA		16
93 #define ALPHA_R_BOH		17
94 
95 /* These are used with DST_S_C_LINE_NUM.  */
96 #define DST_S_C_LINE_NUM_HEADER_SIZE 4
97 
98 /* These are used with DST_S_C_SOURCE */
99 
100 #define DST_S_B_PCLINE_UNSBYTE	 1
101 #define DST_S_W_PCLINE_UNSWORD	 1
102 #define DST_S_L_PCLINE_UNSLONG	 1
103 
104 #define DST_S_B_MODBEG_NAME	14
105 #define DST_S_L_RTNBEG_ADDRESS	 5
106 #define DST_S_B_RTNBEG_NAME	13
107 #define DST_S_L_RTNEND_SIZE	 5
108 
109 /* These are used with DST_S_C_SOURCE.  */
110 #define DST_S_C_SOURCE_HEADER_SIZE 4
111 
112 #define DST_S_B_SRC_DF_LENGTH	  1
113 #define DST_S_W_SRC_DF_FILEID	  3
114 #define DST_S_B_SRC_DF_FILENAME	 20
115 #define DST_S_B_SRC_UNSBYTE	  1
116 #define DST_S_W_SRC_UNSWORD	  1
117 #define DST_S_L_SRC_UNSLONG	  1
118 
119 /* Debugger symbol definitions.  */
120 
121 #define DBG_S_L_DMT_MODBEG	 0
122 #define DBG_S_L_DST_SIZE	 4
123 #define DBG_S_W_DMT_PSECT_COUNT	 8
124 #define DBG_S_C_DMT_HEADER_SIZE 12
125 
126 #define DBG_S_L_DMT_PSECT_START	 0
127 #define DBG_S_L_DMT_PSECT_LENGTH 4
128 #define DBG_S_C_DMT_PSECT_SIZE	 8
129 
130 /* VMS module header.  */
131 
132 struct hdr_struct
133 {
134   char hdr_b_strlvl;
135   int hdr_l_arch1;
136   int hdr_l_arch2;
137   int hdr_l_recsiz;
138   char *hdr_t_name;
139   char *hdr_t_version;
140   char *hdr_t_date;
141   char *hdr_c_lnm;
142   char *hdr_c_src;
143   char *hdr_c_ttl;
144 };
145 
146 #define EMH_DATE_LENGTH  17
147 
148 /* VMS End-Of-Module records (EOM/EEOM).  */
149 
150 struct eom_struct
151 {
152   unsigned int eom_l_total_lps;
153   unsigned short eom_w_comcod;
154   bfd_boolean eom_has_transfer;
155   unsigned char eom_b_tfrflg;
156   unsigned int eom_l_psindx;
157   unsigned int eom_l_tfradr;
158 };
159 
160 struct vms_symbol_entry
161 {
162   bfd *owner;
163 
164   /* Common fields.  */
165   unsigned char typ;
166   unsigned char data_type;
167   unsigned short flags;
168 
169   /* Section and offset/value of the symbol.  */
170   unsigned int value;
171   asection *section;
172 
173   /* Section and offset/value for the entry point (only for subprg).  */
174   asection *code_section;
175   unsigned int code_value;
176 
177   /* Symbol vector offset.  */
178   unsigned int symbol_vector;
179 
180   /* Length of the name.  */
181   unsigned char namelen;
182 
183   char name[1];
184 };
185 
186 /* Stack value for push/pop commands.  */
187 
188 struct stack_struct
189 {
190   bfd_vma value;
191   unsigned int reloc;
192 };
193 
194 #define STACKSIZE 128
195 
196 /* A minimal decoding of DST compilation units.  We only decode
197    what's needed to get to the line number information.  */
198 
199 struct fileinfo
200 {
201   char *name;
202   unsigned int srec;
203 };
204 
205 struct srecinfo
206 {
207   struct srecinfo *next;
208   unsigned int line;
209   unsigned int sfile;
210   unsigned int srec;
211 };
212 
213 struct lineinfo
214 {
215   struct lineinfo *next;
216   bfd_vma address;
217   unsigned int line;
218 };
219 
220 struct funcinfo
221 {
222   struct funcinfo *next;
223   char *name;
224   bfd_vma low;
225   bfd_vma high;
226 };
227 
228 struct module
229 {
230   /* Chain the previously read compilation unit.  */
231   struct module *next;
232 
233   /* The module name.  */
234   char *name;
235 
236   /* The start offset and size of debug info in the DST section.  */
237   unsigned int modbeg;
238   unsigned int size;
239 
240   /* The lowest and highest addresses contained in this compilation
241      unit as specified in the compilation unit header.  */
242   bfd_vma low;
243   bfd_vma high;
244 
245   /* The listing line table.  */
246   struct lineinfo *line_table;
247 
248   /* The source record table.  */
249   struct srecinfo *srec_table;
250 
251   /* A list of the functions found in this module.  */
252   struct funcinfo *func_table;
253 
254   /* Current allocation of file_table.  */
255   unsigned int file_table_count;
256 
257   /* An array of the files making up this module.  */
258   struct fileinfo *file_table;
259 };
260 
261 /* BFD private data for alpha-vms.  */
262 
263 struct vms_private_data_struct
264 {
265   /* If true, relocs have been read.  */
266   bfd_boolean reloc_done;
267 
268   /* Record input buffer.  */
269   struct vms_rec_rd recrd;
270   struct vms_rec_wr recwr;
271 
272   struct hdr_struct hdr_data;		/* data from HDR/EMH record  */
273   struct eom_struct eom_data;		/* data from EOM/EEOM record  */
274 
275   /* Transfer addresses (entry points).  */
276   bfd_vma transfer_address[4];
277 
278   /* Array of GSD sections to get the correspond BFD one.  */
279   unsigned int section_max;		/* Size of the sections array.  */
280   unsigned int section_count;		/* Number of GSD sections.  */
281   asection **sections;
282 
283   /* Array of raw symbols.  */
284   struct vms_symbol_entry **syms;
285 
286   /* Canonicalized symbols.  */
287   asymbol **csymbols;
288 
289   /* Number of symbols.  */
290   unsigned int gsd_sym_count;
291   /* Size of the syms array.  */
292   unsigned int max_sym_count;
293   /* Number of procedure symbols.  */
294   unsigned int norm_sym_count;
295 
296   /* Stack used to evaluate TIR/ETIR commands.  */
297   struct stack_struct *stack;
298   int stackptr;
299 
300   /* Content reading.  */
301   asection *image_section;		/* section for image_ptr  */
302   file_ptr image_offset;		/* Offset for image_ptr.  */
303 
304   struct module *modules;		/* list of all compilation units */
305 
306   /* The DST section.  */
307   asection *dst_section;
308 
309   unsigned int dst_ptr_offsets_count;	/* # of offsets in following array  */
310   unsigned int *dst_ptr_offsets;	/* array of saved image_ptr offsets */
311 
312   /* Shared library support */
313   bfd_vma symvva; /* relative virtual address of symbol vector */
314   unsigned int ident;
315   unsigned char matchctl;
316 
317   /* Shared library index.  This is used for input bfd while linking.  */
318   unsigned int shr_index;
319 
320   /* Used to place structures in the file.  */
321   file_ptr file_pos;
322 
323   /* Simply linked list of eisd.  */
324   struct vms_internal_eisd_map *eisd_head;
325   struct vms_internal_eisd_map *eisd_tail;
326 
327   /* Simply linked list of eisd for shared libraries.  */
328   struct vms_internal_eisd_map *gbl_eisd_head;
329   struct vms_internal_eisd_map *gbl_eisd_tail;
330 
331   /* linkage index counter used by conditional store commands */
332   unsigned int vms_linkage_index;
333 };
334 
335 #define PRIV2(abfd, name) \
336   (((struct vms_private_data_struct *)(abfd)->tdata.any)->name)
337 #define PRIV(name) PRIV2(abfd,name)
338 
339 
340 /* Used to keep extra VMS specific information for a given section.
341 
342    reloc_size holds the size of the relocation stream, note this
343    is very different from the number of relocations as VMS relocations
344    are variable length.
345 
346    reloc_stream is the actual stream of relocation entries.  */
347 
348 struct vms_section_data_struct
349 {
350   /* Maximnum number of entries in sec->relocation.  */
351   unsigned reloc_max;
352 
353   /* Corresponding eisd.  Used only while generating executables.  */
354   struct vms_internal_eisd_map *eisd;
355 
356   /* PSC flags to be clear.  */
357   flagword no_flags;
358 
359   /* PSC flags to be set.  */
360   flagword flags;
361 };
362 
363 #define vms_section_data(sec) \
364   ((struct vms_section_data_struct *)sec->used_by_bfd)
365 
366 /* To be called from the debugger.  */
367 struct vms_private_data_struct *bfd_vms_get_data (bfd *);
368 
369 static int vms_get_remaining_object_record (bfd *, unsigned int);
370 static bfd_boolean _bfd_vms_slurp_object_records (bfd * abfd);
371 static void alpha_vms_add_fixup_lp (struct bfd_link_info *, bfd *, bfd *);
372 static void alpha_vms_add_fixup_ca (struct bfd_link_info *, bfd *, bfd *);
373 static void alpha_vms_add_fixup_qr (struct bfd_link_info *, bfd *, bfd *,
374 				    bfd_vma);
375 static void alpha_vms_add_fixup_lr (struct bfd_link_info *, unsigned int,
376 				    bfd_vma);
377 static void alpha_vms_add_lw_reloc (struct bfd_link_info *);
378 static void alpha_vms_add_qw_reloc (struct bfd_link_info *);
379 
380 struct vector_type
381 {
382   unsigned int max_el;
383   unsigned int nbr_el;
384   void *els;
385 };
386 
387 /* Number of elements in VEC.  */
388 
389 #define VEC_COUNT(VEC) ((VEC).nbr_el)
390 
391 /* Get the address of the Nth element.  */
392 
393 #define VEC_EL(VEC, TYPE, N) (((TYPE *)((VEC).els))[N])
394 
395 #define VEC_INIT(VEC)				\
396   do {						\
397     (VEC).max_el = 0;				\
398     (VEC).nbr_el = 0;				\
399     (VEC).els = NULL;				\
400   } while (0)
401 
402 /* Be sure there is room for a new element.  */
403 
404 static void vector_grow1 (struct vector_type *vec, size_t elsz);
405 
406 /* Allocate room for a new element and return its address.  */
407 
408 #define VEC_APPEND(VEC, TYPE)					\
409   (vector_grow1 (&VEC, sizeof (TYPE)), &VEC_EL(VEC, TYPE, (VEC).nbr_el++))
410 
411 /* Append an element.  */
412 
413 #define VEC_APPEND_EL(VEC, TYPE, EL)		\
414   (*(VEC_APPEND (VEC, TYPE)) = EL)
415 
416 struct alpha_vms_vma_ref
417 {
418   bfd_vma vma;	/* Vma in the output.  */
419   bfd_vma ref;	/* Reference in the input.  */
420 };
421 
422 struct alpha_vms_shlib_el
423 {
424   bfd *abfd;
425   bfd_boolean has_fixups;
426 
427   struct vector_type lp;	/* Vector of bfd_vma.  */
428   struct vector_type ca;	/* Vector of bfd_vma.  */
429   struct vector_type qr;	/* Vector of struct alpha_vms_vma_ref.  */
430 };
431 
432 /* Alpha VMS linker hash table.  */
433 
434 struct alpha_vms_link_hash_table
435 {
436   struct bfd_link_hash_table root;
437 
438   /* Vector of shared libraries.  */
439   struct vector_type shrlibs;
440 
441   /* Fixup section.  */
442   asection *fixup;
443 
444   /* Base address.  Used by fixups.  */
445   bfd_vma base_addr;
446 };
447 
448 #define alpha_vms_link_hash(INFO) \
449   ((struct alpha_vms_link_hash_table *)(INFO->hash))
450 
451 /* Alpha VMS linker hash table entry.  */
452 
453 struct alpha_vms_link_hash_entry
454 {
455   struct bfd_link_hash_entry root;
456 
457   /* Pointer to the original vms symbol.  */
458   struct vms_symbol_entry *sym;
459 };
460 
461 /* Image reading.  */
462 
463 /* Read & process EIHD record.
464    Return TRUE on success, FALSE on error.  */
465 
466 static bfd_boolean
467 _bfd_vms_slurp_eihd (bfd *abfd, unsigned int *eisd_offset,
468 		     unsigned int *eihs_offset)
469 {
470   unsigned int imgtype, size;
471   bfd_vma symvva;
472   struct vms_eihd *eihd = (struct vms_eihd *)PRIV (recrd.rec);
473 
474   vms_debug2 ((8, "_bfd_vms_slurp_eihd\n"));
475 
476   /* PR 21813: Check for an undersized record.  */
477   if (PRIV (recrd.buf_size) < sizeof (* eihd))
478     {
479       _bfd_error_handler (_("corrupt EIHD record - size is too small"));
480       bfd_set_error (bfd_error_bad_value);
481       return FALSE;
482     }
483 
484   size = bfd_getl32 (eihd->size);
485   imgtype = bfd_getl32 (eihd->imgtype);
486 
487   if (imgtype == EIHD__K_EXE || imgtype == EIHD__K_LIM)
488     abfd->flags |= EXEC_P;
489 
490   symvva = bfd_getl64 (eihd->symvva);
491   if (symvva != 0)
492     {
493       PRIV (symvva) = symvva;
494       abfd->flags |= DYNAMIC;
495     }
496 
497   PRIV (ident) = bfd_getl32 (eihd->ident);
498   PRIV (matchctl) = eihd->matchctl;
499 
500   *eisd_offset = bfd_getl32 (eihd->isdoff);
501   *eihs_offset = bfd_getl32 (eihd->symdbgoff);
502 
503   vms_debug2 ((4, "EIHD size %d imgtype %d symvva 0x%lx eisd %d eihs %d\n",
504 	       size, imgtype, (unsigned long)symvva,
505 	       *eisd_offset, *eihs_offset));
506 
507   return TRUE;
508 }
509 
510 /* Read & process EISD record.
511    Return TRUE on success, FALSE on error.  */
512 
513 static bfd_boolean
514 _bfd_vms_slurp_eisd (bfd *abfd, unsigned int offset)
515 {
516   int section_count = 0;
517 
518   vms_debug2 ((8, "_bfd_vms_slurp_eisd\n"));
519 
520   while (1)
521     {
522       struct vms_eisd *eisd;
523       unsigned int rec_size;
524       unsigned int size;
525       bfd_uint64_t vaddr;
526       unsigned int flags;
527       unsigned int vbn;
528       char *name = NULL;
529       asection *section;
530       flagword bfd_flags;
531 
532       /* PR 17512: file: 3d9e9fe9.
533 	 12 is the offset of the eisdsize field from the start of the record (8)
534 	 plus the size of the eisdsize field (4).  */
535       if (offset >= PRIV (recrd.rec_size) - 12)
536 	return FALSE;
537       eisd = (struct vms_eisd *)(PRIV (recrd.rec) + offset);
538       rec_size = bfd_getl32 (eisd->eisdsize);
539       if (rec_size == 0)
540 	break;
541 
542       /* Skip to next block if pad.  */
543       if (rec_size == 0xffffffff)
544 	{
545 	  offset = (offset + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
546 	  continue;
547 	}
548 
549       /* Make sure that there is enough data present in the record.  */
550       /* FIXME: Should we use sizeof (struct vms_eisd) rather than just 32 here ?  */
551       if (rec_size < 32)
552 	return FALSE;
553       /* Make sure that the record is not too big either.  */
554       if (offset + rec_size >= PRIV (recrd.rec_size))
555 	return FALSE;
556 
557       offset += rec_size;
558 
559       size = bfd_getl32 (eisd->secsize);
560       vaddr = bfd_getl64 (eisd->virt_addr);
561       flags = bfd_getl32 (eisd->flags);
562       vbn = bfd_getl32 (eisd->vbn);
563 
564       vms_debug2 ((4, "EISD at 0x%x size 0x%x addr 0x%lx flags 0x%x blk %d\n",
565 		   offset, size, (unsigned long)vaddr, flags, vbn));
566 
567       /* VMS combines psects from .obj files into isects in the .exe.  This
568 	 process doesn't preserve enough information to reliably determine
569 	 what's in each section without examining the data.  This is
570 	 especially true of DWARF debug sections.  */
571       bfd_flags = SEC_ALLOC;
572       if (vbn != 0)
573 	bfd_flags |= SEC_HAS_CONTENTS | SEC_LOAD;
574 
575       if (flags & EISD__M_EXE)
576 	bfd_flags |= SEC_CODE;
577 
578       if (flags & EISD__M_NONSHRADR)
579 	bfd_flags |= SEC_DATA;
580 
581       if (!(flags & EISD__M_WRT))
582 	bfd_flags |= SEC_READONLY;
583 
584       if (flags & EISD__M_DZRO)
585 	bfd_flags |= SEC_DATA;
586 
587       if (flags & EISD__M_FIXUPVEC)
588 	bfd_flags |= SEC_DATA;
589 
590       if (flags & EISD__M_CRF)
591 	bfd_flags |= SEC_DATA;
592 
593       if (flags & EISD__M_GBL)
594 	{
595 	  if (rec_size < offsetof (struct vms_eisd, gblnam))
596 	    return FALSE;
597 	  else if (rec_size < sizeof (struct vms_eisd))
598 	    name = _bfd_vms_save_counted_string (eisd->gblnam,
599 						 rec_size - offsetof (struct vms_eisd, gblnam));
600 	  else
601 	    name = _bfd_vms_save_counted_string (eisd->gblnam, EISD__K_GBLNAMLEN);
602 	  bfd_flags |= SEC_COFF_SHARED_LIBRARY;
603 	  bfd_flags &= ~(SEC_ALLOC | SEC_LOAD);
604 	}
605       else if (flags & EISD__M_FIXUPVEC)
606 	name = "$FIXUPVEC$";
607       else if (eisd->type == EISD__K_USRSTACK)
608 	name = "$STACK$";
609       else
610 	{
611 	  const char *pfx;
612 
613 	  name = (char*) bfd_alloc (abfd, 32);
614 	  if (flags & EISD__M_DZRO)
615 	    pfx = "BSS";
616 	  else if (flags & EISD__M_EXE)
617 	    pfx = "CODE";
618 	  else if (!(flags & EISD__M_WRT))
619 	    pfx = "RO";
620 	  else
621 	    pfx = "LOCAL";
622 	  BFD_ASSERT (section_count < 999);
623 	  sprintf (name, "$%s_%03d$", pfx, section_count++);
624 	}
625 
626       section = bfd_make_section (abfd, name);
627 
628       if (!section)
629 	return FALSE;
630 
631       section->filepos = vbn ? VMS_BLOCK_SIZE * (vbn - 1) : 0;
632       section->size = size;
633       section->vma = vaddr;
634 
635       if (!bfd_set_section_flags (abfd, section, bfd_flags))
636 	return FALSE;
637     }
638 
639   return TRUE;
640 }
641 
642 /* Read & process EIHS record.
643    Return TRUE on success, FALSE on error.  */
644 
645 static bfd_boolean
646 _bfd_vms_slurp_eihs (bfd *abfd, unsigned int offset)
647 {
648   unsigned char *p = PRIV (recrd.rec) + offset;
649   unsigned int gstvbn;
650   unsigned int gstsize ATTRIBUTE_UNUSED;
651   unsigned int dstvbn;
652   unsigned int dstsize;
653   unsigned int dmtvbn;
654   unsigned int dmtbytes;
655   asection *section;
656 
657   /* PR 21611: Check that offset is valid.  */
658   if (offset > PRIV (recrd.rec_size) - (EIHS__L_DMTBYTES + 4))
659     {
660       _bfd_error_handler (_("unable to read EIHS record at offset %#x"),
661 			  offset);
662       bfd_set_error (bfd_error_file_truncated);
663       return FALSE;
664     }
665 
666   gstvbn   = bfd_getl32 (p + EIHS__L_GSTVBN);
667   gstsize  = bfd_getl32 (p + EIHS__L_GSTSIZE);
668   dstvbn   = bfd_getl32 (p + EIHS__L_DSTVBN);
669   dstsize  = bfd_getl32 (p + EIHS__L_DSTSIZE);
670   dmtvbn   = bfd_getl32 (p + EIHS__L_DMTVBN);
671   dmtbytes = bfd_getl32 (p + EIHS__L_DMTBYTES);
672 
673 #if VMS_DEBUG
674   vms_debug (8, "_bfd_vms_slurp_ihs\n");
675   vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
676 	     gstvbn, gstsize, dstvbn, dstsize, dmtvbn, dmtbytes);
677 #endif
678 
679   if (dstvbn)
680     {
681       flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
682 
683       section = bfd_make_section (abfd, "$DST$");
684       if (!section)
685 	return FALSE;
686 
687       section->size = dstsize;
688       section->filepos = VMS_BLOCK_SIZE * (dstvbn - 1);
689 
690       if (!bfd_set_section_flags (abfd, section, bfd_flags))
691 	return FALSE;
692 
693       PRIV (dst_section) = section;
694       abfd->flags |= (HAS_DEBUG | HAS_LINENO);
695     }
696 
697   if (dmtvbn)
698     {
699       flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
700 
701       section = bfd_make_section (abfd, "$DMT$");
702       if (!section)
703 	return FALSE;
704 
705       section->size = dmtbytes;
706       section->filepos = VMS_BLOCK_SIZE * (dmtvbn - 1);
707 
708       if (!bfd_set_section_flags (abfd, section, bfd_flags))
709 	return FALSE;
710     }
711 
712   if (gstvbn)
713     {
714       if (bfd_seek (abfd, VMS_BLOCK_SIZE * (gstvbn - 1), SEEK_SET))
715 	{
716 	  bfd_set_error (bfd_error_file_truncated);
717 	  return FALSE;
718 	}
719 
720       if (!_bfd_vms_slurp_object_records (abfd))
721 	return FALSE;
722 
723       abfd->flags |= HAS_SYMS;
724     }
725 
726   return TRUE;
727 }
728 
729 /* Object file reading.  */
730 
731 /* Object file input functions.  */
732 
733 /* Get next record from object file to vms_buf.
734    Set PRIV(buf_size) and return it
735 
736    This is a little tricky since it should be portable.
737 
738    The openVMS object file has 'variable length' which means that
739    read() returns data in chunks of (hopefully) correct and expected
740    size.  The linker (and other tools on VMS) depend on that. Unix
741    doesn't know about 'formatted' files, so reading and writing such
742    an object file in a Unix environment is not trivial.
743 
744    With the tool 'file' (available on all VMS FTP sites), one
745    can view and change the attributes of a file.  Changing from
746    'variable length' to 'fixed length, 512 bytes' reveals the
747    record size at the first 2 bytes of every record.  The same
748    may happen during the transfer of object files from VMS to Unix,
749    at least with UCX, the DEC implementation of TCP/IP.
750 
751    The VMS format repeats the size at bytes 2 & 3 of every record.
752 
753    On the first call (file_format == FF_UNKNOWN) we check if
754    the first and the third byte pair (!) of the record match.
755    If they do it's an object file in an Unix environment or with
756    wrong attributes (FF_FOREIGN), else we should be in a VMS
757    environment where read() returns the record size (FF_NATIVE).
758 
759    Reading is always done in 2 steps:
760     1. first just the record header is read and the size extracted,
761     2. then the read buffer is adjusted and the remaining bytes are
762        read in.
763 
764    All file I/O is done on even file positions.  */
765 
766 #define VMS_OBJECT_ADJUSTMENT  2
767 
768 static void
769 maybe_adjust_record_pointer_for_object (bfd *abfd)
770 {
771   /* Set the file format once for all on the first invocation.  */
772   if (PRIV (recrd.file_format) == FF_UNKNOWN)
773     {
774       if (PRIV (recrd.rec)[0] == PRIV (recrd.rec)[4]
775 	  && PRIV (recrd.rec)[1] == PRIV (recrd.rec)[5])
776 	PRIV (recrd.file_format) = FF_FOREIGN;
777       else
778 	PRIV (recrd.file_format) = FF_NATIVE;
779     }
780 
781   /* The adjustment is needed only in an Unix environment.  */
782   if (PRIV (recrd.file_format) == FF_FOREIGN)
783     PRIV (recrd.rec) += VMS_OBJECT_ADJUSTMENT;
784 }
785 
786 /* Implement step #1 of the object record reading procedure.
787    Return the record type or -1 on failure.  */
788 
789 static int
790 _bfd_vms_get_object_record (bfd *abfd)
791 {
792   unsigned int test_len = 6;
793   int type;
794 
795   vms_debug2 ((8, "_bfd_vms_get_obj_record\n"));
796 
797   /* Skip alignment byte if the current position is odd.  */
798   if (PRIV (recrd.file_format) == FF_FOREIGN && (bfd_tell (abfd) & 1))
799     {
800       if (bfd_bread (PRIV (recrd.buf), 1, abfd) != 1)
801 	{
802 	  bfd_set_error (bfd_error_file_truncated);
803 	  return -1;
804 	}
805     }
806 
807   /* Read the record header  */
808   if (bfd_bread (PRIV (recrd.buf), test_len, abfd) != test_len)
809     {
810       bfd_set_error (bfd_error_file_truncated);
811       return -1;
812     }
813 
814   /* Reset the record pointer.  */
815   PRIV (recrd.rec) = PRIV (recrd.buf);
816   maybe_adjust_record_pointer_for_object (abfd);
817 
818   if (vms_get_remaining_object_record (abfd, test_len) <= 0)
819     return -1;
820 
821   type = bfd_getl16 (PRIV (recrd.rec));
822 
823   vms_debug2 ((8, "_bfd_vms_get_obj_record: rec %p, size %d, type %d\n",
824 	       PRIV (recrd.rec), PRIV (recrd.rec_size), type));
825 
826   return type;
827 }
828 
829 /* Implement step #2 of the object record reading procedure.
830    Return the size of the record or 0 on failure.  */
831 
832 static int
833 vms_get_remaining_object_record (bfd *abfd, unsigned int read_so_far)
834 {
835   unsigned int to_read;
836 
837   vms_debug2 ((8, "vms_get_remaining_obj_record\n"));
838 
839   /* Extract record size.  */
840   PRIV (recrd.rec_size) = bfd_getl16 (PRIV (recrd.rec) + 2);
841 
842   if (PRIV (recrd.rec_size) == 0)
843     {
844       bfd_set_error (bfd_error_file_truncated);
845       return 0;
846     }
847 
848   /* That's what the linker manual says.  */
849   if (PRIV (recrd.rec_size) > EOBJ__C_MAXRECSIZ)
850     {
851       bfd_set_error (bfd_error_file_truncated);
852       return 0;
853     }
854 
855   /* Take into account object adjustment.  */
856   to_read = PRIV (recrd.rec_size);
857   if (PRIV (recrd.file_format) == FF_FOREIGN)
858     to_read += VMS_OBJECT_ADJUSTMENT;
859 
860   /* Adjust the buffer.  */
861   if (to_read > PRIV (recrd.buf_size))
862     {
863       PRIV (recrd.buf)
864 	= (unsigned char *) bfd_realloc (PRIV (recrd.buf), to_read);
865       if (PRIV (recrd.buf) == NULL)
866 	return 0;
867       PRIV (recrd.buf_size) = to_read;
868     }
869   /* PR 17512: file: 025-1974-0.004.  */
870   else if (to_read <= read_so_far)
871     return 0;
872 
873   /* Read the remaining record.  */
874   to_read -= read_so_far;
875 
876   vms_debug2 ((8, "vms_get_remaining_obj_record: to_read %d\n", to_read));
877 
878   if (bfd_bread (PRIV (recrd.buf) + read_so_far, to_read, abfd) != to_read)
879     {
880       bfd_set_error (bfd_error_file_truncated);
881       return 0;
882     }
883 
884   /* Reset the record pointer.  */
885   PRIV (recrd.rec) = PRIV (recrd.buf);
886   maybe_adjust_record_pointer_for_object (abfd);
887 
888   vms_debug2 ((8, "vms_get_remaining_obj_record: size %d\n",
889 	       PRIV (recrd.rec_size)));
890 
891   return PRIV (recrd.rec_size);
892 }
893 
894 /* Read and process emh record.
895    Return TRUE on success, FALSE on error.  */
896 
897 static bfd_boolean
898 _bfd_vms_slurp_ehdr (bfd *abfd)
899 {
900   unsigned char *ptr;
901   unsigned char *vms_rec;
902   unsigned char *end;
903   int subtype;
904 
905   vms_rec = PRIV (recrd.rec);
906   /* PR 17512: file: 62736583.  */
907   end = PRIV (recrd.buf) + PRIV (recrd.buf_size);
908 
909   vms_debug2 ((2, "HDR/EMH\n"));
910 
911   subtype = bfd_getl16 (vms_rec + 4);
912 
913   vms_debug2 ((3, "subtype %d\n", subtype));
914 
915   switch (subtype)
916     {
917     case EMH__C_MHD:
918       /* Module header.  */
919       if (vms_rec + 21 >= end)
920 	goto fail;
921       PRIV (hdr_data).hdr_b_strlvl = vms_rec[6];
922       PRIV (hdr_data).hdr_l_arch1  = bfd_getl32 (vms_rec + 8);
923       PRIV (hdr_data).hdr_l_arch2  = bfd_getl32 (vms_rec + 12);
924       PRIV (hdr_data).hdr_l_recsiz = bfd_getl32 (vms_rec + 16);
925       if ((vms_rec + 20 + vms_rec[20] + 1) >= end)
926 	goto fail;
927       PRIV (hdr_data).hdr_t_name   = _bfd_vms_save_counted_string (vms_rec + 20, vms_rec[20]);
928       ptr = vms_rec + 20 + vms_rec[20] + 1;
929       if ((ptr + *ptr + 1) >= end)
930 	goto fail;
931       PRIV (hdr_data).hdr_t_version =_bfd_vms_save_counted_string (ptr, *ptr);
932       ptr += *ptr + 1;
933       if (ptr + 17 >= end)
934 	goto fail;
935       PRIV (hdr_data).hdr_t_date = _bfd_vms_save_sized_string (ptr, 17);
936       break;
937 
938     case EMH__C_LNM:
939       if (vms_rec + PRIV (recrd.rec_size - 6) > end)
940 	goto fail;
941       PRIV (hdr_data).hdr_c_lnm =
942 	_bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
943       break;
944 
945     case EMH__C_SRC:
946       if (vms_rec + PRIV (recrd.rec_size - 6) > end)
947 	goto fail;
948       PRIV (hdr_data).hdr_c_src =
949 	_bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
950       break;
951 
952     case EMH__C_TTL:
953       if (vms_rec + PRIV (recrd.rec_size - 6) > end)
954 	goto fail;
955       PRIV (hdr_data).hdr_c_ttl =
956 	_bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
957       break;
958 
959     case EMH__C_CPR:
960     case EMH__C_MTC:
961     case EMH__C_GTX:
962       break;
963 
964     default:
965     fail:
966       bfd_set_error (bfd_error_wrong_format);
967       return FALSE;
968     }
969 
970   return TRUE;
971 }
972 
973 /* Typical sections for evax object files.  */
974 
975 #define EVAX_ABS_NAME		"$ABS$"
976 #define EVAX_CODE_NAME		"$CODE$"
977 #define EVAX_LINK_NAME		"$LINK$"
978 #define EVAX_DATA_NAME		"$DATA$"
979 #define EVAX_BSS_NAME		"$BSS$"
980 #define EVAX_READONLYADDR_NAME	"$READONLY_ADDR$"
981 #define EVAX_READONLY_NAME	"$READONLY$"
982 #define EVAX_LITERAL_NAME	"$LITERAL$"
983 #define EVAX_LITERALS_NAME	"$LITERALS"
984 #define EVAX_COMMON_NAME	"$COMMON$"
985 #define EVAX_LOCAL_NAME		"$LOCAL$"
986 
987 struct sec_flags_struct
988 {
989   const char *name;		/* Name of section.  */
990   int vflags_always;
991   flagword flags_always;	/* Flags we set always.  */
992   int vflags_hassize;
993   flagword flags_hassize;	/* Flags we set if the section has a size > 0.  */
994 };
995 
996 /* These flags are deccrtl/vaxcrtl (openVMS 6.2 Alpha) compatible.  */
997 
998 static const struct sec_flags_struct evax_section_flags[] =
999   {
1000     { EVAX_ABS_NAME,
1001       EGPS__V_SHR,
1002       0,
1003       EGPS__V_SHR,
1004       0 },
1005     { EVAX_CODE_NAME,
1006       EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_EXE,
1007       SEC_CODE | SEC_READONLY,
1008       EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_EXE,
1009       SEC_CODE | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1010     { EVAX_LITERAL_NAME,
1011       EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD | EGPS__V_NOMOD,
1012       SEC_DATA | SEC_READONLY,
1013       EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD,
1014       SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1015     { EVAX_LINK_NAME,
1016       EGPS__V_REL | EGPS__V_RD,
1017       SEC_DATA | SEC_READONLY,
1018       EGPS__V_REL | EGPS__V_RD,
1019       SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1020     { EVAX_DATA_NAME,
1021       EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD,
1022       SEC_DATA,
1023       EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
1024       SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1025     { EVAX_BSS_NAME,
1026       EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD,
1027       SEC_NO_FLAGS,
1028       EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD,
1029       SEC_ALLOC },
1030     { EVAX_READONLYADDR_NAME,
1031       EGPS__V_PIC | EGPS__V_REL | EGPS__V_RD,
1032       SEC_DATA | SEC_READONLY,
1033       EGPS__V_PIC | EGPS__V_REL | EGPS__V_RD,
1034       SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1035     { EVAX_READONLY_NAME,
1036       EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD | EGPS__V_NOMOD,
1037       SEC_DATA | SEC_READONLY,
1038       EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD,
1039       SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1040     { EVAX_LOCAL_NAME,
1041       EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
1042       SEC_DATA,
1043       EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
1044       SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1045     { EVAX_LITERALS_NAME,
1046       EGPS__V_PIC | EGPS__V_OVR,
1047       SEC_DATA | SEC_READONLY,
1048       EGPS__V_PIC | EGPS__V_OVR,
1049       SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1050     { NULL,
1051       EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
1052       SEC_DATA,
1053       EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
1054       SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD }
1055   };
1056 
1057 /* Retrieve BFD section flags by name and size.  */
1058 
1059 static flagword
1060 vms_secflag_by_name (const struct sec_flags_struct *section_flags,
1061 		     const char *name,
1062 		     int hassize)
1063 {
1064   int i = 0;
1065 
1066   while (section_flags[i].name != NULL)
1067     {
1068       if (strcmp (name, section_flags[i].name) == 0)
1069 	{
1070 	  if (hassize)
1071 	    return section_flags[i].flags_hassize;
1072 	  else
1073 	    return section_flags[i].flags_always;
1074 	}
1075       i++;
1076     }
1077   if (hassize)
1078     return section_flags[i].flags_hassize;
1079   return section_flags[i].flags_always;
1080 }
1081 
1082 /* Retrieve VMS section flags by name and size.  */
1083 
1084 static flagword
1085 vms_esecflag_by_name (const struct sec_flags_struct *section_flags,
1086 		      const char *name,
1087 		      int hassize)
1088 {
1089   int i = 0;
1090 
1091   while (section_flags[i].name != NULL)
1092     {
1093       if (strcmp (name, section_flags[i].name) == 0)
1094 	{
1095 	  if (hassize)
1096 	    return section_flags[i].vflags_hassize;
1097 	  else
1098 	    return section_flags[i].vflags_always;
1099 	}
1100       i++;
1101     }
1102   if (hassize)
1103     return section_flags[i].vflags_hassize;
1104   return section_flags[i].vflags_always;
1105 }
1106 
1107 /* Add SYM to the symbol table of ABFD.
1108    Return FALSE in case of error.  */
1109 
1110 static bfd_boolean
1111 add_symbol_entry (bfd *abfd, struct vms_symbol_entry *sym)
1112 {
1113   if (PRIV (gsd_sym_count) >= PRIV (max_sym_count))
1114     {
1115       if (PRIV (max_sym_count) == 0)
1116 	{
1117 	  PRIV (max_sym_count) = 128;
1118 	  PRIV (syms) = bfd_malloc
1119 	    (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *));
1120 	}
1121       else
1122 	{
1123 	  PRIV (max_sym_count) *= 2;
1124 	  PRIV (syms) = bfd_realloc
1125 	    (PRIV (syms),
1126 	     (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *)));
1127 	}
1128       if (PRIV (syms) == NULL)
1129 	return FALSE;
1130     }
1131 
1132   PRIV (syms)[PRIV (gsd_sym_count)++] = sym;
1133   return TRUE;
1134 }
1135 
1136 /* Create a symbol whose name is ASCIC and add it to ABFD.
1137    Return NULL in case of error.  */
1138 
1139 static struct vms_symbol_entry *
1140 add_symbol (bfd *abfd, const unsigned char *ascic)
1141 {
1142   struct vms_symbol_entry *entry;
1143   int len;
1144 
1145   len = *ascic++;
1146   entry = (struct vms_symbol_entry *)bfd_zalloc (abfd, sizeof (*entry) + len);
1147   if (entry == NULL)
1148     return NULL;
1149   entry->namelen = len;
1150   memcpy (entry->name, ascic, len);
1151   entry->name[len] = 0;
1152   entry->owner = abfd;
1153 
1154   if (!add_symbol_entry (abfd, entry))
1155     return NULL;
1156   return entry;
1157 }
1158 
1159 /* Read and process EGSD.  Return FALSE on failure.  */
1160 
1161 static bfd_boolean
1162 _bfd_vms_slurp_egsd (bfd *abfd)
1163 {
1164   int gsd_type;
1165   unsigned int gsd_size;
1166   unsigned char *vms_rec;
1167   unsigned long base_addr;
1168 
1169   vms_debug2 ((2, "EGSD\n"));
1170 
1171   if (PRIV (recrd.rec_size) < 8)
1172     {
1173       _bfd_error_handler (_("corrupt EGSD record: its size (%#x) is too small"),
1174 			  PRIV (recrd.rec_size));
1175       bfd_set_error (bfd_error_bad_value);
1176       return FALSE;
1177     }
1178 
1179   PRIV (recrd.rec) += 8;	/* Skip type, size, align pad.  */
1180   PRIV (recrd.rec_size) -= 8;
1181 
1182   /* Calculate base address for each section.  */
1183   base_addr = 0L;
1184 
1185   while (PRIV (recrd.rec_size) > 4)
1186     {
1187       vms_rec = PRIV (recrd.rec);
1188 
1189       gsd_type = bfd_getl16 (vms_rec);
1190       gsd_size = bfd_getl16 (vms_rec + 2);
1191 
1192       vms_debug2 ((3, "egsd_type %d\n", gsd_type));
1193 
1194       /* PR 21615: Check for size overflow.  */
1195       if (PRIV (recrd.rec_size) < gsd_size)
1196 	{
1197 	  _bfd_error_handler (_("corrupt EGSD record: size (%#x) is larger than remaining space (%#x)"),
1198 			      gsd_size, PRIV (recrd.rec_size));
1199 	  bfd_set_error (bfd_error_bad_value);
1200 	  return FALSE;
1201 	}
1202 
1203       if (gsd_size < 4)
1204 	{
1205 	  _bfd_error_handler (_("corrupt EGSD record: size (%#x) is too small"),
1206 			      gsd_size);
1207 	  bfd_set_error (bfd_error_bad_value);
1208 	  return FALSE;
1209 	}
1210 
1211       switch (gsd_type)
1212 	{
1213 	case EGSD__C_PSC:
1214 	  /* Program section definition.  */
1215 	  {
1216 	    struct vms_egps *egps = (struct vms_egps *)vms_rec;
1217 	    flagword new_flags, vms_flags;
1218 	    asection *section;
1219 
1220 	    vms_flags = bfd_getl16 (egps->flags);
1221 
1222 	    if ((vms_flags & EGPS__V_REL) == 0)
1223 	      {
1224 		/* Use the global absolute section for all
1225 		   absolute sections.  */
1226 		section = bfd_abs_section_ptr;
1227 	      }
1228 	    else
1229 	      {
1230 		char *name;
1231 		unsigned long align_addr;
1232 
1233 		name = _bfd_vms_save_counted_string (&egps->namlng, gsd_size - 4);
1234 
1235 		section = bfd_make_section (abfd, name);
1236 		if (!section)
1237 		  return FALSE;
1238 
1239 		section->filepos = 0;
1240 		section->size = bfd_getl32 (egps->alloc);
1241 		section->alignment_power = egps->align;
1242 
1243 		vms_section_data (section)->flags = vms_flags;
1244 		vms_section_data (section)->no_flags = 0;
1245 
1246 		new_flags = vms_secflag_by_name (evax_section_flags, name,
1247 						 section->size > 0);
1248 		if (section->size > 0)
1249 		  new_flags |= SEC_LOAD;
1250 		if (!(vms_flags & EGPS__V_NOMOD) && section->size > 0)
1251 		  {
1252 		    /* Set RELOC and HAS_CONTENTS if the section is not
1253 		       demand-zero and not empty.  */
1254 		    new_flags |= SEC_HAS_CONTENTS;
1255 		    if (vms_flags & EGPS__V_REL)
1256 		      new_flags |= SEC_RELOC;
1257 		  }
1258 		if (vms_flags & EGPS__V_EXE)
1259 		  {
1260 		    /* Set CODE if section is executable.  */
1261 		    new_flags |= SEC_CODE;
1262 		    new_flags &= ~SEC_DATA;
1263 		  }
1264 		if (!bfd_set_section_flags (abfd, section, new_flags))
1265 		  return FALSE;
1266 
1267 		/* Give a non-overlapping vma to non absolute sections.  */
1268 		align_addr = (1 << section->alignment_power);
1269 		if ((base_addr % align_addr) != 0)
1270 		  base_addr += (align_addr - (base_addr % align_addr));
1271 		section->vma = (bfd_vma)base_addr;
1272 		base_addr += section->size;
1273 	      }
1274 
1275 	    /* Append it to the section array.  */
1276 	    if (PRIV (section_count) >= PRIV (section_max))
1277 	      {
1278 		if (PRIV (section_max) == 0)
1279 		  PRIV (section_max) = 16;
1280 		else
1281 		  PRIV (section_max) *= 2;
1282 		PRIV (sections) = bfd_realloc_or_free
1283 		  (PRIV (sections), PRIV (section_max) * sizeof (asection *));
1284 		if (PRIV (sections) == NULL)
1285 		  return FALSE;
1286 	      }
1287 
1288 	    PRIV (sections)[PRIV (section_count)] = section;
1289 	    PRIV (section_count)++;
1290 	  }
1291 	  break;
1292 
1293 	case EGSD__C_SYM:
1294 	  {
1295 	    int nameoff;
1296 	    struct vms_symbol_entry *entry;
1297 	    struct vms_egsy *egsy = (struct vms_egsy *) vms_rec;
1298 	    flagword old_flags;
1299 
1300 	    old_flags = bfd_getl16 (egsy->flags);
1301 	    if (old_flags & EGSY__V_DEF)
1302 	      nameoff = ESDF__B_NAMLNG;
1303 	    else
1304 	      nameoff = ESRF__B_NAMLNG;
1305 
1306 	    entry = add_symbol (abfd, vms_rec + nameoff);
1307 	    if (entry == NULL)
1308 	      return FALSE;
1309 
1310 	    /* Allow only duplicate reference.  */
1311 	    if ((entry->flags & EGSY__V_DEF) && (old_flags & EGSY__V_DEF))
1312 	      abort ();
1313 
1314 	    if (entry->typ == 0)
1315 	      {
1316 		entry->typ = gsd_type;
1317 		entry->data_type = egsy->datyp;
1318 		entry->flags = old_flags;
1319 	      }
1320 
1321 	    if (old_flags & EGSY__V_DEF)
1322 	      {
1323 		struct vms_esdf *esdf = (struct vms_esdf *)vms_rec;
1324 		long psindx;
1325 
1326 		entry->value = bfd_getl64 (esdf->value);
1327 		if (PRIV (sections) == NULL)
1328 		  return FALSE;
1329 
1330 		psindx = bfd_getl32 (esdf->psindx);
1331 		/* PR 21813: Check for an out of range index.  */
1332 		if (psindx < 0 || psindx >= (int) PRIV (section_count))
1333 		  {
1334 		    _bfd_error_handler (_("corrupt EGSD record: its psindx field is too big (%#lx)"),
1335 					psindx);
1336 		    bfd_set_error (bfd_error_bad_value);
1337 		    return FALSE;
1338 		  }
1339 		entry->section = PRIV (sections)[psindx];
1340 
1341 		if (old_flags & EGSY__V_NORM)
1342 		  {
1343 		    PRIV (norm_sym_count)++;
1344 
1345 		    entry->code_value = bfd_getl64 (esdf->code_address);
1346 		    psindx = bfd_getl32 (esdf->ca_psindx);
1347 		/* PR 21813: Check for an out of range index.  */
1348 		    if (psindx < 0 || psindx >= (int) PRIV (section_count))
1349 		      {
1350 			_bfd_error_handler (_("corrupt EGSD record: its psindx field is too big (%#lx)"),
1351 					    psindx);
1352 			bfd_set_error (bfd_error_bad_value);
1353 			return FALSE;
1354 		      }
1355 		    entry->code_section = PRIV (sections)[psindx];
1356 		  }
1357 	      }
1358 	  }
1359 	  break;
1360 
1361 	case EGSD__C_SYMG:
1362 	  {
1363 	    struct vms_symbol_entry *entry;
1364 	    struct vms_egst *egst = (struct vms_egst *)vms_rec;
1365 	    flagword old_flags;
1366 
1367 	    old_flags = bfd_getl16 (egst->header.flags);
1368 
1369 	    entry = add_symbol (abfd, &egst->namlng);
1370 
1371 	    if (entry == NULL)
1372 	      return FALSE;
1373 
1374 	    entry->typ = gsd_type;
1375 	    entry->data_type = egst->header.datyp;
1376 	    entry->flags = old_flags;
1377 
1378 	    entry->symbol_vector = bfd_getl32 (egst->value);
1379 
1380 	    if (old_flags & EGSY__V_REL)
1381 	      {
1382 		long psindx;
1383 
1384 		if (PRIV (sections) == NULL)
1385 		  return FALSE;
1386 		psindx = bfd_getl32 (egst->psindx);
1387 		/* PR 21813: Check for an out of range index.  */
1388 		if (psindx < 0 || psindx >= (int) PRIV (section_count))
1389 		  {
1390 		    _bfd_error_handler (_("corrupt EGSD record: its psindx field is too big (%#lx)"),
1391 					psindx);
1392 		    bfd_set_error (bfd_error_bad_value);
1393 		    return FALSE;
1394 		  }
1395 		entry->section = PRIV (sections)[psindx];
1396 	      }
1397 	    else
1398 	      entry->section = bfd_abs_section_ptr;
1399 
1400 	    entry->value = bfd_getl64 (egst->lp_2);
1401 
1402 	    if (old_flags & EGSY__V_NORM)
1403 	      {
1404 		PRIV (norm_sym_count)++;
1405 
1406 		entry->code_value = bfd_getl64 (egst->lp_1);
1407 		entry->code_section = bfd_abs_section_ptr;
1408 	      }
1409 	  }
1410 	  break;
1411 
1412 	case EGSD__C_SPSC:
1413 	case EGSD__C_IDC:
1414 	  /* Currently ignored.  */
1415 	  break;
1416 	case EGSD__C_SYMM:
1417 	case EGSD__C_SYMV:
1418 	default:
1419 	  _bfd_error_handler (_("unknown EGSD subtype %d"), gsd_type);
1420 	  bfd_set_error (bfd_error_bad_value);
1421 	  return FALSE;
1422 	}
1423 
1424       PRIV (recrd.rec_size) -= gsd_size;
1425       PRIV (recrd.rec) += gsd_size;
1426     }
1427 
1428   /* FIXME: Should we complain if PRIV (recrd.rec_size) is not zero ?  */
1429 
1430   if (PRIV (gsd_sym_count) > 0)
1431     abfd->flags |= HAS_SYMS;
1432 
1433   return TRUE;
1434 }
1435 
1436 /* Stack routines for vms ETIR commands.  */
1437 
1438 /* Push value and section index.  */
1439 
1440 static void
1441 _bfd_vms_push (bfd *abfd, bfd_vma val, unsigned int reloc)
1442 {
1443   vms_debug2 ((4, "<push %08lx (0x%08x) at %d>\n",
1444 	       (unsigned long)val, reloc, PRIV (stackptr)));
1445 
1446   PRIV (stack[PRIV (stackptr)]).value = val;
1447   PRIV (stack[PRIV (stackptr)]).reloc = reloc;
1448   PRIV (stackptr)++;
1449   if (PRIV (stackptr) >= STACKSIZE)
1450     {
1451       bfd_set_error (bfd_error_bad_value);
1452       _bfd_error_handler (_("stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr));
1453       exit (1);
1454     }
1455 }
1456 
1457 /* Pop value and section index.  */
1458 
1459 static void
1460 _bfd_vms_pop (bfd *abfd, bfd_vma *val, unsigned int *rel)
1461 {
1462   if (PRIV (stackptr) == 0)
1463     {
1464       bfd_set_error (bfd_error_bad_value);
1465       _bfd_error_handler (_("stack underflow in _bfd_vms_pop"));
1466       exit (1);
1467     }
1468   PRIV (stackptr)--;
1469   *val = PRIV (stack[PRIV (stackptr)]).value;
1470   *rel = PRIV (stack[PRIV (stackptr)]).reloc;
1471 
1472   vms_debug2 ((4, "<pop %08lx (0x%08x)>\n", (unsigned long)*val, *rel));
1473 }
1474 
1475 /* Routines to fill sections contents during tir/etir read.  */
1476 
1477 /* Initialize image buffer pointer to be filled.  */
1478 
1479 static void
1480 image_set_ptr (bfd *abfd, bfd_vma vma, int sect, struct bfd_link_info *info)
1481 {
1482   asection *sec;
1483 
1484   vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma, sect));
1485 
1486   if (PRIV (sections) == NULL)
1487     return;
1488   if (sect < 0 || sect >= (int) PRIV (section_count))
1489     return;
1490 
1491   sec = PRIV (sections)[sect];
1492 
1493   if (info)
1494     {
1495       /* Reading contents to an output bfd.  */
1496 
1497       if (sec->output_section == NULL)
1498 	{
1499 	  /* Section discarded.  */
1500 	  vms_debug2 ((5, " section %s discarded\n", sec->name));
1501 
1502 	  /* This is not used.  */
1503 	  PRIV (image_section) = NULL;
1504 	  PRIV (image_offset) = 0;
1505 	  return;
1506 	}
1507       PRIV (image_offset) = sec->output_offset + vma;
1508       PRIV (image_section) = sec->output_section;
1509     }
1510   else
1511     {
1512       PRIV (image_offset) = vma;
1513       PRIV (image_section) = sec;
1514     }
1515 }
1516 
1517 /* Increment image buffer pointer by offset.  */
1518 
1519 static void
1520 image_inc_ptr (bfd *abfd, bfd_vma offset)
1521 {
1522   vms_debug2 ((4, "image_inc_ptr (%u)\n", (unsigned)offset));
1523 
1524   PRIV (image_offset) += offset;
1525 }
1526 
1527 /* Save current DST location counter under specified index.  */
1528 
1529 static void
1530 dst_define_location (bfd *abfd, unsigned int loc)
1531 {
1532   vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc));
1533 
1534   /* Grow the ptr offset table if necessary.  */
1535   if (loc + 1 > PRIV (dst_ptr_offsets_count))
1536     {
1537       PRIV (dst_ptr_offsets) = bfd_realloc (PRIV (dst_ptr_offsets),
1538 					   (loc + 1) * sizeof (unsigned int));
1539       PRIV (dst_ptr_offsets_count) = loc + 1;
1540     }
1541 
1542   PRIV (dst_ptr_offsets)[loc] = PRIV (image_offset);
1543 }
1544 
1545 /* Restore saved DST location counter from specified index.  */
1546 
1547 static void
1548 dst_restore_location (bfd *abfd, unsigned int loc)
1549 {
1550   vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc));
1551 
1552   PRIV (image_offset) = PRIV (dst_ptr_offsets)[loc];
1553 }
1554 
1555 /* Retrieve saved DST location counter from specified index.  */
1556 
1557 static unsigned int
1558 dst_retrieve_location (bfd *abfd, unsigned int loc)
1559 {
1560   vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int)loc));
1561 
1562   return PRIV (dst_ptr_offsets)[loc];
1563 }
1564 
1565 /* Write multiple bytes to section image.  */
1566 
1567 static bfd_boolean
1568 image_write (bfd *abfd, unsigned char *ptr, unsigned int size)
1569 {
1570 #if VMS_DEBUG
1571   _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr, size,
1572 		  (long)PRIV (image_offset));
1573   _bfd_hexdump (9, ptr, size, 0);
1574 #endif
1575 
1576   if (PRIV (image_section)->contents != NULL)
1577     {
1578       asection *sec = PRIV (image_section);
1579       file_ptr off = PRIV (image_offset);
1580 
1581       /* Check bounds.  */
1582       if (off > (file_ptr)sec->size
1583 	  || size > (file_ptr)sec->size
1584 	  || off + size > (file_ptr)sec->size)
1585 	{
1586 	  bfd_set_error (bfd_error_bad_value);
1587 	  return FALSE;
1588 	}
1589 
1590       memcpy (sec->contents + off, ptr, size);
1591     }
1592 
1593   PRIV (image_offset) += size;
1594   return TRUE;
1595 }
1596 
1597 /* Write byte to section image.  */
1598 
1599 static bfd_boolean
1600 image_write_b (bfd * abfd, unsigned int value)
1601 {
1602   unsigned char data[1];
1603 
1604   vms_debug2 ((6, "image_write_b (%02x)\n", (int) value));
1605 
1606   *data = value;
1607 
1608   return image_write (abfd, data, sizeof (data));
1609 }
1610 
1611 /* Write 2-byte word to image.  */
1612 
1613 static bfd_boolean
1614 image_write_w (bfd * abfd, unsigned int value)
1615 {
1616   unsigned char data[2];
1617 
1618   vms_debug2 ((6, "image_write_w (%04x)\n", (int) value));
1619 
1620   bfd_putl16 (value, data);
1621   return image_write (abfd, data, sizeof (data));
1622 }
1623 
1624 /* Write 4-byte long to image.  */
1625 
1626 static bfd_boolean
1627 image_write_l (bfd * abfd, unsigned long value)
1628 {
1629   unsigned char data[4];
1630 
1631   vms_debug2 ((6, "image_write_l (%08lx)\n", value));
1632 
1633   bfd_putl32 (value, data);
1634   return image_write (abfd, data, sizeof (data));
1635 }
1636 
1637 /* Write 8-byte quad to image.  */
1638 
1639 static bfd_boolean
1640 image_write_q (bfd * abfd, bfd_vma value)
1641 {
1642   unsigned char data[8];
1643 
1644   vms_debug2 ((6, "image_write_q (%08lx)\n", (unsigned long)value));
1645 
1646   bfd_putl64 (value, data);
1647   return image_write (abfd, data, sizeof (data));
1648 }
1649 
1650 static const char *
1651 _bfd_vms_etir_name (int cmd)
1652 {
1653   switch (cmd)
1654     {
1655     case ETIR__C_STA_GBL: return "ETIR__C_STA_GBL";
1656     case ETIR__C_STA_LW: return "ETIR__C_STA_LW";
1657     case ETIR__C_STA_QW: return "ETIR__C_STA_QW";
1658     case ETIR__C_STA_PQ: return "ETIR__C_STA_PQ";
1659     case ETIR__C_STA_LI: return "ETIR__C_STA_LI";
1660     case ETIR__C_STA_MOD: return "ETIR__C_STA_MOD";
1661     case ETIR__C_STA_CKARG: return "ETIR__C_STA_CKARG";
1662     case ETIR__C_STO_B: return "ETIR__C_STO_B";
1663     case ETIR__C_STO_W: return "ETIR__C_STO_W";
1664     case ETIR__C_STO_GBL: return "ETIR__C_STO_GBL";
1665     case ETIR__C_STO_CA: return "ETIR__C_STO_CA";
1666     case ETIR__C_STO_RB: return "ETIR__C_STO_RB";
1667     case ETIR__C_STO_AB: return "ETIR__C_STO_AB";
1668     case ETIR__C_STO_OFF: return "ETIR__C_STO_OFF";
1669     case ETIR__C_STO_IMM: return "ETIR__C_STO_IMM";
1670     case ETIR__C_STO_IMMR: return "ETIR__C_STO_IMMR";
1671     case ETIR__C_STO_LW: return "ETIR__C_STO_LW";
1672     case ETIR__C_STO_QW: return "ETIR__C_STO_QW";
1673     case ETIR__C_STO_GBL_LW: return "ETIR__C_STO_GBL_LW";
1674     case ETIR__C_STO_LP_PSB: return "ETIR__C_STO_LP_PSB";
1675     case ETIR__C_STO_HINT_GBL: return "ETIR__C_STO_HINT_GBL";
1676     case ETIR__C_STO_HINT_PS: return "ETIR__C_STO_HINT_PS";
1677     case ETIR__C_OPR_ADD: return "ETIR__C_OPR_ADD";
1678     case ETIR__C_OPR_SUB: return "ETIR__C_OPR_SUB";
1679     case ETIR__C_OPR_INSV: return "ETIR__C_OPR_INSV";
1680     case ETIR__C_OPR_USH: return "ETIR__C_OPR_USH";
1681     case ETIR__C_OPR_ROT: return "ETIR__C_OPR_ROT";
1682     case ETIR__C_OPR_REDEF: return "ETIR__C_OPR_REDEF";
1683     case ETIR__C_OPR_DFLIT: return "ETIR__C_OPR_DFLIT";
1684     case ETIR__C_STC_LP: return "ETIR__C_STC_LP";
1685     case ETIR__C_STC_GBL: return "ETIR__C_STC_GBL";
1686     case ETIR__C_STC_GCA: return "ETIR__C_STC_GCA";
1687     case ETIR__C_STC_PS: return "ETIR__C_STC_PS";
1688     case ETIR__C_STC_NBH_PS: return "ETIR__C_STC_NBH_PS";
1689     case ETIR__C_STC_NOP_GBL: return "ETIR__C_STC_NOP_GBL";
1690     case ETIR__C_STC_NOP_PS: return "ETIR__C_STC_NOP_PS";
1691     case ETIR__C_STC_BSR_GBL: return "ETIR__C_STC_BSR_GBL";
1692     case ETIR__C_STC_BSR_PS: return "ETIR__C_STC_BSR_PS";
1693     case ETIR__C_STC_LDA_GBL: return "ETIR__C_STC_LDA_GBL";
1694     case ETIR__C_STC_LDA_PS: return "ETIR__C_STC_LDA_PS";
1695     case ETIR__C_STC_BOH_GBL: return "ETIR__C_STC_BOH_GBL";
1696     case ETIR__C_STC_BOH_PS: return "ETIR__C_STC_BOH_PS";
1697     case ETIR__C_STC_NBH_GBL: return "ETIR__C_STC_NBH_GBL";
1698     case ETIR__C_STC_LP_PSB: return "ETIR__C_STC_LP_PSB";
1699     case ETIR__C_CTL_SETRB: return "ETIR__C_CTL_SETRB";
1700     case ETIR__C_CTL_AUGRB: return "ETIR__C_CTL_AUGRB";
1701     case ETIR__C_CTL_DFLOC: return "ETIR__C_CTL_DFLOC";
1702     case ETIR__C_CTL_STLOC: return "ETIR__C_CTL_STLOC";
1703     case ETIR__C_CTL_STKDL: return "ETIR__C_CTL_STKDL";
1704 
1705     default:
1706       /* These names have not yet been added to this switch statement.  */
1707       _bfd_error_handler (_("unknown ETIR command %d"), cmd);
1708     }
1709 
1710   return NULL;
1711 }
1712 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
1713 
1714 static void
1715 _bfd_vms_get_value (bfd *abfd,
1716 		    const unsigned char *ascic,
1717 		    const unsigned char *max_ascic,
1718 		    struct bfd_link_info *info,
1719 		    bfd_vma *vma,
1720 		    struct alpha_vms_link_hash_entry **hp)
1721 {
1722   char name[257];
1723   unsigned int len;
1724   unsigned int i;
1725   struct alpha_vms_link_hash_entry *h;
1726 
1727   /* Not linking.  Do not try to resolve the symbol.  */
1728   if (info == NULL)
1729     {
1730       *vma = 0;
1731       *hp = NULL;
1732       return;
1733     }
1734 
1735   len = *ascic;
1736   if (ascic + len >= max_ascic)
1737     {
1738       _bfd_error_handler (_("corrupt vms value"));
1739       *vma = 0;
1740       *hp = NULL;
1741       return;
1742     }
1743 
1744   for (i = 0; i < len; i++)
1745     name[i] = ascic[i + 1];
1746   name[i] = 0;
1747 
1748   h = (struct alpha_vms_link_hash_entry *)
1749     bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
1750 
1751   *hp = h;
1752 
1753   if (h != NULL
1754       && (h->root.type == bfd_link_hash_defined
1755 	  || h->root.type == bfd_link_hash_defweak))
1756     *vma = h->root.u.def.value
1757       + h->root.u.def.section->output_offset
1758       + h->root.u.def.section->output_section->vma;
1759   else if (h && h->root.type == bfd_link_hash_undefweak)
1760     *vma = 0;
1761   else
1762     {
1763       (*info->callbacks->undefined_symbol)
1764 	(info, name, abfd, PRIV (image_section), PRIV (image_offset), TRUE);
1765       *vma = 0;
1766     }
1767 }
1768 
1769 #define RELC_NONE 0
1770 #define RELC_REL  1
1771 #define RELC_SHR_BASE 0x10000
1772 #define RELC_SEC_BASE 0x20000
1773 #define RELC_MASK     0x0ffff
1774 
1775 static unsigned int
1776 alpha_vms_sym_to_ctxt (struct alpha_vms_link_hash_entry *h)
1777 {
1778   /* Handle undefined symbols.  */
1779   if (h == NULL || h->sym == NULL)
1780     return RELC_NONE;
1781 
1782   if (h->sym->typ == EGSD__C_SYMG)
1783     {
1784       if (h->sym->flags & EGSY__V_REL)
1785 	return RELC_SHR_BASE + PRIV2 (h->sym->owner, shr_index);
1786       else
1787 	{
1788 	  /* Can this happen (non-relocatable symg) ?  I'd like to see
1789 	     an example.  */
1790 	  abort ();
1791 	}
1792     }
1793   if (h->sym->typ == EGSD__C_SYM)
1794     {
1795       if (h->sym->flags & EGSY__V_REL)
1796 	return RELC_REL;
1797       else
1798 	return RELC_NONE;
1799     }
1800   abort ();
1801 }
1802 
1803 static bfd_vma
1804 alpha_vms_get_sym_value (asection *sect, bfd_vma addr)
1805 {
1806   return sect->output_section->vma + sect->output_offset + addr;
1807 }
1808 
1809 static bfd_vma
1810 alpha_vms_fix_sec_rel (bfd *abfd, struct bfd_link_info *info,
1811 		       unsigned int rel, bfd_vma vma)
1812 {
1813   asection *sec;
1814 
1815   if (PRIV (sections) == NULL)
1816     return 0;
1817 
1818   sec = PRIV (sections)[rel & RELC_MASK];
1819 
1820   if (info)
1821     {
1822       if (sec->output_section == NULL)
1823 	abort ();
1824       return vma + sec->output_section->vma + sec->output_offset;
1825     }
1826   else
1827     return vma + sec->vma;
1828 }
1829 
1830 /* Read an ETIR record from ABFD.  If INFO is not null, put the content into
1831    the output section (used during linking).
1832    Return FALSE in case of error.  */
1833 
1834 static bfd_boolean
1835 _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info)
1836 {
1837   unsigned char *ptr;
1838   unsigned int length;
1839   unsigned char *maxptr;
1840   bfd_vma op1;
1841   bfd_vma op2;
1842   unsigned int rel1;
1843   unsigned int rel2;
1844   struct alpha_vms_link_hash_entry *h;
1845 
1846   PRIV (recrd.rec) += ETIR__C_HEADER_SIZE;
1847   PRIV (recrd.rec_size) -= ETIR__C_HEADER_SIZE;
1848 
1849   ptr = PRIV (recrd.rec);
1850   length = PRIV (recrd.rec_size);
1851   maxptr = ptr + length;
1852 
1853   vms_debug2 ((2, "ETIR: %d bytes\n", length));
1854 
1855   while (ptr < maxptr)
1856     {
1857       int cmd = bfd_getl16 (ptr);
1858       int cmd_length = bfd_getl16 (ptr + 2);
1859 
1860       ptr += 4;
1861 
1862       /* PR 21589 and 21579: Check for a corrupt ETIR record.  */
1863       if (cmd_length < 4 || (ptr + cmd_length > maxptr + 4))
1864 	{
1865 	corrupt_etir:
1866 	  _bfd_error_handler (_("corrupt ETIR record encountered"));
1867 	  bfd_set_error (bfd_error_bad_value);
1868 	  return FALSE;
1869 	}
1870 
1871 #if VMS_DEBUG
1872       _bfd_vms_debug (4, "etir: %s(%d)\n",
1873 		      _bfd_vms_etir_name (cmd), cmd);
1874       _bfd_hexdump (8, ptr, cmd_length - 4, 0);
1875 #endif
1876 
1877       switch (cmd)
1878 	{
1879 	  /* Stack global
1880 	     arg: cs	symbol name
1881 
1882 	     stack 32 bit value of symbol (high bits set to 0).  */
1883 	case ETIR__C_STA_GBL:
1884 	  _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h);
1885 	  _bfd_vms_push (abfd, op1, alpha_vms_sym_to_ctxt (h));
1886 	  break;
1887 
1888 	  /* Stack longword
1889 	     arg: lw	value
1890 
1891 	     stack 32 bit value, sign extend to 64 bit.  */
1892 	case ETIR__C_STA_LW:
1893 	  if (ptr + 4 >= maxptr)
1894 	    goto corrupt_etir;
1895 	  _bfd_vms_push (abfd, bfd_getl32 (ptr), RELC_NONE);
1896 	  break;
1897 
1898 	  /* Stack quadword
1899 	     arg: qw	value
1900 
1901 	     stack 64 bit value of symbol.  */
1902 	case ETIR__C_STA_QW:
1903 	  if (ptr + 8 >= maxptr)
1904 	    goto corrupt_etir;
1905 	  _bfd_vms_push (abfd, bfd_getl64 (ptr), RELC_NONE);
1906 	  break;
1907 
1908 	  /* Stack psect base plus quadword offset
1909 	     arg: lw	section index
1910 	     qw	signed quadword offset (low 32 bits)
1911 
1912 	     Stack qw argument and section index
1913 	     (see ETIR__C_STO_OFF, ETIR__C_CTL_SETRB).  */
1914 	case ETIR__C_STA_PQ:
1915 	  {
1916 	    int psect;
1917 
1918 	    if (ptr + 12 >= maxptr)
1919 	      goto corrupt_etir;
1920 	    psect = bfd_getl32 (ptr);
1921 	    if ((unsigned int) psect >= PRIV (section_count))
1922 	      {
1923 		_bfd_error_handler (_("bad section index in %s"),
1924 				    _bfd_vms_etir_name (cmd));
1925 		bfd_set_error (bfd_error_bad_value);
1926 		return FALSE;
1927 	      }
1928 	    op1 = bfd_getl64 (ptr + 4);
1929 	    _bfd_vms_push (abfd, op1, psect | RELC_SEC_BASE);
1930 	  }
1931 	  break;
1932 
1933 	case ETIR__C_STA_LI:
1934 	case ETIR__C_STA_MOD:
1935 	case ETIR__C_STA_CKARG:
1936 	  _bfd_error_handler (_("unsupported STA cmd %s"),
1937 			      _bfd_vms_etir_name (cmd));
1938 	  return FALSE;
1939 	  break;
1940 
1941 	  /* Store byte: pop stack, write byte
1942 	     arg: -.  */
1943 	case ETIR__C_STO_B:
1944 	  _bfd_vms_pop (abfd, &op1, &rel1);
1945 	  if (rel1 != RELC_NONE)
1946 	    goto bad_context;
1947 	  image_write_b (abfd, (unsigned int) op1 & 0xff);
1948 	  break;
1949 
1950 	  /* Store word: pop stack, write word
1951 	     arg: -.  */
1952 	case ETIR__C_STO_W:
1953 	  _bfd_vms_pop (abfd, &op1, &rel1);
1954 	  if (rel1 != RELC_NONE)
1955 	    goto bad_context;
1956 	  image_write_w (abfd, (unsigned int) op1 & 0xffff);
1957 	  break;
1958 
1959 	  /* Store longword: pop stack, write longword
1960 	     arg: -.  */
1961 	case ETIR__C_STO_LW:
1962 	  _bfd_vms_pop (abfd, &op1, &rel1);
1963 	  if (rel1 & RELC_SEC_BASE)
1964 	    {
1965 	      op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1966 	      rel1 = RELC_REL;
1967 	    }
1968 	  else if (rel1 & RELC_SHR_BASE)
1969 	    {
1970 	      alpha_vms_add_fixup_lr (info, rel1 & RELC_MASK, op1);
1971 	      rel1 = RELC_NONE;
1972 	    }
1973 	  if (rel1 != RELC_NONE)
1974 	    {
1975 	      if (rel1 != RELC_REL)
1976 		abort ();
1977 	      alpha_vms_add_lw_reloc (info);
1978 	    }
1979 	  image_write_l (abfd, op1);
1980 	  break;
1981 
1982 	  /* Store quadword: pop stack, write quadword
1983 	     arg: -.  */
1984 	case ETIR__C_STO_QW:
1985 	  _bfd_vms_pop (abfd, &op1, &rel1);
1986 	  if (rel1 & RELC_SEC_BASE)
1987 	    {
1988 	      op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1989 	      rel1 = RELC_REL;
1990 	    }
1991 	  else if (rel1 & RELC_SHR_BASE)
1992 	    abort ();
1993 	  if (rel1 != RELC_NONE)
1994 	    {
1995 	      if (rel1 != RELC_REL)
1996 		abort ();
1997 	      alpha_vms_add_qw_reloc (info);
1998 	    }
1999 	  image_write_q (abfd, op1);
2000 	  break;
2001 
2002 	  /* Store immediate repeated: pop stack for repeat count
2003 	     arg: lw	byte count
2004 	     da	data.  */
2005 	case ETIR__C_STO_IMMR:
2006 	  {
2007 	    int size;
2008 
2009 	    if (ptr + 4 >= maxptr)
2010 	      goto corrupt_etir;
2011 	    size = bfd_getl32 (ptr);
2012 	    _bfd_vms_pop (abfd, &op1, &rel1);
2013 	    if (rel1 != RELC_NONE)
2014 	      goto bad_context;
2015 	    while (op1-- > 0)
2016 	      image_write (abfd, ptr + 4, size);
2017 	  }
2018 	  break;
2019 
2020 	  /* Store global: write symbol value
2021 	     arg: cs	global symbol name.  */
2022 	case ETIR__C_STO_GBL:
2023 	  _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h);
2024 	  if (h && h->sym)
2025 	    {
2026 	      if (h->sym->typ == EGSD__C_SYMG)
2027 		{
2028 		  alpha_vms_add_fixup_qr
2029 		    (info, abfd, h->sym->owner, h->sym->symbol_vector);
2030 		  op1 = 0;
2031 		}
2032 	      else
2033 		{
2034 		  op1 = alpha_vms_get_sym_value (h->sym->section,
2035 						 h->sym->value);
2036 		  alpha_vms_add_qw_reloc (info);
2037 		}
2038 	    }
2039 	  image_write_q (abfd, op1);
2040 	  break;
2041 
2042 	  /* Store code address: write address of entry point
2043 	     arg: cs	global symbol name (procedure).  */
2044 	case ETIR__C_STO_CA:
2045 	  _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h);
2046 	  if (h && h->sym)
2047 	    {
2048 	      if (h->sym->flags & EGSY__V_NORM)
2049 		{
2050 		  /* That's really a procedure.  */
2051 		  if (h->sym->typ == EGSD__C_SYMG)
2052 		    {
2053 		      alpha_vms_add_fixup_ca (info, abfd, h->sym->owner);
2054 		      op1 = h->sym->symbol_vector;
2055 		    }
2056 		  else
2057 		    {
2058 		      op1 = alpha_vms_get_sym_value (h->sym->code_section,
2059 						     h->sym->code_value);
2060 		      alpha_vms_add_qw_reloc (info);
2061 		    }
2062 		}
2063 	      else
2064 		{
2065 		  /* Symbol is not a procedure.  */
2066 		  abort ();
2067 		}
2068 	    }
2069 	  image_write_q (abfd, op1);
2070 	  break;
2071 
2072 	  /* Store offset to psect: pop stack, add low 32 bits to base of psect
2073 	     arg: none.  */
2074 	case ETIR__C_STO_OFF:
2075 	  _bfd_vms_pop (abfd, &op1, &rel1);
2076 
2077 	  if (!(rel1 & RELC_SEC_BASE))
2078 	    abort ();
2079 
2080 	  op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
2081 	  rel1 = RELC_REL;
2082 	  image_write_q (abfd, op1);
2083 	  break;
2084 
2085 	  /* Store immediate
2086 	     arg: lw	count of bytes
2087 	     da	data.  */
2088 	case ETIR__C_STO_IMM:
2089 	  {
2090 	    unsigned int size;
2091 
2092 	    if (ptr + 4 >= maxptr)
2093 	      goto corrupt_etir;
2094 	    size = bfd_getl32 (ptr);
2095 	    image_write (abfd, ptr + 4, size);
2096 	  }
2097 	  break;
2098 
2099 	  /* This code is 'reserved to digital' according to the openVMS
2100 	     linker manual, however it is generated by the DEC C compiler
2101 	     and defined in the include file.
2102 	     FIXME, since the following is just a guess
2103 	     store global longword: store 32bit value of symbol
2104 	     arg: cs	symbol name.  */
2105 	case ETIR__C_STO_GBL_LW:
2106 	  _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h);
2107 #if 0
2108 	  abort ();
2109 #endif
2110 	  image_write_l (abfd, op1);
2111 	  break;
2112 
2113 	case ETIR__C_STO_RB:
2114 	case ETIR__C_STO_AB:
2115 	case ETIR__C_STO_LP_PSB:
2116 	  _bfd_error_handler (_("%s: not supported"),
2117 			      _bfd_vms_etir_name (cmd));
2118 	  return FALSE;
2119 	  break;
2120 	case ETIR__C_STO_HINT_GBL:
2121 	case ETIR__C_STO_HINT_PS:
2122 	  _bfd_error_handler (_("%s: not implemented"),
2123 			      _bfd_vms_etir_name (cmd));
2124 	  return FALSE;
2125 	  break;
2126 
2127 	  /* 200 Store-conditional Linkage Pair
2128 	     arg: none.  */
2129 	case ETIR__C_STC_LP:
2130 
2131 	  /* 202 Store-conditional Address at global address
2132 	     lw	linkage index
2133 	     cs	global name.  */
2134 
2135 	case ETIR__C_STC_GBL:
2136 
2137 	  /* 203 Store-conditional Code Address at global address
2138 	     lw	linkage index
2139 	     cs	procedure name.  */
2140 	case ETIR__C_STC_GCA:
2141 
2142 	  /* 204 Store-conditional Address at psect + offset
2143 	     lw	linkage index
2144 	     lw	psect index
2145 	     qw	offset.  */
2146 	case ETIR__C_STC_PS:
2147 	  _bfd_error_handler (_("%s: not supported"),
2148 			      _bfd_vms_etir_name (cmd));
2149 	  return FALSE;
2150 	  break;
2151 
2152 	  /* 201 Store-conditional Linkage Pair with Procedure Signature
2153 	     lw	linkage index
2154 	     cs	procedure name
2155 	     by	signature length
2156 	     da	signature.  */
2157 
2158 	case ETIR__C_STC_LP_PSB:
2159 	  _bfd_vms_get_value (abfd, ptr + 4, maxptr, info, &op1, &h);
2160 	  if (h && h->sym)
2161 	    {
2162 	      if (h->sym->typ == EGSD__C_SYMG)
2163 		{
2164 		  alpha_vms_add_fixup_lp (info, abfd, h->sym->owner);
2165 		  op1 = h->sym->symbol_vector;
2166 		  op2 = 0;
2167 		}
2168 	      else
2169 		{
2170 		  op1 = alpha_vms_get_sym_value (h->sym->code_section,
2171 						 h->sym->code_value);
2172 		  op2 = alpha_vms_get_sym_value (h->sym->section,
2173 						h->sym->value);
2174 		}
2175 	    }
2176 	  else
2177 	    {
2178 	      /* Undefined symbol.  */
2179 	      op1 = 0;
2180 	      op2 = 0;
2181 	    }
2182 	  image_write_q (abfd, op1);
2183 	  image_write_q (abfd, op2);
2184 	  break;
2185 
2186 	  /* 205 Store-conditional NOP at address of global
2187 	     arg: none.  */
2188 	case ETIR__C_STC_NOP_GBL:
2189 	  /* ALPHA_R_NOP */
2190 
2191 	  /* 207 Store-conditional BSR at global address
2192 	     arg: none.  */
2193 
2194 	case ETIR__C_STC_BSR_GBL:
2195 	  /* ALPHA_R_BSR */
2196 
2197 	  /* 209 Store-conditional LDA at global address
2198 	     arg: none.  */
2199 
2200 	case ETIR__C_STC_LDA_GBL:
2201 	  /* ALPHA_R_LDA */
2202 
2203 	  /* 211 Store-conditional BSR or Hint at global address
2204 	     arg: none.  */
2205 
2206 	case ETIR__C_STC_BOH_GBL:
2207 	  /* Currentl ignored.  */
2208 	  break;
2209 
2210 	  /* 213 Store-conditional NOP,BSR or HINT at global address
2211 	     arg: none.  */
2212 
2213 	case ETIR__C_STC_NBH_GBL:
2214 
2215 	  /* 206 Store-conditional NOP at pect + offset
2216 	     arg: none.  */
2217 
2218 	case ETIR__C_STC_NOP_PS:
2219 
2220 	  /* 208 Store-conditional BSR at pect + offset
2221 	     arg: none.  */
2222 
2223 	case ETIR__C_STC_BSR_PS:
2224 
2225 	  /* 210 Store-conditional LDA at psect + offset
2226 	     arg: none.  */
2227 
2228 	case ETIR__C_STC_LDA_PS:
2229 
2230 	  /* 212 Store-conditional BSR or Hint at pect + offset
2231 	     arg: none.  */
2232 
2233 	case ETIR__C_STC_BOH_PS:
2234 
2235 	  /* 214 Store-conditional NOP, BSR or HINT at psect + offset
2236 	     arg: none.  */
2237 	case ETIR__C_STC_NBH_PS:
2238 	  _bfd_error_handler (_("%s: not supported"),
2239 			      _bfd_vms_etir_name (cmd));
2240 	  return FALSE;
2241 	  break;
2242 
2243 	  /* Det relocation base: pop stack, set image location counter
2244 	     arg: none.  */
2245 	case ETIR__C_CTL_SETRB:
2246 	  _bfd_vms_pop (abfd, &op1, &rel1);
2247 	  if (!(rel1 & RELC_SEC_BASE))
2248 	    abort ();
2249 	  image_set_ptr (abfd, op1, rel1 & RELC_MASK, info);
2250 	  break;
2251 
2252 	  /* Augment relocation base: increment image location counter by offset
2253 	     arg: lw	offset value.  */
2254 	case ETIR__C_CTL_AUGRB:
2255 	  if (ptr + 4 >= maxptr)
2256 	    goto corrupt_etir;
2257 	  op1 = bfd_getl32 (ptr);
2258 	  image_inc_ptr (abfd, op1);
2259 	  break;
2260 
2261 	  /* Define location: pop index, save location counter under index
2262 	     arg: none.  */
2263 	case ETIR__C_CTL_DFLOC:
2264 	  _bfd_vms_pop (abfd, &op1, &rel1);
2265 	  if (rel1 != RELC_NONE)
2266 	    goto bad_context;
2267 	  dst_define_location (abfd, op1);
2268 	  break;
2269 
2270 	  /* Set location: pop index, restore location counter from index
2271 	     arg: none.  */
2272 	case ETIR__C_CTL_STLOC:
2273 	  _bfd_vms_pop (abfd, &op1, &rel1);
2274 	  if (rel1 != RELC_NONE)
2275 	    goto bad_context;
2276 	  dst_restore_location (abfd, op1);
2277 	  break;
2278 
2279 	  /* Stack defined location: pop index, push location counter from index
2280 	     arg: none.  */
2281 	case ETIR__C_CTL_STKDL:
2282 	  _bfd_vms_pop (abfd, &op1, &rel1);
2283 	  if (rel1 != RELC_NONE)
2284 	    goto bad_context;
2285 	  _bfd_vms_push (abfd, dst_retrieve_location (abfd, op1), RELC_NONE);
2286 	  break;
2287 
2288 	case ETIR__C_OPR_NOP:      /* No-op.  */
2289 	  break;
2290 
2291 	case ETIR__C_OPR_ADD:      /* Add.  */
2292 	  _bfd_vms_pop (abfd, &op1, &rel1);
2293 	  _bfd_vms_pop (abfd, &op2, &rel2);
2294 	  if (rel1 == RELC_NONE && rel2 != RELC_NONE)
2295 	    rel1 = rel2;
2296 	  else if (rel1 != RELC_NONE && rel2 != RELC_NONE)
2297 	    goto bad_context;
2298 	  _bfd_vms_push (abfd, op1 + op2, rel1);
2299 	  break;
2300 
2301 	case ETIR__C_OPR_SUB:      /* Subtract.  */
2302 	  _bfd_vms_pop (abfd, &op1, &rel1);
2303 	  _bfd_vms_pop (abfd, &op2, &rel2);
2304 	  if (rel1 == RELC_NONE && rel2 != RELC_NONE)
2305 	    rel1 = rel2;
2306 	  else if ((rel1 & RELC_SEC_BASE) && (rel2 & RELC_SEC_BASE))
2307 	    {
2308 	      op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
2309 	      op2 = alpha_vms_fix_sec_rel (abfd, info, rel2, op2);
2310 	      rel1 = RELC_NONE;
2311 	    }
2312 	  else if (rel1 != RELC_NONE && rel2 != RELC_NONE)
2313 	    goto bad_context;
2314 	  _bfd_vms_push (abfd, op2 - op1, rel1);
2315 	  break;
2316 
2317 	case ETIR__C_OPR_MUL:      /* Multiply.  */
2318 	  _bfd_vms_pop (abfd, &op1, &rel1);
2319 	  _bfd_vms_pop (abfd, &op2, &rel2);
2320 	  if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2321 	    goto bad_context;
2322 	  _bfd_vms_push (abfd, op1 * op2, RELC_NONE);
2323 	  break;
2324 
2325 	case ETIR__C_OPR_DIV:      /* Divide.  */
2326 	  _bfd_vms_pop (abfd, &op1, &rel1);
2327 	  _bfd_vms_pop (abfd, &op2, &rel2);
2328 	  if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2329 	    goto bad_context;
2330 	  if (op2 == 0)
2331 	    _bfd_vms_push (abfd, 0, RELC_NONE);
2332 	  else
2333 	    _bfd_vms_push (abfd, op2 / op1, RELC_NONE);
2334 	  break;
2335 
2336 	case ETIR__C_OPR_AND:      /* Logical AND.  */
2337 	  _bfd_vms_pop (abfd, &op1, &rel1);
2338 	  _bfd_vms_pop (abfd, &op2, &rel2);
2339 	  if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2340 	    goto bad_context;
2341 	  _bfd_vms_push (abfd, op1 & op2, RELC_NONE);
2342 	  break;
2343 
2344 	case ETIR__C_OPR_IOR:      /* Logical inclusive OR.  */
2345 	  _bfd_vms_pop (abfd, &op1, &rel1);
2346 	  _bfd_vms_pop (abfd, &op2, &rel2);
2347 	  if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2348 	    goto bad_context;
2349 	  _bfd_vms_push (abfd, op1 | op2, RELC_NONE);
2350 	  break;
2351 
2352 	case ETIR__C_OPR_EOR:      /* Logical exclusive OR.  */
2353 	  _bfd_vms_pop (abfd, &op1, &rel1);
2354 	  _bfd_vms_pop (abfd, &op2, &rel2);
2355 	  if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2356 	    goto bad_context;
2357 	  _bfd_vms_push (abfd, op1 ^ op2, RELC_NONE);
2358 	  break;
2359 
2360 	case ETIR__C_OPR_NEG:      /* Negate.  */
2361 	  _bfd_vms_pop (abfd, &op1, &rel1);
2362 	  if (rel1 != RELC_NONE)
2363 	    goto bad_context;
2364 	  _bfd_vms_push (abfd, -op1, RELC_NONE);
2365 	  break;
2366 
2367 	case ETIR__C_OPR_COM:      /* Complement.  */
2368 	  _bfd_vms_pop (abfd, &op1, &rel1);
2369 	  if (rel1 != RELC_NONE)
2370 	    goto bad_context;
2371 	  _bfd_vms_push (abfd, ~op1, RELC_NONE);
2372 	  break;
2373 
2374 	case ETIR__C_OPR_ASH:      /* Arithmetic shift.  */
2375 	  _bfd_vms_pop (abfd, &op1, &rel1);
2376 	  _bfd_vms_pop (abfd, &op2, &rel2);
2377 	  if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2378 	    {
2379 	    bad_context:
2380 	      _bfd_error_handler (_("invalid use of %s with contexts"),
2381 				  _bfd_vms_etir_name (cmd));
2382 	      return FALSE;
2383 	    }
2384 	  if ((int)op2 < 0)		/* Shift right.  */
2385 	    op1 >>= -(int)op2;
2386 	  else			/* Shift left.  */
2387 	    op1 <<= (int)op2;
2388 	  _bfd_vms_push (abfd, op1, RELC_NONE); /* FIXME: sym.  */
2389 	  break;
2390 
2391 	case ETIR__C_OPR_INSV:      /* Insert field.   */
2392 	case ETIR__C_OPR_USH:       /* Unsigned shift.   */
2393 	case ETIR__C_OPR_ROT:       /* Rotate.  */
2394 	case ETIR__C_OPR_REDEF:     /* Redefine symbol to current location.  */
2395 	case ETIR__C_OPR_DFLIT:     /* Define a literal.  */
2396 	  _bfd_error_handler (_("%s: not supported"),
2397 			      _bfd_vms_etir_name (cmd));
2398 	  return FALSE;
2399 	  break;
2400 
2401 	case ETIR__C_OPR_SEL:      /* Select.  */
2402 	  _bfd_vms_pop (abfd, &op1, &rel1);
2403 	  if (op1 & 0x01L)
2404 	    _bfd_vms_pop (abfd, &op1, &rel1);
2405 	  else
2406 	    {
2407 	      _bfd_vms_pop (abfd, &op1, &rel1);
2408 	      _bfd_vms_pop (abfd, &op2, &rel2);
2409 	      _bfd_vms_push (abfd, op1, rel1);
2410 	    }
2411 	  break;
2412 
2413 	default:
2414 	  _bfd_error_handler (_("reserved cmd %d"), cmd);
2415 	  return FALSE;
2416 	  break;
2417 	}
2418 
2419       ptr += cmd_length - 4;
2420     }
2421 
2422   return TRUE;
2423 }
2424 
2425 /* Process EDBG/ETBT record.
2426    Return TRUE on success, FALSE on error  */
2427 
2428 static bfd_boolean
2429 vms_slurp_debug (bfd *abfd)
2430 {
2431   asection *section = PRIV (dst_section);
2432 
2433   if (section == NULL)
2434     {
2435       /* We have no way to find out beforehand how much debug info there
2436 	 is in an object file, so pick an initial amount and grow it as
2437 	 needed later.  */
2438       flagword flags = SEC_HAS_CONTENTS | SEC_DEBUGGING | SEC_RELOC
2439 	| SEC_IN_MEMORY;
2440 
2441       section = bfd_make_section (abfd, "$DST$");
2442       if (!section)
2443 	return FALSE;
2444       if (!bfd_set_section_flags (abfd, section, flags))
2445 	return FALSE;
2446       PRIV (dst_section) = section;
2447     }
2448 
2449   PRIV (image_section) = section;
2450   PRIV (image_offset) = section->size;
2451 
2452   if (!_bfd_vms_slurp_etir (abfd, NULL))
2453     return FALSE;
2454 
2455   section->size = PRIV (image_offset);
2456   return TRUE;
2457 }
2458 
2459 /* Process EDBG record.
2460    Return TRUE on success, FALSE on error.  */
2461 
2462 static bfd_boolean
2463 _bfd_vms_slurp_edbg (bfd *abfd)
2464 {
2465   vms_debug2 ((2, "EDBG\n"));
2466 
2467   abfd->flags |= HAS_DEBUG | HAS_LINENO;
2468 
2469   return vms_slurp_debug (abfd);
2470 }
2471 
2472 /* Process ETBT record.
2473    Return TRUE on success, FALSE on error.  */
2474 
2475 static bfd_boolean
2476 _bfd_vms_slurp_etbt (bfd *abfd)
2477 {
2478   vms_debug2 ((2, "ETBT\n"));
2479 
2480   abfd->flags |= HAS_LINENO;
2481 
2482   return vms_slurp_debug (abfd);
2483 }
2484 
2485 /* Process EEOM record.
2486    Return TRUE on success, FALSE on error.  */
2487 
2488 static bfd_boolean
2489 _bfd_vms_slurp_eeom (bfd *abfd)
2490 {
2491   struct vms_eeom *eeom = (struct vms_eeom *) PRIV (recrd.rec);
2492 
2493   vms_debug2 ((2, "EEOM\n"));
2494 
2495   /* PR 21813: Check for an undersized record.  */
2496   if (PRIV (recrd.buf_size) < sizeof (* eeom))
2497     {
2498       _bfd_error_handler (_("corrupt EEOM record - size is too small"));
2499       bfd_set_error (bfd_error_bad_value);
2500       return FALSE;
2501     }
2502 
2503   PRIV (eom_data).eom_l_total_lps = bfd_getl32 (eeom->total_lps);
2504   PRIV (eom_data).eom_w_comcod = bfd_getl16 (eeom->comcod);
2505   if (PRIV (eom_data).eom_w_comcod > 1)
2506     {
2507       _bfd_error_handler (_("object module not error-free !"));
2508       bfd_set_error (bfd_error_bad_value);
2509       return FALSE;
2510     }
2511 
2512   PRIV (eom_data).eom_has_transfer = FALSE;
2513   if (PRIV (recrd.rec_size) > 10)
2514     {
2515       PRIV (eom_data).eom_has_transfer = TRUE;
2516       PRIV (eom_data).eom_b_tfrflg = eeom->tfrflg;
2517       PRIV (eom_data).eom_l_psindx = bfd_getl32 (eeom->psindx);
2518       PRIV (eom_data).eom_l_tfradr = bfd_getl32 (eeom->tfradr);
2519 
2520       abfd->start_address = PRIV (eom_data).eom_l_tfradr;
2521     }
2522   return TRUE;
2523 }
2524 
2525 /* Slurp an ordered set of VMS object records.  Return FALSE on error.  */
2526 
2527 static bfd_boolean
2528 _bfd_vms_slurp_object_records (bfd * abfd)
2529 {
2530   bfd_boolean err;
2531   int type;
2532 
2533   do
2534     {
2535       vms_debug2 ((7, "reading at %08lx\n", (unsigned long)bfd_tell (abfd)));
2536 
2537       type = _bfd_vms_get_object_record (abfd);
2538       if (type < 0)
2539 	{
2540 	  vms_debug2 ((2, "next_record failed\n"));
2541 	  return FALSE;
2542 	}
2543 
2544       switch (type)
2545 	{
2546 	case EOBJ__C_EMH:
2547 	  err = _bfd_vms_slurp_ehdr (abfd);
2548 	  break;
2549 	case EOBJ__C_EEOM:
2550 	  err = _bfd_vms_slurp_eeom (abfd);
2551 	  break;
2552 	case EOBJ__C_EGSD:
2553 	  err = _bfd_vms_slurp_egsd (abfd);
2554 	  break;
2555 	case EOBJ__C_ETIR:
2556 	  err = TRUE; /* _bfd_vms_slurp_etir (abfd); */
2557 	  break;
2558 	case EOBJ__C_EDBG:
2559 	  err = _bfd_vms_slurp_edbg (abfd);
2560 	  break;
2561 	case EOBJ__C_ETBT:
2562 	  err = _bfd_vms_slurp_etbt (abfd);
2563 	  break;
2564 	default:
2565 	  err = FALSE;
2566 	}
2567       if (!err)
2568 	{
2569 	  vms_debug2 ((2, "slurp type %d failed\n", type));
2570 	  return FALSE;
2571 	}
2572     }
2573   while (type != EOBJ__C_EEOM);
2574 
2575   return TRUE;
2576 }
2577 
2578 /* Initialize private data  */
2579 static bfd_boolean
2580 vms_initialize (bfd * abfd)
2581 {
2582   bfd_size_type amt;
2583 
2584   amt = sizeof (struct vms_private_data_struct);
2585   abfd->tdata.any = bfd_zalloc (abfd, amt);
2586   if (abfd->tdata.any == NULL)
2587     return FALSE;
2588 
2589   PRIV (recrd.file_format) = FF_UNKNOWN;
2590 
2591   amt = sizeof (struct stack_struct) * STACKSIZE;
2592   PRIV (stack) = bfd_alloc (abfd, amt);
2593   if (PRIV (stack) == NULL)
2594     goto error_ret1;
2595 
2596   return TRUE;
2597 
2598  error_ret1:
2599   bfd_release (abfd, abfd->tdata.any);
2600   abfd->tdata.any = NULL;
2601   return FALSE;
2602 }
2603 
2604 /* Check the format for a file being read.
2605    Return a (bfd_target *) if it's an object file or zero if not.  */
2606 
2607 static const struct bfd_target *
2608 alpha_vms_object_p (bfd *abfd)
2609 {
2610   void *tdata_save = abfd->tdata.any;
2611   unsigned int test_len;
2612   unsigned char *buf;
2613 
2614   vms_debug2 ((1, "vms_object_p(%p)\n", abfd));
2615 
2616   /* Allocate alpha-vms specific data.  */
2617   if (!vms_initialize (abfd))
2618     goto error_ret;
2619 
2620   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET))
2621     goto err_wrong_format;
2622 
2623   /* The first challenge with VMS is to discover the kind of the file.
2624 
2625      Image files (executable or shared images) are stored as a raw
2626      stream of bytes (like on UNIX), but there is no magic number.
2627 
2628      Object files are written with RMS (record management service), ie
2629      each records are preceeded by its length (on a word - 2 bytes), and
2630      padded for word-alignment.  That would be simple but when files
2631      are transfered to a UNIX filesystem (using ftp), records are lost.
2632      Only the raw content of the records are transfered.  Fortunately,
2633      the Alpha Object file format also store the length of the record
2634      in the records.  Is that clear ?  */
2635 
2636   /* Minimum is 6 bytes for objects (2 bytes size, 2 bytes record id,
2637      2 bytes size repeated) and 12 bytes for images (4 bytes major id,
2638      4 bytes minor id, 4 bytes length).  */
2639   test_len = 12;
2640 
2641   /* Size the main buffer.  */
2642   buf = (unsigned char *) bfd_malloc (test_len);
2643   if (buf == NULL)
2644     goto error_ret;
2645   PRIV (recrd.buf) = buf;
2646   PRIV (recrd.buf_size) = test_len;
2647 
2648   /* Initialize the record pointer.  */
2649   PRIV (recrd.rec) = buf;
2650 
2651   if (bfd_bread (buf, test_len, abfd) != test_len)
2652     goto err_wrong_format;
2653 
2654   /* Is it an image?  */
2655   if ((bfd_getl32 (buf) == EIHD__K_MAJORID)
2656       && (bfd_getl32 (buf + 4) == EIHD__K_MINORID))
2657     {
2658       unsigned int to_read;
2659       unsigned int read_so_far;
2660       unsigned int remaining;
2661       unsigned int eisd_offset, eihs_offset;
2662 
2663       /* Extract the header size.  */
2664       PRIV (recrd.rec_size) = bfd_getl32 (buf + EIHD__L_SIZE);
2665 
2666       /* The header size is 0 for DSF files.  */
2667       if (PRIV (recrd.rec_size) == 0)
2668 	PRIV (recrd.rec_size) = sizeof (struct vms_eihd);
2669 
2670       if (PRIV (recrd.rec_size) > PRIV (recrd.buf_size))
2671 	{
2672 	  buf = bfd_realloc_or_free (buf, PRIV (recrd.rec_size));
2673 
2674 	  if (buf == NULL)
2675 	    {
2676 	      PRIV (recrd.buf) = NULL;
2677 	      goto error_ret;
2678 	    }
2679 	  PRIV (recrd.buf) = buf;
2680 	  PRIV (recrd.buf_size) = PRIV (recrd.rec_size);
2681 	}
2682 
2683       /* PR 21813: Check for a truncated record.  */
2684       if (PRIV (recrd.rec_size < test_len))
2685 	goto error_ret;
2686       /* Read the remaining record.  */
2687       remaining = PRIV (recrd.rec_size) - test_len;
2688       to_read = MIN (VMS_BLOCK_SIZE - test_len, remaining);
2689       read_so_far = test_len;
2690 
2691       while (remaining > 0)
2692 	{
2693 	  if (bfd_bread (buf + read_so_far, to_read, abfd) != to_read)
2694 	    goto err_wrong_format;
2695 
2696 	  read_so_far += to_read;
2697 	  remaining -= to_read;
2698 
2699 	  to_read = MIN (VMS_BLOCK_SIZE, remaining);
2700 	}
2701 
2702       /* Reset the record pointer.  */
2703       PRIV (recrd.rec) = buf;
2704 
2705       /* PR 17512: file: 7d7c57c2.  */
2706       if (PRIV (recrd.rec_size) < sizeof (struct vms_eihd))
2707 	goto error_ret;
2708       vms_debug2 ((2, "file type is image\n"));
2709 
2710       if (!_bfd_vms_slurp_eihd (abfd, &eisd_offset, &eihs_offset))
2711 	goto err_wrong_format;
2712 
2713       if (!_bfd_vms_slurp_eisd (abfd, eisd_offset))
2714 	goto err_wrong_format;
2715 
2716       /* EIHS is optional.  */
2717       if (eihs_offset != 0 && !_bfd_vms_slurp_eihs (abfd, eihs_offset))
2718 	goto err_wrong_format;
2719     }
2720   else
2721     {
2722       int type;
2723 
2724       /* Assume it's a module and adjust record pointer if necessary.  */
2725       maybe_adjust_record_pointer_for_object (abfd);
2726 
2727       /* But is it really a module?  */
2728       if (bfd_getl16 (PRIV (recrd.rec)) <= EOBJ__C_MAXRECTYP
2729 	  && bfd_getl16 (PRIV (recrd.rec) + 2) <= EOBJ__C_MAXRECSIZ)
2730 	{
2731 	  if (vms_get_remaining_object_record (abfd, test_len) <= 0)
2732 	    goto err_wrong_format;
2733 
2734 	  vms_debug2 ((2, "file type is module\n"));
2735 
2736 	  type = bfd_getl16 (PRIV (recrd.rec));
2737 	  if (type != EOBJ__C_EMH || !_bfd_vms_slurp_ehdr (abfd))
2738 	    goto err_wrong_format;
2739 
2740 	  if (!_bfd_vms_slurp_object_records (abfd))
2741 	    goto err_wrong_format;
2742 	}
2743       else
2744 	goto err_wrong_format;
2745     }
2746 
2747   /* Set arch_info to alpha.   */
2748 
2749   if (! bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0))
2750     goto err_wrong_format;
2751 
2752   return abfd->xvec;
2753 
2754  err_wrong_format:
2755   bfd_set_error (bfd_error_wrong_format);
2756 
2757  error_ret:
2758   if (PRIV (recrd.buf))
2759     free (PRIV (recrd.buf));
2760   if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
2761     bfd_release (abfd, abfd->tdata.any);
2762   abfd->tdata.any = tdata_save;
2763   return NULL;
2764 }
2765 
2766 /* Image write.  */
2767 
2768 /* Write an EMH/MHD record.  */
2769 
2770 static void
2771 _bfd_vms_write_emh (bfd *abfd)
2772 {
2773   struct vms_rec_wr *recwr = &PRIV (recwr);
2774 
2775   _bfd_vms_output_alignment (recwr, 2);
2776 
2777   /* EMH.  */
2778   _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
2779   _bfd_vms_output_short (recwr, EMH__C_MHD);
2780   _bfd_vms_output_short (recwr, EOBJ__C_STRLVL);
2781   _bfd_vms_output_long (recwr, 0);
2782   _bfd_vms_output_long (recwr, 0);
2783   _bfd_vms_output_long (recwr, MAX_OUTREC_SIZE);
2784 
2785   /* Create module name from filename.  */
2786   if (bfd_get_filename (abfd) != 0)
2787     {
2788       char *module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
2789       _bfd_vms_output_counted (recwr, module);
2790       free (module);
2791     }
2792   else
2793     _bfd_vms_output_counted (recwr, "NONAME");
2794 
2795   _bfd_vms_output_counted (recwr, BFD_VERSION_STRING);
2796   _bfd_vms_output_dump (recwr, get_vms_time_string (), EMH_DATE_LENGTH);
2797   _bfd_vms_output_fill (recwr, 0, EMH_DATE_LENGTH);
2798   _bfd_vms_output_end (abfd, recwr);
2799 }
2800 
2801 /* Write an EMH/LMN record.  */
2802 
2803 static void
2804 _bfd_vms_write_lmn (bfd *abfd, const char *name)
2805 {
2806   char version [64];
2807   struct vms_rec_wr *recwr = &PRIV (recwr);
2808   unsigned int ver = BFD_VERSION / 10000;
2809 
2810   /* LMN.  */
2811   _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
2812   _bfd_vms_output_short (recwr, EMH__C_LNM);
2813   snprintf (version, sizeof (version), "%s %d.%d.%d", name,
2814 	    ver / 10000, (ver / 100) % 100, ver % 100);
2815   _bfd_vms_output_dump (recwr, (unsigned char *)version, strlen (version));
2816   _bfd_vms_output_end (abfd, recwr);
2817 }
2818 
2819 
2820 /* Write eom record for bfd abfd.  Return FALSE on error.  */
2821 
2822 static bfd_boolean
2823 _bfd_vms_write_eeom (bfd *abfd)
2824 {
2825   struct vms_rec_wr *recwr = &PRIV (recwr);
2826 
2827   vms_debug2 ((2, "vms_write_eeom\n"));
2828 
2829   _bfd_vms_output_alignment (recwr, 2);
2830 
2831   _bfd_vms_output_begin (recwr, EOBJ__C_EEOM);
2832   _bfd_vms_output_long (recwr, PRIV (vms_linkage_index + 1) >> 1);
2833   _bfd_vms_output_byte (recwr, 0);	/* Completion code.  */
2834   _bfd_vms_output_byte (recwr, 0);	/* Fill byte.  */
2835 
2836   if ((abfd->flags & EXEC_P) == 0
2837       && bfd_get_start_address (abfd) != (bfd_vma)-1)
2838     {
2839       asection *section;
2840 
2841       section = bfd_get_section_by_name (abfd, ".link");
2842       if (section == 0)
2843 	{
2844 	  bfd_set_error (bfd_error_nonrepresentable_section);
2845 	  return FALSE;
2846 	}
2847       _bfd_vms_output_short (recwr, 0);
2848       _bfd_vms_output_long (recwr, (unsigned long) section->target_index);
2849       _bfd_vms_output_long (recwr,
2850 			     (unsigned long) bfd_get_start_address (abfd));
2851       _bfd_vms_output_long (recwr, 0);
2852     }
2853 
2854   _bfd_vms_output_end (abfd, recwr);
2855   return TRUE;
2856 }
2857 
2858 static void
2859 vector_grow1 (struct vector_type *vec, size_t elsz)
2860 {
2861   if (vec->nbr_el + 1 < vec->max_el)
2862     return;
2863 
2864   if (vec->max_el == 0)
2865     {
2866       vec->max_el = 16;
2867       vec->els = bfd_malloc2 (vec->max_el, elsz);
2868     }
2869   else
2870     {
2871       vec->max_el *= 2;
2872       vec->els = bfd_realloc2 (vec->els, vec->max_el, elsz);
2873     }
2874 }
2875 
2876 /* Bump ABFD file position to next block.  */
2877 
2878 static void
2879 alpha_vms_file_position_block (bfd *abfd)
2880 {
2881   /* Next block.  */
2882   PRIV (file_pos) += VMS_BLOCK_SIZE - 1;
2883   PRIV (file_pos) -= (PRIV (file_pos) % VMS_BLOCK_SIZE);
2884 }
2885 
2886 /* Convert from internal structure SRC to external structure DST.  */
2887 
2888 static void
2889 alpha_vms_swap_eisd_out (struct vms_internal_eisd_map *src,
2890 			 struct vms_eisd *dst)
2891 {
2892   bfd_putl32 (src->u.eisd.majorid, dst->majorid);
2893   bfd_putl32 (src->u.eisd.minorid, dst->minorid);
2894   bfd_putl32 (src->u.eisd.eisdsize, dst->eisdsize);
2895   if (src->u.eisd.eisdsize <= EISD__K_LENEND)
2896     return;
2897   bfd_putl32 (src->u.eisd.secsize, dst->secsize);
2898   bfd_putl64 (src->u.eisd.virt_addr, dst->virt_addr);
2899   bfd_putl32 (src->u.eisd.flags, dst->flags);
2900   bfd_putl32 (src->u.eisd.vbn, dst->vbn);
2901   dst->pfc = src->u.eisd.pfc;
2902   dst->matchctl = src->u.eisd.matchctl;
2903   dst->type = src->u.eisd.type;
2904   dst->fill_1 = 0;
2905   if (src->u.eisd.flags & EISD__M_GBL)
2906     {
2907       bfd_putl32 (src->u.gbl_eisd.ident, dst->ident);
2908       memcpy (dst->gblnam, src->u.gbl_eisd.gblnam,
2909 	      src->u.gbl_eisd.gblnam[0] + 1);
2910     }
2911 }
2912 
2913 /* Append EISD to the list of extra eisd for ABFD.  */
2914 
2915 static void
2916 alpha_vms_append_extra_eisd (bfd *abfd, struct vms_internal_eisd_map *eisd)
2917 {
2918   eisd->next = NULL;
2919   if (PRIV (gbl_eisd_head) == NULL)
2920     PRIV (gbl_eisd_head) = eisd;
2921   else
2922     PRIV (gbl_eisd_tail)->next = eisd;
2923   PRIV (gbl_eisd_tail) = eisd;
2924 }
2925 
2926 /* Create an EISD for shared image SHRIMG.
2927    Return FALSE in case of error.  */
2928 
2929 static bfd_boolean
2930 alpha_vms_create_eisd_for_shared (bfd *abfd, bfd *shrimg)
2931 {
2932   struct vms_internal_eisd_map *eisd;
2933   int namlen;
2934 
2935   namlen = strlen (PRIV2 (shrimg, hdr_data.hdr_t_name));
2936   if (namlen + 5 > EISD__K_GBLNAMLEN)
2937     {
2938       /* Won't fit.  */
2939       return FALSE;
2940     }
2941 
2942   eisd = bfd_alloc (abfd, sizeof (*eisd));
2943   if (eisd == NULL)
2944     return FALSE;
2945 
2946   /* Fill the fields.  */
2947   eisd->u.gbl_eisd.common.majorid = EISD__K_MAJORID;
2948   eisd->u.gbl_eisd.common.minorid = EISD__K_MINORID;
2949   eisd->u.gbl_eisd.common.eisdsize = (EISD__K_LEN + 4 + namlen + 5 + 3) & ~3;
2950   eisd->u.gbl_eisd.common.secsize = VMS_BLOCK_SIZE;	/* Must not be 0.  */
2951   eisd->u.gbl_eisd.common.virt_addr = 0;
2952   eisd->u.gbl_eisd.common.flags = EISD__M_GBL;
2953   eisd->u.gbl_eisd.common.vbn = 0;
2954   eisd->u.gbl_eisd.common.pfc = 0;
2955   eisd->u.gbl_eisd.common.matchctl = PRIV2 (shrimg, matchctl);
2956   eisd->u.gbl_eisd.common.type = EISD__K_SHRPIC;
2957 
2958   eisd->u.gbl_eisd.ident = PRIV2 (shrimg, ident);
2959   eisd->u.gbl_eisd.gblnam[0] = namlen + 4;
2960   memcpy (eisd->u.gbl_eisd.gblnam + 1, PRIV2 (shrimg, hdr_data.hdr_t_name),
2961 	  namlen);
2962   memcpy (eisd->u.gbl_eisd.gblnam + 1 + namlen, "_001", 4);
2963 
2964   /* Append it to the list.  */
2965   alpha_vms_append_extra_eisd (abfd, eisd);
2966 
2967   return TRUE;
2968 }
2969 
2970 /* Create an EISD for section SEC.
2971    Return FALSE in case of failure.  */
2972 
2973 static bfd_boolean
2974 alpha_vms_create_eisd_for_section (bfd *abfd, asection *sec)
2975 {
2976   struct vms_internal_eisd_map *eisd;
2977 
2978   /* Only for allocating section.  */
2979   if (!(sec->flags & SEC_ALLOC))
2980     return TRUE;
2981 
2982   BFD_ASSERT (vms_section_data (sec)->eisd == NULL);
2983   eisd = bfd_alloc (abfd, sizeof (*eisd));
2984   if (eisd == NULL)
2985     return FALSE;
2986   vms_section_data (sec)->eisd = eisd;
2987 
2988   /* Fill the fields.  */
2989   eisd->u.eisd.majorid = EISD__K_MAJORID;
2990   eisd->u.eisd.minorid = EISD__K_MINORID;
2991   eisd->u.eisd.eisdsize = EISD__K_LEN;
2992   eisd->u.eisd.secsize =
2993     (sec->size + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
2994   eisd->u.eisd.virt_addr = sec->vma;
2995   eisd->u.eisd.flags = 0;
2996   eisd->u.eisd.vbn = 0; /* To be later defined.  */
2997   eisd->u.eisd.pfc = 0; /* Default.  */
2998   eisd->u.eisd.matchctl = EISD__K_MATALL;
2999   eisd->u.eisd.type = EISD__K_NORMAL;
3000 
3001   if (sec->flags & SEC_CODE)
3002     eisd->u.eisd.flags |= EISD__M_EXE;
3003   if (!(sec->flags & SEC_READONLY))
3004     eisd->u.eisd.flags |= EISD__M_WRT | EISD__M_CRF;
3005 
3006   /* If relocations or fixup will be applied, make this isect writeable.  */
3007   if (sec->flags & SEC_RELOC)
3008     eisd->u.eisd.flags |= EISD__M_WRT | EISD__M_CRF;
3009 
3010   if (!(sec->flags & SEC_HAS_CONTENTS))
3011     {
3012       eisd->u.eisd.flags |= EISD__M_DZRO;
3013       eisd->u.eisd.flags &= ~EISD__M_CRF;
3014     }
3015   if (sec->flags & SEC_LINKER_CREATED)
3016     {
3017       if (strcmp (sec->name, "$FIXUP$") == 0)
3018 	eisd->u.eisd.flags |= EISD__M_FIXUPVEC;
3019     }
3020 
3021   /* Append it to the list.  */
3022   eisd->next = NULL;
3023   if (PRIV (eisd_head) == NULL)
3024     PRIV (eisd_head) = eisd;
3025   else
3026     PRIV (eisd_tail)->next = eisd;
3027   PRIV (eisd_tail) = eisd;
3028 
3029   return TRUE;
3030 }
3031 
3032 /* Layout executable ABFD and write it to the disk.
3033    Return FALSE in case of failure.  */
3034 
3035 static bfd_boolean
3036 alpha_vms_write_exec (bfd *abfd)
3037 {
3038   struct vms_eihd eihd;
3039   struct vms_eiha *eiha;
3040   struct vms_eihi *eihi;
3041   struct vms_eihs *eihs = NULL;
3042   asection *sec;
3043   struct vms_internal_eisd_map *first_eisd;
3044   struct vms_internal_eisd_map *eisd;
3045   asection *dst;
3046   asection *dmt;
3047   file_ptr gst_filepos = 0;
3048   unsigned int lnkflags = 0;
3049 
3050   /* Build the EIHD.  */
3051   PRIV (file_pos) = EIHD__C_LENGTH;
3052 
3053   memset (&eihd, 0, sizeof (eihd));
3054   memset (eihd.fill_2, 0xff, sizeof (eihd.fill_2));
3055 
3056   bfd_putl32 (EIHD__K_MAJORID, eihd.majorid);
3057   bfd_putl32 (EIHD__K_MINORID, eihd.minorid);
3058 
3059   bfd_putl32 (sizeof (eihd), eihd.size);
3060   bfd_putl32 (0, eihd.isdoff);
3061   bfd_putl32 (0, eihd.activoff);
3062   bfd_putl32 (0, eihd.symdbgoff);
3063   bfd_putl32 (0, eihd.imgidoff);
3064   bfd_putl32 (0, eihd.patchoff);
3065   bfd_putl64 (0, eihd.iafva);
3066   bfd_putl32 (0, eihd.version_array_off);
3067 
3068   bfd_putl32 (EIHD__K_EXE, eihd.imgtype);
3069   bfd_putl32 (0, eihd.subtype);
3070 
3071   bfd_putl32 (0, eihd.imgiocnt);
3072   bfd_putl32 (-1, eihd.privreqs);
3073   bfd_putl32 (-1, eihd.privreqs + 4);
3074 
3075   bfd_putl32 ((sizeof (eihd) + VMS_BLOCK_SIZE - 1) / VMS_BLOCK_SIZE,
3076 	      eihd.hdrblkcnt);
3077   bfd_putl32 (0, eihd.ident);
3078   bfd_putl32 (0, eihd.sysver);
3079 
3080   eihd.matchctl = 0;
3081   bfd_putl32 (0, eihd.symvect_size);
3082   bfd_putl32 (16, eihd.virt_mem_block_size);
3083   bfd_putl32 (0, eihd.ext_fixup_off);
3084   bfd_putl32 (0, eihd.noopt_psect_off);
3085   bfd_putl32 (-1, eihd.alias);
3086 
3087   /* Alloc EIHA.  */
3088   eiha = (struct vms_eiha *)((char *) &eihd + PRIV (file_pos));
3089   bfd_putl32 (PRIV (file_pos), eihd.activoff);
3090   PRIV (file_pos) += sizeof (struct vms_eiha);
3091 
3092   bfd_putl32 (sizeof (struct vms_eiha), eiha->size);
3093   bfd_putl32 (0, eiha->spare);
3094   bfd_putl64 (PRIV (transfer_address[0]), eiha->tfradr1);
3095   bfd_putl64 (PRIV (transfer_address[1]), eiha->tfradr2);
3096   bfd_putl64 (PRIV (transfer_address[2]), eiha->tfradr3);
3097   bfd_putl64 (PRIV (transfer_address[3]), eiha->tfradr4);
3098   bfd_putl64 (0, eiha->inishr);
3099 
3100   /* Alloc EIHI.  */
3101   eihi = (struct vms_eihi *)((char *) &eihd + PRIV (file_pos));
3102   bfd_putl32 (PRIV (file_pos), eihd.imgidoff);
3103   PRIV (file_pos) += sizeof (struct vms_eihi);
3104 
3105   bfd_putl32 (EIHI__K_MAJORID, eihi->majorid);
3106   bfd_putl32 (EIHI__K_MINORID, eihi->minorid);
3107   {
3108     char *module;
3109     unsigned int len;
3110 
3111     /* Set module name.  */
3112     module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
3113     len = strlen (module);
3114     if (len > sizeof (eihi->imgnam) - 1)
3115       len = sizeof (eihi->imgnam) - 1;
3116     eihi->imgnam[0] = len;
3117     memcpy (eihi->imgnam + 1, module, len);
3118     free (module);
3119   }
3120   {
3121     unsigned int lo;
3122     unsigned int hi;
3123 
3124     /* Set time.  */
3125     vms_get_time (&hi, &lo);
3126     bfd_putl32 (lo, eihi->linktime + 0);
3127     bfd_putl32 (hi, eihi->linktime + 4);
3128   }
3129   eihi->imgid[0] = 0;
3130   eihi->linkid[0] = 0;
3131   eihi->imgbid[0] = 0;
3132 
3133   /* Alloc EIHS.  */
3134   dst = PRIV (dst_section);
3135   dmt = bfd_get_section_by_name (abfd, "$DMT$");
3136   if (dst != NULL && dst->size != 0)
3137     {
3138       eihs = (struct vms_eihs *)((char *) &eihd + PRIV (file_pos));
3139       bfd_putl32 (PRIV (file_pos), eihd.symdbgoff);
3140       PRIV (file_pos) += sizeof (struct vms_eihs);
3141 
3142       bfd_putl32 (EIHS__K_MAJORID, eihs->majorid);
3143       bfd_putl32 (EIHS__K_MINORID, eihs->minorid);
3144       bfd_putl32 (0, eihs->dstvbn);
3145       bfd_putl32 (0, eihs->dstsize);
3146       bfd_putl32 (0, eihs->gstvbn);
3147       bfd_putl32 (0, eihs->gstsize);
3148       bfd_putl32 (0, eihs->dmtvbn);
3149       bfd_putl32 (0, eihs->dmtsize);
3150     }
3151 
3152   /* One EISD per section.  */
3153   for (sec = abfd->sections; sec; sec = sec->next)
3154     {
3155       if (!alpha_vms_create_eisd_for_section (abfd, sec))
3156 	return FALSE;
3157     }
3158 
3159   /* Merge section EIDS which extra ones.  */
3160   if (PRIV (eisd_tail))
3161     PRIV (eisd_tail)->next = PRIV (gbl_eisd_head);
3162   else
3163     PRIV (eisd_head) = PRIV (gbl_eisd_head);
3164   if (PRIV (gbl_eisd_tail))
3165     PRIV (eisd_tail) = PRIV (gbl_eisd_tail);
3166 
3167   first_eisd = PRIV (eisd_head);
3168 
3169   /* Add end of eisd.  */
3170   if (first_eisd)
3171     {
3172       eisd = bfd_zalloc (abfd, sizeof (*eisd));
3173       if (eisd == NULL)
3174 	return FALSE;
3175       eisd->u.eisd.majorid = 0;
3176       eisd->u.eisd.minorid = 0;
3177       eisd->u.eisd.eisdsize = 0;
3178       alpha_vms_append_extra_eisd (abfd, eisd);
3179     }
3180 
3181   /* Place EISD in the file.  */
3182   for (eisd = first_eisd; eisd; eisd = eisd->next)
3183     {
3184       file_ptr room = VMS_BLOCK_SIZE - (PRIV (file_pos) % VMS_BLOCK_SIZE);
3185 
3186       /* First block is a little bit special: there is a word at the end.  */
3187       if (PRIV (file_pos) < VMS_BLOCK_SIZE && room > 2)
3188 	room -= 2;
3189       if (room < eisd->u.eisd.eisdsize + EISD__K_LENEND)
3190 	alpha_vms_file_position_block (abfd);
3191 
3192       eisd->file_pos = PRIV (file_pos);
3193       PRIV (file_pos) += eisd->u.eisd.eisdsize;
3194 
3195       if (eisd->u.eisd.flags & EISD__M_FIXUPVEC)
3196 	bfd_putl64 (eisd->u.eisd.virt_addr, eihd.iafva);
3197     }
3198 
3199   if (first_eisd != NULL)
3200     {
3201       bfd_putl32 (first_eisd->file_pos, eihd.isdoff);
3202       /* Real size of end of eisd marker.  */
3203       PRIV (file_pos) += EISD__K_LENEND;
3204     }
3205 
3206   bfd_putl32 (PRIV (file_pos), eihd.size);
3207   bfd_putl32 ((PRIV (file_pos) + VMS_BLOCK_SIZE - 1) / VMS_BLOCK_SIZE,
3208 	      eihd.hdrblkcnt);
3209 
3210   /* Place sections.  */
3211   for (sec = abfd->sections; sec; sec = sec->next)
3212     {
3213       if (!(sec->flags & SEC_HAS_CONTENTS))
3214 	continue;
3215 
3216       eisd = vms_section_data (sec)->eisd;
3217 
3218       /* Align on a block.  */
3219       alpha_vms_file_position_block (abfd);
3220       sec->filepos = PRIV (file_pos);
3221 
3222       if (eisd != NULL)
3223 	eisd->u.eisd.vbn = (sec->filepos / VMS_BLOCK_SIZE) + 1;
3224 
3225       PRIV (file_pos) += sec->size;
3226     }
3227 
3228   /* Update EIHS.  */
3229   if (eihs != NULL && dst != NULL)
3230     {
3231       bfd_putl32 ((dst->filepos / VMS_BLOCK_SIZE) + 1, eihs->dstvbn);
3232       bfd_putl32 (dst->size, eihs->dstsize);
3233 
3234       if (dmt != NULL)
3235 	{
3236 	  lnkflags |= EIHD__M_DBGDMT;
3237 	  bfd_putl32 ((dmt->filepos / VMS_BLOCK_SIZE) + 1, eihs->dmtvbn);
3238 	  bfd_putl32 (dmt->size, eihs->dmtsize);
3239 	}
3240       if (PRIV (gsd_sym_count) != 0)
3241 	{
3242 	  alpha_vms_file_position_block (abfd);
3243 	  gst_filepos = PRIV (file_pos);
3244 	  bfd_putl32 ((gst_filepos / VMS_BLOCK_SIZE) + 1, eihs->gstvbn);
3245 	  bfd_putl32 ((PRIV (gsd_sym_count) + 4) / 5 + 4, eihs->gstsize);
3246 	}
3247     }
3248 
3249   /* Write EISD in hdr.  */
3250   for (eisd = first_eisd; eisd && eisd->file_pos < VMS_BLOCK_SIZE;
3251        eisd = eisd->next)
3252     alpha_vms_swap_eisd_out
3253       (eisd, (struct vms_eisd *)((char *)&eihd + eisd->file_pos));
3254 
3255   /* Write first block.  */
3256   bfd_putl32 (lnkflags, eihd.lnkflags);
3257   if (bfd_bwrite (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
3258     return FALSE;
3259 
3260   /* Write remaining eisd.  */
3261   if (eisd != NULL)
3262     {
3263       unsigned char blk[VMS_BLOCK_SIZE];
3264       struct vms_internal_eisd_map *next_eisd;
3265 
3266       memset (blk, 0xff, sizeof (blk));
3267       while (eisd != NULL)
3268 	{
3269 	  alpha_vms_swap_eisd_out
3270 	    (eisd,
3271 	     (struct vms_eisd *)(blk + (eisd->file_pos % VMS_BLOCK_SIZE)));
3272 
3273 	  next_eisd = eisd->next;
3274 	  if (next_eisd == NULL
3275 	      || (next_eisd->file_pos / VMS_BLOCK_SIZE
3276 		  != eisd->file_pos / VMS_BLOCK_SIZE))
3277 	    {
3278 	      if (bfd_bwrite (blk, sizeof (blk), abfd) != sizeof (blk))
3279 		return FALSE;
3280 
3281 	      memset (blk, 0xff, sizeof (blk));
3282 	    }
3283 	  eisd = next_eisd;
3284 	}
3285     }
3286 
3287   /* Write sections.  */
3288   for (sec = abfd->sections; sec; sec = sec->next)
3289     {
3290       unsigned char blk[VMS_BLOCK_SIZE];
3291       bfd_size_type len;
3292 
3293       if (sec->size == 0 || !(sec->flags & SEC_HAS_CONTENTS))
3294 	continue;
3295       if (bfd_bwrite (sec->contents, sec->size, abfd) != sec->size)
3296 	return FALSE;
3297 
3298       /* Pad.  */
3299       len = VMS_BLOCK_SIZE - sec->size % VMS_BLOCK_SIZE;
3300       if (len != VMS_BLOCK_SIZE)
3301 	{
3302 	  memset (blk, 0, len);
3303 	  if (bfd_bwrite (blk, len, abfd) != len)
3304 	    return FALSE;
3305 	}
3306     }
3307 
3308   /* Write GST.  */
3309   if (gst_filepos != 0)
3310     {
3311       struct vms_rec_wr *recwr = &PRIV (recwr);
3312       unsigned int i;
3313 
3314       _bfd_vms_write_emh (abfd);
3315       _bfd_vms_write_lmn (abfd, "GNU LD");
3316 
3317       /* PSC for the absolute section.  */
3318       _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3319       _bfd_vms_output_long (recwr, 0);
3320       _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3321       _bfd_vms_output_short (recwr, 0);
3322       _bfd_vms_output_short (recwr, EGPS__V_PIC | EGPS__V_LIB | EGPS__V_RD);
3323       _bfd_vms_output_long (recwr, 0);
3324       _bfd_vms_output_counted (recwr, ".$$ABS$$.");
3325       _bfd_vms_output_end_subrec (recwr);
3326       _bfd_vms_output_end (abfd, recwr);
3327 
3328       for (i = 0; i < PRIV (gsd_sym_count); i++)
3329 	{
3330 	  struct vms_symbol_entry *sym = PRIV (syms)[i];
3331 	  bfd_vma val;
3332 	  bfd_vma ep;
3333 
3334 	  if ((i % 5) == 0)
3335 	    {
3336 	      _bfd_vms_output_alignment (recwr, 8);
3337 	      _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3338 	      _bfd_vms_output_long (recwr, 0);
3339 	    }
3340 	  _bfd_vms_output_begin_subrec (recwr, EGSD__C_SYMG);
3341 	  _bfd_vms_output_short (recwr, 0); /* Data type, alignment.  */
3342 	  _bfd_vms_output_short (recwr, sym->flags);
3343 
3344 	  if (sym->code_section)
3345 	    ep = alpha_vms_get_sym_value (sym->code_section, sym->code_value);
3346 	  else
3347 	    {
3348 	      BFD_ASSERT (sym->code_value == 0);
3349 	      ep = 0;
3350 	    }
3351 	  val = alpha_vms_get_sym_value (sym->section, sym->value);
3352 	  _bfd_vms_output_quad
3353 	    (recwr, sym->typ == EGSD__C_SYMG ? sym->symbol_vector : val);
3354 	  _bfd_vms_output_quad (recwr, ep);
3355 	  _bfd_vms_output_quad (recwr, val);
3356 	  _bfd_vms_output_long (recwr, 0);
3357 	  _bfd_vms_output_counted (recwr, sym->name);
3358 	  _bfd_vms_output_end_subrec (recwr);
3359 	  if ((i % 5) == 4)
3360 	    _bfd_vms_output_end (abfd, recwr);
3361 	}
3362       if ((i % 5) != 0)
3363 	_bfd_vms_output_end (abfd, recwr);
3364 
3365       if (!_bfd_vms_write_eeom (abfd))
3366 	return FALSE;
3367     }
3368   return TRUE;
3369 }
3370 
3371 /* Object write.  */
3372 
3373 /* Write section and symbol directory of bfd abfd.  Return FALSE on error.  */
3374 
3375 static bfd_boolean
3376 _bfd_vms_write_egsd (bfd *abfd)
3377 {
3378   asection *section;
3379   asymbol *symbol;
3380   unsigned int symnum;
3381   const char *sname;
3382   flagword new_flags, old_flags;
3383   int abs_section_index = -1;
3384   unsigned int target_index = 0;
3385   struct vms_rec_wr *recwr = &PRIV (recwr);
3386 
3387   vms_debug2 ((2, "vms_write_egsd\n"));
3388 
3389   /* Egsd is quadword aligned.  */
3390   _bfd_vms_output_alignment (recwr, 8);
3391 
3392   _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3393   _bfd_vms_output_long (recwr, 0);
3394 
3395   /* Number sections.  */
3396   for (section = abfd->sections; section != NULL; section = section->next)
3397     {
3398       if (section->flags & SEC_DEBUGGING)
3399 	continue;
3400       if (!strcmp (section->name, ".vmsdebug"))
3401 	{
3402 	  section->flags |= SEC_DEBUGGING;
3403 	  continue;
3404 	}
3405       section->target_index = target_index++;
3406     }
3407 
3408   for (section = abfd->sections; section != NULL; section = section->next)
3409     {
3410       vms_debug2 ((3, "Section #%d %s, %d bytes\n",
3411 		   section->target_index, section->name, (int)section->size));
3412 
3413       /* Don't write out the VMS debug info section since it is in the
3414 	 ETBT and EDBG sections in etir. */
3415       if (section->flags & SEC_DEBUGGING)
3416 	continue;
3417 
3418       /* 13 bytes egsd, max 31 chars name -> should be 44 bytes.  */
3419       if (_bfd_vms_output_check (recwr, 64) < 0)
3420 	{
3421 	  _bfd_vms_output_end (abfd, recwr);
3422 	  _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3423 	  _bfd_vms_output_long (recwr, 0);
3424 	}
3425 
3426       /* Don't know if this is necessary for the linker but for now it keeps
3427 	 vms_slurp_gsd happy.  */
3428       sname = section->name;
3429       if (*sname == '.')
3430 	{
3431 	  /* Remove leading dot.  */
3432 	  sname++;
3433 	  if ((*sname == 't') && (strcmp (sname, "text") == 0))
3434 	    sname = EVAX_CODE_NAME;
3435 	  else if ((*sname == 'd') && (strcmp (sname, "data") == 0))
3436 	    sname = EVAX_DATA_NAME;
3437 	  else if ((*sname == 'b') && (strcmp (sname, "bss") == 0))
3438 	    sname = EVAX_BSS_NAME;
3439 	  else if ((*sname == 'l') && (strcmp (sname, "link") == 0))
3440 	    sname = EVAX_LINK_NAME;
3441 	  else if ((*sname == 'r') && (strcmp (sname, "rdata") == 0))
3442 	    sname = EVAX_READONLY_NAME;
3443 	  else if ((*sname == 'l') && (strcmp (sname, "literal") == 0))
3444 	    sname = EVAX_LITERAL_NAME;
3445 	  else if ((*sname == 'l') && (strcmp (sname, "literals") == 0))
3446 	    sname = EVAX_LITERALS_NAME;
3447 	  else if ((*sname == 'c') && (strcmp (sname, "comm") == 0))
3448 	    sname = EVAX_COMMON_NAME;
3449 	  else if ((*sname == 'l') && (strcmp (sname, "lcomm") == 0))
3450 	    sname = EVAX_LOCAL_NAME;
3451 	}
3452 
3453       if (bfd_is_com_section (section))
3454 	new_flags = (EGPS__V_OVR | EGPS__V_REL | EGPS__V_GBL | EGPS__V_RD
3455 		     | EGPS__V_WRT | EGPS__V_NOMOD | EGPS__V_COM);
3456       else
3457 	new_flags = vms_esecflag_by_name (evax_section_flags, sname,
3458 					  section->size > 0);
3459 
3460       /* Modify them as directed.  */
3461       if (section->flags & SEC_READONLY)
3462 	new_flags &= ~EGPS__V_WRT;
3463 
3464       new_flags &= ~vms_section_data (section)->no_flags;
3465       new_flags |= vms_section_data (section)->flags;
3466 
3467       vms_debug2 ((3, "sec flags %x\n", section->flags));
3468       vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
3469 		   new_flags, (unsigned long)section->size));
3470 
3471       _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3472       _bfd_vms_output_short (recwr, section->alignment_power & 0xff);
3473       _bfd_vms_output_short (recwr, new_flags);
3474       _bfd_vms_output_long (recwr, (unsigned long) section->size);
3475       _bfd_vms_output_counted (recwr, sname);
3476       _bfd_vms_output_end_subrec (recwr);
3477 
3478       /* If the section is an obsolute one, remind its index as it will be
3479 	 used later for absolute symbols.  */
3480       if ((new_flags & EGPS__V_REL) == 0 && abs_section_index < 0)
3481 	abs_section_index = section->target_index;
3482     }
3483 
3484   /* Output symbols.  */
3485   vms_debug2 ((3, "%d symbols found\n", abfd->symcount));
3486 
3487   bfd_set_start_address (abfd, (bfd_vma) -1);
3488 
3489   for (symnum = 0; symnum < abfd->symcount; symnum++)
3490     {
3491       symbol = abfd->outsymbols[symnum];
3492       old_flags = symbol->flags;
3493 
3494       /* Work-around a missing feature:  consider __main as the main entry
3495 	 point.  */
3496       if (symbol->name[0] == '_' && strcmp (symbol->name, "__main") == 0)
3497 	bfd_set_start_address (abfd, (bfd_vma)symbol->value);
3498 
3499       /* Only put in the GSD the global and the undefined symbols.  */
3500       if (old_flags & BSF_FILE)
3501 	continue;
3502 
3503       if ((old_flags & BSF_GLOBAL) == 0 && !bfd_is_und_section (symbol->section))
3504 	{
3505 	  /* If the LIB$INITIIALIZE section is present, add a reference to
3506 	     LIB$INITIALIZE symbol.  FIXME: this should be done explicitely
3507 	     in the assembly file.  */
3508 	  if (!((old_flags & BSF_SECTION_SYM) != 0
3509 		&& strcmp (symbol->section->name, "LIB$INITIALIZE") == 0))
3510 	    continue;
3511 	}
3512 
3513       /* 13 bytes egsd, max 64 chars name -> should be 77 bytes.  Add 16 more
3514 	 bytes for a possible ABS section.  */
3515       if (_bfd_vms_output_check (recwr, 80 + 16) < 0)
3516 	{
3517 	  _bfd_vms_output_end (abfd, recwr);
3518 	  _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3519 	  _bfd_vms_output_long (recwr, 0);
3520 	}
3521 
3522       if ((old_flags & BSF_GLOBAL) != 0
3523 	  && bfd_is_abs_section (symbol->section)
3524 	  && abs_section_index <= 0)
3525 	{
3526 	  /* Create an absolute section if none was defined.  It is highly
3527 	     unlikely that the name $ABS$ clashes with a user defined
3528 	     non-absolute section name.  */
3529 	  _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3530 	  _bfd_vms_output_short (recwr, 4);
3531 	  _bfd_vms_output_short (recwr, EGPS__V_SHR);
3532 	  _bfd_vms_output_long (recwr, 0);
3533 	  _bfd_vms_output_counted (recwr, "$ABS$");
3534 	  _bfd_vms_output_end_subrec (recwr);
3535 
3536 	  abs_section_index = target_index++;
3537 	}
3538 
3539       _bfd_vms_output_begin_subrec (recwr, EGSD__C_SYM);
3540 
3541       /* Data type, alignment.  */
3542       _bfd_vms_output_short (recwr, 0);
3543 
3544       new_flags = 0;
3545 
3546       if (old_flags & BSF_WEAK)
3547 	new_flags |= EGSY__V_WEAK;
3548       if (bfd_is_com_section (symbol->section))		/* .comm  */
3549 	new_flags |= (EGSY__V_WEAK | EGSY__V_COMM);
3550 
3551       if (old_flags & BSF_FUNCTION)
3552 	{
3553 	  new_flags |= EGSY__V_NORM;
3554 	  new_flags |= EGSY__V_REL;
3555 	}
3556       if (old_flags & BSF_GLOBAL)
3557 	{
3558 	  new_flags |= EGSY__V_DEF;
3559 	  if (!bfd_is_abs_section (symbol->section))
3560 	    new_flags |= EGSY__V_REL;
3561 	}
3562       _bfd_vms_output_short (recwr, new_flags);
3563 
3564       if (old_flags & BSF_GLOBAL)
3565 	{
3566 	  /* Symbol definition.  */
3567 	  bfd_vma code_address = 0;
3568 	  unsigned long ca_psindx = 0;
3569 	  unsigned long psindx;
3570 
3571 	  if ((old_flags & BSF_FUNCTION) && symbol->udata.p != NULL)
3572 	    {
3573 	      asymbol *sym;
3574 
3575 	      sym =
3576 		((struct evax_private_udata_struct *)symbol->udata.p)->enbsym;
3577 	      code_address = sym->value;
3578 	      ca_psindx = sym->section->target_index;
3579 	    }
3580 	  if (bfd_is_abs_section (symbol->section))
3581 	    psindx = abs_section_index;
3582 	  else
3583 	    psindx = symbol->section->target_index;
3584 
3585 	  _bfd_vms_output_quad (recwr, symbol->value);
3586 	  _bfd_vms_output_quad (recwr, code_address);
3587 	  _bfd_vms_output_long (recwr, ca_psindx);
3588 	  _bfd_vms_output_long (recwr, psindx);
3589 	}
3590       _bfd_vms_output_counted (recwr, symbol->name);
3591 
3592       _bfd_vms_output_end_subrec (recwr);
3593     }
3594 
3595   _bfd_vms_output_alignment (recwr, 8);
3596   _bfd_vms_output_end (abfd, recwr);
3597 
3598   return TRUE;
3599 }
3600 
3601 /* Write object header for bfd abfd.  Return FALSE on error.  */
3602 
3603 static bfd_boolean
3604 _bfd_vms_write_ehdr (bfd *abfd)
3605 {
3606   asymbol *symbol;
3607   unsigned int symnum;
3608   struct vms_rec_wr *recwr = &PRIV (recwr);
3609 
3610   vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd));
3611 
3612   _bfd_vms_output_alignment (recwr, 2);
3613 
3614   _bfd_vms_write_emh (abfd);
3615   _bfd_vms_write_lmn (abfd, "GNU AS");
3616 
3617   /* SRC.  */
3618   _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3619   _bfd_vms_output_short (recwr, EMH__C_SRC);
3620 
3621   for (symnum = 0; symnum < abfd->symcount; symnum++)
3622     {
3623       symbol = abfd->outsymbols[symnum];
3624 
3625       if (symbol->flags & BSF_FILE)
3626 	{
3627 	  _bfd_vms_output_dump (recwr, (unsigned char *) symbol->name,
3628 				(int) strlen (symbol->name));
3629 	  break;
3630 	}
3631     }
3632 
3633   if (symnum == abfd->symcount)
3634     _bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("noname"));
3635 
3636   _bfd_vms_output_end (abfd, recwr);
3637 
3638   /* TTL.  */
3639   _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3640   _bfd_vms_output_short (recwr, EMH__C_TTL);
3641   _bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("TTL"));
3642   _bfd_vms_output_end (abfd, recwr);
3643 
3644   /* CPR.  */
3645   _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3646   _bfd_vms_output_short (recwr, EMH__C_CPR);
3647   _bfd_vms_output_dump (recwr,
3648 			(unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
3649 			 39);
3650   _bfd_vms_output_end (abfd, recwr);
3651 
3652   return TRUE;
3653 }
3654 
3655 /* Part 4.6, relocations.  */
3656 
3657 
3658 /* WRITE ETIR SECTION
3659 
3660    This is still under construction and therefore not documented.  */
3661 
3662 /* Close the etir/etbt record.  */
3663 
3664 static void
3665 end_etir_record (bfd * abfd)
3666 {
3667   struct vms_rec_wr *recwr = &PRIV (recwr);
3668 
3669   _bfd_vms_output_end (abfd, recwr);
3670 }
3671 
3672 static void
3673 start_etir_or_etbt_record (bfd *abfd, asection *section, bfd_vma offset)
3674 {
3675   struct vms_rec_wr *recwr = &PRIV (recwr);
3676 
3677   if (section->flags & SEC_DEBUGGING)
3678     {
3679       _bfd_vms_output_begin (recwr, EOBJ__C_ETBT);
3680 
3681       if (offset == 0)
3682 	{
3683 	  /* Push start offset.  */
3684 	  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3685 	  _bfd_vms_output_long (recwr, (unsigned long) 0);
3686 	  _bfd_vms_output_end_subrec (recwr);
3687 
3688 	  /* Set location.  */
3689 	  _bfd_vms_output_begin_subrec (recwr, ETIR__C_CTL_DFLOC);
3690 	  _bfd_vms_output_end_subrec (recwr);
3691 	}
3692     }
3693   else
3694     {
3695       _bfd_vms_output_begin (recwr, EOBJ__C_ETIR);
3696 
3697       if (offset == 0)
3698 	{
3699 	  /* Push start offset.  */
3700 	  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3701 	  _bfd_vms_output_long (recwr, (unsigned long) section->target_index);
3702 	  _bfd_vms_output_quad (recwr, offset);
3703 	  _bfd_vms_output_end_subrec (recwr);
3704 
3705 	  /* Start = pop ().  */
3706 	  _bfd_vms_output_begin_subrec (recwr, ETIR__C_CTL_SETRB);
3707 	  _bfd_vms_output_end_subrec (recwr);
3708 	}
3709     }
3710 }
3711 
3712 /* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
3713    address VADDR in section specified by SEC_INDEX and NAME.  */
3714 
3715 static void
3716 sto_imm (bfd *abfd, asection *section,
3717 	 bfd_size_type ssize, unsigned char *cptr, bfd_vma vaddr)
3718 {
3719   bfd_size_type size;
3720   struct vms_rec_wr *recwr = &PRIV (recwr);
3721 
3722 #if VMS_DEBUG
3723   _bfd_vms_debug (8, "sto_imm %d bytes\n", (int) ssize);
3724   _bfd_hexdump (9, cptr, (int) ssize, (int) vaddr);
3725 #endif
3726 
3727   while (ssize > 0)
3728     {
3729       /* Try all the rest.  */
3730       size = ssize;
3731 
3732       if (_bfd_vms_output_check (recwr, size) < 0)
3733 	{
3734 	  /* Doesn't fit, split !  */
3735 	  end_etir_record (abfd);
3736 
3737 	  start_etir_or_etbt_record (abfd, section, vaddr);
3738 
3739 	  size = _bfd_vms_output_check (recwr, 0);	/* get max size */
3740 	  if (size > ssize)			/* more than what's left ? */
3741 	    size = ssize;
3742 	}
3743 
3744       _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_IMM);
3745       _bfd_vms_output_long (recwr, (unsigned long) (size));
3746       _bfd_vms_output_dump (recwr, cptr, size);
3747       _bfd_vms_output_end_subrec (recwr);
3748 
3749 #if VMS_DEBUG
3750       _bfd_vms_debug (10, "dumped %d bytes\n", (int) size);
3751       _bfd_hexdump (10, cptr, (int) size, (int) vaddr);
3752 #endif
3753 
3754       vaddr += size;
3755       cptr += size;
3756       ssize -= size;
3757     }
3758 }
3759 
3760 static void
3761 etir_output_check (bfd *abfd, asection *section, bfd_vma vaddr, int checklen)
3762 {
3763   if (_bfd_vms_output_check (&PRIV (recwr), checklen) < 0)
3764     {
3765       /* Not enough room in this record.  Close it and open a new one.  */
3766       end_etir_record (abfd);
3767       start_etir_or_etbt_record (abfd, section, vaddr);
3768     }
3769 }
3770 
3771 /* Return whether RELOC must be deferred till the end.  */
3772 
3773 static bfd_boolean
3774 defer_reloc_p (arelent *reloc)
3775 {
3776   switch (reloc->howto->type)
3777     {
3778     case ALPHA_R_NOP:
3779     case ALPHA_R_LDA:
3780     case ALPHA_R_BSR:
3781     case ALPHA_R_BOH:
3782       return TRUE;
3783 
3784     default:
3785       return FALSE;
3786     }
3787 }
3788 
3789 /* Write section contents for bfd abfd.  Return FALSE on error.  */
3790 
3791 static bfd_boolean
3792 _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
3793 {
3794   asection *section;
3795   struct vms_rec_wr *recwr = &PRIV (recwr);
3796 
3797   vms_debug2 ((2, "vms_write_tir (%p, %d)\n", abfd, objtype));
3798 
3799   _bfd_vms_output_alignment (recwr, 4);
3800 
3801   PRIV (vms_linkage_index) = 0;
3802 
3803   for (section = abfd->sections; section; section = section->next)
3804     {
3805       vms_debug2 ((4, "writing %d. section '%s' (%d bytes)\n",
3806 		   section->target_index, section->name, (int) (section->size)));
3807 
3808       if (!(section->flags & SEC_HAS_CONTENTS)
3809 	  || bfd_is_com_section (section))
3810 	continue;
3811 
3812       if (!section->contents)
3813 	{
3814 	  bfd_set_error (bfd_error_no_contents);
3815 	  return FALSE;
3816 	}
3817 
3818       start_etir_or_etbt_record (abfd, section, 0);
3819 
3820       if (section->flags & SEC_RELOC)
3821 	{
3822 	  bfd_vma curr_addr = 0;
3823 	  unsigned char *curr_data = section->contents;
3824 	  bfd_size_type size;
3825 	  int pass2_needed = 0;
3826 	  int pass2_in_progress = 0;
3827 	  unsigned int irel;
3828 
3829 	  if (section->reloc_count == 0)
3830 	    _bfd_error_handler
3831 	      (_("SEC_RELOC with no relocs in section %pA"), section);
3832 
3833 #if VMS_DEBUG
3834 	  else
3835 	    {
3836 	      int i = section->reloc_count;
3837 	      arelent **rptr = section->orelocation;
3838 	      _bfd_vms_debug (4, "%d relocations:\n", i);
3839 	      while (i-- > 0)
3840 		{
3841 		  _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, "
3842 				     "addr %08lx, off %08lx, len %d: %s\n",
3843 				  (*(*rptr)->sym_ptr_ptr)->name,
3844 				  (*(*rptr)->sym_ptr_ptr)->section->name,
3845 				  (long) (*(*rptr)->sym_ptr_ptr)->value,
3846 				  (unsigned long)(*rptr)->address,
3847 				  (unsigned long)(*rptr)->addend,
3848 				  bfd_get_reloc_size ((*rptr)->howto),
3849 				  ( *rptr)->howto->name);
3850 		  rptr++;
3851 		}
3852 	    }
3853 #endif
3854 
3855 	new_pass:
3856 	  for (irel = 0; irel < section->reloc_count; irel++)
3857 	    {
3858 	      struct evax_private_udata_struct *udata;
3859 	      arelent *rptr = section->orelocation [irel];
3860 	      bfd_vma addr = rptr->address;
3861 	      asymbol *sym = *rptr->sym_ptr_ptr;
3862 	      asection *sec = sym->section;
3863 	      bfd_boolean defer = defer_reloc_p (rptr);
3864 	      unsigned int slen;
3865 
3866 	      if (pass2_in_progress)
3867 		{
3868 		  /* Non-deferred relocs have already been output.  */
3869 		  if (!defer)
3870 		    continue;
3871 		}
3872 	      else
3873 		{
3874 		  /* Deferred relocs must be output at the very end.  */
3875 		  if (defer)
3876 		    {
3877 		      pass2_needed = 1;
3878 		      continue;
3879 		    }
3880 
3881 		  /* Regular relocs are intertwined with binary data.  */
3882 		  if (curr_addr > addr)
3883 		    _bfd_error_handler (_("size error in section %pA"),
3884 					section);
3885 		  size = addr - curr_addr;
3886 		  sto_imm (abfd, section, size, curr_data, curr_addr);
3887 		  curr_data += size;
3888 		  curr_addr += size;
3889 		}
3890 
3891 	      size = bfd_get_reloc_size (rptr->howto);
3892 
3893 	      switch (rptr->howto->type)
3894 		{
3895 		case ALPHA_R_IGNORE:
3896 		  break;
3897 
3898 		case ALPHA_R_REFLONG:
3899 		  if (bfd_is_und_section (sym->section))
3900 		    {
3901 		      bfd_vma addend = rptr->addend;
3902 		      slen = strlen ((char *) sym->name);
3903 		      etir_output_check (abfd, section, curr_addr, slen);
3904 		      if (addend)
3905 			{
3906 			  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
3907 			  _bfd_vms_output_counted (recwr, sym->name);
3908 			  _bfd_vms_output_end_subrec (recwr);
3909 			  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3910 			  _bfd_vms_output_long (recwr, (unsigned long) addend);
3911 			  _bfd_vms_output_end_subrec (recwr);
3912 			  _bfd_vms_output_begin_subrec (recwr, ETIR__C_OPR_ADD);
3913 			  _bfd_vms_output_end_subrec (recwr);
3914 			  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3915 			  _bfd_vms_output_end_subrec (recwr);
3916 			}
3917 		      else
3918 			{
3919 			  _bfd_vms_output_begin_subrec
3920 			    (recwr, ETIR__C_STO_GBL_LW);
3921 			  _bfd_vms_output_counted (recwr, sym->name);
3922 			  _bfd_vms_output_end_subrec (recwr);
3923 			}
3924 		    }
3925 		  else if (bfd_is_abs_section (sym->section))
3926 		    {
3927 		      etir_output_check (abfd, section, curr_addr, 16);
3928 		      _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3929 		      _bfd_vms_output_long (recwr, (unsigned long) sym->value);
3930 		      _bfd_vms_output_end_subrec (recwr);
3931 		      _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3932 		      _bfd_vms_output_end_subrec (recwr);
3933 		    }
3934 		  else
3935 		    {
3936 		      etir_output_check (abfd, section, curr_addr, 32);
3937 		      _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3938 		      _bfd_vms_output_long (recwr,
3939 					    (unsigned long) sec->target_index);
3940 		      _bfd_vms_output_quad (recwr, rptr->addend + sym->value);
3941 		      _bfd_vms_output_end_subrec (recwr);
3942 		      /* ??? Table B-8 of the OpenVMS Linker Utilily Manual
3943 			 says that we should have a ETIR__C_STO_OFF here.
3944 			 But the relocation would not be BFD_RELOC_32 then.
3945 			 This case is very likely unreachable.  */
3946 		      _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3947 		      _bfd_vms_output_end_subrec (recwr);
3948 		    }
3949 		  break;
3950 
3951 		case ALPHA_R_REFQUAD:
3952 		  if (bfd_is_und_section (sym->section))
3953 		    {
3954 		      bfd_vma addend = rptr->addend;
3955 		      slen = strlen ((char *) sym->name);
3956 		      etir_output_check (abfd, section, curr_addr, slen);
3957 		      if (addend)
3958 			{
3959 			  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
3960 			  _bfd_vms_output_counted (recwr, sym->name);
3961 			  _bfd_vms_output_end_subrec (recwr);
3962 			  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
3963 			  _bfd_vms_output_quad (recwr, addend);
3964 			  _bfd_vms_output_end_subrec (recwr);
3965 			  _bfd_vms_output_begin_subrec (recwr, ETIR__C_OPR_ADD);
3966 			  _bfd_vms_output_end_subrec (recwr);
3967 			  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_QW);
3968 			  _bfd_vms_output_end_subrec (recwr);
3969 			}
3970 		      else
3971 			{
3972 			  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_GBL);
3973 			  _bfd_vms_output_counted (recwr, sym->name);
3974 			  _bfd_vms_output_end_subrec (recwr);
3975 			}
3976 		    }
3977 		  else if (bfd_is_abs_section (sym->section))
3978 		    {
3979 		      etir_output_check (abfd, section, curr_addr, 16);
3980 		      _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
3981 		      _bfd_vms_output_quad (recwr, sym->value);
3982 		      _bfd_vms_output_end_subrec (recwr);
3983 		      _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_QW);
3984 		      _bfd_vms_output_end_subrec (recwr);
3985 		    }
3986 		  else
3987 		    {
3988 		      etir_output_check (abfd, section, curr_addr, 32);
3989 		      _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3990 		      _bfd_vms_output_long (recwr,
3991 					    (unsigned long) sec->target_index);
3992 		      _bfd_vms_output_quad (recwr, rptr->addend + sym->value);
3993 		      _bfd_vms_output_end_subrec (recwr);
3994 		      _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_OFF);
3995 		      _bfd_vms_output_end_subrec (recwr);
3996 		    }
3997 		  break;
3998 
3999 		case ALPHA_R_HINT:
4000 		  sto_imm (abfd, section, size, curr_data, curr_addr);
4001 		  break;
4002 
4003 		case ALPHA_R_LINKAGE:
4004 		  etir_output_check (abfd, section, curr_addr, 64);
4005 		  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LP_PSB);
4006 		  _bfd_vms_output_long
4007 		    (recwr, (unsigned long) rptr->addend);
4008 		  if (rptr->addend > PRIV (vms_linkage_index))
4009 		    PRIV (vms_linkage_index) = rptr->addend;
4010 		  _bfd_vms_output_counted (recwr, sym->name);
4011 		  _bfd_vms_output_byte (recwr, 0);
4012 		  _bfd_vms_output_end_subrec (recwr);
4013 		  break;
4014 
4015 		case ALPHA_R_CODEADDR:
4016 		  slen = strlen ((char *) sym->name);
4017 		  etir_output_check (abfd, section, curr_addr, slen);
4018 		  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_CA);
4019 		  _bfd_vms_output_counted (recwr, sym->name);
4020 		  _bfd_vms_output_end_subrec (recwr);
4021 		  break;
4022 
4023 		case ALPHA_R_NOP:
4024 		  udata
4025 		    = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
4026 		  etir_output_check (abfd, section, curr_addr,
4027 				     32 + 1 + strlen (udata->origname));
4028 		  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_NOP_GBL);
4029 		  _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
4030 		  _bfd_vms_output_long
4031 		    (recwr, (unsigned long) section->target_index);
4032 		  _bfd_vms_output_quad (recwr, rptr->address);
4033 		  _bfd_vms_output_long (recwr, (unsigned long) 0x47ff041f);
4034 		  _bfd_vms_output_long
4035 		    (recwr, (unsigned long) section->target_index);
4036 		  _bfd_vms_output_quad (recwr, rptr->addend);
4037 		  _bfd_vms_output_counted (recwr, udata->origname);
4038 		  _bfd_vms_output_end_subrec (recwr);
4039 		  break;
4040 
4041 		case ALPHA_R_BSR:
4042 		  _bfd_error_handler (_("spurious ALPHA_R_BSR reloc"));
4043 		  break;
4044 
4045 		case ALPHA_R_LDA:
4046 		  udata
4047 		    = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
4048 		  etir_output_check (abfd, section, curr_addr,
4049 				     32 + 1 + strlen (udata->origname));
4050 		  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LDA_GBL);
4051 		  _bfd_vms_output_long
4052 		    (recwr, (unsigned long) udata->lkindex + 1);
4053 		  _bfd_vms_output_long
4054 		    (recwr, (unsigned long) section->target_index);
4055 		  _bfd_vms_output_quad (recwr, rptr->address);
4056 		  _bfd_vms_output_long (recwr, (unsigned long) 0x237B0000);
4057 		  _bfd_vms_output_long
4058 		    (recwr, (unsigned long) udata->bsym->section->target_index);
4059 		  _bfd_vms_output_quad (recwr, rptr->addend);
4060 		  _bfd_vms_output_counted (recwr, udata->origname);
4061 		  _bfd_vms_output_end_subrec (recwr);
4062 		  break;
4063 
4064 		case ALPHA_R_BOH:
4065 		  udata
4066 		    = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
4067 		  etir_output_check (abfd, section, curr_addr,
4068 				       32 + 1 + strlen (udata->origname));
4069 		  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_BOH_GBL);
4070 		  _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
4071 		  _bfd_vms_output_long
4072 		    (recwr, (unsigned long) section->target_index);
4073 		  _bfd_vms_output_quad (recwr, rptr->address);
4074 		  _bfd_vms_output_long (recwr, (unsigned long) 0xD3400000);
4075 		  _bfd_vms_output_long
4076 		    (recwr, (unsigned long) section->target_index);
4077 		  _bfd_vms_output_quad (recwr, rptr->addend);
4078 		  _bfd_vms_output_counted (recwr, udata->origname);
4079 		  _bfd_vms_output_end_subrec (recwr);
4080 		  break;
4081 
4082 		default:
4083 		  _bfd_error_handler (_("unhandled relocation %s"),
4084 				      rptr->howto->name);
4085 		  break;
4086 		}
4087 
4088 	      curr_data += size;
4089 	      curr_addr += size;
4090 	    } /* End of relocs loop.  */
4091 
4092 	  if (!pass2_in_progress)
4093 	    {
4094 	      /* Output rest of section.  */
4095 	      if (curr_addr > section->size)
4096 		_bfd_error_handler (_("size error in section %pA"), section);
4097 	      size = section->size - curr_addr;
4098 	      sto_imm (abfd, section, size, curr_data, curr_addr);
4099 	      curr_data += size;
4100 	      curr_addr += size;
4101 
4102 	      if (pass2_needed)
4103 		{
4104 		  pass2_in_progress = 1;
4105 		  goto new_pass;
4106 		}
4107 	    }
4108 	}
4109 
4110       else /* (section->flags & SEC_RELOC) */
4111 	sto_imm (abfd, section, section->size, section->contents, 0);
4112 
4113       end_etir_record (abfd);
4114     }
4115 
4116   _bfd_vms_output_alignment (recwr, 2);
4117   return TRUE;
4118 }
4119 
4120 /* Write cached information into a file being written, at bfd_close.  */
4121 
4122 static bfd_boolean
4123 alpha_vms_write_object_contents (bfd *abfd)
4124 {
4125   vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd));
4126 
4127   if (abfd->flags & (EXEC_P | DYNAMIC))
4128     {
4129       return alpha_vms_write_exec (abfd);
4130     }
4131   else
4132     {
4133       if (abfd->section_count > 0)			/* we have sections */
4134 	{
4135 	  if (!_bfd_vms_write_ehdr (abfd))
4136 	    return FALSE;
4137 	  if (!_bfd_vms_write_egsd (abfd))
4138 	    return FALSE;
4139 	  if (!_bfd_vms_write_etir (abfd, EOBJ__C_ETIR))
4140 	    return FALSE;
4141 	  if (!_bfd_vms_write_eeom (abfd))
4142 	    return FALSE;
4143 	}
4144     }
4145   return TRUE;
4146 }
4147 
4148 /* Debug stuff: nearest line.  */
4149 
4150 #define SET_MODULE_PARSED(m) \
4151   do { if ((m)->name == NULL) (m)->name = ""; } while (0)
4152 #define IS_MODULE_PARSED(m) ((m)->name != NULL)
4153 
4154 /* Build a new module for the specified BFD.  */
4155 
4156 static struct module *
4157 new_module (bfd *abfd)
4158 {
4159   struct module *module
4160     = (struct module *) bfd_zalloc (abfd, sizeof (struct module));
4161   module->file_table_count = 16; /* Arbitrary.  */
4162   module->file_table
4163     = bfd_malloc (module->file_table_count * sizeof (struct fileinfo));
4164   return module;
4165 }
4166 
4167 /* Parse debug info for a module and internalize it.  */
4168 
4169 static void
4170 parse_module (bfd *abfd, struct module *module, unsigned char *ptr,
4171 	      int length)
4172 {
4173   unsigned char *maxptr = ptr + length;
4174   unsigned char *src_ptr, *pcl_ptr;
4175   unsigned int prev_linum = 0, curr_linenum = 0;
4176   bfd_vma prev_pc = 0, curr_pc = 0;
4177   struct srecinfo *curr_srec, *srec;
4178   struct lineinfo *curr_line, *line;
4179   struct funcinfo *funcinfo;
4180 
4181   /* Initialize tables with zero element.  */
4182   curr_srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
4183   module->srec_table = curr_srec;
4184 
4185   curr_line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
4186   module->line_table = curr_line;
4187 
4188   while (length == -1 || ptr < maxptr)
4189     {
4190       /* The first byte is not counted in the recorded length.  */
4191       int rec_length = bfd_getl16 (ptr) + 1;
4192       int rec_type = bfd_getl16 (ptr + 2);
4193 
4194       vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length, rec_type));
4195 
4196       if (length == -1 && rec_type == DST__K_MODEND)
4197 	break;
4198 
4199       switch (rec_type)
4200 	{
4201 	case DST__K_MODBEG:
4202 	  module->name
4203 	    = _bfd_vms_save_counted_string (ptr + DST_S_B_MODBEG_NAME,
4204 					    maxptr - (ptr + DST_S_B_MODBEG_NAME));
4205 
4206 	  curr_pc = 0;
4207 	  prev_pc = 0;
4208 	  curr_linenum = 0;
4209 	  prev_linum = 0;
4210 
4211 	  vms_debug2 ((3, "module: %s\n", module->name));
4212 	  break;
4213 
4214 	case DST__K_MODEND:
4215 	  break;
4216 
4217 	case DST__K_RTNBEG:
4218 	  funcinfo = (struct funcinfo *)
4219 	    bfd_zalloc (abfd, sizeof (struct funcinfo));
4220 	  funcinfo->name
4221 	    = _bfd_vms_save_counted_string (ptr + DST_S_B_RTNBEG_NAME,
4222 					    maxptr - (ptr + DST_S_B_RTNBEG_NAME));
4223 	  funcinfo->low = bfd_getl32 (ptr + DST_S_L_RTNBEG_ADDRESS);
4224 	  funcinfo->next = module->func_table;
4225 	  module->func_table = funcinfo;
4226 
4227 	  vms_debug2 ((3, "routine: %s at 0x%lx\n",
4228 		       funcinfo->name, (unsigned long) funcinfo->low));
4229 	  break;
4230 
4231 	case DST__K_RTNEND:
4232 	  module->func_table->high = module->func_table->low
4233 	    + bfd_getl32 (ptr + DST_S_L_RTNEND_SIZE) - 1;
4234 
4235 	  if (module->func_table->high > module->high)
4236 	    module->high = module->func_table->high;
4237 
4238 	  vms_debug2 ((3, "end routine\n"));
4239 	  break;
4240 
4241 	case DST__K_PROLOG:
4242 	  vms_debug2 ((3, "prologue\n"));
4243 	  break;
4244 
4245 	case DST__K_EPILOG:
4246 	  vms_debug2 ((3, "epilog\n"));
4247 	  break;
4248 
4249 	case DST__K_BLKBEG:
4250 	  vms_debug2 ((3, "block\n"));
4251 	  break;
4252 
4253 	case DST__K_BLKEND:
4254 	  vms_debug2 ((3, "end block\n"));
4255 	  break;
4256 
4257 	case DST__K_SOURCE:
4258 	  src_ptr = ptr + DST_S_C_SOURCE_HEADER_SIZE;
4259 
4260 	  vms_debug2 ((3, "source info\n"));
4261 
4262 	  while (src_ptr < ptr + rec_length)
4263 	    {
4264 	      int cmd = src_ptr[0], cmd_length, data;
4265 
4266 	      switch (cmd)
4267 		{
4268 		case DST__K_SRC_DECLFILE:
4269 		  {
4270 		    unsigned int fileid
4271 		      = bfd_getl16 (src_ptr + DST_S_W_SRC_DF_FILEID);
4272 		    char *filename
4273 		      = _bfd_vms_save_counted_string (src_ptr + DST_S_B_SRC_DF_FILENAME,
4274 						      (ptr + rec_length) -
4275 						      (src_ptr + DST_S_B_SRC_DF_FILENAME)
4276 						      );
4277 
4278 		    while (fileid >= module->file_table_count)
4279 		      {
4280 			module->file_table_count *= 2;
4281 			module->file_table
4282 			  = bfd_realloc (module->file_table,
4283 					 module->file_table_count
4284 					   * sizeof (struct fileinfo));
4285 		      }
4286 
4287 		    module->file_table [fileid].name = filename;
4288 		    module->file_table [fileid].srec = 1;
4289 		    cmd_length = src_ptr[DST_S_B_SRC_DF_LENGTH] + 2;
4290 		    vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4291 				 fileid, module->file_table [fileid].name));
4292 		  }
4293 		  break;
4294 
4295 		case DST__K_SRC_DEFLINES_B:
4296 		  /* Perform the association and set the next higher index
4297 		     to the limit.  */
4298 		  data = src_ptr[DST_S_B_SRC_UNSBYTE];
4299 		  srec = (struct srecinfo *)
4300 		    bfd_zalloc (abfd, sizeof (struct srecinfo));
4301 		  srec->line = curr_srec->line + data;
4302 		  srec->srec = curr_srec->srec + data;
4303 		  srec->sfile = curr_srec->sfile;
4304 		  curr_srec->next = srec;
4305 		  curr_srec = srec;
4306 		  cmd_length = 2;
4307 		  vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data));
4308 		  break;
4309 
4310 		case DST__K_SRC_DEFLINES_W:
4311 		  /* Perform the association and set the next higher index
4312 		     to the limit.  */
4313 		  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4314 		  srec = (struct srecinfo *)
4315 		    bfd_zalloc (abfd, sizeof (struct srecinfo));
4316 		  srec->line = curr_srec->line + data;
4317 		  srec->srec = curr_srec->srec + data,
4318 		  srec->sfile = curr_srec->sfile;
4319 		  curr_srec->next = srec;
4320 		  curr_srec = srec;
4321 		  cmd_length = 3;
4322 		  vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data));
4323 		  break;
4324 
4325 		case DST__K_SRC_INCRLNUM_B:
4326 		  data = src_ptr[DST_S_B_SRC_UNSBYTE];
4327 		  curr_srec->line += data;
4328 		  cmd_length = 2;
4329 		  vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data));
4330 		  break;
4331 
4332 		case DST__K_SRC_SETFILE:
4333 		  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4334 		  curr_srec->sfile = data;
4335 		  curr_srec->srec = module->file_table[data].srec;
4336 		  cmd_length = 3;
4337 		  vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data));
4338 		  break;
4339 
4340 		case DST__K_SRC_SETLNUM_L:
4341 		  data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4342 		  curr_srec->line = data;
4343 		  cmd_length = 5;
4344 		  vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data));
4345 		  break;
4346 
4347 		case DST__K_SRC_SETLNUM_W:
4348 		  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4349 		  curr_srec->line = data;
4350 		  cmd_length = 3;
4351 		  vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data));
4352 		  break;
4353 
4354 		case DST__K_SRC_SETREC_L:
4355 		  data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4356 		  curr_srec->srec = data;
4357 		  module->file_table[curr_srec->sfile].srec = data;
4358 		  cmd_length = 5;
4359 		  vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data));
4360 		  break;
4361 
4362 		case DST__K_SRC_SETREC_W:
4363 		  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4364 		  curr_srec->srec = data;
4365 		  module->file_table[curr_srec->sfile].srec = data;
4366 		  cmd_length = 3;
4367 		  vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data));
4368 		  break;
4369 
4370 		case DST__K_SRC_FORMFEED:
4371 		  cmd_length = 1;
4372 		  vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4373 		  break;
4374 
4375 		default:
4376 		  _bfd_error_handler (_("unknown source command %d"),
4377 				      cmd);
4378 		  cmd_length = 2;
4379 		  break;
4380 		}
4381 
4382 	      src_ptr += cmd_length;
4383 	    }
4384 	  break;
4385 
4386 	case DST__K_LINE_NUM:
4387 	  pcl_ptr = ptr + DST_S_C_LINE_NUM_HEADER_SIZE;
4388 
4389 	  vms_debug2 ((3, "line info\n"));
4390 
4391 	  while (pcl_ptr < ptr + rec_length)
4392 	    {
4393 	      /* The command byte is signed so we must sign-extend it.  */
4394 	      int cmd = ((signed char *)pcl_ptr)[0], cmd_length, data;
4395 
4396 	      switch (cmd)
4397 		{
4398 		case DST__K_DELTA_PC_W:
4399 		  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4400 		  curr_pc += data;
4401 		  curr_linenum += 1;
4402 		  cmd_length = 3;
4403 		  vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data));
4404 		  break;
4405 
4406 		case DST__K_DELTA_PC_L:
4407 		  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4408 		  curr_pc += data;
4409 		  curr_linenum += 1;
4410 		  cmd_length = 5;
4411 		  vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data));
4412 		  break;
4413 
4414 		case DST__K_INCR_LINUM:
4415 		  data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4416 		  curr_linenum += data;
4417 		  cmd_length = 2;
4418 		  vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data));
4419 		  break;
4420 
4421 		case DST__K_INCR_LINUM_W:
4422 		  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4423 		  curr_linenum += data;
4424 		  cmd_length = 3;
4425 		  vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data));
4426 		  break;
4427 
4428 		case DST__K_INCR_LINUM_L:
4429 		  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4430 		  curr_linenum += data;
4431 		  cmd_length = 5;
4432 		  vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data));
4433 		  break;
4434 
4435 		case DST__K_SET_LINUM_INCR:
4436 		  _bfd_error_handler
4437 		    (_("%s not implemented"), "DST__K_SET_LINUM_INCR");
4438 		  cmd_length = 2;
4439 		  break;
4440 
4441 		case DST__K_SET_LINUM_INCR_W:
4442 		  _bfd_error_handler
4443 		    (_("%s not implemented"), "DST__K_SET_LINUM_INCR_W");
4444 		  cmd_length = 3;
4445 		  break;
4446 
4447 		case DST__K_RESET_LINUM_INCR:
4448 		  _bfd_error_handler
4449 		    (_("%s not implemented"), "DST__K_RESET_LINUM_INCR");
4450 		  cmd_length = 1;
4451 		  break;
4452 
4453 		case DST__K_BEG_STMT_MODE:
4454 		  _bfd_error_handler
4455 		    (_("%s not implemented"), "DST__K_BEG_STMT_MODE");
4456 		  cmd_length = 1;
4457 		  break;
4458 
4459 		case DST__K_END_STMT_MODE:
4460 		  _bfd_error_handler
4461 		    (_("%s not implemented"), "DST__K_END_STMT_MODE");
4462 		  cmd_length = 1;
4463 		  break;
4464 
4465 		case DST__K_SET_LINUM_B:
4466 		  data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4467 		  curr_linenum = data;
4468 		  cmd_length = 2;
4469 		  vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data));
4470 		  break;
4471 
4472 		case DST__K_SET_LINUM:
4473 		  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4474 		  curr_linenum = data;
4475 		  cmd_length = 3;
4476 		  vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data));
4477 		  break;
4478 
4479 		case DST__K_SET_LINUM_L:
4480 		  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4481 		  curr_linenum = data;
4482 		  cmd_length = 5;
4483 		  vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data));
4484 		  break;
4485 
4486 		case DST__K_SET_PC:
4487 		  _bfd_error_handler
4488 		    (_("%s not implemented"), "DST__K_SET_PC");
4489 		  cmd_length = 2;
4490 		  break;
4491 
4492 		case DST__K_SET_PC_W:
4493 		  _bfd_error_handler
4494 		    (_("%s not implemented"), "DST__K_SET_PC_W");
4495 		  cmd_length = 3;
4496 		  break;
4497 
4498 		case DST__K_SET_PC_L:
4499 		  _bfd_error_handler
4500 		    (_("%s not implemented"), "DST__K_SET_PC_L");
4501 		  cmd_length = 5;
4502 		  break;
4503 
4504 		case DST__K_SET_STMTNUM:
4505 		  _bfd_error_handler
4506 		    (_("%s not implemented"), "DST__K_SET_STMTNUM");
4507 		  cmd_length = 2;
4508 		  break;
4509 
4510 		case DST__K_TERM:
4511 		  data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4512 		  curr_pc += data;
4513 		  cmd_length = 2;
4514 		  vms_debug2 ((4, "DST__K_TERM: %d\n", data));
4515 		  break;
4516 
4517 		case DST__K_TERM_W:
4518 		  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4519 		  curr_pc += data;
4520 		  cmd_length = 3;
4521 		  vms_debug2 ((4, "DST__K_TERM_W: %d\n", data));
4522 		  break;
4523 
4524 		case DST__K_TERM_L:
4525 		  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4526 		  curr_pc += data;
4527 		  cmd_length = 5;
4528 		  vms_debug2 ((4, "DST__K_TERM_L: %d\n", data));
4529 		  break;
4530 
4531 		case DST__K_SET_ABS_PC:
4532 		  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4533 		  curr_pc = data;
4534 		  cmd_length = 5;
4535 		  vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data));
4536 		  break;
4537 
4538 		default:
4539 		  if (cmd <= 0)
4540 		    {
4541 		      curr_pc -= cmd;
4542 		      curr_linenum += 1;
4543 		      cmd_length = 1;
4544 		      vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4545 				   (unsigned long)curr_pc, curr_linenum));
4546 		    }
4547 		  else
4548 		    {
4549 		      _bfd_error_handler (_("unknown line command %d"), cmd);
4550 		      cmd_length = 2;
4551 		    }
4552 		  break;
4553 		}
4554 
4555 	      if ((curr_linenum != prev_linum && curr_pc != prev_pc)
4556 		  || cmd <= 0
4557 		  || cmd == DST__K_DELTA_PC_L
4558 		  || cmd == DST__K_DELTA_PC_W)
4559 		{
4560 		  line = (struct lineinfo *)
4561 		    bfd_zalloc (abfd, sizeof (struct lineinfo));
4562 		  line->address = curr_pc;
4563 		  line->line = curr_linenum;
4564 
4565 		  curr_line->next = line;
4566 		  curr_line = line;
4567 
4568 		  prev_linum = curr_linenum;
4569 		  prev_pc = curr_pc;
4570 		  vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4571 			       (unsigned long)curr_pc, curr_linenum));
4572 		}
4573 
4574 	      pcl_ptr += cmd_length;
4575 	    }
4576 	  break;
4577 
4578 	case 0x17: /* Undocumented type used by DEC C to declare equates.  */
4579 	  vms_debug2 ((3, "undocumented type 0x17\n"));
4580 	  break;
4581 
4582 	default:
4583 	  vms_debug2 ((3, "ignoring record\n"));
4584 	  break;
4585 
4586 	}
4587 
4588       ptr += rec_length;
4589     }
4590 
4591   /* Finalize tables with EOL marker.  */
4592   srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
4593   srec->line = (unsigned int) -1;
4594   srec->srec = (unsigned int) -1;
4595   curr_srec->next = srec;
4596 
4597   line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
4598   line->line = (unsigned int) -1;
4599   line->address = (bfd_vma) -1;
4600   curr_line->next = line;
4601 
4602   /* Advertise that this module has been parsed.  This is needed
4603      because parsing can be either performed at module creation
4604      or deferred until debug info is consumed.  */
4605   SET_MODULE_PARSED (module);
4606 }
4607 
4608 /* Build the list of modules for the specified BFD.  */
4609 
4610 static struct module *
4611 build_module_list (bfd *abfd)
4612 {
4613   struct module *module, *list = NULL;
4614   asection *dmt;
4615 
4616   if ((dmt = bfd_get_section_by_name (abfd, "$DMT$")))
4617     {
4618       /* We have a DMT section so this must be an image.  Parse the
4619 	 section and build the list of modules.  This is sufficient
4620 	 since we can compute the start address and the end address
4621 	 of every module from the section contents.  */
4622       bfd_size_type size = bfd_get_section_size (dmt);
4623       unsigned char *ptr, *end;
4624 
4625       ptr = (unsigned char *) bfd_alloc (abfd, size);
4626       if (! ptr)
4627 	return NULL;
4628 
4629       if (! bfd_get_section_contents (abfd, dmt, ptr, 0, size))
4630 	return NULL;
4631 
4632       vms_debug2 ((2, "DMT\n"));
4633 
4634       end = ptr + size;
4635 
4636       while (ptr < end)
4637 	{
4638 	  /* Each header declares a module with its start offset and size
4639 	     of debug info in the DST section, as well as the count of
4640 	     program sections (i.e. address spans) it contains.  */
4641 	  int modbeg = bfd_getl32 (ptr + DBG_S_L_DMT_MODBEG);
4642 	  int msize = bfd_getl32 (ptr + DBG_S_L_DST_SIZE);
4643 	  int count = bfd_getl16 (ptr + DBG_S_W_DMT_PSECT_COUNT);
4644 	  ptr += DBG_S_C_DMT_HEADER_SIZE;
4645 
4646 	  vms_debug2 ((3, "module: modbeg = %d, size = %d, count = %d\n",
4647 		       modbeg, msize, count));
4648 
4649 	  /* We create a 'module' structure for each program section since
4650 	     we only support contiguous addresses in a 'module' structure.
4651 	     As a consequence, the actual debug info in the DST section is
4652 	     shared and can be parsed multiple times; that doesn't seem to
4653 	     cause problems in practice.  */
4654 	  while (count-- > 0)
4655 	    {
4656 	      int start = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_START);
4657 	      int length = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_LENGTH);
4658 	      module = new_module (abfd);
4659 	      module->modbeg = modbeg;
4660 	      module->size = msize;
4661 	      module->low = start;
4662 	      module->high = start + length;
4663 	      module->next = list;
4664 	      list = module;
4665 	      ptr += DBG_S_C_DMT_PSECT_SIZE;
4666 
4667 	      vms_debug2 ((4, "section: start = 0x%x, length = %d\n",
4668 			   start, length));
4669 	    }
4670 	}
4671     }
4672   else
4673     {
4674       /* We don't have a DMT section so this must be an object.  Parse
4675 	 the module right now in order to compute its start address and
4676 	 end address.  */
4677       void *dst = PRIV (dst_section)->contents;
4678 
4679       if (dst == NULL)
4680 	return NULL;
4681 
4682       module = new_module (abfd);
4683       parse_module (abfd, module, PRIV (dst_section)->contents, -1);
4684       list = module;
4685     }
4686 
4687   return list;
4688 }
4689 
4690 /* Calculate and return the name of the source file and the line nearest
4691    to the wanted location in the specified module.  */
4692 
4693 static bfd_boolean
4694 module_find_nearest_line (bfd *abfd, struct module *module, bfd_vma addr,
4695 			  const char **file, const char **func,
4696 			  unsigned int *line)
4697 {
4698   struct funcinfo *funcinfo;
4699   struct lineinfo *lineinfo;
4700   struct srecinfo *srecinfo;
4701   bfd_boolean ret = FALSE;
4702 
4703   /* Parse this module if that was not done at module creation.  */
4704   if (! IS_MODULE_PARSED (module))
4705     {
4706       unsigned int size = module->size;
4707       unsigned int modbeg = PRIV (dst_section)->filepos + module->modbeg;
4708       unsigned char *buffer = (unsigned char *) bfd_malloc (module->size);
4709 
4710       if (bfd_seek (abfd, modbeg, SEEK_SET) != 0
4711 	  || bfd_bread (buffer, size, abfd) != size)
4712 	{
4713 	  bfd_set_error (bfd_error_no_debug_section);
4714 	  return FALSE;
4715 	}
4716 
4717       parse_module (abfd, module, buffer, size);
4718       free (buffer);
4719     }
4720 
4721   /* Find out the function (if any) that contains the address.  */
4722   for (funcinfo = module->func_table; funcinfo; funcinfo = funcinfo->next)
4723     if (addr >= funcinfo->low && addr <= funcinfo->high)
4724       {
4725 	*func = funcinfo->name;
4726 	ret = TRUE;
4727 	break;
4728       }
4729 
4730   /* Find out the source file and the line nearest to the address.  */
4731   for (lineinfo = module->line_table; lineinfo; lineinfo = lineinfo->next)
4732     if (lineinfo->next && addr < lineinfo->next->address)
4733       {
4734 	for (srecinfo = module->srec_table; srecinfo; srecinfo = srecinfo->next)
4735 	  if (srecinfo->next && lineinfo->line < srecinfo->next->line)
4736 	    {
4737 	      if (srecinfo->sfile > 0)
4738 		{
4739 		  *file = module->file_table[srecinfo->sfile].name;
4740 		  *line = srecinfo->srec + lineinfo->line - srecinfo->line;
4741 		}
4742 	      else
4743 		{
4744 		  *file = module->name;
4745 		  *line = lineinfo->line;
4746 		}
4747 	      return TRUE;
4748 	    }
4749 
4750 	break;
4751       }
4752 
4753   return ret;
4754 }
4755 
4756 /* Provided a BFD, a section and an offset into the section, calculate and
4757    return the name of the source file and the line nearest to the wanted
4758    location.  */
4759 
4760 static bfd_boolean
4761 _bfd_vms_find_nearest_line (bfd *abfd,
4762 			    asymbol **symbols ATTRIBUTE_UNUSED,
4763 			    asection *section,
4764 			    bfd_vma offset,
4765 			    const char **file,
4766 			    const char **func,
4767 			    unsigned int *line,
4768 			    unsigned int *discriminator)
4769 {
4770   struct module *module;
4771 
4772   /* What address are we looking for?  */
4773   bfd_vma addr = section->vma + offset;
4774 
4775   *file = NULL;
4776   *func = NULL;
4777   *line = 0;
4778   if (discriminator)
4779     *discriminator = 0;
4780 
4781   /* We can't do anything if there is no DST (debug symbol table).  */
4782   if (PRIV (dst_section) == NULL)
4783     return FALSE;
4784 
4785   /* Create the module list - if not already done.  */
4786   if (PRIV (modules) == NULL)
4787     {
4788       PRIV (modules) = build_module_list (abfd);
4789       if (PRIV (modules) == NULL)
4790 	return FALSE;
4791     }
4792 
4793   for (module = PRIV (modules); module; module = module->next)
4794     if (addr >= module->low && addr <= module->high)
4795       return module_find_nearest_line (abfd, module, addr, file, func, line);
4796 
4797   return FALSE;
4798 }
4799 
4800 /* Canonicalizations.  */
4801 /* Set name, value, section and flags of SYM from E.  */
4802 
4803 static bfd_boolean
4804 alpha_vms_convert_symbol (bfd *abfd, struct vms_symbol_entry *e, asymbol *sym)
4805 {
4806   flagword flags;
4807   symvalue value;
4808   asection *sec;
4809   const char *name;
4810 
4811   name = e->name;
4812   value = 0;
4813   flags = BSF_NO_FLAGS;
4814   sec = NULL;
4815 
4816   switch (e->typ)
4817     {
4818     case EGSD__C_SYM:
4819       if (e->flags & EGSY__V_WEAK)
4820 	flags |= BSF_WEAK;
4821 
4822       if (e->flags & EGSY__V_DEF)
4823 	{
4824 	  /* Symbol definition.  */
4825 	  flags |= BSF_GLOBAL;
4826 	  if (e->flags & EGSY__V_NORM)
4827 	    flags |= BSF_FUNCTION;
4828 	  value = e->value;
4829 	  sec = e->section;
4830 	}
4831       else
4832 	{
4833 	  /* Symbol reference.  */
4834 	  sec = bfd_und_section_ptr;
4835 	}
4836       break;
4837 
4838     case EGSD__C_SYMG:
4839       /* A universal symbol is by definition global...  */
4840       flags |= BSF_GLOBAL;
4841 
4842       /* ...and dynamic in shared libraries.  */
4843       if (abfd->flags & DYNAMIC)
4844 	flags |= BSF_DYNAMIC;
4845 
4846       if (e->flags & EGSY__V_WEAK)
4847 	flags |= BSF_WEAK;
4848 
4849       if (!(e->flags & EGSY__V_DEF))
4850 	abort ();
4851 
4852       if (e->flags & EGSY__V_NORM)
4853 	flags |= BSF_FUNCTION;
4854 
4855       value = e->value;
4856       /* sec = e->section; */
4857       sec = bfd_abs_section_ptr;
4858       break;
4859 
4860     default:
4861       return FALSE;
4862     }
4863 
4864   sym->name = name;
4865   sym->section = sec;
4866   sym->flags = flags;
4867   sym->value = value;
4868   return TRUE;
4869 }
4870 
4871 
4872 /* Return the number of bytes required to store a vector of pointers
4873    to asymbols for all the symbols in the BFD abfd, including a
4874    terminal NULL pointer. If there are no symbols in the BFD,
4875    then return 0.  If an error occurs, return -1.  */
4876 
4877 static long
4878 alpha_vms_get_symtab_upper_bound (bfd *abfd)
4879 {
4880   vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
4881 	       abfd, PRIV (gsd_sym_count)));
4882 
4883   return (PRIV (gsd_sym_count) + 1) * sizeof (asymbol *);
4884 }
4885 
4886 /* Read the symbols from the BFD abfd, and fills in the vector
4887    location with pointers to the symbols and a trailing NULL.
4888 
4889    Return number of symbols read.   */
4890 
4891 static long
4892 alpha_vms_canonicalize_symtab (bfd *abfd, asymbol **symbols)
4893 {
4894   unsigned int i;
4895 
4896   vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd));
4897 
4898   if (PRIV (csymbols) == NULL)
4899     {
4900       PRIV (csymbols) = (asymbol **) bfd_alloc
4901 	(abfd, PRIV (gsd_sym_count) * sizeof (asymbol *));
4902 
4903       /* Traverse table and fill symbols vector.  */
4904       for (i = 0; i < PRIV (gsd_sym_count); i++)
4905 	{
4906 	  struct vms_symbol_entry *e = PRIV (syms)[i];
4907 	  asymbol *sym;
4908 
4909 	  sym = bfd_make_empty_symbol (abfd);
4910 	  if (sym == NULL || !alpha_vms_convert_symbol (abfd, e, sym))
4911 	    {
4912 	      bfd_release (abfd, PRIV (csymbols));
4913 	      PRIV (csymbols) = NULL;
4914 	      return -1;
4915 	    }
4916 
4917 	  PRIV (csymbols)[i] = sym;
4918 	}
4919     }
4920 
4921   if (symbols != NULL)
4922     {
4923       for (i = 0; i < PRIV (gsd_sym_count); i++)
4924 	symbols[i] = PRIV (csymbols)[i];
4925       symbols[i] = NULL;
4926     }
4927 
4928   return PRIV (gsd_sym_count);
4929 }
4930 
4931 /* Read and convert relocations from ETIR.  We do it once for all sections.  */
4932 
4933 static bfd_boolean
4934 alpha_vms_slurp_relocs (bfd *abfd)
4935 {
4936   int cur_psect = -1;
4937 
4938   vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
4939 
4940   /* We slurp relocs only once, for all sections.  */
4941   if (PRIV (reloc_done))
4942       return TRUE;
4943   PRIV (reloc_done) = TRUE;
4944 
4945   if (alpha_vms_canonicalize_symtab (abfd, NULL) < 0)
4946     return FALSE;
4947 
4948   if (bfd_seek (abfd, 0, SEEK_SET) != 0)
4949     return FALSE;
4950 
4951   while (1)
4952     {
4953       unsigned char *begin;
4954       unsigned char *end;
4955       unsigned char *ptr;
4956       bfd_reloc_code_real_type reloc_code;
4957       int type;
4958       bfd_vma vaddr = 0;
4959 
4960       int length;
4961 
4962       bfd_vma cur_address;
4963       int cur_psidx = -1;
4964       unsigned char *cur_sym = NULL;
4965       int prev_cmd = -1;
4966       bfd_vma cur_addend = 0;
4967 
4968       /* Skip non-ETIR records.  */
4969       type = _bfd_vms_get_object_record (abfd);
4970       if (type == EOBJ__C_EEOM)
4971 	break;
4972       if (type != EOBJ__C_ETIR)
4973 	continue;
4974 
4975       begin = PRIV (recrd.rec) + 4;
4976       end = PRIV (recrd.rec) + PRIV (recrd.rec_size);
4977 
4978       for (ptr = begin; ptr < end; ptr += length)
4979 	{
4980 	  int cmd;
4981 
4982 	  cmd = bfd_getl16 (ptr);
4983 	  length = bfd_getl16 (ptr + 2);
4984 
4985 	  cur_address = vaddr;
4986 
4987 	  vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
4988 		       _bfd_vms_etir_name (cmd)));
4989 
4990 	  switch (cmd)
4991 	    {
4992 	    case ETIR__C_STA_GBL: /* ALPHA_R_REFLONG und_section, step 1 */
4993 				  /* ALPHA_R_REFQUAD und_section, step 1 */
4994 	      cur_sym = ptr + 4;
4995 	      prev_cmd = cmd;
4996 	      continue;
4997 
4998 	    case ETIR__C_STA_PQ: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
4999 	      cur_psidx = bfd_getl32 (ptr + 4);
5000 	      cur_addend = bfd_getl64 (ptr + 8);
5001 	      prev_cmd = cmd;
5002 	      continue;
5003 
5004 	    case ETIR__C_CTL_SETRB:
5005 	      if (prev_cmd != ETIR__C_STA_PQ)
5006 		{
5007 		  _bfd_error_handler
5008 		    /* xgettext:c-format */
5009 		    (_("unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd),
5010 		     _bfd_vms_etir_name (cmd));
5011 		  return FALSE;
5012 		}
5013 	      cur_psect = cur_psidx;
5014 	      vaddr = cur_addend;
5015 	      cur_psidx = -1;
5016 	      cur_addend = 0;
5017 	      continue;
5018 
5019 	    case ETIR__C_STA_LW: /* ALPHA_R_REFLONG abs_section, step 1 */
5020 				 /* ALPHA_R_REFLONG und_section, step 2 */
5021 	      if (prev_cmd != -1)
5022 		{
5023 		  if (prev_cmd != ETIR__C_STA_GBL)
5024 		    {
5025 		      _bfd_error_handler
5026 			/* xgettext:c-format */
5027 			(_("unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
5028 			 _bfd_vms_etir_name (ETIR__C_STA_LW));
5029 		      return FALSE;
5030 		    }
5031 		}
5032 	      cur_addend = bfd_getl32 (ptr + 4);
5033 	      prev_cmd = cmd;
5034 	      continue;
5035 
5036 	    case ETIR__C_STA_QW: /* ALPHA_R_REFQUAD abs_section, step 1 */
5037 				 /* ALPHA_R_REFQUAD und_section, step 2 */
5038 	      if (prev_cmd != -1 && prev_cmd != ETIR__C_STA_GBL)
5039 		{
5040 		  _bfd_error_handler
5041 		    /* xgettext:c-format */
5042 		    (_("unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
5043 		     _bfd_vms_etir_name (ETIR__C_STA_QW));
5044 		  return FALSE;
5045 		}
5046 	      cur_addend = bfd_getl64 (ptr + 4);
5047 	      prev_cmd = cmd;
5048 	      continue;
5049 
5050 	    case ETIR__C_STO_LW: /* ALPHA_R_REFLONG und_section, step 4 */
5051 				 /* ALPHA_R_REFLONG abs_section, step 2 */
5052 				 /* ALPHA_R_REFLONG others, step 2 */
5053 	      if (prev_cmd != ETIR__C_OPR_ADD
5054 		  && prev_cmd != ETIR__C_STA_LW
5055 		  && prev_cmd != ETIR__C_STA_PQ)
5056 		{
5057 		  /* xgettext:c-format */
5058 		  _bfd_error_handler (_("unknown reloc %s + %s"),
5059 				      _bfd_vms_etir_name (prev_cmd),
5060 				      _bfd_vms_etir_name (ETIR__C_STO_LW));
5061 		  return FALSE;
5062 		}
5063 	      reloc_code = BFD_RELOC_32;
5064 	      break;
5065 
5066 	    case ETIR__C_STO_QW: /* ALPHA_R_REFQUAD und_section, step 4 */
5067 				 /* ALPHA_R_REFQUAD abs_section, step 2 */
5068 	      if (prev_cmd != ETIR__C_OPR_ADD && prev_cmd != ETIR__C_STA_QW)
5069 		{
5070 		  /* xgettext:c-format */
5071 		  _bfd_error_handler (_("unknown reloc %s + %s"),
5072 				      _bfd_vms_etir_name (prev_cmd),
5073 				      _bfd_vms_etir_name (ETIR__C_STO_QW));
5074 		  return FALSE;
5075 		}
5076 	      reloc_code = BFD_RELOC_64;
5077 	      break;
5078 
5079 	    case ETIR__C_STO_OFF: /* ALPHA_R_REFQUAD others, step 2 */
5080 	      if (prev_cmd != ETIR__C_STA_PQ)
5081 		{
5082 		  /* xgettext:c-format */
5083 		  _bfd_error_handler (_("unknown reloc %s + %s"),
5084 				      _bfd_vms_etir_name (prev_cmd),
5085 				      _bfd_vms_etir_name (ETIR__C_STO_OFF));
5086 		  return FALSE;
5087 		}
5088 	      reloc_code = BFD_RELOC_64;
5089 	      break;
5090 
5091 	    case ETIR__C_OPR_ADD: /* ALPHA_R_REFLONG und_section, step 3 */
5092 				  /* ALPHA_R_REFQUAD und_section, step 3 */
5093 	      if (prev_cmd != ETIR__C_STA_LW && prev_cmd != ETIR__C_STA_QW)
5094 		{
5095 		  /* xgettext:c-format */
5096 		  _bfd_error_handler (_("unknown reloc %s + %s"),
5097 				      _bfd_vms_etir_name (prev_cmd),
5098 				      _bfd_vms_etir_name (ETIR__C_OPR_ADD));
5099 		  return FALSE;
5100 		}
5101 	      prev_cmd = ETIR__C_OPR_ADD;
5102 	      continue;
5103 
5104 	    case ETIR__C_STO_CA: /* ALPHA_R_CODEADDR */
5105 	      reloc_code = BFD_RELOC_ALPHA_CODEADDR;
5106 	      cur_sym = ptr + 4;
5107 	      break;
5108 
5109 	    case ETIR__C_STO_GBL: /* ALPHA_R_REFQUAD und_section */
5110 	      reloc_code = BFD_RELOC_64;
5111 	      cur_sym = ptr + 4;
5112 	      break;
5113 
5114 	    case ETIR__C_STO_GBL_LW: /* ALPHA_R_REFLONG und_section */
5115 	      reloc_code = BFD_RELOC_32;
5116 	      cur_sym = ptr + 4;
5117 	      break;
5118 
5119 	    case ETIR__C_STC_LP_PSB: /* ALPHA_R_LINKAGE */
5120 	      reloc_code = BFD_RELOC_ALPHA_LINKAGE;
5121 	      cur_sym = ptr + 8;
5122 	      break;
5123 
5124 	    case ETIR__C_STC_NOP_GBL: /* ALPHA_R_NOP */
5125 	      reloc_code = BFD_RELOC_ALPHA_NOP;
5126 	      goto call_reloc;
5127 
5128 	    case ETIR__C_STC_BSR_GBL: /* ALPHA_R_BSR */
5129 	      reloc_code = BFD_RELOC_ALPHA_BSR;
5130 	      goto call_reloc;
5131 
5132 	    case ETIR__C_STC_LDA_GBL: /* ALPHA_R_LDA */
5133 	      reloc_code = BFD_RELOC_ALPHA_LDA;
5134 	      goto call_reloc;
5135 
5136 	    case ETIR__C_STC_BOH_GBL: /* ALPHA_R_BOH */
5137 	      reloc_code = BFD_RELOC_ALPHA_BOH;
5138 	      goto call_reloc;
5139 
5140 	    call_reloc:
5141 	      cur_sym = ptr + 4 + 32;
5142 	      cur_address = bfd_getl64 (ptr + 4 + 8);
5143 	      cur_addend = bfd_getl64 (ptr + 4 + 24);
5144 	      break;
5145 
5146 	    case ETIR__C_STO_IMM:
5147 	      vaddr += bfd_getl32 (ptr + 4);
5148 	      continue;
5149 
5150 	    default:
5151 	      _bfd_error_handler (_("unknown reloc %s"),
5152 				  _bfd_vms_etir_name (cmd));
5153 	      return FALSE;
5154 	    }
5155 
5156 	  {
5157 	    asection *sec;
5158 	    struct vms_section_data_struct *vms_sec;
5159 	    arelent *reloc;
5160 
5161 	    /* Get section to which the relocation applies.  */
5162 	    if (cur_psect < 0 || cur_psect > (int)PRIV (section_count))
5163 	      {
5164 		_bfd_error_handler (_("invalid section index in ETIR"));
5165 		return FALSE;
5166 	      }
5167 
5168 	    if (PRIV (sections) == NULL)
5169 	      return FALSE;
5170 	    sec = PRIV (sections)[cur_psect];
5171 	    if (sec == bfd_abs_section_ptr)
5172 	      {
5173 		_bfd_error_handler (_("relocation for non-REL psect"));
5174 		return FALSE;
5175 	      }
5176 
5177 	    vms_sec = vms_section_data (sec);
5178 
5179 	    /* Allocate a reloc entry.  */
5180 	    if (sec->reloc_count >= vms_sec->reloc_max)
5181 	      {
5182 		if (vms_sec->reloc_max == 0)
5183 		  {
5184 		    vms_sec->reloc_max = 64;
5185 		    sec->relocation = bfd_zmalloc
5186 		      (vms_sec->reloc_max * sizeof (arelent));
5187 		  }
5188 		else
5189 		  {
5190 		    vms_sec->reloc_max *= 2;
5191 		    sec->relocation = bfd_realloc
5192 		      (sec->relocation, vms_sec->reloc_max * sizeof (arelent));
5193 		  }
5194 	      }
5195 	    reloc = &sec->relocation[sec->reloc_count];
5196 	    sec->reloc_count++;
5197 
5198 	    reloc->howto = bfd_reloc_type_lookup (abfd, reloc_code);
5199 
5200 	    if (cur_sym != NULL)
5201 	      {
5202 		unsigned int j;
5203 		unsigned int symlen = *cur_sym;
5204 		asymbol **sym;
5205 
5206 		/* Linear search.  */
5207 		symlen = *cur_sym;
5208 		cur_sym++;
5209 		sym = NULL;
5210 
5211 		for (j = 0; j < PRIV (gsd_sym_count); j++)
5212 		  if (PRIV (syms)[j]->namelen == symlen
5213 		      && memcmp (PRIV (syms)[j]->name, cur_sym, symlen) == 0)
5214 		    {
5215 		      sym = &PRIV (csymbols)[j];
5216 		      break;
5217 		    }
5218 		if (sym == NULL)
5219 		  {
5220 		    _bfd_error_handler (_("unknown symbol in command %s"),
5221 					_bfd_vms_etir_name (cmd));
5222 		    reloc->sym_ptr_ptr = NULL;
5223 		  }
5224 		else
5225 		  reloc->sym_ptr_ptr = sym;
5226 	      }
5227 	    else if (cur_psidx >= 0)
5228 	      {
5229 		if (PRIV (sections) == NULL || cur_psidx >= (int) PRIV (section_count))
5230 		  return FALSE;
5231 		reloc->sym_ptr_ptr =
5232 		  PRIV (sections)[cur_psidx]->symbol_ptr_ptr;
5233 	      }
5234 	    else
5235 	      reloc->sym_ptr_ptr = NULL;
5236 
5237 	    reloc->address = cur_address;
5238 	    reloc->addend = cur_addend;
5239 
5240 	    vaddr += bfd_get_reloc_size (reloc->howto);
5241 	  }
5242 
5243 	  cur_addend = 0;
5244 	  prev_cmd = -1;
5245 	  cur_sym = NULL;
5246 	  cur_psidx = -1;
5247 	}
5248     }
5249   vms_debug2 ((3, "alpha_vms_slurp_relocs: result = TRUE\n"));
5250 
5251   return TRUE;
5252 }
5253 
5254 /* Return the number of bytes required to store the relocation
5255    information associated with the given section.  */
5256 
5257 static long
5258 alpha_vms_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *section)
5259 {
5260   alpha_vms_slurp_relocs (abfd);
5261 
5262   return (section->reloc_count + 1) * sizeof (arelent *);
5263 }
5264 
5265 /* Convert relocations from VMS (external) form into BFD internal
5266    form.  Return the number of relocations.  */
5267 
5268 static long
5269 alpha_vms_canonicalize_reloc (bfd *abfd, asection *section, arelent **relptr,
5270 			      asymbol **symbols ATTRIBUTE_UNUSED)
5271 {
5272   arelent *tblptr;
5273   int count;
5274 
5275   if (!alpha_vms_slurp_relocs (abfd))
5276     return -1;
5277 
5278   count = section->reloc_count;
5279   tblptr = section->relocation;
5280 
5281   while (count--)
5282     *relptr++ = tblptr++;
5283 
5284   *relptr = (arelent *) NULL;
5285   return section->reloc_count;
5286 }
5287 
5288 /* Install a new set of internal relocs.  */
5289 
5290 #define alpha_vms_set_reloc _bfd_generic_set_reloc
5291 
5292 
5293 /* This is just copied from ecoff-alpha, needs to be fixed probably.  */
5294 
5295 /* How to process the various reloc types.  */
5296 
5297 static bfd_reloc_status_type
5298 reloc_nil (bfd * abfd ATTRIBUTE_UNUSED,
5299 	   arelent *reloc ATTRIBUTE_UNUSED,
5300 	   asymbol *sym ATTRIBUTE_UNUSED,
5301 	   void * data ATTRIBUTE_UNUSED,
5302 	   asection *sec ATTRIBUTE_UNUSED,
5303 	   bfd *output_bfd ATTRIBUTE_UNUSED,
5304 	   char **error_message ATTRIBUTE_UNUSED)
5305 {
5306 #if VMS_DEBUG
5307   vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd, output_bfd);
5308   vms_debug (2, "In section %s, symbol %s\n",
5309 	sec->name, sym->name);
5310   vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5311 		reloc->sym_ptr_ptr[0]->name,
5312 		(unsigned long)reloc->address,
5313 		(unsigned long)reloc->addend, reloc->howto->name);
5314   vms_debug (2, "data at %p\n", data);
5315   /*  _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5316 #endif
5317 
5318   return bfd_reloc_ok;
5319 }
5320 
5321 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5322    from smaller values.  Start with zero, widen, *then* decrement.  */
5323 #define MINUS_ONE	(((bfd_vma)0) - 1)
5324 
5325 static reloc_howto_type alpha_howto_table[] =
5326 {
5327   HOWTO (ALPHA_R_IGNORE,	/* Type.  */
5328 	 0,			/* Rightshift.  */
5329 	 0,			/* Size (0 = byte, 1 = short, 2 = long).  */
5330 	 8,			/* Bitsize.  */
5331 	 TRUE,			/* PC relative.  */
5332 	 0,			/* Bitpos.  */
5333 	 complain_overflow_dont,/* Complain_on_overflow.  */
5334 	 reloc_nil,		/* Special_function.  */
5335 	 "IGNORE",		/* Name.  */
5336 	 TRUE,			/* Partial_inplace.  */
5337 	 0,			/* Source mask */
5338 	 0,			/* Dest mask.  */
5339 	 TRUE),			/* PC rel offset.  */
5340 
5341   /* A 64 bit reference to a symbol.  */
5342   HOWTO (ALPHA_R_REFQUAD,	/* Type.  */
5343 	 0,			/* Rightshift.  */
5344 	 4,			/* Size (0 = byte, 1 = short, 2 = long).  */
5345 	 64,			/* Bitsize.  */
5346 	 FALSE,			/* PC relative.  */
5347 	 0,			/* Bitpos.  */
5348 	 complain_overflow_bitfield, /* Complain_on_overflow.  */
5349 	 reloc_nil,		/* Special_function.  */
5350 	 "REFQUAD",		/* Name.  */
5351 	 TRUE,			/* Partial_inplace.  */
5352 	 MINUS_ONE,		/* Source mask.  */
5353 	 MINUS_ONE,		/* Dest mask.  */
5354 	 FALSE),		/* PC rel offset.  */
5355 
5356   /* A 21 bit branch.  The native assembler generates these for
5357      branches within the text segment, and also fills in the PC
5358      relative offset in the instruction.  */
5359   HOWTO (ALPHA_R_BRADDR,	/* Type.  */
5360 	 2,			/* Rightshift.  */
5361 	 2,			/* Size (0 = byte, 1 = short, 2 = long).  */
5362 	 21,			/* Bitsize.  */
5363 	 TRUE,			/* PC relative.  */
5364 	 0,			/* Bitpos.  */
5365 	 complain_overflow_signed, /* Complain_on_overflow.  */
5366 	 reloc_nil,		/* Special_function.  */
5367 	 "BRADDR",		/* Name.  */
5368 	 TRUE,			/* Partial_inplace.  */
5369 	 0x1fffff,		/* Source mask.  */
5370 	 0x1fffff,		/* Dest mask.  */
5371 	 FALSE),		/* PC rel offset.  */
5372 
5373   /* A hint for a jump to a register.  */
5374   HOWTO (ALPHA_R_HINT,		/* Type.  */
5375 	 2,			/* Rightshift.  */
5376 	 1,			/* Size (0 = byte, 1 = short, 2 = long).  */
5377 	 14,			/* Bitsize.  */
5378 	 TRUE,			/* PC relative.  */
5379 	 0,			/* Bitpos.  */
5380 	 complain_overflow_dont,/* Complain_on_overflow.  */
5381 	 reloc_nil,		/* Special_function.  */
5382 	 "HINT",		/* Name.  */
5383 	 TRUE,			/* Partial_inplace.  */
5384 	 0x3fff,		/* Source mask.  */
5385 	 0x3fff,		/* Dest mask.  */
5386 	 FALSE),		/* PC rel offset.  */
5387 
5388   /* 16 bit PC relative offset.  */
5389   HOWTO (ALPHA_R_SREL16,	/* Type.  */
5390 	 0,			/* Rightshift.  */
5391 	 1,			/* Size (0 = byte, 1 = short, 2 = long).  */
5392 	 16,			/* Bitsize.  */
5393 	 TRUE,			/* PC relative.  */
5394 	 0,			/* Bitpos.  */
5395 	 complain_overflow_signed, /* Complain_on_overflow.  */
5396 	 reloc_nil,		/* Special_function.  */
5397 	 "SREL16",		/* Name.  */
5398 	 TRUE,			/* Partial_inplace.  */
5399 	 0xffff,		/* Source mask.  */
5400 	 0xffff,		/* Dest mask.  */
5401 	 FALSE),		/* PC rel offset.  */
5402 
5403   /* 32 bit PC relative offset.  */
5404   HOWTO (ALPHA_R_SREL32,	/* Type.  */
5405 	 0,			/* Rightshift.  */
5406 	 2,			/* Size (0 = byte, 1 = short, 2 = long).  */
5407 	 32,			/* Bitsize.  */
5408 	 TRUE,			/* PC relative.  */
5409 	 0,			/* Bitpos.  */
5410 	 complain_overflow_signed, /* Complain_on_overflow.  */
5411 	 reloc_nil,		/* Special_function.  */
5412 	 "SREL32",		/* Name.  */
5413 	 TRUE,			/* Partial_inplace.  */
5414 	 0xffffffff,		/* Source mask.  */
5415 	 0xffffffff,		/* Dest mask.  */
5416 	 FALSE),		/* PC rel offset.  */
5417 
5418   /* A 64 bit PC relative offset.  */
5419   HOWTO (ALPHA_R_SREL64,	/* Type.  */
5420 	 0,			/* Rightshift.  */
5421 	 4,			/* Size (0 = byte, 1 = short, 2 = long).  */
5422 	 64,			/* Bitsize.  */
5423 	 TRUE,			/* PC relative.  */
5424 	 0,			/* Bitpos.  */
5425 	 complain_overflow_signed, /* Complain_on_overflow.  */
5426 	 reloc_nil,		/* Special_function.  */
5427 	 "SREL64",		/* Name.  */
5428 	 TRUE,			/* Partial_inplace.  */
5429 	 MINUS_ONE,		/* Source mask.  */
5430 	 MINUS_ONE,		/* Dest mask.  */
5431 	 FALSE),		/* PC rel offset.  */
5432 
5433   /* Push a value on the reloc evaluation stack.  */
5434   HOWTO (ALPHA_R_OP_PUSH,	/* Type.  */
5435 	 0,			/* Rightshift.  */
5436 	 0,			/* Size (0 = byte, 1 = short, 2 = long).  */
5437 	 0,			/* Bitsize.  */
5438 	 FALSE,			/* PC relative.  */
5439 	 0,			/* Bitpos.  */
5440 	 complain_overflow_dont,/* Complain_on_overflow.  */
5441 	 reloc_nil,		/* Special_function.  */
5442 	 "OP_PUSH",		/* Name.  */
5443 	 FALSE,			/* Partial_inplace.  */
5444 	 0,			/* Source mask.  */
5445 	 0,			/* Dest mask.  */
5446 	 FALSE),		/* PC rel offset.  */
5447 
5448   /* Store the value from the stack at the given address.  Store it in
5449      a bitfield of size r_size starting at bit position r_offset.  */
5450   HOWTO (ALPHA_R_OP_STORE,	/* Type.  */
5451 	 0,			/* Rightshift.  */
5452 	 4,			/* Size (0 = byte, 1 = short, 2 = long).  */
5453 	 64,			/* Bitsize.  */
5454 	 FALSE,			/* PC relative.  */
5455 	 0,			/* Bitpos.  */
5456 	 complain_overflow_dont,/* Complain_on_overflow.  */
5457 	 reloc_nil,		/* Special_function.  */
5458 	 "OP_STORE",		/* Name.  */
5459 	 FALSE,			/* Partial_inplace.  */
5460 	 0,			/* Source mask.  */
5461 	 MINUS_ONE,		/* Dest mask.  */
5462 	 FALSE),		/* PC rel offset.  */
5463 
5464   /* Subtract the reloc address from the value on the top of the
5465      relocation stack.  */
5466   HOWTO (ALPHA_R_OP_PSUB,	/* Type.  */
5467 	 0,			/* Rightshift.  */
5468 	 0,			/* Size (0 = byte, 1 = short, 2 = long).  */
5469 	 0,			/* Bitsize.  */
5470 	 FALSE,			/* PC relative.  */
5471 	 0,			/* Bitpos.  */
5472 	 complain_overflow_dont,/* Complain_on_overflow.  */
5473 	 reloc_nil,		/* Special_function.  */
5474 	 "OP_PSUB",		/* Name.  */
5475 	 FALSE,			/* Partial_inplace.  */
5476 	 0,			/* Source mask.  */
5477 	 0,			/* Dest mask.  */
5478 	 FALSE),		/* PC rel offset.  */
5479 
5480   /* Shift the value on the top of the relocation stack right by the
5481      given value.  */
5482   HOWTO (ALPHA_R_OP_PRSHIFT,	/* Type.  */
5483 	 0,			/* Rightshift.  */
5484 	 0,			/* Size (0 = byte, 1 = short, 2 = long).  */
5485 	 0,			/* Bitsize.  */
5486 	 FALSE,			/* PC relative.  */
5487 	 0,			/* Bitpos.  */
5488 	 complain_overflow_dont,/* Complain_on_overflow.  */
5489 	 reloc_nil,		/* Special_function.  */
5490 	 "OP_PRSHIFT",		/* Name.  */
5491 	 FALSE,			/* Partial_inplace.  */
5492 	 0,			/* Source mask.  */
5493 	 0,			/* Dest mask.  */
5494 	 FALSE),		/* PC rel offset.  */
5495 
5496   /* Hack. Linkage is done by linker.  */
5497   HOWTO (ALPHA_R_LINKAGE,	/* Type.  */
5498 	 0,			/* Rightshift.  */
5499 	 8,			/* Size (0 = byte, 1 = short, 2 = long).  */
5500 	 256,			/* Bitsize.  */
5501 	 FALSE,			/* PC relative.  */
5502 	 0,			/* Bitpos.  */
5503 	 complain_overflow_dont,/* Complain_on_overflow.  */
5504 	 reloc_nil,		/* Special_function.  */
5505 	 "LINKAGE",		/* Name.  */
5506 	 FALSE,			/* Partial_inplace.  */
5507 	 0,			/* Source mask.  */
5508 	 0,			/* Dest mask.  */
5509 	 FALSE),		/* PC rel offset.  */
5510 
5511   /* A 32 bit reference to a symbol.  */
5512   HOWTO (ALPHA_R_REFLONG,	/* Type.  */
5513 	 0,			/* Rightshift.  */
5514 	 2,			/* Size (0 = byte, 1 = short, 2 = long).  */
5515 	 32,			/* Bitsize.  */
5516 	 FALSE,			/* PC relative.  */
5517 	 0,			/* Bitpos.  */
5518 	 complain_overflow_bitfield, /* Complain_on_overflow.  */
5519 	 reloc_nil,		/* Special_function.  */
5520 	 "REFLONG",		/* Name.  */
5521 	 TRUE,			/* Partial_inplace.  */
5522 	 0xffffffff,		/* Source mask.  */
5523 	 0xffffffff,		/* Dest mask.  */
5524 	 FALSE),		/* PC rel offset.  */
5525 
5526   /* A 64 bit reference to a procedure, written as 32 bit value.  */
5527   HOWTO (ALPHA_R_CODEADDR,	/* Type.  */
5528 	 0,			/* Rightshift.  */
5529 	 4,			/* Size (0 = byte, 1 = short, 2 = long).  */
5530 	 64,			/* Bitsize.  */
5531 	 FALSE,			/* PC relative.  */
5532 	 0,			/* Bitpos.  */
5533 	 complain_overflow_signed,/* Complain_on_overflow.  */
5534 	 reloc_nil,		/* Special_function.  */
5535 	 "CODEADDR",		/* Name.  */
5536 	 FALSE,			/* Partial_inplace.  */
5537 	 0xffffffff,		/* Source mask.  */
5538 	 0xffffffff,		/* Dest mask.  */
5539 	 FALSE),		/* PC rel offset.  */
5540 
5541   HOWTO (ALPHA_R_NOP,		/* Type.  */
5542 	 0,			/* Rightshift.  */
5543 	 3,			/* Size (0 = byte, 1 = short, 2 = long).  */
5544 	 0,			/* Bitsize.  */
5545 	 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5546 	    because the calculations for the 3 relocations are the same.
5547 	    See B.4.5.2 of the OpenVMS Linker Utility Manual.  */
5548 	 TRUE,			/* PC relative.  */
5549 	 0,			/* Bitpos.   */
5550 	 complain_overflow_dont,/* Complain_on_overflow.  */
5551 	 reloc_nil,		/* Special_function.  */
5552 	 "NOP",			/* Name.  */
5553 	 FALSE,			/* Partial_inplace.  */
5554 	 0xffffffff,		/* Source mask.  */
5555 	 0xffffffff,		/* Dest mask.  */
5556 	 FALSE),		/* PC rel offset.  */
5557 
5558   HOWTO (ALPHA_R_BSR,		/* Type.  */
5559 	 0,			/* Rightshift.  */
5560 	 3,			/* Size (0 = byte, 1 = short, 2 = long).  */
5561 	 0,			/* Bitsize.  */
5562 	 TRUE,			/* PC relative.  */
5563 	 0,			/* Bitpos.  */
5564 	 complain_overflow_dont,/* Complain_on_overflow.  */
5565 	 reloc_nil,		/* Special_function.  */
5566 	 "BSR",			/* Name.  */
5567 	 FALSE,			/* Partial_inplace.  */
5568 	 0xffffffff,		/* Source mask.  */
5569 	 0xffffffff,		/* Dest mask.  */
5570 	 FALSE),		/* PC rel offset.  */
5571 
5572   HOWTO (ALPHA_R_LDA,		/* Type.  */
5573 	 0,			/* Rightshift.  */
5574 	 3,			/* Size (0 = byte, 1 = short, 2 = long).  */
5575 	 0,			/* Bitsize.  */
5576 	 FALSE,			/* PC relative.  */
5577 	 0,			/* Bitpos.  */
5578 	 complain_overflow_dont,/* Complain_on_overflow.  */
5579 	 reloc_nil,		/* Special_function.  */
5580 	 "LDA",			/* Name.  */
5581 	 FALSE,			/* Partial_inplace.  */
5582 	 0xffffffff,		/* Source mask.  */
5583 	 0xffffffff,		/* Dest mask.  */
5584 	 FALSE),		/* PC rel offset.  */
5585 
5586   HOWTO (ALPHA_R_BOH,		/* Type.  */
5587 	 0,			/* Rightshift.  */
5588 	 3,			/* Size (0 = byte, 1 = short, 2 = long, 3 = nil).  */
5589 	 0,			/* Bitsize.  */
5590 	 TRUE,			/* PC relative.  */
5591 	 0,			/* Bitpos.  */
5592 	 complain_overflow_dont,/* Complain_on_overflow.  */
5593 	 reloc_nil,		/* Special_function.  */
5594 	 "BOH",			/* Name.  */
5595 	 FALSE,			/* Partial_inplace.  */
5596 	 0xffffffff,		/* Source mask.  */
5597 	 0xffffffff,		/* Dest mask.  */
5598 	 FALSE),		/* PC rel offset.  */
5599 };
5600 
5601 /* Return a pointer to a howto structure which, when invoked, will perform
5602    the relocation code on data from the architecture noted.  */
5603 
5604 static const struct reloc_howto_struct *
5605 alpha_vms_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
5606 				 bfd_reloc_code_real_type code)
5607 {
5608   int alpha_type;
5609 
5610   vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd, code));
5611 
5612   switch (code)
5613     {
5614       case BFD_RELOC_16:		alpha_type = ALPHA_R_SREL16;	break;
5615       case BFD_RELOC_32:		alpha_type = ALPHA_R_REFLONG;	break;
5616       case BFD_RELOC_64:		alpha_type = ALPHA_R_REFQUAD;	break;
5617       case BFD_RELOC_CTOR:		alpha_type = ALPHA_R_REFQUAD;	break;
5618       case BFD_RELOC_23_PCREL_S2:	alpha_type = ALPHA_R_BRADDR;	break;
5619       case BFD_RELOC_ALPHA_HINT:	alpha_type = ALPHA_R_HINT;	break;
5620       case BFD_RELOC_16_PCREL:		alpha_type = ALPHA_R_SREL16;	break;
5621       case BFD_RELOC_32_PCREL:		alpha_type = ALPHA_R_SREL32;	break;
5622       case BFD_RELOC_64_PCREL:		alpha_type = ALPHA_R_SREL64;	break;
5623       case BFD_RELOC_ALPHA_LINKAGE:	alpha_type = ALPHA_R_LINKAGE;	break;
5624       case BFD_RELOC_ALPHA_CODEADDR:	alpha_type = ALPHA_R_CODEADDR;	break;
5625       case BFD_RELOC_ALPHA_NOP:		alpha_type = ALPHA_R_NOP;	break;
5626       case BFD_RELOC_ALPHA_BSR:		alpha_type = ALPHA_R_BSR;	break;
5627       case BFD_RELOC_ALPHA_LDA:		alpha_type = ALPHA_R_LDA;	break;
5628       case BFD_RELOC_ALPHA_BOH:		alpha_type = ALPHA_R_BOH;	break;
5629       default:
5630 	_bfd_error_handler (_("reloc (%d) is *UNKNOWN*"), code);
5631 	return NULL;
5632     }
5633   vms_debug2 ((2, "reloc is %s\n", alpha_howto_table[alpha_type].name));
5634   return & alpha_howto_table[alpha_type];
5635 }
5636 
5637 static reloc_howto_type *
5638 alpha_vms_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
5639 				 const char *r_name)
5640 {
5641   unsigned int i;
5642 
5643   for (i = 0;
5644        i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
5645        i++)
5646     if (alpha_howto_table[i].name != NULL
5647 	&& strcasecmp (alpha_howto_table[i].name, r_name) == 0)
5648       return &alpha_howto_table[i];
5649 
5650   return NULL;
5651 }
5652 
5653 static long
5654 alpha_vms_get_synthetic_symtab (bfd *abfd,
5655 				long symcount ATTRIBUTE_UNUSED,
5656 				asymbol **usyms ATTRIBUTE_UNUSED,
5657 				long dynsymcount ATTRIBUTE_UNUSED,
5658 				asymbol **dynsyms ATTRIBUTE_UNUSED,
5659 				asymbol **ret)
5660 {
5661   asymbol *syms;
5662   unsigned int i;
5663   unsigned int n = 0;
5664 
5665   syms = (asymbol *) bfd_malloc (PRIV (norm_sym_count) * sizeof (asymbol));
5666   *ret = syms;
5667   if (syms == NULL)
5668     return -1;
5669 
5670   for (i = 0; i < PRIV (gsd_sym_count); i++)
5671     {
5672       struct vms_symbol_entry *e = PRIV (syms)[i];
5673       asymbol *sym;
5674       flagword flags;
5675       symvalue value;
5676       asection *sec;
5677       const char *name;
5678       char *sname;
5679       int l;
5680 
5681       name = e->name;
5682       value = 0;
5683       flags = BSF_LOCAL | BSF_SYNTHETIC;
5684       sec = NULL;
5685 
5686       switch (e->typ)
5687 	{
5688 	case EGSD__C_SYM:
5689 	case EGSD__C_SYMG:
5690 	  if ((e->flags & EGSY__V_DEF) && (e->flags & EGSY__V_NORM))
5691 	    {
5692 	      value = e->code_value;
5693 	      sec = e->code_section;
5694 	    }
5695 	  else
5696 	    continue;
5697 	  break;
5698 
5699 	default:
5700 	  continue;
5701 	}
5702 
5703       l = strlen (name);
5704       sname = bfd_alloc (abfd, l + 5);
5705       if (sname == NULL)
5706 	return FALSE;
5707       memcpy (sname, name, l);
5708       memcpy (sname + l, "..en", 5);
5709 
5710       sym = &syms[n++];
5711       sym->name = sname;
5712       sym->section = sec;
5713       sym->flags = flags;
5714       sym->value = value;
5715       sym->udata.p = NULL;
5716     }
5717 
5718   return n;
5719 }
5720 
5721 /* Private dump.  */
5722 
5723 static const char *
5724 vms_time_to_str (unsigned char *buf)
5725 {
5726   time_t t = vms_rawtime_to_time_t (buf);
5727   char *res = ctime (&t);
5728 
5729   if (!res)
5730     res = "*invalid time*";
5731   else
5732     res[24] = 0;
5733   return res;
5734 }
5735 
5736 static void
5737 evax_bfd_print_emh (FILE *file, unsigned char *rec, unsigned int rec_len)
5738 {
5739   struct vms_emh_common *emh = (struct vms_emh_common *)rec;
5740   unsigned int subtype;
5741   int extra;
5742 
5743   subtype = (unsigned) bfd_getl16 (emh->subtyp);
5744 
5745   /* xgettext:c-format */
5746   fprintf (file, _("  EMH %u (len=%u): "), subtype, rec_len);
5747 
5748   /* PR 21618: Check for invalid lengths.  */
5749   if (rec_len < sizeof (* emh))
5750     {
5751       fprintf (file, _("   Error: The length is less than the length of an EMH record\n"));
5752       return;
5753     }
5754   extra = rec_len - sizeof (struct vms_emh_common);
5755 
5756   switch (subtype)
5757     {
5758     case EMH__C_MHD:
5759       {
5760 	struct vms_emh_mhd *mhd = (struct vms_emh_mhd *) rec;
5761 	const char * name;
5762 	const char * nextname;
5763 	const char * maxname;
5764 
5765 	/* PR 21840: Check for invalid lengths.  */
5766 	if (rec_len < sizeof (* mhd))
5767 	  {
5768 	    fprintf (file, _("   Error: The record length is less than the size of an EMH_MHD record\n"));
5769 	    return;
5770 	  }
5771 	fprintf (file, _("Module header\n"));
5772 	fprintf (file, _("   structure level: %u\n"), mhd->strlvl);
5773 	fprintf (file, _("   max record size: %u\n"),
5774 		 (unsigned) bfd_getl32 (mhd->recsiz));
5775 	name = (char *)(mhd + 1);
5776 	maxname = (char *) rec + rec_len;
5777 	if (name > maxname - 2)
5778 	  {
5779 	    fprintf (file, _("   Error: The module name is missing\n"));
5780 	    return;
5781 	  }
5782 	nextname = name + name[0] + 1;
5783 	if (nextname >= maxname)
5784 	  {
5785 	    fprintf (file, _("   Error: The module name is too long\n"));
5786 	    return;
5787 	  }
5788 	fprintf (file, _("   module name    : %.*s\n"), name[0], name + 1);
5789 	name = nextname;
5790 	if (name > maxname - 2)
5791 	  {
5792 	    fprintf (file, _("   Error: The module version is missing\n"));
5793 	    return;
5794 	  }
5795 	nextname = name + name[0] + 1;
5796 	if (nextname >= maxname)
5797 	  {
5798 	    fprintf (file, _("   Error: The module version is too long\n"));
5799 	    return;
5800 	  }
5801 	fprintf (file, _("   module version : %.*s\n"), name[0], name + 1);
5802 	name = nextname;
5803 	if ((maxname - name) < 17 && maxname[-1] != 0)
5804 	  fprintf (file, _("   Error: The compile date is truncated\n"));
5805 	else
5806 	  fprintf (file, _("   compile date   : %.17s\n"), name);
5807       }
5808       break;
5809 
5810     case EMH__C_LNM:
5811       fprintf (file, _("Language Processor Name\n"));
5812       fprintf (file, _("   language name: %.*s\n"), extra, (char *)(emh + 1));
5813       break;
5814 
5815     case EMH__C_SRC:
5816       fprintf (file, _("Source Files Header\n"));
5817       fprintf (file, _("   file: %.*s\n"), extra, (char *)(emh + 1));
5818       break;
5819 
5820     case EMH__C_TTL:
5821       fprintf (file, _("Title Text Header\n"));
5822       fprintf (file, _("   title: %.*s\n"), extra, (char *)(emh + 1));
5823       break;
5824 
5825     case EMH__C_CPR:
5826       fprintf (file, _("Copyright Header\n"));
5827       fprintf (file, _("   copyright: %.*s\n"), extra, (char *)(emh + 1));
5828       break;
5829 
5830     default:
5831       fprintf (file, _("unhandled emh subtype %u\n"), subtype);
5832       break;
5833     }
5834 }
5835 
5836 static void
5837 evax_bfd_print_eeom (FILE *file, unsigned char *rec, unsigned int rec_len)
5838 {
5839   struct vms_eeom *eeom = (struct vms_eeom *)rec;
5840 
5841   fprintf (file, _("  EEOM (len=%u):\n"), rec_len);
5842 
5843   /* PR 21618: Check for invalid lengths.  */
5844   if (rec_len < sizeof (* eeom))
5845     {
5846       fprintf (file, _("   Error: The length is less than the length of an EEOM record\n"));
5847       return;
5848     }
5849 
5850   fprintf (file, _("   number of cond linkage pairs: %u\n"),
5851 	   (unsigned)bfd_getl32 (eeom->total_lps));
5852   fprintf (file, _("   completion code: %u\n"),
5853 	   (unsigned)bfd_getl16 (eeom->comcod));
5854   if (rec_len > 10)
5855     {
5856       fprintf (file, _("   transfer addr flags: 0x%02x\n"), eeom->tfrflg);
5857       fprintf (file, _("   transfer addr psect: %u\n"),
5858 	       (unsigned)bfd_getl32 (eeom->psindx));
5859       fprintf (file, _("   transfer address   : 0x%08x\n"),
5860 	       (unsigned)bfd_getl32 (eeom->tfradr));
5861     }
5862 }
5863 
5864 static void
5865 exav_bfd_print_egsy_flags (unsigned int flags, FILE *file)
5866 {
5867   if (flags & EGSY__V_WEAK)
5868     fputs (_(" WEAK"), file);
5869   if (flags & EGSY__V_DEF)
5870     fputs (_(" DEF"), file);
5871   if (flags & EGSY__V_UNI)
5872     fputs (_(" UNI"), file);
5873   if (flags & EGSY__V_REL)
5874     fputs (_(" REL"), file);
5875   if (flags & EGSY__V_COMM)
5876     fputs (_(" COMM"), file);
5877   if (flags & EGSY__V_VECEP)
5878     fputs (_(" VECEP"), file);
5879   if (flags & EGSY__V_NORM)
5880     fputs (_(" NORM"), file);
5881   if (flags & EGSY__V_QUAD_VAL)
5882     fputs (_(" QVAL"), file);
5883 }
5884 
5885 static void
5886 evax_bfd_print_egsd_flags (FILE *file, unsigned int flags)
5887 {
5888   if (flags & EGPS__V_PIC)
5889     fputs (_(" PIC"), file);
5890   if (flags & EGPS__V_LIB)
5891     fputs (_(" LIB"), file);
5892   if (flags & EGPS__V_OVR)
5893     fputs (_(" OVR"), file);
5894   if (flags & EGPS__V_REL)
5895     fputs (_(" REL"), file);
5896   if (flags & EGPS__V_GBL)
5897     fputs (_(" GBL"), file);
5898   if (flags & EGPS__V_SHR)
5899     fputs (_(" SHR"), file);
5900   if (flags & EGPS__V_EXE)
5901     fputs (_(" EXE"), file);
5902   if (flags & EGPS__V_RD)
5903     fputs (_(" RD"), file);
5904   if (flags & EGPS__V_WRT)
5905     fputs (_(" WRT"), file);
5906   if (flags & EGPS__V_VEC)
5907     fputs (_(" VEC"), file);
5908   if (flags & EGPS__V_NOMOD)
5909     fputs (_(" NOMOD"), file);
5910   if (flags & EGPS__V_COM)
5911     fputs (_(" COM"), file);
5912   if (flags & EGPS__V_ALLOC_64BIT)
5913     fputs (_(" 64B"), file);
5914 }
5915 
5916 static void
5917 evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len)
5918 {
5919   unsigned int off = sizeof (struct vms_egsd);
5920   unsigned int n;
5921 
5922   fprintf (file, _("  EGSD (len=%u):\n"), rec_len);
5923 
5924   n = 0;
5925   for (off = sizeof (struct vms_egsd); off < rec_len; )
5926     {
5927       struct vms_egsd_entry *e = (struct vms_egsd_entry *)(rec + off);
5928       unsigned int type;
5929       unsigned int len;
5930 
5931       type = (unsigned)bfd_getl16 (e->gsdtyp);
5932       len = (unsigned)bfd_getl16 (e->gsdsiz);
5933 
5934       /* xgettext:c-format */
5935       fprintf (file, _("  EGSD entry %2u (type: %u, len: %u): "),
5936 	       n, type, len);
5937       n++;
5938 
5939       if (off + len > rec_len || off + len < off)
5940 	{
5941 	  fprintf (file, _("   Error: length larger than remaining space in record\n"));
5942 	  return;
5943 	}
5944 
5945       switch (type)
5946 	{
5947 	case EGSD__C_PSC:
5948 	  {
5949 	    struct vms_egps *egps = (struct vms_egps *)e;
5950 	    unsigned int flags = bfd_getl16 (egps->flags);
5951 	    unsigned int l;
5952 
5953 	    fprintf (file, _("PSC - Program section definition\n"));
5954 	    fprintf (file, _("   alignment  : 2**%u\n"), egps->align);
5955 	    fprintf (file, _("   flags      : 0x%04x"), flags);
5956 	    evax_bfd_print_egsd_flags (file, flags);
5957 	    fputc ('\n', file);
5958 	    l = bfd_getl32 (egps->alloc);
5959 	    fprintf (file, _("   alloc (len): %u (0x%08x)\n"), l, l);
5960 	    fprintf (file, _("   name       : %.*s\n"),
5961 		     egps->namlng, egps->name);
5962 	  }
5963 	  break;
5964 	case EGSD__C_SPSC:
5965 	  {
5966 	    struct vms_esgps *esgps = (struct vms_esgps *)e;
5967 	    unsigned int flags = bfd_getl16 (esgps->flags);
5968 	    unsigned int l;
5969 
5970 	    fprintf (file, _("SPSC - Shared Image Program section def\n"));
5971 	    fprintf (file, _("   alignment  : 2**%u\n"), esgps->align);
5972 	    fprintf (file, _("   flags      : 0x%04x"), flags);
5973 	    evax_bfd_print_egsd_flags (file, flags);
5974 	    fputc ('\n', file);
5975 	    l = bfd_getl32 (esgps->alloc);
5976 	    fprintf (file, _("   alloc (len)   : %u (0x%08x)\n"), l, l);
5977 	    fprintf (file, _("   image offset  : 0x%08x\n"),
5978 		     (unsigned int)bfd_getl32 (esgps->base));
5979 	    fprintf (file, _("   symvec offset : 0x%08x\n"),
5980 		     (unsigned int)bfd_getl32 (esgps->value));
5981 	    fprintf (file, _("   name          : %.*s\n"),
5982 		     esgps->namlng, esgps->name);
5983 	  }
5984 	  break;
5985 	case EGSD__C_SYM:
5986 	  {
5987 	    struct vms_egsy *egsy = (struct vms_egsy *)e;
5988 	    unsigned int flags = bfd_getl16 (egsy->flags);
5989 
5990 	    if (flags & EGSY__V_DEF)
5991 	      {
5992 		struct vms_esdf *esdf = (struct vms_esdf *)e;
5993 
5994 		fprintf (file, _("SYM - Global symbol definition\n"));
5995 		fprintf (file, _("   flags: 0x%04x"), flags);
5996 		exav_bfd_print_egsy_flags (flags, file);
5997 		fputc ('\n', file);
5998 		fprintf (file, _("   psect offset: 0x%08x\n"),
5999 			 (unsigned)bfd_getl32 (esdf->value));
6000 		if (flags & EGSY__V_NORM)
6001 		  {
6002 		    fprintf (file, _("   code address: 0x%08x\n"),
6003 			     (unsigned)bfd_getl32 (esdf->code_address));
6004 		    fprintf (file, _("   psect index for entry point : %u\n"),
6005 			     (unsigned)bfd_getl32 (esdf->ca_psindx));
6006 		  }
6007 		fprintf (file, _("   psect index : %u\n"),
6008 			 (unsigned)bfd_getl32 (esdf->psindx));
6009 		fprintf (file, _("   name        : %.*s\n"),
6010 			 esdf->namlng, esdf->name);
6011 	      }
6012 	    else
6013 	      {
6014 		struct vms_esrf *esrf = (struct vms_esrf *)e;
6015 
6016 		fprintf (file, _("SYM - Global symbol reference\n"));
6017 		fprintf (file, _("   name       : %.*s\n"),
6018 			 esrf->namlng, esrf->name);
6019 	      }
6020 	  }
6021 	  break;
6022 	case EGSD__C_IDC:
6023 	  {
6024 	    struct vms_eidc *eidc = (struct vms_eidc *)e;
6025 	    unsigned int flags = bfd_getl32 (eidc->flags);
6026 	    unsigned char *p;
6027 
6028 	    fprintf (file, _("IDC - Ident Consistency check\n"));
6029 	    fprintf (file, _("   flags         : 0x%08x"), flags);
6030 	    if (flags & EIDC__V_BINIDENT)
6031 	      fputs (" BINDENT", file);
6032 	    fputc ('\n', file);
6033 	    fprintf (file, _("   id match      : %x\n"),
6034 		     (flags >> EIDC__V_IDMATCH_SH) & EIDC__V_IDMATCH_MASK);
6035 	    fprintf (file, _("   error severity: %x\n"),
6036 		     (flags >> EIDC__V_ERRSEV_SH) & EIDC__V_ERRSEV_MASK);
6037 	    p = eidc->name;
6038 	    fprintf (file, _("   entity name   : %.*s\n"), p[0], p + 1);
6039 	    p += 1 + p[0];
6040 	    fprintf (file, _("   object name   : %.*s\n"), p[0], p + 1);
6041 	    p += 1 + p[0];
6042 	    if (flags & EIDC__V_BINIDENT)
6043 	      fprintf (file, _("   binary ident  : 0x%08x\n"),
6044 		       (unsigned)bfd_getl32 (p + 1));
6045 	    else
6046 	      fprintf (file, _("   ascii ident   : %.*s\n"), p[0], p + 1);
6047 	  }
6048 	  break;
6049 	case EGSD__C_SYMG:
6050 	  {
6051 	    struct vms_egst *egst = (struct vms_egst *)e;
6052 	    unsigned int flags = bfd_getl16 (egst->header.flags);
6053 
6054 	    fprintf (file, _("SYMG - Universal symbol definition\n"));
6055 	    fprintf (file, _("   flags: 0x%04x"), flags);
6056 	    exav_bfd_print_egsy_flags (flags, file);
6057 	    fputc ('\n', file);
6058 	    fprintf (file, _("   symbol vector offset: 0x%08x\n"),
6059 		     (unsigned)bfd_getl32 (egst->value));
6060 	    fprintf (file, _("   entry point: 0x%08x\n"),
6061 		     (unsigned)bfd_getl32 (egst->lp_1));
6062 	    fprintf (file, _("   proc descr : 0x%08x\n"),
6063 		     (unsigned)bfd_getl32 (egst->lp_2));
6064 	    fprintf (file, _("   psect index: %u\n"),
6065 		     (unsigned)bfd_getl32 (egst->psindx));
6066 	    fprintf (file, _("   name       : %.*s\n"),
6067 		     egst->namlng, egst->name);
6068 	  }
6069 	  break;
6070 	case EGSD__C_SYMV:
6071 	  {
6072 	    struct vms_esdfv *esdfv = (struct vms_esdfv *)e;
6073 	    unsigned int flags = bfd_getl16 (esdfv->flags);
6074 
6075 	    fprintf (file, _("SYMV - Vectored symbol definition\n"));
6076 	    fprintf (file, _("   flags: 0x%04x"), flags);
6077 	    exav_bfd_print_egsy_flags (flags, file);
6078 	    fputc ('\n', file);
6079 	    fprintf (file, _("   vector      : 0x%08x\n"),
6080 		     (unsigned)bfd_getl32 (esdfv->vector));
6081 	    fprintf (file, _("   psect offset: %u\n"),
6082 		     (unsigned)bfd_getl32 (esdfv->value));
6083 	    fprintf (file, _("   psect index : %u\n"),
6084 		     (unsigned)bfd_getl32 (esdfv->psindx));
6085 	    fprintf (file, _("   name        : %.*s\n"),
6086 		     esdfv->namlng, esdfv->name);
6087 	  }
6088 	  break;
6089 	case EGSD__C_SYMM:
6090 	  {
6091 	    struct vms_esdfm *esdfm = (struct vms_esdfm *)e;
6092 	    unsigned int flags = bfd_getl16 (esdfm->flags);
6093 
6094 	    fprintf (file, _("SYMM - Global symbol definition with version\n"));
6095 	    fprintf (file, _("   flags: 0x%04x"), flags);
6096 	    exav_bfd_print_egsy_flags (flags, file);
6097 	    fputc ('\n', file);
6098 	    fprintf (file, _("   version mask: 0x%08x\n"),
6099 		     (unsigned)bfd_getl32 (esdfm->version_mask));
6100 	    fprintf (file, _("   psect offset: %u\n"),
6101 		     (unsigned)bfd_getl32 (esdfm->value));
6102 	    fprintf (file, _("   psect index : %u\n"),
6103 		     (unsigned)bfd_getl32 (esdfm->psindx));
6104 	    fprintf (file, _("   name        : %.*s\n"),
6105 		     esdfm->namlng, esdfm->name);
6106 	  }
6107 	  break;
6108 	default:
6109 	  fprintf (file, _("unhandled egsd entry type %u\n"), type);
6110 	  break;
6111 	}
6112       off += len;
6113     }
6114 }
6115 
6116 static void
6117 evax_bfd_print_hex (FILE *file, const char *pfx,
6118 		    const unsigned char *buf, unsigned int len)
6119 {
6120   unsigned int i;
6121   unsigned int n;
6122 
6123   n = 0;
6124   for (i = 0; i < len; i++)
6125     {
6126       if (n == 0)
6127 	fputs (pfx, file);
6128       fprintf (file, " %02x", buf[i]);
6129       n++;
6130       if (n == 16)
6131 	{
6132 	  n = 0;
6133 	  fputc ('\n', file);
6134 	}
6135     }
6136   if (n != 0)
6137     fputc ('\n', file);
6138 }
6139 
6140 static void
6141 evax_bfd_print_etir_stc_ir (FILE *file, const unsigned char *buf, int is_ps)
6142 {
6143   /* xgettext:c-format */
6144   fprintf (file, _("    linkage index: %u, replacement insn: 0x%08x\n"),
6145 	   (unsigned)bfd_getl32 (buf),
6146 	   (unsigned)bfd_getl32 (buf + 16));
6147   /* xgettext:c-format */
6148   fprintf (file, _("    psect idx 1: %u, offset 1: 0x%08x %08x\n"),
6149 	   (unsigned)bfd_getl32 (buf + 4),
6150 	   (unsigned)bfd_getl32 (buf + 12),
6151 	   (unsigned)bfd_getl32 (buf + 8));
6152   /* xgettext:c-format */
6153   fprintf (file, _("    psect idx 2: %u, offset 2: 0x%08x %08x\n"),
6154 	   (unsigned)bfd_getl32 (buf + 20),
6155 	   (unsigned)bfd_getl32 (buf + 28),
6156 	   (unsigned)bfd_getl32 (buf + 24));
6157   if (is_ps)
6158     /* xgettext:c-format */
6159     fprintf (file, _("    psect idx 3: %u, offset 3: 0x%08x %08x\n"),
6160 	     (unsigned)bfd_getl32 (buf + 32),
6161 	     (unsigned)bfd_getl32 (buf + 40),
6162 	     (unsigned)bfd_getl32 (buf + 36));
6163   else
6164     fprintf (file, _("    global name: %.*s\n"), buf[32], buf + 33);
6165 }
6166 
6167 static void
6168 evax_bfd_print_etir (FILE *file, const char *name,
6169 		     unsigned char *rec, unsigned int rec_len)
6170 {
6171   unsigned int off = sizeof (struct vms_egsd);
6172   unsigned int sec_len = 0;
6173 
6174   /* xgettext:c-format */
6175   fprintf (file, _("  %s (len=%u+%u):\n"), name,
6176 	   (unsigned)(rec_len - sizeof (struct vms_eobjrec)),
6177 	   (unsigned)sizeof (struct vms_eobjrec));
6178 
6179   for (off = sizeof (struct vms_eobjrec); off < rec_len; )
6180     {
6181       struct vms_etir *etir = (struct vms_etir *)(rec + off);
6182       unsigned char *buf;
6183       unsigned int type;
6184       unsigned int size;
6185 
6186       type = bfd_getl16 (etir->rectyp);
6187       size = bfd_getl16 (etir->size);
6188       buf = rec + off + sizeof (struct vms_etir);
6189 
6190       if (off + size > rec_len || off + size < off)
6191 	{
6192 	  fprintf (file, _("   Error: length larger than remaining space in record\n"));
6193 	  return;
6194 	}
6195 
6196       /* xgettext:c-format */
6197       fprintf (file, _("   (type: %3u, size: 4+%3u): "), type, size - 4);
6198       switch (type)
6199 	{
6200 	case ETIR__C_STA_GBL:
6201 	  fprintf (file, _("STA_GBL (stack global) %.*s\n"),
6202 		   buf[0], buf + 1);
6203 	  break;
6204 	case ETIR__C_STA_LW:
6205 	  fprintf (file, _("STA_LW (stack longword) 0x%08x\n"),
6206 		   (unsigned)bfd_getl32 (buf));
6207 	  break;
6208 	case ETIR__C_STA_QW:
6209 	  fprintf (file, _("STA_QW (stack quadword) 0x%08x %08x\n"),
6210 		   (unsigned)bfd_getl32 (buf + 4),
6211 		   (unsigned)bfd_getl32 (buf + 0));
6212 	  break;
6213 	case ETIR__C_STA_PQ:
6214 	  fprintf (file, _("STA_PQ (stack psect base + offset)\n"));
6215 	  /* xgettext:c-format */
6216 	  fprintf (file, _("    psect: %u, offset: 0x%08x %08x\n"),
6217 		   (unsigned)bfd_getl32 (buf + 0),
6218 		   (unsigned)bfd_getl32 (buf + 8),
6219 		   (unsigned)bfd_getl32 (buf + 4));
6220 	  break;
6221 	case ETIR__C_STA_LI:
6222 	  fprintf (file, _("STA_LI (stack literal)\n"));
6223 	  break;
6224 	case ETIR__C_STA_MOD:
6225 	  fprintf (file, _("STA_MOD (stack module)\n"));
6226 	  break;
6227 	case ETIR__C_STA_CKARG:
6228 	  fprintf (file, _("STA_CKARG (compare procedure argument)\n"));
6229 	  break;
6230 
6231 	case ETIR__C_STO_B:
6232 	  fprintf (file, _("STO_B (store byte)\n"));
6233 	  break;
6234 	case ETIR__C_STO_W:
6235 	  fprintf (file, _("STO_W (store word)\n"));
6236 	  break;
6237 	case ETIR__C_STO_LW:
6238 	  fprintf (file, _("STO_LW (store longword)\n"));
6239 	  break;
6240 	case ETIR__C_STO_QW:
6241 	  fprintf (file, _("STO_QW (store quadword)\n"));
6242 	  break;
6243 	case ETIR__C_STO_IMMR:
6244 	  {
6245 	    unsigned int len = bfd_getl32 (buf);
6246 	    fprintf (file,
6247 		     _("STO_IMMR (store immediate repeat) %u bytes\n"),
6248 		     len);
6249 	    evax_bfd_print_hex (file, "   ", buf + 4, len);
6250 	    sec_len += len;
6251 	  }
6252 	  break;
6253 	case ETIR__C_STO_GBL:
6254 	  fprintf (file, _("STO_GBL (store global) %.*s\n"),
6255 		   buf[0], buf + 1);
6256 	  break;
6257 	case ETIR__C_STO_CA:
6258 	  fprintf (file, _("STO_CA (store code address) %.*s\n"),
6259 		   buf[0], buf + 1);
6260 	  break;
6261 	case ETIR__C_STO_RB:
6262 	  fprintf (file, _("STO_RB (store relative branch)\n"));
6263 	  break;
6264 	case ETIR__C_STO_AB:
6265 	  fprintf (file, _("STO_AB (store absolute branch)\n"));
6266 	  break;
6267 	case ETIR__C_STO_OFF:
6268 	  fprintf (file, _("STO_OFF (store offset to psect)\n"));
6269 	  break;
6270 	case ETIR__C_STO_IMM:
6271 	  {
6272 	    unsigned int len = bfd_getl32 (buf);
6273 	    fprintf (file,
6274 		     _("STO_IMM (store immediate) %u bytes\n"),
6275 		     len);
6276 	    evax_bfd_print_hex (file, "   ", buf + 4, len);
6277 	    sec_len += len;
6278 	  }
6279 	  break;
6280 	case ETIR__C_STO_GBL_LW:
6281 	  fprintf (file, _("STO_GBL_LW (store global longword) %.*s\n"),
6282 		   buf[0], buf + 1);
6283 	  break;
6284 	case ETIR__C_STO_LP_PSB:
6285 	  fprintf (file, _("STO_OFF (store LP with procedure signature)\n"));
6286 	  break;
6287 	case ETIR__C_STO_HINT_GBL:
6288 	  fprintf (file, _("STO_BR_GBL (store branch global) *todo*\n"));
6289 	  break;
6290 	case ETIR__C_STO_HINT_PS:
6291 	  fprintf (file, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6292 	  break;
6293 
6294 	case ETIR__C_OPR_NOP:
6295 	  fprintf (file, _("OPR_NOP (no-operation)\n"));
6296 	  break;
6297 	case ETIR__C_OPR_ADD:
6298 	  fprintf (file, _("OPR_ADD (add)\n"));
6299 	  break;
6300 	case ETIR__C_OPR_SUB:
6301 	  fprintf (file, _("OPR_SUB (subtract)\n"));
6302 	  break;
6303 	case ETIR__C_OPR_MUL:
6304 	  fprintf (file, _("OPR_MUL (multiply)\n"));
6305 	  break;
6306 	case ETIR__C_OPR_DIV:
6307 	  fprintf (file, _("OPR_DIV (divide)\n"));
6308 	  break;
6309 	case ETIR__C_OPR_AND:
6310 	  fprintf (file, _("OPR_AND (logical and)\n"));
6311 	  break;
6312 	case ETIR__C_OPR_IOR:
6313 	  fprintf (file, _("OPR_IOR (logical inclusive or)\n"));
6314 	  break;
6315 	case ETIR__C_OPR_EOR:
6316 	  fprintf (file, _("OPR_EOR (logical exclusive or)\n"));
6317 	  break;
6318 	case ETIR__C_OPR_NEG:
6319 	  fprintf (file, _("OPR_NEG (negate)\n"));
6320 	  break;
6321 	case ETIR__C_OPR_COM:
6322 	  fprintf (file, _("OPR_COM (complement)\n"));
6323 	  break;
6324 	case ETIR__C_OPR_INSV:
6325 	  fprintf (file, _("OPR_INSV (insert field)\n"));
6326 	  break;
6327 	case ETIR__C_OPR_ASH:
6328 	  fprintf (file, _("OPR_ASH (arithmetic shift)\n"));
6329 	  break;
6330 	case ETIR__C_OPR_USH:
6331 	  fprintf (file, _("OPR_USH (unsigned shift)\n"));
6332 	  break;
6333 	case ETIR__C_OPR_ROT:
6334 	  fprintf (file, _("OPR_ROT (rotate)\n"));
6335 	  break;
6336 	case ETIR__C_OPR_SEL:
6337 	  fprintf (file, _("OPR_SEL (select)\n"));
6338 	  break;
6339 	case ETIR__C_OPR_REDEF:
6340 	  fprintf (file, _("OPR_REDEF (redefine symbol to curr location)\n"));
6341 	  break;
6342 	case ETIR__C_OPR_DFLIT:
6343 	  fprintf (file, _("OPR_REDEF (define a literal)\n"));
6344 	  break;
6345 
6346 	case ETIR__C_STC_LP:
6347 	  fprintf (file, _("STC_LP (store cond linkage pair)\n"));
6348 	  break;
6349 	case ETIR__C_STC_LP_PSB:
6350 	  fprintf (file,
6351 		   _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6352 	  /* xgettext:c-format */
6353 	  fprintf (file, _("   linkage index: %u, procedure: %.*s\n"),
6354 		   (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6355 	  buf += 4 + 1 + buf[4];
6356 	  fprintf (file, _("   signature: %.*s\n"), buf[0], buf + 1);
6357 	  break;
6358 	case ETIR__C_STC_GBL:
6359 	  fprintf (file, _("STC_GBL (store cond global)\n"));
6360 	  /* xgettext:c-format */
6361 	  fprintf (file, _("   linkage index: %u, global: %.*s\n"),
6362 		   (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6363 	  break;
6364 	case ETIR__C_STC_GCA:
6365 	  fprintf (file, _("STC_GCA (store cond code address)\n"));
6366 	  /* xgettext:c-format */
6367 	  fprintf (file, _("   linkage index: %u, procedure name: %.*s\n"),
6368 		   (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6369 	  break;
6370 	case ETIR__C_STC_PS:
6371 	  fprintf (file, _("STC_PS (store cond psect + offset)\n"));
6372 	  fprintf (file,
6373 		   /* xgettext:c-format */
6374 		   _("   linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6375 		   (unsigned)bfd_getl32 (buf),
6376 		   (unsigned)bfd_getl32 (buf + 4),
6377 		   (unsigned)bfd_getl32 (buf + 12),
6378 		   (unsigned)bfd_getl32 (buf + 8));
6379 	  break;
6380 	case ETIR__C_STC_NOP_GBL:
6381 	  fprintf (file, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6382 	  evax_bfd_print_etir_stc_ir (file, buf, 0);
6383 	  break;
6384 	case ETIR__C_STC_NOP_PS:
6385 	  fprintf (file, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6386 	  evax_bfd_print_etir_stc_ir (file, buf, 1);
6387 	  break;
6388 	case ETIR__C_STC_BSR_GBL:
6389 	  fprintf (file, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6390 	  evax_bfd_print_etir_stc_ir (file, buf, 0);
6391 	  break;
6392 	case ETIR__C_STC_BSR_PS:
6393 	  fprintf (file, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6394 	  evax_bfd_print_etir_stc_ir (file, buf, 1);
6395 	  break;
6396 	case ETIR__C_STC_LDA_GBL:
6397 	  fprintf (file, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6398 	  evax_bfd_print_etir_stc_ir (file, buf, 0);
6399 	  break;
6400 	case ETIR__C_STC_LDA_PS:
6401 	  fprintf (file, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6402 	  evax_bfd_print_etir_stc_ir (file, buf, 1);
6403 	  break;
6404 	case ETIR__C_STC_BOH_GBL:
6405 	  fprintf (file, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6406 	  evax_bfd_print_etir_stc_ir (file, buf, 0);
6407 	  break;
6408 	case ETIR__C_STC_BOH_PS:
6409 	  fprintf (file, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6410 	  evax_bfd_print_etir_stc_ir (file, buf, 1);
6411 	  break;
6412 	case ETIR__C_STC_NBH_GBL:
6413 	  fprintf (file,
6414 		   _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6415 	  break;
6416 	case ETIR__C_STC_NBH_PS:
6417 	  fprintf (file,
6418 		   _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6419 	  break;
6420 
6421 	case ETIR__C_CTL_SETRB:
6422 	  fprintf (file, _("CTL_SETRB (set relocation base)\n"));
6423 	  sec_len += 4;
6424 	  break;
6425 	case ETIR__C_CTL_AUGRB:
6426 	  {
6427 	    unsigned int val = bfd_getl32 (buf);
6428 	    fprintf (file, _("CTL_AUGRB (augment relocation base) %u\n"), val);
6429 	  }
6430 	  break;
6431 	case ETIR__C_CTL_DFLOC:
6432 	  fprintf (file, _("CTL_DFLOC (define location)\n"));
6433 	  break;
6434 	case ETIR__C_CTL_STLOC:
6435 	  fprintf (file, _("CTL_STLOC (set location)\n"));
6436 	  break;
6437 	case ETIR__C_CTL_STKDL:
6438 	  fprintf (file, _("CTL_STKDL (stack defined location)\n"));
6439 	  break;
6440 	default:
6441 	  fprintf (file, _("*unhandled*\n"));
6442 	  break;
6443 	}
6444       off += size;
6445     }
6446 }
6447 
6448 static void
6449 evax_bfd_print_eobj (struct bfd *abfd, FILE *file)
6450 {
6451   bfd_boolean is_first = TRUE;
6452   bfd_boolean has_records = FALSE;
6453 
6454   while (1)
6455     {
6456       unsigned int rec_len;
6457       unsigned int pad_len;
6458       unsigned char *rec;
6459       unsigned int hdr_size;
6460       unsigned int type;
6461 
6462       if (is_first)
6463 	{
6464 	  unsigned char buf[6];
6465 
6466 	  is_first = FALSE;
6467 
6468 	  /* Read 6 bytes.  */
6469 	  if (bfd_bread (buf, sizeof (buf), abfd) != sizeof (buf))
6470 	    {
6471 	      fprintf (file, _("cannot read GST record length\n"));
6472 	      return;
6473 	    }
6474 	  rec_len = bfd_getl16 (buf + 0);
6475 	  if (rec_len == bfd_getl16 (buf + 4)
6476 	      && bfd_getl16 (buf + 2) == EOBJ__C_EMH)
6477 	    {
6478 	      /* The format is raw: record-size, type, record-size.  */
6479 	      has_records = TRUE;
6480 	      pad_len = (rec_len + 1) & ~1U;
6481 	      hdr_size = 4;
6482 	    }
6483 	  else if (rec_len == EOBJ__C_EMH)
6484 	    {
6485 	      has_records = FALSE;
6486 	      pad_len = bfd_getl16 (buf + 2);
6487 	      hdr_size = 6;
6488 	    }
6489 	  else
6490 	    {
6491 	      /* Ill-formed.  */
6492 	      fprintf (file, _("cannot find EMH in first GST record\n"));
6493 	      return;
6494 	    }
6495 	  rec = bfd_malloc (pad_len);
6496 	  memcpy (rec, buf + sizeof (buf) - hdr_size, hdr_size);
6497 	}
6498       else
6499 	{
6500 	  unsigned int rec_len2 = 0;
6501 	  unsigned char hdr[4];
6502 
6503 	  if (has_records)
6504 	    {
6505 	      unsigned char buf_len[2];
6506 
6507 	      if (bfd_bread (buf_len, sizeof (buf_len), abfd)
6508 		  != sizeof (buf_len))
6509 		{
6510 		  fprintf (file, _("cannot read GST record length\n"));
6511 		  return;
6512 		}
6513 	      rec_len2 = (unsigned)bfd_getl16 (buf_len);
6514 	    }
6515 
6516 	  if (bfd_bread (hdr, sizeof (hdr), abfd) != sizeof (hdr))
6517 	    {
6518 	      fprintf (file, _("cannot read GST record header\n"));
6519 	      return;
6520 	    }
6521 	  rec_len = (unsigned)bfd_getl16 (hdr + 2);
6522 	  if (has_records)
6523 	    pad_len = (rec_len + 1) & ~1U;
6524 	  else
6525 	    pad_len = rec_len;
6526 	  rec = bfd_malloc (pad_len);
6527 	  memcpy (rec, hdr, sizeof (hdr));
6528 	  hdr_size = sizeof (hdr);
6529 	  if (has_records && rec_len2 != rec_len)
6530 	    {
6531 	      fprintf (file, _(" corrupted GST\n"));
6532 	      break;
6533 	    }
6534 	}
6535 
6536       if (bfd_bread (rec + hdr_size, pad_len - hdr_size, abfd)
6537 	  != pad_len - hdr_size)
6538 	{
6539 	  fprintf (file, _("cannot read GST record\n"));
6540 	  return;
6541 	}
6542 
6543       type = (unsigned)bfd_getl16 (rec);
6544 
6545       switch (type)
6546 	{
6547 	case EOBJ__C_EMH:
6548 	  evax_bfd_print_emh (file, rec, rec_len);
6549 	  break;
6550 	case EOBJ__C_EGSD:
6551 	  evax_bfd_print_egsd (file, rec, rec_len);
6552 	  break;
6553 	case EOBJ__C_EEOM:
6554 	  evax_bfd_print_eeom (file, rec, rec_len);
6555 	  free (rec);
6556 	  return;
6557 	  break;
6558 	case EOBJ__C_ETIR:
6559 	  evax_bfd_print_etir (file, "ETIR", rec, rec_len);
6560 	  break;
6561 	case EOBJ__C_EDBG:
6562 	  evax_bfd_print_etir (file, "EDBG", rec, rec_len);
6563 	  break;
6564 	case EOBJ__C_ETBT:
6565 	  evax_bfd_print_etir (file, "ETBT", rec, rec_len);
6566 	  break;
6567 	default:
6568 	  fprintf (file, _(" unhandled EOBJ record type %u\n"), type);
6569 	  break;
6570 	}
6571       free (rec);
6572     }
6573 }
6574 
6575 static void
6576 evax_bfd_print_relocation_records (FILE *file, const unsigned char *rel,
6577 				   unsigned int stride)
6578 {
6579   while (1)
6580     {
6581       unsigned int base;
6582       unsigned int count;
6583       unsigned int j;
6584 
6585       count = bfd_getl32 (rel + 0);
6586 
6587       if (count == 0)
6588 	break;
6589       base = bfd_getl32 (rel + 4);
6590 
6591       /* xgettext:c-format */
6592       fprintf (file, _("  bitcount: %u, base addr: 0x%08x\n"),
6593 	       count, base);
6594 
6595       rel += 8;
6596       for (j = 0; count > 0; j += 4, count -= 32)
6597 	{
6598 	  unsigned int k;
6599 	  unsigned int n = 0;
6600 	  unsigned int val;
6601 
6602 	  val = bfd_getl32 (rel);
6603 	  rel += 4;
6604 
6605 	  /* xgettext:c-format */
6606 	  fprintf (file, _("   bitmap: 0x%08x (count: %u):\n"), val, count);
6607 
6608 	  for (k = 0; k < 32; k++)
6609 	    if (val & (1 << k))
6610 	      {
6611 		if (n == 0)
6612 		  fputs ("   ", file);
6613 		fprintf (file, _(" %08x"), base + (j * 8 + k) * stride);
6614 		n++;
6615 		if (n == 8)
6616 		  {
6617 		    fputs ("\n", file);
6618 		    n = 0;
6619 		  }
6620 	      }
6621 	  if (n)
6622 	    fputs ("\n", file);
6623 	}
6624     }
6625 }
6626 
6627 static void
6628 evax_bfd_print_address_fixups (FILE *file, const unsigned char *rel)
6629 {
6630   while (1)
6631     {
6632       unsigned int j;
6633       unsigned int count;
6634 
6635       count = bfd_getl32 (rel + 0);
6636       if (count == 0)
6637 	return;
6638       /* xgettext:c-format */
6639       fprintf (file, _("  image %u (%u entries)\n"),
6640 	       (unsigned)bfd_getl32 (rel + 4), count);
6641       rel += 8;
6642       for (j = 0; j < count; j++)
6643 	{
6644 	  /* xgettext:c-format */
6645 	  fprintf (file, _("   offset: 0x%08x, val: 0x%08x\n"),
6646 		   (unsigned)bfd_getl32 (rel + 0),
6647 		   (unsigned)bfd_getl32 (rel + 4));
6648 	  rel += 8;
6649 	}
6650     }
6651 }
6652 
6653 static void
6654 evax_bfd_print_reference_fixups (FILE *file, const unsigned char *rel)
6655 {
6656   unsigned int count;
6657 
6658   while (1)
6659     {
6660       unsigned int j;
6661       unsigned int n = 0;
6662 
6663       count = bfd_getl32 (rel + 0);
6664       if (count == 0)
6665 	break;
6666       /* xgettext:c-format */
6667       fprintf (file, _("  image %u (%u entries), offsets:\n"),
6668 	       (unsigned)bfd_getl32 (rel + 4), count);
6669       rel += 8;
6670       for (j = 0; j < count; j++)
6671 	{
6672 	  if (n == 0)
6673 	    fputs ("   ", file);
6674 	  fprintf (file, _(" 0x%08x"), (unsigned)bfd_getl32 (rel));
6675 	  n++;
6676 	  if (n == 7)
6677 	    {
6678 	      fputs ("\n", file);
6679 	      n = 0;
6680 	    }
6681 	  rel += 4;
6682 	}
6683       if (n)
6684 	fputs ("\n", file);
6685     }
6686 }
6687 
6688 static void
6689 evax_bfd_print_indent (int indent, FILE *file)
6690 {
6691   for (; indent; indent--)
6692     fputc (' ', file);
6693 }
6694 
6695 static const char *
6696 evax_bfd_get_dsc_name (unsigned int v)
6697 {
6698   switch (v)
6699     {
6700     case DSC__K_DTYPE_Z:
6701       return "Z (Unspecified)";
6702     case DSC__K_DTYPE_V:
6703       return "V (Bit)";
6704     case DSC__K_DTYPE_BU:
6705       return "BU (Byte logical)";
6706     case DSC__K_DTYPE_WU:
6707       return "WU (Word logical)";
6708     case DSC__K_DTYPE_LU:
6709       return "LU (Longword logical)";
6710     case DSC__K_DTYPE_QU:
6711       return "QU (Quadword logical)";
6712     case DSC__K_DTYPE_B:
6713       return "B (Byte integer)";
6714     case DSC__K_DTYPE_W:
6715       return "W (Word integer)";
6716     case DSC__K_DTYPE_L:
6717       return "L (Longword integer)";
6718     case DSC__K_DTYPE_Q:
6719       return "Q (Quadword integer)";
6720     case DSC__K_DTYPE_F:
6721       return "F (Single-precision floating)";
6722     case DSC__K_DTYPE_D:
6723       return "D (Double-precision floating)";
6724     case DSC__K_DTYPE_FC:
6725       return "FC (Complex)";
6726     case DSC__K_DTYPE_DC:
6727       return "DC (Double-precision Complex)";
6728     case DSC__K_DTYPE_T:
6729       return "T (ASCII text string)";
6730     case DSC__K_DTYPE_NU:
6731       return "NU (Numeric string, unsigned)";
6732     case DSC__K_DTYPE_NL:
6733       return "NL (Numeric string, left separate sign)";
6734     case DSC__K_DTYPE_NLO:
6735       return "NLO (Numeric string, left overpunched sign)";
6736     case DSC__K_DTYPE_NR:
6737       return "NR (Numeric string, right separate sign)";
6738     case DSC__K_DTYPE_NRO:
6739       return "NRO (Numeric string, right overpunched sig)";
6740     case DSC__K_DTYPE_NZ:
6741       return "NZ (Numeric string, zoned sign)";
6742     case DSC__K_DTYPE_P:
6743       return "P (Packed decimal string)";
6744     case DSC__K_DTYPE_ZI:
6745       return "ZI (Sequence of instructions)";
6746     case DSC__K_DTYPE_ZEM:
6747       return "ZEM (Procedure entry mask)";
6748     case DSC__K_DTYPE_DSC:
6749       return "DSC (Descriptor, used for arrays of dyn strings)";
6750     case DSC__K_DTYPE_OU:
6751       return "OU (Octaword logical)";
6752     case DSC__K_DTYPE_O:
6753       return "O (Octaword integer)";
6754     case DSC__K_DTYPE_G:
6755       return "G (Double precision G floating, 64 bit)";
6756     case DSC__K_DTYPE_H:
6757       return "H (Quadruple precision floating, 128 bit)";
6758     case DSC__K_DTYPE_GC:
6759       return "GC (Double precision complex, G floating)";
6760     case DSC__K_DTYPE_HC:
6761       return "HC (Quadruple precision complex, H floating)";
6762     case DSC__K_DTYPE_CIT:
6763       return "CIT (COBOL intermediate temporary)";
6764     case DSC__K_DTYPE_BPV:
6765       return "BPV (Bound Procedure Value)";
6766     case DSC__K_DTYPE_BLV:
6767       return "BLV (Bound Label Value)";
6768     case DSC__K_DTYPE_VU:
6769       return "VU (Bit Unaligned)";
6770     case DSC__K_DTYPE_ADT:
6771       return "ADT (Absolute Date-Time)";
6772     case DSC__K_DTYPE_VT:
6773       return "VT (Varying Text)";
6774     case DSC__K_DTYPE_T2:
6775       return "T2 (16-bit char)";
6776     case DSC__K_DTYPE_VT2:
6777       return "VT2 (16-bit varying char)";
6778     default:
6779       return "?? (unknown)";
6780     }
6781 }
6782 
6783 static void
6784 evax_bfd_print_desc (const unsigned char *buf, int indent, FILE *file)
6785 {
6786   unsigned char bclass = buf[3];
6787   unsigned char dtype = buf[2];
6788   unsigned int len = (unsigned)bfd_getl16 (buf);
6789   unsigned int pointer = (unsigned)bfd_getl32 (buf + 4);
6790 
6791   evax_bfd_print_indent (indent, file);
6792 
6793   if (len == 1 && pointer == 0xffffffffUL)
6794     {
6795       /* 64 bits.  */
6796       fprintf (file, _("64 bits *unhandled*\n"));
6797     }
6798   else
6799     {
6800       /* xgettext:c-format */
6801       fprintf (file, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
6802 	       bclass, dtype, len, pointer);
6803       switch (bclass)
6804 	{
6805 	case DSC__K_CLASS_NCA:
6806 	  {
6807 	    const struct vms_dsc_nca *dsc = (const void *)buf;
6808 	    unsigned int i;
6809 	    const unsigned char *b;
6810 
6811 	    evax_bfd_print_indent (indent, file);
6812 	    fprintf (file, _("non-contiguous array of %s\n"),
6813 		     evax_bfd_get_dsc_name (dsc->dtype));
6814 	    evax_bfd_print_indent (indent + 1, file);
6815 	    fprintf (file,
6816 		     /* xgettext:c-format */
6817 		     _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
6818 		     dsc->dimct, dsc->aflags, dsc->digits, dsc->scale);
6819 	    evax_bfd_print_indent (indent + 1, file);
6820 	    fprintf (file,
6821 		     /* xgettext:c-format */
6822 		     _("arsize: %u, a0: 0x%08x\n"),
6823 		     (unsigned)bfd_getl32 (dsc->arsize),
6824 		     (unsigned)bfd_getl32 (dsc->a0));
6825 	    evax_bfd_print_indent (indent + 1, file);
6826 	    fprintf (file, _("Strides:\n"));
6827 	    b = buf + sizeof (*dsc);
6828 	    for (i = 0; i < dsc->dimct; i++)
6829 	      {
6830 		evax_bfd_print_indent (indent + 2, file);
6831 		fprintf (file, "[%u]: %u\n", i + 1,
6832 			 (unsigned)bfd_getl32 (b));
6833 		b += 4;
6834 	      }
6835 	    evax_bfd_print_indent (indent + 1, file);
6836 	    fprintf (file, _("Bounds:\n"));
6837 	    b = buf + sizeof (*dsc);
6838 	    for (i = 0; i < dsc->dimct; i++)
6839 	      {
6840 		evax_bfd_print_indent (indent + 2, file);
6841 		/* xgettext:c-format */
6842 		fprintf (file, _("[%u]: Lower: %u, upper: %u\n"), i + 1,
6843 			 (unsigned)bfd_getl32 (b + 0),
6844 			 (unsigned)bfd_getl32 (b + 4));
6845 		b += 8;
6846 	      }
6847 	  }
6848 	  break;
6849 	case DSC__K_CLASS_UBS:
6850 	  {
6851 	    const struct vms_dsc_ubs *ubs = (const void *)buf;
6852 
6853 	    evax_bfd_print_indent (indent, file);
6854 	    fprintf (file, _("unaligned bit-string of %s\n"),
6855 		     evax_bfd_get_dsc_name (ubs->dtype));
6856 	    evax_bfd_print_indent (indent + 1, file);
6857 	    fprintf (file,
6858 		     /* xgettext:c-format */
6859 		     _("base: %u, pos: %u\n"),
6860 		     (unsigned)bfd_getl32 (ubs->base),
6861 		     (unsigned)bfd_getl32 (ubs->pos));
6862 	  }
6863 	  break;
6864 	default:
6865 	  fprintf (file, _("*unhandled*\n"));
6866 	  break;
6867 	}
6868     }
6869 }
6870 
6871 static unsigned int
6872 evax_bfd_print_valspec (const unsigned char *buf, int indent, FILE *file)
6873 {
6874   unsigned int vflags = buf[0];
6875   unsigned int value = (unsigned)bfd_getl32 (buf + 1);
6876   unsigned int len = 5;
6877 
6878   evax_bfd_print_indent (indent, file);
6879   /* xgettext:c-format */
6880   fprintf (file, _("vflags: 0x%02x, value: 0x%08x "), vflags, value);
6881   buf += 5;
6882 
6883   switch (vflags)
6884     {
6885     case DST__K_VFLAGS_NOVAL:
6886       fprintf (file, _("(no value)\n"));
6887       break;
6888     case DST__K_VFLAGS_NOTACTIVE:
6889       fprintf (file, _("(not active)\n"));
6890       break;
6891     case DST__K_VFLAGS_UNALLOC:
6892       fprintf (file, _("(not allocated)\n"));
6893       break;
6894     case DST__K_VFLAGS_DSC:
6895       fprintf (file, _("(descriptor)\n"));
6896       evax_bfd_print_desc (buf + value, indent + 1, file);
6897       break;
6898     case DST__K_VFLAGS_TVS:
6899       fprintf (file, _("(trailing value)\n"));
6900       break;
6901     case DST__K_VS_FOLLOWS:
6902       fprintf (file, _("(value spec follows)\n"));
6903       break;
6904     case DST__K_VFLAGS_BITOFFS:
6905       fprintf (file, _("(at bit offset %u)\n"), value);
6906       break;
6907     default:
6908       /* xgettext:c-format */
6909       fprintf (file, _("(reg: %u, disp: %u, indir: %u, kind: "),
6910 	       (vflags & DST__K_REGNUM_MASK) >> DST__K_REGNUM_SHIFT,
6911 	       vflags & DST__K_DISP ? 1 : 0,
6912 	       vflags & DST__K_INDIR ? 1 : 0);
6913       switch (vflags & DST__K_VALKIND_MASK)
6914 	{
6915 	case DST__K_VALKIND_LITERAL:
6916 	  fputs (_("literal"), file);
6917 	  break;
6918 	case DST__K_VALKIND_ADDR:
6919 	  fputs (_("address"), file);
6920 	  break;
6921 	case DST__K_VALKIND_DESC:
6922 	  fputs (_("desc"), file);
6923 	  break;
6924 	case DST__K_VALKIND_REG:
6925 	  fputs (_("reg"), file);
6926 	  break;
6927 	}
6928       fputs (")\n", file);
6929       break;
6930     }
6931   return len;
6932 }
6933 
6934 static void
6935 evax_bfd_print_typspec (const unsigned char *buf, int indent, FILE *file)
6936 {
6937   unsigned char kind = buf[2];
6938   unsigned int len = (unsigned)bfd_getl16 (buf);
6939 
6940   evax_bfd_print_indent (indent, file);
6941   /* xgettext:c-format */
6942   fprintf (file, _("len: %2u, kind: %2u "), len, kind);
6943   buf += 3;
6944   switch (kind)
6945     {
6946     case DST__K_TS_ATOM:
6947     /* xgettext:c-format */
6948       fprintf (file, _("atomic, type=0x%02x %s\n"),
6949 	       buf[0], evax_bfd_get_dsc_name (buf[0]));
6950       break;
6951     case DST__K_TS_IND:
6952       fprintf (file, _("indirect, defined at 0x%08x\n"),
6953 	       (unsigned)bfd_getl32 (buf));
6954       break;
6955     case DST__K_TS_TPTR:
6956       fprintf (file, _("typed pointer\n"));
6957       evax_bfd_print_typspec (buf, indent + 1, file);
6958       break;
6959     case DST__K_TS_PTR:
6960       fprintf (file, _("pointer\n"));
6961       break;
6962     case DST__K_TS_ARRAY:
6963       {
6964 	const unsigned char *vs;
6965 	unsigned int vec_len;
6966 	unsigned int i;
6967 
6968 	fprintf (file, _("array, dim: %u, bitmap: "), buf[0]);
6969 	vec_len = (buf[0] + 1 + 7) / 8;
6970 	for (i = 0; i < vec_len; i++)
6971 	  fprintf (file, " %02x", buf[i + 1]);
6972 	fputc ('\n', file);
6973 	vs = buf + 1 + vec_len;
6974 	evax_bfd_print_indent (indent, file);
6975 	fprintf (file, _("array descriptor:\n"));
6976 	vs += evax_bfd_print_valspec (vs, indent + 1, file);
6977 	for (i = 0; i < buf[0] + 1U; i++)
6978 	  if (buf[1 + i / 8] & (1 << (i % 8)))
6979 	    {
6980 	      evax_bfd_print_indent (indent, file);
6981 	      if (i == 0)
6982 		fprintf (file, _("type spec for element:\n"));
6983 	      else
6984 		fprintf (file, _("type spec for subscript %u:\n"), i);
6985 	      evax_bfd_print_typspec (vs, indent + 1, file);
6986 	      vs += bfd_getl16 (vs);
6987 	    }
6988       }
6989       break;
6990     default:
6991       fprintf (file, _("*unhandled*\n"));
6992     }
6993 }
6994 
6995 static void
6996 evax_bfd_print_dst (struct bfd *abfd, unsigned int dst_size, FILE *file)
6997 {
6998   unsigned int off = 0;
6999   unsigned int pc = 0;
7000   unsigned int line = 0;
7001 
7002   fprintf (file, _("Debug symbol table:\n"));
7003 
7004   while (dst_size > 0)
7005     {
7006       struct vms_dst_header dsth;
7007       unsigned int len;
7008       unsigned int type;
7009       unsigned char *buf;
7010 
7011       if (bfd_bread (&dsth, sizeof (dsth), abfd) != sizeof (dsth))
7012 	{
7013 	  fprintf (file, _("cannot read DST header\n"));
7014 	  return;
7015 	}
7016       len = bfd_getl16 (dsth.length);
7017       type = bfd_getl16 (dsth.type);
7018       /* xgettext:c-format */
7019       fprintf (file, _(" type: %3u, len: %3u (at 0x%08x): "),
7020 	       type, len, off);
7021       if (len == 0)
7022 	{
7023 	  fputc ('\n', file);
7024 	  break;
7025 	}
7026       len++;
7027       dst_size -= len;
7028       off += len;
7029       len -= sizeof (dsth);
7030       buf = bfd_malloc (len);
7031       if (bfd_bread (buf, len, abfd) != len)
7032 	{
7033 	  fprintf (file, _("cannot read DST symbol\n"));
7034 	  return;
7035 	}
7036       switch (type)
7037 	{
7038 	case DSC__K_DTYPE_V:
7039 	case DSC__K_DTYPE_BU:
7040 	case DSC__K_DTYPE_WU:
7041 	case DSC__K_DTYPE_LU:
7042 	case DSC__K_DTYPE_QU:
7043 	case DSC__K_DTYPE_B:
7044 	case DSC__K_DTYPE_W:
7045 	case DSC__K_DTYPE_L:
7046 	case DSC__K_DTYPE_Q:
7047 	case DSC__K_DTYPE_F:
7048 	case DSC__K_DTYPE_D:
7049 	case DSC__K_DTYPE_FC:
7050 	case DSC__K_DTYPE_DC:
7051 	case DSC__K_DTYPE_T:
7052 	case DSC__K_DTYPE_NU:
7053 	case DSC__K_DTYPE_NL:
7054 	case DSC__K_DTYPE_NLO:
7055 	case DSC__K_DTYPE_NR:
7056 	case DSC__K_DTYPE_NRO:
7057 	case DSC__K_DTYPE_NZ:
7058 	case DSC__K_DTYPE_P:
7059 	case DSC__K_DTYPE_ZI:
7060 	case DSC__K_DTYPE_ZEM:
7061 	case DSC__K_DTYPE_DSC:
7062 	case DSC__K_DTYPE_OU:
7063 	case DSC__K_DTYPE_O:
7064 	case DSC__K_DTYPE_G:
7065 	case DSC__K_DTYPE_H:
7066 	case DSC__K_DTYPE_GC:
7067 	case DSC__K_DTYPE_HC:
7068 	case DSC__K_DTYPE_CIT:
7069 	case DSC__K_DTYPE_BPV:
7070 	case DSC__K_DTYPE_BLV:
7071 	case DSC__K_DTYPE_VU:
7072 	case DSC__K_DTYPE_ADT:
7073 	case DSC__K_DTYPE_VT:
7074 	case DSC__K_DTYPE_T2:
7075 	case DSC__K_DTYPE_VT2:
7076 	  fprintf (file, _("standard data: %s\n"),
7077 		   evax_bfd_get_dsc_name (type));
7078 	  evax_bfd_print_valspec (buf, 4, file);
7079 	  fprintf (file, _("    name: %.*s\n"), buf[5], buf + 6);
7080 	  break;
7081 	case DST__K_MODBEG:
7082 	  {
7083 	    struct vms_dst_modbeg *dst = (void *)buf;
7084 	    const char *name = (const char *)buf + sizeof (*dst);
7085 
7086 	    fprintf (file, _("modbeg\n"));
7087 	    /* xgettext:c-format */
7088 	    fprintf (file, _("   flags: %d, language: %u, "
7089 			     "major: %u, minor: %u\n"),
7090 		     dst->flags,
7091 		     (unsigned)bfd_getl32 (dst->language),
7092 		     (unsigned)bfd_getl16 (dst->major),
7093 		     (unsigned)bfd_getl16 (dst->minor));
7094 	    fprintf (file, _("   module name: %.*s\n"),
7095 		     name[0], name + 1);
7096 	    name += name[0] + 1;
7097 	    fprintf (file, _("   compiler   : %.*s\n"),
7098 		     name[0], name + 1);
7099 	  }
7100 	  break;
7101 	case DST__K_MODEND:
7102 	  fprintf (file, _("modend\n"));
7103 	  break;
7104 	case DST__K_RTNBEG:
7105 	  {
7106 	    struct vms_dst_rtnbeg *dst = (void *)buf;
7107 	    const char *name = (const char *)buf + sizeof (*dst);
7108 
7109 	    fputs (_("rtnbeg\n"), file);
7110 	    /* xgettext:c-format */
7111 	    fprintf (file, _("    flags: %u, address: 0x%08x, "
7112 			     "pd-address: 0x%08x\n"),
7113 		     dst->flags,
7114 		     (unsigned)bfd_getl32 (dst->address),
7115 		     (unsigned)bfd_getl32 (dst->pd_address));
7116 	    fprintf (file, _("    routine name: %.*s\n"),
7117 		     name[0], name + 1);
7118 	  }
7119 	  break;
7120 	case DST__K_RTNEND:
7121 	  {
7122 	    struct vms_dst_rtnend *dst = (void *)buf;
7123 
7124 	    fprintf (file, _("rtnend: size 0x%08x\n"),
7125 		     (unsigned)bfd_getl32 (dst->size));
7126 	  }
7127 	  break;
7128 	case DST__K_PROLOG:
7129 	  {
7130 	    struct vms_dst_prolog *dst = (void *)buf;
7131 
7132 	    fprintf (file, _("prolog: bkpt address 0x%08x\n"),
7133 		     (unsigned)bfd_getl32 (dst->bkpt_addr));
7134 	  }
7135 	  break;
7136 	case DST__K_EPILOG:
7137 	  {
7138 	    struct vms_dst_epilog *dst = (void *)buf;
7139 
7140 	    /* xgettext:c-format */
7141 	    fprintf (file, _("epilog: flags: %u, count: %u\n"),
7142 		     dst->flags, (unsigned)bfd_getl32 (dst->count));
7143 	  }
7144 	  break;
7145 	case DST__K_BLKBEG:
7146 	  {
7147 	    struct vms_dst_blkbeg *dst = (void *)buf;
7148 	    const char *name = (const char *)buf + sizeof (*dst);
7149 
7150 	    /* xgettext:c-format */
7151 	    fprintf (file, _("blkbeg: address: 0x%08x, name: %.*s\n"),
7152 		     (unsigned)bfd_getl32 (dst->address),
7153 		     name[0], name + 1);
7154 	  }
7155 	  break;
7156 	case DST__K_BLKEND:
7157 	  {
7158 	    struct vms_dst_blkend *dst = (void *)buf;
7159 
7160 	    fprintf (file, _("blkend: size: 0x%08x\n"),
7161 		     (unsigned)bfd_getl32 (dst->size));
7162 	  }
7163 	  break;
7164 	case DST__K_TYPSPEC:
7165 	  {
7166 	    fprintf (file, _("typspec (len: %u)\n"), len);
7167 	    fprintf (file, _("    name: %.*s\n"), buf[0], buf + 1);
7168 	    evax_bfd_print_typspec (buf + 1 + buf[0], 5, file);
7169 	  }
7170 	  break;
7171 	case DST__K_SEPTYP:
7172 	  {
7173 	    fprintf (file, _("septyp, name: %.*s\n"), buf[5], buf + 6);
7174 	    evax_bfd_print_valspec (buf, 4, file);
7175 	  }
7176 	  break;
7177 	case DST__K_RECBEG:
7178 	  {
7179 	    struct vms_dst_recbeg *recbeg = (void *)buf;
7180 	    const char *name = (const char *)buf + sizeof (*recbeg);
7181 
7182 	    fprintf (file, _("recbeg: name: %.*s\n"), name[0], name + 1);
7183 	    evax_bfd_print_valspec (buf, 4, file);
7184 	    fprintf (file, _("    len: %u bits\n"),
7185 		     (unsigned)bfd_getl32 (name + 1 + name[0]));
7186 	  }
7187 	  break;
7188 	case DST__K_RECEND:
7189 	  fprintf (file, _("recend\n"));
7190 	  break;
7191 	case DST__K_ENUMBEG:
7192 	  /* xgettext:c-format */
7193 	  fprintf (file, _("enumbeg, len: %u, name: %.*s\n"),
7194 		   buf[0], buf[1], buf + 2);
7195 	  break;
7196 	case DST__K_ENUMELT:
7197 	  fprintf (file, _("enumelt, name: %.*s\n"), buf[5], buf + 6);
7198 	  evax_bfd_print_valspec (buf, 4, file);
7199 	  break;
7200 	case DST__K_ENUMEND:
7201 	  fprintf (file, _("enumend\n"));
7202 	  break;
7203 	case DST__K_LABEL:
7204 	  {
7205 	    struct vms_dst_label *lab = (void *)buf;
7206 	    fprintf (file, _("label, name: %.*s\n"),
7207 		     lab->name[0], lab->name + 1);
7208 	    fprintf (file, _("    address: 0x%08x\n"),
7209 		     (unsigned)bfd_getl32 (lab->value));
7210 	  }
7211 	  break;
7212 	case DST__K_DIS_RANGE:
7213 	  {
7214 	    unsigned int cnt = bfd_getl32 (buf);
7215 	    unsigned char *rng = buf + 4;
7216 	    unsigned int i;
7217 
7218 	    fprintf (file, _("discontiguous range (nbr: %u)\n"), cnt);
7219 	    for (i = 0; i < cnt; i++, rng += 8)
7220 	      /* xgettext:c-format */
7221 	      fprintf (file, _("    address: 0x%08x, size: %u\n"),
7222 		       (unsigned)bfd_getl32 (rng),
7223 		       (unsigned)bfd_getl32 (rng + 4));
7224 
7225 	  }
7226 	  break;
7227 	case DST__K_LINE_NUM:
7228 	  {
7229 	    unsigned char *buf_orig = buf;
7230 
7231 	    fprintf (file, _("line num  (len: %u)\n"), len);
7232 
7233 	    while (len > 0)
7234 	      {
7235 		signed char cmd;
7236 		unsigned char cmdlen;
7237 		unsigned int val;
7238 
7239 		cmd = buf[0];
7240 		cmdlen = 0;
7241 
7242 		fputs ("    ", file);
7243 
7244 		switch (cmd)
7245 		  {
7246 		  case DST__K_DELTA_PC_W:
7247 		    val = bfd_getl16 (buf + 1);
7248 		    fprintf (file, _("delta_pc_w %u\n"), val);
7249 		    pc += val;
7250 		    line++;
7251 		    cmdlen = 3;
7252 		    break;
7253 		  case DST__K_INCR_LINUM:
7254 		    val = buf[1];
7255 		    fprintf (file, _("incr_linum(b): +%u\n"), val);
7256 		    line += val;
7257 		    cmdlen = 2;
7258 		    break;
7259 		  case DST__K_INCR_LINUM_W:
7260 		    val = bfd_getl16 (buf + 1);
7261 		    fprintf (file, _("incr_linum_w: +%u\n"), val);
7262 		    line += val;
7263 		    cmdlen = 3;
7264 		    break;
7265 		  case DST__K_INCR_LINUM_L:
7266 		    val = bfd_getl32 (buf + 1);
7267 		    fprintf (file, _("incr_linum_l: +%u\n"), val);
7268 		    line += val;
7269 		    cmdlen = 5;
7270 		    break;
7271 		  case DST__K_SET_LINUM:
7272 		    line = bfd_getl16 (buf + 1);
7273 		    fprintf (file, _("set_line_num(w) %u\n"), line);
7274 		    cmdlen = 3;
7275 		    break;
7276 		  case DST__K_SET_LINUM_B:
7277 		    line = buf[1];
7278 		    fprintf (file, _("set_line_num_b %u\n"), line);
7279 		    cmdlen = 2;
7280 		    break;
7281 		  case DST__K_SET_LINUM_L:
7282 		    line = bfd_getl32 (buf + 1);
7283 		    fprintf (file, _("set_line_num_l %u\n"), line);
7284 		    cmdlen = 5;
7285 		    break;
7286 		  case DST__K_SET_ABS_PC:
7287 		    pc = bfd_getl32 (buf + 1);
7288 		    fprintf (file, _("set_abs_pc: 0x%08x\n"), pc);
7289 		    cmdlen = 5;
7290 		    break;
7291 		  case DST__K_DELTA_PC_L:
7292 		    fprintf (file, _("delta_pc_l: +0x%08x\n"),
7293 			     (unsigned)bfd_getl32 (buf + 1));
7294 		    cmdlen = 5;
7295 		    break;
7296 		  case DST__K_TERM:
7297 		    fprintf (file, _("term(b): 0x%02x"), buf[1]);
7298 		    pc += buf[1];
7299 		    fprintf (file, _("        pc: 0x%08x\n"), pc);
7300 		    cmdlen = 2;
7301 		    break;
7302 		  case DST__K_TERM_W:
7303 		    val = bfd_getl16 (buf + 1);
7304 		    fprintf (file, _("term_w: 0x%04x"), val);
7305 		    pc += val;
7306 		    fprintf (file, _("    pc: 0x%08x\n"), pc);
7307 		    cmdlen = 3;
7308 		    break;
7309 		  default:
7310 		    if (cmd <= 0)
7311 		      {
7312 			fprintf (file, _("delta pc +%-4d"), -cmd);
7313 			line++;  /* FIXME: curr increment.  */
7314 			pc += -cmd;
7315 			/* xgettext:c-format */
7316 			fprintf (file, _("    pc: 0x%08x line: %5u\n"),
7317 				 pc, line);
7318 			cmdlen = 1;
7319 		      }
7320 		    else
7321 		      fprintf (file, _("    *unhandled* cmd %u\n"), cmd);
7322 		    break;
7323 		  }
7324 		if (cmdlen == 0)
7325 		  break;
7326 		len -= cmdlen;
7327 		buf += cmdlen;
7328 	      }
7329 	    buf = buf_orig;
7330 	  }
7331 	  break;
7332 	case DST__K_SOURCE:
7333 	  {
7334 	    unsigned char *buf_orig = buf;
7335 
7336 	    fprintf (file, _("source (len: %u)\n"), len);
7337 
7338 	    while (len > 0)
7339 	      {
7340 		signed char cmd = buf[0];
7341 		unsigned char cmdlen = 0;
7342 
7343 		switch (cmd)
7344 		  {
7345 		  case DST__K_SRC_DECLFILE:
7346 		    {
7347 		      struct vms_dst_src_decl_src *src = (void *)(buf + 1);
7348 		      const char *name;
7349 
7350 		      /* xgettext:c-format */
7351 		      fprintf (file, _("   declfile: len: %u, flags: %u, "
7352 				       "fileid: %u\n"),
7353 			       src->length, src->flags,
7354 			       (unsigned)bfd_getl16 (src->fileid));
7355 		      /* xgettext:c-format */
7356 		      fprintf (file, _("   rms: cdt: 0x%08x %08x, "
7357 				       "ebk: 0x%08x, ffb: 0x%04x, "
7358 				       "rfo: %u\n"),
7359 			       (unsigned)bfd_getl32 (src->rms_cdt + 4),
7360 			       (unsigned)bfd_getl32 (src->rms_cdt + 0),
7361 			       (unsigned)bfd_getl32 (src->rms_ebk),
7362 			       (unsigned)bfd_getl16 (src->rms_ffb),
7363 			       src->rms_rfo);
7364 		      name = (const char *)buf + 1 + sizeof (*src);
7365 		      fprintf (file, _("   filename   : %.*s\n"),
7366 			       name[0], name + 1);
7367 		      name += name[0] + 1;
7368 		      fprintf (file, _("   module name: %.*s\n"),
7369 			       name[0], name + 1);
7370 		      cmdlen = 2 + src->length;
7371 		    }
7372 		    break;
7373 		  case DST__K_SRC_SETFILE:
7374 		    fprintf (file, _("   setfile %u\n"),
7375 			     (unsigned)bfd_getl16 (buf + 1));
7376 		    cmdlen = 3;
7377 		    break;
7378 		  case DST__K_SRC_SETREC_W:
7379 		    fprintf (file, _("   setrec %u\n"),
7380 			     (unsigned)bfd_getl16 (buf + 1));
7381 		    cmdlen = 3;
7382 		    break;
7383 		  case DST__K_SRC_SETREC_L:
7384 		    fprintf (file, _("   setrec %u\n"),
7385 			     (unsigned)bfd_getl32 (buf + 1));
7386 		    cmdlen = 5;
7387 		    break;
7388 		  case DST__K_SRC_SETLNUM_W:
7389 		    fprintf (file, _("   setlnum %u\n"),
7390 			     (unsigned)bfd_getl16 (buf + 1));
7391 		    cmdlen = 3;
7392 		    break;
7393 		  case DST__K_SRC_SETLNUM_L:
7394 		    fprintf (file, _("   setlnum %u\n"),
7395 			     (unsigned)bfd_getl32 (buf + 1));
7396 		    cmdlen = 5;
7397 		    break;
7398 		  case DST__K_SRC_DEFLINES_W:
7399 		    fprintf (file, _("   deflines %u\n"),
7400 			     (unsigned)bfd_getl16 (buf + 1));
7401 		    cmdlen = 3;
7402 		    break;
7403 		  case DST__K_SRC_DEFLINES_B:
7404 		    fprintf (file, _("   deflines %u\n"), buf[1]);
7405 		    cmdlen = 2;
7406 		    break;
7407 		  case DST__K_SRC_FORMFEED:
7408 		    fprintf (file, _("   formfeed\n"));
7409 		    cmdlen = 1;
7410 		    break;
7411 		  default:
7412 		    fprintf (file, _("   *unhandled* cmd %u\n"), cmd);
7413 		    break;
7414 		  }
7415 		if (cmdlen == 0)
7416 		  break;
7417 		len -= cmdlen;
7418 		buf += cmdlen;
7419 	      }
7420 	    buf = buf_orig;
7421 	  }
7422 	  break;
7423 	default:
7424 	  fprintf (file, _("*unhandled* dst type %u\n"), type);
7425 	  break;
7426 	}
7427       free (buf);
7428     }
7429 }
7430 
7431 static void
7432 evax_bfd_print_image (bfd *abfd, FILE *file)
7433 {
7434   struct vms_eihd eihd;
7435   const char *name;
7436   unsigned int val;
7437   unsigned int eiha_off;
7438   unsigned int eihi_off;
7439   unsigned int eihs_off;
7440   unsigned int eisd_off;
7441   unsigned int eihef_off = 0;
7442   unsigned int eihnp_off = 0;
7443   unsigned int dmt_vbn = 0;
7444   unsigned int dmt_size = 0;
7445   unsigned int dst_vbn = 0;
7446   unsigned int dst_size = 0;
7447   unsigned int gst_vbn = 0;
7448   unsigned int gst_size = 0;
7449   unsigned int eiaf_vbn = 0;
7450   unsigned int eiaf_size = 0;
7451   unsigned int eihvn_off;
7452 
7453   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET)
7454       || bfd_bread (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
7455     {
7456       fprintf (file, _("cannot read EIHD\n"));
7457       return;
7458     }
7459   /* xgettext:c-format */
7460   fprintf (file, _("EIHD: (size: %u, nbr blocks: %u)\n"),
7461 	   (unsigned)bfd_getl32 (eihd.size),
7462 	   (unsigned)bfd_getl32 (eihd.hdrblkcnt));
7463   /* xgettext:c-format */
7464   fprintf (file, _(" majorid: %u, minorid: %u\n"),
7465 	   (unsigned)bfd_getl32 (eihd.majorid),
7466 	   (unsigned)bfd_getl32 (eihd.minorid));
7467 
7468   val = (unsigned)bfd_getl32 (eihd.imgtype);
7469   switch (val)
7470     {
7471     case EIHD__K_EXE:
7472       name = _("executable");
7473       break;
7474     case EIHD__K_LIM:
7475       name = _("linkable image");
7476       break;
7477     default:
7478       name = _("unknown");
7479       break;
7480     }
7481   /* xgettext:c-format */
7482   fprintf (file, _(" image type: %u (%s)"), val, name);
7483 
7484   val = (unsigned)bfd_getl32 (eihd.subtype);
7485   switch (val)
7486     {
7487     case EIHD__C_NATIVE:
7488       name = _("native");
7489       break;
7490     case EIHD__C_CLI:
7491       name = _("CLI");
7492       break;
7493     default:
7494       name = _("unknown");
7495       break;
7496     }
7497   /* xgettext:c-format */
7498   fprintf (file, _(", subtype: %u (%s)\n"), val, name);
7499 
7500   eisd_off = bfd_getl32 (eihd.isdoff);
7501   eiha_off = bfd_getl32 (eihd.activoff);
7502   eihi_off = bfd_getl32 (eihd.imgidoff);
7503   eihs_off = bfd_getl32 (eihd.symdbgoff);
7504   /* xgettext:c-format */
7505   fprintf (file, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
7506 		   "imgid: %u, patch: %u\n"),
7507 	   eisd_off, eiha_off, eihs_off, eihi_off,
7508 	   (unsigned)bfd_getl32 (eihd.patchoff));
7509   fprintf (file, _(" fixup info rva: "));
7510   bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.iafva));
7511   fprintf (file, _(", symbol vector rva: "));
7512   bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.symvva));
7513   eihvn_off = bfd_getl32 (eihd.version_array_off);
7514   fprintf (file, _("\n"
7515 		   " version array off: %u\n"),
7516 	   eihvn_off);
7517   fprintf (file,
7518 	   /* xgettext:c-format */
7519 	   _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
7520 	   (unsigned)bfd_getl32 (eihd.imgiocnt),
7521 	   (unsigned)bfd_getl32 (eihd.iochancnt),
7522 	   (unsigned)bfd_getl32 (eihd.privreqs + 4),
7523 	   (unsigned)bfd_getl32 (eihd.privreqs + 0));
7524   val = (unsigned)bfd_getl32 (eihd.lnkflags);
7525   fprintf (file, _(" linker flags: %08x:"), val);
7526   if (val & EIHD__M_LNKDEBUG)
7527     fprintf (file, " LNKDEBUG");
7528   if (val & EIHD__M_LNKNOTFR)
7529     fprintf (file, " LNKNOTFR");
7530   if (val & EIHD__M_NOP0BUFS)
7531     fprintf (file, " NOP0BUFS");
7532   if (val & EIHD__M_PICIMG)
7533     fprintf (file, " PICIMG");
7534   if (val & EIHD__M_P0IMAGE)
7535     fprintf (file, " P0IMAGE");
7536   if (val & EIHD__M_DBGDMT)
7537     fprintf (file, " DBGDMT");
7538   if (val & EIHD__M_INISHR)
7539     fprintf (file, " INISHR");
7540   if (val & EIHD__M_XLATED)
7541     fprintf (file, " XLATED");
7542   if (val & EIHD__M_BIND_CODE_SEC)
7543     fprintf (file, " BIND_CODE_SEC");
7544   if (val & EIHD__M_BIND_DATA_SEC)
7545     fprintf (file, " BIND_DATA_SEC");
7546   if (val & EIHD__M_MKTHREADS)
7547     fprintf (file, " MKTHREADS");
7548   if (val & EIHD__M_UPCALLS)
7549     fprintf (file, " UPCALLS");
7550   if (val & EIHD__M_OMV_READY)
7551     fprintf (file, " OMV_READY");
7552   if (val & EIHD__M_EXT_BIND_SECT)
7553     fprintf (file, " EXT_BIND_SECT");
7554   fprintf (file, "\n");
7555   /* xgettext:c-format */
7556   fprintf (file, _(" ident: 0x%08x, sysver: 0x%08x, "
7557 		   "match ctrl: %u, symvect_size: %u\n"),
7558 	   (unsigned)bfd_getl32 (eihd.ident),
7559 	   (unsigned)bfd_getl32 (eihd.sysver),
7560 	   eihd.matchctl,
7561 	   (unsigned)bfd_getl32 (eihd.symvect_size));
7562   fprintf (file, _(" BPAGE: %u"),
7563 	   (unsigned)bfd_getl32 (eihd.virt_mem_block_size));
7564   if (val & (EIHD__M_OMV_READY | EIHD__M_EXT_BIND_SECT))
7565     {
7566       eihef_off = bfd_getl32 (eihd.ext_fixup_off);
7567       eihnp_off = bfd_getl32 (eihd.noopt_psect_off);
7568       /* xgettext:c-format */
7569       fprintf (file, _(", ext fixup offset: %u, no_opt psect off: %u"),
7570 	       eihef_off, eihnp_off);
7571     }
7572   fprintf (file, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd.alias));
7573 
7574   if (eihvn_off != 0)
7575     {
7576       struct vms_eihvn eihvn;
7577       unsigned int mask;
7578       unsigned int j;
7579 
7580       fprintf (file, _("system version array information:\n"));
7581       if (bfd_seek (abfd, (file_ptr) eihvn_off, SEEK_SET)
7582 	  || bfd_bread (&eihvn, sizeof (eihvn), abfd) != sizeof (eihvn))
7583 	{
7584 	  fprintf (file, _("cannot read EIHVN header\n"));
7585 	  return;
7586 	}
7587       mask = bfd_getl32 (eihvn.subsystem_mask);
7588       for (j = 0; j < 32; j++)
7589 	if (mask & (1 << j))
7590 	  {
7591 	    struct vms_eihvn_subversion ver;
7592 	    if (bfd_bread (&ver, sizeof (ver), abfd) != sizeof (ver))
7593 	      {
7594 		fprintf (file, _("cannot read EIHVN version\n"));
7595 		return;
7596 	      }
7597 	    fprintf (file, _("   %02u "), j);
7598 	    switch (j)
7599 	      {
7600 	      case EIHVN__BASE_IMAGE_BIT:
7601 		fputs (_("BASE_IMAGE       "), file);
7602 		break;
7603 	      case EIHVN__MEMORY_MANAGEMENT_BIT:
7604 		fputs (_("MEMORY_MANAGEMENT"), file);
7605 		break;
7606 	      case EIHVN__IO_BIT:
7607 		fputs (_("IO               "), file);
7608 		break;
7609 	      case EIHVN__FILES_VOLUMES_BIT:
7610 		fputs (_("FILES_VOLUMES    "), file);
7611 		break;
7612 	      case EIHVN__PROCESS_SCHED_BIT:
7613 		fputs (_("PROCESS_SCHED    "), file);
7614 		break;
7615 	      case EIHVN__SYSGEN_BIT:
7616 		fputs (_("SYSGEN           "), file);
7617 		break;
7618 	      case EIHVN__CLUSTERS_LOCKMGR_BIT:
7619 		fputs (_("CLUSTERS_LOCKMGR "), file);
7620 		break;
7621 	      case EIHVN__LOGICAL_NAMES_BIT:
7622 		fputs (_("LOGICAL_NAMES    "), file);
7623 		break;
7624 	      case EIHVN__SECURITY_BIT:
7625 		fputs (_("SECURITY         "), file);
7626 		break;
7627 	      case EIHVN__IMAGE_ACTIVATOR_BIT:
7628 		fputs (_("IMAGE_ACTIVATOR  "), file);
7629 		break;
7630 	      case EIHVN__NETWORKS_BIT:
7631 		fputs (_("NETWORKS         "), file);
7632 		break;
7633 	      case EIHVN__COUNTERS_BIT:
7634 		fputs (_("COUNTERS         "), file);
7635 		break;
7636 	      case EIHVN__STABLE_BIT:
7637 		fputs (_("STABLE           "), file);
7638 		break;
7639 	      case EIHVN__MISC_BIT:
7640 		fputs (_("MISC             "), file);
7641 		break;
7642 	      case EIHVN__CPU_BIT:
7643 		fputs (_("CPU              "), file);
7644 		break;
7645 	      case EIHVN__VOLATILE_BIT:
7646 		fputs (_("VOLATILE         "), file);
7647 		break;
7648 	      case EIHVN__SHELL_BIT:
7649 		fputs (_("SHELL            "), file);
7650 		break;
7651 	      case EIHVN__POSIX_BIT:
7652 		fputs (_("POSIX            "), file);
7653 		break;
7654 	      case EIHVN__MULTI_PROCESSING_BIT:
7655 		fputs (_("MULTI_PROCESSING "), file);
7656 		break;
7657 	      case EIHVN__GALAXY_BIT:
7658 		fputs (_("GALAXY           "), file);
7659 		break;
7660 	      default:
7661 		fputs (_("*unknown*        "), file);
7662 		break;
7663 	      }
7664 	    fprintf (file, ": %u.%u\n",
7665 		     (unsigned)bfd_getl16 (ver.major),
7666 		     (unsigned)bfd_getl16 (ver.minor));
7667 	  }
7668     }
7669 
7670   if (eiha_off != 0)
7671     {
7672       struct vms_eiha eiha;
7673 
7674       if (bfd_seek (abfd, (file_ptr) eiha_off, SEEK_SET)
7675 	  || bfd_bread (&eiha, sizeof (eiha), abfd) != sizeof (eiha))
7676 	{
7677 	  fprintf (file, _("cannot read EIHA\n"));
7678 	  return;
7679 	}
7680       fprintf (file, _("Image activation:  (size=%u)\n"),
7681 	       (unsigned)bfd_getl32 (eiha.size));
7682       /* xgettext:c-format */
7683       fprintf (file, _(" First address : 0x%08x 0x%08x\n"),
7684 	       (unsigned)bfd_getl32 (eiha.tfradr1_h),
7685 	       (unsigned)bfd_getl32 (eiha.tfradr1));
7686       /* xgettext:c-format */
7687       fprintf (file, _(" Second address: 0x%08x 0x%08x\n"),
7688 	       (unsigned)bfd_getl32 (eiha.tfradr2_h),
7689 	       (unsigned)bfd_getl32 (eiha.tfradr2));
7690       /* xgettext:c-format */
7691       fprintf (file, _(" Third address : 0x%08x 0x%08x\n"),
7692 	       (unsigned)bfd_getl32 (eiha.tfradr3_h),
7693 	       (unsigned)bfd_getl32 (eiha.tfradr3));
7694       /* xgettext:c-format */
7695       fprintf (file, _(" Fourth address: 0x%08x 0x%08x\n"),
7696 	       (unsigned)bfd_getl32 (eiha.tfradr4_h),
7697 	       (unsigned)bfd_getl32 (eiha.tfradr4));
7698       /* xgettext:c-format */
7699       fprintf (file, _(" Shared image  : 0x%08x 0x%08x\n"),
7700 	       (unsigned)bfd_getl32 (eiha.inishr_h),
7701 	       (unsigned)bfd_getl32 (eiha.inishr));
7702     }
7703   if (eihi_off != 0)
7704     {
7705       struct vms_eihi eihi;
7706 
7707       if (bfd_seek (abfd, (file_ptr) eihi_off, SEEK_SET)
7708 	  || bfd_bread (&eihi, sizeof (eihi), abfd) != sizeof (eihi))
7709 	{
7710 	  fprintf (file, _("cannot read EIHI\n"));
7711 	  return;
7712 	}
7713       /* xgettext:c-format */
7714       fprintf (file, _("Image identification: (major: %u, minor: %u)\n"),
7715 	       (unsigned)bfd_getl32 (eihi.majorid),
7716 	       (unsigned)bfd_getl32 (eihi.minorid));
7717       fprintf (file, _(" image name       : %.*s\n"),
7718 	       eihi.imgnam[0], eihi.imgnam + 1);
7719       fprintf (file, _(" link time        : %s\n"),
7720 	       vms_time_to_str (eihi.linktime));
7721       fprintf (file, _(" image ident      : %.*s\n"),
7722 	       eihi.imgid[0], eihi.imgid + 1);
7723       fprintf (file, _(" linker ident     : %.*s\n"),
7724 	       eihi.linkid[0], eihi.linkid + 1);
7725       fprintf (file, _(" image build ident: %.*s\n"),
7726 	       eihi.imgbid[0], eihi.imgbid + 1);
7727     }
7728   if (eihs_off != 0)
7729     {
7730       struct vms_eihs eihs;
7731 
7732       if (bfd_seek (abfd, (file_ptr) eihs_off, SEEK_SET)
7733 	  || bfd_bread (&eihs, sizeof (eihs), abfd) != sizeof (eihs))
7734 	{
7735 	  fprintf (file, _("cannot read EIHS\n"));
7736 	  return;
7737 	}
7738       /* xgettext:c-format */
7739       fprintf (file, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
7740 	       (unsigned)bfd_getl32 (eihs.majorid),
7741 	       (unsigned)bfd_getl32 (eihs.minorid));
7742       dst_vbn = bfd_getl32 (eihs.dstvbn);
7743       dst_size = bfd_getl32 (eihs.dstsize);
7744       /* xgettext:c-format */
7745       fprintf (file, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
7746 	       dst_vbn, dst_size, dst_size);
7747       gst_vbn = bfd_getl32 (eihs.gstvbn);
7748       gst_size = bfd_getl32 (eihs.gstsize);
7749       /* xgettext:c-format */
7750       fprintf (file, _(" global symbol table: vbn: %u, records: %u\n"),
7751 	       gst_vbn, gst_size);
7752       dmt_vbn = bfd_getl32 (eihs.dmtvbn);
7753       dmt_size = bfd_getl32 (eihs.dmtsize);
7754       /* xgettext:c-format */
7755       fprintf (file, _(" debug module table : vbn: %u, size: %u\n"),
7756 	       dmt_vbn, dmt_size);
7757     }
7758   while (eisd_off != 0)
7759     {
7760       struct vms_eisd eisd;
7761       unsigned int len;
7762 
7763       while (1)
7764 	{
7765 	  if (bfd_seek (abfd, (file_ptr) eisd_off, SEEK_SET)
7766 	      || bfd_bread (&eisd, sizeof (eisd), abfd) != sizeof (eisd))
7767 	    {
7768 	      fprintf (file, _("cannot read EISD\n"));
7769 	      return;
7770 	    }
7771 	  len = (unsigned)bfd_getl32 (eisd.eisdsize);
7772 	  if (len != (unsigned)-1)
7773 	    break;
7774 
7775 	  /* Next block.  */
7776 	  eisd_off = (eisd_off + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
7777 	}
7778       /* xgettext:c-format */
7779       fprintf (file, _("Image section descriptor: (major: %u, minor: %u, "
7780 		       "size: %u, offset: %u)\n"),
7781 	       (unsigned)bfd_getl32 (eisd.majorid),
7782 	       (unsigned)bfd_getl32 (eisd.minorid),
7783 	       len, eisd_off);
7784       if (len == 0)
7785 	break;
7786       /* xgettext:c-format */
7787       fprintf (file, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
7788 	       (unsigned)bfd_getl32 (eisd.virt_addr + 4),
7789 	       (unsigned)bfd_getl32 (eisd.virt_addr + 0),
7790 	       (unsigned)bfd_getl32 (eisd.secsize));
7791       val = (unsigned)bfd_getl32 (eisd.flags);
7792       fprintf (file, _(" flags: 0x%04x"), val);
7793       if (val & EISD__M_GBL)
7794 	fprintf (file, " GBL");
7795       if (val & EISD__M_CRF)
7796 	fprintf (file, " CRF");
7797       if (val & EISD__M_DZRO)
7798 	fprintf (file, " DZRO");
7799       if (val & EISD__M_WRT)
7800 	fprintf (file, " WRT");
7801       if (val & EISD__M_INITALCODE)
7802 	fprintf (file, " INITALCODE");
7803       if (val & EISD__M_BASED)
7804 	fprintf (file, " BASED");
7805       if (val & EISD__M_FIXUPVEC)
7806 	fprintf (file, " FIXUPVEC");
7807       if (val & EISD__M_RESIDENT)
7808 	fprintf (file, " RESIDENT");
7809       if (val & EISD__M_VECTOR)
7810 	fprintf (file, " VECTOR");
7811       if (val & EISD__M_PROTECT)
7812 	fprintf (file, " PROTECT");
7813       if (val & EISD__M_LASTCLU)
7814 	fprintf (file, " LASTCLU");
7815       if (val & EISD__M_EXE)
7816 	fprintf (file, " EXE");
7817       if (val & EISD__M_NONSHRADR)
7818 	fprintf (file, " NONSHRADR");
7819       if (val & EISD__M_QUAD_LENGTH)
7820 	fprintf (file, " QUAD_LENGTH");
7821       if (val & EISD__M_ALLOC_64BIT)
7822 	fprintf (file, " ALLOC_64BIT");
7823       fprintf (file, "\n");
7824       if (val & EISD__M_FIXUPVEC)
7825 	{
7826 	  eiaf_vbn = bfd_getl32 (eisd.vbn);
7827 	  eiaf_size = bfd_getl32 (eisd.secsize);
7828 	}
7829       /* xgettext:c-format */
7830       fprintf (file, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
7831 	       (unsigned)bfd_getl32 (eisd.vbn),
7832 	       eisd.pfc, eisd.matchctl, eisd.type);
7833       switch (eisd.type)
7834 	{
7835 	case EISD__K_NORMAL:
7836 	  fputs (_("NORMAL"), file);
7837 	  break;
7838 	case EISD__K_SHRFXD:
7839 	  fputs (_("SHRFXD"), file);
7840 	  break;
7841 	case EISD__K_PRVFXD:
7842 	  fputs (_("PRVFXD"), file);
7843 	  break;
7844 	case EISD__K_SHRPIC:
7845 	  fputs (_("SHRPIC"), file);
7846 	  break;
7847 	case EISD__K_PRVPIC:
7848 	  fputs (_("PRVPIC"), file);
7849 	  break;
7850 	case EISD__K_USRSTACK:
7851 	  fputs (_("USRSTACK"), file);
7852 	  break;
7853 	default:
7854 	  fputs (_("*unknown*"), file);
7855 	  break;
7856 	}
7857       fputs (_(")\n"), file);
7858       if (val & EISD__M_GBL)
7859 	/* xgettext:c-format */
7860 	fprintf (file, _(" ident: 0x%08x, name: %.*s\n"),
7861 		 (unsigned)bfd_getl32 (eisd.ident),
7862 		 eisd.gblnam[0], eisd.gblnam + 1);
7863       eisd_off += len;
7864     }
7865 
7866   if (dmt_vbn != 0)
7867     {
7868       if (bfd_seek (abfd, (file_ptr) (dmt_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7869 	{
7870 	  fprintf (file, _("cannot read DMT\n"));
7871 	  return;
7872 	}
7873 
7874       fprintf (file, _("Debug module table:\n"));
7875 
7876       while (dmt_size > 0)
7877 	{
7878 	  struct vms_dmt_header dmth;
7879 	  unsigned int count;
7880 
7881 	  if (bfd_bread (&dmth, sizeof (dmth), abfd) != sizeof (dmth))
7882 	    {
7883 	      fprintf (file, _("cannot read DMT header\n"));
7884 	      return;
7885 	    }
7886 	  count = bfd_getl16 (dmth.psect_count);
7887 	  fprintf (file,
7888 		   /* xgettext:c-format */
7889 		   _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
7890 		   (unsigned)bfd_getl32 (dmth.modbeg),
7891 		   (unsigned)bfd_getl32 (dmth.size), count);
7892 	  dmt_size -= sizeof (dmth);
7893 	  while (count > 0)
7894 	    {
7895 	      struct vms_dmt_psect dmtp;
7896 
7897 	      if (bfd_bread (&dmtp, sizeof (dmtp), abfd) != sizeof (dmtp))
7898 		{
7899 		  fprintf (file, _("cannot read DMT psect\n"));
7900 		  return;
7901 		}
7902 	      /* xgettext:c-format */
7903 	      fprintf (file, _("  psect start: 0x%08x, length: %u\n"),
7904 		       (unsigned)bfd_getl32 (dmtp.start),
7905 		       (unsigned)bfd_getl32 (dmtp.length));
7906 	      count--;
7907 	      dmt_size -= sizeof (dmtp);
7908 	    }
7909 	}
7910     }
7911 
7912   if (dst_vbn != 0)
7913     {
7914       if (bfd_seek (abfd, (file_ptr) (dst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7915 	{
7916 	  fprintf (file, _("cannot read DST\n"));
7917 	  return;
7918 	}
7919 
7920       evax_bfd_print_dst (abfd, dst_size, file);
7921     }
7922   if (gst_vbn != 0)
7923     {
7924       if (bfd_seek (abfd, (file_ptr) (gst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7925 	{
7926 	  fprintf (file, _("cannot read GST\n"));
7927 	  return;
7928 	}
7929 
7930       fprintf (file, _("Global symbol table:\n"));
7931       evax_bfd_print_eobj (abfd, file);
7932     }
7933   if (eiaf_vbn != 0)
7934     {
7935       unsigned char *buf;
7936       struct vms_eiaf *eiaf;
7937       unsigned int qrelfixoff;
7938       unsigned int lrelfixoff;
7939       unsigned int qdotadroff;
7940       unsigned int ldotadroff;
7941       unsigned int shrimgcnt;
7942       unsigned int shlstoff;
7943       unsigned int codeadroff;
7944       unsigned int lpfixoff;
7945       unsigned int chgprtoff;
7946 
7947       buf = bfd_malloc (eiaf_size);
7948 
7949       if (bfd_seek (abfd, (file_ptr) (eiaf_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET)
7950 	  || bfd_bread (buf, eiaf_size, abfd) != eiaf_size)
7951 	{
7952 	  fprintf (file, _("cannot read EIHA\n"));
7953 	  free (buf);
7954 	  return;
7955 	}
7956       eiaf = (struct vms_eiaf *)buf;
7957       fprintf (file,
7958 	       /* xgettext:c-format */
7959 	       _("Image activator fixup: (major: %u, minor: %u)\n"),
7960 	       (unsigned)bfd_getl32 (eiaf->majorid),
7961 	       (unsigned)bfd_getl32 (eiaf->minorid));
7962       /* xgettext:c-format */
7963       fprintf (file, _("  iaflink : 0x%08x %08x\n"),
7964 	       (unsigned)bfd_getl32 (eiaf->iaflink + 0),
7965 	       (unsigned)bfd_getl32 (eiaf->iaflink + 4));
7966       /* xgettext:c-format */
7967       fprintf (file, _("  fixuplnk: 0x%08x %08x\n"),
7968 	       (unsigned)bfd_getl32 (eiaf->fixuplnk + 0),
7969 	       (unsigned)bfd_getl32 (eiaf->fixuplnk + 4));
7970       fprintf (file, _("  size : %u\n"),
7971 	       (unsigned)bfd_getl32 (eiaf->size));
7972       fprintf (file, _("  flags: 0x%08x\n"),
7973 	       (unsigned)bfd_getl32 (eiaf->flags));
7974       qrelfixoff = bfd_getl32 (eiaf->qrelfixoff);
7975       lrelfixoff = bfd_getl32 (eiaf->lrelfixoff);
7976       /* xgettext:c-format */
7977       fprintf (file, _("  qrelfixoff: %5u, lrelfixoff: %5u\n"),
7978 	       qrelfixoff, lrelfixoff);
7979       qdotadroff = bfd_getl32 (eiaf->qdotadroff);
7980       ldotadroff = bfd_getl32 (eiaf->ldotadroff);
7981       /* xgettext:c-format */
7982       fprintf (file, _("  qdotadroff: %5u, ldotadroff: %5u\n"),
7983 	       qdotadroff, ldotadroff);
7984       codeadroff = bfd_getl32 (eiaf->codeadroff);
7985       lpfixoff = bfd_getl32 (eiaf->lpfixoff);
7986       /* xgettext:c-format */
7987       fprintf (file, _("  codeadroff: %5u, lpfixoff  : %5u\n"),
7988 	       codeadroff, lpfixoff);
7989       chgprtoff = bfd_getl32 (eiaf->chgprtoff);
7990       fprintf (file, _("  chgprtoff : %5u\n"), chgprtoff);
7991       shrimgcnt = bfd_getl32 (eiaf->shrimgcnt);
7992       shlstoff = bfd_getl32 (eiaf->shlstoff);
7993       /* xgettext:c-format */
7994       fprintf (file, _("  shlstoff  : %5u, shrimgcnt : %5u\n"),
7995 	       shlstoff, shrimgcnt);
7996       /* xgettext:c-format */
7997       fprintf (file, _("  shlextra  : %5u, permctx   : %5u\n"),
7998 	       (unsigned)bfd_getl32 (eiaf->shlextra),
7999 	       (unsigned)bfd_getl32 (eiaf->permctx));
8000       fprintf (file, _("  base_va : 0x%08x\n"),
8001 	       (unsigned)bfd_getl32 (eiaf->base_va));
8002       fprintf (file, _("  lppsbfixoff: %5u\n"),
8003 	       (unsigned)bfd_getl32 (eiaf->lppsbfixoff));
8004 
8005       if (shlstoff)
8006 	{
8007 	  struct vms_shl *shl = (struct vms_shl *)(buf + shlstoff);
8008 	  unsigned int j;
8009 
8010 	  fprintf (file, _(" Shareable images:\n"));
8011 	  for (j = 0; j < shrimgcnt; j++, shl++)
8012 	    {
8013 	      fprintf (file,
8014 		       /* xgettext:c-format */
8015 		       _("  %u: size: %u, flags: 0x%02x, name: %.*s\n"),
8016 		       j, shl->size, shl->flags,
8017 		       shl->imgnam[0], shl->imgnam + 1);
8018 	    }
8019 	}
8020       if (qrelfixoff != 0)
8021 	{
8022 	  fprintf (file, _(" quad-word relocation fixups:\n"));
8023 	  evax_bfd_print_relocation_records (file, buf + qrelfixoff, 8);
8024 	}
8025       if (lrelfixoff != 0)
8026 	{
8027 	  fprintf (file, _(" long-word relocation fixups:\n"));
8028 	  evax_bfd_print_relocation_records (file, buf + lrelfixoff, 4);
8029 	}
8030       if (qdotadroff != 0)
8031 	{
8032 	  fprintf (file, _(" quad-word .address reference fixups:\n"));
8033 	  evax_bfd_print_address_fixups (file, buf + qdotadroff);
8034 	}
8035       if (ldotadroff != 0)
8036 	{
8037 	  fprintf (file, _(" long-word .address reference fixups:\n"));
8038 	  evax_bfd_print_address_fixups (file, buf + ldotadroff);
8039 	}
8040       if (codeadroff != 0)
8041 	{
8042 	  fprintf (file, _(" Code Address Reference Fixups:\n"));
8043 	  evax_bfd_print_reference_fixups (file, buf + codeadroff);
8044 	}
8045       if (lpfixoff != 0)
8046 	{
8047 	  fprintf (file, _(" Linkage Pairs Reference Fixups:\n"));
8048 	  evax_bfd_print_reference_fixups (file, buf + lpfixoff);
8049 	}
8050       if (chgprtoff)
8051 	{
8052 	  unsigned int count = (unsigned)bfd_getl32 (buf + chgprtoff);
8053 	  struct vms_eicp *eicp = (struct vms_eicp *)(buf + chgprtoff + 4);
8054 	  unsigned int j;
8055 
8056 	  fprintf (file, _(" Change Protection (%u entries):\n"), count);
8057 	  for (j = 0; j < count; j++, eicp++)
8058 	    {
8059 	      unsigned int prot = bfd_getl32 (eicp->newprt);
8060 	      fprintf (file,
8061 		       /* xgettext:c-format */
8062 		       _("  base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
8063 		       (unsigned)bfd_getl32 (eicp->baseva + 4),
8064 		       (unsigned)bfd_getl32 (eicp->baseva + 0),
8065 		       (unsigned)bfd_getl32 (eicp->size),
8066 		       (unsigned)bfd_getl32 (eicp->newprt));
8067 	      switch (prot)
8068 		{
8069 		case PRT__C_NA:
8070 		  fprintf (file, "NA");
8071 		  break;
8072 		case PRT__C_RESERVED:
8073 		  fprintf (file, "RES");
8074 		  break;
8075 		case PRT__C_KW:
8076 		  fprintf (file, "KW");
8077 		  break;
8078 		case PRT__C_KR:
8079 		  fprintf (file, "KR");
8080 		  break;
8081 		case PRT__C_UW:
8082 		  fprintf (file, "UW");
8083 		  break;
8084 		case PRT__C_EW:
8085 		  fprintf (file, "EW");
8086 		  break;
8087 		case PRT__C_ERKW:
8088 		  fprintf (file, "ERKW");
8089 		  break;
8090 		case PRT__C_ER:
8091 		  fprintf (file, "ER");
8092 		  break;
8093 		case PRT__C_SW:
8094 		  fprintf (file, "SW");
8095 		  break;
8096 		case PRT__C_SREW:
8097 		  fprintf (file, "SREW");
8098 		  break;
8099 		case PRT__C_SRKW:
8100 		  fprintf (file, "SRKW");
8101 		  break;
8102 		case PRT__C_SR:
8103 		  fprintf (file, "SR");
8104 		  break;
8105 		case PRT__C_URSW:
8106 		  fprintf (file, "URSW");
8107 		  break;
8108 		case PRT__C_UREW:
8109 		  fprintf (file, "UREW");
8110 		  break;
8111 		case PRT__C_URKW:
8112 		  fprintf (file, "URKW");
8113 		  break;
8114 		case PRT__C_UR:
8115 		  fprintf (file, "UR");
8116 		  break;
8117 		default:
8118 		  fputs ("??", file);
8119 		  break;
8120 		}
8121 	      fputc ('\n', file);
8122 	    }
8123 	}
8124       free (buf);
8125     }
8126 }
8127 
8128 static bfd_boolean
8129 vms_bfd_print_private_bfd_data (bfd *abfd, void *ptr)
8130 {
8131   FILE *file = (FILE *)ptr;
8132 
8133   if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
8134     evax_bfd_print_image (abfd, file);
8135   else
8136     {
8137       if (bfd_seek (abfd, 0, SEEK_SET))
8138 	return FALSE;
8139       evax_bfd_print_eobj (abfd, file);
8140     }
8141   return TRUE;
8142 }
8143 
8144 /* Linking.  */
8145 
8146 /* Slurp ETIR/EDBG/ETBT VMS object records.  */
8147 
8148 static bfd_boolean
8149 alpha_vms_read_sections_content (bfd *abfd, struct bfd_link_info *info)
8150 {
8151   asection *cur_section;
8152   file_ptr cur_offset;
8153   asection *dst_section;
8154   file_ptr dst_offset;
8155 
8156   if (bfd_seek (abfd, 0, SEEK_SET) != 0)
8157     return FALSE;
8158 
8159   cur_section = NULL;
8160   cur_offset = 0;
8161 
8162   dst_section = PRIV (dst_section);
8163   dst_offset = 0;
8164   if (info)
8165     {
8166       if (info->strip == strip_all || info->strip == strip_debugger)
8167 	{
8168 	  /* Discard the DST section.  */
8169 	  dst_offset = 0;
8170 	  dst_section = NULL;
8171 	}
8172       else if (dst_section)
8173 	{
8174 	  dst_offset = dst_section->output_offset;
8175 	  dst_section = dst_section->output_section;
8176 	}
8177     }
8178 
8179   while (1)
8180     {
8181       int type;
8182       bfd_boolean res;
8183 
8184       type = _bfd_vms_get_object_record (abfd);
8185       if (type < 0)
8186 	{
8187 	  vms_debug2 ((2, "next_record failed\n"));
8188 	  return FALSE;
8189 	}
8190       switch (type)
8191 	{
8192 	case EOBJ__C_ETIR:
8193 	  PRIV (image_section) = cur_section;
8194 	  PRIV (image_offset) = cur_offset;
8195 	  res = _bfd_vms_slurp_etir (abfd, info);
8196 	  cur_section = PRIV (image_section);
8197 	  cur_offset = PRIV (image_offset);
8198 	  break;
8199 	case EOBJ__C_EDBG:
8200 	case EOBJ__C_ETBT:
8201 	  if (dst_section == NULL)
8202 	    continue;
8203 	  PRIV (image_section) = dst_section;
8204 	  PRIV (image_offset) = dst_offset;
8205 	  res = _bfd_vms_slurp_etir (abfd, info);
8206 	  dst_offset = PRIV (image_offset);
8207 	  break;
8208 	case EOBJ__C_EEOM:
8209 	  return TRUE;
8210 	default:
8211 	  continue;
8212 	}
8213       if (!res)
8214 	{
8215 	  vms_debug2 ((2, "slurp eobj type %d failed\n", type));
8216 	  return FALSE;
8217 	}
8218     }
8219 }
8220 
8221 static int
8222 alpha_vms_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
8223 			  struct bfd_link_info *info ATTRIBUTE_UNUSED)
8224 {
8225   return 0;
8226 }
8227 
8228 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
8229 
8230 static void
8231 alpha_vms_add_fixup_lp (struct bfd_link_info *info, bfd *src, bfd *shlib)
8232 {
8233   struct alpha_vms_shlib_el *sl;
8234   asection *sect = PRIV2 (src, image_section);
8235   file_ptr offset = PRIV2 (src, image_offset);
8236 
8237   sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8238 		struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8239   sl->has_fixups = TRUE;
8240   VEC_APPEND_EL (sl->lp, bfd_vma,
8241 		 sect->output_section->vma + sect->output_offset + offset);
8242   sect->output_section->flags |= SEC_RELOC;
8243 }
8244 
8245 /* Add a code address fixup at address SECT + OFFSET to SHLIB. */
8246 
8247 static void
8248 alpha_vms_add_fixup_ca (struct bfd_link_info *info, bfd *src, bfd *shlib)
8249 {
8250   struct alpha_vms_shlib_el *sl;
8251   asection *sect = PRIV2 (src, image_section);
8252   file_ptr offset = PRIV2 (src, image_offset);
8253 
8254   sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8255 		struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8256   sl->has_fixups = TRUE;
8257   VEC_APPEND_EL (sl->ca, bfd_vma,
8258 		 sect->output_section->vma + sect->output_offset + offset);
8259   sect->output_section->flags |= SEC_RELOC;
8260 }
8261 
8262 /* Add a quad word relocation fixup at address SECT + OFFSET to SHLIB. */
8263 
8264 static void
8265 alpha_vms_add_fixup_qr (struct bfd_link_info *info, bfd *src,
8266 			bfd *shlib, bfd_vma vec)
8267 {
8268   struct alpha_vms_shlib_el *sl;
8269   struct alpha_vms_vma_ref *r;
8270   asection *sect = PRIV2 (src, image_section);
8271   file_ptr offset = PRIV2 (src, image_offset);
8272 
8273   sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8274 		struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8275   sl->has_fixups = TRUE;
8276   r = VEC_APPEND (sl->qr, struct alpha_vms_vma_ref);
8277   r->vma = sect->output_section->vma + sect->output_offset + offset;
8278   r->ref = vec;
8279   sect->output_section->flags |= SEC_RELOC;
8280 }
8281 
8282 static void
8283 alpha_vms_add_fixup_lr (struct bfd_link_info *info ATTRIBUTE_UNUSED,
8284 			unsigned int shr ATTRIBUTE_UNUSED,
8285 			bfd_vma vec ATTRIBUTE_UNUSED)
8286 {
8287   /* Not yet supported.  */
8288   abort ();
8289 }
8290 
8291 /* Add relocation.  FIXME: Not yet emitted.  */
8292 
8293 static void
8294 alpha_vms_add_lw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8295 {
8296 }
8297 
8298 static void
8299 alpha_vms_add_qw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8300 {
8301 }
8302 
8303 static struct bfd_hash_entry *
8304 alpha_vms_link_hash_newfunc (struct bfd_hash_entry *entry,
8305 			     struct bfd_hash_table *table,
8306 			     const char *string)
8307 {
8308   struct alpha_vms_link_hash_entry *ret =
8309     (struct alpha_vms_link_hash_entry *) entry;
8310 
8311   /* Allocate the structure if it has not already been allocated by a
8312      subclass.  */
8313   if (ret == NULL)
8314     ret = ((struct alpha_vms_link_hash_entry *)
8315 	   bfd_hash_allocate (table,
8316 			      sizeof (struct alpha_vms_link_hash_entry)));
8317   if (ret == NULL)
8318     return NULL;
8319 
8320   /* Call the allocation method of the superclass.  */
8321   ret = ((struct alpha_vms_link_hash_entry *)
8322 	 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
8323 				 table, string));
8324 
8325   ret->sym = NULL;
8326 
8327   return (struct bfd_hash_entry *) ret;
8328 }
8329 
8330 /* Create an Alpha/VMS link hash table.  */
8331 
8332 static struct bfd_link_hash_table *
8333 alpha_vms_bfd_link_hash_table_create (bfd *abfd)
8334 {
8335   struct alpha_vms_link_hash_table *ret;
8336   bfd_size_type amt = sizeof (struct alpha_vms_link_hash_table);
8337 
8338   ret = (struct alpha_vms_link_hash_table *) bfd_malloc (amt);
8339   if (ret == NULL)
8340     return NULL;
8341   if (!_bfd_link_hash_table_init (&ret->root, abfd,
8342 				  alpha_vms_link_hash_newfunc,
8343 				  sizeof (struct alpha_vms_link_hash_entry)))
8344     {
8345       free (ret);
8346       return NULL;
8347     }
8348 
8349   VEC_INIT (ret->shrlibs);
8350   ret->fixup = NULL;
8351 
8352   return &ret->root;
8353 }
8354 
8355 static bfd_boolean
8356 alpha_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
8357 {
8358   unsigned int i;
8359 
8360   for (i = 0; i < PRIV (gsd_sym_count); i++)
8361     {
8362       struct vms_symbol_entry *e = PRIV (syms)[i];
8363       struct alpha_vms_link_hash_entry *h;
8364       struct bfd_link_hash_entry *h_root;
8365       asymbol sym;
8366 
8367       if (!alpha_vms_convert_symbol (abfd, e, &sym))
8368 	return FALSE;
8369 
8370       if ((e->flags & EGSY__V_DEF) && abfd->selective_search)
8371 	{
8372 	  /* In selective_search mode, only add definition that are
8373 	     required.  */
8374 	  h = (struct alpha_vms_link_hash_entry *)bfd_link_hash_lookup
8375 	    (info->hash, sym.name, FALSE, FALSE, FALSE);
8376 	  if (h == NULL || h->root.type != bfd_link_hash_undefined)
8377 	    continue;
8378 	}
8379       else
8380 	h = NULL;
8381 
8382       h_root = (struct bfd_link_hash_entry *) h;
8383       if (!_bfd_generic_link_add_one_symbol (info, abfd, sym.name, sym.flags,
8384 					     sym.section, sym.value, NULL,
8385 					     FALSE, FALSE, &h_root))
8386 	return FALSE;
8387       h = (struct alpha_vms_link_hash_entry *) h_root;
8388 
8389       if ((e->flags & EGSY__V_DEF)
8390 	  && h->sym == NULL
8391 	  && abfd->xvec == info->output_bfd->xvec)
8392 	h->sym = e;
8393     }
8394 
8395   if (abfd->flags & DYNAMIC)
8396     {
8397       struct alpha_vms_shlib_el *shlib;
8398 
8399       /* We do not want to include any of the sections in a dynamic
8400 	 object in the output file.  See comment in elflink.c.  */
8401       bfd_section_list_clear (abfd);
8402 
8403       shlib = VEC_APPEND (alpha_vms_link_hash (info)->shrlibs,
8404 			  struct alpha_vms_shlib_el);
8405       shlib->abfd = abfd;
8406       VEC_INIT (shlib->ca);
8407       VEC_INIT (shlib->lp);
8408       VEC_INIT (shlib->qr);
8409       PRIV (shr_index) = VEC_COUNT (alpha_vms_link_hash (info)->shrlibs) - 1;
8410     }
8411 
8412   return TRUE;
8413 }
8414 
8415 static bfd_boolean
8416 alpha_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
8417 {
8418   int pass;
8419   struct bfd_link_hash_entry **pundef;
8420   struct bfd_link_hash_entry **next_pundef;
8421 
8422   /* We only accept VMS libraries.  */
8423   if (info->output_bfd->xvec != abfd->xvec)
8424     {
8425       bfd_set_error (bfd_error_wrong_format);
8426       return FALSE;
8427     }
8428 
8429   /* The archive_pass field in the archive itself is used to
8430      initialize PASS, since we may search the same archive multiple
8431      times.  */
8432   pass = ++abfd->archive_pass;
8433 
8434   /* Look through the list of undefined symbols.  */
8435   for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef)
8436     {
8437       struct bfd_link_hash_entry *h;
8438       symindex symidx;
8439       bfd *element;
8440       bfd *orig_element;
8441 
8442       h = *pundef;
8443       next_pundef = &(*pundef)->u.undef.next;
8444 
8445       /* When a symbol is defined, it is not necessarily removed from
8446 	 the list.  */
8447       if (h->type != bfd_link_hash_undefined
8448 	  && h->type != bfd_link_hash_common)
8449 	{
8450 	  /* Remove this entry from the list, for general cleanliness
8451 	     and because we are going to look through the list again
8452 	     if we search any more libraries.  We can't remove the
8453 	     entry if it is the tail, because that would lose any
8454 	     entries we add to the list later on.  */
8455 	  if (*pundef != info->hash->undefs_tail)
8456 	    {
8457 	      *pundef = *next_pundef;
8458 	      next_pundef = pundef;
8459 	    }
8460 	  continue;
8461 	}
8462 
8463       /* Look for this symbol in the archive hash table.  */
8464       symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string);
8465       if (symidx == BFD_NO_MORE_SYMBOLS)
8466 	{
8467 	  /* Nothing in this slot.  */
8468 	  continue;
8469 	}
8470 
8471       element = bfd_get_elt_at_index (abfd, symidx);
8472       if (element == NULL)
8473 	return FALSE;
8474 
8475       if (element->archive_pass == -1 || element->archive_pass == pass)
8476 	{
8477 	  /* Next symbol if this archive is wrong or already handled.  */
8478 	  continue;
8479 	}
8480 
8481       if (! bfd_check_format (element, bfd_object))
8482 	{
8483 	  element->archive_pass = -1;
8484 	  return FALSE;
8485 	}
8486 
8487       orig_element = element;
8488       if (bfd_is_thin_archive (abfd))
8489 	{
8490 	  element = _bfd_vms_lib_get_imagelib_file (element);
8491 	  if (element == NULL || !bfd_check_format (element, bfd_object))
8492 	    {
8493 	      orig_element->archive_pass = -1;
8494 	      return FALSE;
8495 	    }
8496 	}
8497 
8498       /* Unlike the generic linker, we know that this element provides
8499 	 a definition for an undefined symbol and we know that we want
8500 	 to include it.  We don't need to check anything.  */
8501       if (!(*info->callbacks
8502 	    ->add_archive_element) (info, element, h->root.string, &element))
8503 	continue;
8504       if (!alpha_vms_link_add_object_symbols (element, info))
8505 	return FALSE;
8506 
8507       orig_element->archive_pass = pass;
8508     }
8509 
8510   return TRUE;
8511 }
8512 
8513 static bfd_boolean
8514 alpha_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
8515 {
8516   switch (bfd_get_format (abfd))
8517     {
8518     case bfd_object:
8519       vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
8520 		   abfd->filename));
8521       return alpha_vms_link_add_object_symbols (abfd, info);
8522       break;
8523     case bfd_archive:
8524       vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
8525 		   abfd->filename));
8526       return alpha_vms_link_add_archive_symbols (abfd, info);
8527       break;
8528     default:
8529       bfd_set_error (bfd_error_wrong_format);
8530       return FALSE;
8531     }
8532 }
8533 
8534 static bfd_boolean
8535 alpha_vms_build_fixups (struct bfd_link_info *info)
8536 {
8537   struct alpha_vms_link_hash_table *t = alpha_vms_link_hash (info);
8538   unsigned char *content;
8539   unsigned int i;
8540   unsigned int sz = 0;
8541   unsigned int lp_sz = 0;
8542   unsigned int ca_sz = 0;
8543   unsigned int qr_sz = 0;
8544   unsigned int shrimg_cnt = 0;
8545   unsigned int chgprt_num = 0;
8546   unsigned int chgprt_sz = 0;
8547   struct vms_eiaf *eiaf;
8548   unsigned int off;
8549   asection *sec;
8550 
8551   /* Shared libraries.  */
8552   for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8553     {
8554       struct alpha_vms_shlib_el *shlib;
8555 
8556       shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8557 
8558       if (!shlib->has_fixups)
8559 	continue;
8560 
8561       shrimg_cnt++;
8562 
8563       if (VEC_COUNT (shlib->ca) > 0)
8564 	{
8565 	  /* Header + entries.  */
8566 	  ca_sz += 8;
8567 	  ca_sz += VEC_COUNT (shlib->ca) * 4;
8568 	}
8569       if (VEC_COUNT (shlib->lp) > 0)
8570 	{
8571 	  /* Header + entries.  */
8572 	  lp_sz += 8;
8573 	  lp_sz += VEC_COUNT (shlib->lp) * 4;
8574 	}
8575       if (VEC_COUNT (shlib->qr) > 0)
8576 	{
8577 	  /* Header + entries.  */
8578 	  qr_sz += 8;
8579 	  qr_sz += VEC_COUNT (shlib->qr) * 8;
8580 	}
8581     }
8582   /* Add markers.  */
8583   if (ca_sz > 0)
8584     ca_sz += 8;
8585   if (lp_sz > 0)
8586     lp_sz += 8;
8587   if (qr_sz > 0)
8588     qr_sz += 8;
8589 
8590   /* Finish now if there is no content.  */
8591   if (ca_sz + lp_sz + qr_sz == 0)
8592     return TRUE;
8593 
8594   /* Add an eicp entry for the fixup itself.  */
8595   chgprt_num = 1;
8596   for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
8597     {
8598       /* This isect could be made RO or EXE after relocations are applied.  */
8599       if ((sec->flags & SEC_RELOC) != 0
8600 	  && (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
8601 	chgprt_num++;
8602     }
8603   chgprt_sz = 4 + chgprt_num * sizeof (struct vms_eicp);
8604 
8605   /* Allocate section content (round-up size)  */
8606   sz = sizeof (struct vms_eiaf) + shrimg_cnt * sizeof (struct vms_shl)
8607     + ca_sz + lp_sz + qr_sz + chgprt_sz;
8608   sz = (sz + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
8609   content = bfd_zalloc (info->output_bfd, sz);
8610   if (content == NULL)
8611     return FALSE;
8612 
8613   sec = alpha_vms_link_hash (info)->fixup;
8614   sec->contents = content;
8615   sec->size = sz;
8616 
8617   eiaf = (struct vms_eiaf *)content;
8618   off = sizeof (struct vms_eiaf);
8619   bfd_putl32 (0, eiaf->majorid);
8620   bfd_putl32 (0, eiaf->minorid);
8621   bfd_putl32 (0, eiaf->iaflink);
8622   bfd_putl32 (0, eiaf->fixuplnk);
8623   bfd_putl32 (sizeof (struct vms_eiaf), eiaf->size);
8624   bfd_putl32 (0, eiaf->flags);
8625   bfd_putl32 (0, eiaf->qrelfixoff);
8626   bfd_putl32 (0, eiaf->lrelfixoff);
8627   bfd_putl32 (0, eiaf->qdotadroff);
8628   bfd_putl32 (0, eiaf->ldotadroff);
8629   bfd_putl32 (0, eiaf->codeadroff);
8630   bfd_putl32 (0, eiaf->lpfixoff);
8631   bfd_putl32 (0, eiaf->chgprtoff);
8632   bfd_putl32 (shrimg_cnt ? off : 0, eiaf->shlstoff);
8633   bfd_putl32 (shrimg_cnt, eiaf->shrimgcnt);
8634   bfd_putl32 (0, eiaf->shlextra);
8635   bfd_putl32 (0, eiaf->permctx);
8636   bfd_putl32 (0, eiaf->base_va);
8637   bfd_putl32 (0, eiaf->lppsbfixoff);
8638 
8639   if (shrimg_cnt)
8640     {
8641       shrimg_cnt = 0;
8642 
8643       /* Write shl.  */
8644       for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8645 	{
8646 	  struct alpha_vms_shlib_el *shlib;
8647 	  struct vms_shl *shl;
8648 
8649 	  shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8650 
8651 	  if (!shlib->has_fixups)
8652 	    continue;
8653 
8654 	  /* Renumber shared images.  */
8655 	  PRIV2 (shlib->abfd, shr_index) = shrimg_cnt++;
8656 
8657 	  shl = (struct vms_shl *)(content + off);
8658 	  bfd_putl32 (0, shl->baseva);
8659 	  bfd_putl32 (0, shl->shlptr);
8660 	  bfd_putl32 (0, shl->ident);
8661 	  bfd_putl32 (0, shl->permctx);
8662 	  shl->size = sizeof (struct vms_shl);
8663 	  bfd_putl16 (0, shl->fill_1);
8664 	  shl->flags = 0;
8665 	  bfd_putl32 (0, shl->icb);
8666 	  shl->imgnam[0] = strlen (PRIV2 (shlib->abfd, hdr_data.hdr_t_name));
8667 	  memcpy (shl->imgnam + 1, PRIV2 (shlib->abfd, hdr_data.hdr_t_name),
8668 		  shl->imgnam[0]);
8669 
8670 	  off += sizeof (struct vms_shl);
8671 	}
8672 
8673       /* CA fixups.  */
8674       if (ca_sz != 0)
8675 	{
8676 	  bfd_putl32 (off, eiaf->codeadroff);
8677 
8678 	  for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8679 	    {
8680 	      struct alpha_vms_shlib_el *shlib;
8681 	      unsigned int j;
8682 
8683 	      shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8684 
8685 	      if (VEC_COUNT (shlib->ca) == 0)
8686 		continue;
8687 
8688 	      bfd_putl32 (VEC_COUNT (shlib->ca), content + off);
8689 	      bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8690 	      off += 8;
8691 
8692 	      for (j = 0; j < VEC_COUNT (shlib->ca); j++)
8693 		{
8694 		  bfd_putl32 (VEC_EL (shlib->ca, bfd_vma, j) - t->base_addr,
8695 			      content + off);
8696 		  off += 4;
8697 		}
8698 	    }
8699 
8700 	  bfd_putl32 (0, content + off);
8701 	  bfd_putl32 (0, content + off + 4);
8702 	  off += 8;
8703 	}
8704 
8705       /* LP fixups.  */
8706       if (lp_sz != 0)
8707 	{
8708 	  bfd_putl32 (off, eiaf->lpfixoff);
8709 
8710 	  for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8711 	    {
8712 	      struct alpha_vms_shlib_el *shlib;
8713 	      unsigned int j;
8714 
8715 	      shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8716 
8717 	      if (VEC_COUNT (shlib->lp) == 0)
8718 		continue;
8719 
8720 	      bfd_putl32 (VEC_COUNT (shlib->lp), content + off);
8721 	      bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8722 	      off += 8;
8723 
8724 	      for (j = 0; j < VEC_COUNT (shlib->lp); j++)
8725 		{
8726 		  bfd_putl32 (VEC_EL (shlib->lp, bfd_vma, j) - t->base_addr,
8727 			      content + off);
8728 		  off += 4;
8729 		}
8730 	    }
8731 
8732 	  bfd_putl32 (0, content + off);
8733 	  bfd_putl32 (0, content + off + 4);
8734 	  off += 8;
8735 	}
8736 
8737       /* QR fixups.  */
8738       if (qr_sz != 0)
8739 	{
8740 	  bfd_putl32 (off, eiaf->qdotadroff);
8741 
8742 	  for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8743 	    {
8744 	      struct alpha_vms_shlib_el *shlib;
8745 	      unsigned int j;
8746 
8747 	      shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8748 
8749 	      if (VEC_COUNT (shlib->qr) == 0)
8750 		continue;
8751 
8752 	      bfd_putl32 (VEC_COUNT (shlib->qr), content + off);
8753 	      bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8754 	      off += 8;
8755 
8756 	      for (j = 0; j < VEC_COUNT (shlib->qr); j++)
8757 		{
8758 		  struct alpha_vms_vma_ref *r;
8759 		  r = &VEC_EL (shlib->qr, struct alpha_vms_vma_ref, j);
8760 		  bfd_putl32 (r->vma - t->base_addr, content + off);
8761 		  bfd_putl32 (r->ref, content + off + 4);
8762 		  off += 8;
8763 		}
8764 	    }
8765 
8766 	  bfd_putl32 (0, content + off);
8767 	  bfd_putl32 (0, content + off + 4);
8768 	  off += 8;
8769 	}
8770     }
8771 
8772   /* Write the change protection table.  */
8773   bfd_putl32 (off, eiaf->chgprtoff);
8774   bfd_putl32 (chgprt_num, content + off);
8775   off += 4;
8776 
8777   for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
8778     {
8779       struct vms_eicp *eicp;
8780       unsigned int prot;
8781 
8782       if ((sec->flags & SEC_LINKER_CREATED) != 0 &&
8783 	  strcmp (sec->name, "$FIXUP$") == 0)
8784 	prot = PRT__C_UREW;
8785       else if ((sec->flags & SEC_RELOC) != 0
8786 	       && (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
8787 	prot = PRT__C_UR;
8788       else
8789 	continue;
8790 
8791       eicp = (struct vms_eicp *)(content + off);
8792       bfd_putl64 (sec->vma - t->base_addr, eicp->baseva);
8793       bfd_putl32 ((sec->size + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1),
8794 		  eicp->size);
8795       bfd_putl32 (prot, eicp->newprt);
8796       off += sizeof (struct vms_eicp);
8797     }
8798 
8799   return TRUE;
8800 }
8801 
8802 /* Called by bfd_hash_traverse to fill the symbol table.
8803    Return FALSE in case of failure.  */
8804 
8805 static bfd_boolean
8806 alpha_vms_link_output_symbol (struct bfd_hash_entry *bh, void *infov)
8807 {
8808   struct bfd_link_hash_entry *hc = (struct bfd_link_hash_entry *) bh;
8809   struct bfd_link_info *info = (struct bfd_link_info *)infov;
8810   struct alpha_vms_link_hash_entry *h;
8811   struct vms_symbol_entry *sym;
8812 
8813   if (hc->type == bfd_link_hash_warning)
8814     {
8815       hc = hc->u.i.link;
8816       if (hc->type == bfd_link_hash_new)
8817 	return TRUE;
8818     }
8819   h = (struct alpha_vms_link_hash_entry *) hc;
8820 
8821   switch (h->root.type)
8822     {
8823     case bfd_link_hash_undefined:
8824       return TRUE;
8825     case bfd_link_hash_new:
8826     case bfd_link_hash_warning:
8827       abort ();
8828     case bfd_link_hash_undefweak:
8829       return TRUE;
8830     case bfd_link_hash_defined:
8831     case bfd_link_hash_defweak:
8832       {
8833 	asection *sec = h->root.u.def.section;
8834 
8835 	/* FIXME: this is certainly a symbol from a dynamic library.  */
8836 	if (bfd_is_abs_section (sec))
8837 	  return TRUE;
8838 
8839 	if (sec->owner->flags & DYNAMIC)
8840 	  return TRUE;
8841       }
8842       break;
8843     case bfd_link_hash_common:
8844       break;
8845     case bfd_link_hash_indirect:
8846       return TRUE;
8847     }
8848 
8849   /* Do not write not kept symbols.  */
8850   if (info->strip == strip_some
8851       && bfd_hash_lookup (info->keep_hash, h->root.root.string,
8852 			  FALSE, FALSE) != NULL)
8853     return TRUE;
8854 
8855   if (h->sym == NULL)
8856     {
8857       /* This symbol doesn't come from a VMS object.  So we suppose it is
8858 	 a data.  */
8859       int len = strlen (h->root.root.string);
8860 
8861       sym = (struct vms_symbol_entry *)bfd_zalloc (info->output_bfd,
8862 						   sizeof (*sym) + len);
8863       if (sym == NULL)
8864 	abort ();
8865       sym->namelen = len;
8866       memcpy (sym->name, h->root.root.string, len);
8867       sym->name[len] = 0;
8868       sym->owner = info->output_bfd;
8869 
8870       sym->typ = EGSD__C_SYMG;
8871       sym->data_type = 0;
8872       sym->flags = EGSY__V_DEF | EGSY__V_REL;
8873       sym->symbol_vector = h->root.u.def.value;
8874       sym->section = h->root.u.def.section;
8875       sym->value = h->root.u.def.value;
8876     }
8877   else
8878     sym = h->sym;
8879 
8880   if (!add_symbol_entry (info->output_bfd, sym))
8881     return FALSE;
8882 
8883   return TRUE;
8884 }
8885 
8886 static bfd_boolean
8887 alpha_vms_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
8888 {
8889   asection *o;
8890   struct bfd_link_order *p;
8891   bfd *sub;
8892   asection *fixupsec;
8893   bfd_vma base_addr;
8894   bfd_vma last_addr;
8895   asection *dst;
8896   asection *dmt;
8897 
8898   if (bfd_link_relocatable (info))
8899     {
8900       /* FIXME: we do not yet support relocatable link.  It is not obvious
8901 	 how to do it for debug infos.  */
8902       (*info->callbacks->einfo)(_("%P: relocatable link is not supported\n"));
8903       return FALSE;
8904     }
8905 
8906   bfd_get_outsymbols (abfd) = NULL;
8907   bfd_get_symcount (abfd) = 0;
8908 
8909   /* Mark all sections which will be included in the output file.  */
8910   for (o = abfd->sections; o != NULL; o = o->next)
8911     for (p = o->map_head.link_order; p != NULL; p = p->next)
8912       if (p->type == bfd_indirect_link_order)
8913 	p->u.indirect.section->linker_mark = TRUE;
8914 
8915 #if 0
8916   /* Handle all the link order information for the sections.  */
8917   for (o = abfd->sections; o != NULL; o = o->next)
8918     {
8919       printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
8920 	      o->name, (unsigned)o->vma, (unsigned)o->flags);
8921 
8922       for (p = o->map_head.link_order; p != NULL; p = p->next)
8923 	{
8924 	  printf (" at 0x%08x - 0x%08x: ",
8925 		  (unsigned)p->offset, (unsigned)(p->offset + p->size - 1));
8926 	  switch (p->type)
8927 	    {
8928 	    case bfd_section_reloc_link_order:
8929 	    case bfd_symbol_reloc_link_order:
8930 	      printf ("  section/symbol reloc\n");
8931 	      break;
8932 	    case bfd_indirect_link_order:
8933 	      printf ("  section %s of %s\n",
8934 		      p->u.indirect.section->name,
8935 		      p->u.indirect.section->owner->filename);
8936 	      break;
8937 	    case bfd_data_link_order:
8938 	      printf ("  explicit data\n");
8939 	      break;
8940 	    default:
8941 	      printf ("  *unknown* type %u\n", p->type);
8942 	      break;
8943 	    }
8944 	}
8945     }
8946 #endif
8947 
8948   /* Generate the symbol table.  */
8949   BFD_ASSERT (PRIV (syms) == NULL);
8950   if (info->strip != strip_all)
8951     bfd_hash_traverse (&info->hash->table, alpha_vms_link_output_symbol, info);
8952 
8953   /* Find the entry point.  */
8954   if (bfd_get_start_address (abfd) == 0)
8955     {
8956       bfd *startbfd = NULL;
8957 
8958       for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
8959 	{
8960 	  /* Consider only VMS object files.  */
8961 	  if (sub->xvec != abfd->xvec)
8962 	    continue;
8963 
8964 	  if (!PRIV2 (sub, eom_data).eom_has_transfer)
8965 	    continue;
8966 	  if ((PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR) && startbfd)
8967 	    continue;
8968 	  if (startbfd != NULL
8969 	      && !(PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR))
8970 	    {
8971 	      (*info->callbacks->einfo)
8972 		/* xgettext:c-format */
8973 		(_("%P: multiple entry points: in modules %pB and %pB\n"),
8974 		 startbfd, sub);
8975 	      continue;
8976 	    }
8977 	  startbfd = sub;
8978 	}
8979 
8980       if (startbfd)
8981 	{
8982 	  unsigned int ps_idx = PRIV2 (startbfd, eom_data).eom_l_psindx;
8983 	  bfd_vma tfradr = PRIV2 (startbfd, eom_data).eom_l_tfradr;
8984 	  asection *sec;
8985 
8986 	  sec = PRIV2 (startbfd, sections)[ps_idx];
8987 
8988 	  bfd_set_start_address
8989 	    (abfd, sec->output_section->vma + sec->output_offset + tfradr);
8990 	}
8991     }
8992 
8993   /* Set transfer addresses.  */
8994   {
8995     int i;
8996     struct bfd_link_hash_entry *h;
8997 
8998     i = 0;
8999     PRIV (transfer_address[i++]) = 0xffffffff00000340ULL;	/* SYS$IMGACT */
9000     h = bfd_link_hash_lookup (info->hash, "LIB$INITIALIZE", FALSE, FALSE, TRUE);
9001     if (h != NULL && h->type == bfd_link_hash_defined)
9002       PRIV (transfer_address[i++]) =
9003 	alpha_vms_get_sym_value (h->u.def.section, h->u.def.value);
9004     PRIV (transfer_address[i++]) = bfd_get_start_address (abfd);
9005     while (i < 4)
9006       PRIV (transfer_address[i++]) = 0;
9007   }
9008 
9009   /* Allocate contents.
9010      Also compute the virtual base address.  */
9011   base_addr = (bfd_vma)-1;
9012   last_addr = 0;
9013   for (o = abfd->sections; o != NULL; o = o->next)
9014     {
9015       if (o->flags & SEC_HAS_CONTENTS)
9016 	{
9017 	  o->contents = bfd_alloc (abfd, o->size);
9018 	  if (o->contents == NULL)
9019 	    return FALSE;
9020 	}
9021       if (o->flags & SEC_LOAD)
9022 	{
9023 	  if (o->vma < base_addr)
9024 	    base_addr = o->vma;
9025 	  if (o->vma + o->size > last_addr)
9026 	    last_addr = o->vma + o->size;
9027 	}
9028       /* Clear the RELOC flags.  Currently we don't support incremental
9029 	 linking.  We use the RELOC flag for computing the eicp entries.  */
9030       o->flags &= ~SEC_RELOC;
9031     }
9032 
9033   /* Create the fixup section.  */
9034   fixupsec = bfd_make_section_anyway_with_flags
9035     (info->output_bfd, "$FIXUP$",
9036      SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
9037   if (fixupsec == NULL)
9038     return FALSE;
9039   last_addr = (last_addr + 0xffff) & ~0xffff;
9040   fixupsec->vma = last_addr;
9041 
9042   alpha_vms_link_hash (info)->fixup = fixupsec;
9043   alpha_vms_link_hash (info)->base_addr = base_addr;
9044 
9045   /* Create the DMT section, if necessary.  */
9046   BFD_ASSERT (PRIV (dst_section) == NULL);
9047   dst = bfd_get_section_by_name (abfd, "$DST$");
9048   if (dst != NULL && dst->size == 0)
9049     dst = NULL;
9050   if (dst != NULL)
9051     {
9052       PRIV (dst_section) = dst;
9053       dmt = bfd_make_section_anyway_with_flags
9054 	(info->output_bfd, "$DMT$",
9055 	 SEC_DEBUGGING | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
9056       if (dmt == NULL)
9057 	return FALSE;
9058     }
9059   else
9060     dmt = NULL;
9061 
9062   /* Read all sections from the inputs.  */
9063   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
9064     {
9065       if (sub->flags & DYNAMIC)
9066 	{
9067 	  alpha_vms_create_eisd_for_shared (abfd, sub);
9068 	  continue;
9069 	}
9070 
9071       if (!alpha_vms_read_sections_content (sub, info))
9072 	return FALSE;
9073     }
9074 
9075   /* Handle all the link order information for the sections.
9076      Note: past this point, it is not possible to create new sections.  */
9077   for (o = abfd->sections; o != NULL; o = o->next)
9078     {
9079       for (p = o->map_head.link_order; p != NULL; p = p->next)
9080 	{
9081 	  switch (p->type)
9082 	    {
9083 	    case bfd_section_reloc_link_order:
9084 	    case bfd_symbol_reloc_link_order:
9085 	      abort ();
9086 	      return FALSE;
9087 	    case bfd_indirect_link_order:
9088 	      /* Already done.  */
9089 	      break;
9090 	    default:
9091 	      if (! _bfd_default_link_order (abfd, info, o, p))
9092 		return FALSE;
9093 	      break;
9094 	    }
9095 	}
9096     }
9097 
9098   /* Compute fixups.  */
9099   if (!alpha_vms_build_fixups (info))
9100     return FALSE;
9101 
9102   /* Compute the DMT.  */
9103   if (dmt != NULL)
9104     {
9105       int pass;
9106       unsigned char *contents = NULL;
9107 
9108       /* In pass 1, compute the size.  In pass 2, write the DMT contents.  */
9109       for (pass = 0; pass < 2; pass++)
9110 	{
9111 	  unsigned int off = 0;
9112 
9113 	  /* For each object file (ie for each module).  */
9114 	  for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
9115 	    {
9116 	      asection *sub_dst;
9117 	      struct vms_dmt_header *dmth = NULL;
9118 	      unsigned int psect_count;
9119 
9120 	      /* Skip this module if it has no DST.  */
9121 	      sub_dst = PRIV2 (sub, dst_section);
9122 	      if (sub_dst == NULL || sub_dst->size == 0)
9123 		continue;
9124 
9125 	      if (pass == 1)
9126 		{
9127 		  /* Write the header.  */
9128 		  dmth = (struct vms_dmt_header *)(contents + off);
9129 		  bfd_putl32 (sub_dst->output_offset, dmth->modbeg);
9130 		  bfd_putl32 (sub_dst->size, dmth->size);
9131 		}
9132 
9133 	      off += sizeof (struct vms_dmt_header);
9134 	      psect_count = 0;
9135 
9136 	      /* For each section (ie for each psect).  */
9137 	      for (o = sub->sections; o != NULL; o = o->next)
9138 		{
9139 		  /* Only consider interesting sections.  */
9140 		  if (!(o->flags & SEC_ALLOC))
9141 		    continue;
9142 		  if (o->flags & SEC_LINKER_CREATED)
9143 		    continue;
9144 
9145 		  if (pass == 1)
9146 		    {
9147 		      /* Write an entry.  */
9148 		      struct vms_dmt_psect *dmtp;
9149 
9150 		      dmtp = (struct vms_dmt_psect *)(contents + off);
9151 		      bfd_putl32 (o->output_offset + o->output_section->vma,
9152 				  dmtp->start);
9153 		      bfd_putl32 (o->size, dmtp->length);
9154 		      psect_count++;
9155 		    }
9156 		  off += sizeof (struct vms_dmt_psect);
9157 		}
9158 	      if (pass == 1)
9159 		bfd_putl32 (psect_count, dmth->psect_count);
9160 	    }
9161 
9162 	  if (pass == 0)
9163 	    {
9164 	      contents = bfd_zalloc (info->output_bfd, off);
9165 	      if (contents == NULL)
9166 		return FALSE;
9167 	      dmt->contents = contents;
9168 	      dmt->size = off;
9169 	    }
9170 	  else
9171 	    {
9172 	      BFD_ASSERT (off == dmt->size);
9173 	    }
9174 	}
9175     }
9176 
9177   return TRUE;
9178 }
9179 
9180 /* Read the contents of a section.
9181    buf points to a buffer of buf_size bytes to be filled with
9182    section data (starting at offset into section)  */
9183 
9184 static bfd_boolean
9185 alpha_vms_get_section_contents (bfd *abfd, asection *section,
9186 				void *buf, file_ptr offset,
9187 				bfd_size_type count)
9188 {
9189   asection *sec;
9190 
9191   /* Image are easy.  */
9192   if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
9193     return _bfd_generic_get_section_contents (abfd, section,
9194 					      buf, offset, count);
9195 
9196   /* Safety check.  */
9197   if (offset + count < count
9198       || offset + count > section->size)
9199     {
9200       bfd_set_error (bfd_error_invalid_operation);
9201       return FALSE;
9202     }
9203 
9204   /* If the section is already in memory, just copy it.  */
9205   if (section->flags & SEC_IN_MEMORY)
9206     {
9207       BFD_ASSERT (section->contents != NULL);
9208       memcpy (buf, section->contents + offset, count);
9209       return TRUE;
9210     }
9211   if (section->size == 0)
9212     return TRUE;
9213 
9214   /* Alloc in memory and read ETIRs.  */
9215   for (sec = abfd->sections; sec; sec = sec->next)
9216     {
9217       BFD_ASSERT (sec->contents == NULL);
9218 
9219       if (sec->size != 0 && (sec->flags & SEC_HAS_CONTENTS))
9220 	{
9221 	  sec->contents = bfd_alloc (abfd, sec->size);
9222 	  if (sec->contents == NULL)
9223 	    return FALSE;
9224 	}
9225     }
9226   if (!alpha_vms_read_sections_content (abfd, NULL))
9227     return FALSE;
9228   for (sec = abfd->sections; sec; sec = sec->next)
9229     if (sec->contents)
9230       sec->flags |= SEC_IN_MEMORY;
9231   memcpy (buf, section->contents + offset, count);
9232   return TRUE;
9233 }
9234 
9235 
9236 /* Set the format of a file being written.  */
9237 
9238 static bfd_boolean
9239 alpha_vms_mkobject (bfd * abfd)
9240 {
9241   const bfd_arch_info_type *arch;
9242 
9243   vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd));
9244 
9245   if (!vms_initialize (abfd))
9246     return FALSE;
9247 
9248   PRIV (recwr.buf) = bfd_alloc (abfd, MAX_OUTREC_SIZE);
9249   if (PRIV (recwr.buf) == NULL)
9250     return FALSE;
9251 
9252   arch = bfd_scan_arch ("alpha");
9253 
9254   if (arch == 0)
9255     {
9256       bfd_set_error (bfd_error_wrong_format);
9257       return FALSE;
9258     }
9259 
9260   abfd->arch_info = arch;
9261   return TRUE;
9262 }
9263 
9264 
9265 /* 4.1, generic.  */
9266 
9267 /* Called when the BFD is being closed to do any necessary cleanup.  */
9268 
9269 static bfd_boolean
9270 vms_close_and_cleanup (bfd * abfd)
9271 {
9272   vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd));
9273 
9274   if (abfd == NULL || abfd->tdata.any == NULL)
9275     return TRUE;
9276 
9277   if (abfd->format == bfd_archive)
9278     {
9279       bfd_release (abfd, abfd->tdata.any);
9280       abfd->tdata.any = NULL;
9281       return TRUE;
9282     }
9283 
9284   if (PRIV (recrd.buf) != NULL)
9285     free (PRIV (recrd.buf));
9286 
9287   if (PRIV (sections) != NULL)
9288     free (PRIV (sections));
9289 
9290   bfd_release (abfd, abfd->tdata.any);
9291   abfd->tdata.any = NULL;
9292 
9293 #ifdef VMS
9294   if (abfd->direction == write_direction)
9295     {
9296       /* Last step on VMS is to convert the file to variable record length
9297 	 format.  */
9298       if (!bfd_cache_close (abfd))
9299 	return FALSE;
9300       if (!_bfd_vms_convert_to_var_unix_filename (abfd->filename))
9301 	return FALSE;
9302     }
9303 #endif
9304 
9305   return TRUE;
9306 }
9307 
9308 /* Called when a new section is created.  */
9309 
9310 static bfd_boolean
9311 vms_new_section_hook (bfd * abfd, asection *section)
9312 {
9313   bfd_size_type amt;
9314 
9315   vms_debug2 ((1, "vms_new_section_hook (%p, [%u]%s)\n",
9316 	       abfd, section->index, section->name));
9317 
9318   if (! bfd_set_section_alignment (abfd, section, 0))
9319     return FALSE;
9320 
9321   vms_debug2 ((7, "%u: %s\n", section->index, section->name));
9322 
9323   amt = sizeof (struct vms_section_data_struct);
9324   section->used_by_bfd = bfd_zalloc (abfd, amt);
9325   if (section->used_by_bfd == NULL)
9326     return FALSE;
9327 
9328   /* Create the section symbol.  */
9329   return _bfd_generic_new_section_hook (abfd, section);
9330 }
9331 
9332 /* Part 4.5, symbols.  */
9333 
9334 /* Print symbol to file according to how. how is one of
9335    bfd_print_symbol_name	just print the name
9336    bfd_print_symbol_more	print more (???)
9337    bfd_print_symbol_all	print all we know, which is not much right now :-).  */
9338 
9339 static void
9340 vms_print_symbol (bfd * abfd,
9341 		  void * file,
9342 		  asymbol *symbol,
9343 		  bfd_print_symbol_type how)
9344 {
9345   vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
9346 	       abfd, file, symbol, how));
9347 
9348   switch (how)
9349     {
9350       case bfd_print_symbol_name:
9351       case bfd_print_symbol_more:
9352 	fprintf ((FILE *)file," %s", symbol->name);
9353       break;
9354 
9355       case bfd_print_symbol_all:
9356 	{
9357 	  const char *section_name = symbol->section->name;
9358 
9359 	  bfd_print_symbol_vandf (abfd, file, symbol);
9360 
9361 	  fprintf ((FILE *) file," %-8s %s", section_name, symbol->name);
9362 	}
9363       break;
9364     }
9365 }
9366 
9367 /* Return information about symbol in ret.
9368 
9369    fill type, value and name
9370    type:
9371 	A	absolute
9372 	B	bss segment symbol
9373 	C	common symbol
9374 	D	data segment symbol
9375 	f	filename
9376 	t	a static function symbol
9377 	T	text segment symbol
9378 	U	undefined
9379 	-	debug.  */
9380 
9381 static void
9382 vms_get_symbol_info (bfd * abfd ATTRIBUTE_UNUSED,
9383 		     asymbol *symbol,
9384 		     symbol_info *ret)
9385 {
9386   asection *sec;
9387 
9388   vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd, symbol, ret));
9389 
9390   sec = symbol->section;
9391 
9392   if (ret == NULL)
9393     return;
9394 
9395   if (sec == NULL)
9396     ret->type = 'U';
9397   else if (bfd_is_com_section (sec))
9398     ret->type = 'C';
9399   else if (bfd_is_abs_section (sec))
9400     ret->type = 'A';
9401   else if (bfd_is_und_section (sec))
9402     ret->type = 'U';
9403   else if (bfd_is_ind_section (sec))
9404     ret->type = 'I';
9405   else if ((symbol->flags & BSF_FUNCTION)
9406 	   || (bfd_get_section_flags (abfd, sec) & SEC_CODE))
9407     ret->type = 'T';
9408   else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
9409     ret->type = 'D';
9410   else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
9411     ret->type = 'B';
9412   else
9413     ret->type = '?';
9414 
9415   if (ret->type != 'U')
9416     ret->value = symbol->value + symbol->section->vma;
9417   else
9418     ret->value = 0;
9419   ret->name = symbol->name;
9420 }
9421 
9422 /* Return TRUE if the given symbol sym in the BFD abfd is
9423    a compiler generated local label, else return FALSE.  */
9424 
9425 static bfd_boolean
9426 vms_bfd_is_local_label_name (bfd * abfd ATTRIBUTE_UNUSED,
9427 			     const char *name)
9428 {
9429   return name[0] == '$';
9430 }
9431 
9432 /* Part 4.7, writing an object file.  */
9433 
9434 /* Sets the contents of the section section in BFD abfd to the data starting
9435    in memory at LOCATION. The data is written to the output section starting
9436    at offset offset for count bytes.
9437 
9438    Normally TRUE is returned, else FALSE. Possible error returns are:
9439    o bfd_error_no_contents - The output section does not have the
9440 	SEC_HAS_CONTENTS attribute, so nothing can be written to it.
9441    o and some more too  */
9442 
9443 static bfd_boolean
9444 _bfd_vms_set_section_contents (bfd * abfd,
9445 			       asection *section,
9446 			       const void * location,
9447 			       file_ptr offset,
9448 			       bfd_size_type count)
9449 {
9450   if (section->contents == NULL)
9451     {
9452       section->contents = bfd_alloc (abfd, section->size);
9453       if (section->contents == NULL)
9454 	return FALSE;
9455 
9456       memcpy (section->contents + offset, location, (size_t) count);
9457     }
9458 
9459   return TRUE;
9460 }
9461 
9462 /* Set the architecture and machine type in BFD abfd to arch and mach.
9463    Find the correct pointer to a structure and insert it into the arch_info
9464    pointer.  */
9465 
9466 static bfd_boolean
9467 alpha_vms_set_arch_mach (bfd *abfd,
9468 			 enum bfd_architecture arch, unsigned long mach)
9469 {
9470   if (arch != bfd_arch_alpha
9471       && arch != bfd_arch_unknown)
9472     return FALSE;
9473 
9474   return bfd_default_set_arch_mach (abfd, arch, mach);
9475 }
9476 
9477 /* Set section VMS flags.  Clear NO_FLAGS and set FLAGS.  */
9478 
9479 void
9480 bfd_vms_set_section_flags (bfd *abfd ATTRIBUTE_UNUSED,
9481 			   asection *sec, flagword no_flags, flagword flags)
9482 {
9483   vms_section_data (sec)->no_flags = no_flags;
9484   vms_section_data (sec)->flags = flags;
9485 }
9486 
9487 struct vms_private_data_struct *
9488 bfd_vms_get_data (bfd *abfd)
9489 {
9490   return (struct vms_private_data_struct *)abfd->tdata.any;
9491 }
9492 
9493 #define vms_bfd_is_target_special_symbol  _bfd_bool_bfd_asymbol_false
9494 #define vms_bfd_link_just_syms		  _bfd_generic_link_just_syms
9495 #define vms_bfd_copy_link_hash_symbol_type \
9496   _bfd_generic_copy_link_hash_symbol_type
9497 #define vms_bfd_is_group_section	  bfd_generic_is_group_section
9498 #define vms_bfd_discard_group		  bfd_generic_discard_group
9499 #define vms_section_already_linked	  _bfd_generic_section_already_linked
9500 #define vms_bfd_define_common_symbol	  bfd_generic_define_common_symbol
9501 #define vms_bfd_link_hide_symbol	  _bfd_generic_link_hide_symbol
9502 #define vms_bfd_define_start_stop         bfd_generic_define_start_stop
9503 #define vms_bfd_copy_private_header_data  _bfd_generic_bfd_copy_private_header_data
9504 
9505 #define vms_bfd_copy_private_bfd_data	  _bfd_generic_bfd_copy_private_bfd_data
9506 #define vms_bfd_free_cached_info	  _bfd_generic_bfd_free_cached_info
9507 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
9508 #define vms_bfd_copy_private_symbol_data  _bfd_generic_bfd_copy_private_symbol_data
9509 #define vms_bfd_set_private_flags	  _bfd_generic_bfd_set_private_flags
9510 #define vms_bfd_merge_private_bfd_data	  _bfd_generic_bfd_merge_private_bfd_data
9511 
9512 /* Symbols table.  */
9513 #define alpha_vms_make_empty_symbol	   _bfd_generic_make_empty_symbol
9514 #define alpha_vms_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
9515 #define alpha_vms_print_symbol		   vms_print_symbol
9516 #define alpha_vms_get_symbol_info	   vms_get_symbol_info
9517 #define alpha_vms_get_symbol_version_string \
9518   _bfd_nosymbols_get_symbol_version_string
9519 
9520 #define alpha_vms_read_minisymbols	   _bfd_generic_read_minisymbols
9521 #define alpha_vms_minisymbol_to_symbol	   _bfd_generic_minisymbol_to_symbol
9522 #define alpha_vms_get_lineno		   _bfd_nosymbols_get_lineno
9523 #define alpha_vms_find_inliner_info	   _bfd_nosymbols_find_inliner_info
9524 #define alpha_vms_bfd_make_debug_symbol	   _bfd_nosymbols_bfd_make_debug_symbol
9525 #define alpha_vms_find_nearest_line	   _bfd_vms_find_nearest_line
9526 #define alpha_vms_find_line		   _bfd_nosymbols_find_line
9527 #define alpha_vms_bfd_is_local_label_name  vms_bfd_is_local_label_name
9528 
9529 /* Generic table.  */
9530 #define alpha_vms_close_and_cleanup	   vms_close_and_cleanup
9531 #define alpha_vms_bfd_free_cached_info	   vms_bfd_free_cached_info
9532 #define alpha_vms_new_section_hook	   vms_new_section_hook
9533 #define alpha_vms_set_section_contents	   _bfd_vms_set_section_contents
9534 #define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
9535 
9536 #define alpha_vms_bfd_get_relocated_section_contents \
9537   bfd_generic_get_relocated_section_contents
9538 
9539 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
9540 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
9541 #define alpha_vms_bfd_lookup_section_flags bfd_generic_lookup_section_flags
9542 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
9543 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
9544 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
9545 #define alpha_vms_section_already_linked \
9546   _bfd_generic_section_already_linked
9547 
9548 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9549 #define alpha_vms_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
9550 #define alpha_vms_bfd_define_start_stop bfd_generic_define_start_stop
9551 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
9552 #define alpha_vms_bfd_copy_link_hash_symbol_type \
9553   _bfd_generic_copy_link_hash_symbol_type
9554 
9555 #define alpha_vms_bfd_link_split_section  _bfd_generic_link_split_section
9556 
9557 #define alpha_vms_get_dynamic_symtab_upper_bound \
9558   _bfd_nodynamic_get_dynamic_symtab_upper_bound
9559 #define alpha_vms_canonicalize_dynamic_symtab \
9560   _bfd_nodynamic_canonicalize_dynamic_symtab
9561 #define alpha_vms_get_dynamic_reloc_upper_bound \
9562   _bfd_nodynamic_get_dynamic_reloc_upper_bound
9563 #define alpha_vms_canonicalize_dynamic_reloc \
9564   _bfd_nodynamic_canonicalize_dynamic_reloc
9565 #define alpha_vms_bfd_link_check_relocs		     _bfd_generic_link_check_relocs
9566 
9567 const bfd_target alpha_vms_vec =
9568 {
9569   "vms-alpha",			/* Name.  */
9570   bfd_target_evax_flavour,
9571   BFD_ENDIAN_LITTLE,		/* Data byte order is little.  */
9572   BFD_ENDIAN_LITTLE,		/* Header byte order is little.  */
9573 
9574   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
9575    | WP_TEXT | D_PAGED),	/* Object flags.  */
9576   (SEC_ALLOC | SEC_LOAD | SEC_RELOC
9577    | SEC_READONLY | SEC_CODE | SEC_DATA
9578    | SEC_HAS_CONTENTS | SEC_IN_MEMORY),		/* Sect flags.  */
9579   0,				/* symbol_leading_char.  */
9580   ' ',				/* ar_pad_char.  */
9581   15,				/* ar_max_namelen.  */
9582   0,				/* match priority.  */
9583   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9584   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9585   bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9586   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9587   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9588   bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9589 
9590   {				/* bfd_check_format.  */
9591     _bfd_dummy_target,
9592     alpha_vms_object_p,
9593     _bfd_vms_lib_alpha_archive_p,
9594     _bfd_dummy_target
9595   },
9596   {				/* bfd_set_format.  */
9597     _bfd_bool_bfd_false_error,
9598     alpha_vms_mkobject,
9599     _bfd_vms_lib_alpha_mkarchive,
9600     _bfd_bool_bfd_false_error
9601   },
9602   {				/* bfd_write_contents.  */
9603     _bfd_bool_bfd_false_error,
9604     alpha_vms_write_object_contents,
9605     _bfd_vms_lib_write_archive_contents,
9606     _bfd_bool_bfd_false_error
9607   },
9608 
9609   BFD_JUMP_TABLE_GENERIC (alpha_vms),
9610   BFD_JUMP_TABLE_COPY (vms),
9611   BFD_JUMP_TABLE_CORE (_bfd_nocore),
9612   BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib),
9613   BFD_JUMP_TABLE_SYMBOLS (alpha_vms),
9614   BFD_JUMP_TABLE_RELOCS (alpha_vms),
9615   BFD_JUMP_TABLE_WRITE (alpha_vms),
9616   BFD_JUMP_TABLE_LINK (alpha_vms),
9617   BFD_JUMP_TABLE_DYNAMIC (alpha_vms),
9618 
9619   NULL,
9620 
9621   NULL
9622 };
9623