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 241

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 161 khays
  unsigned int vms_linkage_index;
334 14 khays
 
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 161 khays
  _bfd_vms_output_long (recwr, PRIV (vms_linkage_index + 1) >> 1);
2664 14 khays
  _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 161 khays
  PRIV (vms_linkage_index) = 0;
3740 14 khays
 
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 161 khays
                    (recwr, (unsigned long) rptr->addend);
3951
                  if (rptr->addend > PRIV (vms_linkage_index))
3952
                    PRIV (vms_linkage_index) = rptr->addend;
3953 14 khays
                  hash = _bfd_vms_length_hash_symbol
3954
                    (abfd, sym->name, EOBJ__C_SYMSIZ);
3955
                  _bfd_vms_output_counted (recwr, hash);
3956
                  _bfd_vms_output_byte (recwr, 0);
3957
                  _bfd_vms_output_end_subrec (recwr);
3958
                  break;
3959
 
3960
                case ALPHA_R_CODEADDR:
3961
                  slen = strlen ((char *) sym->name);
3962
                  hash = _bfd_vms_length_hash_symbol
3963
                    (abfd, sym->name, EOBJ__C_SYMSIZ);
3964
                  etir_output_check (abfd, section, curr_addr, slen);
3965
                  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_CA);
3966
                  _bfd_vms_output_counted (recwr, hash);
3967
                  _bfd_vms_output_end_subrec (recwr);
3968
                  break;
3969
 
3970
                case ALPHA_R_NOP:
3971
                  udata
3972
                    = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3973
                  etir_output_check (abfd, section, curr_addr,
3974
                                     32 + 1 + strlen (udata->origname));
3975
                  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_NOP_GBL);
3976
                  _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
3977
                  _bfd_vms_output_long
3978 161 khays
                    (recwr, (unsigned long) section->target_index);
3979 14 khays
                  _bfd_vms_output_quad (recwr, rptr->address);
3980
                  _bfd_vms_output_long (recwr, (unsigned long) 0x47ff041f);
3981
                  _bfd_vms_output_long
3982 161 khays
                    (recwr, (unsigned long) section->target_index);
3983 14 khays
                  _bfd_vms_output_quad (recwr, rptr->addend);
3984
                  _bfd_vms_output_counted
3985
                    (recwr, _bfd_vms_length_hash_symbol
3986
                     (abfd, udata->origname, EOBJ__C_SYMSIZ));
3987
                  _bfd_vms_output_end_subrec (recwr);
3988
                  break;
3989
 
3990
                case ALPHA_R_BSR:
3991
                  (*_bfd_error_handler) (_("Spurious ALPHA_R_BSR reloc"));
3992
                  break;
3993
 
3994
                case ALPHA_R_LDA:
3995
                  udata
3996
                    = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3997
                  etir_output_check (abfd, section, curr_addr,
3998
                                     32 + 1 + strlen (udata->origname));
3999
                  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LDA_GBL);
4000
                  _bfd_vms_output_long
4001
                    (recwr, (unsigned long) udata->lkindex + 1);
4002
                  _bfd_vms_output_long
4003 161 khays
                    (recwr, (unsigned long) section->target_index);
4004 14 khays
                  _bfd_vms_output_quad (recwr, rptr->address);
4005
                  _bfd_vms_output_long (recwr, (unsigned long) 0x237B0000);
4006
                  _bfd_vms_output_long
4007
                    (recwr, (unsigned long) udata->bsym->section->target_index);
4008
                  _bfd_vms_output_quad (recwr, rptr->addend);
4009
                  _bfd_vms_output_counted
4010
                    (recwr, _bfd_vms_length_hash_symbol
4011
                     (abfd, udata->origname, EOBJ__C_SYMSIZ));
4012
                  _bfd_vms_output_end_subrec (recwr);
4013
                  break;
4014
 
4015
                case ALPHA_R_BOH:
4016
                  udata
4017
                    = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
4018
                  etir_output_check (abfd, section, curr_addr,
4019
                                       32 + 1 + strlen (udata->origname));
4020
                  _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_BOH_GBL);
4021
                  _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
4022
                  _bfd_vms_output_long
4023 161 khays
                    (recwr, (unsigned long) section->target_index);
4024 14 khays
                  _bfd_vms_output_quad (recwr, rptr->address);
4025
                  _bfd_vms_output_long (recwr, (unsigned long) 0xD3400000);
4026
                  _bfd_vms_output_long
4027 161 khays
                    (recwr, (unsigned long) section->target_index);
4028 14 khays
                  _bfd_vms_output_quad (recwr, rptr->addend);
4029
                  _bfd_vms_output_counted
4030
                    (recwr, _bfd_vms_length_hash_symbol
4031
                     (abfd, udata->origname, EOBJ__C_SYMSIZ));
4032
                  _bfd_vms_output_end_subrec (recwr);
4033
                  break;
4034
 
4035
                default:
4036
                  (*_bfd_error_handler) (_("Unhandled relocation %s"),
4037
                                         rptr->howto->name);
4038
                  break;
4039
                }
4040
 
4041
              curr_data += size;
4042
              curr_addr += size;
4043
            } /* End of relocs loop.  */
4044
 
4045
          if (!pass2_in_progress)
4046
            {
4047
              /* Output rest of section.  */
4048
              if (curr_addr > section->size)
4049
                (*_bfd_error_handler) (_("Size error in section %s"),
4050
                                       section->name);
4051
              size = section->size - curr_addr;
4052
              sto_imm (abfd, section, size, curr_data, curr_addr);
4053
              curr_data += size;
4054
              curr_addr += size;
4055
 
4056
              if (pass2_needed)
4057
                {
4058
                  pass2_in_progress = 1;
4059
                  goto new_pass;
4060
                }
4061
            }
4062
        }
4063
 
4064
      else /* (section->flags & SEC_RELOC) */
4065
        sto_imm (abfd, section, section->size, section->contents, 0);
4066
 
4067
      end_etir_record (abfd);
4068
    }
4069
 
4070
  _bfd_vms_output_alignment (recwr, 2);
4071
  return TRUE;
4072
}
4073
 
4074
/* Write cached information into a file being written, at bfd_close.  */
4075
 
4076
static bfd_boolean
4077
alpha_vms_write_object_contents (bfd *abfd)
4078
{
4079
  vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd));
4080
 
4081
  if (abfd->flags & (EXEC_P | DYNAMIC))
4082
    {
4083
      return alpha_vms_write_exec (abfd);
4084
    }
4085
  else
4086
    {
4087
      if (abfd->section_count > 0)                       /* we have sections */
4088
        {
4089
          if (_bfd_vms_write_ehdr (abfd) != TRUE)
4090
            return FALSE;
4091
          if (_bfd_vms_write_egsd (abfd) != TRUE)
4092
            return FALSE;
4093
          if (_bfd_vms_write_etir (abfd, EOBJ__C_ETIR) != TRUE)
4094
            return FALSE;
4095
          if (_bfd_vms_write_eeom (abfd) != TRUE)
4096
            return FALSE;
4097
        }
4098
    }
4099
  return TRUE;
4100
}
4101
 
4102
/* Debug stuff: nearest line.  */
4103
 
4104
#define SET_MODULE_PARSED(m) \
4105
  do { if ((m)->name == NULL) (m)->name = ""; } while (0)
4106
#define IS_MODULE_PARSED(m) ((m)->name != NULL)
4107
 
4108
/* Build a new module for the specified BFD.  */
4109
 
4110
static struct module *
4111
new_module (bfd *abfd)
4112
{
4113
  struct module *module
4114
    = (struct module *) bfd_zalloc (abfd, sizeof (struct module));
4115
  module->file_table_count = 16; /* Arbitrary.  */
4116
  module->file_table
4117
    = bfd_malloc (module->file_table_count * sizeof (struct fileinfo));
4118
  return module;
4119
}
4120
 
4121
/* Parse debug info for a module and internalize it.  */
4122
 
4123
static void
4124
parse_module (bfd *abfd, struct module *module, unsigned char *ptr,
4125
              int length)
4126
{
4127
  unsigned char *maxptr = ptr + length;
4128
  unsigned char *src_ptr, *pcl_ptr;
4129
  unsigned int prev_linum = 0, curr_linenum = 0;
4130
  bfd_vma prev_pc = 0, curr_pc = 0;
4131
  struct srecinfo *curr_srec, *srec;
4132
  struct lineinfo *curr_line, *line;
4133
  struct funcinfo *funcinfo;
4134
 
4135
  /* Initialize tables with zero element.  */
4136
  curr_srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
4137
  module->srec_table = curr_srec;
4138
 
4139
  curr_line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
4140
  module->line_table = curr_line;
4141
 
4142
  while (length == -1 || ptr < maxptr)
4143
    {
4144
      /* The first byte is not counted in the recorded length.  */
4145
      int rec_length = bfd_getl16 (ptr) + 1;
4146
      int rec_type = bfd_getl16 (ptr + 2);
4147
 
4148
      vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length, rec_type));
4149
 
4150
      if (length == -1 && rec_type == DST__K_MODEND)
4151
        break;
4152
 
4153
      switch (rec_type)
4154
        {
4155
        case DST__K_MODBEG:
4156
          module->name
4157
            = _bfd_vms_save_counted_string (ptr + DST_S_B_MODBEG_NAME);
4158
 
4159
          curr_pc = 0;
4160
          prev_pc = 0;
4161
          curr_linenum = 0;
4162
          prev_linum = 0;
4163
 
4164
          vms_debug2 ((3, "module: %s\n", module->name));
4165
          break;
4166
 
4167
        case DST__K_MODEND:
4168
          break;
4169
 
4170
        case DST__K_RTNBEG:
4171
          funcinfo = (struct funcinfo *)
4172
            bfd_zalloc (abfd, sizeof (struct funcinfo));
4173
          funcinfo->name
4174
            = _bfd_vms_save_counted_string (ptr + DST_S_B_RTNBEG_NAME);
4175
          funcinfo->low = bfd_getl32 (ptr + DST_S_L_RTNBEG_ADDRESS);
4176
          funcinfo->next = module->func_table;
4177
          module->func_table = funcinfo;
4178
 
4179
          vms_debug2 ((3, "routine: %s at 0x%lx\n",
4180
                       funcinfo->name, (unsigned long) funcinfo->low));
4181
          break;
4182
 
4183
        case DST__K_RTNEND:
4184
          module->func_table->high = module->func_table->low
4185
            + bfd_getl32 (ptr + DST_S_L_RTNEND_SIZE) - 1;
4186
 
4187
          if (module->func_table->high > module->high)
4188
            module->high = module->func_table->high;
4189
 
4190
          vms_debug2 ((3, "end routine\n"));
4191
          break;
4192
 
4193
        case DST__K_PROLOG:
4194
          vms_debug2 ((3, "prologue\n"));
4195
          break;
4196
 
4197
        case DST__K_EPILOG:
4198
          vms_debug2 ((3, "epilog\n"));
4199
          break;
4200
 
4201
        case DST__K_BLKBEG:
4202
          vms_debug2 ((3, "block\n"));
4203
          break;
4204
 
4205
        case DST__K_BLKEND:
4206
          vms_debug2 ((3, "end block\n"));
4207
          break;
4208
 
4209
        case DST__K_SOURCE:
4210
          src_ptr = ptr + DST_S_C_SOURCE_HEADER_SIZE;
4211
 
4212
          vms_debug2 ((3, "source info\n"));
4213
 
4214
          while (src_ptr < ptr + rec_length)
4215
            {
4216
              int cmd = src_ptr[0], cmd_length, data;
4217
 
4218
              switch (cmd)
4219
                {
4220
                case DST__K_SRC_DECLFILE:
4221
                  {
4222
                    unsigned int fileid
4223
                      = bfd_getl16 (src_ptr + DST_S_W_SRC_DF_FILEID);
4224
                    char *filename
4225
                      = _bfd_vms_save_counted_string (src_ptr
4226
                          + DST_S_B_SRC_DF_FILENAME);
4227
 
4228
                    while (fileid >= module->file_table_count)
4229
                      {
4230
                        module->file_table_count *= 2;
4231
                        module->file_table
4232
                          = bfd_realloc (module->file_table,
4233
                                         module->file_table_count
4234
                                           * sizeof (struct fileinfo));
4235
                      }
4236
 
4237
                    module->file_table [fileid].name = filename;
4238
                    module->file_table [fileid].srec = 1;
4239
                    cmd_length = src_ptr[DST_S_B_SRC_DF_LENGTH] + 2;
4240
                    vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4241
                                 fileid, module->file_table [fileid].name));
4242
                  }
4243
                  break;
4244
 
4245
                case DST__K_SRC_DEFLINES_B:
4246
                  /* Perform the association and set the next higher index
4247
                     to the limit.  */
4248
                  data = src_ptr[DST_S_B_SRC_UNSBYTE];
4249
                  srec = (struct srecinfo *)
4250
                    bfd_zalloc (abfd, sizeof (struct srecinfo));
4251
                  srec->line = curr_srec->line + data;
4252
                  srec->srec = curr_srec->srec + data;
4253
                  srec->sfile = curr_srec->sfile;
4254
                  curr_srec->next = srec;
4255
                  curr_srec = srec;
4256
                  cmd_length = 2;
4257
                  vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data));
4258
                  break;
4259
 
4260
                case DST__K_SRC_DEFLINES_W:
4261
                  /* Perform the association and set the next higher index
4262
                     to the limit.  */
4263
                  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4264
                  srec = (struct srecinfo *)
4265
                    bfd_zalloc (abfd, sizeof (struct srecinfo));
4266
                  srec->line = curr_srec->line + data;
4267
                  srec->srec = curr_srec->srec + data,
4268
                  srec->sfile = curr_srec->sfile;
4269
                  curr_srec->next = srec;
4270
                  curr_srec = srec;
4271
                  cmd_length = 3;
4272
                  vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data));
4273
                  break;
4274
 
4275
                case DST__K_SRC_INCRLNUM_B:
4276
                  data = src_ptr[DST_S_B_SRC_UNSBYTE];
4277
                  curr_srec->line += data;
4278
                  cmd_length = 2;
4279
                  vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data));
4280
                  break;
4281
 
4282
                case DST__K_SRC_SETFILE:
4283
                  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4284
                  curr_srec->sfile = data;
4285
                  curr_srec->srec = module->file_table[data].srec;
4286
                  cmd_length = 3;
4287
                  vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data));
4288
                  break;
4289
 
4290
                case DST__K_SRC_SETLNUM_L:
4291
                  data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4292
                  curr_srec->line = data;
4293
                  cmd_length = 5;
4294
                  vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data));
4295
                  break;
4296
 
4297
                case DST__K_SRC_SETLNUM_W:
4298
                  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4299
                  curr_srec->line = data;
4300
                  cmd_length = 3;
4301
                  vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data));
4302
                  break;
4303
 
4304
                case DST__K_SRC_SETREC_L:
4305
                  data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4306
                  curr_srec->srec = data;
4307
                  module->file_table[curr_srec->sfile].srec = data;
4308
                  cmd_length = 5;
4309
                  vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data));
4310
                  break;
4311
 
4312
                case DST__K_SRC_SETREC_W:
4313
                  data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4314
                  curr_srec->srec = data;
4315
                  module->file_table[curr_srec->sfile].srec = data;
4316
                  cmd_length = 3;
4317
                  vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data));
4318
                  break;
4319
 
4320
                case DST__K_SRC_FORMFEED:
4321
                  cmd_length = 1;
4322
                  vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4323
                  break;
4324
 
4325
                default:
4326
                  (*_bfd_error_handler) (_("unknown source command %d"),
4327
                                         cmd);
4328
                  cmd_length = 2;
4329
                  break;
4330
                }
4331
 
4332
              src_ptr += cmd_length;
4333
            }
4334
          break;
4335
 
4336
        case DST__K_LINE_NUM:
4337
          pcl_ptr = ptr + DST_S_C_LINE_NUM_HEADER_SIZE;
4338
 
4339
          vms_debug2 ((3, "line info\n"));
4340
 
4341
          while (pcl_ptr < ptr + rec_length)
4342
            {
4343
              /* The command byte is signed so we must sign-extend it.  */
4344
              int cmd = ((signed char *)pcl_ptr)[0], cmd_length, data;
4345
 
4346
              switch (cmd)
4347
                {
4348
                case DST__K_DELTA_PC_W:
4349
                  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4350
                  curr_pc += data;
4351
                  curr_linenum += 1;
4352
                  cmd_length = 3;
4353
                  vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data));
4354
                  break;
4355
 
4356
                case DST__K_DELTA_PC_L:
4357
                  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4358
                  curr_pc += data;
4359
                  curr_linenum += 1;
4360
                  cmd_length = 5;
4361
                  vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data));
4362
                  break;
4363
 
4364
                case DST__K_INCR_LINUM:
4365
                  data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4366
                  curr_linenum += data;
4367
                  cmd_length = 2;
4368
                  vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data));
4369
                  break;
4370
 
4371
                case DST__K_INCR_LINUM_W:
4372
                  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4373
                  curr_linenum += data;
4374
                  cmd_length = 3;
4375
                  vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data));
4376
                  break;
4377
 
4378
                case DST__K_INCR_LINUM_L:
4379
                  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4380
                  curr_linenum += data;
4381
                  cmd_length = 5;
4382
                  vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data));
4383
                  break;
4384
 
4385
                case DST__K_SET_LINUM_INCR:
4386
                  (*_bfd_error_handler)
4387
                    (_("DST__K_SET_LINUM_INCR not implemented"));
4388
                  cmd_length = 2;
4389
                  break;
4390
 
4391
                case DST__K_SET_LINUM_INCR_W:
4392
                  (*_bfd_error_handler)
4393
                    (_("DST__K_SET_LINUM_INCR_W not implemented"));
4394
                  cmd_length = 3;
4395
                  break;
4396
 
4397
                case DST__K_RESET_LINUM_INCR:
4398
                  (*_bfd_error_handler)
4399
                    (_("DST__K_RESET_LINUM_INCR not implemented"));
4400
                  cmd_length = 1;
4401
                  break;
4402
 
4403
                case DST__K_BEG_STMT_MODE:
4404
                  (*_bfd_error_handler)
4405
                    (_("DST__K_BEG_STMT_MODE not implemented"));
4406
                  cmd_length = 1;
4407
                  break;
4408
 
4409
                case DST__K_END_STMT_MODE:
4410
                  (*_bfd_error_handler)
4411
                    (_("DST__K_END_STMT_MODE not implemented"));
4412
                  cmd_length = 1;
4413
                  break;
4414
 
4415
                case DST__K_SET_LINUM_B:
4416
                  data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4417
                  curr_linenum = data;
4418
                  cmd_length = 2;
4419
                  vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data));
4420
                  break;
4421
 
4422
                case DST__K_SET_LINUM:
4423
                  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4424
                  curr_linenum = data;
4425
                  cmd_length = 3;
4426
                  vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data));
4427
                  break;
4428
 
4429
                case DST__K_SET_LINUM_L:
4430
                  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4431
                  curr_linenum = data;
4432
                  cmd_length = 5;
4433
                  vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data));
4434
                  break;
4435
 
4436
                case DST__K_SET_PC:
4437
                  (*_bfd_error_handler)
4438
                    (_("DST__K_SET_PC not implemented"));
4439
                  cmd_length = 2;
4440
                  break;
4441
 
4442
                case DST__K_SET_PC_W:
4443
                  (*_bfd_error_handler)
4444
                    (_("DST__K_SET_PC_W not implemented"));
4445
                  cmd_length = 3;
4446
                  break;
4447
 
4448
                case DST__K_SET_PC_L:
4449
                  (*_bfd_error_handler)
4450
                    (_("DST__K_SET_PC_L not implemented"));
4451
                  cmd_length = 5;
4452
                  break;
4453
 
4454
                case DST__K_SET_STMTNUM:
4455
                  (*_bfd_error_handler)
4456
                    (_("DST__K_SET_STMTNUM not implemented"));
4457
                  cmd_length = 2;
4458
                  break;
4459
 
4460
                case DST__K_TERM:
4461
                  data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4462
                  curr_pc += data;
4463
                  cmd_length = 2;
4464
                  vms_debug2 ((4, "DST__K_TERM: %d\n", data));
4465
                  break;
4466
 
4467
                case DST__K_TERM_W:
4468
                  data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4469
                  curr_pc += data;
4470
                  cmd_length = 3;
4471
                  vms_debug2 ((4, "DST__K_TERM_W: %d\n", data));
4472
                  break;
4473
 
4474
                case DST__K_TERM_L:
4475
                  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4476
                  curr_pc += data;
4477
                  cmd_length = 5;
4478
                  vms_debug2 ((4, "DST__K_TERM_L: %d\n", data));
4479
                  break;
4480
 
4481
                case DST__K_SET_ABS_PC:
4482
                  data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4483
                  curr_pc = data;
4484
                  cmd_length = 5;
4485
                  vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data));
4486
                  break;
4487
 
4488
                default:
4489
                  if (cmd <= 0)
4490
                    {
4491
                      curr_pc -= cmd;
4492
                      curr_linenum += 1;
4493
                      cmd_length = 1;
4494
                      vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4495
                                   (unsigned long)curr_pc, curr_linenum));
4496
                    }
4497
                  else
4498
                    {
4499
                      (*_bfd_error_handler) (_("unknown line command %d"),
4500
                                             cmd);
4501
                      cmd_length = 2;
4502
                    }
4503
                  break;
4504
                }
4505
 
4506
              if ((curr_linenum != prev_linum && curr_pc != prev_pc)
4507
                  || cmd <= 0
4508
                  || cmd == DST__K_DELTA_PC_L
4509
                  || cmd == DST__K_DELTA_PC_W)
4510
                {
4511
                  line = (struct lineinfo *)
4512
                    bfd_zalloc (abfd, sizeof (struct lineinfo));
4513
                  line->address = curr_pc;
4514
                  line->line = curr_linenum;
4515
 
4516
                  curr_line->next = line;
4517
                  curr_line = line;
4518
 
4519
                  prev_linum = curr_linenum;
4520
                  prev_pc = curr_pc;
4521
                  vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4522
                               (unsigned long)curr_pc, curr_linenum));
4523
                }
4524
 
4525
              pcl_ptr += cmd_length;
4526
            }
4527
          break;
4528
 
4529
        case 0x17: /* Undocumented type used by DEC C to declare equates.  */
4530
          vms_debug2 ((3, "undocumented type 0x17\n"));
4531
          break;
4532
 
4533
        default:
4534
          vms_debug2 ((3, "ignoring record\n"));
4535
          break;
4536
 
4537
        }
4538
 
4539
      ptr += rec_length;
4540
    }
4541
 
4542
  /* Finalize tables with EOL marker.  */
4543
  srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
4544
  srec->line = (unsigned int) -1;
4545
  srec->srec = (unsigned int) -1;
4546
  curr_srec->next = srec;
4547
 
4548
  line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
4549
  line->line = (unsigned int) -1;
4550
  line->address = (bfd_vma) -1;
4551
  curr_line->next = line;
4552
 
4553
  /* Advertise that this module has been parsed.  This is needed
4554
     because parsing can be either performed at module creation
4555
     or deferred until debug info is consumed.  */
4556
  SET_MODULE_PARSED (module);
4557
}
4558
 
4559
/* Build the list of modules for the specified BFD.  */
4560
 
4561
static struct module *
4562
build_module_list (bfd *abfd)
4563
{
4564
  struct module *module, *list = NULL;
4565
  asection *dmt;
4566
 
4567
  if ((dmt = bfd_get_section_by_name (abfd, "$DMT$")))
4568
    {
4569
      /* We have a DMT section so this must be an image.  Parse the
4570
         section and build the list of modules.  This is sufficient
4571
         since we can compute the start address and the end address
4572
         of every module from the section contents.  */
4573
      bfd_size_type size = bfd_get_section_size (dmt);
4574
      unsigned char *ptr, *end;
4575
 
4576
      ptr = (unsigned char *) bfd_alloc (abfd, size);
4577
      if (! ptr)
4578
        return NULL;
4579
 
4580
      if (! bfd_get_section_contents (abfd, dmt, ptr, 0, size))
4581
        return NULL;
4582
 
4583
      vms_debug2 ((2, "DMT\n"));
4584
 
4585
      end = ptr + size;
4586
 
4587
      while (ptr < end)
4588
        {
4589
          /* Each header declares a module with its start offset and size
4590
             of debug info in the DST section, as well as the count of
4591
             program sections (i.e. address spans) it contains.  */
4592
          int modbeg = bfd_getl32 (ptr + DBG_S_L_DMT_MODBEG);
4593
          int msize = bfd_getl32 (ptr + DBG_S_L_DST_SIZE);
4594
          int count = bfd_getl16 (ptr + DBG_S_W_DMT_PSECT_COUNT);
4595
          ptr += DBG_S_C_DMT_HEADER_SIZE;
4596
 
4597
          vms_debug2 ((3, "module: modbeg = %d, size = %d, count = %d\n",
4598
                       modbeg, msize, count));
4599
 
4600
          /* We create a 'module' structure for each program section since
4601
             we only support contiguous addresses in a 'module' structure.
4602
             As a consequence, the actual debug info in the DST section is
4603
             shared and can be parsed multiple times; that doesn't seem to
4604
             cause problems in practice.  */
4605
          while (count-- > 0)
4606
            {
4607
              int start = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_START);
4608
              int length = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_LENGTH);
4609
              module = new_module (abfd);
4610
              module->modbeg = modbeg;
4611
              module->size = msize;
4612
              module->low = start;
4613
              module->high = start + length;
4614
              module->next = list;
4615
              list = module;
4616
              ptr += DBG_S_C_DMT_PSECT_SIZE;
4617
 
4618
              vms_debug2 ((4, "section: start = 0x%x, length = %d\n",
4619
                           start, length));
4620
            }
4621
        }
4622
    }
4623
  else
4624
    {
4625
      /* We don't have a DMT section so this must be an object.  Parse
4626
         the module right now in order to compute its start address and
4627
         end address.  */
4628
      void *dst = PRIV (dst_section)->contents;
4629
 
4630
      if (dst == NULL)
4631
        return NULL;
4632
 
4633
      module = new_module (abfd);
4634
      parse_module (abfd, module, PRIV (dst_section)->contents, -1);
4635
      list = module;
4636
    }
4637
 
4638
  return list;
4639
}
4640
 
4641
/* Calculate and return the name of the source file and the line nearest
4642
   to the wanted location in the specified module.  */
4643
 
4644
static bfd_boolean
4645
module_find_nearest_line (bfd *abfd, struct module *module, bfd_vma addr,
4646
                          const char **file, const char **func,
4647
                          unsigned int *line)
4648
{
4649
  struct funcinfo *funcinfo;
4650
  struct lineinfo *lineinfo;
4651
  struct srecinfo *srecinfo;
4652
  bfd_boolean ret = FALSE;
4653
 
4654
  /* Parse this module if that was not done at module creation.  */
4655
  if (! IS_MODULE_PARSED (module))
4656
    {
4657
      unsigned int size = module->size;
4658
      unsigned int modbeg = PRIV (dst_section)->filepos + module->modbeg;
4659
      unsigned char *buffer = (unsigned char *) bfd_malloc (module->size);
4660
 
4661
      if (bfd_seek (abfd, modbeg, SEEK_SET) != 0
4662
          || bfd_bread (buffer, size, abfd) != size)
4663
        {
4664
          bfd_set_error (bfd_error_no_debug_section);
4665
          return FALSE;
4666
        }
4667
 
4668
      parse_module (abfd, module, buffer, size);
4669
      free (buffer);
4670
    }
4671
 
4672
  /* Find out the function (if any) that contains the address.  */
4673
  for (funcinfo = module->func_table; funcinfo; funcinfo = funcinfo->next)
4674
    if (addr >= funcinfo->low && addr <= funcinfo->high)
4675
      {
4676
        *func = funcinfo->name;
4677
        ret = TRUE;
4678
        break;
4679
      }
4680
 
4681
  /* Find out the source file and the line nearest to the address.  */
4682
  for (lineinfo = module->line_table; lineinfo; lineinfo = lineinfo->next)
4683
    if (lineinfo->next && addr < lineinfo->next->address)
4684
      {
4685
        for (srecinfo = module->srec_table; srecinfo; srecinfo = srecinfo->next)
4686
          if (srecinfo->next && lineinfo->line < srecinfo->next->line)
4687
            {
4688
              if (srecinfo->sfile > 0)
4689
                {
4690
                  *file = module->file_table[srecinfo->sfile].name;
4691
                  *line = srecinfo->srec + lineinfo->line - srecinfo->line;
4692
                }
4693
              else
4694
                {
4695
                  *file = module->name;
4696
                  *line = lineinfo->line;
4697
                }
4698
              return TRUE;
4699
            }
4700
 
4701
        break;
4702
      }
4703
 
4704
  return ret;
4705
}
4706
 
