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