1 /* vms.c -- BFD back-end for EVAX (openVMS/Alpha) files.
2 Copyright (C) 1996-2017 Free Software Foundation, Inc.
4 Initial version written by Klaus Kaempf (kkaempf@rmi.de)
5 Major rewrite by Adacore.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
25 o Generation of shared image
26 o Relocation optimizations
32 o protected sections (for messages)
50 #include "vms/eihvn.h"
51 #include "vms/eobjrec.h"
54 #include "vms/esgps.h"
63 #include "vms/esdfm.h"
64 #include "vms/esdfv.h"
70 #include "vms/internal.h"
73 #define MIN(a,b) ((a) < (b) ? (a) : (b))
75 /* The r_type field in a reloc is one of the following values. */
76 #define ALPHA_R_IGNORE 0
77 #define ALPHA_R_REFQUAD 1
78 #define ALPHA_R_BRADDR 2
79 #define ALPHA_R_HINT 3
80 #define ALPHA_R_SREL16 4
81 #define ALPHA_R_SREL32 5
82 #define ALPHA_R_SREL64 6
83 #define ALPHA_R_OP_PUSH 7
84 #define ALPHA_R_OP_STORE 8
85 #define ALPHA_R_OP_PSUB 9
86 #define ALPHA_R_OP_PRSHIFT 10
87 #define ALPHA_R_LINKAGE 11
88 #define ALPHA_R_REFLONG 12
89 #define ALPHA_R_CODEADDR 13
90 #define ALPHA_R_NOP 14
91 #define ALPHA_R_BSR 15
92 #define ALPHA_R_LDA 16
93 #define ALPHA_R_BOH 17
95 /* These are used with DST_S_C_LINE_NUM. */
96 #define DST_S_C_LINE_NUM_HEADER_SIZE 4
98 /* These are used with DST_S_C_SOURCE */
100 #define DST_S_B_PCLINE_UNSBYTE 1
101 #define DST_S_W_PCLINE_UNSWORD 1
102 #define DST_S_L_PCLINE_UNSLONG 1
104 #define DST_S_B_MODBEG_NAME 14
105 #define DST_S_L_RTNBEG_ADDRESS 5
106 #define DST_S_B_RTNBEG_NAME 13
107 #define DST_S_L_RTNEND_SIZE 5
109 /* These are used with DST_S_C_SOURCE. */
110 #define DST_S_C_SOURCE_HEADER_SIZE 4
112 #define DST_S_B_SRC_DF_LENGTH 1
113 #define DST_S_W_SRC_DF_FILEID 3
114 #define DST_S_B_SRC_DF_FILENAME 20
115 #define DST_S_B_SRC_UNSBYTE 1
116 #define DST_S_W_SRC_UNSWORD 1
117 #define DST_S_L_SRC_UNSLONG 1
119 /* Debugger symbol definitions. */
121 #define DBG_S_L_DMT_MODBEG 0
122 #define DBG_S_L_DST_SIZE 4
123 #define DBG_S_W_DMT_PSECT_COUNT 8
124 #define DBG_S_C_DMT_HEADER_SIZE 12
126 #define DBG_S_L_DMT_PSECT_START 0
127 #define DBG_S_L_DMT_PSECT_LENGTH 4
128 #define DBG_S_C_DMT_PSECT_SIZE 8
130 /* VMS module header. */
146 #define EMH_DATE_LENGTH 17
148 /* VMS End-Of-Module records (EOM/EEOM). */
152 unsigned int eom_l_total_lps;
153 unsigned short eom_w_comcod;
154 bfd_boolean eom_has_transfer;
155 unsigned char eom_b_tfrflg;
156 unsigned int eom_l_psindx;
157 unsigned int eom_l_tfradr;
160 struct vms_symbol_entry
166 unsigned char data_type;
167 unsigned short flags;
169 /* Section and offset/value of the symbol. */
173 /* Section and offset/value for the entry point (only for subprg). */
174 asection *code_section;
175 unsigned int code_value;
177 /* Symbol vector offset. */
178 unsigned int symbol_vector;
180 /* Length of the name. */
181 unsigned char namelen;
186 /* Stack value for push/pop commands. */
194 #define STACKSIZE 128
196 /* A minimal decoding of DST compilation units. We only decode
197 what's needed to get to the line number information. */
207 struct srecinfo *next;
215 struct lineinfo *next;
222 struct funcinfo *next;
230 /* Chain the previously read compilation unit. */
233 /* The module name. */
236 /* The start offset and size of debug info in the DST section. */
240 /* The lowest and highest addresses contained in this compilation
241 unit as specified in the compilation unit header. */
245 /* The listing line table. */
246 struct lineinfo *line_table;
248 /* The source record table. */
249 struct srecinfo *srec_table;
251 /* A list of the functions found in this module. */
252 struct funcinfo *func_table;
254 /* Current allocation of file_table. */
255 unsigned int file_table_count;
257 /* An array of the files making up this module. */
258 struct fileinfo *file_table;
261 /* BFD private data for alpha-vms. */
263 struct vms_private_data_struct
265 /* If true, relocs have been read. */
266 bfd_boolean reloc_done;
268 /* Record input buffer. */
269 struct vms_rec_rd recrd;
270 struct vms_rec_wr recwr;
272 struct hdr_struct hdr_data; /* data from HDR/EMH record */
273 struct eom_struct eom_data; /* data from EOM/EEOM record */
275 /* Transfer addresses (entry points). */
276 bfd_vma transfer_address[4];
278 /* Array of GSD sections to get the correspond BFD one. */
279 unsigned int section_max; /* Size of the sections array. */
280 unsigned int section_count; /* Number of GSD sections. */
283 /* Array of raw symbols. */
284 struct vms_symbol_entry **syms;
286 /* Canonicalized symbols. */
289 /* Number of symbols. */
290 unsigned int gsd_sym_count;
291 /* Size of the syms array. */
292 unsigned int max_sym_count;
293 /* Number of procedure symbols. */
294 unsigned int norm_sym_count;
296 /* Stack used to evaluate TIR/ETIR commands. */
297 struct stack_struct *stack;
300 /* Content reading. */
301 asection *image_section; /* section for image_ptr */
302 file_ptr image_offset; /* Offset for image_ptr. */
304 struct module *modules; /* list of all compilation units */
306 /* The DST section. */
307 asection *dst_section;
309 unsigned int dst_ptr_offsets_count; /* # of offsets in following array */
310 unsigned int *dst_ptr_offsets; /* array of saved image_ptr offsets */
312 /* Shared library support */
313 bfd_vma symvva; /* relative virtual address of symbol vector */
315 unsigned char matchctl;
317 /* Shared library index. This is used for input bfd while linking. */
318 unsigned int shr_index;
320 /* Used to place structures in the file. */
323 /* Simply linked list of eisd. */
324 struct vms_internal_eisd_map *eisd_head;
325 struct vms_internal_eisd_map *eisd_tail;
327 /* Simply linked list of eisd for shared libraries. */
328 struct vms_internal_eisd_map *gbl_eisd_head;
329 struct vms_internal_eisd_map *gbl_eisd_tail;
331 /* linkage index counter used by conditional store commands */
332 unsigned int vms_linkage_index;
335 #define PRIV2(abfd, name) \
336 (((struct vms_private_data_struct *)(abfd)->tdata.any)->name)
337 #define PRIV(name) PRIV2(abfd,name)
340 /* Used to keep extra VMS specific information for a given section.
342 reloc_size holds the size of the relocation stream, note this
343 is very different from the number of relocations as VMS relocations
346 reloc_stream is the actual stream of relocation entries. */
348 struct vms_section_data_struct
350 /* Maximnum number of entries in sec->relocation. */
353 /* Corresponding eisd. Used only while generating executables. */
354 struct vms_internal_eisd_map *eisd;
356 /* PSC flags to be clear. */
359 /* PSC flags to be set. */
363 #define vms_section_data(sec) \
364 ((struct vms_section_data_struct *)sec->used_by_bfd)
366 /* To be called from the debugger. */
367 struct vms_private_data_struct *bfd_vms_get_data (bfd *);
369 static int vms_get_remaining_object_record (bfd *, unsigned int);
370 static bfd_boolean _bfd_vms_slurp_object_records (bfd * abfd);
371 static void alpha_vms_add_fixup_lp (struct bfd_link_info *, bfd *, bfd *);
372 static void alpha_vms_add_fixup_ca (struct bfd_link_info *, bfd *, bfd *);
373 static void alpha_vms_add_fixup_qr (struct bfd_link_info *, bfd *, bfd *,
375 static void alpha_vms_add_fixup_lr (struct bfd_link_info *, unsigned int,
377 static void alpha_vms_add_lw_reloc (struct bfd_link_info *);
378 static void alpha_vms_add_qw_reloc (struct bfd_link_info *);
387 /* Number of elements in VEC. */
389 #define VEC_COUNT(VEC) ((VEC).nbr_el)
391 /* Get the address of the Nth element. */
393 #define VEC_EL(VEC, TYPE, N) (((TYPE *)((VEC).els))[N])
395 #define VEC_INIT(VEC) \
402 /* Be sure there is room for a new element. */
404 static void vector_grow1 (struct vector_type *vec, size_t elsz);
406 /* Allocate room for a new element and return its address. */
408 #define VEC_APPEND(VEC, TYPE) \
409 (vector_grow1 (&VEC, sizeof (TYPE)), &VEC_EL(VEC, TYPE, (VEC).nbr_el++))
411 /* Append an element. */
413 #define VEC_APPEND_EL(VEC, TYPE, EL) \
414 (*(VEC_APPEND (VEC, TYPE)) = EL)
416 struct alpha_vms_vma_ref
418 bfd_vma vma; /* Vma in the output. */
419 bfd_vma ref; /* Reference in the input. */
422 struct alpha_vms_shlib_el
425 bfd_boolean has_fixups;
427 struct vector_type lp; /* Vector of bfd_vma. */
428 struct vector_type ca; /* Vector of bfd_vma. */
429 struct vector_type qr; /* Vector of struct alpha_vms_vma_ref. */
432 /* Alpha VMS linker hash table. */
434 struct alpha_vms_link_hash_table
436 struct bfd_link_hash_table root;
438 /* Vector of shared libraries. */
439 struct vector_type shrlibs;
444 /* Base address. Used by fixups. */
448 #define alpha_vms_link_hash(INFO) \
449 ((struct alpha_vms_link_hash_table *)(INFO->hash))
451 /* Alpha VMS linker hash table entry. */
453 struct alpha_vms_link_hash_entry
455 struct bfd_link_hash_entry root;
457 /* Pointer to the original vms symbol. */
458 struct vms_symbol_entry *sym;
463 /* Read & process EIHD record.
464 Return TRUE on success, FALSE on error. */
467 _bfd_vms_slurp_eihd (bfd *abfd, unsigned int *eisd_offset,
468 unsigned int *eihs_offset)
470 unsigned int imgtype, size;
472 struct vms_eihd *eihd = (struct vms_eihd *)PRIV (recrd.rec);
474 vms_debug2 ((8, "_bfd_vms_slurp_eihd\n"));
476 size = bfd_getl32 (eihd->size);
477 imgtype = bfd_getl32 (eihd->imgtype);
479 if (imgtype == EIHD__K_EXE || imgtype == EIHD__K_LIM)
480 abfd->flags |= EXEC_P;
482 symvva = bfd_getl64 (eihd->symvva);
485 PRIV (symvva) = symvva;
486 abfd->flags |= DYNAMIC;
489 PRIV (ident) = bfd_getl32 (eihd->ident);
490 PRIV (matchctl) = eihd->matchctl;
492 *eisd_offset = bfd_getl32 (eihd->isdoff);
493 *eihs_offset = bfd_getl32 (eihd->symdbgoff);
495 vms_debug2 ((4, "EIHD size %d imgtype %d symvva 0x%lx eisd %d eihs %d\n",
496 size, imgtype, (unsigned long)symvva,
497 *eisd_offset, *eihs_offset));
502 /* Read & process EISD record.
503 Return TRUE on success, FALSE on error. */
506 _bfd_vms_slurp_eisd (bfd *abfd, unsigned int offset)
508 int section_count = 0;
510 vms_debug2 ((8, "_bfd_vms_slurp_eisd\n"));
514 struct vms_eisd *eisd;
515 unsigned int rec_size;
517 unsigned long long vaddr;
524 /* PR 17512: file: 3d9e9fe9. */
525 if (offset >= PRIV (recrd.rec_size))
527 eisd = (struct vms_eisd *)(PRIV (recrd.rec) + offset);
528 rec_size = bfd_getl32 (eisd->eisdsize);
532 /* Skip to next block if pad. */
533 if (rec_size == 0xffffffff)
535 offset = (offset + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
541 size = bfd_getl32 (eisd->secsize);
542 vaddr = bfd_getl64 (eisd->virt_addr);
543 flags = bfd_getl32 (eisd->flags);
544 vbn = bfd_getl32 (eisd->vbn);
546 vms_debug2 ((4, "EISD at 0x%x size 0x%x addr 0x%lx flags 0x%x blk %d\n",
547 offset, size, (unsigned long)vaddr, flags, vbn));
549 /* VMS combines psects from .obj files into isects in the .exe. This
550 process doesn't preserve enough information to reliably determine
551 what's in each section without examining the data. This is
552 especially true of DWARF debug sections. */
553 bfd_flags = SEC_ALLOC;
555 bfd_flags |= SEC_HAS_CONTENTS | SEC_LOAD;
557 if (flags & EISD__M_EXE)
558 bfd_flags |= SEC_CODE;
560 if (flags & EISD__M_NONSHRADR)
561 bfd_flags |= SEC_DATA;
563 if (!(flags & EISD__M_WRT))
564 bfd_flags |= SEC_READONLY;
566 if (flags & EISD__M_DZRO)
567 bfd_flags |= SEC_DATA;
569 if (flags & EISD__M_FIXUPVEC)
570 bfd_flags |= SEC_DATA;
572 if (flags & EISD__M_CRF)
573 bfd_flags |= SEC_DATA;
575 if (flags & EISD__M_GBL)
577 name = _bfd_vms_save_counted_string (eisd->gblnam);
578 bfd_flags |= SEC_COFF_SHARED_LIBRARY;
579 bfd_flags &= ~(SEC_ALLOC | SEC_LOAD);
581 else if (flags & EISD__M_FIXUPVEC)
583 else if (eisd->type == EISD__K_USRSTACK)
589 name = (char*) bfd_alloc (abfd, 32);
590 if (flags & EISD__M_DZRO)
592 else if (flags & EISD__M_EXE)
594 else if (!(flags & EISD__M_WRT))
598 BFD_ASSERT (section_count < 999);
599 sprintf (name, "$%s_%03d$", pfx, section_count++);
602 section = bfd_make_section (abfd, name);
607 section->filepos = vbn ? VMS_BLOCK_SIZE * (vbn - 1) : 0;
608 section->size = size;
609 section->vma = vaddr;
611 if (!bfd_set_section_flags (abfd, section, bfd_flags))
618 /* Read & process EIHS record.
619 Return TRUE on success, FALSE on error. */
622 _bfd_vms_slurp_eihs (bfd *abfd, unsigned int offset)
624 unsigned char *p = PRIV (recrd.rec) + offset;
626 unsigned int gstsize ATTRIBUTE_UNUSED;
628 unsigned int dstsize;
630 unsigned int dmtbytes;
633 /* PR 21611: Check that offset is valid. */
634 if (offset > PRIV (recrd.rec_size) - (EIHS__L_DMTBYTES + 4))
636 _bfd_error_handler (_("Unable to read EIHS record at offset %#x"), offset);
637 bfd_set_error (bfd_error_file_truncated);
641 gstvbn = bfd_getl32 (p + EIHS__L_GSTVBN);
642 gstsize = bfd_getl32 (p + EIHS__L_GSTSIZE);
643 dstvbn = bfd_getl32 (p + EIHS__L_DSTVBN);
644 dstsize = bfd_getl32 (p + EIHS__L_DSTSIZE);
645 dmtvbn = bfd_getl32 (p + EIHS__L_DMTVBN);
646 dmtbytes = bfd_getl32 (p + EIHS__L_DMTBYTES);
649 vms_debug (8, "_bfd_vms_slurp_ihs\n");
650 vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
651 gstvbn, gstsize, dstvbn, dstsize, dmtvbn, dmtbytes);
656 flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
658 section = bfd_make_section (abfd, "$DST$");
662 section->size = dstsize;
663 section->filepos = VMS_BLOCK_SIZE * (dstvbn - 1);
665 if (!bfd_set_section_flags (abfd, section, bfd_flags))
668 PRIV (dst_section) = section;
669 abfd->flags |= (HAS_DEBUG | HAS_LINENO);
674 flagword bfd_flags = SEC_HAS_CONTENTS | SEC_DEBUGGING;
676 section = bfd_make_section (abfd, "$DMT$");
680 section->size = dmtbytes;
681 section->filepos = VMS_BLOCK_SIZE * (dmtvbn - 1);
683 if (!bfd_set_section_flags (abfd, section, bfd_flags))
689 if (bfd_seek (abfd, VMS_BLOCK_SIZE * (gstvbn - 1), SEEK_SET))
691 bfd_set_error (bfd_error_file_truncated);
695 if (!_bfd_vms_slurp_object_records (abfd))
698 abfd->flags |= HAS_SYMS;
704 /* Object file reading. */
706 /* Object file input functions. */
708 /* Get next record from object file to vms_buf.
709 Set PRIV(buf_size) and return it
711 This is a little tricky since it should be portable.
713 The openVMS object file has 'variable length' which means that
714 read() returns data in chunks of (hopefully) correct and expected
715 size. The linker (and other tools on VMS) depend on that. Unix
716 doesn't know about 'formatted' files, so reading and writing such
717 an object file in a Unix environment is not trivial.
719 With the tool 'file' (available on all VMS FTP sites), one
720 can view and change the attributes of a file. Changing from
721 'variable length' to 'fixed length, 512 bytes' reveals the
722 record size at the first 2 bytes of every record. The same
723 may happen during the transfer of object files from VMS to Unix,
724 at least with UCX, the DEC implementation of TCP/IP.
726 The VMS format repeats the size at bytes 2 & 3 of every record.
728 On the first call (file_format == FF_UNKNOWN) we check if
729 the first and the third byte pair (!) of the record match.
730 If they do it's an object file in an Unix environment or with
731 wrong attributes (FF_FOREIGN), else we should be in a VMS
732 environment where read() returns the record size (FF_NATIVE).
734 Reading is always done in 2 steps:
735 1. first just the record header is read and the size extracted,
736 2. then the read buffer is adjusted and the remaining bytes are
739 All file I/O is done on even file positions. */
741 #define VMS_OBJECT_ADJUSTMENT 2
744 maybe_adjust_record_pointer_for_object (bfd *abfd)
746 /* Set the file format once for all on the first invocation. */
747 if (PRIV (recrd.file_format) == FF_UNKNOWN)
749 if (PRIV (recrd.rec)[0] == PRIV (recrd.rec)[4]
750 && PRIV (recrd.rec)[1] == PRIV (recrd.rec)[5])
751 PRIV (recrd.file_format) = FF_FOREIGN;
753 PRIV (recrd.file_format) = FF_NATIVE;
756 /* The adjustment is needed only in an Unix environment. */
757 if (PRIV (recrd.file_format) == FF_FOREIGN)
758 PRIV (recrd.rec) += VMS_OBJECT_ADJUSTMENT;
761 /* Implement step #1 of the object record reading procedure.
762 Return the record type or -1 on failure. */
765 _bfd_vms_get_object_record (bfd *abfd)
767 unsigned int test_len = 6;
770 vms_debug2 ((8, "_bfd_vms_get_obj_record\n"));
772 /* Skip alignment byte if the current position is odd. */
773 if (PRIV (recrd.file_format) == FF_FOREIGN && (bfd_tell (abfd) & 1))
775 if (bfd_bread (PRIV (recrd.buf), 1, abfd) != 1)
777 bfd_set_error (bfd_error_file_truncated);
782 /* Read the record header */
783 if (bfd_bread (PRIV (recrd.buf), test_len, abfd) != test_len)
785 bfd_set_error (bfd_error_file_truncated);
789 /* Reset the record pointer. */
790 PRIV (recrd.rec) = PRIV (recrd.buf);
791 maybe_adjust_record_pointer_for_object (abfd);
793 if (vms_get_remaining_object_record (abfd, test_len) <= 0)
796 type = bfd_getl16 (PRIV (recrd.rec));
798 vms_debug2 ((8, "_bfd_vms_get_obj_record: rec %p, size %d, type %d\n",
799 PRIV (recrd.rec), PRIV (recrd.rec_size), type));
804 /* Implement step #2 of the object record reading procedure.
805 Return the size of the record or 0 on failure. */
808 vms_get_remaining_object_record (bfd *abfd, unsigned int read_so_far)
810 unsigned int to_read;
812 vms_debug2 ((8, "vms_get_remaining_obj_record\n"));
814 /* Extract record size. */
815 PRIV (recrd.rec_size) = bfd_getl16 (PRIV (recrd.rec) + 2);
817 if (PRIV (recrd.rec_size) == 0)
819 bfd_set_error (bfd_error_file_truncated);
823 /* That's what the linker manual says. */
824 if (PRIV (recrd.rec_size) > EOBJ__C_MAXRECSIZ)
826 bfd_set_error (bfd_error_file_truncated);
830 /* Take into account object adjustment. */
831 to_read = PRIV (recrd.rec_size);
832 if (PRIV (recrd.file_format) == FF_FOREIGN)
833 to_read += VMS_OBJECT_ADJUSTMENT;
835 /* Adjust the buffer. */
836 if (to_read > PRIV (recrd.buf_size))
839 = (unsigned char *) bfd_realloc (PRIV (recrd.buf), to_read);
840 if (PRIV (recrd.buf) == NULL)
842 PRIV (recrd.buf_size) = to_read;
844 /* PR 17512: file: 025-1974-0.004. */
845 else if (to_read <= read_so_far)
848 /* Read the remaining record. */
849 to_read -= read_so_far;
851 vms_debug2 ((8, "vms_get_remaining_obj_record: to_read %d\n", to_read));
853 if (bfd_bread (PRIV (recrd.buf) + read_so_far, to_read, abfd) != to_read)
855 bfd_set_error (bfd_error_file_truncated);
859 /* Reset the record pointer. */
860 PRIV (recrd.rec) = PRIV (recrd.buf);
861 maybe_adjust_record_pointer_for_object (abfd);
863 vms_debug2 ((8, "vms_get_remaining_obj_record: size %d\n",
864 PRIV (recrd.rec_size)));
866 return PRIV (recrd.rec_size);
869 /* Read and process emh record.
870 Return TRUE on success, FALSE on error. */
873 _bfd_vms_slurp_ehdr (bfd *abfd)
876 unsigned char *vms_rec;
880 vms_rec = PRIV (recrd.rec);
881 /* PR 17512: file: 62736583. */
882 end = PRIV (recrd.buf) + PRIV (recrd.buf_size);
884 vms_debug2 ((2, "HDR/EMH\n"));
886 subtype = bfd_getl16 (vms_rec + 4);
888 vms_debug2 ((3, "subtype %d\n", subtype));
894 if (vms_rec + 21 >= end)
896 PRIV (hdr_data).hdr_b_strlvl = vms_rec[6];
897 PRIV (hdr_data).hdr_l_arch1 = bfd_getl32 (vms_rec + 8);
898 PRIV (hdr_data).hdr_l_arch2 = bfd_getl32 (vms_rec + 12);
899 PRIV (hdr_data).hdr_l_recsiz = bfd_getl32 (vms_rec + 16);
900 if ((vms_rec + 20 + vms_rec[20] + 1) >= end)
902 PRIV (hdr_data).hdr_t_name = _bfd_vms_save_counted_string (vms_rec + 20);
903 ptr = vms_rec + 20 + vms_rec[20] + 1;
904 if ((ptr + *ptr + 1) >= end)
906 PRIV (hdr_data).hdr_t_version =_bfd_vms_save_counted_string (ptr);
910 PRIV (hdr_data).hdr_t_date = _bfd_vms_save_sized_string (ptr, 17);
914 if (vms_rec + PRIV (recrd.rec_size - 6) > end)
916 PRIV (hdr_data).hdr_c_lnm =
917 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
921 if (vms_rec + PRIV (recrd.rec_size - 6) > end)
923 PRIV (hdr_data).hdr_c_src =
924 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
928 if (vms_rec + PRIV (recrd.rec_size - 6) > end)
930 PRIV (hdr_data).hdr_c_ttl =
931 _bfd_vms_save_sized_string (vms_rec, PRIV (recrd.rec_size - 6));
941 bfd_set_error (bfd_error_wrong_format);
948 /* Typical sections for evax object files. */
950 #define EVAX_ABS_NAME "$ABS$"
951 #define EVAX_CODE_NAME "$CODE$"
952 #define EVAX_LINK_NAME "$LINK$"
953 #define EVAX_DATA_NAME "$DATA$"
954 #define EVAX_BSS_NAME "$BSS$"
955 #define EVAX_READONLYADDR_NAME "$READONLY_ADDR$"
956 #define EVAX_READONLY_NAME "$READONLY$"
957 #define EVAX_LITERAL_NAME "$LITERAL$"
958 #define EVAX_LITERALS_NAME "$LITERALS"
959 #define EVAX_COMMON_NAME "$COMMON$"
960 #define EVAX_LOCAL_NAME "$LOCAL$"
962 struct sec_flags_struct
964 const char *name; /* Name of section. */
966 flagword flags_always; /* Flags we set always. */
968 flagword flags_hassize; /* Flags we set if the section has a size > 0. */
971 /* These flags are deccrtl/vaxcrtl (openVMS 6.2 Alpha) compatible. */
973 static const struct sec_flags_struct evax_section_flags[] =
981 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_EXE,
982 SEC_CODE | SEC_READONLY,
983 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_EXE,
984 SEC_CODE | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
986 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD | EGPS__V_NOMOD,
987 SEC_DATA | SEC_READONLY,
988 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD,
989 SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
991 EGPS__V_REL | EGPS__V_RD,
992 SEC_DATA | SEC_READONLY,
993 EGPS__V_REL | EGPS__V_RD,
994 SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
996 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD,
998 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
999 SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1001 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD,
1003 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT | EGPS__V_NOMOD,
1005 { EVAX_READONLYADDR_NAME,
1006 EGPS__V_PIC | EGPS__V_REL | EGPS__V_RD,
1007 SEC_DATA | SEC_READONLY,
1008 EGPS__V_PIC | EGPS__V_REL | EGPS__V_RD,
1009 SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1010 { EVAX_READONLY_NAME,
1011 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD | EGPS__V_NOMOD,
1012 SEC_DATA | SEC_READONLY,
1013 EGPS__V_PIC | EGPS__V_REL | EGPS__V_SHR | EGPS__V_RD,
1014 SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1016 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
1018 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
1019 SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1020 { EVAX_LITERALS_NAME,
1021 EGPS__V_PIC | EGPS__V_OVR,
1022 SEC_DATA | SEC_READONLY,
1023 EGPS__V_PIC | EGPS__V_OVR,
1024 SEC_DATA | SEC_READONLY | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD },
1026 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
1028 EGPS__V_REL | EGPS__V_RD | EGPS__V_WRT,
1029 SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD }
1032 /* Retrieve BFD section flags by name and size. */
1035 vms_secflag_by_name (const struct sec_flags_struct *section_flags,
1041 while (section_flags[i].name != NULL)
1043 if (strcmp (name, section_flags[i].name) == 0)
1046 return section_flags[i].flags_hassize;
1048 return section_flags[i].flags_always;
1053 return section_flags[i].flags_hassize;
1054 return section_flags[i].flags_always;
1057 /* Retrieve VMS section flags by name and size. */
1060 vms_esecflag_by_name (const struct sec_flags_struct *section_flags,
1066 while (section_flags[i].name != NULL)
1068 if (strcmp (name, section_flags[i].name) == 0)
1071 return section_flags[i].vflags_hassize;
1073 return section_flags[i].vflags_always;
1078 return section_flags[i].vflags_hassize;
1079 return section_flags[i].vflags_always;
1082 /* Add SYM to the symbol table of ABFD.
1083 Return FALSE in case of error. */
1086 add_symbol_entry (bfd *abfd, struct vms_symbol_entry *sym)
1088 if (PRIV (gsd_sym_count) >= PRIV (max_sym_count))
1090 if (PRIV (max_sym_count) == 0)
1092 PRIV (max_sym_count) = 128;
1093 PRIV (syms) = bfd_malloc
1094 (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *));
1098 PRIV (max_sym_count) *= 2;
1099 PRIV (syms) = bfd_realloc
1101 (PRIV (max_sym_count) * sizeof (struct vms_symbol_entry *)));
1103 if (PRIV (syms) == NULL)
1107 PRIV (syms)[PRIV (gsd_sym_count)++] = sym;
1111 /* Create a symbol whose name is ASCIC and add it to ABFD.
1112 Return NULL in case of error. */
1114 static struct vms_symbol_entry *
1115 add_symbol (bfd *abfd, const unsigned char *ascic)
1117 struct vms_symbol_entry *entry;
1121 entry = (struct vms_symbol_entry *)bfd_zalloc (abfd, sizeof (*entry) + len);
1124 entry->namelen = len;
1125 memcpy (entry->name, ascic, len);
1126 entry->name[len] = 0;
1127 entry->owner = abfd;
1129 if (!add_symbol_entry (abfd, entry))
1134 /* Read and process EGSD. Return FALSE on failure. */
1137 _bfd_vms_slurp_egsd (bfd *abfd)
1140 unsigned int gsd_size;
1141 unsigned char *vms_rec;
1142 unsigned long base_addr;
1144 vms_debug2 ((2, "EGSD\n"));
1146 if (PRIV (recrd.rec_size) < 8)
1148 _bfd_error_handler (_("Corrupt EGSD record: its size (%#x) is too small"),
1149 PRIV (recrd.rec_size));
1150 bfd_set_error (bfd_error_bad_value);
1154 PRIV (recrd.rec) += 8; /* Skip type, size, align pad. */
1155 PRIV (recrd.rec_size) -= 8;
1157 /* Calculate base address for each section. */
1160 while (PRIV (recrd.rec_size) > 4)
1162 vms_rec = PRIV (recrd.rec);
1164 gsd_type = bfd_getl16 (vms_rec);
1165 gsd_size = bfd_getl16 (vms_rec + 2);
1167 vms_debug2 ((3, "egsd_type %d\n", gsd_type));
1169 /* PR 21615: Check for size overflow. */
1170 if (PRIV (recrd.rec_size) < gsd_size)
1172 _bfd_error_handler (_("Corrupt EGSD record: size (%#x) is larger than remaining space (%#x)"),
1173 gsd_size, PRIV (recrd.rec_size));
1174 bfd_set_error (bfd_error_bad_value);
1181 /* Program section definition. */
1183 struct vms_egps *egps = (struct vms_egps *)vms_rec;
1184 flagword new_flags, vms_flags;
1187 vms_flags = bfd_getl16 (egps->flags);
1189 if ((vms_flags & EGPS__V_REL) == 0)
1191 /* Use the global absolute section for all
1192 absolute sections. */
1193 section = bfd_abs_section_ptr;
1198 unsigned long align_addr;
1200 name = _bfd_vms_save_counted_string (&egps->namlng);
1202 section = bfd_make_section (abfd, name);
1206 section->filepos = 0;
1207 section->size = bfd_getl32 (egps->alloc);
1208 section->alignment_power = egps->align;
1210 vms_section_data (section)->flags = vms_flags;
1211 vms_section_data (section)->no_flags = 0;
1213 new_flags = vms_secflag_by_name (evax_section_flags, name,
1215 if (section->size > 0)
1216 new_flags |= SEC_LOAD;
1217 if (!(vms_flags & EGPS__V_NOMOD) && section->size > 0)
1219 /* Set RELOC and HAS_CONTENTS if the section is not
1220 demand-zero and not empty. */
1221 new_flags |= SEC_HAS_CONTENTS;
1222 if (vms_flags & EGPS__V_REL)
1223 new_flags |= SEC_RELOC;
1225 if (vms_flags & EGPS__V_EXE)
1227 /* Set CODE if section is executable. */
1228 new_flags |= SEC_CODE;
1229 new_flags &= ~SEC_DATA;
1231 if (!bfd_set_section_flags (abfd, section, new_flags))
1234 /* Give a non-overlapping vma to non absolute sections. */
1235 align_addr = (1 << section->alignment_power);
1236 if ((base_addr % align_addr) != 0)
1237 base_addr += (align_addr - (base_addr % align_addr));
1238 section->vma = (bfd_vma)base_addr;
1239 base_addr += section->size;
1242 /* Append it to the section array. */
1243 if (PRIV (section_count) >= PRIV (section_max))
1245 if (PRIV (section_max) == 0)
1246 PRIV (section_max) = 16;
1248 PRIV (section_max) *= 2;
1249 PRIV (sections) = bfd_realloc_or_free
1250 (PRIV (sections), PRIV (section_max) * sizeof (asection *));
1251 if (PRIV (sections) == NULL)
1255 PRIV (sections)[PRIV (section_count)] = section;
1256 PRIV (section_count)++;
1263 struct vms_symbol_entry *entry;
1264 struct vms_egsy *egsy = (struct vms_egsy *) vms_rec;
1267 old_flags = bfd_getl16 (egsy->flags);
1268 if (old_flags & EGSY__V_DEF)
1269 nameoff = ESDF__B_NAMLNG;
1271 nameoff = ESRF__B_NAMLNG;
1273 entry = add_symbol (abfd, vms_rec + nameoff);
1277 /* Allow only duplicate reference. */
1278 if ((entry->flags & EGSY__V_DEF) && (old_flags & EGSY__V_DEF))
1281 if (entry->typ == 0)
1283 entry->typ = gsd_type;
1284 entry->data_type = egsy->datyp;
1285 entry->flags = old_flags;
1288 if (old_flags & EGSY__V_DEF)
1290 struct vms_esdf *esdf = (struct vms_esdf *)vms_rec;
1292 entry->value = bfd_getl64 (esdf->value);
1293 if (PRIV (sections) == NULL)
1295 entry->section = PRIV (sections)[bfd_getl32 (esdf->psindx)];
1297 if (old_flags & EGSY__V_NORM)
1299 PRIV (norm_sym_count)++;
1301 entry->code_value = bfd_getl64 (esdf->code_address);
1302 entry->code_section =
1303 PRIV (sections)[bfd_getl32 (esdf->ca_psindx)];
1311 struct vms_symbol_entry *entry;
1312 struct vms_egst *egst = (struct vms_egst *)vms_rec;
1315 old_flags = bfd_getl16 (egst->header.flags);
1317 entry = add_symbol (abfd, &egst->namlng);
1322 entry->typ = gsd_type;
1323 entry->data_type = egst->header.datyp;
1324 entry->flags = old_flags;
1326 entry->symbol_vector = bfd_getl32 (egst->value);
1328 if (old_flags & EGSY__V_REL)
1330 if (PRIV (sections) == NULL)
1332 entry->section = PRIV (sections)[bfd_getl32 (egst->psindx)];
1335 entry->section = bfd_abs_section_ptr;
1337 entry->value = bfd_getl64 (egst->lp_2);
1339 if (old_flags & EGSY__V_NORM)
1341 PRIV (norm_sym_count)++;
1343 entry->code_value = bfd_getl64 (egst->lp_1);
1344 entry->code_section = bfd_abs_section_ptr;
1351 /* Currently ignored. */
1356 _bfd_error_handler (_("Unknown EGSD subtype %d"), gsd_type);
1357 bfd_set_error (bfd_error_bad_value);
1361 PRIV (recrd.rec_size) -= gsd_size;
1362 PRIV (recrd.rec) += gsd_size;
1365 /* FIXME: Should we complain if PRIV (recrd.rec_size) is not zero ? */
1367 if (PRIV (gsd_sym_count) > 0)
1368 abfd->flags |= HAS_SYMS;
1373 /* Stack routines for vms ETIR commands. */
1375 /* Push value and section index. */
1378 _bfd_vms_push (bfd *abfd, bfd_vma val, unsigned int reloc)
1380 vms_debug2 ((4, "<push %08lx (0x%08x) at %d>\n",
1381 (unsigned long)val, reloc, PRIV (stackptr)));
1383 PRIV (stack[PRIV (stackptr)]).value = val;
1384 PRIV (stack[PRIV (stackptr)]).reloc = reloc;
1386 if (PRIV (stackptr) >= STACKSIZE)
1388 bfd_set_error (bfd_error_bad_value);
1389 _bfd_error_handler (_("Stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr));
1394 /* Pop value and section index. */
1397 _bfd_vms_pop (bfd *abfd, bfd_vma *val, unsigned int *rel)
1399 if (PRIV (stackptr) == 0)
1401 bfd_set_error (bfd_error_bad_value);
1402 _bfd_error_handler (_("Stack underflow in _bfd_vms_pop"));
1406 *val = PRIV (stack[PRIV (stackptr)]).value;
1407 *rel = PRIV (stack[PRIV (stackptr)]).reloc;
1409 vms_debug2 ((4, "<pop %08lx (0x%08x)>\n", (unsigned long)*val, *rel));
1412 /* Routines to fill sections contents during tir/etir read. */
1414 /* Initialize image buffer pointer to be filled. */
1417 image_set_ptr (bfd *abfd, bfd_vma vma, int sect, struct bfd_link_info *info)
1421 vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma, sect));
1423 if (PRIV (sections) == NULL)
1425 sec = PRIV (sections)[sect];
1429 /* Reading contents to an output bfd. */
1431 if (sec->output_section == NULL)
1433 /* Section discarded. */
1434 vms_debug2 ((5, " section %s discarded\n", sec->name));
1436 /* This is not used. */
1437 PRIV (image_section) = NULL;
1438 PRIV (image_offset) = 0;
1441 PRIV (image_offset) = sec->output_offset + vma;
1442 PRIV (image_section) = sec->output_section;
1446 PRIV (image_offset) = vma;
1447 PRIV (image_section) = sec;
1451 /* Increment image buffer pointer by offset. */
1454 image_inc_ptr (bfd *abfd, bfd_vma offset)
1456 vms_debug2 ((4, "image_inc_ptr (%u)\n", (unsigned)offset));
1458 PRIV (image_offset) += offset;
1461 /* Save current DST location counter under specified index. */
1464 dst_define_location (bfd *abfd, unsigned int loc)
1466 vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc));
1468 /* Grow the ptr offset table if necessary. */
1469 if (loc + 1 > PRIV (dst_ptr_offsets_count))
1471 PRIV (dst_ptr_offsets) = bfd_realloc (PRIV (dst_ptr_offsets),
1472 (loc + 1) * sizeof (unsigned int));
1473 PRIV (dst_ptr_offsets_count) = loc + 1;
1476 PRIV (dst_ptr_offsets)[loc] = PRIV (image_offset);
1479 /* Restore saved DST location counter from specified index. */
1482 dst_restore_location (bfd *abfd, unsigned int loc)
1484 vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc));
1486 PRIV (image_offset) = PRIV (dst_ptr_offsets)[loc];
1489 /* Retrieve saved DST location counter from specified index. */
1492 dst_retrieve_location (bfd *abfd, unsigned int loc)
1494 vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int)loc));
1496 return PRIV (dst_ptr_offsets)[loc];
1499 /* Write multiple bytes to section image. */
1502 image_write (bfd *abfd, unsigned char *ptr, unsigned int size)
1505 _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr, size,
1506 (long)PRIV (image_offset));
1507 _bfd_hexdump (9, ptr, size, 0);
1510 if (PRIV (image_section)->contents != NULL)
1512 asection *sec = PRIV (image_section);
1513 file_ptr off = PRIV (image_offset);
1516 if (off > (file_ptr)sec->size
1517 || size > (file_ptr)sec->size
1518 || off + size > (file_ptr)sec->size)
1520 bfd_set_error (bfd_error_bad_value);
1524 memcpy (sec->contents + off, ptr, size);
1527 PRIV (image_offset) += size;
1531 /* Write byte to section image. */
1534 image_write_b (bfd * abfd, unsigned int value)
1536 unsigned char data[1];
1538 vms_debug2 ((6, "image_write_b (%02x)\n", (int) value));
1542 return image_write (abfd, data, sizeof (data));
1545 /* Write 2-byte word to image. */
1548 image_write_w (bfd * abfd, unsigned int value)
1550 unsigned char data[2];
1552 vms_debug2 ((6, "image_write_w (%04x)\n", (int) value));
1554 bfd_putl16 (value, data);
1555 return image_write (abfd, data, sizeof (data));
1558 /* Write 4-byte long to image. */
1561 image_write_l (bfd * abfd, unsigned long value)
1563 unsigned char data[4];
1565 vms_debug2 ((6, "image_write_l (%08lx)\n", value));
1567 bfd_putl32 (value, data);
1568 return image_write (abfd, data, sizeof (data));
1571 /* Write 8-byte quad to image. */
1574 image_write_q (bfd * abfd, bfd_vma value)
1576 unsigned char data[8];
1578 vms_debug2 ((6, "image_write_q (%08lx)\n", (unsigned long)value));
1580 bfd_putl64 (value, data);
1581 return image_write (abfd, data, sizeof (data));
1585 _bfd_vms_etir_name (int cmd)
1589 case ETIR__C_STA_GBL: return "ETIR__C_STA_GBL";
1590 case ETIR__C_STA_LW: return "ETIR__C_STA_LW";
1591 case ETIR__C_STA_QW: return "ETIR__C_STA_QW";
1592 case ETIR__C_STA_PQ: return "ETIR__C_STA_PQ";
1593 case ETIR__C_STA_LI: return "ETIR__C_STA_LI";
1594 case ETIR__C_STA_MOD: return "ETIR__C_STA_MOD";
1595 case ETIR__C_STA_CKARG: return "ETIR__C_STA_CKARG";
1596 case ETIR__C_STO_B: return "ETIR__C_STO_B";
1597 case ETIR__C_STO_W: return "ETIR__C_STO_W";
1598 case ETIR__C_STO_GBL: return "ETIR__C_STO_GBL";
1599 case ETIR__C_STO_CA: return "ETIR__C_STO_CA";
1600 case ETIR__C_STO_RB: return "ETIR__C_STO_RB";
1601 case ETIR__C_STO_AB: return "ETIR__C_STO_AB";
1602 case ETIR__C_STO_OFF: return "ETIR__C_STO_OFF";
1603 case ETIR__C_STO_IMM: return "ETIR__C_STO_IMM";
1604 case ETIR__C_STO_IMMR: return "ETIR__C_STO_IMMR";
1605 case ETIR__C_STO_LW: return "ETIR__C_STO_LW";
1606 case ETIR__C_STO_QW: return "ETIR__C_STO_QW";
1607 case ETIR__C_STO_GBL_LW: return "ETIR__C_STO_GBL_LW";
1608 case ETIR__C_STO_LP_PSB: return "ETIR__C_STO_LP_PSB";
1609 case ETIR__C_STO_HINT_GBL: return "ETIR__C_STO_HINT_GBL";
1610 case ETIR__C_STO_HINT_PS: return "ETIR__C_STO_HINT_PS";
1611 case ETIR__C_OPR_ADD: return "ETIR__C_OPR_ADD";
1612 case ETIR__C_OPR_SUB: return "ETIR__C_OPR_SUB";
1613 case ETIR__C_OPR_INSV: return "ETIR__C_OPR_INSV";
1614 case ETIR__C_OPR_USH: return "ETIR__C_OPR_USH";
1615 case ETIR__C_OPR_ROT: return "ETIR__C_OPR_ROT";
1616 case ETIR__C_OPR_REDEF: return "ETIR__C_OPR_REDEF";
1617 case ETIR__C_OPR_DFLIT: return "ETIR__C_OPR_DFLIT";
1618 case ETIR__C_STC_LP: return "ETIR__C_STC_LP";
1619 case ETIR__C_STC_GBL: return "ETIR__C_STC_GBL";
1620 case ETIR__C_STC_GCA: return "ETIR__C_STC_GCA";
1621 case ETIR__C_STC_PS: return "ETIR__C_STC_PS";
1622 case ETIR__C_STC_NBH_PS: return "ETIR__C_STC_NBH_PS";
1623 case ETIR__C_STC_NOP_GBL: return "ETIR__C_STC_NOP_GBL";
1624 case ETIR__C_STC_NOP_PS: return "ETIR__C_STC_NOP_PS";
1625 case ETIR__C_STC_BSR_GBL: return "ETIR__C_STC_BSR_GBL";
1626 case ETIR__C_STC_BSR_PS: return "ETIR__C_STC_BSR_PS";
1627 case ETIR__C_STC_LDA_GBL: return "ETIR__C_STC_LDA_GBL";
1628 case ETIR__C_STC_LDA_PS: return "ETIR__C_STC_LDA_PS";
1629 case ETIR__C_STC_BOH_GBL: return "ETIR__C_STC_BOH_GBL";
1630 case ETIR__C_STC_BOH_PS: return "ETIR__C_STC_BOH_PS";
1631 case ETIR__C_STC_NBH_GBL: return "ETIR__C_STC_NBH_GBL";
1632 case ETIR__C_STC_LP_PSB: return "ETIR__C_STC_LP_PSB";
1633 case ETIR__C_CTL_SETRB: return "ETIR__C_CTL_SETRB";
1634 case ETIR__C_CTL_AUGRB: return "ETIR__C_CTL_AUGRB";
1635 case ETIR__C_CTL_DFLOC: return "ETIR__C_CTL_DFLOC";
1636 case ETIR__C_CTL_STLOC: return "ETIR__C_CTL_STLOC";
1637 case ETIR__C_CTL_STKDL: return "ETIR__C_CTL_STKDL";
1640 /* These names have not yet been added to this switch statement. */
1641 _bfd_error_handler (_("unknown ETIR command %d"), cmd);
1646 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
1649 _bfd_vms_get_value (bfd *abfd,
1650 const unsigned char *ascic,
1651 const unsigned char *max_ascic,
1652 struct bfd_link_info *info,
1654 struct alpha_vms_link_hash_entry **hp)
1659 struct alpha_vms_link_hash_entry *h;
1661 /* Not linking. Do not try to resolve the symbol. */
1670 if (ascic + len >= max_ascic)
1672 _bfd_error_handler (_("Corrupt vms value"));
1678 for (i = 0; i < len; i++)
1679 name[i] = ascic[i + 1];
1682 h = (struct alpha_vms_link_hash_entry *)
1683 bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
1688 && (h->root.type == bfd_link_hash_defined
1689 || h->root.type == bfd_link_hash_defweak))
1690 *vma = h->root.u.def.value
1691 + h->root.u.def.section->output_offset
1692 + h->root.u.def.section->output_section->vma;
1693 else if (h && h->root.type == bfd_link_hash_undefweak)
1697 (*info->callbacks->undefined_symbol)
1698 (info, name, abfd, PRIV (image_section), PRIV (image_offset), TRUE);
1705 #define RELC_SHR_BASE 0x10000
1706 #define RELC_SEC_BASE 0x20000
1707 #define RELC_MASK 0x0ffff
1710 alpha_vms_sym_to_ctxt (struct alpha_vms_link_hash_entry *h)
1712 /* Handle undefined symbols. */
1713 if (h == NULL || h->sym == NULL)
1716 if (h->sym->typ == EGSD__C_SYMG)
1718 if (h->sym->flags & EGSY__V_REL)
1719 return RELC_SHR_BASE + PRIV2 (h->sym->owner, shr_index);
1722 /* Can this happen (non-relocatable symg) ? I'd like to see
1727 if (h->sym->typ == EGSD__C_SYM)
1729 if (h->sym->flags & EGSY__V_REL)
1738 alpha_vms_get_sym_value (asection *sect, bfd_vma addr)
1740 return sect->output_section->vma + sect->output_offset + addr;
1744 alpha_vms_fix_sec_rel (bfd *abfd, struct bfd_link_info *info,
1745 unsigned int rel, bfd_vma vma)
1749 if (PRIV (sections) == NULL)
1752 sec = PRIV (sections)[rel & RELC_MASK];
1756 if (sec->output_section == NULL)
1758 return vma + sec->output_section->vma + sec->output_offset;
1761 return vma + sec->vma;
1764 /* Read an ETIR record from ABFD. If INFO is not null, put the content into
1765 the output section (used during linking).
1766 Return FALSE in case of error. */
1769 _bfd_vms_slurp_etir (bfd *abfd, struct bfd_link_info *info)
1772 unsigned int length;
1773 unsigned char *maxptr;
1778 struct alpha_vms_link_hash_entry *h;
1780 PRIV (recrd.rec) += ETIR__C_HEADER_SIZE;
1781 PRIV (recrd.rec_size) -= ETIR__C_HEADER_SIZE;
1783 ptr = PRIV (recrd.rec);
1784 length = PRIV (recrd.rec_size);
1785 maxptr = ptr + length;
1787 vms_debug2 ((2, "ETIR: %d bytes\n", length));
1789 while (ptr < maxptr)
1791 int cmd = bfd_getl16 (ptr);
1792 int cmd_length = bfd_getl16 (ptr + 2);
1796 /* PR 21589 and 21579: Check for a corrupt ETIR record. */
1797 if (cmd_length < 4 || (ptr + cmd_length > maxptr + 4))
1800 _bfd_error_handler (_("Corrupt ETIR record encountered"));
1801 bfd_set_error (bfd_error_bad_value);
1806 _bfd_vms_debug (4, "etir: %s(%d)\n",
1807 _bfd_vms_etir_name (cmd), cmd);
1808 _bfd_hexdump (8, ptr, cmd_length - 4, 0);
1816 stack 32 bit value of symbol (high bits set to 0). */
1817 case ETIR__C_STA_GBL:
1818 _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h);
1819 _bfd_vms_push (abfd, op1, alpha_vms_sym_to_ctxt (h));
1825 stack 32 bit value, sign extend to 64 bit. */
1826 case ETIR__C_STA_LW:
1827 if (ptr + 4 >= maxptr)
1829 _bfd_vms_push (abfd, bfd_getl32 (ptr), RELC_NONE);
1835 stack 64 bit value of symbol. */
1836 case ETIR__C_STA_QW:
1837 if (ptr + 8 >= maxptr)
1839 _bfd_vms_push (abfd, bfd_getl64 (ptr), RELC_NONE);
1842 /* Stack psect base plus quadword offset
1843 arg: lw section index
1844 qw signed quadword offset (low 32 bits)
1846 Stack qw argument and section index
1847 (see ETIR__C_STO_OFF, ETIR__C_CTL_SETRB). */
1848 case ETIR__C_STA_PQ:
1852 if (ptr + 12 >= maxptr)
1854 psect = bfd_getl32 (ptr);
1855 if ((unsigned int) psect >= PRIV (section_count))
1857 _bfd_error_handler (_("bad section index in %s"),
1858 _bfd_vms_etir_name (cmd));
1859 bfd_set_error (bfd_error_bad_value);
1862 op1 = bfd_getl64 (ptr + 4);
1863 _bfd_vms_push (abfd, op1, psect | RELC_SEC_BASE);
1867 case ETIR__C_STA_LI:
1868 case ETIR__C_STA_MOD:
1869 case ETIR__C_STA_CKARG:
1870 _bfd_error_handler (_("unsupported STA cmd %s"),
1871 _bfd_vms_etir_name (cmd));
1875 /* Store byte: pop stack, write byte
1878 _bfd_vms_pop (abfd, &op1, &rel1);
1879 if (rel1 != RELC_NONE)
1881 image_write_b (abfd, (unsigned int) op1 & 0xff);
1884 /* Store word: pop stack, write word
1887 _bfd_vms_pop (abfd, &op1, &rel1);
1888 if (rel1 != RELC_NONE)
1890 image_write_w (abfd, (unsigned int) op1 & 0xffff);
1893 /* Store longword: pop stack, write longword
1895 case ETIR__C_STO_LW:
1896 _bfd_vms_pop (abfd, &op1, &rel1);
1897 if (rel1 & RELC_SEC_BASE)
1899 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1902 else if (rel1 & RELC_SHR_BASE)
1904 alpha_vms_add_fixup_lr (info, rel1 & RELC_MASK, op1);
1907 if (rel1 != RELC_NONE)
1909 if (rel1 != RELC_REL)
1911 alpha_vms_add_lw_reloc (info);
1913 image_write_l (abfd, op1);
1916 /* Store quadword: pop stack, write quadword
1918 case ETIR__C_STO_QW:
1919 _bfd_vms_pop (abfd, &op1, &rel1);
1920 if (rel1 & RELC_SEC_BASE)
1922 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
1925 else if (rel1 & RELC_SHR_BASE)
1927 if (rel1 != RELC_NONE)
1929 if (rel1 != RELC_REL)
1931 alpha_vms_add_qw_reloc (info);
1933 image_write_q (abfd, op1);
1936 /* Store immediate repeated: pop stack for repeat count
1939 case ETIR__C_STO_IMMR:
1943 if (ptr + 4 >= maxptr)
1945 size = bfd_getl32 (ptr);
1946 _bfd_vms_pop (abfd, &op1, &rel1);
1947 if (rel1 != RELC_NONE)
1950 image_write (abfd, ptr + 4, size);
1954 /* Store global: write symbol value
1955 arg: cs global symbol name. */
1956 case ETIR__C_STO_GBL:
1957 _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h);
1960 if (h->sym->typ == EGSD__C_SYMG)
1962 alpha_vms_add_fixup_qr
1963 (info, abfd, h->sym->owner, h->sym->symbol_vector);
1968 op1 = alpha_vms_get_sym_value (h->sym->section,
1970 alpha_vms_add_qw_reloc (info);
1973 image_write_q (abfd, op1);
1976 /* Store code address: write address of entry point
1977 arg: cs global symbol name (procedure). */
1978 case ETIR__C_STO_CA:
1979 _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h);
1982 if (h->sym->flags & EGSY__V_NORM)
1984 /* That's really a procedure. */
1985 if (h->sym->typ == EGSD__C_SYMG)
1987 alpha_vms_add_fixup_ca (info, abfd, h->sym->owner);
1988 op1 = h->sym->symbol_vector;
1992 op1 = alpha_vms_get_sym_value (h->sym->code_section,
1993 h->sym->code_value);
1994 alpha_vms_add_qw_reloc (info);
1999 /* Symbol is not a procedure. */
2003 image_write_q (abfd, op1);
2006 /* Store offset to psect: pop stack, add low 32 bits to base of psect
2008 case ETIR__C_STO_OFF:
2009 _bfd_vms_pop (abfd, &op1, &rel1);
2011 if (!(rel1 & RELC_SEC_BASE))
2014 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
2016 image_write_q (abfd, op1);
2020 arg: lw count of bytes
2022 case ETIR__C_STO_IMM:
2026 if (ptr + 4 >= maxptr)
2028 size = bfd_getl32 (ptr);
2029 image_write (abfd, ptr + 4, size);
2033 /* This code is 'reserved to digital' according to the openVMS
2034 linker manual, however it is generated by the DEC C compiler
2035 and defined in the include file.
2036 FIXME, since the following is just a guess
2037 store global longword: store 32bit value of symbol
2038 arg: cs symbol name. */
2039 case ETIR__C_STO_GBL_LW:
2040 _bfd_vms_get_value (abfd, ptr, maxptr, info, &op1, &h);
2044 image_write_l (abfd, op1);
2047 case ETIR__C_STO_RB:
2048 case ETIR__C_STO_AB:
2049 case ETIR__C_STO_LP_PSB:
2050 _bfd_error_handler (_("%s: not supported"),
2051 _bfd_vms_etir_name (cmd));
2054 case ETIR__C_STO_HINT_GBL:
2055 case ETIR__C_STO_HINT_PS:
2056 _bfd_error_handler (_("%s: not implemented"),
2057 _bfd_vms_etir_name (cmd));
2061 /* 200 Store-conditional Linkage Pair
2063 case ETIR__C_STC_LP:
2065 /* 202 Store-conditional Address at global address
2069 case ETIR__C_STC_GBL:
2071 /* 203 Store-conditional Code Address at global address
2073 cs procedure name. */
2074 case ETIR__C_STC_GCA:
2076 /* 204 Store-conditional Address at psect + offset
2080 case ETIR__C_STC_PS:
2081 _bfd_error_handler (_("%s: not supported"),
2082 _bfd_vms_etir_name (cmd));
2086 /* 201 Store-conditional Linkage Pair with Procedure Signature
2092 case ETIR__C_STC_LP_PSB:
2093 _bfd_vms_get_value (abfd, ptr + 4, maxptr, info, &op1, &h);
2096 if (h->sym->typ == EGSD__C_SYMG)
2098 alpha_vms_add_fixup_lp (info, abfd, h->sym->owner);
2099 op1 = h->sym->symbol_vector;
2104 op1 = alpha_vms_get_sym_value (h->sym->code_section,
2105 h->sym->code_value);
2106 op2 = alpha_vms_get_sym_value (h->sym->section,
2112 /* Undefined symbol. */
2116 image_write_q (abfd, op1);
2117 image_write_q (abfd, op2);
2120 /* 205 Store-conditional NOP at address of global
2122 case ETIR__C_STC_NOP_GBL:
2125 /* 207 Store-conditional BSR at global address
2128 case ETIR__C_STC_BSR_GBL:
2131 /* 209 Store-conditional LDA at global address
2134 case ETIR__C_STC_LDA_GBL:
2137 /* 211 Store-conditional BSR or Hint at global address
2140 case ETIR__C_STC_BOH_GBL:
2141 /* Currentl ignored. */
2144 /* 213 Store-conditional NOP,BSR or HINT at global address
2147 case ETIR__C_STC_NBH_GBL:
2149 /* 206 Store-conditional NOP at pect + offset
2152 case ETIR__C_STC_NOP_PS:
2154 /* 208 Store-conditional BSR at pect + offset
2157 case ETIR__C_STC_BSR_PS:
2159 /* 210 Store-conditional LDA at psect + offset
2162 case ETIR__C_STC_LDA_PS:
2164 /* 212 Store-conditional BSR or Hint at pect + offset
2167 case ETIR__C_STC_BOH_PS:
2169 /* 214 Store-conditional NOP, BSR or HINT at psect + offset
2171 case ETIR__C_STC_NBH_PS:
2172 _bfd_error_handler (_("%s: not supported"),
2173 _bfd_vms_etir_name (cmd));
2177 /* Det relocation base: pop stack, set image location counter
2179 case ETIR__C_CTL_SETRB:
2180 _bfd_vms_pop (abfd, &op1, &rel1);
2181 if (!(rel1 & RELC_SEC_BASE))
2183 image_set_ptr (abfd, op1, rel1 & RELC_MASK, info);
2186 /* Augment relocation base: increment image location counter by offset
2187 arg: lw offset value. */
2188 case ETIR__C_CTL_AUGRB:
2189 if (ptr + 4 >= maxptr)
2191 op1 = bfd_getl32 (ptr);
2192 image_inc_ptr (abfd, op1);
2195 /* Define location: pop index, save location counter under index
2197 case ETIR__C_CTL_DFLOC:
2198 _bfd_vms_pop (abfd, &op1, &rel1);
2199 if (rel1 != RELC_NONE)
2201 dst_define_location (abfd, op1);
2204 /* Set location: pop index, restore location counter from index
2206 case ETIR__C_CTL_STLOC:
2207 _bfd_vms_pop (abfd, &op1, &rel1);
2208 if (rel1 != RELC_NONE)
2210 dst_restore_location (abfd, op1);
2213 /* Stack defined location: pop index, push location counter from index
2215 case ETIR__C_CTL_STKDL:
2216 _bfd_vms_pop (abfd, &op1, &rel1);
2217 if (rel1 != RELC_NONE)
2219 _bfd_vms_push (abfd, dst_retrieve_location (abfd, op1), RELC_NONE);
2222 case ETIR__C_OPR_NOP: /* No-op. */
2225 case ETIR__C_OPR_ADD: /* Add. */
2226 _bfd_vms_pop (abfd, &op1, &rel1);
2227 _bfd_vms_pop (abfd, &op2, &rel2);
2228 if (rel1 == RELC_NONE && rel2 != RELC_NONE)
2230 else if (rel1 != RELC_NONE && rel2 != RELC_NONE)
2232 _bfd_vms_push (abfd, op1 + op2, rel1);
2235 case ETIR__C_OPR_SUB: /* Subtract. */
2236 _bfd_vms_pop (abfd, &op1, &rel1);
2237 _bfd_vms_pop (abfd, &op2, &rel2);
2238 if (rel1 == RELC_NONE && rel2 != RELC_NONE)
2240 else if ((rel1 & RELC_SEC_BASE) && (rel2 & RELC_SEC_BASE))
2242 op1 = alpha_vms_fix_sec_rel (abfd, info, rel1, op1);
2243 op2 = alpha_vms_fix_sec_rel (abfd, info, rel2, op2);
2246 else if (rel1 != RELC_NONE && rel2 != RELC_NONE)
2248 _bfd_vms_push (abfd, op2 - op1, rel1);
2251 case ETIR__C_OPR_MUL: /* Multiply. */
2252 _bfd_vms_pop (abfd, &op1, &rel1);
2253 _bfd_vms_pop (abfd, &op2, &rel2);
2254 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2256 _bfd_vms_push (abfd, op1 * op2, RELC_NONE);
2259 case ETIR__C_OPR_DIV: /* Divide. */
2260 _bfd_vms_pop (abfd, &op1, &rel1);
2261 _bfd_vms_pop (abfd, &op2, &rel2);
2262 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2265 _bfd_vms_push (abfd, 0, RELC_NONE);
2267 _bfd_vms_push (abfd, op2 / op1, RELC_NONE);
2270 case ETIR__C_OPR_AND: /* Logical AND. */
2271 _bfd_vms_pop (abfd, &op1, &rel1);
2272 _bfd_vms_pop (abfd, &op2, &rel2);
2273 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2275 _bfd_vms_push (abfd, op1 & op2, RELC_NONE);
2278 case ETIR__C_OPR_IOR: /* Logical inclusive OR. */
2279 _bfd_vms_pop (abfd, &op1, &rel1);
2280 _bfd_vms_pop (abfd, &op2, &rel2);
2281 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2283 _bfd_vms_push (abfd, op1 | op2, RELC_NONE);
2286 case ETIR__C_OPR_EOR: /* Logical exclusive OR. */
2287 _bfd_vms_pop (abfd, &op1, &rel1);
2288 _bfd_vms_pop (abfd, &op2, &rel2);
2289 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2291 _bfd_vms_push (abfd, op1 ^ op2, RELC_NONE);
2294 case ETIR__C_OPR_NEG: /* Negate. */
2295 _bfd_vms_pop (abfd, &op1, &rel1);
2296 if (rel1 != RELC_NONE)
2298 _bfd_vms_push (abfd, -op1, RELC_NONE);
2301 case ETIR__C_OPR_COM: /* Complement. */
2302 _bfd_vms_pop (abfd, &op1, &rel1);
2303 if (rel1 != RELC_NONE)
2305 _bfd_vms_push (abfd, ~op1, RELC_NONE);
2308 case ETIR__C_OPR_ASH: /* Arithmetic shift. */
2309 _bfd_vms_pop (abfd, &op1, &rel1);
2310 _bfd_vms_pop (abfd, &op2, &rel2);
2311 if (rel1 != RELC_NONE || rel2 != RELC_NONE)
2314 _bfd_error_handler (_("invalid use of %s with contexts"),
2315 _bfd_vms_etir_name (cmd));
2318 if ((int)op2 < 0) /* Shift right. */
2320 else /* Shift left. */
2322 _bfd_vms_push (abfd, op1, RELC_NONE); /* FIXME: sym. */
2325 case ETIR__C_OPR_INSV: /* Insert field. */
2326 case ETIR__C_OPR_USH: /* Unsigned shift. */
2327 case ETIR__C_OPR_ROT: /* Rotate. */
2328 case ETIR__C_OPR_REDEF: /* Redefine symbol to current location. */
2329 case ETIR__C_OPR_DFLIT: /* Define a literal. */
2330 _bfd_error_handler (_("%s: not supported"),
2331 _bfd_vms_etir_name (cmd));
2335 case ETIR__C_OPR_SEL: /* Select. */
2336 _bfd_vms_pop (abfd, &op1, &rel1);
2338 _bfd_vms_pop (abfd, &op1, &rel1);
2341 _bfd_vms_pop (abfd, &op1, &rel1);
2342 _bfd_vms_pop (abfd, &op2, &rel2);
2343 _bfd_vms_push (abfd, op1, rel1);
2348 _bfd_error_handler (_("reserved cmd %d"), cmd);
2353 ptr += cmd_length - 4;
2359 /* Process EDBG/ETBT record.
2360 Return TRUE on success, FALSE on error */
2363 vms_slurp_debug (bfd *abfd)
2365 asection *section = PRIV (dst_section);
2367 if (section == NULL)
2369 /* We have no way to find out beforehand how much debug info there
2370 is in an object file, so pick an initial amount and grow it as
2372 flagword flags = SEC_HAS_CONTENTS | SEC_DEBUGGING | SEC_RELOC
2375 section = bfd_make_section (abfd, "$DST$");
2378 if (!bfd_set_section_flags (abfd, section, flags))
2380 PRIV (dst_section) = section;
2383 PRIV (image_section) = section;
2384 PRIV (image_offset) = section->size;
2386 if (!_bfd_vms_slurp_etir (abfd, NULL))
2389 section->size = PRIV (image_offset);
2393 /* Process EDBG record.
2394 Return TRUE on success, FALSE on error. */
2397 _bfd_vms_slurp_edbg (bfd *abfd)
2399 vms_debug2 ((2, "EDBG\n"));
2401 abfd->flags |= HAS_DEBUG | HAS_LINENO;
2403 return vms_slurp_debug (abfd);
2406 /* Process ETBT record.
2407 Return TRUE on success, FALSE on error. */
2410 _bfd_vms_slurp_etbt (bfd *abfd)
2412 vms_debug2 ((2, "ETBT\n"));
2414 abfd->flags |= HAS_LINENO;
2416 return vms_slurp_debug (abfd);
2419 /* Process EEOM record.
2420 Return TRUE on success, FALSE on error. */
2423 _bfd_vms_slurp_eeom (bfd *abfd)
2425 struct vms_eeom *eeom = (struct vms_eeom *) PRIV (recrd.rec);
2427 vms_debug2 ((2, "EEOM\n"));
2429 PRIV (eom_data).eom_l_total_lps = bfd_getl32 (eeom->total_lps);
2430 PRIV (eom_data).eom_w_comcod = bfd_getl16 (eeom->comcod);
2431 if (PRIV (eom_data).eom_w_comcod > 1)
2433 _bfd_error_handler (_("Object module NOT error-free !\n"));
2434 bfd_set_error (bfd_error_bad_value);
2438 PRIV (eom_data).eom_has_transfer = FALSE;
2439 if (PRIV (recrd.rec_size) > 10)
2441 PRIV (eom_data).eom_has_transfer = TRUE;
2442 PRIV (eom_data).eom_b_tfrflg = eeom->tfrflg;
2443 PRIV (eom_data).eom_l_psindx = bfd_getl32 (eeom->psindx);
2444 PRIV (eom_data).eom_l_tfradr = bfd_getl32 (eeom->tfradr);
2446 abfd->start_address = PRIV (eom_data).eom_l_tfradr;
2451 /* Slurp an ordered set of VMS object records. Return FALSE on error. */
2454 _bfd_vms_slurp_object_records (bfd * abfd)
2461 vms_debug2 ((7, "reading at %08lx\n", (unsigned long)bfd_tell (abfd)));
2463 type = _bfd_vms_get_object_record (abfd);
2466 vms_debug2 ((2, "next_record failed\n"));
2473 err = _bfd_vms_slurp_ehdr (abfd);
2476 err = _bfd_vms_slurp_eeom (abfd);
2479 err = _bfd_vms_slurp_egsd (abfd);
2482 err = TRUE; /* _bfd_vms_slurp_etir (abfd); */
2485 err = _bfd_vms_slurp_edbg (abfd);
2488 err = _bfd_vms_slurp_etbt (abfd);
2495 vms_debug2 ((2, "slurp type %d failed\n", type));
2499 while (type != EOBJ__C_EEOM);
2504 /* Initialize private data */
2506 vms_initialize (bfd * abfd)
2510 amt = sizeof (struct vms_private_data_struct);
2511 abfd->tdata.any = bfd_zalloc (abfd, amt);
2512 if (abfd->tdata.any == NULL)
2515 PRIV (recrd.file_format) = FF_UNKNOWN;
2517 amt = sizeof (struct stack_struct) * STACKSIZE;
2518 PRIV (stack) = bfd_alloc (abfd, amt);
2519 if (PRIV (stack) == NULL)
2525 bfd_release (abfd, abfd->tdata.any);
2526 abfd->tdata.any = NULL;
2530 /* Check the format for a file being read.
2531 Return a (bfd_target *) if it's an object file or zero if not. */
2533 static const struct bfd_target *
2534 alpha_vms_object_p (bfd *abfd)
2536 void *tdata_save = abfd->tdata.any;
2537 unsigned int test_len;
2540 vms_debug2 ((1, "vms_object_p(%p)\n", abfd));
2542 /* Allocate alpha-vms specific data. */
2543 if (!vms_initialize (abfd))
2546 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET))
2547 goto err_wrong_format;
2549 /* The first challenge with VMS is to discover the kind of the file.
2551 Image files (executable or shared images) are stored as a raw
2552 stream of bytes (like on UNIX), but there is no magic number.
2554 Object files are written with RMS (record management service), ie
2555 each records are preceeded by its length (on a word - 2 bytes), and
2556 padded for word-alignment. That would be simple but when files
2557 are transfered to a UNIX filesystem (using ftp), records are lost.
2558 Only the raw content of the records are transfered. Fortunately,
2559 the Alpha Object file format also store the length of the record
2560 in the records. Is that clear ? */
2562 /* Minimum is 6 bytes for objects (2 bytes size, 2 bytes record id,
2563 2 bytes size repeated) and 12 bytes for images (4 bytes major id,
2564 4 bytes minor id, 4 bytes length). */
2567 /* Size the main buffer. */
2568 buf = (unsigned char *) bfd_malloc (test_len);
2571 PRIV (recrd.buf) = buf;
2572 PRIV (recrd.buf_size) = test_len;
2574 /* Initialize the record pointer. */
2575 PRIV (recrd.rec) = buf;
2577 if (bfd_bread (buf, test_len, abfd) != test_len)
2578 goto err_wrong_format;
2580 /* Is it an image? */
2581 if ((bfd_getl32 (buf) == EIHD__K_MAJORID)
2582 && (bfd_getl32 (buf + 4) == EIHD__K_MINORID))
2584 unsigned int to_read;
2585 unsigned int read_so_far;
2586 unsigned int remaining;
2587 unsigned int eisd_offset, eihs_offset;
2589 /* Extract the header size. */
2590 PRIV (recrd.rec_size) = bfd_getl32 (buf + EIHD__L_SIZE);
2592 /* The header size is 0 for DSF files. */
2593 if (PRIV (recrd.rec_size) == 0)
2594 PRIV (recrd.rec_size) = sizeof (struct vms_eihd);
2596 if (PRIV (recrd.rec_size) > PRIV (recrd.buf_size))
2598 buf = bfd_realloc_or_free (buf, PRIV (recrd.rec_size));
2602 PRIV (recrd.buf) = NULL;
2605 PRIV (recrd.buf) = buf;
2606 PRIV (recrd.buf_size) = PRIV (recrd.rec_size);
2609 /* Read the remaining record. */
2610 remaining = PRIV (recrd.rec_size) - test_len;
2611 to_read = MIN (VMS_BLOCK_SIZE - test_len, remaining);
2612 read_so_far = test_len;
2614 while (remaining > 0)
2616 if (bfd_bread (buf + read_so_far, to_read, abfd) != to_read)
2617 goto err_wrong_format;
2619 read_so_far += to_read;
2620 remaining -= to_read;
2622 to_read = MIN (VMS_BLOCK_SIZE, remaining);
2625 /* Reset the record pointer. */
2626 PRIV (recrd.rec) = buf;
2628 /* PR 17512: file: 7d7c57c2. */
2629 if (PRIV (recrd.rec_size) < sizeof (struct vms_eihd))
2631 vms_debug2 ((2, "file type is image\n"));
2633 if (!_bfd_vms_slurp_eihd (abfd, &eisd_offset, &eihs_offset))
2634 goto err_wrong_format;
2636 if (!_bfd_vms_slurp_eisd (abfd, eisd_offset))
2637 goto err_wrong_format;
2639 /* EIHS is optional. */
2640 if (eihs_offset != 0 && !_bfd_vms_slurp_eihs (abfd, eihs_offset))
2641 goto err_wrong_format;
2647 /* Assume it's a module and adjust record pointer if necessary. */
2648 maybe_adjust_record_pointer_for_object (abfd);
2650 /* But is it really a module? */
2651 if (bfd_getl16 (PRIV (recrd.rec)) <= EOBJ__C_MAXRECTYP
2652 && bfd_getl16 (PRIV (recrd.rec) + 2) <= EOBJ__C_MAXRECSIZ)
2654 if (vms_get_remaining_object_record (abfd, test_len) <= 0)
2655 goto err_wrong_format;
2657 vms_debug2 ((2, "file type is module\n"));
2659 type = bfd_getl16 (PRIV (recrd.rec));
2660 if (type != EOBJ__C_EMH || !_bfd_vms_slurp_ehdr (abfd))
2661 goto err_wrong_format;
2663 if (!_bfd_vms_slurp_object_records (abfd))
2664 goto err_wrong_format;
2667 goto err_wrong_format;
2670 /* Set arch_info to alpha. */
2672 if (! bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0))
2673 goto err_wrong_format;
2678 bfd_set_error (bfd_error_wrong_format);
2681 if (PRIV (recrd.buf))
2682 free (PRIV (recrd.buf));
2683 if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
2684 bfd_release (abfd, abfd->tdata.any);
2685 abfd->tdata.any = tdata_save;
2691 /* Write an EMH/MHD record. */
2694 _bfd_vms_write_emh (bfd *abfd)
2696 struct vms_rec_wr *recwr = &PRIV (recwr);
2698 _bfd_vms_output_alignment (recwr, 2);
2701 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
2702 _bfd_vms_output_short (recwr, EMH__C_MHD);
2703 _bfd_vms_output_short (recwr, EOBJ__C_STRLVL);
2704 _bfd_vms_output_long (recwr, 0);
2705 _bfd_vms_output_long (recwr, 0);
2706 _bfd_vms_output_long (recwr, MAX_OUTREC_SIZE);
2708 /* Create module name from filename. */
2709 if (bfd_get_filename (abfd) != 0)
2711 char *module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
2712 _bfd_vms_output_counted (recwr, module);
2716 _bfd_vms_output_counted (recwr, "NONAME");
2718 _bfd_vms_output_counted (recwr, BFD_VERSION_STRING);
2719 _bfd_vms_output_dump (recwr, get_vms_time_string (), EMH_DATE_LENGTH);
2720 _bfd_vms_output_fill (recwr, 0, EMH_DATE_LENGTH);
2721 _bfd_vms_output_end (abfd, recwr);
2724 /* Write an EMH/LMN record. */
2727 _bfd_vms_write_lmn (bfd *abfd, const char *name)
2730 struct vms_rec_wr *recwr = &PRIV (recwr);
2731 unsigned int ver = BFD_VERSION / 10000;
2734 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
2735 _bfd_vms_output_short (recwr, EMH__C_LNM);
2736 snprintf (version, sizeof (version), "%s %d.%d.%d", name,
2737 ver / 10000, (ver / 100) % 100, ver % 100);
2738 _bfd_vms_output_dump (recwr, (unsigned char *)version, strlen (version));
2739 _bfd_vms_output_end (abfd, recwr);
2743 /* Write eom record for bfd abfd. Return FALSE on error. */
2746 _bfd_vms_write_eeom (bfd *abfd)
2748 struct vms_rec_wr *recwr = &PRIV (recwr);
2750 vms_debug2 ((2, "vms_write_eeom\n"));
2752 _bfd_vms_output_alignment (recwr, 2);
2754 _bfd_vms_output_begin (recwr, EOBJ__C_EEOM);
2755 _bfd_vms_output_long (recwr, PRIV (vms_linkage_index + 1) >> 1);
2756 _bfd_vms_output_byte (recwr, 0); /* Completion code. */
2757 _bfd_vms_output_byte (recwr, 0); /* Fill byte. */
2759 if ((abfd->flags & EXEC_P) == 0
2760 && bfd_get_start_address (abfd) != (bfd_vma)-1)
2764 section = bfd_get_section_by_name (abfd, ".link");
2767 bfd_set_error (bfd_error_nonrepresentable_section);
2770 _bfd_vms_output_short (recwr, 0);
2771 _bfd_vms_output_long (recwr, (unsigned long) section->target_index);
2772 _bfd_vms_output_long (recwr,
2773 (unsigned long) bfd_get_start_address (abfd));
2774 _bfd_vms_output_long (recwr, 0);
2777 _bfd_vms_output_end (abfd, recwr);
2782 vector_grow1 (struct vector_type *vec, size_t elsz)
2784 if (vec->nbr_el + 1 < vec->max_el)
2787 if (vec->max_el == 0)
2790 vec->els = bfd_malloc2 (vec->max_el, elsz);
2795 vec->els = bfd_realloc2 (vec->els, vec->max_el, elsz);
2799 /* Bump ABFD file position to next block. */
2802 alpha_vms_file_position_block (bfd *abfd)
2805 PRIV (file_pos) += VMS_BLOCK_SIZE - 1;
2806 PRIV (file_pos) -= (PRIV (file_pos) % VMS_BLOCK_SIZE);
2809 /* Convert from internal structure SRC to external structure DST. */
2812 alpha_vms_swap_eisd_out (struct vms_internal_eisd_map *src,
2813 struct vms_eisd *dst)
2815 bfd_putl32 (src->u.eisd.majorid, dst->majorid);
2816 bfd_putl32 (src->u.eisd.minorid, dst->minorid);
2817 bfd_putl32 (src->u.eisd.eisdsize, dst->eisdsize);
2818 if (src->u.eisd.eisdsize <= EISD__K_LENEND)
2820 bfd_putl32 (src->u.eisd.secsize, dst->secsize);
2821 bfd_putl64 (src->u.eisd.virt_addr, dst->virt_addr);
2822 bfd_putl32 (src->u.eisd.flags, dst->flags);
2823 bfd_putl32 (src->u.eisd.vbn, dst->vbn);
2824 dst->pfc = src->u.eisd.pfc;
2825 dst->matchctl = src->u.eisd.matchctl;
2826 dst->type = src->u.eisd.type;
2828 if (src->u.eisd.flags & EISD__M_GBL)
2830 bfd_putl32 (src->u.gbl_eisd.ident, dst->ident);
2831 memcpy (dst->gblnam, src->u.gbl_eisd.gblnam,
2832 src->u.gbl_eisd.gblnam[0] + 1);
2836 /* Append EISD to the list of extra eisd for ABFD. */
2839 alpha_vms_append_extra_eisd (bfd *abfd, struct vms_internal_eisd_map *eisd)
2842 if (PRIV (gbl_eisd_head) == NULL)
2843 PRIV (gbl_eisd_head) = eisd;
2845 PRIV (gbl_eisd_tail)->next = eisd;
2846 PRIV (gbl_eisd_tail) = eisd;
2849 /* Create an EISD for shared image SHRIMG.
2850 Return FALSE in case of error. */
2853 alpha_vms_create_eisd_for_shared (bfd *abfd, bfd *shrimg)
2855 struct vms_internal_eisd_map *eisd;
2858 namlen = strlen (PRIV2 (shrimg, hdr_data.hdr_t_name));
2859 if (namlen + 5 > EISD__K_GBLNAMLEN)
2865 eisd = bfd_alloc (abfd, sizeof (*eisd));
2869 /* Fill the fields. */
2870 eisd->u.gbl_eisd.common.majorid = EISD__K_MAJORID;
2871 eisd->u.gbl_eisd.common.minorid = EISD__K_MINORID;
2872 eisd->u.gbl_eisd.common.eisdsize = (EISD__K_LEN + 4 + namlen + 5 + 3) & ~3;
2873 eisd->u.gbl_eisd.common.secsize = VMS_BLOCK_SIZE; /* Must not be 0. */
2874 eisd->u.gbl_eisd.common.virt_addr = 0;
2875 eisd->u.gbl_eisd.common.flags = EISD__M_GBL;
2876 eisd->u.gbl_eisd.common.vbn = 0;
2877 eisd->u.gbl_eisd.common.pfc = 0;
2878 eisd->u.gbl_eisd.common.matchctl = PRIV2 (shrimg, matchctl);
2879 eisd->u.gbl_eisd.common.type = EISD__K_SHRPIC;
2881 eisd->u.gbl_eisd.ident = PRIV2 (shrimg, ident);
2882 eisd->u.gbl_eisd.gblnam[0] = namlen + 4;
2883 memcpy (eisd->u.gbl_eisd.gblnam + 1, PRIV2 (shrimg, hdr_data.hdr_t_name),
2885 memcpy (eisd->u.gbl_eisd.gblnam + 1 + namlen, "_001", 4);
2887 /* Append it to the list. */
2888 alpha_vms_append_extra_eisd (abfd, eisd);
2893 /* Create an EISD for section SEC.
2894 Return FALSE in case of failure. */
2897 alpha_vms_create_eisd_for_section (bfd *abfd, asection *sec)
2899 struct vms_internal_eisd_map *eisd;
2901 /* Only for allocating section. */
2902 if (!(sec->flags & SEC_ALLOC))
2905 BFD_ASSERT (vms_section_data (sec)->eisd == NULL);
2906 eisd = bfd_alloc (abfd, sizeof (*eisd));
2909 vms_section_data (sec)->eisd = eisd;
2911 /* Fill the fields. */
2912 eisd->u.eisd.majorid = EISD__K_MAJORID;
2913 eisd->u.eisd.minorid = EISD__K_MINORID;
2914 eisd->u.eisd.eisdsize = EISD__K_LEN;
2915 eisd->u.eisd.secsize =
2916 (sec->size + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
2917 eisd->u.eisd.virt_addr = sec->vma;
2918 eisd->u.eisd.flags = 0;
2919 eisd->u.eisd.vbn = 0; /* To be later defined. */
2920 eisd->u.eisd.pfc = 0; /* Default. */
2921 eisd->u.eisd.matchctl = EISD__K_MATALL;
2922 eisd->u.eisd.type = EISD__K_NORMAL;
2924 if (sec->flags & SEC_CODE)
2925 eisd->u.eisd.flags |= EISD__M_EXE;
2926 if (!(sec->flags & SEC_READONLY))
2927 eisd->u.eisd.flags |= EISD__M_WRT | EISD__M_CRF;
2929 /* If relocations or fixup will be applied, make this isect writeable. */
2930 if (sec->flags & SEC_RELOC)
2931 eisd->u.eisd.flags |= EISD__M_WRT | EISD__M_CRF;
2933 if (!(sec->flags & SEC_HAS_CONTENTS))
2935 eisd->u.eisd.flags |= EISD__M_DZRO;
2936 eisd->u.eisd.flags &= ~EISD__M_CRF;
2938 if (sec->flags & SEC_LINKER_CREATED)
2940 if (strcmp (sec->name, "$FIXUP$") == 0)
2941 eisd->u.eisd.flags |= EISD__M_FIXUPVEC;
2944 /* Append it to the list. */
2946 if (PRIV (eisd_head) == NULL)
2947 PRIV (eisd_head) = eisd;
2949 PRIV (eisd_tail)->next = eisd;
2950 PRIV (eisd_tail) = eisd;
2955 /* Layout executable ABFD and write it to the disk.
2956 Return FALSE in case of failure. */
2959 alpha_vms_write_exec (bfd *abfd)
2961 struct vms_eihd eihd;
2962 struct vms_eiha *eiha;
2963 struct vms_eihi *eihi;
2964 struct vms_eihs *eihs = NULL;
2966 struct vms_internal_eisd_map *first_eisd;
2967 struct vms_internal_eisd_map *eisd;
2970 file_ptr gst_filepos = 0;
2971 unsigned int lnkflags = 0;
2973 /* Build the EIHD. */
2974 PRIV (file_pos) = EIHD__C_LENGTH;
2976 memset (&eihd, 0, sizeof (eihd));
2977 memset (eihd.fill_2, 0xff, sizeof (eihd.fill_2));
2979 bfd_putl32 (EIHD__K_MAJORID, eihd.majorid);
2980 bfd_putl32 (EIHD__K_MINORID, eihd.minorid);
2982 bfd_putl32 (sizeof (eihd), eihd.size);
2983 bfd_putl32 (0, eihd.isdoff);
2984 bfd_putl32 (0, eihd.activoff);
2985 bfd_putl32 (0, eihd.symdbgoff);
2986 bfd_putl32 (0, eihd.imgidoff);
2987 bfd_putl32 (0, eihd.patchoff);
2988 bfd_putl64 (0, eihd.iafva);
2989 bfd_putl32 (0, eihd.version_array_off);
2991 bfd_putl32 (EIHD__K_EXE, eihd.imgtype);
2992 bfd_putl32 (0, eihd.subtype);
2994 bfd_putl32 (0, eihd.imgiocnt);
2995 bfd_putl32 (-1, eihd.privreqs);
2996 bfd_putl32 (-1, eihd.privreqs + 4);
2998 bfd_putl32 ((sizeof (eihd) + VMS_BLOCK_SIZE - 1) / VMS_BLOCK_SIZE,
3000 bfd_putl32 (0, eihd.ident);
3001 bfd_putl32 (0, eihd.sysver);
3004 bfd_putl32 (0, eihd.symvect_size);
3005 bfd_putl32 (16, eihd.virt_mem_block_size);
3006 bfd_putl32 (0, eihd.ext_fixup_off);
3007 bfd_putl32 (0, eihd.noopt_psect_off);
3008 bfd_putl32 (-1, eihd.alias);
3011 eiha = (struct vms_eiha *)((char *) &eihd + PRIV (file_pos));
3012 bfd_putl32 (PRIV (file_pos), eihd.activoff);
3013 PRIV (file_pos) += sizeof (struct vms_eiha);
3015 bfd_putl32 (sizeof (struct vms_eiha), eiha->size);
3016 bfd_putl32 (0, eiha->spare);
3017 bfd_putl64 (PRIV (transfer_address[0]), eiha->tfradr1);
3018 bfd_putl64 (PRIV (transfer_address[1]), eiha->tfradr2);
3019 bfd_putl64 (PRIV (transfer_address[2]), eiha->tfradr3);
3020 bfd_putl64 (PRIV (transfer_address[3]), eiha->tfradr4);
3021 bfd_putl64 (0, eiha->inishr);
3024 eihi = (struct vms_eihi *)((char *) &eihd + PRIV (file_pos));
3025 bfd_putl32 (PRIV (file_pos), eihd.imgidoff);
3026 PRIV (file_pos) += sizeof (struct vms_eihi);
3028 bfd_putl32 (EIHI__K_MAJORID, eihi->majorid);
3029 bfd_putl32 (EIHI__K_MINORID, eihi->minorid);
3034 /* Set module name. */
3035 module = vms_get_module_name (bfd_get_filename (abfd), TRUE);
3036 len = strlen (module);
3037 if (len > sizeof (eihi->imgnam) - 1)
3038 len = sizeof (eihi->imgnam) - 1;
3039 eihi->imgnam[0] = len;
3040 memcpy (eihi->imgnam + 1, module, len);
3048 vms_get_time (&hi, &lo);
3049 bfd_putl32 (lo, eihi->linktime + 0);
3050 bfd_putl32 (hi, eihi->linktime + 4);
3053 eihi->linkid[0] = 0;
3054 eihi->imgbid[0] = 0;
3057 dst = PRIV (dst_section);
3058 dmt = bfd_get_section_by_name (abfd, "$DMT$");
3059 if (dst != NULL && dst->size != 0)
3061 eihs = (struct vms_eihs *)((char *) &eihd + PRIV (file_pos));
3062 bfd_putl32 (PRIV (file_pos), eihd.symdbgoff);
3063 PRIV (file_pos) += sizeof (struct vms_eihs);
3065 bfd_putl32 (EIHS__K_MAJORID, eihs->majorid);
3066 bfd_putl32 (EIHS__K_MINORID, eihs->minorid);
3067 bfd_putl32 (0, eihs->dstvbn);
3068 bfd_putl32 (0, eihs->dstsize);
3069 bfd_putl32 (0, eihs->gstvbn);
3070 bfd_putl32 (0, eihs->gstsize);
3071 bfd_putl32 (0, eihs->dmtvbn);
3072 bfd_putl32 (0, eihs->dmtsize);
3075 /* One EISD per section. */
3076 for (sec = abfd->sections; sec; sec = sec->next)
3078 if (!alpha_vms_create_eisd_for_section (abfd, sec))
3082 /* Merge section EIDS which extra ones. */
3083 if (PRIV (eisd_tail))
3084 PRIV (eisd_tail)->next = PRIV (gbl_eisd_head);
3086 PRIV (eisd_head) = PRIV (gbl_eisd_head);
3087 if (PRIV (gbl_eisd_tail))
3088 PRIV (eisd_tail) = PRIV (gbl_eisd_tail);
3090 first_eisd = PRIV (eisd_head);
3092 /* Add end of eisd. */
3095 eisd = bfd_zalloc (abfd, sizeof (*eisd));
3098 eisd->u.eisd.majorid = 0;
3099 eisd->u.eisd.minorid = 0;
3100 eisd->u.eisd.eisdsize = 0;
3101 alpha_vms_append_extra_eisd (abfd, eisd);
3104 /* Place EISD in the file. */
3105 for (eisd = first_eisd; eisd; eisd = eisd->next)
3107 file_ptr room = VMS_BLOCK_SIZE - (PRIV (file_pos) % VMS_BLOCK_SIZE);
3109 /* First block is a little bit special: there is a word at the end. */
3110 if (PRIV (file_pos) < VMS_BLOCK_SIZE && room > 2)
3112 if (room < eisd->u.eisd.eisdsize + EISD__K_LENEND)
3113 alpha_vms_file_position_block (abfd);
3115 eisd->file_pos = PRIV (file_pos);
3116 PRIV (file_pos) += eisd->u.eisd.eisdsize;
3118 if (eisd->u.eisd.flags & EISD__M_FIXUPVEC)
3119 bfd_putl64 (eisd->u.eisd.virt_addr, eihd.iafva);
3122 if (first_eisd != NULL)
3124 bfd_putl32 (first_eisd->file_pos, eihd.isdoff);
3125 /* Real size of end of eisd marker. */
3126 PRIV (file_pos) += EISD__K_LENEND;
3129 bfd_putl32 (PRIV (file_pos), eihd.size);
3130 bfd_putl32 ((PRIV (file_pos) + VMS_BLOCK_SIZE - 1) / VMS_BLOCK_SIZE,
3133 /* Place sections. */
3134 for (sec = abfd->sections; sec; sec = sec->next)
3136 if (!(sec->flags & SEC_HAS_CONTENTS))
3139 eisd = vms_section_data (sec)->eisd;
3141 /* Align on a block. */
3142 alpha_vms_file_position_block (abfd);
3143 sec->filepos = PRIV (file_pos);
3146 eisd->u.eisd.vbn = (sec->filepos / VMS_BLOCK_SIZE) + 1;
3148 PRIV (file_pos) += sec->size;
3152 if (eihs != NULL && dst != NULL)
3154 bfd_putl32 ((dst->filepos / VMS_BLOCK_SIZE) + 1, eihs->dstvbn);
3155 bfd_putl32 (dst->size, eihs->dstsize);
3159 lnkflags |= EIHD__M_DBGDMT;
3160 bfd_putl32 ((dmt->filepos / VMS_BLOCK_SIZE) + 1, eihs->dmtvbn);
3161 bfd_putl32 (dmt->size, eihs->dmtsize);
3163 if (PRIV (gsd_sym_count) != 0)
3165 alpha_vms_file_position_block (abfd);
3166 gst_filepos = PRIV (file_pos);
3167 bfd_putl32 ((gst_filepos / VMS_BLOCK_SIZE) + 1, eihs->gstvbn);
3168 bfd_putl32 ((PRIV (gsd_sym_count) + 4) / 5 + 4, eihs->gstsize);
3172 /* Write EISD in hdr. */
3173 for (eisd = first_eisd; eisd && eisd->file_pos < VMS_BLOCK_SIZE;
3175 alpha_vms_swap_eisd_out
3176 (eisd, (struct vms_eisd *)((char *)&eihd + eisd->file_pos));
3178 /* Write first block. */
3179 bfd_putl32 (lnkflags, eihd.lnkflags);
3180 if (bfd_bwrite (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
3183 /* Write remaining eisd. */
3186 unsigned char blk[VMS_BLOCK_SIZE];
3187 struct vms_internal_eisd_map *next_eisd;
3189 memset (blk, 0xff, sizeof (blk));
3190 while (eisd != NULL)
3192 alpha_vms_swap_eisd_out
3194 (struct vms_eisd *)(blk + (eisd->file_pos % VMS_BLOCK_SIZE)));
3196 next_eisd = eisd->next;
3197 if (next_eisd == NULL
3198 || (next_eisd->file_pos / VMS_BLOCK_SIZE
3199 != eisd->file_pos / VMS_BLOCK_SIZE))
3201 if (bfd_bwrite (blk, sizeof (blk), abfd) != sizeof (blk))
3204 memset (blk, 0xff, sizeof (blk));
3210 /* Write sections. */
3211 for (sec = abfd->sections; sec; sec = sec->next)
3213 unsigned char blk[VMS_BLOCK_SIZE];
3216 if (sec->size == 0 || !(sec->flags & SEC_HAS_CONTENTS))
3218 if (bfd_bwrite (sec->contents, sec->size, abfd) != sec->size)
3222 len = VMS_BLOCK_SIZE - sec->size % VMS_BLOCK_SIZE;
3223 if (len != VMS_BLOCK_SIZE)
3225 memset (blk, 0, len);
3226 if (bfd_bwrite (blk, len, abfd) != len)
3232 if (gst_filepos != 0)
3234 struct vms_rec_wr *recwr = &PRIV (recwr);
3237 _bfd_vms_write_emh (abfd);
3238 _bfd_vms_write_lmn (abfd, "GNU LD");
3240 /* PSC for the absolute section. */
3241 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3242 _bfd_vms_output_long (recwr, 0);
3243 _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3244 _bfd_vms_output_short (recwr, 0);
3245 _bfd_vms_output_short (recwr, EGPS__V_PIC | EGPS__V_LIB | EGPS__V_RD);
3246 _bfd_vms_output_long (recwr, 0);
3247 _bfd_vms_output_counted (recwr, ".$$ABS$$.");
3248 _bfd_vms_output_end_subrec (recwr);
3249 _bfd_vms_output_end (abfd, recwr);
3251 for (i = 0; i < PRIV (gsd_sym_count); i++)
3253 struct vms_symbol_entry *sym = PRIV (syms)[i];
3259 _bfd_vms_output_alignment (recwr, 8);
3260 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3261 _bfd_vms_output_long (recwr, 0);
3263 _bfd_vms_output_begin_subrec (recwr, EGSD__C_SYMG);
3264 _bfd_vms_output_short (recwr, 0); /* Data type, alignment. */
3265 _bfd_vms_output_short (recwr, sym->flags);
3267 if (sym->code_section)
3268 ep = alpha_vms_get_sym_value (sym->code_section, sym->code_value);
3271 BFD_ASSERT (sym->code_value == 0);
3274 val = alpha_vms_get_sym_value (sym->section, sym->value);
3275 _bfd_vms_output_quad
3276 (recwr, sym->typ == EGSD__C_SYMG ? sym->symbol_vector : val);
3277 _bfd_vms_output_quad (recwr, ep);
3278 _bfd_vms_output_quad (recwr, val);
3279 _bfd_vms_output_long (recwr, 0);
3280 _bfd_vms_output_counted (recwr, sym->name);
3281 _bfd_vms_output_end_subrec (recwr);
3283 _bfd_vms_output_end (abfd, recwr);
3286 _bfd_vms_output_end (abfd, recwr);
3288 if (!_bfd_vms_write_eeom (abfd))
3296 /* Write section and symbol directory of bfd abfd. Return FALSE on error. */
3299 _bfd_vms_write_egsd (bfd *abfd)
3303 unsigned int symnum;
3305 flagword new_flags, old_flags;
3306 int abs_section_index = -1;
3307 unsigned int target_index = 0;
3308 struct vms_rec_wr *recwr = &PRIV (recwr);
3310 vms_debug2 ((2, "vms_write_egsd\n"));
3312 /* Egsd is quadword aligned. */
3313 _bfd_vms_output_alignment (recwr, 8);
3315 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3316 _bfd_vms_output_long (recwr, 0);
3318 /* Number sections. */
3319 for (section = abfd->sections; section != NULL; section = section->next)
3321 if (section->flags & SEC_DEBUGGING)
3323 if (!strcmp (section->name, ".vmsdebug"))
3325 section->flags |= SEC_DEBUGGING;
3328 section->target_index = target_index++;
3331 for (section = abfd->sections; section != NULL; section = section->next)
3333 vms_debug2 ((3, "Section #%d %s, %d bytes\n",
3334 section->target_index, section->name, (int)section->size));
3336 /* Don't write out the VMS debug info section since it is in the
3337 ETBT and EDBG sections in etir. */
3338 if (section->flags & SEC_DEBUGGING)
3341 /* 13 bytes egsd, max 31 chars name -> should be 44 bytes. */
3342 if (_bfd_vms_output_check (recwr, 64) < 0)
3344 _bfd_vms_output_end (abfd, recwr);
3345 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3346 _bfd_vms_output_long (recwr, 0);
3349 /* Don't know if this is necessary for the linker but for now it keeps
3350 vms_slurp_gsd happy. */
3351 sname = section->name;
3354 /* Remove leading dot. */
3356 if ((*sname == 't') && (strcmp (sname, "text") == 0))
3357 sname = EVAX_CODE_NAME;
3358 else if ((*sname == 'd') && (strcmp (sname, "data") == 0))
3359 sname = EVAX_DATA_NAME;
3360 else if ((*sname == 'b') && (strcmp (sname, "bss") == 0))
3361 sname = EVAX_BSS_NAME;
3362 else if ((*sname == 'l') && (strcmp (sname, "link") == 0))
3363 sname = EVAX_LINK_NAME;
3364 else if ((*sname == 'r') && (strcmp (sname, "rdata") == 0))
3365 sname = EVAX_READONLY_NAME;
3366 else if ((*sname == 'l') && (strcmp (sname, "literal") == 0))
3367 sname = EVAX_LITERAL_NAME;
3368 else if ((*sname == 'l') && (strcmp (sname, "literals") == 0))
3369 sname = EVAX_LITERALS_NAME;
3370 else if ((*sname == 'c') && (strcmp (sname, "comm") == 0))
3371 sname = EVAX_COMMON_NAME;
3372 else if ((*sname == 'l') && (strcmp (sname, "lcomm") == 0))
3373 sname = EVAX_LOCAL_NAME;
3376 if (bfd_is_com_section (section))
3377 new_flags = (EGPS__V_OVR | EGPS__V_REL | EGPS__V_GBL | EGPS__V_RD
3378 | EGPS__V_WRT | EGPS__V_NOMOD | EGPS__V_COM);
3380 new_flags = vms_esecflag_by_name (evax_section_flags, sname,
3383 /* Modify them as directed. */
3384 if (section->flags & SEC_READONLY)
3385 new_flags &= ~EGPS__V_WRT;
3387 new_flags &= ~vms_section_data (section)->no_flags;
3388 new_flags |= vms_section_data (section)->flags;
3390 vms_debug2 ((3, "sec flags %x\n", section->flags));
3391 vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
3392 new_flags, (unsigned long)section->size));
3394 _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3395 _bfd_vms_output_short (recwr, section->alignment_power & 0xff);
3396 _bfd_vms_output_short (recwr, new_flags);
3397 _bfd_vms_output_long (recwr, (unsigned long) section->size);
3398 _bfd_vms_output_counted (recwr, sname);
3399 _bfd_vms_output_end_subrec (recwr);
3401 /* If the section is an obsolute one, remind its index as it will be
3402 used later for absolute symbols. */
3403 if ((new_flags & EGPS__V_REL) == 0 && abs_section_index < 0)
3404 abs_section_index = section->target_index;
3407 /* Output symbols. */
3408 vms_debug2 ((3, "%d symbols found\n", abfd->symcount));
3410 bfd_set_start_address (abfd, (bfd_vma) -1);
3412 for (symnum = 0; symnum < abfd->symcount; symnum++)
3414 symbol = abfd->outsymbols[symnum];
3415 old_flags = symbol->flags;
3417 /* Work-around a missing feature: consider __main as the main entry
3419 if (symbol->name[0] == '_' && strcmp (symbol->name, "__main") == 0)
3420 bfd_set_start_address (abfd, (bfd_vma)symbol->value);
3422 /* Only put in the GSD the global and the undefined symbols. */
3423 if (old_flags & BSF_FILE)
3426 if ((old_flags & BSF_GLOBAL) == 0 && !bfd_is_und_section (symbol->section))
3428 /* If the LIB$INITIIALIZE section is present, add a reference to
3429 LIB$INITIALIZE symbol. FIXME: this should be done explicitely
3430 in the assembly file. */
3431 if (!((old_flags & BSF_SECTION_SYM) != 0
3432 && strcmp (symbol->section->name, "LIB$INITIALIZE") == 0))
3436 /* 13 bytes egsd, max 64 chars name -> should be 77 bytes. Add 16 more
3437 bytes for a possible ABS section. */
3438 if (_bfd_vms_output_check (recwr, 80 + 16) < 0)
3440 _bfd_vms_output_end (abfd, recwr);
3441 _bfd_vms_output_begin (recwr, EOBJ__C_EGSD);
3442 _bfd_vms_output_long (recwr, 0);
3445 if ((old_flags & BSF_GLOBAL) != 0
3446 && bfd_is_abs_section (symbol->section)
3447 && abs_section_index <= 0)
3449 /* Create an absolute section if none was defined. It is highly
3450 unlikely that the name $ABS$ clashes with a user defined
3451 non-absolute section name. */
3452 _bfd_vms_output_begin_subrec (recwr, EGSD__C_PSC);
3453 _bfd_vms_output_short (recwr, 4);
3454 _bfd_vms_output_short (recwr, EGPS__V_SHR);
3455 _bfd_vms_output_long (recwr, 0);
3456 _bfd_vms_output_counted (recwr, "$ABS$");
3457 _bfd_vms_output_end_subrec (recwr);
3459 abs_section_index = target_index++;
3462 _bfd_vms_output_begin_subrec (recwr, EGSD__C_SYM);
3464 /* Data type, alignment. */
3465 _bfd_vms_output_short (recwr, 0);
3469 if (old_flags & BSF_WEAK)
3470 new_flags |= EGSY__V_WEAK;
3471 if (bfd_is_com_section (symbol->section)) /* .comm */
3472 new_flags |= (EGSY__V_WEAK | EGSY__V_COMM);
3474 if (old_flags & BSF_FUNCTION)
3476 new_flags |= EGSY__V_NORM;
3477 new_flags |= EGSY__V_REL;
3479 if (old_flags & BSF_GLOBAL)
3481 new_flags |= EGSY__V_DEF;
3482 if (!bfd_is_abs_section (symbol->section))
3483 new_flags |= EGSY__V_REL;
3485 _bfd_vms_output_short (recwr, new_flags);
3487 if (old_flags & BSF_GLOBAL)
3489 /* Symbol definition. */
3490 bfd_vma code_address = 0;
3491 unsigned long ca_psindx = 0;
3492 unsigned long psindx;
3494 if ((old_flags & BSF_FUNCTION) && symbol->udata.p != NULL)
3499 ((struct evax_private_udata_struct *)symbol->udata.p)->enbsym;
3500 code_address = sym->value;
3501 ca_psindx = sym->section->target_index;
3503 if (bfd_is_abs_section (symbol->section))
3504 psindx = abs_section_index;
3506 psindx = symbol->section->target_index;
3508 _bfd_vms_output_quad (recwr, symbol->value);
3509 _bfd_vms_output_quad (recwr, code_address);
3510 _bfd_vms_output_long (recwr, ca_psindx);
3511 _bfd_vms_output_long (recwr, psindx);
3513 _bfd_vms_output_counted (recwr, symbol->name);
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;
3531 struct vms_rec_wr *recwr = &PRIV (recwr);
3533 vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd));
3535 _bfd_vms_output_alignment (recwr, 2);
3537 _bfd_vms_write_emh (abfd);
3538 _bfd_vms_write_lmn (abfd, "GNU AS");
3541 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3542 _bfd_vms_output_short (recwr, EMH__C_SRC);
3544 for (symnum = 0; symnum < abfd->symcount; symnum++)
3546 symbol = abfd->outsymbols[symnum];
3548 if (symbol->flags & BSF_FILE)
3550 _bfd_vms_output_dump (recwr, (unsigned char *) symbol->name,
3551 (int) strlen (symbol->name));
3556 if (symnum == abfd->symcount)
3557 _bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("noname"));
3559 _bfd_vms_output_end (abfd, recwr);
3562 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3563 _bfd_vms_output_short (recwr, EMH__C_TTL);
3564 _bfd_vms_output_dump (recwr, (unsigned char *) STRING_COMMA_LEN ("TTL"));
3565 _bfd_vms_output_end (abfd, recwr);
3568 _bfd_vms_output_begin (recwr, EOBJ__C_EMH);
3569 _bfd_vms_output_short (recwr, EMH__C_CPR);
3570 _bfd_vms_output_dump (recwr,
3571 (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
3573 _bfd_vms_output_end (abfd, recwr);
3578 /* Part 4.6, relocations. */
3581 /* WRITE ETIR SECTION
3583 This is still under construction and therefore not documented. */
3585 /* Close the etir/etbt record. */
3588 end_etir_record (bfd * abfd)
3590 struct vms_rec_wr *recwr = &PRIV (recwr);
3592 _bfd_vms_output_end (abfd, recwr);
3596 start_etir_or_etbt_record (bfd *abfd, asection *section, bfd_vma offset)
3598 struct vms_rec_wr *recwr = &PRIV (recwr);
3600 if (section->flags & SEC_DEBUGGING)
3602 _bfd_vms_output_begin (recwr, EOBJ__C_ETBT);
3606 /* Push start offset. */
3607 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3608 _bfd_vms_output_long (recwr, (unsigned long) 0);
3609 _bfd_vms_output_end_subrec (recwr);
3612 _bfd_vms_output_begin_subrec (recwr, ETIR__C_CTL_DFLOC);
3613 _bfd_vms_output_end_subrec (recwr);
3618 _bfd_vms_output_begin (recwr, EOBJ__C_ETIR);
3622 /* Push start offset. */
3623 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3624 _bfd_vms_output_long (recwr, (unsigned long) section->target_index);
3625 _bfd_vms_output_quad (recwr, offset);
3626 _bfd_vms_output_end_subrec (recwr);
3628 /* Start = pop (). */
3629 _bfd_vms_output_begin_subrec (recwr, ETIR__C_CTL_SETRB);
3630 _bfd_vms_output_end_subrec (recwr);
3635 /* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
3636 address VADDR in section specified by SEC_INDEX and NAME. */
3639 sto_imm (bfd *abfd, asection *section,
3640 bfd_size_type ssize, unsigned char *cptr, bfd_vma vaddr)
3643 struct vms_rec_wr *recwr = &PRIV (recwr);
3646 _bfd_vms_debug (8, "sto_imm %d bytes\n", (int) ssize);
3647 _bfd_hexdump (9, cptr, (int) ssize, (int) vaddr);
3652 /* Try all the rest. */
3655 if (_bfd_vms_output_check (recwr, size) < 0)
3657 /* Doesn't fit, split ! */
3658 end_etir_record (abfd);
3660 start_etir_or_etbt_record (abfd, section, vaddr);
3662 size = _bfd_vms_output_check (recwr, 0); /* get max size */
3663 if (size > ssize) /* more than what's left ? */
3667 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_IMM);
3668 _bfd_vms_output_long (recwr, (unsigned long) (size));
3669 _bfd_vms_output_dump (recwr, cptr, size);
3670 _bfd_vms_output_end_subrec (recwr);
3673 _bfd_vms_debug (10, "dumped %d bytes\n", (int) size);
3674 _bfd_hexdump (10, cptr, (int) size, (int) vaddr);
3684 etir_output_check (bfd *abfd, asection *section, bfd_vma vaddr, int checklen)
3686 if (_bfd_vms_output_check (&PRIV (recwr), checklen) < 0)
3688 /* Not enough room in this record. Close it and open a new one. */
3689 end_etir_record (abfd);
3690 start_etir_or_etbt_record (abfd, section, vaddr);
3694 /* Return whether RELOC must be deferred till the end. */
3697 defer_reloc_p (arelent *reloc)
3699 switch (reloc->howto->type)
3712 /* Write section contents for bfd abfd. Return FALSE on error. */
3715 _bfd_vms_write_etir (bfd * abfd, int objtype ATTRIBUTE_UNUSED)
3718 struct vms_rec_wr *recwr = &PRIV (recwr);
3720 vms_debug2 ((2, "vms_write_tir (%p, %d)\n", abfd, objtype));
3722 _bfd_vms_output_alignment (recwr, 4);
3724 PRIV (vms_linkage_index) = 0;
3726 for (section = abfd->sections; section; section = section->next)
3728 vms_debug2 ((4, "writing %d. section '%s' (%d bytes)\n",
3729 section->target_index, section->name, (int) (section->size)));
3731 if (!(section->flags & SEC_HAS_CONTENTS)
3732 || bfd_is_com_section (section))
3735 if (!section->contents)
3737 bfd_set_error (bfd_error_no_contents);
3741 start_etir_or_etbt_record (abfd, section, 0);
3743 if (section->flags & SEC_RELOC)
3745 bfd_vma curr_addr = 0;
3746 unsigned char *curr_data = section->contents;
3748 int pass2_needed = 0;
3749 int pass2_in_progress = 0;
3752 if (section->reloc_count == 0)
3754 (_("SEC_RELOC with no relocs in section %A"), section);
3759 int i = section->reloc_count;
3760 arelent **rptr = section->orelocation;
3761 _bfd_vms_debug (4, "%d relocations:\n", i);
3764 _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, "
3765 "addr %08lx, off %08lx, len %d: %s\n",
3766 (*(*rptr)->sym_ptr_ptr)->name,
3767 (*(*rptr)->sym_ptr_ptr)->section->name,
3768 (long) (*(*rptr)->sym_ptr_ptr)->value,
3769 (unsigned long)(*rptr)->address,
3770 (unsigned long)(*rptr)->addend,
3771 bfd_get_reloc_size ((*rptr)->howto),
3772 ( *rptr)->howto->name);
3779 for (irel = 0; irel < section->reloc_count; irel++)
3781 struct evax_private_udata_struct *udata;
3782 arelent *rptr = section->orelocation [irel];
3783 bfd_vma addr = rptr->address;
3784 asymbol *sym = *rptr->sym_ptr_ptr;
3785 asection *sec = sym->section;
3786 bfd_boolean defer = defer_reloc_p (rptr);
3789 if (pass2_in_progress)
3791 /* Non-deferred relocs have already been output. */
3797 /* Deferred relocs must be output at the very end. */
3804 /* Regular relocs are intertwined with binary data. */
3805 if (curr_addr > addr)
3806 _bfd_error_handler (_("Size error in section %A"),
3808 size = addr - curr_addr;
3809 sto_imm (abfd, section, size, curr_data, curr_addr);
3814 size = bfd_get_reloc_size (rptr->howto);
3816 switch (rptr->howto->type)
3818 case ALPHA_R_IGNORE:
3821 case ALPHA_R_REFLONG:
3822 if (bfd_is_und_section (sym->section))
3824 bfd_vma addend = rptr->addend;
3825 slen = strlen ((char *) sym->name);
3826 etir_output_check (abfd, section, curr_addr, slen);
3829 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
3830 _bfd_vms_output_counted (recwr, sym->name);
3831 _bfd_vms_output_end_subrec (recwr);
3832 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3833 _bfd_vms_output_long (recwr, (unsigned long) addend);
3834 _bfd_vms_output_end_subrec (recwr);
3835 _bfd_vms_output_begin_subrec (recwr, ETIR__C_OPR_ADD);
3836 _bfd_vms_output_end_subrec (recwr);
3837 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3838 _bfd_vms_output_end_subrec (recwr);
3842 _bfd_vms_output_begin_subrec
3843 (recwr, ETIR__C_STO_GBL_LW);
3844 _bfd_vms_output_counted (recwr, sym->name);
3845 _bfd_vms_output_end_subrec (recwr);
3848 else if (bfd_is_abs_section (sym->section))
3850 etir_output_check (abfd, section, curr_addr, 16);
3851 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_LW);
3852 _bfd_vms_output_long (recwr, (unsigned long) sym->value);
3853 _bfd_vms_output_end_subrec (recwr);
3854 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3855 _bfd_vms_output_end_subrec (recwr);
3859 etir_output_check (abfd, section, curr_addr, 32);
3860 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3861 _bfd_vms_output_long (recwr,
3862 (unsigned long) sec->target_index);
3863 _bfd_vms_output_quad (recwr, rptr->addend + sym->value);
3864 _bfd_vms_output_end_subrec (recwr);
3865 /* ??? Table B-8 of the OpenVMS Linker Utilily Manual
3866 says that we should have a ETIR__C_STO_OFF here.
3867 But the relocation would not be BFD_RELOC_32 then.
3868 This case is very likely unreachable. */
3869 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_LW);
3870 _bfd_vms_output_end_subrec (recwr);
3874 case ALPHA_R_REFQUAD:
3875 if (bfd_is_und_section (sym->section))
3877 bfd_vma addend = rptr->addend;
3878 slen = strlen ((char *) sym->name);
3879 etir_output_check (abfd, section, curr_addr, slen);
3882 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_GBL);
3883 _bfd_vms_output_counted (recwr, sym->name);
3884 _bfd_vms_output_end_subrec (recwr);
3885 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
3886 _bfd_vms_output_quad (recwr, addend);
3887 _bfd_vms_output_end_subrec (recwr);
3888 _bfd_vms_output_begin_subrec (recwr, ETIR__C_OPR_ADD);
3889 _bfd_vms_output_end_subrec (recwr);
3890 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_QW);
3891 _bfd_vms_output_end_subrec (recwr);
3895 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_GBL);
3896 _bfd_vms_output_counted (recwr, sym->name);
3897 _bfd_vms_output_end_subrec (recwr);
3900 else if (bfd_is_abs_section (sym->section))
3902 etir_output_check (abfd, section, curr_addr, 16);
3903 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_QW);
3904 _bfd_vms_output_quad (recwr, sym->value);
3905 _bfd_vms_output_end_subrec (recwr);
3906 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_QW);
3907 _bfd_vms_output_end_subrec (recwr);
3911 etir_output_check (abfd, section, curr_addr, 32);
3912 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STA_PQ);
3913 _bfd_vms_output_long (recwr,
3914 (unsigned long) sec->target_index);
3915 _bfd_vms_output_quad (recwr, rptr->addend + sym->value);
3916 _bfd_vms_output_end_subrec (recwr);
3917 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_OFF);
3918 _bfd_vms_output_end_subrec (recwr);
3923 sto_imm (abfd, section, size, curr_data, curr_addr);
3926 case ALPHA_R_LINKAGE:
3927 etir_output_check (abfd, section, curr_addr, 64);
3928 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LP_PSB);
3929 _bfd_vms_output_long
3930 (recwr, (unsigned long) rptr->addend);
3931 if (rptr->addend > PRIV (vms_linkage_index))
3932 PRIV (vms_linkage_index) = rptr->addend;
3933 _bfd_vms_output_counted (recwr, sym->name);
3934 _bfd_vms_output_byte (recwr, 0);
3935 _bfd_vms_output_end_subrec (recwr);
3938 case ALPHA_R_CODEADDR:
3939 slen = strlen ((char *) sym->name);
3940 etir_output_check (abfd, section, curr_addr, slen);
3941 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STO_CA);
3942 _bfd_vms_output_counted (recwr, sym->name);
3943 _bfd_vms_output_end_subrec (recwr);
3948 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3949 etir_output_check (abfd, section, curr_addr,
3950 32 + 1 + strlen (udata->origname));
3951 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_NOP_GBL);
3952 _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
3953 _bfd_vms_output_long
3954 (recwr, (unsigned long) section->target_index);
3955 _bfd_vms_output_quad (recwr, rptr->address);
3956 _bfd_vms_output_long (recwr, (unsigned long) 0x47ff041f);
3957 _bfd_vms_output_long
3958 (recwr, (unsigned long) section->target_index);
3959 _bfd_vms_output_quad (recwr, rptr->addend);
3960 _bfd_vms_output_counted (recwr, udata->origname);
3961 _bfd_vms_output_end_subrec (recwr);
3965 _bfd_error_handler (_("Spurious ALPHA_R_BSR reloc"));
3970 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3971 etir_output_check (abfd, section, curr_addr,
3972 32 + 1 + strlen (udata->origname));
3973 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_LDA_GBL);
3974 _bfd_vms_output_long
3975 (recwr, (unsigned long) udata->lkindex + 1);
3976 _bfd_vms_output_long
3977 (recwr, (unsigned long) section->target_index);
3978 _bfd_vms_output_quad (recwr, rptr->address);
3979 _bfd_vms_output_long (recwr, (unsigned long) 0x237B0000);
3980 _bfd_vms_output_long
3981 (recwr, (unsigned long) udata->bsym->section->target_index);
3982 _bfd_vms_output_quad (recwr, rptr->addend);
3983 _bfd_vms_output_counted (recwr, udata->origname);
3984 _bfd_vms_output_end_subrec (recwr);
3989 = (struct evax_private_udata_struct *) rptr->sym_ptr_ptr;
3990 etir_output_check (abfd, section, curr_addr,
3991 32 + 1 + strlen (udata->origname));
3992 _bfd_vms_output_begin_subrec (recwr, ETIR__C_STC_BOH_GBL);
3993 _bfd_vms_output_long (recwr, (unsigned long) udata->lkindex);
3994 _bfd_vms_output_long
3995 (recwr, (unsigned long) section->target_index);
3996 _bfd_vms_output_quad (recwr, rptr->address);
3997 _bfd_vms_output_long (recwr, (unsigned long) 0xD3400000);
3998 _bfd_vms_output_long
3999 (recwr, (unsigned long) section->target_index);
4000 _bfd_vms_output_quad (recwr, rptr->addend);
4001 _bfd_vms_output_counted (recwr, udata->origname);
4002 _bfd_vms_output_end_subrec (recwr);
4006 _bfd_error_handler (_("Unhandled relocation %s"),
4013 } /* End of relocs loop. */
4015 if (!pass2_in_progress)
4017 /* Output rest of section. */
4018 if (curr_addr > section->size)
4019 _bfd_error_handler (_("Size error in section %A"), section);
4020 size = section->size - curr_addr;
4021 sto_imm (abfd, section, size, curr_data, curr_addr);
4027 pass2_in_progress = 1;
4033 else /* (section->flags & SEC_RELOC) */
4034 sto_imm (abfd, section, section->size, section->contents, 0);
4036 end_etir_record (abfd);
4039 _bfd_vms_output_alignment (recwr, 2);
4043 /* Write cached information into a file being written, at bfd_close. */
4046 alpha_vms_write_object_contents (bfd *abfd)
4048 vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd));
4050 if (abfd->flags & (EXEC_P | DYNAMIC))
4052 return alpha_vms_write_exec (abfd);
4056 if (abfd->section_count > 0) /* we have sections */
4058 if (!_bfd_vms_write_ehdr (abfd))
4060 if (!_bfd_vms_write_egsd (abfd))
4062 if (!_bfd_vms_write_etir (abfd, EOBJ__C_ETIR))
4064 if (!_bfd_vms_write_eeom (abfd))
4071 /* Debug stuff: nearest line. */
4073 #define SET_MODULE_PARSED(m) \
4074 do { if ((m)->name == NULL) (m)->name = ""; } while (0)
4075 #define IS_MODULE_PARSED(m) ((m)->name != NULL)
4077 /* Build a new module for the specified BFD. */
4079 static struct module *
4080 new_module (bfd *abfd)
4082 struct module *module
4083 = (struct module *) bfd_zalloc (abfd, sizeof (struct module));
4084 module->file_table_count = 16; /* Arbitrary. */
4086 = bfd_malloc (module->file_table_count * sizeof (struct fileinfo));
4090 /* Parse debug info for a module and internalize it. */
4093 parse_module (bfd *abfd, struct module *module, unsigned char *ptr,
4096 unsigned char *maxptr = ptr + length;
4097 unsigned char *src_ptr, *pcl_ptr;
4098 unsigned int prev_linum = 0, curr_linenum = 0;
4099 bfd_vma prev_pc = 0, curr_pc = 0;
4100 struct srecinfo *curr_srec, *srec;
4101 struct lineinfo *curr_line, *line;
4102 struct funcinfo *funcinfo;
4104 /* Initialize tables with zero element. */
4105 curr_srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
4106 module->srec_table = curr_srec;
4108 curr_line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
4109 module->line_table = curr_line;
4111 while (length == -1 || ptr < maxptr)
4113 /* The first byte is not counted in the recorded length. */
4114 int rec_length = bfd_getl16 (ptr) + 1;
4115 int rec_type = bfd_getl16 (ptr + 2);
4117 vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length, rec_type));
4119 if (length == -1 && rec_type == DST__K_MODEND)
4126 = _bfd_vms_save_counted_string (ptr + DST_S_B_MODBEG_NAME);
4133 vms_debug2 ((3, "module: %s\n", module->name));
4140 funcinfo = (struct funcinfo *)
4141 bfd_zalloc (abfd, sizeof (struct funcinfo));
4143 = _bfd_vms_save_counted_string (ptr + DST_S_B_RTNBEG_NAME);
4144 funcinfo->low = bfd_getl32 (ptr + DST_S_L_RTNBEG_ADDRESS);
4145 funcinfo->next = module->func_table;
4146 module->func_table = funcinfo;
4148 vms_debug2 ((3, "routine: %s at 0x%lx\n",
4149 funcinfo->name, (unsigned long) funcinfo->low));
4153 module->func_table->high = module->func_table->low
4154 + bfd_getl32 (ptr + DST_S_L_RTNEND_SIZE) - 1;
4156 if (module->func_table->high > module->high)
4157 module->high = module->func_table->high;
4159 vms_debug2 ((3, "end routine\n"));
4163 vms_debug2 ((3, "prologue\n"));
4167 vms_debug2 ((3, "epilog\n"));
4171 vms_debug2 ((3, "block\n"));
4175 vms_debug2 ((3, "end block\n"));
4179 src_ptr = ptr + DST_S_C_SOURCE_HEADER_SIZE;
4181 vms_debug2 ((3, "source info\n"));
4183 while (src_ptr < ptr + rec_length)
4185 int cmd = src_ptr[0], cmd_length, data;
4189 case DST__K_SRC_DECLFILE:
4192 = bfd_getl16 (src_ptr + DST_S_W_SRC_DF_FILEID);
4194 = _bfd_vms_save_counted_string (src_ptr
4195 + DST_S_B_SRC_DF_FILENAME);
4197 while (fileid >= module->file_table_count)
4199 module->file_table_count *= 2;
4201 = bfd_realloc (module->file_table,
4202 module->file_table_count
4203 * sizeof (struct fileinfo));
4206 module->file_table [fileid].name = filename;
4207 module->file_table [fileid].srec = 1;
4208 cmd_length = src_ptr[DST_S_B_SRC_DF_LENGTH] + 2;
4209 vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4210 fileid, module->file_table [fileid].name));
4214 case DST__K_SRC_DEFLINES_B:
4215 /* Perform the association and set the next higher index
4217 data = src_ptr[DST_S_B_SRC_UNSBYTE];
4218 srec = (struct srecinfo *)
4219 bfd_zalloc (abfd, sizeof (struct srecinfo));
4220 srec->line = curr_srec->line + data;
4221 srec->srec = curr_srec->srec + data;
4222 srec->sfile = curr_srec->sfile;
4223 curr_srec->next = srec;
4226 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data));
4229 case DST__K_SRC_DEFLINES_W:
4230 /* Perform the association and set the next higher index
4232 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4233 srec = (struct srecinfo *)
4234 bfd_zalloc (abfd, sizeof (struct srecinfo));
4235 srec->line = curr_srec->line + data;
4236 srec->srec = curr_srec->srec + data,
4237 srec->sfile = curr_srec->sfile;
4238 curr_srec->next = srec;
4241 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data));
4244 case DST__K_SRC_INCRLNUM_B:
4245 data = src_ptr[DST_S_B_SRC_UNSBYTE];
4246 curr_srec->line += data;
4248 vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data));
4251 case DST__K_SRC_SETFILE:
4252 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4253 curr_srec->sfile = data;
4254 curr_srec->srec = module->file_table[data].srec;
4256 vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data));
4259 case DST__K_SRC_SETLNUM_L:
4260 data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4261 curr_srec->line = data;
4263 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data));
4266 case DST__K_SRC_SETLNUM_W:
4267 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4268 curr_srec->line = data;
4270 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data));
4273 case DST__K_SRC_SETREC_L:
4274 data = bfd_getl32 (src_ptr + DST_S_L_SRC_UNSLONG);
4275 curr_srec->srec = data;
4276 module->file_table[curr_srec->sfile].srec = data;
4278 vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data));
4281 case DST__K_SRC_SETREC_W:
4282 data = bfd_getl16 (src_ptr + DST_S_W_SRC_UNSWORD);
4283 curr_srec->srec = data;
4284 module->file_table[curr_srec->sfile].srec = data;
4286 vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data));
4289 case DST__K_SRC_FORMFEED:
4291 vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4295 _bfd_error_handler (_("unknown source command %d"),
4301 src_ptr += cmd_length;
4305 case DST__K_LINE_NUM:
4306 pcl_ptr = ptr + DST_S_C_LINE_NUM_HEADER_SIZE;
4308 vms_debug2 ((3, "line info\n"));
4310 while (pcl_ptr < ptr + rec_length)
4312 /* The command byte is signed so we must sign-extend it. */
4313 int cmd = ((signed char *)pcl_ptr)[0], cmd_length, data;
4317 case DST__K_DELTA_PC_W:
4318 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4322 vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data));
4325 case DST__K_DELTA_PC_L:
4326 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4330 vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data));
4333 case DST__K_INCR_LINUM:
4334 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4335 curr_linenum += data;
4337 vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data));
4340 case DST__K_INCR_LINUM_W:
4341 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4342 curr_linenum += data;
4344 vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data));
4347 case DST__K_INCR_LINUM_L:
4348 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4349 curr_linenum += data;
4351 vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data));
4354 case DST__K_SET_LINUM_INCR:
4356 (_("DST__K_SET_LINUM_INCR not implemented"));
4360 case DST__K_SET_LINUM_INCR_W:
4362 (_("DST__K_SET_LINUM_INCR_W not implemented"));
4366 case DST__K_RESET_LINUM_INCR:
4368 (_("DST__K_RESET_LINUM_INCR not implemented"));
4372 case DST__K_BEG_STMT_MODE:
4374 (_("DST__K_BEG_STMT_MODE not implemented"));
4378 case DST__K_END_STMT_MODE:
4380 (_("DST__K_END_STMT_MODE not implemented"));
4384 case DST__K_SET_LINUM_B:
4385 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4386 curr_linenum = data;
4388 vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data));
4391 case DST__K_SET_LINUM:
4392 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4393 curr_linenum = data;
4395 vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data));
4398 case DST__K_SET_LINUM_L:
4399 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4400 curr_linenum = data;
4402 vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data));
4407 (_("DST__K_SET_PC not implemented"));
4411 case DST__K_SET_PC_W:
4413 (_("DST__K_SET_PC_W not implemented"));
4417 case DST__K_SET_PC_L:
4419 (_("DST__K_SET_PC_L not implemented"));
4423 case DST__K_SET_STMTNUM:
4425 (_("DST__K_SET_STMTNUM not implemented"));
4430 data = pcl_ptr[DST_S_B_PCLINE_UNSBYTE];
4433 vms_debug2 ((4, "DST__K_TERM: %d\n", data));
4437 data = bfd_getl16 (pcl_ptr + DST_S_W_PCLINE_UNSWORD);
4440 vms_debug2 ((4, "DST__K_TERM_W: %d\n", data));
4444 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4447 vms_debug2 ((4, "DST__K_TERM_L: %d\n", data));
4450 case DST__K_SET_ABS_PC:
4451 data = bfd_getl32 (pcl_ptr + DST_S_L_PCLINE_UNSLONG);
4454 vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data));
4463 vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4464 (unsigned long)curr_pc, curr_linenum));
4468 _bfd_error_handler (_("unknown line command %d"), cmd);
4474 if ((curr_linenum != prev_linum && curr_pc != prev_pc)
4476 || cmd == DST__K_DELTA_PC_L
4477 || cmd == DST__K_DELTA_PC_W)
4479 line = (struct lineinfo *)
4480 bfd_zalloc (abfd, sizeof (struct lineinfo));
4481 line->address = curr_pc;
4482 line->line = curr_linenum;
4484 curr_line->next = line;
4487 prev_linum = curr_linenum;
4489 vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4490 (unsigned long)curr_pc, curr_linenum));
4493 pcl_ptr += cmd_length;
4497 case 0x17: /* Undocumented type used by DEC C to declare equates. */
4498 vms_debug2 ((3, "undocumented type 0x17\n"));
4502 vms_debug2 ((3, "ignoring record\n"));
4510 /* Finalize tables with EOL marker. */
4511 srec = (struct srecinfo *) bfd_zalloc (abfd, sizeof (struct srecinfo));
4512 srec->line = (unsigned int) -1;
4513 srec->srec = (unsigned int) -1;
4514 curr_srec->next = srec;
4516 line = (struct lineinfo *) bfd_zalloc (abfd, sizeof (struct lineinfo));
4517 line->line = (unsigned int) -1;
4518 line->address = (bfd_vma) -1;
4519 curr_line->next = line;
4521 /* Advertise that this module has been parsed. This is needed
4522 because parsing can be either performed at module creation
4523 or deferred until debug info is consumed. */
4524 SET_MODULE_PARSED (module);
4527 /* Build the list of modules for the specified BFD. */
4529 static struct module *
4530 build_module_list (bfd *abfd)
4532 struct module *module, *list = NULL;
4535 if ((dmt = bfd_get_section_by_name (abfd, "$DMT$")))
4537 /* We have a DMT section so this must be an image. Parse the
4538 section and build the list of modules. This is sufficient
4539 since we can compute the start address and the end address
4540 of every module from the section contents. */
4541 bfd_size_type size = bfd_get_section_size (dmt);
4542 unsigned char *ptr, *end;
4544 ptr = (unsigned char *) bfd_alloc (abfd, size);
4548 if (! bfd_get_section_contents (abfd, dmt, ptr, 0, size))
4551 vms_debug2 ((2, "DMT\n"));
4557 /* Each header declares a module with its start offset and size
4558 of debug info in the DST section, as well as the count of
4559 program sections (i.e. address spans) it contains. */
4560 int modbeg = bfd_getl32 (ptr + DBG_S_L_DMT_MODBEG);
4561 int msize = bfd_getl32 (ptr + DBG_S_L_DST_SIZE);
4562 int count = bfd_getl16 (ptr + DBG_S_W_DMT_PSECT_COUNT);
4563 ptr += DBG_S_C_DMT_HEADER_SIZE;
4565 vms_debug2 ((3, "module: modbeg = %d, size = %d, count = %d\n",
4566 modbeg, msize, count));
4568 /* We create a 'module' structure for each program section since
4569 we only support contiguous addresses in a 'module' structure.
4570 As a consequence, the actual debug info in the DST section is
4571 shared and can be parsed multiple times; that doesn't seem to
4572 cause problems in practice. */
4575 int start = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_START);
4576 int length = bfd_getl32 (ptr + DBG_S_L_DMT_PSECT_LENGTH);
4577 module = new_module (abfd);
4578 module->modbeg = modbeg;
4579 module->size = msize;
4580 module->low = start;
4581 module->high = start + length;
4582 module->next = list;
4584 ptr += DBG_S_C_DMT_PSECT_SIZE;
4586 vms_debug2 ((4, "section: start = 0x%x, length = %d\n",
4593 /* We don't have a DMT section so this must be an object. Parse
4594 the module right now in order to compute its start address and
4596 void *dst = PRIV (dst_section)->contents;
4601 module = new_module (abfd);
4602 parse_module (abfd, module, PRIV (dst_section)->contents, -1);
4609 /* Calculate and return the name of the source file and the line nearest
4610 to the wanted location in the specified module. */
4613 module_find_nearest_line (bfd *abfd, struct module *module, bfd_vma addr,
4614 const char **file, const char **func,
4617 struct funcinfo *funcinfo;
4618 struct lineinfo *lineinfo;
4619 struct srecinfo *srecinfo;
4620 bfd_boolean ret = FALSE;
4622 /* Parse this module if that was not done at module creation. */
4623 if (! IS_MODULE_PARSED (module))
4625 unsigned int size = module->size;
4626 unsigned int modbeg = PRIV (dst_section)->filepos + module->modbeg;
4627 unsigned char *buffer = (unsigned char *) bfd_malloc (module->size);
4629 if (bfd_seek (abfd, modbeg, SEEK_SET) != 0
4630 || bfd_bread (buffer, size, abfd) != size)
4632 bfd_set_error (bfd_error_no_debug_section);
4636 parse_module (abfd, module, buffer, size);
4640 /* Find out the function (if any) that contains the address. */
4641 for (funcinfo = module->func_table; funcinfo; funcinfo = funcinfo->next)
4642 if (addr >= funcinfo->low && addr <= funcinfo->high)
4644 *func = funcinfo->name;
4649 /* Find out the source file and the line nearest to the address. */
4650 for (lineinfo = module->line_table; lineinfo; lineinfo = lineinfo->next)
4651 if (lineinfo->next && addr < lineinfo->next->address)
4653 for (srecinfo = module->srec_table; srecinfo; srecinfo = srecinfo->next)
4654 if (srecinfo->next && lineinfo->line < srecinfo->next->line)
4656 if (srecinfo->sfile > 0)
4658 *file = module->file_table[srecinfo->sfile].name;
4659 *line = srecinfo->srec + lineinfo->line - srecinfo->line;
4663 *file = module->name;
4664 *line = lineinfo->line;
4675 /* Provided a BFD, a section and an offset into the section, calculate and
4676 return the name of the source file and the line nearest to the wanted
4680 _bfd_vms_find_nearest_line (bfd *abfd,
4681 asymbol **symbols ATTRIBUTE_UNUSED,
4687 unsigned int *discriminator)
4689 struct module *module;
4691 /* What address are we looking for? */
4692 bfd_vma addr = section->vma + offset;
4700 /* We can't do anything if there is no DST (debug symbol table). */
4701 if (PRIV (dst_section) == NULL)
4704 /* Create the module list - if not already done. */
4705 if (PRIV (modules) == NULL)
4707 PRIV (modules) = build_module_list (abfd);
4708 if (PRIV (modules) == NULL)
4712 for (module = PRIV (modules); module; module = module->next)
4713 if (addr >= module->low && addr <= module->high)
4714 return module_find_nearest_line (abfd, module, addr, file, func, line);
4719 /* Canonicalizations. */
4720 /* Set name, value, section and flags of SYM from E. */
4723 alpha_vms_convert_symbol (bfd *abfd, struct vms_symbol_entry *e, asymbol *sym)
4732 flags = BSF_NO_FLAGS;
4738 if (e->flags & EGSY__V_WEAK)
4741 if (e->flags & EGSY__V_DEF)
4743 /* Symbol definition. */
4744 flags |= BSF_GLOBAL;
4745 if (e->flags & EGSY__V_NORM)
4746 flags |= BSF_FUNCTION;
4752 /* Symbol reference. */
4753 sec = bfd_und_section_ptr;
4758 /* A universal symbol is by definition global... */
4759 flags |= BSF_GLOBAL;
4761 /* ...and dynamic in shared libraries. */
4762 if (abfd->flags & DYNAMIC)
4763 flags |= BSF_DYNAMIC;
4765 if (e->flags & EGSY__V_WEAK)
4768 if (!(e->flags & EGSY__V_DEF))
4771 if (e->flags & EGSY__V_NORM)
4772 flags |= BSF_FUNCTION;
4775 /* sec = e->section; */
4776 sec = bfd_abs_section_ptr;
4791 /* Return the number of bytes required to store a vector of pointers
4792 to asymbols for all the symbols in the BFD abfd, including a
4793 terminal NULL pointer. If there are no symbols in the BFD,
4794 then return 0. If an error occurs, return -1. */
4797 alpha_vms_get_symtab_upper_bound (bfd *abfd)
4799 vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
4800 abfd, PRIV (gsd_sym_count)));
4802 return (PRIV (gsd_sym_count) + 1) * sizeof (asymbol *);
4805 /* Read the symbols from the BFD abfd, and fills in the vector
4806 location with pointers to the symbols and a trailing NULL.
4808 Return number of symbols read. */
4811 alpha_vms_canonicalize_symtab (bfd *abfd, asymbol **symbols)
4815 vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd));
4817 if (PRIV (csymbols) == NULL)
4819 PRIV (csymbols) = (asymbol **) bfd_alloc
4820 (abfd, PRIV (gsd_sym_count) * sizeof (asymbol *));
4822 /* Traverse table and fill symbols vector. */
4823 for (i = 0; i < PRIV (gsd_sym_count); i++)
4825 struct vms_symbol_entry *e = PRIV (syms)[i];
4828 sym = bfd_make_empty_symbol (abfd);
4829 if (sym == NULL || !alpha_vms_convert_symbol (abfd, e, sym))
4831 bfd_release (abfd, PRIV (csymbols));
4832 PRIV (csymbols) = NULL;
4836 PRIV (csymbols)[i] = sym;
4840 if (symbols != NULL)
4842 for (i = 0; i < PRIV (gsd_sym_count); i++)
4843 symbols[i] = PRIV (csymbols)[i];
4847 return PRIV (gsd_sym_count);
4850 /* Read and convert relocations from ETIR. We do it once for all sections. */
4853 alpha_vms_slurp_relocs (bfd *abfd)
4857 vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
4859 /* We slurp relocs only once, for all sections. */
4860 if (PRIV (reloc_done))
4862 PRIV (reloc_done) = TRUE;
4864 if (alpha_vms_canonicalize_symtab (abfd, NULL) < 0)
4867 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
4872 unsigned char *begin;
4875 bfd_reloc_code_real_type reloc_code;
4881 bfd_vma cur_address;
4883 unsigned char *cur_sym = NULL;
4885 bfd_vma cur_addend = 0;
4887 /* Skip non-ETIR records. */
4888 type = _bfd_vms_get_object_record (abfd);
4889 if (type == EOBJ__C_EEOM)
4891 if (type != EOBJ__C_ETIR)
4894 begin = PRIV (recrd.rec) + 4;
4895 end = PRIV (recrd.rec) + PRIV (recrd.rec_size);
4897 for (ptr = begin; ptr < end; ptr += length)
4901 cmd = bfd_getl16 (ptr);
4902 length = bfd_getl16 (ptr + 2);
4904 cur_address = vaddr;
4906 vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
4907 _bfd_vms_etir_name (cmd)));
4911 case ETIR__C_STA_GBL: /* ALPHA_R_REFLONG und_section, step 1 */
4912 /* ALPHA_R_REFQUAD und_section, step 1 */
4917 case ETIR__C_STA_PQ: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
4918 cur_psidx = bfd_getl32 (ptr + 4);
4919 cur_addend = bfd_getl64 (ptr + 8);
4923 case ETIR__C_CTL_SETRB:
4924 if (prev_cmd != ETIR__C_STA_PQ)
4927 /* xgettext:c-format */
4928 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd),
4929 _bfd_vms_etir_name (cmd));
4932 cur_psect = cur_psidx;
4938 case ETIR__C_STA_LW: /* ALPHA_R_REFLONG abs_section, step 1 */
4939 /* ALPHA_R_REFLONG und_section, step 2 */
4942 if (prev_cmd != ETIR__C_STA_GBL)
4945 /* xgettext:c-format */
4946 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
4947 _bfd_vms_etir_name (ETIR__C_STA_LW));
4951 cur_addend = bfd_getl32 (ptr + 4);
4955 case ETIR__C_STA_QW: /* ALPHA_R_REFQUAD abs_section, step 1 */
4956 /* ALPHA_R_REFQUAD und_section, step 2 */
4957 if (prev_cmd != -1 && prev_cmd != ETIR__C_STA_GBL)
4960 /* xgettext:c-format */
4961 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd),
4962 _bfd_vms_etir_name (ETIR__C_STA_QW));
4965 cur_addend = bfd_getl64 (ptr + 4);
4969 case ETIR__C_STO_LW: /* ALPHA_R_REFLONG und_section, step 4 */
4970 /* ALPHA_R_REFLONG abs_section, step 2 */
4971 /* ALPHA_R_REFLONG others, step 2 */
4972 if (prev_cmd != ETIR__C_OPR_ADD
4973 && prev_cmd != ETIR__C_STA_LW
4974 && prev_cmd != ETIR__C_STA_PQ)
4976 /* xgettext:c-format */
4977 _bfd_error_handler (_("Unknown reloc %s + %s"),
4978 _bfd_vms_etir_name (prev_cmd),
4979 _bfd_vms_etir_name (ETIR__C_STO_LW));
4982 reloc_code = BFD_RELOC_32;
4985 case ETIR__C_STO_QW: /* ALPHA_R_REFQUAD und_section, step 4 */
4986 /* ALPHA_R_REFQUAD abs_section, step 2 */
4987 if (prev_cmd != ETIR__C_OPR_ADD && prev_cmd != ETIR__C_STA_QW)
4989 /* xgettext:c-format */
4990 _bfd_error_handler (_("Unknown reloc %s + %s"),
4991 _bfd_vms_etir_name (prev_cmd),
4992 _bfd_vms_etir_name (ETIR__C_STO_QW));
4995 reloc_code = BFD_RELOC_64;
4998 case ETIR__C_STO_OFF: /* ALPHA_R_REFQUAD others, step 2 */
4999 if (prev_cmd != ETIR__C_STA_PQ)
5001 /* xgettext:c-format */
5002 _bfd_error_handler (_("Unknown reloc %s + %s"),
5003 _bfd_vms_etir_name (prev_cmd),
5004 _bfd_vms_etir_name (ETIR__C_STO_OFF));
5007 reloc_code = BFD_RELOC_64;
5010 case ETIR__C_OPR_ADD: /* ALPHA_R_REFLONG und_section, step 3 */
5011 /* ALPHA_R_REFQUAD und_section, step 3 */
5012 if (prev_cmd != ETIR__C_STA_LW && prev_cmd != ETIR__C_STA_QW)
5014 /* xgettext:c-format */
5015 _bfd_error_handler (_("Unknown reloc %s + %s"),
5016 _bfd_vms_etir_name (prev_cmd),
5017 _bfd_vms_etir_name (ETIR__C_OPR_ADD));
5020 prev_cmd = ETIR__C_OPR_ADD;
5023 case ETIR__C_STO_CA: /* ALPHA_R_CODEADDR */
5024 reloc_code = BFD_RELOC_ALPHA_CODEADDR;
5028 case ETIR__C_STO_GBL: /* ALPHA_R_REFQUAD und_section */
5029 reloc_code = BFD_RELOC_64;
5033 case ETIR__C_STO_GBL_LW: /* ALPHA_R_REFLONG und_section */
5034 reloc_code = BFD_RELOC_32;
5038 case ETIR__C_STC_LP_PSB: /* ALPHA_R_LINKAGE */
5039 reloc_code = BFD_RELOC_ALPHA_LINKAGE;
5043 case ETIR__C_STC_NOP_GBL: /* ALPHA_R_NOP */
5044 reloc_code = BFD_RELOC_ALPHA_NOP;
5047 case ETIR__C_STC_BSR_GBL: /* ALPHA_R_BSR */
5048 reloc_code = BFD_RELOC_ALPHA_BSR;
5051 case ETIR__C_STC_LDA_GBL: /* ALPHA_R_LDA */
5052 reloc_code = BFD_RELOC_ALPHA_LDA;
5055 case ETIR__C_STC_BOH_GBL: /* ALPHA_R_BOH */
5056 reloc_code = BFD_RELOC_ALPHA_BOH;
5060 cur_sym = ptr + 4 + 32;
5061 cur_address = bfd_getl64 (ptr + 4 + 8);
5062 cur_addend = bfd_getl64 (ptr + 4 + 24);
5065 case ETIR__C_STO_IMM:
5066 vaddr += bfd_getl32 (ptr + 4);
5070 _bfd_error_handler (_("Unknown reloc %s"),
5071 _bfd_vms_etir_name (cmd));
5077 struct vms_section_data_struct *vms_sec;
5080 /* Get section to which the relocation applies. */
5081 if (cur_psect < 0 || cur_psect > (int)PRIV (section_count))
5083 _bfd_error_handler (_("Invalid section index in ETIR"));
5087 if (PRIV (sections) == NULL)
5089 sec = PRIV (sections)[cur_psect];
5090 if (sec == bfd_abs_section_ptr)
5092 _bfd_error_handler (_("Relocation for non-REL psect"));
5096 vms_sec = vms_section_data (sec);
5098 /* Allocate a reloc entry. */
5099 if (sec->reloc_count >= vms_sec->reloc_max)
5101 if (vms_sec->reloc_max == 0)
5103 vms_sec->reloc_max = 64;
5104 sec->relocation = bfd_zmalloc
5105 (vms_sec->reloc_max * sizeof (arelent));
5109 vms_sec->reloc_max *= 2;
5110 sec->relocation = bfd_realloc
5111 (sec->relocation, vms_sec->reloc_max * sizeof (arelent));
5114 reloc = &sec->relocation[sec->reloc_count];
5117 reloc->howto = bfd_reloc_type_lookup (abfd, reloc_code);
5119 if (cur_sym != NULL)
5122 unsigned int symlen = *cur_sym;
5125 /* Linear search. */
5130 for (j = 0; j < PRIV (gsd_sym_count); j++)
5131 if (PRIV (syms)[j]->namelen == symlen
5132 && memcmp (PRIV (syms)[j]->name, cur_sym, symlen) == 0)
5134 sym = &PRIV (csymbols)[j];
5139 _bfd_error_handler (_("Unknown symbol in command %s"),
5140 _bfd_vms_etir_name (cmd));
5141 reloc->sym_ptr_ptr = NULL;
5144 reloc->sym_ptr_ptr = sym;
5146 else if (cur_psidx >= 0)
5148 if (PRIV (sections) == NULL)
5150 reloc->sym_ptr_ptr =
5151 PRIV (sections)[cur_psidx]->symbol_ptr_ptr;
5154 reloc->sym_ptr_ptr = NULL;
5156 reloc->address = cur_address;
5157 reloc->addend = cur_addend;
5159 vaddr += bfd_get_reloc_size (reloc->howto);
5168 vms_debug2 ((3, "alpha_vms_slurp_relocs: result = TRUE\n"));
5173 /* Return the number of bytes required to store the relocation
5174 information associated with the given section. */
5177 alpha_vms_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *section)
5179 alpha_vms_slurp_relocs (abfd);
5181 return (section->reloc_count + 1) * sizeof (arelent *);
5184 /* Convert relocations from VMS (external) form into BFD internal
5185 form. Return the number of relocations. */
5188 alpha_vms_canonicalize_reloc (bfd *abfd, asection *section, arelent **relptr,
5189 asymbol **symbols ATTRIBUTE_UNUSED)
5194 if (!alpha_vms_slurp_relocs (abfd))
5197 count = section->reloc_count;
5198 tblptr = section->relocation;
5201 *relptr++ = tblptr++;
5203 *relptr = (arelent *) NULL;
5204 return section->reloc_count;
5207 /* Install a new set of internal relocs. */
5209 #define alpha_vms_set_reloc _bfd_generic_set_reloc
5212 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
5214 /* How to process the various reloc types. */
5216 static bfd_reloc_status_type
5217 reloc_nil (bfd * abfd ATTRIBUTE_UNUSED,
5218 arelent *reloc ATTRIBUTE_UNUSED,
5219 asymbol *sym ATTRIBUTE_UNUSED,
5220 void * data ATTRIBUTE_UNUSED,
5221 asection *sec ATTRIBUTE_UNUSED,
5222 bfd *output_bfd ATTRIBUTE_UNUSED,
5223 char **error_message ATTRIBUTE_UNUSED)
5226 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd, output_bfd);
5227 vms_debug (2, "In section %s, symbol %s\n",
5228 sec->name, sym->name);
5229 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5230 reloc->sym_ptr_ptr[0]->name,
5231 (unsigned long)reloc->address,
5232 (unsigned long)reloc->addend, reloc->howto->name);
5233 vms_debug (2, "data at %p\n", data);
5234 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5237 return bfd_reloc_ok;
5240 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5241 from smaller values. Start with zero, widen, *then* decrement. */
5242 #define MINUS_ONE (((bfd_vma)0) - 1)
5244 static reloc_howto_type alpha_howto_table[] =
5246 HOWTO (ALPHA_R_IGNORE, /* Type. */
5247 0, /* Rightshift. */
5248 0, /* Size (0 = byte, 1 = short, 2 = long). */
5250 TRUE, /* PC relative. */
5252 complain_overflow_dont,/* Complain_on_overflow. */
5253 reloc_nil, /* Special_function. */
5254 "IGNORE", /* Name. */
5255 TRUE, /* Partial_inplace. */
5256 0, /* Source mask */
5258 TRUE), /* PC rel offset. */
5260 /* A 64 bit reference to a symbol. */
5261 HOWTO (ALPHA_R_REFQUAD, /* Type. */
5262 0, /* Rightshift. */
5263 4, /* Size (0 = byte, 1 = short, 2 = long). */
5265 FALSE, /* PC relative. */
5267 complain_overflow_bitfield, /* Complain_on_overflow. */
5268 reloc_nil, /* Special_function. */
5269 "REFQUAD", /* Name. */
5270 TRUE, /* Partial_inplace. */
5271 MINUS_ONE, /* Source mask. */
5272 MINUS_ONE, /* Dest mask. */
5273 FALSE), /* PC rel offset. */
5275 /* A 21 bit branch. The native assembler generates these for
5276 branches within the text segment, and also fills in the PC
5277 relative offset in the instruction. */
5278 HOWTO (ALPHA_R_BRADDR, /* Type. */
5279 2, /* Rightshift. */
5280 2, /* Size (0 = byte, 1 = short, 2 = long). */
5282 TRUE, /* PC relative. */
5284 complain_overflow_signed, /* Complain_on_overflow. */
5285 reloc_nil, /* Special_function. */
5286 "BRADDR", /* Name. */
5287 TRUE, /* Partial_inplace. */
5288 0x1fffff, /* Source mask. */
5289 0x1fffff, /* Dest mask. */
5290 FALSE), /* PC rel offset. */
5292 /* A hint for a jump to a register. */
5293 HOWTO (ALPHA_R_HINT, /* Type. */
5294 2, /* Rightshift. */
5295 1, /* Size (0 = byte, 1 = short, 2 = long). */
5297 TRUE, /* PC relative. */
5299 complain_overflow_dont,/* Complain_on_overflow. */
5300 reloc_nil, /* Special_function. */
5302 TRUE, /* Partial_inplace. */
5303 0x3fff, /* Source mask. */
5304 0x3fff, /* Dest mask. */
5305 FALSE), /* PC rel offset. */
5307 /* 16 bit PC relative offset. */
5308 HOWTO (ALPHA_R_SREL16, /* Type. */
5309 0, /* Rightshift. */
5310 1, /* Size (0 = byte, 1 = short, 2 = long). */
5312 TRUE, /* PC relative. */
5314 complain_overflow_signed, /* Complain_on_overflow. */
5315 reloc_nil, /* Special_function. */
5316 "SREL16", /* Name. */
5317 TRUE, /* Partial_inplace. */
5318 0xffff, /* Source mask. */
5319 0xffff, /* Dest mask. */
5320 FALSE), /* PC rel offset. */
5322 /* 32 bit PC relative offset. */
5323 HOWTO (ALPHA_R_SREL32, /* Type. */
5324 0, /* Rightshift. */
5325 2, /* Size (0 = byte, 1 = short, 2 = long). */
5327 TRUE, /* PC relative. */
5329 complain_overflow_signed, /* Complain_on_overflow. */
5330 reloc_nil, /* Special_function. */
5331 "SREL32", /* Name. */
5332 TRUE, /* Partial_inplace. */
5333 0xffffffff, /* Source mask. */
5334 0xffffffff, /* Dest mask. */
5335 FALSE), /* PC rel offset. */
5337 /* A 64 bit PC relative offset. */
5338 HOWTO (ALPHA_R_SREL64, /* Type. */
5339 0, /* Rightshift. */
5340 4, /* Size (0 = byte, 1 = short, 2 = long). */
5342 TRUE, /* PC relative. */
5344 complain_overflow_signed, /* Complain_on_overflow. */
5345 reloc_nil, /* Special_function. */
5346 "SREL64", /* Name. */
5347 TRUE, /* Partial_inplace. */
5348 MINUS_ONE, /* Source mask. */
5349 MINUS_ONE, /* Dest mask. */
5350 FALSE), /* PC rel offset. */
5352 /* Push a value on the reloc evaluation stack. */
5353 HOWTO (ALPHA_R_OP_PUSH, /* Type. */
5354 0, /* Rightshift. */
5355 0, /* Size (0 = byte, 1 = short, 2 = long). */
5357 FALSE, /* PC relative. */
5359 complain_overflow_dont,/* Complain_on_overflow. */
5360 reloc_nil, /* Special_function. */
5361 "OP_PUSH", /* Name. */
5362 FALSE, /* Partial_inplace. */
5363 0, /* Source mask. */
5365 FALSE), /* PC rel offset. */
5367 /* Store the value from the stack at the given address. Store it in
5368 a bitfield of size r_size starting at bit position r_offset. */
5369 HOWTO (ALPHA_R_OP_STORE, /* Type. */
5370 0, /* Rightshift. */
5371 4, /* Size (0 = byte, 1 = short, 2 = long). */
5373 FALSE, /* PC relative. */
5375 complain_overflow_dont,/* Complain_on_overflow. */
5376 reloc_nil, /* Special_function. */
5377 "OP_STORE", /* Name. */
5378 FALSE, /* Partial_inplace. */
5379 0, /* Source mask. */
5380 MINUS_ONE, /* Dest mask. */
5381 FALSE), /* PC rel offset. */
5383 /* Subtract the reloc address from the value on the top of the
5384 relocation stack. */
5385 HOWTO (ALPHA_R_OP_PSUB, /* Type. */
5386 0, /* Rightshift. */
5387 0, /* Size (0 = byte, 1 = short, 2 = long). */
5389 FALSE, /* PC relative. */
5391 complain_overflow_dont,/* Complain_on_overflow. */
5392 reloc_nil, /* Special_function. */
5393 "OP_PSUB", /* Name. */
5394 FALSE, /* Partial_inplace. */
5395 0, /* Source mask. */
5397 FALSE), /* PC rel offset. */
5399 /* Shift the value on the top of the relocation stack right by the
5401 HOWTO (ALPHA_R_OP_PRSHIFT, /* Type. */
5402 0, /* Rightshift. */
5403 0, /* Size (0 = byte, 1 = short, 2 = long). */
5405 FALSE, /* PC relative. */
5407 complain_overflow_dont,/* Complain_on_overflow. */
5408 reloc_nil, /* Special_function. */
5409 "OP_PRSHIFT", /* Name. */
5410 FALSE, /* Partial_inplace. */
5411 0, /* Source mask. */
5413 FALSE), /* PC rel offset. */
5415 /* Hack. Linkage is done by linker. */
5416 HOWTO (ALPHA_R_LINKAGE, /* Type. */
5417 0, /* Rightshift. */
5418 8, /* Size (0 = byte, 1 = short, 2 = long). */
5420 FALSE, /* PC relative. */
5422 complain_overflow_dont,/* Complain_on_overflow. */
5423 reloc_nil, /* Special_function. */
5424 "LINKAGE", /* Name. */
5425 FALSE, /* Partial_inplace. */
5426 0, /* Source mask. */
5428 FALSE), /* PC rel offset. */
5430 /* A 32 bit reference to a symbol. */
5431 HOWTO (ALPHA_R_REFLONG, /* Type. */
5432 0, /* Rightshift. */
5433 2, /* Size (0 = byte, 1 = short, 2 = long). */
5435 FALSE, /* PC relative. */
5437 complain_overflow_bitfield, /* Complain_on_overflow. */
5438 reloc_nil, /* Special_function. */
5439 "REFLONG", /* Name. */
5440 TRUE, /* Partial_inplace. */
5441 0xffffffff, /* Source mask. */
5442 0xffffffff, /* Dest mask. */
5443 FALSE), /* PC rel offset. */
5445 /* A 64 bit reference to a procedure, written as 32 bit value. */
5446 HOWTO (ALPHA_R_CODEADDR, /* Type. */
5447 0, /* Rightshift. */
5448 4, /* Size (0 = byte, 1 = short, 2 = long). */
5450 FALSE, /* PC relative. */
5452 complain_overflow_signed,/* Complain_on_overflow. */
5453 reloc_nil, /* Special_function. */
5454 "CODEADDR", /* Name. */
5455 FALSE, /* Partial_inplace. */
5456 0xffffffff, /* Source mask. */
5457 0xffffffff, /* Dest mask. */
5458 FALSE), /* PC rel offset. */
5460 HOWTO (ALPHA_R_NOP, /* Type. */
5461 0, /* Rightshift. */
5462 3, /* Size (0 = byte, 1 = short, 2 = long). */
5464 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5465 because the calculations for the 3 relocations are the same.
5466 See B.4.5.2 of the OpenVMS Linker Utility Manual. */
5467 TRUE, /* PC relative. */
5469 complain_overflow_dont,/* Complain_on_overflow. */
5470 reloc_nil, /* Special_function. */
5472 FALSE, /* Partial_inplace. */
5473 0xffffffff, /* Source mask. */
5474 0xffffffff, /* Dest mask. */
5475 FALSE), /* PC rel offset. */
5477 HOWTO (ALPHA_R_BSR, /* Type. */
5478 0, /* Rightshift. */
5479 3, /* Size (0 = byte, 1 = short, 2 = long). */
5481 TRUE, /* PC relative. */
5483 complain_overflow_dont,/* Complain_on_overflow. */
5484 reloc_nil, /* Special_function. */
5486 FALSE, /* Partial_inplace. */
5487 0xffffffff, /* Source mask. */
5488 0xffffffff, /* Dest mask. */
5489 FALSE), /* PC rel offset. */
5491 HOWTO (ALPHA_R_LDA, /* Type. */
5492 0, /* Rightshift. */
5493 3, /* Size (0 = byte, 1 = short, 2 = long). */
5495 FALSE, /* PC relative. */
5497 complain_overflow_dont,/* Complain_on_overflow. */
5498 reloc_nil, /* Special_function. */
5500 FALSE, /* Partial_inplace. */
5501 0xffffffff, /* Source mask. */
5502 0xffffffff, /* Dest mask. */
5503 FALSE), /* PC rel offset. */
5505 HOWTO (ALPHA_R_BOH, /* Type. */
5506 0, /* Rightshift. */
5507 3, /* Size (0 = byte, 1 = short, 2 = long, 3 = nil). */
5509 TRUE, /* PC relative. */
5511 complain_overflow_dont,/* Complain_on_overflow. */
5512 reloc_nil, /* Special_function. */
5514 FALSE, /* Partial_inplace. */
5515 0xffffffff, /* Source mask. */
5516 0xffffffff, /* Dest mask. */
5517 FALSE), /* PC rel offset. */
5520 /* Return a pointer to a howto structure which, when invoked, will perform
5521 the relocation code on data from the architecture noted. */
5523 static const struct reloc_howto_struct *
5524 alpha_vms_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
5525 bfd_reloc_code_real_type code)
5529 vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd, code));
5533 case BFD_RELOC_16: alpha_type = ALPHA_R_SREL16; break;
5534 case BFD_RELOC_32: alpha_type = ALPHA_R_REFLONG; break;
5535 case BFD_RELOC_64: alpha_type = ALPHA_R_REFQUAD; break;
5536 case BFD_RELOC_CTOR: alpha_type = ALPHA_R_REFQUAD; break;
5537 case BFD_RELOC_23_PCREL_S2: alpha_type = ALPHA_R_BRADDR; break;
5538 case BFD_RELOC_ALPHA_HINT: alpha_type = ALPHA_R_HINT; break;
5539 case BFD_RELOC_16_PCREL: alpha_type = ALPHA_R_SREL16; break;
5540 case BFD_RELOC_32_PCREL: alpha_type = ALPHA_R_SREL32; break;
5541 case BFD_RELOC_64_PCREL: alpha_type = ALPHA_R_SREL64; break;
5542 case BFD_RELOC_ALPHA_LINKAGE: alpha_type = ALPHA_R_LINKAGE; break;
5543 case BFD_RELOC_ALPHA_CODEADDR: alpha_type = ALPHA_R_CODEADDR; break;
5544 case BFD_RELOC_ALPHA_NOP: alpha_type = ALPHA_R_NOP; break;
5545 case BFD_RELOC_ALPHA_BSR: alpha_type = ALPHA_R_BSR; break;
5546 case BFD_RELOC_ALPHA_LDA: alpha_type = ALPHA_R_LDA; break;
5547 case BFD_RELOC_ALPHA_BOH: alpha_type = ALPHA_R_BOH; break;
5549 _bfd_error_handler (_("reloc (%d) is *UNKNOWN*"), code);
5552 vms_debug2 ((2, "reloc is %s\n", alpha_howto_table[alpha_type].name));
5553 return & alpha_howto_table[alpha_type];
5556 static reloc_howto_type *
5557 alpha_vms_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
5563 i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
5565 if (alpha_howto_table[i].name != NULL
5566 && strcasecmp (alpha_howto_table[i].name, r_name) == 0)
5567 return &alpha_howto_table[i];
5573 alpha_vms_get_synthetic_symtab (bfd *abfd,
5574 long symcount ATTRIBUTE_UNUSED,
5575 asymbol **usyms ATTRIBUTE_UNUSED,
5576 long dynsymcount ATTRIBUTE_UNUSED,
5577 asymbol **dynsyms ATTRIBUTE_UNUSED,
5584 syms = (asymbol *) bfd_malloc (PRIV (norm_sym_count) * sizeof (asymbol));
5589 for (i = 0; i < PRIV (gsd_sym_count); i++)
5591 struct vms_symbol_entry *e = PRIV (syms)[i];
5602 flags = BSF_LOCAL | BSF_SYNTHETIC;
5609 if ((e->flags & EGSY__V_DEF) && (e->flags & EGSY__V_NORM))
5611 value = e->code_value;
5612 sec = e->code_section;
5623 sname = bfd_alloc (abfd, l + 5);
5626 memcpy (sname, name, l);
5627 memcpy (sname + l, "..en", 5);
5634 sym->udata.p = NULL;
5643 vms_time_to_str (unsigned char *buf)
5645 time_t t = vms_rawtime_to_time_t (buf);
5646 char *res = ctime (&t);
5649 res = "*invalid time*";
5656 evax_bfd_print_emh (FILE *file, unsigned char *rec, unsigned int rec_len)
5658 struct vms_emh_common *emh = (struct vms_emh_common *)rec;
5659 unsigned int subtype;
5661 subtype = (unsigned)bfd_getl16 (emh->subtyp);
5663 /* xgettext:c-format */
5664 fprintf (file, _(" EMH %u (len=%u): "), subtype, rec_len);
5666 /* PR 21618: Check for invalid lengths. */
5667 if (rec_len < sizeof (* emh))
5669 fprintf (file, _(" Error: The length is less than the length of an EMH record\n"));
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);
5737 /* PR 21618: Check for invalid lengths. */
5738 if (rec_len < sizeof (* eeom))
5740 fprintf (file, _(" Error: The length is less than the length of an EEOM record\n"));
5744 fprintf (file, _(" number of cond linkage pairs: %u\n"),
5745 (unsigned)bfd_getl32 (eeom->total_lps));
5746 fprintf (file, _(" completion code: %u\n"),
5747 (unsigned)bfd_getl16 (eeom->comcod));
5750 fprintf (file, _(" transfer addr flags: 0x%02x\n"), eeom->tfrflg);
5751 fprintf (file, _(" transfer addr psect: %u\n"),
5752 (unsigned)bfd_getl32 (eeom->psindx));
5753 fprintf (file, _(" transfer address : 0x%08x\n"),
5754 (unsigned)bfd_getl32 (eeom->tfradr));
5759 exav_bfd_print_egsy_flags (unsigned int flags, FILE *file)
5761 if (flags & EGSY__V_WEAK)
5762 fputs (_(" WEAK"), file);
5763 if (flags & EGSY__V_DEF)
5764 fputs (_(" DEF"), file);
5765 if (flags & EGSY__V_UNI)
5766 fputs (_(" UNI"), file);
5767 if (flags & EGSY__V_REL)
5768 fputs (_(" REL"), file);
5769 if (flags & EGSY__V_COMM)
5770 fputs (_(" COMM"), file);
5771 if (flags & EGSY__V_VECEP)
5772 fputs (_(" VECEP"), file);
5773 if (flags & EGSY__V_NORM)
5774 fputs (_(" NORM"), file);
5775 if (flags & EGSY__V_QUAD_VAL)
5776 fputs (_(" QVAL"), file);
5780 evax_bfd_print_egsd_flags (FILE *file, unsigned int flags)
5782 if (flags & EGPS__V_PIC)
5783 fputs (_(" PIC"), file);
5784 if (flags & EGPS__V_LIB)
5785 fputs (_(" LIB"), file);
5786 if (flags & EGPS__V_OVR)
5787 fputs (_(" OVR"), file);
5788 if (flags & EGPS__V_REL)
5789 fputs (_(" REL"), file);
5790 if (flags & EGPS__V_GBL)
5791 fputs (_(" GBL"), file);
5792 if (flags & EGPS__V_SHR)
5793 fputs (_(" SHR"), file);
5794 if (flags & EGPS__V_EXE)
5795 fputs (_(" EXE"), file);
5796 if (flags & EGPS__V_RD)
5797 fputs (_(" RD"), file);
5798 if (flags & EGPS__V_WRT)
5799 fputs (_(" WRT"), file);
5800 if (flags & EGPS__V_VEC)
5801 fputs (_(" VEC"), file);
5802 if (flags & EGPS__V_NOMOD)
5803 fputs (_(" NOMOD"), file);
5804 if (flags & EGPS__V_COM)
5805 fputs (_(" COM"), file);
5806 if (flags & EGPS__V_ALLOC_64BIT)
5807 fputs (_(" 64B"), file);
5811 evax_bfd_print_egsd (FILE *file, unsigned char *rec, unsigned int rec_len)
5813 unsigned int off = sizeof (struct vms_egsd);
5816 fprintf (file, _(" EGSD (len=%u):\n"), rec_len);
5819 for (off = sizeof (struct vms_egsd); off < rec_len; )
5821 struct vms_egsd_entry *e = (struct vms_egsd_entry *)(rec + off);
5825 type = (unsigned)bfd_getl16 (e->gsdtyp);
5826 len = (unsigned)bfd_getl16 (e->gsdsiz);
5828 /* xgettext:c-format */
5829 fprintf (file, _(" EGSD entry %2u (type: %u, len: %u): "),
5833 if (off + len > rec_len || off + len < off)
5835 fprintf (file, _(" Error: length larger than remaining space in record\n"));
5843 struct vms_egps *egps = (struct vms_egps *)e;
5844 unsigned int flags = bfd_getl16 (egps->flags);
5847 fprintf (file, _("PSC - Program section definition\n"));
5848 fprintf (file, _(" alignment : 2**%u\n"), egps->align);
5849 fprintf (file, _(" flags : 0x%04x"), flags);
5850 evax_bfd_print_egsd_flags (file, flags);
5852 l = bfd_getl32 (egps->alloc);
5853 fprintf (file, _(" alloc (len): %u (0x%08x)\n"), l, l);
5854 fprintf (file, _(" name : %.*s\n"),
5855 egps->namlng, egps->name);
5860 struct vms_esgps *esgps = (struct vms_esgps *)e;
5861 unsigned int flags = bfd_getl16 (esgps->flags);
5864 fprintf (file, _("SPSC - Shared Image Program section def\n"));
5865 fprintf (file, _(" alignment : 2**%u\n"), esgps->align);
5866 fprintf (file, _(" flags : 0x%04x"), flags);
5867 evax_bfd_print_egsd_flags (file, flags);
5869 l = bfd_getl32 (esgps->alloc);
5870 fprintf (file, _(" alloc (len) : %u (0x%08x)\n"), l, l);
5871 fprintf (file, _(" image offset : 0x%08x\n"),
5872 (unsigned int)bfd_getl32 (esgps->base));
5873 fprintf (file, _(" symvec offset : 0x%08x\n"),
5874 (unsigned int)bfd_getl32 (esgps->value));
5875 fprintf (file, _(" name : %.*s\n"),
5876 esgps->namlng, esgps->name);
5881 struct vms_egsy *egsy = (struct vms_egsy *)e;
5882 unsigned int flags = bfd_getl16 (egsy->flags);
5884 if (flags & EGSY__V_DEF)
5886 struct vms_esdf *esdf = (struct vms_esdf *)e;
5888 fprintf (file, _("SYM - Global symbol definition\n"));
5889 fprintf (file, _(" flags: 0x%04x"), flags);
5890 exav_bfd_print_egsy_flags (flags, file);
5892 fprintf (file, _(" psect offset: 0x%08x\n"),
5893 (unsigned)bfd_getl32 (esdf->value));
5894 if (flags & EGSY__V_NORM)
5896 fprintf (file, _(" code address: 0x%08x\n"),
5897 (unsigned)bfd_getl32 (esdf->code_address));
5898 fprintf (file, _(" psect index for entry point : %u\n"),
5899 (unsigned)bfd_getl32 (esdf->ca_psindx));
5901 fprintf (file, _(" psect index : %u\n"),
5902 (unsigned)bfd_getl32 (esdf->psindx));
5903 fprintf (file, _(" name : %.*s\n"),
5904 esdf->namlng, esdf->name);
5908 struct vms_esrf *esrf = (struct vms_esrf *)e;
5910 fprintf (file, _("SYM - Global symbol reference\n"));
5911 fprintf (file, _(" name : %.*s\n"),
5912 esrf->namlng, esrf->name);
5918 struct vms_eidc *eidc = (struct vms_eidc *)e;
5919 unsigned int flags = bfd_getl32 (eidc->flags);
5922 fprintf (file, _("IDC - Ident Consistency check\n"));
5923 fprintf (file, _(" flags : 0x%08x"), flags);
5924 if (flags & EIDC__V_BINIDENT)
5925 fputs (" BINDENT", file);
5927 fprintf (file, _(" id match : %x\n"),
5928 (flags >> EIDC__V_IDMATCH_SH) & EIDC__V_IDMATCH_MASK);
5929 fprintf (file, _(" error severity: %x\n"),
5930 (flags >> EIDC__V_ERRSEV_SH) & EIDC__V_ERRSEV_MASK);
5932 fprintf (file, _(" entity name : %.*s\n"), p[0], p + 1);
5934 fprintf (file, _(" object name : %.*s\n"), p[0], p + 1);
5936 if (flags & EIDC__V_BINIDENT)
5937 fprintf (file, _(" binary ident : 0x%08x\n"),
5938 (unsigned)bfd_getl32 (p + 1));
5940 fprintf (file, _(" ascii ident : %.*s\n"), p[0], p + 1);
5945 struct vms_egst *egst = (struct vms_egst *)e;
5946 unsigned int flags = bfd_getl16 (egst->header.flags);
5948 fprintf (file, _("SYMG - Universal symbol definition\n"));
5949 fprintf (file, _(" flags: 0x%04x"), flags);
5950 exav_bfd_print_egsy_flags (flags, file);
5952 fprintf (file, _(" symbol vector offset: 0x%08x\n"),
5953 (unsigned)bfd_getl32 (egst->value));
5954 fprintf (file, _(" entry point: 0x%08x\n"),
5955 (unsigned)bfd_getl32 (egst->lp_1));
5956 fprintf (file, _(" proc descr : 0x%08x\n"),
5957 (unsigned)bfd_getl32 (egst->lp_2));
5958 fprintf (file, _(" psect index: %u\n"),
5959 (unsigned)bfd_getl32 (egst->psindx));
5960 fprintf (file, _(" name : %.*s\n"),
5961 egst->namlng, egst->name);
5966 struct vms_esdfv *esdfv = (struct vms_esdfv *)e;
5967 unsigned int flags = bfd_getl16 (esdfv->flags);
5969 fprintf (file, _("SYMV - Vectored symbol definition\n"));
5970 fprintf (file, _(" flags: 0x%04x"), flags);
5971 exav_bfd_print_egsy_flags (flags, file);
5973 fprintf (file, _(" vector : 0x%08x\n"),
5974 (unsigned)bfd_getl32 (esdfv->vector));
5975 fprintf (file, _(" psect offset: %u\n"),
5976 (unsigned)bfd_getl32 (esdfv->value));
5977 fprintf (file, _(" psect index : %u\n"),
5978 (unsigned)bfd_getl32 (esdfv->psindx));
5979 fprintf (file, _(" name : %.*s\n"),
5980 esdfv->namlng, esdfv->name);
5985 struct vms_esdfm *esdfm = (struct vms_esdfm *)e;
5986 unsigned int flags = bfd_getl16 (esdfm->flags);
5988 fprintf (file, _("SYMM - Global symbol definition with version\n"));
5989 fprintf (file, _(" flags: 0x%04x"), flags);
5990 exav_bfd_print_egsy_flags (flags, file);
5992 fprintf (file, _(" version mask: 0x%08x\n"),
5993 (unsigned)bfd_getl32 (esdfm->version_mask));
5994 fprintf (file, _(" psect offset: %u\n"),
5995 (unsigned)bfd_getl32 (esdfm->value));
5996 fprintf (file, _(" psect index : %u\n"),
5997 (unsigned)bfd_getl32 (esdfm->psindx));
5998 fprintf (file, _(" name : %.*s\n"),
5999 esdfm->namlng, esdfm->name);
6003 fprintf (file, _("unhandled egsd entry type %u\n"), type);
6011 evax_bfd_print_hex (FILE *file, const char *pfx,
6012 const unsigned char *buf, unsigned int len)
6018 for (i = 0; i < len; i++)
6022 fprintf (file, " %02x", buf[i]);
6035 evax_bfd_print_etir_stc_ir (FILE *file, const unsigned char *buf, int is_ps)
6037 /* xgettext:c-format */
6038 fprintf (file, _(" linkage index: %u, replacement insn: 0x%08x\n"),
6039 (unsigned)bfd_getl32 (buf),
6040 (unsigned)bfd_getl32 (buf + 16));
6041 /* xgettext:c-format */
6042 fprintf (file, _(" psect idx 1: %u, offset 1: 0x%08x %08x\n"),
6043 (unsigned)bfd_getl32 (buf + 4),
6044 (unsigned)bfd_getl32 (buf + 12),
6045 (unsigned)bfd_getl32 (buf + 8));
6046 /* xgettext:c-format */
6047 fprintf (file, _(" psect idx 2: %u, offset 2: 0x%08x %08x\n"),
6048 (unsigned)bfd_getl32 (buf + 20),
6049 (unsigned)bfd_getl32 (buf + 28),
6050 (unsigned)bfd_getl32 (buf + 24));
6052 /* xgettext:c-format */
6053 fprintf (file, _(" psect idx 3: %u, offset 3: 0x%08x %08x\n"),
6054 (unsigned)bfd_getl32 (buf + 32),
6055 (unsigned)bfd_getl32 (buf + 40),
6056 (unsigned)bfd_getl32 (buf + 36));
6058 fprintf (file, _(" global name: %.*s\n"), buf[32], buf + 33);
6062 evax_bfd_print_etir (FILE *file, const char *name,
6063 unsigned char *rec, unsigned int rec_len)
6065 unsigned int off = sizeof (struct vms_egsd);
6066 unsigned int sec_len = 0;
6068 /* xgettext:c-format */
6069 fprintf (file, _(" %s (len=%u+%u):\n"), name,
6070 (unsigned)(rec_len - sizeof (struct vms_eobjrec)),
6071 (unsigned)sizeof (struct vms_eobjrec));
6073 for (off = sizeof (struct vms_eobjrec); off < rec_len; )
6075 struct vms_etir *etir = (struct vms_etir *)(rec + off);
6080 type = bfd_getl16 (etir->rectyp);
6081 size = bfd_getl16 (etir->size);
6082 buf = rec + off + sizeof (struct vms_etir);
6084 if (off + size > rec_len || off + size < off)
6086 fprintf (file, _(" Error: length larger than remaining space in record\n"));
6090 /* xgettext:c-format */
6091 fprintf (file, _(" (type: %3u, size: 4+%3u): "), type, size - 4);
6094 case ETIR__C_STA_GBL:
6095 fprintf (file, _("STA_GBL (stack global) %.*s\n"),
6098 case ETIR__C_STA_LW:
6099 fprintf (file, _("STA_LW (stack longword) 0x%08x\n"),
6100 (unsigned)bfd_getl32 (buf));
6102 case ETIR__C_STA_QW:
6103 fprintf (file, _("STA_QW (stack quadword) 0x%08x %08x\n"),
6104 (unsigned)bfd_getl32 (buf + 4),
6105 (unsigned)bfd_getl32 (buf + 0));
6107 case ETIR__C_STA_PQ:
6108 fprintf (file, _("STA_PQ (stack psect base + offset)\n"));
6109 /* xgettext:c-format */
6110 fprintf (file, _(" psect: %u, offset: 0x%08x %08x\n"),
6111 (unsigned)bfd_getl32 (buf + 0),
6112 (unsigned)bfd_getl32 (buf + 8),
6113 (unsigned)bfd_getl32 (buf + 4));
6115 case ETIR__C_STA_LI:
6116 fprintf (file, _("STA_LI (stack literal)\n"));
6118 case ETIR__C_STA_MOD:
6119 fprintf (file, _("STA_MOD (stack module)\n"));
6121 case ETIR__C_STA_CKARG:
6122 fprintf (file, _("STA_CKARG (compare procedure argument)\n"));
6126 fprintf (file, _("STO_B (store byte)\n"));
6129 fprintf (file, _("STO_W (store word)\n"));
6131 case ETIR__C_STO_LW:
6132 fprintf (file, _("STO_LW (store longword)\n"));
6134 case ETIR__C_STO_QW:
6135 fprintf (file, _("STO_QW (store quadword)\n"));
6137 case ETIR__C_STO_IMMR:
6139 unsigned int len = bfd_getl32 (buf);
6141 _("STO_IMMR (store immediate repeat) %u bytes\n"),
6143 evax_bfd_print_hex (file, " ", buf + 4, len);
6147 case ETIR__C_STO_GBL:
6148 fprintf (file, _("STO_GBL (store global) %.*s\n"),
6151 case ETIR__C_STO_CA:
6152 fprintf (file, _("STO_CA (store code address) %.*s\n"),
6155 case ETIR__C_STO_RB:
6156 fprintf (file, _("STO_RB (store relative branch)\n"));
6158 case ETIR__C_STO_AB:
6159 fprintf (file, _("STO_AB (store absolute branch)\n"));
6161 case ETIR__C_STO_OFF:
6162 fprintf (file, _("STO_OFF (store offset to psect)\n"));
6164 case ETIR__C_STO_IMM:
6166 unsigned int len = bfd_getl32 (buf);
6168 _("STO_IMM (store immediate) %u bytes\n"),
6170 evax_bfd_print_hex (file, " ", buf + 4, len);
6174 case ETIR__C_STO_GBL_LW:
6175 fprintf (file, _("STO_GBL_LW (store global longword) %.*s\n"),
6178 case ETIR__C_STO_LP_PSB:
6179 fprintf (file, _("STO_OFF (store LP with procedure signature)\n"));
6181 case ETIR__C_STO_HINT_GBL:
6182 fprintf (file, _("STO_BR_GBL (store branch global) *todo*\n"));
6184 case ETIR__C_STO_HINT_PS:
6185 fprintf (file, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6188 case ETIR__C_OPR_NOP:
6189 fprintf (file, _("OPR_NOP (no-operation)\n"));
6191 case ETIR__C_OPR_ADD:
6192 fprintf (file, _("OPR_ADD (add)\n"));
6194 case ETIR__C_OPR_SUB:
6195 fprintf (file, _("OPR_SUB (substract)\n"));
6197 case ETIR__C_OPR_MUL:
6198 fprintf (file, _("OPR_MUL (multiply)\n"));
6200 case ETIR__C_OPR_DIV:
6201 fprintf (file, _("OPR_DIV (divide)\n"));
6203 case ETIR__C_OPR_AND:
6204 fprintf (file, _("OPR_AND (logical and)\n"));
6206 case ETIR__C_OPR_IOR:
6207 fprintf (file, _("OPR_IOR (logical inclusive or)\n"));
6209 case ETIR__C_OPR_EOR:
6210 fprintf (file, _("OPR_EOR (logical exclusive or)\n"));
6212 case ETIR__C_OPR_NEG:
6213 fprintf (file, _("OPR_NEG (negate)\n"));
6215 case ETIR__C_OPR_COM:
6216 fprintf (file, _("OPR_COM (complement)\n"));
6218 case ETIR__C_OPR_INSV:
6219 fprintf (file, _("OPR_INSV (insert field)\n"));
6221 case ETIR__C_OPR_ASH:
6222 fprintf (file, _("OPR_ASH (arithmetic shift)\n"));
6224 case ETIR__C_OPR_USH:
6225 fprintf (file, _("OPR_USH (unsigned shift)\n"));
6227 case ETIR__C_OPR_ROT:
6228 fprintf (file, _("OPR_ROT (rotate)\n"));
6230 case ETIR__C_OPR_SEL:
6231 fprintf (file, _("OPR_SEL (select)\n"));
6233 case ETIR__C_OPR_REDEF:
6234 fprintf (file, _("OPR_REDEF (redefine symbol to curr location)\n"));
6236 case ETIR__C_OPR_DFLIT:
6237 fprintf (file, _("OPR_REDEF (define a literal)\n"));
6240 case ETIR__C_STC_LP:
6241 fprintf (file, _("STC_LP (store cond linkage pair)\n"));
6243 case ETIR__C_STC_LP_PSB:
6245 _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6246 /* xgettext:c-format */
6247 fprintf (file, _(" linkage index: %u, procedure: %.*s\n"),
6248 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6249 buf += 4 + 1 + buf[4];
6250 fprintf (file, _(" signature: %.*s\n"), buf[0], buf + 1);
6252 case ETIR__C_STC_GBL:
6253 fprintf (file, _("STC_GBL (store cond global)\n"));
6254 /* xgettext:c-format */
6255 fprintf (file, _(" linkage index: %u, global: %.*s\n"),
6256 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6258 case ETIR__C_STC_GCA:
6259 fprintf (file, _("STC_GCA (store cond code address)\n"));
6260 /* xgettext:c-format */
6261 fprintf (file, _(" linkage index: %u, procedure name: %.*s\n"),
6262 (unsigned)bfd_getl32 (buf), buf[4], buf + 5);
6264 case ETIR__C_STC_PS:
6265 fprintf (file, _("STC_PS (store cond psect + offset)\n"));
6267 /* xgettext:c-format */
6268 _(" linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6269 (unsigned)bfd_getl32 (buf),
6270 (unsigned)bfd_getl32 (buf + 4),
6271 (unsigned)bfd_getl32 (buf + 12),
6272 (unsigned)bfd_getl32 (buf + 8));
6274 case ETIR__C_STC_NOP_GBL:
6275 fprintf (file, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6276 evax_bfd_print_etir_stc_ir (file, buf, 0);
6278 case ETIR__C_STC_NOP_PS:
6279 fprintf (file, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6280 evax_bfd_print_etir_stc_ir (file, buf, 1);
6282 case ETIR__C_STC_BSR_GBL:
6283 fprintf (file, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6284 evax_bfd_print_etir_stc_ir (file, buf, 0);
6286 case ETIR__C_STC_BSR_PS:
6287 fprintf (file, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6288 evax_bfd_print_etir_stc_ir (file, buf, 1);
6290 case ETIR__C_STC_LDA_GBL:
6291 fprintf (file, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6292 evax_bfd_print_etir_stc_ir (file, buf, 0);
6294 case ETIR__C_STC_LDA_PS:
6295 fprintf (file, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6296 evax_bfd_print_etir_stc_ir (file, buf, 1);
6298 case ETIR__C_STC_BOH_GBL:
6299 fprintf (file, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6300 evax_bfd_print_etir_stc_ir (file, buf, 0);
6302 case ETIR__C_STC_BOH_PS:
6303 fprintf (file, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6304 evax_bfd_print_etir_stc_ir (file, buf, 1);
6306 case ETIR__C_STC_NBH_GBL:
6308 _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6310 case ETIR__C_STC_NBH_PS:
6312 _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6315 case ETIR__C_CTL_SETRB:
6316 fprintf (file, _("CTL_SETRB (set relocation base)\n"));
6319 case ETIR__C_CTL_AUGRB:
6321 unsigned int val = bfd_getl32 (buf);
6322 fprintf (file, _("CTL_AUGRB (augment relocation base) %u\n"), val);
6325 case ETIR__C_CTL_DFLOC:
6326 fprintf (file, _("CTL_DFLOC (define location)\n"));
6328 case ETIR__C_CTL_STLOC:
6329 fprintf (file, _("CTL_STLOC (set location)\n"));
6331 case ETIR__C_CTL_STKDL:
6332 fprintf (file, _("CTL_STKDL (stack defined location)\n"));
6335 fprintf (file, _("*unhandled*\n"));
6343 evax_bfd_print_eobj (struct bfd *abfd, FILE *file)
6345 bfd_boolean is_first = TRUE;
6346 bfd_boolean has_records = FALSE;
6350 unsigned int rec_len;
6351 unsigned int pad_len;
6353 unsigned int hdr_size;
6358 unsigned char buf[6];
6363 if (bfd_bread (buf, sizeof (buf), abfd) != sizeof (buf))
6365 fprintf (file, _("cannot read GST record length\n"));
6368 rec_len = bfd_getl16 (buf + 0);
6369 if (rec_len == bfd_getl16 (buf + 4)
6370 && bfd_getl16 (buf + 2) == EOBJ__C_EMH)
6372 /* The format is raw: record-size, type, record-size. */
6374 pad_len = (rec_len + 1) & ~1U;
6377 else if (rec_len == EOBJ__C_EMH)
6379 has_records = FALSE;
6380 pad_len = bfd_getl16 (buf + 2);
6386 fprintf (file, _("cannot find EMH in first GST record\n"));
6389 rec = bfd_malloc (pad_len);
6390 memcpy (rec, buf + sizeof (buf) - hdr_size, hdr_size);
6394 unsigned int rec_len2 = 0;
6395 unsigned char hdr[4];
6399 unsigned char buf_len[2];
6401 if (bfd_bread (buf_len, sizeof (buf_len), abfd)
6402 != sizeof (buf_len))
6404 fprintf (file, _("cannot read GST record length\n"));
6407 rec_len2 = (unsigned)bfd_getl16 (buf_len);
6410 if (bfd_bread (hdr, sizeof (hdr), abfd) != sizeof (hdr))
6412 fprintf (file, _("cannot read GST record header\n"));
6415 rec_len = (unsigned)bfd_getl16 (hdr + 2);
6417 pad_len = (rec_len + 1) & ~1U;
6420 rec = bfd_malloc (pad_len);
6421 memcpy (rec, hdr, sizeof (hdr));
6422 hdr_size = sizeof (hdr);
6423 if (has_records && rec_len2 != rec_len)
6425 fprintf (file, _(" corrupted GST\n"));
6430 if (bfd_bread (rec + hdr_size, pad_len - hdr_size, abfd)
6431 != pad_len - hdr_size)
6433 fprintf (file, _("cannot read GST record\n"));
6437 type = (unsigned)bfd_getl16 (rec);
6442 evax_bfd_print_emh (file, rec, rec_len);
6445 evax_bfd_print_egsd (file, rec, rec_len);
6448 evax_bfd_print_eeom (file, rec, rec_len);
6453 evax_bfd_print_etir (file, "ETIR", rec, rec_len);
6456 evax_bfd_print_etir (file, "EDBG", rec, rec_len);
6459 evax_bfd_print_etir (file, "ETBT", rec, rec_len);
6462 fprintf (file, _(" unhandled EOBJ record type %u\n"), type);
6470 evax_bfd_print_relocation_records (FILE *file, const unsigned char *rel,
6471 unsigned int stride)
6479 count = bfd_getl32 (rel + 0);
6483 base = bfd_getl32 (rel + 4);
6485 /* xgettext:c-format */
6486 fprintf (file, _(" bitcount: %u, base addr: 0x%08x\n"),
6490 for (j = 0; count > 0; j += 4, count -= 32)
6496 val = bfd_getl32 (rel);
6499 /* xgettext:c-format */
6500 fprintf (file, _(" bitmap: 0x%08x (count: %u):\n"), val, count);
6502 for (k = 0; k < 32; k++)
6507 fprintf (file, _(" %08x"), base + (j * 8 + k) * stride);
6522 evax_bfd_print_address_fixups (FILE *file, const unsigned char *rel)
6529 count = bfd_getl32 (rel + 0);
6532 /* xgettext:c-format */
6533 fprintf (file, _(" image %u (%u entries)\n"),
6534 (unsigned)bfd_getl32 (rel + 4), count);
6536 for (j = 0; j < count; j++)
6538 /* xgettext:c-format */
6539 fprintf (file, _(" offset: 0x%08x, val: 0x%08x\n"),
6540 (unsigned)bfd_getl32 (rel + 0),
6541 (unsigned)bfd_getl32 (rel + 4));
6548 evax_bfd_print_reference_fixups (FILE *file, const unsigned char *rel)
6557 count = bfd_getl32 (rel + 0);
6560 /* xgettext:c-format */
6561 fprintf (file, _(" image %u (%u entries), offsets:\n"),
6562 (unsigned)bfd_getl32 (rel + 4), count);
6564 for (j = 0; j < count; j++)
6568 fprintf (file, _(" 0x%08x"), (unsigned)bfd_getl32 (rel));
6583 evax_bfd_print_indent (int indent, FILE *file)
6585 for (; indent; indent--)
6590 evax_bfd_get_dsc_name (unsigned int v)
6594 case DSC__K_DTYPE_Z:
6595 return "Z (Unspecified)";
6596 case DSC__K_DTYPE_V:
6598 case DSC__K_DTYPE_BU:
6599 return "BU (Byte logical)";
6600 case DSC__K_DTYPE_WU:
6601 return "WU (Word logical)";
6602 case DSC__K_DTYPE_LU:
6603 return "LU (Longword logical)";
6604 case DSC__K_DTYPE_QU:
6605 return "QU (Quadword logical)";
6606 case DSC__K_DTYPE_B:
6607 return "B (Byte integer)";
6608 case DSC__K_DTYPE_W:
6609 return "W (Word integer)";
6610 case DSC__K_DTYPE_L:
6611 return "L (Longword integer)";
6612 case DSC__K_DTYPE_Q:
6613 return "Q (Quadword integer)";
6614 case DSC__K_DTYPE_F:
6615 return "F (Single-precision floating)";
6616 case DSC__K_DTYPE_D:
6617 return "D (Double-precision floating)";
6618 case DSC__K_DTYPE_FC:
6619 return "FC (Complex)";
6620 case DSC__K_DTYPE_DC:
6621 return "DC (Double-precision Complex)";
6622 case DSC__K_DTYPE_T:
6623 return "T (ASCII text string)";
6624 case DSC__K_DTYPE_NU:
6625 return "NU (Numeric string, unsigned)";
6626 case DSC__K_DTYPE_NL:
6627 return "NL (Numeric string, left separate sign)";
6628 case DSC__K_DTYPE_NLO:
6629 return "NLO (Numeric string, left overpunched sign)";
6630 case DSC__K_DTYPE_NR:
6631 return "NR (Numeric string, right separate sign)";
6632 case DSC__K_DTYPE_NRO:
6633 return "NRO (Numeric string, right overpunched sig)";
6634 case DSC__K_DTYPE_NZ:
6635 return "NZ (Numeric string, zoned sign)";
6636 case DSC__K_DTYPE_P:
6637 return "P (Packed decimal string)";
6638 case DSC__K_DTYPE_ZI:
6639 return "ZI (Sequence of instructions)";
6640 case DSC__K_DTYPE_ZEM:
6641 return "ZEM (Procedure entry mask)";
6642 case DSC__K_DTYPE_DSC:
6643 return "DSC (Descriptor, used for arrays of dyn strings)";
6644 case DSC__K_DTYPE_OU:
6645 return "OU (Octaword logical)";
6646 case DSC__K_DTYPE_O:
6647 return "O (Octaword integer)";
6648 case DSC__K_DTYPE_G:
6649 return "G (Double precision G floating, 64 bit)";
6650 case DSC__K_DTYPE_H:
6651 return "H (Quadruple precision floating, 128 bit)";
6652 case DSC__K_DTYPE_GC:
6653 return "GC (Double precision complex, G floating)";
6654 case DSC__K_DTYPE_HC:
6655 return "HC (Quadruple precision complex, H floating)";
6656 case DSC__K_DTYPE_CIT:
6657 return "CIT (COBOL intermediate temporary)";
6658 case DSC__K_DTYPE_BPV:
6659 return "BPV (Bound Procedure Value)";
6660 case DSC__K_DTYPE_BLV:
6661 return "BLV (Bound Label Value)";
6662 case DSC__K_DTYPE_VU:
6663 return "VU (Bit Unaligned)";
6664 case DSC__K_DTYPE_ADT:
6665 return "ADT (Absolute Date-Time)";
6666 case DSC__K_DTYPE_VT:
6667 return "VT (Varying Text)";
6668 case DSC__K_DTYPE_T2:
6669 return "T2 (16-bit char)";
6670 case DSC__K_DTYPE_VT2:
6671 return "VT2 (16-bit varying char)";
6673 return "?? (unknown)";
6678 evax_bfd_print_desc (const unsigned char *buf, int indent, FILE *file)
6680 unsigned char bclass = buf[3];
6681 unsigned char dtype = buf[2];
6682 unsigned int len = (unsigned)bfd_getl16 (buf);
6683 unsigned int pointer = (unsigned)bfd_getl32 (buf + 4);
6685 evax_bfd_print_indent (indent, file);
6687 if (len == 1 && pointer == 0xffffffffUL)
6690 fprintf (file, _("64 bits *unhandled*\n"));
6694 /* xgettext:c-format */
6695 fprintf (file, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
6696 bclass, dtype, len, pointer);
6699 case DSC__K_CLASS_NCA:
6701 const struct vms_dsc_nca *dsc = (const void *)buf;
6703 const unsigned char *b;
6705 evax_bfd_print_indent (indent, file);
6706 fprintf (file, _("non-contiguous array of %s\n"),
6707 evax_bfd_get_dsc_name (dsc->dtype));
6708 evax_bfd_print_indent (indent + 1, file);
6710 /* xgettext:c-format */
6711 _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
6712 dsc->dimct, dsc->aflags, dsc->digits, dsc->scale);
6713 evax_bfd_print_indent (indent + 1, file);
6715 /* xgettext:c-format */
6716 _("arsize: %u, a0: 0x%08x\n"),
6717 (unsigned)bfd_getl32 (dsc->arsize),
6718 (unsigned)bfd_getl32 (dsc->a0));
6719 evax_bfd_print_indent (indent + 1, file);
6720 fprintf (file, _("Strides:\n"));
6721 b = buf + sizeof (*dsc);
6722 for (i = 0; i < dsc->dimct; i++)
6724 evax_bfd_print_indent (indent + 2, file);
6725 fprintf (file, "[%u]: %u\n", i + 1,
6726 (unsigned)bfd_getl32 (b));
6729 evax_bfd_print_indent (indent + 1, file);
6730 fprintf (file, _("Bounds:\n"));
6731 b = buf + sizeof (*dsc);
6732 for (i = 0; i < dsc->dimct; i++)
6734 evax_bfd_print_indent (indent + 2, file);
6735 /* xgettext:c-format */
6736 fprintf (file, _("[%u]: Lower: %u, upper: %u\n"), i + 1,
6737 (unsigned)bfd_getl32 (b + 0),
6738 (unsigned)bfd_getl32 (b + 4));
6743 case DSC__K_CLASS_UBS:
6745 const struct vms_dsc_ubs *ubs = (const void *)buf;
6747 evax_bfd_print_indent (indent, file);
6748 fprintf (file, _("unaligned bit-string of %s\n"),
6749 evax_bfd_get_dsc_name (ubs->dtype));
6750 evax_bfd_print_indent (indent + 1, file);
6752 /* xgettext:c-format */
6753 _("base: %u, pos: %u\n"),
6754 (unsigned)bfd_getl32 (ubs->base),
6755 (unsigned)bfd_getl32 (ubs->pos));
6759 fprintf (file, _("*unhandled*\n"));
6766 evax_bfd_print_valspec (const unsigned char *buf, int indent, FILE *file)
6768 unsigned int vflags = buf[0];
6769 unsigned int value = (unsigned)bfd_getl32 (buf + 1);
6770 unsigned int len = 5;
6772 evax_bfd_print_indent (indent, file);
6773 /* xgettext:c-format */
6774 fprintf (file, _("vflags: 0x%02x, value: 0x%08x "), vflags, value);
6779 case DST__K_VFLAGS_NOVAL:
6780 fprintf (file, _("(no value)\n"));
6782 case DST__K_VFLAGS_NOTACTIVE:
6783 fprintf (file, _("(not active)\n"));
6785 case DST__K_VFLAGS_UNALLOC:
6786 fprintf (file, _("(not allocated)\n"));
6788 case DST__K_VFLAGS_DSC:
6789 fprintf (file, _("(descriptor)\n"));
6790 evax_bfd_print_desc (buf + value, indent + 1, file);
6792 case DST__K_VFLAGS_TVS:
6793 fprintf (file, _("(trailing value)\n"));
6795 case DST__K_VS_FOLLOWS:
6796 fprintf (file, _("(value spec follows)\n"));
6798 case DST__K_VFLAGS_BITOFFS:
6799 fprintf (file, _("(at bit offset %u)\n"), value);
6802 /* xgettext:c-format */
6803 fprintf (file, _("(reg: %u, disp: %u, indir: %u, kind: "),
6804 (vflags & DST__K_REGNUM_MASK) >> DST__K_REGNUM_SHIFT,
6805 vflags & DST__K_DISP ? 1 : 0,
6806 vflags & DST__K_INDIR ? 1 : 0);
6807 switch (vflags & DST__K_VALKIND_MASK)
6809 case DST__K_VALKIND_LITERAL:
6810 fputs (_("literal"), file);
6812 case DST__K_VALKIND_ADDR:
6813 fputs (_("address"), file);
6815 case DST__K_VALKIND_DESC:
6816 fputs (_("desc"), file);
6818 case DST__K_VALKIND_REG:
6819 fputs (_("reg"), file);
6822 fputs (")\n", file);
6829 evax_bfd_print_typspec (const unsigned char *buf, int indent, FILE *file)
6831 unsigned char kind = buf[2];
6832 unsigned int len = (unsigned)bfd_getl16 (buf);
6834 evax_bfd_print_indent (indent, file);
6835 /* xgettext:c-format */
6836 fprintf (file, _("len: %2u, kind: %2u "), len, kind);
6840 case DST__K_TS_ATOM:
6841 /* xgettext:c-format */
6842 fprintf (file, _("atomic, type=0x%02x %s\n"),
6843 buf[0], evax_bfd_get_dsc_name (buf[0]));
6846 fprintf (file, _("indirect, defined at 0x%08x\n"),
6847 (unsigned)bfd_getl32 (buf));
6849 case DST__K_TS_TPTR:
6850 fprintf (file, _("typed pointer\n"));
6851 evax_bfd_print_typspec (buf, indent + 1, file);
6854 fprintf (file, _("pointer\n"));
6856 case DST__K_TS_ARRAY:
6858 const unsigned char *vs;
6859 unsigned int vec_len;
6862 fprintf (file, _("array, dim: %u, bitmap: "), buf[0]);
6863 vec_len = (buf[0] + 1 + 7) / 8;
6864 for (i = 0; i < vec_len; i++)
6865 fprintf (file, " %02x", buf[i + 1]);
6867 vs = buf + 1 + vec_len;
6868 evax_bfd_print_indent (indent, file);
6869 fprintf (file, _("array descriptor:\n"));
6870 vs += evax_bfd_print_valspec (vs, indent + 1, file);
6871 for (i = 0; i < buf[0] + 1U; i++)
6872 if (buf[1 + i / 8] & (1 << (i % 8)))
6874 evax_bfd_print_indent (indent, file);
6876 fprintf (file, _("type spec for element:\n"));
6878 fprintf (file, _("type spec for subscript %u:\n"), i);
6879 evax_bfd_print_typspec (vs, indent + 1, file);
6880 vs += bfd_getl16 (vs);
6885 fprintf (file, _("*unhandled*\n"));
6890 evax_bfd_print_dst (struct bfd *abfd, unsigned int dst_size, FILE *file)
6892 unsigned int off = 0;
6893 unsigned int pc = 0;
6894 unsigned int line = 0;
6896 fprintf (file, _("Debug symbol table:\n"));
6898 while (dst_size > 0)
6900 struct vms_dst_header dsth;
6905 if (bfd_bread (&dsth, sizeof (dsth), abfd) != sizeof (dsth))
6907 fprintf (file, _("cannot read DST header\n"));
6910 len = bfd_getl16 (dsth.length);
6911 type = bfd_getl16 (dsth.type);
6912 /* xgettext:c-format */
6913 fprintf (file, _(" type: %3u, len: %3u (at 0x%08x): "),
6923 len -= sizeof (dsth);
6924 buf = bfd_malloc (len);
6925 if (bfd_bread (buf, len, abfd) != len)
6927 fprintf (file, _("cannot read DST symbol\n"));
6932 case DSC__K_DTYPE_V:
6933 case DSC__K_DTYPE_BU:
6934 case DSC__K_DTYPE_WU:
6935 case DSC__K_DTYPE_LU:
6936 case DSC__K_DTYPE_QU:
6937 case DSC__K_DTYPE_B:
6938 case DSC__K_DTYPE_W:
6939 case DSC__K_DTYPE_L:
6940 case DSC__K_DTYPE_Q:
6941 case DSC__K_DTYPE_F:
6942 case DSC__K_DTYPE_D:
6943 case DSC__K_DTYPE_FC:
6944 case DSC__K_DTYPE_DC:
6945 case DSC__K_DTYPE_T:
6946 case DSC__K_DTYPE_NU:
6947 case DSC__K_DTYPE_NL:
6948 case DSC__K_DTYPE_NLO:
6949 case DSC__K_DTYPE_NR:
6950 case DSC__K_DTYPE_NRO:
6951 case DSC__K_DTYPE_NZ:
6952 case DSC__K_DTYPE_P:
6953 case DSC__K_DTYPE_ZI:
6954 case DSC__K_DTYPE_ZEM:
6955 case DSC__K_DTYPE_DSC:
6956 case DSC__K_DTYPE_OU:
6957 case DSC__K_DTYPE_O:
6958 case DSC__K_DTYPE_G:
6959 case DSC__K_DTYPE_H:
6960 case DSC__K_DTYPE_GC:
6961 case DSC__K_DTYPE_HC:
6962 case DSC__K_DTYPE_CIT:
6963 case DSC__K_DTYPE_BPV:
6964 case DSC__K_DTYPE_BLV:
6965 case DSC__K_DTYPE_VU:
6966 case DSC__K_DTYPE_ADT:
6967 case DSC__K_DTYPE_VT:
6968 case DSC__K_DTYPE_T2:
6969 case DSC__K_DTYPE_VT2:
6970 fprintf (file, _("standard data: %s\n"),
6971 evax_bfd_get_dsc_name (type));
6972 evax_bfd_print_valspec (buf, 4, file);
6973 fprintf (file, _(" name: %.*s\n"), buf[5], buf + 6);
6977 struct vms_dst_modbeg *dst = (void *)buf;
6978 const char *name = (const char *)buf + sizeof (*dst);
6980 fprintf (file, _("modbeg\n"));
6981 /* xgettext:c-format */
6982 fprintf (file, _(" flags: %d, language: %u, "
6983 "major: %u, minor: %u\n"),
6985 (unsigned)bfd_getl32 (dst->language),
6986 (unsigned)bfd_getl16 (dst->major),
6987 (unsigned)bfd_getl16 (dst->minor));
6988 fprintf (file, _(" module name: %.*s\n"),
6990 name += name[0] + 1;
6991 fprintf (file, _(" compiler : %.*s\n"),
6996 fprintf (file, _("modend\n"));
7000 struct vms_dst_rtnbeg *dst = (void *)buf;
7001 const char *name = (const char *)buf + sizeof (*dst);
7003 fputs (_("rtnbeg\n"), file);
7004 /* xgettext:c-format */
7005 fprintf (file, _(" flags: %u, address: 0x%08x, "
7006 "pd-address: 0x%08x\n"),
7008 (unsigned)bfd_getl32 (dst->address),
7009 (unsigned)bfd_getl32 (dst->pd_address));
7010 fprintf (file, _(" routine name: %.*s\n"),
7016 struct vms_dst_rtnend *dst = (void *)buf;
7018 fprintf (file, _("rtnend: size 0x%08x\n"),
7019 (unsigned)bfd_getl32 (dst->size));
7024 struct vms_dst_prolog *dst = (void *)buf;
7026 fprintf (file, _("prolog: bkpt address 0x%08x\n"),
7027 (unsigned)bfd_getl32 (dst->bkpt_addr));
7032 struct vms_dst_epilog *dst = (void *)buf;
7034 /* xgettext:c-format */
7035 fprintf (file, _("epilog: flags: %u, count: %u\n"),
7036 dst->flags, (unsigned)bfd_getl32 (dst->count));
7041 struct vms_dst_blkbeg *dst = (void *)buf;
7042 const char *name = (const char *)buf + sizeof (*dst);
7044 /* xgettext:c-format */
7045 fprintf (file, _("blkbeg: address: 0x%08x, name: %.*s\n"),
7046 (unsigned)bfd_getl32 (dst->address),
7052 struct vms_dst_blkend *dst = (void *)buf;
7054 fprintf (file, _("blkend: size: 0x%08x\n"),
7055 (unsigned)bfd_getl32 (dst->size));
7058 case DST__K_TYPSPEC:
7060 fprintf (file, _("typspec (len: %u)\n"), len);
7061 fprintf (file, _(" name: %.*s\n"), buf[0], buf + 1);
7062 evax_bfd_print_typspec (buf + 1 + buf[0], 5, file);
7067 fprintf (file, _("septyp, name: %.*s\n"), buf[5], buf + 6);
7068 evax_bfd_print_valspec (buf, 4, file);
7073 struct vms_dst_recbeg *recbeg = (void *)buf;
7074 const char *name = (const char *)buf + sizeof (*recbeg);
7076 fprintf (file, _("recbeg: name: %.*s\n"), name[0], name + 1);
7077 evax_bfd_print_valspec (buf, 4, file);
7078 fprintf (file, _(" len: %u bits\n"),
7079 (unsigned)bfd_getl32 (name + 1 + name[0]));
7083 fprintf (file, _("recend\n"));
7085 case DST__K_ENUMBEG:
7086 /* xgettext:c-format */
7087 fprintf (file, _("enumbeg, len: %u, name: %.*s\n"),
7088 buf[0], buf[1], buf + 2);
7090 case DST__K_ENUMELT:
7091 fprintf (file, _("enumelt, name: %.*s\n"), buf[5], buf + 6);
7092 evax_bfd_print_valspec (buf, 4, file);
7094 case DST__K_ENUMEND:
7095 fprintf (file, _("enumend\n"));
7099 struct vms_dst_label *lab = (void *)buf;
7100 fprintf (file, _("label, name: %.*s\n"),
7101 lab->name[0], lab->name + 1);
7102 fprintf (file, _(" address: 0x%08x\n"),
7103 (unsigned)bfd_getl32 (lab->value));
7106 case DST__K_DIS_RANGE:
7108 unsigned int cnt = bfd_getl32 (buf);
7109 unsigned char *rng = buf + 4;
7112 fprintf (file, _("discontiguous range (nbr: %u)\n"), cnt);
7113 for (i = 0; i < cnt; i++, rng += 8)
7114 /* xgettext:c-format */
7115 fprintf (file, _(" address: 0x%08x, size: %u\n"),
7116 (unsigned)bfd_getl32 (rng),
7117 (unsigned)bfd_getl32 (rng + 4));
7121 case DST__K_LINE_NUM:
7123 unsigned char *buf_orig = buf;
7125 fprintf (file, _("line num (len: %u)\n"), len);
7130 unsigned char cmdlen;
7140 case DST__K_DELTA_PC_W:
7141 val = bfd_getl16 (buf + 1);
7142 fprintf (file, _("delta_pc_w %u\n"), val);
7147 case DST__K_INCR_LINUM:
7149 fprintf (file, _("incr_linum(b): +%u\n"), val);
7153 case DST__K_INCR_LINUM_W:
7154 val = bfd_getl16 (buf + 1);
7155 fprintf (file, _("incr_linum_w: +%u\n"), val);
7159 case DST__K_INCR_LINUM_L:
7160 val = bfd_getl32 (buf + 1);
7161 fprintf (file, _("incr_linum_l: +%u\n"), val);
7165 case DST__K_SET_LINUM:
7166 line = bfd_getl16 (buf + 1);
7167 fprintf (file, _("set_line_num(w) %u\n"), line);
7170 case DST__K_SET_LINUM_B:
7172 fprintf (file, _("set_line_num_b %u\n"), line);
7175 case DST__K_SET_LINUM_L:
7176 line = bfd_getl32 (buf + 1);
7177 fprintf (file, _("set_line_num_l %u\n"), line);
7180 case DST__K_SET_ABS_PC:
7181 pc = bfd_getl32 (buf + 1);
7182 fprintf (file, _("set_abs_pc: 0x%08x\n"), pc);
7185 case DST__K_DELTA_PC_L:
7186 fprintf (file, _("delta_pc_l: +0x%08x\n"),
7187 (unsigned)bfd_getl32 (buf + 1));
7191 fprintf (file, _("term(b): 0x%02x"), buf[1]);
7193 fprintf (file, _(" pc: 0x%08x\n"), pc);
7197 val = bfd_getl16 (buf + 1);
7198 fprintf (file, _("term_w: 0x%04x"), val);
7200 fprintf (file, _(" pc: 0x%08x\n"), pc);
7206 fprintf (file, _("delta pc +%-4d"), -cmd);
7207 line++; /* FIXME: curr increment. */
7209 /* xgettext:c-format */
7210 fprintf (file, _(" pc: 0x%08x line: %5u\n"),
7215 fprintf (file, _(" *unhandled* cmd %u\n"), cmd);
7228 unsigned char *buf_orig = buf;
7230 fprintf (file, _("source (len: %u)\n"), len);
7234 signed char cmd = buf[0];
7235 unsigned char cmdlen = 0;
7239 case DST__K_SRC_DECLFILE:
7241 struct vms_dst_src_decl_src *src = (void *)(buf + 1);
7244 /* xgettext:c-format */
7245 fprintf (file, _(" declfile: len: %u, flags: %u, "
7247 src->length, src->flags,
7248 (unsigned)bfd_getl16 (src->fileid));
7249 /* xgettext:c-format */
7250 fprintf (file, _(" rms: cdt: 0x%08x %08x, "
7251 "ebk: 0x%08x, ffb: 0x%04x, "
7253 (unsigned)bfd_getl32 (src->rms_cdt + 4),
7254 (unsigned)bfd_getl32 (src->rms_cdt + 0),
7255 (unsigned)bfd_getl32 (src->rms_ebk),
7256 (unsigned)bfd_getl16 (src->rms_ffb),
7258 name = (const char *)buf + 1 + sizeof (*src);
7259 fprintf (file, _(" filename : %.*s\n"),
7261 name += name[0] + 1;
7262 fprintf (file, _(" module name: %.*s\n"),
7264 cmdlen = 2 + src->length;
7267 case DST__K_SRC_SETFILE:
7268 fprintf (file, _(" setfile %u\n"),
7269 (unsigned)bfd_getl16 (buf + 1));
7272 case DST__K_SRC_SETREC_W:
7273 fprintf (file, _(" setrec %u\n"),
7274 (unsigned)bfd_getl16 (buf + 1));
7277 case DST__K_SRC_SETREC_L:
7278 fprintf (file, _(" setrec %u\n"),
7279 (unsigned)bfd_getl32 (buf + 1));
7282 case DST__K_SRC_SETLNUM_W:
7283 fprintf (file, _(" setlnum %u\n"),
7284 (unsigned)bfd_getl16 (buf + 1));
7287 case DST__K_SRC_SETLNUM_L:
7288 fprintf (file, _(" setlnum %u\n"),
7289 (unsigned)bfd_getl32 (buf + 1));
7292 case DST__K_SRC_DEFLINES_W:
7293 fprintf (file, _(" deflines %u\n"),
7294 (unsigned)bfd_getl16 (buf + 1));
7297 case DST__K_SRC_DEFLINES_B:
7298 fprintf (file, _(" deflines %u\n"), buf[1]);
7301 case DST__K_SRC_FORMFEED:
7302 fprintf (file, _(" formfeed\n"));
7306 fprintf (file, _(" *unhandled* cmd %u\n"), cmd);
7318 fprintf (file, _("*unhandled* dst type %u\n"), type);
7326 evax_bfd_print_image (bfd *abfd, FILE *file)
7328 struct vms_eihd eihd;
7331 unsigned int eiha_off;
7332 unsigned int eihi_off;
7333 unsigned int eihs_off;
7334 unsigned int eisd_off;
7335 unsigned int eihef_off = 0;
7336 unsigned int eihnp_off = 0;
7337 unsigned int dmt_vbn = 0;
7338 unsigned int dmt_size = 0;
7339 unsigned int dst_vbn = 0;
7340 unsigned int dst_size = 0;
7341 unsigned int gst_vbn = 0;
7342 unsigned int gst_size = 0;
7343 unsigned int eiaf_vbn = 0;
7344 unsigned int eiaf_size = 0;
7345 unsigned int eihvn_off;
7347 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET)
7348 || bfd_bread (&eihd, sizeof (eihd), abfd) != sizeof (eihd))
7350 fprintf (file, _("cannot read EIHD\n"));
7353 /* xgettext:c-format */
7354 fprintf (file, _("EIHD: (size: %u, nbr blocks: %u)\n"),
7355 (unsigned)bfd_getl32 (eihd.size),
7356 (unsigned)bfd_getl32 (eihd.hdrblkcnt));
7357 /* xgettext:c-format */
7358 fprintf (file, _(" majorid: %u, minorid: %u\n"),
7359 (unsigned)bfd_getl32 (eihd.majorid),
7360 (unsigned)bfd_getl32 (eihd.minorid));
7362 val = (unsigned)bfd_getl32 (eihd.imgtype);
7366 name = _("executable");
7369 name = _("linkable image");
7372 name = _("unknown");
7375 /* xgettext:c-format */
7376 fprintf (file, _(" image type: %u (%s)"), val, name);
7378 val = (unsigned)bfd_getl32 (eihd.subtype);
7381 case EIHD__C_NATIVE:
7388 name = _("unknown");
7391 /* xgettext:c-format */
7392 fprintf (file, _(", subtype: %u (%s)\n"), val, name);
7394 eisd_off = bfd_getl32 (eihd.isdoff);
7395 eiha_off = bfd_getl32 (eihd.activoff);
7396 eihi_off = bfd_getl32 (eihd.imgidoff);
7397 eihs_off = bfd_getl32 (eihd.symdbgoff);
7398 /* xgettext:c-format */
7399 fprintf (file, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
7400 "imgid: %u, patch: %u\n"),
7401 eisd_off, eiha_off, eihs_off, eihi_off,
7402 (unsigned)bfd_getl32 (eihd.patchoff));
7403 fprintf (file, _(" fixup info rva: "));
7404 bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.iafva));
7405 fprintf (file, _(", symbol vector rva: "));
7406 bfd_fprintf_vma (abfd, file, bfd_getl64 (eihd.symvva));
7407 eihvn_off = bfd_getl32 (eihd.version_array_off);
7408 fprintf (file, _("\n"
7409 " version array off: %u\n"),
7412 /* xgettext:c-format */
7413 _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
7414 (unsigned)bfd_getl32 (eihd.imgiocnt),
7415 (unsigned)bfd_getl32 (eihd.iochancnt),
7416 (unsigned)bfd_getl32 (eihd.privreqs + 4),
7417 (unsigned)bfd_getl32 (eihd.privreqs + 0));
7418 val = (unsigned)bfd_getl32 (eihd.lnkflags);
7419 fprintf (file, _(" linker flags: %08x:"), val);
7420 if (val & EIHD__M_LNKDEBUG)
7421 fprintf (file, " LNKDEBUG");
7422 if (val & EIHD__M_LNKNOTFR)
7423 fprintf (file, " LNKNOTFR");
7424 if (val & EIHD__M_NOP0BUFS)
7425 fprintf (file, " NOP0BUFS");
7426 if (val & EIHD__M_PICIMG)
7427 fprintf (file, " PICIMG");
7428 if (val & EIHD__M_P0IMAGE)
7429 fprintf (file, " P0IMAGE");
7430 if (val & EIHD__M_DBGDMT)
7431 fprintf (file, " DBGDMT");
7432 if (val & EIHD__M_INISHR)
7433 fprintf (file, " INISHR");
7434 if (val & EIHD__M_XLATED)
7435 fprintf (file, " XLATED");
7436 if (val & EIHD__M_BIND_CODE_SEC)
7437 fprintf (file, " BIND_CODE_SEC");
7438 if (val & EIHD__M_BIND_DATA_SEC)
7439 fprintf (file, " BIND_DATA_SEC");
7440 if (val & EIHD__M_MKTHREADS)
7441 fprintf (file, " MKTHREADS");
7442 if (val & EIHD__M_UPCALLS)
7443 fprintf (file, " UPCALLS");
7444 if (val & EIHD__M_OMV_READY)
7445 fprintf (file, " OMV_READY");
7446 if (val & EIHD__M_EXT_BIND_SECT)
7447 fprintf (file, " EXT_BIND_SECT");
7448 fprintf (file, "\n");
7449 /* xgettext:c-format */
7450 fprintf (file, _(" ident: 0x%08x, sysver: 0x%08x, "
7451 "match ctrl: %u, symvect_size: %u\n"),
7452 (unsigned)bfd_getl32 (eihd.ident),
7453 (unsigned)bfd_getl32 (eihd.sysver),
7455 (unsigned)bfd_getl32 (eihd.symvect_size));
7456 fprintf (file, _(" BPAGE: %u"),
7457 (unsigned)bfd_getl32 (eihd.virt_mem_block_size));
7458 if (val & (EIHD__M_OMV_READY | EIHD__M_EXT_BIND_SECT))
7460 eihef_off = bfd_getl32 (eihd.ext_fixup_off);
7461 eihnp_off = bfd_getl32 (eihd.noopt_psect_off);
7462 /* xgettext:c-format */
7463 fprintf (file, _(", ext fixup offset: %u, no_opt psect off: %u"),
7464 eihef_off, eihnp_off);
7466 fprintf (file, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd.alias));
7470 struct vms_eihvn eihvn;
7474 fprintf (file, _("system version array information:\n"));
7475 if (bfd_seek (abfd, (file_ptr) eihvn_off, SEEK_SET)
7476 || bfd_bread (&eihvn, sizeof (eihvn), abfd) != sizeof (eihvn))
7478 fprintf (file, _("cannot read EIHVN header\n"));
7481 mask = bfd_getl32 (eihvn.subsystem_mask);
7482 for (j = 0; j < 32; j++)
7483 if (mask & (1 << j))
7485 struct vms_eihvn_subversion ver;
7486 if (bfd_bread (&ver, sizeof (ver), abfd) != sizeof (ver))
7488 fprintf (file, _("cannot read EIHVN version\n"));
7491 fprintf (file, _(" %02u "), j);
7494 case EIHVN__BASE_IMAGE_BIT:
7495 fputs (_("BASE_IMAGE "), file);
7497 case EIHVN__MEMORY_MANAGEMENT_BIT:
7498 fputs (_("MEMORY_MANAGEMENT"), file);
7501 fputs (_("IO "), file);
7503 case EIHVN__FILES_VOLUMES_BIT:
7504 fputs (_("FILES_VOLUMES "), file);
7506 case EIHVN__PROCESS_SCHED_BIT:
7507 fputs (_("PROCESS_SCHED "), file);
7509 case EIHVN__SYSGEN_BIT:
7510 fputs (_("SYSGEN "), file);
7512 case EIHVN__CLUSTERS_LOCKMGR_BIT:
7513 fputs (_("CLUSTERS_LOCKMGR "), file);
7515 case EIHVN__LOGICAL_NAMES_BIT:
7516 fputs (_("LOGICAL_NAMES "), file);
7518 case EIHVN__SECURITY_BIT:
7519 fputs (_("SECURITY "), file);
7521 case EIHVN__IMAGE_ACTIVATOR_BIT:
7522 fputs (_("IMAGE_ACTIVATOR "), file);
7524 case EIHVN__NETWORKS_BIT:
7525 fputs (_("NETWORKS "), file);
7527 case EIHVN__COUNTERS_BIT:
7528 fputs (_("COUNTERS "), file);
7530 case EIHVN__STABLE_BIT:
7531 fputs (_("STABLE "), file);
7533 case EIHVN__MISC_BIT:
7534 fputs (_("MISC "), file);
7536 case EIHVN__CPU_BIT:
7537 fputs (_("CPU "), file);
7539 case EIHVN__VOLATILE_BIT:
7540 fputs (_("VOLATILE "), file);
7542 case EIHVN__SHELL_BIT:
7543 fputs (_("SHELL "), file);
7545 case EIHVN__POSIX_BIT:
7546 fputs (_("POSIX "), file);
7548 case EIHVN__MULTI_PROCESSING_BIT:
7549 fputs (_("MULTI_PROCESSING "), file);
7551 case EIHVN__GALAXY_BIT:
7552 fputs (_("GALAXY "), file);
7555 fputs (_("*unknown* "), file);
7558 fprintf (file, ": %u.%u\n",
7559 (unsigned)bfd_getl16 (ver.major),
7560 (unsigned)bfd_getl16 (ver.minor));
7566 struct vms_eiha eiha;
7568 if (bfd_seek (abfd, (file_ptr) eiha_off, SEEK_SET)
7569 || bfd_bread (&eiha, sizeof (eiha), abfd) != sizeof (eiha))
7571 fprintf (file, _("cannot read EIHA\n"));
7574 fprintf (file, _("Image activation: (size=%u)\n"),
7575 (unsigned)bfd_getl32 (eiha.size));
7576 /* xgettext:c-format */
7577 fprintf (file, _(" First address : 0x%08x 0x%08x\n"),
7578 (unsigned)bfd_getl32 (eiha.tfradr1_h),
7579 (unsigned)bfd_getl32 (eiha.tfradr1));
7580 /* xgettext:c-format */
7581 fprintf (file, _(" Second address: 0x%08x 0x%08x\n"),
7582 (unsigned)bfd_getl32 (eiha.tfradr2_h),
7583 (unsigned)bfd_getl32 (eiha.tfradr2));
7584 /* xgettext:c-format */
7585 fprintf (file, _(" Third address : 0x%08x 0x%08x\n"),
7586 (unsigned)bfd_getl32 (eiha.tfradr3_h),
7587 (unsigned)bfd_getl32 (eiha.tfradr3));
7588 /* xgettext:c-format */
7589 fprintf (file, _(" Fourth address: 0x%08x 0x%08x\n"),
7590 (unsigned)bfd_getl32 (eiha.tfradr4_h),
7591 (unsigned)bfd_getl32 (eiha.tfradr4));
7592 /* xgettext:c-format */
7593 fprintf (file, _(" Shared image : 0x%08x 0x%08x\n"),
7594 (unsigned)bfd_getl32 (eiha.inishr_h),
7595 (unsigned)bfd_getl32 (eiha.inishr));
7599 struct vms_eihi eihi;
7601 if (bfd_seek (abfd, (file_ptr) eihi_off, SEEK_SET)
7602 || bfd_bread (&eihi, sizeof (eihi), abfd) != sizeof (eihi))
7604 fprintf (file, _("cannot read EIHI\n"));
7607 /* xgettext:c-format */
7608 fprintf (file, _("Image identification: (major: %u, minor: %u)\n"),
7609 (unsigned)bfd_getl32 (eihi.majorid),
7610 (unsigned)bfd_getl32 (eihi.minorid));
7611 fprintf (file, _(" image name : %.*s\n"),
7612 eihi.imgnam[0], eihi.imgnam + 1);
7613 fprintf (file, _(" link time : %s\n"),
7614 vms_time_to_str (eihi.linktime));
7615 fprintf (file, _(" image ident : %.*s\n"),
7616 eihi.imgid[0], eihi.imgid + 1);
7617 fprintf (file, _(" linker ident : %.*s\n"),
7618 eihi.linkid[0], eihi.linkid + 1);
7619 fprintf (file, _(" image build ident: %.*s\n"),
7620 eihi.imgbid[0], eihi.imgbid + 1);
7624 struct vms_eihs eihs;
7626 if (bfd_seek (abfd, (file_ptr) eihs_off, SEEK_SET)
7627 || bfd_bread (&eihs, sizeof (eihs), abfd) != sizeof (eihs))
7629 fprintf (file, _("cannot read EIHS\n"));
7632 /* xgettext:c-format */
7633 fprintf (file, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
7634 (unsigned)bfd_getl32 (eihs.majorid),
7635 (unsigned)bfd_getl32 (eihs.minorid));
7636 dst_vbn = bfd_getl32 (eihs.dstvbn);
7637 dst_size = bfd_getl32 (eihs.dstsize);
7638 /* xgettext:c-format */
7639 fprintf (file, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
7640 dst_vbn, dst_size, dst_size);
7641 gst_vbn = bfd_getl32 (eihs.gstvbn);
7642 gst_size = bfd_getl32 (eihs.gstsize);
7643 /* xgettext:c-format */
7644 fprintf (file, _(" global symbol table: vbn: %u, records: %u\n"),
7646 dmt_vbn = bfd_getl32 (eihs.dmtvbn);
7647 dmt_size = bfd_getl32 (eihs.dmtsize);
7648 /* xgettext:c-format */
7649 fprintf (file, _(" debug module table : vbn: %u, size: %u\n"),
7652 while (eisd_off != 0)
7654 struct vms_eisd eisd;
7659 if (bfd_seek (abfd, (file_ptr) eisd_off, SEEK_SET)
7660 || bfd_bread (&eisd, sizeof (eisd), abfd) != sizeof (eisd))
7662 fprintf (file, _("cannot read EISD\n"));
7665 len = (unsigned)bfd_getl32 (eisd.eisdsize);
7666 if (len != (unsigned)-1)
7670 eisd_off = (eisd_off + VMS_BLOCK_SIZE) & ~(VMS_BLOCK_SIZE - 1);
7672 /* xgettext:c-format */
7673 fprintf (file, _("Image section descriptor: (major: %u, minor: %u, "
7674 "size: %u, offset: %u)\n"),
7675 (unsigned)bfd_getl32 (eisd.majorid),
7676 (unsigned)bfd_getl32 (eisd.minorid),
7680 /* xgettext:c-format */
7681 fprintf (file, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
7682 (unsigned)bfd_getl32 (eisd.virt_addr + 4),
7683 (unsigned)bfd_getl32 (eisd.virt_addr + 0),
7684 (unsigned)bfd_getl32 (eisd.secsize));
7685 val = (unsigned)bfd_getl32 (eisd.flags);
7686 fprintf (file, _(" flags: 0x%04x"), val);
7687 if (val & EISD__M_GBL)
7688 fprintf (file, " GBL");
7689 if (val & EISD__M_CRF)
7690 fprintf (file, " CRF");
7691 if (val & EISD__M_DZRO)
7692 fprintf (file, " DZRO");
7693 if (val & EISD__M_WRT)
7694 fprintf (file, " WRT");
7695 if (val & EISD__M_INITALCODE)
7696 fprintf (file, " INITALCODE");
7697 if (val & EISD__M_BASED)
7698 fprintf (file, " BASED");
7699 if (val & EISD__M_FIXUPVEC)
7700 fprintf (file, " FIXUPVEC");
7701 if (val & EISD__M_RESIDENT)
7702 fprintf (file, " RESIDENT");
7703 if (val & EISD__M_VECTOR)
7704 fprintf (file, " VECTOR");
7705 if (val & EISD__M_PROTECT)
7706 fprintf (file, " PROTECT");
7707 if (val & EISD__M_LASTCLU)
7708 fprintf (file, " LASTCLU");
7709 if (val & EISD__M_EXE)
7710 fprintf (file, " EXE");
7711 if (val & EISD__M_NONSHRADR)
7712 fprintf (file, " NONSHRADR");
7713 if (val & EISD__M_QUAD_LENGTH)
7714 fprintf (file, " QUAD_LENGTH");
7715 if (val & EISD__M_ALLOC_64BIT)
7716 fprintf (file, " ALLOC_64BIT");
7717 fprintf (file, "\n");
7718 if (val & EISD__M_FIXUPVEC)
7720 eiaf_vbn = bfd_getl32 (eisd.vbn);
7721 eiaf_size = bfd_getl32 (eisd.secsize);
7723 /* xgettext:c-format */
7724 fprintf (file, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
7725 (unsigned)bfd_getl32 (eisd.vbn),
7726 eisd.pfc, eisd.matchctl, eisd.type);
7729 case EISD__K_NORMAL:
7730 fputs (_("NORMAL"), file);
7732 case EISD__K_SHRFXD:
7733 fputs (_("SHRFXD"), file);
7735 case EISD__K_PRVFXD:
7736 fputs (_("PRVFXD"), file);
7738 case EISD__K_SHRPIC:
7739 fputs (_("SHRPIC"), file);
7741 case EISD__K_PRVPIC:
7742 fputs (_("PRVPIC"), file);
7744 case EISD__K_USRSTACK:
7745 fputs (_("USRSTACK"), file);
7748 fputs (_("*unknown*"), file);
7751 fputs (_(")\n"), file);
7752 if (val & EISD__M_GBL)
7753 /* xgettext:c-format */
7754 fprintf (file, _(" ident: 0x%08x, name: %.*s\n"),
7755 (unsigned)bfd_getl32 (eisd.ident),
7756 eisd.gblnam[0], eisd.gblnam + 1);
7762 if (bfd_seek (abfd, (file_ptr) (dmt_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7764 fprintf (file, _("cannot read DMT\n"));
7768 fprintf (file, _("Debug module table:\n"));
7770 while (dmt_size > 0)
7772 struct vms_dmt_header dmth;
7775 if (bfd_bread (&dmth, sizeof (dmth), abfd) != sizeof (dmth))
7777 fprintf (file, _("cannot read DMT header\n"));
7780 count = bfd_getl16 (dmth.psect_count);
7782 /* xgettext:c-format */
7783 _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
7784 (unsigned)bfd_getl32 (dmth.modbeg),
7785 (unsigned)bfd_getl32 (dmth.size), count);
7786 dmt_size -= sizeof (dmth);
7789 struct vms_dmt_psect dmtp;
7791 if (bfd_bread (&dmtp, sizeof (dmtp), abfd) != sizeof (dmtp))
7793 fprintf (file, _("cannot read DMT psect\n"));
7796 /* xgettext:c-format */
7797 fprintf (file, _(" psect start: 0x%08x, length: %u\n"),
7798 (unsigned)bfd_getl32 (dmtp.start),
7799 (unsigned)bfd_getl32 (dmtp.length));
7801 dmt_size -= sizeof (dmtp);
7808 if (bfd_seek (abfd, (file_ptr) (dst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7810 fprintf (file, _("cannot read DST\n"));
7814 evax_bfd_print_dst (abfd, dst_size, file);
7818 if (bfd_seek (abfd, (file_ptr) (gst_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET))
7820 fprintf (file, _("cannot read GST\n"));
7824 fprintf (file, _("Global symbol table:\n"));
7825 evax_bfd_print_eobj (abfd, file);
7830 struct vms_eiaf *eiaf;
7831 unsigned int qrelfixoff;
7832 unsigned int lrelfixoff;
7833 unsigned int qdotadroff;
7834 unsigned int ldotadroff;
7835 unsigned int shrimgcnt;
7836 unsigned int shlstoff;
7837 unsigned int codeadroff;
7838 unsigned int lpfixoff;
7839 unsigned int chgprtoff;
7841 buf = bfd_malloc (eiaf_size);
7843 if (bfd_seek (abfd, (file_ptr) (eiaf_vbn - 1) * VMS_BLOCK_SIZE, SEEK_SET)
7844 || bfd_bread (buf, eiaf_size, abfd) != eiaf_size)
7846 fprintf (file, _("cannot read EIHA\n"));
7850 eiaf = (struct vms_eiaf *)buf;
7852 /* xgettext:c-format */
7853 _("Image activator fixup: (major: %u, minor: %u)\n"),
7854 (unsigned)bfd_getl32 (eiaf->majorid),
7855 (unsigned)bfd_getl32 (eiaf->minorid));
7856 /* xgettext:c-format */
7857 fprintf (file, _(" iaflink : 0x%08x %08x\n"),
7858 (unsigned)bfd_getl32 (eiaf->iaflink + 0),
7859 (unsigned)bfd_getl32 (eiaf->iaflink + 4));
7860 /* xgettext:c-format */
7861 fprintf (file, _(" fixuplnk: 0x%08x %08x\n"),
7862 (unsigned)bfd_getl32 (eiaf->fixuplnk + 0),
7863 (unsigned)bfd_getl32 (eiaf->fixuplnk + 4));
7864 fprintf (file, _(" size : %u\n"),
7865 (unsigned)bfd_getl32 (eiaf->size));
7866 fprintf (file, _(" flags: 0x%08x\n"),
7867 (unsigned)bfd_getl32 (eiaf->flags));
7868 qrelfixoff = bfd_getl32 (eiaf->qrelfixoff);
7869 lrelfixoff = bfd_getl32 (eiaf->lrelfixoff);
7870 /* xgettext:c-format */
7871 fprintf (file, _(" qrelfixoff: %5u, lrelfixoff: %5u\n"),
7872 qrelfixoff, lrelfixoff);
7873 qdotadroff = bfd_getl32 (eiaf->qdotadroff);
7874 ldotadroff = bfd_getl32 (eiaf->ldotadroff);
7875 /* xgettext:c-format */
7876 fprintf (file, _(" qdotadroff: %5u, ldotadroff: %5u\n"),
7877 qdotadroff, ldotadroff);
7878 codeadroff = bfd_getl32 (eiaf->codeadroff);
7879 lpfixoff = bfd_getl32 (eiaf->lpfixoff);
7880 /* xgettext:c-format */
7881 fprintf (file, _(" codeadroff: %5u, lpfixoff : %5u\n"),
7882 codeadroff, lpfixoff);
7883 chgprtoff = bfd_getl32 (eiaf->chgprtoff);
7884 fprintf (file, _(" chgprtoff : %5u\n"), chgprtoff);
7885 shrimgcnt = bfd_getl32 (eiaf->shrimgcnt);
7886 shlstoff = bfd_getl32 (eiaf->shlstoff);
7887 /* xgettext:c-format */
7888 fprintf (file, _(" shlstoff : %5u, shrimgcnt : %5u\n"),
7889 shlstoff, shrimgcnt);
7890 /* xgettext:c-format */
7891 fprintf (file, _(" shlextra : %5u, permctx : %5u\n"),
7892 (unsigned)bfd_getl32 (eiaf->shlextra),
7893 (unsigned)bfd_getl32 (eiaf->permctx));
7894 fprintf (file, _(" base_va : 0x%08x\n"),
7895 (unsigned)bfd_getl32 (eiaf->base_va));
7896 fprintf (file, _(" lppsbfixoff: %5u\n"),
7897 (unsigned)bfd_getl32 (eiaf->lppsbfixoff));
7901 struct vms_shl *shl = (struct vms_shl *)(buf + shlstoff);
7904 fprintf (file, _(" Shareable images:\n"));
7905 for (j = 0; j < shrimgcnt; j++, shl++)
7908 /* xgettext:c-format */
7909 _(" %u: size: %u, flags: 0x%02x, name: %.*s\n"),
7910 j, shl->size, shl->flags,
7911 shl->imgnam[0], shl->imgnam + 1);
7914 if (qrelfixoff != 0)
7916 fprintf (file, _(" quad-word relocation fixups:\n"));
7917 evax_bfd_print_relocation_records (file, buf + qrelfixoff, 8);
7919 if (lrelfixoff != 0)
7921 fprintf (file, _(" long-word relocation fixups:\n"));
7922 evax_bfd_print_relocation_records (file, buf + lrelfixoff, 4);
7924 if (qdotadroff != 0)
7926 fprintf (file, _(" quad-word .address reference fixups:\n"));
7927 evax_bfd_print_address_fixups (file, buf + qdotadroff);
7929 if (ldotadroff != 0)
7931 fprintf (file, _(" long-word .address reference fixups:\n"));
7932 evax_bfd_print_address_fixups (file, buf + ldotadroff);
7934 if (codeadroff != 0)
7936 fprintf (file, _(" Code Address Reference Fixups:\n"));
7937 evax_bfd_print_reference_fixups (file, buf + codeadroff);
7941 fprintf (file, _(" Linkage Pairs Reference Fixups:\n"));
7942 evax_bfd_print_reference_fixups (file, buf + lpfixoff);
7946 unsigned int count = (unsigned)bfd_getl32 (buf + chgprtoff);
7947 struct vms_eicp *eicp = (struct vms_eicp *)(buf + chgprtoff + 4);
7950 fprintf (file, _(" Change Protection (%u entries):\n"), count);
7951 for (j = 0; j < count; j++, eicp++)
7953 unsigned int prot = bfd_getl32 (eicp->newprt);
7955 /* xgettext:c-format */
7956 _(" base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
7957 (unsigned)bfd_getl32 (eicp->baseva + 4),
7958 (unsigned)bfd_getl32 (eicp->baseva + 0),
7959 (unsigned)bfd_getl32 (eicp->size),
7960 (unsigned)bfd_getl32 (eicp->newprt));
7964 fprintf (file, "NA");
7966 case PRT__C_RESERVED:
7967 fprintf (file, "RES");
7970 fprintf (file, "KW");
7973 fprintf (file, "KR");
7976 fprintf (file, "UW");
7979 fprintf (file, "EW");
7982 fprintf (file, "ERKW");
7985 fprintf (file, "ER");
7988 fprintf (file, "SW");
7991 fprintf (file, "SREW");
7994 fprintf (file, "SRKW");
7997 fprintf (file, "SR");
8000 fprintf (file, "URSW");
8003 fprintf (file, "UREW");
8006 fprintf (file, "URKW");
8009 fprintf (file, "UR");
8023 vms_bfd_print_private_bfd_data (bfd *abfd, void *ptr)
8025 FILE *file = (FILE *)ptr;
8027 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
8028 evax_bfd_print_image (abfd, file);
8031 if (bfd_seek (abfd, 0, SEEK_SET))
8033 evax_bfd_print_eobj (abfd, file);
8040 /* Slurp ETIR/EDBG/ETBT VMS object records. */
8043 alpha_vms_read_sections_content (bfd *abfd, struct bfd_link_info *info)
8045 asection *cur_section;
8046 file_ptr cur_offset;
8047 asection *dst_section;
8048 file_ptr dst_offset;
8050 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
8056 dst_section = PRIV (dst_section);
8060 if (info->strip == strip_all || info->strip == strip_debugger)
8062 /* Discard the DST section. */
8066 else if (dst_section)
8068 dst_offset = dst_section->output_offset;
8069 dst_section = dst_section->output_section;
8078 type = _bfd_vms_get_object_record (abfd);
8081 vms_debug2 ((2, "next_record failed\n"));
8087 PRIV (image_section) = cur_section;
8088 PRIV (image_offset) = cur_offset;
8089 res = _bfd_vms_slurp_etir (abfd, info);
8090 cur_section = PRIV (image_section);
8091 cur_offset = PRIV (image_offset);
8095 if (dst_section == NULL)
8097 PRIV (image_section) = dst_section;
8098 PRIV (image_offset) = dst_offset;
8099 res = _bfd_vms_slurp_etir (abfd, info);
8100 dst_offset = PRIV (image_offset);
8109 vms_debug2 ((2, "slurp eobj type %d failed\n", type));
8116 alpha_vms_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
8117 struct bfd_link_info *info ATTRIBUTE_UNUSED)
8122 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
8125 alpha_vms_add_fixup_lp (struct bfd_link_info *info, bfd *src, bfd *shlib)
8127 struct alpha_vms_shlib_el *sl;
8128 asection *sect = PRIV2 (src, image_section);
8129 file_ptr offset = PRIV2 (src, image_offset);
8131 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8132 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8133 sl->has_fixups = TRUE;
8134 VEC_APPEND_EL (sl->lp, bfd_vma,
8135 sect->output_section->vma + sect->output_offset + offset);
8136 sect->output_section->flags |= SEC_RELOC;
8139 /* Add a code address fixup at address SECT + OFFSET to SHLIB. */
8142 alpha_vms_add_fixup_ca (struct bfd_link_info *info, bfd *src, bfd *shlib)
8144 struct alpha_vms_shlib_el *sl;
8145 asection *sect = PRIV2 (src, image_section);
8146 file_ptr offset = PRIV2 (src, image_offset);
8148 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8149 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8150 sl->has_fixups = TRUE;
8151 VEC_APPEND_EL (sl->ca, bfd_vma,
8152 sect->output_section->vma + sect->output_offset + offset);
8153 sect->output_section->flags |= SEC_RELOC;
8156 /* Add a quad word relocation fixup at address SECT + OFFSET to SHLIB. */
8159 alpha_vms_add_fixup_qr (struct bfd_link_info *info, bfd *src,
8160 bfd *shlib, bfd_vma vec)
8162 struct alpha_vms_shlib_el *sl;
8163 struct alpha_vms_vma_ref *r;
8164 asection *sect = PRIV2 (src, image_section);
8165 file_ptr offset = PRIV2 (src, image_offset);
8167 sl = &VEC_EL (alpha_vms_link_hash (info)->shrlibs,
8168 struct alpha_vms_shlib_el, PRIV2 (shlib, shr_index));
8169 sl->has_fixups = TRUE;
8170 r = VEC_APPEND (sl->qr, struct alpha_vms_vma_ref);
8171 r->vma = sect->output_section->vma + sect->output_offset + offset;
8173 sect->output_section->flags |= SEC_RELOC;
8177 alpha_vms_add_fixup_lr (struct bfd_link_info *info ATTRIBUTE_UNUSED,
8178 unsigned int shr ATTRIBUTE_UNUSED,
8179 bfd_vma vec ATTRIBUTE_UNUSED)
8181 /* Not yet supported. */
8185 /* Add relocation. FIXME: Not yet emitted. */
8188 alpha_vms_add_lw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8193 alpha_vms_add_qw_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED)
8197 static struct bfd_hash_entry *
8198 alpha_vms_link_hash_newfunc (struct bfd_hash_entry *entry,
8199 struct bfd_hash_table *table,
8202 struct alpha_vms_link_hash_entry *ret =
8203 (struct alpha_vms_link_hash_entry *) entry;
8205 /* Allocate the structure if it has not already been allocated by a
8208 ret = ((struct alpha_vms_link_hash_entry *)
8209 bfd_hash_allocate (table,
8210 sizeof (struct alpha_vms_link_hash_entry)));
8214 /* Call the allocation method of the superclass. */
8215 ret = ((struct alpha_vms_link_hash_entry *)
8216 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
8221 return (struct bfd_hash_entry *) ret;
8224 /* Create an Alpha/VMS link hash table. */
8226 static struct bfd_link_hash_table *
8227 alpha_vms_bfd_link_hash_table_create (bfd *abfd)
8229 struct alpha_vms_link_hash_table *ret;
8230 bfd_size_type amt = sizeof (struct alpha_vms_link_hash_table);
8232 ret = (struct alpha_vms_link_hash_table *) bfd_malloc (amt);
8235 if (!_bfd_link_hash_table_init (&ret->root, abfd,
8236 alpha_vms_link_hash_newfunc,
8237 sizeof (struct alpha_vms_link_hash_entry)))
8243 VEC_INIT (ret->shrlibs);
8250 alpha_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
8254 for (i = 0; i < PRIV (gsd_sym_count); i++)
8256 struct vms_symbol_entry *e = PRIV (syms)[i];
8257 struct alpha_vms_link_hash_entry *h;
8258 struct bfd_link_hash_entry *h_root;
8261 if (!alpha_vms_convert_symbol (abfd, e, &sym))
8264 if ((e->flags & EGSY__V_DEF) && abfd->selective_search)
8266 /* In selective_search mode, only add definition that are
8268 h = (struct alpha_vms_link_hash_entry *)bfd_link_hash_lookup
8269 (info->hash, sym.name, FALSE, FALSE, FALSE);
8270 if (h == NULL || h->root.type != bfd_link_hash_undefined)
8276 h_root = (struct bfd_link_hash_entry *) h;
8277 if (!_bfd_generic_link_add_one_symbol (info, abfd, sym.name, sym.flags,
8278 sym.section, sym.value, NULL,
8279 FALSE, FALSE, &h_root))
8281 h = (struct alpha_vms_link_hash_entry *) h_root;
8283 if ((e->flags & EGSY__V_DEF)
8285 && abfd->xvec == info->output_bfd->xvec)
8289 if (abfd->flags & DYNAMIC)
8291 struct alpha_vms_shlib_el *shlib;
8293 /* We do not want to include any of the sections in a dynamic
8294 object in the output file. See comment in elflink.c. */
8295 bfd_section_list_clear (abfd);
8297 shlib = VEC_APPEND (alpha_vms_link_hash (info)->shrlibs,
8298 struct alpha_vms_shlib_el);
8300 VEC_INIT (shlib->ca);
8301 VEC_INIT (shlib->lp);
8302 VEC_INIT (shlib->qr);
8303 PRIV (shr_index) = VEC_COUNT (alpha_vms_link_hash (info)->shrlibs) - 1;
8310 alpha_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
8313 struct bfd_link_hash_entry **pundef;
8314 struct bfd_link_hash_entry **next_pundef;
8316 /* We only accept VMS libraries. */
8317 if (info->output_bfd->xvec != abfd->xvec)
8319 bfd_set_error (bfd_error_wrong_format);
8323 /* The archive_pass field in the archive itself is used to
8324 initialize PASS, since we may search the same archive multiple
8326 pass = ++abfd->archive_pass;
8328 /* Look through the list of undefined symbols. */
8329 for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef)
8331 struct bfd_link_hash_entry *h;
8337 next_pundef = &(*pundef)->u.undef.next;
8339 /* When a symbol is defined, it is not necessarily removed from
8341 if (h->type != bfd_link_hash_undefined
8342 && h->type != bfd_link_hash_common)
8344 /* Remove this entry from the list, for general cleanliness
8345 and because we are going to look through the list again
8346 if we search any more libraries. We can't remove the
8347 entry if it is the tail, because that would lose any
8348 entries we add to the list later on. */
8349 if (*pundef != info->hash->undefs_tail)
8351 *pundef = *next_pundef;
8352 next_pundef = pundef;
8357 /* Look for this symbol in the archive hash table. */
8358 symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string);
8359 if (symidx == BFD_NO_MORE_SYMBOLS)
8361 /* Nothing in this slot. */
8365 element = bfd_get_elt_at_index (abfd, symidx);
8366 if (element == NULL)
8369 if (element->archive_pass == -1 || element->archive_pass == pass)
8371 /* Next symbol if this archive is wrong or already handled. */
8375 if (! bfd_check_format (element, bfd_object))
8377 element->archive_pass = -1;
8381 orig_element = element;
8382 if (bfd_is_thin_archive (abfd))
8384 element = _bfd_vms_lib_get_imagelib_file (element);
8385 if (element == NULL || !bfd_check_format (element, bfd_object))
8387 orig_element->archive_pass = -1;
8392 /* Unlike the generic linker, we know that this element provides
8393 a definition for an undefined symbol and we know that we want
8394 to include it. We don't need to check anything. */
8395 if (!(*info->callbacks
8396 ->add_archive_element) (info, element, h->root.string, &element))
8398 if (!alpha_vms_link_add_object_symbols (element, info))
8401 orig_element->archive_pass = pass;
8408 alpha_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
8410 switch (bfd_get_format (abfd))
8413 vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
8415 return alpha_vms_link_add_object_symbols (abfd, info);
8418 vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
8420 return alpha_vms_link_add_archive_symbols (abfd, info);
8423 bfd_set_error (bfd_error_wrong_format);
8429 alpha_vms_build_fixups (struct bfd_link_info *info)
8431 struct alpha_vms_link_hash_table *t = alpha_vms_link_hash (info);
8432 unsigned char *content;
8434 unsigned int sz = 0;
8435 unsigned int lp_sz = 0;
8436 unsigned int ca_sz = 0;
8437 unsigned int qr_sz = 0;
8438 unsigned int shrimg_cnt = 0;
8439 unsigned int chgprt_num = 0;
8440 unsigned int chgprt_sz = 0;
8441 struct vms_eiaf *eiaf;
8445 /* Shared libraries. */
8446 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8448 struct alpha_vms_shlib_el *shlib;
8450 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8452 if (!shlib->has_fixups)
8457 if (VEC_COUNT (shlib->ca) > 0)
8459 /* Header + entries. */
8461 ca_sz += VEC_COUNT (shlib->ca) * 4;
8463 if (VEC_COUNT (shlib->lp) > 0)
8465 /* Header + entries. */
8467 lp_sz += VEC_COUNT (shlib->lp) * 4;
8469 if (VEC_COUNT (shlib->qr) > 0)
8471 /* Header + entries. */
8473 qr_sz += VEC_COUNT (shlib->qr) * 8;
8484 /* Finish now if there is no content. */
8485 if (ca_sz + lp_sz + qr_sz == 0)
8488 /* Add an eicp entry for the fixup itself. */
8490 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
8492 /* This isect could be made RO or EXE after relocations are applied. */
8493 if ((sec->flags & SEC_RELOC) != 0
8494 && (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
8497 chgprt_sz = 4 + chgprt_num * sizeof (struct vms_eicp);
8499 /* Allocate section content (round-up size) */
8500 sz = sizeof (struct vms_eiaf) + shrimg_cnt * sizeof (struct vms_shl)
8501 + ca_sz + lp_sz + qr_sz + chgprt_sz;
8502 sz = (sz + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1);
8503 content = bfd_zalloc (info->output_bfd, sz);
8504 if (content == NULL)
8507 sec = alpha_vms_link_hash (info)->fixup;
8508 sec->contents = content;
8511 eiaf = (struct vms_eiaf *)content;
8512 off = sizeof (struct vms_eiaf);
8513 bfd_putl32 (0, eiaf->majorid);
8514 bfd_putl32 (0, eiaf->minorid);
8515 bfd_putl32 (0, eiaf->iaflink);
8516 bfd_putl32 (0, eiaf->fixuplnk);
8517 bfd_putl32 (sizeof (struct vms_eiaf), eiaf->size);
8518 bfd_putl32 (0, eiaf->flags);
8519 bfd_putl32 (0, eiaf->qrelfixoff);
8520 bfd_putl32 (0, eiaf->lrelfixoff);
8521 bfd_putl32 (0, eiaf->qdotadroff);
8522 bfd_putl32 (0, eiaf->ldotadroff);
8523 bfd_putl32 (0, eiaf->codeadroff);
8524 bfd_putl32 (0, eiaf->lpfixoff);
8525 bfd_putl32 (0, eiaf->chgprtoff);
8526 bfd_putl32 (shrimg_cnt ? off : 0, eiaf->shlstoff);
8527 bfd_putl32 (shrimg_cnt, eiaf->shrimgcnt);
8528 bfd_putl32 (0, eiaf->shlextra);
8529 bfd_putl32 (0, eiaf->permctx);
8530 bfd_putl32 (0, eiaf->base_va);
8531 bfd_putl32 (0, eiaf->lppsbfixoff);
8538 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8540 struct alpha_vms_shlib_el *shlib;
8541 struct vms_shl *shl;
8543 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8545 if (!shlib->has_fixups)
8548 /* Renumber shared images. */
8549 PRIV2 (shlib->abfd, shr_index) = shrimg_cnt++;
8551 shl = (struct vms_shl *)(content + off);
8552 bfd_putl32 (0, shl->baseva);
8553 bfd_putl32 (0, shl->shlptr);
8554 bfd_putl32 (0, shl->ident);
8555 bfd_putl32 (0, shl->permctx);
8556 shl->size = sizeof (struct vms_shl);
8557 bfd_putl16 (0, shl->fill_1);
8559 bfd_putl32 (0, shl->icb);
8560 shl->imgnam[0] = strlen (PRIV2 (shlib->abfd, hdr_data.hdr_t_name));
8561 memcpy (shl->imgnam + 1, PRIV2 (shlib->abfd, hdr_data.hdr_t_name),
8564 off += sizeof (struct vms_shl);
8570 bfd_putl32 (off, eiaf->codeadroff);
8572 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8574 struct alpha_vms_shlib_el *shlib;
8577 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8579 if (VEC_COUNT (shlib->ca) == 0)
8582 bfd_putl32 (VEC_COUNT (shlib->ca), content + off);
8583 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8586 for (j = 0; j < VEC_COUNT (shlib->ca); j++)
8588 bfd_putl32 (VEC_EL (shlib->ca, bfd_vma, j) - t->base_addr,
8594 bfd_putl32 (0, content + off);
8595 bfd_putl32 (0, content + off + 4);
8602 bfd_putl32 (off, eiaf->lpfixoff);
8604 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8606 struct alpha_vms_shlib_el *shlib;
8609 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8611 if (VEC_COUNT (shlib->lp) == 0)
8614 bfd_putl32 (VEC_COUNT (shlib->lp), content + off);
8615 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8618 for (j = 0; j < VEC_COUNT (shlib->lp); j++)
8620 bfd_putl32 (VEC_EL (shlib->lp, bfd_vma, j) - t->base_addr,
8626 bfd_putl32 (0, content + off);
8627 bfd_putl32 (0, content + off + 4);
8634 bfd_putl32 (off, eiaf->qdotadroff);
8636 for (i = 0; i < VEC_COUNT (t->shrlibs); i++)
8638 struct alpha_vms_shlib_el *shlib;
8641 shlib = &VEC_EL (t->shrlibs, struct alpha_vms_shlib_el, i);
8643 if (VEC_COUNT (shlib->qr) == 0)
8646 bfd_putl32 (VEC_COUNT (shlib->qr), content + off);
8647 bfd_putl32 (PRIV2 (shlib->abfd, shr_index), content + off + 4);
8650 for (j = 0; j < VEC_COUNT (shlib->qr); j++)
8652 struct alpha_vms_vma_ref *r;
8653 r = &VEC_EL (shlib->qr, struct alpha_vms_vma_ref, j);
8654 bfd_putl32 (r->vma - t->base_addr, content + off);
8655 bfd_putl32 (r->ref, content + off + 4);
8660 bfd_putl32 (0, content + off);
8661 bfd_putl32 (0, content + off + 4);
8666 /* Write the change protection table. */
8667 bfd_putl32 (off, eiaf->chgprtoff);
8668 bfd_putl32 (chgprt_num, content + off);
8671 for (sec = info->output_bfd->sections; sec != NULL; sec = sec->next)
8673 struct vms_eicp *eicp;
8676 if ((sec->flags & SEC_LINKER_CREATED) != 0 &&
8677 strcmp (sec->name, "$FIXUP$") == 0)
8679 else if ((sec->flags & SEC_RELOC) != 0
8680 && (sec->flags & (SEC_CODE | SEC_READONLY)) != 0)
8685 eicp = (struct vms_eicp *)(content + off);
8686 bfd_putl64 (sec->vma - t->base_addr, eicp->baseva);
8687 bfd_putl32 ((sec->size + VMS_BLOCK_SIZE - 1) & ~(VMS_BLOCK_SIZE - 1),
8689 bfd_putl32 (prot, eicp->newprt);
8690 off += sizeof (struct vms_eicp);
8696 /* Called by bfd_hash_traverse to fill the symbol table.
8697 Return FALSE in case of failure. */
8700 alpha_vms_link_output_symbol (struct bfd_hash_entry *bh, void *infov)
8702 struct bfd_link_hash_entry *hc = (struct bfd_link_hash_entry *) bh;
8703 struct bfd_link_info *info = (struct bfd_link_info *)infov;
8704 struct alpha_vms_link_hash_entry *h;
8705 struct vms_symbol_entry *sym;
8707 if (hc->type == bfd_link_hash_warning)
8710 if (hc->type == bfd_link_hash_new)
8713 h = (struct alpha_vms_link_hash_entry *) hc;
8715 switch (h->root.type)
8717 case bfd_link_hash_undefined:
8719 case bfd_link_hash_new:
8720 case bfd_link_hash_warning:
8722 case bfd_link_hash_undefweak:
8724 case bfd_link_hash_defined:
8725 case bfd_link_hash_defweak:
8727 asection *sec = h->root.u.def.section;
8729 /* FIXME: this is certainly a symbol from a dynamic library. */
8730 if (bfd_is_abs_section (sec))
8733 if (sec->owner->flags & DYNAMIC)
8737 case bfd_link_hash_common:
8739 case bfd_link_hash_indirect:
8743 /* Do not write not kept symbols. */
8744 if (info->strip == strip_some
8745 && bfd_hash_lookup (info->keep_hash, h->root.root.string,
8746 FALSE, FALSE) != NULL)
8751 /* This symbol doesn't come from a VMS object. So we suppose it is
8753 int len = strlen (h->root.root.string);
8755 sym = (struct vms_symbol_entry *)bfd_zalloc (info->output_bfd,
8756 sizeof (*sym) + len);
8760 memcpy (sym->name, h->root.root.string, len);
8762 sym->owner = info->output_bfd;
8764 sym->typ = EGSD__C_SYMG;
8766 sym->flags = EGSY__V_DEF | EGSY__V_REL;
8767 sym->symbol_vector = h->root.u.def.value;
8768 sym->section = h->root.u.def.section;
8769 sym->value = h->root.u.def.value;
8774 if (!add_symbol_entry (info->output_bfd, sym))
8781 alpha_vms_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
8784 struct bfd_link_order *p;
8792 if (bfd_link_relocatable (info))
8794 /* FIXME: we do not yet support relocatable link. It is not obvious
8795 how to do it for debug infos. */
8796 (*info->callbacks->einfo)(_("%P: relocatable link is not supported\n"));
8800 bfd_get_outsymbols (abfd) = NULL;
8801 bfd_get_symcount (abfd) = 0;
8803 /* Mark all sections which will be included in the output file. */
8804 for (o = abfd->sections; o != NULL; o = o->next)
8805 for (p = o->map_head.link_order; p != NULL; p = p->next)
8806 if (p->type == bfd_indirect_link_order)
8807 p->u.indirect.section->linker_mark = TRUE;
8810 /* Handle all the link order information for the sections. */
8811 for (o = abfd->sections; o != NULL; o = o->next)
8813 printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
8814 o->name, (unsigned)o->vma, (unsigned)o->flags);
8816 for (p = o->map_head.link_order; p != NULL; p = p->next)
8818 printf (" at 0x%08x - 0x%08x: ",
8819 (unsigned)p->offset, (unsigned)(p->offset + p->size - 1));
8822 case bfd_section_reloc_link_order:
8823 case bfd_symbol_reloc_link_order:
8824 printf (" section/symbol reloc\n");
8826 case bfd_indirect_link_order:
8827 printf (" section %s of %s\n",
8828 p->u.indirect.section->name,
8829 p->u.indirect.section->owner->filename);
8831 case bfd_data_link_order:
8832 printf (" explicit data\n");
8835 printf (" *unknown* type %u\n", p->type);
8842 /* Generate the symbol table. */
8843 BFD_ASSERT (PRIV (syms) == NULL);
8844 if (info->strip != strip_all)
8845 bfd_hash_traverse (&info->hash->table, alpha_vms_link_output_symbol, info);
8847 /* Find the entry point. */
8848 if (bfd_get_start_address (abfd) == 0)
8850 bfd *startbfd = NULL;
8852 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
8854 /* Consider only VMS object files. */
8855 if (sub->xvec != abfd->xvec)
8858 if (!PRIV2 (sub, eom_data).eom_has_transfer)
8860 if ((PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR) && startbfd)
8862 if (startbfd != NULL
8863 && !(PRIV2 (sub, eom_data).eom_b_tfrflg & EEOM__M_WKTFR))
8865 (*info->callbacks->einfo)
8866 /* xgettext:c-format */
8867 (_("%P: multiple entry points: in modules %B and %B\n"),
8876 unsigned int ps_idx = PRIV2 (startbfd, eom_data).eom_l_psindx;
8877 bfd_vma tfradr = PRIV2 (startbfd, eom_data).eom_l_tfradr;
8880 sec = PRIV2 (startbfd, sections)[ps_idx];
8882 bfd_set_start_address
8883 (abfd, sec->output_section->vma + sec->output_offset + tfradr);
8887 /* Set transfer addresses. */
8890 struct bfd_link_hash_entry *h;
8893 PRIV (transfer_address[i++]) = 0xffffffff00000340ULL; /* SYS$IMGACT */
8894 h = bfd_link_hash_lookup (info->hash, "LIB$INITIALIZE", FALSE, FALSE, TRUE);
8895 if (h != NULL && h->type == bfd_link_hash_defined)
8896 PRIV (transfer_address[i++]) =
8897 alpha_vms_get_sym_value (h->u.def.section, h->u.def.value);
8898 PRIV (transfer_address[i++]) = bfd_get_start_address (abfd);
8900 PRIV (transfer_address[i++]) = 0;
8903 /* Allocate contents.
8904 Also compute the virtual base address. */
8905 base_addr = (bfd_vma)-1;
8907 for (o = abfd->sections; o != NULL; o = o->next)
8909 if (o->flags & SEC_HAS_CONTENTS)
8911 o->contents = bfd_alloc (abfd, o->size);
8912 if (o->contents == NULL)
8915 if (o->flags & SEC_LOAD)
8917 if (o->vma < base_addr)
8919 if (o->vma + o->size > last_addr)
8920 last_addr = o->vma + o->size;
8922 /* Clear the RELOC flags. Currently we don't support incremental
8923 linking. We use the RELOC flag for computing the eicp entries. */
8924 o->flags &= ~SEC_RELOC;
8927 /* Create the fixup section. */
8928 fixupsec = bfd_make_section_anyway_with_flags
8929 (info->output_bfd, "$FIXUP$",
8930 SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
8931 if (fixupsec == NULL)
8933 last_addr = (last_addr + 0xffff) & ~0xffff;
8934 fixupsec->vma = last_addr;
8936 alpha_vms_link_hash (info)->fixup = fixupsec;
8937 alpha_vms_link_hash (info)->base_addr = base_addr;
8939 /* Create the DMT section, if necessary. */
8940 BFD_ASSERT (PRIV (dst_section) == NULL);
8941 dst = bfd_get_section_by_name (abfd, "$DST$");
8942 if (dst != NULL && dst->size == 0)
8946 PRIV (dst_section) = dst;
8947 dmt = bfd_make_section_anyway_with_flags
8948 (info->output_bfd, "$DMT$",
8949 SEC_DEBUGGING | SEC_HAS_CONTENTS | SEC_LINKER_CREATED);
8956 /* Read all sections from the inputs. */
8957 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
8959 if (sub->flags & DYNAMIC)
8961 alpha_vms_create_eisd_for_shared (abfd, sub);
8965 if (!alpha_vms_read_sections_content (sub, info))
8969 /* Handle all the link order information for the sections.
8970 Note: past this point, it is not possible to create new sections. */
8971 for (o = abfd->sections; o != NULL; o = o->next)
8973 for (p = o->map_head.link_order; p != NULL; p = p->next)
8977 case bfd_section_reloc_link_order:
8978 case bfd_symbol_reloc_link_order:
8981 case bfd_indirect_link_order:
8985 if (! _bfd_default_link_order (abfd, info, o, p))
8992 /* Compute fixups. */
8993 if (!alpha_vms_build_fixups (info))
8996 /* Compute the DMT. */
9000 unsigned char *contents = NULL;
9002 /* In pass 1, compute the size. In pass 2, write the DMT contents. */
9003 for (pass = 0; pass < 2; pass++)
9005 unsigned int off = 0;
9007 /* For each object file (ie for each module). */
9008 for (sub = info->input_bfds; sub != NULL; sub = sub->link.next)
9011 struct vms_dmt_header *dmth = NULL;
9012 unsigned int psect_count;
9014 /* Skip this module if it has no DST. */
9015 sub_dst = PRIV2 (sub, dst_section);
9016 if (sub_dst == NULL || sub_dst->size == 0)
9021 /* Write the header. */
9022 dmth = (struct vms_dmt_header *)(contents + off);
9023 bfd_putl32 (sub_dst->output_offset, dmth->modbeg);
9024 bfd_putl32 (sub_dst->size, dmth->size);
9027 off += sizeof (struct vms_dmt_header);
9030 /* For each section (ie for each psect). */
9031 for (o = sub->sections; o != NULL; o = o->next)
9033 /* Only consider interesting sections. */
9034 if (!(o->flags & SEC_ALLOC))
9036 if (o->flags & SEC_LINKER_CREATED)
9041 /* Write an entry. */
9042 struct vms_dmt_psect *dmtp;
9044 dmtp = (struct vms_dmt_psect *)(contents + off);
9045 bfd_putl32 (o->output_offset + o->output_section->vma,
9047 bfd_putl32 (o->size, dmtp->length);
9050 off += sizeof (struct vms_dmt_psect);
9053 bfd_putl32 (psect_count, dmth->psect_count);
9058 contents = bfd_zalloc (info->output_bfd, off);
9059 if (contents == NULL)
9061 dmt->contents = contents;
9066 BFD_ASSERT (off == dmt->size);
9074 /* Read the contents of a section.
9075 buf points to a buffer of buf_size bytes to be filled with
9076 section data (starting at offset into section) */
9079 alpha_vms_get_section_contents (bfd *abfd, asection *section,
9080 void *buf, file_ptr offset,
9081 bfd_size_type count)
9085 /* Image are easy. */
9086 if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC))
9087 return _bfd_generic_get_section_contents (abfd, section,
9088 buf, offset, count);
9091 if (offset + count < count
9092 || offset + count > section->size)
9094 bfd_set_error (bfd_error_invalid_operation);
9098 /* If the section is already in memory, just copy it. */
9099 if (section->flags & SEC_IN_MEMORY)
9101 BFD_ASSERT (section->contents != NULL);
9102 memcpy (buf, section->contents + offset, count);
9105 if (section->size == 0)
9108 /* Alloc in memory and read ETIRs. */
9109 for (sec = abfd->sections; sec; sec = sec->next)
9111 BFD_ASSERT (sec->contents == NULL);
9113 if (sec->size != 0 && (sec->flags & SEC_HAS_CONTENTS))
9115 sec->contents = bfd_alloc (abfd, sec->size);
9116 if (sec->contents == NULL)
9120 if (!alpha_vms_read_sections_content (abfd, NULL))
9122 for (sec = abfd->sections; sec; sec = sec->next)
9124 sec->flags |= SEC_IN_MEMORY;
9125 memcpy (buf, section->contents + offset, count);
9130 /* Set the format of a file being written. */
9133 alpha_vms_mkobject (bfd * abfd)
9135 const bfd_arch_info_type *arch;
9137 vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd));
9139 if (!vms_initialize (abfd))
9142 PRIV (recwr.buf) = bfd_alloc (abfd, MAX_OUTREC_SIZE);
9143 if (PRIV (recwr.buf) == NULL)
9146 arch = bfd_scan_arch ("alpha");
9150 bfd_set_error (bfd_error_wrong_format);
9154 abfd->arch_info = arch;
9161 /* Called when the BFD is being closed to do any necessary cleanup. */
9164 vms_close_and_cleanup (bfd * abfd)
9166 vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd));
9168 if (abfd == NULL || abfd->tdata.any == NULL)
9171 if (abfd->format == bfd_archive)
9173 bfd_release (abfd, abfd->tdata.any);
9174 abfd->tdata.any = NULL;
9178 if (PRIV (recrd.buf) != NULL)
9179 free (PRIV (recrd.buf));
9181 if (PRIV (sections) != NULL)
9182 free (PRIV (sections));
9184 bfd_release (abfd, abfd->tdata.any);
9185 abfd->tdata.any = NULL;
9188 if (abfd->direction == write_direction)
9190 /* Last step on VMS is to convert the file to variable record length
9192 if (!bfd_cache_close (abfd))
9194 if (!_bfd_vms_convert_to_var_unix_filename (abfd->filename))
9202 /* Called when a new section is created. */
9205 vms_new_section_hook (bfd * abfd, asection *section)
9209 vms_debug2 ((1, "vms_new_section_hook (%p, [%u]%s)\n",
9210 abfd, section->index, section->name));
9212 if (! bfd_set_section_alignment (abfd, section, 0))
9215 vms_debug2 ((7, "%u: %s\n", section->index, section->name));
9217 amt = sizeof (struct vms_section_data_struct);
9218 section->used_by_bfd = bfd_zalloc (abfd, amt);
9219 if (section->used_by_bfd == NULL)
9222 /* Create the section symbol. */
9223 return _bfd_generic_new_section_hook (abfd, section);
9226 /* Part 4.5, symbols. */
9228 /* Print symbol to file according to how. how is one of
9229 bfd_print_symbol_name just print the name
9230 bfd_print_symbol_more print more (???)
9231 bfd_print_symbol_all print all we know, which is not much right now :-). */
9234 vms_print_symbol (bfd * abfd,
9237 bfd_print_symbol_type how)
9239 vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
9240 abfd, file, symbol, how));
9244 case bfd_print_symbol_name:
9245 case bfd_print_symbol_more:
9246 fprintf ((FILE *)file," %s", symbol->name);
9249 case bfd_print_symbol_all:
9251 const char *section_name = symbol->section->name;
9253 bfd_print_symbol_vandf (abfd, file, symbol);
9255 fprintf ((FILE *) file," %-8s %s", section_name, symbol->name);
9261 /* Return information about symbol in ret.
9263 fill type, value and name
9266 B bss segment symbol
9268 D data segment symbol
9270 t a static function symbol
9271 T text segment symbol
9276 vms_get_symbol_info (bfd * abfd ATTRIBUTE_UNUSED,
9282 vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd, symbol, ret));
9284 sec = symbol->section;
9291 else if (bfd_is_com_section (sec))
9293 else if (bfd_is_abs_section (sec))
9295 else if (bfd_is_und_section (sec))
9297 else if (bfd_is_ind_section (sec))
9299 else if ((symbol->flags & BSF_FUNCTION)
9300 || (bfd_get_section_flags (abfd, sec) & SEC_CODE))
9302 else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
9304 else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
9309 if (ret->type != 'U')
9310 ret->value = symbol->value + symbol->section->vma;
9313 ret->name = symbol->name;
9316 /* Return TRUE if the given symbol sym in the BFD abfd is
9317 a compiler generated local label, else return FALSE. */
9320 vms_bfd_is_local_label_name (bfd * abfd ATTRIBUTE_UNUSED,
9323 return name[0] == '$';
9326 /* Part 4.7, writing an object file. */
9328 /* Sets the contents of the section section in BFD abfd to the data starting
9329 in memory at LOCATION. The data is written to the output section starting
9330 at offset offset for count bytes.
9332 Normally TRUE is returned, else FALSE. Possible error returns are:
9333 o bfd_error_no_contents - The output section does not have the
9334 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
9335 o and some more too */
9338 _bfd_vms_set_section_contents (bfd * abfd,
9340 const void * location,
9342 bfd_size_type count)
9344 if (section->contents == NULL)
9346 section->contents = bfd_alloc (abfd, section->size);
9347 if (section->contents == NULL)
9350 memcpy (section->contents + offset, location, (size_t) count);
9356 /* Set the architecture and machine type in BFD abfd to arch and mach.
9357 Find the correct pointer to a structure and insert it into the arch_info
9361 alpha_vms_set_arch_mach (bfd *abfd,
9362 enum bfd_architecture arch, unsigned long mach)
9364 if (arch != bfd_arch_alpha
9365 && arch != bfd_arch_unknown)
9368 return bfd_default_set_arch_mach (abfd, arch, mach);
9371 /* Set section VMS flags. Clear NO_FLAGS and set FLAGS. */
9374 bfd_vms_set_section_flags (bfd *abfd ATTRIBUTE_UNUSED,
9375 asection *sec, flagword no_flags, flagword flags)
9377 vms_section_data (sec)->no_flags = no_flags;
9378 vms_section_data (sec)->flags = flags;
9381 struct vms_private_data_struct *
9382 bfd_vms_get_data (bfd *abfd)
9384 return (struct vms_private_data_struct *)abfd->tdata.any;
9387 #define vms_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9388 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms
9389 #define vms_bfd_copy_link_hash_symbol_type \
9390 _bfd_generic_copy_link_hash_symbol_type
9391 #define vms_bfd_is_group_section bfd_generic_is_group_section
9392 #define vms_bfd_discard_group bfd_generic_discard_group
9393 #define vms_section_already_linked _bfd_generic_section_already_linked
9394 #define vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9395 #define vms_bfd_define_start_stop bfd_generic_define_start_stop
9396 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
9398 #define vms_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
9399 #define vms_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
9400 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
9401 #define vms_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
9402 #define vms_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
9403 #define vms_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
9405 /* Symbols table. */
9406 #define alpha_vms_make_empty_symbol _bfd_generic_make_empty_symbol
9407 #define alpha_vms_bfd_is_target_special_symbol \
9408 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9409 #define alpha_vms_print_symbol vms_print_symbol
9410 #define alpha_vms_get_symbol_info vms_get_symbol_info
9411 #define alpha_vms_get_symbol_version_string \
9412 _bfd_nosymbols_get_symbol_version_string
9414 #define alpha_vms_read_minisymbols _bfd_generic_read_minisymbols
9415 #define alpha_vms_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
9416 #define alpha_vms_get_lineno _bfd_nosymbols_get_lineno
9417 #define alpha_vms_find_inliner_info _bfd_nosymbols_find_inliner_info
9418 #define alpha_vms_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
9419 #define alpha_vms_find_nearest_line _bfd_vms_find_nearest_line
9420 #define alpha_vms_find_line _bfd_nosymbols_find_line
9421 #define alpha_vms_bfd_is_local_label_name vms_bfd_is_local_label_name
9423 /* Generic table. */
9424 #define alpha_vms_close_and_cleanup vms_close_and_cleanup
9425 #define alpha_vms_bfd_free_cached_info vms_bfd_free_cached_info
9426 #define alpha_vms_new_section_hook vms_new_section_hook
9427 #define alpha_vms_set_section_contents _bfd_vms_set_section_contents
9428 #define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
9430 #define alpha_vms_bfd_get_relocated_section_contents \
9431 bfd_generic_get_relocated_section_contents
9433 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
9434 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
9435 #define alpha_vms_bfd_lookup_section_flags bfd_generic_lookup_section_flags
9436 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
9437 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
9438 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
9439 #define alpha_vms_section_already_linked \
9440 _bfd_generic_section_already_linked
9442 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9443 #define alpha_vms_bfd_define_start_stop bfd_generic_define_start_stop
9444 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
9445 #define alpha_vms_bfd_copy_link_hash_symbol_type \
9446 _bfd_generic_copy_link_hash_symbol_type
9448 #define alpha_vms_bfd_link_split_section _bfd_generic_link_split_section
9450 #define alpha_vms_get_dynamic_symtab_upper_bound \
9451 _bfd_nodynamic_get_dynamic_symtab_upper_bound
9452 #define alpha_vms_canonicalize_dynamic_symtab \
9453 _bfd_nodynamic_canonicalize_dynamic_symtab
9454 #define alpha_vms_get_dynamic_reloc_upper_bound \
9455 _bfd_nodynamic_get_dynamic_reloc_upper_bound
9456 #define alpha_vms_canonicalize_dynamic_reloc \
9457 _bfd_nodynamic_canonicalize_dynamic_reloc
9458 #define alpha_vms_bfd_link_check_relocs _bfd_generic_link_check_relocs
9460 const bfd_target alpha_vms_vec =
9462 "vms-alpha", /* Name. */
9463 bfd_target_evax_flavour,
9464 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
9465 BFD_ENDIAN_LITTLE, /* Header byte order is little. */
9467 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
9468 | WP_TEXT | D_PAGED), /* Object flags. */
9469 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
9470 | SEC_READONLY | SEC_CODE | SEC_DATA
9471 | SEC_HAS_CONTENTS | SEC_IN_MEMORY), /* Sect flags. */
9472 0, /* symbol_leading_char. */
9473 ' ', /* ar_pad_char. */
9474 15, /* ar_max_namelen. */
9475 0, /* match priority. */
9476 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9477 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9478 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9479 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
9480 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
9481 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
9483 {_bfd_dummy_target, alpha_vms_object_p, /* bfd_check_format. */
9484 _bfd_vms_lib_alpha_archive_p, _bfd_dummy_target},
9485 {bfd_false, alpha_vms_mkobject, /* bfd_set_format. */
9486 _bfd_vms_lib_alpha_mkarchive, bfd_false},
9487 {bfd_false, alpha_vms_write_object_contents, /* bfd_write_contents. */
9488 _bfd_vms_lib_write_archive_contents, bfd_false},
9490 BFD_JUMP_TABLE_GENERIC (alpha_vms),
9491 BFD_JUMP_TABLE_COPY (vms),
9492 BFD_JUMP_TABLE_CORE (_bfd_nocore),
9493 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib),
9494 BFD_JUMP_TABLE_SYMBOLS (alpha_vms),
9495 BFD_JUMP_TABLE_RELOCS (alpha_vms),
9496 BFD_JUMP_TABLE_WRITE (alpha_vms),
9497 BFD_JUMP_TABLE_LINK (alpha_vms),
9498 BFD_JUMP_TABLE_DYNAMIC (alpha_vms),