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, 2011 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 Relocation optimizations
33 o protected sections (for messages)
51 #include "vms/eihvn.h"
52 #include "vms/eobjrec.h"
55 #include "vms/esgps.h"
64 #include "vms/esdfm.h"
65 #include "vms/esdfv.h"
71 #include "vms/internal.h"
74 #define MIN(a,b) ((a) < (b) ? (a) : (b))
76 /* The r_type field in a reloc is one of the following values. */
77 #define ALPHA_R_IGNORE 0
78 #define ALPHA_R_REFQUAD 1
79 #define ALPHA_R_BRADDR 2
80 #define ALPHA_R_HINT 3
81 #define ALPHA_R_SREL16 4
82 #define ALPHA_R_SREL32 5
83 #define ALPHA_R_SREL64 6
84 #define ALPHA_R_OP_PUSH 7
85 #define ALPHA_R_OP_STORE 8
86 #define ALPHA_R_OP_PSUB 9
87 #define ALPHA_R_OP_PRSHIFT 10
88 #define ALPHA_R_LINKAGE 11
89 #define ALPHA_R_REFLONG 12
90 #define ALPHA_R_CODEADDR 13
91 #define ALPHA_R_NOP 14
92 #define ALPHA_R_BSR 15
93 #define ALPHA_R_LDA 16
94 #define ALPHA_R_BOH 17
96 /* These are used with DST_S_C_LINE_NUM. */
97 #define DST_S_C_LINE_NUM_HEADER_SIZE 4
99 /* These are used with DST_S_C_SOURCE */
101 #define DST_S_B_PCLINE_UNSBYTE 1
102 #define DST_S_W_PCLINE_UNSWORD 1
103 #define DST_S_L_PCLINE_UNSLONG 1
105 #define DST_S_B_MODBEG_NAME 14
106 #define DST_S_L_RTNBEG_ADDRESS 5
107 #define DST_S_B_RTNBEG_NAME 13
108 #define DST_S_L_RTNEND_SIZE 5
110 /* These are used with DST_S_C_SOURCE. */
111 #define DST_S_C_SOURCE_HEADER_SIZE 4
113 #define DST_S_B_SRC_DF_LENGTH 1
114 #define DST_S_W_SRC_DF_FILEID 3
115 #define DST_S_B_SRC_DF_FILENAME 20
116 #define DST_S_B_SRC_UNSBYTE 1
117 #define DST_S_W_SRC_UNSWORD 1
118 #define DST_S_L_SRC_UNSLONG 1
120 /* Debugger symbol definitions. */
122 #define DBG_S_L_DMT_MODBEG 0
123 #define DBG_S_L_DST_SIZE 4
124 #define DBG_S_W_DMT_PSECT_COUNT 8
125 #define DBG_S_C_DMT_HEADER_SIZE 12
127 #define DBG_S_L_DMT_PSECT_START 0
128 #define DBG_S_L_DMT_PSECT_LENGTH 4
129 #define DBG_S_C_DMT_PSECT_SIZE 8
131 /* VMS module header. */
147 #define EMH_DATE_LENGTH 17
149 /* VMS End-Of-Module records (EOM/EEOM). */
153 unsigned int eom_l_total_lps;
154 unsigned short eom_w_comcod;
155 bfd_boolean eom_has_transfer;
156 unsigned char eom_b_tfrflg;
157 unsigned int eom_l_psindx;
158 unsigned int eom_l_tfradr;
161 struct vms_symbol_entry
167 unsigned char data_type;
168 unsigned short flags;
170 /* Section and offset/value of the symbol. */
174 /* Section and offset/value for the entry point (only for subprg). */
175 asection *code_section;
176 unsigned int code_value;
178 /* Symbol vector offset. */
179 unsigned int symbol_vector;
181 /* Length of the name. */
182 unsigned char namelen;
187 /* Stack value for push/pop commands. */
195 #define STACKSIZE 128
197 /* A minimal decoding of DST compilation units. We only decode
198 what's needed to get to the line number information. */
208 struct srecinfo *next;
216 struct lineinfo *next;
223 struct funcinfo *next;
231 /* Chain the previously read compilation unit. */
234 /* The module name. */
237 /* The start offset and size of debug info in the DST section. */
241 /* The lowest and highest addresses contained in this compilation
242 unit as specified in the compilation unit header. */
246 /* The listing line table. */
247 struct lineinfo *line_table;
249 /* The source record table. */
250 struct srecinfo *srec_table;
252 /* A list of the functions found in this module. */
253 struct funcinfo *func_table;
255 /* Current allocation of file_table. */
256 unsigned int file_table_count;
258 /* An array of the files making up this module. */
259 struct fileinfo *file_table;
262 /* BFD private data for alpha-vms. */
264 struct vms_private_data_struct
266 /* If true, relocs have been read. */
267 bfd_boolean reloc_done;
269 /* Record input buffer. */
270 struct vms_rec_rd recrd;
271 struct vms_rec_wr recwr;
273 struct hdr_struct hdr_data; /* data from HDR/EMH record */
274 struct eom_struct eom_data; /* data from EOM/EEOM record */
276 /* Transfer addresses (entry points). */
277 bfd_vma transfer_address[4];
279 /* Array of GSD sections to get the correspond BFD one. */
280 unsigned int section_max; /* Size of the sections array. */
281 unsigned int section_count; /* Number of GSD sections. */
284 /* Array of raw symbols. */
285 struct vms_symbol_entry **syms;
287 /* Canonicalized symbols. */
290 /* Number of symbols. */
291 unsigned int gsd_sym_count;
292 /* Size of the syms array. */
293 unsigned int max_sym_count;
294 /* Number of procedure symbols. */
295 unsigned int norm_sym_count;
297 /* Stack used to evaluate TIR/ETIR commands. */
298 struct stack_struct *stack;
301 /* Content reading. */
302 asection *image_section; /* section for image_ptr */
303 file_ptr image_offset; /* Offset for image_ptr. */
305 struct module *modules; /* list of all compilation units */
307 /* The DST section. */
308 asection *dst_section;
310 unsigned int dst_ptr_offsets_count; /* # of offsets in following array */
311 unsigned int *dst_ptr_offsets; /* array of saved image_ptr offsets */
313 /* Shared library support */
314 bfd_vma symvva; /* relative virtual address of symbol vector */
316 unsigned char matchctl;
318 /* Shared library index. This is used for input bfd while linking. */
319 unsigned int shr_index;
321 /* Used to place structures in the file. */
324 /* Simply linked list of eisd. */
325 struct vms_internal_eisd_map *eisd_head;
326 struct vms_internal_eisd_map *eisd_tail;
328 /* Simply linked list of eisd for shared libraries. */
329 struct vms_internal_eisd_map *gbl_eisd_head;
330 struct vms_internal_eisd_map *gbl_eisd_tail;
332 /* linkage index counter used by conditional store commands */
333 unsigned int vms_linkage_index;
335 /* see tc-alpha.c of gas for a description. */
336 int flag_hash_long_names; /* -+, hash instead of truncate */
337 int flag_show_after_trunc; /* -H, show hashing/truncation */
340 #define PRIV2(abfd, name) \
341 (((struct vms_private_data_struct *)(abfd)->tdata.any)->name)
342 #define PRIV(name) PRIV2(abfd,name)
345 /* Used to keep extra VMS specific information for a given section.
347 reloc_size holds the size of the relocation stream, note this
348 is very different from the number of relocations as VMS relocations
351 reloc_stream is the actual stream of relocation entries. */
353 struct vms_section_data_struct
355 /* Maximnum number of entries in sec->relocation. */
358 /* Corresponding eisd. Used only while generating executables. */
359 struct vms_internal_eisd_map *eisd;
361 /* PSC flags to be clear. */
364 /* PSC flags to be set. */
368 #define vms_section_data(sec) \
369 ((struct vms_section_data_struct *)sec->used_by_bfd)
371 /* To be called from the debugger. */
372 struct vms_private_data_struct *bfd_vms_get_data (bfd *abfd);
374 static int vms_get_remaining_object_record (bfd *abfd, int read_so_far);
375 static bfd_boolean _bfd_vms_slurp_object_records (bfd * abfd);
376 static void alpha_vms_add_fixup_lp (struct bfd_link_info *, bfd *, bfd *);
377 static void alpha_vms_add_fixup_ca (struct bfd_link_info *, bfd *, bfd *);
378 static void alpha_vms_add_fixup_qr (struct bfd_link_info *, bfd *, bfd *,
380 static void alpha_vms_add_fixup_lr (struct bfd_link_info *, unsigned int,
382 static void alpha_vms_add_lw_reloc (struct bfd_link_info *info);
383 static void alpha_vms_add_qw_reloc (struct bfd_link_info *info);
392 /* Number of elements in VEC. */
394 #define VEC_COUNT(VEC) ((VEC).nbr_el)
396 /* Get the address of the Nth element. */
398 #define VEC_EL(VEC, TYPE, N) (((TYPE *)((VEC).els))[N])
400 #define VEC_INIT(VEC) \
407 /* Be sure there is room for a new element. */
409 static void vector_grow1 (struct vector_type *vec, size_t elsz);
411 /* Allocate room for a new element and return its address. */
413 #define VEC_APPEND(VEC, TYPE) \
414 (vector_grow1 (&VEC, sizeof (TYPE)), &VEC_EL(VEC, TYPE, (VEC).nbr_el++))
416 /* Append an element. */
418 #define VEC_APPEND_EL(VEC, TYPE, EL) \
419 (*(VEC_APPEND (VEC, TYPE)) = EL)
421 struct alpha_vms_vma_ref
423 bfd_vma vma; /* Vma in the output. */
424 bfd_vma ref; /* Reference in the input. */
427 struct alpha_vms_shlib_el
430 bfd_boolean has_fixups;
432 struct vector_type lp; /* Vector of bfd_vma. */
433 struct vector_type ca; /* Vector of bfd_vma. */
434 struct vector_type qr; /* Vector of struct alpha_vms_vma_ref. */
437 /* Alpha VMS linker hash table. */
439 struct alpha_vms_link_hash_table
441 struct bfd_link_hash_table root;
443 /* Vector of shared libraries. */
444 struct vector_type shrlibs;
449 /* Base address. Used by fixups. */
453 #define alpha_vms_link_hash(INFO) \
454 ((struct alpha_vms_link_hash_table *)(INFO->hash))
456 /* Alpha VMS linker hash table entry. */
458 struct alpha_vms_link_hash_entry
460 struct bfd_link_hash_entry root;
462 /* Pointer to the original vms symbol. */
463 struct vms_symbol_entry *sym;
468 /* Read & process EIHD record.
469 Return TRUE on success, FALSE on error. */
472 _bfd_vms_slurp_eihd (bfd *abfd, unsigned int *eisd_offset,
473 unsigned int *eihs_offset)
475 unsigned int imgtype, size;
477 struct vms_eihd *eihd = (struct vms_eihd *)PRIV (recrd.rec);
479 vms_debug2 ((8, "_bfd_vms_slurp_eihd\n"));
481 size = bfd_getl32 (eihd->size);
482 imgtype = bfd_getl32 (eihd->imgtype);
484 if (imgtype == EIHD__K_EXE || imgtype == EIHD__K_LIM)
485 abfd->flags |= EXEC_P;
487 symvva = bfd_getl64 (eihd->symvva);
490 PRIV (symvva) = symvva;
491 abfd->flags |= DYNAMIC;
494 PRIV (ident) = bfd_getl32 (eihd->ident);
495 PRIV (matchctl) = eihd->matchctl;
497 *eisd_offset = bfd_getl32 (eihd->isdoff);
498 *eihs_offset = bfd_getl32 (eihd->symdbgoff);
500 vms_debug2 ((4, "EIHD size %d imgtype %d symvva 0x%lx eisd %d eihs %d\n",
501 size, imgtype, (unsigned long)symvva,
502 *eisd_offset, *eihs_offset));
507 /* Read & process EISD record.
508 Return TRUE on success, FALSE on error. */
511 _bfd_vms_slurp_eisd (bfd *abfd, unsigned int offset)
513 int section_count = 0;
515 vms_debug2 ((8, "_bfd_vms_slurp_eisd\n"));
519 struct vms_eisd *eisd;
520 unsigned int rec_size;
522 unsigned long long vaddr;
529 eisd = (struct vms_eisd *)(PRIV (recrd.rec) + offset);
530 rec_size = bfd_getl32 (eisd->eisdsize);
535 /* Skip to next block if pad. */
536 if (rec_size == 0xffffffff)
538 offset = (offset + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
544 size = bfd_getl32 (eisd->secsize);
545 vaddr = bfd_getl64 (eisd->virt_addr);
546 flags = bfd_getl32 (eisd->flags);
547 vbn = bfd_getl32 (eisd->vbn);
549 vms_debug2 ((4, "EISD at 0x%x size 0x%x addr 0x%lx flags 0x%x blk %d\n",
550 offset, size, (unsigned long)vaddr, flags, vbn));
552 /* VMS combines psects from .obj files into isects in the .exe. This
553 process doesn't preserve enough information to reliably determine
554 what's in each section without examining the data. This is
555 especially true of DWARF debug sections. */
556 bfd_flags = SEC_ALLOC;
558 bfd_flags |= SEC_HAS_CONTENTS | SEC_LOAD;
560 if (flags & EISD__M_EXE)
561 bfd_flags |= SEC_CODE;
563 if (flags & EISD__M_NONSHRADR)
564 bfd_flags |= SEC_DATA;
566 if (!(flags & EISD__M_WRT))
567 bfd_flags |= SEC_READONLY;
569 if (flags & EISD__M_DZRO)
570 bfd_flags |= SEC_DATA;
572 if (flags & EISD__M_FIXUPVEC)
573 bfd_flags |= SEC_DATA;
575 if (flags & EISD__M_CRF)
576 bfd_flags |= SEC_DATA;
578 if (flags & EISD__M_GBL)
580 name = _bfd_vms_save_counted_string (eisd->gblnam);
581 bfd_flags |= SEC_COFF_SHARED_LIBRARY;
582 bfd_flags &= ~(SEC_ALLOC | SEC_LOAD);
584 else if (flags & EISD__M_FIXUPVEC)
586 else if (eisd->type == EISD__K_USRSTACK)
592 name = (char*) bfd_alloc (abfd, 32);
593 if (flags & EISD__M_DZRO)
595 else if (flags & EISD__M_EXE)
597 else if (!(flags & EISD__M_WRT))
601 BFD_ASSERT (section_count < 999);
602 sprintf (name, "$%s_%03d$", pfx, section_count++);
605 section = bfd_make_section (abfd, name);
610 section->filepos = vbn ? VMS_BLOCK_SIZE * (vbn - 1) : 0;
611 section->size = size;
612 section->vma = vaddr;
614 if (!bfd_set_section_flags (abfd, section, bfd_flags))
621 /* Read & process EIHS record.
622 Return TRUE on success, FALSE on error. */
625 _bfd_vms_slurp_eihs (bfd *abfd, unsigned int offset)
627 unsigned char *p = PRIV (recrd.rec) + offset;
628 unsigned int gstvbn = bfd_getl32 (p + EIHS__L_GSTVBN);
629 unsigned int gstsize ATTRIBUTE_UNUSED = bfd_getl32 (p + EIHS__L_GSTSIZE);
630 unsigned int dstvbn = bfd_getl32 (p + EIHS__L_DSTVBN);
631 unsigned int dstsize = bfd_getl32 (p + EIHS__L_DSTSIZE);
632 unsigned int dmtvbn = bfd_getl32 (p + EIHS__L_DMTVBN);
633 unsigned int dmtbytes = bfd_getl32 (p + EIHS__L_DMTBYTES);
637 vms_debug (8, "_bfd_vms_slurp_ihs\n");
638 vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
639 gstvbn, gstsize, dstvbn, dstsize, dmtvbn, dmtbytes);
644 flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
646 section = bfd_make_section (abfd, "$DST$");
650 section->size = dstsize;
651 section->filepos = VMS_BLOCK_SIZE * (dstvbn - 1);
653 if (!bfd_set_section_flags (abfd, section, bfd_flags))
656 PRIV (dst_section) = section;
657 abfd->flags |= (HAS_DEBUG | HAS_LINENO);
662 flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
664 section = bfd_make_section (abfd, "$DMT$");
668 section->size = dmtbytes;
669 section->filepos = VMS_BLOCK_SIZE * (dmtvbn - 1);
671 if (!bfd_set_section_flags (abfd, section, bfd_flags))
677 if (bfd_seek (abfd, VMS_BLOCK_SIZE * (gstvbn - 1), SEEK_SET))
679 bfd_set_error (bfd_error_file_truncated);
683 if (_bfd_vms_slurp_object_records (abfd) != TRUE)
686 abfd->flags |= HAS_SYMS;
692 /* Object file reading. */
694 /* Object file input functions. */
696 /* Get next record from object file to vms_buf.
697 Set PRIV(buf_size) and return it
699 This is a little tricky since it should be portable.
701 The openVMS object file has 'variable length' which means that
702 read() returns data in chunks of (hopefully) correct and expected
703 size. The linker (and other tools on VMS) depend on that. Unix
704 doesn't know about 'formatted' files, so reading and writing such
705 an object file in a Unix environment is not trivial.
707 With the tool 'file' (available on all VMS FTP sites), one
708 can view and change the attributes of a file. Changing from
709 'variable length' to 'fixed length, 512 bytes' reveals the
710 record size at the first 2 bytes of every record. The same
711 may happen during the transfer of object files from VMS to Unix,
712 at least with UCX, the DEC implementation of TCP/IP.
714 The VMS format repeats the size at bytes 2 & 3 of every record.
716 On the first call (file_format == FF_UNKNOWN) we check if
717 the first and the third byte pair (!) of the record match.
718 If they do it's an object file in an Unix environment or with
719 wrong attributes (FF_FOREIGN), else we should be in a VMS
720 environment where read() returns the record size (FF_NATIVE).
722 Reading is always done in 2 steps:
723 1. first just the record header is read and the size extracted,
724 2. then the read buffer is adjusted and the remaining bytes are
727 All file I/O is done on even file positions. */
729 #define VMS_OBJECT_ADJUSTMENT 2
732 maybe_adjust_record_pointer_for_object (bfd *abfd)
734 /* Set the file format once for all on the first invocation. */
735 if (PRIV (recrd.file_format) == FF_UNKNOWN)
737 if (PRIV (recrd.rec)[0] == PRIV (recrd.rec)[4]
738 && PRIV (recrd.rec)[1] == PRIV (recrd.rec)[5])
739 PRIV (recrd.file_format) = FF_FOREIGN;
741 PRIV (recrd.file_format) = FF_NATIVE;
744 /* The adjustment is needed only in an Unix environment. */
745 if (PRIV (recrd.file_format) == FF_FOREIGN)
746 PRIV (recrd.rec) += VMS_OBJECT_ADJUSTMENT;
749 /* Implement step #1 of the object record reading procedure.
750 Return the record type or -1 on failure. */
753 _bfd_vms_get_object_record (bfd *abfd)
755 unsigned int test_len = 6;
758 vms_debug2 ((8, "_bfd_vms_get_obj_record\n"));
760 /* Skip alignment byte if the current position is odd. */
761 if (PRIV (recrd.file_format) == FF_FOREIGN && (bfd_tell (abfd) & 1))
763 if (bfd_bread (PRIV (recrd.buf), 1, abfd) != 1)
765 bfd_set_error (bfd_error_file_truncated);
770 /* Read the record header */
771 if (bfd_bread (PRIV (recrd.buf), test_len, abfd) != test_len)
773 bfd_set_error (bfd_error_file_truncated);
777 /* Reset the record pointer. */
778 PRIV (recrd.rec) = PRIV (recrd.buf);
779 maybe_adjust_record_pointer_for_object (abfd);
781 if (vms_get_remaining_object_record (abfd, test_len) <= 0)
784 type = bfd_getl16 (PRIV (recrd.rec));
786 vms_debug2 ((8, "_bfd_vms_get_obj_record: rec %p, size %d, type %d\n",
787 PRIV (recrd.rec), PRIV (recrd.rec_size), type));
792 /* Implement step #2 of the object record reading procedure.
793 Return the size of the record or 0 on failure. */
796 vms_get_remaining_object_record (bfd *abfd, int read_so_far)
798 unsigned int to_read;
800 vms_debug2 ((8, "vms_get_remaining_obj_record\n"));
802 /* Extract record size. */
803 PRIV (recrd.rec_size) = bfd_getl16 (PRIV (recrd.rec) + 2);
805 if (PRIV (recrd.rec_size) == 0)
807 bfd_set_error (bfd_error_file_truncated);
811 /* That's what the linker manual says. */
812 if (PRIV (recrd.rec_size) > EOBJ__C_MAXRECSIZ)
814 bfd_set_error (bfd_error_file_truncated);
818 /* Take into account object adjustment. */
819 to_read = PRIV (recrd.rec_size);
820 if (PRIV (recrd.file_format) == FF_FOREIGN)
821 to_read += VMS_OBJECT_ADJUSTMENT;
823 /* Adjust the buffer. */
824 if (to_read > PRIV (recrd.buf_size))
827 = (unsigned char *) bfd_realloc (PRIV (recrd.buf), to_read);
828 if (PRIV (recrd.buf) == NULL)
830 PRIV (recrd.buf_size) = to_read;
833 /* Read the remaining record. */
834 to_read -= read_so_far;
836 vms_debug2 ((8, "vms_get_remaining_obj_record: to_read %d\n", to_read));
838 if (bfd_bread (PRIV (recrd.buf) + read_so_far, to_read, abfd) != to_read)
840 bfd_set_error (bfd_error_file_truncated);
844 /* Reset the record pointer. */
845 PRIV (recrd.rec) = PRIV (recrd.buf);
846 maybe_adjust_record_pointer_for_object (abfd);
848 vms_debug2 ((8, "vms_get_remaining_obj_record: size %d\n",
849 PRIV (recrd.rec_size)));
851 return PRIV (recrd.rec_size);
854 /* Read and process emh record.
855 Return TRUE on success, FALSE on error. */
858 _bfd_vms_slurp_ehdr (bfd *abfd)
861 unsigned char *vms_rec;
864 vms_rec = PRIV (recrd.rec);
866 vms_debug2 ((2, "HDR/EMH\n"));
868 subtype = bfd_getl16 (vms_rec + 4);
870 vms_debug2 ((3, "subtype %d\n", subtype));
876 PRIV (hdr_data).hdr_b_strlvl = vms_rec[6];
877 PRIV (hdr_data).hdr_l_arch1 = bfd_getl32 (vms_rec + 8);
878 PRIV (hdr_data).hdr_l_arch2 = bfd_getl32 (vms_rec + 12);
879 PRIV (hdr_data).hdr_l_recsiz = bfd_getl32 (vms_rec + 16);
880 PRIV (hdr_data).hdr_t_name = _bfd_vms_save_counted_string (vms_rec + 20);
881 ptr = vms_rec + 20 + vms_rec[20] + 1;
882 PRIV (hdr_data).hdr_t_version =_bfd_vms_save_counted_string (ptr);
884 PRIV (hdr_data).hdr_t_date = _bfd_vms_save_sized_string (ptr, 17);
888 PRIV (hdr_data).hdr_c_lnm =
889 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
893 PRIV (hdr_data).hdr_c_src =
894 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
898 PRIV (hdr_data).hdr_c_ttl =
899 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
908 bfd_set_error (bfd_error_wrong_format);
915 /* Typical sections for evax object files. */
917 #define EVAX_ABS_NAME "$ABS$"
918 #define EVAX_CODE_NAME "$CODE$"
919 #define EVAX_LINK_NAME "$LINK$"
920 #define EVAX_DATA_NAME "$DATA$"
921 #define EVAX_BSS_NAME "$BSS$"
922 #define EVAX_READONLYADDR_NAME "$READONLY_ADDR$"
923 #define EVAX_READONLY_NAME "$READONLY$"
924 #define EVAX_LITERAL_NAME "$LITERAL$"
925 #define EVAX_LITERALS_NAME "$LITERALS"
926 #define EVAX_COMMON_NAME "$COMMON$"
927 #define EVAX_LOCAL_NAME "$LOCAL$"
929 struct sec_flags_struct
931 const char *name; /* Name of section. */
933 flagword flags_always; /* Flags we set always. */
935 flagword flags_hassize; /* Flags we set if the section has a size > 0. */
938 /* These flags are deccrtl/vaxcrtl (openVMS 6.2 Alpha) compatible. */
940 static const struct sec_flags_struct evax_section_flags[] =
948 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_EXE,
949 SEC_CODE | SEC_READONLY,
950 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_EXE,
951 SEC_CODE | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
953 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD | EGPS__V_NOMOD,
954 SEC_DATA | SEC_READONLY,
955 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD,
956 SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
958 EGPS__V_REL | EGPS__V_RD,
959 SEC_DATA | SEC_READONLY,
960 EGPS__V_REL | EGPS__V_RD,
961 SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
963 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD,
965 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
966 SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
968 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD,
970 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD,
972 { EVAX_READONLYADDR_NAME,
973 EGPS__V_PIC | EGPS__V_REL | EGPS__V_RD,
974 SEC_DATA | SEC_READONLY,
975 EGPS__V_PIC | EGPS__V_REL | EGPS__V_RD,
976 SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
977 { EVAX_READONLY_NAME,
978 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD | EGPS__V_NOMOD,
979 SEC_DATA | SEC_READONLY,
980 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD,
981 SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
983 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
985 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
986 SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
987 { EVAX_LITERALS_NAME,
988 EGPS__V_PIC | EGPS__V_OVR,
989 SEC_DATA | SEC_READONLY,
990 EGPS__V_PIC | EGPS__V_OVR,
991 SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
993 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
995 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
996 SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD }
999 /* Retrieve BFD section flags by name and size. */
1002 vms_secflag_by_name (const struct sec_flags_struct *section_flags,
1008 while (section_flags[i].name != NULL)
1010 if (strcmp (name, section_flags[i].name) == 0)
1013 return section_flags[i].flags_hassize;
1015 return section_flags[i].flags_always;
1020 return section_flags[i].flags_hassize;
1021 return section_flags[i].flags_always;
1024 /* Retrieve VMS section flags by name and size. */
1027 vms_esecflag_by_name (const struct sec_flags_struct *section_flags,
1033 while (section_flags[i].name != NULL)
1035 if (strcmp (name, section_flags[i].name) == 0)
1038 return section_flags[i].vflags_hassize;
1040 return section_flags[i].vflags_always;
1045 return section_flags[i].vflags_hassize;
1046 return section_flags[i].vflags_always;
1049 /* Add SYM to the symbol table of ABFD.
1050 Return FALSE in case of error. */
1053 add_symbol_entry (bfd *abfd, struct vms_symbol_entry *sym)
1055 if (PRIV (gsd_sym_count) >= PRIV (max_sym_count))
1057 if (PRIV (max_sym_count) == 0)
1059 PRIV (max_sym_count) = 128;
1060 PRIV (syms) = bfd_malloc
1061 (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *));
1065 PRIV (max_sym_count) *= 2;
1066 PRIV (syms) = bfd_realloc
1068 (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *)));
1070 if (PRIV (syms) == NULL)
1074 PRIV (syms)[PRIV (gsd_sym_count)++] = sym;
1078 /* Create a symbol whose name is ASCIC and add it to ABFD.
1079 Return NULL in case of error. */
1081 static struct vms_symbol_entry *
1082 add_symbol (bfd *abfd, const unsigned char *ascic)
1084 struct vms_symbol_entry *entry;
1088 entry = (struct vms_symbol_entry *)bfd_zalloc (abfd, sizeof (*entry) + len);
1091 entry->namelen = len;
1092 memcpy (entry->name, ascic, len);
1093 entry->name[len] = 0;
1094 entry->owner = abfd;
1096 if (!add_symbol_entry (abfd, entry))
1101 /* Read and process EGSD. Return FALSE on failure. */
1104 _bfd_vms_slurp_egsd (bfd *abfd)
1106 int gsd_type, gsd_size;
1107 unsigned char *vms_rec;
1108 unsigned long base_addr;
1110 vms_debug2 ((2, "EGSD\n"));
1112 PRIV (recrd.rec) += 8; /* Skip type, size, align pad. */
1113 PRIV (recrd.rec_size) -= 8;
1115 /* Calculate base address for each section. */
1118 while (PRIV (recrd.rec_size) > 0)
1120 vms_rec = PRIV (recrd.rec);
1122 gsd_type = bfd_getl16 (vms_rec);
1123 gsd_size = bfd_getl16 (vms_rec + 2);
1125 vms_debug2 ((3, "egsd_type %d\n", gsd_type));
1130 /* Program section definition. */
1132 struct vms_egps *egps = (struct vms_egps *)vms_rec;
1133 flagword new_flags, vms_flags;
1136 vms_flags = bfd_getl16 (egps->flags);
1138 if ((vms_flags & EGPS__V_REL) == 0)
1140 /* Use the global absolute section for all
1141 absolute sections. */
1142 section = bfd_abs_section_ptr;
1147 unsigned long align_addr;
1149 name = _bfd_vms_save_counted_string (&egps->namlng);
1151 section = bfd_make_section (abfd, name);
1155 section->filepos = 0;
1156 section->size = bfd_getl32 (egps->alloc);
1157 section->alignment_power = egps->align;
1159 vms_section_data (section)->flags = vms_flags;
1160 vms_section_data (section)->no_flags = 0;
1162 new_flags = vms_secflag_by_name (evax_section_flags, name,
1164 if (section->size > 0)
1165 new_flags |= SEC_LOAD;
1166 if (!(vms_flags & EGPS__V_NOMOD) && section->size > 0)
1168 /* Set RELOC and HAS_CONTENTS if the section is not
1169 demand-zero and not empty. */
1170 new_flags |= SEC_HAS_CONTENTS;
1171 if (vms_flags & EGPS__V_REL)
1172 new_flags |= SEC_RELOC;
1174 if (vms_flags & EGPS__V_EXE)
1176 /* Set CODE if section is executable. */
1177 new_flags |= SEC_CODE;
1178 new_flags &= ~SEC_DATA;
1180 if (!bfd_set_section_flags (abfd, section, new_flags))
1183 /* Give a non-overlapping vma to non absolute sections. */
1184 align_addr = (1 << section->alignment_power);
1185 if ((base_addr % align_addr) != 0)
1186 base_addr += (align_addr - (base_addr % align_addr));
1187 section->vma = (bfd_vma)base_addr;
1188 base_addr += section->size;
1191 /* Append it to the section array. */
1192 if (PRIV (section_count) >= PRIV (section_max))
1194 if (PRIV (section_max) == 0)
1195 PRIV (section_max) = 16;
1197 PRIV (section_max) *= 2;
1198 PRIV (sections) = bfd_realloc_or_free
1199 (PRIV (sections), PRIV (section_max) * sizeof (asection *));
1200 if (PRIV (sections) == NULL)
1204 PRIV (sections)[PRIV (section_count)] = section;
1205 PRIV (section_count)++;
1212 struct vms_symbol_entry *entry;
1213 struct vms_egsy *egsy = (struct vms_egsy *) vms_rec;
1216 old_flags = bfd_getl16 (egsy->flags);
1217 if (old_flags & EGSY__V_DEF)
1218 nameoff = ESDF__B_NAMLNG;
1220 nameoff = ESRF__B_NAMLNG;
1222 entry = add_symbol (abfd, vms_rec + nameoff);
1226 /* Allow only duplicate reference. */
1227 if ((entry->flags & EGSY__V_DEF) && (old_flags & EGSY__V_DEF))
1230 if (entry->typ == 0)
1232 entry->typ = gsd_type;
1233 entry->data_type = egsy->datyp;
1234 entry->flags = old_flags;
1237 if (old_flags & EGSY__V_DEF)
1239 struct vms_esdf *esdf = (struct vms_esdf *)vms_rec;
1241 entry->value = bfd_getl64 (esdf->value);
1242 entry->section = PRIV (sections)[bfd_getl32 (esdf->psindx)];
1244 if (old_flags & EGSY__V_NORM)
1246 PRIV (norm_sym_count)++;
1248 entry->code_value = bfd_getl64 (esdf->code_address);
1249 entry->code_section =
1250 PRIV (sections)[bfd_getl32 (esdf->ca_psindx)];
1258 struct vms_symbol_entry *entry;
1259 struct vms_egst *egst = (struct vms_egst *)vms_rec;
1262 old_flags = bfd_getl16 (egst->header.flags);
1264 entry = add_symbol (abfd, &egst->namlng);
1269 entry->typ = gsd_type;
1270 entry->data_type = egst->header.datyp;
1271 entry->flags = old_flags;
1273 entry->symbol_vector = bfd_getl32 (egst->value);
1275 if (old_flags & EGSY__V_REL)
1276 entry->section = PRIV (sections)[bfd_getl32 (egst->psindx)];
1278 entry->section = bfd_abs_section_ptr;
1280 entry->value = bfd_getl64 (egst->lp_2);
1282 if (old_flags & EGSY__V_NORM)
1284 PRIV (norm_sym_count)++;
1286 entry->code_value = bfd_getl64 (egst->lp_1);
1287 entry->code_section = bfd_abs_section_ptr;
1294 /* Currently ignored. */
1299 (*_bfd_error_handler) (_("Unknown EGSD subtype %d"), gsd_type);
1300 bfd_set_error (bfd_error_bad_value);
1304 PRIV (recrd.rec_size) -= gsd_size;
1305 PRIV (recrd.rec) += gsd_size;
1308 if (PRIV (gsd_sym_count) > 0)
1309 abfd->flags |= HAS_SYMS;
1314 /* Stack routines for vms ETIR commands. */
1316 /* Push value and section index. */
1319 _bfd_vms_push (bfd *abfd, bfd_vma val, unsigned int reloc)
1321 vms_debug2 ((4, "<push %08lx (0x%08x) at %d>\n",
1322 (unsigned long)val, reloc, PRIV (stackptr)));
1324 PRIV (stack[PRIV (stackptr)]).value = val;
1325 PRIV (stack[PRIV (stackptr)]).reloc = reloc;
1327 if (PRIV (stackptr) >= STACKSIZE)
1329 bfd_set_error (bfd_error_bad_value);
1330 (*_bfd_error_handler) (_("Stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr));
1335 /* Pop value and section index. */
1338 _bfd_vms_pop (bfd *abfd, bfd_vma *val, unsigned int *rel)
1340 if (PRIV (stackptr) == 0)
1342 bfd_set_error (bfd_error_bad_value);
1343 (*_bfd_error_handler) (_("Stack underflow in _bfd_vms_pop"));
1347 *val = PRIV (stack[PRIV (stackptr)]).value;
1348 *rel = PRIV (stack[PRIV (stackptr)]).reloc;
1350 vms_debug2 ((4, "<pop %08lx (0x%08x)>\n", (unsigned long)*val, *rel));
1353 /* Routines to fill sections contents during tir/etir read. */
1355 /* Initialize image buffer pointer to be filled. */
1358 image_set_ptr (bfd *abfd, bfd_vma vma, int sect, struct bfd_link_info *info)
1362 vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma, sect));
1364 sec = PRIV (sections)[sect];
1368 /* Reading contents to an output bfd. */
1370 if (sec->output_section == NULL)
1372 /* Section discarded. */
1373 vms_debug2 ((5, " section %s discarded\n", sec->name));
1375 /* This is not used. */
1376 PRIV (image_section) = NULL;
1377 PRIV (image_offset) = 0;
1380 PRIV (image_offset) = sec->output_offset + vma;
1381 PRIV (image_section) = sec->output_section;
1385 PRIV (image_offset) = vma;
1386 PRIV (image_section) = sec;
1390 /* Increment image buffer pointer by offset. */
1393 image_inc_ptr (bfd *abfd, bfd_vma offset)
1395 vms_debug2 ((4, "image_inc_ptr (%u)\n", (unsigned)offset));
1397 PRIV (image_offset) += offset;
1400 /* Save current DST location counter under specified index. */
1403 dst_define_location (bfd *abfd, unsigned int loc)
1405 vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc));
1407 /* Grow the ptr offset table if necessary. */
1408 if (loc + 1 > PRIV (dst_ptr_offsets_count))
1410 PRIV (dst_ptr_offsets) = bfd_realloc (PRIV (dst_ptr_offsets),
1411 (loc + 1) * sizeof (unsigned int));
1412 PRIV (dst_ptr_offsets_count) = loc + 1;
1415 PRIV (dst_ptr_offsets)[loc] = PRIV (image_offset);
1418 /* Restore saved DST location counter from specified index. */
1421 dst_restore_location (bfd *abfd, unsigned int loc)
1423 vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc));
1425 PRIV (image_offset) = PRIV (dst_ptr_offsets)[loc];
1428 /* Retrieve saved DST location counter from specified index. */
1431 dst_retrieve_location (bfd *abfd, unsigned int loc)
1433 vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int)loc));
1435 return PRIV (dst_ptr_offsets)[loc];
1438 /* Write multiple bytes to section image. */
1441 image_write (bfd *abfd, unsigned char *ptr, int size)
1444 _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr, size,
1445 (long)PRIV (image_offset));
1446 _bfd_hexdump (9, ptr, size, 0);
1449 if (PRIV (image_section)->contents != NULL)
1451 asection *sec = PRIV (image_section);
1452 file_ptr off = PRIV (image_offset);
1455 if (off > (file_ptr)sec->size
1456 || size > (file_ptr)sec->size
1457 || off + size > (file_ptr)sec->size)
1459 bfd_set_error (bfd_error_bad_value);
1463 memcpy (sec->contents + off, ptr, size);
1466 PRIV (image_offset) += size;
1470 /* Write byte to section image. */
1473 image_write_b (bfd * abfd, unsigned int value)
1475 unsigned char data[1];
1477 vms_debug2 ((6, "image_write_b (%02x)\n", (int) value));
1481 return image_write (abfd, data, sizeof (data));
1484 /* Write 2-byte word to image. */
1487 image_write_w (bfd * abfd, unsigned int value)
1489 unsigned char data[2];
1491 vms_debug2 ((6, "image_write_w (%04x)\n", (int) value));
1493 bfd_putl16 (value, data);
1494 return image_write (abfd, data, sizeof (data));
1497 /* Write 4-byte long to image. */
1500 image_write_l (bfd * abfd, unsigned long value)
1502 unsigned char data[4];
1504 vms_debug2 ((6, "image_write_l (%08lx)\n", value));
1506 bfd_putl32 (value, data);
1507 return image_write (abfd, data, sizeof (data));
1510 /* Write 8-byte quad to image. */
1513 image_write_q (bfd * abfd, bfd_vma value)
1515 unsigned char data[8];
1517 vms_debug2 ((6, "image_write_q (%08lx)\n", (unsigned long)value));
1519 bfd_putl64 (value, data);
1520 return image_write (abfd, data, sizeof (data));
1524 _bfd_vms_etir_name (int cmd)
1528 case ETIR__C_STA_GBL: return "ETIR__C_STA_GBL";
1529 case ETIR__C_STA_LW: return "ETIR__C_STA_LW";
1530 case ETIR__C_STA_QW: return "ETIR__C_STA_QW";
1531 case ETIR__C_STA_PQ: return "ETIR__C_STA_PQ";
1532 case ETIR__C_STA_LI: return "ETIR__C_STA_LI";
1533 case ETIR__C_STA_MOD: return "ETIR__C_STA_MOD";
1534 case ETIR__C_STA_CKARG: return "ETIR__C_STA_CKARG";
1535 case ETIR__C_STO_B: return "ETIR__C_STO_B";
1536 case ETIR__C_STO_W: return "ETIR__C_STO_W";
1537 case ETIR__C_STO_GBL: return "ETIR__C_STO_GBL";
1538 case ETIR__C_STO_CA: return "ETIR__C_STO_CA";
1539 case ETIR__C_STO_RB: return "ETIR__C_STO_RB";
1540 case ETIR__C_STO_AB: return "ETIR__C_STO_AB";
1541 case ETIR__C_STO_OFF: return "ETIR__C_STO_OFF";
1542 case ETIR__C_STO_IMM: return "ETIR__C_STO_IMM";
1543 case ETIR__C_STO_IMMR: return "ETIR__C_STO_IMMR";
1544 case ETIR__C_STO_LW: return "ETIR__C_STO_LW";
1545 case ETIR__C_STO_QW: return "ETIR__C_STO_QW";
1546 case ETIR__C_STO_GBL_LW: return "ETIR__C_STO_GBL_LW";
1547 case ETIR__C_STO_LP_PSB: return "ETIR__C_STO_LP_PSB";
1548 case ETIR__C_STO_HINT_GBL: return "ETIR__C_STO_HINT_GBL";
1549 case ETIR__C_STO_HINT_PS: return "ETIR__C_STO_HINT_PS";
1550 case ETIR__C_OPR_ADD: return "ETIR__C_OPR_ADD";
1551 case ETIR__C_OPR_SUB: return "ETIR__C_OPR_SUB";
1552 case ETIR__C_OPR_INSV: return "ETIR__C_OPR_INSV";
1553 case ETIR__C_OPR_USH: return "ETIR__C_OPR_USH";
1554 case ETIR__C_OPR_ROT: return "ETIR__C_OPR_ROT";
1555 case ETIR__C_OPR_REDEF: return "ETIR__C_OPR_REDEF";
1556 case ETIR__C_OPR_DFLIT: return "ETIR__C_OPR_DFLIT";
1557 case ETIR__C_STC_LP: return "ETIR__C_STC_LP";
1558 case ETIR__C_STC_GBL: return "ETIR__C_STC_GBL";
1559 case ETIR__C_STC_GCA: return "ETIR__C_STC_GCA";
1560 case ETIR__C_STC_PS: return "ETIR__C_STC_PS";
1561 case ETIR__C_STC_NBH_PS: return "ETIR__C_STC_NBH_PS";
1562 case ETIR__C_STC_NOP_GBL: return "ETIR__C_STC_NOP_GBL";
1563 case ETIR__C_STC_NOP_PS: return "ETIR__C_STC_NOP_PS";
1564 case ETIR__C_STC_BSR_GBL: return "ETIR__C_STC_BSR_GBL";
1565 case ETIR__C_STC_BSR_PS: return "ETIR__C_STC_BSR_PS";
1566 case ETIR__C_STC_LDA_GBL: return "ETIR__C_STC_LDA_GBL";
1567 case ETIR__C_STC_LDA_PS: return "ETIR__C_STC_LDA_PS";
1568 case ETIR__C_STC_BOH_GBL: return "ETIR__C_STC_BOH_GBL";
1569 case ETIR__C_STC_BOH_PS: return "ETIR__C_STC_BOH_PS";
1570 case ETIR__C_STC_NBH_GBL: return "ETIR__C_STC_NBH_GBL";
1571 case ETIR__C_STC_LP_PSB: return "ETIR__C_STC_LP_PSB";
1572 case ETIR__C_CTL_SETRB: return "ETIR__C_CTL_SETRB";
1573 case ETIR__C_CTL_AUGRB: return "ETIR__C_CTL_AUGRB";
1574 case ETIR__C_CTL_DFLOC: return "ETIR__C_CTL_DFLOC";
1575 case ETIR__C_CTL_STLOC: return "ETIR__C_CTL_STLOC";
1576 case ETIR__C_CTL_STKDL: return "ETIR__C_CTL_STKDL";
1579 /* These names have not yet been added to this switch statement. */
1580 (*_bfd_error_handler) (_("unknown ETIR command %d"), cmd);
1585 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
1588 _bfd_vms_get_value (bfd *abfd, const unsigned char *ascic,
1589 struct bfd_link_info *info,
1591 struct alpha_vms_link_hash_entry **hp)
1596 struct alpha_vms_link_hash_entry *h;
1598 /* Not linking. Do not try to resolve the symbol. */
1607 for (i = 0; i < len; i++)
1608 name[i] = ascic[i + 1];
1611 h = (struct alpha_vms_link_hash_entry *)
1612 bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
1617 && (h->root.type == bfd_link_hash_defined
1618 || h->root.type == bfd_link_hash_defweak))
1619 *vma = h->root.u.def.value
1620 + h->root.u.def.section->output_offset
1621 + h->root.u.def.section->output_section->vma;
1622 else if (h && h->root.type == bfd_link_hash_undefweak)
1626 if (!(*info->callbacks->undefined_symbol)
1627 (info, name, abfd, PRIV (image_section), PRIV (image_offset), TRUE))
1635 #define RELC_SHR_BASE 0x10000
1636 #define RELC_SEC_BASE 0x20000
1637 #define RELC_MASK 0x0ffff
1640 alpha_vms_sym_to_ctxt (struct alpha_vms_link_hash_entry *h)
1642 /* Handle undefined symbols. */
1643 if (h == NULL || h->sym == NULL)
1646 if (h->sym->typ == EGSD__C_SYMG)
1648 if (h->sym->flags & EGSY__V_REL)
1649 return RELC_SHR_BASE + PRIV2 (h->sym->owner, shr_index);
1652 /* Can this happen (non-relocatable symg) ? I'd like to see
1657 if (h->sym->typ == EGSD__C_SYM)
1659 if (h->sym->flags & EGSY__V_REL)
1668 alpha_vms_get_sym_value (asection *sect, bfd_vma addr)
1670 return sect->output_section->vma + sect->output_offset + addr;
1674 alpha_vms_fix_sec_rel (bfd *abfd, struct bfd_link_info *info,
1675 unsigned int rel, bfd_vma vma)
1677 asection *sec = PRIV (sections)[rel & RELC_MASK];
1681 if (sec->output_section == NULL)
1683 return vma + sec->output_section->vma + sec->output_offset;
1686 return vma + sec->vma;
1689 /* Read an ETIR record from ABFD. If INFO is not null, put the content into
1690 the output section (used during linking).
1691 Return FALSE in case of error. */
1694 _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info)
1697 unsigned int length;
1698 unsigned char *maxptr;
1703 struct alpha_vms_link_hash_entry *h;
1705 PRIV (recrd.rec) += ETIR__C_HEADER_SIZE;
1706 PRIV (recrd.rec_size) -= ETIR__C_HEADER_SIZE;
1708 ptr = PRIV (recrd.rec);
1709 length = PRIV (recrd.rec_size);
1710 maxptr = ptr + length;
1712 vms_debug2 ((2, "ETIR: %d bytes\n", length));
1714 while (ptr < maxptr)
1716 int cmd = bfd_getl16 (ptr);
1717 int cmd_length = bfd_getl16 (ptr + 2);
1722 _bfd_vms_debug (4, "etir: %s(%d)\n",
1723 _bfd_vms_etir_name (cmd), cmd);
1724 _bfd_hexdump (8, ptr, cmd_length - 4, 0);
1732 stack 32 bit value of symbol (high bits set to 0). */
1733 case ETIR__C_STA_GBL:
1734 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1735 _bfd_vms_push (abfd, op1, alpha_vms_sym_to_ctxt (h));
1741 stack 32 bit value, sign extend to 64 bit. */
1742 case ETIR__C_STA_LW:
1743 _bfd_vms_push (abfd, bfd_getl32 (ptr), RELC_NONE);
1749 stack 64 bit value of symbol. */
1750 case ETIR__C_STA_QW:
1751 _bfd_vms_push (abfd, bfd_getl64 (ptr), RELC_NONE);
1754 /* Stack psect base plus quadword offset
1755 arg: lw section index
1756 qw signed quadword offset (low 32 bits)
1758 Stack qw argument and section index
1759 (see ETIR__C_STO_OFF, ETIR__C_CTL_SETRB). */
1760 case ETIR__C_STA_PQ:
1764 psect = bfd_getl32 (ptr);
1765 if ((unsigned int) psect >= PRIV (section_count))
1767 (*_bfd_error_handler) (_("bad section index in %s"),
1768 _bfd_vms_etir_name (cmd));
1769 bfd_set_error (bfd_error_bad_value);
1772 op1 = bfd_getl64 (ptr + 4);
1773 _bfd_vms_push (abfd, op1, psect | RELC_SEC_BASE);
1777 case ETIR__C_STA_LI:
1778 case ETIR__C_STA_MOD:
1779 case ETIR__C_STA_CKARG:
1780 (*_bfd_error_handler) (_("unsupported STA cmd %s"),
1781 _bfd_vms_etir_name (cmd));
1785 /* Store byte: pop stack, write byte
1788 _bfd_vms_pop (abfd, &op1, &rel1);
1789 if (rel1 != RELC_NONE)
1791 image_write_b (abfd, (unsigned int) op1 & 0xff);
1794 /* Store word: pop stack, write word
1797 _bfd_vms_pop (abfd, &op1, &rel1);
1798 if (rel1 != RELC_NONE)
1800 image_write_w (abfd, (unsigned int) op1 & 0xffff);
1803 /* Store longword: pop stack, write longword
1805 case ETIR__C_STO_LW:
1806 _bfd_vms_pop (abfd, &op1, &rel1);
1807 if (rel1 & RELC_SEC_BASE)
1809 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1812 else if (rel1 & RELC_SHR_BASE)
1814 alpha_vms_add_fixup_lr (info, rel1 & RELC_MASK, op1);
1817 if (rel1 != RELC_NONE)
1819 if (rel1 != RELC_REL)
1821 alpha_vms_add_lw_reloc (info);
1823 image_write_l (abfd, op1);
1826 /* Store quadword: pop stack, write quadword
1828 case ETIR__C_STO_QW:
1829 _bfd_vms_pop (abfd, &op1, &rel1);
1830 if (rel1 & RELC_SEC_BASE)
1832 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1835 else if (rel1 & RELC_SHR_BASE)
1837 if (rel1 != RELC_NONE)
1839 if (rel1 != RELC_REL)
1841 alpha_vms_add_qw_reloc (info);
1843 image_write_q (abfd, op1);
1846 /* Store immediate repeated: pop stack for repeat count
1849 case ETIR__C_STO_IMMR:
1853 size = bfd_getl32 (ptr);
1854 _bfd_vms_pop (abfd, &op1, &rel1);
1855 if (rel1 != RELC_NONE)
1858 image_write (abfd, ptr + 4, size);
1862 /* Store global: write symbol value
1863 arg: cs global symbol name. */
1864 case ETIR__C_STO_GBL:
1865 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1868 if (h->sym->typ == EGSD__C_SYMG)
1870 alpha_vms_add_fixup_qr
1871 (info, abfd, h->sym->owner, h->sym->symbol_vector);
1876 op1 = alpha_vms_get_sym_value (h->sym->section,
1878 alpha_vms_add_qw_reloc (info);
1881 image_write_q (abfd, op1);
1884 /* Store code address: write address of entry point
1885 arg: cs global symbol name (procedure). */
1886 case ETIR__C_STO_CA:
1887 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1890 if (h->sym->flags & EGSY__V_NORM)
1892 /* That's really a procedure. */
1893 if (h->sym->typ == EGSD__C_SYMG)
1895 alpha_vms_add_fixup_ca (info, abfd, h->sym->owner);
1896 op1 = h->sym->symbol_vector;
1900 op1 = alpha_vms_get_sym_value (h->sym->code_section,
1901 h->sym->code_value);
1902 alpha_vms_add_qw_reloc (info);
1907 /* Symbol is not a procedure. */
1911 image_write_q (abfd, op1);
1914 /* Store offset to psect: pop stack, add low 32 bits to base of psect
1916 case ETIR__C_STO_OFF:
1917 _bfd_vms_pop (abfd, &op1, &rel1);
1919 if (!(rel1 & RELC_SEC_BASE))
1922 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1924 image_write_q (abfd, op1);
1928 arg: lw count of bytes
1930 case ETIR__C_STO_IMM:
1934 size = bfd_getl32 (ptr);
1935 image_write (abfd, ptr + 4, size);
1939 /* This code is 'reserved to digital' according to the openVMS
1940 linker manual, however it is generated by the DEC C compiler
1941 and defined in the include file.
1942 FIXME, since the following is just a guess
1943 store global longword: store 32bit value of symbol
1944 arg: cs symbol name. */
1945 case ETIR__C_STO_GBL_LW:
1946 _bfd_vms_get_value (abfd, ptr, info, &op1, &h);
1950 image_write_l (abfd, op1);
1953 case ETIR__C_STO_RB:
1954 case ETIR__C_STO_AB:
1955 case ETIR__C_STO_LP_PSB:
1956 (*_bfd_error_handler) (_("%s: not supported"),
1957 _bfd_vms_etir_name (cmd));
1960 case ETIR__C_STO_HINT_GBL:
1961 case ETIR__C_STO_HINT_PS:
1962 (*_bfd_error_handler) (_("%s: not implemented"),
1963 _bfd_vms_etir_name (cmd));
1967 /* 200 Store-conditional Linkage Pair
1969 case ETIR__C_STC_LP:
1971 /* 202 Store-conditional Address at global address
1975 case ETIR__C_STC_GBL:
1977 /* 203 Store-conditional Code Address at global address
1979 cs procedure name. */
1980 case ETIR__C_STC_GCA:
1982 /* 204 Store-conditional Address at psect + offset
1986 case ETIR__C_STC_PS:
1987 (*_bfd_error_handler) (_("%s: not supported"),
1988 _bfd_vms_etir_name (cmd));
1992 /* 201 Store-conditional Linkage Pair with Procedure Signature
1998 case ETIR__C_STC_LP_PSB:
1999 _bfd_vms_get_value (abfd, ptr + 4, info, &op1, &h);
2002 if (h->sym->typ == EGSD__C_SYMG)
2004 alpha_vms_add_fixup_lp (info, abfd, h->sym->owner);
2005 op1 = h->sym->symbol_vector;
2010 op1 = alpha_vms_get_sym_value (h->sym->code_section,
2011 h->sym->code_value);
2012 op2 = alpha_vms_get_sym_value (h->sym->section,
2018 /* Undefined symbol. */
2022 image_write_q (abfd, op1);
2023 image_write_q (abfd, op2);
2026 /* 205 Store-conditional NOP at address of global
2028 case ETIR__C_STC_NOP_GBL:
2031 /* 207 Store-conditional BSR at global address
2034 case ETIR__C_STC_BSR_GBL:
2037 /* 209 Store-conditional LDA at global address
2040 case ETIR__C_STC_LDA_GBL:
2043 /* 211 Store-conditional BSR or Hint at global address
2046 case ETIR__C_STC_BOH_GBL:
2047 /* Currentl ignored. */
2050 /* 213 Store-conditional NOP,BSR or HINT at global address
2053 case ETIR__C_STC_NBH_GBL:
2055 /* 206 Store-conditional NOP at pect + offset
2058 case ETIR__C_STC_NOP_PS:
2060 /* 208 Store-conditional BSR at pect + offset
2063 case ETIR__C_STC_BSR_PS:
2065 /* 210 Store-conditional LDA at psect + offset
2068 case ETIR__C_STC_LDA_PS:
2070 /* 212 Store-conditional BSR or Hint at pect + offset
2073 case ETIR__C_STC_BOH_PS:
2075 /* 214 Store-conditional NOP, BSR or HINT at psect + offset
2077 case ETIR__C_STC_NBH_PS:
2078 (*_bfd_error_handler) ("%s: not supported",
2079 _bfd_vms_etir_name (cmd));
2083 /* Det relocation base: pop stack, set image location counter
2085 case ETIR__C_CTL_SETRB:
2086 _bfd_vms_pop (abfd, &op1, &rel1);
2087 if (!(rel1 & RELC_SEC_BASE))
2089 image_set_ptr (abfd, op1, rel1 & RELC_MASK, info);
2092 /* Augment relocation base: increment image location counter by offset
2093 arg: lw offset value. */
2094 case ETIR__C_CTL_AUGRB:
2095 op1 = bfd_getl32 (ptr);
2096 image_inc_ptr (abfd, op1);
2099 /* Define location: pop index, save location counter under index
2101 case ETIR__C_CTL_DFLOC:
2102 _bfd_vms_pop (abfd, &op1, &rel1);
2103 if (rel1 != RELC_NONE)
2105 dst_define_location (abfd, op1);
2108 /* Set location: pop index, restore location counter from index
2110 case ETIR__C_CTL_STLOC:
2111 _bfd_vms_pop (abfd, &op1, &rel1);
2112 if (rel1 != RELC_NONE)
2114 dst_restore_location (abfd, op1);
2117 /* Stack defined location: pop index, push location counter from index
2119 case ETIR__C_CTL_STKDL:
2120 _bfd_vms_pop (abfd, &op1, &rel1);
2121 if (rel1 != RELC_NONE)
2123 _bfd_vms_push (abfd, dst_retrieve_location (abfd, op1), RELC_NONE);
2126 case ETIR__C_OPR_NOP: /* No-op. */
2129 case ETIR__C_OPR_ADD: /* Add. */
2130 _bfd_vms_pop (abfd, &op1, &rel1);
2131 _bfd_vms_pop (abfd, &op2, &rel2);
2132 if (rel1 == RELC_NONE && rel2 != RELC_NONE)
2134 else if (rel1 != RELC_NONE && rel2 != RELC_NONE)
2136 _bfd_vms_push (abfd, op1 + op2, rel1);
2139 case ETIR__C_OPR_SUB: /* Subtract. */
2140 _bfd_vms_pop (abfd, &op1, &rel1);
2141 _bfd_vms_pop (abfd, &op2, &rel2);
2142 if (rel1 == RELC_NONE && rel2 != RELC_NONE)
2144 else if ((rel1 & RELC_SEC_BASE) && (rel2 & RELC_SEC_BASE))
2146 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
2147 op2 = alpha_vms_fix_sec_rel (abfd, info, rel2, op2);
2150 else if (rel1 != RELC_NONE && rel2 != RELC_NONE)
2152 _bfd_vms_push (abfd, op2 - op1, rel1);
2155 case ETIR__C_OPR_MUL: /* Multiply. */
2156 _bfd_vms_pop (abfd, &op1, &rel1);
2157 _bfd_vms_pop (abfd, &op2, &rel2);
2158 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2160 _bfd_vms_push (abfd, op1 * op2, RELC_NONE);
2163 case ETIR__C_OPR_DIV: /* Divide. */
2164 _bfd_vms_pop (abfd, &op1, &rel1);
2165 _bfd_vms_pop (abfd, &op2, &rel2);
2166 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2169 _bfd_vms_push (abfd, 0, RELC_NONE);
2171 _bfd_vms_push (abfd, op2 / op1, RELC_NONE);
2174 case ETIR__C_OPR_AND: /* Logical AND. */
2175 _bfd_vms_pop (abfd, &op1, &rel1);
2176 _bfd_vms_pop (abfd, &op2, &rel2);
2177 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2179 _bfd_vms_push (abfd, op1 & op2, RELC_NONE);
2182 case ETIR__C_OPR_IOR: /* Logical inclusive OR. */
2183 _bfd_vms_pop (abfd, &op1, &rel1);
2184 _bfd_vms_pop (abfd, &op2, &rel2);
2185 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2187 _bfd_vms_push (abfd, op1 | op2, RELC_NONE);
2190 case ETIR__C_OPR_EOR: /* Logical exclusive OR. */
2191 _bfd_vms_pop (abfd, &op1, &rel1);
2192 _bfd_vms_pop (abfd, &op2, &rel2);
2193 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2195 _bfd_vms_push (abfd, op1 ^ op2, RELC_NONE);
2198 case ETIR__C_OPR_NEG: /* Negate. */
2199 _bfd_vms_pop (abfd, &op1, &rel1);
2200 if (rel1 != RELC_NONE)
2202 _bfd_vms_push (abfd, -op1, RELC_NONE);
2205 case ETIR__C_OPR_COM: /* Complement. */
2206 _bfd_vms_pop (abfd, &op1, &rel1);
2207 if (rel1 != RELC_NONE)
2209 _bfd_vms_push (abfd, ~op1, RELC_NONE);
2212 case ETIR__C_OPR_ASH: /* Arithmetic shift. */
2213 _bfd_vms_pop (abfd, &op1, &rel1);
2214 _bfd_vms_pop (abfd, &op2, &rel2);
2215 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2218 (*_bfd_error_handler) (_("invalid use of %s with contexts"),
2219 _bfd_vms_etir_name (cmd));
2222 if ((int)op2 < 0) /* Shift right. */
2224 else /* Shift left. */
2226 _bfd_vms_push (abfd, op1, RELC_NONE); /* FIXME: sym. */
2229 case ETIR__C_OPR_INSV: /* Insert field. */
2230 case ETIR__C_OPR_USH: /* Unsigned shift. */
2231 case ETIR__C_OPR_ROT: /* Rotate. */
2232 case ETIR__C_OPR_REDEF: /* Redefine symbol to current location. */
2233 case ETIR__C_OPR_DFLIT: /* Define a literal. */
2234 (*_bfd_error_handler) (_("%s: not supported"),
2235 _bfd_vms_etir_name (cmd));
2239 case ETIR__C_OPR_SEL: /* Select. */
2240 _bfd_vms_pop (abfd, &op1, &rel1);
2242 _bfd_vms_pop (abfd, &op1, &rel1);
2245 _bfd_vms_pop (abfd, &op1, &rel1);
2246 _bfd_vms_pop (abfd, &op2, &rel2);
2247 _bfd_vms_push (abfd, op1, rel1);
2252 (*_bfd_error_handler) (_("reserved cmd %d"), cmd);
2257 ptr += cmd_length - 4;
2263 /* Process EDBG/ETBT record.
2264 Return TRUE on success, FALSE on error */
2267 vms_slurp_debug (bfd *abfd)
2269 asection *section = PRIV (dst_section);
2271 if (section == NULL)
2273 /* We have no way to find out beforehand how much debug info there
2274 is in an object file, so pick an initial amount and grow it as
2276 flagword flags = SEC_HAS_CONTENTS | SEC_DEBUGGING | SEC_RELOC
2279 section = bfd_make_section (abfd, "$DST$");
2282 if (!bfd_set_section_flags (abfd, section, flags))
2284 PRIV (dst_section) = section;
2287 PRIV (image_section) = section;
2288 PRIV (image_offset) = section->size;
2290 if (!_bfd_vms_slurp_etir (abfd, NULL))
2293 section->size = PRIV (image_offset);
2297 /* Process EDBG record.
2298 Return TRUE on success, FALSE on error. */
2301 _bfd_vms_slurp_edbg (bfd *abfd)
2303 vms_debug2 ((2, "EDBG\n"));
2305 abfd->flags |= HAS_DEBUG | HAS_LINENO;
2307 return vms_slurp_debug (abfd);
2310 /* Process ETBT record.
2311 Return TRUE on success, FALSE on error. */
2314 _bfd_vms_slurp_etbt (bfd *abfd)
2316 vms_debug2 ((2, "ETBT\n"));
2318 abfd->flags |= HAS_LINENO;
2320 return vms_slurp_debug (abfd);
2323 /* Process EEOM record.
2324 Return TRUE on success, FALSE on error. */
2327 _bfd_vms_slurp_eeom (bfd *abfd)
2329 struct vms_eeom *eeom = (struct vms_eeom *) PRIV (recrd.rec);
2331 vms_debug2 ((2, "EEOM\n"));
2333 PRIV (eom_data).eom_l_total_lps = bfd_getl32 (eeom->total_lps);
2334 PRIV (eom_data).eom_w_comcod = bfd_getl16 (eeom->comcod);
2335 if (PRIV (eom_data).eom_w_comcod > 1)
2337 (*_bfd_error_handler) (_("Object module NOT error-free !\n"));
2338 bfd_set_error (bfd_error_bad_value);
2342 PRIV (eom_data).eom_has_transfer = FALSE;
2343 if (PRIV (recrd.rec_size) > 10)
2345 PRIV (eom_data).eom_has_transfer = TRUE;
2346 PRIV (eom_data).eom_b_tfrflg = eeom->tfrflg;
2347 PRIV (eom_data).eom_l_psindx = bfd_getl32 (eeom->psindx);
2348 PRIV (eom_data).eom_l_tfradr = bfd_getl32 (eeom->tfradr);
2350 abfd->start_address = PRIV (eom_data).eom_l_tfradr;
2355 /* Slurp an ordered set of VMS object records. Return FALSE on error. */
2358 _bfd_vms_slurp_object_records (bfd * abfd)
2365 vms_debug2 ((7, "reading at %08lx\n", (unsigned long)bfd_tell (abfd)));
2367 type = _bfd_vms_get_object_record (abfd);
2370 vms_debug2 ((2, "next_record failed\n"));
2377 err = _bfd_vms_slurp_ehdr (abfd);
2380 err = _bfd_vms_slurp_eeom (abfd);
2383 err = _bfd_vms_slurp_egsd (abfd);
2386 err = TRUE; /* _bfd_vms_slurp_etir (abfd); */
2389 err = _bfd_vms_slurp_edbg (abfd);
2392 err = _bfd_vms_slurp_etbt (abfd);
2399 vms_debug2 ((2, "slurp type %d failed\n", type));
2403 while (type != EOBJ__C_EEOM);
2408 /* Initialize private data */
2410 vms_initialize (bfd * abfd)
2414 amt = sizeof (struct vms_private_data_struct);
2415 abfd->tdata.any = bfd_zalloc (abfd, amt);
2416 if (abfd->tdata.any == NULL)
2419 PRIV (recrd.file_format) = FF_UNKNOWN;
2421 amt = sizeof (struct stack_struct) * STACKSIZE;
2422 PRIV (stack) = bfd_alloc (abfd, amt);
2423 if (PRIV (stack) == NULL)
2429 bfd_release (abfd, abfd->tdata.any);
2430 abfd->tdata.any = NULL;
2434 /* Check the format for a file being read.
2435 Return a (bfd_target *) if it's an object file or zero if not. */
2437 static const struct bfd_target *
2438 alpha_vms_object_p (bfd *abfd)
2440 void *tdata_save = abfd->tdata.any;
2441 unsigned int test_len;
2444 vms_debug2 ((1, "vms_object_p(%p)\n", abfd));
2446 /* Allocate alpha-vms specific data. */
2447 if (!vms_initialize (abfd))
2450 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET))
2451 goto err_wrong_format;
2453 /* The first challenge with VMS is to discover the kind of the file.
2455 Image files (executable or shared images) are stored as a raw
2456 stream of bytes (like on UNIX), but there is no magic number.
2458 Object files are written with RMS (record management service), ie
2459 each records are preceeded by its length (on a word - 2 bytes), and
2460 padded for word-alignment. That would be simple but when files
2461 are transfered to a UNIX filesystem (using ftp), records are lost.
2462 Only the raw content of the records are transfered. Fortunately,
2463 the Alpha Object file format also store the length of the record
2464 in the records. Is that clear ? */
2466 /* Minimum is 6 bytes for objects (2 bytes size, 2 bytes record id,
2467 2 bytes size repeated) and 12 bytes for images (4 bytes major id,
2468 4 bytes minor id, 4 bytes length). */
2471 /* Size the main buffer. */
2472 buf = (unsigned char *) bfd_malloc (test_len);
2475 PRIV (recrd.buf) = buf;
2476 PRIV (recrd.buf_size) = test_len;
2478 /* Initialize the record pointer. */
2479 PRIV (recrd.rec) = buf;
2481 if (bfd_bread (buf, test_len, abfd) != test_len)
2483 bfd_set_error (bfd_error_file_truncated);
2487 /* Is it an image? */
2488 if ((bfd_getl32 (buf) == EIHD__K_MAJORID)
2489 && (bfd_getl32 (buf + 4) == EIHD__K_MINORID))
2491 unsigned int to_read;
2492 unsigned int read_so_far;
2493 unsigned int remaining;
2494 unsigned int eisd_offset, eihs_offset;
2496 /* Extract the header size. */
2497 PRIV (recrd.rec_size) = bfd_getl32 (buf + EIHD__L_SIZE);
2499 /* The header size is 0 for DSF files. */
2500 if (PRIV (recrd.rec_size) == 0)
2501 PRIV (recrd.rec_size) = sizeof (struct vms_eihd);
2503 if (PRIV (recrd.rec_size) > PRIV (recrd.buf_size))
2505 buf = bfd_realloc_or_free (buf, PRIV (recrd.rec_size));
2509 PRIV (recrd.buf) = NULL;
2510 bfd_set_error (bfd_error_no_memory);
2513 PRIV (recrd.buf) = buf;
2514 PRIV (recrd.buf_size) = PRIV (recrd.rec_size);
2517 /* Read the remaining record. */
2518 remaining = PRIV (recrd.rec_size) - test_len;
2519 to_read = MIN (VMS_BLOCK_SIZE - test_len, remaining);
2520 read_so_far = test_len;
2522 while (remaining > 0)
2524 if (bfd_bread (buf + read_so_far, to_read, abfd) != to_read)
2526 bfd_set_error (bfd_error_file_truncated);
2527 goto err_wrong_format;
2530 read_so_far += to_read;
2531 remaining -= to_read;
2533 to_read = MIN (VMS_BLOCK_SIZE, remaining);
2536 /* Reset the record pointer. */
2537 PRIV (recrd.rec) = buf;
2539 vms_debug2 ((2, "file type is image\n"));
2541 if (_bfd_vms_slurp_eihd (abfd, &eisd_offset, &eihs_offset) != TRUE)
2542 goto err_wrong_format;
2544 if (_bfd_vms_slurp_eisd (abfd, eisd_offset) != TRUE)
2545 goto err_wrong_format;
2547 /* EIHS is optional. */
2548 if (eihs_offset != 0 && _bfd_vms_slurp_eihs (abfd, eihs_offset) != TRUE)
2549 goto err_wrong_format;
2555 /* Assume it's a module and adjust record pointer if necessary. */
2556 maybe_adjust_record_pointer_for_object (abfd);
2558 /* But is it really a module? */
2559 if (bfd_getl16 (PRIV (recrd.rec)) <= EOBJ__C_MAXRECTYP
2560 && bfd_getl16 (PRIV (recrd.rec) + 2) <= EOBJ__C_MAXRECSIZ)
2562 if (vms_get_remaining_object_record (abfd, test_len) <= 0)
2563 goto err_wrong_format;
2565 vms_debug2 ((2, "file type is module\n"));
2567 type = bfd_getl16 (PRIV (recrd.rec));
2568 if (type != EOBJ__C_EMH || _bfd_vms_slurp_ehdr (abfd) != TRUE)
2569 goto err_wrong_format;
2571 if (_bfd_vms_slurp_object_records (abfd) != TRUE)
2572 goto err_wrong_format;
2575 goto err_wrong_format;
2578 /* Set arch_info to alpha. */
2580 if (! bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0))
2581 goto err_wrong_format;
2586 bfd_set_error (bfd_error_wrong_format);
2589 if (PRIV (recrd.buf))
2590 free (PRIV (recrd.buf));
2591 if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
2592 bfd_release (abfd, abfd->tdata.any);
2593 abfd->tdata.any = tdata_save;
2599 /* Write an EMH/MHD record. */
2602 _bfd_vms_write_emh (bfd *abfd)
2604 struct vms_rec_wr *recwr = &PRIV (recwr);
2606 _bfd_vms_output_alignment (recwr, 2);
2609 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
2610 _bfd_vms_output_short (recwr, EMH__C_MHD);
2611 _bfd_vms_output_short (recwr, EOBJ__C_STRLVL);
2612 _bfd_vms_output_long (recwr, 0);
2613 _bfd_vms_output_long (recwr, 0);
2614 _bfd_vms_output_long (recwr, MAX_OUTREC_SIZE);
2616 /* Create module name from filename. */
2617 if (bfd_get_filename (abfd) != 0)
2619 char *module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
2620 _bfd_vms_output_counted (recwr, module);
2624 _bfd_vms_output_counted (recwr, "NONAME");
2626 _bfd_vms_output_counted (recwr, BFD_VERSION_STRING);
2627 _bfd_vms_output_dump (recwr, get_vms_time_string (), EMH_DATE_LENGTH);
2628 _bfd_vms_output_fill (recwr, 0, EMH_DATE_LENGTH);
2629 _bfd_vms_output_end (abfd, recwr);
2632 /* Write an EMH/LMN record. */
2635 _bfd_vms_write_lmn (bfd *abfd, const char *name)
2638 struct vms_rec_wr *recwr = &PRIV (recwr);
2639 unsigned int ver = BFD_VERSION / 10000;
2642 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
2643 _bfd_vms_output_short (recwr, EMH__C_LNM);
2644 snprintf (version, sizeof (version), "%s %d.%d.%d", name,
2645 ver / 10000, (ver / 100) % 100, ver % 100);
2646 _bfd_vms_output_dump (recwr, (unsigned char *)version, strlen (version));
2647 _bfd_vms_output_end (abfd, recwr);
2651 /* Write eom record for bfd abfd. Return FALSE on error. */
2654 _bfd_vms_write_eeom (bfd *abfd)
2656 struct vms_rec_wr *recwr = &PRIV (recwr);
2658 vms_debug2 ((2, "vms_write_eeom\n"));
2660 _bfd_vms_output_alignment (recwr, 2);
2662 _bfd_vms_output_begin (recwr, EOBJ__C_EEOM);
2663 _bfd_vms_output_long (recwr, PRIV (vms_linkage_index + 1) >> 1);
2664 _bfd_vms_output_byte (recwr, 0); /* Completion code. */
2665 _bfd_vms_output_byte (recwr, 0); /* Fill byte. */
2667 if ((abfd->flags & EXEC_P) == 0
2668 && bfd_get_start_address (abfd) != (bfd_vma)-1)
2672 section = bfd_get_section_by_name (abfd, ".link");
2675 bfd_set_error (bfd_error_nonrepresentable_section);
2678 _bfd_vms_output_short (recwr, 0);
2679 _bfd_vms_output_long (recwr, (unsigned long) section->target_index);
2680 _bfd_vms_output_long (recwr,
2681 (unsigned long) bfd_get_start_address (abfd));
2682 _bfd_vms_output_long (recwr, 0);
2685 _bfd_vms_output_end (abfd, recwr);
2689 /* This hash routine borrowed from GNU-EMACS, and strengthened
2693 hash_string (const char *ptr)
2695 const unsigned char *p = (unsigned char *) ptr;
2696 const unsigned char *end = p + strlen (ptr);
2703 hash = ((hash << 3) + (hash << 15) + (hash >> 28) + c);
2708 /* Generate a length-hashed VMS symbol name (limited to maxlen chars). */
2711 _bfd_vms_length_hash_symbol (bfd *abfd, const char *in, int maxlen)
2713 unsigned long result;
2716 const char *old_name;
2718 static char outbuf[EOBJ__C_SYMSIZ + 1];
2722 vms_debug (4, "_bfd_vms_length_hash_symbol \"%s\"\n", in);
2725 if (maxlen > EOBJ__C_SYMSIZ)
2726 maxlen = EOBJ__C_SYMSIZ;
2728 /* Save this for later. */
2731 /* We may need to truncate the symbol, save the hash for later. */
2732 in_len = strlen (in);
2734 result = (in_len > maxlen) ? hash_string (in) : 0;
2738 /* Do the length checking. */
2739 if (in_len <= maxlen)
2743 if (PRIV (flag_hash_long_names))
2749 strncpy (out, in, (size_t) i);
2753 if ((in_len > maxlen)
2754 && PRIV (flag_hash_long_names))
2755 sprintf (out, "_%08lx", result);
2760 vms_debug (4, "--> [%d]\"%s\"\n", (int)strlen (outbuf), outbuf);
2764 && PRIV (flag_hash_long_names)
2765 && PRIV (flag_show_after_trunc))
2766 printf (_("Symbol %s replaced by %s\n"), old_name, new_name);
2772 vector_grow1 (struct vector_type *vec, size_t elsz)
2774 if (vec->nbr_el + 1 < vec->max_el)
2777 if (vec->max_el == 0)
2780 vec->els = bfd_malloc2 (vec->max_el, elsz);
2785 vec->els = bfd_realloc2 (vec->els, vec->max_el, elsz);
2789 /* Bump ABFD file position to next block. */
2792 alpha_vms_file_position_block (bfd *abfd)
2795 PRIV (file_pos) += VMS_BLOCK_SIZE - 1;
2796 PRIV (file_pos) -= (PRIV (file_pos) % VMS_BLOCK_SIZE);
2799 /* Convert from internal structure SRC to external structure DST. */
2802 alpha_vms_swap_eisd_out (struct vms_internal_eisd_map *src,
2803 struct vms_eisd *dst)
2805 bfd_putl32 (src->u.eisd.majorid, dst->majorid);
2806 bfd_putl32 (src->u.eisd.minorid, dst->minorid);
2807 bfd_putl32 (src->u.eisd.eisdsize, dst->eisdsize);
2808 if (src->u.eisd.eisdsize <= EISD__K_LENEND)
2810 bfd_putl32 (src->u.eisd.secsize, dst->secsize);
2811 bfd_putl64 (src->u.eisd.virt_addr, dst->virt_addr);
2812 bfd_putl32 (src->u.eisd.flags, dst->flags);
2813 bfd_putl32 (src->u.eisd.vbn, dst->vbn);
2814 dst->pfc = src->u.eisd.pfc;
2815 dst->matchctl = src->u.eisd.matchctl;
2816 dst->type = src->u.eisd.type;
2818 if (src->u.eisd.flags & EISD__M_GBL)
2820 bfd_putl32 (src->u.gbl_eisd.ident, dst->ident);
2821 memcpy (dst->gblnam, src->u.gbl_eisd.gblnam,
2822 src->u.gbl_eisd.gblnam[0] + 1);
2826 /* Append EISD to the list of extra eisd for ABFD. */
2829 alpha_vms_append_extra_eisd (bfd *abfd, struct vms_internal_eisd_map *eisd)
2832 if (PRIV (gbl_eisd_head) == NULL)
2833 PRIV (gbl_eisd_head) = eisd;
2835 PRIV (gbl_eisd_tail)->next = eisd;
2836 PRIV (gbl_eisd_tail) = eisd;
2839 /* Create an EISD for shared image SHRIMG.
2840 Return FALSE in case of error. */
2843 alpha_vms_create_eisd_for_shared (bfd *abfd, bfd *shrimg)
2845 struct vms_internal_eisd_map *eisd;
2848 namlen = strlen (PRIV2 (shrimg, hdr_data.hdr_t_name));
2849 if (namlen + 5 > EISD__K_GBLNAMLEN)
2855 eisd = bfd_alloc (abfd, sizeof (*eisd));
2859 /* Fill the fields. */
2860 eisd->u.gbl_eisd.common.majorid = EISD__K_MAJORID;
2861 eisd->u.gbl_eisd.common.minorid = EISD__K_MINORID;
2862 eisd->u.gbl_eisd.common.eisdsize = (EISD__K_LEN + 4 + namlen + 5 + 3) & ~3;
2863 eisd->u.gbl_eisd.common.secsize = VMS_BLOCK_SIZE; /* Must not be 0. */
2864 eisd->u.gbl_eisd.common.virt_addr = 0;
2865 eisd->u.gbl_eisd.common.flags = EISD__M_GBL;
2866 eisd->u.gbl_eisd.common.vbn = 0;
2867 eisd->u.gbl_eisd.common.pfc = 0;
2868 eisd->u.gbl_eisd.common.matchctl = PRIV2 (shrimg, matchctl);
2869 eisd->u.gbl_eisd.common.type = EISD__K_SHRPIC;
2871 eisd->u.gbl_eisd.ident = PRIV2 (shrimg, ident);
2872 eisd->u.gbl_eisd.gblnam[0] = namlen + 4;
2873 memcpy (eisd->u.gbl_eisd.gblnam + 1, PRIV2 (shrimg, hdr_data.hdr_t_name),
2875 memcpy (eisd->u.gbl_eisd.gblnam + 1 + namlen, "_001", 4);
2877 /* Append it to the list. */
2878 alpha_vms_append_extra_eisd (abfd, eisd);
2883 /* Create an EISD for section SEC.
2884 Return FALSE in case of failure. */
2887 alpha_vms_create_eisd_for_section (bfd *abfd, asection *sec)
2889 struct vms_internal_eisd_map *eisd;
2891 /* Only for allocating section. */
2892 if (!(sec->flags & SEC_ALLOC))
2895 BFD_ASSERT (vms_section_data (sec)->eisd == NULL);
2896 eisd = bfd_alloc (abfd, sizeof (*eisd));
2899 vms_section_data (sec)->eisd = eisd;
2901 /* Fill the fields. */
2902 eisd->u.eisd.majorid = EISD__K_MAJORID;
2903 eisd->u.eisd.minorid = EISD__K_MINORID;
2904 eisd->u.eisd.eisdsize = EISD__K_LEN;
2905 eisd->u.eisd.secsize =
2906 (sec->size + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
2907 eisd->u.eisd.virt_addr = sec->vma;
2908 eisd->u.eisd.flags = 0;
2909 eisd->u.eisd.vbn = 0; /* To be later defined. */
2910 eisd->u.eisd.pfc = 0; /* Default. */
2911 eisd->u.eisd.matchctl = EISD__K_MATALL;
2912 eisd->u.eisd.type = EISD__K_NORMAL;
2914 if (sec->flags & SEC_CODE)
2915 eisd->u.eisd.flags |= EISD__M_EXE;
2916 if (!(sec->flags & SEC_READONLY))
2917 eisd->u.eisd.flags |= EISD__M_WRT | EISD__M_CRF;
2919 /* If relocations or fixup will be applied, make this isect writeable. */
2920 if (sec->flags & SEC_RELOC)
2921 eisd->u.eisd.flags |= EISD__M_WRT | EISD__M_CRF;
2923 if (!(sec->flags & SEC_HAS_CONTENTS))
2925 eisd->u.eisd.flags |= EISD__M_DZRO;
2926 eisd->u.eisd.flags &= ~EISD__M_CRF;
2928 if (sec->flags & SEC_LINKER_CREATED)
2930 if (strcmp (sec->name, "$FIXUP$") == 0)
2931 eisd->u.eisd.flags |= EISD__M_FIXUPVEC;
2934 /* Append it to the list. */
2936 if (PRIV (eisd_head) == NULL)
2937 PRIV (eisd_head) = eisd;
2939 PRIV (eisd_tail)->next = eisd;
2940 PRIV (eisd_tail) = eisd;
2945 /* Layout executable ABFD and write it to the disk.
2946 Return FALSE in case of failure. */
2949 alpha_vms_write_exec (bfd *abfd)
2951 struct vms_eihd eihd;
2952 struct vms_eiha *eiha;
2953 struct vms_eihi *eihi;
2954 struct vms_eihs *eihs = NULL;
2956 struct vms_internal_eisd_map *first_eisd;
2957 struct vms_internal_eisd_map *eisd;
2960 file_ptr gst_filepos = 0;
2961 unsigned int lnkflags = 0;
2963 /* Build the EIHD. */
2964 PRIV (file_pos) = EIHD__C_LENGTH;
2966 memset (&eihd, 0, sizeof (eihd));
2967 memset (eihd.fill_2, 0xff, sizeof (eihd.fill_2));
2969 bfd_putl32 (EIHD__K_MAJORID, eihd.majorid);
2970 bfd_putl32 (EIHD__K_MINORID, eihd.minorid);
2972 bfd_putl32 (sizeof (eihd), eihd.size);
2973 bfd_putl32 (0, eihd.isdoff);
2974 bfd_putl32 (0, eihd.activoff);
2975 bfd_putl32 (0, eihd.symdbgoff);
2976 bfd_putl32 (0, eihd.imgidoff);
2977 bfd_putl32 (0, eihd.patchoff);
2978 bfd_putl64 (0, eihd.iafva);
2979 bfd_putl32 (0, eihd.version_array_off);
2981 bfd_putl32 (EIHD__K_EXE, eihd.imgtype);
2982 bfd_putl32 (0, eihd.subtype);
2984 bfd_putl32 (0, eihd.imgiocnt);
2985 bfd_putl32 (-1, eihd.privreqs);
2986 bfd_putl32 (-1, eihd.privreqs + 4);
2988 bfd_putl32 ((sizeof (eihd) + VMS_BLOCK_SIZE - 1) / VMS_BLOCK_SIZE,
2990 bfd_putl32 (0, eihd.ident);
2991 bfd_putl32 (0, eihd.sysver);
2994 bfd_putl32 (0, eihd.symvect_size);
2995 bfd_putl32 (16, eihd.virt_mem_block_size);
2996 bfd_putl32 (0, eihd.ext_fixup_off);
2997 bfd_putl32 (0, eihd.noopt_psect_off);
2998 bfd_putl32 (-1, eihd.alias);
3001 eiha = (struct vms_eiha *)((char *) &eihd + PRIV (file_pos));
3002 bfd_putl32 (PRIV (file_pos), eihd.activoff);
3003 PRIV (file_pos) += sizeof (struct vms_eiha);
3005 bfd_putl32 (sizeof (struct vms_eiha), eiha->size);
3006 bfd_putl32 (0, eiha->spare);
3007 bfd_putl64 (PRIV (transfer_address[0]), eiha->tfradr1);
3008 bfd_putl64 (PRIV (transfer_address[1]), eiha->tfradr2);
3009 bfd_putl64 (PRIV (transfer_address[2]), eiha->tfradr3);
3010 bfd_putl64 (PRIV (transfer_address[3]), eiha->tfradr4);
3011 bfd_putl64 (0, eiha->inishr);
3014 eihi = (struct vms_eihi *)((char *) &eihd + PRIV (file_pos));
3015 bfd_putl32 (PRIV (file_pos), eihd.imgidoff);
3016 PRIV (file_pos) += sizeof (struct vms_eihi);
3018 bfd_putl32 (EIHI__K_MAJORID, eihi->majorid);
3019 bfd_putl32 (EIHI__K_MINORID, eihi->minorid);
3024 /* Set module name. */
3025 module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
3026 len = strlen (module);
3027 if (len > sizeof (eihi->imgnam) - 1)
3028 len = sizeof (eihi->imgnam) - 1;
3029 eihi->imgnam[0] = len;
3030 memcpy (eihi->imgnam + 1, module, len);
3038 vms_get_time (&hi, &lo);
3039 bfd_putl32 (lo, eihi->linktime + 0);
3040 bfd_putl32 (hi, eihi->linktime + 4);
3043 eihi->linkid[0] = 0;
3044 eihi->imgbid[0] = 0;
3047 dst = PRIV (dst_section);
3048 dmt = bfd_get_section_by_name (abfd, "$DMT$");
3049 if (dst != NULL && dst->size != 0)
3051 eihs = (struct vms_eihs *)((char *) &eihd + PRIV (file_pos));
3052 bfd_putl32 (PRIV (file_pos), eihd.symdbgoff);
3053 PRIV (file_pos) += sizeof (struct vms_eihs);
3055 bfd_putl32 (EIHS__K_MAJORID, eihs->majorid);
3056 bfd_putl32 (EIHS__K_MINORID, eihs->minorid);
3057 bfd_putl32 (0, eihs->dstvbn);
3058 bfd_putl32 (0, eihs->dstsize);
3059 bfd_putl32 (0, eihs->gstvbn);
3060 bfd_putl32 (0, eihs->gstsize);
3061 bfd_putl32 (0, eihs->dmtvbn);
3062 bfd_putl32 (0, eihs->dmtsize);
3065 /* One EISD per section. */
3066 for (sec = abfd->sections; sec; sec = sec->next)
3068 if (!alpha_vms_create_eisd_for_section (abfd, sec))
3072 /* Merge section EIDS which extra ones. */
3073 if (PRIV (eisd_tail))
3074 PRIV (eisd_tail)->next = PRIV (gbl_eisd_head);
3076 PRIV (eisd_head) = PRIV (gbl_eisd_head);
3077 if (PRIV (gbl_eisd_tail))
3078 PRIV (eisd_tail) = PRIV (gbl_eisd_tail);
3080 first_eisd = PRIV (eisd_head);
3082 /* Add end of eisd. */
3085 eisd = bfd_zalloc (abfd, sizeof (*eisd));
3088 eisd->u.eisd.majorid = 0;
3089 eisd->u.eisd.minorid = 0;
3090 eisd->u.eisd.eisdsize = 0;
3091 alpha_vms_append_extra_eisd (abfd, eisd);
3094 /* Place EISD in the file. */
3095 for (eisd = first_eisd; eisd; eisd = eisd->next)
3097 file_ptr room = VMS_BLOCK_SIZE - (PRIV (file_pos) % VMS_BLOCK_SIZE);
3099 /* First block is a little bit special: there is a word at the end. */
3100 if (PRIV (file_pos) < VMS_BLOCK_SIZE && room > 2)
3102 if (room < eisd->u.eisd.eisdsize + EISD__K_LENEND)
3103 alpha_vms_file_position_block (abfd);
3105 eisd->file_pos = PRIV (file_pos);
3106 PRIV (file_pos) += eisd->u.eisd.eisdsize;
3108 if (eisd->u.eisd.flags & EISD__M_FIXUPVEC)
3109 bfd_putl64 (eisd->u.eisd.virt_addr, eihd.iafva);
3112 if (first_eisd != NULL)
3114 bfd_putl32 (first_eisd->file_pos, eihd.isdoff);
3115 /* Real size of end of eisd marker. */
3116 PRIV (file_pos) += EISD__K_LENEND;
3119 bfd_putl32 (PRIV (file_pos), eihd.size);
3120 bfd_putl32 ((PRIV (file_pos) + VMS_BLOCK_SIZE - 1) / VMS_BLOCK_SIZE,
3123 /* Place sections. */
3124 for (sec = abfd->sections; sec; sec = sec->next)
3126 if (!(sec->flags & SEC_HAS_CONTENTS))
3129 eisd = vms_section_data (sec)->eisd;
3131 /* Align on a block. */
3132 alpha_vms_file_position_block (abfd);
3133 sec->filepos = PRIV (file_pos);
3136 eisd->u.eisd.vbn = (sec->filepos / VMS_BLOCK_SIZE) + 1;
3138 PRIV (file_pos) += sec->size;
3142 if (eihs != NULL && dst != NULL)
3144 bfd_putl32 ((dst->filepos / VMS_BLOCK_SIZE) + 1, eihs->dstvbn);
3145 bfd_putl32 (dst->size, eihs->dstsize);
3149 lnkflags |= EIHD__M_DBGDMT;
3150 bfd_putl32 ((dmt->filepos / VMS_BLOCK_SIZE) + 1, eihs->dmtvbn);
3151 bfd_putl32 (dmt->size, eihs->dmtsize);
3153 if (PRIV (gsd_sym_count) != 0)
3155 alpha_vms_file_position_block (abfd);
3156 gst_filepos = PRIV (file_pos);
3157 bfd_putl32 ((gst_filepos / VMS_BLOCK_SIZE) + 1, eihs->gstvbn);
3158 bfd_putl32 ((PRIV (gsd_sym_count) + 4) / 5 + 4, eihs->gstsize);
3162 /* Write EISD in hdr. */
3163 for (eisd = first_eisd; eisd && eisd->file_pos < VMS_BLOCK_SIZE;
3165 alpha_vms_swap_eisd_out
3166 (eisd, (struct vms_eisd *)((char *)&eihd + eisd->file_pos));
3168 /* Write first block. */
3169 bfd_putl32 (lnkflags, eihd.lnkflags);
3170 if (bfd_bwrite (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
3173 /* Write remaining eisd. */
3176 unsigned char blk[VMS_BLOCK_SIZE];
3177 struct vms_internal_eisd_map *next_eisd;
3179 memset (blk, 0xff, sizeof (blk));
3180 while (eisd != NULL)
3182 alpha_vms_swap_eisd_out
3184 (struct vms_eisd *)(blk + (eisd->file_pos % VMS_BLOCK_SIZE)));
3186 next_eisd = eisd->next;
3187 if (next_eisd == NULL
3188 || (next_eisd->file_pos / VMS_BLOCK_SIZE
3189 != eisd->file_pos / VMS_BLOCK_SIZE))
3191 if (bfd_bwrite (blk, sizeof (blk), abfd) != sizeof (blk))
3194 memset (blk, 0xff, sizeof (blk));
3200 /* Write sections. */
3201 for (sec = abfd->sections; sec; sec = sec->next)
3203 unsigned char blk[VMS_BLOCK_SIZE];
3206 if (sec->size == 0 || !(sec->flags & SEC_HAS_CONTENTS))
3208 if (bfd_bwrite (sec->contents, sec->size, abfd) != sec->size)
3212 len = VMS_BLOCK_SIZE - sec->size % VMS_BLOCK_SIZE;
3213 if (len != VMS_BLOCK_SIZE)
3215 memset (blk, 0, len);
3216 if (bfd_bwrite (blk, len, abfd) != len)
3222 if (gst_filepos != 0)
3224 struct vms_rec_wr *recwr = &PRIV (recwr);
3227 _bfd_vms_write_emh (abfd);
3228 _bfd_vms_write_lmn (abfd, "GNU LD");
3230 /* PSC for the absolute section. */
3231 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3232 _bfd_vms_output_long (recwr, 0);
3233 _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3234 _bfd_vms_output_short (recwr, 0);
3235 _bfd_vms_output_short (recwr, EGPS__V_PIC | EGPS__V_LIB | EGPS__V_RD);
3236 _bfd_vms_output_long (recwr, 0);
3237 _bfd_vms_output_counted (recwr, ".$$ABS$$.");
3238 _bfd_vms_output_end_subrec (recwr);
3239 _bfd_vms_output_end (abfd, recwr);
3241 for (i = 0; i < PRIV (gsd_sym_count); i++)
3243 struct vms_symbol_entry *sym = PRIV (syms)[i];
3250 _bfd_vms_output_alignment (recwr, 8);
3251 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3252 _bfd_vms_output_long (recwr, 0);
3254 _bfd_vms_output_begin_subrec (recwr, EGSD__C_SYMG);
3255 _bfd_vms_output_short (recwr, 0); /* Data type, alignment. */
3256 _bfd_vms_output_short (recwr, sym->flags);
3258 if (sym->code_section)
3259 ep = alpha_vms_get_sym_value (sym->code_section, sym->code_value);
3262 BFD_ASSERT (sym->code_value == 0);
3265 val = alpha_vms_get_sym_value (sym->section, sym->value);
3266 _bfd_vms_output_quad
3267 (recwr, sym->typ == EGSD__C_SYMG ? sym->symbol_vector : val);
3268 _bfd_vms_output_quad (recwr, ep);
3269 _bfd_vms_output_quad (recwr, val);
3270 _bfd_vms_output_long (recwr, 0);
3271 hash = _bfd_vms_length_hash_symbol (abfd, sym->name, EOBJ__C_SYMSIZ);
3272 _bfd_vms_output_counted (recwr, hash);
3273 _bfd_vms_output_end_subrec (recwr);
3275 _bfd_vms_output_end (abfd, recwr);
3278 _bfd_vms_output_end (abfd, recwr);
3280 if (!_bfd_vms_write_eeom (abfd))
3288 /* Write section and symbol directory of bfd abfd. Return FALSE on error. */
3291 _bfd_vms_write_egsd (bfd *abfd)
3295 unsigned int symnum;
3297 flagword new_flags, old_flags;
3298 int abs_section_index = -1;
3299 unsigned int target_index = 0;
3300 struct vms_rec_wr *recwr = &PRIV (recwr);
3302 vms_debug2 ((2, "vms_write_egsd\n"));
3304 /* Egsd is quadword aligned. */
3305 _bfd_vms_output_alignment (recwr, 8);
3307 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3308 _bfd_vms_output_long (recwr, 0);
3310 /* Number sections. */
3311 for (section = abfd->sections; section != NULL; section = section->next)
3313 if (section->flags & SEC_DEBUGGING)
3315 if (!strcmp (section->name, ".vmsdebug"))
3317 section->flags |= SEC_DEBUGGING;
3320 section->target_index = target_index++;
3323 for (section = abfd->sections; section != NULL; section = section->next)
3325 vms_debug2 ((3, "Section #%d %s, %d bytes\n",
3326 section->target_index, section->name, (int)section->size));
3328 /* Don't write out the VMS debug info section since it is in the
3329 ETBT and EDBG sections in etir. */
3330 if (section->flags & SEC_DEBUGGING)
3333 /* 13 bytes egsd, max 31 chars name -> should be 44 bytes. */
3334 if (_bfd_vms_output_check (recwr, 64) < 0)
3336 _bfd_vms_output_end (abfd, recwr);
3337 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3338 _bfd_vms_output_long (recwr, 0);
3341 /* Don't know if this is necessary for the linker but for now it keeps
3342 vms_slurp_gsd happy. */
3343 sname = section->name;
3346 /* Remove leading dot. */
3348 if ((*sname == 't') && (strcmp (sname, "text") == 0))
3349 sname = EVAX_CODE_NAME;
3350 else if ((*sname == 'd') && (strcmp (sname, "data") == 0))
3351 sname = EVAX_DATA_NAME;
3352 else if ((*sname == 'b') && (strcmp (sname, "bss") == 0))
3353 sname = EVAX_BSS_NAME;
3354 else if ((*sname == 'l') && (strcmp (sname, "link") == 0))
3355 sname = EVAX_LINK_NAME;
3356 else if ((*sname == 'r') && (strcmp (sname, "rdata") == 0))
3357 sname = EVAX_READONLY_NAME;
3358 else if ((*sname == 'l') && (strcmp (sname, "literal") == 0))
3359 sname = EVAX_LITERAL_NAME;
3360 else if ((*sname == 'l') && (strcmp (sname, "literals") == 0))
3361 sname = EVAX_LITERALS_NAME;
3362 else if ((*sname == 'c') && (strcmp (sname, "comm") == 0))
3363 sname = EVAX_COMMON_NAME;
3364 else if ((*sname == 'l') && (strcmp (sname, "lcomm") == 0))
3365 sname = EVAX_LOCAL_NAME;
3368 sname = _bfd_vms_length_hash_symbol (abfd, sname, EOBJ__C_SECSIZ);
3370 if (bfd_is_com_section (section))
3371 new_flags = (EGPS__V_OVR | EGPS__V_REL | EGPS__V_GBL | EGPS__V_RD
3372 | EGPS__V_WRT | EGPS__V_NOMOD | EGPS__V_COM);
3374 new_flags = vms_esecflag_by_name (evax_section_flags, sname,
3377 /* Modify them as directed. */
3378 if (section->flags & SEC_READONLY)
3379 new_flags &= ~EGPS__V_WRT;
3381 new_flags &= ~vms_section_data (section)->no_flags;
3382 new_flags |= vms_section_data (section)->flags;
3384 vms_debug2 ((3, "sec flags %x\n", section->flags));
3385 vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
3386 new_flags, (unsigned long)section->size));
3388 _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3389 _bfd_vms_output_short (recwr, section->alignment_power & 0xff);
3390 _bfd_vms_output_short (recwr, new_flags);
3391 _bfd_vms_output_long (recwr, (unsigned long) section->size);
3392 _bfd_vms_output_counted (recwr, sname);
3393 _bfd_vms_output_end_subrec (recwr);
3395 /* If the section is an obsolute one, remind its index as it will be
3396 used later for absolute symbols. */
3397 if ((new_flags & EGPS__V_REL) == 0 && abs_section_index < 0)
3398 abs_section_index = section->target_index;
3401 /* Output symbols. */
3402 vms_debug2 ((3, "%d symbols found\n", abfd->symcount));
3404 bfd_set_start_address (abfd, (bfd_vma) -1);
3406 for (symnum = 0; symnum < abfd->symcount; symnum++)
3410 symbol = abfd->outsymbols[symnum];
3411 old_flags = symbol->flags;
3413 /* Work-around a missing feature: consider __main as the main entry
3415 if (*(symbol->name) == '_')
3417 if (strcmp (symbol->name, "__main") == 0)
3418 bfd_set_start_address (abfd, (bfd_vma)symbol->value);
3421 /* Only put in the GSD the global and the undefined symbols. */
3422 if (old_flags & BSF_FILE)
3425 if ((old_flags & BSF_GLOBAL) == 0 && !bfd_is_und_section (symbol->section))
3427 /* If the LIB$INITIIALIZE section is present, add a reference to
3428 LIB$INITIALIZE symbol. FIXME: this should be done explicitely
3429 in the assembly file. */
3430 if (!((old_flags & BSF_SECTION_SYM) != 0
3431 && strcmp (symbol->section->name, "LIB$INITIALIZE") == 0))
3435 /* 13 bytes egsd, max 64 chars name -> should be 77 bytes. Add 16 more
3436 bytes for a possible ABS section. */
3437 if (_bfd_vms_output_check (recwr, 80 + 16) < 0)
3439 _bfd_vms_output_end (abfd, recwr);
3440 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3441 _bfd_vms_output_long (recwr, 0);
3444 if ((old_flags & BSF_GLOBAL) != 0
3445 && bfd_is_abs_section (symbol->section)
3446 && abs_section_index <= 0)
3448 /* Create an absolute section if none was defined. It is highly
3449 unlikely that the name $ABS$ clashes with a user defined
3450 non-absolute section name. */
3451 _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3452 _bfd_vms_output_short (recwr, 4);
3453 _bfd_vms_output_short (recwr, EGPS__V_SHR);
3454 _bfd_vms_output_long (recwr, 0);
3455 _bfd_vms_output_counted (recwr, "$ABS$");
3456 _bfd_vms_output_end_subrec (recwr);
3458 abs_section_index = target_index++;
3461 _bfd_vms_output_begin_subrec (recwr, EGSD__C_SYM);
3463 /* Data type, alignment. */
3464 _bfd_vms_output_short (recwr, 0);
3468 if (old_flags & BSF_WEAK)
3469 new_flags |= EGSY__V_WEAK;
3470 if (bfd_is_com_section (symbol->section)) /* .comm */
3471 new_flags |= (EGSY__V_WEAK | EGSY__V_COMM);
3473 if (old_flags & BSF_FUNCTION)
3475 new_flags |= EGSY__V_NORM;
3476 new_flags |= EGSY__V_REL;
3478 if (old_flags & BSF_GLOBAL)
3480 new_flags |= EGSY__V_DEF;
3481 if (!bfd_is_abs_section (symbol->section))
3482 new_flags |= EGSY__V_REL;
3484 _bfd_vms_output_short (recwr, new_flags);
3486 if (old_flags & BSF_GLOBAL)
3488 /* Symbol definition. */
3489 bfd_vma code_address = 0;
3490 unsigned long ca_psindx = 0;
3491 unsigned long psindx;
3493 if ((old_flags & BSF_FUNCTION) && symbol->udata.p != NULL)
3498 ((struct evax_private_udata_struct *)symbol->udata.p)->enbsym;
3499 code_address = sym->value;
3500 ca_psindx = sym->section->target_index;
3502 if (bfd_is_abs_section (symbol->section))
3503 psindx = abs_section_index;
3505 psindx = symbol->section->target_index;
3507 _bfd_vms_output_quad (recwr, symbol->value);
3508 _bfd_vms_output_quad (recwr, code_address);
3509 _bfd_vms_output_long (recwr, ca_psindx);
3510 _bfd_vms_output_long (recwr, psindx);
3512 hash = _bfd_vms_length_hash_symbol (abfd, symbol->name, EOBJ__C_SYMSIZ);
3513 _bfd_vms_output_counted (recwr, hash);
3515 _bfd_vms_output_end_subrec (recwr);
3518 _bfd_vms_output_alignment (recwr, 8);
3519 _bfd_vms_output_end (abfd, recwr);
3524 /* Write object header for bfd abfd. Return FALSE on error. */
3527 _bfd_vms_write_ehdr (bfd *abfd)
3530 unsigned int symnum;
3533 struct vms_rec_wr *recwr = &PRIV (recwr);
3535 vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd));
3537 _bfd_vms_output_alignment (recwr, 2);
3539 _bfd_vms_write_emh (abfd);
3540 _bfd_vms_write_lmn (abfd, "GNU AS");
3543 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3544 _bfd_vms_output_short (recwr, EMH__C_SRC);
3546 for (symnum = 0; symnum < abfd->symcount; symnum++)
3548 symbol = abfd->outsymbols[symnum];
3550 if (symbol->flags & BSF_FILE)
3552 if (CONST_STRNEQ ((char *)symbol->name, "<CASE:"))
3554 PRIV (flag_hash_long_names) = symbol->name[6] - '0';
3555 PRIV (flag_show_after_trunc) = symbol->name[7] - '0';
3563 _bfd_vms_output_dump (recwr, (unsigned char *) symbol->name,
3564 (int) strlen (symbol->name));
3571 if (symnum == abfd->symcount)
3572 _bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("noname"));
3574 _bfd_vms_output_end (abfd, recwr);
3577 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3578 _bfd_vms_output_short (recwr, EMH__C_TTL);
3579 _bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("TTL"));
3580 _bfd_vms_output_end (abfd, recwr);
3583 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3584 _bfd_vms_output_short (recwr, EMH__C_CPR);
3585 _bfd_vms_output_dump (recwr,
3586 (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
3588 _bfd_vms_output_end (abfd, recwr);
3593 /* Part 4.6, relocations. */
3596 /* WRITE ETIR SECTION
3598 This is still under construction and therefore not documented. */
3600 /* Close the etir/etbt record. */
3603 end_etir_record (bfd * abfd)
3605 struct vms_rec_wr *recwr = &PRIV (recwr);
3607 _bfd_vms_output_end (abfd, recwr);
3611 start_etir_or_etbt_record (bfd *abfd, asection *section, bfd_vma offset)
3613 struct vms_rec_wr *recwr = &PRIV (recwr);
3615 if (section->flags & SEC_DEBUGGING)
3617 _bfd_vms_output_begin (recwr, EOBJ__C_ETBT);
3621 /* Push start offset. */
3622 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3623 _bfd_vms_output_long (recwr, (unsigned long) 0);
3624 _bfd_vms_output_end_subrec (recwr);
3627 _bfd_vms_output_begin_subrec (recwr, ETIR__C_CTL_DFLOC);
3628 _bfd_vms_output_end_subrec (recwr);
3633 _bfd_vms_output_begin (recwr, EOBJ__C_ETIR);
3637 /* Push start offset. */
3638 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3639 _bfd_vms_output_long (recwr, (unsigned long) section->target_index);
3640 _bfd_vms_output_quad (recwr, offset);
3641 _bfd_vms_output_end_subrec (recwr);
3643 /* Start = pop (). */
3644 _bfd_vms_output_begin_subrec (recwr, ETIR__C_CTL_SETRB);
3645 _bfd_vms_output_end_subrec (recwr);
3650 /* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
3651 address VADDR in section specified by SEC_INDEX and NAME. */
3654 sto_imm (bfd *abfd, asection *section,
3655 bfd_size_type ssize, unsigned char *cptr, bfd_vma vaddr)
3658 struct vms_rec_wr *recwr = &PRIV (recwr);
3661 _bfd_vms_debug (8, "sto_imm %d bytes\n", (int) ssize);
3662 _bfd_hexdump (9, cptr, (int) ssize, (int) vaddr);
3667 /* Try all the rest. */
3670 if (_bfd_vms_output_check (recwr, size) < 0)
3672 /* Doesn't fit, split ! */
3673 end_etir_record (abfd);
3675 start_etir_or_etbt_record (abfd, section, vaddr);
3677 size = _bfd_vms_output_check (recwr, 0); /* get max size */
3678 if (size > ssize) /* more than what's left ? */
3682 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_IMM);
3683 _bfd_vms_output_long (recwr, (unsigned long) (size));
3684 _bfd_vms_output_dump (recwr, cptr, size);
3685 _bfd_vms_output_end_subrec (recwr);
3688 _bfd_vms_debug (10, "dumped %d bytes\n", (int) size);
3689 _bfd_hexdump (10, cptr, (int) size, (int) vaddr);
3699 etir_output_check (bfd *abfd, asection *section, bfd_vma vaddr, int checklen)
3701 if (_bfd_vms_output_check (&PRIV (recwr), checklen) < 0)
3703 /* Not enough room in this record. Close it and open a new one. */
3704 end_etir_record (abfd);
3705 start_etir_or_etbt_record (abfd, section, vaddr);
3709 /* Return whether RELOC must be deferred till the end. */
3712 defer_reloc_p (arelent *reloc)
3714 switch (reloc->howto->type)
3727 /* Write section contents for bfd abfd. Return FALSE on error. */
3730 _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
3733 struct vms_rec_wr *recwr = &PRIV (recwr);
3735 vms_debug2 ((2, "vms_write_tir (%p, %d)\n", abfd, objtype));
3737 _bfd_vms_output_alignment (recwr, 4);
3739 PRIV (vms_linkage_index) = 0;
3741 for (section = abfd->sections; section; section = section->next)
3743 vms_debug2 ((4, "writing %d. section '%s' (%d bytes)\n",
3744 section->target_index, section->name, (int) (section->size)));
3746 if (!(section->flags & SEC_HAS_CONTENTS)
3747 || bfd_is_com_section (section))
3750 if (!section->contents)
3752 bfd_set_error (bfd_error_no_contents);
3756 start_etir_or_etbt_record (abfd, section, 0);
3758 if (section->flags & SEC_RELOC)
3760 bfd_vma curr_addr = 0;
3761 unsigned char *curr_data = section->contents;
3763 int pass2_needed = 0;
3764 int pass2_in_progress = 0;
3767 if (section->reloc_count == 0)
3768 (*_bfd_error_handler)
3769 (_("SEC_RELOC with no relocs in section %s"), section->name);
3774 int i = section->reloc_count;
3775 arelent **rptr = section->orelocation;
3776 _bfd_vms_debug (4, "%d relocations:\n", i);
3779 _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, "
3780 "addr %08lx, off %08lx, len %d: %s\n",
3781 (*(*rptr)->sym_ptr_ptr)->name,
3782 (*(*rptr)->sym_ptr_ptr)->section->name,
3783 (long) (*(*rptr)->sym_ptr_ptr)->value,
3784 (unsigned long)(*rptr)->address,
3785 (unsigned long)(*rptr)->addend,
3786 bfd_get_reloc_size ((*rptr)->howto),
3787 ( *rptr)->howto->name);
3794 for (irel = 0; irel < section->reloc_count; irel++)
3796 struct evax_private_udata_struct *udata;
3797 arelent *rptr = section->orelocation [irel];
3798 bfd_vma addr = rptr->address;
3799 asymbol *sym = *rptr->sym_ptr_ptr;
3800 asection *sec = sym->section;
3801 bfd_boolean defer = defer_reloc_p (rptr);
3805 if (pass2_in_progress)
3807 /* Non-deferred relocs have already been output. */
3813 /* Deferred relocs must be output at the very end. */
3820 /* Regular relocs are intertwined with binary data. */
3821 if (curr_addr > addr)
3822 (*_bfd_error_handler) (_("Size error in section %s"),
3824 size = addr - curr_addr;
3825 sto_imm (abfd, section, size, curr_data, curr_addr);
3830 size = bfd_get_reloc_size (rptr->howto);
3832 switch (rptr->howto->type)
3834 case ALPHA_R_IGNORE:
3837 case ALPHA_R_REFLONG:
3838 if (bfd_is_und_section (sym->section))
3840 bfd_vma addend = rptr->addend;
3841 slen = strlen ((char *) sym->name);
3842 hash = _bfd_vms_length_hash_symbol
3843 (abfd, sym->name, EOBJ__C_SYMSIZ);
3844 etir_output_check (abfd, section, curr_addr, slen);
3847 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
3848 _bfd_vms_output_counted (recwr, hash);
3849 _bfd_vms_output_end_subrec (recwr);
3850 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3851 _bfd_vms_output_long (recwr, (unsigned long) addend);
3852 _bfd_vms_output_end_subrec (recwr);
3853 _bfd_vms_output_begin_subrec (recwr, ETIR__C_OPR_ADD);
3854 _bfd_vms_output_end_subrec (recwr);
3855 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3856 _bfd_vms_output_end_subrec (recwr);
3860 _bfd_vms_output_begin_subrec
3861 (recwr, ETIR__C_STO_GBL_LW);
3862 _bfd_vms_output_counted (recwr, hash);
3863 _bfd_vms_output_end_subrec (recwr);
3866 else if (bfd_is_abs_section (sym->section))
3868 etir_output_check (abfd, section, curr_addr, 16);
3869 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3870 _bfd_vms_output_long (recwr, (unsigned long) sym->value);
3871 _bfd_vms_output_end_subrec (recwr);
3872 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3873 _bfd_vms_output_end_subrec (recwr);
3877 etir_output_check (abfd, section, curr_addr, 32);
3878 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3879 _bfd_vms_output_long (recwr,
3880 (unsigned long) sec->target_index);
3881 _bfd_vms_output_quad (recwr, rptr->addend + sym->value);
3882 _bfd_vms_output_end_subrec (recwr);
3883 /* ??? Table B-8 of the OpenVMS Linker Utilily Manual
3884 says that we should have a ETIR__C_STO_OFF here.
3885 But the relocation would not be BFD_RELOC_32 then.
3886 This case is very likely unreachable. */
3887 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3888 _bfd_vms_output_end_subrec (recwr);
3892 case ALPHA_R_REFQUAD:
3893 if (bfd_is_und_section (sym->section))
3895 bfd_vma addend = rptr->addend;
3896 slen = strlen ((char *) sym->name);
3897 hash = _bfd_vms_length_hash_symbol
3898 (abfd, sym->name, EOBJ__C_SYMSIZ);
3899 etir_output_check (abfd, section, curr_addr, slen);
3902 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
3903 _bfd_vms_output_counted (recwr, hash);
3904 _bfd_vms_output_end_subrec (recwr);
3905 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
3906 _bfd_vms_output_quad (recwr, addend);
3907 _bfd_vms_output_end_subrec (recwr);
3908 _bfd_vms_output_begin_subrec (recwr, ETIR__C_OPR_ADD);
3909 _bfd_vms_output_end_subrec (recwr);
3910 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_QW);
3911 _bfd_vms_output_end_subrec (recwr);
3915 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_GBL);
3916 _bfd_vms_output_counted (recwr, hash);
3917 _bfd_vms_output_end_subrec (recwr);
3920 else if (bfd_is_abs_section (sym->section))
3922 etir_output_check (abfd, section, curr_addr, 16);
3923 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
3924 _bfd_vms_output_quad (recwr, sym->value);
3925 _bfd_vms_output_end_subrec (recwr);
3926 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_QW);
3927 _bfd_vms_output_end_subrec (recwr);
3931 etir_output_check (abfd, section, curr_addr, 32);
3932 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3933 _bfd_vms_output_long (recwr,
3934 (unsigned long) sec->target_index);
3935 _bfd_vms_output_quad (recwr, rptr->addend + sym->value);
3936 _bfd_vms_output_end_subrec (recwr);
3937 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_OFF);
3938 _bfd_vms_output_end_subrec (recwr);
3943 sto_imm (abfd, section, size, curr_data, curr_addr);
3946 case ALPHA_R_LINKAGE:
3947 etir_output_check (abfd, section, curr_addr, 64);
3948 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LP_PSB);
3949 _bfd_vms_output_long
3950 (recwr, (unsigned long) rptr->addend);
3951 if (rptr->addend > PRIV (vms_linkage_index))
3952 PRIV (vms_linkage_index) = rptr->addend;
3953 hash = _bfd_vms_length_hash_symbol
3954 (abfd, sym->name, EOBJ__C_SYMSIZ);
3955 _bfd_vms_output_counted (recwr, hash);
3956 _bfd_vms_output_byte (recwr, 0);
3957 _bfd_vms_output_end_subrec (recwr);
3960 case ALPHA_R_CODEADDR:
3961 slen = strlen ((char *) sym->name);
3962 hash = _bfd_vms_length_hash_symbol
3963 (abfd, sym->name, EOBJ__C_SYMSIZ);
3964 etir_output_check (abfd, section, curr_addr, slen);
3965 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_CA);
3966 _bfd_vms_output_counted (recwr, hash);
3967 _bfd_vms_output_end_subrec (recwr);
3972 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3973 etir_output_check (abfd, section, curr_addr,
3974 32 + 1 + strlen (udata->origname));
3975 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_NOP_GBL);
3976 _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
3977 _bfd_vms_output_long
3978 (recwr, (unsigned long) section->target_index);
3979 _bfd_vms_output_quad (recwr, rptr->address);
3980 _bfd_vms_output_long (recwr, (unsigned long) 0x47ff041f);
3981 _bfd_vms_output_long
3982 (recwr, (unsigned long) section->target_index);
3983 _bfd_vms_output_quad (recwr, rptr->addend);
3984 _bfd_vms_output_counted
3985 (recwr, _bfd_vms_length_hash_symbol
3986 (abfd, udata->origname, EOBJ__C_SYMSIZ));
3987 _bfd_vms_output_end_subrec (recwr);
3991 (*_bfd_error_handler) (_("Spurious ALPHA_R_BSR reloc"));
3996 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3997 etir_output_check (abfd, section, curr_addr,
3998 32 + 1 + strlen (udata->origname));
3999 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LDA_GBL);
4000 _bfd_vms_output_long
4001 (recwr, (unsigned long) udata->lkindex + 1);
4002 _bfd_vms_output_long
4003 (recwr, (unsigned long) section->target_index);
4004 _bfd_vms_output_quad (recwr, rptr->address);
4005 _bfd_vms_output_long (recwr, (unsigned long) 0x237B0000);
4006 _bfd_vms_output_long
4007 (recwr, (unsigned long) udata->bsym->section->target_index);
4008 _bfd_vms_output_quad (recwr, rptr->addend);
4009 _bfd_vms_output_counted
4010 (recwr, _bfd_vms_length_hash_symbol
4011 (abfd, udata->origname, EOBJ__C_SYMSIZ));
4012 _bfd_vms_output_end_subrec (recwr);
4017 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
4018 etir_output_check (abfd, section, curr_addr,
4019 32 + 1 + strlen (udata->origname));
4020 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_BOH_GBL);
4021 _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
4022 _bfd_vms_output_long
4023 (recwr, (unsigned long) section->target_index);
4024 _bfd_vms_output_quad (recwr, rptr->address);
4025 _bfd_vms_output_long (recwr, (unsigned long) 0xD3400000);
4026 _bfd_vms_output_long
4027 (recwr, (unsigned long) section->target_index);
4028 _bfd_vms_output_quad (recwr, rptr->addend);
4029 _bfd_vms_output_counted
4030 (recwr, _bfd_vms_length_hash_symbol
4031 (abfd, udata->origname, EOBJ__C_SYMSIZ));
4032 _bfd_vms_output_end_subrec (recwr);
4036 (*_bfd_error_handler) (_("Unhandled relocation %s"),
4043 } /* End of relocs loop. */
4045 if (!pass2_in_progress)
4047 /* Output rest of section. */
4048 if (curr_addr > section->size)
4049 (*_bfd_error_handler) (_("Size error in section %s"),
4051 size = section->size - curr_addr;
4052 sto_imm (abfd, section, size, curr_data, curr_addr);
4058 pass2_in_progress = 1;
4064 else /* (section->flags & SEC_RELOC) */
4065 sto_imm (abfd, section, section->size, section->contents, 0);
4067 end_etir_record (abfd);
4070 _bfd_vms_output_alignment (recwr, 2);
4074 /* Write cached information into a file being written, at bfd_close. */
4077 alpha_vms_write_object_contents (bfd *abfd)
4079 vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd));
4081 if (abfd->flags & (EXEC_P | DYNAMIC))
4083 return alpha_vms_write_exec (abfd);
4087 if (abfd->section_count > 0) /* we have sections */
4089 if (_bfd_vms_write_ehdr (abfd) != TRUE)
4091 if (_bfd_vms_write_egsd (abfd) != TRUE)
4093 if (_bfd_vms_write_etir (abfd, EOBJ__C_ETIR) != TRUE)
4095 if (_bfd_vms_write_eeom (abfd) != TRUE)
4102 /* Debug stuff: nearest line. */
4104 #define SET_MODULE_PARSED(m) \
4105 do { if ((m)->name == NULL) (m)->name = ""; } while (0)
4106 #define IS_MODULE_PARSED(m) ((m)->name != NULL)
4108 /* Build a new module for the specified BFD. */
4110 static struct module *
4111 new_module (bfd *abfd)
4113 struct module *module
4114 = (struct module *) bfd_zalloc (abfd, sizeof (struct module));
4115 module->file_table_count = 16; /* Arbitrary. */
4117 = bfd_malloc (module->file_table_count * sizeof (struct fileinfo));
4121 /* Parse debug info for a module and internalize it. */
4124 parse_module (bfd *abfd, struct module *module, unsigned char *ptr,
4127 unsigned char *maxptr = ptr + length;
4128 unsigned char *src_ptr, *pcl_ptr;
4129 unsigned int prev_linum = 0, curr_linenum = 0;
4130 bfd_vma prev_pc = 0, curr_pc = 0;
4131 struct srecinfo *curr_srec, *srec;
4132 struct lineinfo *curr_line, *line;
4133 struct funcinfo *funcinfo;
4135 /* Initialize tables with zero element. */
4136 curr_srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
4137 module->srec_table = curr_srec;
4139 curr_line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
4140 module->line_table = curr_line;
4142 while (length == -1 || ptr < maxptr)
4144 /* The first byte is not counted in the recorded length. */
4145 int rec_length = bfd_getl16 (ptr) + 1;
4146 int rec_type = bfd_getl16 (ptr + 2);
4148 vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length, rec_type));
4150 if (length == -1 && rec_type == DST__K_MODEND)
4157 = _bfd_vms_save_counted_string (ptr + DST_S_B_MODBEG_NAME);
4164 vms_debug2 ((3, "module: %s\n", module->name));
4171 funcinfo = (struct funcinfo *)
4172 bfd_zalloc (abfd, sizeof (struct funcinfo));
4174 = _bfd_vms_save_counted_string (ptr + DST_S_B_RTNBEG_NAME);
4175 funcinfo->low = bfd_getl32 (ptr + DST_S_L_RTNBEG_ADDRESS);
4176 funcinfo->next = module->func_table;
4177 module->func_table = funcinfo;
4179 vms_debug2 ((3, "routine: %s at 0x%lx\n",
4180 funcinfo->name, (unsigned long) funcinfo->low));
4184 module->func_table->high = module->func_table->low
4185 + bfd_getl32 (ptr + DST_S_L_RTNEND_SIZE) - 1;
4187 if (module->func_table->high > module->high)
4188 module->high = module->func_table->high;
4190 vms_debug2 ((3, "end routine\n"));
4194 vms_debug2 ((3, "prologue\n"));
4198 vms_debug2 ((3, "epilog\n"));
4202 vms_debug2 ((3, "block\n"));
4206 vms_debug2 ((3, "end block\n"));
4210 src_ptr = ptr + DST_S_C_SOURCE_HEADER_SIZE;
4212 vms_debug2 ((3, "source info\n"));
4214 while (src_ptr < ptr + rec_length)
4216 int cmd = src_ptr[0], cmd_length, data;
4220 case DST__K_SRC_DECLFILE:
4223 = bfd_getl16 (src_ptr + DST_S_W_SRC_DF_FILEID);
4225 = _bfd_vms_save_counted_string (src_ptr
4226 + DST_S_B_SRC_DF_FILENAME);
4228 while (fileid >= module->file_table_count)
4230 module->file_table_count *= 2;
4232 = bfd_realloc (module->file_table,
4233 module->file_table_count
4234 * sizeof (struct fileinfo));
4237 module->file_table [fileid].name = filename;
4238 module->file_table [fileid].srec = 1;
4239 cmd_length = src_ptr[DST_S_B_SRC_DF_LENGTH] + 2;
4240 vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4241 fileid, module->file_table [fileid].name));
4245 case DST__K_SRC_DEFLINES_B:
4246 /* Perform the association and set the next higher index
4248 data = src_ptr[DST_S_B_SRC_UNSBYTE];
4249 srec = (struct srecinfo *)
4250 bfd_zalloc (abfd, sizeof (struct srecinfo));
4251 srec->line = curr_srec->line + data;
4252 srec->srec = curr_srec->srec + data;
4253 srec->sfile = curr_srec->sfile;
4254 curr_srec->next = srec;
4257 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data));
4260 case DST__K_SRC_DEFLINES_W:
4261 /* Perform the association and set the next higher index
4263 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4264 srec = (struct srecinfo *)
4265 bfd_zalloc (abfd, sizeof (struct srecinfo));
4266 srec->line = curr_srec->line + data;
4267 srec->srec = curr_srec->srec + data,
4268 srec->sfile = curr_srec->sfile;
4269 curr_srec->next = srec;
4272 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data));
4275 case DST__K_SRC_INCRLNUM_B:
4276 data = src_ptr[DST_S_B_SRC_UNSBYTE];
4277 curr_srec->line += data;
4279 vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data));
4282 case DST__K_SRC_SETFILE:
4283 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4284 curr_srec->sfile = data;
4285 curr_srec->srec = module->file_table[data].srec;
4287 vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data));
4290 case DST__K_SRC_SETLNUM_L:
4291 data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4292 curr_srec->line = data;
4294 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data));
4297 case DST__K_SRC_SETLNUM_W:
4298 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4299 curr_srec->line = data;
4301 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data));
4304 case DST__K_SRC_SETREC_L:
4305 data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4306 curr_srec->srec = data;
4307 module->file_table[curr_srec->sfile].srec = data;
4309 vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data));
4312 case DST__K_SRC_SETREC_W:
4313 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4314 curr_srec->srec = data;
4315 module->file_table[curr_srec->sfile].srec = data;
4317 vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data));
4320 case DST__K_SRC_FORMFEED:
4322 vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4326 (*_bfd_error_handler) (_("unknown source command %d"),
4332 src_ptr += cmd_length;
4336 case DST__K_LINE_NUM:
4337 pcl_ptr = ptr + DST_S_C_LINE_NUM_HEADER_SIZE;
4339 vms_debug2 ((3, "line info\n"));
4341 while (pcl_ptr < ptr + rec_length)
4343 /* The command byte is signed so we must sign-extend it. */
4344 int cmd = ((signed char *)pcl_ptr)[0], cmd_length, data;
4348 case DST__K_DELTA_PC_W:
4349 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4353 vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data));
4356 case DST__K_DELTA_PC_L:
4357 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4361 vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data));
4364 case DST__K_INCR_LINUM:
4365 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4366 curr_linenum += data;
4368 vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data));
4371 case DST__K_INCR_LINUM_W:
4372 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4373 curr_linenum += data;
4375 vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data));
4378 case DST__K_INCR_LINUM_L:
4379 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4380 curr_linenum += data;
4382 vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data));
4385 case DST__K_SET_LINUM_INCR:
4386 (*_bfd_error_handler)
4387 (_("DST__K_SET_LINUM_INCR not implemented"));
4391 case DST__K_SET_LINUM_INCR_W:
4392 (*_bfd_error_handler)
4393 (_("DST__K_SET_LINUM_INCR_W not implemented"));
4397 case DST__K_RESET_LINUM_INCR:
4398 (*_bfd_error_handler)
4399 (_("DST__K_RESET_LINUM_INCR not implemented"));
4403 case DST__K_BEG_STMT_MODE:
4404 (*_bfd_error_handler)
4405 (_("DST__K_BEG_STMT_MODE not implemented"));
4409 case DST__K_END_STMT_MODE:
4410 (*_bfd_error_handler)
4411 (_("DST__K_END_STMT_MODE not implemented"));
4415 case DST__K_SET_LINUM_B:
4416 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4417 curr_linenum = data;
4419 vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data));
4422 case DST__K_SET_LINUM:
4423 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4424 curr_linenum = data;
4426 vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data));
4429 case DST__K_SET_LINUM_L:
4430 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4431 curr_linenum = data;
4433 vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data));
4437 (*_bfd_error_handler)
4438 (_("DST__K_SET_PC not implemented"));
4442 case DST__K_SET_PC_W:
4443 (*_bfd_error_handler)
4444 (_("DST__K_SET_PC_W not implemented"));
4448 case DST__K_SET_PC_L:
4449 (*_bfd_error_handler)
4450 (_("DST__K_SET_PC_L not implemented"));
4454 case DST__K_SET_STMTNUM:
4455 (*_bfd_error_handler)
4456 (_("DST__K_SET_STMTNUM not implemented"));
4461 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4464 vms_debug2 ((4, "DST__K_TERM: %d\n", data));
4468 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4471 vms_debug2 ((4, "DST__K_TERM_W: %d\n", data));
4475 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4478 vms_debug2 ((4, "DST__K_TERM_L: %d\n", data));
4481 case DST__K_SET_ABS_PC:
4482 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4485 vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data));
4494 vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4495 (unsigned long)curr_pc, curr_linenum));
4499 (*_bfd_error_handler) (_("unknown line command %d"),
4506 if ((curr_linenum != prev_linum && curr_pc != prev_pc)
4508 || cmd == DST__K_DELTA_PC_L
4509 || cmd == DST__K_DELTA_PC_W)
4511 line = (struct lineinfo *)
4512 bfd_zalloc (abfd, sizeof (struct lineinfo));
4513 line->address = curr_pc;
4514 line->line = curr_linenum;
4516 curr_line->next = line;
4519 prev_linum = curr_linenum;
4521 vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4522 (unsigned long)curr_pc, curr_linenum));
4525 pcl_ptr += cmd_length;
4529 case 0x17: /* Undocumented type used by DEC C to declare equates. */
4530 vms_debug2 ((3, "undocumented type 0x17\n"));
4534 vms_debug2 ((3, "ignoring record\n"));
4542 /* Finalize tables with EOL marker. */
4543 srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
4544 srec->line = (unsigned int) -1;
4545 srec->srec = (unsigned int) -1;
4546 curr_srec->next = srec;
4548 line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
4549 line->line = (unsigned int) -1;
4550 line->address = (bfd_vma) -1;
4551 curr_line->next = line;
4553 /* Advertise that this module has been parsed. This is needed
4554 because parsing can be either performed at module creation
4555 or deferred until debug info is consumed. */
4556 SET_MODULE_PARSED (module);
4559 /* Build the list of modules for the specified BFD. */
4561 static struct module *
4562 build_module_list (bfd *abfd)
4564 struct module *module, *list = NULL;
4567 if ((dmt = bfd_get_section_by_name (abfd, "$DMT$")))
4569 /* We have a DMT section so this must be an image. Parse the
4570 section and build the list of modules. This is sufficient
4571 since we can compute the start address and the end address
4572 of every module from the section contents. */
4573 bfd_size_type size = bfd_get_section_size (dmt);
4574 unsigned char *ptr, *end;
4576 ptr = (unsigned char *) bfd_alloc (abfd, size);
4580 if (! bfd_get_section_contents (abfd, dmt, ptr, 0, size))
4583 vms_debug2 ((2, "DMT\n"));
4589 /* Each header declares a module with its start offset and size
4590 of debug info in the DST section, as well as the count of
4591 program sections (i.e. address spans) it contains. */
4592 int modbeg = bfd_getl32 (ptr + DBG_S_L_DMT_MODBEG);
4593 int msize = bfd_getl32 (ptr + DBG_S_L_DST_SIZE);
4594 int count = bfd_getl16 (ptr + DBG_S_W_DMT_PSECT_COUNT);
4595 ptr += DBG_S_C_DMT_HEADER_SIZE;
4597 vms_debug2 ((3, "module: modbeg = %d, size = %d, count = %d\n",
4598 modbeg, msize, count));
4600 /* We create a 'module' structure for each program section since
4601 we only support contiguous addresses in a 'module' structure.
4602 As a consequence, the actual debug info in the DST section is
4603 shared and can be parsed multiple times; that doesn't seem to
4604 cause problems in practice. */
4607 int start = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_START);
4608 int length = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_LENGTH);
4609 module = new_module (abfd);
4610 module->modbeg = modbeg;
4611 module->size = msize;
4612 module->low = start;
4613 module->high = start + length;
4614 module->next = list;
4616 ptr += DBG_S_C_DMT_PSECT_SIZE;
4618 vms_debug2 ((4, "section: start = 0x%x, length = %d\n",
4625 /* We don't have a DMT section so this must be an object. Parse
4626 the module right now in order to compute its start address and
4628 void *dst = PRIV (dst_section)->contents;
4633 module = new_module (abfd);
4634 parse_module (abfd, module, PRIV (dst_section)->contents, -1);
4641 /* Calculate and return the name of the source file and the line nearest
4642 to the wanted location in the specified module. */
4645 module_find_nearest_line (bfd *abfd, struct module *module, bfd_vma addr,
4646 const char **file, const char **func,
4649 struct funcinfo *funcinfo;
4650 struct lineinfo *lineinfo;
4651 struct srecinfo *srecinfo;
4652 bfd_boolean ret = FALSE;
4654 /* Parse this module if that was not done at module creation. */
4655 if (! IS_MODULE_PARSED (module))
4657 unsigned int size = module->size;
4658 unsigned int modbeg = PRIV (dst_section)->filepos + module->modbeg;
4659 unsigned char *buffer = (unsigned char *) bfd_malloc (module->size);
4661 if (bfd_seek (abfd, modbeg, SEEK_SET) != 0
4662 || bfd_bread (buffer, size, abfd) != size)
4664 bfd_set_error (bfd_error_no_debug_section);
4668 parse_module (abfd, module, buffer, size);
4672 /* Find out the function (if any) that contains the address. */
4673 for (funcinfo = module->func_table; funcinfo; funcinfo = funcinfo->next)
4674 if (addr >= funcinfo->low && addr <= funcinfo->high)
4676 *func = funcinfo->name;
4681 /* Find out the source file and the line nearest to the address. */
4682 for (lineinfo = module->line_table; lineinfo; lineinfo = lineinfo->next)
4683 if (lineinfo->next && addr < lineinfo->next->address)
4685 for (srecinfo = module->srec_table; srecinfo; srecinfo = srecinfo->next)
4686 if (srecinfo->next && lineinfo->line < srecinfo->next->line)
4688 if (srecinfo->sfile > 0)
4690 *file = module->file_table[srecinfo->sfile].name;
4691 *line = srecinfo->srec + lineinfo->line - srecinfo->line;
4695 *file = module->name;
4696 *line = lineinfo->line;
4707 /* Provided a BFD, a section and an offset into the section, calculate and
4708 return the name of the source file and the line nearest to the wanted
4712 _bfd_vms_find_nearest_dst_line (bfd *abfd, asection *section,
4713 asymbol **symbols ATTRIBUTE_UNUSED,
4714 bfd_vma offset, const char **file,
4715 const char **func, unsigned int *line)
4717 struct module *module;
4719 /* What address are we looking for? */
4720 bfd_vma addr = section->vma + offset;
4726 /* We can't do anything if there is no DST (debug symbol table). */
4727 if (PRIV (dst_section) == NULL)
4730 /* Create the module list - if not already done. */
4731 if (PRIV (modules) == NULL)
4733 PRIV (modules) = build_module_list (abfd);
4734 if (PRIV (modules) == NULL)
4738 for (module = PRIV (modules); module; module = module->next)
4739 if (addr >= module->low && addr <= module->high)
4740 return module_find_nearest_line (abfd, module, addr, file, func, line);
4745 /* Canonicalizations. */
4746 /* Set name, value, section and flags of SYM from E. */
4749 alpha_vms_convert_symbol (bfd *abfd, struct vms_symbol_entry *e, asymbol *sym)
4758 flags = BSF_NO_FLAGS;
4764 if (e->flags & EGSY__V_WEAK)
4767 if (e->flags & EGSY__V_DEF)
4769 /* Symbol definition. */
4770 flags |= BSF_GLOBAL;
4771 if (e->flags & EGSY__V_NORM)
4772 flags |= BSF_FUNCTION;
4778 /* Symbol reference. */
4779 sec = bfd_und_section_ptr;
4784 /* A universal symbol is by definition global... */
4785 flags |= BSF_GLOBAL;
4787 /* ...and dynamic in shared libraries. */
4788 if (abfd->flags & DYNAMIC)
4789 flags |= BSF_DYNAMIC;
4791 if (e->flags & EGSY__V_WEAK)
4794 if (!(e->flags & EGSY__V_DEF))
4797 if (e->flags & EGSY__V_NORM)
4798 flags |= BSF_FUNCTION;
4801 /* sec = e->section; */
4802 sec = bfd_abs_section_ptr;
4817 /* Return the number of bytes required to store a vector of pointers
4818 to asymbols for all the symbols in the BFD abfd, including a
4819 terminal NULL pointer. If there are no symbols in the BFD,
4820 then return 0. If an error occurs, return -1. */
4823 alpha_vms_get_symtab_upper_bound (bfd *abfd)
4825 vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
4826 abfd, PRIV (gsd_sym_count)));
4828 return (PRIV (gsd_sym_count) + 1) * sizeof (asymbol *);
4831 /* Read the symbols from the BFD abfd, and fills in the vector
4832 location with pointers to the symbols and a trailing NULL.
4834 Return number of symbols read. */
4837 alpha_vms_canonicalize_symtab (bfd *abfd, asymbol **symbols)
4841 vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd));
4843 if (PRIV (csymbols) == NULL)
4845 PRIV (csymbols) = (asymbol **) bfd_alloc
4846 (abfd, PRIV (gsd_sym_count) * sizeof (asymbol *));
4848 /* Traverse table and fill symbols vector. */
4849 for (i = 0; i < PRIV (gsd_sym_count); i++)
4851 struct vms_symbol_entry *e = PRIV (syms)[i];
4854 sym = bfd_make_empty_symbol (abfd);
4855 if (sym == NULL || !alpha_vms_convert_symbol (abfd, e, sym))
4857 bfd_release (abfd, PRIV (csymbols));
4858 PRIV (csymbols) = NULL;
4862 PRIV (csymbols)[i] = sym;
4866 if (symbols != NULL)
4868 for (i = 0; i < PRIV (gsd_sym_count); i++)
4869 symbols[i] = PRIV (csymbols)[i];
4873 return PRIV (gsd_sym_count);
4876 /* Read and convert relocations from ETIR. We do it once for all sections. */
4879 alpha_vms_slurp_relocs (bfd *abfd)
4883 vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
4885 /* We slurp relocs only once, for all sections. */
4886 if (PRIV (reloc_done))
4888 PRIV (reloc_done) = TRUE;
4890 if (alpha_vms_canonicalize_symtab (abfd, NULL) < 0)
4893 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
4898 unsigned char *begin;
4901 bfd_reloc_code_real_type reloc_code;
4907 bfd_vma cur_address;
4909 unsigned char *cur_sym = NULL;
4911 bfd_vma cur_addend = 0;
4913 /* Skip non-ETIR records. */
4914 type = _bfd_vms_get_object_record (abfd);
4915 if (type == EOBJ__C_EEOM)
4917 if (type != EOBJ__C_ETIR)
4920 begin = PRIV (recrd.rec) + 4;
4921 end = PRIV (recrd.rec) + PRIV (recrd.rec_size);
4923 for (ptr = begin; ptr < end; ptr += length)
4927 cmd = bfd_getl16 (ptr);
4928 length = bfd_getl16 (ptr + 2);
4930 cur_address = vaddr;
4932 vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
4933 _bfd_vms_etir_name (cmd)));
4937 case ETIR__C_STA_GBL: /* ALPHA_R_REFLONG und_section, step 1 */
4938 /* ALPHA_R_REFQUAD und_section, step 1 */
4943 case ETIR__C_STA_PQ: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
4944 cur_psidx = bfd_getl32 (ptr + 4);
4945 cur_addend = bfd_getl64 (ptr + 8);
4949 case ETIR__C_CTL_SETRB:
4950 if (prev_cmd != ETIR__C_STA_PQ)
4952 (*_bfd_error_handler)
4953 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd),
4954 _bfd_vms_etir_name (cmd));
4957 cur_psect = cur_psidx;
4963 case ETIR__C_STA_LW: /* ALPHA_R_REFLONG abs_section, step 1 */
4964 /* ALPHA_R_REFLONG und_section, step 2 */
4967 if (prev_cmd != ETIR__C_STA_GBL)
4969 (*_bfd_error_handler)
4970 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
4971 _bfd_vms_etir_name (ETIR__C_STA_LW));
4975 cur_addend = bfd_getl32 (ptr + 4);
4979 case ETIR__C_STA_QW: /* ALPHA_R_REFQUAD abs_section, step 1 */
4980 /* ALPHA_R_REFQUAD und_section, step 2 */
4981 if (prev_cmd != -1 && prev_cmd != ETIR__C_STA_GBL)
4983 (*_bfd_error_handler)
4984 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
4985 _bfd_vms_etir_name (ETIR__C_STA_QW));
4988 cur_addend = bfd_getl64 (ptr + 4);
4992 case ETIR__C_STO_LW: /* ALPHA_R_REFLONG und_section, step 4 */
4993 /* ALPHA_R_REFLONG abs_section, step 2 */
4994 /* ALPHA_R_REFLONG others, step 2 */
4995 if (prev_cmd != ETIR__C_OPR_ADD
4996 && prev_cmd != ETIR__C_STA_LW
4997 && prev_cmd != ETIR__C_STA_PQ)
4999 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
5000 _bfd_vms_etir_name (prev_cmd),
5001 _bfd_vms_etir_name (ETIR__C_STO_LW));
5004 reloc_code = BFD_RELOC_32;
5007 case ETIR__C_STO_QW: /* ALPHA_R_REFQUAD und_section, step 4 */
5008 /* ALPHA_R_REFQUAD abs_section, step 2 */
5009 if (prev_cmd != ETIR__C_OPR_ADD && prev_cmd != ETIR__C_STA_QW)
5011 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
5012 _bfd_vms_etir_name (prev_cmd),
5013 _bfd_vms_etir_name (ETIR__C_STO_QW));
5016 reloc_code = BFD_RELOC_64;
5019 case ETIR__C_STO_OFF: /* ALPHA_R_REFQUAD others, step 2 */
5020 if (prev_cmd != ETIR__C_STA_PQ)
5022 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
5023 _bfd_vms_etir_name (prev_cmd),
5024 _bfd_vms_etir_name (ETIR__C_STO_OFF));
5027 reloc_code = BFD_RELOC_64;
5030 case ETIR__C_OPR_ADD: /* ALPHA_R_REFLONG und_section, step 3 */
5031 /* ALPHA_R_REFQUAD und_section, step 3 */
5032 if (prev_cmd != ETIR__C_STA_LW && prev_cmd != ETIR__C_STA_QW)
5034 (*_bfd_error_handler) (_("Unknown reloc %s + %s"),
5035 _bfd_vms_etir_name (prev_cmd),
5036 _bfd_vms_etir_name (ETIR__C_OPR_ADD));
5039 prev_cmd = ETIR__C_OPR_ADD;
5042 case ETIR__C_STO_CA: /* ALPHA_R_CODEADDR */
5043 reloc_code = BFD_RELOC_ALPHA_CODEADDR;
5047 case ETIR__C_STO_GBL: /* ALPHA_R_REFQUAD und_section */
5048 reloc_code = BFD_RELOC_64;
5052 case ETIR__C_STO_GBL_LW: /* ALPHA_R_REFLONG und_section */
5053 reloc_code = BFD_RELOC_32;
5057 case ETIR__C_STC_LP_PSB: /* ALPHA_R_LINKAGE */
5058 reloc_code = BFD_RELOC_ALPHA_LINKAGE;
5062 case ETIR__C_STC_NOP_GBL: /* ALPHA_R_NOP */
5063 reloc_code = BFD_RELOC_ALPHA_NOP;
5066 case ETIR__C_STC_BSR_GBL: /* ALPHA_R_BSR */
5067 reloc_code = BFD_RELOC_ALPHA_BSR;
5070 case ETIR__C_STC_LDA_GBL: /* ALPHA_R_LDA */
5071 reloc_code = BFD_RELOC_ALPHA_LDA;
5074 case ETIR__C_STC_BOH_GBL: /* ALPHA_R_BOH */
5075 reloc_code = BFD_RELOC_ALPHA_BOH;
5079 cur_sym = ptr + 4 + 32;
5080 cur_address = bfd_getl64 (ptr + 4 + 8);
5081 cur_addend = bfd_getl64 (ptr + 4 + 24);
5084 case ETIR__C_STO_IMM:
5085 vaddr += bfd_getl32 (ptr + 4);
5089 (*_bfd_error_handler) (_("Unknown reloc %s"),
5090 _bfd_vms_etir_name (cmd));
5096 struct vms_section_data_struct *vms_sec;
5099 /* Get section to which the relocation applies. */
5100 if (cur_psect < 0 || cur_psect > (int)PRIV (section_count))
5102 (*_bfd_error_handler) (_("Invalid section index in ETIR"));
5106 sec = PRIV (sections)[cur_psect];
5107 if (sec == bfd_abs_section_ptr)
5109 (*_bfd_error_handler) (_("Relocation for non-REL psect"));
5113 vms_sec = vms_section_data (sec);
5115 /* Allocate a reloc entry. */
5116 if (sec->reloc_count >= vms_sec->reloc_max)
5118 if (vms_sec->reloc_max == 0)
5120 vms_sec->reloc_max = 64;
5121 sec->relocation = bfd_zmalloc
5122 (vms_sec->reloc_max * sizeof (arelent));
5126 vms_sec->reloc_max *= 2;
5127 sec->relocation = bfd_realloc
5128 (sec->relocation, vms_sec->reloc_max * sizeof (arelent));
5131 reloc = &sec->relocation[sec->reloc_count];
5134 reloc->howto = bfd_reloc_type_lookup (abfd, reloc_code);
5136 if (cur_sym != NULL)
5139 unsigned int symlen = *cur_sym;
5142 /* Linear search. */
5147 for (j = 0; j < PRIV (gsd_sym_count); j++)
5148 if (PRIV (syms)[j]->namelen == symlen
5149 && memcmp (PRIV (syms)[j]->name, cur_sym, symlen) == 0)
5151 sym = &PRIV (csymbols)[j];
5156 (*_bfd_error_handler) (_("Unknown symbol in command %s"),
5157 _bfd_vms_etir_name (cmd));
5158 reloc->sym_ptr_ptr = NULL;
5161 reloc->sym_ptr_ptr = sym;
5163 else if (cur_psidx >= 0)
5164 reloc->sym_ptr_ptr =
5165 PRIV (sections)[cur_psidx]->symbol_ptr_ptr;
5167 reloc->sym_ptr_ptr = NULL;
5169 reloc->address = cur_address;
5170 reloc->addend = cur_addend;
5172 vaddr += bfd_get_reloc_size (reloc->howto);
5181 vms_debug2 ((3, "alpha_vms_slurp_relocs: result = TRUE\n"));
5186 /* Return the number of bytes required to store the relocation
5187 information associated with the given section. */
5190 alpha_vms_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *section)
5192 alpha_vms_slurp_relocs (abfd);
5194 return (section->reloc_count + 1) * sizeof (arelent *);
5197 /* Convert relocations from VMS (external) form into BFD internal
5198 form. Return the number of relocations. */
5201 alpha_vms_canonicalize_reloc (bfd *abfd, asection *section, arelent **relptr,
5202 asymbol **symbols ATTRIBUTE_UNUSED)
5207 if (!alpha_vms_slurp_relocs (abfd))
5210 count = section->reloc_count;
5211 tblptr = section->relocation;
5214 *relptr++ = tblptr++;
5216 *relptr = (arelent *) NULL;
5217 return section->reloc_count;
5220 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
5222 /* How to process the various reloc types. */
5224 static bfd_reloc_status_type
5225 reloc_nil (bfd * abfd ATTRIBUTE_UNUSED,
5226 arelent *reloc ATTRIBUTE_UNUSED,
5227 asymbol *sym ATTRIBUTE_UNUSED,
5228 void * data ATTRIBUTE_UNUSED,
5229 asection *sec ATTRIBUTE_UNUSED,
5230 bfd *output_bfd ATTRIBUTE_UNUSED,
5231 char **error_message ATTRIBUTE_UNUSED)
5234 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd, output_bfd);
5235 vms_debug (2, "In section %s, symbol %s\n",
5236 sec->name, sym->name);
5237 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5238 reloc->sym_ptr_ptr[0]->name,
5239 (unsigned long)reloc->address,
5240 (unsigned long)reloc->addend, reloc->howto->name);
5241 vms_debug (2, "data at %p\n", data);
5242 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5245 return bfd_reloc_ok;
5248 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5249 from smaller values. Start with zero, widen, *then* decrement. */
5250 #define MINUS_ONE (((bfd_vma)0) - 1)
5252 static reloc_howto_type alpha_howto_table[] =
5254 HOWTO (ALPHA_R_IGNORE, /* Type. */
5255 0, /* Rightshift. */
5256 0, /* Size (0 = byte, 1 = short, 2 = long). */
5258 TRUE, /* PC relative. */
5260 complain_overflow_dont,/* Complain_on_overflow. */
5261 reloc_nil, /* Special_function. */
5262 "IGNORE", /* Name. */
5263 TRUE, /* Partial_inplace. */
5264 0, /* Source mask */
5266 TRUE), /* PC rel offset. */
5268 /* A 64 bit reference to a symbol. */
5269 HOWTO (ALPHA_R_REFQUAD, /* Type. */
5270 0, /* Rightshift. */
5271 4, /* Size (0 = byte, 1 = short, 2 = long). */
5273 FALSE, /* PC relative. */
5275 complain_overflow_bitfield, /* Complain_on_overflow. */
5276 reloc_nil, /* Special_function. */
5277 "REFQUAD", /* Name. */
5278 TRUE, /* Partial_inplace. */
5279 MINUS_ONE, /* Source mask. */
5280 MINUS_ONE, /* Dest mask. */
5281 FALSE), /* PC rel offset. */
5283 /* A 21 bit branch. The native assembler generates these for
5284 branches within the text segment, and also fills in the PC
5285 relative offset in the instruction. */
5286 HOWTO (ALPHA_R_BRADDR, /* Type. */
5287 2, /* Rightshift. */
5288 2, /* Size (0 = byte, 1 = short, 2 = long). */
5290 TRUE, /* PC relative. */
5292 complain_overflow_signed, /* Complain_on_overflow. */
5293 reloc_nil, /* Special_function. */
5294 "BRADDR", /* Name. */
5295 TRUE, /* Partial_inplace. */
5296 0x1fffff, /* Source mask. */
5297 0x1fffff, /* Dest mask. */
5298 FALSE), /* PC rel offset. */
5300 /* A hint for a jump to a register. */
5301 HOWTO (ALPHA_R_HINT, /* Type. */
5302 2, /* Rightshift. */
5303 1, /* Size (0 = byte, 1 = short, 2 = long). */
5305 TRUE, /* PC relative. */
5307 complain_overflow_dont,/* Complain_on_overflow. */
5308 reloc_nil, /* Special_function. */
5310 TRUE, /* Partial_inplace. */
5311 0x3fff, /* Source mask. */
5312 0x3fff, /* Dest mask. */
5313 FALSE), /* PC rel offset. */
5315 /* 16 bit PC relative offset. */
5316 HOWTO (ALPHA_R_SREL16, /* Type. */
5317 0, /* Rightshift. */
5318 1, /* Size (0 = byte, 1 = short, 2 = long). */
5320 TRUE, /* PC relative. */
5322 complain_overflow_signed, /* Complain_on_overflow. */
5323 reloc_nil, /* Special_function. */
5324 "SREL16", /* Name. */
5325 TRUE, /* Partial_inplace. */
5326 0xffff, /* Source mask. */
5327 0xffff, /* Dest mask. */
5328 FALSE), /* PC rel offset. */
5330 /* 32 bit PC relative offset. */
5331 HOWTO (ALPHA_R_SREL32, /* Type. */
5332 0, /* Rightshift. */
5333 2, /* Size (0 = byte, 1 = short, 2 = long). */
5335 TRUE, /* PC relative. */
5337 complain_overflow_signed, /* Complain_on_overflow. */
5338 reloc_nil, /* Special_function. */
5339 "SREL32", /* Name. */
5340 TRUE, /* Partial_inplace. */
5341 0xffffffff, /* Source mask. */
5342 0xffffffff, /* Dest mask. */
5343 FALSE), /* PC rel offset. */
5345 /* A 64 bit PC relative offset. */
5346 HOWTO (ALPHA_R_SREL64, /* Type. */
5347 0, /* Rightshift. */
5348 4, /* Size (0 = byte, 1 = short, 2 = long). */
5350 TRUE, /* PC relative. */
5352 complain_overflow_signed, /* Complain_on_overflow. */
5353 reloc_nil, /* Special_function. */
5354 "SREL64", /* Name. */
5355 TRUE, /* Partial_inplace. */
5356 MINUS_ONE, /* Source mask. */
5357 MINUS_ONE, /* Dest mask. */
5358 FALSE), /* PC rel offset. */
5360 /* Push a value on the reloc evaluation stack. */
5361 HOWTO (ALPHA_R_OP_PUSH, /* Type. */
5362 0, /* Rightshift. */
5363 0, /* Size (0 = byte, 1 = short, 2 = long). */
5365 FALSE, /* PC relative. */
5367 complain_overflow_dont,/* Complain_on_overflow. */
5368 reloc_nil, /* Special_function. */
5369 "OP_PUSH", /* Name. */
5370 FALSE, /* Partial_inplace. */
5371 0, /* Source mask. */
5373 FALSE), /* PC rel offset. */
5375 /* Store the value from the stack at the given address. Store it in
5376 a bitfield of size r_size starting at bit position r_offset. */
5377 HOWTO (ALPHA_R_OP_STORE, /* Type. */
5378 0, /* Rightshift. */
5379 4, /* Size (0 = byte, 1 = short, 2 = long). */
5381 FALSE, /* PC relative. */
5383 complain_overflow_dont,/* Complain_on_overflow. */
5384 reloc_nil, /* Special_function. */
5385 "OP_STORE", /* Name. */
5386 FALSE, /* Partial_inplace. */
5387 0, /* Source mask. */
5388 MINUS_ONE, /* Dest mask. */
5389 FALSE), /* PC rel offset. */
5391 /* Subtract the reloc address from the value on the top of the
5392 relocation stack. */
5393 HOWTO (ALPHA_R_OP_PSUB, /* Type. */
5394 0, /* Rightshift. */
5395 0, /* Size (0 = byte, 1 = short, 2 = long). */
5397 FALSE, /* PC relative. */
5399 complain_overflow_dont,/* Complain_on_overflow. */
5400 reloc_nil, /* Special_function. */
5401 "OP_PSUB", /* Name. */
5402 FALSE, /* Partial_inplace. */
5403 0, /* Source mask. */
5405 FALSE), /* PC rel offset. */
5407 /* Shift the value on the top of the relocation stack right by the
5409 HOWTO (ALPHA_R_OP_PRSHIFT, /* Type. */
5410 0, /* Rightshift. */
5411 0, /* Size (0 = byte, 1 = short, 2 = long). */
5413 FALSE, /* PC relative. */
5415 complain_overflow_dont,/* Complain_on_overflow. */
5416 reloc_nil, /* Special_function. */
5417 "OP_PRSHIFT", /* Name. */
5418 FALSE, /* Partial_inplace. */
5419 0, /* Source mask. */
5421 FALSE), /* PC rel offset. */
5423 /* Hack. Linkage is done by linker. */
5424 HOWTO (ALPHA_R_LINKAGE, /* Type. */
5425 0, /* Rightshift. */
5426 8, /* Size (0 = byte, 1 = short, 2 = long). */
5428 FALSE, /* PC relative. */
5430 complain_overflow_dont,/* Complain_on_overflow. */
5431 reloc_nil, /* Special_function. */
5432 "LINKAGE", /* Name. */
5433 FALSE, /* Partial_inplace. */
5434 0, /* Source mask. */
5436 FALSE), /* PC rel offset. */
5438 /* A 32 bit reference to a symbol. */
5439 HOWTO (ALPHA_R_REFLONG, /* Type. */
5440 0, /* Rightshift. */
5441 2, /* Size (0 = byte, 1 = short, 2 = long). */
5443 FALSE, /* PC relative. */
5445 complain_overflow_bitfield, /* Complain_on_overflow. */
5446 reloc_nil, /* Special_function. */
5447 "REFLONG", /* Name. */
5448 TRUE, /* Partial_inplace. */
5449 0xffffffff, /* Source mask. */
5450 0xffffffff, /* Dest mask. */
5451 FALSE), /* PC rel offset. */
5453 /* A 64 bit reference to a procedure, written as 32 bit value. */
5454 HOWTO (ALPHA_R_CODEADDR, /* Type. */
5455 0, /* Rightshift. */
5456 4, /* Size (0 = byte, 1 = short, 2 = long). */
5458 FALSE, /* PC relative. */
5460 complain_overflow_signed,/* Complain_on_overflow. */
5461 reloc_nil, /* Special_function. */
5462 "CODEADDR", /* Name. */
5463 FALSE, /* Partial_inplace. */
5464 0xffffffff, /* Source mask. */
5465 0xffffffff, /* Dest mask. */
5466 FALSE), /* PC rel offset. */
5468 HOWTO (ALPHA_R_NOP, /* Type. */
5469 0, /* Rightshift. */
5470 3, /* Size (0 = byte, 1 = short, 2 = long). */
5472 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5473 because the calculations for the 3 relocations are the same.
5474 See B.4.5.2 of the OpenVMS Linker Utility Manual. */
5475 TRUE, /* PC relative. */
5477 complain_overflow_dont,/* Complain_on_overflow. */
5478 reloc_nil, /* Special_function. */
5480 FALSE, /* Partial_inplace. */
5481 0xffffffff, /* Source mask. */
5482 0xffffffff, /* Dest mask. */
5483 FALSE), /* PC rel offset. */
5485 HOWTO (ALPHA_R_BSR, /* Type. */
5486 0, /* Rightshift. */
5487 3, /* Size (0 = byte, 1 = short, 2 = long). */
5489 TRUE, /* PC relative. */
5491 complain_overflow_dont,/* Complain_on_overflow. */
5492 reloc_nil, /* Special_function. */
5494 FALSE, /* Partial_inplace. */
5495 0xffffffff, /* Source mask. */
5496 0xffffffff, /* Dest mask. */
5497 FALSE), /* PC rel offset. */
5499 HOWTO (ALPHA_R_LDA, /* Type. */
5500 0, /* Rightshift. */
5501 3, /* Size (0 = byte, 1 = short, 2 = long). */
5503 FALSE, /* PC relative. */
5505 complain_overflow_dont,/* Complain_on_overflow. */
5506 reloc_nil, /* Special_function. */
5508 FALSE, /* Partial_inplace. */
5509 0xffffffff, /* Source mask. */
5510 0xffffffff, /* Dest mask. */
5511 FALSE), /* PC rel offset. */
5513 HOWTO (ALPHA_R_BOH, /* Type. */
5514 0, /* Rightshift. */
5515 3, /* Size (0 = byte, 1 = short, 2 = long, 3 = nil). */
5517 TRUE, /* PC relative. */
5519 complain_overflow_dont,/* Complain_on_overflow. */
5520 reloc_nil, /* Special_function. */
5522 FALSE, /* Partial_inplace. */
5523 0xffffffff, /* Source mask. */
5524 0xffffffff, /* Dest mask. */
5525 FALSE), /* PC rel offset. */
5528 /* Return a pointer to a howto structure which, when invoked, will perform
5529 the relocation code on data from the architecture noted. */
5531 static const struct reloc_howto_struct *
5532 alpha_vms_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
5533 bfd_reloc_code_real_type code)
5537 vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd, code));
5541 case BFD_RELOC_16: alpha_type = ALPHA_R_SREL16; break;
5542 case BFD_RELOC_32: alpha_type = ALPHA_R_REFLONG; break;
5543 case BFD_RELOC_64: alpha_type = ALPHA_R_REFQUAD; break;
5544 case BFD_RELOC_CTOR: alpha_type = ALPHA_R_REFQUAD; break;
5545 case BFD_RELOC_23_PCREL_S2: alpha_type = ALPHA_R_BRADDR; break;
5546 case BFD_RELOC_ALPHA_HINT: alpha_type = ALPHA_R_HINT; break;
5547 case BFD_RELOC_16_PCREL: alpha_type = ALPHA_R_SREL16; break;
5548 case BFD_RELOC_32_PCREL: alpha_type = ALPHA_R_SREL32; break;
5549 case BFD_RELOC_64_PCREL: alpha_type = ALPHA_R_SREL64; break;
5550 case BFD_RELOC_ALPHA_LINKAGE: alpha_type = ALPHA_R_LINKAGE; break;
5551 case BFD_RELOC_ALPHA_CODEADDR: alpha_type = ALPHA_R_CODEADDR; break;
5552 case BFD_RELOC_ALPHA_NOP: alpha_type = ALPHA_R_NOP; break;
5553 case BFD_RELOC_ALPHA_BSR: alpha_type = ALPHA_R_BSR; break;
5554 case BFD_RELOC_ALPHA_LDA: alpha_type = ALPHA_R_LDA; break;
5555 case BFD_RELOC_ALPHA_BOH: alpha_type = ALPHA_R_BOH; break;
5557 (*_bfd_error_handler) ("reloc (%d) is *UNKNOWN*", code);
5560 vms_debug2 ((2, "reloc is %s\n", alpha_howto_table[alpha_type].name));
5561 return & alpha_howto_table[alpha_type];
5564 static reloc_howto_type *
5565 alpha_vms_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
5571 i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
5573 if (alpha_howto_table[i].name != NULL
5574 && strcasecmp (alpha_howto_table[i].name, r_name) == 0)
5575 return &alpha_howto_table[i];
5581 alpha_vms_get_synthetic_symtab (bfd *abfd,
5582 long symcount ATTRIBUTE_UNUSED,
5583 asymbol **usyms ATTRIBUTE_UNUSED,
5584 long dynsymcount ATTRIBUTE_UNUSED,
5585 asymbol **dynsyms ATTRIBUTE_UNUSED,
5592 syms = (asymbol *) bfd_malloc (PRIV (norm_sym_count) * sizeof (asymbol));
5597 for (i = 0; i < PRIV (gsd_sym_count); i++)
5599 struct vms_symbol_entry *e = PRIV (syms)[i];
5610 flags = BSF_LOCAL | BSF_SYNTHETIC;
5617 if ((e->flags & EGSY__V_DEF) && (e->flags & EGSY__V_NORM))
5619 value = e->code_value;
5620 sec = e->code_section;
5631 sname = bfd_alloc (abfd, l + 5);
5634 memcpy (sname, name, l);
5635 memcpy (sname + l, "..en", 5);
5642 sym->udata.p = NULL;
5651 vms_time_to_str (unsigned char *buf)
5653 time_t t = vms_rawtime_to_time_t (buf);
5654 char *res = ctime (&t);
5657 res = "*invalid time*";
5664 evax_bfd_print_emh (FILE *file, unsigned char *rec, unsigned int rec_len)
5666 struct vms_emh_common *emh = (struct vms_emh_common *)rec;
5667 unsigned int subtype;
5669 subtype = (unsigned)bfd_getl16 (emh->subtyp);
5671 fprintf (file, _(" EMH %u (len=%u): "), subtype, rec_len);
5677 struct vms_emh_mhd *mhd = (struct vms_emh_mhd *)rec;
5680 fprintf (file, _("Module header\n"));
5681 fprintf (file, _(" structure level: %u\n"), mhd->strlvl);
5682 fprintf (file, _(" max record size: %u\n"),
5683 (unsigned)bfd_getl32 (mhd->recsiz));
5684 name = (char *)(mhd + 1);
5685 fprintf (file, _(" module name : %.*s\n"), name[0], name + 1);
5686 name += name[0] + 1;
5687 fprintf (file, _(" module version : %.*s\n"), name[0], name + 1);
5688 name += name[0] + 1;
5689 fprintf (file, _(" compile date : %.17s\n"), name);
5694 fprintf (file, _("Language Processor Name\n"));
5695 fprintf (file, _(" language name: %.*s\n"),
5696 (int)(rec_len - sizeof (struct vms_emh_common)),
5697 (char *)rec + sizeof (struct vms_emh_common));
5702 fprintf (file, _("Source Files Header\n"));
5703 fprintf (file, _(" file: %.*s\n"),
5704 (int)(rec_len - sizeof (struct vms_emh_common)),
5705 (char *)rec + sizeof (struct vms_emh_common));
5710 fprintf (file, _("Title Text Header\n"));
5711 fprintf (file, _(" title: %.*s\n"),
5712 (int)(rec_len - sizeof (struct vms_emh_common)),
5713 (char *)rec + sizeof (struct vms_emh_common));
5718 fprintf (file, _("Copyright Header\n"));
5719 fprintf (file, _(" copyright: %.*s\n"),
5720 (int)(rec_len - sizeof (struct vms_emh_common)),
5721 (char *)rec + sizeof (struct vms_emh_common));
5725 fprintf (file, _("unhandled emh subtype %u\n"), subtype);
5731 evax_bfd_print_eeom (FILE *file, unsigned char *rec, unsigned int rec_len)
5733 struct vms_eeom *eeom = (struct vms_eeom *)rec;
5735 fprintf (file, _(" EEOM (len=%u):\n"), rec_len);
5736 fprintf (file, _(" number of cond linkage pairs: %u\n"),
5737 (unsigned)bfd_getl32 (eeom->total_lps));
5738 fprintf (file, _(" completion code: %u\n"),
5739 (unsigned)bfd_getl16 (eeom->comcod));
5742 fprintf (file, _(" transfer addr flags: 0x%02x\n"), eeom->tfrflg);
5743 fprintf (file, _(" transfer addr psect: %u\n"),
5744 (unsigned)bfd_getl32 (eeom->psindx));
5745 fprintf (file, _(" transfer address : 0x%08x\n"),
5746 (unsigned)bfd_getl32 (eeom->tfradr));
5751 exav_bfd_print_egsy_flags (unsigned int flags, FILE *file)
5753 if (flags & EGSY__V_WEAK)
5754 fputs (_(" WEAK"), file);
5755 if (flags & EGSY__V_DEF)
5756 fputs (_(" DEF"), file);
5757 if (flags & EGSY__V_UNI)
5758 fputs (_(" UNI"), file);
5759 if (flags & EGSY__V_REL)
5760 fputs (_(" REL"), file);
5761 if (flags & EGSY__V_COMM)
5762 fputs (_(" COMM"), file);
5763 if (flags & EGSY__V_VECEP)
5764 fputs (_(" VECEP"), file);
5765 if (flags & EGSY__V_NORM)
5766 fputs (_(" NORM"), file);
5767 if (flags & EGSY__V_QUAD_VAL)
5768 fputs (_(" QVAL"), file);
5772 evax_bfd_print_egsd_flags (FILE *file, unsigned int flags)
5774 if (flags & EGPS__V_PIC)
5775 fputs (_(" PIC"), file);
5776 if (flags & EGPS__V_LIB)
5777 fputs (_(" LIB"), file);
5778 if (flags & EGPS__V_OVR)
5779 fputs (_(" OVR"), file);
5780 if (flags & EGPS__V_REL)
5781 fputs (_(" REL"), file);
5782 if (flags & EGPS__V_GBL)
5783 fputs (_(" GBL"), file);
5784 if (flags & EGPS__V_SHR)
5785 fputs (_(" SHR"), file);
5786 if (flags & EGPS__V_EXE)
5787 fputs (_(" EXE"), file);
5788 if (flags & EGPS__V_RD)
5789 fputs (_(" RD"), file);
5790 if (flags & EGPS__V_WRT)
5791 fputs (_(" WRT"), file);
5792 if (flags & EGPS__V_VEC)
5793 fputs (_(" VEC"), file);
5794 if (flags & EGPS__V_NOMOD)
5795 fputs (_(" NOMOD"), file);
5796 if (flags & EGPS__V_COM)
5797 fputs (_(" COM"), file);
5798 if (flags & EGPS__V_ALLOC_64BIT)
5799 fputs (_(" 64B"), file);
5803 evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len)
5805 unsigned int off = sizeof (struct vms_egsd);
5808 fprintf (file, _(" EGSD (len=%u):\n"), rec_len);
5811 for (off = sizeof (struct vms_egsd); off < rec_len; )
5813 struct vms_egsd_entry *e = (struct vms_egsd_entry *)(rec + off);
5817 type = (unsigned)bfd_getl16 (e->gsdtyp);
5818 len = (unsigned)bfd_getl16 (e->gsdsiz);
5820 fprintf (file, _(" EGSD entry %2u (type: %u, len: %u): "),
5828 struct vms_egps *egps = (struct vms_egps *)e;
5829 unsigned int flags = bfd_getl16 (egps->flags);
5832 fprintf (file, _("PSC - Program section definition\n"));
5833 fprintf (file, _(" alignment : 2**%u\n"), egps->align);
5834 fprintf (file, _(" flags : 0x%04x"), flags);
5835 evax_bfd_print_egsd_flags (file, flags);
5837 l = bfd_getl32 (egps->alloc);
5838 fprintf (file, _(" alloc (len): %u (0x%08x)\n"), l, l);
5839 fprintf (file, _(" name : %.*s\n"),
5840 egps->namlng, egps->name);
5845 struct vms_esgps *esgps = (struct vms_esgps *)e;
5846 unsigned int flags = bfd_getl16 (esgps->flags);
5849 fprintf (file, _("SPSC - Shared Image Program section def\n"));
5850 fprintf (file, _(" alignment : 2**%u\n"), esgps->align);
5851 fprintf (file, _(" flags : 0x%04x"), flags);
5852 evax_bfd_print_egsd_flags (file, flags);
5854 l = bfd_getl32 (esgps->alloc);
5855 fprintf (file, _(" alloc (len) : %u (0x%08x)\n"), l, l);
5856 fprintf (file, _(" image offset : 0x%08x\n"),
5857 (unsigned int)bfd_getl32 (esgps->base));
5858 fprintf (file, _(" symvec offset : 0x%08x\n"),
5859 (unsigned int)bfd_getl32 (esgps->value));
5860 fprintf (file, _(" name : %.*s\n"),
5861 esgps->namlng, esgps->name);
5866 struct vms_egsy *egsy = (struct vms_egsy *)e;
5867 unsigned int flags = bfd_getl16 (egsy->flags);
5869 if (flags & EGSY__V_DEF)
5871 struct vms_esdf *esdf = (struct vms_esdf *)e;
5873 fprintf (file, _("SYM - Global symbol definition\n"));
5874 fprintf (file, _(" flags: 0x%04x"), flags);
5875 exav_bfd_print_egsy_flags (flags, file);
5877 fprintf (file, _(" psect offset: 0x%08x\n"),
5878 (unsigned)bfd_getl32 (esdf->value));
5879 if (flags & EGSY__V_NORM)
5881 fprintf (file, _(" code address: 0x%08x\n"),
5882 (unsigned)bfd_getl32 (esdf->code_address));
5883 fprintf (file, _(" psect index for entry point : %u\n"),
5884 (unsigned)bfd_getl32 (esdf->ca_psindx));
5886 fprintf (file, _(" psect index : %u\n"),
5887 (unsigned)bfd_getl32 (esdf->psindx));
5888 fprintf (file, _(" name : %.*s\n"),
5889 esdf->namlng, esdf->name);
5893 struct vms_esrf *esrf = (struct vms_esrf *)e;
5895 fprintf (file, _("SYM - Global symbol reference\n"));
5896 fprintf (file, _(" name : %.*s\n"),
5897 esrf->namlng, esrf->name);
5903 struct vms_eidc *eidc = (struct vms_eidc *)e;
5904 unsigned int flags = bfd_getl32 (eidc->flags);
5907 fprintf (file, _("IDC - Ident Consistency check\n"));
5908 fprintf (file, _(" flags : 0x%08x"), flags);
5909 if (flags & EIDC__V_BINIDENT)
5910 fputs (" BINDENT", file);
5912 fprintf (file, _(" id match : %x\n"),
5913 (flags >> EIDC__V_IDMATCH_SH) & EIDC__V_IDMATCH_MASK);
5914 fprintf (file, _(" error severity: %x\n"),
5915 (flags >> EIDC__V_ERRSEV_SH) & EIDC__V_ERRSEV_MASK);
5917 fprintf (file, _(" entity name : %.*s\n"), p[0], p + 1);
5919 fprintf (file, _(" object name : %.*s\n"), p[0], p + 1);
5921 if (flags & EIDC__V_BINIDENT)
5922 fprintf (file, _(" binary ident : 0x%08x\n"),
5923 (unsigned)bfd_getl32 (p + 1));
5925 fprintf (file, _(" ascii ident : %.*s\n"), p[0], p + 1);
5930 struct vms_egst *egst = (struct vms_egst *)e;
5931 unsigned int flags = bfd_getl16 (egst->header.flags);
5933 fprintf (file, _("SYMG - Universal symbol definition\n"));
5934 fprintf (file, _(" flags: 0x%04x"), flags);
5935 exav_bfd_print_egsy_flags (flags, file);
5937 fprintf (file, _(" symbol vector offset: 0x%08x\n"),
5938 (unsigned)bfd_getl32 (egst->value));
5939 fprintf (file, _(" entry point: 0x%08x\n"),
5940 (unsigned)bfd_getl32 (egst->lp_1));
5941 fprintf (file, _(" proc descr : 0x%08x\n"),
5942 (unsigned)bfd_getl32 (egst->lp_2));
5943 fprintf (file, _(" psect index: %u\n"),
5944 (unsigned)bfd_getl32 (egst->psindx));
5945 fprintf (file, _(" name : %.*s\n"),
5946 egst->namlng, egst->name);
5951 struct vms_esdfv *esdfv = (struct vms_esdfv *)e;
5952 unsigned int flags = bfd_getl16 (esdfv->flags);
5954 fprintf (file, _("SYMV - Vectored symbol definition\n"));
5955 fprintf (file, _(" flags: 0x%04x"), flags);
5956 exav_bfd_print_egsy_flags (flags, file);
5958 fprintf (file, _(" vector : 0x%08x\n"),
5959 (unsigned)bfd_getl32 (esdfv->vector));
5960 fprintf (file, _(" psect offset: %u\n"),
5961 (unsigned)bfd_getl32 (esdfv->value));
5962 fprintf (file, _(" psect index : %u\n"),
5963 (unsigned)bfd_getl32 (esdfv->psindx));
5964 fprintf (file, _(" name : %.*s\n"),
5965 esdfv->namlng, esdfv->name);
5970 struct vms_esdfm *esdfm = (struct vms_esdfm *)e;
5971 unsigned int flags = bfd_getl16 (esdfm->flags);
5973 fprintf (file, _("SYMM - Global symbol definition with version\n"));
5974 fprintf (file, _(" flags: 0x%04x"), flags);
5975 exav_bfd_print_egsy_flags (flags, file);
5977 fprintf (file, _(" version mask: 0x%08x\n"),
5978 (unsigned)bfd_getl32 (esdfm->version_mask));
5979 fprintf (file, _(" psect offset: %u\n"),
5980 (unsigned)bfd_getl32 (esdfm->value));
5981 fprintf (file, _(" psect index : %u\n"),
5982 (unsigned)bfd_getl32 (esdfm->psindx));
5983 fprintf (file, _(" name : %.*s\n"),
5984 esdfm->namlng, esdfm->name);
5988 fprintf (file, _("unhandled egsd entry type %u\n"), type);
5996 evax_bfd_print_hex (FILE *file, const char *pfx,
5997 const unsigned char *buf, unsigned int len)
6003 for (i = 0; i < len; i++)
6007 fprintf (file, " %02x", buf[i]);
6020 evax_bfd_print_etir_stc_ir (FILE *file, const unsigned char *buf, int is_ps)
6022 fprintf (file, _(" linkage index: %u, replacement insn: 0x%08x\n"),
6023 (unsigned)bfd_getl32 (buf),
6024 (unsigned)bfd_getl32 (buf + 16));
6025 fprintf (file, _(" psect idx 1: %u, offset 1: 0x%08x %08x\n"),
6026 (unsigned)bfd_getl32 (buf + 4),
6027 (unsigned)bfd_getl32 (buf + 12),
6028 (unsigned)bfd_getl32 (buf + 8));
6029 fprintf (file, _(" psect idx 2: %u, offset 2: 0x%08x %08x\n"),
6030 (unsigned)bfd_getl32 (buf + 20),
6031 (unsigned)bfd_getl32 (buf + 28),
6032 (unsigned)bfd_getl32 (buf + 24));
6034 fprintf (file, _(" psect idx 3: %u, offset 3: 0x%08x %08x\n"),
6035 (unsigned)bfd_getl32 (buf + 32),
6036 (unsigned)bfd_getl32 (buf + 40),
6037 (unsigned)bfd_getl32 (buf + 36));
6039 fprintf (file, _(" global name: %.*s\n"), buf[32], buf + 33);
6043 evax_bfd_print_etir (FILE *file, const char *name,
6044 unsigned char *rec, unsigned int rec_len)
6046 unsigned int off = sizeof (struct vms_egsd);
6047 unsigned int sec_len;
6049 fprintf (file, _(" %s (len=%u+%u):\n"), name,
6050 (unsigned)(rec_len - sizeof (struct vms_eobjrec)),
6051 (unsigned)sizeof (struct vms_eobjrec));
6053 for (off = sizeof (struct vms_eobjrec); off < rec_len; )
6055 struct vms_etir *etir = (struct vms_etir *)(rec + off);
6060 type = bfd_getl16 (etir->rectyp);
6061 size = bfd_getl16 (etir->size);
6062 buf = rec + off + sizeof (struct vms_etir);
6064 fprintf (file, _(" (type: %3u, size: 4+%3u): "), type, size - 4);
6067 case ETIR__C_STA_GBL:
6068 fprintf (file, _("STA_GBL (stack global) %.*s\n"),
6071 case ETIR__C_STA_LW:
6072 fprintf (file, _("STA_LW (stack longword) 0x%08x\n"),
6073 (unsigned)bfd_getl32 (buf));
6075 case ETIR__C_STA_QW:
6076 fprintf (file, _("STA_QW (stack quadword) 0x%08x %08x\n"),
6077 (unsigned)bfd_getl32 (buf + 4),
6078 (unsigned)bfd_getl32 (buf + 0));
6080 case ETIR__C_STA_PQ:
6081 fprintf (file, _("STA_PQ (stack psect base + offset)\n"));
6082 fprintf (file, _(" psect: %u, offset: 0x%08x %08x\n"),
6083 (unsigned)bfd_getl32 (buf + 0),
6084 (unsigned)bfd_getl32 (buf + 8),
6085 (unsigned)bfd_getl32 (buf + 4));
6087 case ETIR__C_STA_LI:
6088 fprintf (file, _("STA_LI (stack literal)\n"));
6090 case ETIR__C_STA_MOD:
6091 fprintf (file, _("STA_MOD (stack module)\n"));
6093 case ETIR__C_STA_CKARG:
6094 fprintf (file, _("STA_CKARG (compare procedure argument)\n"));
6098 fprintf (file, _("STO_B (store byte)\n"));
6101 fprintf (file, _("STO_W (store word)\n"));
6103 case ETIR__C_STO_LW:
6104 fprintf (file, _("STO_LW (store longword)\n"));
6106 case ETIR__C_STO_QW:
6107 fprintf (file, _("STO_QW (store quadword)\n"));
6109 case ETIR__C_STO_IMMR:
6111 unsigned int len = bfd_getl32 (buf);
6113 _("STO_IMMR (store immediate repeat) %u bytes\n"),
6115 evax_bfd_print_hex (file, " ", buf + 4, len);
6119 case ETIR__C_STO_GBL:
6120 fprintf (file, _("STO_GBL (store global) %.*s\n"),
6123 case ETIR__C_STO_CA:
6124 fprintf (file, _("STO_CA (store code address) %.*s\n"),
6127 case ETIR__C_STO_RB:
6128 fprintf (file, _("STO_RB (store relative branch)\n"));
6130 case ETIR__C_STO_AB:
6131 fprintf (file, _("STO_AB (store absolute branch)\n"));
6133 case ETIR__C_STO_OFF:
6134 fprintf (file, _("STO_OFF (store offset to psect)\n"));
6136 case ETIR__C_STO_IMM:
6138 unsigned int len = bfd_getl32 (buf);
6140 _("STO_IMM (store immediate) %u bytes\n"),
6142 evax_bfd_print_hex (file, " ", buf + 4, len);
6146 case ETIR__C_STO_GBL_LW:
6147 fprintf (file, _("STO_GBL_LW (store global longword) %.*s\n"),
6150 case ETIR__C_STO_LP_PSB:
6151 fprintf (file, _("STO_OFF (store LP with procedure signature)\n"));
6153 case ETIR__C_STO_HINT_GBL:
6154 fprintf (file, _("STO_BR_GBL (store branch global) *todo*\n"));
6156 case ETIR__C_STO_HINT_PS:
6157 fprintf (file, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6160 case ETIR__C_OPR_NOP:
6161 fprintf (file, _("OPR_NOP (no-operation)\n"));
6163 case ETIR__C_OPR_ADD:
6164 fprintf (file, _("OPR_ADD (add)\n"));
6166 case ETIR__C_OPR_SUB:
6167 fprintf (file, _("OPR_SUB (substract)\n"));
6169 case ETIR__C_OPR_MUL:
6170 fprintf (file, _("OPR_MUL (multiply)\n"));
6172 case ETIR__C_OPR_DIV:
6173 fprintf (file, _("OPR_DIV (divide)\n"));
6175 case ETIR__C_OPR_AND:
6176 fprintf (file, _("OPR_AND (logical and)\n"));
6178 case ETIR__C_OPR_IOR:
6179 fprintf (file, _("OPR_IOR (logical inclusive or)\n"));
6181 case ETIR__C_OPR_EOR:
6182 fprintf (file, _("OPR_EOR (logical exclusive or)\n"));
6184 case ETIR__C_OPR_NEG:
6185 fprintf (file, _("OPR_NEG (negate)\n"));
6187 case ETIR__C_OPR_COM:
6188 fprintf (file, _("OPR_COM (complement)\n"));
6190 case ETIR__C_OPR_INSV:
6191 fprintf (file, _("OPR_INSV (insert field)\n"));
6193 case ETIR__C_OPR_ASH:
6194 fprintf (file, _("OPR_ASH (arithmetic shift)\n"));
6196 case ETIR__C_OPR_USH:
6197 fprintf (file, _("OPR_USH (unsigned shift)\n"));
6199 case ETIR__C_OPR_ROT:
6200 fprintf (file, _("OPR_ROT (rotate)\n"));
6202 case ETIR__C_OPR_SEL:
6203 fprintf (file, _("OPR_SEL (select)\n"));
6205 case ETIR__C_OPR_REDEF:
6206 fprintf (file, _("OPR_REDEF (redefine symbol to curr location)\n"));
6208 case ETIR__C_OPR_DFLIT:
6209 fprintf (file, _("OPR_REDEF (define a literal)\n"));
6212 case ETIR__C_STC_LP:
6213 fprintf (file, _("STC_LP (store cond linkage pair)\n"));
6215 case ETIR__C_STC_LP_PSB:
6217 _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6218 fprintf (file, _(" linkage index: %u, procedure: %.*s\n"),
6219 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6220 buf += 4 + 1 + buf[4];
6221 fprintf (file, _(" signature: %.*s\n"), buf[0], buf + 1);
6223 case ETIR__C_STC_GBL:
6224 fprintf (file, _("STC_GBL (store cond global)\n"));
6225 fprintf (file, _(" linkage index: %u, global: %.*s\n"),
6226 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6228 case ETIR__C_STC_GCA:
6229 fprintf (file, _("STC_GCA (store cond code address)\n"));
6230 fprintf (file, _(" linkage index: %u, procedure name: %.*s\n"),
6231 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6233 case ETIR__C_STC_PS:
6234 fprintf (file, _("STC_PS (store cond psect + offset)\n"));
6236 _(" linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6237 (unsigned)bfd_getl32 (buf),
6238 (unsigned)bfd_getl32 (buf + 4),
6239 (unsigned)bfd_getl32 (buf + 12),
6240 (unsigned)bfd_getl32 (buf + 8));
6242 case ETIR__C_STC_NOP_GBL:
6243 fprintf (file, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6244 evax_bfd_print_etir_stc_ir (file, buf, 0);
6246 case ETIR__C_STC_NOP_PS:
6247 fprintf (file, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6248 evax_bfd_print_etir_stc_ir (file, buf, 1);
6250 case ETIR__C_STC_BSR_GBL:
6251 fprintf (file, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6252 evax_bfd_print_etir_stc_ir (file, buf, 0);
6254 case ETIR__C_STC_BSR_PS:
6255 fprintf (file, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6256 evax_bfd_print_etir_stc_ir (file, buf, 1);
6258 case ETIR__C_STC_LDA_GBL:
6259 fprintf (file, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6260 evax_bfd_print_etir_stc_ir (file, buf, 0);
6262 case ETIR__C_STC_LDA_PS:
6263 fprintf (file, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6264 evax_bfd_print_etir_stc_ir (file, buf, 1);
6266 case ETIR__C_STC_BOH_GBL:
6267 fprintf (file, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6268 evax_bfd_print_etir_stc_ir (file, buf, 0);
6270 case ETIR__C_STC_BOH_PS:
6271 fprintf (file, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6272 evax_bfd_print_etir_stc_ir (file, buf, 1);
6274 case ETIR__C_STC_NBH_GBL:
6276 _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6278 case ETIR__C_STC_NBH_PS:
6280 _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6283 case ETIR__C_CTL_SETRB:
6284 fprintf (file, _("CTL_SETRB (set relocation base)\n"));
6287 case ETIR__C_CTL_AUGRB:
6289 unsigned int val = bfd_getl32 (buf);
6290 fprintf (file, _("CTL_AUGRB (augment relocation base) %u\n"), val);
6293 case ETIR__C_CTL_DFLOC:
6294 fprintf (file, _("CTL_DFLOC (define location)\n"));
6296 case ETIR__C_CTL_STLOC:
6297 fprintf (file, _("CTL_STLOC (set location)\n"));
6299 case ETIR__C_CTL_STKDL:
6300 fprintf (file, _("CTL_STKDL (stack defined location)\n"));
6303 fprintf (file, _("*unhandled*\n"));
6311 evax_bfd_print_eobj (struct bfd *abfd, FILE *file)
6313 bfd_boolean is_first = TRUE;
6314 bfd_boolean has_records = FALSE;
6318 unsigned int rec_len;
6319 unsigned int pad_len;
6321 unsigned int hdr_size;
6326 unsigned char buf[6];
6331 if (bfd_bread (buf, sizeof (buf), abfd) != sizeof (buf))
6333 fprintf (file, _("cannot read GST record length\n"));
6336 rec_len = bfd_getl16 (buf + 0);
6337 if (rec_len == bfd_getl16 (buf + 4)
6338 && bfd_getl16 (buf + 2) == EOBJ__C_EMH)
6340 /* The format is raw: record-size, type, record-size. */
6342 pad_len = (rec_len + 1) & ~1U;
6345 else if (rec_len == EOBJ__C_EMH)
6347 has_records = FALSE;
6348 pad_len = bfd_getl16 (buf + 2);
6354 fprintf (file, _("cannot find EMH in first GST record\n"));
6357 rec = bfd_malloc (pad_len);
6358 memcpy (rec, buf + sizeof (buf) - hdr_size, hdr_size);
6362 unsigned int rec_len2 = 0;
6363 unsigned char hdr[4];
6367 unsigned char buf_len[2];
6369 if (bfd_bread (buf_len, sizeof (buf_len), abfd)
6370 != sizeof (buf_len))
6372 fprintf (file, _("cannot read GST record length\n"));
6375 rec_len2 = (unsigned)bfd_getl16 (buf_len);
6378 if (bfd_bread (hdr, sizeof (hdr), abfd) != sizeof (hdr))
6380 fprintf (file, _("cannot read GST record header\n"));
6383 rec_len = (unsigned)bfd_getl16 (hdr + 2);
6385 pad_len = (rec_len + 1) & ~1U;
6388 rec = bfd_malloc (pad_len);
6389 memcpy (rec, hdr, sizeof (hdr));
6390 hdr_size = sizeof (hdr);
6391 if (has_records && rec_len2 != rec_len)
6393 fprintf (file, _(" corrupted GST\n"));
6398 if (bfd_bread (rec + hdr_size, pad_len - hdr_size, abfd)
6399 != pad_len - hdr_size)
6401 fprintf (file, _("cannot read GST record\n"));
6405 type = (unsigned)bfd_getl16 (rec);
6410 evax_bfd_print_emh (file, rec, rec_len);
6413 evax_bfd_print_egsd (file, rec, rec_len);
6416 evax_bfd_print_eeom (file, rec, rec_len);
6421 evax_bfd_print_etir (file, "ETIR", rec, rec_len);
6424 evax_bfd_print_etir (file, "EDBG", rec, rec_len);
6427 evax_bfd_print_etir (file, "ETBT", rec, rec_len);
6430 fprintf (file, _(" unhandled EOBJ record type %u\n"), type);
6438 evax_bfd_print_relocation_records (FILE *file, const unsigned char *rel,
6439 unsigned int stride)
6447 count = bfd_getl32 (rel + 0);
6451 base = bfd_getl32 (rel + 4);
6453 fprintf (file, _(" bitcount: %u, base addr: 0x%08x\n"),
6457 for (j = 0; count > 0; j += 4, count -= 32)
6463 val = bfd_getl32 (rel);
6466 fprintf (file, _(" bitmap: 0x%08x (count: %u):\n"), val, count);
6468 for (k = 0; k < 32; k++)
6473 fprintf (file, _(" %08x"), base + (j * 8 + k) * stride);
6488 evax_bfd_print_address_fixups (FILE *file, const unsigned char *rel)
6495 count = bfd_getl32 (rel + 0);
6498 fprintf (file, _(" image %u (%u entries)\n"),
6499 (unsigned)bfd_getl32 (rel + 4), count);
6501 for (j = 0; j < count; j++)
6503 fprintf (file, _(" offset: 0x%08x, val: 0x%08x\n"),
6504 (unsigned)bfd_getl32 (rel + 0),
6505 (unsigned)bfd_getl32 (rel + 4));
6512 evax_bfd_print_reference_fixups (FILE *file, const unsigned char *rel)
6521 count = bfd_getl32 (rel + 0);
6524 fprintf (file, _(" image %u (%u entries), offsets:\n"),
6525 (unsigned)bfd_getl32 (rel + 4), count);
6527 for (j = 0; j < count; j++)
6531 fprintf (file, _(" 0x%08x"), (unsigned)bfd_getl32 (rel));
6546 evax_bfd_print_indent (int indent, FILE *file)
6548 for (; indent; indent--)
6553 evax_bfd_get_dsc_name (unsigned int v)
6557 case DSC__K_DTYPE_Z:
6558 return "Z (Unspecified)";
6559 case DSC__K_DTYPE_V:
6561 case DSC__K_DTYPE_BU:
6562 return "BU (Byte logical)";
6563 case DSC__K_DTYPE_WU:
6564 return "WU (Word logical)";
6565 case DSC__K_DTYPE_LU:
6566 return "LU (Longword logical)";
6567 case DSC__K_DTYPE_QU:
6568 return "QU (Quadword logical)";
6569 case DSC__K_DTYPE_B:
6570 return "B (Byte integer)";
6571 case DSC__K_DTYPE_W:
6572 return "W (Word integer)";
6573 case DSC__K_DTYPE_L:
6574 return "L (Longword integer)";
6575 case DSC__K_DTYPE_Q:
6576 return "Q (Quadword integer)";
6577 case DSC__K_DTYPE_F:
6578 return "F (Single-precision floating)";
6579 case DSC__K_DTYPE_D:
6580 return "D (Double-precision floating)";
6581 case DSC__K_DTYPE_FC:
6582 return "FC (Complex)";
6583 case DSC__K_DTYPE_DC:
6584 return "DC (Double-precision Complex)";
6585 case DSC__K_DTYPE_T:
6586 return "T (ASCII text string)";
6587 case DSC__K_DTYPE_NU:
6588 return "NU (Numeric string, unsigned)";
6589 case DSC__K_DTYPE_NL:
6590 return "NL (Numeric string, left separate sign)";
6591 case DSC__K_DTYPE_NLO:
6592 return "NLO (Numeric string, left overpunched sign)";
6593 case DSC__K_DTYPE_NR:
6594 return "NR (Numeric string, right separate sign)";
6595 case DSC__K_DTYPE_NRO:
6596 return "NRO (Numeric string, right overpunched sig)";
6597 case DSC__K_DTYPE_NZ:
6598 return "NZ (Numeric string, zoned sign)";
6599 case DSC__K_DTYPE_P:
6600 return "P (Packed decimal string)";
6601 case DSC__K_DTYPE_ZI:
6602 return "ZI (Sequence of instructions)";
6603 case DSC__K_DTYPE_ZEM:
6604 return "ZEM (Procedure entry mask)";
6605 case DSC__K_DTYPE_DSC:
6606 return "DSC (Descriptor, used for arrays of dyn strings)";
6607 case DSC__K_DTYPE_OU:
6608 return "OU (Octaword logical)";
6609 case DSC__K_DTYPE_O:
6610 return "O (Octaword integer)";
6611 case DSC__K_DTYPE_G:
6612 return "G (Double precision G floating, 64 bit)";
6613 case DSC__K_DTYPE_H:
6614 return "H (Quadruple precision floating, 128 bit)";
6615 case DSC__K_DTYPE_GC:
6616 return "GC (Double precision complex, G floating)";
6617 case DSC__K_DTYPE_HC:
6618 return "HC (Quadruple precision complex, H floating)";
6619 case DSC__K_DTYPE_CIT:
6620 return "CIT (COBOL intermediate temporary)";
6621 case DSC__K_DTYPE_BPV:
6622 return "BPV (Bound Procedure Value)";
6623 case DSC__K_DTYPE_BLV:
6624 return "BLV (Bound Label Value)";
6625 case DSC__K_DTYPE_VU:
6626 return "VU (Bit Unaligned)";
6627 case DSC__K_DTYPE_ADT:
6628 return "ADT (Absolute Date-Time)";
6629 case DSC__K_DTYPE_VT:
6630 return "VT (Varying Text)";
6631 case DSC__K_DTYPE_T2:
6632 return "T2 (16-bit char)";
6633 case DSC__K_DTYPE_VT2:
6634 return "VT2 (16-bit varying char)";
6636 return "?? (unknown)";
6641 evax_bfd_print_desc (const unsigned char *buf, int indent, FILE *file)
6643 unsigned char bclass = buf[3];
6644 unsigned char dtype = buf[2];
6645 unsigned int len = (unsigned)bfd_getl16 (buf);
6646 unsigned int pointer = (unsigned)bfd_getl32 (buf + 4);
6648 evax_bfd_print_indent (indent, file);
6650 if (len == 1 && pointer == 0xffffffffUL)
6653 fprintf (file, _("64 bits *unhandled*\n"));
6657 fprintf (file, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
6658 bclass, dtype, len, pointer);
6661 case DSC__K_CLASS_NCA:
6663 const struct vms_dsc_nca *dsc = (const void *)buf;
6665 const unsigned char *b;
6667 evax_bfd_print_indent (indent, file);
6668 fprintf (file, _("non-contiguous array of %s\n"),
6669 evax_bfd_get_dsc_name (dsc->dtype));
6670 evax_bfd_print_indent (indent + 1, file);
6672 _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
6673 dsc->dimct, dsc->aflags, dsc->digits, dsc->scale);
6674 evax_bfd_print_indent (indent + 1, file);
6676 _("arsize: %u, a0: 0x%08x\n"),
6677 (unsigned)bfd_getl32 (dsc->arsize),
6678 (unsigned)bfd_getl32 (dsc->a0));
6679 evax_bfd_print_indent (indent + 1, file);
6680 fprintf (file, _("Strides:\n"));
6681 b = buf + sizeof (*dsc);
6682 for (i = 0; i < dsc->dimct; i++)
6684 evax_bfd_print_indent (indent + 2, file);
6685 fprintf (file, _("[%u]: %u\n"), i + 1,
6686 (unsigned)bfd_getl32 (b));
6689 evax_bfd_print_indent (indent + 1, file);
6690 fprintf (file, _("Bounds:\n"));
6691 b = buf + sizeof (*dsc);
6692 for (i = 0; i < dsc->dimct; i++)
6694 evax_bfd_print_indent (indent + 2, file);
6695 fprintf (file, _("[%u]: Lower: %u, upper: %u\n"), i + 1,
6696 (unsigned)bfd_getl32 (b + 0),
6697 (unsigned)bfd_getl32 (b + 4));
6702 case DSC__K_CLASS_UBS:
6704 const struct vms_dsc_ubs *ubs = (const void *)buf;
6706 evax_bfd_print_indent (indent, file);
6707 fprintf (file, _("unaligned bit-string of %s\n"),
6708 evax_bfd_get_dsc_name (ubs->dtype));
6709 evax_bfd_print_indent (indent + 1, file);
6711 _("base: %u, pos: %u\n"),
6712 (unsigned)bfd_getl32 (ubs->base),
6713 (unsigned)bfd_getl32 (ubs->pos));
6717 fprintf (file, _("*unhandled*\n"));
6724 evax_bfd_print_valspec (const unsigned char *buf, int indent, FILE *file)
6726 unsigned int vflags = buf[0];
6727 unsigned int value = (unsigned)bfd_getl32 (buf + 1);
6728 unsigned int len = 5;
6730 evax_bfd_print_indent (indent, file);
6731 fprintf (file, _("vflags: 0x%02x, value: 0x%08x "), vflags, value);
6736 case DST__K_VFLAGS_NOVAL:
6737 fprintf (file, _("(no value)\n"));
6739 case DST__K_VFLAGS_NOTACTIVE:
6740 fprintf (file, _("(not active)\n"));
6742 case DST__K_VFLAGS_UNALLOC:
6743 fprintf (file, _("(not allocated)\n"));
6745 case DST__K_VFLAGS_DSC:
6746 fprintf (file, _("(descriptor)\n"));
6747 evax_bfd_print_desc (buf + value, indent + 1, file);
6749 case DST__K_VFLAGS_TVS:
6750 fprintf (file, _("(trailing value)\n"));
6752 case DST__K_VS_FOLLOWS:
6753 fprintf (file, _("(value spec follows)\n"));
6755 case DST__K_VFLAGS_BITOFFS:
6756 fprintf (file, _("(at bit offset %u)\n"), value);
6759 fprintf (file, _("(reg: %u, disp: %u, indir: %u, kind: "),
6760 (vflags & DST__K_REGNUM_MASK) >> DST__K_REGNUM_SHIFT,
6761 vflags & DST__K_DISP ? 1 : 0,
6762 vflags & DST__K_INDIR ? 1 : 0);
6763 switch (vflags & DST__K_VALKIND_MASK)
6765 case DST__K_VALKIND_LITERAL:
6766 fputs (_("literal"), file);
6768 case DST__K_VALKIND_ADDR:
6769 fputs (_("address"), file);
6771 case DST__K_VALKIND_DESC:
6772 fputs (_("desc"), file);
6774 case DST__K_VALKIND_REG:
6775 fputs (_("reg"), file);
6778 fputs (")\n", file);
6785 evax_bfd_print_typspec (const unsigned char *buf, int indent, FILE *file)
6787 unsigned char kind = buf[2];
6788 unsigned int len = (unsigned)bfd_getl16 (buf);
6790 evax_bfd_print_indent (indent, file);
6791 fprintf (file, ("len: %2u, kind: %2u "), len, kind);
6795 case DST__K_TS_ATOM:
6796 fprintf (file, ("atomic, type=0x%02x %s\n"),
6797 buf[0], evax_bfd_get_dsc_name (buf[0]));
6800 fprintf (file, ("indirect, defined at 0x%08x\n"),
6801 (unsigned)bfd_getl32 (buf));
6803 case DST__K_TS_TPTR:
6804 fprintf (file, ("typed pointer\n"));
6805 evax_bfd_print_typspec (buf, indent + 1, file);
6808 fprintf (file, ("pointer\n"));
6810 case DST__K_TS_ARRAY:
6812 const unsigned char *vs;
6813 unsigned int vec_len;
6816 fprintf (file, ("array, dim: %u, bitmap: "), buf[0]);
6817 vec_len = (buf[0] + 1 + 7) / 8;
6818 for (i = 0; i < vec_len; i++)
6819 fprintf (file, " %02x", buf[i + 1]);
6821 vs = buf + 1 + vec_len;
6822 evax_bfd_print_indent (indent, file);
6823 fprintf (file, ("array descriptor:\n"));
6824 vs += evax_bfd_print_valspec (vs, indent + 1, file);
6825 for (i = 0; i < buf[0] + 1U; i++)
6826 if (buf[1 + i / 8] & (1 << (i % 8)))
6828 evax_bfd_print_indent (indent, file);
6830 fprintf (file, ("type spec for element:\n"));
6832 fprintf (file, ("type spec for subscript %u:\n"), i);
6833 evax_bfd_print_typspec (vs, indent + 1, file);
6834 vs += bfd_getl16 (vs);
6839 fprintf (file, ("*unhandled*\n"));
6844 evax_bfd_print_dst (struct bfd *abfd, unsigned int dst_size, FILE *file)
6846 unsigned int off = 0;
6847 unsigned int pc = 0;
6848 unsigned int line = 0;
6850 fprintf (file, _("Debug symbol table:\n"));
6852 while (dst_size > 0)
6854 struct vms_dst_header dsth;
6859 if (bfd_bread (&dsth, sizeof (dsth), abfd) != sizeof (dsth))
6861 fprintf (file, _("cannot read DST header\n"));
6864 len = bfd_getl16 (dsth.length);
6865 type = bfd_getl16 (dsth.type);
6866 fprintf (file, _(" type: %3u, len: %3u (at 0x%08x): "),
6876 len -= sizeof (dsth);
6877 buf = bfd_malloc (len);
6878 if (bfd_bread (buf, len, abfd) != len)
6880 fprintf (file, _("cannot read DST symbol\n"));
6885 case DSC__K_DTYPE_V:
6886 case DSC__K_DTYPE_BU:
6887 case DSC__K_DTYPE_WU:
6888 case DSC__K_DTYPE_LU:
6889 case DSC__K_DTYPE_QU:
6890 case DSC__K_DTYPE_B:
6891 case DSC__K_DTYPE_W:
6892 case DSC__K_DTYPE_L:
6893 case DSC__K_DTYPE_Q:
6894 case DSC__K_DTYPE_F:
6895 case DSC__K_DTYPE_D:
6896 case DSC__K_DTYPE_FC:
6897 case DSC__K_DTYPE_DC:
6898 case DSC__K_DTYPE_T:
6899 case DSC__K_DTYPE_NU:
6900 case DSC__K_DTYPE_NL:
6901 case DSC__K_DTYPE_NLO:
6902 case DSC__K_DTYPE_NR:
6903 case DSC__K_DTYPE_NRO:
6904 case DSC__K_DTYPE_NZ:
6905 case DSC__K_DTYPE_P:
6906 case DSC__K_DTYPE_ZI:
6907 case DSC__K_DTYPE_ZEM:
6908 case DSC__K_DTYPE_DSC:
6909 case DSC__K_DTYPE_OU:
6910 case DSC__K_DTYPE_O:
6911 case DSC__K_DTYPE_G:
6912 case DSC__K_DTYPE_H:
6913 case DSC__K_DTYPE_GC:
6914 case DSC__K_DTYPE_HC:
6915 case DSC__K_DTYPE_CIT:
6916 case DSC__K_DTYPE_BPV:
6917 case DSC__K_DTYPE_BLV:
6918 case DSC__K_DTYPE_VU:
6919 case DSC__K_DTYPE_ADT:
6920 case DSC__K_DTYPE_VT:
6921 case DSC__K_DTYPE_T2:
6922 case DSC__K_DTYPE_VT2:
6923 fprintf (file, _("standard data: %s\n"),
6924 evax_bfd_get_dsc_name (type));
6925 evax_bfd_print_valspec (buf, 4, file);
6926 fprintf (file, _(" name: %.*s\n"), buf[5], buf + 6);
6930 struct vms_dst_modbeg *dst = (void *)buf;
6931 const char *name = (const char *)buf + sizeof (*dst);
6933 fprintf (file, _("modbeg\n"));
6934 fprintf (file, _(" flags: %d, language: %u, "
6935 "major: %u, minor: %u\n"),
6937 (unsigned)bfd_getl32 (dst->language),
6938 (unsigned)bfd_getl16 (dst->major),
6939 (unsigned)bfd_getl16 (dst->minor));
6940 fprintf (file, _(" module name: %.*s\n"),
6942 name += name[0] + 1;
6943 fprintf (file, _(" compiler : %.*s\n"),
6948 fprintf (file, _("modend\n"));
6952 struct vms_dst_rtnbeg *dst = (void *)buf;
6953 const char *name = (const char *)buf + sizeof (*dst);
6955 fputs (_("rtnbeg\n"), file);
6956 fprintf (file, _(" flags: %u, address: 0x%08x, "
6957 "pd-address: 0x%08x\n"),
6959 (unsigned)bfd_getl32 (dst->address),
6960 (unsigned)bfd_getl32 (dst->pd_address));
6961 fprintf (file, _(" routine name: %.*s\n"),
6967 struct vms_dst_rtnend *dst = (void *)buf;
6969 fprintf (file, _("rtnend: size 0x%08x\n"),
6970 (unsigned)bfd_getl32 (dst->size));
6975 struct vms_dst_prolog *dst = (void *)buf;
6977 fprintf (file, _("prolog: bkpt address 0x%08x\n"),
6978 (unsigned)bfd_getl32 (dst->bkpt_addr));
6983 struct vms_dst_epilog *dst = (void *)buf;
6985 fprintf (file, _("epilog: flags: %u, count: %u\n"),
6986 dst->flags, (unsigned)bfd_getl32 (dst->count));
6991 struct vms_dst_blkbeg *dst = (void *)buf;
6992 const char *name = (const char *)buf + sizeof (*dst);
6994 fprintf (file, _("blkbeg: address: 0x%08x, name: %.*s\n"),
6995 (unsigned)bfd_getl32 (dst->address),
7001 struct vms_dst_blkend *dst = (void *)buf;
7003 fprintf (file, _("blkend: size: 0x%08x\n"),
7004 (unsigned)bfd_getl32 (dst->size));
7007 case DST__K_TYPSPEC:
7009 fprintf (file, _("typspec (len: %u)\n"), len);
7010 fprintf (file, _(" name: %.*s\n"), buf[0], buf + 1);
7011 evax_bfd_print_typspec (buf + 1 + buf[0], 5, file);
7016 fprintf (file, _("septyp, name: %.*s\n"), buf[5], buf + 6);
7017 evax_bfd_print_valspec (buf, 4, file);
7022 struct vms_dst_recbeg *recbeg = (void *)buf;
7023 const char *name = (const char *)buf + sizeof (*recbeg);
7025 fprintf (file, _("recbeg: name: %.*s\n"), name[0], name + 1);
7026 evax_bfd_print_valspec (buf, 4, file);
7027 fprintf (file, (" len: %u bits\n"),
7028 (unsigned)bfd_getl32 (name + 1 + name[0]));
7032 fprintf (file, _("recend\n"));
7034 case DST__K_ENUMBEG:
7035 fprintf (file, _("enumbeg, len: %u, name: %.*s\n"),
7036 buf[0], buf[1], buf + 2);
7038 case DST__K_ENUMELT:
7039 fprintf (file, _("enumelt, name: %.*s\n"), buf[5], buf + 6);
7040 evax_bfd_print_valspec (buf, 4, file);
7042 case DST__K_ENUMEND:
7043 fprintf (file, _("enumend\n"));
7047 struct vms_dst_label *lab = (void *)buf;
7048 fprintf (file, ("label, name: %.*s\n"),
7049 lab->name[0], lab->name + 1);
7050 fprintf (file, (" address: 0x%08x\n"),
7051 (unsigned)bfd_getl32 (lab->value));
7054 case DST__K_DIS_RANGE:
7056 unsigned int cnt = bfd_getl32 (buf);
7057 unsigned char *rng = buf + 4;
7060 fprintf (file, _("discontiguous range (nbr: %u)\n"), cnt);
7061 for (i = 0; i < cnt; i++, rng += 8)
7062 fprintf (file, _(" address: 0x%08x, size: %u\n"),
7063 (unsigned)bfd_getl32 (rng),
7064 (unsigned)bfd_getl32 (rng + 4));
7068 case DST__K_LINE_NUM:
7070 unsigned char *buf_orig = buf;
7072 fprintf (file, _("line num (len: %u)\n"), len);
7077 unsigned char cmdlen;
7087 case DST__K_DELTA_PC_W:
7088 val = bfd_getl16 (buf + 1);
7089 fprintf (file, _("delta_pc_w %u\n"), val);
7094 case DST__K_INCR_LINUM:
7096 fprintf (file, _("incr_linum(b): +%u\n"), val);
7100 case DST__K_INCR_LINUM_W:
7101 val = bfd_getl16 (buf + 1);
7102 fprintf (file, _("incr_linum_w: +%u\n"), val);
7106 case DST__K_INCR_LINUM_L:
7107 val = bfd_getl32 (buf + 1);
7108 fprintf (file, _("incr_linum_l: +%u\n"), val);
7112 case DST__K_SET_LINUM:
7113 line = bfd_getl16 (buf + 1);
7114 fprintf (file, _("set_line_num(w) %u\n"), line);
7117 case DST__K_SET_LINUM_B:
7119 fprintf (file, _("set_line_num_b %u\n"), line);
7122 case DST__K_SET_LINUM_L:
7123 line = bfd_getl32 (buf + 1);
7124 fprintf (file, _("set_line_num_l %u\n"), line);
7127 case DST__K_SET_ABS_PC:
7128 pc = bfd_getl32 (buf + 1);
7129 fprintf (file, _("set_abs_pc: 0x%08x\n"), pc);
7132 case DST__K_DELTA_PC_L:
7133 fprintf (file, _("delta_pc_l: +0x%08x\n"),
7134 (unsigned)bfd_getl32 (buf + 1));
7138 fprintf (file, _("term(b): 0x%02x"), buf[1]);
7140 fprintf (file, _(" pc: 0x%08x\n"), pc);
7144 val = bfd_getl16 (buf + 1);
7145 fprintf (file, _("term_w: 0x%04x"), val);
7147 fprintf (file, _(" pc: 0x%08x\n"), pc);
7153 fprintf (file, _("delta pc +%-4d"), -cmd);
7154 line++; /* FIXME: curr increment. */
7156 fprintf (file, _(" pc: 0x%08x line: %5u\n"),
7161 fprintf (file, _(" *unhandled* cmd %u\n"), cmd);
7174 unsigned char *buf_orig = buf;
7176 fprintf (file, _("source (len: %u)\n"), len);
7180 signed char cmd = buf[0];
7181 unsigned char cmdlen = 0;
7185 case DST__K_SRC_DECLFILE:
7187 struct vms_dst_src_decl_src *src = (void *)(buf + 1);
7190 fprintf (file, _(" declfile: len: %u, flags: %u, "
7192 src->length, src->flags,
7193 (unsigned)bfd_getl16 (src->fileid));
7194 fprintf (file, _(" rms: cdt: 0x%08x %08x, "
7195 "ebk: 0x%08x, ffb: 0x%04x, "
7197 (unsigned)bfd_getl32 (src->rms_cdt + 4),
7198 (unsigned)bfd_getl32 (src->rms_cdt + 0),
7199 (unsigned)bfd_getl32 (src->rms_ebk),
7200 (unsigned)bfd_getl16 (src->rms_ffb),
7202 name = (const char *)buf + 1 + sizeof (*src);
7203 fprintf (file, _(" filename : %.*s\n"),
7205 name += name[0] + 1;
7206 fprintf (file, _(" module name: %.*s\n"),
7208 cmdlen = 2 + src->length;
7211 case DST__K_SRC_SETFILE:
7212 fprintf (file, _(" setfile %u\n"),
7213 (unsigned)bfd_getl16 (buf + 1));
7216 case DST__K_SRC_SETREC_W:
7217 fprintf (file, _(" setrec %u\n"),
7218 (unsigned)bfd_getl16 (buf + 1));
7221 case DST__K_SRC_SETREC_L:
7222 fprintf (file, _(" setrec %u\n"),
7223 (unsigned)bfd_getl32 (buf + 1));
7226 case DST__K_SRC_SETLNUM_W:
7227 fprintf (file, _(" setlnum %u\n"),
7228 (unsigned)bfd_getl16 (buf + 1));
7231 case DST__K_SRC_SETLNUM_L:
7232 fprintf (file, _(" setlnum %u\n"),
7233 (unsigned)bfd_getl32 (buf + 1));
7236 case DST__K_SRC_DEFLINES_W:
7237 fprintf (file, _(" deflines %u\n"),
7238 (unsigned)bfd_getl16 (buf + 1));
7241 case DST__K_SRC_DEFLINES_B:
7242 fprintf (file, _(" deflines %u\n"), buf[1]);
7245 case DST__K_SRC_FORMFEED:
7246 fprintf (file, _(" formfeed\n"));
7250 fprintf (file, _(" *unhandled* cmd %u\n"), cmd);
7262 fprintf (file, _("*unhandled* dst type %u\n"), type);
7270 evax_bfd_print_image (bfd *abfd, FILE *file)
7272 struct vms_eihd eihd;
7275 unsigned int eiha_off;
7276 unsigned int eihi_off;
7277 unsigned int eihs_off;
7278 unsigned int eisd_off;
7279 unsigned int eihef_off = 0;
7280 unsigned int eihnp_off = 0;
7281 unsigned int dmt_vbn = 0;
7282 unsigned int dmt_size = 0;
7283 unsigned int dst_vbn = 0;
7284 unsigned int dst_size = 0;
7285 unsigned int gst_vbn = 0;
7286 unsigned int gst_size = 0;
7287 unsigned int eiaf_vbn = 0;
7288 unsigned int eiaf_size = 0;
7289 unsigned int eihvn_off;
7291 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET)
7292 || bfd_bread (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
7294 fprintf (file, _("cannot read EIHD\n"));
7297 fprintf (file, _("EIHD: (size: %u, nbr blocks: %u)\n"),
7298 (unsigned)bfd_getl32 (eihd.size),
7299 (unsigned)bfd_getl32 (eihd.hdrblkcnt));
7300 fprintf (file, _(" majorid: %u, minorid: %u\n"),
7301 (unsigned)bfd_getl32 (eihd.majorid),
7302 (unsigned)bfd_getl32 (eihd.minorid));
7304 val = (unsigned)bfd_getl32 (eihd.imgtype);
7308 name = _("executable");
7311 name = _("linkable image");
7314 name = _("unknown");
7317 fprintf (file, _(" image type: %u (%s)"), val, name);
7319 val = (unsigned)bfd_getl32 (eihd.subtype);
7322 case EIHD__C_NATIVE:
7329 name = _("unknown");
7332 fprintf (file, _(", subtype: %u (%s)\n"), val, name);
7334 eisd_off = bfd_getl32 (eihd.isdoff);
7335 eiha_off = bfd_getl32 (eihd.activoff);
7336 eihi_off = bfd_getl32 (eihd.imgidoff);
7337 eihs_off = bfd_getl32 (eihd.symdbgoff);
7338 fprintf (file, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
7339 "imgid: %u, patch: %u\n"),
7340 eisd_off, eiha_off, eihs_off, eihi_off,
7341 (unsigned)bfd_getl32 (eihd.patchoff));
7342 fprintf (file, _(" fixup info rva: "));
7343 bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.iafva));
7344 fprintf (file, _(", symbol vector rva: "));
7345 bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.symvva));
7346 eihvn_off = bfd_getl32 (eihd.version_array_off);
7347 fprintf (file, _("\n"
7348 " version array off: %u\n"),
7351 _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
7352 (unsigned)bfd_getl32 (eihd.imgiocnt),
7353 (unsigned)bfd_getl32 (eihd.iochancnt),
7354 (unsigned)bfd_getl32 (eihd.privreqs + 4),
7355 (unsigned)bfd_getl32 (eihd.privreqs + 0));
7356 val = (unsigned)bfd_getl32 (eihd.lnkflags);
7357 fprintf (file, _(" linker flags: %08x:"), val);
7358 if (val & EIHD__M_LNKDEBUG)
7359 fprintf (file, " LNKDEBUG");
7360 if (val & EIHD__M_LNKNOTFR)
7361 fprintf (file, " LNKNOTFR");
7362 if (val & EIHD__M_NOP0BUFS)
7363 fprintf (file, " NOP0BUFS");
7364 if (val & EIHD__M_PICIMG)
7365 fprintf (file, " PICIMG");
7366 if (val & EIHD__M_P0IMAGE)
7367 fprintf (file, " P0IMAGE");
7368 if (val & EIHD__M_DBGDMT)
7369 fprintf (file, " DBGDMT");
7370 if (val & EIHD__M_INISHR)
7371 fprintf (file, " INISHR");
7372 if (val & EIHD__M_XLATED)
7373 fprintf (file, " XLATED");
7374 if (val & EIHD__M_BIND_CODE_SEC)
7375 fprintf (file, " BIND_CODE_SEC");
7376 if (val & EIHD__M_BIND_DATA_SEC)
7377 fprintf (file, " BIND_DATA_SEC");
7378 if (val & EIHD__M_MKTHREADS)
7379 fprintf (file, " MKTHREADS");
7380 if (val & EIHD__M_UPCALLS)
7381 fprintf (file, " UPCALLS");
7382 if (val & EIHD__M_OMV_READY)
7383 fprintf (file, " OMV_READY");
7384 if (val & EIHD__M_EXT_BIND_SECT)
7385 fprintf (file, " EXT_BIND_SECT");
7386 fprintf (file, "\n");
7387 fprintf (file, _(" ident: 0x%08x, sysver: 0x%08x, "
7388 "match ctrl: %u, symvect_size: %u\n"),
7389 (unsigned)bfd_getl32 (eihd.ident),
7390 (unsigned)bfd_getl32 (eihd.sysver),
7392 (unsigned)bfd_getl32 (eihd.symvect_size));
7393 fprintf (file, _(" BPAGE: %u"),
7394 (unsigned)bfd_getl32 (eihd.virt_mem_block_size));
7395 if (val & (EIHD__M_OMV_READY | EIHD__M_EXT_BIND_SECT))
7397 eihef_off = bfd_getl32 (eihd.ext_fixup_off);
7398 eihnp_off = bfd_getl32 (eihd.noopt_psect_off);
7399 fprintf (file, _(", ext fixup offset: %u, no_opt psect off: %u"),
7400 eihef_off, eihnp_off);
7402 fprintf (file, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd.alias));
7406 struct vms_eihvn eihvn;
7410 fprintf (file, _("system version array information:\n"));
7411 if (bfd_seek (abfd, (file_ptr) eihvn_off, SEEK_SET)
7412 || bfd_bread (&eihvn, sizeof (eihvn), abfd) != sizeof (eihvn))
7414 fprintf (file, _("cannot read EIHVN header\n"));
7417 mask = bfd_getl32 (eihvn.subsystem_mask);
7418 for (j = 0; j < 32; j++)
7419 if (mask & (1 << j))
7421 struct vms_eihvn_subversion ver;
7422 if (bfd_bread (&ver, sizeof (ver), abfd) != sizeof (ver))
7424 fprintf (file, _("cannot read EIHVN version\n"));
7427 fprintf (file, _(" %02u "), j);
7430 case EIHVN__BASE_IMAGE_BIT:
7431 fputs (_("BASE_IMAGE "), file);
7433 case EIHVN__MEMORY_MANAGEMENT_BIT:
7434 fputs (_("MEMORY_MANAGEMENT"), file);
7437 fputs (_("IO "), file);
7439 case EIHVN__FILES_VOLUMES_BIT:
7440 fputs (_("FILES_VOLUMES "), file);
7442 case EIHVN__PROCESS_SCHED_BIT:
7443 fputs (_("PROCESS_SCHED "), file);
7445 case EIHVN__SYSGEN_BIT:
7446 fputs (_("SYSGEN "), file);
7448 case EIHVN__CLUSTERS_LOCKMGR_BIT:
7449 fputs (_("CLUSTERS_LOCKMGR "), file);
7451 case EIHVN__LOGICAL_NAMES_BIT:
7452 fputs (_("LOGICAL_NAMES "), file);
7454 case EIHVN__SECURITY_BIT:
7455 fputs (_("SECURITY "), file);
7457 case EIHVN__IMAGE_ACTIVATOR_BIT:
7458 fputs (_("IMAGE_ACTIVATOR "), file);
7460 case EIHVN__NETWORKS_BIT:
7461 fputs (_("NETWORKS "), file);
7463 case EIHVN__COUNTERS_BIT:
7464 fputs (_("COUNTERS "), file);
7466 case EIHVN__STABLE_BIT:
7467 fputs (_("STABLE "), file);
7469 case EIHVN__MISC_BIT:
7470 fputs (_("MISC "), file);
7472 case EIHVN__CPU_BIT:
7473 fputs (_("CPU "), file);
7475 case EIHVN__VOLATILE_BIT:
7476 fputs (_("VOLATILE "), file);
7478 case EIHVN__SHELL_BIT:
7479 fputs (_("SHELL "), file);
7481 case EIHVN__POSIX_BIT:
7482 fputs (_("POSIX "), file);
7484 case EIHVN__MULTI_PROCESSING_BIT:
7485 fputs (_("MULTI_PROCESSING "), file);
7487 case EIHVN__GALAXY_BIT:
7488 fputs (_("GALAXY "), file);
7491 fputs (_("*unknown* "), file);
7494 fprintf (file, _(": %u.%u\n"),
7495 (unsigned)bfd_getl16 (ver.major),
7496 (unsigned)bfd_getl16 (ver.minor));
7502 struct vms_eiha eiha;
7504 if (bfd_seek (abfd, (file_ptr) eiha_off, SEEK_SET)
7505 || bfd_bread (&eiha, sizeof (eiha), abfd) != sizeof (eiha))
7507 fprintf (file, _("cannot read EIHA\n"));
7510 fprintf (file, _("Image activation: (size=%u)\n"),
7511 (unsigned)bfd_getl32 (eiha.size));
7512 fprintf (file, _(" First address : 0x%08x 0x%08x\n"),
7513 (unsigned)bfd_getl32 (eiha.tfradr1_h),
7514 (unsigned)bfd_getl32 (eiha.tfradr1));
7515 fprintf (file, _(" Second address: 0x%08x 0x%08x\n"),
7516 (unsigned)bfd_getl32 (eiha.tfradr2_h),
7517 (unsigned)bfd_getl32 (eiha.tfradr2));
7518 fprintf (file, _(" Third address : 0x%08x 0x%08x\n"),
7519 (unsigned)bfd_getl32 (eiha.tfradr3_h),
7520 (unsigned)bfd_getl32 (eiha.tfradr3));
7521 fprintf (file, _(" Fourth address: 0x%08x 0x%08x\n"),
7522 (unsigned)bfd_getl32 (eiha.tfradr4_h),
7523 (unsigned)bfd_getl32 (eiha.tfradr4));
7524 fprintf (file, _(" Shared image : 0x%08x 0x%08x\n"),
7525 (unsigned)bfd_getl32 (eiha.inishr_h),
7526 (unsigned)bfd_getl32 (eiha.inishr));
7530 struct vms_eihi eihi;
7532 if (bfd_seek (abfd, (file_ptr) eihi_off, SEEK_SET)
7533 || bfd_bread (&eihi, sizeof (eihi), abfd) != sizeof (eihi))
7535 fprintf (file, _("cannot read EIHI\n"));
7538 fprintf (file, _("Image identification: (major: %u, minor: %u)\n"),
7539 (unsigned)bfd_getl32 (eihi.majorid),
7540 (unsigned)bfd_getl32 (eihi.minorid));
7541 fprintf (file, _(" image name : %.*s\n"),
7542 eihi.imgnam[0], eihi.imgnam + 1);
7543 fprintf (file, _(" link time : %s\n"),
7544 vms_time_to_str (eihi.linktime));
7545 fprintf (file, _(" image ident : %.*s\n"),
7546 eihi.imgid[0], eihi.imgid + 1);
7547 fprintf (file, _(" linker ident : %.*s\n"),
7548 eihi.linkid[0], eihi.linkid + 1);
7549 fprintf (file, _(" image build ident: %.*s\n"),
7550 eihi.imgbid[0], eihi.imgbid + 1);
7554 struct vms_eihs eihs;
7556 if (bfd_seek (abfd, (file_ptr) eihs_off, SEEK_SET)
7557 || bfd_bread (&eihs, sizeof (eihs), abfd) != sizeof (eihs))
7559 fprintf (file, _("cannot read EIHS\n"));
7562 fprintf (file, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
7563 (unsigned)bfd_getl32 (eihs.majorid),
7564 (unsigned)bfd_getl32 (eihs.minorid));
7565 dst_vbn = bfd_getl32 (eihs.dstvbn);
7566 dst_size = bfd_getl32 (eihs.dstsize);
7567 fprintf (file, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
7568 dst_vbn, dst_size, dst_size);
7569 gst_vbn = bfd_getl32 (eihs.gstvbn);
7570 gst_size = bfd_getl32 (eihs.gstsize);
7571 fprintf (file, _(" global symbol table: vbn: %u, records: %u\n"),
7573 dmt_vbn = bfd_getl32 (eihs.dmtvbn);
7574 dmt_size = bfd_getl32 (eihs.dmtsize);
7575 fprintf (file, _(" debug module table : vbn: %u, size: %u\n"),
7578 while (eisd_off != 0)
7580 struct vms_eisd eisd;
7585 if (bfd_seek (abfd, (file_ptr) eisd_off, SEEK_SET)
7586 || bfd_bread (&eisd, sizeof (eisd), abfd) != sizeof (eisd))
7588 fprintf (file, _("cannot read EISD\n"));
7591 len = (unsigned)bfd_getl32 (eisd.eisdsize);
7592 if (len != (unsigned)-1)
7596 eisd_off = (eisd_off + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
7598 fprintf (file, _("Image section descriptor: (major: %u, minor: %u, "
7599 "size: %u, offset: %u)\n"),
7600 (unsigned)bfd_getl32 (eisd.majorid),
7601 (unsigned)bfd_getl32 (eisd.minorid),
7605 fprintf (file, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
7606 (unsigned)bfd_getl32 (eisd.virt_addr + 4),
7607 (unsigned)bfd_getl32 (eisd.virt_addr + 0),
7608 (unsigned)bfd_getl32 (eisd.secsize));
7609 val = (unsigned)bfd_getl32 (eisd.flags);
7610 fprintf (file, _(" flags: 0x%04x"), val);
7611 if (val & EISD__M_GBL)
7612 fprintf (file, " GBL");
7613 if (val & EISD__M_CRF)
7614 fprintf (file, " CRF");
7615 if (val & EISD__M_DZRO)
7616 fprintf (file, " DZRO");
7617 if (val & EISD__M_WRT)
7618 fprintf (file, " WRT");
7619 if (val & EISD__M_INITALCODE)
7620 fprintf (file, " INITALCODE");
7621 if (val & EISD__M_BASED)
7622 fprintf (file, " BASED");
7623 if (val & EISD__M_FIXUPVEC)
7624 fprintf (file, " FIXUPVEC");
7625 if (val & EISD__M_RESIDENT)
7626 fprintf (file, " RESIDENT");
7627 if (val & EISD__M_VECTOR)
7628 fprintf (file, " VECTOR");
7629 if (val & EISD__M_PROTECT)
7630 fprintf (file, " PROTECT");
7631 if (val & EISD__M_LASTCLU)
7632 fprintf (file, " LASTCLU");
7633 if (val & EISD__M_EXE)
7634 fprintf (file, " EXE");
7635 if (val & EISD__M_NONSHRADR)
7636 fprintf (file, " NONSHRADR");
7637 if (val & EISD__M_QUAD_LENGTH)
7638 fprintf (file, " QUAD_LENGTH");
7639 if (val & EISD__M_ALLOC_64BIT)
7640 fprintf (file, " ALLOC_64BIT");
7641 fprintf (file, "\n");
7642 if (val & EISD__M_FIXUPVEC)
7644 eiaf_vbn = bfd_getl32 (eisd.vbn);
7645 eiaf_size = bfd_getl32 (eisd.secsize);
7647 fprintf (file, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
7648 (unsigned)bfd_getl32 (eisd.vbn),
7649 eisd.pfc, eisd.matchctl, eisd.type);
7652 case EISD__K_NORMAL:
7653 fputs (_("NORMAL"), file);
7655 case EISD__K_SHRFXD:
7656 fputs (_("SHRFXD"), file);
7658 case EISD__K_PRVFXD:
7659 fputs (_("PRVFXD"), file);
7661 case EISD__K_SHRPIC:
7662 fputs (_("SHRPIC"), file);
7664 case EISD__K_PRVPIC:
7665 fputs (_("PRVPIC"), file);
7667 case EISD__K_USRSTACK:
7668 fputs (_("USRSTACK"), file);
7671 fputs (_("*unknown*"), file);
7674 fputs (_(")\n"), file);
7675 if (val & EISD__M_GBL)
7676 fprintf (file, _(" ident: 0x%08x, name: %.*s\n"),
7677 (unsigned)bfd_getl32 (eisd.ident),
7678 eisd.gblnam[0], eisd.gblnam + 1);
7684 if (bfd_seek (abfd, (file_ptr) (dmt_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7686 fprintf (file, _("cannot read DMT\n"));
7690 fprintf (file, _("Debug module table:\n"));
7692 while (dmt_size > 0)
7694 struct vms_dmt_header dmth;
7697 if (bfd_bread (&dmth, sizeof (dmth), abfd) != sizeof (dmth))
7699 fprintf (file, _("cannot read DMT header\n"));
7702 count = bfd_getl16 (dmth.psect_count);
7704 _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
7705 (unsigned)bfd_getl32 (dmth.modbeg),
7706 (unsigned)bfd_getl32 (dmth.size), count);
7707 dmt_size -= sizeof (dmth);
7710 struct vms_dmt_psect dmtp;
7712 if (bfd_bread (&dmtp, sizeof (dmtp), abfd) != sizeof (dmtp))
7714 fprintf (file, _("cannot read DMT psect\n"));
7717 fprintf (file, _(" psect start: 0x%08x, length: %u\n"),
7718 (unsigned)bfd_getl32 (dmtp.start),
7719 (unsigned)bfd_getl32 (dmtp.length));
7721 dmt_size -= sizeof (dmtp);
7728 if (bfd_seek (abfd, (file_ptr) (dst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7730 fprintf (file, _("cannot read DST\n"));
7734 evax_bfd_print_dst (abfd, dst_size, file);
7738 if (bfd_seek (abfd, (file_ptr) (gst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7740 fprintf (file, _("cannot read GST\n"));
7744 fprintf (file, _("Global symbol table:\n"));
7745 evax_bfd_print_eobj (abfd, file);
7750 struct vms_eiaf *eiaf;
7751 unsigned int qrelfixoff;
7752 unsigned int lrelfixoff;
7753 unsigned int qdotadroff;
7754 unsigned int ldotadroff;
7755 unsigned int shrimgcnt;
7756 unsigned int shlstoff;
7757 unsigned int codeadroff;
7758 unsigned int lpfixoff;
7759 unsigned int chgprtoff;
7761 buf = bfd_malloc (eiaf_size);
7763 if (bfd_seek (abfd, (file_ptr) (eiaf_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET)
7764 || bfd_bread (buf, eiaf_size, abfd) != eiaf_size)
7766 fprintf (file, _("cannot read EIHA\n"));
7770 eiaf = (struct vms_eiaf *)buf;
7772 _("Image activator fixup: (major: %u, minor: %u)\n"),
7773 (unsigned)bfd_getl32 (eiaf->majorid),
7774 (unsigned)bfd_getl32 (eiaf->minorid));
7775 fprintf (file, _(" iaflink : 0x%08x %08x\n"),
7776 (unsigned)bfd_getl32 (eiaf->iaflink + 0),
7777 (unsigned)bfd_getl32 (eiaf->iaflink + 4));
7778 fprintf (file, _(" fixuplnk: 0x%08x %08x\n"),
7779 (unsigned)bfd_getl32 (eiaf->fixuplnk + 0),
7780 (unsigned)bfd_getl32 (eiaf->fixuplnk + 4));
7781 fprintf (file, _(" size : %u\n"),
7782 (unsigned)bfd_getl32 (eiaf->size));
7783 fprintf (file, _(" flags: 0x%08x\n"),
7784 (unsigned)bfd_getl32 (eiaf->flags));
7785 qrelfixoff = bfd_getl32 (eiaf->qrelfixoff);
7786 lrelfixoff = bfd_getl32 (eiaf->lrelfixoff);
7787 fprintf (file, _(" qrelfixoff: %5u, lrelfixoff: %5u\n"),
7788 qrelfixoff, lrelfixoff);
7789 qdotadroff = bfd_getl32 (eiaf->qdotadroff);
7790 ldotadroff = bfd_getl32 (eiaf->ldotadroff);
7791 fprintf (file, _(" qdotadroff: %5u, ldotadroff: %5u\n"),
7792 qdotadroff, ldotadroff);
7793 codeadroff = bfd_getl32 (eiaf->codeadroff);
7794 lpfixoff = bfd_getl32 (eiaf->lpfixoff);
7795 fprintf (file, _(" codeadroff: %5u, lpfixoff : %5u\n"),
7796 codeadroff, lpfixoff);
7797 chgprtoff = bfd_getl32 (eiaf->chgprtoff);
7798 fprintf (file, _(" chgprtoff : %5u\n"), chgprtoff);
7799 shrimgcnt = bfd_getl32 (eiaf->shrimgcnt);
7800 shlstoff = bfd_getl32 (eiaf->shlstoff);
7801 fprintf (file, _(" shlstoff : %5u, shrimgcnt : %5u\n"),
7802 shlstoff, shrimgcnt);
7803 fprintf (file, _(" shlextra : %5u, permctx : %5u\n"),
7804 (unsigned)bfd_getl32 (eiaf->shlextra),
7805 (unsigned)bfd_getl32 (eiaf->permctx));
7806 fprintf (file, _(" base_va : 0x%08x\n"),
7807 (unsigned)bfd_getl32 (eiaf->base_va));
7808 fprintf (file, _(" lppsbfixoff: %5u\n"),
7809 (unsigned)bfd_getl32 (eiaf->lppsbfixoff));
7813 struct vms_shl *shl = (struct vms_shl *)(buf + shlstoff);
7816 fprintf (file, _(" Shareable images:\n"));
7817 for (j = 0; j < shrimgcnt; j++, shl++)
7820 _(" %u: size: %u, flags: 0x%02x, name: %.*s\n"),
7821 j, shl->size, shl->flags,
7822 shl->imgnam[0], shl->imgnam + 1);
7825 if (qrelfixoff != 0)
7827 fprintf (file, _(" quad-word relocation fixups:\n"));
7828 evax_bfd_print_relocation_records (file, buf + qrelfixoff, 8);
7830 if (lrelfixoff != 0)
7832 fprintf (file, _(" long-word relocation fixups:\n"));
7833 evax_bfd_print_relocation_records (file, buf + lrelfixoff, 4);
7835 if (qdotadroff != 0)
7837 fprintf (file, _(" quad-word .address reference fixups:\n"));
7838 evax_bfd_print_address_fixups (file, buf + qdotadroff);
7840 if (ldotadroff != 0)
7842 fprintf (file, _(" long-word .address reference fixups:\n"));
7843 evax_bfd_print_address_fixups (file, buf + ldotadroff);
7845 if (codeadroff != 0)
7847 fprintf (file, _(" Code Address Reference Fixups:\n"));
7848 evax_bfd_print_reference_fixups (file, buf + codeadroff);
7852 fprintf (file, _(" Linkage Pairs Reference Fixups:\n"));
7853 evax_bfd_print_reference_fixups (file, buf + lpfixoff);
7857 unsigned int count = (unsigned)bfd_getl32 (buf + chgprtoff);
7858 struct vms_eicp *eicp = (struct vms_eicp *)(buf + chgprtoff + 4);
7861 fprintf (file, _(" Change Protection (%u entries):\n"), count);
7862 for (j = 0; j < count; j++, eicp++)
7864 unsigned int prot = bfd_getl32 (eicp->newprt);
7866 _(" base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
7867 (unsigned)bfd_getl32 (eicp->baseva + 4),
7868 (unsigned)bfd_getl32 (eicp->baseva + 0),
7869 (unsigned)bfd_getl32 (eicp->size),
7870 (unsigned)bfd_getl32 (eicp->newprt));
7874 fprintf (file, "NA");
7876 case PRT__C_RESERVED:
7877 fprintf (file, "RES");
7880 fprintf (file, "KW");
7883 fprintf (file, "KR");
7886 fprintf (file, "UW");
7889 fprintf (file, "EW");
7892 fprintf (file, "ERKW");
7895 fprintf (file, "ER");
7898 fprintf (file, "SW");
7901 fprintf (file, "SREW");
7904 fprintf (file, "SRKW");
7907 fprintf (file, "SR");
7910 fprintf (file, "URSW");
7913 fprintf (file, "UREW");
7916 fprintf (file, "URKW");
7919 fprintf (file, "UR");
7933 vms_bfd_print_private_bfd_data (bfd *abfd, void *ptr)
7935 FILE *file = (FILE *)ptr;
7937 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
7938 evax_bfd_print_image (abfd, file);
7941 if (bfd_seek (abfd, 0, SEEK_SET))
7943 evax_bfd_print_eobj (abfd, file);
7950 /* Slurp ETIR/EDBG/ETBT VMS object records. */
7953 alpha_vms_read_sections_content (bfd *abfd, struct bfd_link_info *info)
7955 asection *cur_section;
7956 file_ptr cur_offset;
7957 asection *dst_section;
7958 file_ptr dst_offset;
7960 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
7966 dst_section = PRIV (dst_section);
7970 if (info->strip == strip_all || info->strip == strip_debugger)
7972 /* Discard the DST section. */
7976 else if (dst_section)
7978 dst_offset = dst_section->output_offset;
7979 dst_section = dst_section->output_section;
7988 type = _bfd_vms_get_object_record (abfd);
7991 vms_debug2 ((2, "next_record failed\n"));
7997 PRIV (image_section) = cur_section;
7998 PRIV (image_offset) = cur_offset;
7999 res = _bfd_vms_slurp_etir (abfd, info);
8000 cur_section = PRIV (image_section);
8001 cur_offset = PRIV (image_offset);
8005 if (dst_section == NULL)
8007 PRIV (image_section) = dst_section;
8008 PRIV (image_offset) = dst_offset;
8009 res = _bfd_vms_slurp_etir (abfd, info);
8010 dst_offset = PRIV (image_offset);
8019 vms_debug2 ((2, "slurp eobj type %d failed\n", type));
8026 alpha_vms_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
8027 struct bfd_link_info *info ATTRIBUTE_UNUSED)
8032 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
8035 alpha_vms_add_fixup_lp (struct bfd_link_info *info, bfd *src, bfd *shlib)
8037 struct alpha_vms_shlib_el *sl;
8038 asection *sect = PRIV2 (src, image_section);
8039 file_ptr offset = PRIV2 (src, image_offset);
8041 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8042 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8043 sl->has_fixups = TRUE;
8044 VEC_APPEND_EL (sl->lp, bfd_vma,
8045 sect->output_section->vma + sect->output_offset + offset);
8046 sect->output_section->flags |= SEC_RELOC;
8049 /* Add a code address fixup at address SECT + OFFSET to SHLIB. */
8052 alpha_vms_add_fixup_ca (struct bfd_link_info *info, bfd *src, bfd *shlib)
8054 struct alpha_vms_shlib_el *sl;
8055 asection *sect = PRIV2 (src, image_section);
8056 file_ptr offset = PRIV2 (src, image_offset);
8058 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8059 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8060 sl->has_fixups = TRUE;
8061 VEC_APPEND_EL (sl->ca, bfd_vma,
8062 sect->output_section->vma + sect->output_offset + offset);
8063 sect->output_section->flags |= SEC_RELOC;
8066 /* Add a quad word relocation fixup at address SECT + OFFSET to SHLIB. */
8069 alpha_vms_add_fixup_qr (struct bfd_link_info *info, bfd *src,
8070 bfd *shlib, bfd_vma vec)
8072 struct alpha_vms_shlib_el *sl;
8073 struct alpha_vms_vma_ref *r;
8074 asection *sect = PRIV2 (src, image_section);
8075 file_ptr offset = PRIV2 (src, image_offset);
8077 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8078 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8079 sl->has_fixups = TRUE;
8080 r = VEC_APPEND (sl->qr, struct alpha_vms_vma_ref);
8081 r->vma = sect->output_section->vma + sect->output_offset + offset;
8083 sect->output_section->flags |= SEC_RELOC;
8087 alpha_vms_add_fixup_lr (struct bfd_link_info *info ATTRIBUTE_UNUSED,
8088 unsigned int shr ATTRIBUTE_UNUSED,
8089 bfd_vma vec ATTRIBUTE_UNUSED)
8091 /* Not yet supported. */
8095 /* Add relocation. FIXME: Not yet emitted. */
8098 alpha_vms_add_lw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8103 alpha_vms_add_qw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8107 static struct bfd_hash_entry *
8108 alpha_vms_link_hash_newfunc (struct bfd_hash_entry *entry,
8109 struct bfd_hash_table *table,
8112 struct alpha_vms_link_hash_entry *ret =
8113 (struct alpha_vms_link_hash_entry *) entry;
8115 /* Allocate the structure if it has not already been allocated by a
8118 ret = ((struct alpha_vms_link_hash_entry *)
8119 bfd_hash_allocate (table,
8120 sizeof (struct alpha_vms_link_hash_entry)));
8124 /* Call the allocation method of the superclass. */
8125 ret = ((struct alpha_vms_link_hash_entry *)
8126 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
8131 return (struct bfd_hash_entry *) ret;
8134 /* Create an Alpha/VMS link hash table. */
8136 static struct bfd_link_hash_table *
8137 alpha_vms_bfd_link_hash_table_create (bfd *abfd)
8139 struct alpha_vms_link_hash_table *ret;
8140 bfd_size_type amt = sizeof (struct alpha_vms_link_hash_table);
8142 ret = (struct alpha_vms_link_hash_table *) bfd_malloc (amt);
8145 if (!_bfd_link_hash_table_init (&ret->root, abfd,
8146 alpha_vms_link_hash_newfunc,
8147 sizeof (struct alpha_vms_link_hash_entry)))
8153 VEC_INIT (ret->shrlibs);
8160 alpha_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
8164 for (i = 0; i < PRIV (gsd_sym_count); i++)
8166 struct vms_symbol_entry *e = PRIV (syms)[i];
8167 struct alpha_vms_link_hash_entry *h;
8168 struct bfd_link_hash_entry *h_root;
8171 if (!alpha_vms_convert_symbol (abfd, e, &sym))
8174 if ((e->flags & EGSY__V_DEF) && abfd->selective_search)
8176 /* In selective_search mode, only add definition that are
8178 h = (struct alpha_vms_link_hash_entry *)bfd_link_hash_lookup
8179 (info->hash, sym.name, FALSE, FALSE, FALSE);
8180 if (h == NULL || h->root.type != bfd_link_hash_undefined)
8186 h_root = (struct bfd_link_hash_entry *) h;
8187 if (_bfd_generic_link_add_one_symbol
8188 (info, abfd, sym.name, sym.flags, sym.section, sym.value,
8189 NULL, FALSE, FALSE, &h_root) == FALSE)
8191 h = (struct alpha_vms_link_hash_entry *) h_root;
8193 if ((e->flags & EGSY__V_DEF)
8195 && abfd->xvec == info->output_bfd->xvec)
8199 if (abfd->flags & DYNAMIC)
8201 struct alpha_vms_shlib_el *shlib;
8203 /* We do not want to include any of the sections in a dynamic
8204 object in the output file. See comment in elflink.c. */
8205 bfd_section_list_clear (abfd);
8207 shlib = VEC_APPEND (alpha_vms_link_hash (info)->shrlibs,
8208 struct alpha_vms_shlib_el);
8210 VEC_INIT (shlib->ca);
8211 VEC_INIT (shlib->lp);
8212 VEC_INIT (shlib->qr);
8213 PRIV (shr_index) = VEC_COUNT (alpha_vms_link_hash (info)->shrlibs) - 1;
8220 alpha_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
8223 struct bfd_link_hash_entry **pundef;
8224 struct bfd_link_hash_entry **next_pundef;
8226 /* We only accept VMS libraries. */
8227 if (info->output_bfd->xvec != abfd->xvec)
8229 bfd_set_error (bfd_error_wrong_format);
8233 /* The archive_pass field in the archive itself is used to
8234 initialize PASS, since we may search the same archive multiple
8236 pass = ++abfd->archive_pass;
8238 /* Look through the list of undefined symbols. */
8239 for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef)
8241 struct bfd_link_hash_entry *h;
8247 next_pundef = &(*pundef)->u.undef.next;
8249 /* When a symbol is defined, it is not necessarily removed from
8251 if (h->type != bfd_link_hash_undefined
8252 && h->type != bfd_link_hash_common)
8254 /* Remove this entry from the list, for general cleanliness
8255 and because we are going to look through the list again
8256 if we search any more libraries. We can't remove the
8257 entry if it is the tail, because that would lose any
8258 entries we add to the list later on. */
8259 if (*pundef != info->hash->undefs_tail)
8261 *pundef = *next_pundef;
8262 next_pundef = pundef;
8267 /* Look for this symbol in the archive hash table. */
8268 symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string);
8269 if (symidx == BFD_NO_MORE_SYMBOLS)
8271 /* Nothing in this slot. */
8275 element = bfd_get_elt_at_index (abfd, symidx);
8276 if (element == NULL)
8279 if (element->archive_pass == -1 || element->archive_pass == pass)
8281 /* Next symbol if this archive is wrong or already handled. */
8285 if (! bfd_check_format (element, bfd_object))
8287 element->archive_pass = -1;
8291 orig_element = element;
8292 if (bfd_is_thin_archive (abfd))
8294 element = _bfd_vms_lib_get_imagelib_file (element);
8295 if (element == NULL || !bfd_check_format (element, bfd_object))
8297 orig_element->archive_pass = -1;
8302 /* Unlike the generic linker, we know that this element provides
8303 a definition for an undefined symbol and we know that we want
8304 to include it. We don't need to check anything. */
8305 if (!(*info->callbacks
8306 ->add_archive_element) (info, element, h->root.string, &element))
8308 if (!alpha_vms_link_add_object_symbols (element, info))
8311 orig_element->archive_pass = pass;
8318 alpha_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
8320 switch (bfd_get_format (abfd))
8323 vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
8325 return alpha_vms_link_add_object_symbols (abfd, info);
8328 vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
8330 return alpha_vms_link_add_archive_symbols (abfd, info);
8333 bfd_set_error (bfd_error_wrong_format);
8339 alpha_vms_build_fixups (struct bfd_link_info *info)
8341 struct alpha_vms_link_hash_table *t = alpha_vms_link_hash (info);
8342 unsigned char *content;
8344 unsigned int sz = 0;
8345 unsigned int lp_sz = 0;
8346 unsigned int ca_sz = 0;
8347 unsigned int qr_sz = 0;
8348 unsigned int shrimg_cnt = 0;
8349 unsigned int chgprt_num = 0;
8350 unsigned int chgprt_sz = 0;
8351 struct vms_eiaf *eiaf;
8355 /* Shared libraries. */
8356 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8358 struct alpha_vms_shlib_el *shlib;
8360 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8362 if (!shlib->has_fixups)
8367 if (VEC_COUNT (shlib->ca) > 0)
8369 /* Header + entries. */
8371 ca_sz += VEC_COUNT (shlib->ca) * 4;
8373 if (VEC_COUNT (shlib->lp) > 0)
8375 /* Header + entries. */
8377 lp_sz += VEC_COUNT (shlib->lp) * 4;
8379 if (VEC_COUNT (shlib->qr) > 0)
8381 /* Header + entries. */
8383 qr_sz += VEC_COUNT (shlib->qr) * 8;
8394 /* Finish now if there is no content. */
8395 if (ca_sz + lp_sz + qr_sz == 0)
8398 /* Add an eicp entry for the fixup itself. */
8400 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
8402 /* This isect could be made RO or EXE after relocations are applied. */
8403 if ((sec->flags & SEC_RELOC) != 0
8404 && (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
8407 chgprt_sz = 4 + chgprt_num * sizeof (struct vms_eicp);
8409 /* Allocate section content (round-up size) */
8410 sz = sizeof (struct vms_eiaf) + shrimg_cnt * sizeof (struct vms_shl)
8411 + ca_sz + lp_sz + qr_sz + chgprt_sz;
8412 sz = (sz + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
8413 content = bfd_zalloc (info->output_bfd, sz);
8414 if (content == NULL)
8417 sec = alpha_vms_link_hash (info)->fixup;
8418 sec->contents = content;
8421 eiaf = (struct vms_eiaf *)content;
8422 off = sizeof (struct vms_eiaf);
8423 bfd_putl32 (0, eiaf->majorid);
8424 bfd_putl32 (0, eiaf->minorid);
8425 bfd_putl32 (0, eiaf->iaflink);
8426 bfd_putl32 (0, eiaf->fixuplnk);
8427 bfd_putl32 (sizeof (struct vms_eiaf), eiaf->size);
8428 bfd_putl32 (0, eiaf->flags);
8429 bfd_putl32 (0, eiaf->qrelfixoff);
8430 bfd_putl32 (0, eiaf->lrelfixoff);
8431 bfd_putl32 (0, eiaf->qdotadroff);
8432 bfd_putl32 (0, eiaf->ldotadroff);
8433 bfd_putl32 (0, eiaf->codeadroff);
8434 bfd_putl32 (0, eiaf->lpfixoff);
8435 bfd_putl32 (0, eiaf->chgprtoff);
8436 bfd_putl32 (shrimg_cnt ? off : 0, eiaf->shlstoff);
8437 bfd_putl32 (shrimg_cnt, eiaf->shrimgcnt);
8438 bfd_putl32 (0, eiaf->shlextra);
8439 bfd_putl32 (0, eiaf->permctx);
8440 bfd_putl32 (0, eiaf->base_va);
8441 bfd_putl32 (0, eiaf->lppsbfixoff);
8448 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8450 struct alpha_vms_shlib_el *shlib;
8451 struct vms_shl *shl;
8453 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8455 if (!shlib->has_fixups)
8458 /* Renumber shared images. */
8459 PRIV2 (shlib->abfd, shr_index) = shrimg_cnt++;
8461 shl = (struct vms_shl *)(content + off);
8462 bfd_putl32 (0, shl->baseva);
8463 bfd_putl32 (0, shl->shlptr);
8464 bfd_putl32 (0, shl->ident);
8465 bfd_putl32 (0, shl->permctx);
8466 shl->size = sizeof (struct vms_shl);
8467 bfd_putl16 (0, shl->fill_1);
8469 bfd_putl32 (0, shl->icb);
8470 shl->imgnam[0] = strlen (PRIV2 (shlib->abfd, hdr_data.hdr_t_name));
8471 memcpy (shl->imgnam + 1, PRIV2 (shlib->abfd, hdr_data.hdr_t_name),
8474 off += sizeof (struct vms_shl);
8480 bfd_putl32 (off, eiaf->codeadroff);
8482 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8484 struct alpha_vms_shlib_el *shlib;
8487 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8489 if (VEC_COUNT (shlib->ca) == 0)
8492 bfd_putl32 (VEC_COUNT (shlib->ca), content + off);
8493 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8496 for (j = 0; j < VEC_COUNT (shlib->ca); j++)
8498 bfd_putl32 (VEC_EL (shlib->ca, bfd_vma, j) - t->base_addr,
8504 bfd_putl32 (0, content + off);
8505 bfd_putl32 (0, content + off + 4);
8512 bfd_putl32 (off, eiaf->lpfixoff);
8514 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8516 struct alpha_vms_shlib_el *shlib;
8519 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8521 if (VEC_COUNT (shlib->lp) == 0)
8524 bfd_putl32 (VEC_COUNT (shlib->lp), content + off);
8525 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8528 for (j = 0; j < VEC_COUNT (shlib->lp); j++)
8530 bfd_putl32 (VEC_EL (shlib->lp, bfd_vma, j) - t->base_addr,
8536 bfd_putl32 (0, content + off);
8537 bfd_putl32 (0, content + off + 4);
8544 bfd_putl32 (off, eiaf->qdotadroff);
8546 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8548 struct alpha_vms_shlib_el *shlib;
8551 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8553 if (VEC_COUNT (shlib->qr) == 0)
8556 bfd_putl32 (VEC_COUNT (shlib->qr), content + off);
8557 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8560 for (j = 0; j < VEC_COUNT (shlib->qr); j++)
8562 struct alpha_vms_vma_ref *r;
8563 r = &VEC_EL (shlib->qr, struct alpha_vms_vma_ref, j);
8564 bfd_putl32 (r->vma - t->base_addr, content + off);
8565 bfd_putl32 (r->ref, content + off + 4);
8570 bfd_putl32 (0, content + off);
8571 bfd_putl32 (0, content + off + 4);
8576 /* Write the change protection table. */
8577 bfd_putl32 (off, eiaf->chgprtoff);
8578 bfd_putl32 (chgprt_num, content + off);
8581 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
8583 struct vms_eicp *eicp;
8586 if ((sec->flags & SEC_LINKER_CREATED) != 0 &&
8587 strcmp (sec->name, "$FIXUP$") == 0)
8589 else if ((sec->flags & SEC_RELOC) != 0
8590 && (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
8595 eicp = (struct vms_eicp *)(content + off);
8596 bfd_putl64 (sec->vma - t->base_addr, eicp->baseva);
8597 bfd_putl32 ((sec->size + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1),
8599 bfd_putl32 (prot, eicp->newprt);
8600 off += sizeof (struct vms_eicp);
8606 /* Called by bfd_hash_traverse to fill the symbol table.
8607 Return FALSE in case of failure. */
8610 alpha_vms_link_output_symbol (struct bfd_hash_entry *bh, void *infov)
8612 struct bfd_link_hash_entry *hc = (struct bfd_link_hash_entry *) bh;
8613 struct bfd_link_info *info = (struct bfd_link_info *)infov;
8614 struct alpha_vms_link_hash_entry *h;
8615 struct vms_symbol_entry *sym;
8617 if (hc->type == bfd_link_hash_warning)
8620 if (hc->type == bfd_link_hash_new)
8623 h = (struct alpha_vms_link_hash_entry *) hc;
8625 switch (h->root.type)
8627 case bfd_link_hash_undefined:
8629 case bfd_link_hash_new:
8630 case bfd_link_hash_warning:
8632 case bfd_link_hash_undefweak:
8634 case bfd_link_hash_defined:
8635 case bfd_link_hash_defweak:
8637 asection *sec = h->root.u.def.section;
8639 /* FIXME: this is certainly a symbol from a dynamic library. */
8640 if (bfd_is_abs_section (sec))
8643 if (sec->owner->flags & DYNAMIC)
8647 case bfd_link_hash_common:
8649 case bfd_link_hash_indirect:
8653 /* Do not write not kept symbols. */
8654 if (info->strip == strip_some
8655 && bfd_hash_lookup (info->keep_hash, h->root.root.string,
8656 FALSE, FALSE) != NULL)
8661 /* This symbol doesn't come from a VMS object. So we suppose it is
8663 int len = strlen (h->root.root.string);
8665 sym = (struct vms_symbol_entry *)bfd_zalloc (info->output_bfd,
8666 sizeof (*sym) + len);
8670 memcpy (sym->name, h->root.root.string, len);
8672 sym->owner = info->output_bfd;
8674 sym->typ = EGSD__C_SYMG;
8676 sym->flags = EGSY__V_DEF | EGSY__V_REL;
8677 sym->symbol_vector = h->root.u.def.value;
8678 sym->section = h->root.u.def.section;
8679 sym->value = h->root.u.def.value;
8684 if (!add_symbol_entry (info->output_bfd, sym))
8691 alpha_vms_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
8694 struct bfd_link_order *p;
8702 if (info->relocatable)
8704 /* FIXME: we do not yet support relocatable link. It is not obvious
8705 how to do it for debug infos. */
8706 (*info->callbacks->einfo)(_("%P: relocatable link is not supported\n"));
8710 bfd_get_outsymbols (abfd) = NULL;
8711 bfd_get_symcount (abfd) = 0;
8713 /* Mark all sections which will be included in the output file. */
8714 for (o = abfd->sections; o != NULL; o = o->next)
8715 for (p = o->map_head.link_order; p != NULL; p = p->next)
8716 if (p->type == bfd_indirect_link_order)
8717 p->u.indirect.section->linker_mark = TRUE;
8720 /* Handle all the link order information for the sections. */
8721 for (o = abfd->sections; o != NULL; o = o->next)
8723 printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
8724 o->name, (unsigned)o->vma, (unsigned)o->flags);
8726 for (p = o->map_head.link_order; p != NULL; p = p->next)
8728 printf (" at 0x%08x - 0x%08x: ",
8729 (unsigned)p->offset, (unsigned)(p->offset + p->size - 1));
8732 case bfd_section_reloc_link_order:
8733 case bfd_symbol_reloc_link_order:
8734 printf (" section/symbol reloc\n");
8736 case bfd_indirect_link_order:
8737 printf (" section %s of %s\n",
8738 p->u.indirect.section->name,
8739 p->u.indirect.section->owner->filename);
8741 case bfd_data_link_order:
8742 printf (" explicit data\n");
8745 printf (" *unknown* type %u\n", p->type);
8752 /* Generate the symbol table. */
8753 BFD_ASSERT (PRIV (syms) == NULL);
8754 if (info->strip != strip_all)
8755 bfd_hash_traverse (&info->hash->table, alpha_vms_link_output_symbol, info);
8757 /* Find the entry point. */
8758 if (bfd_get_start_address (abfd) == 0)
8760 bfd *startbfd = NULL;
8762 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8764 /* Consider only VMS object files. */
8765 if (sub->xvec != abfd->xvec)
8768 if (!PRIV2 (sub, eom_data).eom_has_transfer)
8770 if ((PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR) && startbfd)
8772 if (startbfd != NULL
8773 && !(PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR))
8775 (*info->callbacks->einfo)
8776 (_("%P: multiple entry points: in modules %B and %B\n"),
8785 unsigned int ps_idx = PRIV2 (startbfd, eom_data).eom_l_psindx;
8786 bfd_vma tfradr = PRIV2 (startbfd, eom_data).eom_l_tfradr;
8789 sec = PRIV2 (startbfd, sections)[ps_idx];
8791 bfd_set_start_address
8792 (abfd, sec->output_section->vma + sec->output_offset + tfradr);
8796 /* Set transfer addresses. */
8799 struct bfd_link_hash_entry *h;
8802 PRIV (transfer_address[i++]) = 0xffffffff00000340ULL; /* SYS$IMGACT */
8803 h = bfd_link_hash_lookup (info->hash, "LIB$INITIALIZE", FALSE, FALSE, TRUE);
8804 if (h != NULL && h->type == bfd_link_hash_defined)
8805 PRIV (transfer_address[i++]) =
8806 alpha_vms_get_sym_value (h->u.def.section, h->u.def.value);
8807 PRIV (transfer_address[i++]) = bfd_get_start_address (abfd);
8809 PRIV (transfer_address[i++]) = 0;
8812 /* Allocate contents.
8813 Also compute the virtual base address. */
8814 base_addr = (bfd_vma)-1;
8816 for (o = abfd->sections; o != NULL; o = o->next)
8818 if (o->flags & SEC_HAS_CONTENTS)
8820 o->contents = bfd_alloc (abfd, o->size);
8821 if (o->contents == NULL)
8824 if (o->flags & SEC_LOAD)
8826 if (o->vma < base_addr)
8828 if (o->vma + o->size > last_addr)
8829 last_addr = o->vma + o->size;
8831 /* Clear the RELOC flags. Currently we don't support incremental
8832 linking. We use the RELOC flag for computing the eicp entries. */
8833 o->flags &= ~SEC_RELOC;
8836 /* Create the fixup section. */
8837 fixupsec = bfd_make_section_anyway_with_flags
8838 (info->output_bfd, "$FIXUP$",
8839 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
8840 if (fixupsec == NULL)
8842 last_addr = (last_addr + 0xffff) & ~0xffff;
8843 fixupsec->vma = last_addr;
8845 alpha_vms_link_hash (info)->fixup = fixupsec;
8846 alpha_vms_link_hash (info)->base_addr = base_addr;
8848 /* Create the DMT section, if necessary. */
8849 BFD_ASSERT (PRIV (dst_section) == NULL);
8850 dst = bfd_get_section_by_name (abfd, "$DST$");
8851 if (dst != NULL && dst->size == 0)
8855 PRIV (dst_section) = dst;
8856 dmt = bfd_make_section_anyway_with_flags
8857 (info->output_bfd, "$DMT$",
8858 SEC_DEBUGGING | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
8865 /* Read all sections from the inputs. */
8866 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8868 if (sub->flags & DYNAMIC)
8870 alpha_vms_create_eisd_for_shared (abfd, sub);
8874 if (!alpha_vms_read_sections_content (sub, info))
8878 /* Handle all the link order information for the sections.
8879 Note: past this point, it is not possible to create new sections. */
8880 for (o = abfd->sections; o != NULL; o = o->next)
8882 for (p = o->map_head.link_order; p != NULL; p = p->next)
8886 case bfd_section_reloc_link_order:
8887 case bfd_symbol_reloc_link_order:
8890 case bfd_indirect_link_order:
8894 if (! _bfd_default_link_order (abfd, info, o, p))
8901 /* Compute fixups. */
8902 if (!alpha_vms_build_fixups (info))
8905 /* Compute the DMT. */
8909 unsigned char *contents = NULL;
8911 /* In pass 1, compute the size. In pass 2, write the DMT contents. */
8912 for (pass = 0; pass < 2; pass++)
8914 unsigned int off = 0;
8916 /* For each object file (ie for each module). */
8917 for (sub = info->input_bfds; sub != NULL; sub = sub->link_next)
8920 struct vms_dmt_header *dmth = NULL;
8921 unsigned int psect_count;
8923 /* Skip this module if it has no DST. */
8924 sub_dst = PRIV2 (sub, dst_section);
8925 if (sub_dst == NULL || sub_dst->size == 0)
8930 /* Write the header. */
8931 dmth = (struct vms_dmt_header *)(contents + off);
8932 bfd_putl32 (sub_dst->output_offset, dmth->modbeg);
8933 bfd_putl32 (sub_dst->size, dmth->size);
8936 off += sizeof (struct vms_dmt_header);
8939 /* For each section (ie for each psect). */
8940 for (o = sub->sections; o != NULL; o = o->next)
8942 /* Only consider interesting sections. */
8943 if (!(o->flags & SEC_ALLOC))
8945 if (o->flags & SEC_LINKER_CREATED)
8950 /* Write an entry. */
8951 struct vms_dmt_psect *dmtp;
8953 dmtp = (struct vms_dmt_psect *)(contents + off);
8954 bfd_putl32 (o->output_offset + o->output_section->vma,
8956 bfd_putl32 (o->size, dmtp->length);
8959 off += sizeof (struct vms_dmt_psect);
8962 bfd_putl32 (psect_count, dmth->psect_count);
8967 contents = bfd_zalloc (info->output_bfd, off);
8968 if (contents == NULL)
8970 dmt->contents = contents;
8975 BFD_ASSERT (off == dmt->size);
8983 /* Read the contents of a section.
8984 buf points to a buffer of buf_size bytes to be filled with
8985 section data (starting at offset into section) */
8988 alpha_vms_get_section_contents (bfd *abfd, asection *section,
8989 void *buf, file_ptr offset,
8990 bfd_size_type count)
8994 /* Image are easy. */
8995 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
8996 return _bfd_generic_get_section_contents (abfd, section,
8997 buf, offset, count);
9000 if (offset + count < count
9001 || offset + count > section->size)
9003 bfd_set_error (bfd_error_invalid_operation);
9007 /* If the section is already in memory, just copy it. */
9008 if (section->flags & SEC_IN_MEMORY)
9010 BFD_ASSERT (section->contents != NULL);
9011 memcpy (buf, section->contents + offset, count);
9014 if (section->size == 0)
9017 /* Alloc in memory and read ETIRs. */
9018 for (sec = abfd->sections; sec; sec = sec->next)
9020 BFD_ASSERT (sec->contents == NULL);
9022 if (sec->size != 0 && (sec->flags & SEC_HAS_CONTENTS))
9024 sec->contents = bfd_alloc (abfd, sec->size);
9025 if (sec->contents == NULL)
9029 if (!alpha_vms_read_sections_content (abfd, NULL))
9031 for (sec = abfd->sections; sec; sec = sec->next)
9033 sec->flags |= SEC_IN_MEMORY;
9034 memcpy (buf, section->contents + offset, count);
9039 /* Set the format of a file being written. */
9042 alpha_vms_mkobject (bfd * abfd)
9044 const bfd_arch_info_type *arch;
9046 vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd));
9048 if (!vms_initialize (abfd))
9051 PRIV (recwr.buf) = bfd_alloc (abfd, MAX_OUTREC_SIZE);
9052 if (PRIV (recwr.buf) == NULL)
9055 arch = bfd_scan_arch ("alpha");
9059 bfd_set_error (bfd_error_wrong_format);
9063 abfd->arch_info = arch;
9070 /* Called when the BFD is being closed to do any necessary cleanup. */
9073 vms_close_and_cleanup (bfd * abfd)
9075 vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd));
9077 if (abfd == NULL || abfd->tdata.any == NULL)
9080 if (abfd->format == bfd_archive)
9082 bfd_release (abfd, abfd->tdata.any);
9083 abfd->tdata.any = NULL;
9087 if (PRIV (recrd.buf) != NULL)
9088 free (PRIV (recrd.buf));
9090 if (PRIV (sections) != NULL)
9091 free (PRIV (sections));
9093 bfd_release (abfd, abfd->tdata.any);
9094 abfd->tdata.any = NULL;
9097 if (abfd->direction == write_direction)
9099 /* Last step on VMS is to convert the file to variable record length
9101 if (bfd_cache_close (abfd) != TRUE)
9103 if (_bfd_vms_convert_to_var_unix_filename (abfd->filename) != TRUE)
9111 /* Called when a new section is created. */
9114 vms_new_section_hook (bfd * abfd, asection *section)
9118 vms_debug2 ((1, "vms_new_section_hook (%p, [%d]%s)\n",
9119 abfd, section->index, section->name));
9121 bfd_set_section_alignment (abfd, section, 0);
9123 vms_debug2 ((7, "%d: %s\n", section->index, section->name));
9125 amt = sizeof (struct vms_section_data_struct);
9126 section->used_by_bfd = bfd_zalloc (abfd, amt);
9127 if (section->used_by_bfd == NULL)
9130 /* Create the section symbol. */
9131 return _bfd_generic_new_section_hook (abfd, section);
9134 /* Part 4.5, symbols. */
9136 /* Print symbol to file according to how. how is one of
9137 bfd_print_symbol_name just print the name
9138 bfd_print_symbol_more print more (???)
9139 bfd_print_symbol_all print all we know, which is not much right now :-). */
9142 vms_print_symbol (bfd * abfd,
9145 bfd_print_symbol_type how)
9147 vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
9148 abfd, file, symbol, how));
9152 case bfd_print_symbol_name:
9153 case bfd_print_symbol_more:
9154 fprintf ((FILE *)file," %s", symbol->name);
9157 case bfd_print_symbol_all:
9159 const char *section_name = symbol->section->name;
9161 bfd_print_symbol_vandf (abfd, file, symbol);
9163 fprintf ((FILE *) file," %-8s %s", section_name, symbol->name);
9169 /* Return information about symbol in ret.
9171 fill type, value and name
9174 B bss segment symbol
9176 D data segment symbol
9178 t a static function symbol
9179 T text segment symbol
9184 vms_get_symbol_info (bfd * abfd ATTRIBUTE_UNUSED,
9190 vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd, symbol, ret));
9192 sec = symbol->section;
9199 else if (bfd_is_com_section (sec))
9201 else if (bfd_is_abs_section (sec))
9203 else if (bfd_is_und_section (sec))
9205 else if (bfd_is_ind_section (sec))
9207 else if ((symbol->flags & BSF_FUNCTION)
9208 || (bfd_get_section_flags (abfd, sec) & SEC_CODE))
9210 else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
9212 else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
9217 if (ret->type != 'U')
9218 ret->value = symbol->value + symbol->section->vma;
9221 ret->name = symbol->name;
9224 /* Return TRUE if the given symbol sym in the BFD abfd is
9225 a compiler generated local label, else return FALSE. */
9228 vms_bfd_is_local_label_name (bfd * abfd ATTRIBUTE_UNUSED,
9231 vms_debug2 ((1, "vms_bfd_is_local_label_name (%p, %s)\n", abfd, name));
9232 return name[0] == '$';
9235 /* Part 4.7, writing an object file. */
9237 /* Sets the contents of the section section in BFD abfd to the data starting
9238 in memory at LOCATION. The data is written to the output section starting
9239 at offset offset for count bytes.
9241 Normally TRUE is returned, else FALSE. Possible error returns are:
9242 o bfd_error_no_contents - The output section does not have the
9243 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
9244 o and some more too */
9247 _bfd_vms_set_section_contents (bfd * abfd,
9249 const void * location,
9251 bfd_size_type count)
9253 if (section->contents == NULL)
9255 section->contents = bfd_alloc (abfd, section->size);
9256 if (section->contents == NULL)
9259 memcpy (section->contents + offset, location, (size_t) count);
9265 /* Set the architecture and machine type in BFD abfd to arch and mach.
9266 Find the correct pointer to a structure and insert it into the arch_info
9270 alpha_vms_set_arch_mach (bfd *abfd,
9271 enum bfd_architecture arch, unsigned long mach)
9273 if (arch != bfd_arch_alpha
9274 && arch != bfd_arch_unknown)
9277 return bfd_default_set_arch_mach (abfd, arch, mach);
9280 /* Set section VMS flags. Clear NO_FLAGS and set FLAGS. */
9283 bfd_vms_set_section_flags (bfd *abfd ATTRIBUTE_UNUSED,
9284 asection *sec, flagword no_flags, flagword flags)
9286 vms_section_data (sec)->no_flags = no_flags;
9287 vms_section_data (sec)->flags = flags;
9290 struct vms_private_data_struct *
9291 bfd_vms_get_data (bfd *abfd)
9293 return (struct vms_private_data_struct *)abfd->tdata.any;
9296 #define vms_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9297 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms
9298 #define vms_bfd_copy_link_hash_symbol_type \
9299 _bfd_generic_copy_link_hash_symbol_type
9300 #define vms_bfd_is_group_section bfd_generic_is_group_section
9301 #define vms_bfd_discard_group bfd_generic_discard_group
9302 #define vms_section_already_linked _bfd_generic_section_already_linked
9303 #define vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9304 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
9306 #define vms_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
9307 #define vms_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
9308 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
9309 #define vms_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
9310 #define vms_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
9311 #define vms_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
9313 /* Symbols table. */
9314 #define alpha_vms_make_empty_symbol _bfd_generic_make_empty_symbol
9315 #define alpha_vms_bfd_is_target_special_symbol \
9316 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9317 #define alpha_vms_print_symbol vms_print_symbol
9318 #define alpha_vms_get_symbol_info vms_get_symbol_info
9319 #define alpha_vms_read_minisymbols _bfd_generic_read_minisymbols
9320 #define alpha_vms_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
9321 #define alpha_vms_get_lineno _bfd_nosymbols_get_lineno
9322 #define alpha_vms_find_inliner_info _bfd_nosymbols_find_inliner_info
9323 #define alpha_vms_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
9324 #define alpha_vms_find_nearest_line _bfd_vms_find_nearest_dst_line
9325 #define alpha_vms_bfd_is_local_label_name vms_bfd_is_local_label_name
9327 /* Generic table. */
9328 #define alpha_vms_close_and_cleanup vms_close_and_cleanup
9329 #define alpha_vms_bfd_free_cached_info vms_bfd_free_cached_info
9330 #define alpha_vms_new_section_hook vms_new_section_hook
9331 #define alpha_vms_set_section_contents _bfd_vms_set_section_contents
9332 #define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
9334 #define alpha_vms_bfd_get_relocated_section_contents \
9335 bfd_generic_get_relocated_section_contents
9337 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
9338 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
9339 #define alpha_vms_bfd_lookup_section_flags bfd_generic_lookup_section_flags
9340 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
9341 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
9342 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
9343 #define alpha_vms_section_already_linked \
9344 _bfd_generic_section_already_linked
9346 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9347 #define alpha_vms_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
9348 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
9349 #define alpha_vms_bfd_copy_link_hash_symbol_type \
9350 _bfd_generic_copy_link_hash_symbol_type
9352 #define alpha_vms_bfd_link_split_section _bfd_generic_link_split_section
9354 #define alpha_vms_get_dynamic_symtab_upper_bound \
9355 _bfd_nodynamic_get_dynamic_symtab_upper_bound
9356 #define alpha_vms_canonicalize_dynamic_symtab \
9357 _bfd_nodynamic_canonicalize_dynamic_symtab
9358 #define alpha_vms_get_dynamic_reloc_upper_bound \
9359 _bfd_nodynamic_get_dynamic_reloc_upper_bound
9360 #define alpha_vms_canonicalize_dynamic_reloc \
9361 _bfd_nodynamic_canonicalize_dynamic_reloc
9363 const bfd_target vms_alpha_vec =
9365 "vms-alpha", /* Name. */
9366 bfd_target_evax_flavour,
9367 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
9368 BFD_ENDIAN_LITTLE, /* Header byte order is little. */
9370 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
9371 | WP_TEXT | D_PAGED), /* Object flags. */
9372 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
9373 | SEC_READONLY | SEC_CODE | SEC_DATA
9374 | SEC_HAS_CONTENTS | SEC_IN_MEMORY), /* Sect flags. */
9375 0, /* symbol_leading_char. */
9376 ' ', /* ar_pad_char. */
9377 15, /* ar_max_namelen. */
9378 0, /* match priority. */
9379 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9380 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9381 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9382 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9383 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9384 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9386 {_bfd_dummy_target, alpha_vms_object_p, /* bfd_check_format. */
9387 _bfd_vms_lib_alpha_archive_p, _bfd_dummy_target},
9388 {bfd_false, alpha_vms_mkobject, /* bfd_set_format. */
9389 _bfd_vms_lib_alpha_mkarchive, bfd_false},
9390 {bfd_false, alpha_vms_write_object_contents, /* bfd_write_contents. */
9391 _bfd_vms_lib_write_archive_contents, bfd_false},
9393 BFD_JUMP_TABLE_GENERIC (alpha_vms),
9394 BFD_JUMP_TABLE_COPY (vms),
9395 BFD_JUMP_TABLE_CORE (_bfd_nocore),
9396 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib),
9397 BFD_JUMP_TABLE_SYMBOLS (alpha_vms),
9398 BFD_JUMP_TABLE_RELOCS (alpha_vms),
9399 BFD_JUMP_TABLE_WRITE (alpha_vms),
9400 BFD_JUMP_TABLE_LINK (alpha_vms),
9401 BFD_JUMP_TABLE_DYNAMIC (alpha_vms),