4707
/* Provided a BFD, a section and an offset into the section, calculate and
4708
   return the name of the source file and the line nearest to the wanted
4709
   location.  */
4710
 
4711
static bfd_boolean
4712
_bfd_vms_find_nearest_dst_line (bfd *abfd, asection *section,
4713
                                asymbol **symbols ATTRIBUTE_UNUSED,
4714
                                bfd_vma offset, const char **file,
4715
                                const char **func, unsigned int *line)
4716
{
4717
  struct module *module;
4718
 
4719
  /* What address are we looking for?  */
4720
  bfd_vma addr = section->vma + offset;
4721
 
4722
  *file = NULL;
4723
  *func = NULL;
4724
  *line = 0;
4725
 
4726
  /* We can't do anything if there is no DST (debug symbol table).  */
4727
  if (PRIV (dst_section) == NULL)
4728
    return FALSE;
4729
 
4730
  /* Create the module list - if not already done.  */
4731
  if (PRIV (modules) == NULL)
4732
    {
4733
      PRIV (modules) = build_module_list (abfd);
4734
      if (PRIV (modules) == NULL)
4735
        return FALSE;
4736
    }
4737
 
4738
  for (module = PRIV (modules); module; module = module->next)
4739
    if (addr >= module->low && addr <= module->high)
4740
      return module_find_nearest_line (abfd, module, addr, file, func, line);
4741
 
4742
  return FALSE;
4743
}
4744
 
4745
/* Canonicalizations.  */
4746
/* Set name, value, section and flags of SYM from E.  */
4747
 
4748
static bfd_boolean
4749
alpha_vms_convert_symbol (bfd *abfd, struct vms_symbol_entry *e, asymbol *sym)
4750
{
4751
  flagword flags;
4752
  symvalue value;
4753
  asection *sec;
4754
  const char *name;
4755
 
4756
  name = e->name;
4757
  value = 0;
4758
  flags = BSF_NO_FLAGS;
4759
  sec = NULL;
4760
 
4761
  switch (e->typ)
4762
    {
4763
    case EGSD__C_SYM:
4764
      if (e->flags & EGSY__V_WEAK)
4765
        flags |= BSF_WEAK;
4766
 
4767
      if (e->flags & EGSY__V_DEF)
4768
        {
4769
          /* Symbol definition.  */
4770
          flags |= BSF_GLOBAL;
4771
          if (e->flags & EGSY__V_NORM)
4772
            flags |= BSF_FUNCTION;
4773
          value = e->value;
4774
          sec = e->section;
4775
        }
4776
      else
4777
        {
4778
          /* Symbol reference.  */
4779
          sec = bfd_und_section_ptr;
4780
        }
4781
      break;
4782
 
4783
    case EGSD__C_SYMG:
4784
      /* A universal symbol is by definition global...  */
4785
      flags |= BSF_GLOBAL;
4786
 
4787
      /* ...and dynamic in shared libraries.  */
4788
      if (abfd->flags & DYNAMIC)
4789
        flags |= BSF_DYNAMIC;
4790
 
4791
      if (e->flags & EGSY__V_WEAK)
4792
        flags |= BSF_WEAK;
4793
 
4794
      if (!(e->flags & EGSY__V_DEF))
4795
        abort ();
4796
 
4797
      if (e->flags & EGSY__V_NORM)
4798
        flags |= BSF_FUNCTION;
4799
 
4800
      value = e->value;
4801
      /* sec = e->section; */
4802
      sec = bfd_abs_section_ptr;
4803
      break;
4804
 
4805
    default:
4806
      return FALSE;
4807
    }
4808
 
4809
  sym->name = name;
4810
  sym->section = sec;
4811
  sym->flags = flags;
4812
  sym->value = value;
4813
  return TRUE;
4814
}
4815
 
4816
 
4817
/* Return the number of bytes required to store a vector of pointers
4818
   to asymbols for all the symbols in the BFD abfd, including a
4819
   terminal NULL pointer. If there are no symbols in the BFD,
4820
   then return 0.  If an error occurs, return -1.  */
4821
 
4822
static long
4823
alpha_vms_get_symtab_upper_bound (bfd *abfd)
4824
{
4825
  vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
4826
               abfd, PRIV (gsd_sym_count)));
4827
 
4828
  return (PRIV (gsd_sym_count) + 1) * sizeof (asymbol *);
4829
}
4830
 
4831
/* Read the symbols from the BFD abfd, and fills in the vector
4832
   location with pointers to the symbols and a trailing NULL.
4833
 
4834
   Return number of symbols read.   */
4835
 
4836
static long
4837
alpha_vms_canonicalize_symtab (bfd *abfd, asymbol **symbols)
4838
{
4839
  unsigned int i;
4840
 
4841
  vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd));
4842
 
4843
  if (PRIV (csymbols) == NULL)
4844
    {
4845
      PRIV (csymbols) = (asymbol **) bfd_alloc
4846
        (abfd, PRIV (gsd_sym_count) * sizeof (asymbol *));
4847
 
4848
      /* Traverse table and fill symbols vector.  */
4849
      for (i = 0; i < PRIV (gsd_sym_count); i++)
4850
        {
4851
          struct vms_symbol_entry *e = PRIV (syms)[i];
4852
          asymbol *sym;
4853
 
4854
          sym = bfd_make_empty_symbol (abfd);
4855
          if (sym == NULL || !alpha_vms_convert_symbol (abfd, e, sym))
4856
            {
4857
              bfd_release (abfd, PRIV (csymbols));
4858
              PRIV (csymbols) = NULL;
4859
              return -1;
4860
            }
4861
 
4862
          PRIV (csymbols)[i] = sym;
4863
        }
4864
    }
4865
 
4866
  if (symbols != NULL)
4867
    {
4868
      for (i = 0; i < PRIV (gsd_sym_count); i++)
4869
        symbols[i] = PRIV (csymbols)[i];
4870
      symbols[i] = NULL;
4871
    }
4872
 
4873
  return PRIV (gsd_sym_count);
4874
}
4875
 
4876
/* Read and convert relocations from ETIR.  We do it once for all sections.  */
4877
 
4878
static bfd_boolean
4879
alpha_vms_slurp_relocs (bfd *abfd)
4880
{
4881
  int cur_psect = -1;
4882
 
4883
  vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
4884
 
4885
  /* We slurp relocs only once, for all sections.  */
4886
  if (PRIV (reloc_done))
4887
      return TRUE;
4888
  PRIV (reloc_done) = TRUE;
4889
 
4890
  if (alpha_vms_canonicalize_symtab (abfd, NULL) < 0)
4891
    return FALSE;
4892
 
4893
  if (bfd_seek (abfd, 0, SEEK_SET) != 0)
4894
    return FALSE;
4895
 
4896
  while (1)
4897
    {
4898
      unsigned char *begin;
4899
      unsigned char *end;
4900
      unsigned char *ptr;
4901
      bfd_reloc_code_real_type reloc_code;
4902
      int type;
4903
      bfd_vma vaddr = 0;
4904
 
4905
      int length;
4906
 
4907
      bfd_vma cur_address;
4908
      int cur_psidx = -1;
4909
      unsigned char *cur_sym = NULL;
4910
      int prev_cmd = -1;
4911
      bfd_vma cur_addend = 0;
4912
 
4913
      /* Skip non-ETIR records.  */
4914
      type = _bfd_vms_get_object_record (abfd);
4915
      if (type == EOBJ__C_EEOM)
4916
        break;
4917
      if (type != EOBJ__C_ETIR)
4918
        continue;
4919
 
4920
      begin = PRIV (recrd.rec) + 4;
4921
      end = PRIV (recrd.rec) + PRIV (recrd.rec_size);
4922
 
4923
      for (ptr = begin; ptr < end; ptr += length)
4924
        {
4925
          int cmd;
4926
 
4927
          cmd = bfd_getl16 (ptr);
4928
          length = bfd_getl16 (ptr + 2);
4929
 
4930
          cur_address = vaddr;
4931
 
4932
          vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
4933
                       _bfd_vms_etir_name (cmd)));
4934
 
4935
          switch (cmd)
4936
            {
4937
            case ETIR__C_STA_GBL: /* ALPHA_R_REFLONG und_section, step 1 */
4938
                                  /* ALPHA_R_REFQUAD und_section, step 1 */
4939
              cur_sym = ptr + 4;
4940
              prev_cmd = cmd;
4941
              continue;
4942
 
4943
            case ETIR__C_STA_PQ: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
4944
              cur_psidx = bfd_getl32 (ptr + 4);
4945
              cur_addend = bfd_getl64 (ptr + 8);
4946
              prev_cmd = cmd;
4947
              continue;
4948
 
4949
            case ETIR__C_CTL_SETRB:
4950
              if (prev_cmd != ETIR__C_STA_PQ)
4951
                {
4952
                  (*_bfd_error_handler)
4953
                    (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd),
4954
                     _bfd_vms_etir_name (cmd));
4955
                  return FALSE;
4956
                }
4957
              cur_psect = cur_psidx;
4958
              vaddr = cur_addend;
4959
              cur_psidx = -1;
4960
              cur_addend = 0;
4961
              continue;
4962
 
4963
            case ETIR__C_STA_LW: /* ALPHA_R_REFLONG abs_section, step 1 */
4964
                                 /* ALPHA_R_REFLONG und_section, step 2 */
4965
              if (prev_cmd != -1)
4966
                {
4967
                  if (prev_cmd != ETIR__C_STA_GBL)
4968
                    {
4969
                      (*_bfd_error_handler)
4970
                        (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
4971
                         _bfd_vms_etir_name (ETIR__C_STA_LW));
4972
                      return FALSE;
4973
                    }
4974
                }
4975
              cur_addend = bfd_getl32 (ptr + 4);
4976
              prev_cmd = cmd;
4977
              continue;
4978
 
4979
            case ETIR__C_STA_QW: /* ALPHA_R_REFQUAD abs_section, step 1 */
4980
                                 /* ALPHA_R_REFQUAD und_section, step 2 */
4981
              if (prev_cmd != -1 && prev_cmd != ETIR__C_STA_GBL)
4982
                {
4983
                  (*_bfd_error_handler)
4984
                    (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
4985
                     _bfd_vms_etir_name (ETIR__C_STA_QW));
4986
                  return FALSE;
4987
                }
4988
              cur_addend = bfd_getl64 (ptr + 4);
4989
              prev_cmd = cmd;
4990
              continue;
4991
 
4992
            case ETIR__C_STO_LW: /* ALPHA_R_REFLONG und_section, step 4 */
4993
                                 /* ALPHA_R_REFLONG abs_section, step 2 */
4994
                                 /* ALPHA_R_REFLONG others, step 2 */
4995
              if (prev_cmd != ETIR__C_OPR_ADD
4996
                  && prev_cmd != ETIR__C_STA_LW
4997
                  && prev_cmd != ETIR__C_STA_PQ)
4998
                {
4999
                  (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
5000
                                         _bfd_vms_etir_name (prev_cmd),
5001
                                         _bfd_vms_etir_name (ETIR__C_STO_LW));
5002
                  return FALSE;
5003
                }
5004
              reloc_code = BFD_RELOC_32;
5005
              break;
5006
 
5007
            case ETIR__C_STO_QW: /* ALPHA_R_REFQUAD und_section, step 4 */
5008
                                 /* ALPHA_R_REFQUAD abs_section, step 2 */
5009
              if (prev_cmd != ETIR__C_OPR_ADD && prev_cmd != ETIR__C_STA_QW)
5010
                {
5011
                  (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
5012
                                         _bfd_vms_etir_name (prev_cmd),
5013
                                         _bfd_vms_etir_name (ETIR__C_STO_QW));
5014
                  return FALSE;
5015
                }
5016
              reloc_code = BFD_RELOC_64;
5017
              break;
5018
 
5019
            case ETIR__C_STO_OFF: /* ALPHA_R_REFQUAD others, step 2 */
5020
              if (prev_cmd != ETIR__C_STA_PQ)
5021
                {
5022
                  (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
5023
                                         _bfd_vms_etir_name (prev_cmd),
5024
                                         _bfd_vms_etir_name (ETIR__C_STO_OFF));
5025
                  return FALSE;
5026
                }
5027
              reloc_code = BFD_RELOC_64;
5028
              break;
5029
 
5030
            case ETIR__C_OPR_ADD: /* ALPHA_R_REFLONG und_section, step 3 */
5031
                                  /* ALPHA_R_REFQUAD und_section, step 3 */
5032
              if (prev_cmd != ETIR__C_STA_LW && prev_cmd != ETIR__C_STA_QW)
5033
                {
5034
                  (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
5035
                                         _bfd_vms_etir_name (prev_cmd),
5036
                                         _bfd_vms_etir_name (ETIR__C_OPR_ADD));
5037
                  return FALSE;
5038
                }
5039
              prev_cmd = ETIR__C_OPR_ADD;
5040
              continue;
5041
 
5042
            case ETIR__C_STO_CA: /* ALPHA_R_CODEADDR */
5043
              reloc_code = BFD_RELOC_ALPHA_CODEADDR;
5044
              cur_sym = ptr + 4;
5045
              break;
5046
 
5047
            case ETIR__C_STO_GBL: /* ALPHA_R_REFQUAD und_section */
5048
              reloc_code = BFD_RELOC_64;
5049
              cur_sym = ptr + 4;
5050
              break;
5051
 
5052
            case ETIR__C_STO_GBL_LW: /* ALPHA_R_REFLONG und_section */
5053
              reloc_code = BFD_RELOC_32;
5054
              cur_sym = ptr + 4;
5055
              break;
5056
 
5057
            case ETIR__C_STC_LP_PSB: /* ALPHA_R_LINKAGE */
5058
              reloc_code = BFD_RELOC_ALPHA_LINKAGE;
5059
              cur_sym = ptr + 8;
5060
              break;
5061
 
5062
            case ETIR__C_STC_NOP_GBL: /* ALPHA_R_NOP */
5063
              reloc_code = BFD_RELOC_ALPHA_NOP;
5064
              goto call_reloc;
5065
 
5066
            case ETIR__C_STC_BSR_GBL: /* ALPHA_R_BSR */
5067
              reloc_code = BFD_RELOC_ALPHA_BSR;
5068
              goto call_reloc;
5069
 
5070
            case ETIR__C_STC_LDA_GBL: /* ALPHA_R_LDA */
5071
              reloc_code = BFD_RELOC_ALPHA_LDA;
5072
              goto call_reloc;
5073
 
5074
            case ETIR__C_STC_BOH_GBL: /* ALPHA_R_BOH */
5075
              reloc_code = BFD_RELOC_ALPHA_BOH;
5076
              goto call_reloc;
5077
 
5078
            call_reloc:
5079
              cur_sym = ptr + 4 + 32;
5080
              cur_address = bfd_getl64 (ptr + 4 + 8);
5081
              cur_addend = bfd_getl64 (ptr + 4 + 24);
5082
              break;
5083
 
5084
            case ETIR__C_STO_IMM:
5085
              vaddr += bfd_getl32 (ptr + 4);
5086
              continue;
5087
 
5088
            default:
5089
              (*_bfd_error_handler) (_("Unknown reloc %s"),
5090
                                     _bfd_vms_etir_name (cmd));
5091
              return FALSE;
5092
            }
5093
 
5094
          {
5095
            asection *sec;
5096
            struct vms_section_data_struct *vms_sec;
5097
            arelent *reloc;
5098
 
5099
            /* Get section to which the relocation applies.  */
5100
            if (cur_psect < 0 || cur_psect > (int)PRIV (section_count))
5101
              {
5102
                (*_bfd_error_handler) (_("Invalid section index in ETIR"));
5103
                return FALSE;
5104
              }
5105 161 khays
 
5106 14 khays
            sec = PRIV (sections)[cur_psect];
5107 161 khays
            if (sec == bfd_abs_section_ptr)
5108
              {
5109
                (*_bfd_error_handler) (_("Relocation for non-REL psect"));
5110
                return FALSE;
5111
              }
5112
 
5113 14 khays
            vms_sec = vms_section_data (sec);
5114
 
5115
            /* Allocate a reloc entry.  */
5116
            if (sec->reloc_count >= vms_sec->reloc_max)
5117
              {
5118
                if (vms_sec->reloc_max == 0)
5119
                  {
5120
                    vms_sec->reloc_max = 64;
5121
                    sec->relocation = bfd_zmalloc
5122
                      (vms_sec->reloc_max * sizeof (arelent));
5123 161 khays
                  }
5124 14 khays
                else
5125
                  {
5126
                    vms_sec->reloc_max *= 2;
5127
                    sec->relocation = bfd_realloc
5128
                      (sec->relocation, vms_sec->reloc_max * sizeof (arelent));
5129
                  }
5130
              }
5131
            reloc = &sec->relocation[sec->reloc_count];
5132
            sec->reloc_count++;
5133
 
5134
            reloc->howto = bfd_reloc_type_lookup (abfd, reloc_code);
5135
 
5136
            if (cur_sym != NULL)
5137
              {
5138
                unsigned int j;
5139
                unsigned int symlen = *cur_sym;
5140
                asymbol **sym;
5141
 
5142
                /* Linear search.  */
5143
                symlen = *cur_sym;
5144
                cur_sym++;
5145
                sym = NULL;
5146
 
5147
                for (j = 0; j < PRIV (gsd_sym_count); j++)
5148
                  if (PRIV (syms)[j]->namelen == symlen
5149
                      && memcmp (PRIV (syms)[j]->name, cur_sym, symlen) == 0)
5150
                    {
5151
                      sym = &PRIV (csymbols)[j];
5152
                      break;
5153
                    }
5154
                if (sym == NULL)
5155
                  {
5156
                    (*_bfd_error_handler) (_("Unknown symbol in command %s"),
5157
                                           _bfd_vms_etir_name (cmd));
5158
                    reloc->sym_ptr_ptr = NULL;
5159
                  }
5160
                else
5161
                  reloc->sym_ptr_ptr = sym;
5162
              }
5163
            else if (cur_psidx >= 0)
5164
              reloc->sym_ptr_ptr =
5165
                PRIV (sections)[cur_psidx]->symbol_ptr_ptr;
5166
            else
5167
              reloc->sym_ptr_ptr = NULL;
5168
 
5169
            reloc->address = cur_address;
5170
            reloc->addend = cur_addend;
5171
 
5172
            vaddr += bfd_get_reloc_size (reloc->howto);
5173
          }
5174
 
5175
          cur_addend = 0;
5176
          prev_cmd = -1;
5177
          cur_sym = NULL;
5178
          cur_psidx = -1;
5179
        }
5180
    }
5181
  vms_debug2 ((3, "alpha_vms_slurp_relocs: result = TRUE\n"));
5182
 
5183
  return TRUE;
5184
}
5185
 
5186
/* Return the number of bytes required to store the relocation
5187
   information associated with the given section.  */
5188
 
5189
static long
5190
alpha_vms_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *section)
5191
{
5192
  alpha_vms_slurp_relocs (abfd);
5193
 
5194
  return (section->reloc_count + 1) * sizeof (arelent *);
5195
}
5196
 
5197
/* Convert relocations from VMS (external) form into BFD internal
5198
   form.  Return the number of relocations.  */
5199
 
5200
static long
5201
alpha_vms_canonicalize_reloc (bfd *abfd, asection *section, arelent **relptr,
5202
                              asymbol **symbols ATTRIBUTE_UNUSED)
5203
{
5204
  arelent *tblptr;
5205
  int count;
5206
 
5207
  if (!alpha_vms_slurp_relocs (abfd))
5208
    return -1;
5209
 
5210
  count = section->reloc_count;
5211
  tblptr = section->relocation;
5212
 
5213
  while (count--)
5214
    *relptr++ = tblptr++;
5215
 
5216
  *relptr = (arelent *) NULL;
5217
  return section->reloc_count;
5218
}
5219
 
5220
/* This is just copied from ecoff-alpha, needs to be fixed probably.  */
5221
 
5222
/* How to process the various reloc types.  */
5223
 
5224
static bfd_reloc_status_type
5225
reloc_nil (bfd * abfd ATTRIBUTE_UNUSED,
5226
           arelent *reloc ATTRIBUTE_UNUSED,
5227
           asymbol *sym ATTRIBUTE_UNUSED,
5228
           void * data ATTRIBUTE_UNUSED,
5229
           asection *sec ATTRIBUTE_UNUSED,
5230
           bfd *output_bfd ATTRIBUTE_UNUSED,
5231
           char **error_message ATTRIBUTE_UNUSED)
5232
{
5233
#if VMS_DEBUG
5234
  vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd, output_bfd);
5235
  vms_debug (2, "In section %s, symbol %s\n",
5236
        sec->name, sym->name);
5237
  vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5238
                reloc->sym_ptr_ptr[0]->name,
5239
                (unsigned long)reloc->address,
5240
                (unsigned long)reloc->addend, reloc->howto->name);
5241
  vms_debug (2, "data at %p\n", data);
5242
  /*  _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5243
#endif
5244
 
5245
  return bfd_reloc_ok;
5246
}
5247
 
5248
/* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5249
   from smaller values.  Start with zero, widen, *then* decrement.  */
5250
#define MINUS_ONE       (((bfd_vma)0) - 1)
5251
 
