1 /* vms.c -- BFD back-end for EVAX (openVMS/Alpha) files.
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5 Initial version written by Klaus Kaempf (kkaempf@rmi.de)
6 Major rewrite by Adacore.
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.
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.
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. */
26 o Generation of shared image
27 o Generation of GST in image
28 o Relocation optimizations
50 #include "vms/eihvn.h"
51 #include "vms/eobjrec.h"
54 #include "vms/esgps.h"
63 #include "vms/esdfm.h"
64 #include "vms/esdfv.h"
70 #include "vms/internal.h"
73 #define MIN(a,b) ((a) < (b) ? (a) : (b))
75 /* The r_type field in a reloc is one of the following values. */
76 #define ALPHA_R_IGNORE 0
77 #define ALPHA_R_REFQUAD 1
78 #define ALPHA_R_BRADDR 2
79 #define ALPHA_R_HINT 3
80 #define ALPHA_R_SREL16 4
81 #define ALPHA_R_SREL32 5
82 #define ALPHA_R_SREL64 6
83 #define ALPHA_R_OP_PUSH 7
84 #define ALPHA_R_OP_STORE 8
85 #define ALPHA_R_OP_PSUB 9
86 #define ALPHA_R_OP_PRSHIFT 10
87 #define ALPHA_R_LINKAGE 11
88 #define ALPHA_R_REFLONG 12
89 #define ALPHA_R_CODEADDR 13
90 #define ALPHA_R_NOP 14
91 #define ALPHA_R_BSR 15
92 #define ALPHA_R_LDA 16
93 #define ALPHA_R_BOH 17
95 /* These are used with DST_S_C_LINE_NUM. */
96 #define DST_S_C_LINE_NUM_HEADER_SIZE 4
98 /* These are used with DST_S_C_SOURCE */
100 #define DST_S_B_PCLINE_UNSBYTE 1
101 #define DST_S_W_PCLINE_UNSWORD 1
102 #define DST_S_L_PCLINE_UNSLONG 1
104 #define DST_S_B_MODBEG_NAME 14
105 #define DST_S_L_RTNBEG_ADDRESS 5
106 #define DST_S_B_RTNBEG_NAME 13
107 #define DST_S_L_RTNEND_SIZE 5
109 /* These are used with DST_S_C_SOURCE. */
110 #define DST_S_C_SOURCE_HEADER_SIZE 4
112 #define DST_S_B_SRC_DF_LENGTH 1
113 #define DST_S_W_SRC_DF_FILEID 3
114 #define DST_S_B_SRC_DF_FILENAME 20
115 #define DST_S_B_SRC_UNSBYTE 1
116 #define DST_S_W_SRC_UNSWORD 1
117 #define DST_S_L_SRC_UNSLONG 1
119 /* Debugger symbol definitions. */
121 #define DBG_S_L_DMT_MODBEG 0
122 #define DBG_S_L_DST_SIZE 4
123 #define DBG_S_W_DMT_PSECT_COUNT 8
124 #define DBG_S_C_DMT_HEADER_SIZE 12
126 #define DBG_S_L_DMT_PSECT_START 0
127 #define DBG_S_L_DMT_PSECT_LENGTH 4
128 #define DBG_S_C_DMT_PSECT_SIZE 8
130 /* VMS module header. */
146 #define EMH_DATE_LENGTH 17
148 /* VMS End-Of-Module records (EOM/EEOM). */
152 unsigned int eom_l_total_lps;
153 unsigned short eom_w_comcod;
154 bfd_boolean eom_has_transfer;
155 unsigned char eom_b_tfrflg;
156 unsigned int eom_l_psindx;
157 unsigned int eom_l_tfradr;
160 struct vms_symbol_entry
166 unsigned char data_type;
167 unsigned short flags;
169 /* Section and offset/value of the symbol. */
170 unsigned int section;
173 /* Section and offset/value for the entry point (only for subprg). */
174 unsigned int code_section;
175 unsigned int code_value;
177 /* Symbol vector offset. */
178 unsigned int symbol_vector;
180 /* Length of the name. */
181 unsigned char namelen;
186 /* Stack value for push/pop commands. */
194 #define STACKSIZE 128
196 /* A minimal decoding of DST compilation units. We only decode
197 what's needed to get to the line number information. */
207 struct srecinfo *next;
215 struct lineinfo *next;
222 struct funcinfo *next;
230 /* Chain the previously read compilation unit. */
233 /* The module name. */
236 /* The start offset and size of debug info in the DST section. */
240 /* The lowest and highest addresses contained in this compilation
241 unit as specified in the compilation unit header. */
245 /* The listing line table. */
246 struct lineinfo *line_table;
248 /* The source record table. */
249 struct srecinfo *srec_table;
251 /* A list of the functions found in this module. */
252 struct funcinfo *func_table;
254 /* Current allocation of file_table. */
255 unsigned int file_table_count;
257 /* An array of the files making up this module. */
258 struct fileinfo *file_table;
261 /* BFD private data for alpha-vms. */
263 struct vms_private_data_struct
265 /* If true, relocs have been read. */
266 bfd_boolean reloc_done;
268 /* Record input buffer. */
269 struct vms_rec_rd recrd;
270 struct vms_rec_wr recwr;
272 struct hdr_struct hdr_data; /* data from HDR/EMH record */
273 struct eom_struct eom_data; /* data from EOM/EEOM record */
274 unsigned int section_count; /* # of sections in following array */
275 asection **sections; /* array of GSD/EGSD sections */
277 /* Array of raw symbols. */
278 struct vms_symbol_entry **syms;
280 /* Canonicalized symbols. */
283 /* Number of symbols. */
284 unsigned int gsd_sym_count;
285 /* Size of the syms array. */
286 unsigned int max_sym_count;
287 /* Number of procedure symbols. */
288 unsigned int norm_sym_count;
290 /* Stack used to evaluate TIR/ETIR commands. */
291 struct stack_struct *stack;
294 /* Content reading. */
295 asection *image_section; /* section for image_ptr */
296 file_ptr image_offset; /* Offset for image_ptr. */
298 struct module *modules; /* list of all compilation units */
300 struct dst_info *dst_info;
301 asection *dst_section;
303 unsigned int dst_ptr_offsets_count; /* # of offsets in following array */
304 unsigned int *dst_ptr_offsets; /* array of saved image_ptr offsets */
306 /* Shared library support */
307 bfd_vma symvva; /* relative virtual address of symbol vector */
309 unsigned char matchctl;
311 /* Shared library index. This is used for input bfd while linking. */
312 unsigned int shr_index;
314 /* Used to place structures in the file. */
317 /* Simply linked list of eisd. */
318 struct vms_internal_eisd_map *eisd_head;
319 struct vms_internal_eisd_map *eisd_tail;
321 /* Simply linked list of eisd for shared libraries. */
322 struct vms_internal_eisd_map *gbl_eisd_head;
323 struct vms_internal_eisd_map *gbl_eisd_tail;
325 /* linkage index counter used by conditional store commands */
326 int vms_linkage_index;
328 /* see tc-alpha.c of gas for a description. */
329 int flag_hash_long_names; /* -+, hash instead of truncate */
330 int flag_show_after_trunc; /* -H, show hashing/truncation */
333 #define PRIV2(abfd, name) \
334 (((struct vms_private_data_struct *)(abfd)->tdata.any)->name)
335 #define PRIV(name) PRIV2(abfd,name)
338 /* Used to keep extra VMS specific information for a given section.
340 reloc_size holds the size of the relocation stream, note this
341 is very different from the number of relocations as VMS relocations
344 reloc_stream is the actual stream of relocation entries. */
346 struct vms_section_data_struct
348 /* Maximnum number of entries in sec->relocation. */
351 /* Corresponding eisd. Used only while generating executables. */
352 struct vms_internal_eisd_map *eisd;
354 /* PSC flags to be clear. */
357 /* PSC flags to be set. */
361 #define vms_section_data(sec) \
362 ((struct vms_section_data_struct *)sec->used_by_bfd)
364 /* To be called from the debugger. */
365 struct vms_private_data_struct *bfd_vms_get_data (bfd *abfd);
367 static int vms_get_remaining_object_record (bfd *abfd, int read_so_far);
368 static bfd_boolean _bfd_vms_slurp_object_records (bfd * abfd);
369 static void alpha_vms_add_fixup_lp (struct bfd_link_info *, bfd *, bfd *);
370 static void alpha_vms_add_fixup_ca (struct bfd_link_info *, bfd *, bfd *);
371 static void alpha_vms_add_fixup_qr (struct bfd_link_info *, bfd *, bfd *,
373 static void alpha_vms_add_lw_reloc (struct bfd_link_info *info);
374 static void alpha_vms_add_qw_reloc (struct bfd_link_info *info);
375 static void alpha_vms_add_lw_fixup (struct bfd_link_info *, unsigned int,
385 /* Number of elements in VEC. */
387 #define VEC_COUNT(VEC) ((VEC).nbr_el)
389 /* Get the address of the Nth element. */
391 #define VEC_EL(VEC, TYPE, N) (((TYPE *)((VEC).els))[N])
393 #define VEC_INIT(VEC) \
400 /* Be sure there is room for a new element. */
402 static void vector_grow1 (struct vector_type *vec, size_t elsz);
404 /* Allocate room for a new element and return its address. */
406 #define VEC_APPEND(VEC, TYPE) \
407 (vector_grow1 (&VEC, sizeof (TYPE)), &VEC_EL(VEC, TYPE, (VEC).nbr_el++))
409 /* Append an element. */
411 #define VEC_APPEND_EL(VEC, TYPE, EL) \
412 (*(VEC_APPEND (VEC, TYPE)) = EL)
414 struct alpha_vms_vma_ref
416 bfd_vma vma; /* Vma in the output. */
417 bfd_vma ref; /* Reference in the input. */
420 struct alpha_vms_shlib_el
423 bfd_boolean has_fixups;
425 struct vector_type lp; /* Vector of bfd_vma. */
426 struct vector_type ca; /* Vector of bfd_vma. */
427 struct vector_type qr; /* Vector of struct alpha_vms_vma_ref. */
430 /* Alpha VMS linker hash table. */
432 struct alpha_vms_link_hash_table
434 struct bfd_link_hash_table root;
436 /* Vector of shared libaries. */
437 struct vector_type shrlibs;
442 /* Base address. Used by fixups. */
446 #define alpha_vms_link_hash(INFO) \
447 ((struct alpha_vms_link_hash_table *)(INFO->hash))
449 /* Alpha VMS linker hash table entry. */
451 struct alpha_vms_link_hash_entry
453 struct bfd_link_hash_entry root;
455 /* Pointer to the original vms symbol. */
456 struct vms_symbol_entry *sym;
461 /* Read & process EIHD record.
462 Return TRUE on success, FALSE on error. */
465 _bfd_vms_slurp_eihd (bfd *abfd, unsigned int *eisd_offset,
466 unsigned int *eihs_offset)
468 unsigned int imgtype, size;
470 struct vms_eihd *eihd = (struct vms_eihd *)PRIV (recrd.rec);
472 vms_debug2 ((8, "_bfd_vms_slurp_eihd\n"));
474 size = bfd_getl32 (eihd->size);
475 imgtype = bfd_getl32 (eihd->imgtype);
477 if (imgtype == EIHD__K_EXE || imgtype == EIHD__K_LIM)
478 abfd->flags |= EXEC_P;
480 symvva = bfd_getl64 (eihd->symvva);
483 PRIV (symvva) = symvva;
484 abfd->flags |= DYNAMIC;
487 PRIV (ident) = bfd_getl32 (eihd->ident);
488 PRIV (matchctl) = eihd->matchctl;
490 *eisd_offset = bfd_getl32 (eihd->isdoff);
491 *eihs_offset = bfd_getl32 (eihd->symdbgoff);
493 vms_debug2 ((4, "EIHD size %d imgtype %d symvva 0x%lx eisd %d eihs %d\n",
494 size, imgtype, (unsigned long)symvva,
495 *eisd_offset, *eihs_offset));
500 /* Read & process EISD record.
501 Return TRUE on success, FALSE on error. */
504 _bfd_vms_slurp_eisd (bfd *abfd, unsigned int offset)
506 int section_count = 0;
508 vms_debug2 ((8, "_bfd_vms_slurp_eisd\n"));
512 struct vms_eisd *eisd;
513 unsigned int rec_size;
515 unsigned long long vaddr;
522 eisd = (struct vms_eisd *)(PRIV (recrd.rec) + offset);
523 rec_size = bfd_getl32 (eisd->eisdsize);
528 /* Skip to next block if pad. */
529 if (rec_size == 0xffffffff)
531 offset = (offset + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
537 size = bfd_getl32 (eisd->secsize);
538 vaddr = bfd_getl64 (eisd->virt_addr);
539 flags = bfd_getl32 (eisd->flags);
540 vbn = bfd_getl32 (eisd->vbn);
542 vms_debug2 ((4, "EISD at 0x%x size 0x%x addr 0x%lx flags 0x%x blk %d\n",
543 offset, size, (unsigned long)vaddr, flags, vbn));
545 /* VMS combines psects from .obj files into isects in the .exe. This
546 process doesn't preserve enough information to reliably determine
547 what's in each section without examining the data. This is
548 especially true of DWARF debug sections. */
549 bfd_flags = SEC_ALLOC;
551 bfd_flags |= SEC_HAS_CONTENTS | SEC_LOAD;
553 if (flags & EISD__M_EXE)
554 bfd_flags |= SEC_CODE;
556 if (flags & EISD__M_NONSHRADR)
557 bfd_flags |= SEC_DATA;
559 if (!(flags & EISD__M_WRT))
560 bfd_flags |= SEC_READONLY;
562 if (flags & EISD__M_DZRO)
563 bfd_flags |= SEC_DATA;
565 if (flags & EISD__M_FIXUPVEC)
566 bfd_flags |= SEC_DATA;
568 if (flags & EISD__M_CRF)
569 bfd_flags |= SEC_DATA;
571 if (flags & EISD__M_GBL)
573 name = _bfd_vms_save_counted_string (eisd->gblnam);
574 bfd_flags |= SEC_COFF_SHARED_LIBRARY;
575 bfd_flags &= ~(SEC_ALLOC | SEC_LOAD);
577 else if (flags & EISD__M_FIXUPVEC)
579 else if (eisd->type == EISD__K_USRSTACK)
585 name = (char*) bfd_alloc (abfd, 32);
586 if (flags & EISD__M_DZRO)
588 else if (flags & EISD__M_EXE)
590 else if (!(flags & EISD__M_WRT))
594 BFD_ASSERT (section_count < 999);
595 sprintf (name, "$%s_%03d$", pfx, section_count++);
598 section = bfd_make_section (abfd, name);
603 section->filepos = vbn ? VMS_BLOCK_SIZE * (vbn - 1) : 0;
604 section->size = size;
605 section->vma = vaddr;
607 if (!bfd_set_section_flags (abfd, section, bfd_flags))
614 /* Read & process EIHS record.
615 Return TRUE on success, FALSE on error. */
618 _bfd_vms_slurp_eihs (bfd *abfd, unsigned int offset)
620 unsigned char *p = PRIV (recrd.rec) + offset;
621 unsigned int gstvbn = bfd_getl32 (p + EIHS__L_GSTVBN);
622 unsigned int gstsize ATTRIBUTE_UNUSED = bfd_getl32 (p + EIHS__L_GSTSIZE);
623 unsigned int dstvbn = bfd_getl32 (p + EIHS__L_DSTVBN);
624 unsigned int dstsize = bfd_getl32 (p + EIHS__L_DSTSIZE);
625 unsigned int dmtvbn = bfd_getl32 (p + EIHS__L_DMTVBN);
626 unsigned int dmtbytes = bfd_getl32 (p + EIHS__L_DMTBYTES);
630 vms_debug (8, "_bfd_vms_slurp_ihs\n");
631 vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
632 gstvbn, gstsize, dstvbn, dstsize, dmtvbn, dmtbytes);
637 flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
639 section = bfd_make_section (abfd, "$DST$");
643 section->size = dstsize;
644 section->filepos = VMS_BLOCK_SIZE * (dstvbn - 1);
646 if (!bfd_set_section_flags (abfd, section, bfd_flags))
649 PRIV (dst_section) = section;
650 abfd->flags |= (HAS_DEBUG | HAS_LINENO);
655 flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
657 section = bfd_make_section (abfd, "$DMT$");
661 section->size = dmtbytes;
662 section->filepos = VMS_BLOCK_SIZE * (dmtvbn - 1);
664 if (!bfd_set_section_flags (abfd, section, bfd_flags))
670 flagword bfd_flags = SEC_HAS_CONTENTS;
672 section = bfd_make_section (abfd, "$GST$");
676 if (bfd_seek (abfd, VMS_BLOCK_SIZE * (gstvbn - 1), SEEK_SET))
678 bfd_set_error (bfd_error_file_truncated);
682 if (_bfd_vms_slurp_object_records (abfd) != TRUE)
685 section->filepos = VMS_BLOCK_SIZE * (gstvbn - 1);
686 section->size = bfd_tell (abfd) - section->filepos;
688 if (!bfd_set_section_flags (abfd, section, bfd_flags))
691 abfd->flags |= HAS_SYMS;
697 /* Object file reading. */
699 /* Object file input functions. */
701 /* Get next record from object file to vms_buf.
702 Set PRIV(buf_size) and return it
704 This is a little tricky since it should be portable.
706 The openVMS object file has 'variable length' which means that
707 read() returns data in chunks of (hopefully) correct and expected
708 size. The linker (and other tools on VMS) depend on that. Unix
709 doesn't know about 'formatted' files, so reading and writing such
710 an object file in a Unix environment is not trivial.
712 With the tool 'file' (available on all VMS FTP sites), one
713 can view and change the attributes of a file. Changing from
714 'variable length' to 'fixed length, 512 bytes' reveals the
715 record size at the first 2 bytes of every record. The same
716 may happen during the transfer of object files from VMS to Unix,
717 at least with UCX, the DEC implementation of TCP/IP.
719 The VMS format repeats the size at bytes 2 & 3 of every record.
721 On the first call (file_format == FF_UNKNOWN) we check if
722 the first and the third byte pair (!) of the record match.
723 If they do it's an object file in an Unix environment or with
724 wrong attributes (FF_FOREIGN), else we should be in a VMS
725 environment where read() returns the record size (FF_NATIVE).
727 Reading is always done in 2 steps:
728 1. first just the record header is read and the size extracted,
729 2. then the read buffer is adjusted and the remaining bytes are
732 All file I/O is done on even file positions. */
734 #define VMS_OBJECT_ADJUSTMENT 2
737 maybe_adjust_record_pointer_for_object (bfd *abfd)
739 /* Set the file format once for all on the first invocation. */
740 if (PRIV (recrd.file_format) == FF_UNKNOWN)
742 if (PRIV (recrd.rec)[0] == PRIV (recrd.rec)[4]
743 && PRIV (recrd.rec)[1] == PRIV (recrd.rec)[5])
744 PRIV (recrd.file_format) = FF_FOREIGN;
746 PRIV (recrd.file_format) = FF_NATIVE;
749 /* The adjustment is needed only in an Unix environment. */
750 if (PRIV (recrd.file_format) == FF_FOREIGN)
751 PRIV (recrd.rec) += VMS_OBJECT_ADJUSTMENT;
754 /* Implement step #1 of the object record reading procedure.
755 Return the record type or -1 on failure. */
758 _bfd_vms_get_object_record (bfd *abfd)
760 unsigned int test_len = 6;
763 vms_debug2 ((8, "_bfd_vms_get_obj_record\n"));
765 /* Skip alignment byte if the current position is odd. */
766 if (PRIV (recrd.file_format) == FF_FOREIGN && (bfd_tell (abfd) & 1))
768 if (bfd_bread (PRIV (recrd.buf), 1, abfd) != 1)
770 bfd_set_error (bfd_error_file_truncated);
775 /* Read the record header */
776 if (bfd_bread (PRIV (recrd.buf), test_len, abfd) != test_len)
778 bfd_set_error (bfd_error_file_truncated);
782 /* Reset the record pointer. */
783 PRIV (recrd.rec) = PRIV (recrd.buf);
784 maybe_adjust_record_pointer_for_object (abfd);
786 if (vms_get_remaining_object_record (abfd, test_len) <= 0)
789 type = bfd_getl16 (PRIV (recrd.rec));
791 vms_debug2 ((8, "_bfd_vms_get_obj_record: rec %p, size %d, type %d\n",
792 PRIV (recrd.rec), PRIV (recrd.rec_size), type));
797 /* Implement step #2 of the object record reading procedure.
798 Return the size of the record or 0 on failure. */
801 vms_get_remaining_object_record (bfd *abfd, int read_so_far)
803 unsigned int to_read;
805 vms_debug2 ((8, "vms_get_remaining_obj_record\n"));
807 /* Extract record size. */
808 PRIV (recrd.rec_size) = bfd_getl16 (PRIV (recrd.rec) + 2);
810 if (PRIV (recrd.rec_size) <= 0)
812 bfd_set_error (bfd_error_file_truncated);
816 /* That's what the linker manual says. */
817 if (PRIV (recrd.rec_size) > EOBJ__C_MAXRECSIZ)
819 bfd_set_error (bfd_error_file_truncated);
823 /* Take into account object adjustment. */
824 to_read = PRIV (recrd.rec_size);
825 if (PRIV (recrd.file_format) == FF_FOREIGN)
826 to_read += VMS_OBJECT_ADJUSTMENT;
828 /* Adjust the buffer. */
829 if (to_read > PRIV (recrd.buf_size))
832 = (unsigned char *) bfd_realloc (PRIV (recrd.buf), to_read);
833 if (PRIV (recrd.buf) == NULL)
835 PRIV (recrd.buf_size) = to_read;
838 /* Read the remaining record. */
839 to_read -= read_so_far;
841 vms_debug2 ((8, "vms_get_remaining_obj_record: to_read %d\n", to_read));
843 if (bfd_bread (PRIV (recrd.buf) + read_so_far, to_read, abfd) != to_read)
845 bfd_set_error (bfd_error_file_truncated);
849 /* Reset the record pointer. */
850 PRIV (recrd.rec) = PRIV (recrd.buf);
851 maybe_adjust_record_pointer_for_object (abfd);
853 vms_debug2 ((8, "vms_get_remaining_obj_record: size %d\n",
854 PRIV (recrd.rec_size)));
856 return PRIV (recrd.rec_size);
859 /* Read and process emh record.
860 Return TRUE on success, FALSE on error. */
863 _bfd_vms_slurp_ehdr (bfd *abfd)
866 unsigned char *vms_rec;
869 vms_rec = PRIV (recrd.rec);
871 vms_debug2 ((2, "HDR/EMH\n"));
873 subtype = bfd_getl16 (vms_rec + 4);
875 vms_debug2 ((3, "subtype %d\n", subtype));
881 PRIV (hdr_data).hdr_b_strlvl = vms_rec[6];
882 PRIV (hdr_data).hdr_l_arch1 = bfd_getl32 (vms_rec + 8);
883 PRIV (hdr_data).hdr_l_arch2 = bfd_getl32 (vms_rec + 12);
884 PRIV (hdr_data).hdr_l_recsiz = bfd_getl32 (vms_rec + 16);
885 PRIV (hdr_data).hdr_t_name = _bfd_vms_save_counted_string (vms_rec + 20);
886 ptr = vms_rec + 20 + vms_rec[20] + 1;
887 PRIV (hdr_data).hdr_t_version =_bfd_vms_save_counted_string (ptr);
889 PRIV (hdr_data).hdr_t_date = _bfd_vms_save_sized_string (ptr, 17);
893 PRIV (hdr_data).hdr_c_lnm =
894 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
898 PRIV (hdr_data).hdr_c_src =
899 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
903 PRIV (hdr_data).hdr_c_ttl =
904 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
913 bfd_set_error (bfd_error_wrong_format);
920 /* Typical sections for evax object files. */
922 #define EVAX_ABS_NAME "$ABS$"
923 #define EVAX_CODE_NAME "$CODE$"
924 #define EVAX_LINK_NAME "$LINK$"
925 #define EVAX_DATA_NAME "$DATA$"
926 #define EVAX_BSS_NAME "$BSS$"
927 #define EVAX_READONLYADDR_NAME "$READONLY_ADDR$"
928 #define EVAX_READONLY_NAME "$READONLY$"
929 #define EVAX_LITERAL_NAME "$LITERAL$"
930 #define EVAX_LITERALS_NAME "$LITERALS"
931 #define EVAX_COMMON_NAME "$COMMON$"
932 #define EVAX_LOCAL_NAME "$LOCAL$"
934 struct sec_flags_struct
936 const char *name; /* Name of section. */
938 flagword flags_always; /* Flags we set always. */
940 flagword flags_hassize; /* Flags we set if the section has a size > 0. */
943 /* These flags are deccrtl/vaxcrtl (openVMS 6.2 Alpha) compatible. */
945 static struct sec_flags_struct evax_section_flags[] =
951 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD) },
953 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_EXE),
955 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_EXE),
956 (SEC_CODE | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD) },
958 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD | EGPS__V_NOMOD),
959 (SEC_DATA | SEC_READONLY),
960 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD),
961 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_READONLY | SEC_LOAD) },
963 (EGPS__V_REL | EGPS__V_RD),
964 (SEC_DATA | SEC_READONLY),
965 (EGPS__V_REL | EGPS__V_RD),
966 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_READONLY | SEC_LOAD) },
968 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD),
970 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT),
971 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD) },
973 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD),
975 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD),
977 { EVAX_READONLYADDR_NAME,
978 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_RD),
979 (SEC_DATA | SEC_READONLY),
980 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_RD),
981 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_READONLY | SEC_LOAD) },
982 { EVAX_READONLY_NAME,
983 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD | EGPS__V_NOMOD),
984 (SEC_DATA | SEC_READONLY),
985 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD),
986 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_READONLY | SEC_LOAD) },
988 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT),
990 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT),
991 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD) },
992 { EVAX_LITERALS_NAME,
993 (EGPS__V_PIC | EGPS__V_OVR),
994 (SEC_DATA | SEC_READONLY),
995 (EGPS__V_PIC | EGPS__V_OVR),
996 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_READONLY | SEC_LOAD) },
998 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT),
1000 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT),
1001 (SEC_IN_MEMORY | SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD) }
1004 /* Retrieve bfd section flags by name and size. */
1007 vms_secflag_by_name (bfd *abfd ATTRIBUTE_UNUSED,
1008 struct sec_flags_struct *section_flags,
1014 while (section_flags[i].name != NULL)
1016 if (strcmp (name, section_flags[i].name) == 0)
1019 return section_flags[i].flags_hassize;
1021 return section_flags[i].flags_always;
1026 return section_flags[i].flags_hassize;
1027 return section_flags[i].flags_always;
1030 /* Retrieve vms section flags by name and size. */
1033 vms_esecflag_by_name (struct sec_flags_struct *section_flags,
1039 while (section_flags[i].name != NULL)
1041 if (strcmp (name, section_flags[i].name) == 0)
1044 return section_flags[i].vflags_hassize;
1046 return section_flags[i].vflags_always;
1051 return section_flags[i].vflags_hassize;
1052 return section_flags[i].vflags_always;
1055 /* Input routines. */
1057 static struct vms_symbol_entry *
1058 add_symbol (bfd *abfd, const unsigned char *ascic)
1060 struct vms_symbol_entry *entry;
1064 entry = (struct vms_symbol_entry *)bfd_zalloc (abfd, sizeof (*entry) + len);
1067 entry->namelen = len;
1068 memcpy (entry->name, ascic, len);
1069 entry->name[len] = 0;
1070 entry->owner = abfd;
1072 if (PRIV (gsd_sym_count) >= PRIV (max_sym_count))
1074 if (PRIV (max_sym_count) == 0)
1076 PRIV (max_sym_count) = 128;
1077 PRIV (syms) = bfd_malloc
1078 (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *));
1082 PRIV (max_sym_count) *= 2;
1083 PRIV (syms) = bfd_realloc
1085 (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *)));
1087 if (PRIV (syms) == NULL)
1091 PRIV (syms)[PRIV (gsd_sym_count)++] = entry;
1095 /* Read and process EGSD. Return FALSE on failure. */
1098 _bfd_vms_slurp_egsd (bfd * abfd)
1100 int gsd_type, gsd_size;
1102 unsigned char *vms_rec;
1103 flagword new_flags, old_flags;
1105 unsigned long base_addr;
1106 unsigned long align_addr;
1108 vms_debug2 ((2, "EGSD\n"));
1110 PRIV (recrd.rec) += 8; /* Skip type, size, align pad. */
1111 PRIV (recrd.rec_size) -= 8;
1113 /* Calculate base address for each section. */
1116 while (PRIV (recrd.rec_size) > 0)
1118 vms_rec = PRIV (recrd.rec);
1120 gsd_type = bfd_getl16 (vms_rec);
1121 gsd_size = bfd_getl16 (vms_rec + 2);
1123 vms_debug2 ((3, "egsd_type %d\n", gsd_type));
1129 /* Program section definition. */
1130 struct vms_egps *egps = (struct vms_egps *)vms_rec;
1131 name = _bfd_vms_save_counted_string (&egps->namlng);
1132 section = bfd_make_section (abfd, name);
1135 old_flags = bfd_getl16 (egps->flags);
1136 vms_section_data (section)->flags = old_flags;
1137 vms_section_data (section)->no_flags = 0;
1138 section->size = bfd_getl32 (egps->alloc);
1139 new_flags = vms_secflag_by_name (abfd, evax_section_flags, name,
1141 if (!(old_flags & EGPS__V_NOMOD))
1143 new_flags |= SEC_HAS_CONTENTS;
1144 if (old_flags & EGPS__V_REL)
1145 new_flags |= SEC_RELOC;
1147 if (!bfd_set_section_flags (abfd, section, new_flags))
1149 section->alignment_power = egps->align;
1150 align_addr = (1 << section->alignment_power);
1151 if ((base_addr % align_addr) != 0)
1152 base_addr += (align_addr - (base_addr % align_addr));
1153 section->vma = (bfd_vma)base_addr;
1154 base_addr += section->size;
1155 section->filepos = (unsigned int)-1;
1157 vms_debug (4, "EGSD P-section %d (%s, flags %04x) ",
1158 section->index, name, old_flags);
1159 vms_debug (4, "%lu bytes at 0x%08lx (mem %p)\n",
1160 (unsigned long)section->size,
1161 (unsigned long)section->vma, section->contents);
1169 struct vms_symbol_entry *entry;
1170 struct vms_egsy *egsy = (struct vms_egsy *) vms_rec;
1172 old_flags = bfd_getl16 (egsy->flags);
1173 if (old_flags & EGSY__V_DEF)
1174 nameoff = ESDF__B_NAMLNG;
1176 nameoff = ESRF__B_NAMLNG;
1178 entry = add_symbol (abfd, vms_rec + nameoff);
1182 /* Allow only duplicate reference. */
1183 if ((entry->flags & EGSY__V_DEF) && (old_flags & EGSY__V_DEF))
1186 if (entry->typ == 0)
1188 entry->typ = gsd_type;
1189 entry->data_type = egsy->datyp;
1190 entry->flags = old_flags;
1193 if (old_flags & EGSY__V_DEF)
1195 struct vms_esdf *esdf = (struct vms_esdf *)vms_rec;
1197 entry->value = bfd_getl64 (esdf->value);
1198 entry->section = bfd_getl32 (esdf->psindx);
1200 if (old_flags & EGSY__V_NORM)
1202 PRIV (norm_sym_count)++;
1204 entry->code_value = bfd_getl64 (esdf->code_address);
1205 entry->code_section = bfd_getl32 (esdf->ca_psindx);
1214 struct vms_symbol_entry *entry;
1215 struct vms_egst *egst = (struct vms_egst *)vms_rec;
1217 old_flags = bfd_getl16 (egst->header.flags);
1218 if (old_flags & EGSY__V_DEF)
1219 nameoff = ESDF__B_NAMLNG;
1221 nameoff = ESRF__B_NAMLNG;
1223 entry = add_symbol (abfd, &egst->namlng);
1228 entry->typ = gsd_type;
1229 entry->data_type = egst->header.datyp;
1230 entry->flags = old_flags;
1232 entry->symbol_vector = bfd_getl32 (egst->value);
1234 entry->section = bfd_getl32 (egst->psindx);
1235 entry->value = bfd_getl64 (egst->lp_2);
1237 if (old_flags & EGSY__V_NORM)
1239 PRIV (norm_sym_count)++;
1241 entry->code_value = bfd_getl64 (egst->lp_1);
1242 entry->code_section = 0;
1249 /* Currently ignored. */
1254 (*_bfd_error_handler) (_("Unknown EGSD subtype %d"), gsd_type);
1255 bfd_set_error (bfd_error_bad_value);
1259 PRIV (recrd.rec_size) -= gsd_size;
1260 PRIV (recrd.rec) += gsd_size;
1263 if (PRIV (gsd_sym_count) > 0)
1264 abfd->flags |= HAS_SYMS;
1269 /* Stack routines for vms ETIR commands. */
1271 /* Push value and section index. */
1274 _bfd_vms_push (bfd *abfd, bfd_vma val, unsigned int reloc)
1276 vms_debug2 ((4, "<push %08lx (0x%08x) at %d>\n",
1277 (unsigned long)val, reloc, PRIV (stackptr)));
1279 PRIV (stack[PRIV (stackptr)]).value = val;
1280 PRIV (stack[PRIV (stackptr)]).reloc = reloc;
1282 if (PRIV (stackptr) >= STACKSIZE)
1284 bfd_set_error (bfd_error_bad_value);
1285 (*_bfd_error_handler) (_("Stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr));
1290 /* Pop value and section index. */
1293 _bfd_vms_pop (bfd *abfd, bfd_vma *val, unsigned int *rel)
1295 if (PRIV (stackptr) == 0)
1297 bfd_set_error (bfd_error_bad_value);
1298 (*_bfd_error_handler) (_("Stack underflow in _bfd_vms_pop"));
1302 *val = PRIV (stack[PRIV (stackptr)]).value;
1303 *rel = PRIV (stack[PRIV (stackptr)]).reloc;
1305 vms_debug2 ((4, "<pop %08lx (0x%08x)>\n", (unsigned long)*val, *rel));
1308 /* Routines to fill sections contents during tir/etir read. */
1310 /* Initialize image buffer pointer to be filled. */
1313 image_set_ptr (bfd *abfd, bfd_vma vma, int sect, struct bfd_link_info *info)
1317 vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma, sect));
1319 sec = PRIV (sections)[sect];
1323 /* Reading contents to an output bfd. */
1325 if (sec->output_section == NULL)
1327 /* Section discarded. */
1328 vms_debug2 ((5, " section %s discarded\n", sec->name));
1330 /* This is not used. */
1331 PRIV (image_section) = NULL;
1332 PRIV (image_offset) = 0;
1335 PRIV (image_offset) = sec->output_offset + vma;
1336 PRIV (image_section) = sec->output_section;
1340 PRIV (image_offset) = vma;
1341 PRIV (image_section) = sec;
1345 /* Increment image buffer pointer by offset. */
1348 image_inc_ptr (bfd *abfd, bfd_vma offset)
1350 vms_debug2 ((4, "image_inc_ptr (%u)\n", (unsigned)offset));
1352 PRIV (image_offset) += offset;
1355 /* Save current DST location counter under specified index. */
1358 dst_define_location (bfd *abfd, unsigned int loc)
1360 vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc));
1362 /* Grow the ptr offset table if necessary. */
1363 if (loc + 1 > PRIV (dst_ptr_offsets_count))
1365 PRIV (dst_ptr_offsets) = bfd_realloc (PRIV (dst_ptr_offsets),
1366 (loc + 1) * sizeof (unsigned int));
1367 PRIV (dst_ptr_offsets_count) = loc + 1;
1370 PRIV (dst_ptr_offsets)[loc] = PRIV (image_offset);
1373 /* Restore saved DST location counter from specified index. */
1376 dst_restore_location (bfd *abfd, unsigned int loc)
1378 vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc));
1380 PRIV (image_offset) = PRIV (dst_ptr_offsets)[loc];
1383 /* Retrieve saved DST location counter from specified index. */
1386 dst_retrieve_location (bfd *abfd, unsigned int loc)
1388 vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int)loc));
1390 return PRIV (dst_ptr_offsets)[loc];
1393 /* Write multiple bytes to section image. */
1396 image_write (bfd *abfd, unsigned char *ptr, int size)
1399 _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr, size,
1400 (long)PRIV (image_offset));
1401 _bfd_hexdump (9, ptr, size, 0);
1404 if (PRIV (image_section)->contents != NULL)
1406 asection *sec = PRIV (image_section);
1407 file_ptr off = PRIV (image_offset);
1410 if (off > (file_ptr)sec->size
1411 || size > (file_ptr)sec->size
1412 || off + size > (file_ptr)sec->size)
1414 bfd_set_error (bfd_error_bad_value);
1418 memcpy (sec->contents + off, ptr, size);
1421 PRIV (image_offset) += size;
1425 /* Write byte to section image. */
1428 image_write_b (bfd * abfd, unsigned int value)
1430 unsigned char data[1];
1432 vms_debug2 ((6, "image_write_b (%02x)\n", (int) value));
1436 return image_write (abfd, data, sizeof (data));
1439 /* Write 2-byte word to image. */
1442 image_write_w (bfd * abfd, unsigned int value)
1444 unsigned char data[2];
1446 vms_debug2 ((6, "image_write_w (%04x)\n", (int) value));
1448 bfd_putl16 (value, data);
1449 return image_write (abfd, data, sizeof (data));
1452 /* Write 4-byte long to image. */
1455 image_write_l (bfd * abfd, unsigned long value)
1457 unsigned char data[4];
1459 vms_debug2 ((6, "image_write_l (%08lx)\n", value));
1461 bfd_putl32 (value, data);
1462 return image_write (abfd, data, sizeof (data));
1465 /* Write 8-byte quad to image. */
1468 image_write_q (bfd * abfd, bfd_vma value)
1470 unsigned char data[8];
1472 vms_debug2 ((6, "image_write_q (%08lx)\n", (unsigned long)value));
1474 bfd_putl64 (value, data);
1475 return image_write (abfd, data, sizeof (data));
1479 _bfd_vms_etir_name (int cmd)
1483 case ETIR__C_STA_GBL: return "ETIR__C_STA_GBL";
1484 case ETIR__C_STA_LW: return "ETIR__C_STA_LW";
1485 case ETIR__C_STA_QW: return "ETIR__C_STA_QW";
1486 case ETIR__C_STA_PQ: return "ETIR__C_STA_PQ";
1487 case ETIR__C_STA_LI: return "ETIR__C_STA_LI";
1488 case ETIR__C_STA_MOD: return "ETIR__C_STA_MOD";
1489 case ETIR__C_STA_CKARG: return "ETIR__C_STA_CKARG";
1490 case ETIR__C_STO_B: return "ETIR__C_STO_B";
1491 case ETIR__C_STO_W: return "ETIR__C_STO_W";
1492 case ETIR__C_STO_GBL: return "ETIR__C_STO_GBL";
1493 case ETIR__C_STO_CA: return "ETIR__C_STO_CA";
1494 case ETIR__C_STO_RB: return "ETIR__C_STO_RB";
1495 case ETIR__C_STO_AB: return "ETIR__C_STO_AB";
1496 case ETIR__C_STO_OFF: return "ETIR__C_STO_OFF";
1497 case ETIR__C_STO_IMM: return "ETIR__C_STO_IMM";
1498 case ETIR__C_STO_IMMR: return "ETIR__C_STO_IMMR";
1499 case ETIR__C_STO_LW: return "ETIR__C_STO_LW";
1500 case ETIR__C_STO_QW: return "ETIR__C_STO_QW";
1501 case ETIR__C_STO_GBL_LW: return "ETIR__C_STO_GBL_LW";
1502 case ETIR__C_STO_LP_PSB: return "ETIR__C_STO_LP_PSB";
1503 case ETIR__C_STO_HINT_GBL: return "ETIR__C_STO_HINT_GBL";
1504 case ETIR__C_STO_HINT_PS: return "ETIR__C_STO_HINT_PS";
1505 case ETIR__C_OPR_ADD: return "ETIR__C_OPR_ADD";
1506 case ETIR__C_OPR_SUB: return "ETIR__C_OPR_SUB";
1507 case ETIR__C_OPR_INSV: return "ETIR__C_OPR_INSV";
1508 case ETIR__C_OPR_USH: return "ETIR__C_OPR_USH";
1509 case ETIR__C_OPR_ROT: return "ETIR__C_OPR_ROT";
1510 case ETIR__C_OPR_REDEF: return "ETIR__C_OPR_REDEF";
1511 case ETIR__C_OPR_DFLIT: return "ETIR__C_OPR_DFLIT";
1512 case ETIR__C_STC_LP: return "ETIR__C_STC_LP";
1513 case ETIR__C_STC_GBL: return "ETIR__C_STC_GBL";
1514 case ETIR__C_STC_GCA: return "ETIR__C_STC_GCA";
1515 case ETIR__C_STC_PS: return "ETIR__C_STC_PS";
1516 case ETIR__C_STC_NBH_PS: return "ETIR__C_STC_NBH_PS";
1517 case ETIR__C_STC_NOP_GBL: return "ETIR__C_STC_NOP_GBL";
1518 case ETIR__C_STC_NOP_PS: return "ETIR__C_STC_NOP_PS";
1519 case ETIR__C_STC_BSR_GBL: return "ETIR__C_STC_BSR_GBL";
1520 case ETIR__C_STC_BSR_PS: return "ETIR__C_STC_BSR_PS";
1521 case ETIR__C_STC_LDA_GBL: return "ETIR__C_STC_LDA_GBL";
1522 case ETIR__C_STC_LDA_PS: return "ETIR__C_STC_LDA_PS";
1523 case ETIR__C_STC_BOH_GBL: return "ETIR__C_STC_BOH_GBL";
1524 case ETIR__C_STC_BOH_PS: return "ETIR__C_STC_BOH_PS";
1525 case ETIR__C_STC_NBH_GBL: return "ETIR__C_STC_NBH_GBL";
1526 case ETIR__C_STC_LP_PSB: return "ETIR__C_STC_LP_PSB";
1527 case ETIR__C_CTL_SETRB: return "ETIR__C_CTL_SETRB";
1528 case ETIR__C_CTL_AUGRB: return "ETIR__C_CTL_AUGRB";
1529 case ETIR__C_CTL_DFLOC: return "ETIR__C_CTL_DFLOC";
1530 case ETIR__C_CTL_STLOC: return "ETIR__C_CTL_STLOC";
1531 case ETIR__C_CTL_STKDL: return "ETIR__C_CTL_STKDL";
1534 /* These names have not yet been added to this switch statement. */
1535 (*_bfd_error_handler) (_("unknown ETIR command %d"), cmd);
1540 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
1543 _bfd_vms_get_value (bfd *abfd, const unsigned char *ascic,
1544 struct bfd_link_info *info,
1546 struct alpha_vms_link_hash_entry **hp)
1551 struct alpha_vms_link_hash_entry *h;
1553 /* Not linking. Do not try to resolve the symbol. */
1562 for (i = 0; i < len; i++)
1563 name[i] = ascic[i + 1];
1566 h = (struct alpha_vms_link_hash_entry *)
1567 bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
1572 && (h->root.type == bfd_link_hash_defined
1573 || h->root.type == bfd_link_hash_defweak))
1574 *vma = h->root.u.def.value
1575 + h->root.u.def.section->output_offset
1576 + h->root.u.def.section->output_section->vma;
1577 else if (h && h->root.type == bfd_link_hash_undefweak)
1581 if (!(*info->callbacks->undefined_symbol)
1582 (info, name, abfd, PRIV (image_section), PRIV (image_offset), TRUE))
1590 #define RELC_SHR_BASE 0x10000
1591 #define RELC_SEC_BASE 0x20000
1592 #define RELC_MASK 0x0ffff
1595 alpha_vms_sym_to_ctxt (struct alpha_vms_link_hash_entry *h)
1597 /* Handle undefined symbols. */
1598 if (h == NULL || h->sym == NULL)
1601 if (h->sym->typ == EGSD__C_SYMG)
1603 if (h->sym->flags & EGSY__V_REL)
1604 return RELC_SHR_BASE + PRIV2 (h->sym->owner, shr_index);
1607 /* Can this happen ? I'd like to see an example. */
1611 if (h->sym->typ == EGSD__C_SYM)
1613 if (h->sym->flags & EGSY__V_REL)
1622 alpha_vms_get_sym_value (unsigned int sect, bfd_vma addr,
1623 struct alpha_vms_link_hash_entry *h)
1627 BFD_ASSERT (h && (h->root.type == bfd_link_hash_defined
1628 || h->root.type == bfd_link_hash_defweak));
1630 s = PRIV2 (h->root.u.def.section->owner, sections)[sect];
1631 return s->output_section->vma + s->output_offset + addr;
1635 alpha_vms_fix_sec_rel (bfd *abfd, struct bfd_link_info *info,
1636 unsigned int rel, bfd_vma vma)
1638 asection *sec = PRIV (sections)[rel & RELC_MASK];
1642 if (sec->output_section == NULL)
1644 return vma + sec->output_section->vma + sec->output_offset;
1647 return vma + sec->vma;
1650 /* Read an ETIR record from ABFD. If INFO is not null, put the content into
1651 the output section (used during linking).
1652 Return FALSE in case of error. */
1655 _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info)
1658 unsigned int length;
1659 unsigned char *maxptr;
1664 struct alpha_vms_link_hash_entry *h;
1666 PRIV (recrd.rec) += ETIR__C_HEADER_SIZE;
1667 PRIV (recrd.rec_size) -= ETIR__C_HEADER_SIZE;
1669 ptr = PRIV (recrd.rec);
1670 length = PRIV (recrd.rec_size);
1671 maxptr = ptr + length;
1673 vms_debug2 ((2, "ETIR: %d bytes\n", length));
1675 while (ptr < maxptr)
1677 int cmd = bfd_getl16 (ptr);
1678 int cmd_length = bfd_getl16 (ptr + 2);
1683 _bfd_vms_debug (4, "etir: %s(%d)\n",
1684 _bfd_vms_etir_name (cmd), cmd);
1685 _bfd_hexdump (8, ptr, cmd_length - 4, (long) ptr);
1693 stack 32 bit value of symbol (high bits set to 0). */
1694 case ETIR__C_STA_GBL:
1695 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1696 _bfd_vms_push (abfd, op1, alpha_vms_sym_to_ctxt (h));
1702 stack 32 bit value, sign extend to 64 bit. */
1703 case ETIR__C_STA_LW:
1704 _bfd_vms_push (abfd, bfd_getl32 (ptr), RELC_NONE);
1710 stack 64 bit value of symbol. */
1711 case ETIR__C_STA_QW:
1712 _bfd_vms_push (abfd, bfd_getl64 (ptr), RELC_NONE);
1715 /* Stack psect base plus quadword offset
1716 arg: lw section index
1717 qw signed quadword offset (low 32 bits)
1719 Stack qw argument and section index
1720 (see ETIR__C_STO_OFF, ETIR__C_CTL_SETRB). */
1721 case ETIR__C_STA_PQ:
1725 psect = bfd_getl32 (ptr);
1726 if ((unsigned int) psect >= PRIV (section_count))
1728 (*_bfd_error_handler) (_("bad section index in %s"),
1729 _bfd_vms_etir_name (cmd));
1730 bfd_set_error (bfd_error_bad_value);
1733 op1 = bfd_getl64 (ptr + 4);
1734 _bfd_vms_push (abfd, op1, psect | RELC_SEC_BASE);
1738 case ETIR__C_STA_LI:
1739 case ETIR__C_STA_MOD:
1740 case ETIR__C_STA_CKARG:
1741 (*_bfd_error_handler) (_("unsupported STA cmd %s"),
1742 _bfd_vms_etir_name (cmd));
1746 /* Store byte: pop stack, write byte
1749 _bfd_vms_pop (abfd, &op1, &rel1);
1750 if (rel1 != RELC_NONE)
1752 image_write_b (abfd, (unsigned int) op1 & 0xff);
1755 /* Store word: pop stack, write word
1758 _bfd_vms_pop (abfd, &op1, &rel1);
1759 if (rel1 != RELC_NONE)
1761 image_write_w (abfd, (unsigned int) op1 & 0xffff);
1764 /* Store longword: pop stack, write longword
1766 case ETIR__C_STO_LW:
1767 _bfd_vms_pop (abfd, &op1, &rel1);
1768 if (rel1 & RELC_SEC_BASE)
1770 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1773 else if (rel1 & RELC_SHR_BASE)
1775 alpha_vms_add_lw_fixup (info, rel1 & RELC_MASK, op1);
1778 if (rel1 != RELC_NONE)
1780 if (rel1 != RELC_REL)
1782 alpha_vms_add_lw_reloc (info);
1784 image_write_l (abfd, op1);
1787 /* Store quadword: pop stack, write quadword
1789 case ETIR__C_STO_QW:
1790 _bfd_vms_pop (abfd, &op1, &rel1);
1791 if (rel1 & RELC_SEC_BASE)
1793 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1796 else if (rel1 & RELC_SHR_BASE)
1798 if (rel1 != RELC_NONE)
1800 if (rel1 != RELC_REL)
1802 alpha_vms_add_qw_reloc (info);
1804 image_write_q (abfd, op1);
1807 /* Store immediate repeated: pop stack for repeat count
1810 case ETIR__C_STO_IMMR:
1814 size = bfd_getl32 (ptr);
1815 _bfd_vms_pop (abfd, &op1, &rel1);
1816 if (rel1 != RELC_NONE)
1819 image_write (abfd, ptr + 4, size);
1823 /* Store global: write symbol value
1824 arg: cs global symbol name. */
1825 case ETIR__C_STO_GBL:
1826 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1829 if (h->sym->typ == EGSD__C_SYMG)
1831 alpha_vms_add_fixup_qr
1832 (info, abfd, h->sym->owner, h->sym->symbol_vector);
1837 op1 = alpha_vms_get_sym_value (h->sym->section,
1839 alpha_vms_add_qw_reloc (info);
1842 image_write_q (abfd, op1);
1845 /* Store code address: write address of entry point
1846 arg: cs global symbol name (procedure). */
1847 case ETIR__C_STO_CA:
1848 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1851 if (h->sym->flags & EGSY__V_NORM)
1853 /* That's really a procedure. */
1854 if (h->sym->typ == EGSD__C_SYMG)
1856 alpha_vms_add_fixup_ca (info, abfd, h->sym->owner);
1857 op1 = h->sym->symbol_vector;
1861 op1 = alpha_vms_get_sym_value (h->sym->code_section,
1862 h->sym->code_value, h);
1863 alpha_vms_add_qw_reloc (info);
1868 /* Symbol is not a procedure. */
1872 image_write_q (abfd, op1);
1875 /* Store offset to psect: pop stack, add low 32 bits to base of psect
1877 case ETIR__C_STO_OFF:
1878 _bfd_vms_pop (abfd, &op1, &rel1);
1880 if (!(rel1 & RELC_SEC_BASE))
1883 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1885 image_write_q (abfd, op1);
1889 arg: lw count of bytes
1891 case ETIR__C_STO_IMM:
1895 size = bfd_getl32 (ptr);
1896 image_write (abfd, ptr + 4, size);
1900 /* This code is 'reserved to digital' according to the openVMS
1901 linker manual, however it is generated by the DEC C compiler
1902 and defined in the include file.
1903 FIXME, since the following is just a guess
1904 store global longword: store 32bit value of symbol
1905 arg: cs symbol name. */
1906 case ETIR__C_STO_GBL_LW:
1907 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1911 image_write_l (abfd, op1);
1914 case ETIR__C_STO_RB:
1915 case ETIR__C_STO_AB:
1916 case ETIR__C_STO_LP_PSB:
1917 (*_bfd_error_handler) (_("%s: not supported"),
1918 _bfd_vms_etir_name (cmd));
1921 case ETIR__C_STO_HINT_GBL:
1922 case ETIR__C_STO_HINT_PS:
1923 (*_bfd_error_handler) (_("%s: not implemented"),
1924 _bfd_vms_etir_name (cmd));
1928 /* 200 Store-conditional Linkage Pair
1930 case ETIR__C_STC_LP:
1932 /* 202 Store-conditional Address at global address
1936 case ETIR__C_STC_GBL:
1938 /* 203 Store-conditional Code Address at global address
1940 cs procedure name. */
1941 case ETIR__C_STC_GCA:
1943 /* 204 Store-conditional Address at psect + offset
1947 case ETIR__C_STC_PS:
1948 (*_bfd_error_handler) (_("%s: not supported"),
1949 _bfd_vms_etir_name (cmd));
1953 /* 201 Store-conditional Linkage Pair with Procedure Signature
1959 case ETIR__C_STC_LP_PSB:
1960 _bfd_vms_get_value (abfd, ptr + 4, info, &op1, &h);
1963 if (h->sym->typ == EGSD__C_SYMG)
1965 alpha_vms_add_fixup_lp (info, abfd, h->sym->owner);
1966 op1 = h->sym->symbol_vector;
1971 op1 = alpha_vms_get_sym_value (h->sym->code_section,
1972 h->sym->code_value, h);
1973 op2 = alpha_vms_get_sym_value (h->sym->section,
1979 /* Undefined symbol. */
1983 image_write_q (abfd, op1);
1984 image_write_q (abfd, op2);
1987 /* 205 Store-conditional NOP at address of global
1989 case ETIR__C_STC_NOP_GBL:
1992 /* 207 Store-conditional BSR at global address
1995 case ETIR__C_STC_BSR_GBL:
1998 /* 209 Store-conditional LDA at global address
2001 case ETIR__C_STC_LDA_GBL:
2004 /* 211 Store-conditional BSR or Hint at global address
2007 case ETIR__C_STC_BOH_GBL:
2008 /* Currentl ignored. */
2011 /* 213 Store-conditional NOP,BSR or HINT at global address
2014 case ETIR__C_STC_NBH_GBL:
2016 /* 206 Store-conditional NOP at pect + offset
2019 case ETIR__C_STC_NOP_PS:
2021 /* 208 Store-conditional BSR at pect + offset
2024 case ETIR__C_STC_BSR_PS:
2026 /* 210 Store-conditional LDA at psect + offset
2029 case ETIR__C_STC_LDA_PS:
2031 /* 212 Store-conditional BSR or Hint at pect + offset
2034 case ETIR__C_STC_BOH_PS:
2036 /* 214 Store-conditional NOP, BSR or HINT at psect + offset
2038 case ETIR__C_STC_NBH_PS:
2039 (*_bfd_error_handler) ("%s: not supported",
2040 _bfd_vms_etir_name (cmd));
2044 /* Det relocation base: pop stack, set image location counter
2046 case ETIR__C_CTL_SETRB:
2047 _bfd_vms_pop (abfd, &op1, &rel1);
2048 if (!(rel1 & RELC_SEC_BASE))
2050 image_set_ptr (abfd, op1, rel1 & RELC_MASK, info);
2053 /* Augment relocation base: increment image location counter by offset
2054 arg: lw offset value. */
2055 case ETIR__C_CTL_AUGRB:
2056 op1 = bfd_getl32 (ptr);
2057 image_inc_ptr (abfd, op1);
2060 /* Define location: pop index, save location counter under index
2062 case ETIR__C_CTL_DFLOC:
2063 _bfd_vms_pop (abfd, &op1, &rel1);
2064 if (rel1 != RELC_NONE)
2066 dst_define_location (abfd, op1);
2069 /* Set location: pop index, restore location counter from index
2071 case ETIR__C_CTL_STLOC:
2072 _bfd_vms_pop (abfd, &op1, &rel1);
2073 if (rel1 != RELC_NONE)
2075 dst_restore_location (abfd, op1);
2078 /* Stack defined location: pop index, push location counter from index
2080 case ETIR__C_CTL_STKDL:
2081 _bfd_vms_pop (abfd, &op1, &rel1);
2082 if (rel1 != RELC_NONE)
2084 _bfd_vms_push (abfd, dst_retrieve_location (abfd, op1), RELC_NONE);
2087 case ETIR__C_OPR_NOP: /* No-op. */
2090 case ETIR__C_OPR_ADD: /* Add. */
2091 _bfd_vms_pop (abfd, &op1, &rel1);
2092 _bfd_vms_pop (abfd, &op2, &rel2);
2093 if (rel1 == RELC_NONE && rel2 != RELC_NONE)
2095 else if (rel1 != RELC_NONE && rel2 != RELC_NONE)
2097 _bfd_vms_push (abfd, op1 + op2, rel1);
2100 case ETIR__C_OPR_SUB: /* Subtract. */
2101 _bfd_vms_pop (abfd, &op1, &rel1);
2102 _bfd_vms_pop (abfd, &op2, &rel2);
2103 if (rel1 == RELC_NONE && rel2 != RELC_NONE)
2105 else if ((rel1 & RELC_SEC_BASE) && (rel2 & RELC_SEC_BASE))
2107 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
2108 op2 = alpha_vms_fix_sec_rel (abfd, info, rel2, op2);
2111 else if (rel1 != RELC_NONE && rel2 != RELC_NONE)
2113 _bfd_vms_push (abfd, op2 - op1, rel1);
2116 case ETIR__C_OPR_MUL: /* Multiply. */
2117 _bfd_vms_pop (abfd, &op1, &rel1);
2118 _bfd_vms_pop (abfd, &op2, &rel2);
2119 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2121 _bfd_vms_push (abfd, op1 * op2, RELC_NONE);
2124 case ETIR__C_OPR_DIV: /* Divide. */
2125 _bfd_vms_pop (abfd, &op1, &rel1);
2126 _bfd_vms_pop (abfd, &op2, &rel2);
2127 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2130 _bfd_vms_push (abfd, 0, RELC_NONE);
2132 _bfd_vms_push (abfd, op2 / op1, RELC_NONE);
2135 case ETIR__C_OPR_AND: /* Logical AND. */
2136 _bfd_vms_pop (abfd, &op1, &rel1);
2137 _bfd_vms_pop (abfd, &op2, &rel2);
2138 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2140 _bfd_vms_push (abfd, op1 & op2, RELC_NONE);
2143 case ETIR__C_OPR_IOR: /* Logical inclusive OR. */
2144 _bfd_vms_pop (abfd, &op1, &rel1);
2145 _bfd_vms_pop (abfd, &op2, &rel2);
2146 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2148 _bfd_vms_push (abfd, op1 | op2, RELC_NONE);
2151 case ETIR__C_OPR_EOR: /* Logical exclusive OR. */
2152 _bfd_vms_pop (abfd, &op1, &rel1);
2153 _bfd_vms_pop (abfd, &op2, &rel2);
2154 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2156 _bfd_vms_push (abfd, op1 ^ op2, RELC_NONE);
2159 case ETIR__C_OPR_NEG: /* Negate. */
2160 _bfd_vms_pop (abfd, &op1, &rel1);
2161 if (rel1 != RELC_NONE)
2163 _bfd_vms_push (abfd, -op1, RELC_NONE);
2166 case ETIR__C_OPR_COM: /* Complement. */
2167 _bfd_vms_pop (abfd, &op1, &rel1);
2168 if (rel1 != RELC_NONE)
2170 _bfd_vms_push (abfd, ~op1, RELC_NONE);
2173 case ETIR__C_OPR_ASH: /* Arithmetic shift. */
2174 _bfd_vms_pop (abfd, &op1, &rel1);
2175 _bfd_vms_pop (abfd, &op2, &rel2);
2176 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2179 (*_bfd_error_handler) (_("invalid use of %s with contexts"),
2180 _bfd_vms_etir_name (cmd));
2183 if ((int)op2 < 0) /* Shift right. */
2185 else /* Shift left. */
2187 _bfd_vms_push (abfd, op1, RELC_NONE); /* FIXME: sym. */
2190 case ETIR__C_OPR_INSV: /* Insert field. */
2191 case ETIR__C_OPR_USH: /* Unsigned shift. */
2192 case ETIR__C_OPR_ROT: /* Rotate. */
2193 case ETIR__C_OPR_REDEF: /* Redefine symbol to current location. */
2194 case ETIR__C_OPR_DFLIT: /* Define a literal. */
2195 (*_bfd_error_handler) (_("%s: not supported"),
2196 _bfd_vms_etir_name (cmd));
2200 case ETIR__C_OPR_SEL: /* Select. */
2201 _bfd_vms_pop (abfd, &op1, &rel1);
2203 _bfd_vms_pop (abfd, &op1, &rel1);
2206 _bfd_vms_pop (abfd, &op1, &rel1);
2207 _bfd_vms_pop (abfd, &op2, &rel2);
2208 _bfd_vms_push (abfd, op1, rel1);
2213 (*_bfd_error_handler) (_("reserved cmd %d"), cmd);
2218 ptr += cmd_length - 4;
2224 /* Process EDBG/ETBT record.
2225 Return TRUE on success, FALSE on error */
2228 vms_slurp_debug (bfd *abfd)
2230 asection *section = PRIV (dst_section);
2232 if (section == NULL)
2234 /* We have no way to find out beforehand how much debug info there
2235 is in an object file, so pick an initial amount and grow it as
2237 flagword flags = SEC_HAS_CONTENTS | SEC_DEBUGGING | SEC_RELOC
2240 section = bfd_make_section (abfd, "$DST$");
2243 if (!bfd_set_section_flags (abfd, section, flags))
2245 PRIV (dst_section) = section;
2248 PRIV (image_section) = section;
2249 PRIV (image_offset) = section->size;
2251 if (!_bfd_vms_slurp_etir (abfd, NULL))
2254 section->size = PRIV (image_offset);
2258 /* Process EDBG record.
2259 Return TRUE on success, FALSE on error. */
2262 _bfd_vms_slurp_edbg (bfd *abfd)
2264 vms_debug2 ((2, "EDBG\n"));
2266 abfd->flags |= HAS_DEBUG | HAS_LINENO;
2268 return vms_slurp_debug (abfd);
2271 /* Process ETBT record.
2272 Return TRUE on success, FALSE on error. */
2275 _bfd_vms_slurp_etbt (bfd *abfd)
2277 vms_debug2 ((2, "ETBT\n"));
2279 abfd->flags |= HAS_LINENO;
2281 return vms_slurp_debug (abfd);
2284 /* Process EEOM record.
2285 Return TRUE on success, FALSE on error. */
2288 _bfd_vms_slurp_eeom (bfd *abfd)
2290 struct vms_eeom *eeom = (struct vms_eeom *) PRIV (recrd.rec);
2292 vms_debug2 ((2, "EEOM\n"));
2294 PRIV (eom_data).eom_l_total_lps = bfd_getl32 (eeom->total_lps);
2295 PRIV (eom_data).eom_w_comcod = bfd_getl16 (eeom->comcod);
2296 if (PRIV (eom_data).eom_w_comcod > 1)
2298 (*_bfd_error_handler) (_("Object module NOT error-free !\n"));
2299 bfd_set_error (bfd_error_bad_value);
2303 PRIV (eom_data).eom_has_transfer = FALSE;
2304 if (PRIV (recrd.rec_size) > 10)
2306 PRIV (eom_data).eom_has_transfer = TRUE;
2307 PRIV (eom_data).eom_b_tfrflg = eeom->tfrflg;
2308 PRIV (eom_data).eom_l_psindx = bfd_getl32 (eeom->psindx);
2309 PRIV (eom_data).eom_l_tfradr = bfd_getl32 (eeom->tfradr);
2311 abfd->start_address = PRIV (eom_data).eom_l_tfradr;
2316 /* Slurp an ordered set of VMS object records. Return FALSE on error. */
2319 _bfd_vms_slurp_object_records (bfd * abfd)
2326 vms_debug2 ((7, "reading at %08lx\n", (unsigned long)bfd_tell (abfd)));
2328 type = _bfd_vms_get_object_record (abfd);
2331 vms_debug2 ((2, "next_record failed\n"));
2338 err = _bfd_vms_slurp_ehdr (abfd);
2341 err = _bfd_vms_slurp_eeom (abfd);
2344 err = _bfd_vms_slurp_egsd (abfd);
2347 err = TRUE; /* _bfd_vms_slurp_etir (abfd); */
2350 err = _bfd_vms_slurp_edbg (abfd);
2353 err = _bfd_vms_slurp_etbt (abfd);
2360 vms_debug2 ((2, "slurp type %d failed\n", type));
2364 while (type != EOBJ__C_EEOM);
2369 /* Initialize private data */
2371 vms_initialize (bfd * abfd)
2375 amt = sizeof (struct vms_private_data_struct);
2376 abfd->tdata.any = bfd_zalloc (abfd, amt);
2377 if (abfd->tdata.any == NULL)
2380 PRIV (recrd.file_format) = FF_UNKNOWN;
2382 amt = sizeof (struct stack_struct) * STACKSIZE;
2383 PRIV (stack) = bfd_alloc (abfd, amt);
2384 if (PRIV (stack) == NULL)
2390 bfd_release (abfd, abfd->tdata.any);
2391 abfd->tdata.any = NULL;
2395 /* Check the format for a file being read.
2396 Return a (bfd_target *) if it's an object file or zero if not. */
2398 static const struct bfd_target *
2399 alpha_vms_object_p (bfd *abfd)
2401 PTR tdata_save = abfd->tdata.any;
2402 unsigned int test_len;
2405 vms_debug2 ((1, "vms_object_p(%p)\n", abfd));
2407 /* Allocate alpha-vms specific data. */
2408 if (!vms_initialize (abfd))
2411 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET))
2412 goto err_wrong_format;
2414 /* The first challenge with VMS is to discover the kind of the file.
2416 Image files (executable or shared images) are stored as a raw
2417 stream of bytes (like on UNIX), but there is no magic number.
2419 Object files are written with RMS (record management service), ie
2420 each records are preceeded by its length (on a word - 2 bytes), and
2421 padded for word-alignment. That would be simple but when files
2422 are transfered to a UNIX filesystem (using ftp), records are lost.
2423 Only the raw content of the records are transfered. Fortunately,
2424 the Alpha Object file format also store the length of the record
2425 in the records. Is that clear ? */
2427 /* Minimum is 6 bytes for objects (2 bytes size, 2 bytes record id,
2428 2 bytes size repeated) and 12 bytes for images (4 bytes major id,
2429 4 bytes minor id, 4 bytes length). */
2432 /* Size the main buffer. */
2433 buf = (unsigned char *) bfd_malloc (test_len);
2436 PRIV (recrd.buf) = buf;
2437 PRIV (recrd.buf_size) = test_len;
2439 /* Initialize the record pointer. */
2440 PRIV (recrd.rec) = buf;
2442 if (bfd_bread (buf, test_len, abfd) != test_len)
2444 bfd_set_error (bfd_error_file_truncated);
2448 /* Is it an image? */
2449 if ((bfd_getl32 (buf) == EIHD__K_MAJORID)
2450 && (bfd_getl32 (buf + 4) == EIHD__K_MINORID))
2452 unsigned int to_read;
2453 unsigned int read_so_far;
2454 unsigned int remaining;
2455 unsigned int eisd_offset, eihs_offset;
2457 /* Extract the header size. */
2458 PRIV (recrd.rec_size) = bfd_getl32 (buf + EIHD__L_SIZE);
2460 /* The header size is 0 for DSF files. */
2461 if (PRIV (recrd.rec_size) == 0)
2462 PRIV (recrd.rec_size) = sizeof (struct vms_eihd);
2464 if (PRIV (recrd.rec_size) > PRIV (recrd.buf_size))
2466 buf = bfd_realloc_or_free (buf, PRIV (recrd.rec_size));
2470 PRIV (recrd.buf) = NULL;
2471 bfd_set_error (bfd_error_no_memory);
2474 PRIV (recrd.buf) = buf;
2475 PRIV (recrd.buf_size) = PRIV (recrd.rec_size);
2478 /* Read the remaining record. */
2479 remaining = PRIV (recrd.rec_size) - test_len;
2480 to_read = MIN (VMS_BLOCK_SIZE - test_len, remaining);
2481 read_so_far = test_len;
2483 while (remaining > 0)
2485 if (bfd_bread (buf + read_so_far, to_read, abfd) != to_read)
2487 bfd_set_error (bfd_error_file_truncated);
2488 goto err_wrong_format;
2491 read_so_far += to_read;
2492 remaining -= to_read;
2494 to_read = MIN (VMS_BLOCK_SIZE, remaining);
2497 /* Reset the record pointer. */
2498 PRIV (recrd.rec) = buf;
2500 vms_debug2 ((2, "file type is image\n"));
2502 if (_bfd_vms_slurp_eihd (abfd, &eisd_offset, &eihs_offset) != TRUE)
2503 goto err_wrong_format;
2505 if (_bfd_vms_slurp_eisd (abfd, eisd_offset) != TRUE)
2506 goto err_wrong_format;
2508 /* EIHS is optional. */
2509 if (eihs_offset != 0 && _bfd_vms_slurp_eihs (abfd, eihs_offset) != TRUE)
2510 goto err_wrong_format;
2516 /* Assume it's a module and adjust record pointer if necessary. */
2517 maybe_adjust_record_pointer_for_object (abfd);
2519 /* But is it really a module? */
2520 if (bfd_getl16 (PRIV (recrd.rec)) <= EOBJ__C_MAXRECTYP
2521 && bfd_getl16 (PRIV (recrd.rec) + 2) <= EOBJ__C_MAXRECSIZ)
2523 if (vms_get_remaining_object_record (abfd, test_len) <= 0)
2524 goto err_wrong_format;
2526 vms_debug2 ((2, "file type is module\n"));
2528 type = bfd_getl16 (PRIV (recrd.rec));
2529 if (type != EOBJ__C_EMH || _bfd_vms_slurp_ehdr (abfd) != TRUE)
2530 goto err_wrong_format;
2532 if (_bfd_vms_slurp_object_records (abfd) != TRUE)
2533 goto err_wrong_format;
2536 goto err_wrong_format;
2539 /* Set arch_info to alpha. */
2541 if (! bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0))
2542 goto err_wrong_format;
2547 bfd_set_error (bfd_error_wrong_format);
2550 if (PRIV (recrd.buf))
2551 free (PRIV (recrd.buf));
2552 if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
2553 bfd_release (abfd, abfd->tdata.any);
2554 abfd->tdata.any = tdata_save;
2560 /* Write an EMH/MHD record. */
2563 _bfd_vms_write_emh (bfd *abfd)
2565 struct vms_rec_wr *recwr = &PRIV (recwr);
2567 _bfd_vms_output_alignment (recwr, 2);
2570 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
2571 _bfd_vms_output_short (recwr, EMH__C_MHD);
2572 _bfd_vms_output_short (recwr, EOBJ__C_STRLVL);
2573 _bfd_vms_output_long (recwr, 0);
2574 _bfd_vms_output_long (recwr, 0);
2575 _bfd_vms_output_long (recwr, MAX_OUTREC_SIZE);
2577 /* Create module name from filename. */
2578 if (bfd_get_filename (abfd) != 0)
2580 char *module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
2581 _bfd_vms_output_counted (recwr, module);
2585 _bfd_vms_output_counted (recwr, "NONAME");
2587 _bfd_vms_output_counted (recwr, BFD_VERSION_STRING);
2588 _bfd_vms_output_dump (recwr, get_vms_time_string (), EMH_DATE_LENGTH);
2589 _bfd_vms_output_fill (recwr, 0, EMH_DATE_LENGTH);
2590 _bfd_vms_output_end (abfd, recwr);
2593 /* Write an EMH/LMN record. */
2596 _bfd_vms_write_lmn (bfd *abfd, const char *name)
2599 struct vms_rec_wr *recwr = &PRIV (recwr);
2600 unsigned int ver = BFD_VERSION / 10000;
2603 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
2604 _bfd_vms_output_short (recwr, EMH__C_LNM);
2605 snprintf (version, sizeof (version), "%s %d.%d.%d", name,
2606 ver / 10000, (ver / 100) % 100, ver % 100);
2607 _bfd_vms_output_dump (recwr, (unsigned char *)version, strlen (version));
2608 _bfd_vms_output_end (abfd, recwr);
2612 /* Write eom record for bfd abfd. Return FALSE on error. */
2615 _bfd_vms_write_eeom (bfd *abfd)
2617 struct vms_rec_wr *recwr = &PRIV (recwr);
2619 vms_debug2 ((2, "vms_write_eeom\n"));
2621 _bfd_vms_output_alignment (recwr, 2);
2623 _bfd_vms_output_begin (recwr, EOBJ__C_EEOM);
2624 _bfd_vms_output_long (recwr, (unsigned long) (PRIV (vms_linkage_index) >> 1));
2625 _bfd_vms_output_byte (recwr, 0); /* Completion code. */
2626 _bfd_vms_output_byte (recwr, 0); /* Fill byte. */
2628 if ((abfd->flags & EXEC_P) == 0
2629 && bfd_get_start_address (abfd) != (bfd_vma)-1)
2633 section = bfd_get_section_by_name (abfd, ".link");
2636 bfd_set_error (bfd_error_nonrepresentable_section);
2639 _bfd_vms_output_short (recwr, 0);
2640 _bfd_vms_output_long (recwr, (unsigned long) (section->index));
2641 _bfd_vms_output_long (recwr,
2642 (unsigned long) bfd_get_start_address (abfd));
2643 _bfd_vms_output_long (recwr, 0);
2646 _bfd_vms_output_end (abfd, recwr);
2650 /* This hash routine borrowed from GNU-EMACS, and strengthened
2654 hash_string (const char *ptr)
2656 const unsigned char *p = (unsigned char *) ptr;
2657 const unsigned char *end = p + strlen (ptr);
2664 hash = ((hash << 3) + (hash << 15) + (hash >> 28) + c);
2669 /* Generate a length-hashed VMS symbol name (limited to maxlen chars). */
2672 _bfd_vms_length_hash_symbol (bfd *abfd, const char *in, int maxlen)
2674 unsigned long result;
2677 const char *old_name;
2679 static char outbuf[EOBJ__C_SYMSIZ + 1];
2683 vms_debug (4, "_bfd_vms_length_hash_symbol \"%s\"\n", in);
2686 if (maxlen > EOBJ__C_SYMSIZ)
2687 maxlen = EOBJ__C_SYMSIZ;
2689 /* Save this for later. */
2692 /* We may need to truncate the symbol, save the hash for later. */
2693 in_len = strlen (in);
2695 result = (in_len > maxlen) ? hash_string (in) : 0;
2699 /* Do the length checking. */
2700 if (in_len <= maxlen)
2704 if (PRIV (flag_hash_long_names))
2710 strncpy (out, in, (size_t) i);
2714 if ((in_len > maxlen)
2715 && PRIV (flag_hash_long_names))
2716 sprintf (out, "_%08lx", result);
2721 vms_debug (4, "--> [%d]\"%s\"\n", (int)strlen (outbuf), outbuf);
2725 && PRIV (flag_hash_long_names)
2726 && PRIV (flag_show_after_trunc))
2727 printf (_("Symbol %s replaced by %s\n"), old_name, new_name);
2733 vector_grow1 (struct vector_type *vec, size_t elsz)
2735 if (vec->nbr_el + 1 < vec->max_el)
2738 if (vec->max_el == 0)
2741 vec->els = bfd_malloc2 (vec->max_el, elsz);
2746 vec->els = bfd_realloc2 (vec->els, vec->max_el, elsz);
2750 /* Bump ABFD file position to next block. */
2753 alpha_vms_file_position_block (bfd *abfd)
2756 PRIV (file_pos) += VMS_BLOCK_SIZE - 1;
2757 PRIV (file_pos) -= (PRIV (file_pos) % VMS_BLOCK_SIZE);
2760 /* Convert from internal structure SRC to external structure DST. */
2763 alpha_vms_swap_eisd_out (struct vms_internal_eisd_map *src,
2764 struct vms_eisd *dst)
2766 bfd_putl32 (src->u.eisd.majorid, dst->majorid);
2767 bfd_putl32 (src->u.eisd.minorid, dst->minorid);
2768 bfd_putl32 (src->u.eisd.eisdsize, dst->eisdsize);
2769 if (src->u.eisd.eisdsize <= EISD__K_LENEND)
2771 bfd_putl32 (src->u.eisd.secsize, dst->secsize);
2772 bfd_putl64 (src->u.eisd.virt_addr, dst->virt_addr);
2773 bfd_putl32 (src->u.eisd.flags, dst->flags);
2774 bfd_putl32 (src->u.eisd.vbn, dst->vbn);
2775 dst->pfc = src->u.eisd.pfc;
2776 dst->matchctl = src->u.eisd.matchctl;
2777 dst->type = src->u.eisd.type;
2779 if (src->u.eisd.flags & EISD__M_GBL)
2781 bfd_putl32 (src->u.gbl_eisd.ident, dst->ident);
2782 memcpy (dst->gblnam, src->u.gbl_eisd.gblnam,
2783 src->u.gbl_eisd.gblnam[0] + 1);
2787 /* Append EISD to the list of extra eisd for ABFD. */
2790 alpha_vms_append_extra_eisd (bfd *abfd, struct vms_internal_eisd_map *eisd)
2793 if (PRIV (gbl_eisd_head) == NULL)
2794 PRIV (gbl_eisd_head) = eisd;
2796 PRIV (gbl_eisd_tail)->next = eisd;
2797 PRIV (gbl_eisd_tail) = eisd;
2800 /* Create an EISD for shared image SHRIMG.
2801 Return FALSE in case of error. */
2804 alpha_vms_create_eisd_for_shared (bfd *abfd, bfd *shrimg)
2806 struct vms_internal_eisd_map *eisd;
2809 namlen = strlen (PRIV2 (shrimg, hdr_data.hdr_t_name));
2810 if (namlen + 5 > EISD__K_GBLNAMLEN)
2816 eisd = bfd_alloc (abfd, sizeof (*eisd));
2820 /* Fill the fields. */
2821 eisd->u.gbl_eisd.common.majorid = EISD__K_MAJORID;
2822 eisd->u.gbl_eisd.common.minorid = EISD__K_MINORID;
2823 eisd->u.gbl_eisd.common.eisdsize = (EISD__K_LEN + 4 + namlen + 5 + 3) & ~3;
2824 eisd->u.gbl_eisd.common.secsize = VMS_BLOCK_SIZE; /* Must not be 0. */
2825 eisd->u.gbl_eisd.common.virt_addr = 0;
2826 eisd->u.gbl_eisd.common.flags = EISD__M_GBL;
2827 eisd->u.gbl_eisd.common.vbn = 0;
2828 eisd->u.gbl_eisd.common.pfc = 0;
2829 eisd->u.gbl_eisd.common.matchctl = PRIV2 (shrimg, matchctl);
2830 eisd->u.gbl_eisd.common.type = EISD__K_SHRPIC;
2832 eisd->u.gbl_eisd.ident = PRIV2 (shrimg, ident);
2833 eisd->u.gbl_eisd.gblnam[0] = namlen + 4;
2834 memcpy (eisd->u.gbl_eisd.gblnam + 1, PRIV2 (shrimg, hdr_data.hdr_t_name),
2836 memcpy (eisd->u.gbl_eisd.gblnam + 1 + namlen, "_001", 4);
2838 /* Append it to the list. */
2839 alpha_vms_append_extra_eisd (abfd, eisd);
2844 /* Create an EISD for section SEC.
2845 Return FALSE in case of failure. */
2848 alpha_vms_create_eisd_for_section (bfd *abfd, asection *sec)
2850 struct vms_internal_eisd_map *eisd;
2852 /* Only for allocating section. */
2853 if (!(sec->flags & SEC_ALLOC))
2856 BFD_ASSERT (vms_section_data (sec)->eisd == NULL);
2857 eisd = bfd_alloc (abfd, sizeof (*eisd));
2860 vms_section_data (sec)->eisd = eisd;
2862 /* Fill the fields. */
2863 eisd->u.eisd.majorid = EISD__K_MAJORID;
2864 eisd->u.eisd.minorid = EISD__K_MINORID;
2865 eisd->u.eisd.eisdsize = EISD__K_LEN;
2866 eisd->u.eisd.secsize =
2867 (sec->size + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
2868 eisd->u.eisd.virt_addr = sec->vma;
2869 eisd->u.eisd.flags = 0;
2870 eisd->u.eisd.vbn = 0; /* To be later defined. */
2871 eisd->u.eisd.pfc = 0; /* Default. */
2872 eisd->u.eisd.matchctl = EISD__K_MATALL;
2873 eisd->u.eisd.type = EISD__K_NORMAL;
2875 if (sec->flags & SEC_CODE)
2876 eisd->u.eisd.flags |= EISD__M_EXE;
2877 if (!(sec->flags & SEC_READONLY))
2878 eisd->u.eisd.flags |= EISD__M_WRT | EISD__M_CRF;
2880 if (!(sec->flags & SEC_LOAD))
2882 eisd->u.eisd.flags |= EISD__M_DZRO;
2883 eisd->u.eisd.flags &= ~EISD__M_CRF;
2885 if (sec->flags & SEC_LINKER_CREATED)
2887 if (strcmp (sec->name, "$FIXUP$") == 0)
2888 eisd->u.eisd.flags |= EISD__M_FIXUPVEC;
2891 /* Append it to the list. */
2893 if (PRIV (eisd_head) == NULL)
2894 PRIV (eisd_head) = eisd;
2896 PRIV (eisd_tail)->next = eisd;
2897 PRIV (eisd_tail) = eisd;
2902 /* Layout executable ABFD and write it to the disk.
2903 Return FALSE in case of failure. */
2906 alpha_vms_write_exec (bfd *abfd)
2908 struct vms_eihd eihd;
2909 struct vms_eiha *eiha;
2910 struct vms_eihi *eihi;
2911 struct vms_eihs *eihs = NULL;
2913 struct vms_internal_eisd_map *first_eisd;
2914 struct vms_internal_eisd_map *eisd;
2918 /* Build the EIHD. */
2919 PRIV (file_pos) = EIHD__C_LENGTH;
2921 memset (&eihd, 0, sizeof (eihd));
2922 memset (eihd.fill_2, 0xff, sizeof (eihd.fill_2));
2924 bfd_putl32 (EIHD__K_MAJORID, eihd.majorid);
2925 bfd_putl32 (EIHD__K_MINORID, eihd.minorid);
2927 bfd_putl32 (sizeof (eihd), eihd.size);
2928 bfd_putl32 (0, eihd.isdoff);
2929 bfd_putl32 (0, eihd.activoff);
2930 bfd_putl32 (0, eihd.symdbgoff);
2931 bfd_putl32 (0, eihd.imgidoff);
2932 bfd_putl32 (0, eihd.patchoff);
2933 bfd_putl64 (0, eihd.iafva);
2934 bfd_putl32 (0, eihd.version_array_off);
2936 bfd_putl32 (EIHD__K_EXE, eihd.imgtype);
2937 bfd_putl32 (0, eihd.subtype);
2939 bfd_putl32 (0, eihd.imgiocnt);
2940 bfd_putl32 (-1, eihd.privreqs);
2941 bfd_putl32 (-1, eihd.privreqs + 4);
2943 bfd_putl32 ((sizeof (eihd) + VMS_BLOCK_SIZE - 1) / VMS_BLOCK_SIZE,
2945 bfd_putl32 (0, eihd.lnkflags);
2946 bfd_putl32 (0, eihd.ident);
2947 bfd_putl32 (0, eihd.sysver);
2950 bfd_putl32 (0, eihd.symvect_size);
2951 bfd_putl32 (16, eihd.virt_mem_block_size);
2952 bfd_putl32 (0, eihd.ext_fixup_off);
2953 bfd_putl32 (0, eihd.noopt_psect_off);
2954 bfd_putl32 (-1, eihd.alias);
2957 eiha = (struct vms_eiha *)((char *) &eihd + PRIV (file_pos));
2958 bfd_putl32 (PRIV (file_pos), eihd.activoff);
2959 PRIV (file_pos) += sizeof (struct vms_eiha);
2961 bfd_putl32 (sizeof (struct vms_eiha), eiha->size);
2962 bfd_putl32 (0, eiha->spare);
2963 bfd_putl32 (0x00000340, eiha->tfradr1); /* SYS$IMGACT */
2964 bfd_putl32 (0xffffffff, eiha->tfradr1_h);
2965 bfd_putl64 (bfd_get_start_address (abfd), eiha->tfradr2);
2966 bfd_putl64 (0, eiha->tfradr3);
2967 bfd_putl64 (0, eiha->tfradr4);
2968 bfd_putl64 (0, eiha->inishr);
2971 eihi = (struct vms_eihi *)((char *) &eihd + PRIV (file_pos));
2972 bfd_putl32 (PRIV (file_pos), eihd.imgidoff);
2973 PRIV (file_pos) += sizeof (struct vms_eihi);
2975 bfd_putl32 (EIHI__K_MAJORID, eihi->majorid);
2976 bfd_putl32 (EIHI__K_MINORID, eihi->minorid);
2981 module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
2982 len = strlen (module);
2983 if (len > sizeof (eihi->imgnam) - 1)
2984 len = sizeof (eihi->imgnam) - 1;
2985 eihi->imgnam[0] = len;
2986 memcpy (eihi->imgnam + 1, module, len);
2989 bfd_putl32 (0, eihi->linktime + 0);
2990 bfd_putl32 (0, eihi->linktime + 4);
2992 eihi->linkid[0] = 0;
2993 eihi->imgbid[0] = 0;
2996 dst = PRIV (dst_section);
2997 dmt = bfd_get_section_by_name (abfd, "$DMT$");
2998 if (dst != NULL && dst->size != 0)
3000 eihs = (struct vms_eihs *)((char *) &eihd + PRIV (file_pos));
3001 bfd_putl32 (PRIV (file_pos), eihd.symdbgoff);
3002 PRIV (file_pos) += sizeof (struct vms_eihs);
3004 bfd_putl32 (EIHS__K_MAJORID, eihs->majorid);
3005 bfd_putl32 (EIHS__K_MINORID, eihs->minorid);
3006 bfd_putl32 (0, eihs->dstvbn);
3007 bfd_putl32 (0, eihs->dstsize);
3008 bfd_putl32 (0, eihs->gstvbn);
3009 bfd_putl32 (0, eihs->gstsize);
3010 bfd_putl32 (0, eihs->dmtvbn);
3011 bfd_putl32 (0, eihs->dmtsize);
3014 /* One EISD per section. */
3015 for (sec = abfd->sections; sec; sec = sec->next)
3017 if (!alpha_vms_create_eisd_for_section (abfd, sec))
3021 /* Merge section EIDS which extra ones. */
3022 if (PRIV (eisd_tail))
3023 PRIV (eisd_tail)->next = PRIV (gbl_eisd_head);
3025 PRIV (eisd_head) = PRIV (gbl_eisd_head);
3026 if (PRIV (gbl_eisd_tail))
3027 PRIV (eisd_tail) = PRIV (gbl_eisd_tail);
3029 first_eisd = PRIV (eisd_head);
3031 /* Add end of eisd. */
3034 eisd = bfd_zalloc (abfd, sizeof (*eisd));
3037 eisd->u.eisd.majorid = 0;
3038 eisd->u.eisd.minorid = 0;
3039 eisd->u.eisd.eisdsize = 0;
3040 alpha_vms_append_extra_eisd (abfd, eisd);
3043 /* Place EISD in the file. */
3044 for (eisd = first_eisd; eisd; eisd = eisd->next)
3046 file_ptr room = VMS_BLOCK_SIZE - (PRIV (file_pos) % VMS_BLOCK_SIZE);
3048 /* First block is a little bit special: there is a word at the end. */
3049 if (PRIV (file_pos) < VMS_BLOCK_SIZE && room > 2)
3051 if (room < eisd->u.eisd.eisdsize + EISD__K_LENEND)
3052 alpha_vms_file_position_block (abfd);
3054 eisd->file_pos = PRIV (file_pos);
3055 PRIV (file_pos) += eisd->u.eisd.eisdsize;
3057 if (eisd->u.eisd.flags & EISD__M_FIXUPVEC)
3058 bfd_putl64 (eisd->u.eisd.virt_addr, eihd.iafva);
3061 if (first_eisd != NULL)
3063 bfd_putl32 (first_eisd->file_pos, eihd.isdoff);
3064 /* Real size of end of eisd marker. */
3065 PRIV (file_pos) += EISD__K_LENEND;
3068 bfd_putl32 (PRIV (file_pos), eihd.size);
3069 bfd_putl32 ((PRIV (file_pos) + VMS_BLOCK_SIZE - 1) / VMS_BLOCK_SIZE,
3072 /* Place sections. */
3073 for (sec = abfd->sections; sec; sec = sec->next)
3075 if (!(sec->flags & SEC_HAS_CONTENTS))
3078 eisd = vms_section_data (sec)->eisd;
3080 /* Align on a block. */
3081 alpha_vms_file_position_block (abfd);
3082 sec->filepos = PRIV (file_pos);
3085 eisd->u.eisd.vbn = (sec->filepos / VMS_BLOCK_SIZE) + 1;
3087 PRIV (file_pos) += sec->size;
3090 if (eihs != NULL && dst != NULL)
3092 bfd_putl32 ((dst->filepos / VMS_BLOCK_SIZE) + 1, eihs->dstvbn);
3093 bfd_putl32 (dst->size, eihs->dstsize);
3097 bfd_putl32 ((dmt->filepos / VMS_BLOCK_SIZE) + 1, eihs->dmtvbn);
3098 bfd_putl32 (dmt->size, eihs->dmtsize);
3102 /* Write EISD in hdr. */
3103 for (eisd = first_eisd; eisd && eisd->file_pos < VMS_BLOCK_SIZE;
3105 alpha_vms_swap_eisd_out
3106 (eisd, (struct vms_eisd *)((char *)&eihd + eisd->file_pos));
3108 /* Write first block. */
3109 if (bfd_bwrite (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
3112 /* Write remaining eisd. */
3115 unsigned char blk[VMS_BLOCK_SIZE];
3116 struct vms_internal_eisd_map *next_eisd;
3118 memset (blk, 0xff, sizeof (blk));
3119 while (eisd != NULL)
3121 alpha_vms_swap_eisd_out
3123 (struct vms_eisd *)(blk + (eisd->file_pos % VMS_BLOCK_SIZE)));
3125 next_eisd = eisd->next;
3126 if (next_eisd == NULL
3127 || (next_eisd->file_pos / VMS_BLOCK_SIZE
3128 != eisd->file_pos / VMS_BLOCK_SIZE))
3130 if (bfd_bwrite (blk, sizeof (blk), abfd) != sizeof (blk))
3133 memset (blk, 0xff, sizeof (blk));
3139 /* Write sections. */
3140 for (sec = abfd->sections; sec; sec = sec->next)
3142 unsigned char blk[VMS_BLOCK_SIZE];
3145 if (sec->size == 0 || !(sec->flags & SEC_HAS_CONTENTS))
3147 if (bfd_bwrite (sec->contents, sec->size, abfd) != sec->size)
3151 len = VMS_BLOCK_SIZE - sec->size % VMS_BLOCK_SIZE;
3152 if (len != VMS_BLOCK_SIZE)
3154 memset (blk, 0, len);
3155 if (bfd_bwrite (blk, len, abfd) != len)
3165 /* Write section and symbol directory of bfd abfd. Return FALSE on error. */
3168 _bfd_vms_write_egsd (bfd *abfd)
3172 unsigned int symnum;
3173 int last_index = -1;
3174 char dummy_name[10];
3176 flagword new_flags, old_flags;
3177 int abs_section_index = 0;
3178 struct vms_rec_wr *recwr = &PRIV (recwr);
3180 vms_debug2 ((2, "vms_write_gsd\n"));
3182 /* Output sections. */
3183 section = abfd->sections;
3184 vms_debug2 ((3, "%d sections found\n", abfd->section_count));
3186 /* Egsd is quadword aligned. */
3187 _bfd_vms_output_alignment (recwr, 8);
3189 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3190 _bfd_vms_output_long (recwr, 0);
3192 while (section != 0)
3194 vms_debug2 ((3, "Section #%d %s, %d bytes\n",
3195 section->index, section->name, (int)section->size));
3197 /* Don't write out the VMS debug info section since it is in the
3198 ETBT and EDBG sections in etir. */
3199 if (!strcmp (section->name, ".vmsdebug"))
3202 /* 13 bytes egsd, max 31 chars name -> should be 44 bytes. */
3203 if (_bfd_vms_output_check (recwr, 64) < 0)
3205 _bfd_vms_output_end (abfd, recwr);
3206 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3207 _bfd_vms_output_long (recwr, 0);
3210 /* Create dummy sections to keep consecutive indices. */
3211 while (section->index - last_index > 1)
3213 vms_debug2 ((3, "index %d, last %d\n", section->index, last_index));
3214 _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3215 _bfd_vms_output_short (recwr, 0);
3216 _bfd_vms_output_short (recwr, 0);
3217 _bfd_vms_output_long (recwr, 0);
3218 sprintf (dummy_name, ".DUMMY%02d", last_index);
3219 _bfd_vms_output_counted (recwr, dummy_name);
3220 _bfd_vms_output_end_subrec (recwr);
3224 /* Don't know if this is necessary for the linker but for now it keeps
3225 vms_slurp_gsd happy */
3226 sname = (char *)section->name;
3230 if ((*sname == 't') && (strcmp (sname, "text") == 0))
3231 sname = EVAX_CODE_NAME;
3232 else if ((*sname == 'd') && (strcmp (sname, "data") == 0))
3233 sname = EVAX_DATA_NAME;
3234 else if ((*sname == 'b') && (strcmp (sname, "bss") == 0))
3235 sname = EVAX_BSS_NAME;
3236 else if ((*sname == 'l') && (strcmp (sname, "link") == 0))
3237 sname = EVAX_LINK_NAME;
3238 else if ((*sname == 'r') && (strcmp (sname, "rdata") == 0))
3239 sname = EVAX_READONLY_NAME;
3240 else if ((*sname == 'l') && (strcmp (sname, "literal") == 0))
3241 sname = EVAX_LITERAL_NAME;
3242 else if ((*sname == 'l') && (strcmp (sname, "literals") == 0))
3244 sname = EVAX_LITERALS_NAME;
3245 abs_section_index = section->index;
3247 else if ((*sname == 'c') && (strcmp (sname, "comm") == 0))
3248 sname = EVAX_COMMON_NAME;
3249 else if ((*sname == 'l') && (strcmp (sname, "lcomm") == 0))
3250 sname = EVAX_LOCAL_NAME;
3253 sname = _bfd_vms_length_hash_symbol (abfd, sname, EOBJ__C_SECSIZ);
3255 _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3256 _bfd_vms_output_short (recwr, section->alignment_power & 0xff);
3258 if (bfd_is_com_section (section))
3259 new_flags = (EGPS__V_OVR | EGPS__V_REL | EGPS__V_GBL | EGPS__V_RD
3260 | EGPS__V_WRT | EGPS__V_NOMOD | EGPS__V_COM);
3262 new_flags = vms_esecflag_by_name (evax_section_flags, sname,
3265 /* Modify them as directed. */
3266 if (section->flags & SEC_READONLY)
3267 new_flags &= ~EGPS__V_WRT;
3269 new_flags &= ~vms_section_data (section)->no_flags;
3270 new_flags |= vms_section_data (section)->flags;
3272 vms_debug2 ((3, "sec flags %x\n", section->flags));
3273 vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
3274 new_flags, (unsigned long)section->size));
3276 _bfd_vms_output_short (recwr, new_flags);
3277 _bfd_vms_output_long (recwr, (unsigned long) section->size);
3278 _bfd_vms_output_counted (recwr, sname);
3279 _bfd_vms_output_end_subrec (recwr);
3281 last_index = section->index;
3283 section = section->next;
3286 /* Output symbols. */
3287 vms_debug2 ((3, "%d symbols found\n", abfd->symcount));
3289 bfd_set_start_address (abfd, (bfd_vma) -1);
3291 for (symnum = 0; symnum < abfd->symcount; symnum++)
3295 symbol = abfd->outsymbols[symnum];
3296 if (*(symbol->name) == '_')
3298 if (strcmp (symbol->name, "__main") == 0)
3299 bfd_set_start_address (abfd, (bfd_vma)symbol->value);
3301 old_flags = symbol->flags;
3303 if (old_flags & BSF_FILE)
3306 if ((old_flags & BSF_GLOBAL) == 0 /* Not xdef... */
3307 && !bfd_is_und_section (symbol->section) /* and not xref... */
3308 && !((old_flags & BSF_SECTION_SYM) != 0 /* and not LIB$INITIALIZE. */
3309 && strcmp (symbol->section->name, "LIB$INITIALIZE") == 0))
3312 /* 13 bytes egsd, max 64 chars name -> should be 77 bytes. */
3313 if (_bfd_vms_output_check (recwr, 80) < 0)
3315 _bfd_vms_output_end (abfd, recwr);
3316 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3317 _bfd_vms_output_long (recwr, 0);
3320 _bfd_vms_output_begin_subrec (recwr, EGSD__C_SYM);
3322 /* Data type, alignment. */
3323 _bfd_vms_output_short (recwr, 0);
3327 if (old_flags & BSF_WEAK)
3328 new_flags |= EGSY__V_WEAK;
3329 if (bfd_is_com_section (symbol->section)) /* .comm */
3330 new_flags |= (EGSY__V_WEAK | EGSY__V_COMM);
3332 if (old_flags & BSF_FUNCTION)
3334 new_flags |= EGSY__V_NORM;
3335 new_flags |= EGSY__V_REL;
3337 if (old_flags & BSF_GLOBAL)
3339 new_flags |= EGSY__V_DEF;
3340 if (!bfd_is_abs_section (symbol->section))
3341 new_flags |= EGSY__V_REL;
3343 _bfd_vms_output_short (recwr, new_flags);
3345 if (old_flags & BSF_GLOBAL)
3347 /* Symbol definition. */
3348 bfd_vma code_address = 0;
3349 unsigned long ca_psindx = 0;
3350 unsigned long psindx;
3352 if ((old_flags & BSF_FUNCTION) && symbol->udata.p != NULL)
3356 sym = ((struct evax_private_udata_struct *)symbol->udata.p)->enbsym;
3357 code_address = sym->value;
3358 ca_psindx = sym->section->index;
3360 if (bfd_is_abs_section (symbol->section))
3361 psindx = abs_section_index;
3363 psindx = symbol->section->index;
3365 _bfd_vms_output_quad (recwr, symbol->value);
3366 _bfd_vms_output_quad (recwr, code_address);
3367 _bfd_vms_output_long (recwr, ca_psindx);
3368 _bfd_vms_output_long (recwr, psindx);
3370 hash = _bfd_vms_length_hash_symbol (abfd, symbol->name, EOBJ__C_SYMSIZ);
3371 _bfd_vms_output_counted (recwr, hash);
3373 _bfd_vms_output_end_subrec (recwr);
3377 _bfd_vms_output_alignment (recwr, 8);
3378 _bfd_vms_output_end (abfd, recwr);
3383 /* Write object header for bfd abfd. Return FALSE on error. */
3386 _bfd_vms_write_ehdr (bfd *abfd)
3389 unsigned int symnum;
3392 struct vms_rec_wr *recwr = &PRIV (recwr);
3394 vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd));
3396 _bfd_vms_output_alignment (recwr, 2);
3398 _bfd_vms_write_emh (abfd);
3399 _bfd_vms_write_lmn (abfd, "GNU AS");
3402 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3403 _bfd_vms_output_short (recwr, EMH__C_SRC);
3405 for (symnum = 0; symnum < abfd->symcount; symnum++)
3407 symbol = abfd->outsymbols[symnum];
3409 if (symbol->flags & BSF_FILE)
3411 if (CONST_STRNEQ ((char *)symbol->name, "<CASE:"))
3413 PRIV (flag_hash_long_names) = symbol->name[6] - '0';
3414 PRIV (flag_show_after_trunc) = symbol->name[7] - '0';
3422 _bfd_vms_output_dump (recwr, (unsigned char *) symbol->name,
3423 (int) strlen (symbol->name));
3430 if (symnum == abfd->symcount)
3431 _bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("noname"));
3433 _bfd_vms_output_end (abfd, recwr);
3436 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3437 _bfd_vms_output_short (recwr, EMH__C_TTL);
3438 _bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("TTL"));
3439 _bfd_vms_output_end (abfd, recwr);
3442 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3443 _bfd_vms_output_short (recwr, EMH__C_CPR);
3444 _bfd_vms_output_dump (recwr,
3445 (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
3447 _bfd_vms_output_end (abfd, recwr);
3452 /* Part 4.6, relocations. */
3455 /* WRITE ETIR SECTION
3457 This is still under construction and therefore not documented. */
3459 /* Close the etir/etbt record. */
3462 end_etir_record (bfd * abfd)
3464 struct vms_rec_wr *recwr = &PRIV (recwr);
3466 _bfd_vms_output_end (abfd, recwr);
3470 start_etir_or_etbt_record (bfd *abfd, asection *section, bfd_vma offset)
3472 struct vms_rec_wr *recwr = &PRIV (recwr);
3474 if (section->name[0] == '.' && section->name[1] == 'v'
3475 && !strcmp (section->name, ".vmsdebug"))
3477 _bfd_vms_output_begin (recwr, EOBJ__C_ETBT);
3481 /* Push start offset. */
3482 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3483 _bfd_vms_output_long (recwr, (unsigned long) 0);
3484 _bfd_vms_output_end_subrec (recwr);
3487 _bfd_vms_output_begin_subrec (recwr, ETIR__C_CTL_DFLOC);
3488 _bfd_vms_output_end_subrec (recwr);
3493 _bfd_vms_output_begin (recwr, EOBJ__C_ETIR);
3497 /* Push start offset. */
3498 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3499 _bfd_vms_output_long (recwr, (unsigned long) section->index);
3500 _bfd_vms_output_quad (recwr, offset);
3501 _bfd_vms_output_end_subrec (recwr);
3503 /* Start = pop (). */
3504 _bfd_vms_output_begin_subrec (recwr, ETIR__C_CTL_SETRB);
3505 _bfd_vms_output_end_subrec (recwr);
3510 /* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
3511 address VADDR in section specified by SEC_INDEX and NAME. */
3514 sto_imm (bfd *abfd, asection *section,
3515 bfd_size_type ssize, unsigned char *cptr, bfd_vma vaddr)
3518 struct vms_rec_wr *recwr = &PRIV (recwr);
3521 _bfd_vms_debug (8, "sto_imm %d bytes\n", (int) ssize);
3522 _bfd_hexdump (9, cptr, (int) ssize, (int) vaddr);
3527 /* Try all the rest. */
3530 if (_bfd_vms_output_check (recwr, size) < 0)
3532 /* Doesn't fit, split ! */
3533 end_etir_record (abfd);
3535 start_etir_or_etbt_record (abfd, section, vaddr);
3537 size = _bfd_vms_output_check (recwr, 0); /* get max size */
3538 if (size > ssize) /* more than what's left ? */
3542 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_IMM);
3543 _bfd_vms_output_long (recwr, (unsigned long) (size));
3544 _bfd_vms_output_dump (recwr, cptr, size);
3545 _bfd_vms_output_end_subrec (recwr);
3548 _bfd_vms_debug (10, "dumped %d bytes\n", (int) size);
3549 _bfd_hexdump (10, cptr, (int) size, (int) vaddr);
3559 etir_output_check (bfd *abfd, asection *section, bfd_vma vaddr, int checklen)
3561 if (_bfd_vms_output_check (&PRIV (recwr), checklen) < 0)
3563 /* Not enough room in this record. Close it and open a new one. */
3564 end_etir_record (abfd);
3565 start_etir_or_etbt_record (abfd, section, vaddr);
3569 /* Return whether RELOC must be deferred till the end. */
3572 defer_reloc_p (arelent *reloc)
3574 switch (reloc->howto->type)
3587 /* Write section contents for bfd abfd. Return FALSE on error. */
3590 _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
3593 struct vms_rec_wr *recwr = &PRIV (recwr);
3595 vms_debug2 ((2, "vms_write_tir (%p, %d)\n", abfd, objtype));
3597 _bfd_vms_output_alignment (recwr, 4);
3599 PRIV (vms_linkage_index) = 1;
3601 for (section = abfd->sections; section; section = section->next)
3603 vms_debug2 ((4, "writing %d. section '%s' (%d bytes)\n",
3604 section->index, section->name, (int) (section->size)));
3606 if (!(section->flags & SEC_HAS_CONTENTS)
3607 || bfd_is_com_section (section))
3610 if (!section->contents)
3612 bfd_set_error (bfd_error_no_contents);
3616 start_etir_or_etbt_record (abfd, section, 0);
3618 if (section->flags & SEC_RELOC)
3620 bfd_vma curr_addr = 0;
3621 unsigned char *curr_data = section->contents;
3623 int pass2_needed = 0;
3624 int pass2_in_progress = 0;
3627 if (section->reloc_count <= 0)
3628 (*_bfd_error_handler)
3629 (_("SEC_RELOC with no relocs in section %s"), section->name);
3634 int i = section->reloc_count;
3635 arelent **rptr = section->orelocation;
3636 _bfd_vms_debug (4, "%d relocations:\n", i);
3639 _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, "
3640 "addr %08lx, off %08lx, len %d: %s\n",
3641 (*(*rptr)->sym_ptr_ptr)->name,
3642 (*(*rptr)->sym_ptr_ptr)->section->name,
3643 (long) (*(*rptr)->sym_ptr_ptr)->value,
3644 (unsigned long)(*rptr)->address,
3645 (unsigned long)(*rptr)->addend,
3646 bfd_get_reloc_size ((*rptr)->howto),
3647 ( *rptr)->howto->name);
3654 for (irel = 0; irel < section->reloc_count; irel++)
3656 struct evax_private_udata_struct *udata;
3657 arelent *rptr = section->orelocation [irel];
3658 bfd_vma addr = rptr->address;
3659 asymbol *sym = *rptr->sym_ptr_ptr;
3660 asection *sec = sym->section;
3661 bfd_boolean defer = defer_reloc_p (rptr);
3665 if (pass2_in_progress)
3667 /* Non-deferred relocs have already been output. */
3673 /* Deferred relocs must be output at the very end. */
3680 /* Regular relocs are intertwined with binary data. */
3681 if (curr_addr > addr)
3682 (*_bfd_error_handler) (_("Size error in section %s"),
3684 size = addr - curr_addr;
3685 sto_imm (abfd, section, size, curr_data, curr_addr);
3690 size = bfd_get_reloc_size (rptr->howto);
3692 switch (rptr->howto->type)
3694 case ALPHA_R_IGNORE:
3697 case ALPHA_R_REFLONG:
3698 if (bfd_is_und_section (sym->section))
3700 bfd_vma addend = rptr->addend;
3701 slen = strlen ((char *) sym->name);
3702 hash = _bfd_vms_length_hash_symbol
3703 (abfd, sym->name, EOBJ__C_SYMSIZ);
3704 etir_output_check (abfd, section, curr_addr, slen);
3707 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
3708 _bfd_vms_output_counted (recwr, hash);
3709 _bfd_vms_output_end_subrec (recwr);
3710 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3711 _bfd_vms_output_long (recwr, (unsigned long) addend);
3712 _bfd_vms_output_end_subrec (recwr);
3713 _bfd_vms_output_begin_subrec (recwr, ETIR__C_OPR_ADD);
3714 _bfd_vms_output_end_subrec (recwr);
3715 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3716 _bfd_vms_output_end_subrec (recwr);
3720 _bfd_vms_output_begin_subrec
3721 (recwr, ETIR__C_STO_GBL_LW);
3722 _bfd_vms_output_counted (recwr, hash);
3723 _bfd_vms_output_end_subrec (recwr);
3726 else if (bfd_is_abs_section (sym->section))
3728 etir_output_check (abfd, section, curr_addr, 16);
3729 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3730 _bfd_vms_output_long (recwr, (unsigned long) sym->value);
3731 _bfd_vms_output_end_subrec (recwr);
3732 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3733 _bfd_vms_output_end_subrec (recwr);
3737 etir_output_check (abfd, section, curr_addr, 32);
3738 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3739 _bfd_vms_output_long (recwr, (unsigned long) sec->index);
3740 _bfd_vms_output_quad (recwr, rptr->addend + sym->value);
3741 _bfd_vms_output_end_subrec (recwr);
3742 /* ??? Table B-8 of the OpenVMS Linker Utilily Manual
3743 says that we should have a ETIR__C_STO_OFF here.
3744 But the relocation would not be BFD_RELOC_32 then.
3745 This case is very likely unreachable. */
3746 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3747 _bfd_vms_output_end_subrec (recwr);
3751 case ALPHA_R_REFQUAD:
3752 if (bfd_is_und_section (sym->section))
3754 bfd_vma addend = rptr->addend;
3755 slen = strlen ((char *) sym->name);
3756 hash = _bfd_vms_length_hash_symbol
3757 (abfd, sym->name, EOBJ__C_SYMSIZ);
3758 etir_output_check (abfd, section, curr_addr, slen);
3761 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
3762 _bfd_vms_output_counted (recwr, hash);
3763 _bfd_vms_output_end_subrec (recwr);
3764 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
3765 _bfd_vms_output_quad (recwr, addend);
3766 _bfd_vms_output_end_subrec (recwr);
3767 _bfd_vms_output_begin_subrec (recwr, ETIR__C_OPR_ADD);
3768 _bfd_vms_output_end_subrec (recwr);
3769 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_QW);
3770 _bfd_vms_output_end_subrec (recwr);
3774 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_GBL);
3775 _bfd_vms_output_counted (recwr, hash);
3776 _bfd_vms_output_end_subrec (recwr);
3779 else if (bfd_is_abs_section (sym->section))
3781 etir_output_check (abfd, section, curr_addr, 16);
3782 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
3783 _bfd_vms_output_quad (recwr, sym->value);
3784 _bfd_vms_output_end_subrec (recwr);
3785 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_QW);
3786 _bfd_vms_output_end_subrec (recwr);
3790 etir_output_check (abfd, section, curr_addr, 32);
3791 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3792 _bfd_vms_output_long (recwr, (unsigned long) sec->index);
3793 _bfd_vms_output_quad (recwr, rptr->addend + sym->value);
3794 _bfd_vms_output_end_subrec (recwr);
3795 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_OFF);
3796 _bfd_vms_output_end_subrec (recwr);
3801 sto_imm (abfd, section, size, curr_data, curr_addr);
3804 case ALPHA_R_LINKAGE:
3805 etir_output_check (abfd, section, curr_addr, 64);
3806 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LP_PSB);
3807 _bfd_vms_output_long
3808 (recwr, (unsigned long) PRIV (vms_linkage_index));
3809 PRIV (vms_linkage_index) += 2;
3810 hash = _bfd_vms_length_hash_symbol
3811 (abfd, sym->name, EOBJ__C_SYMSIZ);
3812 _bfd_vms_output_counted (recwr, hash);
3813 _bfd_vms_output_byte (recwr, 0);
3814 _bfd_vms_output_end_subrec (recwr);
3817 case ALPHA_R_CODEADDR:
3818 slen = strlen ((char *) sym->name);
3819 hash = _bfd_vms_length_hash_symbol
3820 (abfd, sym->name, EOBJ__C_SYMSIZ);
3821 etir_output_check (abfd, section, curr_addr, slen);
3822 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_CA);
3823 _bfd_vms_output_counted (recwr, hash);
3824 _bfd_vms_output_end_subrec (recwr);
3829 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3830 etir_output_check (abfd, section, curr_addr,
3831 32 + 1 + strlen (udata->origname));
3832 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_NOP_GBL);
3833 _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
3834 _bfd_vms_output_long
3835 (recwr, (unsigned long) udata->enbsym->section->index);
3836 _bfd_vms_output_quad (recwr, rptr->address);
3837 _bfd_vms_output_long (recwr, (unsigned long) 0x47ff041f);
3838 _bfd_vms_output_long
3839 (recwr, (unsigned long) udata->enbsym->section->index);
3840 _bfd_vms_output_quad (recwr, rptr->addend);
3841 _bfd_vms_output_counted
3842 (recwr, _bfd_vms_length_hash_symbol
3843 (abfd, udata->origname, EOBJ__C_SYMSIZ));
3844 _bfd_vms_output_end_subrec (recwr);
3848 (*_bfd_error_handler) (_("Spurious ALPHA_R_BSR reloc"));
3853 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3854 etir_output_check (abfd, section, curr_addr,
3855 32 + 1 + strlen (udata->origname));
3856 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LDA_GBL);
3857 _bfd_vms_output_long
3858 (recwr, (unsigned long) udata->lkindex + 1);
3859 _bfd_vms_output_long
3860 (recwr, (unsigned long) udata->enbsym->section->index);
3861 _bfd_vms_output_quad (recwr, rptr->address);
3862 _bfd_vms_output_long (recwr, (unsigned long) 0x237B0000);
3863 _bfd_vms_output_long
3864 (recwr, (unsigned long) udata->bsym->section->index);
3865 _bfd_vms_output_quad (recwr, rptr->addend);
3866 _bfd_vms_output_counted
3867 (recwr, _bfd_vms_length_hash_symbol
3868 (abfd, udata->origname, EOBJ__C_SYMSIZ));
3869 _bfd_vms_output_end_subrec (recwr);
3874 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3875 etir_output_check (abfd, section, curr_addr,
3876 32 + 1 + strlen (udata->origname));
3877 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_BOH_GBL);
3878 _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
3879 _bfd_vms_output_long
3880 (recwr, (unsigned long) udata->enbsym->section->index);
3881 _bfd_vms_output_quad (recwr, rptr->address);
3882 _bfd_vms_output_long (recwr, (unsigned long) 0xD3400000);
3883 _bfd_vms_output_long
3884 (recwr, (unsigned long) udata->enbsym->section->index);
3885 _bfd_vms_output_quad (recwr, rptr->addend);
3886 _bfd_vms_output_counted
3887 (recwr, _bfd_vms_length_hash_symbol
3888 (abfd, udata->origname, EOBJ__C_SYMSIZ));
3889 _bfd_vms_output_end_subrec (recwr);
3893 (*_bfd_error_handler) (_("Unhandled relocation %s"),
3900 } /* End of relocs loop. */
3902 if (!pass2_in_progress)
3904 /* Output rest of section. */
3905 if (curr_addr > section->size)
3906 (*_bfd_error_handler) (_("Size error in section %s"),
3908 size = section->size - curr_addr;
3909 sto_imm (abfd, section, size, curr_data, curr_addr);
3915 pass2_in_progress = 1;
3921 else /* (section->flags & SEC_RELOC) */
3922 sto_imm (abfd, section, section->size, section->contents, 0);
3924 end_etir_record (abfd);
3927 _bfd_vms_output_alignment (recwr, 2);
3931 /* Write cached information into a file being written, at bfd_close. */
3934 alpha_vms_write_object_contents (bfd *abfd)
3936 vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd));
3938 if (abfd->flags & (EXEC_P | DYNAMIC))
3940 return alpha_vms_write_exec (abfd);
3944 if (abfd->section_count > 0) /* we have sections */
3946 if (_bfd_vms_write_ehdr (abfd) != TRUE)
3948 if (_bfd_vms_write_egsd (abfd) != TRUE)
3950 if (_bfd_vms_write_etir (abfd, EOBJ__C_ETIR) != TRUE)
3952 if (_bfd_vms_write_eeom (abfd) != TRUE)
3959 /* Debug stuff: nearest line. */
3961 #define SET_MODULE_PARSED(m) \
3962 do { if ((m)->name == NULL) (m)->name = ""; } while (0)
3963 #define IS_MODULE_PARSED(m) ((m)->name != NULL)
3965 /* Build a new module for the specified BFD. */
3967 static struct module *
3968 new_module (bfd *abfd)
3970 struct module *module
3971 = (struct module *) bfd_zalloc (abfd, sizeof (struct module));
3972 module->file_table_count = 16; /* Arbitrary. */
3974 = bfd_malloc (module->file_table_count * sizeof (struct fileinfo));
3978 /* Parse debug info for a module and internalize it. */
3981 parse_module (bfd *abfd, struct module *module, unsigned char *ptr,
3984 unsigned char *maxptr = ptr + length;
3985 unsigned char *src_ptr, *pcl_ptr;
3986 unsigned int prev_linum = 0, curr_linenum = 0;
3987 bfd_vma prev_pc = 0, curr_pc = 0;
3988 struct srecinfo *curr_srec, *srec;
3989 struct lineinfo *curr_line, *line;
3990 struct funcinfo *funcinfo;
3992 /* Initialize tables with zero element. */
3993 curr_srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
3994 module->srec_table = curr_srec;
3996 curr_line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
3997 module->line_table = curr_line;
3999 while (length == -1 || ptr < maxptr)
4001 /* The first byte is not counted in the recorded length. */
4002 int rec_length = bfd_getl16 (ptr) + 1;
4003 int rec_type = bfd_getl16 (ptr + 2);
4005 vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length, rec_type));
4007 if (length == -1 && rec_type == DST__K_MODEND)
4014 = _bfd_vms_save_counted_string (ptr + DST_S_B_MODBEG_NAME);
4021 vms_debug2 ((3, "module: %s\n", module->name));
4028 funcinfo = (struct funcinfo *)
4029 bfd_zalloc (abfd, sizeof (struct funcinfo));
4031 = _bfd_vms_save_counted_string (ptr + DST_S_B_RTNBEG_NAME);
4032 funcinfo->low = bfd_getl32 (ptr + DST_S_L_RTNBEG_ADDRESS);
4033 funcinfo->next = module->func_table;
4034 module->func_table = funcinfo;
4036 vms_debug2 ((3, "routine: %s at 0x%lx\n",
4037 funcinfo->name, (unsigned long) funcinfo->low));
4041 module->func_table->high = module->func_table->low
4042 + bfd_getl32 (ptr + DST_S_L_RTNEND_SIZE) - 1;
4044 if (module->func_table->high > module->high)
4045 module->high = module->func_table->high;
4047 vms_debug2 ((3, "end routine\n"));
4051 vms_debug2 ((3, "prologue\n"));
4055 vms_debug2 ((3, "epilog\n"));
4059 vms_debug2 ((3, "block\n"));
4063 vms_debug2 ((3, "end block\n"));
4067 src_ptr = ptr + DST_S_C_SOURCE_HEADER_SIZE;
4069 vms_debug2 ((3, "source info\n"));
4071 while (src_ptr < ptr + rec_length)
4073 int cmd = src_ptr[0], cmd_length, data;
4077 case DST__K_SRC_DECLFILE:
4080 = bfd_getl16 (src_ptr + DST_S_W_SRC_DF_FILEID);
4082 = _bfd_vms_save_counted_string (src_ptr
4083 + DST_S_B_SRC_DF_FILENAME);
4085 while (fileid >= module->file_table_count)
4087 module->file_table_count *= 2;
4089 = bfd_realloc (module->file_table,
4090 module->file_table_count
4091 * sizeof (struct fileinfo));
4094 module->file_table [fileid].name = filename;
4095 module->file_table [fileid].srec = 1;
4096 cmd_length = src_ptr[DST_S_B_SRC_DF_LENGTH] + 2;
4097 vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4098 fileid, module->file_table [fileid].name));
4102 case DST__K_SRC_DEFLINES_B:
4103 /* Perform the association and set the next higher index
4105 data = src_ptr[DST_S_B_SRC_UNSBYTE];
4106 srec = (struct srecinfo *)
4107 bfd_zalloc (abfd, sizeof (struct srecinfo));
4108 srec->line = curr_srec->line + data;
4109 srec->srec = curr_srec->srec + data;
4110 srec->sfile = curr_srec->sfile;
4111 curr_srec->next = srec;
4114 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data));
4117 case DST__K_SRC_DEFLINES_W:
4118 /* Perform the association and set the next higher index
4120 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4121 srec = (struct srecinfo *)
4122 bfd_zalloc (abfd, sizeof (struct srecinfo));
4123 srec->line = curr_srec->line + data;
4124 srec->srec = curr_srec->srec + data,
4125 srec->sfile = curr_srec->sfile;
4126 curr_srec->next = srec;
4129 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data));
4132 case DST__K_SRC_INCRLNUM_B:
4133 data = src_ptr[DST_S_B_SRC_UNSBYTE];
4134 curr_srec->line += data;
4136 vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data));
4139 case DST__K_SRC_SETFILE:
4140 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4141 curr_srec->sfile = data;
4142 curr_srec->srec = module->file_table[data].srec;
4144 vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data));
4147 case DST__K_SRC_SETLNUM_L:
4148 data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4149 curr_srec->line = data;
4151 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data));
4154 case DST__K_SRC_SETLNUM_W:
4155 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4156 curr_srec->line = data;
4158 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data));
4161 case DST__K_SRC_SETREC_L:
4162 data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4163 curr_srec->srec = data;
4164 module->file_table[curr_srec->sfile].srec = data;
4166 vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data));
4169 case DST__K_SRC_SETREC_W:
4170 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4171 curr_srec->srec = data;
4172 module->file_table[curr_srec->sfile].srec = data;
4174 vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data));
4177 case DST__K_SRC_FORMFEED:
4179 vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4183 (*_bfd_error_handler) (_("unknown source command %d"),
4189 src_ptr += cmd_length;
4193 case DST__K_LINE_NUM:
4194 pcl_ptr = ptr + DST_S_C_LINE_NUM_HEADER_SIZE;
4196 vms_debug2 ((3, "line info\n"));
4198 while (pcl_ptr < ptr + rec_length)
4200 /* The command byte is signed so we must sign-extend it. */
4201 int cmd = ((signed char *)pcl_ptr)[0], cmd_length, data;
4205 case DST__K_DELTA_PC_W:
4206 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4210 vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data));
4213 case DST__K_DELTA_PC_L:
4214 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4218 vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data));
4221 case DST__K_INCR_LINUM:
4222 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4223 curr_linenum += data;
4225 vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data));
4228 case DST__K_INCR_LINUM_W:
4229 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4230 curr_linenum += data;
4232 vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data));
4235 case DST__K_INCR_LINUM_L:
4236 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4237 curr_linenum += data;
4239 vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data));
4242 case DST__K_SET_LINUM_INCR:
4243 (*_bfd_error_handler)
4244 (_("DST__K_SET_LINUM_INCR not implemented"));
4248 case DST__K_SET_LINUM_INCR_W:
4249 (*_bfd_error_handler)
4250 (_("DST__K_SET_LINUM_INCR_W not implemented"));
4254 case DST__K_RESET_LINUM_INCR:
4255 (*_bfd_error_handler)
4256 (_("DST__K_RESET_LINUM_INCR not implemented"));
4260 case DST__K_BEG_STMT_MODE:
4261 (*_bfd_error_handler)
4262 (_("DST__K_BEG_STMT_MODE not implemented"));
4266 case DST__K_END_STMT_MODE:
4267 (*_bfd_error_handler)
4268 (_("DST__K_END_STMT_MODE not implemented"));
4272 case DST__K_SET_LINUM_B:
4273 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4274 curr_linenum = data;
4276 vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data));
4279 case DST__K_SET_LINUM:
4280 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4281 curr_linenum = data;
4283 vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data));
4286 case DST__K_SET_LINUM_L:
4287 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4288 curr_linenum = data;
4290 vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data));
4294 (*_bfd_error_handler)
4295 (_("DST__K_SET_PC not implemented"));
4299 case DST__K_SET_PC_W:
4300 (*_bfd_error_handler)
4301 (_("DST__K_SET_PC_W not implemented"));
4305 case DST__K_SET_PC_L:
4306 (*_bfd_error_handler)
4307 (_("DST__K_SET_PC_L not implemented"));
4311 case DST__K_SET_STMTNUM:
4312 (*_bfd_error_handler)
4313 (_("DST__K_SET_STMTNUM not implemented"));
4318 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4321 vms_debug2 ((4, "DST__K_TERM: %d\n", data));
4325 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4328 vms_debug2 ((4, "DST__K_TERM_W: %d\n", data));
4332 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4335 vms_debug2 ((4, "DST__K_TERM_L: %d\n", data));
4338 case DST__K_SET_ABS_PC:
4339 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4342 vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data));
4351 vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4352 (unsigned long)curr_pc, curr_linenum));
4356 (*_bfd_error_handler) (_("unknown line command %d"),
4363 if ((curr_linenum != prev_linum && curr_pc != prev_pc)
4365 || cmd == DST__K_DELTA_PC_L
4366 || cmd == DST__K_DELTA_PC_W)
4368 line = (struct lineinfo *)
4369 bfd_zalloc (abfd, sizeof (struct lineinfo));
4370 line->address = curr_pc;
4371 line->line = curr_linenum;
4373 curr_line->next = line;
4376 prev_linum = curr_linenum;
4378 vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4379 (unsigned long)curr_pc, curr_linenum));
4382 pcl_ptr += cmd_length;
4386 case 0x17: /* Undocumented type used by DEC C to declare equates. */
4387 vms_debug2 ((3, "undocumented type 0x17\n"));
4391 vms_debug2 ((3, "ignoring record\n"));
4399 /* Finalize tables with EOL marker. */
4400 srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
4401 srec->line = (unsigned int) -1;
4402 srec->srec = (unsigned int) -1;
4403 curr_srec->next = srec;
4405 line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
4406 line->line = (unsigned int) -1;
4407 line->address = (bfd_vma) -1;
4408 curr_line->next = line;
4410 /* Advertise that this module has been parsed. This is needed
4411 because parsing can be either performed at module creation
4412 or deferred until debug info is consumed. */
4413 SET_MODULE_PARSED (module);
4416 /* Build the list of modules for the specified BFD. */
4418 static struct module *
4419 build_module_list (bfd *abfd)
4421 struct module *module, *list = NULL;
4424 if ((dmt = bfd_get_section_by_name (abfd, "$DMT$")))
4426 /* We have a DMT section so this must be an image. Parse the
4427 section and build the list of modules. This is sufficient
4428 since we can compute the start address and the end address
4429 of every module from the section contents. */
4430 bfd_size_type size = bfd_get_section_size (dmt);
4431 unsigned char *ptr, *end;
4433 ptr = (unsigned char *) bfd_alloc (abfd, size);
4437 if (! bfd_get_section_contents (abfd, dmt, ptr, 0, size))
4440 vms_debug2 ((2, "DMT\n"));
4446 /* Each header declares a module with its start offset and size
4447 of debug info in the DST section, as well as the count of
4448 program sections (i.e. address spans) it contains. */
4449 int modbeg = bfd_getl32 (ptr + DBG_S_L_DMT_MODBEG);
4450 int msize = bfd_getl32 (ptr + DBG_S_L_DST_SIZE);
4451 int count = bfd_getl16 (ptr + DBG_S_W_DMT_PSECT_COUNT);
4452 ptr += DBG_S_C_DMT_HEADER_SIZE;
4454 vms_debug2 ((3, "module: modbeg = %d, size = %d, count = %d\n",
4455 modbeg, msize, count));
4457 /* We create a 'module' structure for each program section since
4458 we only support contiguous addresses in a 'module' structure.
4459 As a consequence, the actual debug info in the DST section is
4460 shared and can be parsed multiple times; that doesn't seem to
4461 cause problems in practice. */
4464 int start = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_START);
4465 int length = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_LENGTH);
4466 module = new_module (abfd);
4467 module->modbeg = modbeg;
4468 module->size = msize;
4469 module->low = start;
4470 module->high = start + length;
4471 module->next = list;
4473 ptr += DBG_S_C_DMT_PSECT_SIZE;
4475 vms_debug2 ((4, "section: start = 0x%x, length = %d\n",
4482 /* We don't have a DMT section so this must be an object. Parse
4483 the module right now in order to compute its start address and
4485 module = new_module (abfd);
4486 parse_module (abfd, module, PRIV (dst_section)->contents, -1);
4493 /* Calculate and return the name of the source file and the line nearest
4494 to the wanted location in the specified module. */
4497 module_find_nearest_line (bfd *abfd, struct module *module, bfd_vma addr,
4498 const char **file, const char **func,
4501 struct funcinfo *funcinfo;
4502 struct lineinfo *lineinfo;
4503 struct srecinfo *srecinfo;
4504 bfd_boolean ret = FALSE;
4506 /* Parse this module if that was not done at module creation. */
4507 if (! IS_MODULE_PARSED (module))
4509 unsigned int size = module->size;
4510 unsigned int modbeg = PRIV (dst_section)->filepos + module->modbeg;
4511 unsigned char *buffer = (unsigned char *) bfd_malloc (module->size);
4513 if (bfd_seek (abfd, modbeg, SEEK_SET) != 0
4514 || bfd_bread (buffer, size, abfd) != size)
4516 bfd_set_error (bfd_error_no_debug_section);
4520 parse_module (abfd, module, buffer, size);
4524 /* Find out the function (if any) that contains the address. */
4525 for (funcinfo = module->func_table; funcinfo; funcinfo = funcinfo->next)
4526 if (addr >= funcinfo->low && addr <= funcinfo->high)
4528 *func = funcinfo->name;
4533 /* Find out the source file and the line nearest to the address. */
4534 for (lineinfo = module->line_table; lineinfo; lineinfo = lineinfo->next)
4535 if (lineinfo->next && addr < lineinfo->next->address)
4537 for (srecinfo = module->srec_table; srecinfo; srecinfo = srecinfo->next)
4538 if (srecinfo->next && lineinfo->line < srecinfo->next->line)
4540 if (srecinfo->sfile > 0)
4542 *file = module->file_table[srecinfo->sfile].name;
4543 *line = srecinfo->srec + lineinfo->line - srecinfo->line;
4547 *file = module->name;
4548 *line = lineinfo->line;
4559 /* Provided a BFD, a section and an offset into the section, calculate and
4560 return the name of the source file and the line nearest to the wanted
4564 _bfd_vms_find_nearest_dst_line (bfd *abfd, asection *section,
4565 asymbol **symbols ATTRIBUTE_UNUSED,
4566 bfd_vma offset, const char **file,
4567 const char **func, unsigned int *line)
4569 struct module *module;
4571 /* What address are we looking for? */
4572 bfd_vma addr = section->vma + offset;
4578 if (PRIV (dst_section) == NULL || !(abfd->flags & (EXEC_P | DYNAMIC)))
4581 if (PRIV (modules) == NULL)
4583 PRIV (modules) = build_module_list (abfd);
4584 if (PRIV (modules) == NULL)
4588 for (module = PRIV (modules); module; module = module->next)
4589 if (addr >= module->low && addr <= module->high)
4590 return module_find_nearest_line (abfd, module, addr, file, func, line);
4595 /* Canonicalizations. */
4596 /* Set name, value, section and flags of SYM from E. */
4599 alpha_vms_convert_symbol (bfd *abfd, struct vms_symbol_entry *e, asymbol *sym)
4608 flags = BSF_NO_FLAGS;
4614 if (e->flags & EGSY__V_WEAK)
4617 if (e->flags & EGSY__V_DEF)
4619 /* Symbol definition. */
4620 flags |= BSF_GLOBAL;
4621 if (e->flags & EGSY__V_NORM)
4622 flags |= BSF_FUNCTION;
4624 sec = PRIV (sections)[e->section];
4628 /* Symbol reference. */
4629 sec = bfd_und_section_ptr;
4634 /* A universal symbol is by definition global... */
4635 flags |= BSF_GLOBAL;
4637 /* ...and dynamic in shared libraries. */
4638 if (abfd->flags & DYNAMIC)
4639 flags |= BSF_DYNAMIC;
4641 if (e->flags & EGSY__V_WEAK)
4644 if (!(e->flags & EGSY__V_DEF))
4647 if (e->flags & EGSY__V_NORM)
4648 flags |= BSF_FUNCTION;
4650 value = e->symbol_vector;
4652 /* Adding this offset is necessary in order for GDB to
4653 read the DWARF-2 debug info from shared libraries. */
4654 if ((abfd->flags & DYNAMIC) && strstr (name, "$DWARF2.DEBUG") != 0)
4655 value += PRIV (symvva);
4657 sec = bfd_abs_section_ptr;
4659 /* Find containing section. */
4664 for (s = abfd->sections; s; s = s->next)
4668 && !(s->flags & SEC_COFF_SHARED_LIBRARY)
4669 && (s->size > 0 || !(e->flags & EGSY__V_REL)))
4693 /* Return the number of bytes required to store a vector of pointers
4694 to asymbols for all the symbols in the BFD abfd, including a
4695 terminal NULL pointer. If there are no symbols in the BFD,
4696 then return 0. If an error occurs, return -1. */
4699 alpha_vms_get_symtab_upper_bound (bfd *abfd)
4701 vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
4702 abfd, PRIV (gsd_sym_count)));
4704 return (PRIV (gsd_sym_count) + 1) * sizeof (asymbol *);
4707 /* Read the symbols from the BFD abfd, and fills in the vector
4708 location with pointers to the symbols and a trailing NULL.
4710 Return number of symbols read. */
4713 alpha_vms_canonicalize_symtab (bfd *abfd, asymbol **symbols)
4717 vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd));
4719 if (PRIV (csymbols) == NULL)
4721 PRIV (csymbols) = (asymbol **) bfd_alloc
4722 (abfd, PRIV (gsd_sym_count) * sizeof (asymbol *));
4724 /* Traverse table and fill symbols vector. */
4725 for (i = 0; i < PRIV (gsd_sym_count); i++)
4727 struct vms_symbol_entry *e = PRIV (syms)[i];
4730 sym = bfd_make_empty_symbol (abfd);
4731 if (sym == NULL || !alpha_vms_convert_symbol (abfd, e, sym))
4733 bfd_release (abfd, PRIV (csymbols));
4734 PRIV (csymbols) = NULL;
4738 PRIV (csymbols)[i] = sym;
4742 if (symbols != NULL)
4744 for (i = 0; i < PRIV (gsd_sym_count); i++)
4745 symbols[i] = PRIV (csymbols)[i];
4749 return PRIV (gsd_sym_count);
4752 /* Read and convert relocations from ETIR. We do it once for all sections. */
4755 alpha_vms_slurp_relocs (bfd *abfd)
4759 vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
4761 /* We slurp relocs only once, for all sections. */
4762 if (PRIV (reloc_done))
4764 PRIV (reloc_done) = TRUE;
4766 if (alpha_vms_canonicalize_symtab (abfd, NULL) < 0)
4769 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
4774 unsigned char *begin;
4777 bfd_reloc_code_real_type reloc_code;
4783 bfd_vma cur_address;
4785 unsigned char *cur_sym = NULL;
4787 bfd_vma cur_addend = 0;
4789 /* Skip non-ETIR records. */
4790 type = _bfd_vms_get_object_record (abfd);
4791 if (type == EOBJ__C_EEOM)
4793 if (type != EOBJ__C_ETIR)
4796 begin = PRIV (recrd.rec) + 4;
4797 end = PRIV (recrd.rec) + PRIV (recrd.rec_size);
4799 for (ptr = begin; ptr < end; ptr += length)
4803 cmd = bfd_getl16 (ptr);
4804 length = bfd_getl16 (ptr + 2);
4806 cur_address = vaddr;
4808 vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
4809 _bfd_vms_etir_name (cmd)));
4813 case ETIR__C_STA_GBL: /* ALPHA_R_REFLONG und_section, step 1 */
4814 /* ALPHA_R_REFQUAD und_section, step 1 */
4819 case ETIR__C_STA_PQ: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
4820 cur_psidx = bfd_getl32 (ptr + 4);
4821 cur_addend = bfd_getl64 (ptr + 8);
4825 case ETIR__C_CTL_SETRB:
4826 if (prev_cmd != ETIR__C_STA_PQ)
4828 (*_bfd_error_handler)
4829 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd),
4830 _bfd_vms_etir_name (cmd));
4833 cur_psect = cur_psidx;
4839 case ETIR__C_STA_LW: /* ALPHA_R_REFLONG abs_section, step 1 */
4840 /* ALPHA_R_REFLONG und_section, step 2 */
4843 if (prev_cmd != ETIR__C_STA_GBL)
4845 (*_bfd_error_handler)
4846 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
4847 _bfd_vms_etir_name (ETIR__C_STA_LW));
4851 cur_addend = bfd_getl32 (ptr + 4);
4855 case ETIR__C_STA_QW: /* ALPHA_R_REFQUAD abs_section, step 1 */
4856 /* ALPHA_R_REFQUAD und_section, step 2 */
4857 if (prev_cmd != -1 && prev_cmd != ETIR__C_STA_GBL)
4859 (*_bfd_error_handler)
4860 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
4861 _bfd_vms_etir_name (ETIR__C_STA_QW));
4864 cur_addend = bfd_getl64 (ptr + 4);
4868 case ETIR__C_STO_LW: /* ALPHA_R_REFLONG und_section, step 4 */
4869 /* ALPHA_R_REFLONG abs_section, step 2 */
4870 /* ALPHA_R_REFLONG others, step 2 */
4871 if (prev_cmd != ETIR__C_OPR_ADD
4872 && prev_cmd != ETIR__C_STA_LW
4873 && prev_cmd != ETIR__C_STA_PQ)
4875 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
4876 _bfd_vms_etir_name (prev_cmd),
4877 _bfd_vms_etir_name (ETIR__C_STO_LW));
4880 reloc_code = BFD_RELOC_32;
4883 case ETIR__C_STO_QW: /* ALPHA_R_REFQUAD und_section, step 4 */
4884 /* ALPHA_R_REFQUAD abs_section, step 2 */
4885 if (prev_cmd != ETIR__C_OPR_ADD && prev_cmd != ETIR__C_STA_QW)
4887 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
4888 _bfd_vms_etir_name (prev_cmd),
4889 _bfd_vms_etir_name (ETIR__C_STO_QW));
4892 reloc_code = BFD_RELOC_64;
4895 case ETIR__C_STO_OFF: /* ALPHA_R_REFQUAD others, step 2 */
4896 if (prev_cmd != ETIR__C_STA_PQ)
4898 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
4899 _bfd_vms_etir_name (prev_cmd),
4900 _bfd_vms_etir_name (ETIR__C_STO_OFF));
4903 reloc_code = BFD_RELOC_64;
4906 case ETIR__C_OPR_ADD: /* ALPHA_R_REFLONG und_section, step 3 */
4907 /* ALPHA_R_REFQUAD und_section, step 3 */
4908 if (prev_cmd != ETIR__C_STA_LW && prev_cmd != ETIR__C_STA_QW)
4910 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
4911 _bfd_vms_etir_name (prev_cmd),
4912 _bfd_vms_etir_name (ETIR__C_OPR_ADD));
4915 prev_cmd = ETIR__C_OPR_ADD;
4918 case ETIR__C_STO_CA: /* ALPHA_R_CODEADDR */
4919 reloc_code = BFD_RELOC_ALPHA_CODEADDR;
4923 case ETIR__C_STO_GBL: /* ALPHA_R_REFQUAD und_section */
4924 reloc_code = BFD_RELOC_64;
4928 case ETIR__C_STO_GBL_LW: /* ALPHA_R_REFLONG und_section */
4929 reloc_code = BFD_RELOC_32;
4933 case ETIR__C_STC_LP_PSB: /* ALPHA_R_LINKAGE */
4934 reloc_code = BFD_RELOC_ALPHA_LINKAGE;
4938 case ETIR__C_STC_NOP_GBL: /* ALPHA_R_NOP */
4939 reloc_code = BFD_RELOC_ALPHA_NOP;
4942 case ETIR__C_STC_BSR_GBL: /* ALPHA_R_BSR */
4943 reloc_code = BFD_RELOC_ALPHA_BSR;
4946 case ETIR__C_STC_LDA_GBL: /* ALPHA_R_LDA */
4947 reloc_code = BFD_RELOC_ALPHA_LDA;
4950 case ETIR__C_STC_BOH_GBL: /* ALPHA_R_BOH */
4951 reloc_code = BFD_RELOC_ALPHA_BOH;
4955 cur_sym = ptr + 4 + 32;
4956 cur_address = bfd_getl64 (ptr + 4 + 8);
4957 cur_addend = bfd_getl64 (ptr + 4 + 24);
4960 case ETIR__C_STO_IMM:
4961 vaddr += bfd_getl32 (ptr + 4);
4965 (*_bfd_error_handler) (_("Unknown reloc %s"),
4966 _bfd_vms_etir_name (cmd));
4972 struct vms_section_data_struct *vms_sec;
4975 /* Get section to which the relocation applies. */
4976 if (cur_psect < 0 || cur_psect > (int)PRIV (section_count))
4978 (*_bfd_error_handler) (_("Invalid section index in ETIR"));
4981 sec = PRIV (sections)[cur_psect];
4982 vms_sec = vms_section_data (sec);
4984 /* Allocate a reloc entry. */
4985 if (sec->reloc_count >= vms_sec->reloc_max)
4987 if (vms_sec->reloc_max == 0)
4989 vms_sec->reloc_max = 64;
4990 sec->relocation = bfd_zmalloc
4991 (vms_sec->reloc_max * sizeof (arelent));
4995 vms_sec->reloc_max *= 2;
4996 sec->relocation = bfd_realloc
4997 (sec->relocation, vms_sec->reloc_max * sizeof (arelent));
5000 reloc = &sec->relocation[sec->reloc_count];
5003 reloc->howto = bfd_reloc_type_lookup (abfd, reloc_code);
5005 if (cur_sym != NULL)
5008 unsigned int symlen = *cur_sym;
5011 /* Linear search. */
5016 for (j = 0; j < PRIV (gsd_sym_count); j++)
5017 if (PRIV (syms)[j]->namelen == symlen
5018 && memcmp (PRIV (syms)[j]->name, cur_sym, symlen) == 0)
5020 sym = &PRIV (csymbols)[j];
5025 (*_bfd_error_handler) (_("Unknown symbol in command %s"),
5026 _bfd_vms_etir_name (cmd));
5027 reloc->sym_ptr_ptr = NULL;
5030 reloc->sym_ptr_ptr = sym;
5032 else if (cur_psidx >= 0)
5033 reloc->sym_ptr_ptr =
5034 PRIV (sections)[cur_psidx]->symbol_ptr_ptr;
5036 reloc->sym_ptr_ptr = NULL;
5038 reloc->address = cur_address;
5039 reloc->addend = cur_addend;
5041 vaddr += bfd_get_reloc_size (reloc->howto);
5050 vms_debug2 ((3, "alpha_vms_slurp_relocs: result = TRUE\n"));
5055 /* Return the number of bytes required to store the relocation
5056 information associated with the given section. */
5059 alpha_vms_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *section)
5061 alpha_vms_slurp_relocs (abfd);
5063 return (section->reloc_count + 1) * sizeof (arelent *);
5066 /* Convert relocations from VMS (external) form into BFD internal
5067 form. Return the number of relocations. */
5070 alpha_vms_canonicalize_reloc (bfd *abfd, asection *section, arelent **relptr,
5071 asymbol **symbols ATTRIBUTE_UNUSED)
5076 if (!alpha_vms_slurp_relocs (abfd))
5079 count = section->reloc_count;
5080 tblptr = section->relocation;
5083 *relptr++ = tblptr++;
5085 *relptr = (arelent *) NULL;
5086 return section->reloc_count;
5089 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
5091 /* How to process the various reloc types. */
5093 static bfd_reloc_status_type
5094 reloc_nil (bfd * abfd ATTRIBUTE_UNUSED,
5095 arelent *reloc ATTRIBUTE_UNUSED,
5096 asymbol *sym ATTRIBUTE_UNUSED,
5097 void * data ATTRIBUTE_UNUSED,
5098 asection *sec ATTRIBUTE_UNUSED,
5099 bfd *output_bfd ATTRIBUTE_UNUSED,
5100 char **error_message ATTRIBUTE_UNUSED)
5103 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd, output_bfd);
5104 vms_debug (2, "In section %s, symbol %s\n",
5105 sec->name, sym->name);
5106 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5107 reloc->sym_ptr_ptr[0]->name,
5108 (unsigned long)reloc->address,
5109 (unsigned long)reloc->addend, reloc->howto->name);
5110 vms_debug (2, "data at %p\n", data);
5111 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5114 return bfd_reloc_ok;
5117 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5118 from smaller values. Start with zero, widen, *then* decrement. */
5119 #define MINUS_ONE (((bfd_vma)0) - 1)
5121 static reloc_howto_type alpha_howto_table[] =
5123 HOWTO (ALPHA_R_IGNORE, /* Type. */
5124 0, /* Rightshift. */
5125 0, /* Size (0 = byte, 1 = short, 2 = long). */
5127 TRUE, /* PC relative. */
5129 complain_overflow_dont,/* Complain_on_overflow. */
5130 reloc_nil, /* Special_function. */
5131 "IGNORE", /* Name. */
5132 TRUE, /* Partial_inplace. */
5133 0, /* Source mask */
5135 TRUE), /* PC rel offset. */
5137 /* A 64 bit reference to a symbol. */
5138 HOWTO (ALPHA_R_REFQUAD, /* Type. */
5139 0, /* Rightshift. */
5140 4, /* Size (0 = byte, 1 = short, 2 = long). */
5142 FALSE, /* PC relative. */
5144 complain_overflow_bitfield, /* Complain_on_overflow. */
5145 reloc_nil, /* Special_function. */
5146 "REFQUAD", /* Name. */
5147 TRUE, /* Partial_inplace. */
5148 MINUS_ONE, /* Source mask. */
5149 MINUS_ONE, /* Dest mask. */
5150 FALSE), /* PC rel offset. */
5152 /* A 21 bit branch. The native assembler generates these for
5153 branches within the text segment, and also fills in the PC
5154 relative offset in the instruction. */
5155 HOWTO (ALPHA_R_BRADDR, /* Type. */
5156 2, /* Rightshift. */
5157 2, /* Size (0 = byte, 1 = short, 2 = long). */
5159 TRUE, /* PC relative. */
5161 complain_overflow_signed, /* Complain_on_overflow. */
5162 reloc_nil, /* Special_function. */
5163 "BRADDR", /* Name. */
5164 TRUE, /* Partial_inplace. */
5165 0x1fffff, /* Source mask. */
5166 0x1fffff, /* Dest mask. */
5167 FALSE), /* PC rel offset. */
5169 /* A hint for a jump to a register. */
5170 HOWTO (ALPHA_R_HINT, /* Type. */
5171 2, /* Rightshift. */
5172 1, /* Size (0 = byte, 1 = short, 2 = long). */
5174 TRUE, /* PC relative. */
5176 complain_overflow_dont,/* Complain_on_overflow. */
5177 reloc_nil, /* Special_function. */
5179 TRUE, /* Partial_inplace. */
5180 0x3fff, /* Source mask. */
5181 0x3fff, /* Dest mask. */
5182 FALSE), /* PC rel offset. */
5184 /* 16 bit PC relative offset. */
5185 HOWTO (ALPHA_R_SREL16, /* Type. */
5186 0, /* Rightshift. */
5187 1, /* Size (0 = byte, 1 = short, 2 = long). */
5189 TRUE, /* PC relative. */
5191 complain_overflow_signed, /* Complain_on_overflow. */
5192 reloc_nil, /* Special_function. */
5193 "SREL16", /* Name. */
5194 TRUE, /* Partial_inplace. */
5195 0xffff, /* Source mask. */
5196 0xffff, /* Dest mask. */
5197 FALSE), /* PC rel offset. */
5199 /* 32 bit PC relative offset. */
5200 HOWTO (ALPHA_R_SREL32, /* Type. */
5201 0, /* Rightshift. */
5202 2, /* Size (0 = byte, 1 = short, 2 = long). */
5204 TRUE, /* PC relative. */
5206 complain_overflow_signed, /* Complain_on_overflow. */
5207 reloc_nil, /* Special_function. */
5208 "SREL32", /* Name. */
5209 TRUE, /* Partial_inplace. */
5210 0xffffffff, /* Source mask. */
5211 0xffffffff, /* Dest mask. */
5212 FALSE), /* PC rel offset. */
5214 /* A 64 bit PC relative offset. */
5215 HOWTO (ALPHA_R_SREL64, /* Type. */
5216 0, /* Rightshift. */
5217 4, /* Size (0 = byte, 1 = short, 2 = long). */
5219 TRUE, /* PC relative. */
5221 complain_overflow_signed, /* Complain_on_overflow. */
5222 reloc_nil, /* Special_function. */
5223 "SREL64", /* Name. */
5224 TRUE, /* Partial_inplace. */
5225 MINUS_ONE, /* Source mask. */
5226 MINUS_ONE, /* Dest mask. */
5227 FALSE), /* PC rel offset. */
5229 /* Push a value on the reloc evaluation stack. */
5230 HOWTO (ALPHA_R_OP_PUSH, /* Type. */
5231 0, /* Rightshift. */
5232 0, /* Size (0 = byte, 1 = short, 2 = long). */
5234 FALSE, /* PC relative. */
5236 complain_overflow_dont,/* Complain_on_overflow. */
5237 reloc_nil, /* Special_function. */
5238 "OP_PUSH", /* Name. */
5239 FALSE, /* Partial_inplace. */
5240 0, /* Source mask. */
5242 FALSE), /* PC rel offset. */
5244 /* Store the value from the stack at the given address. Store it in
5245 a bitfield of size r_size starting at bit position r_offset. */
5246 HOWTO (ALPHA_R_OP_STORE, /* Type. */
5247 0, /* Rightshift. */
5248 4, /* Size (0 = byte, 1 = short, 2 = long). */
5250 FALSE, /* PC relative. */
5252 complain_overflow_dont,/* Complain_on_overflow. */
5253 reloc_nil, /* Special_function. */
5254 "OP_STORE", /* Name. */
5255 FALSE, /* Partial_inplace. */
5256 0, /* Source mask. */
5257 MINUS_ONE, /* Dest mask. */
5258 FALSE), /* PC rel offset. */
5260 /* Subtract the reloc address from the value on the top of the
5261 relocation stack. */
5262 HOWTO (ALPHA_R_OP_PSUB, /* Type. */
5263 0, /* Rightshift. */
5264 0, /* Size (0 = byte, 1 = short, 2 = long). */
5266 FALSE, /* PC relative. */
5268 complain_overflow_dont,/* Complain_on_overflow. */
5269 reloc_nil, /* Special_function. */
5270 "OP_PSUB", /* Name. */
5271 FALSE, /* Partial_inplace. */
5272 0, /* Source mask. */
5274 FALSE), /* PC rel offset. */
5276 /* Shift the value on the top of the relocation stack right by the
5278 HOWTO (ALPHA_R_OP_PRSHIFT, /* Type. */
5279 0, /* Rightshift. */
5280 0, /* Size (0 = byte, 1 = short, 2 = long). */
5282 FALSE, /* PC relative. */
5284 complain_overflow_dont,/* Complain_on_overflow. */
5285 reloc_nil, /* Special_function. */
5286 "OP_PRSHIFT", /* Name. */
5287 FALSE, /* Partial_inplace. */
5288 0, /* Source mask. */
5290 FALSE), /* PC rel offset. */
5292 /* Hack. Linkage is done by linker. */
5293 HOWTO (ALPHA_R_LINKAGE, /* Type. */
5294 0, /* Rightshift. */
5295 8, /* Size (0 = byte, 1 = short, 2 = long). */
5297 FALSE, /* PC relative. */
5299 complain_overflow_dont,/* Complain_on_overflow. */
5300 reloc_nil, /* Special_function. */
5301 "LINKAGE", /* Name. */
5302 FALSE, /* Partial_inplace. */
5303 0, /* Source mask. */
5305 FALSE), /* PC rel offset. */
5307 /* A 32 bit reference to a symbol. */
5308 HOWTO (ALPHA_R_REFLONG, /* Type. */
5309 0, /* Rightshift. */
5310 2, /* Size (0 = byte, 1 = short, 2 = long). */
5312 FALSE, /* PC relative. */
5314 complain_overflow_bitfield, /* Complain_on_overflow. */
5315 reloc_nil, /* Special_function. */
5316 "REFLONG", /* Name. */
5317 TRUE, /* Partial_inplace. */
5318 0xffffffff, /* Source mask. */
5319 0xffffffff, /* Dest mask. */
5320 FALSE), /* PC rel offset. */
5322 /* A 64 bit reference to a procedure, written as 32 bit value. */
5323 HOWTO (ALPHA_R_CODEADDR, /* Type. */
5324 0, /* Rightshift. */
5325 4, /* Size (0 = byte, 1 = short, 2 = long). */
5327 FALSE, /* PC relative. */
5329 complain_overflow_signed,/* Complain_on_overflow. */
5330 reloc_nil, /* Special_function. */
5331 "CODEADDR", /* Name. */
5332 FALSE, /* Partial_inplace. */
5333 0xffffffff, /* Source mask. */
5334 0xffffffff, /* Dest mask. */
5335 FALSE), /* PC rel offset. */
5337 HOWTO (ALPHA_R_NOP, /* Type. */
5338 0, /* Rightshift. */
5339 3, /* Size (0 = byte, 1 = short, 2 = long). */
5341 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5342 because the calculations for the 3 relocations are the same.
5343 See B.4.5.2 of the OpenVMS Linker Utility Manual. */
5344 TRUE, /* PC relative. */
5346 complain_overflow_dont,/* Complain_on_overflow. */
5347 reloc_nil, /* Special_function. */
5349 FALSE, /* Partial_inplace. */
5350 0xffffffff, /* Source mask. */
5351 0xffffffff, /* Dest mask. */
5352 FALSE), /* PC rel offset. */
5354 HOWTO (ALPHA_R_BSR, /* Type. */
5355 0, /* Rightshift. */
5356 3, /* Size (0 = byte, 1 = short, 2 = long). */
5358 TRUE, /* PC relative. */
5360 complain_overflow_dont,/* Complain_on_overflow. */
5361 reloc_nil, /* Special_function. */
5363 FALSE, /* Partial_inplace. */
5364 0xffffffff, /* Source mask. */
5365 0xffffffff, /* Dest mask. */
5366 FALSE), /* PC rel offset. */
5368 HOWTO (ALPHA_R_LDA, /* Type. */
5369 0, /* Rightshift. */
5370 3, /* Size (0 = byte, 1 = short, 2 = long). */
5372 FALSE, /* PC relative. */
5374 complain_overflow_dont,/* Complain_on_overflow. */
5375 reloc_nil, /* Special_function. */
5377 FALSE, /* Partial_inplace. */
5378 0xffffffff, /* Source mask. */
5379 0xffffffff, /* Dest mask. */
5380 FALSE), /* PC rel offset. */
5382 HOWTO (ALPHA_R_BOH, /* Type. */
5383 0, /* Rightshift. */
5384 3, /* Size (0 = byte, 1 = short, 2 = long, 3 = nil). */
5386 TRUE, /* PC relative. */
5388 complain_overflow_dont,/* Complain_on_overflow. */
5389 reloc_nil, /* Special_function. */
5391 FALSE, /* Partial_inplace. */
5392 0xffffffff, /* Source mask. */
5393 0xffffffff, /* Dest mask. */
5394 FALSE), /* PC rel offset. */
5397 /* Return a pointer to a howto structure which, when invoked, will perform
5398 the relocation code on data from the architecture noted. */
5400 static const struct reloc_howto_struct *
5401 alpha_vms_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
5402 bfd_reloc_code_real_type code)
5406 vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd, code));
5410 case BFD_RELOC_16: alpha_type = ALPHA_R_SREL16; break;
5411 case BFD_RELOC_32: alpha_type = ALPHA_R_REFLONG; break;
5412 case BFD_RELOC_64: alpha_type = ALPHA_R_REFQUAD; break;
5413 case BFD_RELOC_CTOR: alpha_type = ALPHA_R_REFQUAD; break;
5414 case BFD_RELOC_23_PCREL_S2: alpha_type = ALPHA_R_BRADDR; break;
5415 case BFD_RELOC_ALPHA_HINT: alpha_type = ALPHA_R_HINT; break;
5416 case BFD_RELOC_16_PCREL: alpha_type = ALPHA_R_SREL16; break;
5417 case BFD_RELOC_32_PCREL: alpha_type = ALPHA_R_SREL32; break;
5418 case BFD_RELOC_64_PCREL: alpha_type = ALPHA_R_SREL64; break;
5419 case BFD_RELOC_ALPHA_LINKAGE: alpha_type = ALPHA_R_LINKAGE; break;
5420 case BFD_RELOC_ALPHA_CODEADDR: alpha_type = ALPHA_R_CODEADDR; break;
5421 case BFD_RELOC_ALPHA_NOP: alpha_type = ALPHA_R_NOP; break;
5422 case BFD_RELOC_ALPHA_BSR: alpha_type = ALPHA_R_BSR; break;
5423 case BFD_RELOC_ALPHA_LDA: alpha_type = ALPHA_R_LDA; break;
5424 case BFD_RELOC_ALPHA_BOH: alpha_type = ALPHA_R_BOH; break;
5426 (*_bfd_error_handler) ("reloc (%d) is *UNKNOWN*", code);
5429 vms_debug2 ((2, "reloc is %s\n", alpha_howto_table[alpha_type].name));
5430 return & alpha_howto_table[alpha_type];
5433 static reloc_howto_type *
5434 alpha_vms_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
5440 i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
5442 if (alpha_howto_table[i].name != NULL
5443 && strcasecmp (alpha_howto_table[i].name, r_name) == 0)
5444 return &alpha_howto_table[i];
5450 alpha_vms_get_synthetic_symtab (bfd *abfd,
5451 long symcount ATTRIBUTE_UNUSED,
5452 asymbol **usyms ATTRIBUTE_UNUSED,
5453 long dynsymcount ATTRIBUTE_UNUSED,
5454 asymbol **dynsyms ATTRIBUTE_UNUSED,
5461 syms = (asymbol *) bfd_malloc (PRIV (norm_sym_count) * sizeof (asymbol));
5466 for (i = 0; i < PRIV (gsd_sym_count); i++)
5468 struct vms_symbol_entry *e = PRIV (syms)[i];
5479 flags = BSF_LOCAL | BSF_SYNTHETIC;
5485 if ((e->flags & EGSY__V_DEF) && (e->flags & EGSY__V_NORM))
5487 value = e->code_value;
5488 sec = PRIV (sections)[e->code_section];
5495 if ((e->flags & EGSY__V_DEF) && (e->flags & EGSY__V_NORM))
5500 value = e->code_value;
5502 /* Find containing section. */
5503 for (s = abfd->sections; s; s = s->next)
5507 && !(s->flags & SEC_COFF_SHARED_LIBRARY)
5508 && (s->size > 0 || !(e->flags & EGSY__V_REL)))
5525 sname = bfd_alloc (abfd, l + 5);
5528 memcpy (sname, name, l);
5529 memcpy (sname + l, "..en", 5);
5536 sym->udata.p = NULL;
5545 vms_time_to_str (unsigned char *buf)
5547 time_t t = vms_rawtime_to_time_t (buf);
5548 char *res = ctime (&t);
5551 res = "*invalid time*";
5558 evax_bfd_print_emh (FILE *file, unsigned char *rec, unsigned int rec_len)
5560 struct vms_emh_common *emh = (struct vms_emh_common *)rec;
5561 unsigned int subtype;
5563 subtype = (unsigned)bfd_getl16 (emh->subtyp);
5565 fprintf (file, _(" EMH %u (len=%u): "), subtype, rec_len);
5571 struct vms_emh_mhd *mhd = (struct vms_emh_mhd *)rec;
5574 fprintf (file, _("Module header\n"));
5575 fprintf (file, _(" structure level: %u\n"), mhd->strlvl);
5576 fprintf (file, _(" max record size: %u\n"),
5577 (unsigned)bfd_getl32 (mhd->recsiz));
5578 name = (char *)(mhd + 1);
5579 fprintf (file, _(" module name : %.*s\n"), name[0], name + 1);
5580 name += name[0] + 1;
5581 fprintf (file, _(" module version : %.*s\n"), name[0], name + 1);
5582 name += name[0] + 1;
5583 fprintf (file, _(" compile date : %.17s\n"), name);
5588 fprintf (file, _("Language Processor Name\n"));
5589 fprintf (file, _(" language name: %.*s\n"),
5590 (int)(rec_len - sizeof (struct vms_emh_common)),
5591 (char *)rec + sizeof (struct vms_emh_common));
5596 fprintf (file, _("Source Files Header\n"));
5597 fprintf (file, _(" file: %.*s\n"),
5598 (int)(rec_len - sizeof (struct vms_emh_common)),
5599 (char *)rec + sizeof (struct vms_emh_common));
5604 fprintf (file, _("Title Text Header\n"));
5605 fprintf (file, _(" title: %.*s\n"),
5606 (int)(rec_len - sizeof (struct vms_emh_common)),
5607 (char *)rec + sizeof (struct vms_emh_common));
5612 fprintf (file, _("Copyright Header\n"));
5613 fprintf (file, _(" copyright: %.*s\n"),
5614 (int)(rec_len - sizeof (struct vms_emh_common)),
5615 (char *)rec + sizeof (struct vms_emh_common));
5619 fprintf (file, _("unhandled emh subtype %u\n"), subtype);
5625 evax_bfd_print_eeom (FILE *file, unsigned char *rec, unsigned int rec_len)
5627 struct vms_eeom *eeom = (struct vms_eeom *)rec;
5629 fprintf (file, _(" EEOM (len=%u):\n"), rec_len);
5630 fprintf (file, _(" number of cond linkage pairs: %u\n"),
5631 (unsigned)bfd_getl32 (eeom->total_lps));
5632 fprintf (file, _(" completion code: %u\n"),
5633 (unsigned)bfd_getl16 (eeom->comcod));
5636 fprintf (file, _(" transfer addr flags: 0x%02x\n"), eeom->tfrflg);
5637 fprintf (file, _(" transfer addr psect: %u\n"),
5638 (unsigned)bfd_getl32 (eeom->psindx));
5639 fprintf (file, _(" transfer address : 0x%08x\n"),
5640 (unsigned)bfd_getl32 (eeom->tfradr));
5645 exav_bfd_print_egsy_flags (unsigned int flags, FILE *file)
5647 if (flags & EGSY__V_WEAK)
5648 fputs (_(" WEAK"), file);
5649 if (flags & EGSY__V_DEF)
5650 fputs (_(" DEF"), file);
5651 if (flags & EGSY__V_UNI)
5652 fputs (_(" UNI"), file);
5653 if (flags & EGSY__V_REL)
5654 fputs (_(" REL"), file);
5655 if (flags & EGSY__V_COMM)
5656 fputs (_(" COMM"), file);
5657 if (flags & EGSY__V_VECEP)
5658 fputs (_(" VECEP"), file);
5659 if (flags & EGSY__V_NORM)
5660 fputs (_(" NORM"), file);
5661 if (flags & EGSY__V_QUAD_VAL)
5662 fputs (_(" QVAL"), file);
5666 evax_bfd_print_egsd_flags (FILE *file, unsigned int flags)
5668 if (flags & EGPS__V_PIC)
5669 fputs (_(" PIC"), file);
5670 if (flags & EGPS__V_LIB)
5671 fputs (_(" LIB"), file);
5672 if (flags & EGPS__V_OVR)
5673 fputs (_(" OVR"), file);
5674 if (flags & EGPS__V_REL)
5675 fputs (_(" REL"), file);
5676 if (flags & EGPS__V_GBL)
5677 fputs (_(" GBL"), file);
5678 if (flags & EGPS__V_SHR)
5679 fputs (_(" SHR"), file);
5680 if (flags & EGPS__V_EXE)
5681 fputs (_(" EXE"), file);
5682 if (flags & EGPS__V_RD)
5683 fputs (_(" RD"), file);
5684 if (flags & EGPS__V_WRT)
5685 fputs (_(" WRT"), file);
5686 if (flags & EGPS__V_VEC)
5687 fputs (_(" VEC"), file);
5688 if (flags & EGPS__V_NOMOD)
5689 fputs (_(" NOMOD"), file);
5690 if (flags & EGPS__V_COM)
5691 fputs (_(" COM"), file);
5692 if (flags & EGPS__V_ALLOC_64BIT)
5693 fputs (_(" 64B"), file);
5697 evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len)
5699 unsigned int off = sizeof (struct vms_egsd);
5702 fprintf (file, _(" EGSD (len=%u):\n"), rec_len);
5705 for (off = sizeof (struct vms_egsd); off < rec_len; )
5707 struct vms_egsd_entry *e = (struct vms_egsd_entry *)(rec + off);
5711 type = (unsigned)bfd_getl16 (e->gsdtyp);
5712 len = (unsigned)bfd_getl16 (e->gsdsiz);
5714 fprintf (file, _(" EGSD entry %2u (type: %u, len: %u): "),
5722 struct vms_egps *egps = (struct vms_egps *)e;
5723 unsigned int flags = bfd_getl16 (egps->flags);
5726 fprintf (file, _("PSC - Program section definition\n"));
5727 fprintf (file, _(" alignment : 2**%u\n"), egps->align);
5728 fprintf (file, _(" flags : 0x%04x"), flags);
5729 evax_bfd_print_egsd_flags (file, flags);
5731 l = bfd_getl32 (egps->alloc);
5732 fprintf (file, _(" alloc (len): %u (0x%08x)\n"), l, l);
5733 fprintf (file, _(" name : %.*s\n"),
5734 egps->namlng, egps->name);
5739 struct vms_esgps *esgps = (struct vms_esgps *)e;
5740 unsigned int flags = bfd_getl16 (esgps->flags);
5743 fprintf (file, _("SPSC - Shared Image Program section def\n"));
5744 fprintf (file, _(" alignment : 2**%u\n"), esgps->align);
5745 fprintf (file, _(" flags : 0x%04x"), flags);
5746 evax_bfd_print_egsd_flags (file, flags);
5748 l = bfd_getl32 (esgps->alloc);
5749 fprintf (file, _(" alloc (len) : %u (0x%08x)\n"), l, l);
5750 fprintf (file, _(" image offset : 0x%08x\n"),
5751 (unsigned int)bfd_getl32 (esgps->base));
5752 fprintf (file, _(" symvec offset : 0x%08x\n"),
5753 (unsigned int)bfd_getl32 (esgps->value));
5754 fprintf (file, _(" name : %.*s\n"),
5755 esgps->namlng, esgps->name);
5760 struct vms_egsy *egsy = (struct vms_egsy *)e;
5761 unsigned int flags = bfd_getl16 (egsy->flags);
5763 if (flags & EGSY__V_DEF)
5765 struct vms_esdf *esdf = (struct vms_esdf *)e;
5767 fprintf (file, _("SYM - Global symbol definition\n"));
5768 fprintf (file, _(" flags: 0x%04x"), flags);
5769 exav_bfd_print_egsy_flags (flags, file);
5771 fprintf (file, _(" psect offset: 0x%08x\n"),
5772 (unsigned)bfd_getl32 (esdf->value));
5773 if (flags & EGSY__V_NORM)
5775 fprintf (file, _(" code address: 0x%08x\n"),
5776 (unsigned)bfd_getl32 (esdf->code_address));
5777 fprintf (file, _(" psect index for entry point : %u\n"),
5778 (unsigned)bfd_getl32 (esdf->ca_psindx));
5780 fprintf (file, _(" psect index : %u\n"),
5781 (unsigned)bfd_getl32 (esdf->psindx));
5782 fprintf (file, _(" name : %.*s\n"),
5783 esdf->namlng, esdf->name);
5787 struct vms_esrf *esrf = (struct vms_esrf *)e;
5789 fprintf (file, _("SYM - Global symbol reference\n"));
5790 fprintf (file, _(" name : %.*s\n"),
5791 esrf->namlng, esrf->name);
5797 struct vms_eidc *eidc = (struct vms_eidc *)e;
5798 unsigned int flags = bfd_getl32 (eidc->flags);
5801 fprintf (file, _("IDC - Ident Consistency check\n"));
5802 fprintf (file, _(" flags : 0x%08x"), flags);
5803 if (flags & EIDC__V_BINIDENT)
5804 fputs (" BINDENT", file);
5806 fprintf (file, _(" id match : %x\n"),
5807 (flags >> EIDC__V_IDMATCH_SH) & EIDC__V_IDMATCH_MASK);
5808 fprintf (file, _(" error severity: %x\n"),
5809 (flags >> EIDC__V_ERRSEV_SH) & EIDC__V_ERRSEV_MASK);
5811 fprintf (file, _(" entity name : %.*s\n"), p[0], p + 1);
5813 fprintf (file, _(" object name : %.*s\n"), p[0], p + 1);
5815 if (flags & EIDC__V_BINIDENT)
5816 fprintf (file, _(" binary ident : 0x%08x\n"),
5817 (unsigned)bfd_getl32 (p + 1));
5819 fprintf (file, _(" ascii ident : %.*s\n"), p[0], p + 1);
5824 struct vms_egst *egst = (struct vms_egst *)e;
5825 unsigned int flags = bfd_getl16 (egst->header.flags);
5827 fprintf (file, _("SYMG - Universal symbol definition\n"));
5828 fprintf (file, _(" flags: 0x%04x"), flags);
5829 exav_bfd_print_egsy_flags (flags, file);
5831 fprintf (file, _(" symbol vector offset: 0x%08x\n"),
5832 (unsigned)bfd_getl32 (egst->value));
5833 fprintf (file, _(" entry point: 0x%08x\n"),
5834 (unsigned)bfd_getl32 (egst->lp_1));
5835 fprintf (file, _(" proc descr : 0x%08x\n"),
5836 (unsigned)bfd_getl32 (egst->lp_2));
5837 fprintf (file, _(" psect index: %u\n"),
5838 (unsigned)bfd_getl32 (egst->psindx));
5839 fprintf (file, _(" name : %.*s\n"),
5840 egst->namlng, egst->name);
5845 struct vms_esdfv *esdfv = (struct vms_esdfv *)e;
5846 unsigned int flags = bfd_getl16 (esdfv->flags);
5848 fprintf (file, _("SYMV - Vectored symbol definition\n"));
5849 fprintf (file, _(" flags: 0x%04x"), flags);
5850 exav_bfd_print_egsy_flags (flags, file);
5852 fprintf (file, _(" vector : 0x%08x\n"),
5853 (unsigned)bfd_getl32 (esdfv->vector));
5854 fprintf (file, _(" psect offset: %u\n"),
5855 (unsigned)bfd_getl32 (esdfv->value));
5856 fprintf (file, _(" psect index : %u\n"),
5857 (unsigned)bfd_getl32 (esdfv->psindx));
5858 fprintf (file, _(" name : %.*s\n"),
5859 esdfv->namlng, esdfv->name);
5864 struct vms_esdfm *esdfm = (struct vms_esdfm *)e;
5865 unsigned int flags = bfd_getl16 (esdfm->flags);
5867 fprintf (file, _("SYMM - Global symbol definition with version\n"));
5868 fprintf (file, _(" flags: 0x%04x"), flags);
5869 exav_bfd_print_egsy_flags (flags, file);
5871 fprintf (file, _(" version mask: 0x%08x\n"),
5872 (unsigned)bfd_getl32 (esdfm->version_mask));
5873 fprintf (file, _(" psect offset: %u\n"),
5874 (unsigned)bfd_getl32 (esdfm->value));
5875 fprintf (file, _(" psect index : %u\n"),
5876 (unsigned)bfd_getl32 (esdfm->psindx));
5877 fprintf (file, _(" name : %.*s\n"),
5878 esdfm->namlng, esdfm->name);
5882 fprintf (file, _("unhandled egsd entry type %u\n"), type);
5890 evax_bfd_print_hex (FILE *file, const char *pfx,
5891 const unsigned char *buf, unsigned int len)
5897 for (i = 0; i < len; i++)
5901 fprintf (file, " %02x", buf[i]);
5914 evax_bfd_print_etir_stc_ir (FILE *file, const unsigned char *buf, int is_ps)
5916 fprintf (file, _(" linkage index: %u, replacement insn: 0x%08x\n"),
5917 (unsigned)bfd_getl32 (buf),
5918 (unsigned)bfd_getl32 (buf + 16));
5919 fprintf (file, _(" psect idx 1: %u, offset 1: 0x%08x %08x\n"),
5920 (unsigned)bfd_getl32 (buf + 4),
5921 (unsigned)bfd_getl32 (buf + 12),
5922 (unsigned)bfd_getl32 (buf + 8));
5923 fprintf (file, _(" psect idx 2: %u, offset 2: 0x%08x %08x\n"),
5924 (unsigned)bfd_getl32 (buf + 20),
5925 (unsigned)bfd_getl32 (buf + 28),
5926 (unsigned)bfd_getl32 (buf + 24));
5928 fprintf (file, _(" psect idx 3: %u, offset 3: 0x%08x %08x\n"),
5929 (unsigned)bfd_getl32 (buf + 32),
5930 (unsigned)bfd_getl32 (buf + 40),
5931 (unsigned)bfd_getl32 (buf + 36));
5933 fprintf (file, _(" global name: %.*s\n"), buf[32], buf + 33);
5937 evax_bfd_print_etir (FILE *file, const char *name,
5938 unsigned char *rec, unsigned int rec_len)
5940 unsigned int off = sizeof (struct vms_egsd);
5941 unsigned int sec_len;
5943 fprintf (file, _(" %s (len=%u+%u):\n"), name,
5944 (unsigned)(rec_len - sizeof (struct vms_eobjrec)),
5945 (unsigned)sizeof (struct vms_eobjrec));
5947 for (off = sizeof (struct vms_eobjrec); off < rec_len; )
5949 struct vms_etir *etir = (struct vms_etir *)(rec + off);
5954 type = bfd_getl16 (etir->rectyp);
5955 size = bfd_getl16 (etir->size);
5956 buf = rec + off + sizeof (struct vms_etir);
5958 fprintf (file, _(" (type: %3u, size: 4+%3u): "), type, size - 4);
5961 case ETIR__C_STA_GBL:
5962 fprintf (file, _("STA_GBL (stack global) %.*s\n"),
5965 case ETIR__C_STA_LW:
5966 fprintf (file, _("STA_LW (stack longword) 0x%08x\n"),
5967 (unsigned)bfd_getl32 (buf));
5969 case ETIR__C_STA_QW:
5970 fprintf (file, _("STA_QW (stack quadword) 0x%08x %08x\n"),
5971 (unsigned)bfd_getl32 (buf + 4),
5972 (unsigned)bfd_getl32 (buf + 0));
5974 case ETIR__C_STA_PQ:
5975 fprintf (file, _("STA_PQ (stack psect base + offset)\n"));
5976 fprintf (file, _(" psect: %u, offset: 0x%08x %08x\n"),
5977 (unsigned)bfd_getl32 (buf + 0),
5978 (unsigned)bfd_getl32 (buf + 8),
5979 (unsigned)bfd_getl32 (buf + 4));
5981 case ETIR__C_STA_LI:
5982 fprintf (file, _("STA_LI (stack literal)\n"));
5984 case ETIR__C_STA_MOD:
5985 fprintf (file, _("STA_MOD (stack module)\n"));
5987 case ETIR__C_STA_CKARG:
5988 fprintf (file, _("STA_CKARG (compare procedure argument)\n"));
5992 fprintf (file, _("STO_B (store byte)\n"));
5995 fprintf (file, _("STO_W (store word)\n"));
5997 case ETIR__C_STO_LW:
5998 fprintf (file, _("STO_LW (store longword)\n"));
6000 case ETIR__C_STO_QW:
6001 fprintf (file, _("STO_QW (store quadword)\n"));
6003 case ETIR__C_STO_IMMR:
6005 unsigned int len = bfd_getl32 (buf);
6007 _("STO_IMMR (store immediate repeat) %u bytes\n"),
6009 evax_bfd_print_hex (file, " ", buf + 4, len);
6013 case ETIR__C_STO_GBL:
6014 fprintf (file, _("STO_GBL (store global) %.*s\n"),
6017 case ETIR__C_STO_CA:
6018 fprintf (file, _("STO_CA (store code address) %.*s\n"),
6021 case ETIR__C_STO_RB:
6022 fprintf (file, _("STO_RB (store relative branch)\n"));
6024 case ETIR__C_STO_AB:
6025 fprintf (file, _("STO_AB (store absolute branch)\n"));
6027 case ETIR__C_STO_OFF:
6028 fprintf (file, _("STO_OFF (store offset to psect)\n"));
6030 case ETIR__C_STO_IMM:
6032 unsigned int len = bfd_getl32 (buf);
6034 _("STO_IMM (store immediate) %u bytes\n"),
6036 evax_bfd_print_hex (file, " ", buf + 4, len);
6040 case ETIR__C_STO_LP_PSB:
6041 fprintf (file, _("STO_OFF (store LP with procedure signature)\n"));
6043 case ETIR__C_STO_HINT_GBL:
6044 fprintf (file, _("STO_BR_GBL (store branch global) *todo*\n"));
6046 case ETIR__C_STO_HINT_PS:
6047 fprintf (file, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6050 case ETIR__C_OPR_NOP:
6051 fprintf (file, _("OPR_NOP (no-operation)\n"));
6053 case ETIR__C_OPR_ADD:
6054 fprintf (file, _("OPR_ADD (add)\n"));
6056 case ETIR__C_OPR_SUB:
6057 fprintf (file, _("OPR_SUB (substract)\n"));
6059 case ETIR__C_OPR_MUL:
6060 fprintf (file, _("OPR_MUL (multiply)\n"));
6062 case ETIR__C_OPR_DIV:
6063 fprintf (file, _("OPR_DIV (divide)\n"));
6065 case ETIR__C_OPR_AND:
6066 fprintf (file, _("OPR_AND (logical and)\n"));
6068 case ETIR__C_OPR_IOR:
6069 fprintf (file, _("OPR_IOR (logical inclusive or)\n"));
6071 case ETIR__C_OPR_EOR:
6072 fprintf (file, _("OPR_EOR (logical exclusive or)\n"));
6074 case ETIR__C_OPR_NEG:
6075 fprintf (file, _("OPR_NEG (negate)\n"));
6077 case ETIR__C_OPR_COM:
6078 fprintf (file, _("OPR_COM (complement)\n"));
6080 case ETIR__C_OPR_INSV:
6081 fprintf (file, _("OPR_INSV (insert field)\n"));
6083 case ETIR__C_OPR_ASH:
6084 fprintf (file, _("OPR_ASH (arithmetic shift)\n"));
6086 case ETIR__C_OPR_USH:
6087 fprintf (file, _("OPR_USH (unsigned shift)\n"));
6089 case ETIR__C_OPR_ROT:
6090 fprintf (file, _("OPR_ROT (rotate)\n"));
6092 case ETIR__C_OPR_SEL:
6093 fprintf (file, _("OPR_SEL (select)\n"));
6095 case ETIR__C_OPR_REDEF:
6096 fprintf (file, _("OPR_REDEF (redefine symbol to curr location)\n"));
6098 case ETIR__C_OPR_DFLIT:
6099 fprintf (file, _("OPR_REDEF (define a literal)\n"));
6102 case ETIR__C_STC_LP:
6103 fprintf (file, _("STC_LP (store cond linkage pair)\n"));
6105 case ETIR__C_STC_LP_PSB:
6107 _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6108 fprintf (file, _(" linkage index: %u, procedure: %.*s\n"),
6109 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6110 buf += 4 + 1 + buf[4];
6111 fprintf (file, _(" signature: %.*s\n"), buf[0], buf + 1);
6113 case ETIR__C_STC_GBL:
6114 fprintf (file, _("STC_GBL (store cond global)\n"));
6115 fprintf (file, _(" linkage index: %u, global: %.*s\n"),
6116 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6118 case ETIR__C_STC_GCA:
6119 fprintf (file, _("STC_GCA (store cond code address)\n"));
6120 fprintf (file, _(" linkage index: %u, procedure name: %.*s\n"),
6121 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6123 case ETIR__C_STC_PS:
6124 fprintf (file, _("STC_PS (store cond psect + offset)\n"));
6126 _(" linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6127 (unsigned)bfd_getl32 (buf),
6128 (unsigned)bfd_getl32 (buf + 4),
6129 (unsigned)bfd_getl32 (buf + 12),
6130 (unsigned)bfd_getl32 (buf + 8));
6132 case ETIR__C_STC_NOP_GBL:
6133 fprintf (file, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6134 evax_bfd_print_etir_stc_ir (file, buf, 0);
6136 case ETIR__C_STC_NOP_PS:
6137 fprintf (file, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6138 evax_bfd_print_etir_stc_ir (file, buf, 1);
6140 case ETIR__C_STC_BSR_GBL:
6141 fprintf (file, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6142 evax_bfd_print_etir_stc_ir (file, buf, 0);
6144 case ETIR__C_STC_BSR_PS:
6145 fprintf (file, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6146 evax_bfd_print_etir_stc_ir (file, buf, 1);
6148 case ETIR__C_STC_LDA_GBL:
6149 fprintf (file, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6150 evax_bfd_print_etir_stc_ir (file, buf, 0);
6152 case ETIR__C_STC_LDA_PS:
6153 fprintf (file, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6154 evax_bfd_print_etir_stc_ir (file, buf, 1);
6156 case ETIR__C_STC_BOH_GBL:
6157 fprintf (file, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6158 evax_bfd_print_etir_stc_ir (file, buf, 0);
6160 case ETIR__C_STC_BOH_PS:
6161 fprintf (file, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6162 evax_bfd_print_etir_stc_ir (file, buf, 1);
6164 case ETIR__C_STC_NBH_GBL:
6166 _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6168 case ETIR__C_STC_NBH_PS:
6170 _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6173 case ETIR__C_CTL_SETRB:
6174 fprintf (file, _("CTL_SETRB (set relocation base)\n"));
6177 case ETIR__C_CTL_AUGRB:
6179 unsigned int val = bfd_getl32 (buf);
6180 fprintf (file, _("CTL_AUGRB (augment relocation base) %u\n"), val);
6183 case ETIR__C_CTL_DFLOC:
6184 fprintf (file, _("CTL_DFLOC (define location)\n"));
6186 case ETIR__C_CTL_STLOC:
6187 fprintf (file, _("CTL_STLOC (set location)\n"));
6189 case ETIR__C_CTL_STKDL:
6190 fprintf (file, _("CTL_STKDL (stack defined location)\n"));
6193 fprintf (file, _("*unhandled*\n"));
6201 evax_bfd_print_eobj (struct bfd *abfd, FILE *file)
6203 bfd_boolean is_first = TRUE;
6204 bfd_boolean has_records = FALSE;
6208 unsigned int rec_len;
6209 unsigned int pad_len;
6211 unsigned int hdr_size;
6216 unsigned char buf[6];
6221 if (bfd_bread (buf, sizeof (buf), abfd) != sizeof (buf))
6223 fprintf (file, _("cannot read GST record length\n"));
6226 rec_len = bfd_getl16 (buf + 0);
6227 if (rec_len == bfd_getl16 (buf + 4)
6228 && bfd_getl16 (buf + 2) == EOBJ__C_EMH)
6230 /* The format is raw: record-size, type, record-size. */
6232 pad_len = (rec_len + 1) & ~1U;
6235 else if (rec_len == EOBJ__C_EMH)
6237 has_records = FALSE;
6238 pad_len = bfd_getl16 (buf + 2);
6244 fprintf (file, _("cannot find EMH in first GST record\n"));
6247 rec = bfd_malloc (pad_len);
6248 memcpy (rec, buf + sizeof (buf) - hdr_size, hdr_size);
6252 unsigned int rec_len2 = 0;
6253 unsigned char hdr[4];
6257 unsigned char buf_len[2];
6259 if (bfd_bread (buf_len, sizeof (buf_len), abfd)
6260 != sizeof (buf_len))
6262 fprintf (file, _("cannot read GST record length\n"));
6265 rec_len2 = (unsigned)bfd_getl16 (buf_len);
6268 if (bfd_bread (hdr, sizeof (hdr), abfd) != sizeof (hdr))
6270 fprintf (file, _("cannot read GST record header\n"));
6273 rec_len = (unsigned)bfd_getl16 (hdr + 2);
6275 pad_len = (rec_len + 1) & ~1U;
6278 rec = bfd_malloc (pad_len);
6279 memcpy (rec, hdr, sizeof (hdr));
6280 hdr_size = sizeof (hdr);
6281 if (has_records && rec_len2 != rec_len)
6283 fprintf (file, _(" corrupted GST\n"));
6288 if (bfd_bread (rec + hdr_size, pad_len - hdr_size, abfd)
6289 != pad_len - hdr_size)
6291 fprintf (file, _("cannot read GST record\n"));
6295 type = (unsigned)bfd_getl16 (rec);
6300 evax_bfd_print_emh (file, rec, rec_len);
6303 evax_bfd_print_egsd (file, rec, rec_len);
6306 evax_bfd_print_eeom (file, rec, rec_len);
6311 evax_bfd_print_etir (file, "ETIR", rec, rec_len);
6314 evax_bfd_print_etir (file, "EDBG", rec, rec_len);
6317 evax_bfd_print_etir (file, "ETBT", rec, rec_len);
6320 fprintf (file, _(" unhandled EOBJ record type %u\n"), type);
6328 evax_bfd_print_relocation_records (FILE *file, const unsigned char *rel,
6329 unsigned int stride)
6337 count = bfd_getl32 (rel + 0);
6341 base = bfd_getl32 (rel + 4);
6343 fprintf (file, _(" bitcount: %u, base addr: 0x%08x\n"),
6347 for (j = 0; count > 0; j += 4, count -= 32)
6353 val = bfd_getl32 (rel);
6356 fprintf (file, _(" bitmap: 0x%08x (count: %u):\n"), val, count);
6358 for (k = 0; k < 32; k++)
6363 fprintf (file, _(" %08x"), base + (j * 8 + k) * stride);
6378 evax_bfd_print_address_fixups (FILE *file, const unsigned char *rel)
6385 count = bfd_getl32 (rel + 0);
6388 fprintf (file, _(" image %u (%u entries)\n"),
6389 (unsigned)bfd_getl32 (rel + 4), count);
6391 for (j = 0; j < count; j++)
6393 fprintf (file, _(" offset: 0x%08x, val: 0x%08x\n"),
6394 (unsigned)bfd_getl32 (rel + 0),
6395 (unsigned)bfd_getl32 (rel + 4));
6402 evax_bfd_print_reference_fixups (FILE *file, const unsigned char *rel)
6411 count = bfd_getl32 (rel + 0);
6414 fprintf (file, _(" image %u (%u entries), offsets:\n"),
6415 (unsigned)bfd_getl32 (rel + 4), count);
6417 for (j = 0; j < count; j++)
6421 fprintf (file, _(" 0x%08x"), (unsigned)bfd_getl32 (rel));
6436 evax_bfd_print_indent (int indent, FILE *file)
6438 for (; indent; indent--)
6443 evax_bfd_get_dsc_name (unsigned int v)
6447 case DSC__K_DTYPE_Z:
6448 return "Z (Unspecified)";
6449 case DSC__K_DTYPE_V:
6451 case DSC__K_DTYPE_BU:
6452 return "BU (Byte logical)";
6453 case DSC__K_DTYPE_WU:
6454 return "WU (Word logical)";
6455 case DSC__K_DTYPE_LU:
6456 return "LU (Longword logical)";
6457 case DSC__K_DTYPE_QU:
6458 return "QU (Quadword logical)";
6459 case DSC__K_DTYPE_B:
6460 return "B (Byte integer)";
6461 case DSC__K_DTYPE_W:
6462 return "W (Word integer)";
6463 case DSC__K_DTYPE_L:
6464 return "L (Longword integer)";
6465 case DSC__K_DTYPE_Q:
6466 return "Q (Quadword integer)";
6467 case DSC__K_DTYPE_F:
6468 return "F (Single-precision floating)";
6469 case DSC__K_DTYPE_D:
6470 return "D (Double-precision floating)";
6471 case DSC__K_DTYPE_FC:
6472 return "FC (Complex)";
6473 case DSC__K_DTYPE_DC:
6474 return "DC (Double-precision Complex)";
6475 case DSC__K_DTYPE_T:
6476 return "T (ASCII text string)";
6477 case DSC__K_DTYPE_NU:
6478 return "NU (Numeric string, unsigned)";
6479 case DSC__K_DTYPE_NL:
6480 return "NL (Numeric string, left separate sign)";
6481 case DSC__K_DTYPE_NLO:
6482 return "NLO (Numeric string, left overpunched sign)";
6483 case DSC__K_DTYPE_NR:
6484 return "NR (Numeric string, right separate sign)";
6485 case DSC__K_DTYPE_NRO:
6486 return "NRO (Numeric string, right overpunched sig)";
6487 case DSC__K_DTYPE_NZ:
6488 return "NZ (Numeric string, zoned sign)";
6489 case DSC__K_DTYPE_P:
6490 return "P (Packed decimal string)";
6491 case DSC__K_DTYPE_ZI:
6492 return "ZI (Sequence of instructions)";
6493 case DSC__K_DTYPE_ZEM:
6494 return "ZEM (Procedure entry mask)";
6495 case DSC__K_DTYPE_DSC:
6496 return "DSC (Descriptor, used for arrays of dyn strings)";
6497 case DSC__K_DTYPE_OU:
6498 return "OU (Octaword logical)";
6499 case DSC__K_DTYPE_O:
6500 return "O (Octaword integer)";
6501 case DSC__K_DTYPE_G:
6502 return "G (Double precision G floating, 64 bit)";
6503 case DSC__K_DTYPE_H:
6504 return "H (Quadruple precision floating, 128 bit)";
6505 case DSC__K_DTYPE_GC:
6506 return "GC (Double precision complex, G floating)";
6507 case DSC__K_DTYPE_HC:
6508 return "HC (Quadruple precision complex, H floating)";
6509 case DSC__K_DTYPE_CIT:
6510 return "CIT (COBOL intermediate temporary)";
6511 case DSC__K_DTYPE_BPV:
6512 return "BPV (Bound Procedure Value)";
6513 case DSC__K_DTYPE_BLV:
6514 return "BLV (Bound Label Value)";
6515 case DSC__K_DTYPE_VU:
6516 return "VU (Bit Unaligned)";
6517 case DSC__K_DTYPE_ADT:
6518 return "ADT (Absolute Date-Time)";
6519 case DSC__K_DTYPE_VT:
6520 return "VT (Varying Text)";
6521 case DSC__K_DTYPE_T2:
6522 return "T2 (16-bit char)";
6523 case DSC__K_DTYPE_VT2:
6524 return "VT2 (16-bit varying char)";
6526 return "?? (unknown)";
6531 evax_bfd_print_desc (const unsigned char *buf, int indent, FILE *file)
6533 unsigned char bclass = buf[3];
6534 unsigned char dtype = buf[2];
6535 unsigned int len = (unsigned)bfd_getl16 (buf);
6536 unsigned int pointer = (unsigned)bfd_getl32 (buf + 4);
6538 evax_bfd_print_indent (indent, file);
6540 if (len == 1 && pointer == 0xffffffffUL)
6543 fprintf (file, _("64 bits *unhandled*\n"));
6547 fprintf (file, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
6548 bclass, dtype, len, pointer);
6551 case DSC__K_CLASS_NCA:
6553 const struct vms_dsc_nca *dsc = (const void *)buf;
6555 const unsigned char *b;
6557 evax_bfd_print_indent (indent, file);
6558 fprintf (file, _("non-contiguous array of %s\n"),
6559 evax_bfd_get_dsc_name (dsc->dtype));
6560 evax_bfd_print_indent (indent + 1, file);
6562 _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
6563 dsc->dimct, dsc->aflags, dsc->digits, dsc->scale);
6564 evax_bfd_print_indent (indent + 1, file);
6566 _("arsize: %u, a0: 0x%08x\n"),
6567 (unsigned)bfd_getl32 (dsc->arsize),
6568 (unsigned)bfd_getl32 (dsc->a0));
6569 evax_bfd_print_indent (indent + 1, file);
6570 fprintf (file, _("Strides:\n"));
6571 b = buf + sizeof (*dsc);
6572 for (i = 0; i < dsc->dimct; i++)
6574 evax_bfd_print_indent (indent + 2, file);
6575 fprintf (file, _("[%u]: %u\n"), i + 1,
6576 (unsigned)bfd_getl32 (b));
6579 evax_bfd_print_indent (indent + 1, file);
6580 fprintf (file, _("Bounds:\n"));
6581 b = buf + sizeof (*dsc);
6582 for (i = 0; i < dsc->dimct; i++)
6584 evax_bfd_print_indent (indent + 2, file);
6585 fprintf (file, _("[%u]: Lower: %u, upper: %u\n"), i + 1,
6586 (unsigned)bfd_getl32 (b + 0),
6587 (unsigned)bfd_getl32 (b + 4));
6592 case DSC__K_CLASS_UBS:
6594 const struct vms_dsc_ubs *ubs = (const void *)buf;
6596 evax_bfd_print_indent (indent, file);
6597 fprintf (file, _("unaligned bit-string of %s\n"),
6598 evax_bfd_get_dsc_name (ubs->dtype));
6599 evax_bfd_print_indent (indent + 1, file);
6601 _("base: %u, pos: %u\n"),
6602 (unsigned)bfd_getl32 (ubs->base),
6603 (unsigned)bfd_getl32 (ubs->pos));
6607 fprintf (file, _("*unhandled*\n"));
6614 evax_bfd_print_valspec (const unsigned char *buf, int indent, FILE *file)
6616 unsigned int vflags = buf[0];
6617 unsigned int value = (unsigned)bfd_getl32 (buf + 1);
6618 unsigned int len = 5;
6620 evax_bfd_print_indent (indent, file);
6621 fprintf (file, _("vflags: 0x%02x, value: 0x%08x "), vflags, value);
6626 case DST__K_VFLAGS_NOVAL:
6627 fprintf (file, _("(no value)\n"));
6629 case DST__K_VFLAGS_NOTACTIVE:
6630 fprintf (file, _("(not active)\n"));
6632 case DST__K_VFLAGS_UNALLOC:
6633 fprintf (file, _("(not allocated)\n"));
6635 case DST__K_VFLAGS_DSC:
6636 fprintf (file, _("(descriptor)\n"));
6637 evax_bfd_print_desc (buf + value, indent + 1, file);
6639 case DST__K_VFLAGS_TVS:
6640 fprintf (file, _("(trailing value)\n"));
6642 case DST__K_VS_FOLLOWS:
6643 fprintf (file, _("(value spec follows)\n"));
6645 case DST__K_VFLAGS_BITOFFS:
6646 fprintf (file, _("(at bit offset %u)\n"), value);
6649 fprintf (file, _("(reg: %u, disp: %u, indir: %u, kind: "),
6650 (vflags & DST__K_REGNUM_MASK) >> DST__K_REGNUM_SHIFT,
6651 vflags & DST__K_DISP ? 1 : 0,
6652 vflags & DST__K_INDIR ? 1 : 0);
6653 switch (vflags & DST__K_VALKIND_MASK)
6655 case DST__K_VALKIND_LITERAL:
6656 fputs (_("literal"), file);
6658 case DST__K_VALKIND_ADDR:
6659 fputs (_("address"), file);
6661 case DST__K_VALKIND_DESC:
6662 fputs (_("desc"), file);
6664 case DST__K_VALKIND_REG:
6665 fputs (_("reg"), file);
6668 fputs (")\n", file);
6675 evax_bfd_print_typspec (const unsigned char *buf, int indent, FILE *file)
6677 unsigned char kind = buf[2];
6678 unsigned int len = (unsigned)bfd_getl16 (buf);
6680 evax_bfd_print_indent (indent, file);
6681 fprintf (file, ("len: %2u, kind: %2u "), len, kind);
6685 case DST__K_TS_ATOM:
6686 fprintf (file, ("atomic, type=0x%02x %s\n"),
6687 buf[0], evax_bfd_get_dsc_name (buf[0]));
6690 fprintf (file, ("indirect, defined at 0x%08x\n"),
6691 (unsigned)bfd_getl32 (buf));
6693 case DST__K_TS_TPTR:
6694 fprintf (file, ("typed pointer\n"));
6695 evax_bfd_print_typspec (buf, indent + 1, file);
6698 fprintf (file, ("pointer\n"));
6700 case DST__K_TS_ARRAY:
6702 const unsigned char *vs;
6703 unsigned int vec_len;
6706 fprintf (file, ("array, dim: %u, bitmap: "), buf[0]);
6707 vec_len = (buf[0] + 1 + 7) / 8;
6708 for (i = 0; i < vec_len; i++)
6709 fprintf (file, " %02x", buf[i + 1]);
6711 vs = buf + 1 + vec_len;
6712 evax_bfd_print_indent (indent, file);
6713 fprintf (file, ("array descriptor:\n"));
6714 vs += evax_bfd_print_valspec (vs, indent + 1, file);
6715 for (i = 0; i < buf[0] + 1U; i++)
6716 if (buf[1 + i / 8] & (1 << (i % 8)))
6718 evax_bfd_print_indent (indent, file);
6720 fprintf (file, ("type spec for element:\n"));
6722 fprintf (file, ("type spec for subscript %u:\n"), i);
6723 evax_bfd_print_typspec (vs, indent + 1, file);
6724 vs += bfd_getl16 (vs);
6729 fprintf (file, ("*unhandled*\n"));
6734 evax_bfd_print_dst (struct bfd *abfd, unsigned int dst_size, FILE *file)
6736 unsigned int off = 0;
6737 unsigned int pc = 0;
6738 unsigned int line = 0;
6740 fprintf (file, _("Debug symbol table:\n"));
6742 while (dst_size > 0)
6744 struct vms_dst_header dsth;
6749 if (bfd_bread (&dsth, sizeof (dsth), abfd) != sizeof (dsth))
6751 fprintf (file, _("cannot read DST header\n"));
6754 len = bfd_getl16 (dsth.length);
6755 type = bfd_getl16 (dsth.type);
6756 fprintf (file, _(" type: %3u, len: %3u (at 0x%08x): "),
6766 len -= sizeof (dsth);
6767 buf = bfd_malloc (len);
6768 if (bfd_bread (buf, len, abfd) != len)
6770 fprintf (file, _("cannot read DST symbol\n"));
6775 case DSC__K_DTYPE_V:
6776 case DSC__K_DTYPE_BU:
6777 case DSC__K_DTYPE_WU:
6778 case DSC__K_DTYPE_LU:
6779 case DSC__K_DTYPE_QU:
6780 case DSC__K_DTYPE_B:
6781 case DSC__K_DTYPE_W:
6782 case DSC__K_DTYPE_L:
6783 case DSC__K_DTYPE_Q:
6784 case DSC__K_DTYPE_F:
6785 case DSC__K_DTYPE_D:
6786 case DSC__K_DTYPE_FC:
6787 case DSC__K_DTYPE_DC:
6788 case DSC__K_DTYPE_T:
6789 case DSC__K_DTYPE_NU:
6790 case DSC__K_DTYPE_NL:
6791 case DSC__K_DTYPE_NLO:
6792 case DSC__K_DTYPE_NR:
6793 case DSC__K_DTYPE_NRO:
6794 case DSC__K_DTYPE_NZ:
6795 case DSC__K_DTYPE_P:
6796 case DSC__K_DTYPE_ZI:
6797 case DSC__K_DTYPE_ZEM:
6798 case DSC__K_DTYPE_DSC:
6799 case DSC__K_DTYPE_OU:
6800 case DSC__K_DTYPE_O:
6801 case DSC__K_DTYPE_G:
6802 case DSC__K_DTYPE_H:
6803 case DSC__K_DTYPE_GC:
6804 case DSC__K_DTYPE_HC:
6805 case DSC__K_DTYPE_CIT:
6806 case DSC__K_DTYPE_BPV:
6807 case DSC__K_DTYPE_BLV:
6808 case DSC__K_DTYPE_VU:
6809 case DSC__K_DTYPE_ADT:
6810 case DSC__K_DTYPE_VT:
6811 case DSC__K_DTYPE_T2:
6812 case DSC__K_DTYPE_VT2:
6813 fprintf (file, _("standard data: %s\n"),
6814 evax_bfd_get_dsc_name (type));
6815 evax_bfd_print_valspec (buf, 4, file);
6816 fprintf (file, _(" name: %.*s\n"), buf[5], buf + 6);
6820 struct vms_dst_modbeg *dst = (void *)buf;
6821 const char *name = (const char *)buf + sizeof (*dst);
6823 fprintf (file, _("modbeg\n"));
6824 fprintf (file, _(" flags: %d, language: %u, "
6825 "major: %u, minor: %u\n"),
6827 (unsigned)bfd_getl32 (dst->language),
6828 (unsigned)bfd_getl16 (dst->major),
6829 (unsigned)bfd_getl16 (dst->minor));
6830 fprintf (file, _(" module name: %.*s\n"),
6832 name += name[0] + 1;
6833 fprintf (file, _(" compiler : %.*s\n"),
6838 fprintf (file, _("modend\n"));
6842 struct vms_dst_rtnbeg *dst = (void *)buf;
6843 const char *name = (const char *)buf + sizeof (*dst);
6845 fputs (_("rtnbeg\n"), file);
6846 fprintf (file, _(" flags: %u, address: 0x%08x, "
6847 "pd-address: 0x%08x\n"),
6849 (unsigned)bfd_getl32 (dst->address),
6850 (unsigned)bfd_getl32 (dst->pd_address));
6851 fprintf (file, _(" routine name: %.*s\n"),
6857 struct vms_dst_rtnend *dst = (void *)buf;
6859 fprintf (file, _("rtnend: size 0x%08x\n"),
6860 (unsigned)bfd_getl32 (dst->size));
6865 struct vms_dst_prolog *dst = (void *)buf;
6867 fprintf (file, _("prolog: bkpt address 0x%08x\n"),
6868 (unsigned)bfd_getl32 (dst->bkpt_addr));
6873 struct vms_dst_epilog *dst = (void *)buf;
6875 fprintf (file, _("epilog: flags: %u, count: %u\n"),
6876 dst->flags, (unsigned)bfd_getl32 (dst->count));
6881 struct vms_dst_blkbeg *dst = (void *)buf;
6882 const char *name = (const char *)buf + sizeof (*dst);
6884 fprintf (file, _("blkbeg: address: 0x%08x, name: %.*s\n"),
6885 (unsigned)bfd_getl32 (dst->address),
6891 struct vms_dst_blkend *dst = (void *)buf;
6893 fprintf (file, _("blkend: size: 0x%08x\n"),
6894 (unsigned)bfd_getl32 (dst->size));
6897 case DST__K_TYPSPEC:
6899 fprintf (file, _("typspec (len: %u)\n"), len);
6900 fprintf (file, _(" name: %.*s\n"), buf[0], buf + 1);
6901 evax_bfd_print_typspec (buf + 1 + buf[0], 5, file);
6906 fprintf (file, _("septyp, name: %.*s\n"), buf[5], buf + 6);
6907 evax_bfd_print_valspec (buf, 4, file);
6912 struct vms_dst_recbeg *recbeg = (void *)buf;
6913 const char *name = (const char *)buf + sizeof (*recbeg);
6915 fprintf (file, _("recbeg: name: %.*s\n"), name[0], name + 1);
6916 evax_bfd_print_valspec (buf, 4, file);
6917 fprintf (file, (" len: %u bits\n"),
6918 (unsigned)bfd_getl32 (name + 1 + name[0]));
6922 fprintf (file, _("recend\n"));
6924 case DST__K_ENUMBEG:
6925 fprintf (file, _("enumbeg, len: %u, name: %.*s\n"),
6926 buf[0], buf[1], buf + 2);
6928 case DST__K_ENUMELT:
6929 fprintf (file, _("enumelt, name: %.*s\n"), buf[5], buf + 6);
6930 evax_bfd_print_valspec (buf, 4, file);
6932 case DST__K_ENUMEND:
6933 fprintf (file, _("enumend\n"));
6937 struct vms_dst_label *lab = (void *)buf;
6938 fprintf (file, ("label, name: %.*s\n"),
6939 lab->name[0], lab->name + 1);
6940 fprintf (file, (" address: 0x%08x\n"),
6941 (unsigned)bfd_getl32 (lab->value));
6944 case DST__K_DIS_RANGE:
6946 unsigned int cnt = bfd_getl32 (buf);
6947 unsigned char *rng = buf + 4;
6950 fprintf (file, _("discontiguous range (nbr: %u)\n"), cnt);
6951 for (i = 0; i < cnt; i++, rng += 8)
6952 fprintf (file, _(" address: 0x%08x, size: %u\n"),
6953 (unsigned)bfd_getl32 (rng),
6954 (unsigned)bfd_getl32 (rng + 4));
6958 case DST__K_LINE_NUM:
6960 unsigned char *buf_orig = buf;
6962 fprintf (file, _("line num (len: %u)\n"), len);
6967 unsigned char cmdlen;
6977 case DST__K_DELTA_PC_W:
6978 val = bfd_getl16 (buf + 1);
6979 fprintf (file, _("delta_pc_w %u\n"), val);
6984 case DST__K_INCR_LINUM:
6986 fprintf (file, _("incr_linum(b): +%u\n"), val);
6990 case DST__K_INCR_LINUM_W:
6991 val = bfd_getl16 (buf + 1);
6992 fprintf (file, _("incr_linum_w: +%u\n"), val);
6996 case DST__K_INCR_LINUM_L:
6997 val = bfd_getl32 (buf + 1);
6998 fprintf (file, _("incr_linum_l: +%u\n"), val);
7002 case DST__K_SET_LINUM:
7003 line = bfd_getl16 (buf + 1);
7004 fprintf (file, _("set_line_num(w) %u\n"), line);
7007 case DST__K_SET_LINUM_B:
7009 fprintf (file, _("set_line_num_b %u\n"), line);
7012 case DST__K_SET_LINUM_L:
7013 line = bfd_getl32 (buf + 1);
7014 fprintf (file, _("set_line_num_l %u\n"), line);
7017 case DST__K_SET_ABS_PC:
7018 pc = bfd_getl32 (buf + 1);
7019 fprintf (file, _("set_abs_pc: 0x%08x\n"), pc);
7022 case DST__K_DELTA_PC_L:
7023 fprintf (file, _("delta_pc_l: +0x%08x\n"),
7024 (unsigned)bfd_getl32 (buf + 1));
7028 fprintf (file, _("term(b): 0x%02x"), buf[1]);
7030 fprintf (file, _(" pc: 0x%08x\n"), pc);
7034 val = bfd_getl16 (buf + 1);
7035 fprintf (file, _("term_w: 0x%04x"), val);
7037 fprintf (file, _(" pc: 0x%08x\n"), pc);
7043 fprintf (file, _("delta pc +%-4d"), -cmd);
7044 line++; /* FIXME: curr increment. */
7046 fprintf (file, _(" pc: 0x%08x line: %5u\n"),
7051 fprintf (file, _(" *unhandled* cmd %u\n"), cmd);
7064 unsigned char *buf_orig = buf;
7066 fprintf (file, _("source (len: %u)\n"), len);
7070 signed char cmd = buf[0];
7071 unsigned char cmdlen = 0;
7075 case DST__K_SRC_DECLFILE:
7077 struct vms_dst_src_decl_src *src = (void *)(buf + 1);
7080 fprintf (file, _(" declfile: len: %u, flags: %u, "
7082 src->length, src->flags,
7083 (unsigned)bfd_getl16 (src->fileid));
7084 fprintf (file, _(" rms: cdt: 0x%08x %08x, "
7085 "ebk: 0x%08x, ffb: 0x%04x, "
7087 (unsigned)bfd_getl32 (src->rms_cdt + 4),
7088 (unsigned)bfd_getl32 (src->rms_cdt + 0),
7089 (unsigned)bfd_getl32 (src->rms_ebk),
7090 (unsigned)bfd_getl16 (src->rms_ffb),
7092 name = (const char *)buf + 1 + sizeof (*src);
7093 fprintf (file, _(" filename : %.*s\n"),
7095 name += name[0] + 1;
7096 fprintf (file, _(" module name: %.*s\n"),
7098 cmdlen = 2 + src->length;
7101 case DST__K_SRC_SETFILE:
7102 fprintf (file, _(" setfile %u\n"),
7103 (unsigned)bfd_getl16 (buf + 1));
7106 case DST__K_SRC_SETREC_W:
7107 fprintf (file, _(" setrec %u\n"),
7108 (unsigned)bfd_getl16 (buf + 1));
7111 case DST__K_SRC_SETREC_L:
7112 fprintf (file, _(" setrec %u\n"),
7113 (unsigned)bfd_getl32 (buf + 1));
7116 case DST__K_SRC_SETLNUM_W:
7117 fprintf (file, _(" setlnum %u\n"),
7118 (unsigned)bfd_getl16 (buf + 1));
7121 case DST__K_SRC_SETLNUM_L:
7122 fprintf (file, _(" setlnum %u\n"),
7123 (unsigned)bfd_getl32 (buf + 1));
7126 case DST__K_SRC_DEFLINES_W:
7127 fprintf (file, _(" deflines %u\n"),
7128 (unsigned)bfd_getl16 (buf + 1));
7131 case DST__K_SRC_DEFLINES_B:
7132 fprintf (file, _(" deflines %u\n"), buf[1]);
7135 case DST__K_SRC_FORMFEED:
7136 fprintf (file, _(" formfeed\n"));
7140 fprintf (file, _(" *unhandled* cmd %u\n"), cmd);
7152 fprintf (file, _("*unhandled* dst type %u\n"), type);
7160 evax_bfd_print_image (bfd *abfd, FILE *file)
7162 struct vms_eihd eihd;
7165 unsigned int eiha_off;
7166 unsigned int eihi_off;
7167 unsigned int eihs_off;
7168 unsigned int eisd_off;
7169 unsigned int eihef_off = 0;
7170 unsigned int eihnp_off = 0;
7171 unsigned int dmt_vbn = 0;
7172 unsigned int dmt_size = 0;
7173 unsigned int dst_vbn = 0;
7174 unsigned int dst_size = 0;
7175 unsigned int gst_vbn = 0;
7176 unsigned int gst_size = 0;
7177 unsigned int eiaf_vbn = 0;
7178 unsigned int eiaf_size = 0;
7179 unsigned int eihvn_off;
7181 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET)
7182 || bfd_bread (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
7184 fprintf (file, _("cannot read EIHD\n"));
7187 fprintf (file, _("EIHD: (size: %u, nbr blocks: %u)\n"),
7188 (unsigned)bfd_getl32 (eihd.size),
7189 (unsigned)bfd_getl32 (eihd.hdrblkcnt));
7190 fprintf (file, _(" majorid: %u, minorid: %u\n"),
7191 (unsigned)bfd_getl32 (eihd.majorid),
7192 (unsigned)bfd_getl32 (eihd.minorid));
7194 val = (unsigned)bfd_getl32 (eihd.imgtype);
7198 name = _("executable");
7201 name = _("linkable image");
7204 name = _("unknown");
7207 fprintf (file, _(" image type: %u (%s)"), val, name);
7209 val = (unsigned)bfd_getl32 (eihd.subtype);
7212 case EIHD__C_NATIVE:
7219 name = _("unknown");
7222 fprintf (file, _(", subtype: %u (%s)\n"), val, name);
7224 eisd_off = bfd_getl32 (eihd.isdoff);
7225 eiha_off = bfd_getl32 (eihd.activoff);
7226 eihi_off = bfd_getl32 (eihd.imgidoff);
7227 eihs_off = bfd_getl32 (eihd.symdbgoff);
7228 fprintf (file, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
7229 "imgid: %u, patch: %u\n"),
7230 eisd_off, eiha_off, eihs_off, eihi_off,
7231 (unsigned)bfd_getl32 (eihd.patchoff));
7232 fprintf (file, _(" fixup info rva: "));
7233 bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.iafva));
7234 fprintf (file, _(", symbol vector rva: "));
7235 bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.symvva));
7236 eihvn_off = bfd_getl32 (eihd.version_array_off);
7237 fprintf (file, _("\n"
7238 " version array off: %u\n"),
7241 _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
7242 (unsigned)bfd_getl32 (eihd.imgiocnt),
7243 (unsigned)bfd_getl32 (eihd.iochancnt),
7244 (unsigned)bfd_getl32 (eihd.privreqs + 4),
7245 (unsigned)bfd_getl32 (eihd.privreqs + 0));
7246 val = (unsigned)bfd_getl32 (eihd.lnkflags);
7247 fprintf (file, _(" linker flags: %08x:"), val);
7248 if (val & EIHD__M_LNKDEBUG)
7249 fprintf (file, " LNKDEBUG");
7250 if (val & EIHD__M_LNKNOTFR)
7251 fprintf (file, " LNKNOTFR");
7252 if (val & EIHD__M_NOP0BUFS)
7253 fprintf (file, " NOP0BUFS");
7254 if (val & EIHD__M_PICIMG)
7255 fprintf (file, " PICIMG");
7256 if (val & EIHD__M_P0IMAGE)
7257 fprintf (file, " P0IMAGE");
7258 if (val & EIHD__M_DBGDMT)
7259 fprintf (file, " DBGDMT");
7260 if (val & EIHD__M_INISHR)
7261 fprintf (file, " INISHR");
7262 if (val & EIHD__M_XLATED)
7263 fprintf (file, " XLATED");
7264 if (val & EIHD__M_BIND_CODE_SEC)
7265 fprintf (file, " BIND_CODE_SEC");
7266 if (val & EIHD__M_BIND_DATA_SEC)
7267 fprintf (file, " BIND_DATA_SEC");
7268 if (val & EIHD__M_MKTHREADS)
7269 fprintf (file, " MKTHREADS");
7270 if (val & EIHD__M_UPCALLS)
7271 fprintf (file, " UPCALLS");
7272 if (val & EIHD__M_OMV_READY)
7273 fprintf (file, " OMV_READY");
7274 if (val & EIHD__M_EXT_BIND_SECT)
7275 fprintf (file, " EXT_BIND_SECT");
7276 fprintf (file, "\n");
7277 fprintf (file, _(" ident: 0x%08x, sysver: 0x%08x, "
7278 "match ctrl: %u, symvect_size: %u\n"),
7279 (unsigned)bfd_getl32 (eihd.ident),
7280 (unsigned)bfd_getl32 (eihd.sysver),
7282 (unsigned)bfd_getl32 (eihd.symvect_size));
7283 fprintf (file, _(" BPAGE: %u"),
7284 (unsigned)bfd_getl32 (eihd.virt_mem_block_size));
7285 if (val & (EIHD__M_OMV_READY | EIHD__M_EXT_BIND_SECT))
7287 eihef_off = bfd_getl32 (eihd.ext_fixup_off);
7288 eihnp_off = bfd_getl32 (eihd.noopt_psect_off);
7289 fprintf (file, _(", ext fixup offset: %u, no_opt psect off: %u"),
7290 eihef_off, eihnp_off);
7292 fprintf (file, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd.alias));
7296 struct vms_eihvn eihvn;
7300 fprintf (file, _("system version array information:\n"));
7301 if (bfd_seek (abfd, (file_ptr) eihvn_off, SEEK_SET)
7302 || bfd_bread (&eihvn, sizeof (eihvn), abfd) != sizeof (eihvn))
7304 fprintf (file, _("cannot read EIHVN header\n"));
7307 mask = bfd_getl32 (eihvn.subsystem_mask);
7308 for (j = 0; j < 32; j++)
7309 if (mask & (1 << j))
7311 struct vms_eihvn_subversion ver;
7312 if (bfd_bread (&ver, sizeof (ver), abfd) != sizeof (ver))
7314 fprintf (file, _("cannot read EIHVN version\n"));
7317 fprintf (file, _(" %02u "), j);
7320 case EIHVN__BASE_IMAGE_BIT:
7321 fputs (_("BASE_IMAGE "), file);
7323 case EIHVN__MEMORY_MANAGEMENT_BIT:
7324 fputs (_("MEMORY_MANAGEMENT"), file);
7327 fputs (_("IO "), file);
7329 case EIHVN__FILES_VOLUMES_BIT:
7330 fputs (_("FILES_VOLUMES "), file);
7332 case EIHVN__PROCESS_SCHED_BIT:
7333 fputs (_("PROCESS_SCHED "), file);
7335 case EIHVN__SYSGEN_BIT:
7336 fputs (_("SYSGEN "), file);
7338 case EIHVN__CLUSTERS_LOCKMGR_BIT:
7339 fputs (_("CLUSTERS_LOCKMGR "), file);
7341 case EIHVN__LOGICAL_NAMES_BIT:
7342 fputs (_("LOGICAL_NAMES "), file);
7344 case EIHVN__SECURITY_BIT:
7345 fputs (_("SECURITY "), file);
7347 case EIHVN__IMAGE_ACTIVATOR_BIT:
7348 fputs (_("IMAGE_ACTIVATOR "), file);
7350 case EIHVN__NETWORKS_BIT:
7351 fputs (_("NETWORKS "), file);
7353 case EIHVN__COUNTERS_BIT:
7354 fputs (_("COUNTERS "), file);
7356 case EIHVN__STABLE_BIT:
7357 fputs (_("STABLE "), file);
7359 case EIHVN__MISC_BIT:
7360 fputs (_("MISC "), file);
7362 case EIHVN__CPU_BIT:
7363 fputs (_("CPU "), file);
7365 case EIHVN__VOLATILE_BIT:
7366 fputs (_("VOLATILE "), file);
7368 case EIHVN__SHELL_BIT:
7369 fputs (_("SHELL "), file);
7371 case EIHVN__POSIX_BIT:
7372 fputs (_("POSIX "), file);
7374 case EIHVN__MULTI_PROCESSING_BIT:
7375 fputs (_("MULTI_PROCESSING "), file);
7377 case EIHVN__GALAXY_BIT:
7378 fputs (_("GALAXY "), file);
7381 fputs (_("*unknown* "), file);
7384 fprintf (file, _(": %u.%u\n"),
7385 (unsigned)bfd_getl16 (ver.major),
7386 (unsigned)bfd_getl16 (ver.minor));
7392 struct vms_eiha eiha;
7394 if (bfd_seek (abfd, (file_ptr) eiha_off, SEEK_SET)
7395 || bfd_bread (&eiha, sizeof (eiha), abfd) != sizeof (eiha))
7397 fprintf (file, _("cannot read EIHA\n"));
7400 fprintf (file, _("Image activation: (size=%u)\n"),
7401 (unsigned)bfd_getl32 (eiha.size));
7402 fprintf (file, _(" First address : 0x%08x 0x%08x\n"),
7403 (unsigned)bfd_getl32 (eiha.tfradr1_h),
7404 (unsigned)bfd_getl32 (eiha.tfradr1));
7405 fprintf (file, _(" Second address: 0x%08x 0x%08x\n"),
7406 (unsigned)bfd_getl32 (eiha.tfradr2_h),
7407 (unsigned)bfd_getl32 (eiha.tfradr2));
7408 fprintf (file, _(" Third address : 0x%08x 0x%08x\n"),
7409 (unsigned)bfd_getl32 (eiha.tfradr3_h),
7410 (unsigned)bfd_getl32 (eiha.tfradr3));
7411 fprintf (file, _(" Fourth address: 0x%08x 0x%08x\n"),
7412 (unsigned)bfd_getl32 (eiha.tfradr4_h),
7413 (unsigned)bfd_getl32 (eiha.tfradr4));
7414 fprintf (file, _(" Shared image : 0x%08x 0x%08x\n"),
7415 (unsigned)bfd_getl32 (eiha.inishr_h),
7416 (unsigned)bfd_getl32 (eiha.inishr));
7420 struct vms_eihi eihi;
7422 if (bfd_seek (abfd, (file_ptr) eihi_off, SEEK_SET)
7423 || bfd_bread (&eihi, sizeof (eihi), abfd) != sizeof (eihi))
7425 fprintf (file, _("cannot read EIHI\n"));
7428 fprintf (file, _("Image identification: (major: %u, minor: %u)\n"),
7429 (unsigned)bfd_getl32 (eihi.majorid),
7430 (unsigned)bfd_getl32 (eihi.minorid));
7431 fprintf (file, _(" image name : %.*s\n"),
7432 eihi.imgnam[0], eihi.imgnam + 1);
7433 fprintf (file, _(" link time : %s\n"),
7434 vms_time_to_str (eihi.linktime));
7435 fprintf (file, _(" image ident : %.*s\n"),
7436 eihi.imgid[0], eihi.imgid + 1);
7437 fprintf (file, _(" linker ident : %.*s\n"),
7438 eihi.linkid[0], eihi.linkid + 1);
7439 fprintf (file, _(" image build ident: %.*s\n"),
7440 eihi.imgbid[0], eihi.imgbid + 1);
7444 struct vms_eihs eihs;
7446 if (bfd_seek (abfd, (file_ptr) eihs_off, SEEK_SET)
7447 || bfd_bread (&eihs, sizeof (eihs), abfd) != sizeof (eihs))
7449 fprintf (file, _("cannot read EIHS\n"));
7452 fprintf (file, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
7453 (unsigned)bfd_getl32 (eihs.majorid),
7454 (unsigned)bfd_getl32 (eihs.minorid));
7455 dst_vbn = bfd_getl32 (eihs.dstvbn);
7456 dst_size = bfd_getl32 (eihs.dstsize);
7457 fprintf (file, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
7458 dst_vbn, dst_size, dst_size);
7459 gst_vbn = bfd_getl32 (eihs.gstvbn);
7460 gst_size = bfd_getl32 (eihs.gstsize);
7461 fprintf (file, _(" global symbol table: vbn: %u, records: %u\n"),
7463 dmt_vbn = bfd_getl32 (eihs.dmtvbn);
7464 dmt_size = bfd_getl32 (eihs.dmtsize);
7465 fprintf (file, _(" debug module table : vbn: %u, size: %u\n"),
7468 while (eisd_off != 0)
7470 struct vms_eisd eisd;
7475 if (bfd_seek (abfd, (file_ptr) eisd_off, SEEK_SET)
7476 || bfd_bread (&eisd, sizeof (eisd), abfd) != sizeof (eisd))
7478 fprintf (file, _("cannot read EISD\n"));
7481 len = (unsigned)bfd_getl32 (eisd.eisdsize);
7482 if (len != (unsigned)-1)
7486 eisd_off = (eisd_off + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
7488 fprintf (file, _("Image section descriptor: (major: %u, minor: %u, "
7489 "size: %u, offset: %u)\n"),
7490 (unsigned)bfd_getl32 (eisd.majorid),
7491 (unsigned)bfd_getl32 (eisd.minorid),
7495 fprintf (file, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
7496 (unsigned)bfd_getl32 (eisd.virt_addr + 4),
7497 (unsigned)bfd_getl32 (eisd.virt_addr + 0),
7498 (unsigned)bfd_getl32 (eisd.secsize));
7499 val = (unsigned)bfd_getl32 (eisd.flags);
7500 fprintf (file, _(" flags: 0x%04x"), val);
7501 if (val & EISD__M_GBL)
7502 fprintf (file, " GBL");
7503 if (val & EISD__M_CRF)
7504 fprintf (file, " CRF");
7505 if (val & EISD__M_DZRO)
7506 fprintf (file, " DZRO");
7507 if (val & EISD__M_WRT)
7508 fprintf (file, " WRT");
7509 if (val & EISD__M_INITALCODE)
7510 fprintf (file, " INITALCODE");
7511 if (val & EISD__M_BASED)
7512 fprintf (file, " BASED");
7513 if (val & EISD__M_FIXUPVEC)
7514 fprintf (file, " FIXUPVEC");
7515 if (val & EISD__M_RESIDENT)
7516 fprintf (file, " RESIDENT");
7517 if (val & EISD__M_VECTOR)
7518 fprintf (file, " VECTOR");
7519 if (val & EISD__M_PROTECT)
7520 fprintf (file, " PROTECT");
7521 if (val & EISD__M_LASTCLU)
7522 fprintf (file, " LASTCLU");
7523 if (val & EISD__M_EXE)
7524 fprintf (file, " EXE");
7525 if (val & EISD__M_NONSHRADR)
7526 fprintf (file, " NONSHRADR");
7527 if (val & EISD__M_QUAD_LENGTH)
7528 fprintf (file, " QUAD_LENGTH");
7529 if (val & EISD__M_ALLOC_64BIT)
7530 fprintf (file, " ALLOC_64BIT");
7531 fprintf (file, "\n");
7532 if (val & EISD__M_FIXUPVEC)
7534 eiaf_vbn = bfd_getl32 (eisd.vbn);
7535 eiaf_size = bfd_getl32 (eisd.secsize);
7537 fprintf (file, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
7538 (unsigned)bfd_getl32 (eisd.vbn),
7539 eisd.pfc, eisd.matchctl, eisd.type);
7542 case EISD__K_NORMAL:
7543 fputs (_("NORMAL"), file);
7545 case EISD__K_SHRFXD:
7546 fputs (_("SHRFXD"), file);
7548 case EISD__K_PRVFXD:
7549 fputs (_("PRVFXD"), file);
7551 case EISD__K_SHRPIC:
7552 fputs (_("SHRPIC"), file);
7554 case EISD__K_PRVPIC:
7555 fputs (_("PRVPIC"), file);
7557 case EISD__K_USRSTACK:
7558 fputs (_("USRSTACK"), file);
7561 fputs (_("*unknown*"), file);
7564 fputs (_(")\n"), file);
7565 if (val & EISD__M_GBL)
7566 fprintf (file, _(" ident: 0x%08x, name: %.*s\n"),
7567 (unsigned)bfd_getl32 (eisd.ident),
7568 eisd.gblnam[0], eisd.gblnam + 1);
7574 if (bfd_seek (abfd, (file_ptr) (dmt_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7576 fprintf (file, _("cannot read DMT\n"));
7580 fprintf (file, _("Debug module table:\n"));
7582 while (dmt_size > 0)
7584 struct vms_dmt_header dmth;
7587 if (bfd_bread (&dmth, sizeof (dmth), abfd) != sizeof (dmth))
7589 fprintf (file, _("cannot read DMT header\n"));
7592 count = bfd_getl16 (dmth.psect_count);
7594 _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
7595 (unsigned)bfd_getl32 (dmth.modbeg),
7596 (unsigned)bfd_getl32 (dmth.size), count);
7597 dmt_size -= sizeof (dmth);
7600 struct vms_dmt_psect dmtp;
7602 if (bfd_bread (&dmtp, sizeof (dmtp), abfd) != sizeof (dmtp))
7604 fprintf (file, _("cannot read DMT psect\n"));
7607 fprintf (file, _(" psect start: 0x%08x, length: %u\n"),
7608 (unsigned)bfd_getl32 (dmtp.start),
7609 (unsigned)bfd_getl32 (dmtp.length));
7611 dmt_size -= sizeof (dmtp);
7618 if (bfd_seek (abfd, (file_ptr) (dst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7620 fprintf (file, _("cannot read DST\n"));
7624 evax_bfd_print_dst (abfd, dst_size, file);
7628 if (bfd_seek (abfd, (file_ptr) (gst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7630 fprintf (file, _("cannot read GST\n"));
7634 fprintf (file, _("Global symbol table:\n"));
7635 evax_bfd_print_eobj (abfd, file);
7640 struct vms_eiaf *eiaf;
7641 unsigned int qrelfixoff;
7642 unsigned int lrelfixoff;
7643 unsigned int qdotadroff;
7644 unsigned int ldotadroff;
7645 unsigned int shrimgcnt;
7646 unsigned int shlstoff;
7647 unsigned int codeadroff;
7648 unsigned int lpfixoff;
7649 unsigned int chgprtoff;
7651 buf = bfd_malloc (eiaf_size);
7653 if (bfd_seek (abfd, (file_ptr) (eiaf_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET)
7654 || bfd_bread (buf, eiaf_size, abfd) != eiaf_size)
7656 fprintf (file, _("cannot read EIHA\n"));
7660 eiaf = (struct vms_eiaf *)buf;
7662 _("Image activator fixup: (major: %u, minor: %u)\n"),
7663 (unsigned)bfd_getl32 (eiaf->majorid),
7664 (unsigned)bfd_getl32 (eiaf->minorid));
7665 fprintf (file, _(" iaflink : 0x%08x %08x\n"),
7666 (unsigned)bfd_getl32 (eiaf->iaflink + 0),
7667 (unsigned)bfd_getl32 (eiaf->iaflink + 4));
7668 fprintf (file, _(" fixuplnk: 0x%08x %08x\n"),
7669 (unsigned)bfd_getl32 (eiaf->fixuplnk + 0),
7670 (unsigned)bfd_getl32 (eiaf->fixuplnk + 4));
7671 fprintf (file, _(" size : %u\n"),
7672 (unsigned)bfd_getl32 (eiaf->size));
7673 fprintf (file, _(" flags: 0x%08x\n"),
7674 (unsigned)bfd_getl32 (eiaf->flags));
7675 qrelfixoff = bfd_getl32 (eiaf->qrelfixoff);
7676 lrelfixoff = bfd_getl32 (eiaf->lrelfixoff);
7677 fprintf (file, _(" qrelfixoff: %5u, lrelfixoff: %5u\n"),
7678 qrelfixoff, lrelfixoff);
7679 qdotadroff = bfd_getl32 (eiaf->qdotadroff);
7680 ldotadroff = bfd_getl32 (eiaf->ldotadroff);
7681 fprintf (file, _(" qdotadroff: %5u, ldotadroff: %5u\n"),
7682 qdotadroff, ldotadroff);
7683 codeadroff = bfd_getl32 (eiaf->codeadroff);
7684 lpfixoff = bfd_getl32 (eiaf->lpfixoff);
7685 fprintf (file, _(" codeadroff: %5u, lpfixoff : %5u\n"),
7686 codeadroff, lpfixoff);
7687 chgprtoff = bfd_getl32 (eiaf->chgprtoff);
7688 fprintf (file, _(" chgprtoff : %5u\n"), chgprtoff);
7689 shrimgcnt = bfd_getl32 (eiaf->shrimgcnt);
7690 shlstoff = bfd_getl32 (eiaf->shlstoff);
7691 fprintf (file, _(" shlstoff : %5u, shrimgcnt : %5u\n"),
7692 shlstoff, shrimgcnt);
7693 fprintf (file, _(" shlextra : %5u, permctx : %5u\n"),
7694 (unsigned)bfd_getl32 (eiaf->shlextra),
7695 (unsigned)bfd_getl32 (eiaf->permctx));
7696 fprintf (file, _(" base_va : 0x%08x\n"),
7697 (unsigned)bfd_getl32 (eiaf->base_va));
7698 fprintf (file, _(" lppsbfixoff: %5u\n"),
7699 (unsigned)bfd_getl32 (eiaf->lppsbfixoff));
7703 struct vms_shl *shl = (struct vms_shl *)(buf + shlstoff);
7706 fprintf (file, _(" Shareable images:\n"));
7707 for (j = 0; j < shrimgcnt; j++, shl++)
7710 _(" %u: size: %u, flags: 0x%02x, name: %.*s\n"),
7711 j, shl->size, shl->flags,
7712 shl->imgnam[0], shl->imgnam + 1);
7715 if (qrelfixoff != 0)
7717 fprintf (file, _(" quad-word relocation fixups:\n"));
7718 evax_bfd_print_relocation_records (file, buf + qrelfixoff, 8);
7720 if (lrelfixoff != 0)
7722 fprintf (file, _(" long-word relocation fixups:\n"));
7723 evax_bfd_print_relocation_records (file, buf + lrelfixoff, 4);
7725 if (qdotadroff != 0)
7727 fprintf (file, _(" quad-word .address reference fixups:\n"));
7728 evax_bfd_print_address_fixups (file, buf + qdotadroff);
7730 if (ldotadroff != 0)
7732 fprintf (file, _(" long-word .address reference fixups:\n"));
7733 evax_bfd_print_address_fixups (file, buf + ldotadroff);
7735 if (codeadroff != 0)
7737 fprintf (file, _(" Code Address Reference Fixups:\n"));
7738 evax_bfd_print_reference_fixups (file, buf + codeadroff);
7742 fprintf (file, _(" Linkage Pairs Referece Fixups:\n"));
7743 evax_bfd_print_reference_fixups (file, buf + lpfixoff);
7747 unsigned int count = (unsigned)bfd_getl32 (buf + chgprtoff);
7748 struct vms_eicp *eicp = (struct vms_eicp *)(buf + chgprtoff + 4);
7751 fprintf (file, _(" Change Protection (%u entries):\n"), count);
7752 for (j = 0; j < count; j++, eicp++)
7754 unsigned int prot = bfd_getl32 (eicp->newprt);
7756 _(" base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
7757 (unsigned)bfd_getl32 (eicp->baseva + 4),
7758 (unsigned)bfd_getl32 (eicp->baseva + 0),
7759 (unsigned)bfd_getl32 (eicp->size),
7760 (unsigned)bfd_getl32 (eicp->newprt));
7764 fprintf (file, "NA");
7766 case PRT__C_RESERVED:
7767 fprintf (file, "RES");
7770 fprintf (file, "KW");
7773 fprintf (file, "KR");
7776 fprintf (file, "UW");
7779 fprintf (file, "EW");
7782 fprintf (file, "ERKW");
7785 fprintf (file, "ER");
7788 fprintf (file, "SW");
7791 fprintf (file, "SREW");
7794 fprintf (file, "SRKW");
7797 fprintf (file, "SR");
7800 fprintf (file, "URSW");
7803 fprintf (file, "UREW");
7806 fprintf (file, "URKW");
7809 fprintf (file, "UR");
7823 vms_bfd_print_private_bfd_data (bfd *abfd, void *ptr)
7825 FILE *file = (FILE *)ptr;
7827 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
7828 evax_bfd_print_image (abfd, file);
7831 if (bfd_seek (abfd, 0, SEEK_SET))
7833 evax_bfd_print_eobj (abfd, file);
7840 /* Slurp ETIR/EDBG/ETBT VMS object records. */
7843 alpha_vms_read_sections_content (bfd *abfd, struct bfd_link_info *info)
7845 asection *cur_section;
7846 file_ptr cur_offset;
7847 asection *dst_section;
7848 file_ptr dst_offset;
7850 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
7856 dst_section = PRIV (dst_section);
7860 if (info->strip == strip_all || info->strip == strip_debugger)
7862 /* Discard the DST section. */
7866 else if (dst_section)
7868 dst_offset = dst_section->output_offset;
7869 dst_section = dst_section->output_section;
7878 type = _bfd_vms_get_object_record (abfd);
7881 vms_debug2 ((2, "next_record failed\n"));
7887 PRIV (image_section) = cur_section;
7888 PRIV (image_offset) = cur_offset;
7889 res = _bfd_vms_slurp_etir (abfd, info);
7890 cur_section = PRIV (image_section);
7891 cur_offset = PRIV (image_offset);
7895 if (dst_section == NULL)
7897 PRIV (image_section) = dst_section;
7898 PRIV (image_offset) = dst_offset;
7899 res = _bfd_vms_slurp_etir (abfd, info);
7900 dst_offset = PRIV (image_offset);
7909 vms_debug2 ((2, "slurp eobj type %d failed\n", type));
7916 alpha_vms_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
7917 struct bfd_link_info *info ATTRIBUTE_UNUSED)
7922 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
7925 alpha_vms_add_fixup_lp (struct bfd_link_info *info, bfd *src, bfd *shlib)
7927 struct alpha_vms_shlib_el *sl;
7928 asection *sect = PRIV2 (src, image_section);
7929 file_ptr offset = PRIV2 (src, image_offset);
7931 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
7932 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
7933 sl->has_fixups = TRUE;
7934 VEC_APPEND_EL (sl->lp, bfd_vma,
7935 sect->output_section->vma + sect->output_offset + offset);
7939 alpha_vms_add_fixup_ca (struct bfd_link_info *info, bfd *src, bfd *shlib)
7941 struct alpha_vms_shlib_el *sl;
7942 asection *sect = PRIV2 (src, image_section);
7943 file_ptr offset = PRIV2 (src, image_offset);
7945 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
7946 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
7947 sl->has_fixups = TRUE;
7948 VEC_APPEND_EL (sl->ca, bfd_vma,
7949 sect->output_section->vma + sect->output_offset + offset);
7953 alpha_vms_add_fixup_qr (struct bfd_link_info *info, bfd *src,
7954 bfd *shlib, bfd_vma vec)
7956 struct alpha_vms_shlib_el *sl;
7957 struct alpha_vms_vma_ref *r;
7958 asection *sect = PRIV2 (src, image_section);
7959 file_ptr offset = PRIV2 (src, image_offset);
7961 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
7962 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
7963 sl->has_fixups = TRUE;
7964 r = VEC_APPEND (sl->qr, struct alpha_vms_vma_ref);
7965 r->vma = sect->output_section->vma + sect->output_offset + offset;
7970 alpha_vms_add_lw_fixup (struct bfd_link_info *info ATTRIBUTE_UNUSED,
7971 unsigned int shr ATTRIBUTE_UNUSED,
7972 bfd_vma vec ATTRIBUTE_UNUSED)
7979 alpha_vms_add_qw_fixup (struct bfd_link_info *info ATTRIBUTE_UNUSED,
7980 unsigned int shr ATTRIBUTE_UNUSED,
7981 bfd_vma vec ATTRIBUTE_UNUSED)
7988 alpha_vms_add_lw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
7993 alpha_vms_add_qw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
7997 static struct bfd_hash_entry *
7998 alpha_vms_link_hash_newfunc (struct bfd_hash_entry *entry,
7999 struct bfd_hash_table *table,
8002 struct alpha_vms_link_hash_entry *ret =
8003 (struct alpha_vms_link_hash_entry *) entry;
8005 /* Allocate the structure if it has not already been allocated by a
8008 ret = ((struct alpha_vms_link_hash_entry *)
8009 bfd_hash_allocate (table,
8010 sizeof (struct alpha_vms_link_hash_entry)));
8014 /* Call the allocation method of the superclass. */
8015 ret = ((struct alpha_vms_link_hash_entry *)
8016 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
8021 return (struct bfd_hash_entry *) ret;
8024 /* Create an Alpha/VMS link hash table. */
8026 static struct bfd_link_hash_table *
8027 alpha_vms_bfd_link_hash_table_create (bfd *abfd)
8029 struct alpha_vms_link_hash_table *ret;
8030 bfd_size_type amt = sizeof (struct alpha_vms_link_hash_table);
8032 ret = (struct alpha_vms_link_hash_table *) bfd_malloc (amt);
8035 if (!_bfd_link_hash_table_init (&ret->root, abfd,
8036 alpha_vms_link_hash_newfunc,
8037 sizeof (struct alpha_vms_link_hash_entry)))
8043 VEC_INIT (ret->shrlibs);
8050 alpha_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
8054 for (i = 0; i < PRIV (gsd_sym_count); i++)
8056 struct vms_symbol_entry *e = PRIV (syms)[i];
8057 struct alpha_vms_link_hash_entry *h;
8058 struct bfd_link_hash_entry *h_root;
8061 if (!alpha_vms_convert_symbol (abfd, e, &sym))
8064 if ((e->flags & EGSY__V_DEF) && abfd->selective_search)
8066 /* In selective_search mode, only add definition that are
8068 h = (struct alpha_vms_link_hash_entry *)bfd_link_hash_lookup
8069 (info->hash, sym.name, FALSE, FALSE, FALSE);
8070 if (h == NULL || h->root.type != bfd_link_hash_undefined)
8076 h_root = (struct bfd_link_hash_entry *) h;
8077 if (_bfd_generic_link_add_one_symbol
8078 (info, abfd, sym.name, sym.flags, sym.section, sym.value,
8079 NULL, FALSE, FALSE, &h_root) == FALSE)
8081 h = (struct alpha_vms_link_hash_entry *) h_root;
8083 if ((e->flags & EGSY__V_DEF)
8085 && abfd->xvec == info->output_bfd->xvec)
8089 if (abfd->flags & DYNAMIC)
8091 struct alpha_vms_shlib_el *shlib;
8093 /* We do not want to include any of the sections in a dynamic
8094 object in the output file. See comment in elflink.c. */
8095 bfd_section_list_clear (abfd);
8097 shlib = VEC_APPEND (alpha_vms_link_hash (info)->shrlibs,
8098 struct alpha_vms_shlib_el);
8100 VEC_INIT (shlib->ca);
8101 VEC_INIT (shlib->lp);
8102 VEC_INIT (shlib->qr);
8103 PRIV (shr_index) = VEC_COUNT (alpha_vms_link_hash (info)->shrlibs) - 1;
8110 alpha_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
8113 struct bfd_link_hash_entry **pundef;
8114 struct bfd_link_hash_entry **next_pundef;
8116 /* We only accept VMS libraries. */
8117 if (info->output_bfd->xvec != abfd->xvec)
8119 bfd_set_error (bfd_error_wrong_format);
8123 /* The archive_pass field in the archive itself is used to
8124 initialize PASS, since we may search the same archive multiple
8126 pass = ++abfd->archive_pass;
8128 /* Look through the list of undefined symbols. */
8129 for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef)
8131 struct bfd_link_hash_entry *h;
8137 next_pundef = &(*pundef)->u.undef.next;
8139 /* When a symbol is defined, it is not necessarily removed from
8141 if (h->type != bfd_link_hash_undefined
8142 && h->type != bfd_link_hash_common)
8144 /* Remove this entry from the list, for general cleanliness
8145 and because we are going to look through the list again
8146 if we search any more libraries. We can't remove the
8147 entry if it is the tail, because that would lose any
8148 entries we add to the list later on. */
8149 if (*pundef != info->hash->undefs_tail)
8151 *pundef = *next_pundef;
8152 next_pundef = pundef;
8157 /* Look for this symbol in the archive hash table. */
8158 symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string);
8159 if (symidx == BFD_NO_MORE_SYMBOLS)
8161 /* Nothing in this slot. */
8165 element = bfd_get_elt_at_index (abfd, symidx);
8166 if (element == NULL)
8169 if (element->archive_pass == -1 || element->archive_pass == pass)
8172 if (! bfd_check_format (element, bfd_object))
8174 element->archive_pass = -1;
8178 orig_element = element;
8179 if (bfd_is_thin_archive (abfd))
8181 element = _bfd_vms_lib_get_imagelib_file (element);
8182 if (element == NULL || !bfd_check_format (element, bfd_object))
8184 orig_element->archive_pass = -1;
8189 /* Unlike the generic linker, we know that this element provides
8190 a definition for an undefined symbol and we know that we want
8191 to include it. We don't need to check anything. */
8192 if (! (*info->callbacks->add_archive_element) (info, element,
8195 if (! alpha_vms_link_add_object_symbols (element, info))
8198 orig_element->archive_pass = pass;
8205 alpha_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
8207 switch (bfd_get_format (abfd))
8210 vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
8212 return alpha_vms_link_add_object_symbols (abfd, info);
8215 vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
8217 return alpha_vms_link_add_archive_symbols (abfd, info);
8220 bfd_set_error (bfd_error_wrong_format);
8226 alpha_vms_build_fixups (struct bfd_link_info *info)
8228 struct alpha_vms_link_hash_table *t = alpha_vms_link_hash (info);
8229 unsigned char *content;
8231 unsigned int sz = 0;
8232 unsigned int lp_sz = 0;
8233 unsigned int ca_sz = 0;
8234 unsigned int qr_sz = 0;
8235 unsigned int shrimg_cnt = 0;
8236 struct vms_eiaf *eiaf;
8240 /* Shared libraries. */
8241 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8243 struct alpha_vms_shlib_el *shlib;
8245 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8247 if (!shlib->has_fixups)
8252 if (VEC_COUNT (shlib->ca) > 0)
8254 /* Header + entries. */
8256 ca_sz += VEC_COUNT (shlib->ca) * 4;
8258 if (VEC_COUNT (shlib->lp) > 0)
8260 /* Header + entries. */
8262 lp_sz += VEC_COUNT (shlib->lp) * 4;
8264 if (VEC_COUNT (shlib->qr) > 0)
8266 /* Header + entries. */
8268 qr_sz += VEC_COUNT (shlib->qr) * 8;
8279 /* Finish now if there is no content. */
8280 if (ca_sz + lp_sz + qr_sz == 0)
8283 /* Allocate section content (round-up size) */
8284 sz = sizeof (struct vms_eiaf) + shrimg_cnt * sizeof (struct vms_shl)
8285 + ca_sz + lp_sz + qr_sz;
8286 sz = (sz + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
8287 content = bfd_zalloc (info->output_bfd, sz);
8288 if (content == NULL)
8291 sec = alpha_vms_link_hash (info)->fixup;
8292 sec->contents = content;
8295 eiaf = (struct vms_eiaf *)content;
8296 off = sizeof (struct vms_eiaf);
8297 bfd_putl32 (0, eiaf->majorid);
8298 bfd_putl32 (0, eiaf->minorid);
8299 bfd_putl32 (0, eiaf->iaflink);
8300 bfd_putl32 (0, eiaf->fixuplnk);
8301 bfd_putl32 (sizeof (struct vms_eiaf), eiaf->size);
8302 bfd_putl32 (0, eiaf->flags);
8303 bfd_putl32 (0, eiaf->qrelfixoff);
8304 bfd_putl32 (0, eiaf->lrelfixoff);
8305 bfd_putl32 (0, eiaf->qdotadroff);
8306 bfd_putl32 (0, eiaf->ldotadroff);
8307 bfd_putl32 (0, eiaf->codeadroff);
8308 bfd_putl32 (0, eiaf->lpfixoff);
8309 bfd_putl32 (0, eiaf->chgprtoff);
8310 bfd_putl32 (shrimg_cnt ? off : 0, eiaf->shlstoff);
8311 bfd_putl32 (shrimg_cnt, eiaf->shrimgcnt);
8312 bfd_putl32 (0, eiaf->shlextra);
8313 bfd_putl32 (0, eiaf->permctx);
8314 bfd_putl32 (0, eiaf->base_va);
8315 bfd_putl32 (0, eiaf->lppsbfixoff);
8322 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8324 struct alpha_vms_shlib_el *shlib;
8325 struct vms_shl *shl;
8327 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8329 if (!shlib->has_fixups)
8332 /* Renumber shared images. */
8333 PRIV2 (shlib->abfd, shr_index) = shrimg_cnt++;
8335 shl = (struct vms_shl *)(content + off);
8336 bfd_putl32 (0, shl->baseva);
8337 bfd_putl32 (0, shl->shlptr);
8338 bfd_putl32 (0, shl->ident);
8339 bfd_putl32 (0, shl->permctx);
8340 shl->size = sizeof (struct vms_shl);
8341 bfd_putl16 (0, shl->fill_1);
8343 bfd_putl32 (0, shl->icb);
8344 shl->imgnam[0] = strlen (PRIV2 (shlib->abfd, hdr_data.hdr_t_name));
8345 memcpy (shl->imgnam + 1, PRIV2 (shlib->abfd, hdr_data.hdr_t_name),
8348 off += sizeof (struct vms_shl);
8354 bfd_putl32 (off, eiaf->codeadroff);
8356 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8358 struct alpha_vms_shlib_el *shlib;
8361 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8363 if (VEC_COUNT (shlib->ca) == 0)
8366 bfd_putl32 (VEC_COUNT (shlib->ca), content + off);
8367 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8370 for (j = 0; j < VEC_COUNT (shlib->ca); j++)
8372 bfd_putl32 (VEC_EL (shlib->ca, bfd_vma, j) - t->base_addr,
8378 bfd_putl32 (0, content + off);
8379 bfd_putl32 (0, content + off + 4);
8386 bfd_putl32 (off, eiaf->lpfixoff);
8388 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8390 struct alpha_vms_shlib_el *shlib;
8393 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8395 if (VEC_COUNT (shlib->lp) == 0)
8398 bfd_putl32 (VEC_COUNT (shlib->lp), content + off);
8399 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8402 for (j = 0; j < VEC_COUNT (shlib->lp); j++)
8404 bfd_putl32 (VEC_EL (shlib->lp, bfd_vma, j) - t->base_addr,
8410 bfd_putl32 (0, content + off);
8411 bfd_putl32 (0, content + off + 4);
8418 bfd_putl32 (off, eiaf->qdotadroff);
8420 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8422 struct alpha_vms_shlib_el *shlib;
8425 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8427 if (VEC_COUNT (shlib->qr) == 0)
8430 bfd_putl32 (VEC_COUNT (shlib->qr), content + off);
8431 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8434 for (j = 0; j < VEC_COUNT (shlib->qr); j++)
8436 struct alpha_vms_vma_ref *r;
8437 r = &VEC_EL (shlib->qr, struct alpha_vms_vma_ref, j);
8438 bfd_putl32 (r->vma - t->base_addr, content + off);
8439 bfd_putl32 (r->ref, content + off + 4);
8444 bfd_putl32 (0, content + off);
8445 bfd_putl32 (0, content + off + 4);
8456 alpha_vms_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
8459 struct bfd_link_order *p;
8467 bfd_get_outsymbols (abfd) = NULL;
8468 bfd_get_symcount (abfd) = 0;
8470 /* Mark all sections which will be included in the output file. */
8471 for (o = abfd->sections; o != NULL; o = o->next)
8472 for (p = o->map_head.link_order; p != NULL; p = p->next)
8473 if (p->type == bfd_indirect_link_order)
8474 p->u.indirect.section->linker_mark = TRUE;
8477 /* Handle all the link order information for the sections. */
8478 for (o = abfd->sections; o != NULL; o = o->next)
8480 printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
8481 o->name, (unsigned)o->vma, (unsigned)o->flags);
8483 for (p = o->map_head.link_order; p != NULL; p = p->next)
8485 printf (" at 0x%08x - 0x%08x: ",
8486 (unsigned)p->offset, (unsigned)(p->offset + p->size - 1));
8489 case bfd_section_reloc_link_order:
8490 case bfd_symbol_reloc_link_order:
8491 printf (" section/symbol reloc\n");
8493 case bfd_indirect_link_order:
8494 printf (" section %s of %s\n",
8495 p->u.indirect.section->name,
8496 p->u.indirect.section->owner->filename);
8498 case bfd_data_link_order:
8499 printf (" explicit data\n");
8502 printf (" *unknown* type %u\n", p->type);
8509 /* Find the entry point. */
8510 if (bfd_get_start_address (abfd) == 0)
8512 bfd *startbfd = NULL;
8514 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8516 /* Consider only VMS object files. */
8517 if (sub->xvec != abfd->xvec)
8520 if (!PRIV2 (sub, eom_data).eom_has_transfer)
8522 if ((PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR) && startbfd)
8524 if (startbfd != NULL
8525 && !(PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR))
8527 (*info->callbacks->einfo)
8528 (_("%P: multiple entry points: in modules %B and %B\n"),
8537 unsigned int ps_idx = PRIV2 (startbfd, eom_data).eom_l_psindx;
8538 bfd_vma tfradr = PRIV2 (startbfd, eom_data).eom_l_tfradr;
8541 sec = PRIV2 (startbfd, sections)[ps_idx];
8543 bfd_set_start_address
8544 (abfd, sec->output_section->vma + sec->output_offset + tfradr);
8548 /* Allocate contents. */
8549 base_addr = (bfd_vma)-1;
8551 for (o = abfd->sections; o != NULL; o = o->next)
8553 if (o->flags & SEC_HAS_CONTENTS)
8555 o->contents = bfd_alloc (abfd, o->size);
8556 if (o->contents == NULL)
8559 if (o->flags & SEC_LOAD)
8561 if (o->vma < base_addr)
8563 if (o->vma + o->size > last_addr)
8564 last_addr = o->vma + o->size;
8568 /* Create the fixup section. */
8569 fixupsec = bfd_make_section_anyway_with_flags
8570 (info->output_bfd, "$FIXUP$",
8571 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
8572 if (fixupsec == NULL)
8574 last_addr = (last_addr + 0xffff) & ~0xffff;
8575 fixupsec->vma = last_addr;
8577 alpha_vms_link_hash (info)->fixup = fixupsec;
8578 alpha_vms_link_hash (info)->base_addr = base_addr;
8580 /* Create the DMT section, if necessary. */
8581 dst = PRIV (dst_section);
8582 if (dst != NULL && dst->size == 0)
8586 dmt = bfd_make_section_anyway_with_flags
8587 (info->output_bfd, "$DMT$",
8588 SEC_DEBUGGING | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
8595 /* Read all sections from the inputs. */
8596 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8598 if (sub->flags & DYNAMIC)
8600 alpha_vms_create_eisd_for_shared (abfd, sub);
8604 if (!alpha_vms_read_sections_content (sub, info))
8608 /* Handle all the link order information for the sections.
8609 Note: past this point, it is not possible to create new sections. */
8610 for (o = abfd->sections; o != NULL; o = o->next)
8612 for (p = o->map_head.link_order; p != NULL; p = p->next)
8616 case bfd_section_reloc_link_order:
8617 case bfd_symbol_reloc_link_order:
8620 case bfd_indirect_link_order:
8624 if (! _bfd_default_link_order (abfd, info, o, p))
8631 /* Compute fixups. */
8632 if (!alpha_vms_build_fixups (info))
8635 /* Compute the DMT. */
8639 unsigned char *contents = NULL;
8641 /* In pass 1, compute the size. In pass 2, write the DMT contents. */
8642 for (pass = 0; pass < 2; pass++)
8644 unsigned int off = 0;
8646 /* For each object file (ie for each module). */
8647 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8650 struct vms_dmt_header *dmth = NULL;
8651 unsigned int psect_count;
8653 /* Skip this module if it has no DST. */
8654 sub_dst = PRIV2 (sub, dst_section);
8655 if (sub_dst == NULL || sub_dst->size == 0)
8660 /* Write the header. */
8661 dmth = (struct vms_dmt_header *)(contents + off);
8662 bfd_putl32 (sub_dst->output_offset, dmth->modbeg);
8663 bfd_putl32 (sub_dst->size, dmth->size);
8666 off += sizeof (struct vms_dmt_header);
8669 /* For each section (ie for each psect). */
8670 for (o = sub->sections; o != NULL; o = o->next)
8672 /* Only consider interesting sections. */
8673 if (!(o->flags & SEC_ALLOC))
8675 if (o->flags & SEC_LINKER_CREATED)
8680 /* Write an entry. */
8681 struct vms_dmt_psect *dmtp;
8683 dmtp = (struct vms_dmt_psect *)(contents + off);
8684 bfd_putl32 (o->output_offset + o->output_section->vma,
8686 bfd_putl32 (o->size, dmtp->length);
8689 off += sizeof (struct vms_dmt_psect);
8692 bfd_putl32 (psect_count, dmth->psect_count);
8697 contents = bfd_zalloc (info->output_bfd, off);
8698 if (contents == NULL)
8700 dmt->contents = contents;
8705 BFD_ASSERT (off == dmt->size);
8713 /* Read the contents of a section.
8714 buf points to a buffer of buf_size bytes to be filled with
8715 section data (starting at offset into section) */
8718 alpha_vms_get_section_contents (bfd *abfd, asection *section,
8719 void *buf, file_ptr offset,
8720 bfd_size_type count)
8724 /* Image are easy. */
8725 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
8726 return _bfd_generic_get_section_contents (abfd, section,
8727 buf, offset, count);
8730 if (offset + count < count
8731 || offset + count > section->size)
8733 bfd_set_error (bfd_error_invalid_operation);
8737 /* Alloc in memory and read ETIRs. */
8738 BFD_ASSERT (section->contents == NULL);
8740 for (sec = abfd->sections; sec; sec = sec->next)
8742 BFD_ASSERT (sec->contents == NULL);
8744 if (sec->size != 0 && (sec->flags & SEC_HAS_CONTENTS))
8746 sec->contents = bfd_alloc (abfd, sec->size);
8747 if (sec->contents == NULL)
8751 if (!alpha_vms_read_sections_content (abfd, NULL))
8753 for (sec = abfd->sections; sec; sec = sec->next)
8754 if (section->contents)
8755 section->flags |= SEC_IN_MEMORY;
8756 memcpy (buf, section->contents + offset, count);
8761 /* Set the format of a file being written. */
8764 alpha_vms_mkobject (bfd * abfd)
8766 const bfd_arch_info_type *arch;
8768 vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd));
8770 if (!vms_initialize (abfd))
8773 PRIV (recwr.buf) = bfd_alloc (abfd, MAX_OUTREC_SIZE);
8774 if (PRIV (recwr.buf) == NULL)
8777 arch = bfd_scan_arch ("alpha");
8781 bfd_set_error (bfd_error_wrong_format);
8785 abfd->arch_info = arch;
8792 /* Called when the BFD is being closed to do any necessary cleanup. */
8795 vms_close_and_cleanup (bfd * abfd)
8797 vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd));
8799 if (abfd == NULL || abfd->tdata.any == NULL)
8802 if (abfd->format == bfd_archive)
8804 bfd_release (abfd, abfd->tdata.any);
8805 abfd->tdata.any = NULL;
8809 if (PRIV (recrd.buf) != NULL)
8810 free (PRIV (recrd.buf));
8812 if (PRIV (sections) != NULL)
8813 free (PRIV (sections));
8815 bfd_release (abfd, abfd->tdata.any);
8816 abfd->tdata.any = NULL;
8819 if (abfd->direction == write_direction)
8821 /* Last step on VMS is to convert the file to variable record length
8823 if (bfd_cache_close (abfd) != TRUE)
8825 if (vms_convert_to_var_unix_filename (abfd->filename) != TRUE)
8833 /* Called when a new section is created. */
8836 vms_new_section_hook (bfd * abfd, asection *section)
8840 /* Count hasn't been incremented yet. */
8841 unsigned int section_count = abfd->section_count + 1;
8843 vms_debug2 ((1, "vms_new_section_hook (%p, [%d]%s), count %d\n",
8844 abfd, section->index, section->name, section_count));
8846 bfd_set_section_alignment (abfd, section, 0);
8848 if (section_count > PRIV (section_count))
8850 amt = section_count;
8851 amt *= sizeof (asection *);
8852 PRIV (sections) = bfd_realloc_or_free (PRIV (sections), amt);
8853 if (PRIV (sections) == NULL)
8855 PRIV (section_count) = section_count;
8858 vms_debug2 ((6, "section_count: %d\n", PRIV (section_count)));
8860 PRIV (sections)[section->index] = section;
8862 vms_debug2 ((7, "%d: %s\n", section->index, section->name));
8864 amt = sizeof (struct vms_section_data_struct);
8865 section->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
8866 if (section->used_by_bfd == NULL)
8869 if (strcmp (bfd_get_section_name (abfd, section), "$DST$") == 0)
8870 PRIV (dst_section) = section;
8872 /* Create the section symbol. */
8873 return _bfd_generic_new_section_hook (abfd, section);
8876 /* Part 4.5, symbols. */
8878 /* Print symbol to file according to how. how is one of
8879 bfd_print_symbol_name just print the name
8880 bfd_print_symbol_more print more (???)
8881 bfd_print_symbol_all print all we know, which is not much right now :-). */
8884 vms_print_symbol (bfd * abfd,
8887 bfd_print_symbol_type how)
8889 vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
8890 abfd, file, symbol, how));
8894 case bfd_print_symbol_name:
8895 case bfd_print_symbol_more:
8896 fprintf ((FILE *)file," %s", symbol->name);
8899 case bfd_print_symbol_all:
8901 const char *section_name = symbol->section->name;
8903 bfd_print_symbol_vandf (abfd, file, symbol);
8905 fprintf ((FILE *) file," %-8s %s", section_name, symbol->name);
8911 /* Return information about symbol in ret.
8913 fill type, value and name
8916 B bss segment symbol
8918 D data segment symbol
8920 t a static function symbol
8921 T text segment symbol
8926 vms_get_symbol_info (bfd * abfd ATTRIBUTE_UNUSED,
8932 vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd, symbol, ret));
8934 sec = symbol->section;
8941 else if (bfd_is_com_section (sec))
8943 else if (bfd_is_abs_section (sec))
8945 else if (bfd_is_und_section (sec))
8947 else if (bfd_is_ind_section (sec))
8949 else if ((symbol->flags & BSF_FUNCTION)
8950 || (bfd_get_section_flags (abfd, sec) & SEC_CODE))
8952 else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
8954 else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
8959 if (ret->type != 'U')
8960 ret->value = symbol->value + symbol->section->vma;
8963 ret->name = symbol->name;
8966 /* Return TRUE if the given symbol sym in the BFD abfd is
8967 a compiler generated local label, else return FALSE. */
8970 vms_bfd_is_local_label_name (bfd * abfd ATTRIBUTE_UNUSED,
8973 vms_debug2 ((1, "vms_bfd_is_local_label_name (%p, %s)\n", abfd, name));
8974 return name[0] == '$';
8977 /* Part 4.7, writing an object file. */
8979 /* Sets the contents of the section section in BFD abfd to the data starting
8980 in memory at LOCATION. The data is written to the output section starting
8981 at offset offset for count bytes.
8983 Normally TRUE is returned, else FALSE. Possible error returns are:
8984 o bfd_error_no_contents - The output section does not have the
8985 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
8986 o and some more too */
8989 _bfd_vms_set_section_contents (bfd * abfd,
8991 const void * location,
8993 bfd_size_type count)
8995 if (section->contents == NULL)
8997 section->contents = bfd_alloc (abfd, section->size);
8998 if (section->contents == NULL)
9001 memcpy (section->contents + offset, location, (size_t) count);
9007 /* Set the architecture and machine type in BFD abfd to arch and mach.
9008 Find the correct pointer to a structure and insert it into the arch_info
9012 alpha_vms_set_arch_mach (bfd *abfd,
9013 enum bfd_architecture arch, unsigned long mach)
9015 if (arch != bfd_arch_alpha
9016 && arch != bfd_arch_unknown)
9019 return bfd_default_set_arch_mach (abfd, arch, mach);
9022 /* Set section VMS flags. Clear NO_FLAGS and set FLAGS. */
9025 bfd_vms_set_section_flags (bfd *abfd ATTRIBUTE_UNUSED,
9026 asection *sec, flagword no_flags, flagword flags)
9028 vms_section_data (sec)->no_flags = no_flags;
9029 vms_section_data (sec)->flags = flags;
9032 struct vms_private_data_struct *
9033 bfd_vms_get_data (bfd *abfd)
9035 return (struct vms_private_data_struct *)abfd->tdata.any;
9038 #define vms_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9039 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms
9040 #define vms_bfd_copy_link_hash_symbol_type \
9041 _bfd_generic_copy_link_hash_symbol_type
9042 #define vms_bfd_is_group_section bfd_generic_is_group_section
9043 #define vms_bfd_discard_group bfd_generic_discard_group
9044 #define vms_section_already_linked _bfd_generic_section_already_linked
9045 #define vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9046 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
9048 #define vms_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
9049 #define vms_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
9050 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
9051 #define vms_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
9052 #define vms_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
9053 #define vms_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
9055 /* Symbols table. */
9056 #define alpha_vms_make_empty_symbol _bfd_generic_make_empty_symbol
9057 #define alpha_vms_bfd_is_target_special_symbol \
9058 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9059 #define alpha_vms_print_symbol vms_print_symbol
9060 #define alpha_vms_get_symbol_info vms_get_symbol_info
9061 #define alpha_vms_read_minisymbols _bfd_generic_read_minisymbols
9062 #define alpha_vms_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
9063 #define alpha_vms_get_lineno _bfd_nosymbols_get_lineno
9064 #define alpha_vms_find_inliner_info _bfd_nosymbols_find_inliner_info
9065 #define alpha_vms_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
9066 #define alpha_vms_find_nearest_line _bfd_vms_find_nearest_dst_line
9067 #define alpha_vms_bfd_is_local_label_name vms_bfd_is_local_label_name
9069 /* Generic table. */
9070 #define alpha_vms_close_and_cleanup vms_close_and_cleanup
9071 #define alpha_vms_bfd_free_cached_info vms_bfd_free_cached_info
9072 #define alpha_vms_new_section_hook vms_new_section_hook
9073 #define alpha_vms_set_section_contents _bfd_vms_set_section_contents
9074 #define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
9076 #define alpha_vms_bfd_get_relocated_section_contents \
9077 bfd_generic_get_relocated_section_contents
9079 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
9080 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
9081 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
9082 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
9083 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
9084 #define alpha_vms_section_already_linked \
9085 _bfd_generic_section_already_linked
9087 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9088 #define alpha_vms_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
9089 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
9090 #define alpha_vms_bfd_copy_link_hash_symbol_type \
9091 _bfd_generic_copy_link_hash_symbol_type
9093 #define alpha_vms_bfd_link_split_section _bfd_generic_link_split_section
9095 #define alpha_vms_get_dynamic_symtab_upper_bound \
9096 _bfd_nodynamic_get_dynamic_symtab_upper_bound
9097 #define alpha_vms_canonicalize_dynamic_symtab \
9098 _bfd_nodynamic_canonicalize_dynamic_symtab
9099 #define alpha_vms_get_dynamic_reloc_upper_bound \
9100 _bfd_nodynamic_get_dynamic_reloc_upper_bound
9101 #define alpha_vms_canonicalize_dynamic_reloc \
9102 _bfd_nodynamic_canonicalize_dynamic_reloc
9104 const bfd_target vms_alpha_vec =
9106 "vms-alpha", /* Name. */
9107 bfd_target_evax_flavour,
9108 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
9109 BFD_ENDIAN_LITTLE, /* Header byte order is little. */
9111 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
9112 | WP_TEXT | D_PAGED), /* Object flags. */
9113 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
9114 | SEC_READONLY | SEC_CODE | SEC_DATA
9115 | SEC_HAS_CONTENTS | SEC_IN_MEMORY), /* Sect flags. */
9116 0, /* symbol_leading_char. */
9117 ' ', /* ar_pad_char. */
9118 15, /* ar_max_namelen. */
9119 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9120 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9121 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9122 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9123 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9124 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9126 {_bfd_dummy_target, alpha_vms_object_p, /* bfd_check_format. */
9127 _bfd_vms_lib_alpha_archive_p, _bfd_dummy_target},
9128 {bfd_false, alpha_vms_mkobject, /* bfd_set_format. */
9129 _bfd_vms_lib_mkarchive, bfd_false},
9130 {bfd_false, alpha_vms_write_object_contents, /* bfd_write_contents. */
9131 _bfd_vms_lib_write_archive_contents, bfd_false},
9133 BFD_JUMP_TABLE_GENERIC (alpha_vms),
9134 BFD_JUMP_TABLE_COPY (vms),
9135 BFD_JUMP_TABLE_CORE (_bfd_nocore),
9136 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib),
9137 BFD_JUMP_TABLE_SYMBOLS (alpha_vms),
9138 BFD_JUMP_TABLE_RELOCS (alpha_vms),
9139 BFD_JUMP_TABLE_WRITE (alpha_vms),
9140 BFD_JUMP_TABLE_LINK (alpha_vms),
9141 BFD_JUMP_TABLE_DYNAMIC (alpha_vms),