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