5252
static reloc_howto_type alpha_howto_table[] =
5253
{
5254
  HOWTO (ALPHA_R_IGNORE,        /* Type.  */
5255
         0,                      /* Rightshift.  */
5256
         0,                      /* Size (0 = byte, 1 = short, 2 = long).  */
5257
         8,                     /* Bitsize.  */
5258
         TRUE,                  /* PC relative.  */
5259
         0,                      /* Bitpos.  */
5260
         complain_overflow_dont,/* Complain_on_overflow.  */
5261
         reloc_nil,             /* Special_function.  */
5262
         "IGNORE",              /* Name.  */
5263
         TRUE,                  /* Partial_inplace.  */
5264
         0,                      /* Source mask */
5265
         0,                      /* Dest mask.  */
5266
         TRUE),                 /* PC rel offset.  */
5267
 
5268
  /* A 64 bit reference to a symbol.  */
5269
  HOWTO (ALPHA_R_REFQUAD,       /* Type.  */
5270
         0,                      /* Rightshift.  */
5271
         4,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5272
         64,                    /* Bitsize.  */
5273
         FALSE,                 /* PC relative.  */
5274
         0,                      /* Bitpos.  */
5275
         complain_overflow_bitfield, /* Complain_on_overflow.  */
5276
         reloc_nil,             /* Special_function.  */
5277
         "REFQUAD",             /* Name.  */
5278
         TRUE,                  /* Partial_inplace.  */
5279
         MINUS_ONE,             /* Source mask.  */
5280
         MINUS_ONE,             /* Dest mask.  */
5281
         FALSE),                /* PC rel offset.  */
5282
 
5283
  /* A 21 bit branch.  The native assembler generates these for
5284
     branches within the text segment, and also fills in the PC
5285
     relative offset in the instruction.  */
5286
  HOWTO (ALPHA_R_BRADDR,        /* Type.  */
5287
         2,                     /* Rightshift.  */
5288
         2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5289
         21,                    /* Bitsize.  */
5290
         TRUE,                  /* PC relative.  */
5291
         0,                      /* Bitpos.  */
5292
         complain_overflow_signed, /* Complain_on_overflow.  */
5293
         reloc_nil,             /* Special_function.  */
5294
         "BRADDR",              /* Name.  */
5295
         TRUE,                  /* Partial_inplace.  */
5296
         0x1fffff,              /* Source mask.  */
5297
         0x1fffff,              /* Dest mask.  */
5298
         FALSE),                /* PC rel offset.  */
5299
 
5300
  /* A hint for a jump to a register.  */
5301
  HOWTO (ALPHA_R_HINT,          /* Type.  */
5302
         2,                     /* Rightshift.  */
5303
         1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5304
         14,                    /* Bitsize.  */
5305
         TRUE,                  /* PC relative.  */
5306
         0,                      /* Bitpos.  */
5307
         complain_overflow_dont,/* Complain_on_overflow.  */
5308
         reloc_nil,             /* Special_function.  */
5309
         "HINT",                /* Name.  */
5310
         TRUE,                  /* Partial_inplace.  */
5311
         0x3fff,                /* Source mask.  */
5312
         0x3fff,                /* Dest mask.  */
5313
         FALSE),                /* PC rel offset.  */
5314
 
5315
  /* 16 bit PC relative offset.  */
5316
  HOWTO (ALPHA_R_SREL16,        /* Type.  */
5317
         0,                      /* Rightshift.  */
5318
         1,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5319
         16,                    /* Bitsize.  */
5320
         TRUE,                  /* PC relative.  */
5321
         0,                      /* Bitpos.  */
5322
         complain_overflow_signed, /* Complain_on_overflow.  */
5323
         reloc_nil,             /* Special_function.  */
5324
         "SREL16",              /* Name.  */
5325
         TRUE,                  /* Partial_inplace.  */
5326
         0xffff,                /* Source mask.  */
5327
         0xffff,                /* Dest mask.  */
5328
         FALSE),                /* PC rel offset.  */
5329
 
5330
  /* 32 bit PC relative offset.  */
5331
  HOWTO (ALPHA_R_SREL32,        /* Type.  */
5332
         0,                      /* Rightshift.  */
5333
         2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5334
         32,                    /* Bitsize.  */
5335
         TRUE,                  /* PC relative.  */
5336
         0,                      /* Bitpos.  */
5337
         complain_overflow_signed, /* Complain_on_overflow.  */
5338
         reloc_nil,             /* Special_function.  */
5339
         "SREL32",              /* Name.  */
5340
         TRUE,                  /* Partial_inplace.  */
5341
         0xffffffff,            /* Source mask.  */
5342
         0xffffffff,            /* Dest mask.  */
5343
         FALSE),                /* PC rel offset.  */
5344
 
5345
  /* A 64 bit PC relative offset.  */
5346
  HOWTO (ALPHA_R_SREL64,        /* Type.  */
5347
         0,                      /* Rightshift.  */
5348
         4,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5349
         64,                    /* Bitsize.  */
5350
         TRUE,                  /* PC relative.  */
5351
         0,                      /* Bitpos.  */
5352
         complain_overflow_signed, /* Complain_on_overflow.  */
5353
         reloc_nil,             /* Special_function.  */
5354
         "SREL64",              /* Name.  */
5355
         TRUE,                  /* Partial_inplace.  */
5356
         MINUS_ONE,             /* Source mask.  */
5357
         MINUS_ONE,             /* Dest mask.  */
5358
         FALSE),                /* PC rel offset.  */
5359
 
5360
  /* Push a value on the reloc evaluation stack.  */
5361
  HOWTO (ALPHA_R_OP_PUSH,       /* Type.  */
5362
         0,                      /* Rightshift.  */
5363
         0,                      /* Size (0 = byte, 1 = short, 2 = long).  */
5364
         0,                      /* Bitsize.  */
5365
         FALSE,                 /* PC relative.  */
5366
         0,                      /* Bitpos.  */
5367
         complain_overflow_dont,/* Complain_on_overflow.  */
5368
         reloc_nil,             /* Special_function.  */
5369
         "OP_PUSH",             /* Name.  */
5370
         FALSE,                 /* Partial_inplace.  */
5371
         0,                      /* Source mask.  */
5372
         0,                      /* Dest mask.  */
5373
         FALSE),                /* PC rel offset.  */
5374
 
5375
  /* Store the value from the stack at the given address.  Store it in
5376
     a bitfield of size r_size starting at bit position r_offset.  */
5377
  HOWTO (ALPHA_R_OP_STORE,      /* Type.  */
5378
         0,                      /* Rightshift.  */
5379
         4,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5380
         64,                    /* Bitsize.  */
5381
         FALSE,                 /* PC relative.  */
5382
         0,                      /* Bitpos.  */
5383
         complain_overflow_dont,/* Complain_on_overflow.  */
5384
         reloc_nil,             /* Special_function.  */
5385
         "OP_STORE",            /* Name.  */
5386
         FALSE,                 /* Partial_inplace.  */
5387
         0,                      /* Source mask.  */
5388
         MINUS_ONE,             /* Dest mask.  */
5389
         FALSE),                /* PC rel offset.  */
5390
 
5391
  /* Subtract the reloc address from the value on the top of the
5392
     relocation stack.  */
5393
  HOWTO (ALPHA_R_OP_PSUB,       /* Type.  */
5394
         0,                      /* Rightshift.  */
5395
         0,                      /* Size (0 = byte, 1 = short, 2 = long).  */
5396
         0,                      /* Bitsize.  */
5397
         FALSE,                 /* PC relative.  */
5398
         0,                      /* Bitpos.  */
5399
         complain_overflow_dont,/* Complain_on_overflow.  */
5400
         reloc_nil,             /* Special_function.  */
5401
         "OP_PSUB",             /* Name.  */
5402
         FALSE,                 /* Partial_inplace.  */
5403
         0,                      /* Source mask.  */
5404
         0,                      /* Dest mask.  */
5405
         FALSE),                /* PC rel offset.  */
5406
 
5407
  /* Shift the value on the top of the relocation stack right by the
5408
     given value.  */
5409
  HOWTO (ALPHA_R_OP_PRSHIFT,    /* Type.  */
5410
         0,                      /* Rightshift.  */
5411
         0,                      /* Size (0 = byte, 1 = short, 2 = long).  */
5412
         0,                      /* Bitsize.  */
5413
         FALSE,                 /* PC relative.  */
5414
         0,                      /* Bitpos.  */
5415
         complain_overflow_dont,/* Complain_on_overflow.  */
5416
         reloc_nil,             /* Special_function.  */
5417
         "OP_PRSHIFT",          /* Name.  */
5418
         FALSE,                 /* Partial_inplace.  */
5419
         0,                      /* Source mask.  */
5420
         0,                      /* Dest mask.  */
5421
         FALSE),                /* PC rel offset.  */
5422
 
5423
  /* Hack. Linkage is done by linker.  */
5424
  HOWTO (ALPHA_R_LINKAGE,       /* Type.  */
5425
         0,                      /* Rightshift.  */
5426
         8,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5427
         256,                   /* Bitsize.  */
5428
         FALSE,                 /* PC relative.  */
5429
         0,                      /* Bitpos.  */
5430
         complain_overflow_dont,/* Complain_on_overflow.  */
5431
         reloc_nil,             /* Special_function.  */
5432
         "LINKAGE",             /* Name.  */
5433
         FALSE,                 /* Partial_inplace.  */
5434
         0,                      /* Source mask.  */
5435
         0,                      /* Dest mask.  */
5436
         FALSE),                /* PC rel offset.  */
5437
 
5438
  /* A 32 bit reference to a symbol.  */
5439
  HOWTO (ALPHA_R_REFLONG,       /* Type.  */
5440
         0,                      /* Rightshift.  */
5441
         2,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5442
         32,                    /* Bitsize.  */
5443
         FALSE,                 /* PC relative.  */
5444
         0,                      /* Bitpos.  */
5445
         complain_overflow_bitfield, /* Complain_on_overflow.  */
5446
         reloc_nil,             /* Special_function.  */
5447
         "REFLONG",             /* Name.  */
5448
         TRUE,                  /* Partial_inplace.  */
5449
         0xffffffff,            /* Source mask.  */
5450
         0xffffffff,            /* Dest mask.  */
5451
         FALSE),                /* PC rel offset.  */
5452
 
5453
  /* A 64 bit reference to a procedure, written as 32 bit value.  */
5454
  HOWTO (ALPHA_R_CODEADDR,      /* Type.  */
5455
         0,                      /* Rightshift.  */
5456
         4,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5457
         64,                    /* Bitsize.  */
5458
         FALSE,                 /* PC relative.  */
5459
         0,                      /* Bitpos.  */
5460
         complain_overflow_signed,/* Complain_on_overflow.  */
5461
         reloc_nil,             /* Special_function.  */
5462
         "CODEADDR",            /* Name.  */
5463
         FALSE,                 /* Partial_inplace.  */
5464
         0xffffffff,            /* Source mask.  */
5465
         0xffffffff,            /* Dest mask.  */
5466
         FALSE),                /* PC rel offset.  */
5467
 
5468
  HOWTO (ALPHA_R_NOP,           /* Type.  */
5469
         0,                      /* Rightshift.  */
5470
         3,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5471
         0,                      /* Bitsize.  */
5472
         /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5473
            because the calculations for the 3 relocations are the same.
5474
            See B.4.5.2 of the OpenVMS Linker Utility Manual.  */
5475
         TRUE,                  /* PC relative.  */
5476
         0,                      /* Bitpos.   */
5477
         complain_overflow_dont,/* Complain_on_overflow.  */
5478
         reloc_nil,             /* Special_function.  */
5479
         "NOP",                 /* Name.  */
5480
         FALSE,                 /* Partial_inplace.  */
5481
         0xffffffff,            /* Source mask.  */
5482
         0xffffffff,            /* Dest mask.  */
5483
         FALSE),                /* PC rel offset.  */
5484
 
5485
  HOWTO (ALPHA_R_BSR,           /* Type.  */
5486
         0,                      /* Rightshift.  */
5487
         3,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5488
         0,                      /* Bitsize.  */
5489
         TRUE,                  /* PC relative.  */
5490
         0,                      /* Bitpos.  */
5491
         complain_overflow_dont,/* Complain_on_overflow.  */
5492
         reloc_nil,             /* Special_function.  */
5493
         "BSR",                 /* Name.  */
5494
         FALSE,                 /* Partial_inplace.  */
5495
         0xffffffff,            /* Source mask.  */
5496
         0xffffffff,            /* Dest mask.  */
5497
         FALSE),                /* PC rel offset.  */
5498
 
5499
  HOWTO (ALPHA_R_LDA,           /* Type.  */
5500
         0,                      /* Rightshift.  */
5501
         3,                     /* Size (0 = byte, 1 = short, 2 = long).  */
5502
         0,                      /* Bitsize.  */
5503
         FALSE,                 /* PC relative.  */
5504
         0,                      /* Bitpos.  */
5505
         complain_overflow_dont,/* Complain_on_overflow.  */
5506
         reloc_nil,             /* Special_function.  */
5507
         "LDA",                 /* Name.  */
5508
         FALSE,                 /* Partial_inplace.  */
5509
         0xffffffff,            /* Source mask.  */
5510
         0xffffffff,            /* Dest mask.  */
5511
         FALSE),                /* PC rel offset.  */
5512
 
5513
  HOWTO (ALPHA_R_BOH,           /* Type.  */
5514
         0,                      /* Rightshift.  */
5515
         3,                     /* Size (0 = byte, 1 = short, 2 = long, 3 = nil).  */
5516
         0,                      /* Bitsize.  */
5517
         TRUE,                  /* PC relative.  */
5518
         0,                      /* Bitpos.  */
5519
         complain_overflow_dont,/* Complain_on_overflow.  */
5520
         reloc_nil,             /* Special_function.  */
5521
         "BOH",                 /* Name.  */
5522
         FALSE,                 /* Partial_inplace.  */
5523
         0xffffffff,            /* Source mask.  */
5524
         0xffffffff,            /* Dest mask.  */
5525
         FALSE),                /* PC rel offset.  */
5526
};
5527
 
5528
/* Return a pointer to a howto structure which, when invoked, will perform
5529
   the relocation code on data from the architecture noted.  */
5530
 
5531
static const struct reloc_howto_struct *
5532
alpha_vms_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
5533
                                 bfd_reloc_code_real_type code)
5534
{
5535
  int alpha_type;
5536
 
5537
  vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd, code));
5538
 
5539
  switch (code)
5540
    {
5541
      case BFD_RELOC_16:                alpha_type = ALPHA_R_SREL16;    break;
5542
      case BFD_RELOC_32:                alpha_type = ALPHA_R_REFLONG;   break;
5543
      case BFD_RELOC_64:                alpha_type = ALPHA_R_REFQUAD;   break;
5544
      case BFD_RELOC_CTOR:              alpha_type = ALPHA_R_REFQUAD;   break;
5545
      case BFD_RELOC_23_PCREL_S2:       alpha_type = ALPHA_R_BRADDR;    break;
5546
      case BFD_RELOC_ALPHA_HINT:        alpha_type = ALPHA_R_HINT;      break;
5547
      case BFD_RELOC_16_PCREL:          alpha_type = ALPHA_R_SREL16;    break;
5548
      case BFD_RELOC_32_PCREL:          alpha_type = ALPHA_R_SREL32;    break;
5549
      case BFD_RELOC_64_PCREL:          alpha_type = ALPHA_R_SREL64;    break;
5550
      case BFD_RELOC_ALPHA_LINKAGE:     alpha_type = ALPHA_R_LINKAGE;   break;
5551
      case BFD_RELOC_ALPHA_CODEADDR:    alpha_type = ALPHA_R_CODEADDR;  break;
5552
      case BFD_RELOC_ALPHA_NOP:         alpha_type = ALPHA_R_NOP;       break;
5553
      case BFD_RELOC_ALPHA_BSR:         alpha_type = ALPHA_R_BSR;       break;
5554
      case BFD_RELOC_ALPHA_LDA:         alpha_type = ALPHA_R_LDA;       break;
5555
      case BFD_RELOC_ALPHA_BOH:         alpha_type = ALPHA_R_BOH;       break;
5556
      default:
5557
        (*_bfd_error_handler) ("reloc (%d) is *UNKNOWN*", code);
5558
        return NULL;
5559
    }
5560
  vms_debug2 ((2, "reloc is %s\n", alpha_howto_table[alpha_type].name));
5561
  return & alpha_howto_table[alpha_type];
5562
}
5563
 
5564
static reloc_howto_type *
5565
alpha_vms_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
5566
                                 const char *r_name)
5567
{
5568
  unsigned int i;
5569
 
5570
  for (i = 0;
5571
       i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
5572
       i++)
5573
    if (alpha_howto_table[i].name != NULL
5574
        && strcasecmp (alpha_howto_table[i].name, r_name) == 0)
5575
      return &alpha_howto_table[i];
5576
 
5577
  return NULL;
5578
}
5579
 
5580
static long
5581
alpha_vms_get_synthetic_symtab (bfd *abfd,
5582
                                long symcount ATTRIBUTE_UNUSED,
5583
                                asymbol **usyms ATTRIBUTE_UNUSED,
5584
                                long dynsymcount ATTRIBUTE_UNUSED,
5585
                                asymbol **dynsyms ATTRIBUTE_UNUSED,
5586
                                asymbol **ret)
5587
{
5588
  asymbol *syms;
5589
  unsigned int i;
5590
  unsigned int n = 0;
5591
 
5592
  syms = (asymbol *) bfd_malloc (PRIV (norm_sym_count) * sizeof (asymbol));
5593
  *ret = syms;
5594
  if (syms == NULL)
5595
    return -1;
5596
 
5597
  for (i = 0; i < PRIV (gsd_sym_count); i++)
5598
    {
5599
      struct vms_symbol_entry *e = PRIV (syms)[i];
5600
      asymbol *sym;
5601
      flagword flags;
5602
      symvalue value;
5603
      asection *sec;
5604
      const char *name;
5605
      char *sname;
5606
      int l;
5607
 
5608
      name = e->name;
5609
      value = 0;
5610
      flags = BSF_LOCAL | BSF_SYNTHETIC;
5611
      sec = NULL;
5612
 
5613
      switch (e->typ)
5614
        {
5615
        case EGSD__C_SYM:
5616
        case EGSD__C_SYMG:
5617
          if ((e->flags & EGSY__V_DEF) && (e->flags & EGSY__V_NORM))
5618
            {
5619
              value = e->code_value;
5620
              sec = e->code_section;
5621
            }
5622
          else
5623
            continue;
5624
          break;
5625
 
5626
        default:
5627
          continue;
5628
        }
5629
 
5630
      l = strlen (name);
5631
      sname = bfd_alloc (abfd, l + 5);
5632
      if (sname == NULL)
5633
        return FALSE;
5634
      memcpy (sname, name, l);
5635
      memcpy (sname + l, "..en", 5);
5636
 
5637
      sym = &syms[n++];
5638
      sym->name = sname;
5639
      sym->section = sec;
5640
      sym->flags = flags;
5641
      sym->value = value;
5642
      sym->udata.p = NULL;
5643
    }
5644
 
5645
  return n;
5646
}
5647
 
5648
/* Private dump.  */
5649
 
5650
static const char *
5651
vms_time_to_str (unsigned char *buf)
5652
{
5653
  time_t t = vms_rawtime_to_time_t (buf);
5654
  char *res = ctime (&t);
5655
 
5656
  if (!res)
5657
    res = "*invalid time*";
5658
  else
5659
    res[24] = 0;
5660
  return res;
5661
}
5662
 
5663
static void
5664
evax_bfd_print_emh (FILE *file, unsigned char *rec, unsigned int rec_len)
5665
{
5666
  struct vms_emh_common *emh = (struct vms_emh_common *)rec;
5667
  unsigned int subtype;
5668
 
5669
  subtype = (unsigned)bfd_getl16 (emh->subtyp);
5670
 
5671
  fprintf (file, _("  EMH %u (len=%u): "), subtype, rec_len);
5672
 
5673
  switch (subtype)
5674
    {
5675
    case EMH__C_MHD:
5676
      {
5677
        struct vms_emh_mhd *mhd = (struct vms_emh_mhd *)rec;
5678
        const char *name;
5679
 
5680
        fprintf (file, _("Module header\n"));
5681
        fprintf (file, _("   structure level: %u\n"), mhd->strlvl);
5682
        fprintf (file, _("   max record size: %u\n"),
5683
                 (unsigned)bfd_getl32 (mhd->recsiz));
5684
        name = (char *)(mhd + 1);
5685
        fprintf (file, _("   module name    : %.*s\n"), name[0], name + 1);
5686
        name += name[0] + 1;
5687
        fprintf (file, _("   module version : %.*s\n"), name[0], name + 1);
5688
        name += name[0] + 1;
5689
        fprintf (file, _("   compile date   : %.17s\n"), name);
5690
      }
5691
      break;
5692
    case EMH__C_LNM:
5693
      {
5694
        fprintf (file, _("Language Processor Name\n"));
5695
        fprintf (file, _("   language name: %.*s\n"),
5696
                 (int)(rec_len - sizeof (struct vms_emh_common)),
5697
                 (char *)rec + sizeof (struct vms_emh_common));
5698
      }
5699
      break;
5700
    case EMH__C_SRC:
5701
      {
5702
        fprintf (file, _("Source Files Header\n"));
5703
        fprintf (file, _("   file: %.*s\n"),
5704
                 (int)(rec_len - sizeof (struct vms_emh_common)),
5705
                 (char *)rec + sizeof (struct vms_emh_common));
5706
      }
5707
      break;
5708
    case EMH__C_TTL:
5709
      {
5710
        fprintf (file, _("Title Text Header\n"));
5711
        fprintf (file, _("   title: %.*s\n"),
5712
                 (int)(rec_len - sizeof (struct vms_emh_common)),
5713
                 (char *)rec + sizeof (struct vms_emh_common));
5714
      }
5715
      break;
5716
    case EMH__C_CPR:
5717
      {
5718
        fprintf (file, _("Copyright Header\n"));
5719
        fprintf (file, _("   copyright: %.*s\n"),
5720
                 (int)(rec_len - sizeof (struct vms_emh_common)),
5721
                 (char *)rec + sizeof (struct vms_emh_common));
5722
      }
5723
      break;
5724
    default:
5725
      fprintf (file, _("unhandled emh subtype %u\n"), subtype);
5726
      break;
5727
    }
5728
}
5729
 
5730
static void
5731
evax_bfd_print_eeom (FILE *file, unsigned char *rec, unsigned int rec_len)
5732
{
5733
  struct vms_eeom *eeom = (struct vms_eeom *)rec;
5734
 
5735
  fprintf (file, _("  EEOM (len=%u):\n"), rec_len);
5736
  fprintf (file, _("   number of cond linkage pairs: %u\n"),
5737
           (unsigned)bfd_getl32 (eeom->total_lps));
5738
  fprintf (file, _("   completion code: %u\n"),
5739
           (unsigned)bfd_getl16 (eeom->comcod));
5740
  if (rec_len > 10)
5741
    {
5742
      fprintf (file, _("   transfer addr flags: 0x%02x\n"), eeom->tfrflg);
5743
      fprintf (file, _("   transfer addr psect: %u\n"),
5744
               (unsigned)bfd_getl32 (eeom->psindx));
5745
      fprintf (file, _("   transfer address   : 0x%08x\n"),
5746
               (unsigned)bfd_getl32 (eeom->tfradr));
5747
    }
5748
}
5749
 
5750
static void
5751
exav_bfd_print_egsy_flags (unsigned int flags, FILE *file)
5752
{
5753
  if (flags & EGSY__V_WEAK)
5754
    fputs (_(" WEAK"), file);
5755
  if (flags & EGSY__V_DEF)
5756
    fputs (_(" DEF"), file);
5757
  if (flags & EGSY__V_UNI)
5758
    fputs (_(" UNI"), file);
5759
  if (flags & EGSY__V_REL)
5760
    fputs (_(" REL"), file);
5761
  if (flags & EGSY__V_COMM)
5762
    fputs (_(" COMM"), file);
5763
  if (flags & EGSY__V_VECEP)
5764
    fputs (_(" VECEP"), file);
5765
  if (flags & EGSY__V_NORM)
5766
    fputs (_(" NORM"), file);
5767
  if (flags & EGSY__V_QUAD_VAL)
5768
    fputs (_(" QVAL"), file);
5769
}
5770
 
5771
static void
5772
evax_bfd_print_egsd_flags (FILE *file, unsigned int flags)
5773
{
5774
  if (flags & EGPS__V_PIC)
5775
    fputs (_(" PIC"), file);
5776
  if (flags & EGPS__V_LIB)
5777
    fputs (_(" LIB"), file);
5778
  if (flags & EGPS__V_OVR)
5779
    fputs (_(" OVR"), file);
5780
  if (flags & EGPS__V_REL)
5781
    fputs (_(" REL"), file);
5782
  if (flags & EGPS__V_GBL)
5783
    fputs (_(" GBL"), file);
5784
  if (flags & EGPS__V_SHR)
5785
    fputs (_(" SHR"), file);
5786
  if (flags & EGPS__V_EXE)
5787
    fputs (_(" EXE"), file);
5788
  if (flags & EGPS__V_RD)
5789
    fputs (_(" RD"), file);
5790
  if (flags & EGPS__V_WRT)
5791
    fputs (_(" WRT"), file);
5792
  if (flags & EGPS__V_VEC)
5793
    fputs (_(" VEC"), file);
5794
  if (flags & EGPS__V_NOMOD)
5795
    fputs (_(" NOMOD"), file);
5796
  if (flags & EGPS__V_COM)
5797
    fputs (_(" COM"), file);
5798
  if (flags & EGPS__V_ALLOC_64BIT)
5799
    fputs (_(" 64B"), file);
5800
}
5801
 
5802
static void
5803
evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len)
5804
{
5805
  unsigned int off = sizeof (struct vms_egsd);
5806
  unsigned int n;
5807
 
5808
  fprintf (file, _("  EGSD (len=%u):\n"), rec_len);
5809
 
5810
  n = 0;
5811
  for (off = sizeof (struct vms_egsd); off < rec_len; )
5812
    {
5813
      struct vms_egsd_entry *e = (struct vms_egsd_entry *)(rec + off);
5814
      unsigned int type;
5815
      unsigned int len;
5816
 
5817
      type = (unsigned)bfd_getl16 (e->gsdtyp);
5818
      len = (unsigned)bfd_getl16 (e->gsdsiz);
5819
 
5820
      fprintf (file, _("  EGSD entry %2u (type: %u, len: %u): "),
5821
               n, type, len);
5822
      n++;
5823
 
5824
      switch (type)
5825
        {
5826
        case EGSD__C_PSC:
5827
          {
5828
            struct vms_egps *egps = (struct vms_egps *)e;
5829
            unsigned int flags = bfd_getl16 (egps->flags);
5830
            unsigned int l;
5831
 
5832
            fprintf (file, _("PSC - Program section definition\n"));
5833
            fprintf (file, _("   alignment  : 2**%u\n"), egps->align);
5834
            fprintf (file, _("   flags      : 0x%04x"), flags);
5835
            evax_bfd_print_egsd_flags (file, flags);
5836
            fputc ('\n', file);
5837
            l = bfd_getl32 (egps->alloc);
5838
            fprintf (file, _("   alloc (len): %u (0x%08x)\n"), l, l);
5839
            fprintf (file, _("   name       : %.*s\n"),
5840
                     egps->namlng, egps->name);
5841
          }
5842
          break;
5843
        case EGSD__C_SPSC:
5844
          {
5845
            struct vms_esgps *esgps = (struct vms_esgps *)e;
5846
            unsigned int flags = bfd_getl16 (esgps->flags);
5847
            unsigned int l;
5848
 
5849
            fprintf (file, _("SPSC - Shared Image Program section def\n"));
5850
            fprintf (file, _("   alignment  : 2**%u\n"), esgps->align);
5851
            fprintf (file, _("   flags      : 0x%04x"), flags);
5852
            evax_bfd_print_egsd_flags (file, flags);
5853
            fputc ('\n', file);
5854
            l = bfd_getl32 (esgps->alloc);
5855
            fprintf (file, _("   alloc (len)   : %u (0x%08x)\n"), l, l);
5856
            fprintf (file, _("   image offset  : 0x%08x\n"),
5857
                     (unsigned int)bfd_getl32 (esgps->base));
5858
            fprintf (file, _("   symvec offset : 0x%08x\n"),
5859
                     (unsigned int)bfd_getl32 (esgps->value));
5860
            fprintf (file, _("   name          : %.*s\n"),
5861
                     esgps->namlng, esgps->name);
5862
          }
5863
          break;
5864
        case EGSD__C_SYM:
5865
          {
5866
            struct vms_egsy *egsy = (struct vms_egsy *)e;
5867
            unsigned int flags = bfd_getl16 (egsy->flags);
5868
 
5869
            if (flags & EGSY__V_DEF)
5870
              {
5871
                struct vms_esdf *esdf = (struct vms_esdf *)e;
5872
 
5873
                fprintf (file, _("SYM - Global symbol definition\n"));
5874
                fprintf (file, _("   flags: 0x%04x"), flags);
5875
                exav_bfd_print_egsy_flags (flags, file);
5876
                fputc ('\n', file);
5877
                fprintf (file, _("   psect offset: 0x%08x\n"),
5878
                         (unsigned)bfd_getl32 (esdf->value));
5879
                if (flags & EGSY__V_NORM)
5880
                  {
5881
                    fprintf (file, _("   code address: 0x%08x\n"),
5882
                             (unsigned)bfd_getl32 (esdf->code_address));
5883
                    fprintf (file, _("   psect index for entry point : %u\n"),
5884
                             (unsigned)bfd_getl32 (esdf->ca_psindx));
5885
                  }
5886
                fprintf (file, _("   psect index : %u\n"),
5887
                         (unsigned)bfd_getl32 (esdf->psindx));
5888
                fprintf (file, _("   name        : %.*s\n"),
5889
                         esdf->namlng, esdf->name);
5890
              }
5891
            else
5892
              {
5893
                struct vms_esrf *esrf = (struct vms_esrf *)e;
5894
 
5895
                fprintf (file, _("SYM - Global symbol reference\n"));
5896
                fprintf (file, _("   name       : %.*s\n"),
5897
                         esrf->namlng, esrf->name);
5898
              }
5899
          }
5900
          break;
5901
        case EGSD__C_IDC:
5902
          {
5903
            struct vms_eidc *eidc = (struct vms_eidc *)e;
5904
            unsigned int flags = bfd_getl32 (eidc->flags);
5905
            unsigned char *p;
5906
 
5907
            fprintf (file, _("IDC - Ident Consistency check\n"));
5908
            fprintf (file, _("   flags         : 0x%08x"), flags);
5909
            if (flags & EIDC__V_BINIDENT)
5910
              fputs (" BINDENT", file);
5911
            fputc ('\n', file);
5912
            fprintf (file, _("   id match      : %x\n"),
5913
                     (flags >> EIDC__V_IDMATCH_SH) & EIDC__V_IDMATCH_MASK);
5914
            fprintf (file, _("   error severity: %x\n"),
5915
                     (flags >> EIDC__V_ERRSEV_SH) & EIDC__V_ERRSEV_MASK);
5916
            p = eidc->name;
5917
            fprintf (file, _("   entity name   : %.*s\n"), p[0], p + 1);
5918
            p += 1 + p[0];
5919
            fprintf (file, _("   object name   : %.*s\n"), p[0], p + 1);
5920
            p += 1 + p[0];
5921
            if (flags & EIDC__V_BINIDENT)
5922
              fprintf (file, _("   binary ident  : 0x%08x\n"),
5923
                       (unsigned)bfd_getl32 (p + 1));
5924
            else
5925
              fprintf (file, _("   ascii ident   : %.*s\n"), p[0], p + 1);
5926
          }
5927
          break;
5928
        case EGSD__C_SYMG:
5929
          {
5930
            struct vms_egst *egst = (struct vms_egst *)e;
5931
            unsigned int flags = bfd_getl16 (egst->header.flags);
5932
 
5933
            fprintf (file, _("SYMG - Universal symbol definition\n"));
5934
            fprintf (file, _("   flags: 0x%04x"), flags);
5935
            exav_bfd_print_egsy_flags (flags, file);
5936
            fputc ('\n', file);
5937
            fprintf (file, _("   symbol vector offset: 0x%08x\n"),
5938
                     (unsigned)bfd_getl32 (egst->value));
5939
            fprintf (file, _("   entry point: 0x%08x\n"),
5940
                     (unsigned)bfd_getl32 (egst->lp_1));
5941
            fprintf (file, _("   proc descr : 0x%08x\n"),
5942
                     (unsigned)bfd_getl32 (egst->lp_2));
5943
            fprintf (file, _("   psect index: %u\n"),
5944
                     (unsigned)bfd_getl32 (egst->psindx));
5945
            fprintf (file, _("   name       : %.*s\n"),
5946
                     egst->namlng, egst->name);
5947
          }
5948
          break;
5949
        case EGSD__C_SYMV:
5950
          {
5951
            struct vms_esdfv *esdfv = (struct vms_esdfv *)e;
5952
            unsigned int flags = bfd_getl16 (esdfv->flags);
5953
 
5954
            fprintf (file, _("SYMV - Vectored symbol definition\n"));
5955
            fprintf (file, _("   flags: 0x%04x"), flags);
5956
            exav_bfd_print_egsy_flags (flags, file);
5957
            fputc ('\n', file);
5958
            fprintf (file, _("   vector      : 0x%08x\n"),
5959
                     (unsigned)bfd_getl32 (esdfv->vector));
5960
            fprintf (file, _("   psect offset: %u\n"),
5961
                     (unsigned)bfd_getl32 (esdfv->value));
5962
            fprintf (file, _("   psect index : %u\n"),
5963
                     (unsigned)bfd_getl32 (esdfv->psindx));
5964
            fprintf (file, _("   name        : %.*s\n"),
5965
                     esdfv->namlng, esdfv->name);
5966
          }
5967
          break;
5968
        case EGSD__C_SYMM:
5969
          {
5970
            struct vms_esdfm *esdfm = (struct vms_esdfm *)e;
5971
            unsigned int flags = bfd_getl16 (esdfm->flags);
5972
 
5973
            fprintf (file, _("SYMM - Global symbol definition with version\n"));
5974
            fprintf (file, _("   flags: 0x%04x"), flags);
5975
            exav_bfd_print_egsy_flags (flags, file);
5976
            fputc ('\n', file);
5977
            fprintf (file, _("   version mask: 0x%08x\n"),
5978
                     (unsigned)bfd_getl32 (esdfm->version_mask));
5979
            fprintf (file, _("   psect offset: %u\n"),
5980
                     (unsigned)bfd_getl32 (esdfm->value));
5981
            fprintf (file, _("   psect index : %u\n"),
5982
                     (unsigned)bfd_getl32 (esdfm->psindx));
5983
            fprintf (file, _("   name        : %.*s\n"),
5984
                     esdfm->namlng, esdfm->name);
5985
          }
5986
          break;
5987
        default:
5988
          fprintf (file, _("unhandled egsd entry type %u\n"), type);
5989
          break;
5990
        }
5991
      off += len;
5992
    }
5993
}
5994
 
