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 */
275 /* Array of GSD sections to get the correspond BFD one. */
276 unsigned int section_max; /* Size of the sections array. */
277 unsigned int section_count; /* Number of GSD sections. */
280 /* Array of raw symbols. */
281 struct vms_symbol_entry **syms;
283 /* Canonicalized symbols. */
286 /* Number of symbols. */
287 unsigned int gsd_sym_count;
288 /* Size of the syms array. */
289 unsigned int max_sym_count;
290 /* Number of procedure symbols. */
291 unsigned int norm_sym_count;
293 /* Stack used to evaluate TIR/ETIR commands. */
294 struct stack_struct *stack;
297 /* Content reading. */
298 asection *image_section; /* section for image_ptr */
299 file_ptr image_offset; /* Offset for image_ptr. */
301 struct module *modules; /* list of all compilation units */
303 struct dst_info *dst_info;
304 asection *dst_section;
306 unsigned int dst_ptr_offsets_count; /* # of offsets in following array */
307 unsigned int *dst_ptr_offsets; /* array of saved image_ptr offsets */
309 /* Shared library support */
310 bfd_vma symvva; /* relative virtual address of symbol vector */
312 unsigned char matchctl;
314 /* Shared library index. This is used for input bfd while linking. */
315 unsigned int shr_index;
317 /* Used to place structures in the file. */
320 /* Simply linked list of eisd. */
321 struct vms_internal_eisd_map *eisd_head;
322 struct vms_internal_eisd_map *eisd_tail;
324 /* Simply linked list of eisd for shared libraries. */
325 struct vms_internal_eisd_map *gbl_eisd_head;
326 struct vms_internal_eisd_map *gbl_eisd_tail;
328 /* linkage index counter used by conditional store commands */
329 int vms_linkage_index;
331 /* see tc-alpha.c of gas for a description. */
332 int flag_hash_long_names; /* -+, hash instead of truncate */
333 int flag_show_after_trunc; /* -H, show hashing/truncation */
336 #define PRIV2(abfd, name) \
337 (((struct vms_private_data_struct *)(abfd)->tdata.any)->name)
338 #define PRIV(name) PRIV2(abfd,name)
341 /* Used to keep extra VMS specific information for a given section.
343 reloc_size holds the size of the relocation stream, note this
344 is very different from the number of relocations as VMS relocations
347 reloc_stream is the actual stream of relocation entries. */
349 struct vms_section_data_struct
351 /* Maximnum number of entries in sec->relocation. */
354 /* Corresponding eisd. Used only while generating executables. */
355 struct vms_internal_eisd_map *eisd;
357 /* PSC flags to be clear. */
360 /* PSC flags to be set. */
364 #define vms_section_data(sec) \
365 ((struct vms_section_data_struct *)sec->used_by_bfd)
367 /* To be called from the debugger. */
368 struct vms_private_data_struct *bfd_vms_get_data (bfd *abfd);
370 static int vms_get_remaining_object_record (bfd *abfd, int read_so_far);
371 static bfd_boolean _bfd_vms_slurp_object_records (bfd * abfd);
372 static void alpha_vms_add_fixup_lp (struct bfd_link_info *, bfd *, bfd *);
373 static void alpha_vms_add_fixup_ca (struct bfd_link_info *, bfd *, bfd *);
374 static void alpha_vms_add_fixup_qr (struct bfd_link_info *, bfd *, bfd *,
376 static void alpha_vms_add_lw_reloc (struct bfd_link_info *info);
377 static void alpha_vms_add_qw_reloc (struct bfd_link_info *info);
378 static void alpha_vms_add_lw_fixup (struct bfd_link_info *, unsigned int,
388 /* Number of elements in VEC. */
390 #define VEC_COUNT(VEC) ((VEC).nbr_el)
392 /* Get the address of the Nth element. */
394 #define VEC_EL(VEC, TYPE, N) (((TYPE *)((VEC).els))[N])
396 #define VEC_INIT(VEC) \
403 /* Be sure there is room for a new element. */
405 static void vector_grow1 (struct vector_type *vec, size_t elsz);
407 /* Allocate room for a new element and return its address. */
409 #define VEC_APPEND(VEC, TYPE) \
410 (vector_grow1 (&VEC, sizeof (TYPE)), &VEC_EL(VEC, TYPE, (VEC).nbr_el++))
412 /* Append an element. */
414 #define VEC_APPEND_EL(VEC, TYPE, EL) \
415 (*(VEC_APPEND (VEC, TYPE)) = EL)
417 struct alpha_vms_vma_ref
419 bfd_vma vma; /* Vma in the output. */
420 bfd_vma ref; /* Reference in the input. */
423 struct alpha_vms_shlib_el
426 bfd_boolean has_fixups;
428 struct vector_type lp; /* Vector of bfd_vma. */
429 struct vector_type ca; /* Vector of bfd_vma. */
430 struct vector_type qr; /* Vector of struct alpha_vms_vma_ref. */
433 /* Alpha VMS linker hash table. */
435 struct alpha_vms_link_hash_table
437 struct bfd_link_hash_table root;
439 /* Vector of shared libaries. */
440 struct vector_type shrlibs;
445 /* Base address. Used by fixups. */
449 #define alpha_vms_link_hash(INFO) \
450 ((struct alpha_vms_link_hash_table *)(INFO->hash))
452 /* Alpha VMS linker hash table entry. */
454 struct alpha_vms_link_hash_entry
456 struct bfd_link_hash_entry root;
458 /* Pointer to the original vms symbol. */
459 struct vms_symbol_entry *sym;
464 /* Read & process EIHD record.
465 Return TRUE on success, FALSE on error. */
468 _bfd_vms_slurp_eihd (bfd *abfd, unsigned int *eisd_offset,
469 unsigned int *eihs_offset)
471 unsigned int imgtype, size;
473 struct vms_eihd *eihd = (struct vms_eihd *)PRIV (recrd.rec);
475 vms_debug2 ((8, "_bfd_vms_slurp_eihd\n"));
477 size = bfd_getl32 (eihd->size);
478 imgtype = bfd_getl32 (eihd->imgtype);
480 if (imgtype == EIHD__K_EXE || imgtype == EIHD__K_LIM)
481 abfd->flags |= EXEC_P;
483 symvva = bfd_getl64 (eihd->symvva);
486 PRIV (symvva) = symvva;
487 abfd->flags |= DYNAMIC;
490 PRIV (ident) = bfd_getl32 (eihd->ident);
491 PRIV (matchctl) = eihd->matchctl;
493 *eisd_offset = bfd_getl32 (eihd->isdoff);
494 *eihs_offset = bfd_getl32 (eihd->symdbgoff);
496 vms_debug2 ((4, "EIHD size %d imgtype %d symvva 0x%lx eisd %d eihs %d\n",
497 size, imgtype, (unsigned long)symvva,
498 *eisd_offset, *eihs_offset));
503 /* Read & process EISD record.
504 Return TRUE on success, FALSE on error. */
507 _bfd_vms_slurp_eisd (bfd *abfd, unsigned int offset)
509 int section_count = 0;
511 vms_debug2 ((8, "_bfd_vms_slurp_eisd\n"));
515 struct vms_eisd *eisd;
516 unsigned int rec_size;
518 unsigned long long vaddr;
525 eisd = (struct vms_eisd *)(PRIV (recrd.rec) + offset);
526 rec_size = bfd_getl32 (eisd->eisdsize);
531 /* Skip to next block if pad. */
532 if (rec_size == 0xffffffff)
534 offset = (offset + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
540 size = bfd_getl32 (eisd->secsize);
541 vaddr = bfd_getl64 (eisd->virt_addr);
542 flags = bfd_getl32 (eisd->flags);
543 vbn = bfd_getl32 (eisd->vbn);
545 vms_debug2 ((4, "EISD at 0x%x size 0x%x addr 0x%lx flags 0x%x blk %d\n",
546 offset, size, (unsigned long)vaddr, flags, vbn));
548 /* VMS combines psects from .obj files into isects in the .exe. This
549 process doesn't preserve enough information to reliably determine
550 what's in each section without examining the data. This is
551 especially true of DWARF debug sections. */
552 bfd_flags = SEC_ALLOC;
554 bfd_flags |= SEC_HAS_CONTENTS | SEC_LOAD;
556 if (flags & EISD__M_EXE)
557 bfd_flags |= SEC_CODE;
559 if (flags & EISD__M_NONSHRADR)
560 bfd_flags |= SEC_DATA;
562 if (!(flags & EISD__M_WRT))
563 bfd_flags |= SEC_READONLY;
565 if (flags & EISD__M_DZRO)
566 bfd_flags |= SEC_DATA;
568 if (flags & EISD__M_FIXUPVEC)
569 bfd_flags |= SEC_DATA;
571 if (flags & EISD__M_CRF)
572 bfd_flags |= SEC_DATA;
574 if (flags & EISD__M_GBL)
576 name = _bfd_vms_save_counted_string (eisd->gblnam);
577 bfd_flags |= SEC_COFF_SHARED_LIBRARY;
578 bfd_flags &= ~(SEC_ALLOC | SEC_LOAD);
580 else if (flags & EISD__M_FIXUPVEC)
582 else if (eisd->type == EISD__K_USRSTACK)
588 name = (char*) bfd_alloc (abfd, 32);
589 if (flags & EISD__M_DZRO)
591 else if (flags & EISD__M_EXE)
593 else if (!(flags & EISD__M_WRT))
597 BFD_ASSERT (section_count < 999);
598 sprintf (name, "$%s_%03d$", pfx, section_count++);
601 section = bfd_make_section (abfd, name);
606 section->filepos = vbn ? VMS_BLOCK_SIZE * (vbn - 1) : 0;
607 section->size = size;
608 section->vma = vaddr;
610 if (!bfd_set_section_flags (abfd, section, bfd_flags))
617 /* Read & process EIHS record.
618 Return TRUE on success, FALSE on error. */
621 _bfd_vms_slurp_eihs (bfd *abfd, unsigned int offset)
623 unsigned char *p = PRIV (recrd.rec) + offset;
624 unsigned int gstvbn = bfd_getl32 (p + EIHS__L_GSTVBN);
625 unsigned int gstsize ATTRIBUTE_UNUSED = bfd_getl32 (p + EIHS__L_GSTSIZE);
626 unsigned int dstvbn = bfd_getl32 (p + EIHS__L_DSTVBN);
627 unsigned int dstsize = bfd_getl32 (p + EIHS__L_DSTSIZE);
628 unsigned int dmtvbn = bfd_getl32 (p + EIHS__L_DMTVBN);
629 unsigned int dmtbytes = bfd_getl32 (p + EIHS__L_DMTBYTES);
633 vms_debug (8, "_bfd_vms_slurp_ihs\n");
634 vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
635 gstvbn, gstsize, dstvbn, dstsize, dmtvbn, dmtbytes);
640 flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
642 section = bfd_make_section (abfd, "$DST$");
646 section->size = dstsize;
647 section->filepos = VMS_BLOCK_SIZE * (dstvbn - 1);
649 if (!bfd_set_section_flags (abfd, section, bfd_flags))
652 PRIV (dst_section) = section;
653 abfd->flags |= (HAS_DEBUG | HAS_LINENO);
658 flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
660 section = bfd_make_section (abfd, "$DMT$");
664 section->size = dmtbytes;
665 section->filepos = VMS_BLOCK_SIZE * (dmtvbn - 1);
667 if (!bfd_set_section_flags (abfd, section, bfd_flags))
673 if (bfd_seek (abfd, VMS_BLOCK_SIZE * (gstvbn - 1), SEEK_SET))
675 bfd_set_error (bfd_error_file_truncated);
679 if (_bfd_vms_slurp_object_records (abfd) != TRUE)
682 abfd->flags |= HAS_SYMS;
688 /* Object file reading. */
690 /* Object file input functions. */
692 /* Get next record from object file to vms_buf.
693 Set PRIV(buf_size) and return it
695 This is a little tricky since it should be portable.
697 The openVMS object file has 'variable length' which means that
698 read() returns data in chunks of (hopefully) correct and expected
699 size. The linker (and other tools on VMS) depend on that. Unix
700 doesn't know about 'formatted' files, so reading and writing such
701 an object file in a Unix environment is not trivial.
703 With the tool 'file' (available on all VMS FTP sites), one
704 can view and change the attributes of a file. Changing from
705 'variable length' to 'fixed length, 512 bytes' reveals the
706 record size at the first 2 bytes of every record. The same
707 may happen during the transfer of object files from VMS to Unix,
708 at least with UCX, the DEC implementation of TCP/IP.
710 The VMS format repeats the size at bytes 2 & 3 of every record.
712 On the first call (file_format == FF_UNKNOWN) we check if
713 the first and the third byte pair (!) of the record match.
714 If they do it's an object file in an Unix environment or with
715 wrong attributes (FF_FOREIGN), else we should be in a VMS
716 environment where read() returns the record size (FF_NATIVE).
718 Reading is always done in 2 steps:
719 1. first just the record header is read and the size extracted,
720 2. then the read buffer is adjusted and the remaining bytes are
723 All file I/O is done on even file positions. */
725 #define VMS_OBJECT_ADJUSTMENT 2
728 maybe_adjust_record_pointer_for_object (bfd *abfd)
730 /* Set the file format once for all on the first invocation. */
731 if (PRIV (recrd.file_format) == FF_UNKNOWN)
733 if (PRIV (recrd.rec)[0] == PRIV (recrd.rec)[4]
734 && PRIV (recrd.rec)[1] == PRIV (recrd.rec)[5])
735 PRIV (recrd.file_format) = FF_FOREIGN;
737 PRIV (recrd.file_format) = FF_NATIVE;
740 /* The adjustment is needed only in an Unix environment. */
741 if (PRIV (recrd.file_format) == FF_FOREIGN)
742 PRIV (recrd.rec) += VMS_OBJECT_ADJUSTMENT;
745 /* Implement step #1 of the object record reading procedure.
746 Return the record type or -1 on failure. */
749 _bfd_vms_get_object_record (bfd *abfd)
751 unsigned int test_len = 6;
754 vms_debug2 ((8, "_bfd_vms_get_obj_record\n"));
756 /* Skip alignment byte if the current position is odd. */
757 if (PRIV (recrd.file_format) == FF_FOREIGN && (bfd_tell (abfd) & 1))
759 if (bfd_bread (PRIV (recrd.buf), 1, abfd) != 1)
761 bfd_set_error (bfd_error_file_truncated);
766 /* Read the record header */
767 if (bfd_bread (PRIV (recrd.buf), test_len, abfd) != test_len)
769 bfd_set_error (bfd_error_file_truncated);
773 /* Reset the record pointer. */
774 PRIV (recrd.rec) = PRIV (recrd.buf);
775 maybe_adjust_record_pointer_for_object (abfd);
777 if (vms_get_remaining_object_record (abfd, test_len) <= 0)
780 type = bfd_getl16 (PRIV (recrd.rec));
782 vms_debug2 ((8, "_bfd_vms_get_obj_record: rec %p, size %d, type %d\n",
783 PRIV (recrd.rec), PRIV (recrd.rec_size), type));
788 /* Implement step #2 of the object record reading procedure.
789 Return the size of the record or 0 on failure. */
792 vms_get_remaining_object_record (bfd *abfd, int read_so_far)
794 unsigned int to_read;
796 vms_debug2 ((8, "vms_get_remaining_obj_record\n"));
798 /* Extract record size. */
799 PRIV (recrd.rec_size) = bfd_getl16 (PRIV (recrd.rec) + 2);
801 if (PRIV (recrd.rec_size) <= 0)
803 bfd_set_error (bfd_error_file_truncated);
807 /* That's what the linker manual says. */
808 if (PRIV (recrd.rec_size) > EOBJ__C_MAXRECSIZ)
810 bfd_set_error (bfd_error_file_truncated);
814 /* Take into account object adjustment. */
815 to_read = PRIV (recrd.rec_size);
816 if (PRIV (recrd.file_format) == FF_FOREIGN)
817 to_read += VMS_OBJECT_ADJUSTMENT;
819 /* Adjust the buffer. */
820 if (to_read > PRIV (recrd.buf_size))
823 = (unsigned char *) bfd_realloc (PRIV (recrd.buf), to_read);
824 if (PRIV (recrd.buf) == NULL)
826 PRIV (recrd.buf_size) = to_read;
829 /* Read the remaining record. */
830 to_read -= read_so_far;
832 vms_debug2 ((8, "vms_get_remaining_obj_record: to_read %d\n", to_read));
834 if (bfd_bread (PRIV (recrd.buf) + read_so_far, to_read, abfd) != to_read)
836 bfd_set_error (bfd_error_file_truncated);
840 /* Reset the record pointer. */
841 PRIV (recrd.rec) = PRIV (recrd.buf);
842 maybe_adjust_record_pointer_for_object (abfd);
844 vms_debug2 ((8, "vms_get_remaining_obj_record: size %d\n",
845 PRIV (recrd.rec_size)));
847 return PRIV (recrd.rec_size);
850 /* Read and process emh record.
851 Return TRUE on success, FALSE on error. */
854 _bfd_vms_slurp_ehdr (bfd *abfd)
857 unsigned char *vms_rec;
860 vms_rec = PRIV (recrd.rec);
862 vms_debug2 ((2, "HDR/EMH\n"));
864 subtype = bfd_getl16 (vms_rec + 4);
866 vms_debug2 ((3, "subtype %d\n", subtype));
872 PRIV (hdr_data).hdr_b_strlvl = vms_rec[6];
873 PRIV (hdr_data).hdr_l_arch1 = bfd_getl32 (vms_rec + 8);
874 PRIV (hdr_data).hdr_l_arch2 = bfd_getl32 (vms_rec + 12);
875 PRIV (hdr_data).hdr_l_recsiz = bfd_getl32 (vms_rec + 16);
876 PRIV (hdr_data).hdr_t_name = _bfd_vms_save_counted_string (vms_rec + 20);
877 ptr = vms_rec + 20 + vms_rec[20] + 1;
878 PRIV (hdr_data).hdr_t_version =_bfd_vms_save_counted_string (ptr);
880 PRIV (hdr_data).hdr_t_date = _bfd_vms_save_sized_string (ptr, 17);
884 PRIV (hdr_data).hdr_c_lnm =
885 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
889 PRIV (hdr_data).hdr_c_src =
890 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
894 PRIV (hdr_data).hdr_c_ttl =
895 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
904 bfd_set_error (bfd_error_wrong_format);
911 /* Typical sections for evax object files. */
913 #define EVAX_ABS_NAME "$ABS$"
914 #define EVAX_CODE_NAME "$CODE$"
915 #define EVAX_LINK_NAME "$LINK$"
916 #define EVAX_DATA_NAME "$DATA$"
917 #define EVAX_BSS_NAME "$BSS$"
918 #define EVAX_READONLYADDR_NAME "$READONLY_ADDR$"
919 #define EVAX_READONLY_NAME "$READONLY$"
920 #define EVAX_LITERAL_NAME "$LITERAL$"
921 #define EVAX_LITERALS_NAME "$LITERALS"
922 #define EVAX_COMMON_NAME "$COMMON$"
923 #define EVAX_LOCAL_NAME "$LOCAL$"
925 struct sec_flags_struct
927 const char *name; /* Name of section. */
929 flagword flags_always; /* Flags we set always. */
931 flagword flags_hassize; /* Flags we set if the section has a size > 0. */
934 /* These flags are deccrtl/vaxcrtl (openVMS 6.2 Alpha) compatible. */
936 static struct sec_flags_struct evax_section_flags[] =
942 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD) },
944 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_EXE),
946 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_EXE),
947 (SEC_CODE | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD) },
949 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD | EGPS__V_NOMOD),
950 (SEC_DATA | SEC_READONLY),
951 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD),
952 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_READONLY | SEC_LOAD) },
954 (EGPS__V_REL | EGPS__V_RD),
955 (SEC_DATA | SEC_READONLY),
956 (EGPS__V_REL | EGPS__V_RD),
957 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_READONLY | SEC_LOAD) },
959 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD),
961 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT),
962 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD) },
964 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD),
966 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD),
968 { EVAX_READONLYADDR_NAME,
969 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_RD),
970 (SEC_DATA | SEC_READONLY),
971 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_RD),
972 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_READONLY | SEC_LOAD) },
973 { EVAX_READONLY_NAME,
974 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD | EGPS__V_NOMOD),
975 (SEC_DATA | SEC_READONLY),
976 (EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD),
977 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_READONLY | SEC_LOAD) },
979 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT),
981 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT),
982 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD) },
983 { EVAX_LITERALS_NAME,
984 (EGPS__V_PIC | EGPS__V_OVR),
985 (SEC_DATA | SEC_READONLY),
986 (EGPS__V_PIC | EGPS__V_OVR),
987 (SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_READONLY | SEC_LOAD) },
989 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT),
991 (EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT),
992 (SEC_IN_MEMORY | SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD) }
995 /* Retrieve bfd section flags by name and size. */
998 vms_secflag_by_name (bfd *abfd ATTRIBUTE_UNUSED,
999 struct sec_flags_struct *section_flags,
1005 while (section_flags[i].name != NULL)
1007 if (strcmp (name, section_flags[i].name) == 0)
1010 return section_flags[i].flags_hassize;
1012 return section_flags[i].flags_always;
1017 return section_flags[i].flags_hassize;
1018 return section_flags[i].flags_always;
1021 /* Retrieve vms section flags by name and size. */
1024 vms_esecflag_by_name (struct sec_flags_struct *section_flags,
1030 while (section_flags[i].name != NULL)
1032 if (strcmp (name, section_flags[i].name) == 0)
1035 return section_flags[i].vflags_hassize;
1037 return section_flags[i].vflags_always;
1042 return section_flags[i].vflags_hassize;
1043 return section_flags[i].vflags_always;
1046 /* Input routines. */
1048 static struct vms_symbol_entry *
1049 add_symbol (bfd *abfd, const unsigned char *ascic)
1051 struct vms_symbol_entry *entry;
1055 entry = (struct vms_symbol_entry *)bfd_zalloc (abfd, sizeof (*entry) + len);
1058 entry->namelen = len;
1059 memcpy (entry->name, ascic, len);
1060 entry->name[len] = 0;
1061 entry->owner = abfd;
1063 if (PRIV (gsd_sym_count) >= PRIV (max_sym_count))
1065 if (PRIV (max_sym_count) == 0)
1067 PRIV (max_sym_count) = 128;
1068 PRIV (syms) = bfd_malloc
1069 (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *));
1073 PRIV (max_sym_count) *= 2;
1074 PRIV (syms) = bfd_realloc
1076 (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *)));
1078 if (PRIV (syms) == NULL)
1082 PRIV (syms)[PRIV (gsd_sym_count)++] = entry;
1086 /* Read and process EGSD. Return FALSE on failure. */
1089 _bfd_vms_slurp_egsd (bfd *abfd)
1091 int gsd_type, gsd_size;
1093 unsigned char *vms_rec;
1094 flagword new_flags, old_flags;
1096 unsigned long base_addr;
1097 unsigned long align_addr;
1099 vms_debug2 ((2, "EGSD\n"));
1101 PRIV (recrd.rec) += 8; /* Skip type, size, align pad. */
1102 PRIV (recrd.rec_size) -= 8;
1104 /* Calculate base address for each section. */
1107 while (PRIV (recrd.rec_size) > 0)
1109 vms_rec = PRIV (recrd.rec);
1111 gsd_type = bfd_getl16 (vms_rec);
1112 gsd_size = bfd_getl16 (vms_rec + 2);
1114 vms_debug2 ((3, "egsd_type %d\n", gsd_type));
1120 /* Program section definition. */
1121 struct vms_egps *egps = (struct vms_egps *)vms_rec;
1123 name = _bfd_vms_save_counted_string (&egps->namlng);
1124 section = bfd_make_section (abfd, name);
1128 old_flags = bfd_getl16 (egps->flags);
1129 vms_section_data (section)->flags = old_flags;
1130 vms_section_data (section)->no_flags = 0;
1131 section->size = bfd_getl32 (egps->alloc);
1132 new_flags = vms_secflag_by_name (abfd, evax_section_flags, name,
1134 if (!(old_flags & EGPS__V_NOMOD))
1136 new_flags |= SEC_HAS_CONTENTS;
1137 if (old_flags & EGPS__V_REL)
1138 new_flags |= SEC_RELOC;
1140 if (!bfd_set_section_flags (abfd, section, new_flags))
1142 section->alignment_power = egps->align;
1143 align_addr = (1 << section->alignment_power);
1144 if ((base_addr % align_addr) != 0)
1145 base_addr += (align_addr - (base_addr % align_addr));
1146 section->vma = (bfd_vma)base_addr;
1147 base_addr += section->size;
1148 section->filepos = (unsigned int)-1;
1150 /* Append it to the section array. */
1151 if (PRIV (section_count) >= PRIV (section_max))
1153 if (PRIV (section_max) == 0)
1154 PRIV (section_max) = 16;
1156 PRIV (section_max) *= 2;
1157 PRIV (sections) = bfd_realloc_or_free
1158 (PRIV (sections), PRIV (section_max) * sizeof (asection *));
1159 if (PRIV (sections) == NULL)
1163 PRIV (sections)[PRIV (section_count)] = section;
1164 PRIV (section_count)++;
1167 vms_debug (4, "EGSD P-section %d (%s, flags %04x) ",
1168 section->index, name, old_flags);
1169 vms_debug (4, "%lu bytes at 0x%08lx (mem %p)\n",
1170 (unsigned long)section->size,
1171 (unsigned long)section->vma, section->contents);
1179 struct vms_symbol_entry *entry;
1180 struct vms_egsy *egsy = (struct vms_egsy *) vms_rec;
1182 old_flags = bfd_getl16 (egsy->flags);
1183 if (old_flags & EGSY__V_DEF)
1184 nameoff = ESDF__B_NAMLNG;
1186 nameoff = ESRF__B_NAMLNG;
1188 entry = add_symbol (abfd, vms_rec + nameoff);
1192 /* Allow only duplicate reference. */
1193 if ((entry->flags & EGSY__V_DEF) && (old_flags & EGSY__V_DEF))
1196 if (entry->typ == 0)
1198 entry->typ = gsd_type;
1199 entry->data_type = egsy->datyp;
1200 entry->flags = old_flags;
1203 if (old_flags & EGSY__V_DEF)
1205 struct vms_esdf *esdf = (struct vms_esdf *)vms_rec;
1207 entry->value = bfd_getl64 (esdf->value);
1208 entry->section = bfd_getl32 (esdf->psindx);
1210 if (old_flags & EGSY__V_NORM)
1212 PRIV (norm_sym_count)++;
1214 entry->code_value = bfd_getl64 (esdf->code_address);
1215 entry->code_section = bfd_getl32 (esdf->ca_psindx);
1224 struct vms_symbol_entry *entry;
1225 struct vms_egst *egst = (struct vms_egst *)vms_rec;
1227 old_flags = bfd_getl16 (egst->header.flags);
1228 if (old_flags & EGSY__V_DEF)
1229 nameoff = ESDF__B_NAMLNG;
1231 nameoff = ESRF__B_NAMLNG;
1233 entry = add_symbol (abfd, &egst->namlng);
1238 entry->typ = gsd_type;
1239 entry->data_type = egst->header.datyp;
1240 entry->flags = old_flags;
1242 entry->symbol_vector = bfd_getl32 (egst->value);
1244 entry->section = bfd_getl32 (egst->psindx);
1245 entry->value = bfd_getl64 (egst->lp_2);
1247 if (old_flags & EGSY__V_NORM)
1249 PRIV (norm_sym_count)++;
1251 entry->code_value = bfd_getl64 (egst->lp_1);
1252 entry->code_section = 0;
1259 /* Currently ignored. */
1264 (*_bfd_error_handler) (_("Unknown EGSD subtype %d"), gsd_type);
1265 bfd_set_error (bfd_error_bad_value);
1269 PRIV (recrd.rec_size) -= gsd_size;
1270 PRIV (recrd.rec) += gsd_size;
1273 if (PRIV (gsd_sym_count) > 0)
1274 abfd->flags |= HAS_SYMS;
1279 /* Stack routines for vms ETIR commands. */
1281 /* Push value and section index. */
1284 _bfd_vms_push (bfd *abfd, bfd_vma val, unsigned int reloc)
1286 vms_debug2 ((4, "<push %08lx (0x%08x) at %d>\n",
1287 (unsigned long)val, reloc, PRIV (stackptr)));
1289 PRIV (stack[PRIV (stackptr)]).value = val;
1290 PRIV (stack[PRIV (stackptr)]).reloc = reloc;
1292 if (PRIV (stackptr) >= STACKSIZE)
1294 bfd_set_error (bfd_error_bad_value);
1295 (*_bfd_error_handler) (_("Stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr));
1300 /* Pop value and section index. */
1303 _bfd_vms_pop (bfd *abfd, bfd_vma *val, unsigned int *rel)
1305 if (PRIV (stackptr) == 0)
1307 bfd_set_error (bfd_error_bad_value);
1308 (*_bfd_error_handler) (_("Stack underflow in _bfd_vms_pop"));
1312 *val = PRIV (stack[PRIV (stackptr)]).value;
1313 *rel = PRIV (stack[PRIV (stackptr)]).reloc;
1315 vms_debug2 ((4, "<pop %08lx (0x%08x)>\n", (unsigned long)*val, *rel));
1318 /* Routines to fill sections contents during tir/etir read. */
1320 /* Initialize image buffer pointer to be filled. */
1323 image_set_ptr (bfd *abfd, bfd_vma vma, int sect, struct bfd_link_info *info)
1327 vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma, sect));
1329 sec = PRIV (sections)[sect];
1333 /* Reading contents to an output bfd. */
1335 if (sec->output_section == NULL)
1337 /* Section discarded. */
1338 vms_debug2 ((5, " section %s discarded\n", sec->name));
1340 /* This is not used. */
1341 PRIV (image_section) = NULL;
1342 PRIV (image_offset) = 0;
1345 PRIV (image_offset) = sec->output_offset + vma;
1346 PRIV (image_section) = sec->output_section;
1350 PRIV (image_offset) = vma;
1351 PRIV (image_section) = sec;
1355 /* Increment image buffer pointer by offset. */
1358 image_inc_ptr (bfd *abfd, bfd_vma offset)
1360 vms_debug2 ((4, "image_inc_ptr (%u)\n", (unsigned)offset));
1362 PRIV (image_offset) += offset;
1365 /* Save current DST location counter under specified index. */
1368 dst_define_location (bfd *abfd, unsigned int loc)
1370 vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc));
1372 /* Grow the ptr offset table if necessary. */
1373 if (loc + 1 > PRIV (dst_ptr_offsets_count))
1375 PRIV (dst_ptr_offsets) = bfd_realloc (PRIV (dst_ptr_offsets),
1376 (loc + 1) * sizeof (unsigned int));
1377 PRIV (dst_ptr_offsets_count) = loc + 1;
1380 PRIV (dst_ptr_offsets)[loc] = PRIV (image_offset);
1383 /* Restore saved DST location counter from specified index. */
1386 dst_restore_location (bfd *abfd, unsigned int loc)
1388 vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc));
1390 PRIV (image_offset) = PRIV (dst_ptr_offsets)[loc];
1393 /* Retrieve saved DST location counter from specified index. */
1396 dst_retrieve_location (bfd *abfd, unsigned int loc)
1398 vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int)loc));
1400 return PRIV (dst_ptr_offsets)[loc];
1403 /* Write multiple bytes to section image. */
1406 image_write (bfd *abfd, unsigned char *ptr, int size)
1409 _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr, size,
1410 (long)PRIV (image_offset));
1411 _bfd_hexdump (9, ptr, size, 0);
1414 if (PRIV (image_section)->contents != NULL)
1416 asection *sec = PRIV (image_section);
1417 file_ptr off = PRIV (image_offset);
1420 if (off > (file_ptr)sec->size
1421 || size > (file_ptr)sec->size
1422 || off + size > (file_ptr)sec->size)
1424 bfd_set_error (bfd_error_bad_value);
1428 memcpy (sec->contents + off, ptr, size);
1431 PRIV (image_offset) += size;
1435 /* Write byte to section image. */
1438 image_write_b (bfd * abfd, unsigned int value)
1440 unsigned char data[1];
1442 vms_debug2 ((6, "image_write_b (%02x)\n", (int) value));
1446 return image_write (abfd, data, sizeof (data));
1449 /* Write 2-byte word to image. */
1452 image_write_w (bfd * abfd, unsigned int value)
1454 unsigned char data[2];
1456 vms_debug2 ((6, "image_write_w (%04x)\n", (int) value));
1458 bfd_putl16 (value, data);
1459 return image_write (abfd, data, sizeof (data));
1462 /* Write 4-byte long to image. */
1465 image_write_l (bfd * abfd, unsigned long value)
1467 unsigned char data[4];
1469 vms_debug2 ((6, "image_write_l (%08lx)\n", value));
1471 bfd_putl32 (value, data);
1472 return image_write (abfd, data, sizeof (data));
1475 /* Write 8-byte quad to image. */
1478 image_write_q (bfd * abfd, bfd_vma value)
1480 unsigned char data[8];
1482 vms_debug2 ((6, "image_write_q (%08lx)\n", (unsigned long)value));
1484 bfd_putl64 (value, data);
1485 return image_write (abfd, data, sizeof (data));
1489 _bfd_vms_etir_name (int cmd)
1493 case ETIR__C_STA_GBL: return "ETIR__C_STA_GBL";
1494 case ETIR__C_STA_LW: return "ETIR__C_STA_LW";
1495 case ETIR__C_STA_QW: return "ETIR__C_STA_QW";
1496 case ETIR__C_STA_PQ: return "ETIR__C_STA_PQ";
1497 case ETIR__C_STA_LI: return "ETIR__C_STA_LI";
1498 case ETIR__C_STA_MOD: return "ETIR__C_STA_MOD";
1499 case ETIR__C_STA_CKARG: return "ETIR__C_STA_CKARG";
1500 case ETIR__C_STO_B: return "ETIR__C_STO_B";
1501 case ETIR__C_STO_W: return "ETIR__C_STO_W";
1502 case ETIR__C_STO_GBL: return "ETIR__C_STO_GBL";
1503 case ETIR__C_STO_CA: return "ETIR__C_STO_CA";
1504 case ETIR__C_STO_RB: return "ETIR__C_STO_RB";
1505 case ETIR__C_STO_AB: return "ETIR__C_STO_AB";
1506 case ETIR__C_STO_OFF: return "ETIR__C_STO_OFF";
1507 case ETIR__C_STO_IMM: return "ETIR__C_STO_IMM";
1508 case ETIR__C_STO_IMMR: return "ETIR__C_STO_IMMR";
1509 case ETIR__C_STO_LW: return "ETIR__C_STO_LW";
1510 case ETIR__C_STO_QW: return "ETIR__C_STO_QW";
1511 case ETIR__C_STO_GBL_LW: return "ETIR__C_STO_GBL_LW";
1512 case ETIR__C_STO_LP_PSB: return "ETIR__C_STO_LP_PSB";
1513 case ETIR__C_STO_HINT_GBL: return "ETIR__C_STO_HINT_GBL";
1514 case ETIR__C_STO_HINT_PS: return "ETIR__C_STO_HINT_PS";
1515 case ETIR__C_OPR_ADD: return "ETIR__C_OPR_ADD";
1516 case ETIR__C_OPR_SUB: return "ETIR__C_OPR_SUB";
1517 case ETIR__C_OPR_INSV: return "ETIR__C_OPR_INSV";
1518 case ETIR__C_OPR_USH: return "ETIR__C_OPR_USH";
1519 case ETIR__C_OPR_ROT: return "ETIR__C_OPR_ROT";
1520 case ETIR__C_OPR_REDEF: return "ETIR__C_OPR_REDEF";
1521 case ETIR__C_OPR_DFLIT: return "ETIR__C_OPR_DFLIT";
1522 case ETIR__C_STC_LP: return "ETIR__C_STC_LP";
1523 case ETIR__C_STC_GBL: return "ETIR__C_STC_GBL";
1524 case ETIR__C_STC_GCA: return "ETIR__C_STC_GCA";
1525 case ETIR__C_STC_PS: return "ETIR__C_STC_PS";
1526 case ETIR__C_STC_NBH_PS: return "ETIR__C_STC_NBH_PS";
1527 case ETIR__C_STC_NOP_GBL: return "ETIR__C_STC_NOP_GBL";
1528 case ETIR__C_STC_NOP_PS: return "ETIR__C_STC_NOP_PS";
1529 case ETIR__C_STC_BSR_GBL: return "ETIR__C_STC_BSR_GBL";
1530 case ETIR__C_STC_BSR_PS: return "ETIR__C_STC_BSR_PS";
1531 case ETIR__C_STC_LDA_GBL: return "ETIR__C_STC_LDA_GBL";
1532 case ETIR__C_STC_LDA_PS: return "ETIR__C_STC_LDA_PS";
1533 case ETIR__C_STC_BOH_GBL: return "ETIR__C_STC_BOH_GBL";
1534 case ETIR__C_STC_BOH_PS: return "ETIR__C_STC_BOH_PS";
1535 case ETIR__C_STC_NBH_GBL: return "ETIR__C_STC_NBH_GBL";
1536 case ETIR__C_STC_LP_PSB: return "ETIR__C_STC_LP_PSB";
1537 case ETIR__C_CTL_SETRB: return "ETIR__C_CTL_SETRB";
1538 case ETIR__C_CTL_AUGRB: return "ETIR__C_CTL_AUGRB";
1539 case ETIR__C_CTL_DFLOC: return "ETIR__C_CTL_DFLOC";
1540 case ETIR__C_CTL_STLOC: return "ETIR__C_CTL_STLOC";
1541 case ETIR__C_CTL_STKDL: return "ETIR__C_CTL_STKDL";
1544 /* These names have not yet been added to this switch statement. */
1545 (*_bfd_error_handler) (_("unknown ETIR command %d"), cmd);
1550 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
1553 _bfd_vms_get_value (bfd *abfd, const unsigned char *ascic,
1554 struct bfd_link_info *info,
1556 struct alpha_vms_link_hash_entry **hp)
1561 struct alpha_vms_link_hash_entry *h;
1563 /* Not linking. Do not try to resolve the symbol. */
1572 for (i = 0; i < len; i++)
1573 name[i] = ascic[i + 1];
1576 h = (struct alpha_vms_link_hash_entry *)
1577 bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
1582 && (h->root.type == bfd_link_hash_defined
1583 || h->root.type == bfd_link_hash_defweak))
1584 *vma = h->root.u.def.value
1585 + h->root.u.def.section->output_offset
1586 + h->root.u.def.section->output_section->vma;
1587 else if (h && h->root.type == bfd_link_hash_undefweak)
1591 if (!(*info->callbacks->undefined_symbol)
1592 (info, name, abfd, PRIV (image_section), PRIV (image_offset), TRUE))
1600 #define RELC_SHR_BASE 0x10000
1601 #define RELC_SEC_BASE 0x20000
1602 #define RELC_MASK 0x0ffff
1605 alpha_vms_sym_to_ctxt (struct alpha_vms_link_hash_entry *h)
1607 /* Handle undefined symbols. */
1608 if (h == NULL || h->sym == NULL)
1611 if (h->sym->typ == EGSD__C_SYMG)
1613 if (h->sym->flags & EGSY__V_REL)
1614 return RELC_SHR_BASE + PRIV2 (h->sym->owner, shr_index);
1617 /* Can this happen ? I'd like to see an example. */
1621 if (h->sym->typ == EGSD__C_SYM)
1623 if (h->sym->flags & EGSY__V_REL)
1632 alpha_vms_get_sym_value (unsigned int sect, bfd_vma addr,
1633 struct alpha_vms_link_hash_entry *h)
1637 BFD_ASSERT (h && (h->root.type == bfd_link_hash_defined
1638 || h->root.type == bfd_link_hash_defweak));
1640 s = PRIV2 (h->root.u.def.section->owner, sections)[sect];
1641 return s->output_section->vma + s->output_offset + addr;
1645 alpha_vms_fix_sec_rel (bfd *abfd, struct bfd_link_info *info,
1646 unsigned int rel, bfd_vma vma)
1648 asection *sec = PRIV (sections)[rel & RELC_MASK];
1652 if (sec->output_section == NULL)
1654 return vma + sec->output_section->vma + sec->output_offset;
1657 return vma + sec->vma;
1660 /* Read an ETIR record from ABFD. If INFO is not null, put the content into
1661 the output section (used during linking).
1662 Return FALSE in case of error. */
1665 _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info)
1668 unsigned int length;
1669 unsigned char *maxptr;
1674 struct alpha_vms_link_hash_entry *h;
1676 PRIV (recrd.rec) += ETIR__C_HEADER_SIZE;
1677 PRIV (recrd.rec_size) -= ETIR__C_HEADER_SIZE;
1679 ptr = PRIV (recrd.rec);
1680 length = PRIV (recrd.rec_size);
1681 maxptr = ptr + length;
1683 vms_debug2 ((2, "ETIR: %d bytes\n", length));
1685 while (ptr < maxptr)
1687 int cmd = bfd_getl16 (ptr);
1688 int cmd_length = bfd_getl16 (ptr + 2);
1693 _bfd_vms_debug (4, "etir: %s(%d)\n",
1694 _bfd_vms_etir_name (cmd), cmd);
1695 _bfd_hexdump (8, ptr, cmd_length - 4, (long) ptr);
1703 stack 32 bit value of symbol (high bits set to 0). */
1704 case ETIR__C_STA_GBL:
1705 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1706 _bfd_vms_push (abfd, op1, alpha_vms_sym_to_ctxt (h));
1712 stack 32 bit value, sign extend to 64 bit. */
1713 case ETIR__C_STA_LW:
1714 _bfd_vms_push (abfd, bfd_getl32 (ptr), RELC_NONE);
1720 stack 64 bit value of symbol. */
1721 case ETIR__C_STA_QW:
1722 _bfd_vms_push (abfd, bfd_getl64 (ptr), RELC_NONE);
1725 /* Stack psect base plus quadword offset
1726 arg: lw section index
1727 qw signed quadword offset (low 32 bits)
1729 Stack qw argument and section index
1730 (see ETIR__C_STO_OFF, ETIR__C_CTL_SETRB). */
1731 case ETIR__C_STA_PQ:
1735 psect = bfd_getl32 (ptr);
1736 if ((unsigned int) psect >= PRIV (section_count))
1738 (*_bfd_error_handler) (_("bad section index in %s"),
1739 _bfd_vms_etir_name (cmd));
1740 bfd_set_error (bfd_error_bad_value);
1743 op1 = bfd_getl64 (ptr + 4);
1744 _bfd_vms_push (abfd, op1, psect | RELC_SEC_BASE);
1748 case ETIR__C_STA_LI:
1749 case ETIR__C_STA_MOD:
1750 case ETIR__C_STA_CKARG:
1751 (*_bfd_error_handler) (_("unsupported STA cmd %s"),
1752 _bfd_vms_etir_name (cmd));
1756 /* Store byte: pop stack, write byte
1759 _bfd_vms_pop (abfd, &op1, &rel1);
1760 if (rel1 != RELC_NONE)
1762 image_write_b (abfd, (unsigned int) op1 & 0xff);
1765 /* Store word: pop stack, write word
1768 _bfd_vms_pop (abfd, &op1, &rel1);
1769 if (rel1 != RELC_NONE)
1771 image_write_w (abfd, (unsigned int) op1 & 0xffff);
1774 /* Store longword: pop stack, write longword
1776 case ETIR__C_STO_LW:
1777 _bfd_vms_pop (abfd, &op1, &rel1);
1778 if (rel1 & RELC_SEC_BASE)
1780 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1783 else if (rel1 & RELC_SHR_BASE)
1785 alpha_vms_add_lw_fixup (info, rel1 & RELC_MASK, op1);
1788 if (rel1 != RELC_NONE)
1790 if (rel1 != RELC_REL)
1792 alpha_vms_add_lw_reloc (info);
1794 image_write_l (abfd, op1);
1797 /* Store quadword: pop stack, write quadword
1799 case ETIR__C_STO_QW:
1800 _bfd_vms_pop (abfd, &op1, &rel1);
1801 if (rel1 & RELC_SEC_BASE)
1803 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1806 else if (rel1 & RELC_SHR_BASE)
1808 if (rel1 != RELC_NONE)
1810 if (rel1 != RELC_REL)
1812 alpha_vms_add_qw_reloc (info);
1814 image_write_q (abfd, op1);
1817 /* Store immediate repeated: pop stack for repeat count
1820 case ETIR__C_STO_IMMR:
1824 size = bfd_getl32 (ptr);
1825 _bfd_vms_pop (abfd, &op1, &rel1);
1826 if (rel1 != RELC_NONE)
1829 image_write (abfd, ptr + 4, size);
1833 /* Store global: write symbol value
1834 arg: cs global symbol name. */
1835 case ETIR__C_STO_GBL:
1836 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1839 if (h->sym->typ == EGSD__C_SYMG)
1841 alpha_vms_add_fixup_qr
1842 (info, abfd, h->sym->owner, h->sym->symbol_vector);
1847 op1 = alpha_vms_get_sym_value (h->sym->section,
1849 alpha_vms_add_qw_reloc (info);
1852 image_write_q (abfd, op1);
1855 /* Store code address: write address of entry point
1856 arg: cs global symbol name (procedure). */
1857 case ETIR__C_STO_CA:
1858 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1861 if (h->sym->flags & EGSY__V_NORM)
1863 /* That's really a procedure. */
1864 if (h->sym->typ == EGSD__C_SYMG)
1866 alpha_vms_add_fixup_ca (info, abfd, h->sym->owner);
1867 op1 = h->sym->symbol_vector;
1871 op1 = alpha_vms_get_sym_value (h->sym->code_section,
1872 h->sym->code_value, h);
1873 alpha_vms_add_qw_reloc (info);
1878 /* Symbol is not a procedure. */
1882 image_write_q (abfd, op1);
1885 /* Store offset to psect: pop stack, add low 32 bits to base of psect
1887 case ETIR__C_STO_OFF:
1888 _bfd_vms_pop (abfd, &op1, &rel1);
1890 if (!(rel1 & RELC_SEC_BASE))
1893 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1895 image_write_q (abfd, op1);
1899 arg: lw count of bytes
1901 case ETIR__C_STO_IMM:
1905 size = bfd_getl32 (ptr);
1906 image_write (abfd, ptr + 4, size);
1910 /* This code is 'reserved to digital' according to the openVMS
1911 linker manual, however it is generated by the DEC C compiler
1912 and defined in the include file.
1913 FIXME, since the following is just a guess
1914 store global longword: store 32bit value of symbol
1915 arg: cs symbol name. */
1916 case ETIR__C_STO_GBL_LW:
1917 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1921 image_write_l (abfd, op1);
1924 case ETIR__C_STO_RB:
1925 case ETIR__C_STO_AB:
1926 case ETIR__C_STO_LP_PSB:
1927 (*_bfd_error_handler) (_("%s: not supported"),
1928 _bfd_vms_etir_name (cmd));
1931 case ETIR__C_STO_HINT_GBL:
1932 case ETIR__C_STO_HINT_PS:
1933 (*_bfd_error_handler) (_("%s: not implemented"),
1934 _bfd_vms_etir_name (cmd));
1938 /* 200 Store-conditional Linkage Pair
1940 case ETIR__C_STC_LP:
1942 /* 202 Store-conditional Address at global address
1946 case ETIR__C_STC_GBL:
1948 /* 203 Store-conditional Code Address at global address
1950 cs procedure name. */
1951 case ETIR__C_STC_GCA:
1953 /* 204 Store-conditional Address at psect + offset
1957 case ETIR__C_STC_PS:
1958 (*_bfd_error_handler) (_("%s: not supported"),
1959 _bfd_vms_etir_name (cmd));
1963 /* 201 Store-conditional Linkage Pair with Procedure Signature
1969 case ETIR__C_STC_LP_PSB:
1970 _bfd_vms_get_value (abfd, ptr + 4, info, &op1, &h);
1973 if (h->sym->typ == EGSD__C_SYMG)
1975 alpha_vms_add_fixup_lp (info, abfd, h->sym->owner);
1976 op1 = h->sym->symbol_vector;
1981 op1 = alpha_vms_get_sym_value (h->sym->code_section,
1982 h->sym->code_value, h);
1983 op2 = alpha_vms_get_sym_value (h->sym->section,
1989 /* Undefined symbol. */
1993 image_write_q (abfd, op1);
1994 image_write_q (abfd, op2);
1997 /* 205 Store-conditional NOP at address of global
1999 case ETIR__C_STC_NOP_GBL:
2002 /* 207 Store-conditional BSR at global address
2005 case ETIR__C_STC_BSR_GBL:
2008 /* 209 Store-conditional LDA at global address
2011 case ETIR__C_STC_LDA_GBL:
2014 /* 211 Store-conditional BSR or Hint at global address
2017 case ETIR__C_STC_BOH_GBL:
2018 /* Currentl ignored. */
2021 /* 213 Store-conditional NOP,BSR or HINT at global address
2024 case ETIR__C_STC_NBH_GBL:
2026 /* 206 Store-conditional NOP at pect + offset
2029 case ETIR__C_STC_NOP_PS:
2031 /* 208 Store-conditional BSR at pect + offset
2034 case ETIR__C_STC_BSR_PS:
2036 /* 210 Store-conditional LDA at psect + offset
2039 case ETIR__C_STC_LDA_PS:
2041 /* 212 Store-conditional BSR or Hint at pect + offset
2044 case ETIR__C_STC_BOH_PS:
2046 /* 214 Store-conditional NOP, BSR or HINT at psect + offset
2048 case ETIR__C_STC_NBH_PS:
2049 (*_bfd_error_handler) ("%s: not supported",
2050 _bfd_vms_etir_name (cmd));
2054 /* Det relocation base: pop stack, set image location counter
2056 case ETIR__C_CTL_SETRB:
2057 _bfd_vms_pop (abfd, &op1, &rel1);
2058 if (!(rel1 & RELC_SEC_BASE))
2060 image_set_ptr (abfd, op1, rel1 & RELC_MASK, info);
2063 /* Augment relocation base: increment image location counter by offset
2064 arg: lw offset value. */
2065 case ETIR__C_CTL_AUGRB:
2066 op1 = bfd_getl32 (ptr);
2067 image_inc_ptr (abfd, op1);
2070 /* Define location: pop index, save location counter under index
2072 case ETIR__C_CTL_DFLOC:
2073 _bfd_vms_pop (abfd, &op1, &rel1);
2074 if (rel1 != RELC_NONE)
2076 dst_define_location (abfd, op1);
2079 /* Set location: pop index, restore location counter from index
2081 case ETIR__C_CTL_STLOC:
2082 _bfd_vms_pop (abfd, &op1, &rel1);
2083 if (rel1 != RELC_NONE)
2085 dst_restore_location (abfd, op1);
2088 /* Stack defined location: pop index, push location counter from index
2090 case ETIR__C_CTL_STKDL:
2091 _bfd_vms_pop (abfd, &op1, &rel1);
2092 if (rel1 != RELC_NONE)
2094 _bfd_vms_push (abfd, dst_retrieve_location (abfd, op1), RELC_NONE);
2097 case ETIR__C_OPR_NOP: /* No-op. */
2100 case ETIR__C_OPR_ADD: /* Add. */
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_NONE && rel2 != RELC_NONE)
2107 _bfd_vms_push (abfd, op1 + op2, rel1);
2110 case ETIR__C_OPR_SUB: /* Subtract. */
2111 _bfd_vms_pop (abfd, &op1, &rel1);
2112 _bfd_vms_pop (abfd, &op2, &rel2);
2113 if (rel1 == RELC_NONE && rel2 != RELC_NONE)
2115 else if ((rel1 & RELC_SEC_BASE) && (rel2 & RELC_SEC_BASE))
2117 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
2118 op2 = alpha_vms_fix_sec_rel (abfd, info, rel2, op2);
2121 else if (rel1 != RELC_NONE && rel2 != RELC_NONE)
2123 _bfd_vms_push (abfd, op2 - op1, rel1);
2126 case ETIR__C_OPR_MUL: /* Multiply. */
2127 _bfd_vms_pop (abfd, &op1, &rel1);
2128 _bfd_vms_pop (abfd, &op2, &rel2);
2129 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2131 _bfd_vms_push (abfd, op1 * op2, RELC_NONE);
2134 case ETIR__C_OPR_DIV: /* Divide. */
2135 _bfd_vms_pop (abfd, &op1, &rel1);
2136 _bfd_vms_pop (abfd, &op2, &rel2);
2137 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2140 _bfd_vms_push (abfd, 0, RELC_NONE);
2142 _bfd_vms_push (abfd, op2 / op1, RELC_NONE);
2145 case ETIR__C_OPR_AND: /* Logical AND. */
2146 _bfd_vms_pop (abfd, &op1, &rel1);
2147 _bfd_vms_pop (abfd, &op2, &rel2);
2148 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2150 _bfd_vms_push (abfd, op1 & op2, RELC_NONE);
2153 case ETIR__C_OPR_IOR: /* Logical inclusive OR. */
2154 _bfd_vms_pop (abfd, &op1, &rel1);
2155 _bfd_vms_pop (abfd, &op2, &rel2);
2156 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2158 _bfd_vms_push (abfd, op1 | op2, RELC_NONE);
2161 case ETIR__C_OPR_EOR: /* Logical exclusive OR. */
2162 _bfd_vms_pop (abfd, &op1, &rel1);
2163 _bfd_vms_pop (abfd, &op2, &rel2);
2164 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2166 _bfd_vms_push (abfd, op1 ^ op2, RELC_NONE);
2169 case ETIR__C_OPR_NEG: /* Negate. */
2170 _bfd_vms_pop (abfd, &op1, &rel1);
2171 if (rel1 != RELC_NONE)
2173 _bfd_vms_push (abfd, -op1, RELC_NONE);
2176 case ETIR__C_OPR_COM: /* Complement. */
2177 _bfd_vms_pop (abfd, &op1, &rel1);
2178 if (rel1 != RELC_NONE)
2180 _bfd_vms_push (abfd, ~op1, RELC_NONE);
2183 case ETIR__C_OPR_ASH: /* Arithmetic shift. */
2184 _bfd_vms_pop (abfd, &op1, &rel1);
2185 _bfd_vms_pop (abfd, &op2, &rel2);
2186 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2189 (*_bfd_error_handler) (_("invalid use of %s with contexts"),
2190 _bfd_vms_etir_name (cmd));
2193 if ((int)op2 < 0) /* Shift right. */
2195 else /* Shift left. */
2197 _bfd_vms_push (abfd, op1, RELC_NONE); /* FIXME: sym. */
2200 case ETIR__C_OPR_INSV: /* Insert field. */
2201 case ETIR__C_OPR_USH: /* Unsigned shift. */
2202 case ETIR__C_OPR_ROT: /* Rotate. */
2203 case ETIR__C_OPR_REDEF: /* Redefine symbol to current location. */
2204 case ETIR__C_OPR_DFLIT: /* Define a literal. */
2205 (*_bfd_error_handler) (_("%s: not supported"),
2206 _bfd_vms_etir_name (cmd));
2210 case ETIR__C_OPR_SEL: /* Select. */
2211 _bfd_vms_pop (abfd, &op1, &rel1);
2213 _bfd_vms_pop (abfd, &op1, &rel1);
2216 _bfd_vms_pop (abfd, &op1, &rel1);
2217 _bfd_vms_pop (abfd, &op2, &rel2);
2218 _bfd_vms_push (abfd, op1, rel1);
2223 (*_bfd_error_handler) (_("reserved cmd %d"), cmd);
2228 ptr += cmd_length - 4;
2234 /* Process EDBG/ETBT record.
2235 Return TRUE on success, FALSE on error */
2238 vms_slurp_debug (bfd *abfd)
2240 asection *section = PRIV (dst_section);
2242 if (section == NULL)
2244 /* We have no way to find out beforehand how much debug info there
2245 is in an object file, so pick an initial amount and grow it as
2247 flagword flags = SEC_HAS_CONTENTS | SEC_DEBUGGING | SEC_RELOC
2250 section = bfd_make_section (abfd, "$DST$");
2253 if (!bfd_set_section_flags (abfd, section, flags))
2255 PRIV (dst_section) = section;
2258 PRIV (image_section) = section;
2259 PRIV (image_offset) = section->size;
2261 if (!_bfd_vms_slurp_etir (abfd, NULL))
2264 section->size = PRIV (image_offset);
2268 /* Process EDBG record.
2269 Return TRUE on success, FALSE on error. */
2272 _bfd_vms_slurp_edbg (bfd *abfd)
2274 vms_debug2 ((2, "EDBG\n"));
2276 abfd->flags |= HAS_DEBUG | HAS_LINENO;
2278 return vms_slurp_debug (abfd);
2281 /* Process ETBT record.
2282 Return TRUE on success, FALSE on error. */
2285 _bfd_vms_slurp_etbt (bfd *abfd)
2287 vms_debug2 ((2, "ETBT\n"));
2289 abfd->flags |= HAS_LINENO;
2291 return vms_slurp_debug (abfd);
2294 /* Process EEOM record.
2295 Return TRUE on success, FALSE on error. */
2298 _bfd_vms_slurp_eeom (bfd *abfd)
2300 struct vms_eeom *eeom = (struct vms_eeom *) PRIV (recrd.rec);
2302 vms_debug2 ((2, "EEOM\n"));
2304 PRIV (eom_data).eom_l_total_lps = bfd_getl32 (eeom->total_lps);
2305 PRIV (eom_data).eom_w_comcod = bfd_getl16 (eeom->comcod);
2306 if (PRIV (eom_data).eom_w_comcod > 1)
2308 (*_bfd_error_handler) (_("Object module NOT error-free !\n"));
2309 bfd_set_error (bfd_error_bad_value);
2313 PRIV (eom_data).eom_has_transfer = FALSE;
2314 if (PRIV (recrd.rec_size) > 10)
2316 PRIV (eom_data).eom_has_transfer = TRUE;
2317 PRIV (eom_data).eom_b_tfrflg = eeom->tfrflg;
2318 PRIV (eom_data).eom_l_psindx = bfd_getl32 (eeom->psindx);
2319 PRIV (eom_data).eom_l_tfradr = bfd_getl32 (eeom->tfradr);
2321 abfd->start_address = PRIV (eom_data).eom_l_tfradr;
2326 /* Slurp an ordered set of VMS object records. Return FALSE on error. */
2329 _bfd_vms_slurp_object_records (bfd * abfd)
2336 vms_debug2 ((7, "reading at %08lx\n", (unsigned long)bfd_tell (abfd)));
2338 type = _bfd_vms_get_object_record (abfd);
2341 vms_debug2 ((2, "next_record failed\n"));
2348 err = _bfd_vms_slurp_ehdr (abfd);
2351 err = _bfd_vms_slurp_eeom (abfd);
2354 err = _bfd_vms_slurp_egsd (abfd);
2357 err = TRUE; /* _bfd_vms_slurp_etir (abfd); */
2360 err = _bfd_vms_slurp_edbg (abfd);
2363 err = _bfd_vms_slurp_etbt (abfd);
2370 vms_debug2 ((2, "slurp type %d failed\n", type));
2374 while (type != EOBJ__C_EEOM);
2379 /* Initialize private data */
2381 vms_initialize (bfd * abfd)
2385 amt = sizeof (struct vms_private_data_struct);
2386 abfd->tdata.any = bfd_zalloc (abfd, amt);
2387 if (abfd->tdata.any == NULL)
2390 PRIV (recrd.file_format) = FF_UNKNOWN;
2392 amt = sizeof (struct stack_struct) * STACKSIZE;
2393 PRIV (stack) = bfd_alloc (abfd, amt);
2394 if (PRIV (stack) == NULL)
2400 bfd_release (abfd, abfd->tdata.any);
2401 abfd->tdata.any = NULL;
2405 /* Check the format for a file being read.
2406 Return a (bfd_target *) if it's an object file or zero if not. */
2408 static const struct bfd_target *
2409 alpha_vms_object_p (bfd *abfd)
2411 PTR tdata_save = abfd->tdata.any;
2412 unsigned int test_len;
2415 vms_debug2 ((1, "vms_object_p(%p)\n", abfd));
2417 /* Allocate alpha-vms specific data. */
2418 if (!vms_initialize (abfd))
2421 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET))
2422 goto err_wrong_format;
2424 /* The first challenge with VMS is to discover the kind of the file.
2426 Image files (executable or shared images) are stored as a raw
2427 stream of bytes (like on UNIX), but there is no magic number.
2429 Object files are written with RMS (record management service), ie
2430 each records are preceeded by its length (on a word - 2 bytes), and
2431 padded for word-alignment. That would be simple but when files
2432 are transfered to a UNIX filesystem (using ftp), records are lost.
2433 Only the raw content of the records are transfered. Fortunately,
2434 the Alpha Object file format also store the length of the record
2435 in the records. Is that clear ? */
2437 /* Minimum is 6 bytes for objects (2 bytes size, 2 bytes record id,
2438 2 bytes size repeated) and 12 bytes for images (4 bytes major id,
2439 4 bytes minor id, 4 bytes length). */
2442 /* Size the main buffer. */
2443 buf = (unsigned char *) bfd_malloc (test_len);
2446 PRIV (recrd.buf) = buf;
2447 PRIV (recrd.buf_size) = test_len;
2449 /* Initialize the record pointer. */
2450 PRIV (recrd.rec) = buf;
2452 if (bfd_bread (buf, test_len, abfd) != test_len)
2454 bfd_set_error (bfd_error_file_truncated);
2458 /* Is it an image? */
2459 if ((bfd_getl32 (buf) == EIHD__K_MAJORID)
2460 && (bfd_getl32 (buf + 4) == EIHD__K_MINORID))
2462 unsigned int to_read;
2463 unsigned int read_so_far;
2464 unsigned int remaining;
2465 unsigned int eisd_offset, eihs_offset;
2467 /* Extract the header size. */
2468 PRIV (recrd.rec_size) = bfd_getl32 (buf + EIHD__L_SIZE);
2470 /* The header size is 0 for DSF files. */
2471 if (PRIV (recrd.rec_size) == 0)
2472 PRIV (recrd.rec_size) = sizeof (struct vms_eihd);
2474 if (PRIV (recrd.rec_size) > PRIV (recrd.buf_size))
2476 buf = bfd_realloc_or_free (buf, PRIV (recrd.rec_size));
2480 PRIV (recrd.buf) = NULL;
2481 bfd_set_error (bfd_error_no_memory);
2484 PRIV (recrd.buf) = buf;
2485 PRIV (recrd.buf_size) = PRIV (recrd.rec_size);
2488 /* Read the remaining record. */
2489 remaining = PRIV (recrd.rec_size) - test_len;
2490 to_read = MIN (VMS_BLOCK_SIZE - test_len, remaining);
2491 read_so_far = test_len;
2493 while (remaining > 0)
2495 if (bfd_bread (buf + read_so_far, to_read, abfd) != to_read)
2497 bfd_set_error (bfd_error_file_truncated);
2498 goto err_wrong_format;
2501 read_so_far += to_read;
2502 remaining -= to_read;
2504 to_read = MIN (VMS_BLOCK_SIZE, remaining);
2507 /* Reset the record pointer. */
2508 PRIV (recrd.rec) = buf;
2510 vms_debug2 ((2, "file type is image\n"));
2512 if (_bfd_vms_slurp_eihd (abfd, &eisd_offset, &eihs_offset) != TRUE)
2513 goto err_wrong_format;
2515 if (_bfd_vms_slurp_eisd (abfd, eisd_offset) != TRUE)
2516 goto err_wrong_format;
2518 /* EIHS is optional. */
2519 if (eihs_offset != 0 && _bfd_vms_slurp_eihs (abfd, eihs_offset) != TRUE)
2520 goto err_wrong_format;
2526 /* Assume it's a module and adjust record pointer if necessary. */
2527 maybe_adjust_record_pointer_for_object (abfd);
2529 /* But is it really a module? */
2530 if (bfd_getl16 (PRIV (recrd.rec)) <= EOBJ__C_MAXRECTYP
2531 && bfd_getl16 (PRIV (recrd.rec) + 2) <= EOBJ__C_MAXRECSIZ)
2533 if (vms_get_remaining_object_record (abfd, test_len) <= 0)
2534 goto err_wrong_format;
2536 vms_debug2 ((2, "file type is module\n"));
2538 type = bfd_getl16 (PRIV (recrd.rec));
2539 if (type != EOBJ__C_EMH || _bfd_vms_slurp_ehdr (abfd) != TRUE)
2540 goto err_wrong_format;
2542 if (_bfd_vms_slurp_object_records (abfd) != TRUE)
2543 goto err_wrong_format;
2546 goto err_wrong_format;
2549 /* Set arch_info to alpha. */
2551 if (! bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0))
2552 goto err_wrong_format;
2557 bfd_set_error (bfd_error_wrong_format);
2560 if (PRIV (recrd.buf))
2561 free (PRIV (recrd.buf));
2562 if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
2563 bfd_release (abfd, abfd->tdata.any);
2564 abfd->tdata.any = tdata_save;
2570 /* Write an EMH/MHD record. */
2573 _bfd_vms_write_emh (bfd *abfd)
2575 struct vms_rec_wr *recwr = &PRIV (recwr);
2577 _bfd_vms_output_alignment (recwr, 2);
2580 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
2581 _bfd_vms_output_short (recwr, EMH__C_MHD);
2582 _bfd_vms_output_short (recwr, EOBJ__C_STRLVL);
2583 _bfd_vms_output_long (recwr, 0);
2584 _bfd_vms_output_long (recwr, 0);
2585 _bfd_vms_output_long (recwr, MAX_OUTREC_SIZE);
2587 /* Create module name from filename. */
2588 if (bfd_get_filename (abfd) != 0)
2590 char *module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
2591 _bfd_vms_output_counted (recwr, module);
2595 _bfd_vms_output_counted (recwr, "NONAME");
2597 _bfd_vms_output_counted (recwr, BFD_VERSION_STRING);
2598 _bfd_vms_output_dump (recwr, get_vms_time_string (), EMH_DATE_LENGTH);
2599 _bfd_vms_output_fill (recwr, 0, EMH_DATE_LENGTH);
2600 _bfd_vms_output_end (abfd, recwr);
2603 /* Write an EMH/LMN record. */
2606 _bfd_vms_write_lmn (bfd *abfd, const char *name)
2609 struct vms_rec_wr *recwr = &PRIV (recwr);
2610 unsigned int ver = BFD_VERSION / 10000;
2613 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
2614 _bfd_vms_output_short (recwr, EMH__C_LNM);
2615 snprintf (version, sizeof (version), "%s %d.%d.%d", name,
2616 ver / 10000, (ver / 100) % 100, ver % 100);
2617 _bfd_vms_output_dump (recwr, (unsigned char *)version, strlen (version));
2618 _bfd_vms_output_end (abfd, recwr);
2622 /* Write eom record for bfd abfd. Return FALSE on error. */
2625 _bfd_vms_write_eeom (bfd *abfd)
2627 struct vms_rec_wr *recwr = &PRIV (recwr);
2629 vms_debug2 ((2, "vms_write_eeom\n"));
2631 _bfd_vms_output_alignment (recwr, 2);
2633 _bfd_vms_output_begin (recwr, EOBJ__C_EEOM);
2634 _bfd_vms_output_long (recwr, (unsigned long) (PRIV (vms_linkage_index) >> 1));
2635 _bfd_vms_output_byte (recwr, 0); /* Completion code. */
2636 _bfd_vms_output_byte (recwr, 0); /* Fill byte. */
2638 if ((abfd->flags & EXEC_P) == 0
2639 && bfd_get_start_address (abfd) != (bfd_vma)-1)
2643 section = bfd_get_section_by_name (abfd, ".link");
2646 bfd_set_error (bfd_error_nonrepresentable_section);
2649 _bfd_vms_output_short (recwr, 0);
2650 _bfd_vms_output_long (recwr, (unsigned long) (section->index));
2651 _bfd_vms_output_long (recwr,
2652 (unsigned long) bfd_get_start_address (abfd));
2653 _bfd_vms_output_long (recwr, 0);
2656 _bfd_vms_output_end (abfd, recwr);
2660 /* This hash routine borrowed from GNU-EMACS, and strengthened
2664 hash_string (const char *ptr)
2666 const unsigned char *p = (unsigned char *) ptr;
2667 const unsigned char *end = p + strlen (ptr);
2674 hash = ((hash << 3) + (hash << 15) + (hash >> 28) + c);
2679 /* Generate a length-hashed VMS symbol name (limited to maxlen chars). */
2682 _bfd_vms_length_hash_symbol (bfd *abfd, const char *in, int maxlen)
2684 unsigned long result;
2687 const char *old_name;
2689 static char outbuf[EOBJ__C_SYMSIZ + 1];
2693 vms_debug (4, "_bfd_vms_length_hash_symbol \"%s\"\n", in);
2696 if (maxlen > EOBJ__C_SYMSIZ)
2697 maxlen = EOBJ__C_SYMSIZ;
2699 /* Save this for later. */
2702 /* We may need to truncate the symbol, save the hash for later. */
2703 in_len = strlen (in);
2705 result = (in_len > maxlen) ? hash_string (in) : 0;
2709 /* Do the length checking. */
2710 if (in_len <= maxlen)
2714 if (PRIV (flag_hash_long_names))
2720 strncpy (out, in, (size_t) i);
2724 if ((in_len > maxlen)
2725 && PRIV (flag_hash_long_names))
2726 sprintf (out, "_%08lx", result);
2731 vms_debug (4, "--> [%d]\"%s\"\n", (int)strlen (outbuf), outbuf);
2735 && PRIV (flag_hash_long_names)
2736 && PRIV (flag_show_after_trunc))
2737 printf (_("Symbol %s replaced by %s\n"), old_name, new_name);
2743 vector_grow1 (struct vector_type *vec, size_t elsz)
2745 if (vec->nbr_el + 1 < vec->max_el)
2748 if (vec->max_el == 0)
2751 vec->els = bfd_malloc2 (vec->max_el, elsz);
2756 vec->els = bfd_realloc2 (vec->els, vec->max_el, elsz);
2760 /* Bump ABFD file position to next block. */
2763 alpha_vms_file_position_block (bfd *abfd)
2766 PRIV (file_pos) += VMS_BLOCK_SIZE - 1;
2767 PRIV (file_pos) -= (PRIV (file_pos) % VMS_BLOCK_SIZE);
2770 /* Convert from internal structure SRC to external structure DST. */
2773 alpha_vms_swap_eisd_out (struct vms_internal_eisd_map *src,
2774 struct vms_eisd *dst)
2776 bfd_putl32 (src->u.eisd.majorid, dst->majorid);
2777 bfd_putl32 (src->u.eisd.minorid, dst->minorid);
2778 bfd_putl32 (src->u.eisd.eisdsize, dst->eisdsize);
2779 if (src->u.eisd.eisdsize <= EISD__K_LENEND)
2781 bfd_putl32 (src->u.eisd.secsize, dst->secsize);
2782 bfd_putl64 (src->u.eisd.virt_addr, dst->virt_addr);
2783 bfd_putl32 (src->u.eisd.flags, dst->flags);
2784 bfd_putl32 (src->u.eisd.vbn, dst->vbn);
2785 dst->pfc = src->u.eisd.pfc;
2786 dst->matchctl = src->u.eisd.matchctl;
2787 dst->type = src->u.eisd.type;
2789 if (src->u.eisd.flags & EISD__M_GBL)
2791 bfd_putl32 (src->u.gbl_eisd.ident, dst->ident);
2792 memcpy (dst->gblnam, src->u.gbl_eisd.gblnam,
2793 src->u.gbl_eisd.gblnam[0] + 1);
2797 /* Append EISD to the list of extra eisd for ABFD. */
2800 alpha_vms_append_extra_eisd (bfd *abfd, struct vms_internal_eisd_map *eisd)
2803 if (PRIV (gbl_eisd_head) == NULL)
2804 PRIV (gbl_eisd_head) = eisd;
2806 PRIV (gbl_eisd_tail)->next = eisd;
2807 PRIV (gbl_eisd_tail) = eisd;
2810 /* Create an EISD for shared image SHRIMG.
2811 Return FALSE in case of error. */
2814 alpha_vms_create_eisd_for_shared (bfd *abfd, bfd *shrimg)
2816 struct vms_internal_eisd_map *eisd;
2819 namlen = strlen (PRIV2 (shrimg, hdr_data.hdr_t_name));
2820 if (namlen + 5 > EISD__K_GBLNAMLEN)
2826 eisd = bfd_alloc (abfd, sizeof (*eisd));
2830 /* Fill the fields. */
2831 eisd->u.gbl_eisd.common.majorid = EISD__K_MAJORID;
2832 eisd->u.gbl_eisd.common.minorid = EISD__K_MINORID;
2833 eisd->u.gbl_eisd.common.eisdsize = (EISD__K_LEN + 4 + namlen + 5 + 3) & ~3;
2834 eisd->u.gbl_eisd.common.secsize = VMS_BLOCK_SIZE; /* Must not be 0. */
2835 eisd->u.gbl_eisd.common.virt_addr = 0;
2836 eisd->u.gbl_eisd.common.flags = EISD__M_GBL;
2837 eisd->u.gbl_eisd.common.vbn = 0;
2838 eisd->u.gbl_eisd.common.pfc = 0;
2839 eisd->u.gbl_eisd.common.matchctl = PRIV2 (shrimg, matchctl);
2840 eisd->u.gbl_eisd.common.type = EISD__K_SHRPIC;
2842 eisd->u.gbl_eisd.ident = PRIV2 (shrimg, ident);
2843 eisd->u.gbl_eisd.gblnam[0] = namlen + 4;
2844 memcpy (eisd->u.gbl_eisd.gblnam + 1, PRIV2 (shrimg, hdr_data.hdr_t_name),
2846 memcpy (eisd->u.gbl_eisd.gblnam + 1 + namlen, "_001", 4);
2848 /* Append it to the list. */
2849 alpha_vms_append_extra_eisd (abfd, eisd);
2854 /* Create an EISD for section SEC.
2855 Return FALSE in case of failure. */
2858 alpha_vms_create_eisd_for_section (bfd *abfd, asection *sec)
2860 struct vms_internal_eisd_map *eisd;
2862 /* Only for allocating section. */
2863 if (!(sec->flags & SEC_ALLOC))
2866 BFD_ASSERT (vms_section_data (sec)->eisd == NULL);
2867 eisd = bfd_alloc (abfd, sizeof (*eisd));
2870 vms_section_data (sec)->eisd = eisd;
2872 /* Fill the fields. */
2873 eisd->u.eisd.majorid = EISD__K_MAJORID;
2874 eisd->u.eisd.minorid = EISD__K_MINORID;
2875 eisd->u.eisd.eisdsize = EISD__K_LEN;
2876 eisd->u.eisd.secsize =
2877 (sec->size + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
2878 eisd->u.eisd.virt_addr = sec->vma;
2879 eisd->u.eisd.flags = 0;
2880 eisd->u.eisd.vbn = 0; /* To be later defined. */
2881 eisd->u.eisd.pfc = 0; /* Default. */
2882 eisd->u.eisd.matchctl = EISD__K_MATALL;
2883 eisd->u.eisd.type = EISD__K_NORMAL;
2885 if (sec->flags & SEC_CODE)
2886 eisd->u.eisd.flags |= EISD__M_EXE;
2887 if (!(sec->flags & SEC_READONLY))
2888 eisd->u.eisd.flags |= EISD__M_WRT | EISD__M_CRF;
2890 if (!(sec->flags & SEC_LOAD))
2892 eisd->u.eisd.flags |= EISD__M_DZRO;
2893 eisd->u.eisd.flags &= ~EISD__M_CRF;
2895 if (sec->flags & SEC_LINKER_CREATED)
2897 if (strcmp (sec->name, "$FIXUP$") == 0)
2898 eisd->u.eisd.flags |= EISD__M_FIXUPVEC;
2901 /* Append it to the list. */
2903 if (PRIV (eisd_head) == NULL)
2904 PRIV (eisd_head) = eisd;
2906 PRIV (eisd_tail)->next = eisd;
2907 PRIV (eisd_tail) = eisd;
2912 /* Layout executable ABFD and write it to the disk.
2913 Return FALSE in case of failure. */
2916 alpha_vms_write_exec (bfd *abfd)
2918 struct vms_eihd eihd;
2919 struct vms_eiha *eiha;
2920 struct vms_eihi *eihi;
2921 struct vms_eihs *eihs = NULL;
2923 struct vms_internal_eisd_map *first_eisd;
2924 struct vms_internal_eisd_map *eisd;
2928 /* Build the EIHD. */
2929 PRIV (file_pos) = EIHD__C_LENGTH;
2931 memset (&eihd, 0, sizeof (eihd));
2932 memset (eihd.fill_2, 0xff, sizeof (eihd.fill_2));
2934 bfd_putl32 (EIHD__K_MAJORID, eihd.majorid);
2935 bfd_putl32 (EIHD__K_MINORID, eihd.minorid);
2937 bfd_putl32 (sizeof (eihd), eihd.size);
2938 bfd_putl32 (0, eihd.isdoff);
2939 bfd_putl32 (0, eihd.activoff);
2940 bfd_putl32 (0, eihd.symdbgoff);
2941 bfd_putl32 (0, eihd.imgidoff);
2942 bfd_putl32 (0, eihd.patchoff);
2943 bfd_putl64 (0, eihd.iafva);
2944 bfd_putl32 (0, eihd.version_array_off);
2946 bfd_putl32 (EIHD__K_EXE, eihd.imgtype);
2947 bfd_putl32 (0, eihd.subtype);
2949 bfd_putl32 (0, eihd.imgiocnt);
2950 bfd_putl32 (-1, eihd.privreqs);
2951 bfd_putl32 (-1, eihd.privreqs + 4);
2953 bfd_putl32 ((sizeof (eihd) + VMS_BLOCK_SIZE - 1) / VMS_BLOCK_SIZE,
2955 bfd_putl32 (0, eihd.lnkflags);
2956 bfd_putl32 (0, eihd.ident);
2957 bfd_putl32 (0, eihd.sysver);
2960 bfd_putl32 (0, eihd.symvect_size);
2961 bfd_putl32 (16, eihd.virt_mem_block_size);
2962 bfd_putl32 (0, eihd.ext_fixup_off);
2963 bfd_putl32 (0, eihd.noopt_psect_off);
2964 bfd_putl32 (-1, eihd.alias);
2967 eiha = (struct vms_eiha *)((char *) &eihd + PRIV (file_pos));
2968 bfd_putl32 (PRIV (file_pos), eihd.activoff);
2969 PRIV (file_pos) += sizeof (struct vms_eiha);
2971 bfd_putl32 (sizeof (struct vms_eiha), eiha->size);
2972 bfd_putl32 (0, eiha->spare);
2973 bfd_putl32 (0x00000340, eiha->tfradr1); /* SYS$IMGACT */
2974 bfd_putl32 (0xffffffff, eiha->tfradr1_h);
2975 bfd_putl64 (bfd_get_start_address (abfd), eiha->tfradr2);
2976 bfd_putl64 (0, eiha->tfradr3);
2977 bfd_putl64 (0, eiha->tfradr4);
2978 bfd_putl64 (0, eiha->inishr);
2981 eihi = (struct vms_eihi *)((char *) &eihd + PRIV (file_pos));
2982 bfd_putl32 (PRIV (file_pos), eihd.imgidoff);
2983 PRIV (file_pos) += sizeof (struct vms_eihi);
2985 bfd_putl32 (EIHI__K_MAJORID, eihi->majorid);
2986 bfd_putl32 (EIHI__K_MINORID, eihi->minorid);
2991 module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
2992 len = strlen (module);
2993 if (len > sizeof (eihi->imgnam) - 1)
2994 len = sizeof (eihi->imgnam) - 1;
2995 eihi->imgnam[0] = len;
2996 memcpy (eihi->imgnam + 1, module, len);
2999 bfd_putl32 (0, eihi->linktime + 0);
3000 bfd_putl32 (0, eihi->linktime + 4);
3002 eihi->linkid[0] = 0;
3003 eihi->imgbid[0] = 0;
3006 dst = PRIV (dst_section);
3007 dmt = bfd_get_section_by_name (abfd, "$DMT$");
3008 if (dst != NULL && dst->size != 0)
3010 eihs = (struct vms_eihs *)((char *) &eihd + PRIV (file_pos));
3011 bfd_putl32 (PRIV (file_pos), eihd.symdbgoff);
3012 PRIV (file_pos) += sizeof (struct vms_eihs);
3014 bfd_putl32 (EIHS__K_MAJORID, eihs->majorid);
3015 bfd_putl32 (EIHS__K_MINORID, eihs->minorid);
3016 bfd_putl32 (0, eihs->dstvbn);
3017 bfd_putl32 (0, eihs->dstsize);
3018 bfd_putl32 (0, eihs->gstvbn);
3019 bfd_putl32 (0, eihs->gstsize);
3020 bfd_putl32 (0, eihs->dmtvbn);
3021 bfd_putl32 (0, eihs->dmtsize);
3024 /* One EISD per section. */
3025 for (sec = abfd->sections; sec; sec = sec->next)
3027 if (!alpha_vms_create_eisd_for_section (abfd, sec))
3031 /* Merge section EIDS which extra ones. */
3032 if (PRIV (eisd_tail))
3033 PRIV (eisd_tail)->next = PRIV (gbl_eisd_head);
3035 PRIV (eisd_head) = PRIV (gbl_eisd_head);
3036 if (PRIV (gbl_eisd_tail))
3037 PRIV (eisd_tail) = PRIV (gbl_eisd_tail);
3039 first_eisd = PRIV (eisd_head);
3041 /* Add end of eisd. */
3044 eisd = bfd_zalloc (abfd, sizeof (*eisd));
3047 eisd->u.eisd.majorid = 0;
3048 eisd->u.eisd.minorid = 0;
3049 eisd->u.eisd.eisdsize = 0;
3050 alpha_vms_append_extra_eisd (abfd, eisd);
3053 /* Place EISD in the file. */
3054 for (eisd = first_eisd; eisd; eisd = eisd->next)
3056 file_ptr room = VMS_BLOCK_SIZE - (PRIV (file_pos) % VMS_BLOCK_SIZE);
3058 /* First block is a little bit special: there is a word at the end. */
3059 if (PRIV (file_pos) < VMS_BLOCK_SIZE && room > 2)
3061 if (room < eisd->u.eisd.eisdsize + EISD__K_LENEND)
3062 alpha_vms_file_position_block (abfd);
3064 eisd->file_pos = PRIV (file_pos);
3065 PRIV (file_pos) += eisd->u.eisd.eisdsize;
3067 if (eisd->u.eisd.flags & EISD__M_FIXUPVEC)
3068 bfd_putl64 (eisd->u.eisd.virt_addr, eihd.iafva);
3071 if (first_eisd != NULL)
3073 bfd_putl32 (first_eisd->file_pos, eihd.isdoff);
3074 /* Real size of end of eisd marker. */
3075 PRIV (file_pos) += EISD__K_LENEND;
3078 bfd_putl32 (PRIV (file_pos), eihd.size);
3079 bfd_putl32 ((PRIV (file_pos) + VMS_BLOCK_SIZE - 1) / VMS_BLOCK_SIZE,
3082 /* Place sections. */
3083 for (sec = abfd->sections; sec; sec = sec->next)
3085 if (!(sec->flags & SEC_HAS_CONTENTS))
3088 eisd = vms_section_data (sec)->eisd;
3090 /* Align on a block. */
3091 alpha_vms_file_position_block (abfd);
3092 sec->filepos = PRIV (file_pos);
3095 eisd->u.eisd.vbn = (sec->filepos / VMS_BLOCK_SIZE) + 1;
3097 PRIV (file_pos) += sec->size;
3101 if (eihs != NULL && dst != NULL)
3103 bfd_putl32 ((dst->filepos / VMS_BLOCK_SIZE) + 1, eihs->dstvbn);
3104 bfd_putl32 (dst->size, eihs->dstsize);
3108 bfd_putl32 ((dmt->filepos / VMS_BLOCK_SIZE) + 1, eihs->dmtvbn);
3109 bfd_putl32 (dmt->size, eihs->dmtsize);
3113 /* Write EISD in hdr. */
3114 for (eisd = first_eisd; eisd && eisd->file_pos < VMS_BLOCK_SIZE;
3116 alpha_vms_swap_eisd_out
3117 (eisd, (struct vms_eisd *)((char *)&eihd + eisd->file_pos));
3119 /* Write first block. */
3120 if (bfd_bwrite (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
3123 /* Write remaining eisd. */
3126 unsigned char blk[VMS_BLOCK_SIZE];
3127 struct vms_internal_eisd_map *next_eisd;
3129 memset (blk, 0xff, sizeof (blk));
3130 while (eisd != NULL)
3132 alpha_vms_swap_eisd_out
3134 (struct vms_eisd *)(blk + (eisd->file_pos % VMS_BLOCK_SIZE)));
3136 next_eisd = eisd->next;
3137 if (next_eisd == NULL
3138 || (next_eisd->file_pos / VMS_BLOCK_SIZE
3139 != eisd->file_pos / VMS_BLOCK_SIZE))
3141 if (bfd_bwrite (blk, sizeof (blk), abfd) != sizeof (blk))
3144 memset (blk, 0xff, sizeof (blk));
3150 /* Write sections. */
3151 for (sec = abfd->sections; sec; sec = sec->next)
3153 unsigned char blk[VMS_BLOCK_SIZE];
3156 if (sec->size == 0 || !(sec->flags & SEC_HAS_CONTENTS))
3158 if (bfd_bwrite (sec->contents, sec->size, abfd) != sec->size)
3162 len = VMS_BLOCK_SIZE - sec->size % VMS_BLOCK_SIZE;
3163 if (len != VMS_BLOCK_SIZE)
3165 memset (blk, 0, len);
3166 if (bfd_bwrite (blk, len, abfd) != len)
3176 /* Write section and symbol directory of bfd abfd. Return FALSE on error. */
3179 _bfd_vms_write_egsd (bfd *abfd)
3183 unsigned int symnum;
3184 int last_index = -1;
3185 char dummy_name[10];
3187 flagword new_flags, old_flags;
3188 int abs_section_index = 0;
3189 struct vms_rec_wr *recwr = &PRIV (recwr);
3191 vms_debug2 ((2, "vms_write_gsd\n"));
3193 /* Output sections. */
3194 section = abfd->sections;
3195 vms_debug2 ((3, "%d sections found\n", abfd->section_count));
3197 /* Egsd is quadword aligned. */
3198 _bfd_vms_output_alignment (recwr, 8);
3200 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3201 _bfd_vms_output_long (recwr, 0);
3203 while (section != 0)
3205 vms_debug2 ((3, "Section #%d %s, %d bytes\n",
3206 section->index, section->name, (int)section->size));
3208 /* Don't write out the VMS debug info section since it is in the
3209 ETBT and EDBG sections in etir. */
3210 if (!strcmp (section->name, ".vmsdebug"))
3213 /* 13 bytes egsd, max 31 chars name -> should be 44 bytes. */
3214 if (_bfd_vms_output_check (recwr, 64) < 0)
3216 _bfd_vms_output_end (abfd, recwr);
3217 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3218 _bfd_vms_output_long (recwr, 0);
3221 /* Create dummy sections to keep consecutive indices. */
3222 while (section->index - last_index > 1)
3224 vms_debug2 ((3, "index %d, last %d\n", section->index, last_index));
3225 _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3226 _bfd_vms_output_short (recwr, 0);
3227 _bfd_vms_output_short (recwr, 0);
3228 _bfd_vms_output_long (recwr, 0);
3229 sprintf (dummy_name, ".DUMMY%02d", last_index);
3230 _bfd_vms_output_counted (recwr, dummy_name);
3231 _bfd_vms_output_end_subrec (recwr);
3235 /* Don't know if this is necessary for the linker but for now it keeps
3236 vms_slurp_gsd happy. */
3237 sname = (char *)section->name;
3240 /* Remove leading dot. */
3242 if ((*sname == 't') && (strcmp (sname, "text") == 0))
3243 sname = EVAX_CODE_NAME;
3244 else if ((*sname == 'd') && (strcmp (sname, "data") == 0))
3245 sname = EVAX_DATA_NAME;
3246 else if ((*sname == 'b') && (strcmp (sname, "bss") == 0))
3247 sname = EVAX_BSS_NAME;
3248 else if ((*sname == 'l') && (strcmp (sname, "link") == 0))
3249 sname = EVAX_LINK_NAME;
3250 else if ((*sname == 'r') && (strcmp (sname, "rdata") == 0))
3251 sname = EVAX_READONLY_NAME;
3252 else if ((*sname == 'l') && (strcmp (sname, "literal") == 0))
3253 sname = EVAX_LITERAL_NAME;
3254 else if ((*sname == 'l') && (strcmp (sname, "literals") == 0))
3256 sname = EVAX_LITERALS_NAME;
3257 abs_section_index = section->index;
3259 else if ((*sname == 'c') && (strcmp (sname, "comm") == 0))
3260 sname = EVAX_COMMON_NAME;
3261 else if ((*sname == 'l') && (strcmp (sname, "lcomm") == 0))
3262 sname = EVAX_LOCAL_NAME;
3265 sname = _bfd_vms_length_hash_symbol (abfd, sname, EOBJ__C_SECSIZ);
3267 _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3268 _bfd_vms_output_short (recwr, section->alignment_power & 0xff);
3270 if (bfd_is_com_section (section))
3271 new_flags = (EGPS__V_OVR | EGPS__V_REL | EGPS__V_GBL | EGPS__V_RD
3272 | EGPS__V_WRT | EGPS__V_NOMOD | EGPS__V_COM);
3274 new_flags = vms_esecflag_by_name (evax_section_flags, sname,
3277 /* Modify them as directed. */
3278 if (section->flags & SEC_READONLY)
3279 new_flags &= ~EGPS__V_WRT;
3281 new_flags &= ~vms_section_data (section)->no_flags;
3282 new_flags |= vms_section_data (section)->flags;
3284 vms_debug2 ((3, "sec flags %x\n", section->flags));
3285 vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
3286 new_flags, (unsigned long)section->size));
3288 _bfd_vms_output_short (recwr, new_flags);
3289 _bfd_vms_output_long (recwr, (unsigned long) section->size);
3290 _bfd_vms_output_counted (recwr, sname);
3291 _bfd_vms_output_end_subrec (recwr);
3293 last_index = section->index;
3295 section = section->next;
3298 /* Output symbols. */
3299 vms_debug2 ((3, "%d symbols found\n", abfd->symcount));
3301 bfd_set_start_address (abfd, (bfd_vma) -1);
3303 for (symnum = 0; symnum < abfd->symcount; symnum++)
3307 symbol = abfd->outsymbols[symnum];
3308 if (*(symbol->name) == '_')
3310 if (strcmp (symbol->name, "__main") == 0)
3311 bfd_set_start_address (abfd, (bfd_vma)symbol->value);
3313 old_flags = symbol->flags;
3315 if (old_flags & BSF_FILE)
3318 if ((old_flags & BSF_GLOBAL) == 0 /* Not xdef... */
3319 && !bfd_is_und_section (symbol->section) /* and not xref... */
3320 && !((old_flags & BSF_SECTION_SYM) != 0 /* and not LIB$INITIALIZE. */
3321 && strcmp (symbol->section->name, "LIB$INITIALIZE") == 0))
3324 /* 13 bytes egsd, max 64 chars name -> should be 77 bytes. */
3325 if (_bfd_vms_output_check (recwr, 80) < 0)
3327 _bfd_vms_output_end (abfd, recwr);
3328 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3329 _bfd_vms_output_long (recwr, 0);
3332 _bfd_vms_output_begin_subrec (recwr, EGSD__C_SYM);
3334 /* Data type, alignment. */
3335 _bfd_vms_output_short (recwr, 0);
3339 if (old_flags & BSF_WEAK)
3340 new_flags |= EGSY__V_WEAK;
3341 if (bfd_is_com_section (symbol->section)) /* .comm */
3342 new_flags |= (EGSY__V_WEAK | EGSY__V_COMM);
3344 if (old_flags & BSF_FUNCTION)
3346 new_flags |= EGSY__V_NORM;
3347 new_flags |= EGSY__V_REL;
3349 if (old_flags & BSF_GLOBAL)
3351 new_flags |= EGSY__V_DEF;
3352 if (!bfd_is_abs_section (symbol->section))
3353 new_flags |= EGSY__V_REL;
3355 _bfd_vms_output_short (recwr, new_flags);
3357 if (old_flags & BSF_GLOBAL)
3359 /* Symbol definition. */
3360 bfd_vma code_address = 0;
3361 unsigned long ca_psindx = 0;
3362 unsigned long psindx;
3364 if ((old_flags & BSF_FUNCTION) && symbol->udata.p != NULL)
3368 sym = ((struct evax_private_udata_struct *)symbol->udata.p)->enbsym;
3369 code_address = sym->value;
3370 ca_psindx = sym->section->index;
3372 if (bfd_is_abs_section (symbol->section))
3373 psindx = abs_section_index;
3375 psindx = symbol->section->index;
3377 _bfd_vms_output_quad (recwr, symbol->value);
3378 _bfd_vms_output_quad (recwr, code_address);
3379 _bfd_vms_output_long (recwr, ca_psindx);
3380 _bfd_vms_output_long (recwr, psindx);
3382 hash = _bfd_vms_length_hash_symbol (abfd, symbol->name, EOBJ__C_SYMSIZ);
3383 _bfd_vms_output_counted (recwr, hash);
3385 _bfd_vms_output_end_subrec (recwr);
3388 _bfd_vms_output_alignment (recwr, 8);
3389 _bfd_vms_output_end (abfd, recwr);
3394 /* Write object header for bfd abfd. Return FALSE on error. */
3397 _bfd_vms_write_ehdr (bfd *abfd)
3400 unsigned int symnum;
3403 struct vms_rec_wr *recwr = &PRIV (recwr);
3405 vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd));
3407 _bfd_vms_output_alignment (recwr, 2);
3409 _bfd_vms_write_emh (abfd);
3410 _bfd_vms_write_lmn (abfd, "GNU AS");
3413 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3414 _bfd_vms_output_short (recwr, EMH__C_SRC);
3416 for (symnum = 0; symnum < abfd->symcount; symnum++)
3418 symbol = abfd->outsymbols[symnum];
3420 if (symbol->flags & BSF_FILE)
3422 if (CONST_STRNEQ ((char *)symbol->name, "<CASE:"))
3424 PRIV (flag_hash_long_names) = symbol->name[6] - '0';
3425 PRIV (flag_show_after_trunc) = symbol->name[7] - '0';
3433 _bfd_vms_output_dump (recwr, (unsigned char *) symbol->name,
3434 (int) strlen (symbol->name));
3441 if (symnum == abfd->symcount)
3442 _bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("noname"));
3444 _bfd_vms_output_end (abfd, recwr);
3447 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3448 _bfd_vms_output_short (recwr, EMH__C_TTL);
3449 _bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("TTL"));
3450 _bfd_vms_output_end (abfd, recwr);
3453 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3454 _bfd_vms_output_short (recwr, EMH__C_CPR);
3455 _bfd_vms_output_dump (recwr,
3456 (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
3458 _bfd_vms_output_end (abfd, recwr);
3463 /* Part 4.6, relocations. */
3466 /* WRITE ETIR SECTION
3468 This is still under construction and therefore not documented. */
3470 /* Close the etir/etbt record. */
3473 end_etir_record (bfd * abfd)
3475 struct vms_rec_wr *recwr = &PRIV (recwr);
3477 _bfd_vms_output_end (abfd, recwr);
3481 start_etir_or_etbt_record (bfd *abfd, asection *section, bfd_vma offset)
3483 struct vms_rec_wr *recwr = &PRIV (recwr);
3485 if (section->name[0] == '.' && section->name[1] == 'v'
3486 && !strcmp (section->name, ".vmsdebug"))
3488 _bfd_vms_output_begin (recwr, EOBJ__C_ETBT);
3492 /* Push start offset. */
3493 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3494 _bfd_vms_output_long (recwr, (unsigned long) 0);
3495 _bfd_vms_output_end_subrec (recwr);
3498 _bfd_vms_output_begin_subrec (recwr, ETIR__C_CTL_DFLOC);
3499 _bfd_vms_output_end_subrec (recwr);
3504 _bfd_vms_output_begin (recwr, EOBJ__C_ETIR);
3508 /* Push start offset. */
3509 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3510 _bfd_vms_output_long (recwr, (unsigned long) section->index);
3511 _bfd_vms_output_quad (recwr, offset);
3512 _bfd_vms_output_end_subrec (recwr);
3514 /* Start = pop (). */
3515 _bfd_vms_output_begin_subrec (recwr, ETIR__C_CTL_SETRB);
3516 _bfd_vms_output_end_subrec (recwr);
3521 /* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
3522 address VADDR in section specified by SEC_INDEX and NAME. */
3525 sto_imm (bfd *abfd, asection *section,
3526 bfd_size_type ssize, unsigned char *cptr, bfd_vma vaddr)
3529 struct vms_rec_wr *recwr = &PRIV (recwr);
3532 _bfd_vms_debug (8, "sto_imm %d bytes\n", (int) ssize);
3533 _bfd_hexdump (9, cptr, (int) ssize, (int) vaddr);
3538 /* Try all the rest. */
3541 if (_bfd_vms_output_check (recwr, size) < 0)
3543 /* Doesn't fit, split ! */
3544 end_etir_record (abfd);
3546 start_etir_or_etbt_record (abfd, section, vaddr);
3548 size = _bfd_vms_output_check (recwr, 0); /* get max size */
3549 if (size > ssize) /* more than what's left ? */
3553 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_IMM);
3554 _bfd_vms_output_long (recwr, (unsigned long) (size));
3555 _bfd_vms_output_dump (recwr, cptr, size);
3556 _bfd_vms_output_end_subrec (recwr);
3559 _bfd_vms_debug (10, "dumped %d bytes\n", (int) size);
3560 _bfd_hexdump (10, cptr, (int) size, (int) vaddr);
3570 etir_output_check (bfd *abfd, asection *section, bfd_vma vaddr, int checklen)
3572 if (_bfd_vms_output_check (&PRIV (recwr), checklen) < 0)
3574 /* Not enough room in this record. Close it and open a new one. */
3575 end_etir_record (abfd);
3576 start_etir_or_etbt_record (abfd, section, vaddr);
3580 /* Return whether RELOC must be deferred till the end. */
3583 defer_reloc_p (arelent *reloc)
3585 switch (reloc->howto->type)
3598 /* Write section contents for bfd abfd. Return FALSE on error. */
3601 _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
3604 struct vms_rec_wr *recwr = &PRIV (recwr);
3606 vms_debug2 ((2, "vms_write_tir (%p, %d)\n", abfd, objtype));
3608 _bfd_vms_output_alignment (recwr, 4);
3610 PRIV (vms_linkage_index) = 1;
3612 for (section = abfd->sections; section; section = section->next)
3614 vms_debug2 ((4, "writing %d. section '%s' (%d bytes)\n",
3615 section->index, section->name, (int) (section->size)));
3617 if (!(section->flags & SEC_HAS_CONTENTS)
3618 || bfd_is_com_section (section))
3621 if (!section->contents)
3623 bfd_set_error (bfd_error_no_contents);
3627 start_etir_or_etbt_record (abfd, section, 0);
3629 if (section->flags & SEC_RELOC)
3631 bfd_vma curr_addr = 0;
3632 unsigned char *curr_data = section->contents;
3634 int pass2_needed = 0;
3635 int pass2_in_progress = 0;
3638 if (section->reloc_count <= 0)
3639 (*_bfd_error_handler)
3640 (_("SEC_RELOC with no relocs in section %s"), section->name);
3645 int i = section->reloc_count;
3646 arelent **rptr = section->orelocation;
3647 _bfd_vms_debug (4, "%d relocations:\n", i);
3650 _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, "
3651 "addr %08lx, off %08lx, len %d: %s\n",
3652 (*(*rptr)->sym_ptr_ptr)->name,
3653 (*(*rptr)->sym_ptr_ptr)->section->name,
3654 (long) (*(*rptr)->sym_ptr_ptr)->value,
3655 (unsigned long)(*rptr)->address,
3656 (unsigned long)(*rptr)->addend,
3657 bfd_get_reloc_size ((*rptr)->howto),
3658 ( *rptr)->howto->name);
3665 for (irel = 0; irel < section->reloc_count; irel++)
3667 struct evax_private_udata_struct *udata;
3668 arelent *rptr = section->orelocation [irel];
3669 bfd_vma addr = rptr->address;
3670 asymbol *sym = *rptr->sym_ptr_ptr;
3671 asection *sec = sym->section;
3672 bfd_boolean defer = defer_reloc_p (rptr);
3676 if (pass2_in_progress)
3678 /* Non-deferred relocs have already been output. */
3684 /* Deferred relocs must be output at the very end. */
3691 /* Regular relocs are intertwined with binary data. */
3692 if (curr_addr > addr)
3693 (*_bfd_error_handler) (_("Size error in section %s"),
3695 size = addr - curr_addr;
3696 sto_imm (abfd, section, size, curr_data, curr_addr);
3701 size = bfd_get_reloc_size (rptr->howto);
3703 switch (rptr->howto->type)
3705 case ALPHA_R_IGNORE:
3708 case ALPHA_R_REFLONG:
3709 if (bfd_is_und_section (sym->section))
3711 bfd_vma addend = rptr->addend;
3712 slen = strlen ((char *) sym->name);
3713 hash = _bfd_vms_length_hash_symbol
3714 (abfd, sym->name, EOBJ__C_SYMSIZ);
3715 etir_output_check (abfd, section, curr_addr, slen);
3718 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
3719 _bfd_vms_output_counted (recwr, hash);
3720 _bfd_vms_output_end_subrec (recwr);
3721 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3722 _bfd_vms_output_long (recwr, (unsigned long) addend);
3723 _bfd_vms_output_end_subrec (recwr);
3724 _bfd_vms_output_begin_subrec (recwr, ETIR__C_OPR_ADD);
3725 _bfd_vms_output_end_subrec (recwr);
3726 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3727 _bfd_vms_output_end_subrec (recwr);
3731 _bfd_vms_output_begin_subrec
3732 (recwr, ETIR__C_STO_GBL_LW);
3733 _bfd_vms_output_counted (recwr, hash);
3734 _bfd_vms_output_end_subrec (recwr);
3737 else if (bfd_is_abs_section (sym->section))
3739 etir_output_check (abfd, section, curr_addr, 16);
3740 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3741 _bfd_vms_output_long (recwr, (unsigned long) sym->value);
3742 _bfd_vms_output_end_subrec (recwr);
3743 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3744 _bfd_vms_output_end_subrec (recwr);
3748 etir_output_check (abfd, section, curr_addr, 32);
3749 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3750 _bfd_vms_output_long (recwr, (unsigned long) sec->index);
3751 _bfd_vms_output_quad (recwr, rptr->addend + sym->value);
3752 _bfd_vms_output_end_subrec (recwr);
3753 /* ??? Table B-8 of the OpenVMS Linker Utilily Manual
3754 says that we should have a ETIR__C_STO_OFF here.
3755 But the relocation would not be BFD_RELOC_32 then.
3756 This case is very likely unreachable. */
3757 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3758 _bfd_vms_output_end_subrec (recwr);
3762 case ALPHA_R_REFQUAD:
3763 if (bfd_is_und_section (sym->section))
3765 bfd_vma addend = rptr->addend;
3766 slen = strlen ((char *) sym->name);
3767 hash = _bfd_vms_length_hash_symbol
3768 (abfd, sym->name, EOBJ__C_SYMSIZ);
3769 etir_output_check (abfd, section, curr_addr, slen);
3772 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
3773 _bfd_vms_output_counted (recwr, hash);
3774 _bfd_vms_output_end_subrec (recwr);
3775 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
3776 _bfd_vms_output_quad (recwr, addend);
3777 _bfd_vms_output_end_subrec (recwr);
3778 _bfd_vms_output_begin_subrec (recwr, ETIR__C_OPR_ADD);
3779 _bfd_vms_output_end_subrec (recwr);
3780 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_QW);
3781 _bfd_vms_output_end_subrec (recwr);
3785 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_GBL);
3786 _bfd_vms_output_counted (recwr, hash);
3787 _bfd_vms_output_end_subrec (recwr);
3790 else if (bfd_is_abs_section (sym->section))
3792 etir_output_check (abfd, section, curr_addr, 16);
3793 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
3794 _bfd_vms_output_quad (recwr, sym->value);
3795 _bfd_vms_output_end_subrec (recwr);
3796 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_QW);
3797 _bfd_vms_output_end_subrec (recwr);
3801 etir_output_check (abfd, section, curr_addr, 32);
3802 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3803 _bfd_vms_output_long (recwr, (unsigned long) sec->index);
3804 _bfd_vms_output_quad (recwr, rptr->addend + sym->value);
3805 _bfd_vms_output_end_subrec (recwr);
3806 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_OFF);
3807 _bfd_vms_output_end_subrec (recwr);
3812 sto_imm (abfd, section, size, curr_data, curr_addr);
3815 case ALPHA_R_LINKAGE:
3816 etir_output_check (abfd, section, curr_addr, 64);
3817 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LP_PSB);
3818 _bfd_vms_output_long
3819 (recwr, (unsigned long) PRIV (vms_linkage_index));
3820 PRIV (vms_linkage_index) += 2;
3821 hash = _bfd_vms_length_hash_symbol
3822 (abfd, sym->name, EOBJ__C_SYMSIZ);
3823 _bfd_vms_output_counted (recwr, hash);
3824 _bfd_vms_output_byte (recwr, 0);
3825 _bfd_vms_output_end_subrec (recwr);
3828 case ALPHA_R_CODEADDR:
3829 slen = strlen ((char *) sym->name);
3830 hash = _bfd_vms_length_hash_symbol
3831 (abfd, sym->name, EOBJ__C_SYMSIZ);
3832 etir_output_check (abfd, section, curr_addr, slen);
3833 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_CA);
3834 _bfd_vms_output_counted (recwr, hash);
3835 _bfd_vms_output_end_subrec (recwr);
3840 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3841 etir_output_check (abfd, section, curr_addr,
3842 32 + 1 + strlen (udata->origname));
3843 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_NOP_GBL);
3844 _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
3845 _bfd_vms_output_long
3846 (recwr, (unsigned long) udata->enbsym->section->index);
3847 _bfd_vms_output_quad (recwr, rptr->address);
3848 _bfd_vms_output_long (recwr, (unsigned long) 0x47ff041f);
3849 _bfd_vms_output_long
3850 (recwr, (unsigned long) udata->enbsym->section->index);
3851 _bfd_vms_output_quad (recwr, rptr->addend);
3852 _bfd_vms_output_counted
3853 (recwr, _bfd_vms_length_hash_symbol
3854 (abfd, udata->origname, EOBJ__C_SYMSIZ));
3855 _bfd_vms_output_end_subrec (recwr);
3859 (*_bfd_error_handler) (_("Spurious ALPHA_R_BSR reloc"));
3864 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3865 etir_output_check (abfd, section, curr_addr,
3866 32 + 1 + strlen (udata->origname));
3867 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LDA_GBL);
3868 _bfd_vms_output_long
3869 (recwr, (unsigned long) udata->lkindex + 1);
3870 _bfd_vms_output_long
3871 (recwr, (unsigned long) udata->enbsym->section->index);
3872 _bfd_vms_output_quad (recwr, rptr->address);
3873 _bfd_vms_output_long (recwr, (unsigned long) 0x237B0000);
3874 _bfd_vms_output_long
3875 (recwr, (unsigned long) udata->bsym->section->index);
3876 _bfd_vms_output_quad (recwr, rptr->addend);
3877 _bfd_vms_output_counted
3878 (recwr, _bfd_vms_length_hash_symbol
3879 (abfd, udata->origname, EOBJ__C_SYMSIZ));
3880 _bfd_vms_output_end_subrec (recwr);
3885 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3886 etir_output_check (abfd, section, curr_addr,
3887 32 + 1 + strlen (udata->origname));
3888 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_BOH_GBL);
3889 _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
3890 _bfd_vms_output_long
3891 (recwr, (unsigned long) udata->enbsym->section->index);
3892 _bfd_vms_output_quad (recwr, rptr->address);
3893 _bfd_vms_output_long (recwr, (unsigned long) 0xD3400000);
3894 _bfd_vms_output_long
3895 (recwr, (unsigned long) udata->enbsym->section->index);
3896 _bfd_vms_output_quad (recwr, rptr->addend);
3897 _bfd_vms_output_counted
3898 (recwr, _bfd_vms_length_hash_symbol
3899 (abfd, udata->origname, EOBJ__C_SYMSIZ));
3900 _bfd_vms_output_end_subrec (recwr);
3904 (*_bfd_error_handler) (_("Unhandled relocation %s"),
3911 } /* End of relocs loop. */
3913 if (!pass2_in_progress)
3915 /* Output rest of section. */
3916 if (curr_addr > section->size)
3917 (*_bfd_error_handler) (_("Size error in section %s"),
3919 size = section->size - curr_addr;
3920 sto_imm (abfd, section, size, curr_data, curr_addr);
3926 pass2_in_progress = 1;
3932 else /* (section->flags & SEC_RELOC) */
3933 sto_imm (abfd, section, section->size, section->contents, 0);
3935 end_etir_record (abfd);
3938 _bfd_vms_output_alignment (recwr, 2);
3942 /* Write cached information into a file being written, at bfd_close. */
3945 alpha_vms_write_object_contents (bfd *abfd)
3947 vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd));
3949 if (abfd->flags & (EXEC_P | DYNAMIC))
3951 return alpha_vms_write_exec (abfd);
3955 if (abfd->section_count > 0) /* we have sections */
3957 if (_bfd_vms_write_ehdr (abfd) != TRUE)
3959 if (_bfd_vms_write_egsd (abfd) != TRUE)
3961 if (_bfd_vms_write_etir (abfd, EOBJ__C_ETIR) != TRUE)
3963 if (_bfd_vms_write_eeom (abfd) != TRUE)
3970 /* Debug stuff: nearest line. */
3972 #define SET_MODULE_PARSED(m) \
3973 do { if ((m)->name == NULL) (m)->name = ""; } while (0)
3974 #define IS_MODULE_PARSED(m) ((m)->name != NULL)
3976 /* Build a new module for the specified BFD. */
3978 static struct module *
3979 new_module (bfd *abfd)
3981 struct module *module
3982 = (struct module *) bfd_zalloc (abfd, sizeof (struct module));
3983 module->file_table_count = 16; /* Arbitrary. */
3985 = bfd_malloc (module->file_table_count * sizeof (struct fileinfo));
3989 /* Parse debug info for a module and internalize it. */
3992 parse_module (bfd *abfd, struct module *module, unsigned char *ptr,
3995 unsigned char *maxptr = ptr + length;
3996 unsigned char *src_ptr, *pcl_ptr;
3997 unsigned int prev_linum = 0, curr_linenum = 0;
3998 bfd_vma prev_pc = 0, curr_pc = 0;
3999 struct srecinfo *curr_srec, *srec;
4000 struct lineinfo *curr_line, *line;
4001 struct funcinfo *funcinfo;
4003 /* Initialize tables with zero element. */
4004 curr_srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
4005 module->srec_table = curr_srec;
4007 curr_line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
4008 module->line_table = curr_line;
4010 while (length == -1 || ptr < maxptr)
4012 /* The first byte is not counted in the recorded length. */
4013 int rec_length = bfd_getl16 (ptr) + 1;
4014 int rec_type = bfd_getl16 (ptr + 2);
4016 vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length, rec_type));
4018 if (length == -1 && rec_type == DST__K_MODEND)
4025 = _bfd_vms_save_counted_string (ptr + DST_S_B_MODBEG_NAME);
4032 vms_debug2 ((3, "module: %s\n", module->name));
4039 funcinfo = (struct funcinfo *)
4040 bfd_zalloc (abfd, sizeof (struct funcinfo));
4042 = _bfd_vms_save_counted_string (ptr + DST_S_B_RTNBEG_NAME);
4043 funcinfo->low = bfd_getl32 (ptr + DST_S_L_RTNBEG_ADDRESS);
4044 funcinfo->next = module->func_table;
4045 module->func_table = funcinfo;
4047 vms_debug2 ((3, "routine: %s at 0x%lx\n",
4048 funcinfo->name, (unsigned long) funcinfo->low));
4052 module->func_table->high = module->func_table->low
4053 + bfd_getl32 (ptr + DST_S_L_RTNEND_SIZE) - 1;
4055 if (module->func_table->high > module->high)
4056 module->high = module->func_table->high;
4058 vms_debug2 ((3, "end routine\n"));
4062 vms_debug2 ((3, "prologue\n"));
4066 vms_debug2 ((3, "epilog\n"));
4070 vms_debug2 ((3, "block\n"));
4074 vms_debug2 ((3, "end block\n"));
4078 src_ptr = ptr + DST_S_C_SOURCE_HEADER_SIZE;
4080 vms_debug2 ((3, "source info\n"));
4082 while (src_ptr < ptr + rec_length)
4084 int cmd = src_ptr[0], cmd_length, data;
4088 case DST__K_SRC_DECLFILE:
4091 = bfd_getl16 (src_ptr + DST_S_W_SRC_DF_FILEID);
4093 = _bfd_vms_save_counted_string (src_ptr
4094 + DST_S_B_SRC_DF_FILENAME);
4096 while (fileid >= module->file_table_count)
4098 module->file_table_count *= 2;
4100 = bfd_realloc (module->file_table,
4101 module->file_table_count
4102 * sizeof (struct fileinfo));
4105 module->file_table [fileid].name = filename;
4106 module->file_table [fileid].srec = 1;
4107 cmd_length = src_ptr[DST_S_B_SRC_DF_LENGTH] + 2;
4108 vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4109 fileid, module->file_table [fileid].name));
4113 case DST__K_SRC_DEFLINES_B:
4114 /* Perform the association and set the next higher index
4116 data = src_ptr[DST_S_B_SRC_UNSBYTE];
4117 srec = (struct srecinfo *)
4118 bfd_zalloc (abfd, sizeof (struct srecinfo));
4119 srec->line = curr_srec->line + data;
4120 srec->srec = curr_srec->srec + data;
4121 srec->sfile = curr_srec->sfile;
4122 curr_srec->next = srec;
4125 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data));
4128 case DST__K_SRC_DEFLINES_W:
4129 /* Perform the association and set the next higher index
4131 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4132 srec = (struct srecinfo *)
4133 bfd_zalloc (abfd, sizeof (struct srecinfo));
4134 srec->line = curr_srec->line + data;
4135 srec->srec = curr_srec->srec + data,
4136 srec->sfile = curr_srec->sfile;
4137 curr_srec->next = srec;
4140 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data));
4143 case DST__K_SRC_INCRLNUM_B:
4144 data = src_ptr[DST_S_B_SRC_UNSBYTE];
4145 curr_srec->line += data;
4147 vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data));
4150 case DST__K_SRC_SETFILE:
4151 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4152 curr_srec->sfile = data;
4153 curr_srec->srec = module->file_table[data].srec;
4155 vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data));
4158 case DST__K_SRC_SETLNUM_L:
4159 data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4160 curr_srec->line = data;
4162 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data));
4165 case DST__K_SRC_SETLNUM_W:
4166 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4167 curr_srec->line = data;
4169 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data));
4172 case DST__K_SRC_SETREC_L:
4173 data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4174 curr_srec->srec = data;
4175 module->file_table[curr_srec->sfile].srec = data;
4177 vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data));
4180 case DST__K_SRC_SETREC_W:
4181 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4182 curr_srec->srec = data;
4183 module->file_table[curr_srec->sfile].srec = data;
4185 vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data));
4188 case DST__K_SRC_FORMFEED:
4190 vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4194 (*_bfd_error_handler) (_("unknown source command %d"),
4200 src_ptr += cmd_length;
4204 case DST__K_LINE_NUM:
4205 pcl_ptr = ptr + DST_S_C_LINE_NUM_HEADER_SIZE;
4207 vms_debug2 ((3, "line info\n"));
4209 while (pcl_ptr < ptr + rec_length)
4211 /* The command byte is signed so we must sign-extend it. */
4212 int cmd = ((signed char *)pcl_ptr)[0], cmd_length, data;
4216 case DST__K_DELTA_PC_W:
4217 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4221 vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data));
4224 case DST__K_DELTA_PC_L:
4225 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4229 vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data));
4232 case DST__K_INCR_LINUM:
4233 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4234 curr_linenum += data;
4236 vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data));
4239 case DST__K_INCR_LINUM_W:
4240 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4241 curr_linenum += data;
4243 vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data));
4246 case DST__K_INCR_LINUM_L:
4247 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4248 curr_linenum += data;
4250 vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data));
4253 case DST__K_SET_LINUM_INCR:
4254 (*_bfd_error_handler)
4255 (_("DST__K_SET_LINUM_INCR not implemented"));
4259 case DST__K_SET_LINUM_INCR_W:
4260 (*_bfd_error_handler)
4261 (_("DST__K_SET_LINUM_INCR_W not implemented"));
4265 case DST__K_RESET_LINUM_INCR:
4266 (*_bfd_error_handler)
4267 (_("DST__K_RESET_LINUM_INCR not implemented"));
4271 case DST__K_BEG_STMT_MODE:
4272 (*_bfd_error_handler)
4273 (_("DST__K_BEG_STMT_MODE not implemented"));
4277 case DST__K_END_STMT_MODE:
4278 (*_bfd_error_handler)
4279 (_("DST__K_END_STMT_MODE not implemented"));
4283 case DST__K_SET_LINUM_B:
4284 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4285 curr_linenum = data;
4287 vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data));
4290 case DST__K_SET_LINUM:
4291 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4292 curr_linenum = data;
4294 vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data));
4297 case DST__K_SET_LINUM_L:
4298 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4299 curr_linenum = data;
4301 vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data));
4305 (*_bfd_error_handler)
4306 (_("DST__K_SET_PC not implemented"));
4310 case DST__K_SET_PC_W:
4311 (*_bfd_error_handler)
4312 (_("DST__K_SET_PC_W not implemented"));
4316 case DST__K_SET_PC_L:
4317 (*_bfd_error_handler)
4318 (_("DST__K_SET_PC_L not implemented"));
4322 case DST__K_SET_STMTNUM:
4323 (*_bfd_error_handler)
4324 (_("DST__K_SET_STMTNUM not implemented"));
4329 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4332 vms_debug2 ((4, "DST__K_TERM: %d\n", data));
4336 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4339 vms_debug2 ((4, "DST__K_TERM_W: %d\n", data));
4343 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4346 vms_debug2 ((4, "DST__K_TERM_L: %d\n", data));
4349 case DST__K_SET_ABS_PC:
4350 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4353 vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data));
4362 vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4363 (unsigned long)curr_pc, curr_linenum));
4367 (*_bfd_error_handler) (_("unknown line command %d"),
4374 if ((curr_linenum != prev_linum && curr_pc != prev_pc)
4376 || cmd == DST__K_DELTA_PC_L
4377 || cmd == DST__K_DELTA_PC_W)
4379 line = (struct lineinfo *)
4380 bfd_zalloc (abfd, sizeof (struct lineinfo));
4381 line->address = curr_pc;
4382 line->line = curr_linenum;
4384 curr_line->next = line;
4387 prev_linum = curr_linenum;
4389 vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4390 (unsigned long)curr_pc, curr_linenum));
4393 pcl_ptr += cmd_length;
4397 case 0x17: /* Undocumented type used by DEC C to declare equates. */
4398 vms_debug2 ((3, "undocumented type 0x17\n"));
4402 vms_debug2 ((3, "ignoring record\n"));
4410 /* Finalize tables with EOL marker. */
4411 srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
4412 srec->line = (unsigned int) -1;
4413 srec->srec = (unsigned int) -1;
4414 curr_srec->next = srec;
4416 line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
4417 line->line = (unsigned int) -1;
4418 line->address = (bfd_vma) -1;
4419 curr_line->next = line;
4421 /* Advertise that this module has been parsed. This is needed
4422 because parsing can be either performed at module creation
4423 or deferred until debug info is consumed. */
4424 SET_MODULE_PARSED (module);
4427 /* Build the list of modules for the specified BFD. */
4429 static struct module *
4430 build_module_list (bfd *abfd)
4432 struct module *module, *list = NULL;
4435 if ((dmt = bfd_get_section_by_name (abfd, "$DMT$")))
4437 /* We have a DMT section so this must be an image. Parse the
4438 section and build the list of modules. This is sufficient
4439 since we can compute the start address and the end address
4440 of every module from the section contents. */
4441 bfd_size_type size = bfd_get_section_size (dmt);
4442 unsigned char *ptr, *end;
4444 ptr = (unsigned char *) bfd_alloc (abfd, size);
4448 if (! bfd_get_section_contents (abfd, dmt, ptr, 0, size))
4451 vms_debug2 ((2, "DMT\n"));
4457 /* Each header declares a module with its start offset and size
4458 of debug info in the DST section, as well as the count of
4459 program sections (i.e. address spans) it contains. */
4460 int modbeg = bfd_getl32 (ptr + DBG_S_L_DMT_MODBEG);
4461 int msize = bfd_getl32 (ptr + DBG_S_L_DST_SIZE);
4462 int count = bfd_getl16 (ptr + DBG_S_W_DMT_PSECT_COUNT);
4463 ptr += DBG_S_C_DMT_HEADER_SIZE;
4465 vms_debug2 ((3, "module: modbeg = %d, size = %d, count = %d\n",
4466 modbeg, msize, count));
4468 /* We create a 'module' structure for each program section since
4469 we only support contiguous addresses in a 'module' structure.
4470 As a consequence, the actual debug info in the DST section is
4471 shared and can be parsed multiple times; that doesn't seem to
4472 cause problems in practice. */
4475 int start = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_START);
4476 int length = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_LENGTH);
4477 module = new_module (abfd);
4478 module->modbeg = modbeg;
4479 module->size = msize;
4480 module->low = start;
4481 module->high = start + length;
4482 module->next = list;
4484 ptr += DBG_S_C_DMT_PSECT_SIZE;
4486 vms_debug2 ((4, "section: start = 0x%x, length = %d\n",
4493 /* We don't have a DMT section so this must be an object. Parse
4494 the module right now in order to compute its start address and
4496 module = new_module (abfd);
4497 parse_module (abfd, module, PRIV (dst_section)->contents, -1);
4504 /* Calculate and return the name of the source file and the line nearest
4505 to the wanted location in the specified module. */
4508 module_find_nearest_line (bfd *abfd, struct module *module, bfd_vma addr,
4509 const char **file, const char **func,
4512 struct funcinfo *funcinfo;
4513 struct lineinfo *lineinfo;
4514 struct srecinfo *srecinfo;
4515 bfd_boolean ret = FALSE;
4517 /* Parse this module if that was not done at module creation. */
4518 if (! IS_MODULE_PARSED (module))
4520 unsigned int size = module->size;
4521 unsigned int modbeg = PRIV (dst_section)->filepos + module->modbeg;
4522 unsigned char *buffer = (unsigned char *) bfd_malloc (module->size);
4524 if (bfd_seek (abfd, modbeg, SEEK_SET) != 0
4525 || bfd_bread (buffer, size, abfd) != size)
4527 bfd_set_error (bfd_error_no_debug_section);
4531 parse_module (abfd, module, buffer, size);
4535 /* Find out the function (if any) that contains the address. */
4536 for (funcinfo = module->func_table; funcinfo; funcinfo = funcinfo->next)
4537 if (addr >= funcinfo->low && addr <= funcinfo->high)
4539 *func = funcinfo->name;
4544 /* Find out the source file and the line nearest to the address. */
4545 for (lineinfo = module->line_table; lineinfo; lineinfo = lineinfo->next)
4546 if (lineinfo->next && addr < lineinfo->next->address)
4548 for (srecinfo = module->srec_table; srecinfo; srecinfo = srecinfo->next)
4549 if (srecinfo->next && lineinfo->line < srecinfo->next->line)
4551 if (srecinfo->sfile > 0)
4553 *file = module->file_table[srecinfo->sfile].name;
4554 *line = srecinfo->srec + lineinfo->line - srecinfo->line;
4558 *file = module->name;
4559 *line = lineinfo->line;
4570 /* Provided a BFD, a section and an offset into the section, calculate and
4571 return the name of the source file and the line nearest to the wanted
4575 _bfd_vms_find_nearest_dst_line (bfd *abfd, asection *section,
4576 asymbol **symbols ATTRIBUTE_UNUSED,
4577 bfd_vma offset, const char **file,
4578 const char **func, unsigned int *line)
4580 struct module *module;
4582 /* What address are we looking for? */
4583 bfd_vma addr = section->vma + offset;
4589 if (PRIV (dst_section) == NULL || !(abfd->flags & (EXEC_P | DYNAMIC)))
4592 if (PRIV (modules) == NULL)
4594 PRIV (modules) = build_module_list (abfd);
4595 if (PRIV (modules) == NULL)
4599 for (module = PRIV (modules); module; module = module->next)
4600 if (addr >= module->low && addr <= module->high)
4601 return module_find_nearest_line (abfd, module, addr, file, func, line);
4606 /* Canonicalizations. */
4607 /* Set name, value, section and flags of SYM from E. */
4610 alpha_vms_convert_symbol (bfd *abfd, struct vms_symbol_entry *e, asymbol *sym)
4619 flags = BSF_NO_FLAGS;
4625 if (e->flags & EGSY__V_WEAK)
4628 if (e->flags & EGSY__V_DEF)
4630 /* Symbol definition. */
4631 flags |= BSF_GLOBAL;
4632 if (e->flags & EGSY__V_NORM)
4633 flags |= BSF_FUNCTION;
4635 sec = PRIV (sections)[e->section];
4639 /* Symbol reference. */
4640 sec = bfd_und_section_ptr;
4645 /* A universal symbol is by definition global... */
4646 flags |= BSF_GLOBAL;
4648 /* ...and dynamic in shared libraries. */
4649 if (abfd->flags & DYNAMIC)
4650 flags |= BSF_DYNAMIC;
4652 if (e->flags & EGSY__V_WEAK)
4655 if (!(e->flags & EGSY__V_DEF))
4658 if (e->flags & EGSY__V_NORM)
4659 flags |= BSF_FUNCTION;
4661 value = e->symbol_vector;
4663 /* Adding this offset is necessary in order for GDB to
4664 read the DWARF-2 debug info from shared libraries. */
4665 if ((abfd->flags & DYNAMIC) && strstr (name, "$DWARF2.DEBUG") != 0)
4666 value += PRIV (symvva);
4668 sec = bfd_abs_section_ptr;
4670 /* Find containing section. */
4675 for (s = abfd->sections; s; s = s->next)
4679 && !(s->flags & SEC_COFF_SHARED_LIBRARY)
4680 && (s->size > 0 || !(e->flags & EGSY__V_REL)))
4703 /* Return the number of bytes required to store a vector of pointers
4704 to asymbols for all the symbols in the BFD abfd, including a
4705 terminal NULL pointer. If there are no symbols in the BFD,
4706 then return 0. If an error occurs, return -1. */
4709 alpha_vms_get_symtab_upper_bound (bfd *abfd)
4711 vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
4712 abfd, PRIV (gsd_sym_count)));
4714 return (PRIV (gsd_sym_count) + 1) * sizeof (asymbol *);
4717 /* Read the symbols from the BFD abfd, and fills in the vector
4718 location with pointers to the symbols and a trailing NULL.
4720 Return number of symbols read. */
4723 alpha_vms_canonicalize_symtab (bfd *abfd, asymbol **symbols)
4727 vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd));
4729 if (PRIV (csymbols) == NULL)
4731 PRIV (csymbols) = (asymbol **) bfd_alloc
4732 (abfd, PRIV (gsd_sym_count) * sizeof (asymbol *));
4734 /* Traverse table and fill symbols vector. */
4735 for (i = 0; i < PRIV (gsd_sym_count); i++)
4737 struct vms_symbol_entry *e = PRIV (syms)[i];
4740 sym = bfd_make_empty_symbol (abfd);
4741 if (sym == NULL || !alpha_vms_convert_symbol (abfd, e, sym))
4743 bfd_release (abfd, PRIV (csymbols));
4744 PRIV (csymbols) = NULL;
4748 PRIV (csymbols)[i] = sym;
4752 if (symbols != NULL)
4754 for (i = 0; i < PRIV (gsd_sym_count); i++)
4755 symbols[i] = PRIV (csymbols)[i];
4759 return PRIV (gsd_sym_count);
4762 /* Read and convert relocations from ETIR. We do it once for all sections. */
4765 alpha_vms_slurp_relocs (bfd *abfd)
4769 vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
4771 /* We slurp relocs only once, for all sections. */
4772 if (PRIV (reloc_done))
4774 PRIV (reloc_done) = TRUE;
4776 if (alpha_vms_canonicalize_symtab (abfd, NULL) < 0)
4779 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
4784 unsigned char *begin;
4787 bfd_reloc_code_real_type reloc_code;
4793 bfd_vma cur_address;
4795 unsigned char *cur_sym = NULL;
4797 bfd_vma cur_addend = 0;
4799 /* Skip non-ETIR records. */
4800 type = _bfd_vms_get_object_record (abfd);
4801 if (type == EOBJ__C_EEOM)
4803 if (type != EOBJ__C_ETIR)
4806 begin = PRIV (recrd.rec) + 4;
4807 end = PRIV (recrd.rec) + PRIV (recrd.rec_size);
4809 for (ptr = begin; ptr < end; ptr += length)
4813 cmd = bfd_getl16 (ptr);
4814 length = bfd_getl16 (ptr + 2);
4816 cur_address = vaddr;
4818 vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
4819 _bfd_vms_etir_name (cmd)));
4823 case ETIR__C_STA_GBL: /* ALPHA_R_REFLONG und_section, step 1 */
4824 /* ALPHA_R_REFQUAD und_section, step 1 */
4829 case ETIR__C_STA_PQ: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
4830 cur_psidx = bfd_getl32 (ptr + 4);
4831 cur_addend = bfd_getl64 (ptr + 8);
4835 case ETIR__C_CTL_SETRB:
4836 if (prev_cmd != ETIR__C_STA_PQ)
4838 (*_bfd_error_handler)
4839 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd),
4840 _bfd_vms_etir_name (cmd));
4843 cur_psect = cur_psidx;
4849 case ETIR__C_STA_LW: /* ALPHA_R_REFLONG abs_section, step 1 */
4850 /* ALPHA_R_REFLONG und_section, step 2 */
4853 if (prev_cmd != ETIR__C_STA_GBL)
4855 (*_bfd_error_handler)
4856 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
4857 _bfd_vms_etir_name (ETIR__C_STA_LW));
4861 cur_addend = bfd_getl32 (ptr + 4);
4865 case ETIR__C_STA_QW: /* ALPHA_R_REFQUAD abs_section, step 1 */
4866 /* ALPHA_R_REFQUAD und_section, step 2 */
4867 if (prev_cmd != -1 && prev_cmd != ETIR__C_STA_GBL)
4869 (*_bfd_error_handler)
4870 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
4871 _bfd_vms_etir_name (ETIR__C_STA_QW));
4874 cur_addend = bfd_getl64 (ptr + 4);
4878 case ETIR__C_STO_LW: /* ALPHA_R_REFLONG und_section, step 4 */
4879 /* ALPHA_R_REFLONG abs_section, step 2 */
4880 /* ALPHA_R_REFLONG others, step 2 */
4881 if (prev_cmd != ETIR__C_OPR_ADD
4882 && prev_cmd != ETIR__C_STA_LW
4883 && prev_cmd != ETIR__C_STA_PQ)
4885 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
4886 _bfd_vms_etir_name (prev_cmd),
4887 _bfd_vms_etir_name (ETIR__C_STO_LW));
4890 reloc_code = BFD_RELOC_32;
4893 case ETIR__C_STO_QW: /* ALPHA_R_REFQUAD und_section, step 4 */
4894 /* ALPHA_R_REFQUAD abs_section, step 2 */
4895 if (prev_cmd != ETIR__C_OPR_ADD && prev_cmd != ETIR__C_STA_QW)
4897 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
4898 _bfd_vms_etir_name (prev_cmd),
4899 _bfd_vms_etir_name (ETIR__C_STO_QW));
4902 reloc_code = BFD_RELOC_64;
4905 case ETIR__C_STO_OFF: /* ALPHA_R_REFQUAD others, step 2 */
4906 if (prev_cmd != ETIR__C_STA_PQ)
4908 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
4909 _bfd_vms_etir_name (prev_cmd),
4910 _bfd_vms_etir_name (ETIR__C_STO_OFF));
4913 reloc_code = BFD_RELOC_64;
4916 case ETIR__C_OPR_ADD: /* ALPHA_R_REFLONG und_section, step 3 */
4917 /* ALPHA_R_REFQUAD und_section, step 3 */
4918 if (prev_cmd != ETIR__C_STA_LW && prev_cmd != ETIR__C_STA_QW)
4920 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
4921 _bfd_vms_etir_name (prev_cmd),
4922 _bfd_vms_etir_name (ETIR__C_OPR_ADD));
4925 prev_cmd = ETIR__C_OPR_ADD;
4928 case ETIR__C_STO_CA: /* ALPHA_R_CODEADDR */
4929 reloc_code = BFD_RELOC_ALPHA_CODEADDR;
4933 case ETIR__C_STO_GBL: /* ALPHA_R_REFQUAD und_section */
4934 reloc_code = BFD_RELOC_64;
4938 case ETIR__C_STO_GBL_LW: /* ALPHA_R_REFLONG und_section */
4939 reloc_code = BFD_RELOC_32;
4943 case ETIR__C_STC_LP_PSB: /* ALPHA_R_LINKAGE */
4944 reloc_code = BFD_RELOC_ALPHA_LINKAGE;
4948 case ETIR__C_STC_NOP_GBL: /* ALPHA_R_NOP */
4949 reloc_code = BFD_RELOC_ALPHA_NOP;
4952 case ETIR__C_STC_BSR_GBL: /* ALPHA_R_BSR */
4953 reloc_code = BFD_RELOC_ALPHA_BSR;
4956 case ETIR__C_STC_LDA_GBL: /* ALPHA_R_LDA */
4957 reloc_code = BFD_RELOC_ALPHA_LDA;
4960 case ETIR__C_STC_BOH_GBL: /* ALPHA_R_BOH */
4961 reloc_code = BFD_RELOC_ALPHA_BOH;
4965 cur_sym = ptr + 4 + 32;
4966 cur_address = bfd_getl64 (ptr + 4 + 8);
4967 cur_addend = bfd_getl64 (ptr + 4 + 24);
4970 case ETIR__C_STO_IMM:
4971 vaddr += bfd_getl32 (ptr + 4);
4975 (*_bfd_error_handler) (_("Unknown reloc %s"),
4976 _bfd_vms_etir_name (cmd));
4982 struct vms_section_data_struct *vms_sec;
4985 /* Get section to which the relocation applies. */
4986 if (cur_psect < 0 || cur_psect > (int)PRIV (section_count))
4988 (*_bfd_error_handler) (_("Invalid section index in ETIR"));
4991 sec = PRIV (sections)[cur_psect];
4992 vms_sec = vms_section_data (sec);
4994 /* Allocate a reloc entry. */
4995 if (sec->reloc_count >= vms_sec->reloc_max)
4997 if (vms_sec->reloc_max == 0)
4999 vms_sec->reloc_max = 64;
5000 sec->relocation = bfd_zmalloc
5001 (vms_sec->reloc_max * sizeof (arelent));
5005 vms_sec->reloc_max *= 2;
5006 sec->relocation = bfd_realloc
5007 (sec->relocation, vms_sec->reloc_max * sizeof (arelent));
5010 reloc = &sec->relocation[sec->reloc_count];
5013 reloc->howto = bfd_reloc_type_lookup (abfd, reloc_code);
5015 if (cur_sym != NULL)
5018 unsigned int symlen = *cur_sym;
5021 /* Linear search. */
5026 for (j = 0; j < PRIV (gsd_sym_count); j++)
5027 if (PRIV (syms)[j]->namelen == symlen
5028 && memcmp (PRIV (syms)[j]->name, cur_sym, symlen) == 0)
5030 sym = &PRIV (csymbols)[j];
5035 (*_bfd_error_handler) (_("Unknown symbol in command %s"),
5036 _bfd_vms_etir_name (cmd));
5037 reloc->sym_ptr_ptr = NULL;
5040 reloc->sym_ptr_ptr = sym;
5042 else if (cur_psidx >= 0)
5043 reloc->sym_ptr_ptr =
5044 PRIV (sections)[cur_psidx]->symbol_ptr_ptr;
5046 reloc->sym_ptr_ptr = NULL;
5048 reloc->address = cur_address;
5049 reloc->addend = cur_addend;
5051 vaddr += bfd_get_reloc_size (reloc->howto);
5060 vms_debug2 ((3, "alpha_vms_slurp_relocs: result = TRUE\n"));
5065 /* Return the number of bytes required to store the relocation
5066 information associated with the given section. */
5069 alpha_vms_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *section)
5071 alpha_vms_slurp_relocs (abfd);
5073 return (section->reloc_count + 1) * sizeof (arelent *);
5076 /* Convert relocations from VMS (external) form into BFD internal
5077 form. Return the number of relocations. */
5080 alpha_vms_canonicalize_reloc (bfd *abfd, asection *section, arelent **relptr,
5081 asymbol **symbols ATTRIBUTE_UNUSED)
5086 if (!alpha_vms_slurp_relocs (abfd))
5089 count = section->reloc_count;
5090 tblptr = section->relocation;
5093 *relptr++ = tblptr++;
5095 *relptr = (arelent *) NULL;
5096 return section->reloc_count;
5099 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
5101 /* How to process the various reloc types. */
5103 static bfd_reloc_status_type
5104 reloc_nil (bfd * abfd ATTRIBUTE_UNUSED,
5105 arelent *reloc ATTRIBUTE_UNUSED,
5106 asymbol *sym ATTRIBUTE_UNUSED,
5107 void * data ATTRIBUTE_UNUSED,
5108 asection *sec ATTRIBUTE_UNUSED,
5109 bfd *output_bfd ATTRIBUTE_UNUSED,
5110 char **error_message ATTRIBUTE_UNUSED)
5113 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd, output_bfd);
5114 vms_debug (2, "In section %s, symbol %s\n",
5115 sec->name, sym->name);
5116 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5117 reloc->sym_ptr_ptr[0]->name,
5118 (unsigned long)reloc->address,
5119 (unsigned long)reloc->addend, reloc->howto->name);
5120 vms_debug (2, "data at %p\n", data);
5121 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5124 return bfd_reloc_ok;
5127 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5128 from smaller values. Start with zero, widen, *then* decrement. */
5129 #define MINUS_ONE (((bfd_vma)0) - 1)
5131 static reloc_howto_type alpha_howto_table[] =
5133 HOWTO (ALPHA_R_IGNORE, /* Type. */
5134 0, /* Rightshift. */
5135 0, /* Size (0 = byte, 1 = short, 2 = long). */
5137 TRUE, /* PC relative. */
5139 complain_overflow_dont,/* Complain_on_overflow. */
5140 reloc_nil, /* Special_function. */
5141 "IGNORE", /* Name. */
5142 TRUE, /* Partial_inplace. */
5143 0, /* Source mask */
5145 TRUE), /* PC rel offset. */
5147 /* A 64 bit reference to a symbol. */
5148 HOWTO (ALPHA_R_REFQUAD, /* Type. */
5149 0, /* Rightshift. */
5150 4, /* Size (0 = byte, 1 = short, 2 = long). */
5152 FALSE, /* PC relative. */
5154 complain_overflow_bitfield, /* Complain_on_overflow. */
5155 reloc_nil, /* Special_function. */
5156 "REFQUAD", /* Name. */
5157 TRUE, /* Partial_inplace. */
5158 MINUS_ONE, /* Source mask. */
5159 MINUS_ONE, /* Dest mask. */
5160 FALSE), /* PC rel offset. */
5162 /* A 21 bit branch. The native assembler generates these for
5163 branches within the text segment, and also fills in the PC
5164 relative offset in the instruction. */
5165 HOWTO (ALPHA_R_BRADDR, /* Type. */
5166 2, /* Rightshift. */
5167 2, /* Size (0 = byte, 1 = short, 2 = long). */
5169 TRUE, /* PC relative. */
5171 complain_overflow_signed, /* Complain_on_overflow. */
5172 reloc_nil, /* Special_function. */
5173 "BRADDR", /* Name. */
5174 TRUE, /* Partial_inplace. */
5175 0x1fffff, /* Source mask. */
5176 0x1fffff, /* Dest mask. */
5177 FALSE), /* PC rel offset. */
5179 /* A hint for a jump to a register. */
5180 HOWTO (ALPHA_R_HINT, /* Type. */
5181 2, /* Rightshift. */
5182 1, /* Size (0 = byte, 1 = short, 2 = long). */
5184 TRUE, /* PC relative. */
5186 complain_overflow_dont,/* Complain_on_overflow. */
5187 reloc_nil, /* Special_function. */
5189 TRUE, /* Partial_inplace. */
5190 0x3fff, /* Source mask. */
5191 0x3fff, /* Dest mask. */
5192 FALSE), /* PC rel offset. */
5194 /* 16 bit PC relative offset. */
5195 HOWTO (ALPHA_R_SREL16, /* Type. */
5196 0, /* Rightshift. */
5197 1, /* Size (0 = byte, 1 = short, 2 = long). */
5199 TRUE, /* PC relative. */
5201 complain_overflow_signed, /* Complain_on_overflow. */
5202 reloc_nil, /* Special_function. */
5203 "SREL16", /* Name. */
5204 TRUE, /* Partial_inplace. */
5205 0xffff, /* Source mask. */
5206 0xffff, /* Dest mask. */
5207 FALSE), /* PC rel offset. */
5209 /* 32 bit PC relative offset. */
5210 HOWTO (ALPHA_R_SREL32, /* Type. */
5211 0, /* Rightshift. */
5212 2, /* Size (0 = byte, 1 = short, 2 = long). */
5214 TRUE, /* PC relative. */
5216 complain_overflow_signed, /* Complain_on_overflow. */
5217 reloc_nil, /* Special_function. */
5218 "SREL32", /* Name. */
5219 TRUE, /* Partial_inplace. */
5220 0xffffffff, /* Source mask. */
5221 0xffffffff, /* Dest mask. */
5222 FALSE), /* PC rel offset. */
5224 /* A 64 bit PC relative offset. */
5225 HOWTO (ALPHA_R_SREL64, /* Type. */
5226 0, /* Rightshift. */
5227 4, /* Size (0 = byte, 1 = short, 2 = long). */
5229 TRUE, /* PC relative. */
5231 complain_overflow_signed, /* Complain_on_overflow. */
5232 reloc_nil, /* Special_function. */
5233 "SREL64", /* Name. */
5234 TRUE, /* Partial_inplace. */
5235 MINUS_ONE, /* Source mask. */
5236 MINUS_ONE, /* Dest mask. */
5237 FALSE), /* PC rel offset. */
5239 /* Push a value on the reloc evaluation stack. */
5240 HOWTO (ALPHA_R_OP_PUSH, /* Type. */
5241 0, /* Rightshift. */
5242 0, /* Size (0 = byte, 1 = short, 2 = long). */
5244 FALSE, /* PC relative. */
5246 complain_overflow_dont,/* Complain_on_overflow. */
5247 reloc_nil, /* Special_function. */
5248 "OP_PUSH", /* Name. */
5249 FALSE, /* Partial_inplace. */
5250 0, /* Source mask. */
5252 FALSE), /* PC rel offset. */
5254 /* Store the value from the stack at the given address. Store it in
5255 a bitfield of size r_size starting at bit position r_offset. */
5256 HOWTO (ALPHA_R_OP_STORE, /* Type. */
5257 0, /* Rightshift. */
5258 4, /* Size (0 = byte, 1 = short, 2 = long). */
5260 FALSE, /* PC relative. */
5262 complain_overflow_dont,/* Complain_on_overflow. */
5263 reloc_nil, /* Special_function. */
5264 "OP_STORE", /* Name. */
5265 FALSE, /* Partial_inplace. */
5266 0, /* Source mask. */
5267 MINUS_ONE, /* Dest mask. */
5268 FALSE), /* PC rel offset. */
5270 /* Subtract the reloc address from the value on the top of the
5271 relocation stack. */
5272 HOWTO (ALPHA_R_OP_PSUB, /* Type. */
5273 0, /* Rightshift. */
5274 0, /* Size (0 = byte, 1 = short, 2 = long). */
5276 FALSE, /* PC relative. */
5278 complain_overflow_dont,/* Complain_on_overflow. */
5279 reloc_nil, /* Special_function. */
5280 "OP_PSUB", /* Name. */
5281 FALSE, /* Partial_inplace. */
5282 0, /* Source mask. */
5284 FALSE), /* PC rel offset. */
5286 /* Shift the value on the top of the relocation stack right by the
5288 HOWTO (ALPHA_R_OP_PRSHIFT, /* Type. */
5289 0, /* Rightshift. */
5290 0, /* Size (0 = byte, 1 = short, 2 = long). */
5292 FALSE, /* PC relative. */
5294 complain_overflow_dont,/* Complain_on_overflow. */
5295 reloc_nil, /* Special_function. */
5296 "OP_PRSHIFT", /* Name. */
5297 FALSE, /* Partial_inplace. */
5298 0, /* Source mask. */
5300 FALSE), /* PC rel offset. */
5302 /* Hack. Linkage is done by linker. */
5303 HOWTO (ALPHA_R_LINKAGE, /* Type. */
5304 0, /* Rightshift. */
5305 8, /* Size (0 = byte, 1 = short, 2 = long). */
5307 FALSE, /* PC relative. */
5309 complain_overflow_dont,/* Complain_on_overflow. */
5310 reloc_nil, /* Special_function. */
5311 "LINKAGE", /* Name. */
5312 FALSE, /* Partial_inplace. */
5313 0, /* Source mask. */
5315 FALSE), /* PC rel offset. */
5317 /* A 32 bit reference to a symbol. */
5318 HOWTO (ALPHA_R_REFLONG, /* Type. */
5319 0, /* Rightshift. */
5320 2, /* Size (0 = byte, 1 = short, 2 = long). */
5322 FALSE, /* PC relative. */
5324 complain_overflow_bitfield, /* Complain_on_overflow. */
5325 reloc_nil, /* Special_function. */
5326 "REFLONG", /* Name. */
5327 TRUE, /* Partial_inplace. */
5328 0xffffffff, /* Source mask. */
5329 0xffffffff, /* Dest mask. */
5330 FALSE), /* PC rel offset. */
5332 /* A 64 bit reference to a procedure, written as 32 bit value. */
5333 HOWTO (ALPHA_R_CODEADDR, /* Type. */
5334 0, /* Rightshift. */
5335 4, /* Size (0 = byte, 1 = short, 2 = long). */
5337 FALSE, /* PC relative. */
5339 complain_overflow_signed,/* Complain_on_overflow. */
5340 reloc_nil, /* Special_function. */
5341 "CODEADDR", /* Name. */
5342 FALSE, /* Partial_inplace. */
5343 0xffffffff, /* Source mask. */
5344 0xffffffff, /* Dest mask. */
5345 FALSE), /* PC rel offset. */
5347 HOWTO (ALPHA_R_NOP, /* Type. */
5348 0, /* Rightshift. */
5349 3, /* Size (0 = byte, 1 = short, 2 = long). */
5351 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5352 because the calculations for the 3 relocations are the same.
5353 See B.4.5.2 of the OpenVMS Linker Utility Manual. */
5354 TRUE, /* PC relative. */
5356 complain_overflow_dont,/* Complain_on_overflow. */
5357 reloc_nil, /* Special_function. */
5359 FALSE, /* Partial_inplace. */
5360 0xffffffff, /* Source mask. */
5361 0xffffffff, /* Dest mask. */
5362 FALSE), /* PC rel offset. */
5364 HOWTO (ALPHA_R_BSR, /* Type. */
5365 0, /* Rightshift. */
5366 3, /* Size (0 = byte, 1 = short, 2 = long). */
5368 TRUE, /* PC relative. */
5370 complain_overflow_dont,/* Complain_on_overflow. */
5371 reloc_nil, /* Special_function. */
5373 FALSE, /* Partial_inplace. */
5374 0xffffffff, /* Source mask. */
5375 0xffffffff, /* Dest mask. */
5376 FALSE), /* PC rel offset. */
5378 HOWTO (ALPHA_R_LDA, /* Type. */
5379 0, /* Rightshift. */
5380 3, /* Size (0 = byte, 1 = short, 2 = long). */
5382 FALSE, /* PC relative. */
5384 complain_overflow_dont,/* Complain_on_overflow. */
5385 reloc_nil, /* Special_function. */
5387 FALSE, /* Partial_inplace. */
5388 0xffffffff, /* Source mask. */
5389 0xffffffff, /* Dest mask. */
5390 FALSE), /* PC rel offset. */
5392 HOWTO (ALPHA_R_BOH, /* Type. */
5393 0, /* Rightshift. */
5394 3, /* Size (0 = byte, 1 = short, 2 = long, 3 = nil). */
5396 TRUE, /* PC relative. */
5398 complain_overflow_dont,/* Complain_on_overflow. */
5399 reloc_nil, /* Special_function. */
5401 FALSE, /* Partial_inplace. */
5402 0xffffffff, /* Source mask. */
5403 0xffffffff, /* Dest mask. */
5404 FALSE), /* PC rel offset. */
5407 /* Return a pointer to a howto structure which, when invoked, will perform
5408 the relocation code on data from the architecture noted. */
5410 static const struct reloc_howto_struct *
5411 alpha_vms_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
5412 bfd_reloc_code_real_type code)
5416 vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd, code));
5420 case BFD_RELOC_16: alpha_type = ALPHA_R_SREL16; break;
5421 case BFD_RELOC_32: alpha_type = ALPHA_R_REFLONG; break;
5422 case BFD_RELOC_64: alpha_type = ALPHA_R_REFQUAD; break;
5423 case BFD_RELOC_CTOR: alpha_type = ALPHA_R_REFQUAD; break;
5424 case BFD_RELOC_23_PCREL_S2: alpha_type = ALPHA_R_BRADDR; break;
5425 case BFD_RELOC_ALPHA_HINT: alpha_type = ALPHA_R_HINT; break;
5426 case BFD_RELOC_16_PCREL: alpha_type = ALPHA_R_SREL16; break;
5427 case BFD_RELOC_32_PCREL: alpha_type = ALPHA_R_SREL32; break;
5428 case BFD_RELOC_64_PCREL: alpha_type = ALPHA_R_SREL64; break;
5429 case BFD_RELOC_ALPHA_LINKAGE: alpha_type = ALPHA_R_LINKAGE; break;
5430 case BFD_RELOC_ALPHA_CODEADDR: alpha_type = ALPHA_R_CODEADDR; break;
5431 case BFD_RELOC_ALPHA_NOP: alpha_type = ALPHA_R_NOP; break;
5432 case BFD_RELOC_ALPHA_BSR: alpha_type = ALPHA_R_BSR; break;
5433 case BFD_RELOC_ALPHA_LDA: alpha_type = ALPHA_R_LDA; break;
5434 case BFD_RELOC_ALPHA_BOH: alpha_type = ALPHA_R_BOH; break;
5436 (*_bfd_error_handler) ("reloc (%d) is *UNKNOWN*", code);
5439 vms_debug2 ((2, "reloc is %s\n", alpha_howto_table[alpha_type].name));
5440 return & alpha_howto_table[alpha_type];
5443 static reloc_howto_type *
5444 alpha_vms_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
5450 i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
5452 if (alpha_howto_table[i].name != NULL
5453 && strcasecmp (alpha_howto_table[i].name, r_name) == 0)
5454 return &alpha_howto_table[i];
5460 alpha_vms_get_synthetic_symtab (bfd *abfd,
5461 long symcount ATTRIBUTE_UNUSED,
5462 asymbol **usyms ATTRIBUTE_UNUSED,
5463 long dynsymcount ATTRIBUTE_UNUSED,
5464 asymbol **dynsyms ATTRIBUTE_UNUSED,
5471 syms = (asymbol *) bfd_malloc (PRIV (norm_sym_count) * sizeof (asymbol));
5476 for (i = 0; i < PRIV (gsd_sym_count); i++)
5478 struct vms_symbol_entry *e = PRIV (syms)[i];
5489 flags = BSF_LOCAL | BSF_SYNTHETIC;
5495 if ((e->flags & EGSY__V_DEF) && (e->flags & EGSY__V_NORM))
5497 value = e->code_value;
5498 sec = PRIV (sections)[e->code_section];
5505 if ((e->flags & EGSY__V_DEF) && (e->flags & EGSY__V_NORM))
5510 value = e->code_value;
5512 /* Find containing section. */
5513 for (s = abfd->sections; s; s = s->next)
5517 && !(s->flags & SEC_COFF_SHARED_LIBRARY)
5518 && (s->size > 0 || !(e->flags & EGSY__V_REL)))
5535 sname = bfd_alloc (abfd, l + 5);
5538 memcpy (sname, name, l);
5539 memcpy (sname + l, "..en", 5);
5546 sym->udata.p = NULL;
5555 vms_time_to_str (unsigned char *buf)
5557 time_t t = vms_rawtime_to_time_t (buf);
5558 char *res = ctime (&t);
5561 res = "*invalid time*";
5568 evax_bfd_print_emh (FILE *file, unsigned char *rec, unsigned int rec_len)
5570 struct vms_emh_common *emh = (struct vms_emh_common *)rec;
5571 unsigned int subtype;
5573 subtype = (unsigned)bfd_getl16 (emh->subtyp);
5575 fprintf (file, _(" EMH %u (len=%u): "), subtype, rec_len);
5581 struct vms_emh_mhd *mhd = (struct vms_emh_mhd *)rec;
5584 fprintf (file, _("Module header\n"));
5585 fprintf (file, _(" structure level: %u\n"), mhd->strlvl);
5586 fprintf (file, _(" max record size: %u\n"),
5587 (unsigned)bfd_getl32 (mhd->recsiz));
5588 name = (char *)(mhd + 1);
5589 fprintf (file, _(" module name : %.*s\n"), name[0], name + 1);
5590 name += name[0] + 1;
5591 fprintf (file, _(" module version : %.*s\n"), name[0], name + 1);
5592 name += name[0] + 1;
5593 fprintf (file, _(" compile date : %.17s\n"), name);
5598 fprintf (file, _("Language Processor Name\n"));
5599 fprintf (file, _(" language name: %.*s\n"),
5600 (int)(rec_len - sizeof (struct vms_emh_common)),
5601 (char *)rec + sizeof (struct vms_emh_common));
5606 fprintf (file, _("Source Files Header\n"));
5607 fprintf (file, _(" file: %.*s\n"),
5608 (int)(rec_len - sizeof (struct vms_emh_common)),
5609 (char *)rec + sizeof (struct vms_emh_common));
5614 fprintf (file, _("Title Text Header\n"));
5615 fprintf (file, _(" title: %.*s\n"),
5616 (int)(rec_len - sizeof (struct vms_emh_common)),
5617 (char *)rec + sizeof (struct vms_emh_common));
5622 fprintf (file, _("Copyright Header\n"));
5623 fprintf (file, _(" copyright: %.*s\n"),
5624 (int)(rec_len - sizeof (struct vms_emh_common)),
5625 (char *)rec + sizeof (struct vms_emh_common));
5629 fprintf (file, _("unhandled emh subtype %u\n"), subtype);
5635 evax_bfd_print_eeom (FILE *file, unsigned char *rec, unsigned int rec_len)
5637 struct vms_eeom *eeom = (struct vms_eeom *)rec;
5639 fprintf (file, _(" EEOM (len=%u):\n"), rec_len);
5640 fprintf (file, _(" number of cond linkage pairs: %u\n"),
5641 (unsigned)bfd_getl32 (eeom->total_lps));
5642 fprintf (file, _(" completion code: %u\n"),
5643 (unsigned)bfd_getl16 (eeom->comcod));
5646 fprintf (file, _(" transfer addr flags: 0x%02x\n"), eeom->tfrflg);
5647 fprintf (file, _(" transfer addr psect: %u\n"),
5648 (unsigned)bfd_getl32 (eeom->psindx));
5649 fprintf (file, _(" transfer address : 0x%08x\n"),
5650 (unsigned)bfd_getl32 (eeom->tfradr));
5655 exav_bfd_print_egsy_flags (unsigned int flags, FILE *file)
5657 if (flags & EGSY__V_WEAK)
5658 fputs (_(" WEAK"), file);
5659 if (flags & EGSY__V_DEF)
5660 fputs (_(" DEF"), file);
5661 if (flags & EGSY__V_UNI)
5662 fputs (_(" UNI"), file);
5663 if (flags & EGSY__V_REL)
5664 fputs (_(" REL"), file);
5665 if (flags & EGSY__V_COMM)
5666 fputs (_(" COMM"), file);
5667 if (flags & EGSY__V_VECEP)
5668 fputs (_(" VECEP"), file);
5669 if (flags & EGSY__V_NORM)
5670 fputs (_(" NORM"), file);
5671 if (flags & EGSY__V_QUAD_VAL)
5672 fputs (_(" QVAL"), file);
5676 evax_bfd_print_egsd_flags (FILE *file, unsigned int flags)
5678 if (flags & EGPS__V_PIC)
5679 fputs (_(" PIC"), file);
5680 if (flags & EGPS__V_LIB)
5681 fputs (_(" LIB"), file);
5682 if (flags & EGPS__V_OVR)
5683 fputs (_(" OVR"), file);
5684 if (flags & EGPS__V_REL)
5685 fputs (_(" REL"), file);
5686 if (flags & EGPS__V_GBL)
5687 fputs (_(" GBL"), file);
5688 if (flags & EGPS__V_SHR)
5689 fputs (_(" SHR"), file);
5690 if (flags & EGPS__V_EXE)
5691 fputs (_(" EXE"), file);
5692 if (flags & EGPS__V_RD)
5693 fputs (_(" RD"), file);
5694 if (flags & EGPS__V_WRT)
5695 fputs (_(" WRT"), file);
5696 if (flags & EGPS__V_VEC)
5697 fputs (_(" VEC"), file);
5698 if (flags & EGPS__V_NOMOD)
5699 fputs (_(" NOMOD"), file);
5700 if (flags & EGPS__V_COM)
5701 fputs (_(" COM"), file);
5702 if (flags & EGPS__V_ALLOC_64BIT)
5703 fputs (_(" 64B"), file);
5707 evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len)
5709 unsigned int off = sizeof (struct vms_egsd);
5712 fprintf (file, _(" EGSD (len=%u):\n"), rec_len);
5715 for (off = sizeof (struct vms_egsd); off < rec_len; )
5717 struct vms_egsd_entry *e = (struct vms_egsd_entry *)(rec + off);
5721 type = (unsigned)bfd_getl16 (e->gsdtyp);
5722 len = (unsigned)bfd_getl16 (e->gsdsiz);
5724 fprintf (file, _(" EGSD entry %2u (type: %u, len: %u): "),
5732 struct vms_egps *egps = (struct vms_egps *)e;
5733 unsigned int flags = bfd_getl16 (egps->flags);
5736 fprintf (file, _("PSC - Program section definition\n"));
5737 fprintf (file, _(" alignment : 2**%u\n"), egps->align);
5738 fprintf (file, _(" flags : 0x%04x"), flags);
5739 evax_bfd_print_egsd_flags (file, flags);
5741 l = bfd_getl32 (egps->alloc);
5742 fprintf (file, _(" alloc (len): %u (0x%08x)\n"), l, l);
5743 fprintf (file, _(" name : %.*s\n"),
5744 egps->namlng, egps->name);
5749 struct vms_esgps *esgps = (struct vms_esgps *)e;
5750 unsigned int flags = bfd_getl16 (esgps->flags);
5753 fprintf (file, _("SPSC - Shared Image Program section def\n"));
5754 fprintf (file, _(" alignment : 2**%u\n"), esgps->align);
5755 fprintf (file, _(" flags : 0x%04x"), flags);
5756 evax_bfd_print_egsd_flags (file, flags);
5758 l = bfd_getl32 (esgps->alloc);
5759 fprintf (file, _(" alloc (len) : %u (0x%08x)\n"), l, l);
5760 fprintf (file, _(" image offset : 0x%08x\n"),
5761 (unsigned int)bfd_getl32 (esgps->base));
5762 fprintf (file, _(" symvec offset : 0x%08x\n"),
5763 (unsigned int)bfd_getl32 (esgps->value));
5764 fprintf (file, _(" name : %.*s\n"),
5765 esgps->namlng, esgps->name);
5770 struct vms_egsy *egsy = (struct vms_egsy *)e;
5771 unsigned int flags = bfd_getl16 (egsy->flags);
5773 if (flags & EGSY__V_DEF)
5775 struct vms_esdf *esdf = (struct vms_esdf *)e;
5777 fprintf (file, _("SYM - Global symbol definition\n"));
5778 fprintf (file, _(" flags: 0x%04x"), flags);
5779 exav_bfd_print_egsy_flags (flags, file);
5781 fprintf (file, _(" psect offset: 0x%08x\n"),
5782 (unsigned)bfd_getl32 (esdf->value));
5783 if (flags & EGSY__V_NORM)
5785 fprintf (file, _(" code address: 0x%08x\n"),
5786 (unsigned)bfd_getl32 (esdf->code_address));
5787 fprintf (file, _(" psect index for entry point : %u\n"),
5788 (unsigned)bfd_getl32 (esdf->ca_psindx));
5790 fprintf (file, _(" psect index : %u\n"),
5791 (unsigned)bfd_getl32 (esdf->psindx));
5792 fprintf (file, _(" name : %.*s\n"),
5793 esdf->namlng, esdf->name);
5797 struct vms_esrf *esrf = (struct vms_esrf *)e;
5799 fprintf (file, _("SYM - Global symbol reference\n"));
5800 fprintf (file, _(" name : %.*s\n"),
5801 esrf->namlng, esrf->name);
5807 struct vms_eidc *eidc = (struct vms_eidc *)e;
5808 unsigned int flags = bfd_getl32 (eidc->flags);
5811 fprintf (file, _("IDC - Ident Consistency check\n"));
5812 fprintf (file, _(" flags : 0x%08x"), flags);
5813 if (flags & EIDC__V_BINIDENT)
5814 fputs (" BINDENT", file);
5816 fprintf (file, _(" id match : %x\n"),
5817 (flags >> EIDC__V_IDMATCH_SH) & EIDC__V_IDMATCH_MASK);
5818 fprintf (file, _(" error severity: %x\n"),
5819 (flags >> EIDC__V_ERRSEV_SH) & EIDC__V_ERRSEV_MASK);
5821 fprintf (file, _(" entity name : %.*s\n"), p[0], p + 1);
5823 fprintf (file, _(" object name : %.*s\n"), p[0], p + 1);
5825 if (flags & EIDC__V_BINIDENT)
5826 fprintf (file, _(" binary ident : 0x%08x\n"),
5827 (unsigned)bfd_getl32 (p + 1));
5829 fprintf (file, _(" ascii ident : %.*s\n"), p[0], p + 1);
5834 struct vms_egst *egst = (struct vms_egst *)e;
5835 unsigned int flags = bfd_getl16 (egst->header.flags);
5837 fprintf (file, _("SYMG - Universal symbol definition\n"));
5838 fprintf (file, _(" flags: 0x%04x"), flags);
5839 exav_bfd_print_egsy_flags (flags, file);
5841 fprintf (file, _(" symbol vector offset: 0x%08x\n"),
5842 (unsigned)bfd_getl32 (egst->value));
5843 fprintf (file, _(" entry point: 0x%08x\n"),
5844 (unsigned)bfd_getl32 (egst->lp_1));
5845 fprintf (file, _(" proc descr : 0x%08x\n"),
5846 (unsigned)bfd_getl32 (egst->lp_2));
5847 fprintf (file, _(" psect index: %u\n"),
5848 (unsigned)bfd_getl32 (egst->psindx));
5849 fprintf (file, _(" name : %.*s\n"),
5850 egst->namlng, egst->name);
5855 struct vms_esdfv *esdfv = (struct vms_esdfv *)e;
5856 unsigned int flags = bfd_getl16 (esdfv->flags);
5858 fprintf (file, _("SYMV - Vectored symbol definition\n"));
5859 fprintf (file, _(" flags: 0x%04x"), flags);
5860 exav_bfd_print_egsy_flags (flags, file);
5862 fprintf (file, _(" vector : 0x%08x\n"),
5863 (unsigned)bfd_getl32 (esdfv->vector));
5864 fprintf (file, _(" psect offset: %u\n"),
5865 (unsigned)bfd_getl32 (esdfv->value));
5866 fprintf (file, _(" psect index : %u\n"),
5867 (unsigned)bfd_getl32 (esdfv->psindx));
5868 fprintf (file, _(" name : %.*s\n"),
5869 esdfv->namlng, esdfv->name);
5874 struct vms_esdfm *esdfm = (struct vms_esdfm *)e;
5875 unsigned int flags = bfd_getl16 (esdfm->flags);
5877 fprintf (file, _("SYMM - Global symbol definition with version\n"));
5878 fprintf (file, _(" flags: 0x%04x"), flags);
5879 exav_bfd_print_egsy_flags (flags, file);
5881 fprintf (file, _(" version mask: 0x%08x\n"),
5882 (unsigned)bfd_getl32 (esdfm->version_mask));
5883 fprintf (file, _(" psect offset: %u\n"),
5884 (unsigned)bfd_getl32 (esdfm->value));
5885 fprintf (file, _(" psect index : %u\n"),
5886 (unsigned)bfd_getl32 (esdfm->psindx));
5887 fprintf (file, _(" name : %.*s\n"),
5888 esdfm->namlng, esdfm->name);
5892 fprintf (file, _("unhandled egsd entry type %u\n"), type);
5900 evax_bfd_print_hex (FILE *file, const char *pfx,
5901 const unsigned char *buf, unsigned int len)
5907 for (i = 0; i < len; i++)
5911 fprintf (file, " %02x", buf[i]);
5924 evax_bfd_print_etir_stc_ir (FILE *file, const unsigned char *buf, int is_ps)
5926 fprintf (file, _(" linkage index: %u, replacement insn: 0x%08x\n"),
5927 (unsigned)bfd_getl32 (buf),
5928 (unsigned)bfd_getl32 (buf + 16));
5929 fprintf (file, _(" psect idx 1: %u, offset 1: 0x%08x %08x\n"),
5930 (unsigned)bfd_getl32 (buf + 4),
5931 (unsigned)bfd_getl32 (buf + 12),
5932 (unsigned)bfd_getl32 (buf + 8));
5933 fprintf (file, _(" psect idx 2: %u, offset 2: 0x%08x %08x\n"),
5934 (unsigned)bfd_getl32 (buf + 20),
5935 (unsigned)bfd_getl32 (buf + 28),
5936 (unsigned)bfd_getl32 (buf + 24));
5938 fprintf (file, _(" psect idx 3: %u, offset 3: 0x%08x %08x\n"),
5939 (unsigned)bfd_getl32 (buf + 32),
5940 (unsigned)bfd_getl32 (buf + 40),
5941 (unsigned)bfd_getl32 (buf + 36));
5943 fprintf (file, _(" global name: %.*s\n"), buf[32], buf + 33);
5947 evax_bfd_print_etir (FILE *file, const char *name,
5948 unsigned char *rec, unsigned int rec_len)
5950 unsigned int off = sizeof (struct vms_egsd);
5951 unsigned int sec_len;
5953 fprintf (file, _(" %s (len=%u+%u):\n"), name,
5954 (unsigned)(rec_len - sizeof (struct vms_eobjrec)),
5955 (unsigned)sizeof (struct vms_eobjrec));
5957 for (off = sizeof (struct vms_eobjrec); off < rec_len; )
5959 struct vms_etir *etir = (struct vms_etir *)(rec + off);
5964 type = bfd_getl16 (etir->rectyp);
5965 size = bfd_getl16 (etir->size);
5966 buf = rec + off + sizeof (struct vms_etir);
5968 fprintf (file, _(" (type: %3u, size: 4+%3u): "), type, size - 4);
5971 case ETIR__C_STA_GBL:
5972 fprintf (file, _("STA_GBL (stack global) %.*s\n"),
5975 case ETIR__C_STA_LW:
5976 fprintf (file, _("STA_LW (stack longword) 0x%08x\n"),
5977 (unsigned)bfd_getl32 (buf));
5979 case ETIR__C_STA_QW:
5980 fprintf (file, _("STA_QW (stack quadword) 0x%08x %08x\n"),
5981 (unsigned)bfd_getl32 (buf + 4),
5982 (unsigned)bfd_getl32 (buf + 0));
5984 case ETIR__C_STA_PQ:
5985 fprintf (file, _("STA_PQ (stack psect base + offset)\n"));
5986 fprintf (file, _(" psect: %u, offset: 0x%08x %08x\n"),
5987 (unsigned)bfd_getl32 (buf + 0),
5988 (unsigned)bfd_getl32 (buf + 8),
5989 (unsigned)bfd_getl32 (buf + 4));
5991 case ETIR__C_STA_LI:
5992 fprintf (file, _("STA_LI (stack literal)\n"));
5994 case ETIR__C_STA_MOD:
5995 fprintf (file, _("STA_MOD (stack module)\n"));
5997 case ETIR__C_STA_CKARG:
5998 fprintf (file, _("STA_CKARG (compare procedure argument)\n"));
6002 fprintf (file, _("STO_B (store byte)\n"));
6005 fprintf (file, _("STO_W (store word)\n"));
6007 case ETIR__C_STO_LW:
6008 fprintf (file, _("STO_LW (store longword)\n"));
6010 case ETIR__C_STO_QW:
6011 fprintf (file, _("STO_QW (store quadword)\n"));
6013 case ETIR__C_STO_IMMR:
6015 unsigned int len = bfd_getl32 (buf);
6017 _("STO_IMMR (store immediate repeat) %u bytes\n"),
6019 evax_bfd_print_hex (file, " ", buf + 4, len);
6023 case ETIR__C_STO_GBL:
6024 fprintf (file, _("STO_GBL (store global) %.*s\n"),
6027 case ETIR__C_STO_CA:
6028 fprintf (file, _("STO_CA (store code address) %.*s\n"),
6031 case ETIR__C_STO_RB:
6032 fprintf (file, _("STO_RB (store relative branch)\n"));
6034 case ETIR__C_STO_AB:
6035 fprintf (file, _("STO_AB (store absolute branch)\n"));
6037 case ETIR__C_STO_OFF:
6038 fprintf (file, _("STO_OFF (store offset to psect)\n"));
6040 case ETIR__C_STO_IMM:
6042 unsigned int len = bfd_getl32 (buf);
6044 _("STO_IMM (store immediate) %u bytes\n"),
6046 evax_bfd_print_hex (file, " ", buf + 4, len);
6050 case ETIR__C_STO_LP_PSB:
6051 fprintf (file, _("STO_OFF (store LP with procedure signature)\n"));
6053 case ETIR__C_STO_HINT_GBL:
6054 fprintf (file, _("STO_BR_GBL (store branch global) *todo*\n"));
6056 case ETIR__C_STO_HINT_PS:
6057 fprintf (file, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6060 case ETIR__C_OPR_NOP:
6061 fprintf (file, _("OPR_NOP (no-operation)\n"));
6063 case ETIR__C_OPR_ADD:
6064 fprintf (file, _("OPR_ADD (add)\n"));
6066 case ETIR__C_OPR_SUB:
6067 fprintf (file, _("OPR_SUB (substract)\n"));
6069 case ETIR__C_OPR_MUL:
6070 fprintf (file, _("OPR_MUL (multiply)\n"));
6072 case ETIR__C_OPR_DIV:
6073 fprintf (file, _("OPR_DIV (divide)\n"));
6075 case ETIR__C_OPR_AND:
6076 fprintf (file, _("OPR_AND (logical and)\n"));
6078 case ETIR__C_OPR_IOR:
6079 fprintf (file, _("OPR_IOR (logical inclusive or)\n"));
6081 case ETIR__C_OPR_EOR:
6082 fprintf (file, _("OPR_EOR (logical exclusive or)\n"));
6084 case ETIR__C_OPR_NEG:
6085 fprintf (file, _("OPR_NEG (negate)\n"));
6087 case ETIR__C_OPR_COM:
6088 fprintf (file, _("OPR_COM (complement)\n"));
6090 case ETIR__C_OPR_INSV:
6091 fprintf (file, _("OPR_INSV (insert field)\n"));
6093 case ETIR__C_OPR_ASH:
6094 fprintf (file, _("OPR_ASH (arithmetic shift)\n"));
6096 case ETIR__C_OPR_USH:
6097 fprintf (file, _("OPR_USH (unsigned shift)\n"));
6099 case ETIR__C_OPR_ROT:
6100 fprintf (file, _("OPR_ROT (rotate)\n"));
6102 case ETIR__C_OPR_SEL:
6103 fprintf (file, _("OPR_SEL (select)\n"));
6105 case ETIR__C_OPR_REDEF:
6106 fprintf (file, _("OPR_REDEF (redefine symbol to curr location)\n"));
6108 case ETIR__C_OPR_DFLIT:
6109 fprintf (file, _("OPR_REDEF (define a literal)\n"));
6112 case ETIR__C_STC_LP:
6113 fprintf (file, _("STC_LP (store cond linkage pair)\n"));
6115 case ETIR__C_STC_LP_PSB:
6117 _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6118 fprintf (file, _(" linkage index: %u, procedure: %.*s\n"),
6119 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6120 buf += 4 + 1 + buf[4];
6121 fprintf (file, _(" signature: %.*s\n"), buf[0], buf + 1);
6123 case ETIR__C_STC_GBL:
6124 fprintf (file, _("STC_GBL (store cond global)\n"));
6125 fprintf (file, _(" linkage index: %u, global: %.*s\n"),
6126 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6128 case ETIR__C_STC_GCA:
6129 fprintf (file, _("STC_GCA (store cond code address)\n"));
6130 fprintf (file, _(" linkage index: %u, procedure name: %.*s\n"),
6131 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6133 case ETIR__C_STC_PS:
6134 fprintf (file, _("STC_PS (store cond psect + offset)\n"));
6136 _(" linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6137 (unsigned)bfd_getl32 (buf),
6138 (unsigned)bfd_getl32 (buf + 4),
6139 (unsigned)bfd_getl32 (buf + 12),
6140 (unsigned)bfd_getl32 (buf + 8));
6142 case ETIR__C_STC_NOP_GBL:
6143 fprintf (file, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6144 evax_bfd_print_etir_stc_ir (file, buf, 0);
6146 case ETIR__C_STC_NOP_PS:
6147 fprintf (file, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6148 evax_bfd_print_etir_stc_ir (file, buf, 1);
6150 case ETIR__C_STC_BSR_GBL:
6151 fprintf (file, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6152 evax_bfd_print_etir_stc_ir (file, buf, 0);
6154 case ETIR__C_STC_BSR_PS:
6155 fprintf (file, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6156 evax_bfd_print_etir_stc_ir (file, buf, 1);
6158 case ETIR__C_STC_LDA_GBL:
6159 fprintf (file, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6160 evax_bfd_print_etir_stc_ir (file, buf, 0);
6162 case ETIR__C_STC_LDA_PS:
6163 fprintf (file, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6164 evax_bfd_print_etir_stc_ir (file, buf, 1);
6166 case ETIR__C_STC_BOH_GBL:
6167 fprintf (file, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6168 evax_bfd_print_etir_stc_ir (file, buf, 0);
6170 case ETIR__C_STC_BOH_PS:
6171 fprintf (file, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6172 evax_bfd_print_etir_stc_ir (file, buf, 1);
6174 case ETIR__C_STC_NBH_GBL:
6176 _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6178 case ETIR__C_STC_NBH_PS:
6180 _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6183 case ETIR__C_CTL_SETRB:
6184 fprintf (file, _("CTL_SETRB (set relocation base)\n"));
6187 case ETIR__C_CTL_AUGRB:
6189 unsigned int val = bfd_getl32 (buf);
6190 fprintf (file, _("CTL_AUGRB (augment relocation base) %u\n"), val);
6193 case ETIR__C_CTL_DFLOC:
6194 fprintf (file, _("CTL_DFLOC (define location)\n"));
6196 case ETIR__C_CTL_STLOC:
6197 fprintf (file, _("CTL_STLOC (set location)\n"));
6199 case ETIR__C_CTL_STKDL:
6200 fprintf (file, _("CTL_STKDL (stack defined location)\n"));
6203 fprintf (file, _("*unhandled*\n"));
6211 evax_bfd_print_eobj (struct bfd *abfd, FILE *file)
6213 bfd_boolean is_first = TRUE;
6214 bfd_boolean has_records = FALSE;
6218 unsigned int rec_len;
6219 unsigned int pad_len;
6221 unsigned int hdr_size;
6226 unsigned char buf[6];
6231 if (bfd_bread (buf, sizeof (buf), abfd) != sizeof (buf))
6233 fprintf (file, _("cannot read GST record length\n"));
6236 rec_len = bfd_getl16 (buf + 0);
6237 if (rec_len == bfd_getl16 (buf + 4)
6238 && bfd_getl16 (buf + 2) == EOBJ__C_EMH)
6240 /* The format is raw: record-size, type, record-size. */
6242 pad_len = (rec_len + 1) & ~1U;
6245 else if (rec_len == EOBJ__C_EMH)
6247 has_records = FALSE;
6248 pad_len = bfd_getl16 (buf + 2);
6254 fprintf (file, _("cannot find EMH in first GST record\n"));
6257 rec = bfd_malloc (pad_len);
6258 memcpy (rec, buf + sizeof (buf) - hdr_size, hdr_size);
6262 unsigned int rec_len2 = 0;
6263 unsigned char hdr[4];
6267 unsigned char buf_len[2];
6269 if (bfd_bread (buf_len, sizeof (buf_len), abfd)
6270 != sizeof (buf_len))
6272 fprintf (file, _("cannot read GST record length\n"));
6275 rec_len2 = (unsigned)bfd_getl16 (buf_len);
6278 if (bfd_bread (hdr, sizeof (hdr), abfd) != sizeof (hdr))
6280 fprintf (file, _("cannot read GST record header\n"));
6283 rec_len = (unsigned)bfd_getl16 (hdr + 2);
6285 pad_len = (rec_len + 1) & ~1U;
6288 rec = bfd_malloc (pad_len);
6289 memcpy (rec, hdr, sizeof (hdr));
6290 hdr_size = sizeof (hdr);
6291 if (has_records && rec_len2 != rec_len)
6293 fprintf (file, _(" corrupted GST\n"));
6298 if (bfd_bread (rec + hdr_size, pad_len - hdr_size, abfd)
6299 != pad_len - hdr_size)
6301 fprintf (file, _("cannot read GST record\n"));
6305 type = (unsigned)bfd_getl16 (rec);
6310 evax_bfd_print_emh (file, rec, rec_len);
6313 evax_bfd_print_egsd (file, rec, rec_len);
6316 evax_bfd_print_eeom (file, rec, rec_len);
6321 evax_bfd_print_etir (file, "ETIR", rec, rec_len);
6324 evax_bfd_print_etir (file, "EDBG", rec, rec_len);
6327 evax_bfd_print_etir (file, "ETBT", rec, rec_len);
6330 fprintf (file, _(" unhandled EOBJ record type %u\n"), type);
6338 evax_bfd_print_relocation_records (FILE *file, const unsigned char *rel,
6339 unsigned int stride)
6347 count = bfd_getl32 (rel + 0);
6351 base = bfd_getl32 (rel + 4);
6353 fprintf (file, _(" bitcount: %u, base addr: 0x%08x\n"),
6357 for (j = 0; count > 0; j += 4, count -= 32)
6363 val = bfd_getl32 (rel);
6366 fprintf (file, _(" bitmap: 0x%08x (count: %u):\n"), val, count);
6368 for (k = 0; k < 32; k++)
6373 fprintf (file, _(" %08x"), base + (j * 8 + k) * stride);
6388 evax_bfd_print_address_fixups (FILE *file, const unsigned char *rel)
6395 count = bfd_getl32 (rel + 0);
6398 fprintf (file, _(" image %u (%u entries)\n"),
6399 (unsigned)bfd_getl32 (rel + 4), count);
6401 for (j = 0; j < count; j++)
6403 fprintf (file, _(" offset: 0x%08x, val: 0x%08x\n"),
6404 (unsigned)bfd_getl32 (rel + 0),
6405 (unsigned)bfd_getl32 (rel + 4));
6412 evax_bfd_print_reference_fixups (FILE *file, const unsigned char *rel)
6421 count = bfd_getl32 (rel + 0);
6424 fprintf (file, _(" image %u (%u entries), offsets:\n"),
6425 (unsigned)bfd_getl32 (rel + 4), count);
6427 for (j = 0; j < count; j++)
6431 fprintf (file, _(" 0x%08x"), (unsigned)bfd_getl32 (rel));
6446 evax_bfd_print_indent (int indent, FILE *file)
6448 for (; indent; indent--)
6453 evax_bfd_get_dsc_name (unsigned int v)
6457 case DSC__K_DTYPE_Z:
6458 return "Z (Unspecified)";
6459 case DSC__K_DTYPE_V:
6461 case DSC__K_DTYPE_BU:
6462 return "BU (Byte logical)";
6463 case DSC__K_DTYPE_WU:
6464 return "WU (Word logical)";
6465 case DSC__K_DTYPE_LU:
6466 return "LU (Longword logical)";
6467 case DSC__K_DTYPE_QU:
6468 return "QU (Quadword logical)";
6469 case DSC__K_DTYPE_B:
6470 return "B (Byte integer)";
6471 case DSC__K_DTYPE_W:
6472 return "W (Word integer)";
6473 case DSC__K_DTYPE_L:
6474 return "L (Longword integer)";
6475 case DSC__K_DTYPE_Q:
6476 return "Q (Quadword integer)";
6477 case DSC__K_DTYPE_F:
6478 return "F (Single-precision floating)";
6479 case DSC__K_DTYPE_D:
6480 return "D (Double-precision floating)";
6481 case DSC__K_DTYPE_FC:
6482 return "FC (Complex)";
6483 case DSC__K_DTYPE_DC:
6484 return "DC (Double-precision Complex)";
6485 case DSC__K_DTYPE_T:
6486 return "T (ASCII text string)";
6487 case DSC__K_DTYPE_NU:
6488 return "NU (Numeric string, unsigned)";
6489 case DSC__K_DTYPE_NL:
6490 return "NL (Numeric string, left separate sign)";
6491 case DSC__K_DTYPE_NLO:
6492 return "NLO (Numeric string, left overpunched sign)";
6493 case DSC__K_DTYPE_NR:
6494 return "NR (Numeric string, right separate sign)";
6495 case DSC__K_DTYPE_NRO:
6496 return "NRO (Numeric string, right overpunched sig)";
6497 case DSC__K_DTYPE_NZ:
6498 return "NZ (Numeric string, zoned sign)";
6499 case DSC__K_DTYPE_P:
6500 return "P (Packed decimal string)";
6501 case DSC__K_DTYPE_ZI:
6502 return "ZI (Sequence of instructions)";
6503 case DSC__K_DTYPE_ZEM:
6504 return "ZEM (Procedure entry mask)";
6505 case DSC__K_DTYPE_DSC:
6506 return "DSC (Descriptor, used for arrays of dyn strings)";
6507 case DSC__K_DTYPE_OU:
6508 return "OU (Octaword logical)";
6509 case DSC__K_DTYPE_O:
6510 return "O (Octaword integer)";
6511 case DSC__K_DTYPE_G:
6512 return "G (Double precision G floating, 64 bit)";
6513 case DSC__K_DTYPE_H:
6514 return "H (Quadruple precision floating, 128 bit)";
6515 case DSC__K_DTYPE_GC:
6516 return "GC (Double precision complex, G floating)";
6517 case DSC__K_DTYPE_HC:
6518 return "HC (Quadruple precision complex, H floating)";
6519 case DSC__K_DTYPE_CIT:
6520 return "CIT (COBOL intermediate temporary)";
6521 case DSC__K_DTYPE_BPV:
6522 return "BPV (Bound Procedure Value)";
6523 case DSC__K_DTYPE_BLV:
6524 return "BLV (Bound Label Value)";
6525 case DSC__K_DTYPE_VU:
6526 return "VU (Bit Unaligned)";
6527 case DSC__K_DTYPE_ADT:
6528 return "ADT (Absolute Date-Time)";
6529 case DSC__K_DTYPE_VT:
6530 return "VT (Varying Text)";
6531 case DSC__K_DTYPE_T2:
6532 return "T2 (16-bit char)";
6533 case DSC__K_DTYPE_VT2:
6534 return "VT2 (16-bit varying char)";
6536 return "?? (unknown)";
6541 evax_bfd_print_desc (const unsigned char *buf, int indent, FILE *file)
6543 unsigned char bclass = buf[3];
6544 unsigned char dtype = buf[2];
6545 unsigned int len = (unsigned)bfd_getl16 (buf);
6546 unsigned int pointer = (unsigned)bfd_getl32 (buf + 4);
6548 evax_bfd_print_indent (indent, file);
6550 if (len == 1 && pointer == 0xffffffffUL)
6553 fprintf (file, _("64 bits *unhandled*\n"));
6557 fprintf (file, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
6558 bclass, dtype, len, pointer);
6561 case DSC__K_CLASS_NCA:
6563 const struct vms_dsc_nca *dsc = (const void *)buf;
6565 const unsigned char *b;
6567 evax_bfd_print_indent (indent, file);
6568 fprintf (file, _("non-contiguous array of %s\n"),
6569 evax_bfd_get_dsc_name (dsc->dtype));
6570 evax_bfd_print_indent (indent + 1, file);
6572 _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
6573 dsc->dimct, dsc->aflags, dsc->digits, dsc->scale);
6574 evax_bfd_print_indent (indent + 1, file);
6576 _("arsize: %u, a0: 0x%08x\n"),
6577 (unsigned)bfd_getl32 (dsc->arsize),
6578 (unsigned)bfd_getl32 (dsc->a0));
6579 evax_bfd_print_indent (indent + 1, file);
6580 fprintf (file, _("Strides:\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]: %u\n"), i + 1,
6586 (unsigned)bfd_getl32 (b));
6589 evax_bfd_print_indent (indent + 1, file);
6590 fprintf (file, _("Bounds:\n"));
6591 b = buf + sizeof (*dsc);
6592 for (i = 0; i < dsc->dimct; i++)
6594 evax_bfd_print_indent (indent + 2, file);
6595 fprintf (file, _("[%u]: Lower: %u, upper: %u\n"), i + 1,
6596 (unsigned)bfd_getl32 (b + 0),
6597 (unsigned)bfd_getl32 (b + 4));
6602 case DSC__K_CLASS_UBS:
6604 const struct vms_dsc_ubs *ubs = (const void *)buf;
6606 evax_bfd_print_indent (indent, file);
6607 fprintf (file, _("unaligned bit-string of %s\n"),
6608 evax_bfd_get_dsc_name (ubs->dtype));
6609 evax_bfd_print_indent (indent + 1, file);
6611 _("base: %u, pos: %u\n"),
6612 (unsigned)bfd_getl32 (ubs->base),
6613 (unsigned)bfd_getl32 (ubs->pos));
6617 fprintf (file, _("*unhandled*\n"));
6624 evax_bfd_print_valspec (const unsigned char *buf, int indent, FILE *file)
6626 unsigned int vflags = buf[0];
6627 unsigned int value = (unsigned)bfd_getl32 (buf + 1);
6628 unsigned int len = 5;
6630 evax_bfd_print_indent (indent, file);
6631 fprintf (file, _("vflags: 0x%02x, value: 0x%08x "), vflags, value);
6636 case DST__K_VFLAGS_NOVAL:
6637 fprintf (file, _("(no value)\n"));
6639 case DST__K_VFLAGS_NOTACTIVE:
6640 fprintf (file, _("(not active)\n"));
6642 case DST__K_VFLAGS_UNALLOC:
6643 fprintf (file, _("(not allocated)\n"));
6645 case DST__K_VFLAGS_DSC:
6646 fprintf (file, _("(descriptor)\n"));
6647 evax_bfd_print_desc (buf + value, indent + 1, file);
6649 case DST__K_VFLAGS_TVS:
6650 fprintf (file, _("(trailing value)\n"));
6652 case DST__K_VS_FOLLOWS:
6653 fprintf (file, _("(value spec follows)\n"));
6655 case DST__K_VFLAGS_BITOFFS:
6656 fprintf (file, _("(at bit offset %u)\n"), value);
6659 fprintf (file, _("(reg: %u, disp: %u, indir: %u, kind: "),
6660 (vflags & DST__K_REGNUM_MASK) >> DST__K_REGNUM_SHIFT,
6661 vflags & DST__K_DISP ? 1 : 0,
6662 vflags & DST__K_INDIR ? 1 : 0);
6663 switch (vflags & DST__K_VALKIND_MASK)
6665 case DST__K_VALKIND_LITERAL:
6666 fputs (_("literal"), file);
6668 case DST__K_VALKIND_ADDR:
6669 fputs (_("address"), file);
6671 case DST__K_VALKIND_DESC:
6672 fputs (_("desc"), file);
6674 case DST__K_VALKIND_REG:
6675 fputs (_("reg"), file);
6678 fputs (")\n", file);
6685 evax_bfd_print_typspec (const unsigned char *buf, int indent, FILE *file)
6687 unsigned char kind = buf[2];
6688 unsigned int len = (unsigned)bfd_getl16 (buf);
6690 evax_bfd_print_indent (indent, file);
6691 fprintf (file, ("len: %2u, kind: %2u "), len, kind);
6695 case DST__K_TS_ATOM:
6696 fprintf (file, ("atomic, type=0x%02x %s\n"),
6697 buf[0], evax_bfd_get_dsc_name (buf[0]));
6700 fprintf (file, ("indirect, defined at 0x%08x\n"),
6701 (unsigned)bfd_getl32 (buf));
6703 case DST__K_TS_TPTR:
6704 fprintf (file, ("typed pointer\n"));
6705 evax_bfd_print_typspec (buf, indent + 1, file);
6708 fprintf (file, ("pointer\n"));
6710 case DST__K_TS_ARRAY:
6712 const unsigned char *vs;
6713 unsigned int vec_len;
6716 fprintf (file, ("array, dim: %u, bitmap: "), buf[0]);
6717 vec_len = (buf[0] + 1 + 7) / 8;
6718 for (i = 0; i < vec_len; i++)
6719 fprintf (file, " %02x", buf[i + 1]);
6721 vs = buf + 1 + vec_len;
6722 evax_bfd_print_indent (indent, file);
6723 fprintf (file, ("array descriptor:\n"));
6724 vs += evax_bfd_print_valspec (vs, indent + 1, file);
6725 for (i = 0; i < buf[0] + 1U; i++)
6726 if (buf[1 + i / 8] & (1 << (i % 8)))
6728 evax_bfd_print_indent (indent, file);
6730 fprintf (file, ("type spec for element:\n"));
6732 fprintf (file, ("type spec for subscript %u:\n"), i);
6733 evax_bfd_print_typspec (vs, indent + 1, file);
6734 vs += bfd_getl16 (vs);
6739 fprintf (file, ("*unhandled*\n"));
6744 evax_bfd_print_dst (struct bfd *abfd, unsigned int dst_size, FILE *file)
6746 unsigned int off = 0;
6747 unsigned int pc = 0;
6748 unsigned int line = 0;
6750 fprintf (file, _("Debug symbol table:\n"));
6752 while (dst_size > 0)
6754 struct vms_dst_header dsth;
6759 if (bfd_bread (&dsth, sizeof (dsth), abfd) != sizeof (dsth))
6761 fprintf (file, _("cannot read DST header\n"));
6764 len = bfd_getl16 (dsth.length);
6765 type = bfd_getl16 (dsth.type);
6766 fprintf (file, _(" type: %3u, len: %3u (at 0x%08x): "),
6776 len -= sizeof (dsth);
6777 buf = bfd_malloc (len);
6778 if (bfd_bread (buf, len, abfd) != len)
6780 fprintf (file, _("cannot read DST symbol\n"));
6785 case DSC__K_DTYPE_V:
6786 case DSC__K_DTYPE_BU:
6787 case DSC__K_DTYPE_WU:
6788 case DSC__K_DTYPE_LU:
6789 case DSC__K_DTYPE_QU:
6790 case DSC__K_DTYPE_B:
6791 case DSC__K_DTYPE_W:
6792 case DSC__K_DTYPE_L:
6793 case DSC__K_DTYPE_Q:
6794 case DSC__K_DTYPE_F:
6795 case DSC__K_DTYPE_D:
6796 case DSC__K_DTYPE_FC:
6797 case DSC__K_DTYPE_DC:
6798 case DSC__K_DTYPE_T:
6799 case DSC__K_DTYPE_NU:
6800 case DSC__K_DTYPE_NL:
6801 case DSC__K_DTYPE_NLO:
6802 case DSC__K_DTYPE_NR:
6803 case DSC__K_DTYPE_NRO:
6804 case DSC__K_DTYPE_NZ:
6805 case DSC__K_DTYPE_P:
6806 case DSC__K_DTYPE_ZI:
6807 case DSC__K_DTYPE_ZEM:
6808 case DSC__K_DTYPE_DSC:
6809 case DSC__K_DTYPE_OU:
6810 case DSC__K_DTYPE_O:
6811 case DSC__K_DTYPE_G:
6812 case DSC__K_DTYPE_H:
6813 case DSC__K_DTYPE_GC:
6814 case DSC__K_DTYPE_HC:
6815 case DSC__K_DTYPE_CIT:
6816 case DSC__K_DTYPE_BPV:
6817 case DSC__K_DTYPE_BLV:
6818 case DSC__K_DTYPE_VU:
6819 case DSC__K_DTYPE_ADT:
6820 case DSC__K_DTYPE_VT:
6821 case DSC__K_DTYPE_T2:
6822 case DSC__K_DTYPE_VT2:
6823 fprintf (file, _("standard data: %s\n"),
6824 evax_bfd_get_dsc_name (type));
6825 evax_bfd_print_valspec (buf, 4, file);
6826 fprintf (file, _(" name: %.*s\n"), buf[5], buf + 6);
6830 struct vms_dst_modbeg *dst = (void *)buf;
6831 const char *name = (const char *)buf + sizeof (*dst);
6833 fprintf (file, _("modbeg\n"));
6834 fprintf (file, _(" flags: %d, language: %u, "
6835 "major: %u, minor: %u\n"),
6837 (unsigned)bfd_getl32 (dst->language),
6838 (unsigned)bfd_getl16 (dst->major),
6839 (unsigned)bfd_getl16 (dst->minor));
6840 fprintf (file, _(" module name: %.*s\n"),
6842 name += name[0] + 1;
6843 fprintf (file, _(" compiler : %.*s\n"),
6848 fprintf (file, _("modend\n"));
6852 struct vms_dst_rtnbeg *dst = (void *)buf;
6853 const char *name = (const char *)buf + sizeof (*dst);
6855 fputs (_("rtnbeg\n"), file);
6856 fprintf (file, _(" flags: %u, address: 0x%08x, "
6857 "pd-address: 0x%08x\n"),
6859 (unsigned)bfd_getl32 (dst->address),
6860 (unsigned)bfd_getl32 (dst->pd_address));
6861 fprintf (file, _(" routine name: %.*s\n"),
6867 struct vms_dst_rtnend *dst = (void *)buf;
6869 fprintf (file, _("rtnend: size 0x%08x\n"),
6870 (unsigned)bfd_getl32 (dst->size));
6875 struct vms_dst_prolog *dst = (void *)buf;
6877 fprintf (file, _("prolog: bkpt address 0x%08x\n"),
6878 (unsigned)bfd_getl32 (dst->bkpt_addr));
6883 struct vms_dst_epilog *dst = (void *)buf;
6885 fprintf (file, _("epilog: flags: %u, count: %u\n"),
6886 dst->flags, (unsigned)bfd_getl32 (dst->count));
6891 struct vms_dst_blkbeg *dst = (void *)buf;
6892 const char *name = (const char *)buf + sizeof (*dst);
6894 fprintf (file, _("blkbeg: address: 0x%08x, name: %.*s\n"),
6895 (unsigned)bfd_getl32 (dst->address),
6901 struct vms_dst_blkend *dst = (void *)buf;
6903 fprintf (file, _("blkend: size: 0x%08x\n"),
6904 (unsigned)bfd_getl32 (dst->size));
6907 case DST__K_TYPSPEC:
6909 fprintf (file, _("typspec (len: %u)\n"), len);
6910 fprintf (file, _(" name: %.*s\n"), buf[0], buf + 1);
6911 evax_bfd_print_typspec (buf + 1 + buf[0], 5, file);
6916 fprintf (file, _("septyp, name: %.*s\n"), buf[5], buf + 6);
6917 evax_bfd_print_valspec (buf, 4, file);
6922 struct vms_dst_recbeg *recbeg = (void *)buf;
6923 const char *name = (const char *)buf + sizeof (*recbeg);
6925 fprintf (file, _("recbeg: name: %.*s\n"), name[0], name + 1);
6926 evax_bfd_print_valspec (buf, 4, file);
6927 fprintf (file, (" len: %u bits\n"),
6928 (unsigned)bfd_getl32 (name + 1 + name[0]));
6932 fprintf (file, _("recend\n"));
6934 case DST__K_ENUMBEG:
6935 fprintf (file, _("enumbeg, len: %u, name: %.*s\n"),
6936 buf[0], buf[1], buf + 2);
6938 case DST__K_ENUMELT:
6939 fprintf (file, _("enumelt, name: %.*s\n"), buf[5], buf + 6);
6940 evax_bfd_print_valspec (buf, 4, file);
6942 case DST__K_ENUMEND:
6943 fprintf (file, _("enumend\n"));
6947 struct vms_dst_label *lab = (void *)buf;
6948 fprintf (file, ("label, name: %.*s\n"),
6949 lab->name[0], lab->name + 1);
6950 fprintf (file, (" address: 0x%08x\n"),
6951 (unsigned)bfd_getl32 (lab->value));
6954 case DST__K_DIS_RANGE:
6956 unsigned int cnt = bfd_getl32 (buf);
6957 unsigned char *rng = buf + 4;
6960 fprintf (file, _("discontiguous range (nbr: %u)\n"), cnt);
6961 for (i = 0; i < cnt; i++, rng += 8)
6962 fprintf (file, _(" address: 0x%08x, size: %u\n"),
6963 (unsigned)bfd_getl32 (rng),
6964 (unsigned)bfd_getl32 (rng + 4));
6968 case DST__K_LINE_NUM:
6970 unsigned char *buf_orig = buf;
6972 fprintf (file, _("line num (len: %u)\n"), len);
6977 unsigned char cmdlen;
6987 case DST__K_DELTA_PC_W:
6988 val = bfd_getl16 (buf + 1);
6989 fprintf (file, _("delta_pc_w %u\n"), val);
6994 case DST__K_INCR_LINUM:
6996 fprintf (file, _("incr_linum(b): +%u\n"), val);
7000 case DST__K_INCR_LINUM_W:
7001 val = bfd_getl16 (buf + 1);
7002 fprintf (file, _("incr_linum_w: +%u\n"), val);
7006 case DST__K_INCR_LINUM_L:
7007 val = bfd_getl32 (buf + 1);
7008 fprintf (file, _("incr_linum_l: +%u\n"), val);
7012 case DST__K_SET_LINUM:
7013 line = bfd_getl16 (buf + 1);
7014 fprintf (file, _("set_line_num(w) %u\n"), line);
7017 case DST__K_SET_LINUM_B:
7019 fprintf (file, _("set_line_num_b %u\n"), line);
7022 case DST__K_SET_LINUM_L:
7023 line = bfd_getl32 (buf + 1);
7024 fprintf (file, _("set_line_num_l %u\n"), line);
7027 case DST__K_SET_ABS_PC:
7028 pc = bfd_getl32 (buf + 1);
7029 fprintf (file, _("set_abs_pc: 0x%08x\n"), pc);
7032 case DST__K_DELTA_PC_L:
7033 fprintf (file, _("delta_pc_l: +0x%08x\n"),
7034 (unsigned)bfd_getl32 (buf + 1));
7038 fprintf (file, _("term(b): 0x%02x"), buf[1]);
7040 fprintf (file, _(" pc: 0x%08x\n"), pc);
7044 val = bfd_getl16 (buf + 1);
7045 fprintf (file, _("term_w: 0x%04x"), val);
7047 fprintf (file, _(" pc: 0x%08x\n"), pc);
7053 fprintf (file, _("delta pc +%-4d"), -cmd);
7054 line++; /* FIXME: curr increment. */
7056 fprintf (file, _(" pc: 0x%08x line: %5u\n"),
7061 fprintf (file, _(" *unhandled* cmd %u\n"), cmd);
7074 unsigned char *buf_orig = buf;
7076 fprintf (file, _("source (len: %u)\n"), len);
7080 signed char cmd = buf[0];
7081 unsigned char cmdlen = 0;
7085 case DST__K_SRC_DECLFILE:
7087 struct vms_dst_src_decl_src *src = (void *)(buf + 1);
7090 fprintf (file, _(" declfile: len: %u, flags: %u, "
7092 src->length, src->flags,
7093 (unsigned)bfd_getl16 (src->fileid));
7094 fprintf (file, _(" rms: cdt: 0x%08x %08x, "
7095 "ebk: 0x%08x, ffb: 0x%04x, "
7097 (unsigned)bfd_getl32 (src->rms_cdt + 4),
7098 (unsigned)bfd_getl32 (src->rms_cdt + 0),
7099 (unsigned)bfd_getl32 (src->rms_ebk),
7100 (unsigned)bfd_getl16 (src->rms_ffb),
7102 name = (const char *)buf + 1 + sizeof (*src);
7103 fprintf (file, _(" filename : %.*s\n"),
7105 name += name[0] + 1;
7106 fprintf (file, _(" module name: %.*s\n"),
7108 cmdlen = 2 + src->length;
7111 case DST__K_SRC_SETFILE:
7112 fprintf (file, _(" setfile %u\n"),
7113 (unsigned)bfd_getl16 (buf + 1));
7116 case DST__K_SRC_SETREC_W:
7117 fprintf (file, _(" setrec %u\n"),
7118 (unsigned)bfd_getl16 (buf + 1));
7121 case DST__K_SRC_SETREC_L:
7122 fprintf (file, _(" setrec %u\n"),
7123 (unsigned)bfd_getl32 (buf + 1));
7126 case DST__K_SRC_SETLNUM_W:
7127 fprintf (file, _(" setlnum %u\n"),
7128 (unsigned)bfd_getl16 (buf + 1));
7131 case DST__K_SRC_SETLNUM_L:
7132 fprintf (file, _(" setlnum %u\n"),
7133 (unsigned)bfd_getl32 (buf + 1));
7136 case DST__K_SRC_DEFLINES_W:
7137 fprintf (file, _(" deflines %u\n"),
7138 (unsigned)bfd_getl16 (buf + 1));
7141 case DST__K_SRC_DEFLINES_B:
7142 fprintf (file, _(" deflines %u\n"), buf[1]);
7145 case DST__K_SRC_FORMFEED:
7146 fprintf (file, _(" formfeed\n"));
7150 fprintf (file, _(" *unhandled* cmd %u\n"), cmd);
7162 fprintf (file, _("*unhandled* dst type %u\n"), type);
7170 evax_bfd_print_image (bfd *abfd, FILE *file)
7172 struct vms_eihd eihd;
7175 unsigned int eiha_off;
7176 unsigned int eihi_off;
7177 unsigned int eihs_off;
7178 unsigned int eisd_off;
7179 unsigned int eihef_off = 0;
7180 unsigned int eihnp_off = 0;
7181 unsigned int dmt_vbn = 0;
7182 unsigned int dmt_size = 0;
7183 unsigned int dst_vbn = 0;
7184 unsigned int dst_size = 0;
7185 unsigned int gst_vbn = 0;
7186 unsigned int gst_size = 0;
7187 unsigned int eiaf_vbn = 0;
7188 unsigned int eiaf_size = 0;
7189 unsigned int eihvn_off;
7191 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET)
7192 || bfd_bread (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
7194 fprintf (file, _("cannot read EIHD\n"));
7197 fprintf (file, _("EIHD: (size: %u, nbr blocks: %u)\n"),
7198 (unsigned)bfd_getl32 (eihd.size),
7199 (unsigned)bfd_getl32 (eihd.hdrblkcnt));
7200 fprintf (file, _(" majorid: %u, minorid: %u\n"),
7201 (unsigned)bfd_getl32 (eihd.majorid),
7202 (unsigned)bfd_getl32 (eihd.minorid));
7204 val = (unsigned)bfd_getl32 (eihd.imgtype);
7208 name = _("executable");
7211 name = _("linkable image");
7214 name = _("unknown");
7217 fprintf (file, _(" image type: %u (%s)"), val, name);
7219 val = (unsigned)bfd_getl32 (eihd.subtype);
7222 case EIHD__C_NATIVE:
7229 name = _("unknown");
7232 fprintf (file, _(", subtype: %u (%s)\n"), val, name);
7234 eisd_off = bfd_getl32 (eihd.isdoff);
7235 eiha_off = bfd_getl32 (eihd.activoff);
7236 eihi_off = bfd_getl32 (eihd.imgidoff);
7237 eihs_off = bfd_getl32 (eihd.symdbgoff);
7238 fprintf (file, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
7239 "imgid: %u, patch: %u\n"),
7240 eisd_off, eiha_off, eihs_off, eihi_off,
7241 (unsigned)bfd_getl32 (eihd.patchoff));
7242 fprintf (file, _(" fixup info rva: "));
7243 bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.iafva));
7244 fprintf (file, _(", symbol vector rva: "));
7245 bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.symvva));
7246 eihvn_off = bfd_getl32 (eihd.version_array_off);
7247 fprintf (file, _("\n"
7248 " version array off: %u\n"),
7251 _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
7252 (unsigned)bfd_getl32 (eihd.imgiocnt),
7253 (unsigned)bfd_getl32 (eihd.iochancnt),
7254 (unsigned)bfd_getl32 (eihd.privreqs + 4),
7255 (unsigned)bfd_getl32 (eihd.privreqs + 0));
7256 val = (unsigned)bfd_getl32 (eihd.lnkflags);
7257 fprintf (file, _(" linker flags: %08x:"), val);
7258 if (val & EIHD__M_LNKDEBUG)
7259 fprintf (file, " LNKDEBUG");
7260 if (val & EIHD__M_LNKNOTFR)
7261 fprintf (file, " LNKNOTFR");
7262 if (val & EIHD__M_NOP0BUFS)
7263 fprintf (file, " NOP0BUFS");
7264 if (val & EIHD__M_PICIMG)
7265 fprintf (file, " PICIMG");
7266 if (val & EIHD__M_P0IMAGE)
7267 fprintf (file, " P0IMAGE");
7268 if (val & EIHD__M_DBGDMT)
7269 fprintf (file, " DBGDMT");
7270 if (val & EIHD__M_INISHR)
7271 fprintf (file, " INISHR");
7272 if (val & EIHD__M_XLATED)
7273 fprintf (file, " XLATED");
7274 if (val & EIHD__M_BIND_CODE_SEC)
7275 fprintf (file, " BIND_CODE_SEC");
7276 if (val & EIHD__M_BIND_DATA_SEC)
7277 fprintf (file, " BIND_DATA_SEC");
7278 if (val & EIHD__M_MKTHREADS)
7279 fprintf (file, " MKTHREADS");
7280 if (val & EIHD__M_UPCALLS)
7281 fprintf (file, " UPCALLS");
7282 if (val & EIHD__M_OMV_READY)
7283 fprintf (file, " OMV_READY");
7284 if (val & EIHD__M_EXT_BIND_SECT)
7285 fprintf (file, " EXT_BIND_SECT");
7286 fprintf (file, "\n");
7287 fprintf (file, _(" ident: 0x%08x, sysver: 0x%08x, "
7288 "match ctrl: %u, symvect_size: %u\n"),
7289 (unsigned)bfd_getl32 (eihd.ident),
7290 (unsigned)bfd_getl32 (eihd.sysver),
7292 (unsigned)bfd_getl32 (eihd.symvect_size));
7293 fprintf (file, _(" BPAGE: %u"),
7294 (unsigned)bfd_getl32 (eihd.virt_mem_block_size));
7295 if (val & (EIHD__M_OMV_READY | EIHD__M_EXT_BIND_SECT))
7297 eihef_off = bfd_getl32 (eihd.ext_fixup_off);
7298 eihnp_off = bfd_getl32 (eihd.noopt_psect_off);
7299 fprintf (file, _(", ext fixup offset: %u, no_opt psect off: %u"),
7300 eihef_off, eihnp_off);
7302 fprintf (file, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd.alias));
7306 struct vms_eihvn eihvn;
7310 fprintf (file, _("system version array information:\n"));
7311 if (bfd_seek (abfd, (file_ptr) eihvn_off, SEEK_SET)
7312 || bfd_bread (&eihvn, sizeof (eihvn), abfd) != sizeof (eihvn))
7314 fprintf (file, _("cannot read EIHVN header\n"));
7317 mask = bfd_getl32 (eihvn.subsystem_mask);
7318 for (j = 0; j < 32; j++)
7319 if (mask & (1 << j))
7321 struct vms_eihvn_subversion ver;
7322 if (bfd_bread (&ver, sizeof (ver), abfd) != sizeof (ver))
7324 fprintf (file, _("cannot read EIHVN version\n"));
7327 fprintf (file, _(" %02u "), j);
7330 case EIHVN__BASE_IMAGE_BIT:
7331 fputs (_("BASE_IMAGE "), file);
7333 case EIHVN__MEMORY_MANAGEMENT_BIT:
7334 fputs (_("MEMORY_MANAGEMENT"), file);
7337 fputs (_("IO "), file);
7339 case EIHVN__FILES_VOLUMES_BIT:
7340 fputs (_("FILES_VOLUMES "), file);
7342 case EIHVN__PROCESS_SCHED_BIT:
7343 fputs (_("PROCESS_SCHED "), file);
7345 case EIHVN__SYSGEN_BIT:
7346 fputs (_("SYSGEN "), file);
7348 case EIHVN__CLUSTERS_LOCKMGR_BIT:
7349 fputs (_("CLUSTERS_LOCKMGR "), file);
7351 case EIHVN__LOGICAL_NAMES_BIT:
7352 fputs (_("LOGICAL_NAMES "), file);
7354 case EIHVN__SECURITY_BIT:
7355 fputs (_("SECURITY "), file);
7357 case EIHVN__IMAGE_ACTIVATOR_BIT:
7358 fputs (_("IMAGE_ACTIVATOR "), file);
7360 case EIHVN__NETWORKS_BIT:
7361 fputs (_("NETWORKS "), file);
7363 case EIHVN__COUNTERS_BIT:
7364 fputs (_("COUNTERS "), file);
7366 case EIHVN__STABLE_BIT:
7367 fputs (_("STABLE "), file);
7369 case EIHVN__MISC_BIT:
7370 fputs (_("MISC "), file);
7372 case EIHVN__CPU_BIT:
7373 fputs (_("CPU "), file);
7375 case EIHVN__VOLATILE_BIT:
7376 fputs (_("VOLATILE "), file);
7378 case EIHVN__SHELL_BIT:
7379 fputs (_("SHELL "), file);
7381 case EIHVN__POSIX_BIT:
7382 fputs (_("POSIX "), file);
7384 case EIHVN__MULTI_PROCESSING_BIT:
7385 fputs (_("MULTI_PROCESSING "), file);
7387 case EIHVN__GALAXY_BIT:
7388 fputs (_("GALAXY "), file);
7391 fputs (_("*unknown* "), file);
7394 fprintf (file, _(": %u.%u\n"),
7395 (unsigned)bfd_getl16 (ver.major),
7396 (unsigned)bfd_getl16 (ver.minor));
7402 struct vms_eiha eiha;
7404 if (bfd_seek (abfd, (file_ptr) eiha_off, SEEK_SET)
7405 || bfd_bread (&eiha, sizeof (eiha), abfd) != sizeof (eiha))
7407 fprintf (file, _("cannot read EIHA\n"));
7410 fprintf (file, _("Image activation: (size=%u)\n"),
7411 (unsigned)bfd_getl32 (eiha.size));
7412 fprintf (file, _(" First address : 0x%08x 0x%08x\n"),
7413 (unsigned)bfd_getl32 (eiha.tfradr1_h),
7414 (unsigned)bfd_getl32 (eiha.tfradr1));
7415 fprintf (file, _(" Second address: 0x%08x 0x%08x\n"),
7416 (unsigned)bfd_getl32 (eiha.tfradr2_h),
7417 (unsigned)bfd_getl32 (eiha.tfradr2));
7418 fprintf (file, _(" Third address : 0x%08x 0x%08x\n"),
7419 (unsigned)bfd_getl32 (eiha.tfradr3_h),
7420 (unsigned)bfd_getl32 (eiha.tfradr3));
7421 fprintf (file, _(" Fourth address: 0x%08x 0x%08x\n"),
7422 (unsigned)bfd_getl32 (eiha.tfradr4_h),
7423 (unsigned)bfd_getl32 (eiha.tfradr4));
7424 fprintf (file, _(" Shared image : 0x%08x 0x%08x\n"),
7425 (unsigned)bfd_getl32 (eiha.inishr_h),
7426 (unsigned)bfd_getl32 (eiha.inishr));
7430 struct vms_eihi eihi;
7432 if (bfd_seek (abfd, (file_ptr) eihi_off, SEEK_SET)
7433 || bfd_bread (&eihi, sizeof (eihi), abfd) != sizeof (eihi))
7435 fprintf (file, _("cannot read EIHI\n"));
7438 fprintf (file, _("Image identification: (major: %u, minor: %u)\n"),
7439 (unsigned)bfd_getl32 (eihi.majorid),
7440 (unsigned)bfd_getl32 (eihi.minorid));
7441 fprintf (file, _(" image name : %.*s\n"),
7442 eihi.imgnam[0], eihi.imgnam + 1);
7443 fprintf (file, _(" link time : %s\n"),
7444 vms_time_to_str (eihi.linktime));
7445 fprintf (file, _(" image ident : %.*s\n"),
7446 eihi.imgid[0], eihi.imgid + 1);
7447 fprintf (file, _(" linker ident : %.*s\n"),
7448 eihi.linkid[0], eihi.linkid + 1);
7449 fprintf (file, _(" image build ident: %.*s\n"),
7450 eihi.imgbid[0], eihi.imgbid + 1);
7454 struct vms_eihs eihs;
7456 if (bfd_seek (abfd, (file_ptr) eihs_off, SEEK_SET)
7457 || bfd_bread (&eihs, sizeof (eihs), abfd) != sizeof (eihs))
7459 fprintf (file, _("cannot read EIHS\n"));
7462 fprintf (file, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
7463 (unsigned)bfd_getl32 (eihs.majorid),
7464 (unsigned)bfd_getl32 (eihs.minorid));
7465 dst_vbn = bfd_getl32 (eihs.dstvbn);
7466 dst_size = bfd_getl32 (eihs.dstsize);
7467 fprintf (file, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
7468 dst_vbn, dst_size, dst_size);
7469 gst_vbn = bfd_getl32 (eihs.gstvbn);
7470 gst_size = bfd_getl32 (eihs.gstsize);
7471 fprintf (file, _(" global symbol table: vbn: %u, records: %u\n"),
7473 dmt_vbn = bfd_getl32 (eihs.dmtvbn);
7474 dmt_size = bfd_getl32 (eihs.dmtsize);
7475 fprintf (file, _(" debug module table : vbn: %u, size: %u\n"),
7478 while (eisd_off != 0)
7480 struct vms_eisd eisd;
7485 if (bfd_seek (abfd, (file_ptr) eisd_off, SEEK_SET)
7486 || bfd_bread (&eisd, sizeof (eisd), abfd) != sizeof (eisd))
7488 fprintf (file, _("cannot read EISD\n"));
7491 len = (unsigned)bfd_getl32 (eisd.eisdsize);
7492 if (len != (unsigned)-1)
7496 eisd_off = (eisd_off + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
7498 fprintf (file, _("Image section descriptor: (major: %u, minor: %u, "
7499 "size: %u, offset: %u)\n"),
7500 (unsigned)bfd_getl32 (eisd.majorid),
7501 (unsigned)bfd_getl32 (eisd.minorid),
7505 fprintf (file, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
7506 (unsigned)bfd_getl32 (eisd.virt_addr + 4),
7507 (unsigned)bfd_getl32 (eisd.virt_addr + 0),
7508 (unsigned)bfd_getl32 (eisd.secsize));
7509 val = (unsigned)bfd_getl32 (eisd.flags);
7510 fprintf (file, _(" flags: 0x%04x"), val);
7511 if (val & EISD__M_GBL)
7512 fprintf (file, " GBL");
7513 if (val & EISD__M_CRF)
7514 fprintf (file, " CRF");
7515 if (val & EISD__M_DZRO)
7516 fprintf (file, " DZRO");
7517 if (val & EISD__M_WRT)
7518 fprintf (file, " WRT");
7519 if (val & EISD__M_INITALCODE)
7520 fprintf (file, " INITALCODE");
7521 if (val & EISD__M_BASED)
7522 fprintf (file, " BASED");
7523 if (val & EISD__M_FIXUPVEC)
7524 fprintf (file, " FIXUPVEC");
7525 if (val & EISD__M_RESIDENT)
7526 fprintf (file, " RESIDENT");
7527 if (val & EISD__M_VECTOR)
7528 fprintf (file, " VECTOR");
7529 if (val & EISD__M_PROTECT)
7530 fprintf (file, " PROTECT");
7531 if (val & EISD__M_LASTCLU)
7532 fprintf (file, " LASTCLU");
7533 if (val & EISD__M_EXE)
7534 fprintf (file, " EXE");
7535 if (val & EISD__M_NONSHRADR)
7536 fprintf (file, " NONSHRADR");
7537 if (val & EISD__M_QUAD_LENGTH)
7538 fprintf (file, " QUAD_LENGTH");
7539 if (val & EISD__M_ALLOC_64BIT)
7540 fprintf (file, " ALLOC_64BIT");
7541 fprintf (file, "\n");
7542 if (val & EISD__M_FIXUPVEC)
7544 eiaf_vbn = bfd_getl32 (eisd.vbn);
7545 eiaf_size = bfd_getl32 (eisd.secsize);
7547 fprintf (file, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
7548 (unsigned)bfd_getl32 (eisd.vbn),
7549 eisd.pfc, eisd.matchctl, eisd.type);
7552 case EISD__K_NORMAL:
7553 fputs (_("NORMAL"), file);
7555 case EISD__K_SHRFXD:
7556 fputs (_("SHRFXD"), file);
7558 case EISD__K_PRVFXD:
7559 fputs (_("PRVFXD"), file);
7561 case EISD__K_SHRPIC:
7562 fputs (_("SHRPIC"), file);
7564 case EISD__K_PRVPIC:
7565 fputs (_("PRVPIC"), file);
7567 case EISD__K_USRSTACK:
7568 fputs (_("USRSTACK"), file);
7571 fputs (_("*unknown*"), file);
7574 fputs (_(")\n"), file);
7575 if (val & EISD__M_GBL)
7576 fprintf (file, _(" ident: 0x%08x, name: %.*s\n"),
7577 (unsigned)bfd_getl32 (eisd.ident),
7578 eisd.gblnam[0], eisd.gblnam + 1);
7584 if (bfd_seek (abfd, (file_ptr) (dmt_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7586 fprintf (file, _("cannot read DMT\n"));
7590 fprintf (file, _("Debug module table:\n"));
7592 while (dmt_size > 0)
7594 struct vms_dmt_header dmth;
7597 if (bfd_bread (&dmth, sizeof (dmth), abfd) != sizeof (dmth))
7599 fprintf (file, _("cannot read DMT header\n"));
7602 count = bfd_getl16 (dmth.psect_count);
7604 _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
7605 (unsigned)bfd_getl32 (dmth.modbeg),
7606 (unsigned)bfd_getl32 (dmth.size), count);
7607 dmt_size -= sizeof (dmth);
7610 struct vms_dmt_psect dmtp;
7612 if (bfd_bread (&dmtp, sizeof (dmtp), abfd) != sizeof (dmtp))
7614 fprintf (file, _("cannot read DMT psect\n"));
7617 fprintf (file, _(" psect start: 0x%08x, length: %u\n"),
7618 (unsigned)bfd_getl32 (dmtp.start),
7619 (unsigned)bfd_getl32 (dmtp.length));
7621 dmt_size -= sizeof (dmtp);
7628 if (bfd_seek (abfd, (file_ptr) (dst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7630 fprintf (file, _("cannot read DST\n"));
7634 evax_bfd_print_dst (abfd, dst_size, file);
7638 if (bfd_seek (abfd, (file_ptr) (gst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7640 fprintf (file, _("cannot read GST\n"));
7644 fprintf (file, _("Global symbol table:\n"));
7645 evax_bfd_print_eobj (abfd, file);
7650 struct vms_eiaf *eiaf;
7651 unsigned int qrelfixoff;
7652 unsigned int lrelfixoff;
7653 unsigned int qdotadroff;
7654 unsigned int ldotadroff;
7655 unsigned int shrimgcnt;
7656 unsigned int shlstoff;
7657 unsigned int codeadroff;
7658 unsigned int lpfixoff;
7659 unsigned int chgprtoff;
7661 buf = bfd_malloc (eiaf_size);
7663 if (bfd_seek (abfd, (file_ptr) (eiaf_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET)
7664 || bfd_bread (buf, eiaf_size, abfd) != eiaf_size)
7666 fprintf (file, _("cannot read EIHA\n"));
7670 eiaf = (struct vms_eiaf *)buf;
7672 _("Image activator fixup: (major: %u, minor: %u)\n"),
7673 (unsigned)bfd_getl32 (eiaf->majorid),
7674 (unsigned)bfd_getl32 (eiaf->minorid));
7675 fprintf (file, _(" iaflink : 0x%08x %08x\n"),
7676 (unsigned)bfd_getl32 (eiaf->iaflink + 0),
7677 (unsigned)bfd_getl32 (eiaf->iaflink + 4));
7678 fprintf (file, _(" fixuplnk: 0x%08x %08x\n"),
7679 (unsigned)bfd_getl32 (eiaf->fixuplnk + 0),
7680 (unsigned)bfd_getl32 (eiaf->fixuplnk + 4));
7681 fprintf (file, _(" size : %u\n"),
7682 (unsigned)bfd_getl32 (eiaf->size));
7683 fprintf (file, _(" flags: 0x%08x\n"),
7684 (unsigned)bfd_getl32 (eiaf->flags));
7685 qrelfixoff = bfd_getl32 (eiaf->qrelfixoff);
7686 lrelfixoff = bfd_getl32 (eiaf->lrelfixoff);
7687 fprintf (file, _(" qrelfixoff: %5u, lrelfixoff: %5u\n"),
7688 qrelfixoff, lrelfixoff);
7689 qdotadroff = bfd_getl32 (eiaf->qdotadroff);
7690 ldotadroff = bfd_getl32 (eiaf->ldotadroff);
7691 fprintf (file, _(" qdotadroff: %5u, ldotadroff: %5u\n"),
7692 qdotadroff, ldotadroff);
7693 codeadroff = bfd_getl32 (eiaf->codeadroff);
7694 lpfixoff = bfd_getl32 (eiaf->lpfixoff);
7695 fprintf (file, _(" codeadroff: %5u, lpfixoff : %5u\n"),
7696 codeadroff, lpfixoff);
7697 chgprtoff = bfd_getl32 (eiaf->chgprtoff);
7698 fprintf (file, _(" chgprtoff : %5u\n"), chgprtoff);
7699 shrimgcnt = bfd_getl32 (eiaf->shrimgcnt);
7700 shlstoff = bfd_getl32 (eiaf->shlstoff);
7701 fprintf (file, _(" shlstoff : %5u, shrimgcnt : %5u\n"),
7702 shlstoff, shrimgcnt);
7703 fprintf (file, _(" shlextra : %5u, permctx : %5u\n"),
7704 (unsigned)bfd_getl32 (eiaf->shlextra),
7705 (unsigned)bfd_getl32 (eiaf->permctx));
7706 fprintf (file, _(" base_va : 0x%08x\n"),
7707 (unsigned)bfd_getl32 (eiaf->base_va));
7708 fprintf (file, _(" lppsbfixoff: %5u\n"),
7709 (unsigned)bfd_getl32 (eiaf->lppsbfixoff));
7713 struct vms_shl *shl = (struct vms_shl *)(buf + shlstoff);
7716 fprintf (file, _(" Shareable images:\n"));
7717 for (j = 0; j < shrimgcnt; j++, shl++)
7720 _(" %u: size: %u, flags: 0x%02x, name: %.*s\n"),
7721 j, shl->size, shl->flags,
7722 shl->imgnam[0], shl->imgnam + 1);
7725 if (qrelfixoff != 0)
7727 fprintf (file, _(" quad-word relocation fixups:\n"));
7728 evax_bfd_print_relocation_records (file, buf + qrelfixoff, 8);
7730 if (lrelfixoff != 0)
7732 fprintf (file, _(" long-word relocation fixups:\n"));
7733 evax_bfd_print_relocation_records (file, buf + lrelfixoff, 4);
7735 if (qdotadroff != 0)
7737 fprintf (file, _(" quad-word .address reference fixups:\n"));
7738 evax_bfd_print_address_fixups (file, buf + qdotadroff);
7740 if (ldotadroff != 0)
7742 fprintf (file, _(" long-word .address reference fixups:\n"));
7743 evax_bfd_print_address_fixups (file, buf + ldotadroff);
7745 if (codeadroff != 0)
7747 fprintf (file, _(" Code Address Reference Fixups:\n"));
7748 evax_bfd_print_reference_fixups (file, buf + codeadroff);
7752 fprintf (file, _(" Linkage Pairs Referece Fixups:\n"));
7753 evax_bfd_print_reference_fixups (file, buf + lpfixoff);
7757 unsigned int count = (unsigned)bfd_getl32 (buf + chgprtoff);
7758 struct vms_eicp *eicp = (struct vms_eicp *)(buf + chgprtoff + 4);
7761 fprintf (file, _(" Change Protection (%u entries):\n"), count);
7762 for (j = 0; j < count; j++, eicp++)
7764 unsigned int prot = bfd_getl32 (eicp->newprt);
7766 _(" base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
7767 (unsigned)bfd_getl32 (eicp->baseva + 4),
7768 (unsigned)bfd_getl32 (eicp->baseva + 0),
7769 (unsigned)bfd_getl32 (eicp->size),
7770 (unsigned)bfd_getl32 (eicp->newprt));
7774 fprintf (file, "NA");
7776 case PRT__C_RESERVED:
7777 fprintf (file, "RES");
7780 fprintf (file, "KW");
7783 fprintf (file, "KR");
7786 fprintf (file, "UW");
7789 fprintf (file, "EW");
7792 fprintf (file, "ERKW");
7795 fprintf (file, "ER");
7798 fprintf (file, "SW");
7801 fprintf (file, "SREW");
7804 fprintf (file, "SRKW");
7807 fprintf (file, "SR");
7810 fprintf (file, "URSW");
7813 fprintf (file, "UREW");
7816 fprintf (file, "URKW");
7819 fprintf (file, "UR");
7833 vms_bfd_print_private_bfd_data (bfd *abfd, void *ptr)
7835 FILE *file = (FILE *)ptr;
7837 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
7838 evax_bfd_print_image (abfd, file);
7841 if (bfd_seek (abfd, 0, SEEK_SET))
7843 evax_bfd_print_eobj (abfd, file);
7850 /* Slurp ETIR/EDBG/ETBT VMS object records. */
7853 alpha_vms_read_sections_content (bfd *abfd, struct bfd_link_info *info)
7855 asection *cur_section;
7856 file_ptr cur_offset;
7857 asection *dst_section;
7858 file_ptr dst_offset;
7860 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
7866 dst_section = PRIV (dst_section);
7870 if (info->strip == strip_all || info->strip == strip_debugger)
7872 /* Discard the DST section. */
7876 else if (dst_section)
7878 dst_offset = dst_section->output_offset;
7879 dst_section = dst_section->output_section;
7888 type = _bfd_vms_get_object_record (abfd);
7891 vms_debug2 ((2, "next_record failed\n"));
7897 PRIV (image_section) = cur_section;
7898 PRIV (image_offset) = cur_offset;
7899 res = _bfd_vms_slurp_etir (abfd, info);
7900 cur_section = PRIV (image_section);
7901 cur_offset = PRIV (image_offset);
7905 if (dst_section == NULL)
7907 PRIV (image_section) = dst_section;
7908 PRIV (image_offset) = dst_offset;
7909 res = _bfd_vms_slurp_etir (abfd, info);
7910 dst_offset = PRIV (image_offset);
7919 vms_debug2 ((2, "slurp eobj type %d failed\n", type));
7926 alpha_vms_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
7927 struct bfd_link_info *info ATTRIBUTE_UNUSED)
7932 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
7935 alpha_vms_add_fixup_lp (struct bfd_link_info *info, bfd *src, bfd *shlib)
7937 struct alpha_vms_shlib_el *sl;
7938 asection *sect = PRIV2 (src, image_section);
7939 file_ptr offset = PRIV2 (src, image_offset);
7941 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
7942 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
7943 sl->has_fixups = TRUE;
7944 VEC_APPEND_EL (sl->lp, bfd_vma,
7945 sect->output_section->vma + sect->output_offset + offset);
7949 alpha_vms_add_fixup_ca (struct bfd_link_info *info, bfd *src, bfd *shlib)
7951 struct alpha_vms_shlib_el *sl;
7952 asection *sect = PRIV2 (src, image_section);
7953 file_ptr offset = PRIV2 (src, image_offset);
7955 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
7956 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
7957 sl->has_fixups = TRUE;
7958 VEC_APPEND_EL (sl->ca, bfd_vma,
7959 sect->output_section->vma + sect->output_offset + offset);
7963 alpha_vms_add_fixup_qr (struct bfd_link_info *info, bfd *src,
7964 bfd *shlib, bfd_vma vec)
7966 struct alpha_vms_shlib_el *sl;
7967 struct alpha_vms_vma_ref *r;
7968 asection *sect = PRIV2 (src, image_section);
7969 file_ptr offset = PRIV2 (src, image_offset);
7971 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
7972 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
7973 sl->has_fixups = TRUE;
7974 r = VEC_APPEND (sl->qr, struct alpha_vms_vma_ref);
7975 r->vma = sect->output_section->vma + sect->output_offset + offset;
7980 alpha_vms_add_lw_fixup (struct bfd_link_info *info ATTRIBUTE_UNUSED,
7981 unsigned int shr ATTRIBUTE_UNUSED,
7982 bfd_vma vec ATTRIBUTE_UNUSED)
7989 alpha_vms_add_qw_fixup (struct bfd_link_info *info ATTRIBUTE_UNUSED,
7990 unsigned int shr ATTRIBUTE_UNUSED,
7991 bfd_vma vec ATTRIBUTE_UNUSED)
7998 alpha_vms_add_lw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8003 alpha_vms_add_qw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8007 static struct bfd_hash_entry *
8008 alpha_vms_link_hash_newfunc (struct bfd_hash_entry *entry,
8009 struct bfd_hash_table *table,
8012 struct alpha_vms_link_hash_entry *ret =
8013 (struct alpha_vms_link_hash_entry *) entry;
8015 /* Allocate the structure if it has not already been allocated by a
8018 ret = ((struct alpha_vms_link_hash_entry *)
8019 bfd_hash_allocate (table,
8020 sizeof (struct alpha_vms_link_hash_entry)));
8024 /* Call the allocation method of the superclass. */
8025 ret = ((struct alpha_vms_link_hash_entry *)
8026 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
8031 return (struct bfd_hash_entry *) ret;
8034 /* Create an Alpha/VMS link hash table. */
8036 static struct bfd_link_hash_table *
8037 alpha_vms_bfd_link_hash_table_create (bfd *abfd)
8039 struct alpha_vms_link_hash_table *ret;
8040 bfd_size_type amt = sizeof (struct alpha_vms_link_hash_table);
8042 ret = (struct alpha_vms_link_hash_table *) bfd_malloc (amt);
8045 if (!_bfd_link_hash_table_init (&ret->root, abfd,
8046 alpha_vms_link_hash_newfunc,
8047 sizeof (struct alpha_vms_link_hash_entry)))
8053 VEC_INIT (ret->shrlibs);
8060 alpha_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
8064 for (i = 0; i < PRIV (gsd_sym_count); i++)
8066 struct vms_symbol_entry *e = PRIV (syms)[i];
8067 struct alpha_vms_link_hash_entry *h;
8068 struct bfd_link_hash_entry *h_root;
8071 if (!alpha_vms_convert_symbol (abfd, e, &sym))
8074 if ((e->flags & EGSY__V_DEF) && abfd->selective_search)
8076 /* In selective_search mode, only add definition that are
8078 h = (struct alpha_vms_link_hash_entry *)bfd_link_hash_lookup
8079 (info->hash, sym.name, FALSE, FALSE, FALSE);
8080 if (h == NULL || h->root.type != bfd_link_hash_undefined)
8086 h_root = (struct bfd_link_hash_entry *) h;
8087 if (_bfd_generic_link_add_one_symbol
8088 (info, abfd, sym.name, sym.flags, sym.section, sym.value,
8089 NULL, FALSE, FALSE, &h_root) == FALSE)
8091 h = (struct alpha_vms_link_hash_entry *) h_root;
8093 if ((e->flags & EGSY__V_DEF)
8095 && abfd->xvec == info->output_bfd->xvec)
8099 if (abfd->flags & DYNAMIC)
8101 struct alpha_vms_shlib_el *shlib;
8103 /* We do not want to include any of the sections in a dynamic
8104 object in the output file. See comment in elflink.c. */
8105 bfd_section_list_clear (abfd);
8107 shlib = VEC_APPEND (alpha_vms_link_hash (info)->shrlibs,
8108 struct alpha_vms_shlib_el);
8110 VEC_INIT (shlib->ca);
8111 VEC_INIT (shlib->lp);
8112 VEC_INIT (shlib->qr);
8113 PRIV (shr_index) = VEC_COUNT (alpha_vms_link_hash (info)->shrlibs) - 1;
8120 alpha_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
8123 struct bfd_link_hash_entry **pundef;
8124 struct bfd_link_hash_entry **next_pundef;
8126 /* We only accept VMS libraries. */
8127 if (info->output_bfd->xvec != abfd->xvec)
8129 bfd_set_error (bfd_error_wrong_format);
8133 /* The archive_pass field in the archive itself is used to
8134 initialize PASS, since we may search the same archive multiple
8136 pass = ++abfd->archive_pass;
8138 /* Look through the list of undefined symbols. */
8139 for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef)
8141 struct bfd_link_hash_entry *h;
8147 next_pundef = &(*pundef)->u.undef.next;
8149 /* When a symbol is defined, it is not necessarily removed from
8151 if (h->type != bfd_link_hash_undefined
8152 && h->type != bfd_link_hash_common)
8154 /* Remove this entry from the list, for general cleanliness
8155 and because we are going to look through the list again
8156 if we search any more libraries. We can't remove the
8157 entry if it is the tail, because that would lose any
8158 entries we add to the list later on. */
8159 if (*pundef != info->hash->undefs_tail)
8161 *pundef = *next_pundef;
8162 next_pundef = pundef;
8167 /* Look for this symbol in the archive hash table. */
8168 symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string);
8169 if (symidx == BFD_NO_MORE_SYMBOLS)
8171 /* Nothing in this slot. */
8175 element = bfd_get_elt_at_index (abfd, symidx);
8176 if (element == NULL)
8179 if (element->archive_pass == -1 || element->archive_pass == pass)
8182 if (! bfd_check_format (element, bfd_object))
8184 element->archive_pass = -1;
8188 orig_element = element;
8189 if (bfd_is_thin_archive (abfd))
8191 element = _bfd_vms_lib_get_imagelib_file (element);
8192 if (element == NULL || !bfd_check_format (element, bfd_object))
8194 orig_element->archive_pass = -1;
8199 /* Unlike the generic linker, we know that this element provides
8200 a definition for an undefined symbol and we know that we want
8201 to include it. We don't need to check anything. */
8202 if (! (*info->callbacks->add_archive_element) (info, element,
8205 if (! alpha_vms_link_add_object_symbols (element, info))
8208 orig_element->archive_pass = pass;
8215 alpha_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
8217 switch (bfd_get_format (abfd))
8220 vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
8222 return alpha_vms_link_add_object_symbols (abfd, info);
8225 vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
8227 return alpha_vms_link_add_archive_symbols (abfd, info);
8230 bfd_set_error (bfd_error_wrong_format);
8236 alpha_vms_build_fixups (struct bfd_link_info *info)
8238 struct alpha_vms_link_hash_table *t = alpha_vms_link_hash (info);
8239 unsigned char *content;
8241 unsigned int sz = 0;
8242 unsigned int lp_sz = 0;
8243 unsigned int ca_sz = 0;
8244 unsigned int qr_sz = 0;
8245 unsigned int shrimg_cnt = 0;
8246 struct vms_eiaf *eiaf;
8250 /* Shared libraries. */
8251 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8253 struct alpha_vms_shlib_el *shlib;
8255 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8257 if (!shlib->has_fixups)
8262 if (VEC_COUNT (shlib->ca) > 0)
8264 /* Header + entries. */
8266 ca_sz += VEC_COUNT (shlib->ca) * 4;
8268 if (VEC_COUNT (shlib->lp) > 0)
8270 /* Header + entries. */
8272 lp_sz += VEC_COUNT (shlib->lp) * 4;
8274 if (VEC_COUNT (shlib->qr) > 0)
8276 /* Header + entries. */
8278 qr_sz += VEC_COUNT (shlib->qr) * 8;
8289 /* Finish now if there is no content. */
8290 if (ca_sz + lp_sz + qr_sz == 0)
8293 /* Allocate section content (round-up size) */
8294 sz = sizeof (struct vms_eiaf) + shrimg_cnt * sizeof (struct vms_shl)
8295 + ca_sz + lp_sz + qr_sz;
8296 sz = (sz + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
8297 content = bfd_zalloc (info->output_bfd, sz);
8298 if (content == NULL)
8301 sec = alpha_vms_link_hash (info)->fixup;
8302 sec->contents = content;
8305 eiaf = (struct vms_eiaf *)content;
8306 off = sizeof (struct vms_eiaf);
8307 bfd_putl32 (0, eiaf->majorid);
8308 bfd_putl32 (0, eiaf->minorid);
8309 bfd_putl32 (0, eiaf->iaflink);
8310 bfd_putl32 (0, eiaf->fixuplnk);
8311 bfd_putl32 (sizeof (struct vms_eiaf), eiaf->size);
8312 bfd_putl32 (0, eiaf->flags);
8313 bfd_putl32 (0, eiaf->qrelfixoff);
8314 bfd_putl32 (0, eiaf->lrelfixoff);
8315 bfd_putl32 (0, eiaf->qdotadroff);
8316 bfd_putl32 (0, eiaf->ldotadroff);
8317 bfd_putl32 (0, eiaf->codeadroff);
8318 bfd_putl32 (0, eiaf->lpfixoff);
8319 bfd_putl32 (0, eiaf->chgprtoff);
8320 bfd_putl32 (shrimg_cnt ? off : 0, eiaf->shlstoff);
8321 bfd_putl32 (shrimg_cnt, eiaf->shrimgcnt);
8322 bfd_putl32 (0, eiaf->shlextra);
8323 bfd_putl32 (0, eiaf->permctx);
8324 bfd_putl32 (0, eiaf->base_va);
8325 bfd_putl32 (0, eiaf->lppsbfixoff);
8332 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8334 struct alpha_vms_shlib_el *shlib;
8335 struct vms_shl *shl;
8337 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8339 if (!shlib->has_fixups)
8342 /* Renumber shared images. */
8343 PRIV2 (shlib->abfd, shr_index) = shrimg_cnt++;
8345 shl = (struct vms_shl *)(content + off);
8346 bfd_putl32 (0, shl->baseva);
8347 bfd_putl32 (0, shl->shlptr);
8348 bfd_putl32 (0, shl->ident);
8349 bfd_putl32 (0, shl->permctx);
8350 shl->size = sizeof (struct vms_shl);
8351 bfd_putl16 (0, shl->fill_1);
8353 bfd_putl32 (0, shl->icb);
8354 shl->imgnam[0] = strlen (PRIV2 (shlib->abfd, hdr_data.hdr_t_name));
8355 memcpy (shl->imgnam + 1, PRIV2 (shlib->abfd, hdr_data.hdr_t_name),
8358 off += sizeof (struct vms_shl);
8364 bfd_putl32 (off, eiaf->codeadroff);
8366 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8368 struct alpha_vms_shlib_el *shlib;
8371 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8373 if (VEC_COUNT (shlib->ca) == 0)
8376 bfd_putl32 (VEC_COUNT (shlib->ca), content + off);
8377 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8380 for (j = 0; j < VEC_COUNT (shlib->ca); j++)
8382 bfd_putl32 (VEC_EL (shlib->ca, bfd_vma, j) - t->base_addr,
8388 bfd_putl32 (0, content + off);
8389 bfd_putl32 (0, content + off + 4);
8396 bfd_putl32 (off, eiaf->lpfixoff);
8398 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8400 struct alpha_vms_shlib_el *shlib;
8403 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8405 if (VEC_COUNT (shlib->lp) == 0)
8408 bfd_putl32 (VEC_COUNT (shlib->lp), content + off);
8409 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8412 for (j = 0; j < VEC_COUNT (shlib->lp); j++)
8414 bfd_putl32 (VEC_EL (shlib->lp, bfd_vma, j) - t->base_addr,
8420 bfd_putl32 (0, content + off);
8421 bfd_putl32 (0, content + off + 4);
8428 bfd_putl32 (off, eiaf->qdotadroff);
8430 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8432 struct alpha_vms_shlib_el *shlib;
8435 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8437 if (VEC_COUNT (shlib->qr) == 0)
8440 bfd_putl32 (VEC_COUNT (shlib->qr), content + off);
8441 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8444 for (j = 0; j < VEC_COUNT (shlib->qr); j++)
8446 struct alpha_vms_vma_ref *r;
8447 r = &VEC_EL (shlib->qr, struct alpha_vms_vma_ref, j);
8448 bfd_putl32 (r->vma - t->base_addr, content + off);
8449 bfd_putl32 (r->ref, content + off + 4);
8454 bfd_putl32 (0, content + off);
8455 bfd_putl32 (0, content + off + 4);
8466 alpha_vms_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
8469 struct bfd_link_order *p;
8477 bfd_get_outsymbols (abfd) = NULL;
8478 bfd_get_symcount (abfd) = 0;
8480 /* Mark all sections which will be included in the output file. */
8481 for (o = abfd->sections; o != NULL; o = o->next)
8482 for (p = o->map_head.link_order; p != NULL; p = p->next)
8483 if (p->type == bfd_indirect_link_order)
8484 p->u.indirect.section->linker_mark = TRUE;
8487 /* Handle all the link order information for the sections. */
8488 for (o = abfd->sections; o != NULL; o = o->next)
8490 printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
8491 o->name, (unsigned)o->vma, (unsigned)o->flags);
8493 for (p = o->map_head.link_order; p != NULL; p = p->next)
8495 printf (" at 0x%08x - 0x%08x: ",
8496 (unsigned)p->offset, (unsigned)(p->offset + p->size - 1));
8499 case bfd_section_reloc_link_order:
8500 case bfd_symbol_reloc_link_order:
8501 printf (" section/symbol reloc\n");
8503 case bfd_indirect_link_order:
8504 printf (" section %s of %s\n",
8505 p->u.indirect.section->name,
8506 p->u.indirect.section->owner->filename);
8508 case bfd_data_link_order:
8509 printf (" explicit data\n");
8512 printf (" *unknown* type %u\n", p->type);
8519 /* Find the entry point. */
8520 if (bfd_get_start_address (abfd) == 0)
8522 bfd *startbfd = NULL;
8524 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8526 /* Consider only VMS object files. */
8527 if (sub->xvec != abfd->xvec)
8530 if (!PRIV2 (sub, eom_data).eom_has_transfer)
8532 if ((PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR) && startbfd)
8534 if (startbfd != NULL
8535 && !(PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR))
8537 (*info->callbacks->einfo)
8538 (_("%P: multiple entry points: in modules %B and %B\n"),
8547 unsigned int ps_idx = PRIV2 (startbfd, eom_data).eom_l_psindx;
8548 bfd_vma tfradr = PRIV2 (startbfd, eom_data).eom_l_tfradr;
8551 sec = PRIV2 (startbfd, sections)[ps_idx];
8553 bfd_set_start_address
8554 (abfd, sec->output_section->vma + sec->output_offset + tfradr);
8558 /* Allocate contents. */
8559 base_addr = (bfd_vma)-1;
8561 for (o = abfd->sections; o != NULL; o = o->next)
8563 if (o->flags & SEC_HAS_CONTENTS)
8565 o->contents = bfd_alloc (abfd, o->size);
8566 if (o->contents == NULL)
8569 if (o->flags & SEC_LOAD)
8571 if (o->vma < base_addr)
8573 if (o->vma + o->size > last_addr)
8574 last_addr = o->vma + o->size;
8578 /* Create the fixup section. */
8579 fixupsec = bfd_make_section_anyway_with_flags
8580 (info->output_bfd, "$FIXUP$",
8581 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
8582 if (fixupsec == NULL)
8584 last_addr = (last_addr + 0xffff) & ~0xffff;
8585 fixupsec->vma = last_addr;
8587 alpha_vms_link_hash (info)->fixup = fixupsec;
8588 alpha_vms_link_hash (info)->base_addr = base_addr;
8590 /* Create the DMT section, if necessary. */
8591 dst = PRIV (dst_section);
8592 if (dst != NULL && dst->size == 0)
8596 dmt = bfd_make_section_anyway_with_flags
8597 (info->output_bfd, "$DMT$",
8598 SEC_DEBUGGING | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
8605 /* Read all sections from the inputs. */
8606 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8608 if (sub->flags & DYNAMIC)
8610 alpha_vms_create_eisd_for_shared (abfd, sub);
8614 if (!alpha_vms_read_sections_content (sub, info))
8618 /* Handle all the link order information for the sections.
8619 Note: past this point, it is not possible to create new sections. */
8620 for (o = abfd->sections; o != NULL; o = o->next)
8622 for (p = o->map_head.link_order; p != NULL; p = p->next)
8626 case bfd_section_reloc_link_order:
8627 case bfd_symbol_reloc_link_order:
8630 case bfd_indirect_link_order:
8634 if (! _bfd_default_link_order (abfd, info, o, p))
8641 /* Compute fixups. */
8642 if (!alpha_vms_build_fixups (info))
8645 /* Compute the DMT. */
8649 unsigned char *contents = NULL;
8651 /* In pass 1, compute the size. In pass 2, write the DMT contents. */
8652 for (pass = 0; pass < 2; pass++)
8654 unsigned int off = 0;
8656 /* For each object file (ie for each module). */
8657 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8660 struct vms_dmt_header *dmth = NULL;
8661 unsigned int psect_count;
8663 /* Skip this module if it has no DST. */
8664 sub_dst = PRIV2 (sub, dst_section);
8665 if (sub_dst == NULL || sub_dst->size == 0)
8670 /* Write the header. */
8671 dmth = (struct vms_dmt_header *)(contents + off);
8672 bfd_putl32 (sub_dst->output_offset, dmth->modbeg);
8673 bfd_putl32 (sub_dst->size, dmth->size);
8676 off += sizeof (struct vms_dmt_header);
8679 /* For each section (ie for each psect). */
8680 for (o = sub->sections; o != NULL; o = o->next)
8682 /* Only consider interesting sections. */
8683 if (!(o->flags & SEC_ALLOC))
8685 if (o->flags & SEC_LINKER_CREATED)
8690 /* Write an entry. */
8691 struct vms_dmt_psect *dmtp;
8693 dmtp = (struct vms_dmt_psect *)(contents + off);
8694 bfd_putl32 (o->output_offset + o->output_section->vma,
8696 bfd_putl32 (o->size, dmtp->length);
8699 off += sizeof (struct vms_dmt_psect);
8702 bfd_putl32 (psect_count, dmth->psect_count);
8707 contents = bfd_zalloc (info->output_bfd, off);
8708 if (contents == NULL)
8710 dmt->contents = contents;
8715 BFD_ASSERT (off == dmt->size);
8723 /* Read the contents of a section.
8724 buf points to a buffer of buf_size bytes to be filled with
8725 section data (starting at offset into section) */
8728 alpha_vms_get_section_contents (bfd *abfd, asection *section,
8729 void *buf, file_ptr offset,
8730 bfd_size_type count)
8734 /* Image are easy. */
8735 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
8736 return _bfd_generic_get_section_contents (abfd, section,
8737 buf, offset, count);
8740 if (offset + count < count
8741 || offset + count > section->size)
8743 bfd_set_error (bfd_error_invalid_operation);
8747 /* Alloc in memory and read ETIRs. */
8748 BFD_ASSERT (section->contents == NULL);
8750 for (sec = abfd->sections; sec; sec = sec->next)
8752 BFD_ASSERT (sec->contents == NULL);
8754 if (sec->size != 0 && (sec->flags & SEC_HAS_CONTENTS))
8756 sec->contents = bfd_alloc (abfd, sec->size);
8757 if (sec->contents == NULL)
8761 if (!alpha_vms_read_sections_content (abfd, NULL))
8763 for (sec = abfd->sections; sec; sec = sec->next)
8764 if (section->contents)
8765 section->flags |= SEC_IN_MEMORY;
8766 memcpy (buf, section->contents + offset, count);
8771 /* Set the format of a file being written. */
8774 alpha_vms_mkobject (bfd * abfd)
8776 const bfd_arch_info_type *arch;
8778 vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd));
8780 if (!vms_initialize (abfd))
8783 PRIV (recwr.buf) = bfd_alloc (abfd, MAX_OUTREC_SIZE);
8784 if (PRIV (recwr.buf) == NULL)
8787 arch = bfd_scan_arch ("alpha");
8791 bfd_set_error (bfd_error_wrong_format);
8795 abfd->arch_info = arch;
8802 /* Called when the BFD is being closed to do any necessary cleanup. */
8805 vms_close_and_cleanup (bfd * abfd)
8807 vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd));
8809 if (abfd == NULL || abfd->tdata.any == NULL)
8812 if (abfd->format == bfd_archive)
8814 bfd_release (abfd, abfd->tdata.any);
8815 abfd->tdata.any = NULL;
8819 if (PRIV (recrd.buf) != NULL)
8820 free (PRIV (recrd.buf));
8822 if (PRIV (sections) != NULL)
8823 free (PRIV (sections));
8825 bfd_release (abfd, abfd->tdata.any);
8826 abfd->tdata.any = NULL;
8829 if (abfd->direction == write_direction)
8831 /* Last step on VMS is to convert the file to variable record length
8833 if (bfd_cache_close (abfd) != TRUE)
8835 if (vms_convert_to_var_unix_filename (abfd->filename) != TRUE)
8843 /* Called when a new section is created. */
8846 vms_new_section_hook (bfd * abfd, asection *section)
8850 vms_debug2 ((1, "vms_new_section_hook (%p, [%d]%s)\n",
8851 abfd, section->index, section->name));
8853 bfd_set_section_alignment (abfd, section, 0);
8855 vms_debug2 ((7, "%d: %s\n", section->index, section->name));
8857 amt = sizeof (struct vms_section_data_struct);
8858 section->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
8859 if (section->used_by_bfd == NULL)
8862 if (strcmp (bfd_get_section_name (abfd, section), "$DST$") == 0)
8863 PRIV (dst_section) = section;
8865 /* Create the section symbol. */
8866 return _bfd_generic_new_section_hook (abfd, section);
8869 /* Part 4.5, symbols. */
8871 /* Print symbol to file according to how. how is one of
8872 bfd_print_symbol_name just print the name
8873 bfd_print_symbol_more print more (???)
8874 bfd_print_symbol_all print all we know, which is not much right now :-). */
8877 vms_print_symbol (bfd * abfd,
8880 bfd_print_symbol_type how)
8882 vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
8883 abfd, file, symbol, how));
8887 case bfd_print_symbol_name:
8888 case bfd_print_symbol_more:
8889 fprintf ((FILE *)file," %s", symbol->name);
8892 case bfd_print_symbol_all:
8894 const char *section_name = symbol->section->name;
8896 bfd_print_symbol_vandf (abfd, file, symbol);
8898 fprintf ((FILE *) file," %-8s %s", section_name, symbol->name);
8904 /* Return information about symbol in ret.
8906 fill type, value and name
8909 B bss segment symbol
8911 D data segment symbol
8913 t a static function symbol
8914 T text segment symbol
8919 vms_get_symbol_info (bfd * abfd ATTRIBUTE_UNUSED,
8925 vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd, symbol, ret));
8927 sec = symbol->section;
8934 else if (bfd_is_com_section (sec))
8936 else if (bfd_is_abs_section (sec))
8938 else if (bfd_is_und_section (sec))
8940 else if (bfd_is_ind_section (sec))
8942 else if ((symbol->flags & BSF_FUNCTION)
8943 || (bfd_get_section_flags (abfd, sec) & SEC_CODE))
8945 else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
8947 else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
8952 if (ret->type != 'U')
8953 ret->value = symbol->value + symbol->section->vma;
8956 ret->name = symbol->name;
8959 /* Return TRUE if the given symbol sym in the BFD abfd is
8960 a compiler generated local label, else return FALSE. */
8963 vms_bfd_is_local_label_name (bfd * abfd ATTRIBUTE_UNUSED,
8966 vms_debug2 ((1, "vms_bfd_is_local_label_name (%p, %s)\n", abfd, name));
8967 return name[0] == '$';
8970 /* Part 4.7, writing an object file. */
8972 /* Sets the contents of the section section in BFD abfd to the data starting
8973 in memory at LOCATION. The data is written to the output section starting
8974 at offset offset for count bytes.
8976 Normally TRUE is returned, else FALSE. Possible error returns are:
8977 o bfd_error_no_contents - The output section does not have the
8978 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
8979 o and some more too */
8982 _bfd_vms_set_section_contents (bfd * abfd,
8984 const void * location,
8986 bfd_size_type count)
8988 if (section->contents == NULL)
8990 section->contents = bfd_alloc (abfd, section->size);
8991 if (section->contents == NULL)
8994 memcpy (section->contents + offset, location, (size_t) count);
9000 /* Set the architecture and machine type in BFD abfd to arch and mach.
9001 Find the correct pointer to a structure and insert it into the arch_info
9005 alpha_vms_set_arch_mach (bfd *abfd,
9006 enum bfd_architecture arch, unsigned long mach)
9008 if (arch != bfd_arch_alpha
9009 && arch != bfd_arch_unknown)
9012 return bfd_default_set_arch_mach (abfd, arch, mach);
9015 /* Set section VMS flags. Clear NO_FLAGS and set FLAGS. */
9018 bfd_vms_set_section_flags (bfd *abfd ATTRIBUTE_UNUSED,
9019 asection *sec, flagword no_flags, flagword flags)
9021 vms_section_data (sec)->no_flags = no_flags;
9022 vms_section_data (sec)->flags = flags;
9025 struct vms_private_data_struct *
9026 bfd_vms_get_data (bfd *abfd)
9028 return (struct vms_private_data_struct *)abfd->tdata.any;
9031 #define vms_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9032 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms
9033 #define vms_bfd_copy_link_hash_symbol_type \
9034 _bfd_generic_copy_link_hash_symbol_type
9035 #define vms_bfd_is_group_section bfd_generic_is_group_section
9036 #define vms_bfd_discard_group bfd_generic_discard_group
9037 #define vms_section_already_linked _bfd_generic_section_already_linked
9038 #define vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9039 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
9041 #define vms_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
9042 #define vms_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
9043 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
9044 #define vms_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
9045 #define vms_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
9046 #define vms_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
9048 /* Symbols table. */
9049 #define alpha_vms_make_empty_symbol _bfd_generic_make_empty_symbol
9050 #define alpha_vms_bfd_is_target_special_symbol \
9051 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9052 #define alpha_vms_print_symbol vms_print_symbol
9053 #define alpha_vms_get_symbol_info vms_get_symbol_info
9054 #define alpha_vms_read_minisymbols _bfd_generic_read_minisymbols
9055 #define alpha_vms_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
9056 #define alpha_vms_get_lineno _bfd_nosymbols_get_lineno
9057 #define alpha_vms_find_inliner_info _bfd_nosymbols_find_inliner_info
9058 #define alpha_vms_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
9059 #define alpha_vms_find_nearest_line _bfd_vms_find_nearest_dst_line
9060 #define alpha_vms_bfd_is_local_label_name vms_bfd_is_local_label_name
9062 /* Generic table. */
9063 #define alpha_vms_close_and_cleanup vms_close_and_cleanup
9064 #define alpha_vms_bfd_free_cached_info vms_bfd_free_cached_info
9065 #define alpha_vms_new_section_hook vms_new_section_hook
9066 #define alpha_vms_set_section_contents _bfd_vms_set_section_contents
9067 #define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
9069 #define alpha_vms_bfd_get_relocated_section_contents \
9070 bfd_generic_get_relocated_section_contents
9072 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
9073 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
9074 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
9075 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
9076 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
9077 #define alpha_vms_section_already_linked \
9078 _bfd_generic_section_already_linked
9080 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9081 #define alpha_vms_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
9082 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
9083 #define alpha_vms_bfd_copy_link_hash_symbol_type \
9084 _bfd_generic_copy_link_hash_symbol_type
9086 #define alpha_vms_bfd_link_split_section _bfd_generic_link_split_section
9088 #define alpha_vms_get_dynamic_symtab_upper_bound \
9089 _bfd_nodynamic_get_dynamic_symtab_upper_bound
9090 #define alpha_vms_canonicalize_dynamic_symtab \
9091 _bfd_nodynamic_canonicalize_dynamic_symtab
9092 #define alpha_vms_get_dynamic_reloc_upper_bound \
9093 _bfd_nodynamic_get_dynamic_reloc_upper_bound
9094 #define alpha_vms_canonicalize_dynamic_reloc \
9095 _bfd_nodynamic_canonicalize_dynamic_reloc
9097 const bfd_target vms_alpha_vec =
9099 "vms-alpha", /* Name. */
9100 bfd_target_evax_flavour,
9101 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
9102 BFD_ENDIAN_LITTLE, /* Header byte order is little. */
9104 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
9105 | WP_TEXT | D_PAGED), /* Object flags. */
9106 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
9107 | SEC_READONLY | SEC_CODE | SEC_DATA
9108 | SEC_HAS_CONTENTS | SEC_IN_MEMORY), /* Sect flags. */
9109 0, /* symbol_leading_char. */
9110 ' ', /* ar_pad_char. */
9111 15, /* ar_max_namelen. */
9112 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9113 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9114 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9115 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9116 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9117 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9119 {_bfd_dummy_target, alpha_vms_object_p, /* bfd_check_format. */
9120 _bfd_vms_lib_alpha_archive_p, _bfd_dummy_target},
9121 {bfd_false, alpha_vms_mkobject, /* bfd_set_format. */
9122 _bfd_vms_lib_mkarchive, bfd_false},
9123 {bfd_false, alpha_vms_write_object_contents, /* bfd_write_contents. */
9124 _bfd_vms_lib_write_archive_contents, bfd_false},
9126 BFD_JUMP_TABLE_GENERIC (alpha_vms),
9127 BFD_JUMP_TABLE_COPY (vms),
9128 BFD_JUMP_TABLE_CORE (_bfd_nocore),
9129 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib),
9130 BFD_JUMP_TABLE_SYMBOLS (alpha_vms),
9131 BFD_JUMP_TABLE_RELOCS (alpha_vms),
9132 BFD_JUMP_TABLE_WRITE (alpha_vms),
9133 BFD_JUMP_TABLE_LINK (alpha_vms),
9134 BFD_JUMP_TABLE_DYNAMIC (alpha_vms),