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