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   int subtype = -1;
6114   int extra;
6115 
6116   if (rec_len >= sizeof (*emh))
6117     subtype = bfd_getl16 (emh->subtyp);
6118 
6119   /* xgettext:c-format */
6120   fprintf (file, _("  EMH %d (len=%u): "), subtype, rec_len);
6121 
6122   /* PR 21618: Check for invalid lengths.  */
6123   if (rec_len < sizeof (*emh))
6124     {
6125       fprintf (file, _("   Error: %s min length is %u\n"),
6126                  "EMH", (unsigned) sizeof (*emh));
6127       return;
6128     }
6129 
6130   extra = rec_len - sizeof (struct vms_emh_common);
6131 
6132   switch (subtype)
6133     {
6134     case EMH__C_MHD:
6135       {
6136           struct vms_emh_mhd *mhd = (struct vms_emh_mhd *) rec;
6137           unsigned char *name;
6138           unsigned char *nextname;
6139           unsigned char *maxname;
6140 
6141           /* PR 21840: Check for invalid lengths.  */
6142           if (rec_len < sizeof (* mhd))
6143             {
6144               fprintf (file, _("   Error: %s min length is %u\n"),
6145                          "EMH_MHD", (unsigned) sizeof (*mhd));
6146               return;
6147             }
6148           fprintf (file, _("Module header\n"));
6149           fprintf (file, _("   structure level: %u\n"), mhd->strlvl);
6150           fprintf (file, _("   max record size: %u\n"),
6151                      (unsigned) bfd_getl32 (mhd->recsiz));
6152           name = (unsigned char *) (mhd + 1);
6153           maxname = (unsigned char *) rec + rec_len;
6154           if (name > maxname - 2)
6155             {
6156               fprintf (file, _("   Error: The module name is missing\n"));
6157               return;
6158             }
6159           nextname = name + name[0] + 1;
6160           if (nextname >= maxname)
6161             {
6162               fprintf (file, _("   Error: The module name is too long\n"));
6163               return;
6164             }
6165           fprintf (file, _("   module name    : %.*s\n"), name[0], name + 1);
6166           name = nextname;
6167           if (name > maxname - 2)
6168             {
6169               fprintf (file, _("   Error: The module version is missing\n"));
6170               return;
6171             }
6172           nextname = name + name[0] + 1;
6173           if (nextname >= maxname)
6174             {
6175               fprintf (file, _("   Error: The module version is too long\n"));
6176               return;
6177             }
6178           fprintf (file, _("   module version : %.*s\n"), name[0], name + 1);
6179           name = nextname;
6180           if ((maxname - name) < 17 && maxname[-1] != 0)
6181             fprintf (file, _("   Error: The compile date is truncated\n"));
6182           else
6183             fprintf (file, _("   compile date   : %.17s\n"), name);
6184       }
6185       break;
6186 
6187     case EMH__C_LNM:
6188       fprintf (file, _("Language Processor Name\n"));
6189       fprintf (file, _("   language name: %.*s\n"), extra, (char *)(emh + 1));
6190       break;
6191 
6192     case EMH__C_SRC:
6193       fprintf (file, _("Source Files Header\n"));
6194       fprintf (file, _("   file: %.*s\n"), extra, (char *)(emh + 1));
6195       break;
6196 
6197     case EMH__C_TTL:
6198       fprintf (file, _("Title Text Header\n"));
6199       fprintf (file, _("   title: %.*s\n"), extra, (char *)(emh + 1));
6200       break;
6201 
6202     case EMH__C_CPR:
6203       fprintf (file, _("Copyright Header\n"));
6204       fprintf (file, _("   copyright: %.*s\n"), extra, (char *)(emh + 1));
6205       break;
6206 
6207     default:
6208       fprintf (file, _("unhandled emh subtype %u\n"), subtype);
6209       break;
6210     }
6211 }
6212 
6213 static void
evax_bfd_print_eeom(FILE * file,unsigned char * rec,unsigned int rec_len)6214 evax_bfd_print_eeom (FILE *file, unsigned char *rec, unsigned int rec_len)
6215 {
6216   struct vms_eeom *eeom = (struct vms_eeom *)rec;
6217 
6218   fprintf (file, _("  EEOM (len=%u):\n"), rec_len);
6219 
6220   /* PR 21618: Check for invalid lengths.  */
6221   if (rec_len < 10)
6222     {
6223       fprintf (file, _("   Error: %s min length is %u\n"),
6224                  "EEOM", 10);
6225       return;
6226     }
6227 
6228   fprintf (file, _("   number of cond linkage pairs: %u\n"),
6229              (unsigned)bfd_getl32 (eeom->total_lps));
6230   fprintf (file, _("   completion code: %u\n"),
6231              (unsigned)bfd_getl16 (eeom->comcod));
6232 
6233   if (rec_len >= sizeof (*eeom))
6234     {
6235       fprintf (file, _("   transfer addr flags: 0x%02x\n"), eeom->tfrflg);
6236       fprintf (file, _("   transfer addr psect: %u\n"),
6237                  (unsigned)bfd_getl32 (eeom->psindx));
6238       fprintf (file, _("   transfer address   : 0x%08x\n"),
6239                  (unsigned)bfd_getl32 (eeom->tfradr));
6240     }
6241 }
6242 
6243 static void
exav_bfd_print_egsy_flags(unsigned int flags,FILE * file)6244 exav_bfd_print_egsy_flags (unsigned int flags, FILE *file)
6245 {
6246   if (flags & EGSY__V_WEAK)
6247     fputs (_(" WEAK"), file);
6248   if (flags & EGSY__V_DEF)
6249     fputs (_(" DEF"), file);
6250   if (flags & EGSY__V_UNI)
6251     fputs (_(" UNI"), file);
6252   if (flags & EGSY__V_REL)
6253     fputs (_(" REL"), file);
6254   if (flags & EGSY__V_COMM)
6255     fputs (_(" COMM"), file);
6256   if (flags & EGSY__V_VECEP)
6257     fputs (_(" VECEP"), file);
6258   if (flags & EGSY__V_NORM)
6259     fputs (_(" NORM"), file);
6260   if (flags & EGSY__V_QUAD_VAL)
6261     fputs (_(" QVAL"), file);
6262 }
6263 
6264 static void
evax_bfd_print_egsd_flags(FILE * file,unsigned int flags)6265 evax_bfd_print_egsd_flags (FILE *file, unsigned int flags)
6266 {
6267   if (flags & EGPS__V_PIC)
6268     fputs (_(" PIC"), file);
6269   if (flags & EGPS__V_LIB)
6270     fputs (_(" LIB"), file);
6271   if (flags & EGPS__V_OVR)
6272     fputs (_(" OVR"), file);
6273   if (flags & EGPS__V_REL)
6274     fputs (_(" REL"), file);
6275   if (flags & EGPS__V_GBL)
6276     fputs (_(" GBL"), file);
6277   if (flags & EGPS__V_SHR)
6278     fputs (_(" SHR"), file);
6279   if (flags & EGPS__V_EXE)
6280     fputs (_(" EXE"), file);
6281   if (flags & EGPS__V_RD)
6282     fputs (_(" RD"), file);
6283   if (flags & EGPS__V_WRT)
6284     fputs (_(" WRT"), file);
6285   if (flags & EGPS__V_VEC)
6286     fputs (_(" VEC"), file);
6287   if (flags & EGPS__V_NOMOD)
6288     fputs (_(" NOMOD"), file);
6289   if (flags & EGPS__V_COM)
6290     fputs (_(" COM"), file);
6291   if (flags & EGPS__V_ALLOC_64BIT)
6292     fputs (_(" 64B"), file);
6293 }
6294 
6295 static void
evax_bfd_print_egsd(FILE * file,unsigned char * rec,unsigned int rec_len)6296 evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len)
6297 {
6298   unsigned int off = sizeof (struct vms_egsd);
6299   unsigned int n = 0;
6300 
6301   fprintf (file, _("  EGSD (len=%u):\n"), rec_len);
6302   if (rec_len < sizeof (struct vms_egsd) + sizeof (struct vms_egsd_entry))
6303     return;
6304 
6305   while (off <= rec_len - sizeof (struct vms_egsd_entry))
6306     {
6307       struct vms_egsd_entry *e = (struct vms_egsd_entry *)(rec + off);
6308       unsigned int type;
6309       unsigned int len;
6310       unsigned int rest;
6311 
6312       type = (unsigned)bfd_getl16 (e->gsdtyp);
6313       len = (unsigned)bfd_getl16 (e->gsdsiz);
6314 
6315       /* xgettext:c-format */
6316       fprintf (file, _("  EGSD entry %2u (type: %u, len: %u): "),
6317                  n, type, len);
6318       n++;
6319 
6320       if (len < sizeof (struct vms_egsd_entry) || len > rec_len - off)
6321           {
6322             fprintf (file, _("   Erroneous length\n"));
6323             return;
6324           }
6325 
6326       switch (type)
6327           {
6328           case EGSD__C_PSC:
6329             if (len >= offsetof (struct vms_egps, name))
6330               {
6331                 struct vms_egps *egps = (struct vms_egps *) e;
6332                 unsigned int flags = bfd_getl16 (egps->flags);
6333                 unsigned int l;
6334 
6335                 fprintf (file, _("PSC - Program section definition\n"));
6336                 fprintf (file, _("   alignment  : 2**%u\n"), egps->align);
6337                 fprintf (file, _("   flags      : 0x%04x"), flags);
6338                 evax_bfd_print_egsd_flags (file, flags);
6339                 fputc ('\n', file);
6340                 l = bfd_getl32 (egps->alloc);
6341                 fprintf (file, _("   alloc (len): %u (0x%08x)\n"), l, l);
6342                 rest = len - offsetof (struct vms_egps, name);
6343                 fprintf (file, _("   name       : %.*s\n"),
6344                            egps->namlng > rest ? rest : egps->namlng,
6345                            egps->name);
6346               }
6347             break;
6348           case EGSD__C_SPSC:
6349             if (len >= offsetof (struct vms_esgps, name))
6350               {
6351                 struct vms_esgps *esgps = (struct vms_esgps *) e;
6352                 unsigned int flags = bfd_getl16 (esgps->flags);
6353                 unsigned int l;
6354 
6355                 fprintf (file, _("SPSC - Shared Image Program section def\n"));
6356                 fprintf (file, _("   alignment  : 2**%u\n"), esgps->align);
6357                 fprintf (file, _("   flags      : 0x%04x"), flags);
6358                 evax_bfd_print_egsd_flags (file, flags);
6359                 fputc ('\n', file);
6360                 l = bfd_getl32 (esgps->alloc);
6361                 fprintf (file, _("   alloc (len)   : %u (0x%08x)\n"), l, l);
6362                 fprintf (file, _("   image offset  : 0x%08x\n"),
6363                            (unsigned int) bfd_getl32 (esgps->base));
6364                 fprintf (file, _("   symvec offset : 0x%08x\n"),
6365                            (unsigned int) bfd_getl32 (esgps->value));
6366                 rest = len - offsetof (struct vms_esgps, name);
6367                 fprintf (file, _("   name          : %.*s\n"),
6368                            esgps->namlng > rest ? rest : esgps->namlng,
6369                            esgps->name);
6370               }
6371             break;
6372           case EGSD__C_SYM:
6373             if (len >= sizeof (struct vms_egsy))
6374               {
6375                 struct vms_egsy *egsy = (struct vms_egsy *) e;
6376                 unsigned int flags = bfd_getl16 (egsy->flags);
6377 
6378                 if ((flags & EGSY__V_DEF) != 0
6379                       && len >= offsetof (struct vms_esdf, name))
6380                     {
6381                       struct vms_esdf *esdf = (struct vms_esdf *) e;
6382 
6383                       fprintf (file, _("SYM - Global symbol definition\n"));
6384                       fprintf (file, _("   flags: 0x%04x"), flags);
6385                       exav_bfd_print_egsy_flags (flags, file);
6386                       fputc ('\n', file);
6387                       fprintf (file, _("   psect offset: 0x%08x\n"),
6388                                  (unsigned) bfd_getl32 (esdf->value));
6389                       if (flags & EGSY__V_NORM)
6390                         {
6391                           fprintf (file, _("   code address: 0x%08x\n"),
6392                                      (unsigned) bfd_getl32 (esdf->code_address));
6393                           fprintf (file, _("   psect index for entry point : %u\n"),
6394                                      (unsigned) bfd_getl32 (esdf->ca_psindx));
6395                         }
6396                       fprintf (file, _("   psect index : %u\n"),
6397                                  (unsigned) bfd_getl32 (esdf->psindx));
6398                       rest = len - offsetof (struct vms_esdf, name);
6399                       fprintf (file, _("   name        : %.*s\n"),
6400                                  esdf->namlng > rest ? rest : esdf->namlng,
6401                                  esdf->name);
6402                     }
6403                 else if (len >= offsetof (struct vms_esrf, name))
6404                     {
6405                       struct vms_esrf *esrf = (struct vms_esrf *)e;
6406 
6407                       fprintf (file, _("SYM - Global symbol reference\n"));
6408                       rest = len - offsetof (struct vms_esrf, name);
6409                       fprintf (file, _("   name       : %.*s\n"),
6410                                  esrf->namlng > rest ? rest : esrf->namlng,
6411                                  esrf->name);
6412                     }
6413               }
6414             break;
6415           case EGSD__C_IDC:
6416             if (len >= sizeof (struct vms_eidc))
6417               {
6418                 struct vms_eidc *eidc = (struct vms_eidc *) e;
6419                 unsigned int flags = bfd_getl32 (eidc->flags);
6420                 unsigned char *p;
6421 
6422                 fprintf (file, _("IDC - Ident Consistency check\n"));
6423                 fprintf (file, _("   flags         : 0x%08x"), flags);
6424                 if (flags & EIDC__V_BINIDENT)
6425                     fputs (" BINDENT", file);
6426                 fputc ('\n', file);
6427                 fprintf (file, _("   id match      : %x\n"),
6428                            (flags >> EIDC__V_IDMATCH_SH) & EIDC__V_IDMATCH_MASK);
6429                 fprintf (file, _("   error severity: %x\n"),
6430                            (flags >> EIDC__V_ERRSEV_SH) & EIDC__V_ERRSEV_MASK);
6431                 p = eidc->name;
6432                 rest = len - (p - (unsigned char *) e);
6433                 fprintf (file, _("   entity 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                       fprintf (file, _("   object name   : %.*s\n"),
6440                                  p[0] > rest - 1 ? rest - 1 : p[0], p + 1);
6441                       if (rest > 1u + p[0])
6442                         {
6443                           rest -= 1 + p[0];
6444                           p += 1 + p[0];
6445                           if (flags & EIDC__V_BINIDENT)
6446                               {
6447                                 if (rest >= 4)
6448                                   fprintf (file, _("   binary ident  : 0x%08x\n"),
6449                                              (unsigned) bfd_getl32 (p));
6450                               }
6451                           else
6452                               fprintf (file, _("   ascii ident   : %.*s\n"),
6453                                          p[0] > rest - 1 ? rest - 1 : p[0], p + 1);
6454                         }
6455                     }
6456               }
6457             break;
6458           case EGSD__C_SYMG:
6459             if (len >= offsetof (struct vms_egst, name))
6460               {
6461                 struct vms_egst *egst = (struct vms_egst *) e;
6462                 unsigned int flags = bfd_getl16 (egst->header.flags);
6463 
6464                 fprintf (file, _("SYMG - Universal symbol definition\n"));
6465                 fprintf (file, _("   flags: 0x%04x"), flags);
6466                 exav_bfd_print_egsy_flags (flags, file);
6467                 fputc ('\n', file);
6468                 fprintf (file, _("   symbol vector offset: 0x%08x\n"),
6469                            (unsigned) bfd_getl32 (egst->value));
6470                 fprintf (file, _("   entry point: 0x%08x\n"),
6471                            (unsigned) bfd_getl32 (egst->lp_1));
6472                 fprintf (file, _("   proc descr : 0x%08x\n"),
6473                            (unsigned) bfd_getl32 (egst->lp_2));
6474                 fprintf (file, _("   psect index: %u\n"),
6475                            (unsigned) bfd_getl32 (egst->psindx));
6476                 rest = len - offsetof (struct vms_egst, name);
6477                 fprintf (file, _("   name       : %.*s\n"),
6478                            egst->namlng > rest ? rest : egst->namlng,
6479                            egst->name);
6480               }
6481             break;
6482           case EGSD__C_SYMV:
6483             if (len >= offsetof (struct vms_esdfv, name))
6484               {
6485                 struct vms_esdfv *esdfv = (struct vms_esdfv *) e;
6486                 unsigned int flags = bfd_getl16 (esdfv->flags);
6487 
6488                 fprintf (file, _("SYMV - Vectored symbol definition\n"));
6489                 fprintf (file, _("   flags: 0x%04x"), flags);
6490                 exav_bfd_print_egsy_flags (flags, file);
6491                 fputc ('\n', file);
6492                 fprintf (file, _("   vector      : 0x%08x\n"),
6493                            (unsigned) bfd_getl32 (esdfv->vector));
6494                 fprintf (file, _("   psect offset: %u\n"),
6495                            (unsigned) bfd_getl32 (esdfv->value));
6496                 fprintf (file, _("   psect index : %u\n"),
6497                            (unsigned) bfd_getl32 (esdfv->psindx));
6498                 rest = len - offsetof (struct vms_esdfv, name);
6499                 fprintf (file, _("   name        : %.*s\n"),
6500                            esdfv->namlng > rest ? rest : esdfv->namlng,
6501                            esdfv->name);
6502               }
6503             break;
6504           case EGSD__C_SYMM:
6505             if (len >= offsetof (struct vms_esdfm, name))
6506               {
6507                 struct vms_esdfm *esdfm = (struct vms_esdfm *) e;
6508                 unsigned int flags = bfd_getl16 (esdfm->flags);
6509 
6510                 fprintf (file,
6511                            _("SYMM - Global symbol definition with version\n"));
6512                 fprintf (file, _("   flags: 0x%04x"), flags);
6513                 exav_bfd_print_egsy_flags (flags, file);
6514                 fputc ('\n', file);
6515                 fprintf (file, _("   version mask: 0x%08x\n"),
6516                            (unsigned)bfd_getl32 (esdfm->version_mask));
6517                 fprintf (file, _("   psect offset: %u\n"),
6518                            (unsigned)bfd_getl32 (esdfm->value));
6519                 fprintf (file, _("   psect index : %u\n"),
6520                            (unsigned)bfd_getl32 (esdfm->psindx));
6521                 rest = len - offsetof (struct vms_esdfm, name);
6522                 fprintf (file, _("   name        : %.*s\n"),
6523                            esdfm->namlng > rest ? rest : esdfm->namlng,
6524                            esdfm->name);
6525               }
6526             break;
6527           default:
6528             fprintf (file, _("unhandled egsd entry type %u\n"), type);
6529             break;
6530           }
6531       off += len;
6532     }
6533 }
6534 
6535 static void
evax_bfd_print_hex(FILE * file,const char * pfx,const unsigned char * buf,unsigned int len)6536 evax_bfd_print_hex (FILE *file, const char *pfx,
6537                         const unsigned char *buf, unsigned int len)
6538 {
6539   unsigned int i;
6540   unsigned int n;
6541 
6542   n = 0;
6543   for (i = 0; i < len; i++)
6544     {
6545       if (n == 0)
6546           fputs (pfx, file);
6547       fprintf (file, " %02x", buf[i]);
6548       n++;
6549       if (n == 16)
6550           {
6551             n = 0;
6552             fputc ('\n', file);
6553           }
6554     }
6555   if (n != 0)
6556     fputc ('\n', file);
6557 }
6558 
6559 static void
evax_bfd_print_etir_stc_ir(FILE * file,const unsigned char * buf,unsigned int len,int is_ps)6560 evax_bfd_print_etir_stc_ir (FILE *file, const unsigned char *buf,
6561                                   unsigned int len, int is_ps)
6562 {
6563   if (is_ps ? len < 44 : len < 33)
6564     return;
6565 
6566   /* xgettext:c-format */
6567   fprintf (file, _("    linkage index: %u, replacement insn: 0x%08x\n"),
6568              (unsigned)bfd_getl32 (buf),
6569              (unsigned)bfd_getl32 (buf + 16));
6570   /* xgettext:c-format */
6571   fprintf (file, _("    psect idx 1: %u, offset 1: 0x%08x %08x\n"),
6572              (unsigned)bfd_getl32 (buf + 4),
6573              (unsigned)bfd_getl32 (buf + 12),
6574              (unsigned)bfd_getl32 (buf + 8));
6575   /* xgettext:c-format */
6576   fprintf (file, _("    psect idx 2: %u, offset 2: 0x%08x %08x\n"),
6577              (unsigned)bfd_getl32 (buf + 20),
6578              (unsigned)bfd_getl32 (buf + 28),
6579              (unsigned)bfd_getl32 (buf + 24));
6580   if (is_ps)
6581     /* xgettext:c-format */
6582     fprintf (file, _("    psect idx 3: %u, offset 3: 0x%08x %08x\n"),
6583                (unsigned)bfd_getl32 (buf + 32),
6584                (unsigned)bfd_getl32 (buf + 40),
6585                (unsigned)bfd_getl32 (buf + 36));
6586   else
6587     fprintf (file, _("    global name: %.*s\n"),
6588                buf[32] > len - 33 ? len - 33 : buf[32],
6589                buf + 33);
6590 }
6591 
6592 static void
evax_bfd_print_etir(FILE * file,const char * name,unsigned char * rec,unsigned int rec_len)6593 evax_bfd_print_etir (FILE *file, const char *name,
6594                          unsigned char *rec, unsigned int rec_len)
6595 {
6596   unsigned int off = sizeof (struct vms_eobjrec);
6597 
6598   /* xgettext:c-format */
6599   fprintf (file, _("  %s (len=%u):\n"), name, (unsigned) rec_len);
6600   if (rec_len < sizeof (struct vms_eobjrec) + sizeof (struct vms_etir))
6601     return;
6602 
6603   while (off <= rec_len - sizeof (struct vms_etir))
6604     {
6605       struct vms_etir *etir = (struct vms_etir *)(rec + off);
6606       unsigned char *buf;
6607       unsigned int type;
6608       unsigned int size;
6609       unsigned int rest;
6610 
6611       type = bfd_getl16 (etir->rectyp);
6612       size = bfd_getl16 (etir->size);
6613       buf = rec + off + sizeof (struct vms_etir);
6614 
6615       if (size < sizeof (struct vms_etir) || size > rec_len - off)
6616           {
6617             fprintf (file, _("   Erroneous length\n"));
6618             return;
6619           }
6620 
6621       /* xgettext:c-format */
6622       fprintf (file, _("   (type: %3u, size: %3u): "), type, size);
6623       rest = size - sizeof (struct vms_etir);
6624       switch (type)
6625           {
6626           case ETIR__C_STA_GBL:
6627             if (rest >= 1)
6628               fprintf (file, _("STA_GBL (stack global) %.*s\n"),
6629                          buf[0] > rest - 1 ? rest - 1 : buf[0], buf + 1);
6630             break;
6631           case ETIR__C_STA_LW:
6632             fprintf (file, _("STA_LW (stack longword)"));
6633             if (rest >= 4)
6634               fprintf (file, " 0x%08x\n",
6635                          (unsigned) bfd_getl32 (buf));
6636             break;
6637           case ETIR__C_STA_QW:
6638             fprintf (file, _("STA_QW (stack quadword)"));
6639             if (rest >= 8)
6640               fprintf (file, " 0x%08x %08x\n",
6641                          (unsigned) bfd_getl32 (buf + 4),
6642                          (unsigned) bfd_getl32 (buf + 0));
6643             break;
6644           case ETIR__C_STA_PQ:
6645             fprintf (file, _("STA_PQ (stack psect base + offset)\n"));
6646             if (rest >= 12)
6647               /* xgettext:c-format */
6648               fprintf (file, _("    psect: %u, offset: 0x%08x %08x\n"),
6649                          (unsigned) bfd_getl32 (buf + 0),
6650                          (unsigned) bfd_getl32 (buf + 8),
6651                          (unsigned) bfd_getl32 (buf + 4));
6652             break;
6653           case ETIR__C_STA_LI:
6654             fprintf (file, _("STA_LI (stack literal)\n"));
6655             break;
6656           case ETIR__C_STA_MOD:
6657             fprintf (file, _("STA_MOD (stack module)\n"));
6658             break;
6659           case ETIR__C_STA_CKARG:
6660             fprintf (file, _("STA_CKARG (compare procedure argument)\n"));
6661             break;
6662 
6663           case ETIR__C_STO_B:
6664             fprintf (file, _("STO_B (store byte)\n"));
6665             break;
6666           case ETIR__C_STO_W:
6667             fprintf (file, _("STO_W (store word)\n"));
6668             break;
6669           case ETIR__C_STO_LW:
6670             fprintf (file, _("STO_LW (store longword)\n"));
6671             break;
6672           case ETIR__C_STO_QW:
6673             fprintf (file, _("STO_QW (store quadword)\n"));
6674             break;
6675           case ETIR__C_STO_IMMR:
6676             if (rest >= 4)
6677               {
6678                 unsigned int rpt = bfd_getl32 (buf);
6679                 fprintf (file,
6680                            _("STO_IMMR (store immediate repeat) %u bytes\n"),
6681                            rpt);
6682                 if (rpt > rest - 4)
6683                     rpt = rest - 4;
6684                 evax_bfd_print_hex (file, "   ", buf + 4, rpt);
6685               }
6686             break;
6687           case ETIR__C_STO_GBL:
6688             if (rest >= 1)
6689               fprintf (file, _("STO_GBL (store global) %.*s\n"),
6690                          buf[0] > rest - 1 ? rest - 1 : buf[0], buf + 1);
6691             break;
6692           case ETIR__C_STO_CA:
6693             if (rest >= 1)
6694               fprintf (file, _("STO_CA (store code address) %.*s\n"),
6695                          buf[0] > rest - 1 ? rest - 1 : buf[0], buf + 1);
6696             break;
6697           case ETIR__C_STO_RB:
6698             fprintf (file, _("STO_RB (store relative branch)\n"));
6699             break;
6700           case ETIR__C_STO_AB:
6701             fprintf (file, _("STO_AB (store absolute branch)\n"));
6702             break;
6703           case ETIR__C_STO_OFF:
6704             fprintf (file, _("STO_OFF (store offset to psect)\n"));
6705             break;
6706           case ETIR__C_STO_IMM:
6707             if (rest >= 4)
6708               {
6709                 unsigned int rpt = bfd_getl32 (buf);
6710                 fprintf (file,
6711                            _("STO_IMM (store immediate) %u bytes\n"),
6712                            rpt);
6713                 if (rpt > rest - 4)
6714                     rpt = rest - 4;
6715                 evax_bfd_print_hex (file, "   ", buf + 4, rpt);
6716               }
6717             break;
6718           case ETIR__C_STO_GBL_LW:
6719             if (rest >= 1)
6720               fprintf (file, _("STO_GBL_LW (store global longword) %.*s\n"),
6721                          buf[0] > rest - 1 ? rest - 1 : buf[0], buf + 1);
6722             break;
6723           case ETIR__C_STO_LP_PSB:
6724             fprintf (file, _("STO_OFF (store LP with procedure signature)\n"));
6725             break;
6726           case ETIR__C_STO_HINT_GBL:
6727             fprintf (file, _("STO_BR_GBL (store branch global) *todo*\n"));
6728             break;
6729           case ETIR__C_STO_HINT_PS:
6730             fprintf (file, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6731             break;
6732 
6733           case ETIR__C_OPR_NOP:
6734             fprintf (file, _("OPR_NOP (no-operation)\n"));
6735             break;
6736           case ETIR__C_OPR_ADD:
6737             fprintf (file, _("OPR_ADD (add)\n"));
6738             break;
6739           case ETIR__C_OPR_SUB:
6740             fprintf (file, _("OPR_SUB (subtract)\n"));
6741             break;
6742           case ETIR__C_OPR_MUL:
6743             fprintf (file, _("OPR_MUL (multiply)\n"));
6744             break;
6745           case ETIR__C_OPR_DIV:
6746             fprintf (file, _("OPR_DIV (divide)\n"));
6747             break;
6748           case ETIR__C_OPR_AND:
6749             fprintf (file, _("OPR_AND (logical and)\n"));
6750             break;
6751           case ETIR__C_OPR_IOR:
6752             fprintf (file, _("OPR_IOR (logical inclusive or)\n"));
6753             break;
6754           case ETIR__C_OPR_EOR:
6755             fprintf (file, _("OPR_EOR (logical exclusive or)\n"));
6756             break;
6757           case ETIR__C_OPR_NEG:
6758             fprintf (file, _("OPR_NEG (negate)\n"));
6759             break;
6760           case ETIR__C_OPR_COM:
6761             fprintf (file, _("OPR_COM (complement)\n"));
6762             break;
6763           case ETIR__C_OPR_INSV:
6764             fprintf (file, _("OPR_INSV (insert field)\n"));
6765             break;
6766           case ETIR__C_OPR_ASH:
6767             fprintf (file, _("OPR_ASH (arithmetic shift)\n"));
6768             break;
6769           case ETIR__C_OPR_USH:
6770             fprintf (file, _("OPR_USH (unsigned shift)\n"));
6771             break;
6772           case ETIR__C_OPR_ROT:
6773             fprintf (file, _("OPR_ROT (rotate)\n"));
6774             break;
6775           case ETIR__C_OPR_SEL:
6776             fprintf (file, _("OPR_SEL (select)\n"));
6777             break;
6778           case ETIR__C_OPR_REDEF:
6779             fprintf (file, _("OPR_REDEF (redefine symbol to curr location)\n"));
6780             break;
6781           case ETIR__C_OPR_DFLIT:
6782             fprintf (file, _("OPR_REDEF (define a literal)\n"));
6783             break;
6784 
6785           case ETIR__C_STC_LP:
6786             fprintf (file, _("STC_LP (store cond linkage pair)\n"));
6787             break;
6788           case ETIR__C_STC_LP_PSB:
6789             fprintf (file,
6790                        _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6791             if (rest >= 5)
6792               {
6793                 /* xgettext:c-format */
6794                 fprintf (file, _("   linkage index: %u, procedure: %.*s\n"),
6795                            (unsigned) bfd_getl32 (buf),
6796                            buf[4] > rest - 5 ? rest - 5 : buf[4], buf + 5);
6797                 if (rest > 4 + 1u + buf[4])
6798                     {
6799                       rest -= 4 + 1 + buf[4];
6800                       buf += 4 + 1 + buf[4];
6801                       fprintf (file, _("   signature: %.*s\n"),
6802                                  buf[0] > rest - 1 ? rest - 1: buf[0], buf + 1);
6803                     }
6804               }
6805             break;
6806           case ETIR__C_STC_GBL:
6807             fprintf (file, _("STC_GBL (store cond global)\n"));
6808             if (rest >= 5)
6809               /* xgettext:c-format */
6810               fprintf (file, _("   linkage index: %u, global: %.*s\n"),
6811                          (unsigned) bfd_getl32 (buf),
6812                          buf[4] > rest - 5 ? rest - 5 : buf[4], buf + 5);
6813             break;
6814           case ETIR__C_STC_GCA:
6815             fprintf (file, _("STC_GCA (store cond code address)\n"));
6816             if (rest >= 5)
6817               /* xgettext:c-format */
6818               fprintf (file, _("   linkage index: %u, procedure name: %.*s\n"),
6819                          (unsigned) bfd_getl32 (buf),
6820                          buf[4] > rest - 5 ? rest - 5 : buf[4], buf + 5);
6821             break;
6822           case ETIR__C_STC_PS:
6823             fprintf (file, _("STC_PS (store cond psect + offset)\n"));
6824             if (rest >= 16)
6825               fprintf (file,
6826                          /* xgettext:c-format */
6827                          _("   linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6828                          (unsigned)bfd_getl32 (buf),
6829                          (unsigned)bfd_getl32 (buf + 4),
6830                          (unsigned)bfd_getl32 (buf + 12),
6831                          (unsigned)bfd_getl32 (buf + 8));
6832             break;
6833           case ETIR__C_STC_NOP_GBL:
6834             fprintf (file, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6835             evax_bfd_print_etir_stc_ir (file, buf, rest, 0);
6836             break;
6837           case ETIR__C_STC_NOP_PS:
6838             fprintf (file, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6839             evax_bfd_print_etir_stc_ir (file, buf, rest, 1);
6840             break;
6841           case ETIR__C_STC_BSR_GBL:
6842             fprintf (file, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6843             evax_bfd_print_etir_stc_ir (file, buf, rest, 0);
6844             break;
6845           case ETIR__C_STC_BSR_PS:
6846             fprintf (file, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6847             evax_bfd_print_etir_stc_ir (file, buf, rest, 1);
6848             break;
6849           case ETIR__C_STC_LDA_GBL:
6850             fprintf (file, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6851             evax_bfd_print_etir_stc_ir (file, buf, rest, 0);
6852             break;
6853           case ETIR__C_STC_LDA_PS:
6854             fprintf (file, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6855             evax_bfd_print_etir_stc_ir (file, buf, rest, 1);
6856             break;
6857           case ETIR__C_STC_BOH_GBL:
6858             fprintf (file, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6859             evax_bfd_print_etir_stc_ir (file, buf, rest, 0);
6860             break;
6861           case ETIR__C_STC_BOH_PS:
6862             fprintf (file, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6863             evax_bfd_print_etir_stc_ir (file, buf, rest, 1);
6864             break;
6865           case ETIR__C_STC_NBH_GBL:
6866             fprintf (file,
6867                        _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6868             break;
6869           case ETIR__C_STC_NBH_PS:
6870             fprintf (file,
6871                        _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6872             break;
6873 
6874           case ETIR__C_CTL_SETRB:
6875             fprintf (file, _("CTL_SETRB (set relocation base)\n"));
6876             break;
6877           case ETIR__C_CTL_AUGRB:
6878             if (rest >= 4)
6879               {
6880                 unsigned int val = bfd_getl32 (buf);
6881                 fprintf (file, _("CTL_AUGRB (augment relocation base) %u\n"),
6882                            val);
6883               }
6884             break;
6885           case ETIR__C_CTL_DFLOC:
6886             fprintf (file, _("CTL_DFLOC (define location)\n"));
6887             break;
6888           case ETIR__C_CTL_STLOC:
6889             fprintf (file, _("CTL_STLOC (set location)\n"));
6890             break;
6891           case ETIR__C_CTL_STKDL:
6892             fprintf (file, _("CTL_STKDL (stack defined location)\n"));
6893             break;
6894           default:
6895             fprintf (file, _("*unhandled*\n"));
6896             break;
6897           }
6898       off += size;
6899     }
6900 }
6901 
6902 static void
evax_bfd_print_eobj(struct bfd * abfd,FILE * file)6903 evax_bfd_print_eobj (struct bfd *abfd, FILE *file)
6904 {
6905   bool is_first = true;
6906   bool has_records = true;
6907 
6908   while (1)
6909     {
6910       unsigned int rec_len;
6911       unsigned int pad_len;
6912       unsigned char *rec;
6913       unsigned int hdr_size;
6914       unsigned int type;
6915       unsigned char buf[6];
6916 
6917       hdr_size = has_records ? 6 : 4;
6918       if (bfd_read (buf, hdr_size, abfd) != hdr_size)
6919           {
6920             fprintf (file, _("cannot read GST record header\n"));
6921             return;
6922           }
6923 
6924       type = bfd_getl16 (buf);
6925       rec_len = bfd_getl16 (buf + 2);
6926       pad_len = rec_len;
6927       if (has_records)
6928           {
6929             unsigned int rec_len2 = bfd_getl16 (buf + 4);
6930 
6931             if (is_first)
6932               {
6933                 is_first = false;
6934                 if (type == rec_len2 && rec_len == EOBJ__C_EMH)
6935                     /* Matched a VMS record EMH.  */
6936                     ;
6937                 else
6938                     {
6939                       has_records = false;
6940                       if (type != EOBJ__C_EMH)
6941                         {
6942                           /* Ill-formed.  */
6943                           fprintf (file, _("cannot find EMH in first GST record\n"));
6944                           return;
6945                         }
6946                     }
6947               }
6948 
6949             if (has_records)
6950               {
6951                 /* VMS record format is: record-size, type, record-size.
6952                      See maybe_adjust_record_pointer_for_object comment.  */
6953                 if (type == rec_len2)
6954                     {
6955                       type = rec_len;
6956                       rec_len = rec_len2;
6957                     }
6958                 else
6959                     rec_len = 0;
6960                 pad_len = (rec_len + 1) & ~1U;
6961                 hdr_size = 4;
6962               }
6963           }
6964 
6965       if (rec_len < hdr_size)
6966           {
6967             fprintf (file, _("corrupted GST\n"));
6968             return;
6969           }
6970 
6971       rec = bfd_malloc (pad_len);
6972       if (rec == NULL)
6973           return;
6974 
6975       memcpy (rec, buf + (has_records ? 2 : 0), hdr_size);
6976 
6977       if (bfd_read (rec + hdr_size, pad_len - hdr_size, abfd)
6978             != pad_len - hdr_size)
6979           {
6980             fprintf (file, _("cannot read GST record\n"));
6981             free (rec);
6982             return;
6983           }
6984 
6985       switch (type)
6986           {
6987           case EOBJ__C_EMH:
6988             evax_bfd_print_emh (file, rec, rec_len);
6989             break;
6990           case EOBJ__C_EGSD:
6991             evax_bfd_print_egsd (file, rec, rec_len);
6992             break;
6993           case EOBJ__C_EEOM:
6994             evax_bfd_print_eeom (file, rec, rec_len);
6995             free (rec);
6996             return;
6997           case EOBJ__C_ETIR:
6998             evax_bfd_print_etir (file, "ETIR", rec, rec_len);
6999             break;
7000           case EOBJ__C_EDBG:
7001             evax_bfd_print_etir (file, "EDBG", rec, rec_len);
7002             break;
7003           case EOBJ__C_ETBT:
7004             evax_bfd_print_etir (file, "ETBT", rec, rec_len);
7005             break;
7006           default:
7007             fprintf (file, _(" unhandled EOBJ record type %u\n"), type);
7008             break;
7009           }
7010       free (rec);
7011     }
7012 }
7013 
7014 static void
evax_bfd_print_relocation_records(FILE * file,const unsigned char * buf,size_t buf_size,size_t off,unsigned int stride)7015 evax_bfd_print_relocation_records (FILE *file, const unsigned char *buf,
7016                                            size_t buf_size, size_t off,
7017                                            unsigned int stride)
7018 {
7019   while (off <= buf_size - 8)
7020     {
7021       unsigned int base;
7022       unsigned int count;
7023       unsigned int j;
7024 
7025       count = bfd_getl32 (buf + off + 0);
7026 
7027       if (count == 0)
7028           break;
7029       base = bfd_getl32 (buf + off + 4);
7030 
7031       /* xgettext:c-format */
7032       fprintf (file, _("  bitcount: %u, base addr: 0x%08x\n"),
7033                  count, base);
7034 
7035       off += 8;
7036       for (j = 0; count > 0 && off <= buf_size - 4; j += 4, count -= 32)
7037           {
7038             unsigned int k;
7039             unsigned int n = 0;
7040             unsigned int val;
7041 
7042             val = bfd_getl32 (buf + off);
7043             off += 4;
7044 
7045             /* xgettext:c-format */
7046             fprintf (file, _("   bitmap: 0x%08x (count: %u):\n"), val, count);
7047 
7048             for (k = 0; k < 32; k++)
7049               if (val & (1u << k))
7050                 {
7051                     if (n == 0)
7052                       fputs ("   ", file);
7053                     fprintf (file, _(" %08x"), base + (j * 8 + k) * stride);
7054                     n++;
7055                     if (n == 8)
7056                       {
7057                         fputs ("\n", file);
7058                         n = 0;
7059                       }
7060                 }
7061             if (n)
7062               fputs ("\n", file);
7063           }
7064     }
7065 }
7066 
7067 static void
evax_bfd_print_address_fixups(FILE * file,const unsigned char * buf,size_t buf_size,size_t off)7068 evax_bfd_print_address_fixups (FILE *file, const unsigned char *buf,
7069                                      size_t buf_size, size_t off)
7070 {
7071   while (off <= buf_size - 8)
7072     {
7073       unsigned int j;
7074       unsigned int count;
7075 
7076       count = bfd_getl32 (buf + off + 0);
7077       if (count == 0)
7078           return;
7079       /* xgettext:c-format */
7080       fprintf (file, _("  image %u (%u entries)\n"),
7081                  (unsigned) bfd_getl32 (buf + off + 4), count);
7082       off += 8;
7083       for (j = 0; j < count && off <= buf_size - 8; j++)
7084           {
7085             /* xgettext:c-format */
7086             fprintf (file, _("   offset: 0x%08x, val: 0x%08x\n"),
7087                        (unsigned) bfd_getl32 (buf + off + 0),
7088                        (unsigned) bfd_getl32 (buf + off + 4));
7089             off += 8;
7090           }
7091     }
7092 }
7093 
7094 static void
evax_bfd_print_reference_fixups(FILE * file,const unsigned char * buf,size_t buf_size,size_t off)7095 evax_bfd_print_reference_fixups (FILE *file, const unsigned char *buf,
7096                                          size_t buf_size, size_t off)
7097 {
7098   unsigned int count;
7099 
7100   while (off <= buf_size - 8)
7101     {
7102       unsigned int j;
7103       unsigned int n = 0;
7104 
7105       count = bfd_getl32 (buf + off + 0);
7106       if (count == 0)
7107           break;
7108       /* xgettext:c-format */
7109       fprintf (file, _("  image %u (%u entries), offsets:\n"),
7110                  (unsigned) bfd_getl32 (buf + off + 4), count);
7111       off += 8;
7112       for (j = 0; j < count && off <= buf_size - 4; j++)
7113           {
7114             if (n == 0)
7115               fputs ("   ", file);
7116             fprintf (file, _(" 0x%08x"), (unsigned) bfd_getl32 (buf + off));
7117             n++;
7118             if (n == 7)
7119               {
7120                 fputs ("\n", file);
7121                 n = 0;
7122               }
7123             off += 4;
7124           }
7125       if (n)
7126           fputs ("\n", file);
7127     }
7128 }
7129 
7130 static void
evax_bfd_print_indent(int indent,FILE * file)7131 evax_bfd_print_indent (int indent, FILE *file)
7132 {
7133   for (; indent; indent--)
7134     fputc (' ', file);
7135 }
7136 
7137 static const char *
evax_bfd_get_dsc_name(unsigned int v)7138 evax_bfd_get_dsc_name (unsigned int v)
7139 {
7140   switch (v)
7141     {
7142     case DSC__K_DTYPE_Z:
7143       return "Z (Unspecified)";
7144     case DSC__K_DTYPE_V:
7145       return "V (Bit)";
7146     case DSC__K_DTYPE_BU:
7147       return "BU (Byte logical)";
7148     case DSC__K_DTYPE_WU:
7149       return "WU (Word logical)";
7150     case DSC__K_DTYPE_LU:
7151       return "LU (Longword logical)";
7152     case DSC__K_DTYPE_QU:
7153       return "QU (Quadword logical)";
7154     case DSC__K_DTYPE_B:
7155       return "B (Byte integer)";
7156     case DSC__K_DTYPE_W:
7157       return "W (Word integer)";
7158     case DSC__K_DTYPE_L:
7159       return "L (Longword integer)";
7160     case DSC__K_DTYPE_Q:
7161       return "Q (Quadword integer)";
7162     case DSC__K_DTYPE_F:
7163       return "F (Single-precision floating)";
7164     case DSC__K_DTYPE_D:
7165       return "D (Double-precision floating)";
7166     case DSC__K_DTYPE_FC:
7167       return "FC (Complex)";
7168     case DSC__K_DTYPE_DC:
7169       return "DC (Double-precision Complex)";
7170     case DSC__K_DTYPE_T:
7171       return "T (ASCII text string)";
7172     case DSC__K_DTYPE_NU:
7173       return "NU (Numeric string, unsigned)";
7174     case DSC__K_DTYPE_NL:
7175       return "NL (Numeric string, left separate sign)";
7176     case DSC__K_DTYPE_NLO:
7177       return "NLO (Numeric string, left overpunched sign)";
7178     case DSC__K_DTYPE_NR:
7179       return "NR (Numeric string, right separate sign)";
7180     case DSC__K_DTYPE_NRO:
7181       return "NRO (Numeric string, right overpunched sig)";
7182     case DSC__K_DTYPE_NZ:
7183       return "NZ (Numeric string, zoned sign)";
7184     case DSC__K_DTYPE_P:
7185       return "P (Packed decimal string)";
7186     case DSC__K_DTYPE_ZI:
7187       return "ZI (Sequence of instructions)";
7188     case DSC__K_DTYPE_ZEM:
7189       return "ZEM (Procedure entry mask)";
7190     case DSC__K_DTYPE_DSC:
7191       return "DSC (Descriptor, used for arrays of dyn strings)";
7192     case DSC__K_DTYPE_OU:
7193       return "OU (Octaword logical)";
7194     case DSC__K_DTYPE_O:
7195       return "O (Octaword integer)";
7196     case DSC__K_DTYPE_G:
7197       return "G (Double precision G floating, 64 bit)";
7198     case DSC__K_DTYPE_H:
7199       return "H (Quadruple precision floating, 128 bit)";
7200     case DSC__K_DTYPE_GC:
7201       return "GC (Double precision complex, G floating)";
7202     case DSC__K_DTYPE_HC:
7203       return "HC (Quadruple precision complex, H floating)";
7204     case DSC__K_DTYPE_CIT:
7205       return "CIT (COBOL intermediate temporary)";
7206     case DSC__K_DTYPE_BPV:
7207       return "BPV (Bound Procedure Value)";
7208     case DSC__K_DTYPE_BLV:
7209       return "BLV (Bound Label Value)";
7210     case DSC__K_DTYPE_VU:
7211       return "VU (Bit Unaligned)";
7212     case DSC__K_DTYPE_ADT:
7213       return "ADT (Absolute Date-Time)";
7214     case DSC__K_DTYPE_VT:
7215       return "VT (Varying Text)";
7216     case DSC__K_DTYPE_T2:
7217       return "T2 (16-bit char)";
7218     case DSC__K_DTYPE_VT2:
7219       return "VT2 (16-bit varying char)";
7220     default:
7221       return "?? (unknown)";
7222     }
7223 }
7224 
7225 static void
evax_bfd_print_desc(const unsigned char * buf,unsigned int bufsize,int indent,FILE * file)7226 evax_bfd_print_desc (const unsigned char *buf, unsigned int bufsize,
7227                          int indent, FILE *file)
7228 {
7229   if (bufsize < 8)
7230     return;
7231 
7232   unsigned char bclass = buf[3];
7233   unsigned char dtype = buf[2];
7234   unsigned int len = (unsigned)bfd_getl16 (buf);
7235   unsigned int pointer = (unsigned)bfd_getl32 (buf + 4);
7236 
7237   evax_bfd_print_indent (indent, file);
7238 
7239   if (len == 1 && pointer == 0xffffffffUL)
7240     {
7241       /* 64 bits.  */
7242       fprintf (file, _("64 bits *unhandled*\n"));
7243     }
7244   else
7245     {
7246       /* xgettext:c-format */
7247       fprintf (file, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
7248                  bclass, dtype, len, pointer);
7249       switch (bclass)
7250           {
7251           case DSC__K_CLASS_NCA:
7252             {
7253               const struct vms_dsc_nca *dsc = (const void *)buf;
7254               unsigned int i;
7255               const unsigned char *b;
7256 
7257               evax_bfd_print_indent (indent, file);
7258               fprintf (file, _("non-contiguous array of %s\n"),
7259                          evax_bfd_get_dsc_name (dsc->dtype));
7260               if (bufsize >= sizeof (*dsc))
7261                 {
7262                     evax_bfd_print_indent (indent + 1, file);
7263                     fprintf (file,
7264                                /* xgettext:c-format */
7265                                _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
7266                                dsc->dimct, dsc->aflags, dsc->digits, dsc->scale);
7267                     evax_bfd_print_indent (indent + 1, file);
7268                     fprintf (file,
7269                                /* xgettext:c-format */
7270                                _("arsize: %u, a0: 0x%08x\n"),
7271                                (unsigned) bfd_getl32 (dsc->arsize),
7272                                (unsigned) bfd_getl32 (dsc->a0));
7273                     evax_bfd_print_indent (indent + 1, file);
7274                     fprintf (file, _("Strides:\n"));
7275                     b = buf + sizeof (*dsc);
7276                     bufsize -= sizeof (*dsc);
7277                     for (i = 0; i < dsc->dimct; i++)
7278                       {
7279                         if (bufsize < 4)
7280                           break;
7281                         evax_bfd_print_indent (indent + 2, file);
7282                         fprintf (file, "[%u]: %u\n", i + 1,
7283                                    (unsigned) bfd_getl32 (b));
7284                         b += 4;
7285                         bufsize -= 4;
7286                       }
7287                     evax_bfd_print_indent (indent + 1, file);
7288                     fprintf (file, _("Bounds:\n"));
7289                     for (i = 0; i < dsc->dimct; i++)
7290                       {
7291                         if (bufsize < 8)
7292                           break;
7293                         evax_bfd_print_indent (indent + 2, file);
7294                         /* xgettext:c-format */
7295                         fprintf (file, _("[%u]: Lower: %u, upper: %u\n"), i + 1,
7296                                    (unsigned) bfd_getl32 (b + 0),
7297                                    (unsigned) bfd_getl32 (b + 4));
7298                         b += 8;
7299                         bufsize -= 8;
7300                       }
7301                 }
7302             }
7303             break;
7304           case DSC__K_CLASS_UBS:
7305             {
7306               const struct vms_dsc_ubs *ubs = (const void *)buf;
7307 
7308               evax_bfd_print_indent (indent, file);
7309               fprintf (file, _("unaligned bit-string of %s\n"),
7310                          evax_bfd_get_dsc_name (ubs->dtype));
7311               if (bufsize >= sizeof (*ubs))
7312                 {
7313                     evax_bfd_print_indent (indent + 1, file);
7314                     fprintf (file,
7315                                /* xgettext:c-format */
7316                                _("base: %u, pos: %u\n"),
7317                                (unsigned) bfd_getl32 (ubs->base),
7318                                (unsigned) bfd_getl32 (ubs->pos));
7319                 }
7320             }
7321             break;
7322           default:
7323             fprintf (file, _("*unhandled*\n"));
7324             break;
7325           }
7326     }
7327 }
7328 
7329 static unsigned int
evax_bfd_print_valspec(const unsigned char * buf,unsigned int bufsize,int indent,FILE * file)7330 evax_bfd_print_valspec (const unsigned char *buf, unsigned int bufsize,
7331                               int indent, FILE *file)
7332 {
7333   if (bufsize < 5)
7334     return bufsize;
7335 
7336   unsigned int vflags = buf[0];
7337   unsigned int value = (unsigned) bfd_getl32 (buf + 1);
7338   unsigned int len = 5;
7339 
7340   evax_bfd_print_indent (indent, file);
7341   /* xgettext:c-format */
7342   fprintf (file, _("vflags: 0x%02x, value: 0x%08x "), vflags, value);
7343   buf += 5;
7344   bufsize -= 5;
7345 
7346   switch (vflags)
7347     {
7348     case DST__K_VFLAGS_NOVAL:
7349       fprintf (file, _("(no value)\n"));
7350       break;
7351     case DST__K_VFLAGS_NOTACTIVE:
7352       fprintf (file, _("(not active)\n"));
7353       break;
7354     case DST__K_VFLAGS_UNALLOC:
7355       fprintf (file, _("(not allocated)\n"));
7356       break;
7357     case DST__K_VFLAGS_DSC:
7358       fprintf (file, _("(descriptor)\n"));
7359       if (value <= bufsize)
7360           evax_bfd_print_desc (buf + value, bufsize - value, indent + 1, file);
7361       break;
7362     case DST__K_VFLAGS_TVS:
7363       fprintf (file, _("(trailing value)\n"));
7364       break;
7365     case DST__K_VS_FOLLOWS:
7366       fprintf (file, _("(value spec follows)\n"));
7367       break;
7368     case DST__K_VFLAGS_BITOFFS:
7369       fprintf (file, _("(at bit offset %u)\n"), value);
7370       break;
7371     default:
7372       /* xgettext:c-format */
7373       fprintf (file, _("(reg: %u, disp: %u, indir: %u, kind: "),
7374                  (vflags & DST__K_REGNUM_MASK) >> DST__K_REGNUM_SHIFT,
7375                  vflags & DST__K_DISP ? 1 : 0,
7376                  vflags & DST__K_INDIR ? 1 : 0);
7377       switch (vflags & DST__K_VALKIND_MASK)
7378           {
7379           case DST__K_VALKIND_LITERAL:
7380             fputs (_("literal"), file);
7381             break;
7382           case DST__K_VALKIND_ADDR:
7383             fputs (_("address"), file);
7384             break;
7385           case DST__K_VALKIND_DESC:
7386             fputs (_("desc"), file);
7387             break;
7388           case DST__K_VALKIND_REG:
7389             fputs (_("reg"), file);
7390             break;
7391           }
7392       fputs (")\n", file);
7393       break;
7394     }
7395   return len;
7396 }
7397 
7398 static void
evax_bfd_print_typspec(const unsigned char * buf,unsigned int bufsize,int indent,FILE * file)7399 evax_bfd_print_typspec (const unsigned char *buf, unsigned int bufsize,
7400                               int indent, FILE *file)
7401 {
7402   if (bufsize < 3)
7403     return;
7404 
7405   unsigned char kind = buf[2];
7406   unsigned int len = (unsigned) bfd_getl16 (buf);
7407 
7408   evax_bfd_print_indent (indent, file);
7409   /* xgettext:c-format */
7410   fprintf (file, _("len: %2u, kind: %2u "), len, kind);
7411   buf += 3;
7412   bufsize -= 3;
7413   switch (kind)
7414     {
7415     case DST__K_TS_ATOM:
7416     /* xgettext:c-format */
7417       if (bufsize >= 1)
7418           fprintf (file, _("atomic, type=0x%02x %s\n"),
7419                      buf[0], evax_bfd_get_dsc_name (buf[0]));
7420       break;
7421     case DST__K_TS_IND:
7422       if (bufsize >= 4)
7423           fprintf (file, _("indirect, defined at 0x%08x\n"),
7424                      (unsigned) bfd_getl32 (buf));
7425       break;
7426     case DST__K_TS_TPTR:
7427       fprintf (file, _("typed pointer\n"));
7428       evax_bfd_print_typspec (buf, bufsize, indent + 1, file);
7429       break;
7430     case DST__K_TS_PTR:
7431       fprintf (file, _("pointer\n"));
7432       break;
7433     case DST__K_TS_ARRAY:
7434       {
7435           const unsigned char *vs;
7436           unsigned int vs_len;
7437           unsigned int vec_len;
7438           unsigned int i;
7439 
7440           if (bufsize == 0)
7441             return;
7442           fprintf (file, _("array, dim: %u, bitmap: "), buf[0]);
7443           --bufsize;
7444           vec_len = (buf[0] + 1 + 7) / 8;
7445           for (i = 0; i < vec_len; i++)
7446             {
7447               if (bufsize == 0)
7448                 break;
7449               fprintf (file, " %02x", buf[i + 1]);
7450               --bufsize;
7451             }
7452           fputc ('\n', file);
7453           if (bufsize == 0)
7454             return;
7455           vs = buf + 1 + vec_len;
7456           evax_bfd_print_indent (indent, file);
7457           fprintf (file, _("array descriptor:\n"));
7458           vs_len = evax_bfd_print_valspec (vs, bufsize, indent + 1, file);
7459           vs += vs_len;
7460           if (bufsize > vs_len)
7461             {
7462               bufsize -= vs_len;
7463               for (i = 0; i < buf[0] + 1U; i++)
7464                 if (buf[1 + i / 8] & (1 << (i % 8)))
7465                     {
7466                       evax_bfd_print_indent (indent, file);
7467                       if (i == 0)
7468                         fprintf (file, _("type spec for element:\n"));
7469                       else
7470                         fprintf (file, _("type spec for subscript %u:\n"), i);
7471                       evax_bfd_print_typspec (vs, bufsize, indent + 1, file);
7472                       if (bufsize < 2)
7473                         break;
7474                       vs_len = bfd_getl16 (vs);
7475                       if (bufsize <= vs_len)
7476                         break;
7477                       vs += vs_len;
7478                       bufsize -= vs_len;
7479                     }
7480             }
7481       }
7482       break;
7483     default:
7484       fprintf (file, _("*unhandled*\n"));
7485     }
7486 }
7487 
7488 static void
evax_bfd_print_dst(struct bfd * abfd,unsigned int dst_size,FILE * file)7489 evax_bfd_print_dst (struct bfd *abfd, unsigned int dst_size, FILE *file)
7490 {
7491   unsigned int off = 0;
7492   unsigned int pc = 0;
7493   unsigned int line = 0;
7494 
7495   fprintf (file, _("Debug symbol table:\n"));
7496 
7497   while (dst_size > 0)
7498     {
7499       struct vms_dst_header dsth;
7500       unsigned int len;
7501       unsigned int type;
7502       unsigned char *buf;
7503 
7504       if (bfd_read (&dsth, sizeof (dsth), abfd) != sizeof (dsth))
7505           {
7506             fprintf (file, _("cannot read DST header\n"));
7507             return;
7508           }
7509       len = bfd_getl16 (dsth.length);
7510       type = bfd_getl16 (dsth.type);
7511       /* xgettext:c-format */
7512       fprintf (file, _(" type: %3u, len: %3u (at 0x%08x): "),
7513                  type, len, off);
7514       if (len < sizeof (dsth))
7515           {
7516             fputc ('\n', file);
7517             break;
7518           }
7519       dst_size -= len;
7520       off += len;
7521       len -= sizeof (dsth);
7522       if (len == 0)
7523           buf = NULL;
7524       else
7525           {
7526             buf = _bfd_malloc_and_read (abfd, len, len);
7527             if (buf == NULL)
7528               {
7529                 fprintf (file, _("cannot read DST symbol\n"));
7530                 return;
7531               }
7532           }
7533       switch (type)
7534           {
7535           case DSC__K_DTYPE_V:
7536           case DSC__K_DTYPE_BU:
7537           case DSC__K_DTYPE_WU:
7538           case DSC__K_DTYPE_LU:
7539           case DSC__K_DTYPE_QU:
7540           case DSC__K_DTYPE_B:
7541           case DSC__K_DTYPE_W:
7542           case DSC__K_DTYPE_L:
7543           case DSC__K_DTYPE_Q:
7544           case DSC__K_DTYPE_F:
7545           case DSC__K_DTYPE_D:
7546           case DSC__K_DTYPE_FC:
7547           case DSC__K_DTYPE_DC:
7548           case DSC__K_DTYPE_T:
7549           case DSC__K_DTYPE_NU:
7550           case DSC__K_DTYPE_NL:
7551           case DSC__K_DTYPE_NLO:
7552           case DSC__K_DTYPE_NR:
7553           case DSC__K_DTYPE_NRO:
7554           case DSC__K_DTYPE_NZ:
7555           case DSC__K_DTYPE_P:
7556           case DSC__K_DTYPE_ZI:
7557           case DSC__K_DTYPE_ZEM:
7558           case DSC__K_DTYPE_DSC:
7559           case DSC__K_DTYPE_OU:
7560           case DSC__K_DTYPE_O:
7561           case DSC__K_DTYPE_G:
7562           case DSC__K_DTYPE_H:
7563           case DSC__K_DTYPE_GC:
7564           case DSC__K_DTYPE_HC:
7565           case DSC__K_DTYPE_CIT:
7566           case DSC__K_DTYPE_BPV:
7567           case DSC__K_DTYPE_BLV:
7568           case DSC__K_DTYPE_VU:
7569           case DSC__K_DTYPE_ADT:
7570           case DSC__K_DTYPE_VT:
7571           case DSC__K_DTYPE_T2:
7572           case DSC__K_DTYPE_VT2:
7573             fprintf (file, _("standard data: %s\n"),
7574                        evax_bfd_get_dsc_name (type));
7575             evax_bfd_print_valspec (buf, len, 4, file);
7576             if (len > 6)
7577               fprintf (file, _("    name: %.*s\n"),
7578                          buf[5] > len - 6 ? len - 6 : buf[5], buf + 6);
7579             break;
7580           case DST__K_MODBEG:
7581             {
7582               struct vms_dst_modbeg *dst = (void *)buf;
7583               unsigned char *name = buf + sizeof (*dst);
7584 
7585               fprintf (file, _("modbeg\n"));
7586               if (len < sizeof (*dst))
7587                 break;
7588               /* xgettext:c-format */
7589               fprintf (file, _("   flags: %d, language: %u, "
7590                                    "major: %u, minor: %u\n"),
7591                          dst->flags,
7592                          (unsigned)bfd_getl32 (dst->language),
7593                          (unsigned)bfd_getl16 (dst->major),
7594                          (unsigned)bfd_getl16 (dst->minor));
7595               len -= sizeof (*dst);
7596               if (len > 0)
7597                 {
7598                     int nlen = len - 1;
7599                     fprintf (file, _("   module name: %.*s\n"),
7600                                name[0] > nlen ? nlen : name[0], name + 1);
7601                     if (name[0] < nlen)
7602                       {
7603                         len -= name[0] + 1;
7604                         name += name[0] + 1;
7605                         nlen = len - 1;
7606                         fprintf (file, _("   compiler   : %.*s\n"),
7607                                    name[0] > nlen ? nlen : name[0], name + 1);
7608                       }
7609                 }
7610             }
7611             break;
7612           case DST__K_MODEND:
7613             fprintf (file, _("modend\n"));
7614             break;
7615           case DST__K_RTNBEG:
7616             {
7617               struct vms_dst_rtnbeg *dst = (void *)buf;
7618               unsigned char *name = buf + sizeof (*dst);
7619 
7620               fputs (_("rtnbeg\n"), file);
7621               if (len >= sizeof (*dst))
7622                 {
7623                     /* xgettext:c-format */
7624                     fprintf (file, _("    flags: %u, address: 0x%08x, "
7625                                          "pd-address: 0x%08x\n"),
7626                                dst->flags,
7627                                (unsigned) bfd_getl32 (dst->address),
7628                                (unsigned) bfd_getl32 (dst->pd_address));
7629                     len -= sizeof (*dst);
7630                     if (len > 0)
7631                       {
7632                         int nlen = len - 1;
7633                         fprintf (file, _("    routine name: %.*s\n"),
7634                                    name[0] > nlen ? nlen : name[0], name + 1);
7635                       }
7636                 }
7637             }
7638             break;
7639           case DST__K_RTNEND:
7640             {
7641               struct vms_dst_rtnend *dst = (void *)buf;
7642 
7643               if (len >= sizeof (*dst))
7644                 fprintf (file, _("rtnend: size 0x%08x\n"),
7645                            (unsigned) bfd_getl32 (dst->size));
7646             }
7647             break;
7648           case DST__K_PROLOG:
7649             {
7650               struct vms_dst_prolog *dst = (void *)buf;
7651 
7652               if (len >= sizeof (*dst))
7653                 /* xgettext:c-format */
7654                 fprintf (file, _("prolog: bkpt address 0x%08x\n"),
7655                            (unsigned) bfd_getl32 (dst->bkpt_addr));
7656             }
7657             break;
7658           case DST__K_EPILOG:
7659             {
7660               struct vms_dst_epilog *dst = (void *)buf;
7661 
7662               if (len >= sizeof (*dst))
7663                 /* xgettext:c-format */
7664                 fprintf (file, _("epilog: flags: %u, count: %u\n"),
7665                            dst->flags, (unsigned) bfd_getl32 (dst->count));
7666             }
7667             break;
7668           case DST__K_BLKBEG:
7669             {
7670               struct vms_dst_blkbeg *dst = (void *)buf;
7671               unsigned char *name = buf + sizeof (*dst);
7672 
7673               if (len > sizeof (*dst))
7674                 {
7675                     int nlen;
7676                     len -= sizeof (*dst);
7677                     nlen = len - 1;
7678                     /* xgettext:c-format */
7679                     fprintf (file, _("blkbeg: address: 0x%08x, name: %.*s\n"),
7680                                (unsigned) bfd_getl32 (dst->address),
7681                                name[0] > nlen ? nlen : name[0], name + 1);
7682                 }
7683             }
7684             break;
7685           case DST__K_BLKEND:
7686             {
7687               struct vms_dst_blkend *dst = (void *)buf;
7688 
7689               if (len >= sizeof (*dst))
7690                 /* xgettext:c-format */
7691                 fprintf (file, _("blkend: size: 0x%08x\n"),
7692                            (unsigned) bfd_getl32 (dst->size));
7693             }
7694             break;
7695           case DST__K_TYPSPEC:
7696             {
7697               fprintf (file, _("typspec (len: %u)\n"), len);
7698               if (len >= 1)
7699                 {
7700                     int nlen = len - 1;
7701                     fprintf (file, _("    name: %.*s\n"),
7702                                buf[0] > nlen ? nlen : buf[0], buf + 1);
7703                     if (nlen > buf[0])
7704                       evax_bfd_print_typspec (buf + 1 + buf[0], len - (1 + buf[0]),
7705                                                     5, file);
7706                 }
7707             }
7708             break;
7709           case DST__K_SEPTYP:
7710             {
7711               if (len >= 6)
7712                 {
7713                     fprintf (file, _("septyp, name: %.*s\n"),
7714                                buf[5] > len - 6 ? len - 6 : buf[5], buf + 6);
7715                     evax_bfd_print_valspec (buf, len, 4, file);
7716                 }
7717             }
7718             break;
7719           case DST__K_RECBEG:
7720             {
7721               struct vms_dst_recbeg *recbeg = (void *)buf;
7722               unsigned char *name = buf + sizeof (*recbeg);
7723 
7724               if (len > sizeof (*recbeg))
7725                 {
7726                     int nlen = len - sizeof (*recbeg) - 1;
7727                     if (name[0] < nlen)
7728                       nlen = name[0];
7729                     fprintf (file, _("recbeg: name: %.*s\n"), nlen, name + 1);
7730                     evax_bfd_print_valspec (buf, len, 4, file);
7731                     len -= 1 + nlen;
7732                     if (len >= 4)
7733                       fprintf (file, _("    len: %u bits\n"),
7734                                  (unsigned) bfd_getl32 (name + 1 + nlen));
7735                 }
7736             }
7737             break;
7738           case DST__K_RECEND:
7739             fprintf (file, _("recend\n"));
7740             break;
7741           case DST__K_ENUMBEG:
7742             if (len >= 2)
7743               /* xgettext:c-format */
7744               fprintf (file, _("enumbeg, len: %u, name: %.*s\n"),
7745                          buf[0], buf[1] > len - 2 ? len - 2 : buf[1], buf + 2);
7746             break;
7747           case DST__K_ENUMELT:
7748             if (len >= 6)
7749               {
7750                 fprintf (file, _("enumelt, name: %.*s\n"),
7751                            buf[5] > len - 6 ? len - 6 : buf[5], buf + 6);
7752                 evax_bfd_print_valspec (buf, len, 4, file);
7753               }
7754             break;
7755           case DST__K_ENUMEND:
7756             fprintf (file, _("enumend\n"));
7757             break;
7758           case DST__K_LABEL:
7759             {
7760               struct vms_dst_label *lab = (void *)buf;
7761               if (len >= sizeof (*lab))
7762                 {
7763                     fprintf (file, _("label, name: %.*s\n"),
7764                                lab->name[0] > len - 1 ? len - 1 : lab->name[0],
7765                                lab->name + 1);
7766                     fprintf (file, _("    address: 0x%08x\n"),
7767                                (unsigned) bfd_getl32 (lab->value));
7768                 }
7769             }
7770             break;
7771           case DST__K_DIS_RANGE:
7772             if (len >= 4)
7773               {
7774                 unsigned int cnt = bfd_getl32 (buf);
7775                 unsigned char *rng = buf + 4;
7776                 unsigned int i;
7777 
7778                 fprintf (file, _("discontiguous range (nbr: %u)\n"), cnt);
7779                 len -= 4;
7780                 for (i = 0; i < cnt; i++, rng += 8)
7781                     {
7782                       if (len < 8)
7783                         break;
7784                       /* xgettext:c-format */
7785                       fprintf (file, _("    address: 0x%08x, size: %u\n"),
7786                                  (unsigned) bfd_getl32 (rng),
7787                                  (unsigned) bfd_getl32 (rng + 4));
7788                       len -= 8;
7789                     }
7790               }
7791             break;
7792           case DST__K_LINE_NUM:
7793             {
7794               unsigned char *buf_orig = buf;
7795 
7796               fprintf (file, _("line num  (len: %u)\n"), len);
7797 
7798               while (len > 0)
7799                 {
7800                     int cmd;
7801                     unsigned int val;
7802                     int cmdlen = -1;
7803 
7804                     cmd = *buf++;
7805                     len--;
7806 
7807                     fputs ("    ", file);
7808 
7809                     switch (cmd)
7810                       {
7811                       case DST__K_DELTA_PC_W:
7812                         if (len < 2)
7813                           break;
7814                         val = bfd_getl16 (buf);
7815                         fprintf (file, _("delta_pc_w %u\n"), val);
7816                         pc += val;
7817                         line++;
7818                         cmdlen = 2;
7819                         break;
7820                       case DST__K_INCR_LINUM:
7821                         if (len < 1)
7822                           break;
7823                         val = *buf;
7824                         fprintf (file, _("incr_linum(b): +%u\n"), val);
7825                         line += val;
7826                         cmdlen = 1;
7827                         break;
7828                       case DST__K_INCR_LINUM_W:
7829                         if (len < 2)
7830                           break;
7831                         val = bfd_getl16 (buf);
7832                         fprintf (file, _("incr_linum_w: +%u\n"), val);
7833                         line += val;
7834                         cmdlen = 2;
7835                         break;
7836                       case DST__K_INCR_LINUM_L:
7837                         if (len < 4)
7838                           break;
7839                         val = bfd_getl32 (buf);
7840                         fprintf (file, _("incr_linum_l: +%u\n"), val);
7841                         line += val;
7842                         cmdlen = 4;
7843                         break;
7844                       case DST__K_SET_LINUM:
7845                         if (len < 2)
7846                           break;
7847                         line = bfd_getl16 (buf);
7848                         fprintf (file, _("set_line_num(w) %u\n"), line);
7849                         cmdlen = 2;
7850                         break;
7851                       case DST__K_SET_LINUM_B:
7852                         if (len < 1)
7853                           break;
7854                         line = *buf;
7855                         fprintf (file, _("set_line_num_b %u\n"), line);
7856                         cmdlen = 1;
7857                         break;
7858                       case DST__K_SET_LINUM_L:
7859                         if (len < 4)
7860                           break;
7861                         line = bfd_getl32 (buf);
7862                         fprintf (file, _("set_line_num_l %u\n"), line);
7863                         cmdlen = 4;
7864                         break;
7865                       case DST__K_SET_ABS_PC:
7866                         if (len < 4)
7867                           break;
7868                         pc = bfd_getl32 (buf);
7869                         fprintf (file, _("set_abs_pc: 0x%08x\n"), pc);
7870                         cmdlen = 4;
7871                         break;
7872                       case DST__K_DELTA_PC_L:
7873                         if (len < 4)
7874                           break;
7875                         fprintf (file, _("delta_pc_l: +0x%08x\n"),
7876                                    (unsigned) bfd_getl32 (buf));
7877                         cmdlen = 4;
7878                         break;
7879                       case DST__K_TERM:
7880                         if (len < 1)
7881                           break;
7882                         fprintf (file, _("term(b): 0x%02x"), *buf);
7883                         pc += *buf;
7884                         fprintf (file, _("        pc: 0x%08x\n"), pc);
7885                         cmdlen = 1;
7886                         break;
7887                       case DST__K_TERM_W:
7888                         if (len < 2)
7889                           break;
7890                         val = bfd_getl16 (buf);
7891                         fprintf (file, _("term_w: 0x%04x"), val);
7892                         pc += val;
7893                         fprintf (file, _("    pc: 0x%08x\n"), pc);
7894                         cmdlen = 2;
7895                         break;
7896                       default:
7897                         if (cmd <= 0)
7898                           {
7899                               fprintf (file, _("delta pc +%-4d"), -cmd);
7900                               line++;  /* FIXME: curr increment.  */
7901                               pc += -cmd;
7902                               /* xgettext:c-format */
7903                               fprintf (file, _("    pc: 0x%08x line: %5u\n"),
7904                                          pc, line);
7905                               cmdlen = 0;
7906                           }
7907                         else
7908                           fprintf (file, _("    *unhandled* cmd %u\n"), cmd);
7909                         break;
7910                       }
7911                     if (cmdlen < 0)
7912                       break;
7913                     len -= cmdlen;
7914                     buf += cmdlen;
7915                 }
7916               buf = buf_orig;
7917             }
7918             break;
7919           case DST__K_SOURCE:
7920             {
7921               unsigned char *buf_orig = buf;
7922 
7923               fprintf (file, _("source (len: %u)\n"), len);
7924 
7925               while (len > 0)
7926                 {
7927                     int cmd = *buf++;
7928                     int cmdlen = -1;
7929 
7930                     len--;
7931                     switch (cmd)
7932                       {
7933                       case DST__K_SRC_DECLFILE:
7934                         {
7935                           struct vms_dst_src_decl_src *src = (void *) buf;
7936                           unsigned char *name;
7937                           int nlen;
7938 
7939                           if (len < sizeof (*src))
7940                               break;
7941                           /* xgettext:c-format */
7942                           fprintf (file, _("   declfile: len: %u, flags: %u, "
7943                                                "fileid: %u\n"),
7944                                      src->length, src->flags,
7945                                      (unsigned)bfd_getl16 (src->fileid));
7946                           /* xgettext:c-format */
7947                           fprintf (file, _("   rms: cdt: 0x%08x %08x, "
7948                                                "ebk: 0x%08x, ffb: 0x%04x, "
7949                                                "rfo: %u\n"),
7950                                      (unsigned)bfd_getl32 (src->rms_cdt + 4),
7951                                      (unsigned)bfd_getl32 (src->rms_cdt + 0),
7952                                      (unsigned)bfd_getl32 (src->rms_ebk),
7953                                      (unsigned)bfd_getl16 (src->rms_ffb),
7954                                      src->rms_rfo);
7955                           if (src->length > len || src->length <= sizeof (*src))
7956                               break;
7957                           nlen = src->length - sizeof (*src) - 1;
7958                           name = buf + sizeof (*src);
7959                           fprintf (file, _("   filename   : %.*s\n"),
7960                                      name[0] > nlen ? nlen : name[0], name + 1);
7961                           if (name[0] >= nlen)
7962                               break;
7963                           nlen -= name[0] + 1;
7964                           name += name[0] + 1;
7965                           fprintf (file, _("   module name: %.*s\n"),
7966                                      name[0] > nlen ? nlen : name[0], name + 1);
7967                           if (name[0] > nlen)
7968                               break;
7969                           cmdlen = src->length;
7970                         }
7971                         break;
7972                       case DST__K_SRC_SETFILE:
7973                         if (len < 2)
7974                           break;
7975                         fprintf (file, _("   setfile %u\n"),
7976                                    (unsigned) bfd_getl16 (buf));
7977                         cmdlen = 2;
7978                         break;
7979                       case DST__K_SRC_SETREC_W:
7980                         if (len < 2)
7981                           break;
7982                         fprintf (file, _("   setrec %u\n"),
7983                                    (unsigned) bfd_getl16 (buf));
7984                         cmdlen = 2;
7985                         break;
7986                       case DST__K_SRC_SETREC_L:
7987                         if (len < 4)
7988                           break;
7989                         fprintf (file, _("   setrec %u\n"),
7990                                    (unsigned) bfd_getl32 (buf));
7991                         cmdlen = 4;
7992                         break;
7993                       case DST__K_SRC_SETLNUM_W:
7994                         if (len < 2)
7995                           break;
7996                         fprintf (file, _("   setlnum %u\n"),
7997                                    (unsigned) bfd_getl16 (buf));
7998                         cmdlen = 2;
7999                         break;
8000                       case DST__K_SRC_SETLNUM_L:
8001                         if (len < 4)
8002                           break;
8003                         fprintf (file, _("   setlnum %u\n"),
8004                                    (unsigned) bfd_getl32 (buf));
8005                         cmdlen = 4;
8006                         break;
8007                       case DST__K_SRC_DEFLINES_W:
8008                         if (len < 2)
8009                           break;
8010                         fprintf (file, _("   deflines %u\n"),
8011                                    (unsigned) bfd_getl16 (buf));
8012                         cmdlen = 2;
8013                         break;
8014                       case DST__K_SRC_DEFLINES_B:
8015                         if (len < 1)
8016                           break;
8017                         fprintf (file, _("   deflines %u\n"), *buf);
8018                         cmdlen = 1;
8019                         break;
8020                       case DST__K_SRC_FORMFEED:
8021                         fprintf (file, _("   formfeed\n"));
8022                         cmdlen = 0;
8023                         break;
8024                       default:
8025                         fprintf (file, _("   *unhandled* cmd %u\n"), cmd);
8026                         break;
8027                       }
8028                     if (cmdlen < 0)
8029                       break;
8030                     len -= cmdlen;
8031                     buf += cmdlen;
8032                 }
8033               buf = buf_orig;
8034             }
8035             break;
8036           default:
8037             fprintf (file, _("*unhandled* dst type %u\n"), type);
8038             break;
8039           }
8040       free (buf);
8041     }
8042 }
8043 
8044 static void
evax_bfd_print_image(bfd * abfd,FILE * file)8045 evax_bfd_print_image (bfd *abfd, FILE *file)
8046 {
8047   struct vms_eihd eihd;
8048   const char *name;
8049   unsigned int val;
8050   unsigned int eiha_off;
8051   unsigned int eihi_off;
8052   unsigned int eihs_off;
8053   unsigned int eisd_off;
8054   unsigned int eihef_off = 0;
8055   unsigned int eihnp_off = 0;
8056   unsigned int dmt_vbn = 0;
8057   unsigned int dmt_size = 0;
8058   unsigned int dst_vbn = 0;
8059   unsigned int dst_size = 0;
8060   unsigned int gst_vbn = 0;
8061   unsigned int gst_size = 0;
8062   unsigned int eiaf_vbn = 0;
8063   unsigned int eiaf_size = 0;
8064   unsigned int eihvn_off;
8065 
8066   if (bfd_seek (abfd, 0, SEEK_SET)
8067       || bfd_read (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
8068     {
8069       fprintf (file, _("cannot read EIHD\n"));
8070       return;
8071     }
8072   /* xgettext:c-format */
8073   fprintf (file, _("EIHD: (size: %u, nbr blocks: %u)\n"),
8074              (unsigned)bfd_getl32 (eihd.size),
8075              (unsigned)bfd_getl32 (eihd.hdrblkcnt));
8076   /* xgettext:c-format */
8077   fprintf (file, _(" majorid: %u, minorid: %u\n"),
8078              (unsigned)bfd_getl32 (eihd.majorid),
8079              (unsigned)bfd_getl32 (eihd.minorid));
8080 
8081   val = (unsigned)bfd_getl32 (eihd.imgtype);
8082   switch (val)
8083     {
8084     case EIHD__K_EXE:
8085       name = _("executable");
8086       break;
8087     case EIHD__K_LIM:
8088       name = _("linkable image");
8089       break;
8090     default:
8091       name = _("unknown");
8092       break;
8093     }
8094   /* xgettext:c-format */
8095   fprintf (file, _(" image type: %u (%s)"), val, name);
8096 
8097   val = (unsigned)bfd_getl32 (eihd.subtype);
8098   switch (val)
8099     {
8100     case EIHD__C_NATIVE:
8101       name = _("native");
8102       break;
8103     case EIHD__C_CLI:
8104       name = _("CLI");
8105       break;
8106     default:
8107       name = _("unknown");
8108       break;
8109     }
8110   /* xgettext:c-format */
8111   fprintf (file, _(", subtype: %u (%s)\n"), val, name);
8112 
8113   eisd_off = bfd_getl32 (eihd.isdoff);
8114   eiha_off = bfd_getl32 (eihd.activoff);
8115   eihi_off = bfd_getl32 (eihd.imgidoff);
8116   eihs_off = bfd_getl32 (eihd.symdbgoff);
8117   /* xgettext:c-format */
8118   fprintf (file, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
8119                        "imgid: %u, patch: %u\n"),
8120              eisd_off, eiha_off, eihs_off, eihi_off,
8121              (unsigned)bfd_getl32 (eihd.patchoff));
8122   fprintf (file, _(" fixup info rva: "));
8123   bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.iafva));
8124   fprintf (file, _(", symbol vector rva: "));
8125   bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.symvva));
8126   eihvn_off = bfd_getl32 (eihd.version_array_off);
8127   fprintf (file, _("\n"
8128                        " version array off: %u\n"),
8129              eihvn_off);
8130   fprintf (file,
8131              /* xgettext:c-format */
8132              _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
8133              (unsigned)bfd_getl32 (eihd.imgiocnt),
8134              (unsigned)bfd_getl32 (eihd.iochancnt),
8135              (unsigned)bfd_getl32 (eihd.privreqs + 4),
8136              (unsigned)bfd_getl32 (eihd.privreqs + 0));
8137   val = (unsigned)bfd_getl32 (eihd.lnkflags);
8138   fprintf (file, _(" linker flags: %08x:"), val);
8139   if (val & EIHD__M_LNKDEBUG)
8140     fprintf (file, " LNKDEBUG");
8141   if (val & EIHD__M_LNKNOTFR)
8142     fprintf (file, " LNKNOTFR");
8143   if (val & EIHD__M_NOP0BUFS)
8144     fprintf (file, " NOP0BUFS");
8145   if (val & EIHD__M_PICIMG)
8146     fprintf (file, " PICIMG");
8147   if (val & EIHD__M_P0IMAGE)
8148     fprintf (file, " P0IMAGE");
8149   if (val & EIHD__M_DBGDMT)
8150     fprintf (file, " DBGDMT");
8151   if (val & EIHD__M_INISHR)
8152     fprintf (file, " INISHR");
8153   if (val & EIHD__M_XLATED)
8154     fprintf (file, " XLATED");
8155   if (val & EIHD__M_BIND_CODE_SEC)
8156     fprintf (file, " BIND_CODE_SEC");
8157   if (val & EIHD__M_BIND_DATA_SEC)
8158     fprintf (file, " BIND_DATA_SEC");
8159   if (val & EIHD__M_MKTHREADS)
8160     fprintf (file, " MKTHREADS");
8161   if (val & EIHD__M_UPCALLS)
8162     fprintf (file, " UPCALLS");
8163   if (val & EIHD__M_OMV_READY)
8164     fprintf (file, " OMV_READY");
8165   if (val & EIHD__M_EXT_BIND_SECT)
8166     fprintf (file, " EXT_BIND_SECT");
8167   fprintf (file, "\n");
8168   /* xgettext:c-format */
8169   fprintf (file, _(" ident: 0x%08x, sysver: 0x%08x, "
8170                        "match ctrl: %u, symvect_size: %u\n"),
8171              (unsigned)bfd_getl32 (eihd.ident),
8172              (unsigned)bfd_getl32 (eihd.sysver),
8173              eihd.matchctl,
8174              (unsigned)bfd_getl32 (eihd.symvect_size));
8175   fprintf (file, _(" BPAGE: %u"),
8176              (unsigned)bfd_getl32 (eihd.virt_mem_block_size));
8177   if (val & (EIHD__M_OMV_READY | EIHD__M_EXT_BIND_SECT))
8178     {
8179       eihef_off = bfd_getl32 (eihd.ext_fixup_off);
8180       eihnp_off = bfd_getl32 (eihd.noopt_psect_off);
8181       /* xgettext:c-format */
8182       fprintf (file, _(", ext fixup offset: %u, no_opt psect off: %u"),
8183                  eihef_off, eihnp_off);
8184     }
8185   fprintf (file, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd.alias));
8186 
8187   if (eihvn_off != 0)
8188     {
8189       struct vms_eihvn eihvn;
8190       unsigned int mask;
8191       unsigned int j;
8192 
8193       fprintf (file, _("system version array information:\n"));
8194       if (bfd_seek (abfd, eihvn_off, SEEK_SET)
8195             || bfd_read (&eihvn, sizeof (eihvn), abfd) != sizeof (eihvn))
8196           {
8197             fprintf (file, _("cannot read EIHVN header\n"));
8198             return;
8199           }
8200       mask = bfd_getl32 (eihvn.subsystem_mask);
8201       for (j = 0; j < 32; j++)
8202           if (mask & (1u << j))
8203             {
8204               struct vms_eihvn_subversion ver;
8205               if (bfd_read (&ver, sizeof (ver), abfd) != sizeof (ver))
8206                 {
8207                     fprintf (file, _("cannot read EIHVN version\n"));
8208                     return;
8209                 }
8210               fprintf (file, _("   %02u "), j);
8211               switch (j)
8212                 {
8213                 case EIHVN__BASE_IMAGE_BIT:
8214                     fputs (_("BASE_IMAGE       "), file);
8215                     break;
8216                 case EIHVN__MEMORY_MANAGEMENT_BIT:
8217                     fputs (_("MEMORY_MANAGEMENT"), file);
8218                     break;
8219                 case EIHVN__IO_BIT:
8220                     fputs (_("IO               "), file);
8221                     break;
8222                 case EIHVN__FILES_VOLUMES_BIT:
8223                     fputs (_("FILES_VOLUMES    "), file);
8224                     break;
8225                 case EIHVN__PROCESS_SCHED_BIT:
8226                     fputs (_("PROCESS_SCHED    "), file);
8227                     break;
8228                 case EIHVN__SYSGEN_BIT:
8229                     fputs (_("SYSGEN           "), file);
8230                     break;
8231                 case EIHVN__CLUSTERS_LOCKMGR_BIT:
8232                     fputs (_("CLUSTERS_LOCKMGR "), file);
8233                     break;
8234                 case EIHVN__LOGICAL_NAMES_BIT:
8235                     fputs (_("LOGICAL_NAMES    "), file);
8236                     break;
8237                 case EIHVN__SECURITY_BIT:
8238                     fputs (_("SECURITY         "), file);
8239                     break;
8240                 case EIHVN__IMAGE_ACTIVATOR_BIT:
8241                     fputs (_("IMAGE_ACTIVATOR  "), file);
8242                     break;
8243                 case EIHVN__NETWORKS_BIT:
8244                     fputs (_("NETWORKS         "), file);
8245                     break;
8246                 case EIHVN__COUNTERS_BIT:
8247                     fputs (_("COUNTERS         "), file);
8248                     break;
8249                 case EIHVN__STABLE_BIT:
8250                     fputs (_("STABLE           "), file);
8251                     break;
8252                 case EIHVN__MISC_BIT:
8253                     fputs (_("MISC             "), file);
8254                     break;
8255                 case EIHVN__CPU_BIT:
8256                     fputs (_("CPU              "), file);
8257                     break;
8258                 case EIHVN__VOLATILE_BIT:
8259                     fputs (_("VOLATILE         "), file);
8260                     break;
8261                 case EIHVN__SHELL_BIT:
8262                     fputs (_("SHELL            "), file);
8263                     break;
8264                 case EIHVN__POSIX_BIT:
8265                     fputs (_("POSIX            "), file);
8266                     break;
8267                 case EIHVN__MULTI_PROCESSING_BIT:
8268                     fputs (_("MULTI_PROCESSING "), file);
8269                     break;
8270                 case EIHVN__GALAXY_BIT:
8271                     fputs (_("GALAXY           "), file);
8272                     break;
8273                 default:
8274                     fputs (_("*unknown*        "), file);
8275                     break;
8276                 }
8277               fprintf (file, ": %u.%u\n",
8278                          (unsigned)bfd_getl16 (ver.major),
8279                          (unsigned)bfd_getl16 (ver.minor));
8280             }
8281     }
8282 
8283   if (eiha_off != 0)
8284     {
8285       struct vms_eiha eiha;
8286 
8287       if (bfd_seek (abfd, eiha_off, SEEK_SET)
8288             || bfd_read (&eiha, sizeof (eiha), abfd) != sizeof (eiha))
8289           {
8290             fprintf (file, _("cannot read EIHA\n"));
8291             return;
8292           }
8293       fprintf (file, _("Image activation:  (size=%u)\n"),
8294                  (unsigned)bfd_getl32 (eiha.size));
8295       /* xgettext:c-format */
8296       fprintf (file, _(" First address : 0x%08x 0x%08x\n"),
8297                  (unsigned)bfd_getl32 (eiha.tfradr1_h),
8298                  (unsigned)bfd_getl32 (eiha.tfradr1));
8299       /* xgettext:c-format */
8300       fprintf (file, _(" Second address: 0x%08x 0x%08x\n"),
8301                  (unsigned)bfd_getl32 (eiha.tfradr2_h),
8302                  (unsigned)bfd_getl32 (eiha.tfradr2));
8303       /* xgettext:c-format */
8304       fprintf (file, _(" Third address : 0x%08x 0x%08x\n"),
8305                  (unsigned)bfd_getl32 (eiha.tfradr3_h),
8306                  (unsigned)bfd_getl32 (eiha.tfradr3));
8307       /* xgettext:c-format */
8308       fprintf (file, _(" Fourth address: 0x%08x 0x%08x\n"),
8309                  (unsigned)bfd_getl32 (eiha.tfradr4_h),
8310                  (unsigned)bfd_getl32 (eiha.tfradr4));
8311       /* xgettext:c-format */
8312       fprintf (file, _(" Shared image  : 0x%08x 0x%08x\n"),
8313                  (unsigned)bfd_getl32 (eiha.inishr_h),
8314                  (unsigned)bfd_getl32 (eiha.inishr));
8315     }
8316   if (eihi_off != 0)
8317     {
8318       struct vms_eihi eihi;
8319 
8320       if (bfd_seek (abfd, eihi_off, SEEK_SET)
8321             || bfd_read (&eihi, sizeof (eihi), abfd) != sizeof (eihi))
8322           {
8323             fprintf (file, _("cannot read EIHI\n"));
8324             return;
8325           }
8326       /* xgettext:c-format */
8327       fprintf (file, _("Image identification: (major: %u, minor: %u)\n"),
8328                  (unsigned)bfd_getl32 (eihi.majorid),
8329                  (unsigned)bfd_getl32 (eihi.minorid));
8330       fprintf (file, _(" image name       : %.*s\n"),
8331                  eihi.imgnam[0], eihi.imgnam + 1);
8332       fprintf (file, _(" link time        : %s\n"),
8333                  vms_time_to_str (eihi.linktime));
8334       fprintf (file, _(" image ident      : %.*s\n"),
8335                  eihi.imgid[0], eihi.imgid + 1);
8336       fprintf (file, _(" linker ident     : %.*s\n"),
8337                  eihi.linkid[0], eihi.linkid + 1);
8338       fprintf (file, _(" image build ident: %.*s\n"),
8339                  eihi.imgbid[0], eihi.imgbid + 1);
8340     }
8341   if (eihs_off != 0)
8342     {
8343       struct vms_eihs eihs;
8344 
8345       if (bfd_seek (abfd, eihs_off, SEEK_SET)
8346             || bfd_read (&eihs, sizeof (eihs), abfd) != sizeof (eihs))
8347           {
8348             fprintf (file, _("cannot read EIHS\n"));
8349             return;
8350           }
8351       /* xgettext:c-format */
8352       fprintf (file, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
8353                  (unsigned)bfd_getl32 (eihs.majorid),
8354                  (unsigned)bfd_getl32 (eihs.minorid));
8355       dst_vbn = bfd_getl32 (eihs.dstvbn);
8356       dst_size = bfd_getl32 (eihs.dstsize);
8357       /* xgettext:c-format */
8358       fprintf (file, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
8359                  dst_vbn, dst_size, dst_size);
8360       gst_vbn = bfd_getl32 (eihs.gstvbn);
8361       gst_size = bfd_getl32 (eihs.gstsize);
8362       /* xgettext:c-format */
8363       fprintf (file, _(" global symbol table: vbn: %u, records: %u\n"),
8364                  gst_vbn, gst_size);
8365       dmt_vbn = bfd_getl32 (eihs.dmtvbn);
8366       dmt_size = bfd_getl32 (eihs.dmtsize);
8367       /* xgettext:c-format */
8368       fprintf (file, _(" debug module table : vbn: %u, size: %u\n"),
8369                  dmt_vbn, dmt_size);
8370     }
8371   while (eisd_off != 0)
8372     {
8373       struct vms_eisd eisd;
8374       unsigned int len;
8375 
8376       while (1)
8377           {
8378             if (bfd_seek (abfd, eisd_off, SEEK_SET)
8379                 || bfd_read (&eisd, sizeof (eisd), abfd) != sizeof (eisd))
8380               {
8381                 fprintf (file, _("cannot read EISD\n"));
8382                 return;
8383               }
8384             len = (unsigned)bfd_getl32 (eisd.eisdsize);
8385             if (len != (unsigned)-1)
8386               break;
8387 
8388             /* Next block.  */
8389             eisd_off = (eisd_off + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
8390           }
8391       /* xgettext:c-format */
8392       fprintf (file, _("Image section descriptor: (major: %u, minor: %u, "
8393                            "size: %u, offset: %u)\n"),
8394                  (unsigned)bfd_getl32 (eisd.majorid),
8395                  (unsigned)bfd_getl32 (eisd.minorid),
8396                  len, eisd_off);
8397       if (len == 0)
8398           break;
8399       /* xgettext:c-format */
8400       fprintf (file, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
8401                  (unsigned)bfd_getl32 (eisd.virt_addr + 4),
8402                  (unsigned)bfd_getl32 (eisd.virt_addr + 0),
8403                  (unsigned)bfd_getl32 (eisd.secsize));
8404       val = (unsigned)bfd_getl32 (eisd.flags);
8405       fprintf (file, _(" flags: 0x%04x"), val);
8406       if (val & EISD__M_GBL)
8407           fprintf (file, " GBL");
8408       if (val & EISD__M_CRF)
8409           fprintf (file, " CRF");
8410       if (val & EISD__M_DZRO)
8411           fprintf (file, " DZRO");
8412       if (val & EISD__M_WRT)
8413           fprintf (file, " WRT");
8414       if (val & EISD__M_INITALCODE)
8415           fprintf (file, " INITALCODE");
8416       if (val & EISD__M_BASED)
8417           fprintf (file, " BASED");
8418       if (val & EISD__M_FIXUPVEC)
8419           fprintf (file, " FIXUPVEC");
8420       if (val & EISD__M_RESIDENT)
8421           fprintf (file, " RESIDENT");
8422       if (val & EISD__M_VECTOR)
8423           fprintf (file, " VECTOR");
8424       if (val & EISD__M_PROTECT)
8425           fprintf (file, " PROTECT");
8426       if (val & EISD__M_LASTCLU)
8427           fprintf (file, " LASTCLU");
8428       if (val & EISD__M_EXE)
8429           fprintf (file, " EXE");
8430       if (val & EISD__M_NONSHRADR)
8431           fprintf (file, " NONSHRADR");
8432       if (val & EISD__M_QUAD_LENGTH)
8433           fprintf (file, " QUAD_LENGTH");
8434       if (val & EISD__M_ALLOC_64BIT)
8435           fprintf (file, " ALLOC_64BIT");
8436       fprintf (file, "\n");
8437       if (val & EISD__M_FIXUPVEC)
8438           {
8439             eiaf_vbn = bfd_getl32 (eisd.vbn);
8440             eiaf_size = bfd_getl32 (eisd.secsize);
8441           }
8442       /* xgettext:c-format */
8443       fprintf (file, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
8444                  (unsigned)bfd_getl32 (eisd.vbn),
8445                  eisd.pfc, eisd.matchctl, eisd.type);
8446       switch (eisd.type)
8447           {
8448           case EISD__K_NORMAL:
8449             fputs (_("NORMAL"), file);
8450             break;
8451           case EISD__K_SHRFXD:
8452             fputs (_("SHRFXD"), file);
8453             break;
8454           case EISD__K_PRVFXD:
8455             fputs (_("PRVFXD"), file);
8456             break;
8457           case EISD__K_SHRPIC:
8458             fputs (_("SHRPIC"), file);
8459             break;
8460           case EISD__K_PRVPIC:
8461             fputs (_("PRVPIC"), file);
8462             break;
8463           case EISD__K_USRSTACK:
8464             fputs (_("USRSTACK"), file);
8465             break;
8466           default:
8467             fputs (_("*unknown*"), file);
8468             break;
8469           }
8470       fputs (_(")\n"), file);
8471       if (val & EISD__M_GBL)
8472           /* xgettext:c-format */
8473           fprintf (file, _(" ident: 0x%08x, name: %.*s\n"),
8474                      (unsigned)bfd_getl32 (eisd.ident),
8475                      eisd.gblnam[0], eisd.gblnam + 1);
8476       eisd_off += len;
8477     }
8478 
8479   if (dmt_vbn != 0)
8480     {
8481       if (bfd_seek (abfd, (file_ptr) (dmt_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
8482           {
8483             fprintf (file, _("cannot read DMT\n"));
8484             return;
8485           }
8486 
8487       fprintf (file, _("Debug module table:\n"));
8488 
8489       while (dmt_size > 0)
8490           {
8491             struct vms_dmt_header dmth;
8492             unsigned int count;
8493 
8494             if (bfd_read (&dmth, sizeof (dmth), abfd) != sizeof (dmth))
8495               {
8496                 fprintf (file, _("cannot read DMT header\n"));
8497                 return;
8498               }
8499             count = bfd_getl16 (dmth.psect_count);
8500             fprintf (file,
8501                        /* xgettext:c-format */
8502                        _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
8503                        (unsigned)bfd_getl32 (dmth.modbeg),
8504                        (unsigned)bfd_getl32 (dmth.size), count);
8505             dmt_size -= sizeof (dmth);
8506             while (count > 0)
8507               {
8508                 struct vms_dmt_psect dmtp;
8509 
8510                 if (bfd_read (&dmtp, sizeof (dmtp), abfd) != sizeof (dmtp))
8511                     {
8512                       fprintf (file, _("cannot read DMT psect\n"));
8513                       return;
8514                     }
8515                 /* xgettext:c-format */
8516                 fprintf (file, _("  psect start: 0x%08x, length: %u\n"),
8517                            (unsigned)bfd_getl32 (dmtp.start),
8518                            (unsigned)bfd_getl32 (dmtp.length));
8519                 count--;
8520                 dmt_size -= sizeof (dmtp);
8521               }
8522           }
8523     }
8524 
8525   if (dst_vbn != 0)
8526     {
8527       if (bfd_seek (abfd, (file_ptr) (dst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
8528           {
8529             fprintf (file, _("cannot read DST\n"));
8530             return;
8531           }
8532 
8533       evax_bfd_print_dst (abfd, dst_size, file);
8534     }
8535   if (gst_vbn != 0)
8536     {
8537       if (bfd_seek (abfd, (file_ptr) (gst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
8538           {
8539             fprintf (file, _("cannot read GST\n"));
8540             return;
8541           }
8542 
8543       fprintf (file, _("Global symbol table:\n"));
8544       evax_bfd_print_eobj (abfd, file);
8545     }
8546   if (eiaf_vbn != 0 && eiaf_size >= sizeof (struct vms_eiaf))
8547     {
8548       unsigned char *buf;
8549       struct vms_eiaf *eiaf;
8550       unsigned int qrelfixoff;
8551       unsigned int lrelfixoff;
8552       unsigned int qdotadroff;
8553       unsigned int ldotadroff;
8554       unsigned int shrimgcnt;
8555       unsigned int shlstoff;
8556       unsigned int codeadroff;
8557       unsigned int lpfixoff;
8558       unsigned int chgprtoff;
8559       file_ptr f_off = (file_ptr) (eiaf_vbn - 1) * VMS_BLOCK_SIZE;
8560 
8561       if (bfd_seek (abfd, f_off, SEEK_SET) != 0
8562             || (buf = _bfd_malloc_and_read (abfd, eiaf_size, eiaf_size)) == NULL)
8563           {
8564             fprintf (file, _("cannot read EIHA\n"));
8565             return;
8566           }
8567       eiaf = (struct vms_eiaf *)buf;
8568       fprintf (file,
8569                  /* xgettext:c-format */
8570                  _("Image activator fixup: (major: %u, minor: %u)\n"),
8571                  (unsigned)bfd_getl32 (eiaf->majorid),
8572                  (unsigned)bfd_getl32 (eiaf->minorid));
8573       /* xgettext:c-format */
8574       fprintf (file, _("  iaflink : 0x%08x %08x\n"),
8575                  (unsigned)bfd_getl32 (eiaf->iaflink + 0),
8576                  (unsigned)bfd_getl32 (eiaf->iaflink + 4));
8577       /* xgettext:c-format */
8578       fprintf (file, _("  fixuplnk: 0x%08x %08x\n"),
8579                  (unsigned)bfd_getl32 (eiaf->fixuplnk + 0),
8580                  (unsigned)bfd_getl32 (eiaf->fixuplnk + 4));
8581       fprintf (file, _("  size : %u\n"),
8582                  (unsigned)bfd_getl32 (eiaf->size));
8583       fprintf (file, _("  flags: 0x%08x\n"),
8584                  (unsigned)bfd_getl32 (eiaf->flags));
8585       qrelfixoff = bfd_getl32 (eiaf->qrelfixoff);
8586       lrelfixoff = bfd_getl32 (eiaf->lrelfixoff);
8587       /* xgettext:c-format */
8588       fprintf (file, _("  qrelfixoff: %5u, lrelfixoff: %5u\n"),
8589                  qrelfixoff, lrelfixoff);
8590       qdotadroff = bfd_getl32 (eiaf->qdotadroff);
8591       ldotadroff = bfd_getl32 (eiaf->ldotadroff);
8592       /* xgettext:c-format */
8593       fprintf (file, _("  qdotadroff: %5u, ldotadroff: %5u\n"),
8594                  qdotadroff, ldotadroff);
8595       codeadroff = bfd_getl32 (eiaf->codeadroff);
8596       lpfixoff = bfd_getl32 (eiaf->lpfixoff);
8597       /* xgettext:c-format */
8598       fprintf (file, _("  codeadroff: %5u, lpfixoff  : %5u\n"),
8599                  codeadroff, lpfixoff);
8600       chgprtoff = bfd_getl32 (eiaf->chgprtoff);
8601       fprintf (file, _("  chgprtoff : %5u\n"), chgprtoff);
8602       shrimgcnt = bfd_getl32 (eiaf->shrimgcnt);
8603       shlstoff = bfd_getl32 (eiaf->shlstoff);
8604       /* xgettext:c-format */
8605       fprintf (file, _("  shlstoff  : %5u, shrimgcnt : %5u\n"),
8606                  shlstoff, shrimgcnt);
8607       /* xgettext:c-format */
8608       fprintf (file, _("  shlextra  : %5u, permctx   : %5u\n"),
8609                  (unsigned)bfd_getl32 (eiaf->shlextra),
8610                  (unsigned)bfd_getl32 (eiaf->permctx));
8611       fprintf (file, _("  base_va : 0x%08x\n"),
8612                  (unsigned)bfd_getl32 (eiaf->base_va));
8613       fprintf (file, _("  lppsbfixoff: %5u\n"),
8614                  (unsigned)bfd_getl32 (eiaf->lppsbfixoff));
8615 
8616       if (shlstoff)
8617           {
8618             unsigned int j;
8619 
8620             fprintf (file, _(" Shareable images:\n"));
8621             for (j = 0;
8622                  j < shrimgcnt && shlstoff <= eiaf_size - sizeof (struct vms_shl);
8623                  j++, shlstoff += sizeof (struct vms_shl))
8624               {
8625                 struct vms_shl *shl = (struct vms_shl *) (buf + shlstoff);
8626                 fprintf (file,
8627                            /* xgettext:c-format */
8628                            _("  %u: size: %u, flags: 0x%02x, name: %.*s\n"),
8629                            j, shl->size, shl->flags,
8630                            shl->imgnam[0], shl->imgnam + 1);
8631               }
8632           }
8633       if (qrelfixoff != 0)
8634           {
8635             fprintf (file, _(" quad-word relocation fixups:\n"));
8636             evax_bfd_print_relocation_records (file, buf, eiaf_size,
8637                                                        qrelfixoff, 8);
8638           }
8639       if (lrelfixoff != 0)
8640           {
8641             fprintf (file, _(" long-word relocation fixups:\n"));
8642             evax_bfd_print_relocation_records (file, buf, eiaf_size,
8643                                                        lrelfixoff, 4);
8644           }
8645       if (qdotadroff != 0)
8646           {
8647             fprintf (file, _(" quad-word .address reference fixups:\n"));
8648             evax_bfd_print_address_fixups (file, buf, eiaf_size, qdotadroff);
8649           }
8650       if (ldotadroff != 0)
8651           {
8652             fprintf (file, _(" long-word .address reference fixups:\n"));
8653             evax_bfd_print_address_fixups (file, buf, eiaf_size, ldotadroff);
8654           }
8655       if (codeadroff != 0)
8656           {
8657             fprintf (file, _(" Code Address Reference Fixups:\n"));
8658             evax_bfd_print_reference_fixups (file, buf, eiaf_size, codeadroff);
8659           }
8660       if (lpfixoff != 0)
8661           {
8662             fprintf (file, _(" Linkage Pairs Reference Fixups:\n"));
8663             evax_bfd_print_reference_fixups (file, buf, eiaf_size, lpfixoff);
8664           }
8665       if (chgprtoff && chgprtoff <= eiaf_size - 4)
8666           {
8667             unsigned int count = (unsigned) bfd_getl32 (buf + chgprtoff);
8668             unsigned int j;
8669 
8670             fprintf (file, _(" Change Protection (%u entries):\n"), count);
8671             for (j = 0, chgprtoff += 4;
8672                  j < count && chgprtoff <= eiaf_size - sizeof (struct vms_eicp);
8673                  j++, chgprtoff += sizeof (struct vms_eicp))
8674               {
8675                 struct vms_eicp *eicp = (struct vms_eicp *) (buf + chgprtoff);
8676                 unsigned int prot = bfd_getl32 (eicp->newprt);
8677                 fprintf (file,
8678                            /* xgettext:c-format */
8679                            _("  base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
8680                            (unsigned) bfd_getl32 (eicp->baseva + 4),
8681                            (unsigned) bfd_getl32 (eicp->baseva + 0),
8682                            (unsigned) bfd_getl32 (eicp->size),
8683                            (unsigned) bfd_getl32 (eicp->newprt));
8684                 switch (prot)
8685                     {
8686                     case PRT__C_NA:
8687                       fprintf (file, "NA");
8688                       break;
8689                     case PRT__C_RESERVED:
8690                       fprintf (file, "RES");
8691                       break;
8692                     case PRT__C_KW:
8693                       fprintf (file, "KW");
8694                       break;
8695                     case PRT__C_KR:
8696                       fprintf (file, "KR");
8697                       break;
8698                     case PRT__C_UW:
8699                       fprintf (file, "UW");
8700                       break;
8701                     case PRT__C_EW:
8702                       fprintf (file, "EW");
8703                       break;
8704                     case PRT__C_ERKW:
8705                       fprintf (file, "ERKW");
8706                       break;
8707                     case PRT__C_ER:
8708                       fprintf (file, "ER");
8709                       break;
8710                     case PRT__C_SW:
8711                       fprintf (file, "SW");
8712                       break;
8713                     case PRT__C_SREW:
8714                       fprintf (file, "SREW");
8715                       break;
8716                     case PRT__C_SRKW:
8717                       fprintf (file, "SRKW");
8718                       break;
8719                     case PRT__C_SR:
8720                       fprintf (file, "SR");
8721                       break;
8722                     case PRT__C_URSW:
8723                       fprintf (file, "URSW");
8724                       break;
8725                     case PRT__C_UREW:
8726                       fprintf (file, "UREW");
8727                       break;
8728                     case PRT__C_URKW:
8729                       fprintf (file, "URKW");
8730                       break;
8731                     case PRT__C_UR:
8732                       fprintf (file, "UR");
8733                       break;
8734                     default:
8735                       fputs ("??", file);
8736                       break;
8737                     }
8738                 fputc ('\n', file);
8739               }
8740           }
8741       free (buf);
8742     }
8743 }
8744 
8745 static bool
vms_bfd_print_private_bfd_data(bfd * abfd,void * ptr)8746 vms_bfd_print_private_bfd_data (bfd *abfd, void *ptr)
8747 {
8748   FILE *file = (FILE *)ptr;
8749 
8750   if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
8751     evax_bfd_print_image (abfd, file);
8752   else
8753     {
8754       if (bfd_seek (abfd, 0, SEEK_SET))
8755           return false;
8756       evax_bfd_print_eobj (abfd, file);
8757     }
8758   return true;
8759 }
8760 
8761 /* Linking.  */
8762 
8763 /* Slurp ETIR/EDBG/ETBT VMS object records.  */
8764 
8765 static bool
alpha_vms_read_sections_content(bfd * abfd,struct bfd_link_info * info)8766 alpha_vms_read_sections_content (bfd *abfd, struct bfd_link_info *info)
8767 {
8768   asection *cur_section;
8769   file_ptr cur_offset;
8770   asection *dst_section;
8771   file_ptr dst_offset;
8772 
8773   if (bfd_seek (abfd, 0, SEEK_SET) != 0)
8774     return false;
8775 
8776   cur_section = NULL;
8777   cur_offset = 0;
8778 
8779   dst_section = PRIV (dst_section);
8780   dst_offset = 0;
8781   if (info)
8782     {
8783       if (info->strip == strip_all || info->strip == strip_debugger)
8784           {
8785             /* Discard the DST section.  */
8786             dst_offset = 0;
8787             dst_section = NULL;
8788           }
8789       else if (dst_section)
8790           {
8791             dst_offset = dst_section->output_offset;
8792             dst_section = dst_section->output_section;
8793           }
8794     }
8795 
8796   while (1)
8797     {
8798       int type;
8799       bool res;
8800 
8801       type = _bfd_vms_get_object_record (abfd);
8802       if (type < 0)
8803           {
8804             vms_debug2 ((2, "next_record failed\n"));
8805             return false;
8806           }
8807       switch (type)
8808           {
8809           case EOBJ__C_ETIR:
8810             PRIV (image_section) = cur_section;
8811             PRIV (image_offset) = cur_offset;
8812             res = _bfd_vms_slurp_etir (abfd, info);
8813             cur_section = PRIV (image_section);
8814             cur_offset = PRIV (image_offset);
8815             break;
8816           case EOBJ__C_EDBG:
8817           case EOBJ__C_ETBT:
8818             if (dst_section == NULL)
8819               continue;
8820             PRIV (image_section) = dst_section;
8821             PRIV (image_offset) = dst_offset;
8822             res = _bfd_vms_slurp_etir (abfd, info);
8823             dst_offset = PRIV (image_offset);
8824             break;
8825           case EOBJ__C_EEOM:
8826             return true;
8827           default:
8828             continue;
8829           }
8830       if (!res)
8831           {
8832             vms_debug2 ((2, "slurp eobj type %d failed\n", type));
8833             return false;
8834           }
8835     }
8836 }
8837 
8838 static int
alpha_vms_sizeof_headers(bfd * abfd ATTRIBUTE_UNUSED,struct bfd_link_info * info ATTRIBUTE_UNUSED)8839 alpha_vms_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
8840                                 struct bfd_link_info *info ATTRIBUTE_UNUSED)
8841 {
8842   return 0;
8843 }
8844 
8845 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
8846 
8847 static bool
alpha_vms_add_fixup_lp(struct bfd_link_info * info,bfd * src,bfd * shlib)8848 alpha_vms_add_fixup_lp (struct bfd_link_info *info, bfd *src, bfd *shlib)
8849 {
8850   struct alpha_vms_shlib_el *sl;
8851   asection *sect = PRIV2 (src, image_section);
8852   file_ptr offset = PRIV2 (src, image_offset);
8853   bfd_vma *p;
8854 
8855   sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8856                     struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8857   sl->has_fixups = true;
8858   p = VEC_APPEND (sl->lp, bfd_vma);
8859   if (p == NULL)
8860     return false;
8861   *p = sect->output_section->vma + sect->output_offset + offset;
8862   sect->output_section->flags |= SEC_RELOC;
8863   return true;
8864 }
8865 
8866 /* Add a code address fixup at address SECT + OFFSET to SHLIB. */
8867 
8868 static bool
alpha_vms_add_fixup_ca(struct bfd_link_info * info,bfd * src,bfd * shlib)8869 alpha_vms_add_fixup_ca (struct bfd_link_info *info, bfd *src, bfd *shlib)
8870 {
8871   struct alpha_vms_shlib_el *sl;
8872   asection *sect = PRIV2 (src, image_section);
8873   file_ptr offset = PRIV2 (src, image_offset);
8874   bfd_vma *p;
8875 
8876   sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8877                     struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8878   sl->has_fixups = true;
8879   p = VEC_APPEND (sl->ca, bfd_vma);
8880   if (p == NULL)
8881     return false;
8882   *p = sect->output_section->vma + sect->output_offset + offset;
8883   sect->output_section->flags |= SEC_RELOC;
8884   return true;
8885 }
8886 
8887 /* Add a quad word relocation fixup at address SECT + OFFSET to SHLIB. */
8888 
8889 static bool
alpha_vms_add_fixup_qr(struct bfd_link_info * info,bfd * src,bfd * shlib,bfd_vma vec)8890 alpha_vms_add_fixup_qr (struct bfd_link_info *info, bfd *src,
8891                               bfd *shlib, bfd_vma vec)
8892 {
8893   struct alpha_vms_shlib_el *sl;
8894   struct alpha_vms_vma_ref *r;
8895   asection *sect = PRIV2 (src, image_section);
8896   file_ptr offset = PRIV2 (src, image_offset);
8897 
8898   sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8899                     struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8900   sl->has_fixups = true;
8901   r = VEC_APPEND (sl->qr, struct alpha_vms_vma_ref);
8902   if (r == NULL)
8903     return false;
8904   r->vma = sect->output_section->vma + sect->output_offset + offset;
8905   r->ref = vec;
8906   sect->output_section->flags |= SEC_RELOC;
8907   return true;
8908 }
8909 
8910 static bool
alpha_vms_add_fixup_lr(struct bfd_link_info * info ATTRIBUTE_UNUSED,unsigned int shr ATTRIBUTE_UNUSED,bfd_vma vec ATTRIBUTE_UNUSED)8911 alpha_vms_add_fixup_lr (struct bfd_link_info *info ATTRIBUTE_UNUSED,
8912                               unsigned int shr ATTRIBUTE_UNUSED,
8913                               bfd_vma vec ATTRIBUTE_UNUSED)
8914 {
8915   /* Not yet supported.  */
8916   return false;
8917 }
8918 
8919 /* Add relocation.  FIXME: Not yet emitted.  */
8920 
8921 static bool
alpha_vms_add_lw_reloc(struct bfd_link_info * info ATTRIBUTE_UNUSED)8922 alpha_vms_add_lw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8923 {
8924   return false;
8925 }
8926 
8927 static bool
alpha_vms_add_qw_reloc(struct bfd_link_info * info ATTRIBUTE_UNUSED)8928 alpha_vms_add_qw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8929 {
8930   return false;
8931 }
8932 
8933 static struct bfd_hash_entry *
alpha_vms_link_hash_newfunc(struct bfd_hash_entry * entry,struct bfd_hash_table * table,const char * string)8934 alpha_vms_link_hash_newfunc (struct bfd_hash_entry *entry,
8935                                    struct bfd_hash_table *table,
8936                                    const char *string)
8937 {
8938   struct alpha_vms_link_hash_entry *ret =
8939     (struct alpha_vms_link_hash_entry *) entry;
8940 
8941   /* Allocate the structure if it has not already been allocated by a
8942      subclass.  */
8943   if (ret == NULL)
8944     ret = ((struct alpha_vms_link_hash_entry *)
8945              bfd_hash_allocate (table,
8946                                     sizeof (struct alpha_vms_link_hash_entry)));
8947   if (ret == NULL)
8948     return NULL;
8949 
8950   /* Call the allocation method of the superclass.  */
8951   ret = ((struct alpha_vms_link_hash_entry *)
8952            _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
8953                                          table, string));
8954 
8955   ret->sym = NULL;
8956 
8957   return (struct bfd_hash_entry *) ret;
8958 }
8959 
8960 static void
alpha_vms_bfd_link_hash_table_free(bfd * abfd)8961 alpha_vms_bfd_link_hash_table_free (bfd *abfd)
8962 {
8963   struct alpha_vms_link_hash_table *t;
8964   unsigned i;
8965 
8966   t = (struct alpha_vms_link_hash_table *) abfd->link.hash;
8967   for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8968     {
8969       struct alpha_vms_shlib_el *shlib;
8970 
8971       shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8972       free (&VEC_EL (shlib->ca, bfd_vma, 0));
8973       free (&VEC_EL (shlib->lp, bfd_vma, 0));
8974       free (&VEC_EL (shlib->qr, struct alpha_vms_vma_ref, 0));
8975     }
8976   free (&VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, 0));
8977 
8978   _bfd_generic_link_hash_table_free (abfd);
8979 }
8980 
8981 /* Create an Alpha/VMS link hash table.  */
8982 
8983 static struct bfd_link_hash_table *
alpha_vms_bfd_link_hash_table_create(bfd * abfd)8984 alpha_vms_bfd_link_hash_table_create (bfd *abfd)
8985 {
8986   struct alpha_vms_link_hash_table *ret;
8987   size_t amt = sizeof (struct alpha_vms_link_hash_table);
8988 
8989   ret = (struct alpha_vms_link_hash_table *) bfd_malloc (amt);
8990   if (ret == NULL)
8991     return NULL;
8992   if (!_bfd_link_hash_table_init (&ret->root, abfd,
8993                                           alpha_vms_link_hash_newfunc,
8994                                           sizeof (struct alpha_vms_link_hash_entry)))
8995     {
8996       free (ret);
8997       return NULL;
8998     }
8999 
9000   VEC_INIT (ret->shrlibs);
9001   ret->fixup = NULL;
9002   ret->root.hash_table_free = alpha_vms_bfd_link_hash_table_free;
9003 
9004   return &ret->root;
9005 }
9006 
9007 static bool
alpha_vms_link_add_object_symbols(bfd * abfd,struct bfd_link_info * info)9008 alpha_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
9009 {
9010   unsigned int i;
9011 
9012   for (i = 0; i < PRIV (gsd_sym_count); i++)
9013     {
9014       struct vms_symbol_entry *e = PRIV (syms)[i];
9015       struct alpha_vms_link_hash_entry *h;
9016       struct bfd_link_hash_entry *h_root;
9017       asymbol sym;
9018 
9019       if (!alpha_vms_convert_symbol (abfd, e, &sym))
9020           return false;
9021 
9022       if ((e->flags & EGSY__V_DEF) && abfd->selective_search)
9023           {
9024             /* In selective_search mode, only add definition that are
9025                required.  */
9026             h = (struct alpha_vms_link_hash_entry *)bfd_link_hash_lookup
9027               (info->hash, sym.name, false, false, false);
9028             if (h == NULL || h->root.type != bfd_link_hash_undefined)
9029               continue;
9030           }
9031       else
9032           h = NULL;
9033 
9034       h_root = (struct bfd_link_hash_entry *) h;
9035       if (!_bfd_generic_link_add_one_symbol (info, abfd, sym.name, sym.flags,
9036                                                        sym.section, sym.value, NULL,
9037                                                        false, false, &h_root))
9038           return false;
9039       h = (struct alpha_vms_link_hash_entry *) h_root;
9040 
9041       if ((e->flags & EGSY__V_DEF)
9042             && h->sym == NULL
9043             && abfd->xvec == info->output_bfd->xvec)
9044           h->sym = e;
9045     }
9046 
9047   if (abfd->flags & DYNAMIC)
9048     {
9049       struct alpha_vms_shlib_el *shlib;
9050 
9051       /* We do not want to include any of the sections in a dynamic
9052            object in the output file.  See comment in elflink.c.  */
9053       bfd_section_list_clear (abfd);
9054 
9055       shlib = VEC_APPEND (alpha_vms_link_hash (info)->shrlibs,
9056                                 struct alpha_vms_shlib_el);
9057       if (shlib == NULL)
9058           return false;
9059       shlib->abfd = abfd;
9060       VEC_INIT (shlib->ca);
9061       VEC_INIT (shlib->lp);
9062       VEC_INIT (shlib->qr);
9063       PRIV (shr_index) = VEC_COUNT (alpha_vms_link_hash (info)->shrlibs) - 1;
9064     }
9065 
9066   return true;
9067 }
9068 
9069 static bool
alpha_vms_link_add_archive_symbols(bfd * abfd,struct bfd_link_info * info)9070 alpha_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
9071 {
9072   int pass;
9073   struct bfd_link_hash_entry **pundef;
9074   struct bfd_link_hash_entry **next_pundef;
9075 
9076   /* We only accept VMS libraries.  */
9077   if (info->output_bfd->xvec != abfd->xvec)
9078     {
9079       bfd_set_error (bfd_error_wrong_format);
9080       return false;
9081     }
9082 
9083   /* The archive_pass field in the archive itself is used to
9084      initialize PASS, since we may search the same archive multiple
9085      times.  */
9086   pass = ++abfd->archive_pass;
9087 
9088   /* Look through the list of undefined symbols.  */
9089   for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef)
9090     {
9091       struct bfd_link_hash_entry *h;
9092       symindex symidx;
9093       bfd *element;
9094       bfd *orig_element;
9095 
9096       h = *pundef;
9097       next_pundef = &(*pundef)->u.undef.next;
9098 
9099       /* When a symbol is defined, it is not necessarily removed from
9100            the list.  */
9101       if (h->type != bfd_link_hash_undefined
9102             && h->type != bfd_link_hash_common)
9103           {
9104             /* Remove this entry from the list, for general cleanliness
9105                and because we are going to look through the list again
9106                if we search any more libraries.  We can't remove the
9107                entry if it is the tail, because that would lose any
9108                entries we add to the list later on.  */
9109             if (*pundef != info->hash->undefs_tail)
9110               {
9111                 *pundef = *next_pundef;
9112                 next_pundef = pundef;
9113               }
9114             continue;
9115           }
9116 
9117       /* Look for this symbol in the archive hash table.  */
9118       symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string);
9119       if (symidx == BFD_NO_MORE_SYMBOLS)
9120           {
9121             /* Nothing in this slot.  */
9122             continue;
9123           }
9124 
9125       element = bfd_get_elt_at_index (abfd, symidx);
9126       if (element == NULL)
9127           return false;
9128 
9129       if (element->archive_pass == -1 || element->archive_pass == pass)
9130           {
9131             /* Next symbol if this archive is wrong or already handled.  */
9132             continue;
9133           }
9134 
9135       if (! bfd_check_format (element, bfd_object))
9136           {
9137             element->archive_pass = -1;
9138             return false;
9139           }
9140 
9141       orig_element = element;
9142       if (bfd_is_thin_archive (abfd))
9143           {
9144             element = _bfd_vms_lib_get_imagelib_file (element);
9145             if (element == NULL || !bfd_check_format (element, bfd_object))
9146               {
9147                 orig_element->archive_pass = -1;
9148                 return false;
9149               }
9150           }
9151 
9152       /* Unlike the generic linker, we know that this element provides
9153            a definition for an undefined symbol and we know that we want
9154            to include it.  We don't need to check anything.  */
9155       if (!(*info->callbacks
9156               ->add_archive_element) (info, element, h->root.string, &element))
9157           continue;
9158       if (!alpha_vms_link_add_object_symbols (element, info))
9159           return false;
9160 
9161       orig_element->archive_pass = pass;
9162     }
9163 
9164   return true;
9165 }
9166 
9167 static bool
alpha_vms_bfd_link_add_symbols(bfd * abfd,struct bfd_link_info * info)9168 alpha_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
9169 {
9170   switch (bfd_get_format (abfd))
9171     {
9172     case bfd_object:
9173       vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
9174                        abfd->filename));
9175       return alpha_vms_link_add_object_symbols (abfd, info);
9176       break;
9177     case bfd_archive:
9178       vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
9179                        abfd->filename));
9180       return alpha_vms_link_add_archive_symbols (abfd, info);
9181       break;
9182     default:
9183       bfd_set_error (bfd_error_wrong_format);
9184       return false;
9185     }
9186 }
9187 
9188 static bool
alpha_vms_build_fixups(struct bfd_link_info * info)9189 alpha_vms_build_fixups (struct bfd_link_info *info)
9190 {
9191   struct alpha_vms_link_hash_table *t = alpha_vms_link_hash (info);
9192   unsigned char *content;
9193   unsigned int i;
9194   unsigned int sz = 0;
9195   unsigned int lp_sz = 0;
9196   unsigned int ca_sz = 0;
9197   unsigned int qr_sz = 0;
9198   unsigned int shrimg_cnt = 0;
9199   unsigned int chgprt_num = 0;
9200   unsigned int chgprt_sz = 0;
9201   struct vms_eiaf *eiaf;
9202   unsigned int off;
9203   asection *sec;
9204 
9205   /* Shared libraries.  */
9206   for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
9207     {
9208       struct alpha_vms_shlib_el *shlib;
9209 
9210       shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
9211 
9212       if (!shlib->has_fixups)
9213           continue;
9214 
9215       shrimg_cnt++;
9216 
9217       if (VEC_COUNT (shlib->ca) > 0)
9218           {
9219             /* Header + entries.  */
9220             ca_sz += 8;
9221             ca_sz += VEC_COUNT (shlib->ca) * 4;
9222           }
9223       if (VEC_COUNT (shlib->lp) > 0)
9224           {
9225             /* Header + entries.  */
9226             lp_sz += 8;
9227             lp_sz += VEC_COUNT (shlib->lp) * 4;
9228           }
9229       if (VEC_COUNT (shlib->qr) > 0)
9230           {
9231             /* Header + entries.  */
9232             qr_sz += 8;
9233             qr_sz += VEC_COUNT (shlib->qr) * 8;
9234           }
9235     }
9236   /* Add markers.  */
9237   if (ca_sz > 0)
9238     ca_sz += 8;
9239   if (lp_sz > 0)
9240     lp_sz += 8;
9241   if (qr_sz > 0)
9242     qr_sz += 8;
9243 
9244   /* Finish now if there is no content.  */
9245   if (ca_sz + lp_sz + qr_sz == 0)
9246     return true;
9247 
9248   /* Add an eicp entry for the fixup itself.  */
9249   chgprt_num = 1;
9250   for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
9251     {
9252       /* This isect could be made RO or EXE after relocations are applied.  */
9253       if ((sec->flags & SEC_RELOC) != 0
9254             && (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
9255           chgprt_num++;
9256     }
9257   chgprt_sz = 4 + chgprt_num * sizeof (struct vms_eicp);
9258 
9259   /* Allocate section content (round-up size)  */
9260   sz = sizeof (struct vms_eiaf) + shrimg_cnt * sizeof (struct vms_shl)
9261     + ca_sz + lp_sz + qr_sz + chgprt_sz;
9262   sz = (sz + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
9263   content = bfd_zalloc (info->output_bfd, sz);
9264   if (content == NULL)
9265     return false;
9266 
9267   sec = alpha_vms_link_hash (info)->fixup;
9268   sec->contents = content;
9269   sec->size = sz;
9270 
9271   eiaf = (struct vms_eiaf *)content;
9272   off = sizeof (struct vms_eiaf);
9273   bfd_putl32 (0, eiaf->majorid);
9274   bfd_putl32 (0, eiaf->minorid);
9275   bfd_putl32 (0, eiaf->iaflink);
9276   bfd_putl32 (0, eiaf->fixuplnk);
9277   bfd_putl32 (sizeof (struct vms_eiaf), eiaf->size);
9278   bfd_putl32 (0, eiaf->flags);
9279   bfd_putl32 (0, eiaf->qrelfixoff);
9280   bfd_putl32 (0, eiaf->lrelfixoff);
9281   bfd_putl32 (0, eiaf->qdotadroff);
9282   bfd_putl32 (0, eiaf->ldotadroff);
9283   bfd_putl32 (0, eiaf->codeadroff);
9284   bfd_putl32 (0, eiaf->lpfixoff);
9285   bfd_putl32 (0, eiaf->chgprtoff);
9286   bfd_putl32 (shrimg_cnt ? off : 0, eiaf->shlstoff);
9287   bfd_putl32 (shrimg_cnt, eiaf->shrimgcnt);
9288   bfd_putl32 (0, eiaf->shlextra);
9289   bfd_putl32 (0, eiaf->permctx);
9290   bfd_putl32 (0, eiaf->base_va);
9291   bfd_putl32 (0, eiaf->lppsbfixoff);
9292 
9293   if (shrimg_cnt)
9294     {
9295       shrimg_cnt = 0;
9296 
9297       /* Write shl.  */
9298       for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
9299           {
9300             struct alpha_vms_shlib_el *shlib;
9301             struct vms_shl *shl;
9302 
9303             shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
9304 
9305             if (!shlib->has_fixups)
9306               continue;
9307 
9308             /* Renumber shared images.  */
9309             PRIV2 (shlib->abfd, shr_index) = shrimg_cnt++;
9310 
9311             shl = (struct vms_shl *)(content + off);
9312             bfd_putl32 (0, shl->baseva);
9313             bfd_putl32 (0, shl->shlptr);
9314             bfd_putl32 (0, shl->ident);
9315             bfd_putl32 (0, shl->permctx);
9316             shl->size = sizeof (struct vms_shl);
9317             bfd_putl16 (0, shl->fill_1);
9318             shl->flags = 0;
9319             bfd_putl32 (0, shl->icb);
9320             shl->imgnam[0] = strlen (PRIV2 (shlib->abfd, hdr_data.hdr_t_name));
9321             memcpy (shl->imgnam + 1, PRIV2 (shlib->abfd, hdr_data.hdr_t_name),
9322                       shl->imgnam[0]);
9323 
9324             off += sizeof (struct vms_shl);
9325           }
9326 
9327       /* CA fixups.  */
9328       if (ca_sz != 0)
9329           {
9330             bfd_putl32 (off, eiaf->codeadroff);
9331 
9332             for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
9333               {
9334                 struct alpha_vms_shlib_el *shlib;
9335                 unsigned int j;
9336 
9337                 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
9338 
9339                 if (VEC_COUNT (shlib->ca) == 0)
9340                     continue;
9341 
9342                 bfd_putl32 (VEC_COUNT (shlib->ca), content + off);
9343                 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
9344                 off += 8;
9345 
9346                 for (j = 0; j < VEC_COUNT (shlib->ca); j++)
9347                     {
9348                       bfd_putl32 (VEC_EL (shlib->ca, bfd_vma, j) - t->base_addr,
9349                                     content + off);
9350                       off += 4;
9351                     }
9352               }
9353 
9354             bfd_putl32 (0, content + off);
9355             bfd_putl32 (0, content + off + 4);
9356             off += 8;
9357           }
9358 
9359       /* LP fixups.  */
9360       if (lp_sz != 0)
9361           {
9362             bfd_putl32 (off, eiaf->lpfixoff);
9363 
9364             for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
9365               {
9366                 struct alpha_vms_shlib_el *shlib;
9367                 unsigned int j;
9368 
9369                 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
9370 
9371                 if (VEC_COUNT (shlib->lp) == 0)
9372                     continue;
9373 
9374                 bfd_putl32 (VEC_COUNT (shlib->lp), content + off);
9375                 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
9376                 off += 8;
9377 
9378                 for (j = 0; j < VEC_COUNT (shlib->lp); j++)
9379                     {
9380                       bfd_putl32 (VEC_EL (shlib->lp, bfd_vma, j) - t->base_addr,
9381                                     content + off);
9382                       off += 4;
9383                     }
9384               }
9385 
9386             bfd_putl32 (0, content + off);
9387             bfd_putl32 (0, content + off + 4);
9388             off += 8;
9389           }
9390 
9391       /* QR fixups.  */
9392       if (qr_sz != 0)
9393           {
9394             bfd_putl32 (off, eiaf->qdotadroff);
9395 
9396             for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
9397               {
9398                 struct alpha_vms_shlib_el *shlib;
9399                 unsigned int j;
9400 
9401                 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
9402 
9403                 if (VEC_COUNT (shlib->qr) == 0)
9404                     continue;
9405 
9406                 bfd_putl32 (VEC_COUNT (shlib->qr), content + off);
9407                 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
9408                 off += 8;
9409 
9410                 for (j = 0; j < VEC_COUNT (shlib->qr); j++)
9411                     {
9412                       struct alpha_vms_vma_ref *r;
9413                       r = &VEC_EL (shlib->qr, struct alpha_vms_vma_ref, j);
9414                       bfd_putl32 (r->vma - t->base_addr, content + off);
9415                       bfd_putl32 (r->ref, content + off + 4);
9416                       off += 8;
9417                     }
9418               }
9419 
9420             bfd_putl32 (0, content + off);
9421             bfd_putl32 (0, content + off + 4);
9422             off += 8;
9423           }
9424     }
9425 
9426   /* Write the change protection table.  */
9427   bfd_putl32 (off, eiaf->chgprtoff);
9428   bfd_putl32 (chgprt_num, content + off);
9429   off += 4;
9430 
9431   for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
9432     {
9433       struct vms_eicp *eicp;
9434       unsigned int prot;
9435 
9436       if ((sec->flags & SEC_LINKER_CREATED) != 0 &&
9437             strcmp (sec->name, "$FIXUP$") == 0)
9438           prot = PRT__C_UREW;
9439       else if ((sec->flags & SEC_RELOC) != 0
9440                  && (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
9441           prot = PRT__C_UR;
9442       else
9443           continue;
9444 
9445       eicp = (struct vms_eicp *)(content + off);
9446       bfd_putl64 (sec->vma - t->base_addr, eicp->baseva);
9447       bfd_putl32 ((sec->size + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1),
9448                       eicp->size);
9449       bfd_putl32 (prot, eicp->newprt);
9450       off += sizeof (struct vms_eicp);
9451     }
9452 
9453   return true;
9454 }
9455 
9456 /* Called by bfd_hash_traverse to fill the symbol table.
9457    Return FALSE in case of failure.  */
9458 
9459 static bool
alpha_vms_link_output_symbol(struct bfd_hash_entry * bh,void * infov)9460 alpha_vms_link_output_symbol (struct bfd_hash_entry *bh, void *infov)
9461 {
9462   struct bfd_link_hash_entry *hc = (struct bfd_link_hash_entry *) bh;
9463   struct bfd_link_info *info = (struct bfd_link_info *)infov;
9464   struct alpha_vms_link_hash_entry *h;
9465   struct vms_symbol_entry *sym;
9466 
9467   if (hc->type == bfd_link_hash_warning)
9468     {
9469       hc = hc->u.i.link;
9470       if (hc->type == bfd_link_hash_new)
9471           return true;
9472     }
9473   h = (struct alpha_vms_link_hash_entry *) hc;
9474 
9475   switch (h->root.type)
9476     {
9477     case bfd_link_hash_undefined:
9478       return true;
9479     case bfd_link_hash_new:
9480     case bfd_link_hash_warning:
9481       abort ();
9482     case bfd_link_hash_undefweak:
9483       return true;
9484     case bfd_link_hash_defined:
9485     case bfd_link_hash_defweak:
9486       {
9487           asection *sec = h->root.u.def.section;
9488 
9489           /* FIXME: this is certainly a symbol from a dynamic library.  */
9490           if (bfd_is_abs_section (sec))
9491             return true;
9492 
9493           if (sec->owner->flags & DYNAMIC)
9494             return true;
9495       }
9496       break;
9497     case bfd_link_hash_common:
9498       break;
9499     case bfd_link_hash_indirect:
9500       return true;
9501     }
9502 
9503   /* Do not write not kept symbols.  */
9504   if (info->strip == strip_some
9505       && bfd_hash_lookup (info->keep_hash, h->root.root.string,
9506                                 false, false) != NULL)
9507     return true;
9508 
9509   if (h->sym == NULL)
9510     {
9511       /* This symbol doesn't come from a VMS object.  So we suppose it is
9512            a data.  */
9513       int len = strlen (h->root.root.string);
9514 
9515       sym = (struct vms_symbol_entry *)bfd_zalloc (info->output_bfd,
9516                                                                sizeof (*sym) + len);
9517       if (sym == NULL)
9518           abort ();
9519       sym->namelen = len;
9520       memcpy (sym->name, h->root.root.string, len);
9521       sym->name[len] = 0;
9522       sym->owner = info->output_bfd;
9523 
9524       sym->typ = EGSD__C_SYMG;
9525       sym->data_type = 0;
9526       sym->flags = EGSY__V_DEF | EGSY__V_REL;
9527       sym->symbol_vector = h->root.u.def.value;
9528       sym->section = h->root.u.def.section;
9529       sym->value = h->root.u.def.value;
9530     }
9531   else
9532     sym = h->sym;
9533 
9534   if (!add_symbol_entry (info->output_bfd, sym))
9535     return false;
9536 
9537   return true;
9538 }
9539 
9540 static bool
alpha_vms_bfd_final_link(bfd * abfd,struct bfd_link_info * info)9541 alpha_vms_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
9542 {
9543   asection *o;
9544   struct bfd_link_order *p;
9545   bfd *sub;
9546   asection *fixupsec;
9547   bfd_vma base_addr;
9548   bfd_vma last_addr;
9549   asection *dst;
9550   asection *dmt;
9551 
9552   if (bfd_link_relocatable (info))
9553     {
9554       /* FIXME: we do not yet support relocatable link.  It is not obvious
9555            how to do it for debug infos.  */
9556       (*info->callbacks->einfo)(_("%P: relocatable link is not supported\n"));
9557       return false;
9558     }
9559 
9560   abfd->outsymbols = NULL;
9561   abfd->symcount = 0;
9562 
9563   /* Mark all sections which will be included in the output file.  */
9564   for (o = abfd->sections; o != NULL; o = o->next)
9565     for (p = o->map_head.link_order; p != NULL; p = p->next)
9566       if (p->type == bfd_indirect_link_order)
9567           p->u.indirect.section->linker_mark = true;
9568 
9569 #if 0
9570   /* Handle all the link order information for the sections.  */
9571   for (o = abfd->sections; o != NULL; o = o->next)
9572     {
9573       printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
9574                 o->name, (unsigned)o->vma, (unsigned)o->flags);
9575 
9576       for (p = o->map_head.link_order; p != NULL; p = p->next)
9577           {
9578             printf (" at 0x%08x - 0x%08x: ",
9579                       (unsigned)p->offset, (unsigned)(p->offset + p->size - 1));
9580             switch (p->type)
9581               {
9582               case bfd_section_reloc_link_order:
9583               case bfd_symbol_reloc_link_order:
9584                 printf ("  section/symbol reloc\n");
9585                 break;
9586               case bfd_indirect_link_order:
9587                 printf ("  section %s of %s\n",
9588                           p->u.indirect.section->name,
9589                           p->u.indirect.section->owner->filename);
9590                 break;
9591               case bfd_data_link_order:
9592                 printf ("  explicit data\n");
9593                 break;
9594               default:
9595                 printf ("  *unknown* type %u\n", p->type);
9596                 break;
9597               }
9598           }
9599     }
9600 #endif
9601 
9602   /* Generate the symbol table.  */
9603   BFD_ASSERT (PRIV (syms) == NULL);
9604   if (info->strip != strip_all)
9605     bfd_hash_traverse (&info->hash->table, alpha_vms_link_output_symbol, info);
9606 
9607   /* Find the entry point.  */
9608   if (bfd_get_start_address (abfd) == 0)
9609     {
9610       bfd *startbfd = NULL;
9611 
9612       for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
9613           {
9614             /* Consider only VMS object files.  */
9615             if (sub->xvec != abfd->xvec)
9616               continue;
9617 
9618             if (!PRIV2 (sub, eom_data).eom_has_transfer)
9619               continue;
9620             if ((PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR) && startbfd)
9621               continue;
9622             if (startbfd != NULL
9623                 && !(PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR))
9624               {
9625                 (*info->callbacks->einfo)
9626                     /* xgettext:c-format */
9627                     (_("%P: multiple entry points: in modules %pB and %pB\n"),
9628                      startbfd, sub);
9629                 continue;
9630               }
9631             startbfd = sub;
9632           }
9633 
9634       if (startbfd)
9635           {
9636             unsigned int ps_idx = PRIV2 (startbfd, eom_data).eom_l_psindx;
9637             bfd_vma tfradr = PRIV2 (startbfd, eom_data).eom_l_tfradr;
9638             asection *sec;
9639 
9640             sec = PRIV2 (startbfd, sections)[ps_idx];
9641 
9642             bfd_set_start_address
9643               (abfd, sec->output_section->vma + sec->output_offset + tfradr);
9644           }
9645     }
9646 
9647   /* Set transfer addresses.  */
9648   {
9649     int i;
9650     struct bfd_link_hash_entry *h;
9651 
9652     i = 0;
9653     PRIV (transfer_address[i++]) = 0xffffffff00000340ULL;   /* SYS$IMGACT */
9654     h = bfd_link_hash_lookup (info->hash, "LIB$INITIALIZE", false, false, true);
9655     if (h != NULL && h->type == bfd_link_hash_defined)
9656       PRIV (transfer_address[i++]) =
9657           alpha_vms_get_sym_value (h->u.def.section, h->u.def.value);
9658     PRIV (transfer_address[i++]) = bfd_get_start_address (abfd);
9659     while (i < 4)
9660       PRIV (transfer_address[i++]) = 0;
9661   }
9662 
9663   /* Allocate contents.
9664      Also compute the virtual base address.  */
9665   base_addr = (bfd_vma)-1;
9666   last_addr = 0;
9667   for (o = abfd->sections; o != NULL; o = o->next)
9668     {
9669       if (o->flags & SEC_HAS_CONTENTS)
9670           {
9671             o->contents = bfd_alloc (abfd, o->size);
9672             if (o->contents == NULL)
9673               return false;
9674           }
9675       if (o->flags & SEC_LOAD)
9676           {
9677             if (o->vma < base_addr)
9678               base_addr = o->vma;
9679             if (o->vma + o->size > last_addr)
9680               last_addr = o->vma + o->size;
9681           }
9682       /* Clear the RELOC flags.  Currently we don't support incremental
9683            linking.  We use the RELOC flag for computing the eicp entries.  */
9684       o->flags &= ~SEC_RELOC;
9685     }
9686 
9687   /* Create the fixup section.  */
9688   fixupsec = bfd_make_section_anyway_with_flags
9689     (info->output_bfd, "$FIXUP$",
9690      SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
9691   if (fixupsec == NULL)
9692     return false;
9693   last_addr = (last_addr + 0xffff) & ~0xffff;
9694   fixupsec->vma = last_addr;
9695 
9696   alpha_vms_link_hash (info)->fixup = fixupsec;
9697   alpha_vms_link_hash (info)->base_addr = base_addr;
9698 
9699   /* Create the DMT section, if necessary.  */
9700   BFD_ASSERT (PRIV (dst_section) == NULL);
9701   dst = bfd_get_section_by_name (abfd, "$DST$");
9702   if (dst != NULL && dst->size == 0)
9703     dst = NULL;
9704   if (dst != NULL)
9705     {
9706       PRIV (dst_section) = dst;
9707       dmt = bfd_make_section_anyway_with_flags
9708           (info->output_bfd, "$DMT$",
9709            SEC_DEBUGGING | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
9710       if (dmt == NULL)
9711           return false;
9712     }
9713   else
9714     dmt = NULL;
9715 
9716   /* Read all sections from the inputs.  */
9717   for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
9718     {
9719       if (sub->flags & DYNAMIC)
9720           {
9721             alpha_vms_create_eisd_for_shared (abfd, sub);
9722             continue;
9723           }
9724 
9725       if (!alpha_vms_read_sections_content (sub, info))
9726           return false;
9727     }
9728 
9729   /* Handle all the link order information for the sections.
9730      Note: past this point, it is not possible to create new sections.  */
9731   for (o = abfd->sections; o != NULL; o = o->next)
9732     {
9733       for (p = o->map_head.link_order; p != NULL; p = p->next)
9734           {
9735             switch (p->type)
9736               {
9737               case bfd_section_reloc_link_order:
9738               case bfd_symbol_reloc_link_order:
9739                 abort ();
9740                 return false;
9741               case bfd_indirect_link_order:
9742                 /* Already done.  */
9743                 break;
9744               default:
9745                 if (! _bfd_default_link_order (abfd, info, o, p))
9746                     return false;
9747                 break;
9748               }
9749           }
9750     }
9751 
9752   /* Compute fixups.  */
9753   if (!alpha_vms_build_fixups (info))
9754     return false;
9755 
9756   /* Compute the DMT.  */
9757   if (dmt != NULL)
9758     {
9759       int pass;
9760       unsigned char *contents = NULL;
9761 
9762       /* In pass 1, compute the size.  In pass 2, write the DMT contents.  */
9763       for (pass = 0; pass < 2; pass++)
9764           {
9765             unsigned int off = 0;
9766 
9767             /* For each object file (ie for each module).  */
9768             for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
9769               {
9770                 asection *sub_dst;
9771                 struct vms_dmt_header *dmth = NULL;
9772                 unsigned int psect_count;
9773 
9774                 /* Skip this module if it has no DST.  */
9775                 sub_dst = PRIV2 (sub, dst_section);
9776                 if (sub_dst == NULL || sub_dst->size == 0)
9777                     continue;
9778 
9779                 if (pass == 1)
9780                     {
9781                       /* Write the header.  */
9782                       dmth = (struct vms_dmt_header *)(contents + off);
9783                       bfd_putl32 (sub_dst->output_offset, dmth->modbeg);
9784                       bfd_putl32 (sub_dst->size, dmth->size);
9785                     }
9786 
9787                 off += sizeof (struct vms_dmt_header);
9788                 psect_count = 0;
9789 
9790                 /* For each section (ie for each psect).  */
9791                 for (o = sub->sections; o != NULL; o = o->next)
9792                     {
9793                       /* Only consider interesting sections.  */
9794                       if (!(o->flags & SEC_ALLOC))
9795                         continue;
9796                       if (o->flags & SEC_LINKER_CREATED)
9797                         continue;
9798 
9799                       if (pass == 1)
9800                         {
9801                           /* Write an entry.  */
9802                           struct vms_dmt_psect *dmtp;
9803 
9804                           dmtp = (struct vms_dmt_psect *)(contents + off);
9805                           bfd_putl32 (o->output_offset + o->output_section->vma,
9806                                           dmtp->start);
9807                           bfd_putl32 (o->size, dmtp->length);
9808                           psect_count++;
9809                         }
9810                       off += sizeof (struct vms_dmt_psect);
9811                     }
9812                 if (pass == 1)
9813                     bfd_putl32 (psect_count, dmth->psect_count);
9814               }
9815 
9816             if (pass == 0)
9817               {
9818                 contents = bfd_zalloc (info->output_bfd, off);
9819                 if (contents == NULL)
9820                     return false;
9821                 dmt->contents = contents;
9822                 dmt->size = off;
9823               }
9824             else
9825               {
9826                 BFD_ASSERT (off == dmt->size);
9827               }
9828           }
9829     }
9830 
9831   return true;
9832 }
9833 
9834 /* Read the contents of a section.
9835    buf points to a buffer of buf_size bytes to be filled with
9836    section data (starting at offset into section)  */
9837 
9838 static bool
alpha_vms_get_section_contents(bfd * abfd,asection * section,void * buf,file_ptr offset,bfd_size_type count)9839 alpha_vms_get_section_contents (bfd *abfd, asection *section,
9840                                         void *buf, file_ptr offset,
9841                                         bfd_size_type count)
9842 {
9843   /* Handle image sections.  */
9844   if (section->filepos != 0
9845       || (section->flags & SEC_HAS_CONTENTS) == 0)
9846     return _bfd_generic_get_section_contents (abfd, section,
9847                                                         buf, offset, count);
9848 
9849   /* A section with a zero filepos implies the section has no direct
9850      file backing.  Its contents must be calculated by processing ETIR
9851      records.  */
9852 
9853   /* Safety check.  */
9854   if (offset + count < count
9855       || offset + count > section->size)
9856     {
9857       bfd_set_error (bfd_error_invalid_operation);
9858       return false;
9859     }
9860 
9861   if (section->size == 0)
9862     return true;
9863 
9864   /* If we haven't yet read ETIR/EDBG/ETBT records, do so.  */
9865   if ((section->flags & SEC_IN_MEMORY) == 0)
9866     {
9867       /* Alloc memory and read ETIRs.  */
9868       for (asection *sec = abfd->sections; sec; sec = sec->next)
9869           {
9870             if (sec->size != 0
9871                 && sec->filepos == 0
9872                 && (sec->flags & SEC_HAS_CONTENTS) != 0)
9873               {
9874                 BFD_ASSERT (sec->contents == NULL);
9875 
9876                 sec->contents = bfd_zalloc (abfd, sec->size);
9877                 sec->flags |= SEC_IN_MEMORY;
9878                 if (sec->contents == NULL)
9879                     return false;
9880               }
9881           }
9882       if (!alpha_vms_read_sections_content (abfd, NULL))
9883           return false;
9884     }
9885 
9886   BFD_ASSERT (section->contents != NULL);
9887   memcpy (buf, section->contents + offset, count);
9888   return true;
9889 }
9890 
9891 
9892 /* Set the format of a file being written.  */
9893 
9894 static bool
alpha_vms_mkobject(bfd * abfd)9895 alpha_vms_mkobject (bfd * abfd)
9896 {
9897   const bfd_arch_info_type *arch;
9898 
9899   vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd));
9900 
9901   if (!vms_initialize (abfd))
9902     return false;
9903 
9904   PRIV (recwr.buf) = bfd_alloc (abfd, MAX_OUTREC_SIZE);
9905   if (PRIV (recwr.buf) == NULL)
9906     return false;
9907 
9908   arch = bfd_scan_arch ("alpha");
9909 
9910   if (arch == 0)
9911     {
9912       bfd_set_error (bfd_error_wrong_format);
9913       return false;
9914     }
9915 
9916   abfd->arch_info = arch;
9917   return true;
9918 }
9919 
9920 
9921 /* 4.1, generic.  */
9922 
9923 /* Called when the BFD is being closed to do any necessary cleanup.  */
9924 
9925 static bool
vms_close_and_cleanup(bfd * abfd)9926 vms_close_and_cleanup (bfd * abfd)
9927 {
9928   vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd));
9929 
9930   if (abfd == NULL || abfd->tdata.any == NULL)
9931     return true;
9932 
9933   if (abfd->format == bfd_object)
9934     {
9935       alpha_vms_free_private (abfd);
9936 
9937 #ifdef VMS
9938       if (abfd->direction == write_direction)
9939           {
9940             /* Last step on VMS is to convert the file to variable record length
9941                format.  */
9942             if (!bfd_cache_close (abfd))
9943               return false;
9944             if (!_bfd_vms_convert_to_var_unix_filename (abfd->filename))
9945               return false;
9946           }
9947 #endif
9948     }
9949 
9950   return _bfd_generic_close_and_cleanup (abfd);
9951 }
9952 
9953 /* Called when a new section is created.  */
9954 
9955 static bool
vms_new_section_hook(bfd * abfd,asection * section)9956 vms_new_section_hook (bfd * abfd, asection *section)
9957 {
9958   size_t amt;
9959 
9960   vms_debug2 ((1, "vms_new_section_hook (%p, [%u]%s)\n",
9961                  abfd, section->index, section->name));
9962 
9963   if (!bfd_set_section_alignment (section, 0))
9964     return false;
9965 
9966   vms_debug2 ((7, "%u: %s\n", section->index, section->name));
9967 
9968   amt = sizeof (struct vms_section_data_struct);
9969   section->used_by_bfd = bfd_zalloc (abfd, amt);
9970   if (section->used_by_bfd == NULL)
9971     return false;
9972 
9973   /* Create the section symbol.  */
9974   return _bfd_generic_new_section_hook (abfd, section);
9975 }
9976 
9977 /* Part 4.5, symbols.  */
9978 
9979 /* Print symbol to file according to how. how is one of
9980    bfd_print_symbol_name      just print the name
9981    bfd_print_symbol_more      print more (???)
9982    bfd_print_symbol_all       print all we know, which is not much right now :-).  */
9983 
9984 static void
vms_print_symbol(bfd * abfd,void * file,asymbol * symbol,bfd_print_symbol_type how)9985 vms_print_symbol (bfd * abfd,
9986                       void * file,
9987                       asymbol *symbol,
9988                       bfd_print_symbol_type how)
9989 {
9990   vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
9991                  abfd, file, symbol, how));
9992 
9993   switch (how)
9994     {
9995       case bfd_print_symbol_name:
9996       case bfd_print_symbol_more:
9997           fprintf ((FILE *)file," %s", symbol->name);
9998       break;
9999 
10000       case bfd_print_symbol_all:
10001           {
10002             const char *section_name = symbol->section->name;
10003 
10004             bfd_print_symbol_vandf (abfd, file, symbol);
10005 
10006             fprintf ((FILE *) file," %-8s %s", section_name, symbol->name);
10007           }
10008       break;
10009     }
10010 }
10011 
10012 /* Return information about symbol in ret.
10013 
10014    fill type, value and name
10015    type:
10016           A         absolute
10017           B         bss segment symbol
10018           C         common symbol
10019           D         data segment symbol
10020           f         filename
10021           t         a static function symbol
10022           T         text segment symbol
10023           U         undefined
10024           -         debug.  */
10025 
10026 static void
vms_get_symbol_info(bfd * abfd ATTRIBUTE_UNUSED,asymbol * symbol,symbol_info * ret)10027 vms_get_symbol_info (bfd * abfd ATTRIBUTE_UNUSED,
10028                          asymbol *symbol,
10029                          symbol_info *ret)
10030 {
10031   asection *sec;
10032 
10033   vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd, symbol, ret));
10034 
10035   sec = symbol->section;
10036 
10037   if (ret == NULL)
10038     return;
10039 
10040   if (sec == NULL)
10041     ret->type = 'U';
10042   else if (bfd_is_com_section (sec))
10043     ret->type = 'C';
10044   else if (bfd_is_abs_section (sec))
10045     ret->type = 'A';
10046   else if (bfd_is_und_section (sec))
10047     ret->type = 'U';
10048   else if (bfd_is_ind_section (sec))
10049     ret->type = 'I';
10050   else if ((symbol->flags & BSF_FUNCTION)
10051              || (bfd_section_flags (sec) & SEC_CODE))
10052     ret->type = 'T';
10053   else if (bfd_section_flags (sec) & SEC_DATA)
10054     ret->type = 'D';
10055   else if (bfd_section_flags (sec) & SEC_ALLOC)
10056     ret->type = 'B';
10057   else
10058     ret->type = '?';
10059 
10060   if (ret->type != 'U')
10061     ret->value = symbol->value + symbol->section->vma;
10062   else
10063     ret->value = 0;
10064   ret->name = symbol->name;
10065 }
10066 
10067 /* Return TRUE if the given symbol sym in the BFD abfd is
10068    a compiler generated local label, else return FALSE.  */
10069 
10070 static bool
vms_bfd_is_local_label_name(bfd * abfd ATTRIBUTE_UNUSED,const char * name)10071 vms_bfd_is_local_label_name (bfd * abfd ATTRIBUTE_UNUSED,
10072                                    const char *name)
10073 {
10074   return name[0] == '$';
10075 }
10076 
10077 /* Part 4.7, writing an object file.  */
10078 
10079 /* Sets the contents of the section section in BFD abfd to the data starting
10080    in memory at LOCATION. The data is written to the output section starting
10081    at offset offset for count bytes.
10082 
10083    Normally TRUE is returned, else FALSE. Possible error returns are:
10084    o bfd_error_no_contents - The output section does not have the
10085           SEC_HAS_CONTENTS attribute, so nothing can be written to it.
10086    o and some more too  */
10087 
10088 static bool
_bfd_vms_set_section_contents(bfd * abfd,asection * section,const void * location,file_ptr offset,bfd_size_type count)10089 _bfd_vms_set_section_contents (bfd * abfd,
10090                                      asection *section,
10091                                      const void * location,
10092                                      file_ptr offset,
10093                                      bfd_size_type count)
10094 {
10095   if (section->contents == NULL)
10096     {
10097       section->contents = bfd_alloc (abfd, section->size);
10098       if (section->contents == NULL)
10099           return false;
10100 
10101       memcpy (section->contents + offset, location, (size_t) count);
10102     }
10103 
10104   return true;
10105 }
10106 
10107 /* Set the architecture and machine type in BFD abfd to arch and mach.
10108    Find the correct pointer to a structure and insert it into the arch_info
10109    pointer.  */
10110 
10111 static bool
alpha_vms_set_arch_mach(bfd * abfd,enum bfd_architecture arch,unsigned long mach)10112 alpha_vms_set_arch_mach (bfd *abfd,
10113                                enum bfd_architecture arch, unsigned long mach)
10114 {
10115   if (arch != bfd_arch_alpha
10116       && arch != bfd_arch_unknown)
10117     return false;
10118 
10119   return bfd_default_set_arch_mach (abfd, arch, mach);
10120 }
10121 
10122 /* Set section VMS flags.  Clear NO_FLAGS and set FLAGS.  */
10123 
10124 void
bfd_vms_set_section_flags(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,flagword no_flags,flagword flags)10125 bfd_vms_set_section_flags (bfd *abfd ATTRIBUTE_UNUSED,
10126                                  asection *sec, flagword no_flags, flagword flags)
10127 {
10128   vms_section_data (sec)->no_flags = no_flags;
10129   vms_section_data (sec)->flags = flags;
10130 }
10131 
10132 struct vms_private_data_struct *
bfd_vms_get_data(bfd * abfd)10133 bfd_vms_get_data (bfd *abfd)
10134 {
10135   return (struct vms_private_data_struct *)abfd->tdata.any;
10136 }
10137 
10138 #define vms_bfd_copy_private_bfd_data     _bfd_generic_bfd_copy_private_bfd_data
10139 #define vms_bfd_merge_private_bfd_data    _bfd_generic_bfd_merge_private_bfd_data
10140 #define vms_init_private_section_data     _bfd_generic_init_private_section_data
10141 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
10142 #define vms_bfd_copy_private_symbol_data  _bfd_generic_bfd_copy_private_symbol_data
10143 #define vms_bfd_copy_private_header_data  _bfd_generic_bfd_copy_private_header_data
10144 #define vms_bfd_set_private_flags         _bfd_generic_bfd_set_private_flags
10145 
10146 /* Symbols table.  */
10147 #define alpha_vms_make_empty_symbol        _bfd_generic_make_empty_symbol
10148 #define alpha_vms_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
10149 #define alpha_vms_print_symbol                       vms_print_symbol
10150 #define alpha_vms_get_symbol_info          vms_get_symbol_info
10151 #define alpha_vms_get_symbol_version_string \
10152   _bfd_nosymbols_get_symbol_version_string
10153 
10154 #define alpha_vms_read_minisymbols         _bfd_generic_read_minisymbols
10155 #define alpha_vms_minisymbol_to_symbol     _bfd_generic_minisymbol_to_symbol
10156 #define alpha_vms_get_lineno               _bfd_nosymbols_get_lineno
10157 #define alpha_vms_find_inliner_info        _bfd_nosymbols_find_inliner_info
10158 #define alpha_vms_bfd_make_debug_symbol    _bfd_nosymbols_bfd_make_debug_symbol
10159 #define alpha_vms_find_nearest_line        _bfd_vms_find_nearest_line
10160 #define alpha_vms_find_nearest_line_with_alt \
10161    _bfd_nosymbols_find_nearest_line_with_alt
10162 #define alpha_vms_find_line                _bfd_nosymbols_find_line
10163 #define alpha_vms_bfd_is_local_label_name  vms_bfd_is_local_label_name
10164 
10165 /* Generic table.  */
10166 #define alpha_vms_close_and_cleanup        vms_close_and_cleanup
10167 #define alpha_vms_bfd_free_cached_info     _bfd_bool_bfd_true
10168 #define alpha_vms_new_section_hook         vms_new_section_hook
10169 #define alpha_vms_set_section_contents     _bfd_vms_set_section_contents
10170 
10171 #define alpha_vms_bfd_get_relocated_section_contents \
10172   bfd_generic_get_relocated_section_contents
10173 
10174 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
10175 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
10176 #define alpha_vms_bfd_lookup_section_flags bfd_generic_lookup_section_flags
10177 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
10178 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
10179 #define alpha_vms_bfd_group_name bfd_generic_group_name
10180 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
10181 #define alpha_vms_section_already_linked \
10182   _bfd_generic_section_already_linked
10183 
10184 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
10185 #define alpha_vms_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
10186 #define alpha_vms_bfd_define_start_stop bfd_generic_define_start_stop
10187 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
10188 #define alpha_vms_bfd_copy_link_hash_symbol_type \
10189   _bfd_generic_copy_link_hash_symbol_type
10190 
10191 #define alpha_vms_bfd_link_split_section  _bfd_generic_link_split_section
10192 
10193 #define alpha_vms_get_dynamic_symtab_upper_bound \
10194   _bfd_nodynamic_get_dynamic_symtab_upper_bound
10195 #define alpha_vms_canonicalize_dynamic_symtab \
10196   _bfd_nodynamic_canonicalize_dynamic_symtab
10197 #define alpha_vms_get_dynamic_reloc_upper_bound \
10198   _bfd_nodynamic_get_dynamic_reloc_upper_bound
10199 #define alpha_vms_canonicalize_dynamic_reloc \
10200   _bfd_nodynamic_canonicalize_dynamic_reloc
10201 #define alpha_vms_bfd_link_check_relocs                _bfd_generic_link_check_relocs
10202 
10203 const bfd_target alpha_vms_vec =
10204 {
10205   "vms-alpha",                          /* Name.  */
10206   bfd_target_evax_flavour,
10207   BFD_ENDIAN_LITTLE,                    /* Data byte order is little.  */
10208   BFD_ENDIAN_LITTLE,                    /* Header byte order is little.  */
10209 
10210   (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
10211    | WP_TEXT | D_PAGED),      /* Object flags.  */
10212   (SEC_ALLOC | SEC_LOAD | SEC_RELOC
10213    | SEC_READONLY | SEC_CODE | SEC_DATA
10214    | SEC_HAS_CONTENTS | SEC_IN_MEMORY),           /* Sect flags.  */
10215   0,                                    /* symbol_leading_char.  */
10216   ' ',                                  /* ar_pad_char.  */
10217   15,                                   /* ar_max_namelen.  */
10218   0,                                    /* match priority.  */
10219   TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
10220   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
10221   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
10222   bfd_getl16, bfd_getl_signed_16, bfd_putl16,
10223   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
10224   bfd_getl32, bfd_getl_signed_32, bfd_putl32,
10225   bfd_getl16, bfd_getl_signed_16, bfd_putl16,
10226 
10227   {                                     /* bfd_check_format.  */
10228     _bfd_dummy_target,
10229     alpha_vms_object_p,
10230     _bfd_vms_lib_alpha_archive_p,
10231     _bfd_dummy_target
10232   },
10233   {                                     /* bfd_set_format.  */
10234     _bfd_bool_bfd_false_error,
10235     alpha_vms_mkobject,
10236     _bfd_vms_lib_alpha_mkarchive,
10237     _bfd_bool_bfd_false_error
10238   },
10239   {                                     /* bfd_write_contents.  */
10240     _bfd_bool_bfd_false_error,
10241     alpha_vms_write_object_contents,
10242     _bfd_vms_lib_write_archive_contents,
10243     _bfd_bool_bfd_false_error
10244   },
10245 
10246   BFD_JUMP_TABLE_GENERIC (alpha_vms),
10247   BFD_JUMP_TABLE_COPY (vms),
10248   BFD_JUMP_TABLE_CORE (_bfd_nocore),
10249   BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib),
10250   BFD_JUMP_TABLE_SYMBOLS (alpha_vms),
10251   BFD_JUMP_TABLE_RELOCS (alpha_vms),
10252   BFD_JUMP_TABLE_WRITE (alpha_vms),
10253   BFD_JUMP_TABLE_LINK (alpha_vms),
10254   BFD_JUMP_TABLE_DYNAMIC (alpha_vms),
10255 
10256   NULL,
10257 
10258   NULL
10259 };
10260