5995
static void
5996
evax_bfd_print_hex (FILE *file, const char *pfx,
5997
                    const unsigned char *buf, unsigned int len)
5998
{
5999
  unsigned int i;
6000
  unsigned int n;
6001
 
6002
  n = 0;
6003
  for (i = 0; i < len; i++)
6004
    {
6005
      if (n == 0)
6006
        fputs (pfx, file);
6007
      fprintf (file, " %02x", buf[i]);
6008
      n++;
6009
      if (n == 16)
6010
        {
6011
          n = 0;
6012
          fputc ('\n', file);
6013
        }
6014
    }
6015
  if (n != 0)
6016
    fputc ('\n', file);
6017
}
6018
 
6019
static void
6020
evax_bfd_print_etir_stc_ir (FILE *file, const unsigned char *buf, int is_ps)
6021
{
6022
  fprintf (file, _("    linkage index: %u, replacement insn: 0x%08x\n"),
6023
           (unsigned)bfd_getl32 (buf),
6024
           (unsigned)bfd_getl32 (buf + 16));
6025
  fprintf (file, _("    psect idx 1: %u, offset 1: 0x%08x %08x\n"),
6026
           (unsigned)bfd_getl32 (buf + 4),
6027
           (unsigned)bfd_getl32 (buf + 12),
6028
           (unsigned)bfd_getl32 (buf + 8));
6029
  fprintf (file, _("    psect idx 2: %u, offset 2: 0x%08x %08x\n"),
6030
           (unsigned)bfd_getl32 (buf + 20),
6031
           (unsigned)bfd_getl32 (buf + 28),
6032
           (unsigned)bfd_getl32 (buf + 24));
6033
  if (is_ps)
6034
    fprintf (file, _("    psect idx 3: %u, offset 3: 0x%08x %08x\n"),
6035
             (unsigned)bfd_getl32 (buf + 32),
6036
             (unsigned)bfd_getl32 (buf + 40),
6037
             (unsigned)bfd_getl32 (buf + 36));
6038
  else
6039
    fprintf (file, _("    global name: %.*s\n"), buf[32], buf + 33);
6040
}
6041
 
6042
static void
6043
evax_bfd_print_etir (FILE *file, const char *name,
6044
                     unsigned char *rec, unsigned int rec_len)
