OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [vms-alpha.c] - Blame information for rev 14

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.