6045
{
6046
  unsigned int off = sizeof (struct vms_egsd);
6047
  unsigned int sec_len;
6048
 
6049
  fprintf (file, _("  %s (len=%u+%u):\n"), name,
6050
           (unsigned)(rec_len - sizeof (struct vms_eobjrec)),
6051
           (unsigned)sizeof (struct vms_eobjrec));
6052
 
6053
  for (off = sizeof (struct vms_eobjrec); off < rec_len; )
6054
    {
6055
      struct vms_etir *etir = (struct vms_etir *)(rec + off);
6056
      unsigned char *buf;
6057
      unsigned int type;
6058
      unsigned int size;
6059
 
6060
      type = bfd_getl16 (etir->rectyp);
6061
      size = bfd_getl16 (etir->size);
6062
      buf = rec + off + sizeof (struct vms_etir);
6063
 
6064
      fprintf (file, _("   (type: %3u, size: 4+%3u): "), type, size - 4);
6065
      switch (type)
6066
        {
6067
        case ETIR__C_STA_GBL:
6068
          fprintf (file, _("STA_GBL (stack global) %.*s\n"),
6069
                   buf[0], buf + 1);
6070
          break;
6071
        case ETIR__C_STA_LW:
6072
          fprintf (file, _("STA_LW (stack longword) 0x%08x\n"),
6073
                   (unsigned)bfd_getl32 (buf));
6074
          break;
6075
        case ETIR__C_STA_QW:
6076
          fprintf (file, _("STA_QW (stack quadword) 0x%08x %08x\n"),
6077
                   (unsigned)bfd_getl32 (buf + 4),
6078
                   (unsigned)bfd_getl32 (buf + 0));
6079
          break;
6080
        case ETIR__C_STA_PQ:
6081
          fprintf (file, _("STA_PQ (stack psect base + offset)\n"));
6082
          fprintf (file, _("    psect: %u, offset: 0x%08x %08x\n"),
6083
                   (unsigned)bfd_getl32 (buf + 0),
6084
                   (unsigned)bfd_getl32 (buf + 8),
6085
                   (unsigned)bfd_getl32 (buf + 4));
6086
          break;
6087
        case ETIR__C_STA_LI:
6088
          fprintf (file, _("STA_LI (stack literal)\n"));
6089
          break;
6090
        case ETIR__C_STA_MOD:
6091
          fprintf (file, _("STA_MOD (stack module)\n"));
6092
          break;
6093
        case ETIR__C_STA_CKARG:
6094
          fprintf (file, _("STA_CKARG (compare procedure argument)\n"));
6095
          break;
6096
 
6097
        case ETIR__C_STO_B:
6098
          fprintf (file, _("STO_B (store byte)\n"));
6099
          break;
6100
        case ETIR__C_STO_W:
6101
          fprintf (file, _("STO_W (store word)\n"));
6102
          break;
6103
        case ETIR__C_STO_LW:
6104
          fprintf (file, _("STO_LW (store longword)\n"));
6105
          break;
6106
        case ETIR__C_STO_QW:
6107
          fprintf (file, _("STO_QW (store quadword)\n"));
6108
          break;
6109
        case ETIR__C_STO_IMMR:
6110
          {
6111
            unsigned int len = bfd_getl32 (buf);
6112
            fprintf (file,
6113
                     _("STO_IMMR (store immediate repeat) %u bytes\n"),
6114
                     len);
6115
            evax_bfd_print_hex (file, "   ", buf + 4, len);
6116
            sec_len += len;
6117
          }
6118
          break;
6119
        case ETIR__C_STO_GBL:
6120
          fprintf (file, _("STO_GBL (store global) %.*s\n"),
6121
                   buf[0], buf + 1);
6122
          break;
6123
        case ETIR__C_STO_CA:
6124
          fprintf (file, _("STO_CA (store code address) %.*s\n"),
6125
                   buf[0], buf + 1);
6126
          break;
6127
        case ETIR__C_STO_RB:
6128
          fprintf (file, _("STO_RB (store relative branch)\n"));
6129
          break;
6130
        case ETIR__C_STO_AB:
6131
          fprintf (file, _("STO_AB (store absolute branch)\n"));
6132
          break;
6133
        case ETIR__C_STO_OFF:
6134
          fprintf (file, _("STO_OFF (store offset to psect)\n"));
6135
          break;
6136
        case ETIR__C_STO_IMM:
6137
          {
6138
            unsigned int len = bfd_getl32 (buf);
6139
            fprintf (file,
6140
                     _("STO_IMM (store immediate) %u bytes\n"),
6141
                     len);
6142
            evax_bfd_print_hex (file, "   ", buf + 4, len);
6143
            sec_len += len;
6144
          }
6145
          break;
6146
        case ETIR__C_STO_GBL_LW:
6147
          fprintf (file, _("STO_GBL_LW (store global longword) %.*s\n"),
6148
                   buf[0], buf + 1);
6149
          break;
6150
        case ETIR__C_STO_LP_PSB:
6151
          fprintf (file, _("STO_OFF (store LP with procedure signature)\n"));
6152
          break;
6153
        case ETIR__C_STO_HINT_GBL:
6154
          fprintf (file, _("STO_BR_GBL (store branch global) *todo*\n"));
6155
          break;
6156
        case ETIR__C_STO_HINT_PS:
6157
          fprintf (file, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6158
          break;
6159
 
6160
        case ETIR__C_OPR_NOP:
6161
          fprintf (file, _("OPR_NOP (no-operation)\n"));
6162
          break;
6163
        case ETIR__C_OPR_ADD:
6164
          fprintf (file, _("OPR_ADD (add)\n"));
6165
          break;
6166
        case ETIR__C_OPR_SUB:
6167
          fprintf (file, _("OPR_SUB (substract)\n"));
6168
          break;
6169
        case ETIR__C_OPR_MUL:
6170
          fprintf (file, _("OPR_MUL (multiply)\n"));
6171
          break;
6172
        case ETIR__C_OPR_DIV:
6173
          fprintf (file, _("OPR_DIV (divide)\n"));
6174
          break;
6175
        case ETIR__C_OPR_AND:
6176
          fprintf (file, _("OPR_AND (logical and)\n"));
6177
          break;
6178
        case ETIR__C_OPR_IOR:
6179
          fprintf (file, _("OPR_IOR (logical inclusive or)\n"));
6180
          break;
6181
        case ETIR__C_OPR_EOR:
6182
          fprintf (file, _("OPR_EOR (logical exclusive or)\n"));
6183
          break;
6184
        case ETIR__C_OPR_NEG:
6185
          fprintf (file, _("OPR_NEG (negate)\n"));
6186
          break;
6187
        case ETIR__C_OPR_COM:
6188
          fprintf (file, _("OPR_COM (complement)\n"));
6189
          break;
6190
        case ETIR__C_OPR_INSV:
6191
          fprintf (file, _("OPR_INSV (insert field)\n"));
6192
          break;
6193
        case ETIR__C_OPR_ASH:
6194
          fprintf (file, _("OPR_ASH (arithmetic shift)\n"));
6195
          break;
6196
        case ETIR__C_OPR_USH:
6197
          fprintf (file, _("OPR_USH (unsigned shift)\n"));
6198
          break;
6199
        case ETIR__C_OPR_ROT:
6200
          fprintf (file, _("OPR_ROT (rotate)\n"));
6201
          break;
6202
        case ETIR__C_OPR_SEL:
6203
          fprintf (file, _("OPR_SEL (select)\n"));
6204
          break;
6205
        case ETIR__C_OPR_REDEF:
6206
          fprintf (file, _("OPR_REDEF (redefine symbol to curr location)\n"));
6207
          break;
6208
        case ETIR__C_OPR_DFLIT:
6209
          fprintf (file, _("OPR_REDEF (define a literal)\n"));
6210
          break;
6211
 
6212
        case ETIR__C_STC_LP:
6213
          fprintf (file, _("STC_LP (store cond linkage pair)\n"));
6214
          break;
6215
        case ETIR__C_STC_LP_PSB:
6216
          fprintf (file,
6217
                   _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6218
          fprintf (file, _("   linkage index: %u, procedure: %.*s\n"),
6219
                   (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6220
          buf += 4 + 1 + buf[4];
6221
          fprintf (file, _("   signature: %.*s\n"), buf[0], buf + 1);
6222
          break;
6223
        case ETIR__C_STC_GBL:
6224
          fprintf (file, _("STC_GBL (store cond global)\n"));
6225
          fprintf (file, _("   linkage index: %u, global: %.*s\n"),
6226
                   (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6227
          break;
6228
        case ETIR__C_STC_GCA:
6229
          fprintf (file, _("STC_GCA (store cond code address)\n"));
6230
          fprintf (file, _("   linkage index: %u, procedure name: %.*s\n"),
6231
                   (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6232
          break;
6233
        case ETIR__C_STC_PS:
6234
          fprintf (file, _("STC_PS (store cond psect + offset)\n"));
6235
          fprintf (file,
6236
                   _("   linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6237
                   (unsigned)bfd_getl32 (buf),
6238
                   (unsigned)bfd_getl32 (buf + 4),
6239
                   (unsigned)bfd_getl32 (buf + 12),
6240
                   (unsigned)bfd_getl32 (buf + 8));
6241
          break;
6242
        case ETIR__C_STC_NOP_GBL:
6243
          fprintf (file, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6244
          evax_bfd_print_etir_stc_ir (file, buf, 0);
6245
          break;
6246
        case ETIR__C_STC_NOP_PS:
6247
          fprintf (file, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6248
          evax_bfd_print_etir_stc_ir (file, buf, 1);
6249
          break;
6250
        case ETIR__C_STC_BSR_GBL:
6251
          fprintf (file, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6252
          evax_bfd_print_etir_stc_ir (file, buf, 0);
6253
          break;
6254
        case ETIR__C_STC_BSR_PS:
6255
          fprintf (file, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6256
          evax_bfd_print_etir_stc_ir (file, buf, 1);
6257
          break;
6258
        case ETIR__C_STC_LDA_GBL:
6259
          fprintf (file, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6260
          evax_bfd_print_etir_stc_ir (file, buf, 0);
6261
          break;
6262
        case ETIR__C_STC_LDA_PS:
6263
          fprintf (file, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6264
          evax_bfd_print_etir_stc_ir (file, buf, 1);
6265
          break;
6266
        case ETIR__C_STC_BOH_GBL:
6267
          fprintf (file, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6268
          evax_bfd_print_etir_stc_ir (file, buf, 0);
6269
          break;
6270
        case ETIR__C_STC_BOH_PS:
6271
          fprintf (file, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6272
          evax_bfd_print_etir_stc_ir (file, buf, 1);
6273
          break;
6274
        case ETIR__C_STC_NBH_GBL:
6275
          fprintf (file,
6276
                   _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6277
          break;
6278
        case ETIR__C_STC_NBH_PS:
6279
          fprintf (file,
6280
                   _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6281
          break;
6282
 
6283
        case ETIR__C_CTL_SETRB:
6284
          fprintf (file, _("CTL_SETRB (set relocation base)\n"));
6285
          sec_len += 4;
6286
          break;
6287
        case ETIR__C_CTL_AUGRB:
6288
          {
6289
            unsigned int val = bfd_getl32 (buf);
6290
            fprintf (file, _("CTL_AUGRB (augment relocation base) %u\n"), val);
6291
          }
6292
          break;
6293
        case ETIR__C_CTL_DFLOC:
6294
          fprintf (file, _("CTL_DFLOC (define location)\n"));
6295
          break;
6296
        case ETIR__C_CTL_STLOC:
6297
          fprintf (file, _("CTL_STLOC (set location)\n"));
6298
          break;
6299
        case ETIR__C_CTL_STKDL:
6300
          fprintf (file, _("CTL_STKDL (stack defined location)\n"));
6301
          break;
6302
        default:
6303
          fprintf (file, _("*unhandled*\n"));
6304
          break;
6305
        }
6306
      off += size;
6307
    }
6308
}
6309
 
6310
static void
6311
evax_bfd_print_eobj (struct bfd *abfd, FILE *file)
6312
{
6313
  bfd_boolean is_first = TRUE;
6314
  bfd_boolean has_records = FALSE;
6315
 
6316
  while (1)
6317
    {
6318
      unsigned int rec_len;
6319
      unsigned int pad_len;
6320
      unsigned char *rec;
6321
      unsigned int hdr_size;
6322
      unsigned int type;
6323
 
6324
      if (is_first)
6325
        {
6326
          unsigned char buf[6];
6327
 
6328
          is_first = FALSE;
6329
 
6330
          /* Read 6 bytes.  */
6331
          if (bfd_bread (buf, sizeof (buf), abfd) != sizeof (buf))
6332
            {
6333
              fprintf (file, _("cannot read GST record length\n"));
6334
              return;
6335
            }
6336
          rec_len = bfd_getl16 (buf + 0);
6337
          if (rec_len == bfd_getl16 (buf + 4)
6338
              && bfd_getl16 (buf + 2) == EOBJ__C_EMH)
6339
            {
6340
              /* The format is raw: record-size, type, record-size.  */
6341
              has_records = TRUE;
6342
              pad_len = (rec_len + 1) & ~1U;
6343
              hdr_size = 4;
6344
            }
6345
          else if (rec_len == EOBJ__C_EMH)
6346
            {
6347
              has_records = FALSE;
6348
              pad_len = bfd_getl16 (buf + 2);
6349
              hdr_size = 6;
6350
            }
6351
          else
6352
            {
6353
              /* Ill-formed.  */
6354
              fprintf (file, _("cannot find EMH in first GST record\n"));
6355
              return;
6356
            }
6357
          rec = bfd_malloc (pad_len);
6358
          memcpy (rec, buf + sizeof (buf) - hdr_size, hdr_size);
6359
        }
6360
      else
6361
        {
6362
          unsigned int rec_len2 = 0;
6363
          unsigned char hdr[4];
6364
 
6365
          if (has_records)
6366
            {
6367
              unsigned char buf_len[2];
6368
 
6369
              if (bfd_bread (buf_len, sizeof (buf_len), abfd)
6370
                  != sizeof (buf_len))
6371
                {
6372
                  fprintf (file, _("cannot read GST record length\n"));
6373
                  return;
6374
                }
6375
              rec_len2 = (unsigned)bfd_getl16 (buf_len);
6376
            }
6377
 
6378
          if (bfd_bread (hdr, sizeof (hdr), abfd) != sizeof (hdr))
6379
            {
6380
              fprintf (file, _("cannot read GST record header\n"));
6381
              return;
6382
            }
6383
          rec_len = (unsigned)bfd_getl16 (hdr + 2);
6384
          if (has_records)
6385
            pad_len = (rec_len + 1) & ~1U;
6386
          else
6387
            pad_len = rec_len;
6388
          rec = bfd_malloc (pad_len);
6389
          memcpy (rec, hdr, sizeof (hdr));
6390
          hdr_size = sizeof (hdr);
6391
          if (has_records && rec_len2 != rec_len)
6392
            {
6393
              fprintf (file, _(" corrupted GST\n"));
6394
              break;
6395
            }
6396
        }
6397
 
6398
      if (bfd_bread (rec + hdr_size, pad_len - hdr_size, abfd)
6399
          != pad_len - hdr_size)
6400
        {
6401
          fprintf (file, _("cannot read GST record\n"));
6402
          return;
6403
        }
6404
 
6405
      type = (unsigned)bfd_getl16 (rec);
6406
 
6407
      switch (type)
6408
        {
6409
        case EOBJ__C_EMH:
6410
          evax_bfd_print_emh (file, rec, rec_len);
6411
          break;
6412
        case EOBJ__C_EGSD:
6413
          evax_bfd_print_egsd (file, rec, rec_len);
6414
          break;
6415
        case EOBJ__C_EEOM:
6416
          evax_bfd_print_eeom (file, rec, rec_len);
6417
          free (rec);
6418
          return;
6419
          break;
6420
        case EOBJ__C_ETIR:
6421
          evax_bfd_print_etir (file, "ETIR", rec, rec_len);
6422
          break;
6423
        case EOBJ__C_EDBG:
6424
          evax_bfd_print_etir (file, "EDBG", rec, rec_len);
6425
          break;
6426
        case EOBJ__C_ETBT:
6427
          evax_bfd_print_etir (file, "ETBT", rec, rec_len);
6428
          break;
6429
        default:
6430
          fprintf (file, _(" unhandled EOBJ record type %u\n"), type);
6431
          break;
6432
        }
6433
      free (rec);
6434
    }
6435
}
6436
 
6437
static void
6438
evax_bfd_print_relocation_records (FILE *file, const unsigned char *rel,
6439
                                   unsigned int stride)
6440
{
6441
  while (1)
6442
    {
6443
      unsigned int base;
6444
      unsigned int count;
6445
      unsigned int j;
6446
 
6447
      count = bfd_getl32 (rel + 0);
6448
 
6449
      if (count == 0)
6450
        break;
6451
      base = bfd_getl32 (rel + 4);
6452
 
6453
      fprintf (file, _("  bitcount: %u, base addr: 0x%08x\n"),
6454
               count, base);
6455
 
6456
      rel += 8;
6457
      for (j = 0; count > 0; j += 4, count -= 32)
6458
        {
6459
          unsigned int k;
6460
          unsigned int n = 0;
6461
          unsigned int val;
6462
 
6463
          val = bfd_getl32 (rel);
6464
          rel += 4;
6465
 
6466
          fprintf (file, _("   bitmap: 0x%08x (count: %u):\n"), val, count);
6467
 
6468
          for (k = 0; k < 32; k++)
6469
            if (val & (1 << k))
6470
              {
6471
                if (n == 0)
6472
                  fputs ("   ", file);
6473
                fprintf (file, _(" %08x"), base + (j * 8 + k) * stride);
6474
                n++;
6475
                if (n == 8)
6476
                  {
6477
                    fputs ("\n", file);
6478
                    n = 0;
6479
                  }
6480
              }
6481
          if (n)
6482
            fputs ("\n", file);
6483
        }
6484
    }
6485
}
6486
 
6487
static void
6488
evax_bfd_print_address_fixups (FILE *file, const unsigned char *rel)
6489
{
6490
  while (1)
6491
    {
6492
      unsigned int j;
6493
      unsigned int count;
6494
 
6495
      count = bfd_getl32 (rel + 0);
6496
      if (count == 0)
6497
        return;
6498
      fprintf (file, _("  image %u (%u entries)\n"),
6499
               (unsigned)bfd_getl32 (rel + 4), count);
6500
      rel += 8;
6501
      for (j = 0; j < count; j++)
6502
        {
6503
          fprintf (file, _("   offset: 0x%08x, val: 0x%08x\n"),
6504
                   (unsigned)bfd_getl32 (rel + 0),
6505
                   (unsigned)bfd_getl32 (rel + 4));
6506
          rel += 8;
6507
        }
6508
    }
6509
}
6510
 
6511
static void
6512
evax_bfd_print_reference_fixups (FILE *file, const unsigned char *rel)
6513
{
6514
  unsigned int count;
6515
 
6516
  while (1)
6517
    {
6518
      unsigned int j;
6519
      unsigned int n = 0;
6520
 
6521
      count = bfd_getl32 (rel + 0);
6522
      if (count == 0)
6523
        break;
6524
      fprintf (file, _("  image %u (%u entries), offsets:\n"),
6525
               (unsigned)bfd_getl32 (rel + 4), count);
6526
      rel += 8;
6527
      for (j = 0; j < count; j++)
6528
        {
6529
          if (n == 0)
6530
            fputs ("   ", file);
6531
          fprintf (file, _(" 0x%08x"), (unsigned)bfd_getl32 (rel));
6532
          n++;
6533
          if (n == 7)
6534
            {
6535
              fputs ("\n", file);
6536
              n = 0;
6537
            }
6538
          rel += 4;
6539
        }
6540
      if (n)
6541
        fputs ("\n", file);
6542
    }
6543
}
6544
 
6545
static void
6546
evax_bfd_print_indent (int indent, FILE *file)
6547
{
6548
  for (; indent; indent--)
6549
    fputc (' ', file);
6550
}
6551
 
6552
static const char *
6553
evax_bfd_get_dsc_name (unsigned int v)
6554
{
6555
  switch (v)
6556
    {
6557
    case DSC__K_DTYPE_Z:
6558
      return "Z (Unspecified)";
6559
    case DSC__K_DTYPE_V:
6560
      return "V (Bit)";
6561
    case DSC__K_DTYPE_BU:
6562
      return "BU (Byte logical)";
6563
    case DSC__K_DTYPE_WU:
6564
      return "WU (Word logical)";
6565
    case DSC__K_DTYPE_LU:
6566
      return "LU (Longword logical)";
6567
    case DSC__K_DTYPE_QU:
6568
      return "QU (Quadword logical)";
6569
    case DSC__K_DTYPE_B:
6570
      return "B (Byte integer)";
6571
    case DSC__K_DTYPE_W:
6572
      return "W (Word integer)";
6573
    case DSC__K_DTYPE_L:
6574
      return "L (Longword integer)";
6575
    case DSC__K_DTYPE_Q:
6576
      return "Q (Quadword integer)";
6577
    case DSC__K_DTYPE_F:
6578
      return "F (Single-precision floating)";
6579
    case DSC__K_DTYPE_D:
6580
      return "D (Double-precision floating)";
6581
    case DSC__K_DTYPE_FC:
6582
      return "FC (Complex)";
6583
    case DSC__K_DTYPE_DC:
6584
      return "DC (Double-precision Complex)";
6585
    case DSC__K_DTYPE_T:
6586
      return "T (ASCII text string)";
6587
    case DSC__K_DTYPE_NU:
6588
      return "NU (Numeric string, unsigned)";
6589
    case DSC__K_DTYPE_NL:
6590
      return "NL (Numeric string, left separate sign)";
6591
    case DSC__K_DTYPE_NLO:
6592
      return "NLO (Numeric string, left overpunched sign)";
6593
    case DSC__K_DTYPE_NR:
6594
      return "NR (Numeric string, right separate sign)";
6595
    case DSC__K_DTYPE_NRO:
6596
      return "NRO (Numeric string, right overpunched sig)";
6597
    case DSC__K_DTYPE_NZ:
6598
      return "NZ (Numeric string, zoned sign)";
6599
    case DSC__K_DTYPE_P:
6600
      return "P (Packed decimal string)";
6601
    case DSC__K_DTYPE_ZI:
6602
      return "ZI (Sequence of instructions)";
6603
    case DSC__K_DTYPE_ZEM:
6604
      return "ZEM (Procedure entry mask)";
6605
    case DSC__K_DTYPE_DSC:
6606
      return "DSC (Descriptor, used for arrays of dyn strings)";
6607
    case DSC__K_DTYPE_OU:
6608
      return "OU (Octaword logical)";
6609
    case DSC__K_DTYPE_O:
6610
      return "O (Octaword integer)";
6611
    case DSC__K_DTYPE_G:
6612
      return "G (Double precision G floating, 64 bit)";
6613
    case DSC__K_DTYPE_H:
6614
      return "H (Quadruple precision floating, 128 bit)";
6615
    case DSC__K_DTYPE_GC:
6616
      return "GC (Double precision complex, G floating)";
6617
    case DSC__K_DTYPE_HC:
6618
      return "HC (Quadruple precision complex, H floating)";
6619
    case DSC__K_DTYPE_CIT:
6620
      return "CIT (COBOL intermediate temporary)";
6621
    case DSC__K_DTYPE_BPV:
6622
      return "BPV (Bound Procedure Value)";
6623
    case DSC__K_DTYPE_BLV:
6624
      return "BLV (Bound Label Value)";
6625
    case DSC__K_DTYPE_VU:
6626
      return "VU (Bit Unaligned)";
6627
    case DSC__K_DTYPE_ADT:
6628
      return "ADT (Absolute Date-Time)";
6629
    case DSC__K_DTYPE_VT:
6630
      return "VT (Varying Text)";
6631
    case DSC__K_DTYPE_T2:
6632
      return "T2 (16-bit char)";
6633
    case DSC__K_DTYPE_VT2:
6634
      return "VT2 (16-bit varying char)";
6635
    default:
6636
      return "?? (unknown)";
6637
    }
6638
}
6639
 
6640
static void
6641
evax_bfd_print_desc (const unsigned char *buf, int indent, FILE *file)
6642
{
6643
  unsigned char bclass = buf[3];
6644
  unsigned char dtype = buf[2];
6645
  unsigned int len = (unsigned)bfd_getl16 (buf);
6646
  unsigned int pointer = (unsigned)bfd_getl32 (buf + 4);
6647
 
6648
  evax_bfd_print_indent (indent, file);
6649
 
6650
  if (len == 1 && pointer == 0xffffffffUL)
6651
    {
6652
      /* 64 bits.  */
6653
      fprintf (file, _("64 bits *unhandled*\n"));
6654
    }
6655
  else
6656
    {
6657
      fprintf (file, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
6658
               bclass, dtype, len, pointer);
6659
      switch (bclass)
6660
        {
6661
        case DSC__K_CLASS_NCA:
6662
          {
6663
            const struct vms_dsc_nca *dsc = (const void *)buf;
6664
            unsigned int i;
6665
            const unsigned char *b;
6666
 
6667
            evax_bfd_print_indent (indent, file);
6668
            fprintf (file, _("non-contiguous array of %s\n"),
6669
                     evax_bfd_get_dsc_name (dsc->dtype));
6670
            evax_bfd_print_indent (indent + 1, file);
6671
            fprintf (file,
6672
                     _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
6673
                     dsc->dimct, dsc->aflags, dsc->digits, dsc->scale);
6674
            evax_bfd_print_indent (indent + 1, file);
6675
            fprintf (file,
6676
                     _("arsize: %u, a0: 0x%08x\n"),
6677
                     (unsigned)bfd_getl32 (dsc->arsize),
6678
                     (unsigned)bfd_getl32 (dsc->a0));
6679
            evax_bfd_print_indent (indent + 1, file);
6680
            fprintf (file, _("Strides:\n"));
6681
            b = buf + sizeof (*dsc);
6682
            for (i = 0; i < dsc->dimct; i++)
6683
              {
6684
                evax_bfd_print_indent (indent + 2, file);
6685
                fprintf (file, _("[%u]: %u\n"), i + 1,
6686
                         (unsigned)bfd_getl32 (b));
6687
                b += 4;
6688
              }
6689
            evax_bfd_print_indent (indent + 1, file);
6690
            fprintf (file, _("Bounds:\n"));
6691
            b = buf + sizeof (*dsc);
6692
            for (i = 0; i < dsc->dimct; i++)
6693
              {
6694
                evax_bfd_print_indent (indent + 2, file);
6695
                fprintf (file, _("[%u]: Lower: %u, upper: %u\n"), i + 1,
6696
                         (unsigned)bfd_getl32 (b + 0),
6697
                         (unsigned)bfd_getl32 (b + 4));
6698
                b += 8;
6699
              }
6700
          }
6701
          break;
6702
        case DSC__K_CLASS_UBS:
6703
          {
6704
            const struct vms_dsc_ubs *ubs = (const void *)buf;
6705
 
6706
            evax_bfd_print_indent (indent, file);
6707
            fprintf (file, _("unaligned bit-string of %s\n"),
6708
                     evax_bfd_get_dsc_name (ubs->dtype));
6709
            evax_bfd_print_indent (indent + 1, file);
6710
            fprintf (file,
6711
                     _("base: %u, pos: %u\n"),
6712
                     (unsigned)bfd_getl32 (ubs->base),
6713
                     (unsigned)bfd_getl32 (ubs->pos));
6714
          }
6715
          break;
6716
        default:
6717
          fprintf (file, _("*unhandled*\n"));
6718
          break;
6719
        }
6720
    }
6721
}
6722
 
6723
static unsigned int
6724
evax_bfd_print_valspec (const unsigned char *buf, int indent, FILE *file)
6725
{
6726
  unsigned int vflags = buf[0];
6727
  unsigned int value = (unsigned)bfd_getl32 (buf + 1);
6728
  unsigned int len = 5;
6729
 
6730
  evax_bfd_print_indent (indent, file);
6731
  fprintf (file, _("vflags: 0x%02x, value: 0x%08x "), vflags, value);
6732
  buf += 5;
6733
 
6734
  switch (vflags)
6735
    {
6736
    case DST__K_VFLAGS_NOVAL:
6737
      fprintf (file, _("(no value)\n"));
6738
      break;
6739
    case DST__K_VFLAGS_NOTACTIVE:
6740
      fprintf (file, _("(not active)\n"));
6741
      break;
6742
    case DST__K_VFLAGS_UNALLOC:
6743
      fprintf (file, _("(not allocated)\n"));
6744
      break;
6745
    case DST__K_VFLAGS_DSC:
6746
      fprintf (file, _("(descriptor)\n"));
6747
      evax_bfd_print_desc (buf + value, indent + 1, file);
6748
      break;
6749
    case DST__K_VFLAGS_TVS:
6750
      fprintf (file, _("(trailing value)\n"));
6751
      break;
6752
    case DST__K_VS_FOLLOWS:
6753
      fprintf (file, _("(value spec follows)\n"));
6754
      break;
6755
    case DST__K_VFLAGS_BITOFFS:
6756
      fprintf (file, _("(at bit offset %u)\n"), value);
6757
      break;
6758
    default:
6759
      fprintf (file, _("(reg: %u, disp: %u, indir: %u, kind: "),
6760
               (vflags & DST__K_REGNUM_MASK) >> DST__K_REGNUM_SHIFT,
6761
               vflags & DST__K_DISP ? 1 : 0,
6762
               vflags & DST__K_INDIR ? 1 : 0);
6763
      switch (vflags & DST__K_VALKIND_MASK)
6764
        {
6765
        case DST__K_VALKIND_LITERAL:
6766
          fputs (_("literal"), file);
6767
          break;
6768
        case DST__K_VALKIND_ADDR:
6769
          fputs (_("address"), file);
6770
          break;
6771
        case DST__K_VALKIND_DESC:
6772
          fputs (_("desc"), file);
6773
          break;
6774
        case DST__K_VALKIND_REG:
6775
          fputs (_("reg"), file);
6776
          break;
6777
        }
6778
      fputs (")\n", file);
6779
      break;
6780
    }
6781
  return len;
6782
}
6783
 
6784
static void
6785
evax_bfd_print_typspec (const unsigned char *buf, int indent, FILE *file)
6786
{
6787
  unsigned char kind = buf[2];
6788
  unsigned int len = (unsigned)bfd_getl16 (buf);
6789
 
6790
  evax_bfd_print_indent (indent, file);
6791
  fprintf (file, ("len: %2u, kind: %2u "), len, kind);
6792
  buf += 3;
6793
  switch (kind)
6794
    {
6795
    case DST__K_TS_ATOM:
6796
      fprintf (file, ("atomic, type=0x%02x %s\n"),
6797
               buf[0], evax_bfd_get_dsc_name (buf[0]));
6798
      break;
6799
    case DST__K_TS_IND:
6800
      fprintf (file, ("indirect, defined at 0x%08x\n"),
6801
               (unsigned)bfd_getl32 (buf));
6802
      break;
6803
    case DST__K_TS_TPTR:
6804
      fprintf (file, ("typed pointer\n"));
6805
      evax_bfd_print_typspec (buf, indent + 1, file);
6806
      break;
6807
    case DST__K_TS_PTR:
6808
      fprintf (file, ("pointer\n"));
6809
      break;
6810
    case DST__K_TS_ARRAY:
6811
      {
6812
        const unsigned char *vs;
6813
        unsigned int vec_len;
6814
        unsigned int i;
6815
 
6816
        fprintf (file, ("array, dim: %u, bitmap: "), buf[0]);
6817
        vec_len = (buf[0] + 1 + 7) / 8;
6818
        for (i = 0; i < vec_len; i++)
6819
          fprintf (file, " %02x", buf[i + 1]);
6820
        fputc ('\n', file);
6821
        vs = buf + 1 + vec_len;
6822
        evax_bfd_print_indent (indent, file);
6823
        fprintf (file, ("array descriptor:\n"));
6824
        vs += evax_bfd_print_valspec (vs, indent + 1, file);
6825
        for (i = 0; i < buf[0] + 1U; i++)
6826
          if (buf[1 + i / 8] & (1 << (i % 8)))
6827
            {
6828
              evax_bfd_print_indent (indent, file);
6829
              if (i == 0)
6830
                fprintf (file, ("type spec for element:\n"));
6831
              else
6832
                fprintf (file, ("type spec for subscript %u:\n"), i);
6833
              evax_bfd_print_typspec (vs, indent + 1, file);
6834
              vs += bfd_getl16 (vs);
6835
            }
6836
      }
6837
      break;
6838
    default:
6839
      fprintf (file, ("*unhandled*\n"));
6840
    }
6841
}
6842
 
6843
static void
6844
evax_bfd_print_dst (struct bfd *abfd, unsigned int dst_size, FILE *file)
6845
{
6846
  unsigned int off = 0;
6847
  unsigned int pc = 0;
6848
  unsigned int line = 0;
6849
 
6850
  fprintf (file, _("Debug symbol table:\n"));
6851
 
6852
  while (dst_size > 0)
6853
    {
6854
      struct vms_dst_header dsth;
6855
      unsigned int len;
6856
      unsigned int type;
6857
      unsigned char *buf;
6858
 
6859
      if (bfd_bread (&dsth, sizeof (dsth), abfd) != sizeof (dsth))
6860
        {
6861
          fprintf (file, _("cannot read DST header\n"));
6862
          return;
6863
        }
6864
      len = bfd_getl16 (dsth.length);
6865
      type = bfd_getl16 (dsth.type);
6866
      fprintf (file, _(" type: %3u, len: %3u (at 0x%08x): "),
6867
               type, len, off);
6868
      if (len == 0)
6869
        {
6870
          fputc ('\n', file);
6871
          break;
6872
        }
6873
      len++;
6874
      dst_size -= len;
6875
      off += len;
6876
      len -= sizeof (dsth);
6877
      buf = bfd_malloc (len);
6878
      if (bfd_bread (buf, len, abfd) != len)
6879
        {
6880
          fprintf (file, _("cannot read DST symbol\n"));
6881
          return;
6882
        }
6883
      switch (type)
6884
        {
6885
        case DSC__K_DTYPE_V:
6886
        case DSC__K_DTYPE_BU:
6887
        case DSC__K_DTYPE_WU:
6888
        case DSC__K_DTYPE_LU:
6889
        case DSC__K_DTYPE_QU:
6890
        case DSC__K_DTYPE_B:
6891
        case DSC__K_DTYPE_W:
6892
        case DSC__K_DTYPE_L:
6893
        case DSC__K_DTYPE_Q:
6894
        case DSC__K_DTYPE_F:
6895
        case DSC__K_DTYPE_D:
6896
        case DSC__K_DTYPE_FC:
6897
        case DSC__K_DTYPE_DC:
6898
        case DSC__K_DTYPE_T:
6899
        case DSC__K_DTYPE_NU:
6900
        case DSC__K_DTYPE_NL:
6901
        case DSC__K_DTYPE_NLO:
6902
        case DSC__K_DTYPE_NR:
6903
        case DSC__K_DTYPE_NRO:
6904
        case DSC__K_DTYPE_NZ:
6905
        case DSC__K_DTYPE_P:
6906
        case DSC__K_DTYPE_ZI:
6907
        case DSC__K_DTYPE_ZEM:
6908
        case DSC__K_DTYPE_DSC:
6909
        case DSC__K_DTYPE_OU:
6910
        case DSC__K_DTYPE_O:
6911
        case DSC__K_DTYPE_G:
6912
        case DSC__K_DTYPE_H:
6913
        case DSC__K_DTYPE_GC:
6914
        case DSC__K_DTYPE_HC:
6915
        case DSC__K_DTYPE_CIT:
6916
        case DSC__K_DTYPE_BPV:
6917
        case DSC__K_DTYPE_BLV:
6918
        case DSC__K_DTYPE_VU:
6919
        case DSC__K_DTYPE_ADT:
6920
        case DSC__K_DTYPE_VT:
6921
        case DSC__K_DTYPE_T2:
6922
        case DSC__K_DTYPE_VT2:
6923
          fprintf (file, _("standard data: %s\n"),
6924
                   evax_bfd_get_dsc_name (type));
6925
          evax_bfd_print_valspec (buf, 4, file);
6926
          fprintf (file, _("    name: %.*s\n"), buf[5], buf + 6);
6927
          break;
6928
        case DST__K_MODBEG:
6929
          {
6930
            struct vms_dst_modbeg *dst = (void *)buf;
6931
            const char *name = (const char *)buf + sizeof (*dst);
6932
 
6933
            fprintf (file, _("modbeg\n"));
6934
            fprintf (file, _("   flags: %d, language: %u, "
6935
                             "major: %u, minor: %u\n"),
6936
                     dst->flags,
6937
                     (unsigned)bfd_getl32 (dst->language),
6938
                     (unsigned)bfd_getl16 (dst->major),
6939
                     (unsigned)bfd_getl16 (dst->minor));
6940
            fprintf (file, _("   module name: %.*s\n"),
6941
                     name[0], name + 1);
6942
            name += name[0] + 1;
6943
            fprintf (file, _("   compiler   : %.*s\n"),
6944
                     name[0], name + 1);
6945
          }
6946
          break;
6947
        case DST__K_MODEND:
6948
          fprintf (file, _("modend\n"));
6949
          break;
6950
        case DST__K_RTNBEG:
6951
          {
6952
            struct vms_dst_rtnbeg *dst = (void *)buf;
6953
            const char *name = (const char *)buf + sizeof (*dst);
6954
 
6955
            fputs (_("rtnbeg\n"), file);
6956
            fprintf (file, _("    flags: %u, address: 0x%08x, "
6957
                             "pd-address: 0x%08x\n"),
6958
                     dst->flags,
6959
                     (unsigned)bfd_getl32 (dst->address),
6960
                     (unsigned)bfd_getl32 (dst->pd_address));
6961
            fprintf (file, _("    routine name: %.*s\n"),
6962
                     name[0], name + 1);
6963
          }
6964
          break;
6965
        case DST__K_RTNEND:
6966
          {
6967
            struct vms_dst_rtnend *dst = (void *)buf;
6968
 
6969
            fprintf (file, _("rtnend: size 0x%08x\n"),
6970
                     (unsigned)bfd_getl32 (dst->size));
6971
          }
6972
          break;
6973
        case DST__K_PROLOG:
6974
          {
6975
            struct vms_dst_prolog *dst = (void *)buf;
6976
 
6977
            fprintf (file, _("prolog: bkpt address 0x%08x\n"),
6978
                     (unsigned)bfd_getl32 (dst->bkpt_addr));
6979
          }
6980
          break;
6981
        case DST__K_EPILOG:
6982
          {
6983
            struct vms_dst_epilog *dst = (void *)buf;
6984
 
6985
            fprintf (file, _("epilog: flags: %u, count: %u\n"),
6986
                     dst->flags, (unsigned)bfd_getl32 (dst->count));
6987
          }
6988
          break;
6989
        case DST__K_BLKBEG:
6990
          {
6991
            struct vms_dst_blkbeg *dst = (void *)buf;
6992
            const char *name = (const char *)buf + sizeof (*dst);
6993
 
6994
            fprintf (file, _("blkbeg: address: 0x%08x, name: %.*s\n"),
6995
                     (unsigned)bfd_getl32 (dst->address),
6996
                     name[0], name + 1);
6997
          }
6998
          break;
6999
        case DST__K_BLKEND:
7000
          {
7001
            struct vms_dst_blkend *dst = (void *)buf;
7002
 
7003
            fprintf (file, _("blkend: size: 0x%08x\n"),
7004
                     (unsigned)bfd_getl32 (dst->size));
7005
          }
7006
          break;
7007
        case DST__K_TYPSPEC:
7008
          {
7009
            fprintf (file, _("typspec (len: %u)\n"), len);
7010
            fprintf (file, _("    name: %.*s\n"), buf[0], buf + 1);
7011
            evax_bfd_print_typspec (buf + 1 + buf[0], 5, file);
7012
          }
7013
          break;
7014
        case DST__K_SEPTYP:
7015
          {
7016
            fprintf (file, _("septyp, name: %.*s\n"), buf[5], buf + 6);
7017
            evax_bfd_print_valspec (buf, 4, file);
7018
          }
7019
          break;
7020
        case DST__K_RECBEG:
7021
          {
7022
            struct vms_dst_recbeg *recbeg = (void *)buf;
7023
            const char *name = (const char *)buf + sizeof (*recbeg);
7024
 
7025
            fprintf (file, _("recbeg: name: %.*s\n"), name[0], name + 1);
7026
            evax_bfd_print_valspec (buf, 4, file);
7027
            fprintf (file, ("    len: %u bits\n"),
7028
                     (unsigned)bfd_getl32 (name + 1 + name[0]));
7029
          }
7030
          break;
7031
        case DST__K_RECEND:
7032
          fprintf (file, _("recend\n"));
7033
          break;
7034
        case DST__K_ENUMBEG:
7035
          fprintf (file, _("enumbeg, len: %u, name: %.*s\n"),
7036
                   buf[0], buf[1], buf + 2);
7037
          break;
7038
        case DST__K_ENUMELT:
7039
          fprintf (file, _("enumelt, name: %.*s\n"), buf[5], buf + 6);
7040
          evax_bfd_print_valspec (buf, 4, file);
7041
          break;
7042
        case DST__K_ENUMEND:
7043
          fprintf (file, _("enumend\n"));
7044
          break;
7045
        case DST__K_LABEL:
7046
          {
7047
            struct vms_dst_label *lab = (void *)buf;
7048
            fprintf (file, ("label, name: %.*s\n"),
7049
                     lab->name[0], lab->name + 1);
7050
            fprintf (file, ("    address: 0x%08x\n"),
7051
                     (unsigned)bfd_getl32 (lab->value));
7052
          }
7053
          break;
7054
        case DST__K_DIS_RANGE:
7055
          {
7056
            unsigned int cnt = bfd_getl32 (buf);
7057
            unsigned char *rng = buf + 4;
7058
            unsigned int i;
7059
 
7060
            fprintf (file, _("discontiguous range (nbr: %u)\n"), cnt);
7061
            for (i = 0; i < cnt; i++, rng += 8)
7062
              fprintf (file, _("    address: 0x%08x, size: %u\n"),
7063
                       (unsigned)bfd_getl32 (rng),
7064
                       (unsigned)bfd_getl32 (rng + 4));
7065
 
7066
          }
7067
          break;
7068
        case DST__K_LINE_NUM:
7069
          {
7070
            unsigned char *buf_orig = buf;
7071
 
7072
            fprintf (file, _("line num  (len: %u)\n"), len);
7073
 
7074
            while (len > 0)
7075
              {
7076
                signed char cmd;
7077
                unsigned char cmdlen;
7078
                unsigned int val;
7079
 
7080
                cmd = buf[0];
7081
                cmdlen = 0;
7082
 
7083
                fputs ("    ", file);
7084
 
7085
                switch (cmd)
7086
                  {
7087
                  case DST__K_DELTA_PC_W:
7088
                    val = bfd_getl16 (buf + 1);
7089
                    fprintf (file, _("delta_pc_w %u\n"), val);
7090
                    pc += val;
7091
                    line++;
7092
                    cmdlen = 3;
7093
                    break;
7094
                  case DST__K_INCR_LINUM:
7095
                    val = buf[1];
7096
                    fprintf (file, _("incr_linum(b): +%u\n"), val);
7097
                    line += val;
7098
                    cmdlen = 2;
7099
                    break;
7100
                  case DST__K_INCR_LINUM_W:
7101
                    val = bfd_getl16 (buf + 1);
7102
                    fprintf (file, _("incr_linum_w: +%u\n"), val);
7103
                    line += val;
7104
                    cmdlen = 3;
7105
                    break;
7106
                  case DST__K_INCR_LINUM_L:
7107
                    val = bfd_getl32 (buf + 1);
7108
                    fprintf (file, _("incr_linum_l: +%u\n"), val);
7109
                    line += val;
7110
                    cmdlen = 5;
7111
                    break;
7112
                  case DST__K_SET_LINUM:
7113
                    line = bfd_getl16 (buf + 1);
7114
                    fprintf (file, _("set_line_num(w) %u\n"), line);
7115
                    cmdlen = 3;
7116
                    break;
7117
                  case DST__K_SET_LINUM_B:
7118
                    line = buf[1];
7119
                    fprintf (file, _("set_line_num_b %u\n"), line);
7120
                    cmdlen = 2;
7121
                    break;
7122
                  case DST__K_SET_LINUM_L:
7123
                    line = bfd_getl32 (buf + 1);
7124
                    fprintf (file, _("set_line_num_l %u\n"), line);
7125
                    cmdlen = 5;
7126
                    break;
7127
                  case DST__K_SET_ABS_PC:
7128
                    pc = bfd_getl32 (buf + 1);
7129
                    fprintf (file, _("set_abs_pc: 0x%08x\n"), pc);
7130
                    cmdlen = 5;
7131
                    break;
7132
                  case DST__K_DELTA_PC_L:
7133
                    fprintf (file, _("delta_pc_l: +0x%08x\n"),
7134
                             (unsigned)bfd_getl32 (buf + 1));
7135
                    cmdlen = 5;
7136
                    break;
7137
                  case DST__K_TERM:
7138
                    fprintf (file, _("term(b): 0x%02x"), buf[1]);
7139
                    pc += buf[1];
7140
                    fprintf (file, _("        pc: 0x%08x\n"), pc);
7141
                    cmdlen = 2;
7142
                    break;
7143
                  case DST__K_TERM_W:
7144
                    val = bfd_getl16 (buf + 1);
7145
                    fprintf (file, _("term_w: 0x%04x"), val);
7146
                    pc += val;
7147
                    fprintf (file, _("    pc: 0x%08x\n"), pc);
7148
                    cmdlen = 3;
7149
                    break;
7150
                  default:
7151
                    if (cmd <= 0)
7152
                      {
7153
                        fprintf (file, _("delta pc +%-4d"), -cmd);
7154
                        line++;  /* FIXME: curr increment.  */
7155
                        pc += -cmd;
7156
                        fprintf (file, _("    pc: 0x%08x line: %5u\n"),
7157
                                 pc, line);
7158
                        cmdlen = 1;
7159
                      }
7160
                    else
7161
                      fprintf (file, _("    *unhandled* cmd %u\n"), cmd);
7162
                    break;
7163
                  }
7164
                if (cmdlen == 0)
7165
                  break;
7166
                len -= cmdlen;
7167
                buf += cmdlen;
7168
              }
7169
            buf = buf_orig;
7170
          }
7171
          break;
7172
        case DST__K_SOURCE:
7173
          {
7174
            unsigned char *buf_orig = buf;
7175
 
7176
            fprintf (file, _("source (len: %u)\n"), len);
7177
 
7178
            while (len > 0)
7179
              {
7180
                signed char cmd = buf[0];
7181
                unsigned char cmdlen = 0;
7182
 
7183
                switch (cmd)
7184
                  {
7185
                  case DST__K_SRC_DECLFILE:
7186
                    {
7187
                      struct vms_dst_src_decl_src *src = (void *)(buf + 1);
7188
                      const char *name;
7189
 
7190
                      fprintf (file, _("   declfile: len: %u, flags: %u, "
7191
                                       "fileid: %u\n"),
7192
                               src->length, src->flags,
7193
                               (unsigned)bfd_getl16 (src->fileid));
7194
                      fprintf (file, _("   rms: cdt: 0x%08x %08x, "
7195
                                       "ebk: 0x%08x, ffb: 0x%04x, "
7196
                                       "rfo: %u\n"),
7197
                               (unsigned)bfd_getl32 (src->rms_cdt + 4),
7198
                               (unsigned)bfd_getl32 (src->rms_cdt + 0),
7199
                               (unsigned)bfd_getl32 (src->rms_ebk),
7200
                               (unsigned)bfd_getl16 (src->rms_ffb),
7201
                               src->rms_rfo);
7202
                      name = (const char *)buf + 1 + sizeof (*src);
7203
                      fprintf (file, _("   filename   : %.*s\n"),
7204
                               name[0], name + 1);
7205
                      name += name[0] + 1;
7206
                      fprintf (file, _("   module name: %.*s\n"),
7207
                               name[0], name + 1);
7208
                      cmdlen = 2 + src->length;
7209
                    }
7210
                    break;
7211
                  case DST__K_SRC_SETFILE:
7212
                    fprintf (file, _("   setfile %u\n"),
7213
                             (unsigned)bfd_getl16 (buf + 1));
7214
                    cmdlen = 3;
7215
                    break;
7216
                  case DST__K_SRC_SETREC_W:
7217
                    fprintf (file, _("   setrec %u\n"),
7218
                             (unsigned)bfd_getl16 (buf + 1));
7219
                    cmdlen = 3;
7220
                    break;
7221
                  case DST__K_SRC_SETREC_L:
7222
                    fprintf (file, _("   setrec %u\n"),
7223
                             (unsigned)bfd_getl32 (buf + 1));
7224
                    cmdlen = 5;
7225
                    break;
7226
                  case DST__K_SRC_SETLNUM_W:
7227
                    fprintf (file, _("   setlnum %u\n"),
7228
                             (unsigned)bfd_getl16 (buf + 1));
7229
                    cmdlen = 3;
7230
                    break;
7231
                  case DST__K_SRC_SETLNUM_L:
7232
                    fprintf (file, _("   setlnum %u\n"),
7233
                             (unsigned)bfd_getl32 (buf + 1));
7234
                    cmdlen = 5;
7235
                    break;
7236
                  case DST__K_SRC_DEFLINES_W:
7237
                    fprintf (file, _("   deflines %u\n"),
7238
                             (unsigned)bfd_getl16 (buf + 1));
7239
                    cmdlen = 3;
7240
                    break;
7241
                  case DST__K_SRC_DEFLINES_B:
7242
                    fprintf (file, _("   deflines %u\n"), buf[1]);
7243
                    cmdlen = 2;
7244
                    break;
7245
                  case DST__K_SRC_FORMFEED:
7246
                    fprintf (file, _("   formfeed\n"));
7247
                    cmdlen = 1;
7248
                    break;
7249
                  default:
7250
                    fprintf (file, _("   *unhandled* cmd %u\n"), cmd);
7251
                    break;
7252
                  }
7253
                if (cmdlen == 0)
7254
                  break;
7255
                len -= cmdlen;
7256
                buf += cmdlen;
7257
              }
7258
            buf = buf_orig;
7259
          }
7260
          break;
7261
        default:
7262
          fprintf (file, _("*unhandled* dst type %u\n"), type);
7263
          break;
7264
        }
7265
      free (buf);
7266
    }
7267
}
7268
 
7269
static void
7270
evax_bfd_print_image (bfd *abfd, FILE *file)
7271
{
7272
  struct vms_eihd eihd;
7273
  const char *name;
7274
  unsigned int val;
7275
  unsigned int eiha_off;
7276
  unsigned int eihi_off;
7277
  unsigned int eihs_off;
7278
  unsigned int eisd_off;
7279
  unsigned int eihef_off = 0;
7280
  unsigned int eihnp_off = 0;
7281
  unsigned int dmt_vbn = 0;
7282
  unsigned int dmt_size = 0;
7283
  unsigned int dst_vbn = 0;
7284
  unsigned int dst_size = 0;
7285
  unsigned int gst_vbn = 0;
7286
  unsigned int gst_size = 0;
7287
  unsigned int eiaf_vbn = 0;
7288
  unsigned int eiaf_size = 0;
7289
  unsigned int eihvn_off;
7290
 
7291
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET)
7292
      || bfd_bread (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
7293
    {
7294
      fprintf (file, _("cannot read EIHD\n"));
7295
      return;
7296
    }
7297
  fprintf (file, _("EIHD: (size: %u, nbr blocks: %u)\n"),
7298
           (unsigned)bfd_getl32 (eihd.size),
7299
           (unsigned)bfd_getl32 (eihd.hdrblkcnt));
7300
  fprintf (file, _(" majorid: %u, minorid: %u\n"),
7301
           (unsigned)bfd_getl32 (eihd.majorid),
7302
           (unsigned)bfd_getl32 (eihd.minorid));
7303
 
7304
  val = (unsigned)bfd_getl32 (eihd.imgtype);
7305
  switch (val)
7306
    {
7307
    case EIHD__K_EXE:
7308
      name = _("executable");
7309
      break;
7310
    case EIHD__K_LIM:
7311
      name = _("linkable image");
7312
      break;
7313
    default:
7314
      name = _("unknown");
7315
      break;
7316
    }
7317
  fprintf (file, _(" image type: %u (%s)"), val, name);
7318
 
7319
  val = (unsigned)bfd_getl32 (eihd.subtype);
7320
  switch (val)
7321
    {
7322
    case EIHD__C_NATIVE:
7323
      name = _("native");
7324
      break;
7325
    case EIHD__C_CLI:
7326
      name = _("CLI");
7327
      break;
7328
    default:
7329
      name = _("unknown");
7330
      break;
7331
    }
7332
  fprintf (file, _(", subtype: %u (%s)\n"), val, name);
7333
 
7334
  eisd_off = bfd_getl32 (eihd.isdoff);
7335
  eiha_off = bfd_getl32 (eihd.activoff);
7336
  eihi_off = bfd_getl32 (eihd.imgidoff);
7337
  eihs_off = bfd_getl32 (eihd.symdbgoff);
7338
  fprintf (file, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
7339
                   "imgid: %u, patch: %u\n"),
7340
           eisd_off, eiha_off, eihs_off, eihi_off,
7341
           (unsigned)bfd_getl32 (eihd.patchoff));
7342
  fprintf (file, _(" fixup info rva: "));
7343
  bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.iafva));
7344
  fprintf (file, _(", symbol vector rva: "));
7345
  bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.symvva));
7346
  eihvn_off = bfd_getl32 (eihd.version_array_off);
7347
  fprintf (file, _("\n"
7348
                   " version array off: %u\n"),
7349
           eihvn_off);
7350
  fprintf (file,
7351
           _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
7352
           (unsigned)bfd_getl32 (eihd.imgiocnt),
7353
           (unsigned)bfd_getl32 (eihd.iochancnt),
7354
           (unsigned)bfd_getl32 (eihd.privreqs + 4),
7355
           (unsigned)bfd_getl32 (eihd.privreqs + 0));
7356
  val = (unsigned)bfd_getl32 (eihd.lnkflags);
7357
  fprintf (file, _(" linker flags: %08x:"), val);
7358
  if (val & EIHD__M_LNKDEBUG)
7359
    fprintf (file, " LNKDEBUG");
7360
  if (val & EIHD__M_LNKNOTFR)
7361
    fprintf (file, " LNKNOTFR");
7362
  if (val & EIHD__M_NOP0BUFS)
7363
    fprintf (file, " NOP0BUFS");
7364
  if (val & EIHD__M_PICIMG)
7365
    fprintf (file, " PICIMG");
7366
  if (val & EIHD__M_P0IMAGE)
7367
    fprintf (file, " P0IMAGE");
7368
  if (val & EIHD__M_DBGDMT)
7369
    fprintf (file, " DBGDMT");
7370
  if (val & EIHD__M_INISHR)
7371
    fprintf (file, " INISHR");
7372
  if (val & EIHD__M_XLATED)
7373
    fprintf (file, " XLATED");
7374
  if (val & EIHD__M_BIND_CODE_SEC)
7375
    fprintf (file, " BIND_CODE_SEC");
7376
  if (val & EIHD__M_BIND_DATA_SEC)
7377
    fprintf (file, " BIND_DATA_SEC");
7378
  if (val & EIHD__M_MKTHREADS)
7379
    fprintf (file, " MKTHREADS");
7380
  if (val & EIHD__M_UPCALLS)
7381
    fprintf (file, " UPCALLS");
7382
  if (val & EIHD__M_OMV_READY)
7383
    fprintf (file, " OMV_READY");
7384
  if (val & EIHD__M_EXT_BIND_SECT)
7385
    fprintf (file, " EXT_BIND_SECT");
7386
  fprintf (file, "\n");
7387
  fprintf (file, _(" ident: 0x%08x, sysver: 0x%08x, "
7388
                   "match ctrl: %u, symvect_size: %u\n"),
7389
           (unsigned)bfd_getl32 (eihd.ident),
7390
           (unsigned)bfd_getl32 (eihd.sysver),
7391
           eihd.matchctl,
7392
           (unsigned)bfd_getl32 (eihd.symvect_size));
7393
  fprintf (file, _(" BPAGE: %u"),
7394
           (unsigned)bfd_getl32 (eihd.virt_mem_block_size));
7395
  if (val & (EIHD__M_OMV_READY | EIHD__M_EXT_BIND_SECT))
7396
    {
7397
      eihef_off = bfd_getl32 (eihd.ext_fixup_off);
7398
      eihnp_off = bfd_getl32 (eihd.noopt_psect_off);
7399
      fprintf (file, _(", ext fixup offset: %u, no_opt psect off: %u"),
7400
               eihef_off, eihnp_off);
7401
    }
7402
  fprintf (file, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd.alias));
7403
 
7404
  if (eihvn_off != 0)
7405
    {
7406
      struct vms_eihvn eihvn;
7407
      unsigned int mask;
7408
      unsigned int j;
7409
 
7410
      fprintf (file, _("system version array information:\n"));
7411
      if (bfd_seek (abfd, (file_ptr) eihvn_off, SEEK_SET)
7412
          || bfd_bread (&eihvn, sizeof (eihvn), abfd) != sizeof (eihvn))
7413
        {
7414
          fprintf (file, _("cannot read EIHVN header\n"));
7415
          return;
7416
        }
7417
      mask = bfd_getl32 (eihvn.subsystem_mask);
7418
      for (j = 0; j < 32; j++)
7419
        if (mask & (1 << j))
7420
          {
7421
            struct vms_eihvn_subversion ver;
7422
            if (bfd_bread (&ver, sizeof (ver), abfd) != sizeof (ver))
7423
              {
7424
                fprintf (file, _("cannot read EIHVN version\n"));
7425
                return;
7426
              }
7427
            fprintf (file, _("   %02u "), j);
7428
            switch (j)
7429
              {
7430
              case EIHVN__BASE_IMAGE_BIT:
7431
                fputs (_("BASE_IMAGE       "), file);
7432
                break;
7433
              case EIHVN__MEMORY_MANAGEMENT_BIT:
7434
                fputs (_("MEMORY_MANAGEMENT"), file);
7435
                break;
7436
              case EIHVN__IO_BIT:
7437
                fputs (_("IO               "), file);
7438
                break;
7439
              case EIHVN__FILES_VOLUMES_BIT:
7440
                fputs (_("FILES_VOLUMES    "), file);
7441
                break;
7442
              case EIHVN__PROCESS_SCHED_BIT:
7443
                fputs (_("PROCESS_SCHED    "), file);
7444
                break;
7445
              case EIHVN__SYSGEN_BIT:
7446
                fputs (_("SYSGEN           "), file);
7447
                break;
7448
              case EIHVN__CLUSTERS_LOCKMGR_BIT:
7449
                fputs (_("CLUSTERS_LOCKMGR "), file);
7450
                break;
7451
              case EIHVN__LOGICAL_NAMES_BIT:
7452
                fputs (_("LOGICAL_NAMES    "), file);
7453
                break;
7454
              case EIHVN__SECURITY_BIT:
7455
                fputs (_("SECURITY         "), file);
7456
                break;
7457
              case EIHVN__IMAGE_ACTIVATOR_BIT:
7458
                fputs (_("IMAGE_ACTIVATOR  "), file);
7459
                break;
7460
              case EIHVN__NETWORKS_BIT:
7461
                fputs (_("NETWORKS         "), file);
7462
                break;
7463
              case EIHVN__COUNTERS_BIT:
7464
                fputs (_("COUNTERS         "), file);
7465
                break;
7466
              case EIHVN__STABLE_BIT:
7467
                fputs (_("STABLE           "), file);
7468
                break;
7469
              case EIHVN__MISC_BIT:
7470
                fputs (_("MISC             "), file);
7471
                break;
7472
              case EIHVN__CPU_BIT:
7473
                fputs (_("CPU              "), file);
7474
                break;
7475
              case EIHVN__VOLATILE_BIT:
7476
                fputs (_("VOLATILE         "), file);
7477
                break;
7478
              case EIHVN__SHELL_BIT:
7479
                fputs (_("SHELL            "), file);
7480
                break;
7481
              case EIHVN__POSIX_BIT:
7482
                fputs (_("POSIX            "), file);
7483
                break;
7484
              case EIHVN__MULTI_PROCESSING_BIT:
7485
                fputs (_("MULTI_PROCESSING "), file);
7486
                break;
7487
              case EIHVN__GALAXY_BIT:
7488
                fputs (_("GALAXY           "), file);
7489
                break;
7490
              default:
7491
                fputs (_("*unknown*        "), file);
7492
                break;
7493
              }
7494
            fprintf (file, _(": %u.%u\n"),
7495
                     (unsigned)bfd_getl16 (ver.major),
7496
                     (unsigned)bfd_getl16 (ver.minor));
7497
          }
7498
    }
7499
 
7500
  if (eiha_off != 0)
7501
    {
7502
      struct vms_eiha eiha;
7503
 
7504
      if (bfd_seek (abfd, (file_ptr) eiha_off, SEEK_SET)
7505
          || bfd_bread (&eiha, sizeof (eiha), abfd) != sizeof (eiha))
7506
        {
7507
          fprintf (file, _("cannot read EIHA\n"));
7508
          return;
7509
        }
7510
      fprintf (file, _("Image activation:  (size=%u)\n"),
7511
               (unsigned)bfd_getl32 (eiha.size));
7512
      fprintf (file, _(" First address : 0x%08x 0x%08x\n"),
7513
               (unsigned)bfd_getl32 (eiha.tfradr1_h),
7514
               (unsigned)bfd_getl32 (eiha.tfradr1));
7515
      fprintf (file, _(" Second address: 0x%08x 0x%08x\n"),
7516
               (unsigned)bfd_getl32 (eiha.tfradr2_h),
7517
               (unsigned)bfd_getl32 (eiha.tfradr2));
7518
      fprintf (file, _(" Third address : 0x%08x 0x%08x\n"),
7519
               (unsigned)bfd_getl32 (eiha.tfradr3_h),
7520
               (unsigned)bfd_getl32 (eiha.tfradr3));
7521
      fprintf (file, _(" Fourth address: 0x%08x 0x%08x\n"),
7522
               (unsigned)bfd_getl32 (eiha.tfradr4_h),
7523
               (unsigned)bfd_getl32 (eiha.tfradr4));
7524
      fprintf (file, _(" Shared image  : 0x%08x 0x%08x\n"),
7525
               (unsigned)bfd_getl32 (eiha.inishr_h),
7526
               (unsigned)bfd_getl32 (eiha.inishr));
7527
    }
7528
  if (eihi_off != 0)
7529
    {
7530
      struct vms_eihi eihi;
7531
 
7532
      if (bfd_seek (abfd, (file_ptr) eihi_off, SEEK_SET)
7533
          || bfd_bread (&eihi, sizeof (eihi), abfd) != sizeof (eihi))
7534
        {
7535
          fprintf (file, _("cannot read EIHI\n"));
7536
          return;
7537
        }
7538
      fprintf (file, _("Image identification: (major: %u, minor: %u)\n"),
7539
               (unsigned)bfd_getl32 (eihi.majorid),
7540
               (unsigned)bfd_getl32 (eihi.minorid));
7541
      fprintf (file, _(" image name       : %.*s\n"),
7542
               eihi.imgnam[0], eihi.imgnam + 1);
7543
      fprintf (file, _(" link time        : %s\n"),
7544
               vms_time_to_str (eihi.linktime));
7545
      fprintf (file, _(" image ident      : %.*s\n"),
7546
               eihi.imgid[0], eihi.imgid + 1);
7547
      fprintf (file, _(" linker ident     : %.*s\n"),
7548
               eihi.linkid[0], eihi.linkid + 1);
7549
      fprintf (file, _(" image build ident: %.*s\n"),
7550
               eihi.imgbid[0], eihi.imgbid + 1);
7551
    }
7552
  if (eihs_off != 0)
7553
    {
7554
      struct vms_eihs eihs;
7555
 
7556
      if (bfd_seek (abfd, (file_ptr) eihs_off, SEEK_SET)
7557
          || bfd_bread (&eihs, sizeof (eihs), abfd) != sizeof (eihs))
7558
        {
7559
          fprintf (file, _("cannot read EIHS\n"));
7560
          return;
7561
        }
7562
      fprintf (file, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
7563
               (unsigned)bfd_getl32 (eihs.majorid),
7564
               (unsigned)bfd_getl32 (eihs.minorid));
7565
      dst_vbn = bfd_getl32 (eihs.dstvbn);
7566
      dst_size = bfd_getl32 (eihs.dstsize);
7567
      fprintf (file, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
7568
               dst_vbn, dst_size, dst_size);
7569
      gst_vbn = bfd_getl32 (eihs.gstvbn);
7570
      gst_size = bfd_getl32 (eihs.gstsize);
7571
      fprintf (file, _(" global symbol table: vbn: %u, records: %u\n"),
7572
               gst_vbn, gst_size);
7573
      dmt_vbn = bfd_getl32 (eihs.dmtvbn);
7574
      dmt_size = bfd_getl32 (eihs.dmtsize);
7575
      fprintf (file, _(" debug module table : vbn: %u, size: %u\n"),
7576
               dmt_vbn, dmt_size);
7577
    }
7578
  while (eisd_off != 0)
7579
    {
7580
      struct vms_eisd eisd;
7581
      unsigned int len;
7582
 
7583
      while (1)
7584
        {
7585
          if (bfd_seek (abfd, (file_ptr) eisd_off, SEEK_SET)
7586
              || bfd_bread (&eisd, sizeof (eisd), abfd) != sizeof (eisd))
7587
            {
7588
              fprintf (file, _("cannot read EISD\n"));
7589
              return;
7590
            }
7591
          len = (unsigned)bfd_getl32 (eisd.eisdsize);
7592
          if (len != (unsigned)-1)
7593
            break;
7594
 
7595
          /* Next block.  */
7596
          eisd_off = (eisd_off + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
7597
        }
7598
      fprintf (file, _("Image section descriptor: (major: %u, minor: %u, "
7599
                       "size: %u, offset: %u)\n"),
7600
               (unsigned)bfd_getl32 (eisd.majorid),
7601
               (unsigned)bfd_getl32 (eisd.minorid),
7602
               len, eisd_off);
7603
      if (len == 0)
7604
        break;
7605
      fprintf (file, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
7606
               (unsigned)bfd_getl32 (eisd.virt_addr + 4),
7607
               (unsigned)bfd_getl32 (eisd.virt_addr + 0),
7608
               (unsigned)bfd_getl32 (eisd.secsize));
7609
      val = (unsigned)bfd_getl32 (eisd.flags);
7610
      fprintf (file, _(" flags: 0x%04x"), val);
7611
      if (val & EISD__M_GBL)
7612
        fprintf (file, " GBL");
7613
      if (val & EISD__M_CRF)
7614
        fprintf (file, " CRF");
7615
      if (val & EISD__M_DZRO)
7616
        fprintf (file, " DZRO");
7617
      if (val & EISD__M_WRT)
7618
        fprintf (file, " WRT");
7619
      if (val & EISD__M_INITALCODE)
7620
        fprintf (file, " INITALCODE");
7621
      if (val & EISD__M_BASED)
7622
        fprintf (file, " BASED");
7623
      if (val & EISD__M_FIXUPVEC)
7624
        fprintf (file, " FIXUPVEC");
7625
      if (val & EISD__M_RESIDENT)
7626
        fprintf (file, " RESIDENT");
7627
      if (val & EISD__M_VECTOR)
7628
        fprintf (file, " VECTOR");
7629
      if (val & EISD__M_PROTECT)
7630
        fprintf (file, " PROTECT");
7631
      if (val & EISD__M_LASTCLU)
7632
        fprintf (file, " LASTCLU");
7633
      if (val & EISD__M_EXE)
7634
        fprintf (file, " EXE");
7635
      if (val & EISD__M_NONSHRADR)
7636
        fprintf (file, " NONSHRADR");
7637
      if (val & EISD__M_QUAD_LENGTH)
7638
        fprintf (file, " QUAD_LENGTH");
7639
      if (val & EISD__M_ALLOC_64BIT)
7640
        fprintf (file, " ALLOC_64BIT");
7641
      fprintf (file, "\n");
7642
      if (val & EISD__M_FIXUPVEC)
7643
        {
7644
          eiaf_vbn = bfd_getl32 (eisd.vbn);
7645
          eiaf_size = bfd_getl32 (eisd.secsize);
7646
        }
7647
      fprintf (file, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
7648
               (unsigned)bfd_getl32 (eisd.vbn),
7649
               eisd.pfc, eisd.matchctl, eisd.type);
7650
      switch (eisd.type)
7651
        {
7652
        case EISD__K_NORMAL:
7653
          fputs (_("NORMAL"), file);
7654
          break;
7655
        case EISD__K_SHRFXD:
7656
          fputs (_("SHRFXD"), file);
7657
          break;
7658
        case EISD__K_PRVFXD:
7659
          fputs (_("PRVFXD"), file);
7660
          break;
7661
        case EISD__K_SHRPIC:
7662
          fputs (_("SHRPIC"), file);
7663
          break;
7664
        case EISD__K_PRVPIC:
7665
          fputs (_("PRVPIC"), file);
7666
          break;
7667
        case EISD__K_USRSTACK:
7668
          fputs (_("USRSTACK"), file);
7669
          break;
7670
        default:
7671
          fputs (_("*unknown*"), file);
7672
          break;
7673
        }
7674
      fputs (_(")\n"), file);
7675
      if (val & EISD__M_GBL)
7676
        fprintf (file, _(" ident: 0x%08x, name: %.*s\n"),
7677
                 (unsigned)bfd_getl32 (eisd.ident),
7678
                 eisd.gblnam[0], eisd.gblnam + 1);
7679
      eisd_off += len;
7680
    }
7681
 
7682
  if (dmt_vbn != 0)
7683
    {
7684
      if (bfd_seek (abfd, (file_ptr) (dmt_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7685
        {
7686
          fprintf (file, _("cannot read DMT\n"));
7687
          return;
7688
        }
7689
 
7690
      fprintf (file, _("Debug module table:\n"));
7691
 
7692
      while (dmt_size > 0)
7693
        {
7694
          struct vms_dmt_header dmth;
7695
          unsigned int count;
7696
 
7697
          if (bfd_bread (&dmth, sizeof (dmth), abfd) != sizeof (dmth))
7698
            {
7699
              fprintf (file, _("cannot read DMT header\n"));
7700
              return;
7701
            }
7702
          count = bfd_getl16 (dmth.psect_count);
7703
          fprintf (file,
7704
                   _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
7705
                   (unsigned)bfd_getl32 (dmth.modbeg),
7706
                   (unsigned)bfd_getl32 (dmth.size), count);
7707
          dmt_size -= sizeof (dmth);
7708
          while (count > 0)
7709
            {
7710
              struct vms_dmt_psect dmtp;
7711
 
7712
              if (bfd_bread (&dmtp, sizeof (dmtp), abfd) != sizeof (dmtp))
7713
                {
7714
                  fprintf (file, _("cannot read DMT psect\n"));
7715
                  return;
7716
                }
7717
              fprintf (file, _("  psect start: 0x%08x, length: %u\n"),
7718
                       (unsigned)bfd_getl32 (dmtp.start),
7719
                       (unsigned)bfd_getl32 (dmtp.length));
7720
              count--;
7721
              dmt_size -= sizeof (dmtp);
7722
            }
7723
        }
7724
    }
7725
 
7726
  if (dst_vbn != 0)
7727
    {
7728
      if (bfd_seek (abfd, (file_ptr) (dst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7729
        {
7730
          fprintf (file, _("cannot read DST\n"));
7731
          return;
7732
        }
7733
 
7734
      evax_bfd_print_dst (abfd, dst_size, file);
7735
    }
7736
  if (gst_vbn != 0)
7737
    {
7738
      if (bfd_seek (abfd, (file_ptr) (gst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7739
        {
7740
          fprintf (file, _("cannot read GST\n"));
7741
          return;
7742
        }
7743
 
7744
      fprintf (file, _("Global symbol table:\n"));
7745
      evax_bfd_print_eobj (abfd, file);
7746
    }
7747
  if (eiaf_vbn != 0)
7748
    {
7749
      unsigned char *buf;
7750
      struct vms_eiaf *eiaf;
7751
      unsigned int qrelfixoff;
7752
      unsigned int lrelfixoff;
7753
      unsigned int qdotadroff;
7754
      unsigned int ldotadroff;
7755
      unsigned int shrimgcnt;
7756
      unsigned int shlstoff;
7757
      unsigned int codeadroff;
7758
      unsigned int lpfixoff;
7759
      unsigned int chgprtoff;
7760
 
7761
      buf = bfd_malloc (eiaf_size);
7762
 
7763
      if (bfd_seek (abfd, (file_ptr) (eiaf_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET)
7764
          || bfd_bread (buf, eiaf_size, abfd) != eiaf_size)
7765
        {
7766
          fprintf (file, _("cannot read EIHA\n"));
7767
          free (buf);
7768
          return;
7769
        }
7770
      eiaf = (struct vms_eiaf *)buf;
7771
      fprintf (file,
7772
               _("Image activator fixup: (major: %u, minor: %u)\n"),
7773
               (unsigned)bfd_getl32 (eiaf->majorid),
7774
               (unsigned)bfd_getl32 (eiaf->minorid));
7775
      fprintf (file, _("  iaflink : 0x%08x %08x\n"),
7776
               (unsigned)bfd_getl32 (eiaf->iaflink + 0),
7777
               (unsigned)bfd_getl32 (eiaf->iaflink + 4));
7778
      fprintf (file, _("  fixuplnk: 0x%08x %08x\n"),
7779
               (unsigned)bfd_getl32 (eiaf->fixuplnk + 0),
7780
               (unsigned)bfd_getl32 (eiaf->fixuplnk + 4));
7781
      fprintf (file, _("  size : %u\n"),
7782
               (unsigned)bfd_getl32 (eiaf->size));
7783
      fprintf (file, _("  flags: 0x%08x\n"),
7784
               (unsigned)bfd_getl32 (eiaf->flags));
7785
      qrelfixoff = bfd_getl32 (eiaf->qrelfixoff);
7786
      lrelfixoff = bfd_getl32 (eiaf->lrelfixoff);
7787
      fprintf (file, _("  qrelfixoff: %5u, lrelfixoff: %5u\n"),
7788
               qrelfixoff, lrelfixoff);
7789
      qdotadroff = bfd_getl32 (eiaf->qdotadroff);
7790
      ldotadroff = bfd_getl32 (eiaf->ldotadroff);
7791
      fprintf (file, _("  qdotadroff: %5u, ldotadroff: %5u\n"),
7792
               qdotadroff, ldotadroff);
7793
      codeadroff = bfd_getl32 (eiaf->codeadroff);
7794
      lpfixoff = bfd_getl32 (eiaf->lpfixoff);
7795
      fprintf (file, _("  codeadroff: %5u, lpfixoff  : %5u\n"),
7796
               codeadroff, lpfixoff);
7797
      chgprtoff = bfd_getl32 (eiaf->chgprtoff);
7798
      fprintf (file, _("  chgprtoff : %5u\n"), chgprtoff);
7799
      shrimgcnt = bfd_getl32 (eiaf->shrimgcnt);
7800
      shlstoff = bfd_getl32 (eiaf->shlstoff);
7801
      fprintf (file, _("  shlstoff  : %5u, shrimgcnt : %5u\n"),
7802
               shlstoff, shrimgcnt);
7803
      fprintf (file, _("  shlextra  : %5u, permctx   : %5u\n"),
7804
               (unsigned)bfd_getl32 (eiaf->shlextra),
7805
               (unsigned)bfd_getl32 (eiaf->permctx));
7806
      fprintf (file, _("  base_va : 0x%08x\n"),
7807
               (unsigned)bfd_getl32 (eiaf->base_va));
7808
      fprintf (file, _("  lppsbfixoff: %5u\n"),
7809
               (unsigned)bfd_getl32 (eiaf->lppsbfixoff));
7810
 
7811
      if (shlstoff)
7812
        {
7813
          struct vms_shl *shl = (struct vms_shl *)(buf + shlstoff);
7814
          unsigned int j;
7815
 
7816
          fprintf (file, _(" Shareable images:\n"));
7817
          for (j = 0; j < shrimgcnt; j++, shl++)
7818
            {
7819
              fprintf (file,
7820
                       _("  %u: size: %u, flags: 0x%02x, name: %.*s\n"),
7821
                       j, shl->size, shl->flags,
7822
                       shl->imgnam[0], shl->imgnam + 1);
7823
            }
7824
        }
7825
      if (qrelfixoff != 0)
7826
        {
7827
          fprintf (file, _(" quad-word relocation fixups:\n"));
7828
          evax_bfd_print_relocation_records (file, buf + qrelfixoff, 8);
7829
        }
7830
      if (lrelfixoff != 0)
7831
        {
7832
          fprintf (file, _(" long-word relocation fixups:\n"));
7833
          evax_bfd_print_relocation_records (file, buf + lrelfixoff, 4);
7834
        }
7835
      if (qdotadroff != 0)
7836
        {
7837
          fprintf (file, _(" quad-word .address reference fixups:\n"));
7838
          evax_bfd_print_address_fixups (file, buf + qdotadroff);
7839
        }
7840
      if (ldotadroff != 0)
7841
        {
7842
          fprintf (file, _(" long-word .address reference fixups:\n"));
7843
          evax_bfd_print_address_fixups (file, buf + ldotadroff);
7844
        }
7845
      if (codeadroff != 0)
7846
        {
7847
          fprintf (file, _(" Code Address Reference Fixups:\n"));
7848
          evax_bfd_print_reference_fixups (file, buf + codeadroff);
7849
        }
7850
      if (lpfixoff != 0)
7851
        {
7852
          fprintf (file, _(" Linkage Pairs Referece Fixups:\n"));
7853
          evax_bfd_print_reference_fixups (file, buf + lpfixoff);
7854
        }
7855
      if (chgprtoff)
7856
        {
7857
          unsigned int count = (unsigned)bfd_getl32 (buf + chgprtoff);
7858
          struct vms_eicp *eicp = (struct vms_eicp *)(buf + chgprtoff + 4);
7859
          unsigned int j;
7860
 
7861
          fprintf (file, _(" Change Protection (%u entries):\n"), count);
7862
          for (j = 0; j < count; j++, eicp++)
7863
            {
7864
              unsigned int prot = bfd_getl32 (eicp->newprt);
7865
              fprintf (file,
7866
                       _("  base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
7867
                       (unsigned)bfd_getl32 (eicp->baseva + 4),
7868
                       (unsigned)bfd_getl32 (eicp->baseva + 0),
7869
                       (unsigned)bfd_getl32 (eicp->size),
7870
                       (unsigned)bfd_getl32 (eicp->newprt));
7871
              switch (prot)
7872
                {
7873
                case PRT__C_NA:
7874
                  fprintf (file, "NA");
7875
                  break;
7876
                case PRT__C_RESERVED:
7877
                  fprintf (file, "RES");
7878
                  break;
7879
                case PRT__C_KW:
7880
                  fprintf (file, "KW");
7881
                  break;
7882
                case PRT__C_KR:
7883
                  fprintf (file, "KR");
7884
                  break;
7885
                case PRT__C_UW:
7886
                  fprintf (file, "UW");
7887
                  break;
7888
                case PRT__C_EW:
7889
                  fprintf (file, "EW");
7890
                  break;
7891
                case PRT__C_ERKW:
7892
                  fprintf (file, "ERKW");
7893
                  break;
7894
                case PRT__C_ER:
7895
                  fprintf (file, "ER");
7896
                  break;
7897
                case PRT__C_SW:
7898
                  fprintf (file, "SW");
7899
                  break;
7900
                case PRT__C_SREW:
7901
                  fprintf (file, "SREW");
7902
                  break;
7903
                case PRT__C_SRKW:
7904
                  fprintf (file, "SRKW");
7905
                  break;
7906
                case PRT__C_SR:
7907
                  fprintf (file, "SR");
7908
                  break;
7909
                case PRT__C_URSW:
7910
                  fprintf (file, "URSW");
7911
                  break;
7912
                case PRT__C_UREW:
7913
                  fprintf (file, "UREW");
7914
                  break;
7915
                case PRT__C_URKW:
7916
                  fprintf (file, "URKW");
7917
                  break;
7918
                case PRT__C_UR:
7919
                  fprintf (file, "UR");
7920
                  break;
7921
                default:
7922
                  fputs ("??", file);
7923
                  break;
7924
                }
7925
              fputc ('\n', file);
7926
            }
7927
        }
7928
      free (buf);
7929
    }
7930
}
7931
 
7932
static bfd_boolean
7933
vms_bfd_print_private_bfd_data (bfd *abfd, void *ptr)
7934
{
7935
  FILE *file = (FILE *)ptr;
7936
 
7937
  if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
7938
    evax_bfd_print_image (abfd, file);
7939
  else
7940
    {
7941
      if (bfd_seek (abfd, 0, SEEK_SET))
7942
        return FALSE;
7943
      evax_bfd_print_eobj (abfd, file);
7944
    }
7945
  return TRUE;
7946
}
7947
 
7948
/* Linking.  */
7949
 
7950
/* Slurp ETIR/EDBG/ETBT VMS object records.  */
7951
 
7952
static bfd_boolean
7953
alpha_vms_read_sections_content (bfd *abfd, struct bfd_link_info *info)
7954
{
7955
  asection *cur_section;
7956
  file_ptr cur_offset;
7957
  asection *dst_section;
7958
  file_ptr dst_offset;
7959
 
7960
  if (bfd_seek (abfd, 0, SEEK_SET) != 0)
7961
    return FALSE;
7962
 
7963
  cur_section = NULL;
7964
  cur_offset = 0;
7965
 
7966
  dst_section = PRIV (dst_section);
7967
  dst_offset = 0;
7968
  if (info)
7969
    {
7970
      if (info->strip == strip_all || info->strip == strip_debugger)
7971
        {
7972
          /* Discard the DST section.  */
7973
          dst_offset = 0;
7974
          dst_section = NULL;
7975
        }
7976
      else if (dst_section)
7977
        {
7978
          dst_offset = dst_section->output_offset;
7979
          dst_section = dst_section->output_section;
7980
        }
7981
    }
7982
 
7983
  while (1)
7984
    {
7985
      int type;
7986
      bfd_boolean res;
7987
 
7988
      type = _bfd_vms_get_object_record (abfd);
7989
      if (type < 0)
7990
        {
7991
          vms_debug2 ((2, "next_record failed\n"));
7992
          return FALSE;
7993
        }
7994
      switch (type)
7995
        {
7996
        case EOBJ__C_ETIR:
7997
          PRIV (image_section) = cur_section;
7998
          PRIV (image_offset) = cur_offset;
7999
          res = _bfd_vms_slurp_etir (abfd, info);
8000
          cur_section = PRIV (image_section);
8001
          cur_offset = PRIV (image_offset);
8002
          break;
8003
        case EOBJ__C_EDBG:
8004
        case EOBJ__C_ETBT:
8005
          if (dst_section == NULL)
8006
            continue;
8007
          PRIV (image_section) = dst_section;
8008
          PRIV (image_offset) = dst_offset;
8009
          res = _bfd_vms_slurp_etir (abfd, info);
8010
          dst_offset = PRIV (image_offset);
8011
          break;
8012
        case EOBJ__C_EEOM:
8013
          return TRUE;
8014
        default:
8015
          continue;
8016
        }
8017
      if (!res)
8018
        {
8019
          vms_debug2 ((2, "slurp eobj type %d failed\n", type));
8020
          return FALSE;
8021
        }
8022
    }
8023
}
8024
 
8025
static int
8026
alpha_vms_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
8027
                          struct bfd_link_info *info ATTRIBUTE_UNUSED)
8028
{
8029
  return 0;
8030
}
8031
 
8032
/* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
8033
 
8034
static void
8035
alpha_vms_add_fixup_lp (struct bfd_link_info *info, bfd *src, bfd *shlib)
8036
{
8037
  struct alpha_vms_shlib_el *sl;
8038
  asection *sect = PRIV2 (src, image_section);
8039
  file_ptr offset = PRIV2 (src, image_offset);
8040
 
8041
  sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8042
                struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8043
  sl->has_fixups = TRUE;
8044
  VEC_APPEND_EL (sl->lp, bfd_vma,
8045
                 sect->output_section->vma + sect->output_offset + offset);
8046
  sect->output_section->flags |= SEC_RELOC;
8047
}
8048
 
8049
/* Add a code address fixup at address SECT + OFFSET to SHLIB. */
8050
 
8051
static void
8052
alpha_vms_add_fixup_ca (struct bfd_link_info *info, bfd *src, bfd *shlib)
8053
{
8054
  struct alpha_vms_shlib_el *sl;
8055
  asection *sect = PRIV2 (src, image_section);
8056
  file_ptr offset = PRIV2 (src, image_offset);
8057
 
8058
  sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8059
                struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8060
  sl->has_fixups = TRUE;
8061
  VEC_APPEND_EL (sl->ca, bfd_vma,
8062
                 sect->output_section->vma + sect->output_offset + offset);
8063
  sect->output_section->flags |= SEC_RELOC;
8064
}
8065
 
8066
/* Add a quad word relocation fixup at address SECT + OFFSET to SHLIB. */
8067
 
8068
static void
8069
alpha_vms_add_fixup_qr (struct bfd_link_info *info, bfd *src,
8070
                        bfd *shlib, bfd_vma vec)
8071
{
8072
  struct alpha_vms_shlib_el *sl;
8073
  struct alpha_vms_vma_ref *r;
8074
  asection *sect = PRIV2 (src, image_section);
8075
  file_ptr offset = PRIV2 (src, image_offset);
8076
 
8077
  sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8078
                struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8079
  sl->has_fixups = TRUE;
8080
  r = VEC_APPEND (sl->qr, struct alpha_vms_vma_ref);
8081
  r->vma = sect->output_section->vma + sect->output_offset + offset;
8082
  r->ref = vec;
8083
  sect->output_section->flags |= SEC_RELOC;
8084
}
8085
 
8086
static void
8087
alpha_vms_add_fixup_lr (struct bfd_link_info *info ATTRIBUTE_UNUSED,
8088
                        unsigned int shr ATTRIBUTE_UNUSED,
8089
                        bfd_vma vec ATTRIBUTE_UNUSED)
8090
{
8091
  /* Not yet supported.  */
8092
  abort ();
8093
}
8094
 
8095
/* Add relocation.  FIXME: Not yet emitted.  */
8096
 
8097
static void
8098
alpha_vms_add_lw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8099
{
8100
}
8101
 
8102
static void
8103
alpha_vms_add_qw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8104
{
8105
}
8106
 
8107
static struct bfd_hash_entry *
8108
alpha_vms_link_hash_newfunc (struct bfd_hash_entry *entry,
8109
                             struct bfd_hash_table *table,
8110
                             const char *string)
8111
{
8112
  struct alpha_vms_link_hash_entry *ret =
8113
    (struct alpha_vms_link_hash_entry *) entry;
8114
 
8115
  /* Allocate the structure if it has not already been allocated by a
8116
     subclass.  */
8117
  if (ret == NULL)
8118
    ret = ((struct alpha_vms_link_hash_entry *)
8119
           bfd_hash_allocate (table,
8120
                              sizeof (struct alpha_vms_link_hash_entry)));
8121
  if (ret == NULL)
8122
    return NULL;
8123
 
8124
  /* Call the allocation method of the superclass.  */
8125
  ret = ((struct alpha_vms_link_hash_entry *)
8126
         _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
8127
                                 table, string));
8128
 
8129
  ret->sym = NULL;
8130
 
8131
  return (struct bfd_hash_entry *) ret;
8132
}
8133
 
8134
/* Create an Alpha/VMS link hash table.  */
8135
 
8136
static struct bfd_link_hash_table *
8137
alpha_vms_bfd_link_hash_table_create (bfd *abfd)
8138
{
8139
  struct alpha_vms_link_hash_table *ret;
8140
  bfd_size_type amt = sizeof (struct alpha_vms_link_hash_table);
8141
 
8142
  ret = (struct alpha_vms_link_hash_table *) bfd_malloc (amt);
8143
  if (ret == NULL)
8144
    return NULL;
8145
  if (!_bfd_link_hash_table_init (&ret->root, abfd,
8146
                                  alpha_vms_link_hash_newfunc,
8147
                                  sizeof (struct alpha_vms_link_hash_entry)))
8148
    {
8149
      free (ret);
8150
      return NULL;
8151
    }
8152
 
8153
  VEC_INIT (ret->shrlibs);
8154
  ret->fixup = NULL;
8155
 
8156
  return &ret->root;
8157
}
8158
 
8159
static bfd_boolean
8160
alpha_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
8161
{
8162
  unsigned int i;
8163
 
8164
  for (i = 0; i < PRIV (gsd_sym_count); i++)
8165
    {
8166
      struct vms_symbol_entry *e = PRIV (syms)[i];
8167
      struct alpha_vms_link_hash_entry *h;
8168
      struct bfd_link_hash_entry *h_root;
8169
      asymbol sym;
8170
 
8171
      if (!alpha_vms_convert_symbol (abfd, e, &sym))
8172
        return FALSE;
8173
 
8174
      if ((e->flags & EGSY__V_DEF) && abfd->selective_search)
8175
        {
8176
          /* In selective_search mode, only add definition that are
8177
             required.  */
8178
          h = (struct alpha_vms_link_hash_entry *)bfd_link_hash_lookup
8179
            (info->hash, sym.name, FALSE, FALSE, FALSE);
8180
          if (h == NULL || h->root.type != bfd_link_hash_undefined)
8181
            continue;
8182
        }
8183
      else
8184
        h = NULL;
8185
 
8186
      h_root = (struct bfd_link_hash_entry *) h;
8187
      if (_bfd_generic_link_add_one_symbol
8188
          (info, abfd, sym.name, sym.flags, sym.section, sym.value,
8189
           NULL, FALSE, FALSE, &h_root) == FALSE)
8190
        return FALSE;
8191
      h = (struct alpha_vms_link_hash_entry *) h_root;
8192
 
8193
      if ((e->flags & EGSY__V_DEF)
8194
          && h->sym == NULL
8195
          && abfd->xvec == info->output_bfd->xvec)
8196
        h->sym = e;
8197
    }
8198
 
8199
  if (abfd->flags & DYNAMIC)
8200
    {
8201
      struct alpha_vms_shlib_el *shlib;
8202
 
8203
      /* We do not want to include any of the sections in a dynamic
8204
         object in the output file.  See comment in elflink.c.  */
8205
      bfd_section_list_clear (abfd);
8206
 
8207
      shlib = VEC_APPEND (alpha_vms_link_hash (info)->shrlibs,
8208
                          struct alpha_vms_shlib_el);
8209
      shlib->abfd = abfd;
8210
      VEC_INIT (shlib->ca);
8211
      VEC_INIT (shlib->lp);
8212
      VEC_INIT (shlib->qr);
8213
      PRIV (shr_index) = VEC_COUNT (alpha_vms_link_hash (info)->shrlibs) - 1;
8214
    }
8215
 
8216
  return TRUE;
8217
}
8218
 
8219
static bfd_boolean
8220
alpha_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
8221
{
8222
  int pass;
8223
  struct bfd_link_hash_entry **pundef;
8224
  struct bfd_link_hash_entry **next_pundef;
8225
 
8226
  /* We only accept VMS libraries.  */
8227
  if (info->output_bfd->xvec != abfd->xvec)
8228
    {
8229
      bfd_set_error (bfd_error_wrong_format);
8230
      return FALSE;
8231
    }
8232
 
8233
  /* The archive_pass field in the archive itself is used to
8234
     initialize PASS, since we may search the same archive multiple
8235
     times.  */
8236
  pass = ++abfd->archive_pass;
8237
 
8238
  /* Look through the list of undefined symbols.  */
8239
  for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef)
8240
    {
8241
      struct bfd_link_hash_entry *h;
8242
      symindex symidx;
8243
      bfd *element;
8244
      bfd *orig_element;
8245
 
8246
      h = *pundef;
8247
      next_pundef = &(*pundef)->u.undef.next;
8248
 
8249
      /* When a symbol is defined, it is not necessarily removed from
8250
         the list.  */
8251
      if (h->type != bfd_link_hash_undefined
8252
          && h->type != bfd_link_hash_common)
8253
        {
8254
          /* Remove this entry from the list, for general cleanliness
8255
             and because we are going to look through the list again
8256
             if we search any more libraries.  We can't remove the
8257
             entry if it is the tail, because that would lose any
8258
             entries we add to the list later on.  */
8259
          if (*pundef != info->hash->undefs_tail)
8260
            {
8261
              *pundef = *next_pundef;
8262
              next_pundef = pundef;
8263
            }
8264
          continue;
8265
        }
8266
 
8267
      /* Look for this symbol in the archive hash table.  */
8268
      symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string);
8269
      if (symidx == BFD_NO_MORE_SYMBOLS)
8270
        {
8271
          /* Nothing in this slot.  */
8272
          continue;
8273
        }
8274
 
8275
      element = bfd_get_elt_at_index (abfd, symidx);
8276
      if (element == NULL)
8277
        return FALSE;
8278
 
8279
      if (element->archive_pass == -1 || element->archive_pass == pass)
8280
        {
8281
          /* Next symbol if this archive is wrong or already handled.  */
8282
          continue;
8283
        }
8284
 
8285
      if (! bfd_check_format (element, bfd_object))
8286
        {
8287
          element->archive_pass = -1;
8288
          return FALSE;
8289
        }
8290
 
8291
      orig_element = element;
8292
      if (bfd_is_thin_archive (abfd))
8293
        {
8294
          element = _bfd_vms_lib_get_imagelib_file (element);
8295
          if (element == NULL || !bfd_check_format (element, bfd_object))
8296
            {
8297
              orig_element->archive_pass = -1;
8298
              return FALSE;
8299
            }
8300
        }
8301
 
8302
      /* Unlike the generic linker, we know that this element provides
8303
         a definition for an undefined symbol and we know that we want
8304
         to include it.  We don't need to check anything.  */
8305
      if (!(*info->callbacks
8306
            ->add_archive_element) (info, element, h->root.string, &element))
8307
        return FALSE;
8308
      if (!alpha_vms_link_add_object_symbols (element, info))
8309
        return FALSE;
8310
 
8311
      orig_element->archive_pass = pass;
8312
    }
8313
 
8314
  return TRUE;
8315
}
8316
 
8317
static bfd_boolean
8318
alpha_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
8319
{
8320
  switch (bfd_get_format (abfd))
8321
    {
8322
    case bfd_object:
8323
      vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
8324
                   abfd->filename));
8325
      return alpha_vms_link_add_object_symbols (abfd, info);
8326
      break;
8327
    case bfd_archive:
8328
      vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
8329
                   abfd->filename));
8330
      return alpha_vms_link_add_archive_symbols (abfd, info);
8331
      break;
8332
    default:
8333
      bfd_set_error (bfd_error_wrong_format);
8334
      return FALSE;
8335
    }
8336
}
8337
 
8338
static bfd_boolean
8339
alpha_vms_build_fixups (struct bfd_link_info *info)
8340
{
8341
  struct alpha_vms_link_hash_table *t = alpha_vms_link_hash (info);
8342
  unsigned char *content;
8343
  unsigned int i;
8344
  unsigned int sz = 0;
8345
  unsigned int lp_sz = 0;
8346
  unsigned int ca_sz = 0;
8347
  unsigned int qr_sz = 0;
8348
  unsigned int shrimg_cnt = 0;
8349
  unsigned int chgprt_num = 0;
8350
  unsigned int chgprt_sz = 0;
8351
  struct vms_eiaf *eiaf;
8352
  unsigned int off;
8353
  asection *sec;
8354
 
8355
  /* Shared libraries.  */
8356
  for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8357
    {
8358
      struct alpha_vms_shlib_el *shlib;
8359
 
8360
      shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8361
 
8362
      if (!shlib->has_fixups)
8363
        continue;
8364
 
8365
      shrimg_cnt++;
8366
 
8367
      if (VEC_COUNT (shlib->ca) > 0)
8368
        {
8369
          /* Header + entries.  */
8370
          ca_sz += 8;
8371
          ca_sz += VEC_COUNT (shlib->ca) * 4;
8372
        }
8373
      if (VEC_COUNT (shlib->lp) > 0)
8374
        {
8375
          /* Header + entries.  */
8376
          lp_sz += 8;
8377
          lp_sz += VEC_COUNT (shlib->lp) * 4;
8378
        }
8379
      if (VEC_COUNT (shlib->qr) > 0)
8380
        {
8381
          /* Header + entries.  */
8382
          qr_sz += 8;
8383
          qr_sz += VEC_COUNT (shlib->qr) * 8;
8384
        }
8385
    }
8386
  /* Add markers.  */
8387
  if (ca_sz > 0)
8388
    ca_sz += 8;
8389
  if (lp_sz > 0)
8390
    lp_sz += 8;
8391
  if (qr_sz > 0)
8392
    qr_sz += 8;
8393
 
8394
  /* Finish now if there is no content.  */
8395
  if (ca_sz + lp_sz + qr_sz == 0)
8396
    return TRUE;
8397
 
8398
  /* Add an eicp entry for the fixup itself.  */
8399
  chgprt_num = 1;
8400
  for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
8401
    {
8402
      /* This isect could be made RO or EXE after relocations are applied.  */
8403
      if ((sec->flags & SEC_RELOC) != 0
8404
          && (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
8405
        chgprt_num++;
8406
    }
8407
  chgprt_sz = 4 + chgprt_num * sizeof (struct vms_eicp);
8408
 
8409
  /* Allocate section content (round-up size)  */
8410
  sz = sizeof (struct vms_eiaf) + shrimg_cnt * sizeof (struct vms_shl)
8411
    + ca_sz + lp_sz + qr_sz + chgprt_sz;
8412
  sz = (sz + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
8413
  content = bfd_zalloc (info->output_bfd, sz);
8414
  if (content == NULL)
8415
    return FALSE;
8416
 
8417
  sec = alpha_vms_link_hash (info)->fixup;
8418
  sec->contents = content;
8419
  sec->size = sz;
8420
 
8421
  eiaf = (struct vms_eiaf *)content;
8422
  off = sizeof (struct vms_eiaf);
8423
  bfd_putl32 (0, eiaf->majorid);
8424
  bfd_putl32 (0, eiaf->minorid);
8425
  bfd_putl32 (0, eiaf->iaflink);
8426
  bfd_putl32 (0, eiaf->fixuplnk);
8427
  bfd_putl32 (sizeof (struct vms_eiaf), eiaf->size);
8428
  bfd_putl32 (0, eiaf->flags);
8429
  bfd_putl32 (0, eiaf->qrelfixoff);
8430
  bfd_putl32 (0, eiaf->lrelfixoff);
8431
  bfd_putl32 (0, eiaf->qdotadroff);
8432
  bfd_putl32 (0, eiaf->ldotadroff);
8433
  bfd_putl32 (0, eiaf->codeadroff);
8434
  bfd_putl32 (0, eiaf->lpfixoff);
8435
  bfd_putl32 (0, eiaf->chgprtoff);
8436
  bfd_putl32 (shrimg_cnt ? off : 0, eiaf->shlstoff);
8437
  bfd_putl32 (shrimg_cnt, eiaf->shrimgcnt);
8438
  bfd_putl32 (0, eiaf->shlextra);
8439
  bfd_putl32 (0, eiaf->permctx);
8440
  bfd_putl32 (0, eiaf->base_va);
8441
  bfd_putl32 (0, eiaf->lppsbfixoff);
8442
 
8443
  if (shrimg_cnt)
8444
    {
8445
      shrimg_cnt = 0;
8446
 
8447
      /* Write shl.  */
8448
      for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8449
        {
8450
          struct alpha_vms_shlib_el *shlib;
8451
          struct vms_shl *shl;
8452
 
8453
          shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8454
 
8455
          if (!shlib->has_fixups)
8456
            continue;
8457
 
8458
          /* Renumber shared images.  */
8459
          PRIV2 (shlib->abfd, shr_index) = shrimg_cnt++;
8460
 
8461
          shl = (struct vms_shl *)(content + off);
8462
          bfd_putl32 (0, shl->baseva);
8463
          bfd_putl32 (0, shl->shlptr);
8464
          bfd_putl32 (0, shl->ident);
8465
          bfd_putl32 (0, shl->permctx);
8466
          shl->size = sizeof (struct vms_shl);
8467
          bfd_putl16 (0, shl->fill_1);
8468
          shl->flags = 0;
8469
          bfd_putl32 (0, shl->icb);
8470
          shl->imgnam[0] = strlen (PRIV2 (shlib->abfd, hdr_data.hdr_t_name));
8471
          memcpy (shl->imgnam + 1, PRIV2 (shlib->abfd, hdr_data.hdr_t_name),
8472
                  shl->imgnam[0]);
8473
 
8474
          off += sizeof (struct vms_shl);
8475
        }
8476
 
8477
      /* CA fixups.  */
8478
      if (ca_sz != 0)
8479
        {
8480
          bfd_putl32 (off, eiaf->codeadroff);
8481
 
8482
          for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8483
            {
8484
              struct alpha_vms_shlib_el *shlib;
8485
              unsigned int j;
8486
 
8487
              shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8488
 
8489
              if (VEC_COUNT (shlib->ca) == 0)
8490
                continue;
8491
 
8492
              bfd_putl32 (VEC_COUNT (shlib->ca), content + off);
8493
              bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8494
              off += 8;
8495
 
8496
              for (j = 0; j < VEC_COUNT (shlib->ca); j++)
8497
                {
8498
                  bfd_putl32 (VEC_EL (shlib->ca, bfd_vma, j) - t->base_addr,
8499
                              content + off);
8500
                  off += 4;
8501
                }
8502
            }
8503
 
8504
          bfd_putl32 (0, content + off);
8505
          bfd_putl32 (0, content + off + 4);
8506
          off += 8;
8507
        }
8508
 
8509
      /* LP fixups.  */
8510
      if (lp_sz != 0)
8511
        {
8512
          bfd_putl32 (off, eiaf->lpfixoff);
8513
 
8514
          for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8515
            {
8516
              struct alpha_vms_shlib_el *shlib;
8517
              unsigned int j;
8518
 
8519
              shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8520
 
8521
              if (VEC_COUNT (shlib->lp) == 0)
8522
                continue;
8523
 
8524
              bfd_putl32 (VEC_COUNT (shlib->lp), content + off);
8525
              bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8526
              off += 8;
8527
 
8528
              for (j = 0; j < VEC_COUNT (shlib->lp); j++)
8529
                {
8530
                  bfd_putl32 (VEC_EL (shlib->lp, bfd_vma, j) - t->base_addr,
8531
                              content + off);
8532
                  off += 4;
8533
                }
8534
            }
8535
 
8536
          bfd_putl32 (0, content + off);
8537
          bfd_putl32 (0, content + off + 4);
8538
          off += 8;
8539
        }
8540
 
8541
      /* QR fixups.  */
8542
      if (qr_sz != 0)
8543
        {
8544
          bfd_putl32 (off, eiaf->qdotadroff);
8545
 
8546
          for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8547
            {
8548
              struct alpha_vms_shlib_el *shlib;
8549
              unsigned int j;
8550
 
8551
              shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8552
 
8553
              if (VEC_COUNT (shlib->qr) == 0)
8554
                continue;
8555
 
8556
              bfd_putl32 (VEC_COUNT (shlib->qr), content + off);
8557
              bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8558
              off += 8;
8559
 
8560
              for (j = 0; j < VEC_COUNT (shlib->qr); j++)
8561
                {
8562
                  struct alpha_vms_vma_ref *r;
8563
                  r = &VEC_EL (shlib->qr, struct alpha_vms_vma_ref, j);
8564
                  bfd_putl32 (r->vma - t->base_addr, content + off);
8565
                  bfd_putl32 (r->ref, content + off + 4);
8566
                  off += 8;
8567
                }
8568
            }
8569
 
8570
          bfd_putl32 (0, content + off);
8571
          bfd_putl32 (0, content + off + 4);
8572
          off += 8;
8573
        }
8574
    }
8575
 
8576
  /* Write the change protection table.  */
8577
  bfd_putl32 (off, eiaf->chgprtoff);
8578
  bfd_putl32 (chgprt_num, content + off);
8579
  off += 4;
8580
 
8581
  for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
8582
    {
8583
      struct vms_eicp *eicp;
8584
      unsigned int prot;
8585
 
8586
      if ((sec->flags & SEC_LINKER_CREATED) != 0 &&
8587
          strcmp (sec->name, "$FIXUP$") == 0)
8588
        prot = PRT__C_UREW;
8589
      else if ((sec->flags & SEC_RELOC) != 0
8590
               && (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
8591
        prot = PRT__C_UR;
8592
      else
8593
        continue;
8594
 
8595
      eicp = (struct vms_eicp *)(content + off);
8596
      bfd_putl64 (sec->vma - t->base_addr, eicp->baseva);
8597
      bfd_putl32 ((sec->size + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1),
8598
                  eicp->size);
8599
      bfd_putl32 (prot, eicp->newprt);
8600
      off += sizeof (struct vms_eicp);
8601
    }
8602
 
8603
  return TRUE;
8604
}
8605
 
8606 148 khays
/* Called by bfd_hash_traverse to fill the symbol table.
8607 14 khays
   Return FALSE in case of failure.  */
8608
 
8609
static bfd_boolean
8610 148 khays
alpha_vms_link_output_symbol (struct bfd_hash_entry *bh, void *infov)
8611 14 khays
{
8612 148 khays
  struct bfd_link_hash_entry *hc = (struct bfd_link_hash_entry *) bh;
8613 14 khays
  struct bfd_link_info *info = (struct bfd_link_info *)infov;
8614 148 khays
  struct alpha_vms_link_hash_entry *h;
8615 14 khays
  struct vms_symbol_entry *sym;
8616
 
8617 148 khays
  if (hc->type == bfd_link_hash_warning)
8618
    {
8619
      hc = hc->u.i.link;
8620
      if (hc->type == bfd_link_hash_new)
8621
        return TRUE;
8622
    }
8623
  h = (struct alpha_vms_link_hash_entry *) hc;
8624
 
8625 14 khays
  switch (h->root.type)
8626
    {
8627
    case bfd_link_hash_undefined:
8628
      return TRUE;
8629
    case bfd_link_hash_new:
8630 148 khays
    case bfd_link_hash_warning:
8631 14 khays
      abort ();
8632
    case bfd_link_hash_undefweak:
8633
      return TRUE;
8634
    case bfd_link_hash_defined:
8635
    case bfd_link_hash_defweak:
8636
      {
8637
        asection *sec = h->root.u.def.section;
8638
 
8639
        /* FIXME: this is certainly a symbol from a dynamic library.  */
8640
        if (bfd_is_abs_section (sec))
8641
          return TRUE;
8642
 
8643
        if (sec->owner->flags & DYNAMIC)
8644
          return TRUE;
8645
      }
8646
      break;
8647
    case bfd_link_hash_common:
8648
      break;
8649
    case bfd_link_hash_indirect:
8650
      return TRUE;
8651
    }
8652
 
8653
  /* Do not write not kept symbols.  */
8654
  if (info->strip == strip_some
8655
      && bfd_hash_lookup (info->keep_hash, h->root.root.string,
8656
                          FALSE, FALSE) != NULL)
8657
    return TRUE;
8658
 
8659
  if (h->sym == NULL)
8660
    {
8661
      /* This symbol doesn't come from a VMS object.  So we suppose it is
8662
         a data.  */
8663
      int len = strlen (h->root.root.string);
8664
 
8665
      sym = (struct vms_symbol_entry *)bfd_zalloc (info->output_bfd,
8666
                                                   sizeof (*sym) + len);
8667
      if (sym == NULL)
8668
        abort ();
8669
      sym->namelen = len;
8670
      memcpy (sym->name, h->root.root.string, len);
8671
      sym->name[len] = 0;
8672
      sym->owner = info->output_bfd;
8673
 
8674
      sym->typ = EGSD__C_SYMG;
8675
      sym->data_type = 0;
8676
      sym->flags = EGSY__V_DEF | EGSY__V_REL;
8677
      sym->symbol_vector = h->root.u.def.value;
8678
      sym->section = h->root.u.def.section;
8679
      sym->value = h->root.u.def.value;
8680
    }
8681
  else
8682
    sym = h->sym;
8683
 
8684
  if (!add_symbol_entry (info->output_bfd, sym))
8685
    return FALSE;
8686
 
8687
  return TRUE;
8688
}
8689
 
8690
static bfd_boolean
8691
alpha_vms_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
8692
{
8693
  asection *o;
8694
  struct bfd_link_order *p;
8695
  bfd *sub;
8696
  asection *fixupsec;
8697
  bfd_vma base_addr;
8698
  bfd_vma last_addr;
8699
  asection *dst;
8700
  asection *dmt;
8701
 
8702
  if (info->relocatable)
8703
    {
8704
      /* FIXME: we do not yet support relocatable link.  It is not obvious
8705
         how to do it for debug infos.  */
8706
      (*info->callbacks->einfo)(_("%P: relocatable link is not supported\n"));
8707
      return FALSE;
8708
    }
8709
 
8710
  bfd_get_outsymbols (abfd) = NULL;
8711
  bfd_get_symcount (abfd) = 0;
8712
 
8713
  /* Mark all sections which will be included in the output file.  */
8714
  for (o = abfd->sections; o != NULL; o = o->next)
8715
    for (p = o->map_head.link_order; p != NULL; p = p->next)
8716
      if (p->type == bfd_indirect_link_order)
8717
        p->u.indirect.section->linker_mark = TRUE;
8718
 
8719
#if 0
8720
  /* Handle all the link order information for the sections.  */
8721
  for (o = abfd->sections; o != NULL; o = o->next)
8722
    {
8723
      printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
8724
              o->name, (unsigned)o->vma, (unsigned)o->flags);
8725
 
8726
      for (p = o->map_head.link_order; p != NULL; p = p->next)
8727
        {
8728
          printf (" at 0x%08x - 0x%08x: ",
8729
                  (unsigned)p->offset, (unsigned)(p->offset + p->size - 1));
8730
          switch (p->type)
8731
            {
8732
            case bfd_section_reloc_link_order:
8733
            case bfd_symbol_reloc_link_order:
8734
              printf ("  section/symbol reloc\n");
8735
              break;
8736
            case bfd_indirect_link_order:
8737
              printf ("  section %s of %s\n",
8738
                      p->u.indirect.section->name,
8739
                      p->u.indirect.section->owner->filename);
8740
              break;
8741
            case bfd_data_link_order:
8742
              printf ("  explicit data\n");
8743
              break;
8744
            default:
8745
              printf ("  *unknown* type %u\n", p->type);
8746
              break;
8747
            }
8748
        }
8749
    }
8750
#endif
8751
 
8752
  /* Generate the symbol table.  */
8753
  BFD_ASSERT (PRIV (syms) == NULL);
8754
  if (info->strip != strip_all)
8755 148 khays
    bfd_hash_traverse (&info->hash->table, alpha_vms_link_output_symbol, info);
8756 14 khays
 
8757
  /* Find the entry point.  */
8758
  if (bfd_get_start_address (abfd) == 0)
8759
    {
8760
      bfd *startbfd = NULL;
8761
 
8762
      for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8763
        {
8764
          /* Consider only VMS object files.  */
8765
          if (sub->xvec != abfd->xvec)
8766
            continue;
8767
 
8768
          if (!PRIV2 (sub, eom_data).eom_has_transfer)
8769
            continue;
8770
          if ((PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR) && startbfd)
8771
            continue;
8772
          if (startbfd != NULL
8773
              && !(PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR))
8774
            {
8775
              (*info->callbacks->einfo)
8776
                (_("%P: multiple entry points: in modules %B and %B\n"),
8777
                 startbfd, sub);
8778
              continue;
8779
            }
8780
          startbfd = sub;
8781
        }
8782
 
8783
      if (startbfd)
8784
        {
8785
          unsigned int ps_idx = PRIV2 (startbfd, eom_data).eom_l_psindx;
8786
          bfd_vma tfradr = PRIV2 (startbfd, eom_data).eom_l_tfradr;
8787
          asection *sec;
8788
 
8789
          sec = PRIV2 (startbfd, sections)[ps_idx];
8790
 
8791
          bfd_set_start_address
8792
            (abfd, sec->output_section->vma + sec->output_offset + tfradr);
8793
        }
8794
    }
8795
 
8796
  /* Set transfer addresses.  */
8797
  {
8798
    int i;
8799
    struct bfd_link_hash_entry *h;
8800
 
8801
    i = 0;
8802
    PRIV (transfer_address[i++]) = 0xffffffff00000340ULL;       /* SYS$IMGACT */
8803
    h = bfd_link_hash_lookup (info->hash, "LIB$INITIALIZE", FALSE, FALSE, TRUE);
8804
    if (h != NULL && h->type == bfd_link_hash_defined)
8805
      PRIV (transfer_address[i++]) =
8806
        alpha_vms_get_sym_value (h->u.def.section, h->u.def.value);
8807
    PRIV (transfer_address[i++]) = bfd_get_start_address (abfd);
8808
    while (i < 4)
8809
      PRIV (transfer_address[i++]) = 0;
8810
  }
8811
 
8812
  /* Allocate contents.
8813
     Also compute the virtual base address.  */
8814
  base_addr = (bfd_vma)-1;
8815
  last_addr = 0;
8816
  for (o = abfd->sections; o != NULL; o = o->next)
8817
    {
8818
      if (o->flags & SEC_HAS_CONTENTS)
8819
        {
8820
          o->contents = bfd_alloc (abfd, o->size);
8821
          if (o->contents == NULL)
8822
            return FALSE;
8823
        }
8824
      if (o->flags & SEC_LOAD)
8825
        {
8826
          if (o->vma < base_addr)
8827
            base_addr = o->vma;
8828
          if (o->vma + o->size > last_addr)
8829
            last_addr = o->vma + o->size;
8830
        }
8831
      /* Clear the RELOC flags.  Currently we don't support incremental
8832
         linking.  We use the RELOC flag for computing the eicp entries.  */
8833
      o->flags &= ~SEC_RELOC;
8834
    }
8835
 
8836
  /* Create the fixup section.  */
8837
  fixupsec = bfd_make_section_anyway_with_flags
8838
    (info->output_bfd, "$FIXUP$",
8839
     SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
8840
  if (fixupsec == NULL)
8841
    return FALSE;
8842
  last_addr = (last_addr + 0xffff) & ~0xffff;
8843
  fixupsec->vma = last_addr;
8844
 
8845
  alpha_vms_link_hash (info)->fixup = fixupsec;
8846
  alpha_vms_link_hash (info)->base_addr = base_addr;
8847
 
8848
  /* Create the DMT section, if necessary.  */
8849
  BFD_ASSERT (PRIV (dst_section) == NULL);
8850
  dst = bfd_get_section_by_name (abfd, "$DST$");
8851
  if (dst != NULL && dst->size == 0)
8852
    dst = NULL;
8853
  if (dst != NULL)
8854
    {
8855
      PRIV (dst_section) = dst;
8856
      dmt = bfd_make_section_anyway_with_flags
8857
        (info->output_bfd, "$DMT$",
8858
         SEC_DEBUGGING | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
8859
      if (dmt == NULL)
8860
        return FALSE;
8861
    }
8862
  else
8863
    dmt = NULL;
8864
 
8865
  /* Read all sections from the inputs.  */
8866
  for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8867
    {
8868
      if (sub->flags & DYNAMIC)
8869
        {
8870
          alpha_vms_create_eisd_for_shared (abfd, sub);
8871
          continue;
8872
        }
8873
 
8874
      if (!alpha_vms_read_sections_content (sub, info))
8875
        return FALSE;
8876
    }
8877
 
8878
  /* Handle all the link order information for the sections.
8879
     Note: past this point, it is not possible to create new sections.  */
8880
  for (o = abfd->sections; o != NULL; o = o->next)
8881
    {
8882
      for (p = o->map_head.link_order; p != NULL; p = p->next)
8883
        {
8884
          switch (p->type)
8885
            {
8886
            case bfd_section_reloc_link_order:
8887
            case bfd_symbol_reloc_link_order:
8888
              abort ();
8889
              return FALSE;
8890
            case bfd_indirect_link_order:
8891
              /* Already done.  */
8892
              break;
8893
            default:
8894
              if (! _bfd_default_link_order (abfd, info, o, p))
8895
                return FALSE;
8896
              break;
8897
            }
8898
        }
8899
    }
8900
 
8901
  /* Compute fixups.  */
8902
  if (!alpha_vms_build_fixups (info))
8903
    return FALSE;
8904
 
8905
  /* Compute the DMT.  */
8906
  if (dmt != NULL)
8907
    {
8908
      int pass;
8909
      unsigned char *contents = NULL;
8910
 
8911
      /* In pass 1, compute the size.  In pass 2, write the DMT contents.  */
8912
      for (pass = 0; pass < 2; pass++)
8913
        {
8914
          unsigned int off = 0;
8915
 
8916
          /* For each object file (ie for each module).  */
8917
          for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8918
            {
8919
              asection *sub_dst;
8920
              struct vms_dmt_header *dmth = NULL;
8921
              unsigned int psect_count;
8922
 
8923
              /* Skip this module if it has no DST.  */
8924
              sub_dst = PRIV2 (sub, dst_section);
8925
              if (sub_dst == NULL || sub_dst->size == 0)
8926
                continue;
8927
 
8928
              if (pass == 1)
8929
                {
8930
                  /* Write the header.  */
8931
                  dmth = (struct vms_dmt_header *)(contents + off);
8932
                  bfd_putl32 (sub_dst->output_offset, dmth->modbeg);
8933
                  bfd_putl32 (sub_dst->size, dmth->size);
8934
                }
8935
 
8936
              off += sizeof (struct vms_dmt_header);
8937
              psect_count = 0;
8938
 
8939
              /* For each section (ie for each psect).  */
8940
              for (o = sub->sections; o != NULL; o = o->next)
8941
                {
8942
                  /* Only consider interesting sections.  */
8943
                  if (!(o->flags & SEC_ALLOC))
8944
                    continue;
8945
                  if (o->flags & SEC_LINKER_CREATED)
8946
                    continue;
8947
 
8948
                  if (pass == 1)
8949
                    {
8950
                      /* Write an entry.  */
8951
                      struct vms_dmt_psect *dmtp;
8952
 
8953
                      dmtp = (struct vms_dmt_psect *)(contents + off);
8954
                      bfd_putl32 (o->output_offset + o->output_section->vma,
8955
                                  dmtp->start);
8956
                      bfd_putl32 (o->size, dmtp->length);
8957
                      psect_count++;
8958
                    }
8959
                  off += sizeof (struct vms_dmt_psect);
8960
                }
8961
              if (pass == 1)
8962
                bfd_putl32 (psect_count, dmth->psect_count);
8963
            }
8964
 
8965
          if (pass == 0)
8966
            {
8967
              contents = bfd_zalloc (info->output_bfd, off);
8968
              if (contents == NULL)
8969
                return FALSE;
8970
              dmt->contents = contents;
8971
              dmt->size = off;
8972
            }
8973
          else
8974
            {
8975
              BFD_ASSERT (off == dmt->size);
8976
            }
8977
        }
8978
    }
8979
 
8980
  return TRUE;
8981
}
8982
 
8983
/* Read the contents of a section.
8984
   buf points to a buffer of buf_size bytes to be filled with
8985
   section data (starting at offset into section)  */
8986
 
8987
static bfd_boolean
8988
alpha_vms_get_section_contents (bfd *abfd, asection *section,
8989
                                void *buf, file_ptr offset,
8990
                                bfd_size_type count)
8991
{
8992
  asection *sec;
8993
 
8994
  /* Image are easy.  */
8995
  if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
8996
    return _bfd_generic_get_section_contents (abfd, section,
8997
                                              buf, offset, count);
8998
 
8999
  /* Safety check.  */
9000
  if (offset + count < count
9001
      || offset + count > section->size)
9002
    {
9003
      bfd_set_error (bfd_error_invalid_operation);
9004
      return FALSE;
9005
    }
9006
 
9007
  /* If the section is already in memory, just copy it.  */
9008
  if (section->flags & SEC_IN_MEMORY)
9009
    {
9010
      BFD_ASSERT (section->contents != NULL);
9011
      memcpy (buf, section->contents + offset, count);
9012
      return TRUE;
9013
    }
9014
  if (section->size == 0)
9015
    return TRUE;
9016
 
9017
  /* Alloc in memory and read ETIRs.  */
9018
  for (sec = abfd->sections; sec; sec = sec->next)
9019
    {
9020
      BFD_ASSERT (sec->contents == NULL);
9021
 
9022
      if (sec->size != 0 && (sec->flags & SEC_HAS_CONTENTS))
9023
        {
9024
          sec->contents = bfd_alloc (abfd, sec->size);
9025
          if (sec->contents == NULL)
9026
            return FALSE;
9027
        }
9028
    }
9029
  if (!alpha_vms_read_sections_content (abfd, NULL))
9030
    return FALSE;
9031
  for (sec = abfd->sections; sec; sec = sec->next)
9032
    if (sec->contents)
9033
      sec->flags |= SEC_IN_MEMORY;
9034
  memcpy (buf, section->contents + offset, count);
9035
  return TRUE;
9036
}
9037
 
9038
 
9039
/* Set the format of a file being written.  */
9040
 
9041
static bfd_boolean
9042
alpha_vms_mkobject (bfd * abfd)
9043
{
9044
  const bfd_arch_info_type *arch;
9045
 
9046
  vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd));
9047
 
9048
  if (!vms_initialize (abfd))
9049
    return FALSE;
9050
 
9051
  PRIV (recwr.buf) = bfd_alloc (abfd, MAX_OUTREC_SIZE);
9052
  if (PRIV (recwr.buf) == NULL)
9053
    return FALSE;
9054
 
9055
  arch = bfd_scan_arch ("alpha");
9056
 
9057
  if (arch == 0)
9058
    {
9059
      bfd_set_error (bfd_error_wrong_format);
9060
      return FALSE;
9061
    }
9062
 
9063
  abfd->arch_info = arch;
9064
  return TRUE;
9065
}
9066
 
9067
 
9068
/* 4.1, generic.  */
9069
 
9070
/* Called when the BFD is being closed to do any necessary cleanup.  */
9071
 
9072
static bfd_boolean
9073
vms_close_and_cleanup (bfd * abfd)
9074
{
9075
  vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd));
9076
 
9077
  if (abfd == NULL || abfd->tdata.any == NULL)
9078
    return TRUE;
9079
 
9080
  if (abfd->format == bfd_archive)
9081
    {
9082
      bfd_release (abfd, abfd->tdata.any);
9083
      abfd->tdata.any = NULL;
9084
      return TRUE;
9085
    }
9086
 
9087
  if (PRIV (recrd.buf) != NULL)
9088
    free (PRIV (recrd.buf));
9089
 
9090
  if (PRIV (sections) != NULL)
9091
    free (PRIV (sections));
9092
 
9093
  bfd_release (abfd, abfd->tdata.any);
9094
  abfd->tdata.any = NULL;
9095
 
9096
#ifdef VMS
9097
  if (abfd->direction == write_direction)
9098
    {
9099
      /* Last step on VMS is to convert the file to variable record length
9100
         format.  */
9101
      if (bfd_cache_close (abfd) != TRUE)
9102
        return FALSE;
9103
      if (_bfd_vms_convert_to_var_unix_filename (abfd->filename) != TRUE)
9104
        return FALSE;
9105
    }
9106
#endif
9107
 
9108
  return TRUE;
9109
}
9110
 
9111
/* Called when a new section is created.  */
9112
 
9113
static bfd_boolean
9114
vms_new_section_hook (bfd * abfd, asection *section)
9115
{
9116
  bfd_size_type amt;
9117
 
9118
  vms_debug2 ((1, "vms_new_section_hook (%p, [%d]%s)\n",
9119
               abfd, section->index, section->name));
9120
 
9121
  bfd_set_section_alignment (abfd, section, 0);
9122
 
9123
  vms_debug2 ((7, "%d: %s\n", section->index, section->name));
9124
 
9125
  amt = sizeof (struct vms_section_data_struct);
9126
  section->used_by_bfd = bfd_zalloc (abfd, amt);
9127
  if (section->used_by_bfd == NULL)
9128
    return FALSE;
9129
 
9130
  /* Create the section symbol.  */
9131
  return _bfd_generic_new_section_hook (abfd, section);
9132
}
9133
 
9134
/* Part 4.5, symbols.  */
9135
 
9136
/* Print symbol to file according to how. how is one of
9137
   bfd_print_symbol_name        just print the name
9138
   bfd_print_symbol_more        print more (???)
9139
   bfd_print_symbol_all print all we know, which is not much right now :-).  */
9140
 
9141
static void
9142
vms_print_symbol (bfd * abfd,
9143
                  void * file,
9144
                  asymbol *symbol,
9145
                  bfd_print_symbol_type how)
9146
{
9147
  vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
9148
               abfd, file, symbol, how));
9149
 
9150
  switch (how)
9151
    {
9152
      case bfd_print_symbol_name:
9153
      case bfd_print_symbol_more:
9154
        fprintf ((FILE *)file," %s", symbol->name);
9155
      break;
9156
 
9157
      case bfd_print_symbol_all:
9158
        {
9159
          const char *section_name = symbol->section->name;
9160
 
9161
          bfd_print_symbol_vandf (abfd, file, symbol);
9162
 
9163
          fprintf ((FILE *) file," %-8s %s", section_name, symbol->name);
9164
        }
9165
      break;
9166
    }
9167
}
9168
 
9169
/* Return information about symbol in ret.
9170
 
9171
   fill type, value and name
9172
   type:
9173
        A       absolute
9174
        B       bss segment symbol
9175
        C       common symbol
9176
        D       data segment symbol
9177
        f       filename
9178
        t       a static function symbol
9179
        T       text segment symbol
9180
        U       undefined
9181
        -       debug.  */
9182
 
9183
static void
9184
vms_get_symbol_info (bfd * abfd ATTRIBUTE_UNUSED,
9185
                     asymbol *symbol,
9186
                     symbol_info *ret)
9187
{
9188
  asection *sec;
9189
 
9190
  vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd, symbol, ret));
9191
 
9192
  sec = symbol->section;
9193
 
9194
  if (ret == NULL)
9195
    return;
9196
 
9197
  if (sec == NULL)
9198
    ret->type = 'U';
9199
  else if (bfd_is_com_section (sec))
9200
    ret->type = 'C';
9201
  else if (bfd_is_abs_section (sec))
9202
    ret->type = 'A';
9203
  else if (bfd_is_und_section (sec))
9204
    ret->type = 'U';
9205
  else if (bfd_is_ind_section (sec))
9206
    ret->type = 'I';
9207
  else if ((symbol->flags & BSF_FUNCTION)
9208
           || (bfd_get_section_flags (abfd, sec) & SEC_CODE))
9209
    ret->type = 'T';
9210
  else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
9211
    ret->type = 'D';
9212
  else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
9213
    ret->type = 'B';
9214
  else
9215
    ret->type = '?';
9216
 
9217
  if (ret->type != 'U')
9218
    ret->value = symbol->value + symbol->section->vma;
9219
  else
9220
    ret->value = 0;
9221
  ret->name = symbol->name;
9222
}
9223
 
9224
/* Return TRUE if the given symbol sym in the BFD abfd is
9225
   a compiler generated local label, else return FALSE.  */
9226
 
9227
static bfd_boolean
9228
vms_bfd_is_local_label_name (bfd * abfd ATTRIBUTE_UNUSED,
9229
                             const char *name)
9230
{
9231
  vms_debug2 ((1, "vms_bfd_is_local_label_name (%p, %s)\n", abfd, name));
9232
  return name[0] == '$';
9233
}
9234
 
9235
/* Part 4.7, writing an object file.  */
9236
 
9237
/* Sets the contents of the section section in BFD abfd to the data starting
9238
   in memory at LOCATION. The data is written to the output section starting
9239
   at offset offset for count bytes.
9240
 
9241
   Normally TRUE is returned, else FALSE. Possible error returns are:
9242
   o bfd_error_no_contents - The output section does not have the
9243
        SEC_HAS_CONTENTS attribute, so nothing can be written to it.
9244
   o and some more too  */
9245
 
9246
static bfd_boolean
9247
_bfd_vms_set_section_contents (bfd * abfd,
9248
                               asection *section,
9249
                               const void * location,
9250
                               file_ptr offset,
9251
                               bfd_size_type count)
9252
{
9253
  if (section->contents == NULL)
9254
    {
9255
      section->contents = bfd_alloc (abfd, section->size);
9256
      if (section->contents == NULL)
9257
        return FALSE;
9258
 
9259
      memcpy (section->contents + offset, location, (size_t) count);
9260
    }
9261
 
9262
  return TRUE;
9263
}
9264
 
9265
/* Set the architecture and machine type in BFD abfd to arch and mach.
9266
   Find the correct pointer to a structure and insert it into the arch_info
9267
   pointer.  */
9268
 
9269
static bfd_boolean
9270
alpha_vms_set_arch_mach (bfd *abfd,
9271
                         enum bfd_architecture arch, unsigned long mach)
9272
{
9273
  if (arch != bfd_arch_alpha
9274
      && arch != bfd_arch_unknown)
9275
    return FALSE;
9276
 
9277
  return bfd_default_set_arch_mach (abfd, arch, mach);
9278
}
9279
 
9280
/* Set section VMS flags.  Clear NO_FLAGS and set FLAGS.  */
9281
 
9282
void
9283
bfd_vms_set_section_flags (bfd *abfd ATTRIBUTE_UNUSED,
9284
                           asection *sec, flagword no_flags, flagword flags)
9285
{
9286
  vms_section_data (sec)->no_flags = no_flags;
9287
  vms_section_data (sec)->flags = flags;
9288
}
9289
 
9290
struct vms_private_data_struct *
9291
bfd_vms_get_data (bfd *abfd)
9292
{
9293
  return (struct vms_private_data_struct *)abfd->tdata.any;
9294
}
9295
 
9296
#define vms_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9297
#define vms_bfd_link_just_syms            _bfd_generic_link_just_syms
9298
#define vms_bfd_copy_link_hash_symbol_type \
9299
  _bfd_generic_copy_link_hash_symbol_type
9300
#define vms_bfd_is_group_section          bfd_generic_is_group_section
9301
#define vms_bfd_discard_group             bfd_generic_discard_group
9302
#define vms_section_already_linked        _bfd_generic_section_already_linked
9303
#define vms_bfd_define_common_symbol      bfd_generic_define_common_symbol
9304
#define vms_bfd_copy_private_header_data  _bfd_generic_bfd_copy_private_header_data
9305
 
9306
#define vms_bfd_copy_private_bfd_data     _bfd_generic_bfd_copy_private_bfd_data
9307
#define vms_bfd_free_cached_info          _bfd_generic_bfd_free_cached_info
9308
#define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
9309
#define vms_bfd_copy_private_symbol_data  _bfd_generic_bfd_copy_private_symbol_data
9310
#define vms_bfd_set_private_flags         _bfd_generic_bfd_set_private_flags
9311
#define vms_bfd_merge_private_bfd_data    _bfd_generic_bfd_merge_private_bfd_data
9312
 
9313
/* Symbols table.  */
9314
#define alpha_vms_make_empty_symbol        _bfd_generic_make_empty_symbol
9315
#define alpha_vms_bfd_is_target_special_symbol \
9316
   ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9317
#define alpha_vms_print_symbol             vms_print_symbol
9318
#define alpha_vms_get_symbol_info          vms_get_symbol_info
9319
#define alpha_vms_read_minisymbols         _bfd_generic_read_minisymbols
9320
#define alpha_vms_minisymbol_to_symbol     _bfd_generic_minisymbol_to_symbol
9321
#define alpha_vms_get_lineno               _bfd_nosymbols_get_lineno
9322
#define alpha_vms_find_inliner_info        _bfd_nosymbols_find_inliner_info
9323
#define alpha_vms_bfd_make_debug_symbol    _bfd_nosymbols_bfd_make_debug_symbol
9324
#define alpha_vms_find_nearest_line        _bfd_vms_find_nearest_dst_line
9325
#define alpha_vms_bfd_is_local_label_name  vms_bfd_is_local_label_name
9326
 
9327
/* Generic table.  */
9328
#define alpha_vms_close_and_cleanup        vms_close_and_cleanup
9329
#define alpha_vms_bfd_free_cached_info     vms_bfd_free_cached_info
9330
#define alpha_vms_new_section_hook         vms_new_section_hook
9331
#define alpha_vms_set_section_contents     _bfd_vms_set_section_contents
9332
#define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
9333
 
9334
#define alpha_vms_bfd_get_relocated_section_contents \
9335
  bfd_generic_get_relocated_section_contents
9336
 
9337
#define alpha_vms_bfd_relax_section bfd_generic_relax_section
9338
#define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
9339 161 khays
#define alpha_vms_bfd_lookup_section_flags bfd_generic_lookup_section_flags
9340 14 khays
#define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
9341
#define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
9342
#define alpha_vms_bfd_discard_group bfd_generic_discard_group
9343
#define alpha_vms_section_already_linked \
9344
  _bfd_generic_section_already_linked
9345
 
9346
#define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9347
#define alpha_vms_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
9348
#define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
9349
#define alpha_vms_bfd_copy_link_hash_symbol_type \
9350
  _bfd_generic_copy_link_hash_symbol_type
9351
 
9352
#define alpha_vms_bfd_link_split_section  _bfd_generic_link_split_section
9353
 
9354
#define alpha_vms_get_dynamic_symtab_upper_bound \
9355
  _bfd_nodynamic_get_dynamic_symtab_upper_bound
9356
#define alpha_vms_canonicalize_dynamic_symtab \
9357
  _bfd_nodynamic_canonicalize_dynamic_symtab
9358
#define alpha_vms_get_dynamic_reloc_upper_bound \
9359
  _bfd_nodynamic_get_dynamic_reloc_upper_bound
9360
#define alpha_vms_canonicalize_dynamic_reloc \
9361
  _bfd_nodynamic_canonicalize_dynamic_reloc
9362
 
9363
const bfd_target vms_alpha_vec =
9364
{
9365
  "vms-alpha",                  /* Name.  */
9366
  bfd_target_evax_flavour,
9367
  BFD_ENDIAN_LITTLE,            /* Data byte order is little.  */
9368
  BFD_ENDIAN_LITTLE,            /* Header byte order is little.  */
9369
 
9370
  (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
9371
   | WP_TEXT | D_PAGED),        /* Object flags.  */
9372
  (SEC_ALLOC | SEC_LOAD | SEC_RELOC
9373
   | SEC_READONLY | SEC_CODE | SEC_DATA
9374
   | SEC_HAS_CONTENTS | SEC_IN_MEMORY),         /* Sect flags.  */
9375
  0,                             /* symbol_leading_char.  */
9376
  ' ',                          /* ar_pad_char.  */
9377
  15,                           /* ar_max_namelen.  */
9378 148 khays
  0,                             /* match priority.  */
9379 14 khays
  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9380
  bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9381
  bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9382
  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9383
  bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9384
  bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9385
 
9386
  {_bfd_dummy_target, alpha_vms_object_p,       /* bfd_check_format.  */
9387
   _bfd_vms_lib_alpha_archive_p, _bfd_dummy_target},
9388
  {bfd_false, alpha_vms_mkobject,               /* bfd_set_format.  */
9389
   _bfd_vms_lib_alpha_mkarchive, bfd_false},
9390
  {bfd_false, alpha_vms_write_object_contents,  /* bfd_write_contents.  */
9391
   _bfd_vms_lib_write_archive_contents, bfd_false},
9392
 
9393
  BFD_JUMP_TABLE_GENERIC (alpha_vms),
9394
  BFD_JUMP_TABLE_COPY (vms),
9395
  BFD_JUMP_TABLE_CORE (_bfd_nocore),
9396
  BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib),
9397
  BFD_JUMP_TABLE_SYMBOLS (alpha_vms),
9398
  BFD_JUMP_TABLE_RELOCS (alpha_vms),
9399
  BFD_JUMP_TABLE_WRITE (alpha_vms),
9400
  BFD_JUMP_TABLE_LINK (alpha_vms),
9401
  BFD_JUMP_TABLE_DYNAMIC (alpha_vms),
9402
 
9403
  NULL,
9404
 
9405
  NULL
9406
};

powered by: WebSVN 2.1.0

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