1 /* vms.c -- BFD back-end for EVAX (openVMS/Alpha) files.
2 Copyright (C) 1996-2025 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)
51 #include "vms/eihvn.h"
52 #include "vms/eobjrec.h"
55 #include "vms/esgps.h"
64 #include "vms/esdfm.h"
65 #include "vms/esdfv.h"
71 #include "vms/internal.h"
74 #define MIN(a,b) ((a) < (b) ? (a) : (b))
79 /* The r_type field in a reloc is one of the following values. */
80 #define ALPHA_R_IGNORE 0
81 #define ALPHA_R_REFQUAD 1
82 #define ALPHA_R_BRADDR 2
83 #define ALPHA_R_HINT 3
84 #define ALPHA_R_SREL16 4
85 #define ALPHA_R_SREL32 5
86 #define ALPHA_R_SREL64 6
87 #define ALPHA_R_OP_PUSH 7
88 #define ALPHA_R_OP_STORE 8
89 #define ALPHA_R_OP_PSUB 9
90 #define ALPHA_R_OP_PRSHIFT 10
91 #define ALPHA_R_LINKAGE 11
92 #define ALPHA_R_REFLONG 12
93 #define ALPHA_R_CODEADDR 13
94 #define ALPHA_R_NOP 14
95 #define ALPHA_R_BSR 15
96 #define ALPHA_R_LDA 16
97 #define ALPHA_R_BOH 17
99 /* These are used with DST_S_C_LINE_NUM. */
100 #define DST_S_C_LINE_NUM_HEADER_SIZE 4
102 /* These are used with DST_S_C_SOURCE */
104 #define DST_S_B_PCLINE_UNSBYTE 1
105 #define DST_S_W_PCLINE_UNSWORD 1
106 #define DST_S_L_PCLINE_UNSLONG 1
108 #define DST_S_B_MODBEG_NAME 14
109 #define DST_S_L_RTNBEG_ADDRESS 5
110 #define DST_S_B_RTNBEG_NAME 13
111 #define DST_S_L_RTNEND_SIZE 5
113 /* These are used with DST_S_C_SOURCE. */
114 #define DST_S_C_SOURCE_HEADER_SIZE 4
116 #define DST_S_B_SRC_DF_LENGTH 1
117 #define DST_S_W_SRC_DF_FILEID 3
118 #define DST_S_B_SRC_DF_FILENAME 20
119 #define DST_S_B_SRC_UNSBYTE 1
120 #define DST_S_W_SRC_UNSWORD 1
121 #define DST_S_L_SRC_UNSLONG 1
123 /* Debugger symbol definitions. */
125 #define DBG_S_L_DMT_MODBEG 0
126 #define DBG_S_L_DST_SIZE 4
127 #define DBG_S_W_DMT_PSECT_COUNT 8
128 #define DBG_S_C_DMT_HEADER_SIZE 12
130 #define DBG_S_L_DMT_PSECT_START 0
131 #define DBG_S_L_DMT_PSECT_LENGTH 4
132 #define DBG_S_C_DMT_PSECT_SIZE 8
134 /* VMS module header. */
150 #define EMH_DATE_LENGTH 17
152 /* VMS End-Of-Module records (EOM/EEOM). */
156 unsigned int eom_l_total_lps
;
157 unsigned short eom_w_comcod
;
158 bool eom_has_transfer
;
159 unsigned char eom_b_tfrflg
;
160 unsigned int eom_l_psindx
;
161 unsigned int eom_l_tfradr
;
164 struct vms_symbol_entry
170 unsigned char data_type
;
171 unsigned short flags
;
173 /* Section and offset/value of the symbol. */
177 /* Section and offset/value for the entry point (only for subprg). */
178 asection
*code_section
;
179 unsigned int code_value
;
181 /* Symbol vector offset. */
182 unsigned int symbol_vector
;
184 /* Length of the name. */
185 unsigned char namelen
;
190 /* Stack value for push/pop commands. */
198 #define STACKSIZE 128
200 /* A minimal decoding of DST compilation units. We only decode
201 what's needed to get to the line number information. */
211 struct srecinfo
*next
;
219 struct lineinfo
*next
;
226 struct funcinfo
*next
;
234 /* Chain the previously read compilation unit. */
237 /* The module name. */
240 /* The start offset and size of debug info in the DST section. */
244 /* The lowest and highest addresses contained in this compilation
245 unit as specified in the compilation unit header. */
249 /* The listing line table. */
250 struct lineinfo
*line_table
;
252 /* The source record table. */
253 struct srecinfo
*srec_table
;
255 /* A list of the functions found in this module. */
256 struct funcinfo
*func_table
;
258 /* Current allocation of file_table. */
259 unsigned int file_table_count
;
261 /* An array of the files making up this module. */
262 struct fileinfo
*file_table
;
265 /* BFD private data for alpha-vms. */
267 struct vms_private_data_struct
269 /* If 1, relocs have been read successfully, if 0 they have yet to be
270 read, if -1 reading relocs failed. */
273 /* Record input buffer. */
274 struct vms_rec_rd recrd
;
275 struct vms_rec_wr recwr
;
277 struct hdr_struct hdr_data
; /* data from HDR/EMH record */
278 struct eom_struct eom_data
; /* data from EOM/EEOM record */
280 /* Transfer addresses (entry points). */
281 bfd_vma transfer_address
[4];
283 /* Array of GSD sections to get the correspond BFD one. */
284 unsigned int section_max
; /* Size of the sections array. */
285 unsigned int section_count
; /* Number of GSD sections. */
288 /* Array of raw symbols. */
289 struct vms_symbol_entry
**syms
;
291 /* Canonicalized symbols. */
294 /* Number of symbols. */
295 unsigned int gsd_sym_count
;
296 /* Size of the syms array. */
297 unsigned int max_sym_count
;
298 /* Number of procedure symbols. */
299 unsigned int norm_sym_count
;
301 /* Stack used to evaluate TIR/ETIR commands. */
302 struct stack_struct
*stack
;
305 /* Content reading. */
306 asection
*image_section
; /* section for image_ptr */
307 file_ptr image_offset
; /* Offset for image_ptr. */
309 struct module
*modules
; /* list of all compilation units */
311 /* The DST section. */
312 asection
*dst_section
;
314 unsigned int dst_ptr_offsets_count
; /* # of offsets in following array */
315 unsigned int *dst_ptr_offsets
; /* array of saved image_ptr offsets */
317 /* Shared library support */
318 bfd_vma symvva
; /* relative virtual address of symbol vector */
320 unsigned char matchctl
;
322 /* Shared library index. This is used for input bfd while linking. */
323 unsigned int shr_index
;
325 /* Used to place structures in the file. */
328 /* Simply linked list of eisd. */
329 struct vms_internal_eisd_map
*eisd_head
;
330 struct vms_internal_eisd_map
*eisd_tail
;
332 /* Simply linked list of eisd for shared libraries. */
333 struct vms_internal_eisd_map
*gbl_eisd_head
;
334 struct vms_internal_eisd_map
*gbl_eisd_tail
;
336 /* linkage index counter used by conditional store commands */
337 unsigned int vms_linkage_index
;
340 #define PRIV2(abfd, name) \
341 (((struct vms_private_data_struct *)(abfd)->tdata.any)->name)
342 #define PRIV(name) PRIV2(abfd,name)
345 /* Used to keep extra VMS specific information for a given section.
347 reloc_size holds the size of the relocation stream, note this
348 is very different from the number of relocations as VMS relocations
351 reloc_stream is the actual stream of relocation entries. */
353 struct vms_section_data_struct
355 /* Maximnum number of entries in sec->relocation. */
358 /* Corresponding eisd. Used only while generating executables. */
359 struct vms_internal_eisd_map
*eisd
;
361 /* PSC flags to be clear. */
364 /* PSC flags to be set. */
368 #define vms_section_data(sec) \
369 ((struct vms_section_data_struct *)sec->used_by_bfd)
371 /* To be called from the debugger. */
372 struct vms_private_data_struct
*bfd_vms_get_data (bfd
*);
374 static int vms_get_remaining_object_record (bfd
*, unsigned int);
375 static bool _bfd_vms_slurp_object_records (bfd
* abfd
);
376 static bool alpha_vms_add_fixup_lp (struct bfd_link_info
*, bfd
*, bfd
*);
377 static bool alpha_vms_add_fixup_ca (struct bfd_link_info
*, bfd
*, bfd
*);
378 static bool alpha_vms_add_fixup_qr (struct bfd_link_info
*, bfd
*, bfd
*,
380 static bool alpha_vms_add_fixup_lr (struct bfd_link_info
*, unsigned int,
382 static bool alpha_vms_add_lw_reloc (struct bfd_link_info
*);
383 static bool alpha_vms_add_qw_reloc (struct bfd_link_info
*);
392 /* Number of elements in VEC. */
394 #define VEC_COUNT(VEC) ((VEC).nbr_el)
396 /* Get the address of the Nth element. */
398 #define VEC_EL(VEC, TYPE, N) (((TYPE *)((VEC).els))[N])
400 #define VEC_INIT(VEC) \
407 /* Be sure there is room for a new element. */
409 static void *vector_grow1 (struct vector_type
*vec
, size_t elsz
);
411 /* Allocate room for a new element and return its address. */
413 #define VEC_APPEND(VEC, TYPE) \
414 ((TYPE *) vector_grow1 (&VEC, sizeof (TYPE)))
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
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 /* PR 21813: Check for an undersized record. */
477 if (PRIV (recrd
.buf_size
) < sizeof (* eihd
))
479 _bfd_error_handler (_("corrupt EIHD record - size is too small"));
480 bfd_set_error (bfd_error_bad_value
);
484 size
= bfd_getl32 (eihd
->size
);
485 imgtype
= bfd_getl32 (eihd
->imgtype
);
487 if (imgtype
== EIHD__K_EXE
|| imgtype
== EIHD__K_LIM
)
488 abfd
->flags
|= EXEC_P
;
490 symvva
= bfd_getl64 (eihd
->symvva
);
493 PRIV (symvva
) = symvva
;
494 abfd
->flags
|= DYNAMIC
;
497 PRIV (ident
) = bfd_getl32 (eihd
->ident
);
498 PRIV (matchctl
) = eihd
->matchctl
;
500 *eisd_offset
= bfd_getl32 (eihd
->isdoff
);
501 *eihs_offset
= bfd_getl32 (eihd
->symdbgoff
);
503 vms_debug2 ((4, "EIHD size %d imgtype %d symvva 0x%lx eisd %d eihs %d\n",
504 size
, imgtype
, (unsigned long)symvva
,
505 *eisd_offset
, *eihs_offset
));
511 /* Read & process EISD record.
512 Return TRUE on success, FALSE on error. */
515 _bfd_vms_slurp_eisd (bfd
*abfd
, unsigned int offset
)
517 int section_count
= 0;
519 vms_debug2 ((8, "_bfd_vms_slurp_eisd\n"));
523 struct vms_eisd
*eisd
;
524 unsigned int rec_size
;
533 /* PR 17512: file: 3d9e9fe9. */
534 if (offset
> PRIV (recrd
.rec_size
)
535 || (PRIV (recrd
.rec_size
) - offset
536 < offsetof (struct vms_eisd
, eisdsize
) + 4))
538 eisd
= (struct vms_eisd
*) (PRIV (recrd
.rec
) + offset
);
539 rec_size
= bfd_getl32 (eisd
->eisdsize
);
543 /* Skip to next block if pad. */
544 if (rec_size
== 0xffffffff)
546 offset
= (offset
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
550 /* Make sure that there is enough data present in the record. */
551 if (rec_size
< offsetof (struct vms_eisd
, type
) + 1)
553 /* Make sure that the record is not too big either. */
554 if (rec_size
> PRIV (recrd
.rec_size
) - offset
)
559 size
= bfd_getl32 (eisd
->secsize
);
560 vaddr
= bfd_getl64 (eisd
->virt_addr
);
561 flags
= bfd_getl32 (eisd
->flags
);
562 vbn
= bfd_getl32 (eisd
->vbn
);
564 vms_debug2 ((4, "EISD at 0x%x size 0x%x addr 0x%lx flags 0x%x blk %d\n",
565 offset
, size
, (unsigned long)vaddr
, flags
, vbn
));
567 /* VMS combines psects from .obj files into isects in the .exe. This
568 process doesn't preserve enough information to reliably determine
569 what's in each section without examining the data. This is
570 especially true of DWARF debug sections. */
571 bfd_flags
= SEC_ALLOC
;
573 bfd_flags
|= SEC_HAS_CONTENTS
| SEC_LOAD
;
575 if (flags
& EISD__M_EXE
)
576 bfd_flags
|= SEC_CODE
;
578 if (flags
& EISD__M_NONSHRADR
)
579 bfd_flags
|= SEC_DATA
;
581 if (!(flags
& EISD__M_WRT
))
582 bfd_flags
|= SEC_READONLY
;
584 if (flags
& EISD__M_DZRO
)
585 bfd_flags
|= SEC_DATA
;
587 if (flags
& EISD__M_FIXUPVEC
)
588 bfd_flags
|= SEC_DATA
;
590 if (flags
& EISD__M_CRF
)
591 bfd_flags
|= SEC_DATA
;
593 if (flags
& EISD__M_GBL
)
595 if (rec_size
<= offsetof (struct vms_eisd
, gblnam
))
597 else if (rec_size
< sizeof (struct vms_eisd
))
598 name
= _bfd_vms_save_counted_string (abfd
, eisd
->gblnam
,
599 rec_size
- offsetof (struct vms_eisd
, gblnam
));
601 name
= _bfd_vms_save_counted_string (abfd
, eisd
->gblnam
,
603 if (name
== NULL
|| name
[0] == 0)
605 bfd_flags
|= SEC_COFF_SHARED_LIBRARY
;
606 bfd_flags
&= ~(SEC_ALLOC
| SEC_LOAD
);
608 else if (flags
& EISD__M_FIXUPVEC
)
610 else if (eisd
->type
== EISD__K_USRSTACK
)
616 name
= (char *) bfd_alloc (abfd
, 32);
619 if (flags
& EISD__M_DZRO
)
621 else if (flags
& EISD__M_EXE
)
623 else if (!(flags
& EISD__M_WRT
))
627 BFD_ASSERT (section_count
< 999);
628 sprintf (name
, "$%s_%03d$", pfx
, section_count
++);
631 section
= bfd_make_section (abfd
, name
);
636 section
->filepos
= vbn
? VMS_BLOCK_SIZE
* (vbn
- 1) : 0;
637 section
->size
= size
;
638 section
->vma
= vaddr
;
640 if (!bfd_set_section_flags (section
, bfd_flags
))
647 /* Read & process EIHS record.
648 Return TRUE on success, FALSE on error. */
651 _bfd_vms_slurp_eihs (bfd
*abfd
, unsigned int offset
)
653 unsigned char *p
= PRIV (recrd
.rec
) + offset
;
655 unsigned int gstsize ATTRIBUTE_UNUSED
;
657 unsigned int dstsize
;
659 unsigned int dmtbytes
;
662 /* PR 21611: Check that offset is valid. */
663 if (offset
> PRIV (recrd
.rec_size
) - (EIHS__L_DMTBYTES
+ 4))
665 _bfd_error_handler (_("unable to read EIHS record at offset %#x"),
667 bfd_set_error (bfd_error_file_truncated
);
671 gstvbn
= bfd_getl32 (p
+ EIHS__L_GSTVBN
);
672 gstsize
= bfd_getl32 (p
+ EIHS__L_GSTSIZE
);
673 dstvbn
= bfd_getl32 (p
+ EIHS__L_DSTVBN
);
674 dstsize
= bfd_getl32 (p
+ EIHS__L_DSTSIZE
);
675 dmtvbn
= bfd_getl32 (p
+ EIHS__L_DMTVBN
);
676 dmtbytes
= bfd_getl32 (p
+ EIHS__L_DMTBYTES
);
679 vms_debug (8, "_bfd_vms_slurp_ihs\n");
680 vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
681 gstvbn
, gstsize
, dstvbn
, dstsize
, dmtvbn
, dmtbytes
);
686 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
688 section
= bfd_make_section (abfd
, "$DST$");
692 section
->size
= dstsize
;
693 section
->filepos
= VMS_BLOCK_SIZE
* (dstvbn
- 1);
695 if (!bfd_set_section_flags (section
, bfd_flags
))
698 PRIV (dst_section
) = section
;
699 abfd
->flags
|= (HAS_DEBUG
| HAS_LINENO
);
704 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
706 section
= bfd_make_section (abfd
, "$DMT$");
710 section
->size
= dmtbytes
;
711 section
->filepos
= VMS_BLOCK_SIZE
* (dmtvbn
- 1);
713 if (!bfd_set_section_flags (section
, bfd_flags
))
719 if (bfd_seek (abfd
, VMS_BLOCK_SIZE
* (gstvbn
- 1), SEEK_SET
))
721 bfd_set_error (bfd_error_file_truncated
);
725 if (!_bfd_vms_slurp_object_records (abfd
))
728 abfd
->flags
|= HAS_SYMS
;
734 /* Object file reading. */
736 /* Object file input functions. */
738 /* Get next record from object file to vms_buf.
739 Set PRIV(buf_size) and return it
741 This is a little tricky since it should be portable.
743 The openVMS object file has 'variable length' which means that
744 read() returns data in chunks of (hopefully) correct and expected
745 size. The linker (and other tools on VMS) depend on that. Unix
746 doesn't know about 'formatted' files, so reading and writing such
747 an object file in a Unix environment is not trivial.
749 With the tool 'file' (available on all VMS FTP sites), one
750 can view and change the attributes of a file. Changing from
751 'variable length' to 'fixed length, 512 bytes' reveals the
752 record size at the first 2 bytes of every record. The same
753 may happen during the transfer of object files from VMS to Unix,
754 at least with UCX, the DEC implementation of TCP/IP.
756 The VMS format repeats the size at bytes 2 & 3 of every record.
758 On the first call (file_format == FF_UNKNOWN) we check if
759 the first and the third byte pair (!) of the record match.
760 If they do it's an object file in an Unix environment or with
761 wrong attributes (FF_FOREIGN), else we should be in a VMS
762 environment where read() returns the record size (FF_NATIVE).
764 Reading is always done in 2 steps:
765 1. first just the record header is read and the size extracted,
766 2. then the read buffer is adjusted and the remaining bytes are
769 All file I/O is done on even file positions. */
771 #define VMS_OBJECT_ADJUSTMENT 2
774 maybe_adjust_record_pointer_for_object (bfd
*abfd
)
776 /* Set the file format once for all on the first invocation. */
777 if (PRIV (recrd
.file_format
) == FF_UNKNOWN
)
779 if (PRIV (recrd
.rec
)[0] == PRIV (recrd
.rec
)[4]
780 && PRIV (recrd
.rec
)[1] == PRIV (recrd
.rec
)[5])
781 PRIV (recrd
.file_format
) = FF_FOREIGN
;
783 PRIV (recrd
.file_format
) = FF_NATIVE
;
786 /* The adjustment is needed only in an Unix environment. */
787 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
788 PRIV (recrd
.rec
) += VMS_OBJECT_ADJUSTMENT
;
791 /* Implement step #1 of the object record reading procedure.
792 Return the record type or -1 on failure. */
795 _bfd_vms_get_object_record (bfd
*abfd
)
797 unsigned int test_len
= 6;
800 vms_debug2 ((8, "_bfd_vms_get_obj_record\n"));
802 /* Skip alignment byte if the current position is odd. */
803 if (PRIV (recrd
.file_format
) == FF_FOREIGN
&& (bfd_tell (abfd
) & 1))
805 if (bfd_read (PRIV (recrd
.buf
), 1, abfd
) != 1)
807 bfd_set_error (bfd_error_file_truncated
);
812 /* Read the record header */
813 if (bfd_read (PRIV (recrd
.buf
), test_len
, abfd
) != test_len
)
815 bfd_set_error (bfd_error_file_truncated
);
819 /* Reset the record pointer. */
820 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
821 maybe_adjust_record_pointer_for_object (abfd
);
823 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
826 type
= bfd_getl16 (PRIV (recrd
.rec
));
828 vms_debug2 ((8, "_bfd_vms_get_obj_record: rec %p, size %d, type %d\n",
829 PRIV (recrd
.rec
), PRIV (recrd
.rec_size
), type
));
834 /* Implement step #2 of the object record reading procedure.
835 Return the size of the record or 0 on failure. */
838 vms_get_remaining_object_record (bfd
*abfd
, unsigned int read_so_far
)
840 unsigned int to_read
;
842 vms_debug2 ((8, "vms_get_remaining_obj_record\n"));
844 /* Extract record size. */
845 PRIV (recrd
.rec_size
) = bfd_getl16 (PRIV (recrd
.rec
) + 2);
847 if (PRIV (recrd
.rec_size
) == 0)
849 bfd_set_error (bfd_error_file_truncated
);
853 /* That's what the linker manual says. */
854 if (PRIV (recrd
.rec_size
) > EOBJ__C_MAXRECSIZ
)
856 bfd_set_error (bfd_error_file_truncated
);
860 /* Take into account object adjustment. */
861 to_read
= PRIV (recrd
.rec_size
);
862 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
863 to_read
+= VMS_OBJECT_ADJUSTMENT
;
865 /* Adjust the buffer. */
866 if (to_read
> PRIV (recrd
.buf_size
))
869 = (unsigned char *) bfd_realloc_or_free (PRIV (recrd
.buf
), to_read
);
870 if (PRIV (recrd
.buf
) == NULL
)
872 PRIV (recrd
.buf_size
) = to_read
;
874 /* PR 17512: file: 025-1974-0.004. */
875 else if (to_read
<= read_so_far
)
878 /* Read the remaining record. */
879 to_read
-= read_so_far
;
881 vms_debug2 ((8, "vms_get_remaining_obj_record: to_read %d\n", to_read
));
883 if (bfd_read (PRIV (recrd
.buf
) + read_so_far
, to_read
, abfd
) != to_read
)
885 bfd_set_error (bfd_error_file_truncated
);
889 /* Reset the record pointer. */
890 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
891 maybe_adjust_record_pointer_for_object (abfd
);
893 vms_debug2 ((8, "vms_get_remaining_obj_record: size %d\n",
894 PRIV (recrd
.rec_size
)));
896 return PRIV (recrd
.rec_size
);
899 /* Read and process emh record.
900 Return TRUE on success, FALSE on error. */
903 _bfd_vms_slurp_ehdr (bfd
*abfd
)
906 unsigned char *vms_rec
;
910 vms_rec
= PRIV (recrd
.rec
);
911 /* PR 17512: file: 62736583. */
912 end
= PRIV (recrd
.buf
) + PRIV (recrd
.buf_size
);
914 vms_debug2 ((2, "HDR/EMH\n"));
916 subtype
= bfd_getl16 (vms_rec
+ 4);
918 vms_debug2 ((3, "subtype %d\n", subtype
));
924 if (vms_rec
+ 21 >= end
)
926 PRIV (hdr_data
).hdr_b_strlvl
= vms_rec
[6];
927 PRIV (hdr_data
).hdr_l_arch1
= bfd_getl32 (vms_rec
+ 8);
928 PRIV (hdr_data
).hdr_l_arch2
= bfd_getl32 (vms_rec
+ 12);
929 PRIV (hdr_data
).hdr_l_recsiz
= bfd_getl32 (vms_rec
+ 16);
930 if ((vms_rec
+ 20 + vms_rec
[20] + 1) >= end
)
932 PRIV (hdr_data
).hdr_t_name
933 = _bfd_vms_save_counted_string (abfd
, vms_rec
+ 20, vms_rec
[20]);
934 ptr
= vms_rec
+ 20 + vms_rec
[20] + 1;
935 if ((ptr
+ *ptr
+ 1) >= end
)
937 PRIV (hdr_data
).hdr_t_version
938 = _bfd_vms_save_counted_string (abfd
, ptr
, *ptr
);
942 PRIV (hdr_data
).hdr_t_date
943 = _bfd_vms_save_sized_string (abfd
, ptr
, 17);
947 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
949 PRIV (hdr_data
).hdr_c_lnm
950 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
954 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
956 PRIV (hdr_data
).hdr_c_src
957 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
961 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
963 PRIV (hdr_data
).hdr_c_ttl
964 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
974 bfd_set_error (bfd_error_wrong_format
);
981 /* Typical sections for evax object files. */
983 #define EVAX_ABS_NAME "$ABS$"
984 #define EVAX_CODE_NAME "$CODE$"
985 #define EVAX_LINK_NAME "$LINK$"
986 #define EVAX_DATA_NAME "$DATA$"
987 #define EVAX_BSS_NAME "$BSS$"
988 #define EVAX_READONLYADDR_NAME "$READONLY_ADDR$"
989 #define EVAX_READONLY_NAME "$READONLY$"
990 #define EVAX_LITERAL_NAME "$LITERAL$"
991 #define EVAX_LITERALS_NAME "$LITERALS"
992 #define EVAX_COMMON_NAME "$COMMON$"
993 #define EVAX_LOCAL_NAME "$LOCAL$"
995 struct sec_flags_struct
997 const char *name
; /* Name of section. */
999 flagword flags_always
; /* Flags we set always. */
1001 flagword flags_hassize
; /* Flags we set if the section has a size > 0. */
1004 /* These flags are deccrtl/vaxcrtl (openVMS 6.2 Alpha) compatible. */
1006 static const struct sec_flags_struct evax_section_flags
[] =
1014 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
,
1015 SEC_CODE
| SEC_READONLY
,
1016 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
,
1017 SEC_CODE
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1018 { EVAX_LITERAL_NAME
,
1019 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
,
1020 SEC_DATA
| SEC_READONLY
,
1021 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
,
1022 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1024 EGPS__V_REL
| EGPS__V_RD
,
1025 SEC_DATA
| SEC_READONLY
,
1026 EGPS__V_REL
| EGPS__V_RD
,
1027 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1029 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1031 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1032 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1034 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1036 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1038 { EVAX_READONLYADDR_NAME
,
1039 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
,
1040 SEC_DATA
| SEC_READONLY
,
1041 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
,
1042 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1043 { EVAX_READONLY_NAME
,
1044 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
,
1045 SEC_DATA
| SEC_READONLY
,
1046 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
,
1047 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1049 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1051 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1052 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1053 { EVAX_LITERALS_NAME
,
1054 EGPS__V_PIC
| EGPS__V_OVR
,
1055 SEC_DATA
| SEC_READONLY
,
1056 EGPS__V_PIC
| EGPS__V_OVR
,
1057 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1059 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1061 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1062 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
}
1065 /* Retrieve BFD section flags by name and size. */
1068 vms_secflag_by_name (const struct sec_flags_struct
*section_flags
,
1074 while (section_flags
[i
].name
!= NULL
)
1076 if (strcmp (name
, section_flags
[i
].name
) == 0)
1079 return section_flags
[i
].flags_hassize
;
1081 return section_flags
[i
].flags_always
;
1086 return section_flags
[i
].flags_hassize
;
1087 return section_flags
[i
].flags_always
;
1090 /* Retrieve VMS section flags by name and size. */
1093 vms_esecflag_by_name (const struct sec_flags_struct
*section_flags
,
1099 while (section_flags
[i
].name
!= NULL
)
1101 if (strcmp (name
, section_flags
[i
].name
) == 0)
1104 return section_flags
[i
].vflags_hassize
;
1106 return section_flags
[i
].vflags_always
;
1111 return section_flags
[i
].vflags_hassize
;
1112 return section_flags
[i
].vflags_always
;
1115 /* Add SYM to the symbol table of ABFD.
1116 Return FALSE in case of error. */
1119 add_symbol_entry (bfd
*abfd
, struct vms_symbol_entry
*sym
)
1121 if (PRIV (gsd_sym_count
) >= PRIV (max_sym_count
))
1123 if (PRIV (max_sym_count
) == 0)
1125 PRIV (max_sym_count
) = 128;
1126 PRIV (syms
) = bfd_malloc
1127 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*));
1131 PRIV (max_sym_count
) *= 2;
1132 PRIV (syms
) = bfd_realloc_or_free
1134 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*)));
1136 if (PRIV (syms
) == NULL
)
1140 PRIV (syms
)[PRIV (gsd_sym_count
)++] = sym
;
1144 /* Create a symbol whose name is ASCIC and add it to ABFD.
1145 Return NULL in case of error. */
1147 static struct vms_symbol_entry
*
1148 add_symbol (bfd
*abfd
, const unsigned char *ascic
, unsigned int max
)
1150 struct vms_symbol_entry
*entry
;
1157 _bfd_error_handler (_("record is too small for symbol name length"));
1158 bfd_set_error (bfd_error_bad_value
);
1162 entry
= (struct vms_symbol_entry
*)bfd_zalloc (abfd
, sizeof (*entry
) + len
);
1165 entry
->namelen
= len
;
1166 memcpy (entry
->name
, ascic
, len
);
1167 entry
->name
[len
] = 0;
1168 entry
->owner
= abfd
;
1170 if (!add_symbol_entry (abfd
, entry
))
1175 /* Read and process EGSD. Return FALSE on failure. */
1178 _bfd_vms_slurp_egsd (bfd
*abfd
)
1181 unsigned int gsd_size
;
1182 unsigned char *vms_rec
;
1186 vms_debug2 ((2, "EGSD\n"));
1188 if (PRIV (recrd
.rec_size
) < 8)
1190 _bfd_error_handler (_("corrupt EGSD record: its size (%#x) is too small"),
1191 PRIV (recrd
.rec_size
));
1192 bfd_set_error (bfd_error_bad_value
);
1196 PRIV (recrd
.rec
) += 8; /* Skip type, size, align pad. */
1197 PRIV (recrd
.rec_size
) -= 8;
1199 /* Calculate base address for each section. */
1202 while (PRIV (recrd
.rec_size
) > 4)
1204 vms_rec
= PRIV (recrd
.rec
);
1206 gsd_type
= bfd_getl16 (vms_rec
);
1207 gsd_size
= bfd_getl16 (vms_rec
+ 2);
1209 vms_debug2 ((3, "egsd_type %d\n", gsd_type
));
1211 /* PR 21615: Check for size overflow. */
1212 if (PRIV (recrd
.rec_size
) < gsd_size
)
1214 _bfd_error_handler (_("corrupt EGSD record type %d: size (%#x) "
1215 "is larger than remaining space (%#x)"),
1216 gsd_type
, gsd_size
, PRIV (recrd
.rec_size
));
1217 bfd_set_error (bfd_error_bad_value
);
1224 _bfd_error_handler (_("corrupt EGSD record type %d: size (%#x) "
1226 gsd_type
, gsd_size
);
1227 bfd_set_error (bfd_error_bad_value
);
1234 /* Program section definition. */
1236 struct vms_egps
*egps
= (struct vms_egps
*) vms_rec
;
1237 flagword new_flags
, vms_flags
;
1240 if (offsetof (struct vms_egps
, flags
) + 2 > gsd_size
)
1242 vms_flags
= bfd_getl16 (egps
->flags
);
1244 if ((vms_flags
& EGPS__V_REL
) == 0)
1246 /* Use the global absolute section for all
1247 absolute sections. */
1248 section
= bfd_abs_section_ptr
;
1256 if (offsetof (struct vms_egps
, namlng
) >= gsd_size
)
1258 left
= gsd_size
- offsetof (struct vms_egps
, namlng
);
1259 name
= _bfd_vms_save_counted_string (abfd
, &egps
->namlng
, left
);
1260 if (name
== NULL
|| name
[0] == 0)
1263 section
= bfd_make_section (abfd
, name
);
1267 section
->filepos
= 0;
1268 section
->size
= bfd_getl32 (egps
->alloc
);
1269 section
->alignment_power
= egps
->align
& 31;
1271 vms_section_data (section
)->flags
= vms_flags
;
1272 vms_section_data (section
)->no_flags
= 0;
1274 new_flags
= vms_secflag_by_name (evax_section_flags
,
1277 if (section
->size
> 0)
1278 new_flags
|= SEC_LOAD
;
1279 if (!(vms_flags
& EGPS__V_NOMOD
) && section
->size
> 0)
1281 /* Set RELOC and HAS_CONTENTS if the section is not
1282 demand-zero and not empty. */
1283 new_flags
|= SEC_HAS_CONTENTS
;
1284 if (vms_flags
& EGPS__V_REL
)
1285 new_flags
|= SEC_RELOC
;
1287 if (vms_flags
& EGPS__V_EXE
)
1289 /* Set CODE if section is executable. */
1290 new_flags
|= SEC_CODE
;
1291 new_flags
&= ~SEC_DATA
;
1293 if (!bfd_set_section_flags (section
, new_flags
))
1296 /* Give a non-overlapping vma to non absolute sections. */
1297 align_addr
= (bfd_vma
) 1 << section
->alignment_power
;
1298 base_addr
= (base_addr
+ align_addr
- 1) & -align_addr
;
1299 section
->vma
= base_addr
;
1300 base_addr
+= section
->size
;
1303 /* Append it to the section array. */
1304 if (PRIV (section_count
) >= PRIV (section_max
))
1306 if (PRIV (section_max
) == 0)
1307 PRIV (section_max
) = 16;
1309 PRIV (section_max
) *= 2;
1310 PRIV (sections
) = bfd_realloc_or_free
1311 (PRIV (sections
), PRIV (section_max
) * sizeof (asection
*));
1312 if (PRIV (sections
) == NULL
)
1316 PRIV (sections
)[PRIV (section_count
)] = section
;
1317 PRIV (section_count
)++;
1323 unsigned int nameoff
;
1324 struct vms_symbol_entry
*entry
;
1325 struct vms_egsy
*egsy
= (struct vms_egsy
*) vms_rec
;
1328 if (offsetof (struct vms_egsy
, flags
) + 2 > gsd_size
)
1330 old_flags
= bfd_getl16 (egsy
->flags
);
1331 if (old_flags
& EGSY__V_DEF
)
1332 nameoff
= ESDF__B_NAMLNG
;
1334 nameoff
= ESRF__B_NAMLNG
;
1336 if (nameoff
>= gsd_size
)
1338 entry
= add_symbol (abfd
, vms_rec
+ nameoff
, gsd_size
- nameoff
);
1342 /* Allow only duplicate reference. */
1343 if ((entry
->flags
& EGSY__V_DEF
) && (old_flags
& EGSY__V_DEF
))
1346 if (entry
->typ
== 0)
1348 entry
->typ
= gsd_type
;
1349 entry
->data_type
= egsy
->datyp
;
1350 entry
->flags
= old_flags
;
1353 if (old_flags
& EGSY__V_DEF
)
1355 struct vms_esdf
*esdf
= (struct vms_esdf
*) vms_rec
;
1357 entry
->value
= bfd_getl64 (esdf
->value
);
1358 if (PRIV (sections
) == NULL
)
1361 psindx
= bfd_getl32 (esdf
->psindx
);
1362 /* PR 21813: Check for an out of range index. */
1363 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1366 _bfd_error_handler (_("corrupt EGSD record: its psindx "
1367 "field is too big (%#lx)"),
1369 bfd_set_error (bfd_error_bad_value
);
1372 entry
->section
= PRIV (sections
)[psindx
];
1374 if (old_flags
& EGSY__V_NORM
)
1376 PRIV (norm_sym_count
)++;
1378 entry
->code_value
= bfd_getl64 (esdf
->code_address
);
1379 psindx
= bfd_getl32 (esdf
->ca_psindx
);
1380 /* PR 21813: Check for an out of range index. */
1381 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1383 entry
->code_section
= PRIV (sections
)[psindx
];
1391 struct vms_symbol_entry
*entry
;
1392 struct vms_egst
*egst
= (struct vms_egst
*)vms_rec
;
1394 unsigned int nameoff
= offsetof (struct vms_egst
, namlng
);
1396 if (nameoff
>= gsd_size
)
1398 entry
= add_symbol (abfd
, &egst
->namlng
, gsd_size
- nameoff
);
1402 old_flags
= bfd_getl16 (egst
->header
.flags
);
1403 entry
->typ
= gsd_type
;
1404 entry
->data_type
= egst
->header
.datyp
;
1405 entry
->flags
= old_flags
;
1407 entry
->symbol_vector
= bfd_getl32 (egst
->value
);
1409 if (old_flags
& EGSY__V_REL
)
1411 if (PRIV (sections
) == NULL
)
1413 psindx
= bfd_getl32 (egst
->psindx
);
1414 /* PR 21813: Check for an out of range index. */
1415 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1417 entry
->section
= PRIV (sections
)[psindx
];
1420 entry
->section
= bfd_abs_section_ptr
;
1422 entry
->value
= bfd_getl64 (egst
->lp_2
);
1424 if (old_flags
& EGSY__V_NORM
)
1426 PRIV (norm_sym_count
)++;
1428 entry
->code_value
= bfd_getl64 (egst
->lp_1
);
1429 entry
->code_section
= bfd_abs_section_ptr
;
1436 /* Currently ignored. */
1441 _bfd_error_handler (_("unknown EGSD subtype %d"), gsd_type
);
1442 bfd_set_error (bfd_error_bad_value
);
1446 PRIV (recrd
.rec_size
) -= gsd_size
;
1447 PRIV (recrd
.rec
) += gsd_size
;
1450 /* FIXME: Should we complain if PRIV (recrd.rec_size) is not zero ? */
1452 if (PRIV (gsd_sym_count
) > 0)
1453 abfd
->flags
|= HAS_SYMS
;
1458 /* Stack routines for vms ETIR commands. */
1460 /* Push value and section index. */
1463 _bfd_vms_push (bfd
*abfd
, bfd_vma val
, unsigned int reloc
)
1465 vms_debug2 ((4, "<push %08lx (0x%08x) at %d>\n",
1466 (unsigned long)val
, reloc
, PRIV (stackptr
)));
1468 PRIV (stack
[PRIV (stackptr
)]).value
= val
;
1469 PRIV (stack
[PRIV (stackptr
)]).reloc
= reloc
;
1471 if (PRIV (stackptr
) >= STACKSIZE
)
1473 bfd_set_error (bfd_error_bad_value
);
1474 _bfd_error_handler (_("stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr
));
1480 /* Pop value and section index. */
1483 _bfd_vms_pop (bfd
*abfd
, bfd_vma
*val
, unsigned int *rel
)
1485 if (PRIV (stackptr
) == 0)
1487 bfd_set_error (bfd_error_bad_value
);
1488 _bfd_error_handler (_("stack underflow in _bfd_vms_pop"));
1492 *val
= PRIV (stack
[PRIV (stackptr
)]).value
;
1493 *rel
= PRIV (stack
[PRIV (stackptr
)]).reloc
;
1495 vms_debug2 ((4, "<pop %08lx (0x%08x)>\n", (unsigned long)*val
, *rel
));
1499 /* Routines to fill sections contents during tir/etir read. */
1501 /* Initialize image buffer pointer to be filled. */
1504 image_set_ptr (bfd
*abfd
, bfd_vma vma
, int sect
, struct bfd_link_info
*info
)
1508 vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma
, sect
));
1510 if (PRIV (sections
) == NULL
)
1512 if (sect
< 0 || sect
>= (int) PRIV (section_count
))
1515 sec
= PRIV (sections
)[sect
];
1519 /* Reading contents to an output bfd. */
1521 if (sec
->output_section
== NULL
)
1523 /* Section discarded. */
1524 vms_debug2 ((5, " section %s discarded\n", sec
->name
));
1526 /* This is not used. */
1527 PRIV (image_section
) = NULL
;
1528 PRIV (image_offset
) = 0;
1531 PRIV (image_offset
) = sec
->output_offset
+ vma
;
1532 PRIV (image_section
) = sec
->output_section
;
1536 PRIV (image_offset
) = vma
;
1537 PRIV (image_section
) = sec
;
1541 /* Increment image buffer pointer by offset. */
1544 image_inc_ptr (bfd
*abfd
, bfd_vma offset
)
1546 vms_debug2 ((4, "image_inc_ptr (%u)\n", (unsigned)offset
));
1548 PRIV (image_offset
) += offset
;
1551 /* Save current DST location counter under specified index. */
1554 dst_define_location (bfd
*abfd
, unsigned int loc
)
1556 vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc
));
1560 /* 16M entries ought to be plenty. */
1561 bfd_set_error (bfd_error_bad_value
);
1562 _bfd_error_handler (_("dst_define_location %u too large"), loc
);
1566 /* Grow the ptr offset table if necessary. */
1567 if (loc
+ 1 > PRIV (dst_ptr_offsets_count
))
1569 PRIV (dst_ptr_offsets
)
1570 = bfd_realloc_or_free (PRIV (dst_ptr_offsets
),
1571 (loc
+ 1) * sizeof (unsigned int));
1572 if (PRIV (dst_ptr_offsets
) == NULL
)
1574 memset (PRIV (dst_ptr_offsets
) + PRIV (dst_ptr_offsets_count
), 0,
1575 (loc
- PRIV (dst_ptr_offsets_count
)) * sizeof (unsigned int));
1576 PRIV (dst_ptr_offsets_count
) = loc
+ 1;
1579 PRIV (dst_ptr_offsets
)[loc
] = PRIV (image_offset
);
1583 /* Restore saved DST location counter from specified index. */
1586 dst_restore_location (bfd
*abfd
, unsigned int loc
)
1588 vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc
));
1590 if (loc
< PRIV (dst_ptr_offsets_count
))
1592 PRIV (image_offset
) = PRIV (dst_ptr_offsets
)[loc
];
1598 /* Retrieve saved DST location counter from specified index. */
1601 dst_retrieve_location (bfd
*abfd
, bfd_vma
*loc
)
1603 vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int) *loc
));
1605 if (*loc
< PRIV (dst_ptr_offsets_count
))
1607 *loc
= PRIV (dst_ptr_offsets
)[*loc
];
1613 /* Write multiple bytes to section image. */
1616 image_write (bfd
*abfd
, unsigned char *ptr
, unsigned int size
)
1618 asection
*sec
= PRIV (image_section
);
1619 size_t off
= PRIV (image_offset
);
1623 || size
> sec
->size
- off
)
1625 bfd_set_error (bfd_error_bad_value
);
1630 _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr
, size
,
1634 if (PRIV (image_section
)->contents
!= NULL
)
1635 memcpy (sec
->contents
+ off
, ptr
, size
);
1639 for (i
= 0; i
< size
; i
++)
1642 bfd_set_error (bfd_error_bad_value
);
1648 _bfd_hexdump (9, ptr
, size
, 0);
1651 PRIV (image_offset
) += size
;
1655 /* Write byte to section image. */
1658 image_write_b (bfd
* abfd
, unsigned int value
)
1660 unsigned char data
[1];
1662 vms_debug2 ((6, "image_write_b (%02x)\n", (int) value
));
1666 return image_write (abfd
, data
, sizeof (data
));
1669 /* Write 2-byte word to image. */
1672 image_write_w (bfd
* abfd
, unsigned int value
)
1674 unsigned char data
[2];
1676 vms_debug2 ((6, "image_write_w (%04x)\n", (int) value
));
1678 bfd_putl16 (value
, data
);
1679 return image_write (abfd
, data
, sizeof (data
));
1682 /* Write 4-byte long to image. */
1685 image_write_l (bfd
* abfd
, unsigned long value
)
1687 unsigned char data
[4];
1689 vms_debug2 ((6, "image_write_l (%08lx)\n", value
));
1691 bfd_putl32 (value
, data
);
1692 return image_write (abfd
, data
, sizeof (data
));
1695 /* Write 8-byte quad to image. */
1698 image_write_q (bfd
* abfd
, bfd_vma value
)
1700 unsigned char data
[8];
1702 vms_debug2 ((6, "image_write_q (%08lx)\n", (unsigned long)value
));
1704 bfd_putl64 (value
, data
);
1705 return image_write (abfd
, data
, sizeof (data
));
1709 _bfd_vms_etir_name (int cmd
)
1713 case ETIR__C_STA_GBL
: return "ETIR__C_STA_GBL";
1714 case ETIR__C_STA_LW
: return "ETIR__C_STA_LW";
1715 case ETIR__C_STA_QW
: return "ETIR__C_STA_QW";
1716 case ETIR__C_STA_PQ
: return "ETIR__C_STA_PQ";
1717 case ETIR__C_STA_LI
: return "ETIR__C_STA_LI";
1718 case ETIR__C_STA_MOD
: return "ETIR__C_STA_MOD";
1719 case ETIR__C_STA_CKARG
: return "ETIR__C_STA_CKARG";
1720 case ETIR__C_STO_B
: return "ETIR__C_STO_B";
1721 case ETIR__C_STO_W
: return "ETIR__C_STO_W";
1722 case ETIR__C_STO_GBL
: return "ETIR__C_STO_GBL";
1723 case ETIR__C_STO_CA
: return "ETIR__C_STO_CA";
1724 case ETIR__C_STO_RB
: return "ETIR__C_STO_RB";
1725 case ETIR__C_STO_AB
: return "ETIR__C_STO_AB";
1726 case ETIR__C_STO_OFF
: return "ETIR__C_STO_OFF";
1727 case ETIR__C_STO_IMM
: return "ETIR__C_STO_IMM";
1728 case ETIR__C_STO_IMMR
: return "ETIR__C_STO_IMMR";
1729 case ETIR__C_STO_LW
: return "ETIR__C_STO_LW";
1730 case ETIR__C_STO_QW
: return "ETIR__C_STO_QW";
1731 case ETIR__C_STO_GBL_LW
: return "ETIR__C_STO_GBL_LW";
1732 case ETIR__C_STO_LP_PSB
: return "ETIR__C_STO_LP_PSB";
1733 case ETIR__C_STO_HINT_GBL
: return "ETIR__C_STO_HINT_GBL";
1734 case ETIR__C_STO_HINT_PS
: return "ETIR__C_STO_HINT_PS";
1735 case ETIR__C_OPR_ADD
: return "ETIR__C_OPR_ADD";
1736 case ETIR__C_OPR_SUB
: return "ETIR__C_OPR_SUB";
1737 case ETIR__C_OPR_INSV
: return "ETIR__C_OPR_INSV";
1738 case ETIR__C_OPR_USH
: return "ETIR__C_OPR_USH";
1739 case ETIR__C_OPR_ROT
: return "ETIR__C_OPR_ROT";
1740 case ETIR__C_OPR_REDEF
: return "ETIR__C_OPR_REDEF";
1741 case ETIR__C_OPR_DFLIT
: return "ETIR__C_OPR_DFLIT";
1742 case ETIR__C_STC_LP
: return "ETIR__C_STC_LP";
1743 case ETIR__C_STC_GBL
: return "ETIR__C_STC_GBL";
1744 case ETIR__C_STC_GCA
: return "ETIR__C_STC_GCA";
1745 case ETIR__C_STC_PS
: return "ETIR__C_STC_PS";
1746 case ETIR__C_STC_NBH_PS
: return "ETIR__C_STC_NBH_PS";
1747 case ETIR__C_STC_NOP_GBL
: return "ETIR__C_STC_NOP_GBL";
1748 case ETIR__C_STC_NOP_PS
: return "ETIR__C_STC_NOP_PS";
1749 case ETIR__C_STC_BSR_GBL
: return "ETIR__C_STC_BSR_GBL";
1750 case ETIR__C_STC_BSR_PS
: return "ETIR__C_STC_BSR_PS";
1751 case ETIR__C_STC_LDA_GBL
: return "ETIR__C_STC_LDA_GBL";
1752 case ETIR__C_STC_LDA_PS
: return "ETIR__C_STC_LDA_PS";
1753 case ETIR__C_STC_BOH_GBL
: return "ETIR__C_STC_BOH_GBL";
1754 case ETIR__C_STC_BOH_PS
: return "ETIR__C_STC_BOH_PS";
1755 case ETIR__C_STC_NBH_GBL
: return "ETIR__C_STC_NBH_GBL";
1756 case ETIR__C_STC_LP_PSB
: return "ETIR__C_STC_LP_PSB";
1757 case ETIR__C_CTL_SETRB
: return "ETIR__C_CTL_SETRB";
1758 case ETIR__C_CTL_AUGRB
: return "ETIR__C_CTL_AUGRB";
1759 case ETIR__C_CTL_DFLOC
: return "ETIR__C_CTL_DFLOC";
1760 case ETIR__C_CTL_STLOC
: return "ETIR__C_CTL_STLOC";
1761 case ETIR__C_CTL_STKDL
: return "ETIR__C_CTL_STKDL";
1764 /* These names have not yet been added to this switch statement. */
1765 _bfd_error_handler (_("unknown ETIR command %d"), cmd
);
1770 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
1773 _bfd_vms_get_value (bfd
*abfd
,
1774 const unsigned char *ascic
,
1775 const unsigned char *max_ascic
,
1776 struct bfd_link_info
*info
,
1778 struct alpha_vms_link_hash_entry
**hp
)
1783 struct alpha_vms_link_hash_entry
*h
;
1785 /* Not linking. Do not try to resolve the symbol. */
1794 if (ascic
+ len
>= max_ascic
)
1796 _bfd_error_handler (_("corrupt vms value"));
1802 for (i
= 0; i
< len
; i
++)
1803 name
[i
] = ascic
[i
+ 1];
1806 h
= (struct alpha_vms_link_hash_entry
*)
1807 bfd_link_hash_lookup (info
->hash
, name
, false, false, true);
1812 && (h
->root
.type
== bfd_link_hash_defined
1813 || h
->root
.type
== bfd_link_hash_defweak
))
1814 *vma
= h
->root
.u
.def
.value
1815 + h
->root
.u
.def
.section
->output_offset
1816 + h
->root
.u
.def
.section
->output_section
->vma
;
1817 else if (h
&& h
->root
.type
== bfd_link_hash_undefweak
)
1821 (*info
->callbacks
->undefined_symbol
)
1822 (info
, name
, abfd
, PRIV (image_section
), PRIV (image_offset
), true);
1829 #define RELC_SHR_BASE 0x10000
1830 #define RELC_SEC_BASE 0x20000
1831 #define RELC_MASK 0x0ffff
1834 alpha_vms_sym_to_ctxt (struct alpha_vms_link_hash_entry
*h
)
1836 /* Handle undefined symbols. */
1837 if (h
== NULL
|| h
->sym
== NULL
)
1840 if (h
->sym
->typ
== EGSD__C_SYMG
)
1842 if (h
->sym
->flags
& EGSY__V_REL
)
1843 return RELC_SHR_BASE
+ PRIV2 (h
->sym
->owner
, shr_index
);
1846 /* Can this happen (non-relocatable symg) ? I'd like to see
1851 if (h
->sym
->typ
== EGSD__C_SYM
)
1853 if (h
->sym
->flags
& EGSY__V_REL
)
1862 alpha_vms_get_sym_value (asection
*sect
, bfd_vma addr
)
1864 return sect
->output_section
->vma
+ sect
->output_offset
+ addr
;
1868 alpha_vms_fix_sec_rel (bfd
*abfd
, struct bfd_link_info
*info
,
1869 unsigned int rel
, bfd_vma vma
)
1873 if (PRIV (sections
) == NULL
)
1876 sec
= PRIV (sections
)[rel
& RELC_MASK
];
1880 if (sec
->output_section
== NULL
)
1882 return vma
+ sec
->output_section
->vma
+ sec
->output_offset
;
1885 return vma
+ sec
->vma
;
1888 /* Read an ETIR record from ABFD. If INFO is not null, put the content into
1889 the output section (used during linking).
1890 Return FALSE in case of error. */
1893 _bfd_vms_slurp_etir (bfd
*abfd
, struct bfd_link_info
*info
)
1896 unsigned int length
;
1897 unsigned char *maxptr
;
1900 unsigned int rel1
= RELC_NONE
;
1901 unsigned int rel2
= RELC_NONE
;
1902 struct alpha_vms_link_hash_entry
*h
;
1904 PRIV (recrd
.rec
) += ETIR__C_HEADER_SIZE
;
1905 PRIV (recrd
.rec_size
) -= ETIR__C_HEADER_SIZE
;
1907 ptr
= PRIV (recrd
.rec
);
1908 length
= PRIV (recrd
.rec_size
);
1909 maxptr
= ptr
+ length
;
1911 vms_debug2 ((2, "ETIR: %d bytes\n", length
));
1913 while (ptr
< maxptr
)
1915 int cmd
, cmd_length
;
1917 if (ptr
+ 4 > maxptr
)
1920 cmd
= bfd_getl16 (ptr
);
1921 cmd_length
= bfd_getl16 (ptr
+ 2);
1923 /* PR 21589 and 21579: Check for a corrupt ETIR record. */
1924 if (cmd_length
< 4 || ptr
+ cmd_length
> maxptr
)
1927 _bfd_error_handler (_("corrupt ETIR record encountered"));
1928 bfd_set_error (bfd_error_bad_value
);
1935 _bfd_vms_debug (4, "etir: %s(%d)\n",
1936 _bfd_vms_etir_name (cmd
), cmd
);
1937 _bfd_hexdump (8, ptr
, cmd_length
, 0);
1945 stack 32 bit value of symbol (high bits set to 0). */
1946 case ETIR__C_STA_GBL
:
1947 _bfd_vms_get_value (abfd
, ptr
, ptr
+ cmd_length
, info
, &op1
, &h
);
1948 if (!_bfd_vms_push (abfd
, op1
, alpha_vms_sym_to_ctxt (h
)))
1955 stack 32 bit value, sign extend to 64 bit. */
1956 case ETIR__C_STA_LW
:
1959 if (!_bfd_vms_push (abfd
, bfd_getl32 (ptr
), RELC_NONE
))
1966 stack 64 bit value of symbol. */
1967 case ETIR__C_STA_QW
:
1970 if (!_bfd_vms_push (abfd
, bfd_getl64 (ptr
), RELC_NONE
))
1974 /* Stack psect base plus quadword offset
1975 arg: lw section index
1976 qw signed quadword offset (low 32 bits)
1978 Stack qw argument and section index
1979 (see ETIR__C_STO_OFF, ETIR__C_CTL_SETRB). */
1980 case ETIR__C_STA_PQ
:
1984 if (cmd_length
< 12)
1986 psect
= bfd_getl32 (ptr
);
1987 if ((unsigned int) psect
>= PRIV (section_count
))
1989 _bfd_error_handler (_("bad section index in %s"),
1990 _bfd_vms_etir_name (cmd
));
1991 bfd_set_error (bfd_error_bad_value
);
1994 op1
= bfd_getl64 (ptr
+ 4);
1995 if (!_bfd_vms_push (abfd
, op1
, psect
| RELC_SEC_BASE
))
2000 case ETIR__C_STA_LI
:
2001 case ETIR__C_STA_MOD
:
2002 case ETIR__C_STA_CKARG
:
2003 _bfd_error_handler (_("unsupported STA cmd %s"),
2004 _bfd_vms_etir_name (cmd
));
2008 /* Store byte: pop stack, write byte
2011 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2013 if (rel1
!= RELC_NONE
)
2015 if (!image_write_b (abfd
, (unsigned int) op1
& 0xff))
2019 /* Store word: pop stack, write word
2022 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2024 if (rel1
!= RELC_NONE
)
2026 if (!image_write_w (abfd
, (unsigned int) op1
& 0xffff))
2030 /* Store longword: pop stack, write longword
2032 case ETIR__C_STO_LW
:
2033 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2035 if (rel1
& RELC_SEC_BASE
)
2037 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2040 else if (rel1
& RELC_SHR_BASE
)
2042 if (!alpha_vms_add_fixup_lr (info
, rel1
& RELC_MASK
, op1
))
2046 if (rel1
!= RELC_NONE
)
2048 if (rel1
!= RELC_REL
)
2050 if (!alpha_vms_add_lw_reloc (info
))
2053 if (!image_write_l (abfd
, op1
))
2057 /* Store quadword: pop stack, write quadword
2059 case ETIR__C_STO_QW
:
2060 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2062 if (rel1
& RELC_SEC_BASE
)
2064 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2067 else if (rel1
& RELC_SHR_BASE
)
2069 if (rel1
!= RELC_NONE
)
2071 if (rel1
!= RELC_REL
)
2073 if (!alpha_vms_add_qw_reloc (info
))
2076 if (!image_write_q (abfd
, op1
))
2080 /* Store immediate repeated: pop stack for repeat count
2083 case ETIR__C_STO_IMMR
:
2089 size
= bfd_getl32 (ptr
);
2090 if (size
> cmd_length
- 4)
2092 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2094 if (rel1
!= RELC_NONE
)
2100 if (!image_write (abfd
, ptr
+ 4, size
))
2105 /* Store global: write symbol value
2106 arg: cs global symbol name. */
2107 case ETIR__C_STO_GBL
:
2108 _bfd_vms_get_value (abfd
, ptr
, ptr
+ cmd_length
, info
, &op1
, &h
);
2111 if (h
->sym
->typ
== EGSD__C_SYMG
)
2113 if (!alpha_vms_add_fixup_qr (info
, abfd
, h
->sym
->owner
,
2114 h
->sym
->symbol_vector
))
2120 op1
= alpha_vms_get_sym_value (h
->sym
->section
,
2122 if (!alpha_vms_add_qw_reloc (info
))
2126 if (!image_write_q (abfd
, op1
))
2130 /* Store code address: write address of entry point
2131 arg: cs global symbol name (procedure). */
2132 case ETIR__C_STO_CA
:
2133 _bfd_vms_get_value (abfd
, ptr
, ptr
+ cmd_length
, info
, &op1
, &h
);
2136 if (h
->sym
->flags
& EGSY__V_NORM
)
2138 /* That's really a procedure. */
2139 if (h
->sym
->typ
== EGSD__C_SYMG
)
2141 if (!alpha_vms_add_fixup_ca (info
, abfd
, h
->sym
->owner
))
2143 op1
= h
->sym
->symbol_vector
;
2147 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
2148 h
->sym
->code_value
);
2149 if (!alpha_vms_add_qw_reloc (info
))
2155 /* Symbol is not a procedure. */
2159 if (!image_write_q (abfd
, op1
))
2163 /* Store offset to psect: pop stack, add low 32 bits to base of psect
2165 case ETIR__C_STO_OFF
:
2166 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2169 if (!(rel1
& RELC_SEC_BASE
))
2172 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2174 if (!image_write_q (abfd
, op1
))
2179 arg: lw count of bytes
2181 case ETIR__C_STO_IMM
:
2187 size
= bfd_getl32 (ptr
);
2188 if (!image_write (abfd
, ptr
+ 4, size
))
2193 /* This code is 'reserved to digital' according to the openVMS
2194 linker manual, however it is generated by the DEC C compiler
2195 and defined in the include file.
2196 FIXME, since the following is just a guess
2197 store global longword: store 32bit value of symbol
2198 arg: cs symbol name. */
2199 case ETIR__C_STO_GBL_LW
:
2200 _bfd_vms_get_value (abfd
, ptr
, ptr
+ cmd_length
, info
, &op1
, &h
);
2204 if (!image_write_l (abfd
, op1
))
2208 case ETIR__C_STO_RB
:
2209 case ETIR__C_STO_AB
:
2210 case ETIR__C_STO_LP_PSB
:
2211 _bfd_error_handler (_("%s: not supported"),
2212 _bfd_vms_etir_name (cmd
));
2215 case ETIR__C_STO_HINT_GBL
:
2216 case ETIR__C_STO_HINT_PS
:
2217 _bfd_error_handler (_("%s: not implemented"),
2218 _bfd_vms_etir_name (cmd
));
2222 /* 200 Store-conditional Linkage Pair
2224 case ETIR__C_STC_LP
:
2226 /* 202 Store-conditional Address at global address
2230 case ETIR__C_STC_GBL
:
2232 /* 203 Store-conditional Code Address at global address
2234 cs procedure name. */
2235 case ETIR__C_STC_GCA
:
2237 /* 204 Store-conditional Address at psect + offset
2241 case ETIR__C_STC_PS
:
2242 _bfd_error_handler (_("%s: not supported"),
2243 _bfd_vms_etir_name (cmd
));
2247 /* 201 Store-conditional Linkage Pair with Procedure Signature
2253 case ETIR__C_STC_LP_PSB
:
2256 _bfd_vms_get_value (abfd
, ptr
+ 4, ptr
+ cmd_length
, info
, &op1
, &h
);
2259 if (h
->sym
->typ
== EGSD__C_SYMG
)
2261 if (!alpha_vms_add_fixup_lp (info
, abfd
, h
->sym
->owner
))
2263 op1
= h
->sym
->symbol_vector
;
2268 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
2269 h
->sym
->code_value
);
2270 op2
= alpha_vms_get_sym_value (h
->sym
->section
,
2276 /* Undefined symbol. */
2280 if (!image_write_q (abfd
, op1
)
2281 || !image_write_q (abfd
, op2
))
2285 /* 205 Store-conditional NOP at address of global
2287 case ETIR__C_STC_NOP_GBL
:
2290 /* 207 Store-conditional BSR at global address
2293 case ETIR__C_STC_BSR_GBL
:
2296 /* 209 Store-conditional LDA at global address
2299 case ETIR__C_STC_LDA_GBL
:
2302 /* 211 Store-conditional BSR or Hint at global address
2305 case ETIR__C_STC_BOH_GBL
:
2306 /* Currentl ignored. */
2309 /* 213 Store-conditional NOP,BSR or HINT at global address
2312 case ETIR__C_STC_NBH_GBL
:
2314 /* 206 Store-conditional NOP at pect + offset
2317 case ETIR__C_STC_NOP_PS
:
2319 /* 208 Store-conditional BSR at pect + offset
2322 case ETIR__C_STC_BSR_PS
:
2324 /* 210 Store-conditional LDA at psect + offset
2327 case ETIR__C_STC_LDA_PS
:
2329 /* 212 Store-conditional BSR or Hint at pect + offset
2332 case ETIR__C_STC_BOH_PS
:
2334 /* 214 Store-conditional NOP, BSR or HINT at psect + offset
2336 case ETIR__C_STC_NBH_PS
:
2337 _bfd_error_handler (_("%s: not supported"),
2338 _bfd_vms_etir_name (cmd
));
2342 /* Det relocation base: pop stack, set image location counter
2344 case ETIR__C_CTL_SETRB
:
2345 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2347 if (!(rel1
& RELC_SEC_BASE
))
2349 image_set_ptr (abfd
, op1
, rel1
& RELC_MASK
, info
);
2352 /* Augment relocation base: increment image location counter by offset
2353 arg: lw offset value. */
2354 case ETIR__C_CTL_AUGRB
:
2357 op1
= bfd_getl32 (ptr
);
2358 image_inc_ptr (abfd
, op1
);
2361 /* Define location: pop index, save location counter under index
2363 case ETIR__C_CTL_DFLOC
:
2364 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2366 if (rel1
!= RELC_NONE
)
2368 if (!dst_define_location (abfd
, op1
))
2372 /* Set location: pop index, restore location counter from index
2374 case ETIR__C_CTL_STLOC
:
2375 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2377 if (rel1
!= RELC_NONE
)
2379 if (!dst_restore_location (abfd
, op1
))
2381 bfd_set_error (bfd_error_bad_value
);
2382 _bfd_error_handler (_("invalid %s"), "ETIR__C_CTL_STLOC");
2387 /* Stack defined location: pop index, push location counter from index
2389 case ETIR__C_CTL_STKDL
:
2390 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2392 if (rel1
!= RELC_NONE
)
2394 if (!dst_retrieve_location (abfd
, &op1
))
2396 bfd_set_error (bfd_error_bad_value
);
2397 _bfd_error_handler (_("invalid %s"), "ETIR__C_CTL_STKDL");
2400 if (!_bfd_vms_push (abfd
, op1
, RELC_NONE
))
2404 case ETIR__C_OPR_NOP
: /* No-op. */
2407 case ETIR__C_OPR_ADD
: /* Add. */
2408 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2409 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2411 if (rel1
== RELC_NONE
&& rel2
!= RELC_NONE
)
2413 else if (rel1
!= RELC_NONE
&& rel2
!= RELC_NONE
)
2415 if (!_bfd_vms_push (abfd
, op1
+ op2
, rel1
))
2419 case ETIR__C_OPR_SUB
: /* Subtract. */
2420 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2421 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2423 if (rel1
== RELC_NONE
&& rel2
!= RELC_NONE
)
2425 else if ((rel1
& RELC_SEC_BASE
) && (rel2
& RELC_SEC_BASE
))
2427 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2428 op2
= alpha_vms_fix_sec_rel (abfd
, info
, rel2
, op2
);
2431 else if (rel1
!= RELC_NONE
&& rel2
!= RELC_NONE
)
2433 if (!_bfd_vms_push (abfd
, op2
- op1
, rel1
))
2437 case ETIR__C_OPR_MUL
: /* Multiply. */
2438 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2439 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2441 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2443 if (!_bfd_vms_push (abfd
, op1
* op2
, RELC_NONE
))
2447 case ETIR__C_OPR_DIV
: /* Divide. */
2448 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2449 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2451 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2455 /* Divide by zero is supposed to give a result of zero,
2456 and a non-fatal warning message. */
2457 _bfd_error_handler (_("%s divide by zero"), "ETIR__C_OPR_DIV");
2458 if (!_bfd_vms_push (abfd
, 0, RELC_NONE
))
2463 if (!_bfd_vms_push (abfd
, op2
/ op1
, RELC_NONE
))
2468 case ETIR__C_OPR_AND
: /* Logical AND. */
2469 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2470 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2472 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2474 if (!_bfd_vms_push (abfd
, op1
& op2
, RELC_NONE
))
2478 case ETIR__C_OPR_IOR
: /* Logical inclusive OR. */
2479 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2480 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2482 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2484 if (!_bfd_vms_push (abfd
, op1
| op2
, RELC_NONE
))
2488 case ETIR__C_OPR_EOR
: /* Logical exclusive OR. */
2489 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2490 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2492 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2494 if (!_bfd_vms_push (abfd
, op1
^ op2
, RELC_NONE
))
2498 case ETIR__C_OPR_NEG
: /* Negate. */
2499 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2501 if (rel1
!= RELC_NONE
)
2503 if (!_bfd_vms_push (abfd
, -op1
, RELC_NONE
))
2507 case ETIR__C_OPR_COM
: /* Complement. */
2508 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2510 if (rel1
!= RELC_NONE
)
2512 if (!_bfd_vms_push (abfd
, ~op1
, RELC_NONE
))
2516 case ETIR__C_OPR_ASH
: /* Arithmetic shift. */
2517 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2518 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2520 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2523 _bfd_error_handler (_("invalid use of %s with contexts"),
2524 _bfd_vms_etir_name (cmd
));
2527 if ((bfd_signed_vma
) op2
< 0)
2532 if (op2
>= CHAR_BIT
* sizeof (op1
))
2533 op2
= CHAR_BIT
* sizeof (op1
) - 1;
2534 /* op1 = (bfd_signed_vma) op1 >> op2; */
2535 sign
= op1
& ((bfd_vma
) 1 << (CHAR_BIT
* sizeof (op1
) - 1));
2538 op1
= (op1
^ sign
) - sign
;
2543 if (op2
>= CHAR_BIT
* sizeof (op1
))
2548 if (!_bfd_vms_push (abfd
, op1
, RELC_NONE
)) /* FIXME: sym. */
2552 case ETIR__C_OPR_INSV
: /* Insert field. */
2553 case ETIR__C_OPR_USH
: /* Unsigned shift. */
2554 case ETIR__C_OPR_ROT
: /* Rotate. */
2555 case ETIR__C_OPR_REDEF
: /* Redefine symbol to current location. */
2556 case ETIR__C_OPR_DFLIT
: /* Define a literal. */
2557 _bfd_error_handler (_("%s: not supported"),
2558 _bfd_vms_etir_name (cmd
));
2562 case ETIR__C_OPR_SEL
: /* Select. */
2563 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2567 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2572 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2573 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2575 if (!_bfd_vms_push (abfd
, op1
, rel1
))
2581 _bfd_error_handler (_("reserved cmd %d"), cmd
);
2592 /* Process EDBG/ETBT record.
2593 Return TRUE on success, FALSE on error */
2596 vms_slurp_debug (bfd
*abfd
)
2598 asection
*section
= PRIV (dst_section
);
2600 if (section
== NULL
)
2602 /* We have no way to find out beforehand how much debug info there
2603 is in an object file, so pick an initial amount and grow it as
2605 flagword flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
| SEC_RELOC
2608 section
= bfd_make_section (abfd
, "$DST$");
2611 if (!bfd_set_section_flags (section
, flags
))
2613 PRIV (dst_section
) = section
;
2616 PRIV (image_section
) = section
;
2617 PRIV (image_offset
) = section
->size
;
2619 if (!_bfd_vms_slurp_etir (abfd
, NULL
))
2622 section
->size
= PRIV (image_offset
);
2626 /* Process EDBG record.
2627 Return TRUE on success, FALSE on error. */
2630 _bfd_vms_slurp_edbg (bfd
*abfd
)
2632 vms_debug2 ((2, "EDBG\n"));
2634 abfd
->flags
|= HAS_DEBUG
| HAS_LINENO
;
2636 return vms_slurp_debug (abfd
);
2639 /* Process ETBT record.
2640 Return TRUE on success, FALSE on error. */
2643 _bfd_vms_slurp_etbt (bfd
*abfd
)
2645 vms_debug2 ((2, "ETBT\n"));
2647 abfd
->flags
|= HAS_LINENO
;
2649 return vms_slurp_debug (abfd
);
2652 /* Process EEOM record.
2653 Return TRUE on success, FALSE on error. */
2656 _bfd_vms_slurp_eeom (bfd
*abfd
)
2658 struct vms_eeom
*eeom
= (struct vms_eeom
*) PRIV (recrd
.rec
);
2660 vms_debug2 ((2, "EEOM\n"));
2662 /* PR 21813: Check for an undersized record. */
2663 if (PRIV (recrd
.buf_size
) < sizeof (* eeom
))
2665 _bfd_error_handler (_("corrupt EEOM record - size is too small"));
2666 bfd_set_error (bfd_error_bad_value
);
2670 PRIV (eom_data
).eom_l_total_lps
= bfd_getl32 (eeom
->total_lps
);
2671 PRIV (eom_data
).eom_w_comcod
= bfd_getl16 (eeom
->comcod
);
2672 if (PRIV (eom_data
).eom_w_comcod
> 1)
2674 _bfd_error_handler (_("object module not error-free !"));
2675 bfd_set_error (bfd_error_bad_value
);
2679 PRIV (eom_data
).eom_has_transfer
= false;
2680 if (PRIV (recrd
.rec_size
) > 10)
2682 PRIV (eom_data
).eom_has_transfer
= true;
2683 PRIV (eom_data
).eom_b_tfrflg
= eeom
->tfrflg
;
2684 PRIV (eom_data
).eom_l_psindx
= bfd_getl32 (eeom
->psindx
);
2685 PRIV (eom_data
).eom_l_tfradr
= bfd_getl32 (eeom
->tfradr
);
2687 abfd
->start_address
= PRIV (eom_data
).eom_l_tfradr
;
2692 /* Slurp an ordered set of VMS object records. Return FALSE on error. */
2695 _bfd_vms_slurp_object_records (bfd
* abfd
)
2702 vms_debug2 ((7, "reading at %08lx\n", (unsigned long)bfd_tell (abfd
)));
2704 type
= _bfd_vms_get_object_record (abfd
);
2707 vms_debug2 ((2, "next_record failed\n"));
2714 ok
= _bfd_vms_slurp_ehdr (abfd
);
2717 ok
= _bfd_vms_slurp_eeom (abfd
);
2720 ok
= _bfd_vms_slurp_egsd (abfd
);
2723 ok
= true; /* _bfd_vms_slurp_etir (abfd); */
2726 ok
= _bfd_vms_slurp_edbg (abfd
);
2729 ok
= _bfd_vms_slurp_etbt (abfd
);
2736 vms_debug2 ((2, "slurp type %d failed\n", type
));
2740 while (type
!= EOBJ__C_EEOM
);
2745 /* Initialize private data */
2747 vms_initialize (bfd
* abfd
)
2751 amt
= sizeof (struct vms_private_data_struct
);
2752 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
2753 if (abfd
->tdata
.any
== NULL
)
2756 PRIV (recrd
.file_format
) = FF_UNKNOWN
;
2758 amt
= sizeof (struct stack_struct
) * STACKSIZE
;
2759 PRIV (stack
) = bfd_alloc (abfd
, amt
);
2760 if (PRIV (stack
) == NULL
)
2766 bfd_release (abfd
, abfd
->tdata
.any
);
2767 abfd
->tdata
.any
= NULL
;
2771 /* Free malloc'd memory. */
2774 alpha_vms_free_private (bfd
*abfd
)
2776 struct module
*module
;
2778 free (PRIV (recrd
.buf
));
2779 free (PRIV (sections
));
2781 free (PRIV (dst_ptr_offsets
));
2783 for (module
= PRIV (modules
); module
; module
= module
->next
)
2784 free (module
->file_table
);
2787 /* Check the format for a file being read.
2788 Return a (bfd_target *) if it's an object file or zero if not. */
2791 alpha_vms_object_p (bfd
*abfd
)
2793 unsigned int test_len
;
2796 vms_debug2 ((1, "vms_object_p(%p)\n", abfd
));
2798 /* Allocate alpha-vms specific data. */
2799 if (!vms_initialize (abfd
))
2802 if (bfd_seek (abfd
, 0, SEEK_SET
))
2805 /* The first challenge with VMS is to discover the kind of the file.
2807 Image files (executable or shared images) are stored as a raw
2808 stream of bytes (like on UNIX), but there is no magic number.
2810 Object files are written with RMS (record management service), ie
2811 each records are preceeded by its length (on a word - 2 bytes), and
2812 padded for word-alignment. That would be simple but when files
2813 are transfered to a UNIX filesystem (using ftp), records are lost.
2814 Only the raw content of the records are transfered. Fortunately,
2815 the Alpha Object file format also store the length of the record
2816 in the records. Is that clear ? */
2818 /* Minimum is 6 bytes for objects (2 bytes size, 2 bytes record id,
2819 2 bytes size repeated) and 12 bytes for images (4 bytes major id,
2820 4 bytes minor id, 4 bytes length). */
2822 buf
= _bfd_malloc_and_read (abfd
, test_len
, test_len
);
2825 PRIV (recrd
.buf
) = buf
;
2826 PRIV (recrd
.buf_size
) = test_len
;
2827 PRIV (recrd
.rec
) = buf
;
2829 /* Is it an image? */
2830 if ((bfd_getl32 (buf
) == EIHD__K_MAJORID
)
2831 && (bfd_getl32 (buf
+ 4) == EIHD__K_MINORID
))
2833 unsigned int eisd_offset
, eihs_offset
;
2835 /* Extract the header size. */
2836 PRIV (recrd
.rec_size
) = bfd_getl32 (buf
+ EIHD__L_SIZE
);
2838 /* The header size is 0 for DSF files. */
2839 if (PRIV (recrd
.rec_size
) == 0)
2840 PRIV (recrd
.rec_size
) = sizeof (struct vms_eihd
);
2842 /* PR 21813: Check for a truncated record. */
2843 /* PR 17512: file: 7d7c57c2. */
2844 if (PRIV (recrd
.rec_size
) < sizeof (struct vms_eihd
))
2845 goto err_wrong_format
;
2847 if (bfd_seek (abfd
, 0, SEEK_SET
))
2850 free (PRIV (recrd
.buf
));
2851 PRIV (recrd
.buf
) = NULL
;
2852 buf
= _bfd_malloc_and_read (abfd
, PRIV (recrd
.rec_size
),
2853 PRIV (recrd
.rec_size
));
2857 PRIV (recrd
.buf
) = buf
;
2858 PRIV (recrd
.buf_size
) = PRIV (recrd
.rec_size
);
2859 PRIV (recrd
.rec
) = buf
;
2861 vms_debug2 ((2, "file type is image\n"));
2863 if (!_bfd_vms_slurp_eihd (abfd
, &eisd_offset
, &eihs_offset
))
2864 goto err_wrong_format
;
2866 if (!_bfd_vms_slurp_eisd (abfd
, eisd_offset
))
2867 goto err_wrong_format
;
2869 /* EIHS is optional. */
2870 if (eihs_offset
!= 0 && !_bfd_vms_slurp_eihs (abfd
, eihs_offset
))
2871 goto err_wrong_format
;
2877 /* Assume it's a module and adjust record pointer if necessary. */
2878 maybe_adjust_record_pointer_for_object (abfd
);
2880 /* But is it really a module? */
2881 if (bfd_getl16 (PRIV (recrd
.rec
)) <= EOBJ__C_MAXRECTYP
2882 && bfd_getl16 (PRIV (recrd
.rec
) + 2) <= EOBJ__C_MAXRECSIZ
)
2884 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
2885 goto err_wrong_format
;
2887 vms_debug2 ((2, "file type is module\n"));
2889 type
= bfd_getl16 (PRIV (recrd
.rec
));
2890 if (type
!= EOBJ__C_EMH
|| !_bfd_vms_slurp_ehdr (abfd
))
2891 goto err_wrong_format
;
2893 if (!_bfd_vms_slurp_object_records (abfd
))
2894 goto err_wrong_format
;
2897 goto err_wrong_format
;
2900 /* Set arch_info to alpha. */
2902 if (! bfd_default_set_arch_mach (abfd
, bfd_arch_alpha
, 0))
2903 goto err_wrong_format
;
2905 return alpha_vms_free_private
;
2908 bfd_set_error (bfd_error_wrong_format
);
2911 alpha_vms_free_private (abfd
);
2912 bfd_release (abfd
, abfd
->tdata
.any
);
2918 /* Write an EMH/MHD record. */
2921 _bfd_vms_write_emh (bfd
*abfd
)
2923 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2924 unsigned char tbuf
[18];
2926 _bfd_vms_output_alignment (recwr
, 2);
2929 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2930 _bfd_vms_output_short (recwr
, EMH__C_MHD
);
2931 _bfd_vms_output_short (recwr
, EOBJ__C_STRLVL
);
2932 _bfd_vms_output_long (recwr
, 0);
2933 _bfd_vms_output_long (recwr
, 0);
2934 _bfd_vms_output_long (recwr
, MAX_OUTREC_SIZE
);
2936 /* Create module name from filename. */
2937 if (bfd_get_filename (abfd
) != 0)
2939 char *module
= vms_get_module_name (bfd_get_filename (abfd
), true);
2940 _bfd_vms_output_counted (recwr
, module
);
2944 _bfd_vms_output_counted (recwr
, "NONAME");
2946 _bfd_vms_output_counted (recwr
, BFD_VERSION_STRING
);
2947 _bfd_vms_output_dump (recwr
, get_vms_time_string (tbuf
), EMH_DATE_LENGTH
);
2948 _bfd_vms_output_fill (recwr
, 0, EMH_DATE_LENGTH
);
2949 return _bfd_vms_output_end (abfd
, recwr
);
2952 /* Write an EMH/LMN record. */
2955 _bfd_vms_write_lmn (bfd
*abfd
, const char *name
)
2958 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2959 unsigned int ver
= BFD_VERSION
/ 10000;
2962 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2963 _bfd_vms_output_short (recwr
, EMH__C_LNM
);
2964 snprintf (version
, sizeof (version
), "%s %d.%d.%d", name
,
2965 ver
/ 10000, (ver
/ 100) % 100, ver
% 100);
2966 _bfd_vms_output_dump (recwr
, (unsigned char *)version
, strlen (version
));
2967 return _bfd_vms_output_end (abfd
, recwr
);
2971 /* Write eom record for bfd abfd. Return FALSE on error. */
2974 _bfd_vms_write_eeom (bfd
*abfd
)
2976 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2978 vms_debug2 ((2, "vms_write_eeom\n"));
2980 _bfd_vms_output_alignment (recwr
, 2);
2982 _bfd_vms_output_begin (recwr
, EOBJ__C_EEOM
);
2983 _bfd_vms_output_long (recwr
, PRIV (vms_linkage_index
+ 1) >> 1);
2984 _bfd_vms_output_byte (recwr
, 0); /* Completion code. */
2985 _bfd_vms_output_byte (recwr
, 0); /* Fill byte. */
2987 if ((abfd
->flags
& EXEC_P
) == 0
2988 && bfd_get_start_address (abfd
) != (bfd_vma
)-1)
2992 section
= bfd_get_section_by_name (abfd
, ".link");
2995 bfd_set_error (bfd_error_nonrepresentable_section
);
2998 _bfd_vms_output_short (recwr
, 0);
2999 _bfd_vms_output_long (recwr
, (unsigned long) section
->target_index
);
3000 _bfd_vms_output_long (recwr
,
3001 (unsigned long) bfd_get_start_address (abfd
));
3002 _bfd_vms_output_long (recwr
, 0);
3005 return _bfd_vms_output_end (abfd
, recwr
);
3009 vector_grow1 (struct vector_type
*vec
, size_t elsz
)
3011 if (vec
->nbr_el
>= vec
->max_el
)
3013 if (vec
->max_el
== 0)
3016 vec
->els
= bfd_malloc (vec
->max_el
* elsz
);
3021 if (vec
->max_el
> -1u / 2)
3023 bfd_set_error (bfd_error_file_too_big
);
3027 if (_bfd_mul_overflow (vec
->max_el
, elsz
, &amt
))
3029 bfd_set_error (bfd_error_file_too_big
);
3032 vec
->els
= bfd_realloc_or_free (vec
->els
, amt
);
3035 if (vec
->els
== NULL
)
3037 return (char *) vec
->els
+ elsz
* vec
->nbr_el
++;
3040 /* Bump ABFD file position to next block. */
3043 alpha_vms_file_position_block (bfd
*abfd
)
3046 PRIV (file_pos
) += VMS_BLOCK_SIZE
- 1;
3047 PRIV (file_pos
) -= (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
3050 /* Convert from internal structure SRC to external structure DST. */
3053 alpha_vms_swap_eisd_out (struct vms_internal_eisd_map
*src
,
3054 struct vms_eisd
*dst
)
3056 bfd_putl32 (src
->u
.eisd
.majorid
, dst
->majorid
);
3057 bfd_putl32 (src
->u
.eisd
.minorid
, dst
->minorid
);
3058 bfd_putl32 (src
->u
.eisd
.eisdsize
, dst
->eisdsize
);
3059 if (src
->u
.eisd
.eisdsize
<= EISD__K_LENEND
)
3061 bfd_putl32 (src
->u
.eisd
.secsize
, dst
->secsize
);
3062 bfd_putl64 (src
->u
.eisd
.virt_addr
, dst
->virt_addr
);
3063 bfd_putl32 (src
->u
.eisd
.flags
, dst
->flags
);
3064 bfd_putl32 (src
->u
.eisd
.vbn
, dst
->vbn
);
3065 dst
->pfc
= src
->u
.eisd
.pfc
;
3066 dst
->matchctl
= src
->u
.eisd
.matchctl
;
3067 dst
->type
= src
->u
.eisd
.type
;
3069 if (src
->u
.eisd
.flags
& EISD__M_GBL
)
3071 bfd_putl32 (src
->u
.gbl_eisd
.ident
, dst
->ident
);
3072 memcpy (dst
->gblnam
, src
->u
.gbl_eisd
.gblnam
,
3073 src
->u
.gbl_eisd
.gblnam
[0] + 1);
3077 /* Append EISD to the list of extra eisd for ABFD. */
3080 alpha_vms_append_extra_eisd (bfd
*abfd
, struct vms_internal_eisd_map
*eisd
)
3083 if (PRIV (gbl_eisd_head
) == NULL
)
3084 PRIV (gbl_eisd_head
) = eisd
;
3086 PRIV (gbl_eisd_tail
)->next
= eisd
;
3087 PRIV (gbl_eisd_tail
) = eisd
;
3090 /* Create an EISD for shared image SHRIMG.
3091 Return FALSE in case of error. */
3094 alpha_vms_create_eisd_for_shared (bfd
*abfd
, bfd
*shrimg
)
3096 struct vms_internal_eisd_map
*eisd
;
3099 namlen
= strlen (PRIV2 (shrimg
, hdr_data
.hdr_t_name
));
3100 if (namlen
+ 5 > EISD__K_GBLNAMLEN
)
3106 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
3110 /* Fill the fields. */
3111 eisd
->u
.gbl_eisd
.common
.majorid
= EISD__K_MAJORID
;
3112 eisd
->u
.gbl_eisd
.common
.minorid
= EISD__K_MINORID
;
3113 eisd
->u
.gbl_eisd
.common
.eisdsize
= (EISD__K_LEN
+ 4 + namlen
+ 5 + 3) & ~3;
3114 eisd
->u
.gbl_eisd
.common
.secsize
= VMS_BLOCK_SIZE
; /* Must not be 0. */
3115 eisd
->u
.gbl_eisd
.common
.virt_addr
= 0;
3116 eisd
->u
.gbl_eisd
.common
.flags
= EISD__M_GBL
;
3117 eisd
->u
.gbl_eisd
.common
.vbn
= 0;
3118 eisd
->u
.gbl_eisd
.common
.pfc
= 0;
3119 eisd
->u
.gbl_eisd
.common
.matchctl
= PRIV2 (shrimg
, matchctl
);
3120 eisd
->u
.gbl_eisd
.common
.type
= EISD__K_SHRPIC
;
3122 eisd
->u
.gbl_eisd
.ident
= PRIV2 (shrimg
, ident
);
3123 eisd
->u
.gbl_eisd
.gblnam
[0] = namlen
+ 4;
3124 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1, PRIV2 (shrimg
, hdr_data
.hdr_t_name
),
3126 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1 + namlen
, "_001", 4);
3128 /* Append it to the list. */
3129 alpha_vms_append_extra_eisd (abfd
, eisd
);
3134 /* Create an EISD for section SEC.
3135 Return FALSE in case of failure. */
3138 alpha_vms_create_eisd_for_section (bfd
*abfd
, asection
*sec
)
3140 struct vms_internal_eisd_map
*eisd
;
3142 /* Only for allocating section. */
3143 if (!(sec
->flags
& SEC_ALLOC
))
3146 BFD_ASSERT (vms_section_data (sec
)->eisd
== NULL
);
3147 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
3150 vms_section_data (sec
)->eisd
= eisd
;
3152 /* Fill the fields. */
3153 eisd
->u
.eisd
.majorid
= EISD__K_MAJORID
;
3154 eisd
->u
.eisd
.minorid
= EISD__K_MINORID
;
3155 eisd
->u
.eisd
.eisdsize
= EISD__K_LEN
;
3156 eisd
->u
.eisd
.secsize
=
3157 (sec
->size
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
3158 eisd
->u
.eisd
.virt_addr
= sec
->vma
;
3159 eisd
->u
.eisd
.flags
= 0;
3160 eisd
->u
.eisd
.vbn
= 0; /* To be later defined. */
3161 eisd
->u
.eisd
.pfc
= 0; /* Default. */
3162 eisd
->u
.eisd
.matchctl
= EISD__K_MATALL
;
3163 eisd
->u
.eisd
.type
= EISD__K_NORMAL
;
3165 if (sec
->flags
& SEC_CODE
)
3166 eisd
->u
.eisd
.flags
|= EISD__M_EXE
;
3167 if (!(sec
->flags
& SEC_READONLY
))
3168 eisd
->u
.eisd
.flags
|= EISD__M_WRT
| EISD__M_CRF
;
3170 /* If relocations or fixup will be applied, make this isect writeable. */
3171 if (sec
->flags
& SEC_RELOC
)
3172 eisd
->u
.eisd
.flags
|= EISD__M_WRT
| EISD__M_CRF
;
3174 if (!(sec
->flags
& SEC_HAS_CONTENTS
))
3176 eisd
->u
.eisd
.flags
|= EISD__M_DZRO
;
3177 eisd
->u
.eisd
.flags
&= ~EISD__M_CRF
;
3179 if (sec
->flags
& SEC_LINKER_CREATED
)
3181 if (strcmp (sec
->name
, "$FIXUP$") == 0)
3182 eisd
->u
.eisd
.flags
|= EISD__M_FIXUPVEC
;
3185 /* Append it to the list. */
3187 if (PRIV (eisd_head
) == NULL
)
3188 PRIV (eisd_head
) = eisd
;
3190 PRIV (eisd_tail
)->next
= eisd
;
3191 PRIV (eisd_tail
) = eisd
;
3196 /* Layout executable ABFD and write it to the disk.
3197 Return FALSE in case of failure. */
3200 alpha_vms_write_exec (bfd
*abfd
)
3202 struct vms_eihd eihd
;
3203 struct vms_eiha
*eiha
;
3204 struct vms_eihi
*eihi
;
3205 struct vms_eihs
*eihs
= NULL
;
3207 struct vms_internal_eisd_map
*first_eisd
;
3208 struct vms_internal_eisd_map
*eisd
;
3211 file_ptr gst_filepos
= 0;
3212 unsigned int lnkflags
= 0;
3214 /* Build the EIHD. */
3215 PRIV (file_pos
) = EIHD__C_LENGTH
;
3217 memset (&eihd
, 0, sizeof (eihd
));
3218 memset (eihd
.fill_2
, 0xff, sizeof (eihd
.fill_2
));
3220 bfd_putl32 (EIHD__K_MAJORID
, eihd
.majorid
);
3221 bfd_putl32 (EIHD__K_MINORID
, eihd
.minorid
);
3223 bfd_putl32 (sizeof (eihd
), eihd
.size
);
3224 bfd_putl32 (0, eihd
.isdoff
);
3225 bfd_putl32 (0, eihd
.activoff
);
3226 bfd_putl32 (0, eihd
.symdbgoff
);
3227 bfd_putl32 (0, eihd
.imgidoff
);
3228 bfd_putl32 (0, eihd
.patchoff
);
3229 bfd_putl64 (0, eihd
.iafva
);
3230 bfd_putl32 (0, eihd
.version_array_off
);
3232 bfd_putl32 (EIHD__K_EXE
, eihd
.imgtype
);
3233 bfd_putl32 (0, eihd
.subtype
);
3235 bfd_putl32 (0, eihd
.imgiocnt
);
3236 bfd_putl32 (-1, eihd
.privreqs
);
3237 bfd_putl32 (-1, eihd
.privreqs
+ 4);
3239 bfd_putl32 ((sizeof (eihd
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
3241 bfd_putl32 (0, eihd
.ident
);
3242 bfd_putl32 (0, eihd
.sysver
);
3245 bfd_putl32 (0, eihd
.symvect_size
);
3246 bfd_putl32 (16, eihd
.virt_mem_block_size
);
3247 bfd_putl32 (0, eihd
.ext_fixup_off
);
3248 bfd_putl32 (0, eihd
.noopt_psect_off
);
3249 bfd_putl16 (-1, eihd
.alias
);
3252 eiha
= (struct vms_eiha
*)((char *) &eihd
+ PRIV (file_pos
));
3253 bfd_putl32 (PRIV (file_pos
), eihd
.activoff
);
3254 PRIV (file_pos
) += sizeof (struct vms_eiha
);
3256 bfd_putl32 (sizeof (struct vms_eiha
), eiha
->size
);
3257 bfd_putl32 (0, eiha
->spare
);
3258 bfd_putl64 (PRIV (transfer_address
[0]), eiha
->tfradr1
);
3259 bfd_putl64 (PRIV (transfer_address
[1]), eiha
->tfradr2
);
3260 bfd_putl64 (PRIV (transfer_address
[2]), eiha
->tfradr3
);
3261 bfd_putl64 (PRIV (transfer_address
[3]), eiha
->tfradr4
);
3262 bfd_putl64 (0, eiha
->inishr
);
3265 eihi
= (struct vms_eihi
*)((char *) &eihd
+ PRIV (file_pos
));
3266 bfd_putl32 (PRIV (file_pos
), eihd
.imgidoff
);
3267 PRIV (file_pos
) += sizeof (struct vms_eihi
);
3269 bfd_putl32 (EIHI__K_MAJORID
, eihi
->majorid
);
3270 bfd_putl32 (EIHI__K_MINORID
, eihi
->minorid
);
3275 /* Set module name. */
3276 module
= vms_get_module_name (bfd_get_filename (abfd
), true);
3277 len
= strlen (module
);
3278 if (len
> sizeof (eihi
->imgnam
) - 1)
3279 len
= sizeof (eihi
->imgnam
) - 1;
3280 eihi
->imgnam
[0] = len
;
3281 memcpy (eihi
->imgnam
+ 1, module
, len
);
3289 vms_get_time (&hi
, &lo
);
3290 bfd_putl32 (lo
, eihi
->linktime
+ 0);
3291 bfd_putl32 (hi
, eihi
->linktime
+ 4);
3294 eihi
->linkid
[0] = 0;
3295 eihi
->imgbid
[0] = 0;
3298 dst
= PRIV (dst_section
);
3299 dmt
= bfd_get_section_by_name (abfd
, "$DMT$");
3300 if (dst
!= NULL
&& dst
->size
!= 0)
3302 eihs
= (struct vms_eihs
*)((char *) &eihd
+ PRIV (file_pos
));
3303 bfd_putl32 (PRIV (file_pos
), eihd
.symdbgoff
);
3304 PRIV (file_pos
) += sizeof (struct vms_eihs
);
3306 bfd_putl32 (EIHS__K_MAJORID
, eihs
->majorid
);
3307 bfd_putl32 (EIHS__K_MINORID
, eihs
->minorid
);
3308 bfd_putl32 (0, eihs
->dstvbn
);
3309 bfd_putl32 (0, eihs
->dstsize
);
3310 bfd_putl32 (0, eihs
->gstvbn
);
3311 bfd_putl32 (0, eihs
->gstsize
);
3312 bfd_putl32 (0, eihs
->dmtvbn
);
3313 bfd_putl32 (0, eihs
->dmtsize
);
3316 /* One EISD per section. */
3317 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3319 if (!alpha_vms_create_eisd_for_section (abfd
, sec
))
3323 /* Merge section EIDS which extra ones. */
3324 if (PRIV (eisd_tail
))
3325 PRIV (eisd_tail
)->next
= PRIV (gbl_eisd_head
);
3327 PRIV (eisd_head
) = PRIV (gbl_eisd_head
);
3328 if (PRIV (gbl_eisd_tail
))
3329 PRIV (eisd_tail
) = PRIV (gbl_eisd_tail
);
3331 first_eisd
= PRIV (eisd_head
);
3333 /* Add end of eisd. */
3336 eisd
= bfd_zalloc (abfd
, sizeof (*eisd
));
3339 eisd
->u
.eisd
.majorid
= 0;
3340 eisd
->u
.eisd
.minorid
= 0;
3341 eisd
->u
.eisd
.eisdsize
= 0;
3342 alpha_vms_append_extra_eisd (abfd
, eisd
);
3345 /* Place EISD in the file. */
3346 for (eisd
= first_eisd
; eisd
; eisd
= eisd
->next
)
3348 file_ptr room
= VMS_BLOCK_SIZE
- (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
3350 /* First block is a little bit special: there is a word at the end. */
3351 if (PRIV (file_pos
) < VMS_BLOCK_SIZE
&& room
> 2)
3353 if (room
< eisd
->u
.eisd
.eisdsize
+ EISD__K_LENEND
)
3354 alpha_vms_file_position_block (abfd
);
3356 eisd
->file_pos
= PRIV (file_pos
);
3357 PRIV (file_pos
) += eisd
->u
.eisd
.eisdsize
;
3359 if (eisd
->u
.eisd
.flags
& EISD__M_FIXUPVEC
)
3360 bfd_putl64 (eisd
->u
.eisd
.virt_addr
, eihd
.iafva
);
3363 if (first_eisd
!= NULL
)
3365 bfd_putl32 (first_eisd
->file_pos
, eihd
.isdoff
);
3366 /* Real size of end of eisd marker. */
3367 PRIV (file_pos
) += EISD__K_LENEND
;
3370 bfd_putl32 (PRIV (file_pos
), eihd
.size
);
3371 bfd_putl32 ((PRIV (file_pos
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
3374 /* Place sections. */
3375 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3377 if (!(sec
->flags
& SEC_HAS_CONTENTS
)
3378 || sec
->contents
== NULL
)
3381 eisd
= vms_section_data (sec
)->eisd
;
3383 /* Align on a block. */
3384 alpha_vms_file_position_block (abfd
);
3385 sec
->filepos
= PRIV (file_pos
);
3388 eisd
->u
.eisd
.vbn
= (sec
->filepos
/ VMS_BLOCK_SIZE
) + 1;
3390 PRIV (file_pos
) += sec
->size
;
3394 if (eihs
!= NULL
&& dst
!= NULL
)
3396 bfd_putl32 ((dst
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dstvbn
);
3397 bfd_putl32 (dst
->size
, eihs
->dstsize
);
3401 lnkflags
|= EIHD__M_DBGDMT
;
3402 bfd_putl32 ((dmt
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dmtvbn
);
3403 bfd_putl32 (dmt
->size
, eihs
->dmtsize
);
3405 if (PRIV (gsd_sym_count
) != 0)
3407 alpha_vms_file_position_block (abfd
);
3408 gst_filepos
= PRIV (file_pos
);
3409 bfd_putl32 ((gst_filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->gstvbn
);
3410 bfd_putl32 ((PRIV (gsd_sym_count
) + 4) / 5 + 4, eihs
->gstsize
);
3414 /* Write EISD in hdr. */
3415 for (eisd
= first_eisd
; eisd
&& eisd
->file_pos
< VMS_BLOCK_SIZE
;
3417 alpha_vms_swap_eisd_out
3418 (eisd
, (struct vms_eisd
*)((char *)&eihd
+ eisd
->file_pos
));
3420 /* Write first block. */
3421 bfd_putl32 (lnkflags
, eihd
.lnkflags
);
3422 if (bfd_write (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
3425 /* Write remaining eisd. */
3428 unsigned char blk
[VMS_BLOCK_SIZE
];
3429 struct vms_internal_eisd_map
*next_eisd
;
3431 memset (blk
, 0xff, sizeof (blk
));
3432 while (eisd
!= NULL
)
3434 alpha_vms_swap_eisd_out
3436 (struct vms_eisd
*)(blk
+ (eisd
->file_pos
% VMS_BLOCK_SIZE
)));
3438 next_eisd
= eisd
->next
;
3439 if (next_eisd
== NULL
3440 || (next_eisd
->file_pos
/ VMS_BLOCK_SIZE
3441 != eisd
->file_pos
/ VMS_BLOCK_SIZE
))
3443 if (bfd_write (blk
, sizeof (blk
), abfd
) != sizeof (blk
))
3446 memset (blk
, 0xff, sizeof (blk
));
3452 /* Write sections. */
3453 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3455 unsigned char blk
[VMS_BLOCK_SIZE
];
3458 if (sec
->size
== 0 || !(sec
->flags
& SEC_HAS_CONTENTS
)
3459 || sec
->contents
== NULL
)
3461 if (bfd_write (sec
->contents
, sec
->size
, abfd
) != sec
->size
)
3465 len
= VMS_BLOCK_SIZE
- sec
->size
% VMS_BLOCK_SIZE
;
3466 if (len
!= VMS_BLOCK_SIZE
)
3468 memset (blk
, 0, len
);
3469 if (bfd_write (blk
, len
, abfd
) != len
)
3475 if (gst_filepos
!= 0)
3477 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3480 if (!_bfd_vms_write_emh (abfd
)
3481 || !_bfd_vms_write_lmn (abfd
, "GNU LD"))
3484 /* PSC for the absolute section. */
3485 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3486 _bfd_vms_output_long (recwr
, 0);
3487 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3488 _bfd_vms_output_short (recwr
, 0);
3489 _bfd_vms_output_short (recwr
, EGPS__V_PIC
| EGPS__V_LIB
| EGPS__V_RD
);
3490 _bfd_vms_output_long (recwr
, 0);
3491 _bfd_vms_output_counted (recwr
, ".$$ABS$$.");
3492 _bfd_vms_output_end_subrec (recwr
);
3493 if (!_bfd_vms_output_end (abfd
, recwr
))
3496 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
3498 struct vms_symbol_entry
*sym
= PRIV (syms
)[i
];
3504 _bfd_vms_output_alignment (recwr
, 8);
3505 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3506 _bfd_vms_output_long (recwr
, 0);
3508 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_SYMG
);
3509 _bfd_vms_output_short (recwr
, 0); /* Data type, alignment. */
3510 _bfd_vms_output_short (recwr
, sym
->flags
);
3512 if (sym
->code_section
)
3513 ep
= alpha_vms_get_sym_value (sym
->code_section
, sym
->code_value
);
3516 BFD_ASSERT (sym
->code_value
== 0);
3519 val
= alpha_vms_get_sym_value (sym
->section
, sym
->value
);
3520 _bfd_vms_output_quad
3521 (recwr
, sym
->typ
== EGSD__C_SYMG
? sym
->symbol_vector
: val
);
3522 _bfd_vms_output_quad (recwr
, ep
);
3523 _bfd_vms_output_quad (recwr
, val
);
3524 _bfd_vms_output_long (recwr
, 0);
3525 _bfd_vms_output_counted (recwr
, sym
->name
);
3526 _bfd_vms_output_end_subrec (recwr
);
3528 && !_bfd_vms_output_end (abfd
, recwr
))
3532 && !_bfd_vms_output_end (abfd
, recwr
))
3535 if (!_bfd_vms_write_eeom (abfd
))
3543 /* Write section and symbol directory of bfd abfd. Return FALSE on error. */
3546 _bfd_vms_write_egsd (bfd
*abfd
)
3550 unsigned int symnum
;
3552 flagword new_flags
, old_flags
;
3553 int abs_section_index
= -1;
3554 unsigned int target_index
= 0;
3555 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3557 vms_debug2 ((2, "vms_write_egsd\n"));
3559 /* Egsd is quadword aligned. */
3560 _bfd_vms_output_alignment (recwr
, 8);
3562 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3563 _bfd_vms_output_long (recwr
, 0);
3565 /* Number sections. */
3566 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
3568 if (section
->flags
& SEC_DEBUGGING
)
3570 if (!strcmp (section
->name
, ".vmsdebug"))
3572 section
->flags
|= SEC_DEBUGGING
;
3575 section
->target_index
= target_index
++;
3578 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
3580 vms_debug2 ((3, "Section #%d %s, %d bytes\n",
3581 section
->target_index
, section
->name
, (int)section
->size
));
3583 /* Don't write out the VMS debug info section since it is in the
3584 ETBT and EDBG sections in etir. */
3585 if (section
->flags
& SEC_DEBUGGING
)
3588 /* 13 bytes egsd, max 31 chars name -> should be 44 bytes. */
3589 if (_bfd_vms_output_check (recwr
, 64) < 0)
3591 if (!_bfd_vms_output_end (abfd
, recwr
))
3593 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3594 _bfd_vms_output_long (recwr
, 0);
3597 /* Don't know if this is necessary for the linker but for now it keeps
3598 vms_slurp_gsd happy. */
3599 sname
= section
->name
;
3602 /* Remove leading dot. */
3604 if ((*sname
== 't') && (strcmp (sname
, "text") == 0))
3605 sname
= EVAX_CODE_NAME
;
3606 else if ((*sname
== 'd') && (strcmp (sname
, "data") == 0))
3607 sname
= EVAX_DATA_NAME
;
3608 else if ((*sname
== 'b') && (strcmp (sname
, "bss") == 0))
3609 sname
= EVAX_BSS_NAME
;
3610 else if ((*sname
== 'l') && (strcmp (sname
, "link") == 0))
3611 sname
= EVAX_LINK_NAME
;
3612 else if ((*sname
== 'r') && (strcmp (sname
, "rdata") == 0))
3613 sname
= EVAX_READONLY_NAME
;
3614 else if ((*sname
== 'l') && (strcmp (sname
, "literal") == 0))
3615 sname
= EVAX_LITERAL_NAME
;
3616 else if ((*sname
== 'l') && (strcmp (sname
, "literals") == 0))
3617 sname
= EVAX_LITERALS_NAME
;
3618 else if ((*sname
== 'c') && (strcmp (sname
, "comm") == 0))
3619 sname
= EVAX_COMMON_NAME
;
3620 else if ((*sname
== 'l') && (strcmp (sname
, "lcomm") == 0))
3621 sname
= EVAX_LOCAL_NAME
;
3624 if (bfd_is_com_section (section
))
3625 new_flags
= (EGPS__V_OVR
| EGPS__V_REL
| EGPS__V_GBL
| EGPS__V_RD
3626 | EGPS__V_WRT
| EGPS__V_NOMOD
| EGPS__V_COM
);
3628 new_flags
= vms_esecflag_by_name (evax_section_flags
, sname
,
3631 /* Modify them as directed. */
3632 if (section
->flags
& SEC_READONLY
)
3633 new_flags
&= ~EGPS__V_WRT
;
3635 new_flags
&= ~vms_section_data (section
)->no_flags
;
3636 new_flags
|= vms_section_data (section
)->flags
;
3638 vms_debug2 ((3, "sec flags %x\n", section
->flags
));
3639 vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
3640 new_flags
, (unsigned long)section
->size
));
3642 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3643 _bfd_vms_output_short (recwr
, section
->alignment_power
& 0xff);
3644 _bfd_vms_output_short (recwr
, new_flags
);
3645 _bfd_vms_output_long (recwr
, (unsigned long) section
->size
);
3646 _bfd_vms_output_counted (recwr
, sname
);
3647 _bfd_vms_output_end_subrec (recwr
);
3649 /* If the section is an obsolute one, remind its index as it will be
3650 used later for absolute symbols. */
3651 if ((new_flags
& EGPS__V_REL
) == 0 && abs_section_index
< 0)
3652 abs_section_index
= section
->target_index
;
3655 /* Output symbols. */
3656 vms_debug2 ((3, "%d symbols found\n", abfd
->symcount
));
3658 bfd_set_start_address (abfd
, (bfd_vma
) -1);
3660 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3662 symbol
= abfd
->outsymbols
[symnum
];
3663 old_flags
= symbol
->flags
;
3665 /* Work-around a missing feature: consider __main as the main entry
3667 if (symbol
->name
[0] == '_' && strcmp (symbol
->name
, "__main") == 0)
3668 bfd_set_start_address (abfd
, (bfd_vma
)symbol
->value
);
3670 /* Only put in the GSD the global and the undefined symbols. */
3671 if (old_flags
& BSF_FILE
)
3674 if ((old_flags
& BSF_GLOBAL
) == 0 && !bfd_is_und_section (symbol
->section
))
3676 /* If the LIB$INITIIALIZE section is present, add a reference to
3677 LIB$INITIALIZE symbol. FIXME: this should be done explicitely
3678 in the assembly file. */
3679 if (!((old_flags
& BSF_SECTION_SYM
) != 0
3680 && strcmp (symbol
->section
->name
, "LIB$INITIALIZE") == 0))
3684 /* 13 bytes egsd, max 64 chars name -> should be 77 bytes. Add 16 more
3685 bytes for a possible ABS section. */
3686 if (_bfd_vms_output_check (recwr
, 80 + 16) < 0)
3688 if (!_bfd_vms_output_end (abfd
, recwr
))
3690 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3691 _bfd_vms_output_long (recwr
, 0);
3694 if ((old_flags
& BSF_GLOBAL
) != 0
3695 && bfd_is_abs_section (symbol
->section
)
3696 && abs_section_index
<= 0)
3698 /* Create an absolute section if none was defined. It is highly
3699 unlikely that the name $ABS$ clashes with a user defined
3700 non-absolute section name. */
3701 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3702 _bfd_vms_output_short (recwr
, 4);
3703 _bfd_vms_output_short (recwr
, EGPS__V_SHR
);
3704 _bfd_vms_output_long (recwr
, 0);
3705 _bfd_vms_output_counted (recwr
, "$ABS$");
3706 _bfd_vms_output_end_subrec (recwr
);
3708 abs_section_index
= target_index
++;
3711 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_SYM
);
3713 /* Data type, alignment. */
3714 _bfd_vms_output_short (recwr
, 0);
3718 if (old_flags
& BSF_WEAK
)
3719 new_flags
|= EGSY__V_WEAK
;
3720 if (bfd_is_com_section (symbol
->section
)) /* .comm */
3721 new_flags
|= (EGSY__V_WEAK
| EGSY__V_COMM
);
3723 if (old_flags
& BSF_FUNCTION
)
3725 new_flags
|= EGSY__V_NORM
;
3726 new_flags
|= EGSY__V_REL
;
3728 if (old_flags
& BSF_GLOBAL
)
3730 new_flags
|= EGSY__V_DEF
;
3731 if (!bfd_is_abs_section (symbol
->section
))
3732 new_flags
|= EGSY__V_REL
;
3734 _bfd_vms_output_short (recwr
, new_flags
);
3736 if (old_flags
& BSF_GLOBAL
)
3738 /* Symbol definition. */
3739 bfd_vma code_address
= 0;
3740 unsigned long ca_psindx
= 0;
3741 unsigned long psindx
;
3743 if ((old_flags
& BSF_FUNCTION
) && symbol
->udata
.p
!= NULL
)
3748 ((struct evax_private_udata_struct
*)symbol
->udata
.p
)->enbsym
;
3749 code_address
= sym
->value
;
3750 ca_psindx
= sym
->section
->target_index
;
3752 if (bfd_is_abs_section (symbol
->section
))
3753 psindx
= abs_section_index
;
3755 psindx
= symbol
->section
->target_index
;
3757 _bfd_vms_output_quad (recwr
, symbol
->value
);
3758 _bfd_vms_output_quad (recwr
, code_address
);
3759 _bfd_vms_output_long (recwr
, ca_psindx
);
3760 _bfd_vms_output_long (recwr
, psindx
);
3762 _bfd_vms_output_counted (recwr
, symbol
->name
);
3764 _bfd_vms_output_end_subrec (recwr
);
3767 _bfd_vms_output_alignment (recwr
, 8);
3768 return _bfd_vms_output_end (abfd
, recwr
);
3771 /* Write object header for bfd abfd. Return FALSE on error. */
3774 _bfd_vms_write_ehdr (bfd
*abfd
)
3777 unsigned int symnum
;
3778 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3780 vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd
));
3782 _bfd_vms_output_alignment (recwr
, 2);
3784 if (!_bfd_vms_write_emh (abfd
)
3785 || !_bfd_vms_write_lmn (abfd
, "GNU AS"))
3789 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3790 _bfd_vms_output_short (recwr
, EMH__C_SRC
);
3792 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3794 symbol
= abfd
->outsymbols
[symnum
];
3796 if (symbol
->flags
& BSF_FILE
)
3798 _bfd_vms_output_dump (recwr
, (unsigned char *) symbol
->name
,
3799 (int) strlen (symbol
->name
));
3804 if (symnum
== abfd
->symcount
)
3805 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("noname"));
3807 if (!_bfd_vms_output_end (abfd
, recwr
))
3811 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3812 _bfd_vms_output_short (recwr
, EMH__C_TTL
);
3813 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("TTL"));
3814 if (!_bfd_vms_output_end (abfd
, recwr
))
3818 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3819 _bfd_vms_output_short (recwr
, EMH__C_CPR
);
3820 _bfd_vms_output_dump (recwr
,
3821 (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
3823 return _bfd_vms_output_end (abfd
, recwr
);
3826 /* Part 4.6, relocations. */
3829 /* WRITE ETIR SECTION
3831 This is still under construction and therefore not documented. */
3833 /* Close the etir/etbt record. */
3836 end_etir_record (bfd
* abfd
)
3838 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3840 return _bfd_vms_output_end (abfd
, recwr
);
3844 start_etir_or_etbt_record (bfd
*abfd
, asection
*section
, bfd_vma offset
)
3846 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3848 if (section
->flags
& SEC_DEBUGGING
)
3850 _bfd_vms_output_begin (recwr
, EOBJ__C_ETBT
);
3854 /* Push start offset. */
3855 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
3856 _bfd_vms_output_long (recwr
, (unsigned long) 0);
3857 _bfd_vms_output_end_subrec (recwr
);
3860 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_DFLOC
);
3861 _bfd_vms_output_end_subrec (recwr
);
3866 _bfd_vms_output_begin (recwr
, EOBJ__C_ETIR
);
3870 /* Push start offset. */
3871 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
3872 _bfd_vms_output_long (recwr
, (unsigned long) section
->target_index
);
3873 _bfd_vms_output_quad (recwr
, offset
);
3874 _bfd_vms_output_end_subrec (recwr
);
3876 /* Start = pop (). */
3877 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_SETRB
);
3878 _bfd_vms_output_end_subrec (recwr
);
3883 /* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
3884 address VADDR in section specified by SEC_INDEX and NAME. */
3887 sto_imm (bfd
*abfd
, asection
*section
,
3888 bfd_size_type ssize
, unsigned char *cptr
, bfd_vma vaddr
)
3891 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3894 _bfd_vms_debug (8, "sto_imm %d bytes\n", (int) ssize
);
3895 _bfd_hexdump (9, cptr
, (int) ssize
, (int) vaddr
);
3900 /* Try all the rest. */
3903 if (_bfd_vms_output_check (recwr
, size
) < 0)
3905 /* Doesn't fit, split ! */
3906 if (!end_etir_record (abfd
))
3909 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3911 size
= _bfd_vms_output_check (recwr
, 0); /* get max size */
3912 if (size
> ssize
) /* more than what's left ? */
3916 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_IMM
);
3917 _bfd_vms_output_long (recwr
, (unsigned long) (size
));
3918 _bfd_vms_output_dump (recwr
, cptr
, size
);
3919 _bfd_vms_output_end_subrec (recwr
);
3922 _bfd_vms_debug (10, "dumped %d bytes\n", (int) size
);
3923 _bfd_hexdump (10, cptr
, (int) size
, (int) vaddr
);
3934 etir_output_check (bfd
*abfd
, asection
*section
, bfd_vma vaddr
, int checklen
)
3936 if (_bfd_vms_output_check (&PRIV (recwr
), checklen
) < 0)
3938 /* Not enough room in this record. Close it and open a new one. */
3939 if (!end_etir_record (abfd
))
3941 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3946 /* Return whether RELOC must be deferred till the end. */
3949 defer_reloc_p (arelent
*reloc
)
3951 switch (reloc
->howto
->type
)
3964 /* Write section contents for bfd abfd. Return FALSE on error. */
3967 _bfd_vms_write_etir (bfd
* abfd
, int objtype ATTRIBUTE_UNUSED
)
3970 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3972 vms_debug2 ((2, "vms_write_tir (%p, %d)\n", abfd
, objtype
));
3974 _bfd_vms_output_alignment (recwr
, 4);
3976 PRIV (vms_linkage_index
) = 0;
3978 for (section
= abfd
->sections
; section
; section
= section
->next
)
3980 vms_debug2 ((4, "writing %d. section '%s' (%d bytes)\n",
3981 section
->target_index
, section
->name
, (int) (section
->size
)));
3983 if (!(section
->flags
& SEC_HAS_CONTENTS
)
3984 || bfd_is_com_section (section
))
3987 if (!section
->contents
)
3989 bfd_set_error (bfd_error_no_contents
);
3993 start_etir_or_etbt_record (abfd
, section
, 0);
3995 if (section
->flags
& SEC_RELOC
)
3997 bfd_vma curr_addr
= 0;
3998 unsigned char *curr_data
= section
->contents
;
4000 int pass2_needed
= 0;
4001 int pass2_in_progress
= 0;
4004 if (section
->reloc_count
== 0)
4006 (_("SEC_RELOC with no relocs in section %pA"), section
);
4011 int i
= section
->reloc_count
;
4012 arelent
**rptr
= section
->orelocation
;
4013 _bfd_vms_debug (4, "%d relocations:\n", i
);
4016 _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, "
4017 "addr %08lx, off %08lx, len %d: %s\n",
4018 (*(*rptr
)->sym_ptr_ptr
)->name
,
4019 (*(*rptr
)->sym_ptr_ptr
)->section
->name
,
4020 (long) (*(*rptr
)->sym_ptr_ptr
)->value
,
4021 (unsigned long)(*rptr
)->address
,
4022 (unsigned long)(*rptr
)->addend
,
4023 bfd_get_reloc_size ((*rptr
)->howto
),
4024 ( *rptr
)->howto
->name
);
4031 for (irel
= 0; irel
< section
->reloc_count
; irel
++)
4033 struct evax_private_udata_struct
*udata
;
4034 arelent
*rptr
= section
->orelocation
[irel
];
4035 bfd_vma addr
= rptr
->address
;
4036 asymbol
*sym
= *rptr
->sym_ptr_ptr
;
4037 asection
*sec
= sym
->section
;
4038 bool defer
= defer_reloc_p (rptr
);
4041 if (pass2_in_progress
)
4043 /* Non-deferred relocs have already been output. */
4049 /* Deferred relocs must be output at the very end. */
4056 /* Regular relocs are intertwined with binary data. */
4057 if (curr_addr
> addr
)
4058 _bfd_error_handler (_("size error in section %pA"),
4060 size
= addr
- curr_addr
;
4061 if (!sto_imm (abfd
, section
, size
, curr_data
, curr_addr
))
4067 size
= bfd_get_reloc_size (rptr
->howto
);
4069 switch (rptr
->howto
->type
)
4071 case ALPHA_R_IGNORE
:
4074 case ALPHA_R_REFLONG
:
4075 if (bfd_is_und_section (sym
->section
))
4077 bfd_vma addend
= rptr
->addend
;
4078 slen
= strlen ((char *) sym
->name
);
4079 if (!etir_output_check (abfd
, section
, curr_addr
, slen
))
4083 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
4084 _bfd_vms_output_counted (recwr
, sym
->name
);
4085 _bfd_vms_output_end_subrec (recwr
);
4086 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
4087 _bfd_vms_output_long (recwr
, (unsigned long) addend
);
4088 _bfd_vms_output_end_subrec (recwr
);
4089 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
4090 _bfd_vms_output_end_subrec (recwr
);
4091 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4092 _bfd_vms_output_end_subrec (recwr
);
4096 _bfd_vms_output_begin_subrec
4097 (recwr
, ETIR__C_STO_GBL_LW
);
4098 _bfd_vms_output_counted (recwr
, sym
->name
);
4099 _bfd_vms_output_end_subrec (recwr
);
4102 else if (bfd_is_abs_section (sym
->section
))
4104 if (!etir_output_check (abfd
, section
, curr_addr
, 16))
4106 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
4107 _bfd_vms_output_long (recwr
, (unsigned long) sym
->value
);
4108 _bfd_vms_output_end_subrec (recwr
);
4109 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4110 _bfd_vms_output_end_subrec (recwr
);
4114 if (!etir_output_check (abfd
, section
, curr_addr
, 32))
4116 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
4117 _bfd_vms_output_long (recwr
,
4118 (unsigned long) sec
->target_index
);
4119 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
4120 _bfd_vms_output_end_subrec (recwr
);
4121 /* ??? Table B-8 of the OpenVMS Linker Utilily Manual
4122 says that we should have a ETIR__C_STO_OFF here.
4123 But the relocation would not be BFD_RELOC_32 then.
4124 This case is very likely unreachable. */
4125 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4126 _bfd_vms_output_end_subrec (recwr
);
4130 case ALPHA_R_REFQUAD
:
4131 if (bfd_is_und_section (sym
->section
))
4133 bfd_vma addend
= rptr
->addend
;
4134 slen
= strlen ((char *) sym
->name
);
4135 if (!etir_output_check (abfd
, section
, curr_addr
, slen
))
4139 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
4140 _bfd_vms_output_counted (recwr
, sym
->name
);
4141 _bfd_vms_output_end_subrec (recwr
);
4142 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
4143 _bfd_vms_output_quad (recwr
, addend
);
4144 _bfd_vms_output_end_subrec (recwr
);
4145 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
4146 _bfd_vms_output_end_subrec (recwr
);
4147 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
4148 _bfd_vms_output_end_subrec (recwr
);
4152 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_GBL
);
4153 _bfd_vms_output_counted (recwr
, sym
->name
);
4154 _bfd_vms_output_end_subrec (recwr
);
4157 else if (bfd_is_abs_section (sym
->section
))
4159 if (!etir_output_check (abfd
, section
, curr_addr
, 16))
4161 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
4162 _bfd_vms_output_quad (recwr
, sym
->value
);
4163 _bfd_vms_output_end_subrec (recwr
);
4164 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
4165 _bfd_vms_output_end_subrec (recwr
);
4169 if (!etir_output_check (abfd
, section
, curr_addr
, 32))
4171 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
4172 _bfd_vms_output_long (recwr
,
4173 (unsigned long) sec
->target_index
);
4174 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
4175 _bfd_vms_output_end_subrec (recwr
);
4176 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_OFF
);
4177 _bfd_vms_output_end_subrec (recwr
);
4182 if (!sto_imm (abfd
, section
, size
, curr_data
, curr_addr
))
4186 case ALPHA_R_LINKAGE
:
4188 if (!etir_output_check (abfd
, section
, curr_addr
, 64))
4190 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LP_PSB
);
4191 _bfd_vms_output_long
4192 (recwr
, (unsigned long) rptr
->addend
);
4193 if (rptr
->addend
> PRIV (vms_linkage_index
))
4194 PRIV (vms_linkage_index
) = rptr
->addend
;
4195 _bfd_vms_output_counted (recwr
, sym
->name
);
4196 _bfd_vms_output_byte (recwr
, 0);
4197 _bfd_vms_output_end_subrec (recwr
);
4200 case ALPHA_R_CODEADDR
:
4201 slen
= strlen ((char *) sym
->name
);
4202 if (!etir_output_check (abfd
, section
, curr_addr
, slen
))
4204 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_CA
);
4205 _bfd_vms_output_counted (recwr
, sym
->name
);
4206 _bfd_vms_output_end_subrec (recwr
);
4211 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4212 if (!etir_output_check (abfd
, section
, curr_addr
,
4213 32 + 1 + strlen (udata
->origname
)))
4215 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_NOP_GBL
);
4216 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
4217 _bfd_vms_output_long
4218 (recwr
, (unsigned long) section
->target_index
);
4219 _bfd_vms_output_quad (recwr
, rptr
->address
);
4220 _bfd_vms_output_long (recwr
, (unsigned long) 0x47ff041f);
4221 _bfd_vms_output_long
4222 (recwr
, (unsigned long) section
->target_index
);
4223 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4224 _bfd_vms_output_counted (recwr
, udata
->origname
);
4225 _bfd_vms_output_end_subrec (recwr
);
4229 _bfd_error_handler (_("spurious ALPHA_R_BSR reloc"));
4234 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4235 if (!etir_output_check (abfd
, section
, curr_addr
,
4236 32 + 1 + strlen (udata
->origname
)))
4238 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LDA_GBL
);
4239 _bfd_vms_output_long
4240 (recwr
, (unsigned long) udata
->lkindex
+ 1);
4241 _bfd_vms_output_long
4242 (recwr
, (unsigned long) section
->target_index
);
4243 _bfd_vms_output_quad (recwr
, rptr
->address
);
4244 _bfd_vms_output_long (recwr
, (unsigned long) 0x237B0000);
4245 _bfd_vms_output_long
4246 (recwr
, (unsigned long) udata
->bsym
->section
->target_index
);
4247 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4248 _bfd_vms_output_counted (recwr
, udata
->origname
);
4249 _bfd_vms_output_end_subrec (recwr
);
4254 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4255 if (!etir_output_check (abfd
, section
, curr_addr
,
4256 32 + 1 + strlen (udata
->origname
)))
4258 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_BOH_GBL
);
4259 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
4260 _bfd_vms_output_long
4261 (recwr
, (unsigned long) section
->target_index
);
4262 _bfd_vms_output_quad (recwr
, rptr
->address
);
4263 _bfd_vms_output_long (recwr
, (unsigned long) 0xD3400000);
4264 _bfd_vms_output_long
4265 (recwr
, (unsigned long) section
->target_index
);
4266 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4267 _bfd_vms_output_counted (recwr
, udata
->origname
);
4268 _bfd_vms_output_end_subrec (recwr
);
4272 _bfd_error_handler (_("unhandled relocation %s"),
4279 } /* End of relocs loop. */
4281 if (!pass2_in_progress
)
4283 /* Output rest of section. */
4284 if (curr_addr
> section
->size
)
4286 _bfd_error_handler (_("size error in section %pA"), section
);
4289 size
= section
->size
- curr_addr
;
4290 if (!sto_imm (abfd
, section
, size
, curr_data
, curr_addr
))
4297 pass2_in_progress
= 1;
4303 else /* (section->flags & SEC_RELOC) */
4304 if (!sto_imm (abfd
, section
, section
->size
, section
->contents
, 0))
4307 if (!end_etir_record (abfd
))
4311 _bfd_vms_output_alignment (recwr
, 2);
4315 /* Write cached information into a file being written, at bfd_close. */
4318 alpha_vms_write_object_contents (bfd
*abfd
)
4320 vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd
));
4322 if (abfd
->flags
& (EXEC_P
| DYNAMIC
))
4324 return alpha_vms_write_exec (abfd
);
4328 if (abfd
->section_count
> 0) /* we have sections */
4330 if (!_bfd_vms_write_ehdr (abfd
))
4332 if (!_bfd_vms_write_egsd (abfd
))
4334 if (!_bfd_vms_write_etir (abfd
, EOBJ__C_ETIR
))
4336 if (!_bfd_vms_write_eeom (abfd
))
4343 /* Debug stuff: nearest line. */
4345 #define SET_MODULE_PARSED(m) \
4346 do { if ((m)->name == NULL) (m)->name = ""; } while (0)
4347 #define IS_MODULE_PARSED(m) ((m)->name != NULL)
4349 /* Build a new module for the specified BFD. */
4351 static struct module
*
4352 new_module (bfd
*abfd
)
4354 struct module
*module
4355 = (struct module
*) bfd_zalloc (abfd
, sizeof (struct module
));
4356 module
->file_table_count
= 16; /* Arbitrary. */
4358 = bfd_zmalloc (module
->file_table_count
* sizeof (struct fileinfo
));
4362 /* Parse debug info for a module and internalize it. */
4365 parse_module (bfd
*abfd
, struct module
*module
, unsigned char *ptr
,
4366 bfd_size_type length
)
4368 unsigned char *maxptr
= ptr
+ length
;
4369 unsigned char *src_ptr
, *pcl_ptr
;
4370 unsigned int prev_linum
= 0, curr_linenum
= 0;
4371 bfd_vma prev_pc
= 0, curr_pc
= 0;
4372 struct srecinfo
*curr_srec
, *srec
;
4373 struct lineinfo
*curr_line
, *line
;
4374 struct funcinfo
*funcinfo
;
4376 /* Initialize tables with zero element. */
4377 curr_srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4380 module
->srec_table
= curr_srec
;
4382 curr_line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4385 module
->line_table
= curr_line
;
4387 while (ptr
+ 3 < maxptr
)
4389 /* The first byte is not counted in the recorded length. */
4390 int rec_length
= bfd_getl16 (ptr
) + 1;
4391 int rec_type
= bfd_getl16 (ptr
+ 2);
4393 vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length
, rec_type
));
4395 if (rec_length
> maxptr
- ptr
)
4397 if (rec_type
== DST__K_MODEND
)
4403 if (rec_length
<= DST_S_B_MODBEG_NAME
)
4406 = _bfd_vms_save_counted_string (abfd
, ptr
+ DST_S_B_MODBEG_NAME
,
4407 rec_length
- DST_S_B_MODBEG_NAME
);
4414 vms_debug2 ((3, "module: %s\n", module
->name
));
4421 if (rec_length
<= DST_S_B_RTNBEG_NAME
)
4423 funcinfo
= (struct funcinfo
*)
4424 bfd_zalloc (abfd
, sizeof (struct funcinfo
));
4428 = _bfd_vms_save_counted_string (abfd
, ptr
+ DST_S_B_RTNBEG_NAME
,
4429 rec_length
- DST_S_B_RTNBEG_NAME
);
4430 funcinfo
->low
= bfd_getl32 (ptr
+ DST_S_L_RTNBEG_ADDRESS
);
4431 funcinfo
->next
= module
->func_table
;
4432 module
->func_table
= funcinfo
;
4434 vms_debug2 ((3, "routine: %s at 0x%lx\n",
4435 funcinfo
->name
, (unsigned long) funcinfo
->low
));
4439 if (rec_length
< DST_S_L_RTNEND_SIZE
+ 4)
4441 if (!module
->func_table
)
4443 module
->func_table
->high
= module
->func_table
->low
4444 + bfd_getl32 (ptr
+ DST_S_L_RTNEND_SIZE
) - 1;
4446 if (module
->func_table
->high
> module
->high
)
4447 module
->high
= module
->func_table
->high
;
4449 vms_debug2 ((3, "end routine\n"));
4453 vms_debug2 ((3, "prologue\n"));
4457 vms_debug2 ((3, "epilog\n"));
4461 vms_debug2 ((3, "block\n"));
4465 vms_debug2 ((3, "end block\n"));
4469 src_ptr
= ptr
+ DST_S_C_SOURCE_HEADER_SIZE
;
4471 vms_debug2 ((3, "source info\n"));
4473 while (src_ptr
- ptr
< rec_length
)
4475 int cmd
= src_ptr
[0], cmd_length
, data
;
4479 case DST__K_SRC_DECLFILE
:
4480 if (src_ptr
- ptr
+ DST_S_B_SRC_DF_LENGTH
>= rec_length
)
4481 cmd_length
= 0x10000;
4483 cmd_length
= src_ptr
[DST_S_B_SRC_DF_LENGTH
] + 2;
4486 case DST__K_SRC_DEFLINES_B
:
4490 case DST__K_SRC_DEFLINES_W
:
4494 case DST__K_SRC_INCRLNUM_B
:
4498 case DST__K_SRC_SETFILE
:
4502 case DST__K_SRC_SETLNUM_L
:
4506 case DST__K_SRC_SETLNUM_W
:
4510 case DST__K_SRC_SETREC_L
:
4514 case DST__K_SRC_SETREC_W
:
4518 case DST__K_SRC_FORMFEED
:
4527 if (src_ptr
- ptr
+ cmd_length
> rec_length
)
4532 case DST__K_SRC_DECLFILE
:
4535 = bfd_getl16 (src_ptr
+ DST_S_W_SRC_DF_FILEID
);
4536 char *filename
= _bfd_vms_save_counted_string
4538 src_ptr
+ DST_S_B_SRC_DF_FILENAME
,
4539 ptr
+ rec_length
- (src_ptr
+ DST_S_B_SRC_DF_FILENAME
));
4541 if (fileid
>= module
->file_table_count
)
4543 unsigned int old_count
= module
->file_table_count
;
4544 module
->file_table_count
+= fileid
;
4546 = bfd_realloc_or_free (module
->file_table
,
4547 module
->file_table_count
4548 * sizeof (struct fileinfo
));
4549 if (module
->file_table
== NULL
)
4551 memset (module
->file_table
+ old_count
, 0,
4552 fileid
* sizeof (struct fileinfo
));
4555 module
->file_table
[fileid
].name
= filename
;
4556 module
->file_table
[fileid
].srec
= 1;
4557 vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4558 fileid
, module
->file_table
[fileid
].name
));
4562 case DST__K_SRC_DEFLINES_B
:
4563 /* Perform the association and set the next higher index
4565 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4566 srec
= (struct srecinfo
*)
4567 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4568 srec
->line
= curr_srec
->line
+ data
;
4569 srec
->srec
= curr_srec
->srec
+ data
;
4570 srec
->sfile
= curr_srec
->sfile
;
4571 curr_srec
->next
= srec
;
4573 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data
));
4576 case DST__K_SRC_DEFLINES_W
:
4577 /* Perform the association and set the next higher index
4579 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4580 srec
= (struct srecinfo
*)
4581 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4582 srec
->line
= curr_srec
->line
+ data
;
4583 srec
->srec
= curr_srec
->srec
+ data
,
4584 srec
->sfile
= curr_srec
->sfile
;
4585 curr_srec
->next
= srec
;
4587 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data
));
4590 case DST__K_SRC_INCRLNUM_B
:
4591 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4592 curr_srec
->line
+= data
;
4593 vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data
));
4596 case DST__K_SRC_SETFILE
:
4597 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4598 if ((unsigned int) data
< module
->file_table_count
)
4600 curr_srec
->sfile
= data
;
4601 curr_srec
->srec
= module
->file_table
[data
].srec
;
4603 vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data
));
4606 case DST__K_SRC_SETLNUM_L
:
4607 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4608 curr_srec
->line
= data
;
4609 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data
));
4612 case DST__K_SRC_SETLNUM_W
:
4613 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4614 curr_srec
->line
= data
;
4615 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data
));
4618 case DST__K_SRC_SETREC_L
:
4619 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4620 curr_srec
->srec
= data
;
4621 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4622 vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data
));
4625 case DST__K_SRC_SETREC_W
:
4626 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4627 curr_srec
->srec
= data
;
4628 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4629 vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data
));
4632 case DST__K_SRC_FORMFEED
:
4633 vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4637 _bfd_error_handler (_("unknown source command %d"),
4642 src_ptr
+= cmd_length
;
4646 case DST__K_LINE_NUM
:
4647 pcl_ptr
= ptr
+ DST_S_C_LINE_NUM_HEADER_SIZE
;
4649 vms_debug2 ((3, "line info\n"));
4651 while (pcl_ptr
- ptr
< rec_length
)
4653 /* The command byte is signed so we must sign-extend it. */
4654 int cmd
= ((signed char *)pcl_ptr
)[0], cmd_length
, data
;
4658 case DST__K_DELTA_PC_W
:
4662 case DST__K_DELTA_PC_L
:
4666 case DST__K_INCR_LINUM
:
4670 case DST__K_INCR_LINUM_W
:
4674 case DST__K_INCR_LINUM_L
:
4678 case DST__K_SET_LINUM_INCR
:
4682 case DST__K_SET_LINUM_INCR_W
:
4686 case DST__K_RESET_LINUM_INCR
:
4690 case DST__K_BEG_STMT_MODE
:
4694 case DST__K_END_STMT_MODE
:
4698 case DST__K_SET_LINUM_B
:
4702 case DST__K_SET_LINUM
:
4706 case DST__K_SET_LINUM_L
:
4714 case DST__K_SET_PC_W
:
4718 case DST__K_SET_PC_L
:
4722 case DST__K_SET_STMTNUM
:
4738 case DST__K_SET_ABS_PC
:
4750 if (pcl_ptr
- ptr
+ cmd_length
> rec_length
)
4755 case DST__K_DELTA_PC_W
:
4756 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4759 vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data
));
4762 case DST__K_DELTA_PC_L
:
4763 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4766 vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data
));
4769 case DST__K_INCR_LINUM
:
4770 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4771 curr_linenum
+= data
;
4772 vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data
));
4775 case DST__K_INCR_LINUM_W
:
4776 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4777 curr_linenum
+= data
;
4778 vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data
));
4781 case DST__K_INCR_LINUM_L
:
4782 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4783 curr_linenum
+= data
;
4784 vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data
));
4787 case DST__K_SET_LINUM_INCR
:
4789 (_("%s not implemented"), "DST__K_SET_LINUM_INCR");
4792 case DST__K_SET_LINUM_INCR_W
:
4794 (_("%s not implemented"), "DST__K_SET_LINUM_INCR_W");
4797 case DST__K_RESET_LINUM_INCR
:
4799 (_("%s not implemented"), "DST__K_RESET_LINUM_INCR");
4802 case DST__K_BEG_STMT_MODE
:
4804 (_("%s not implemented"), "DST__K_BEG_STMT_MODE");
4807 case DST__K_END_STMT_MODE
:
4809 (_("%s not implemented"), "DST__K_END_STMT_MODE");
4812 case DST__K_SET_LINUM_B
:
4813 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4814 curr_linenum
= data
;
4815 vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data
));
4818 case DST__K_SET_LINUM
:
4819 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4820 curr_linenum
= data
;
4821 vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data
));
4824 case DST__K_SET_LINUM_L
:
4825 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4826 curr_linenum
= data
;
4827 vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data
));
4832 (_("%s not implemented"), "DST__K_SET_PC");
4835 case DST__K_SET_PC_W
:
4837 (_("%s not implemented"), "DST__K_SET_PC_W");
4840 case DST__K_SET_PC_L
:
4842 (_("%s not implemented"), "DST__K_SET_PC_L");
4845 case DST__K_SET_STMTNUM
:
4847 (_("%s not implemented"), "DST__K_SET_STMTNUM");
4851 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4853 vms_debug2 ((4, "DST__K_TERM: %d\n", data
));
4857 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4859 vms_debug2 ((4, "DST__K_TERM_W: %d\n", data
));
4863 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4865 vms_debug2 ((4, "DST__K_TERM_L: %d\n", data
));
4868 case DST__K_SET_ABS_PC
:
4869 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4871 vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data
));
4879 vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4880 (unsigned long)curr_pc
, curr_linenum
));
4883 _bfd_error_handler (_("unknown line command %d"), cmd
);
4887 if ((curr_linenum
!= prev_linum
&& curr_pc
!= prev_pc
)
4889 || cmd
== DST__K_DELTA_PC_L
4890 || cmd
== DST__K_DELTA_PC_W
)
4892 line
= (struct lineinfo
*)
4893 bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4894 line
->address
= curr_pc
;
4895 line
->line
= curr_linenum
;
4897 curr_line
->next
= line
;
4900 prev_linum
= curr_linenum
;
4902 vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4903 (unsigned long)curr_pc
, curr_linenum
));
4906 pcl_ptr
+= cmd_length
;
4910 case 0x17: /* Undocumented type used by DEC C to declare equates. */
4911 vms_debug2 ((3, "undocumented type 0x17\n"));
4915 vms_debug2 ((3, "ignoring record\n"));
4923 /* Finalize tables with EOL marker. */
4924 srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4925 srec
->line
= (unsigned int) -1;
4926 srec
->srec
= (unsigned int) -1;
4927 curr_srec
->next
= srec
;
4929 line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4930 line
->line
= (unsigned int) -1;
4931 line
->address
= (bfd_vma
) -1;
4932 curr_line
->next
= line
;
4934 /* Advertise that this module has been parsed. This is needed
4935 because parsing can be either performed at module creation
4936 or deferred until debug info is consumed. */
4937 SET_MODULE_PARSED (module
);
4941 /* Build the list of modules for the specified BFD. */
4943 static struct module
*
4944 build_module_list (bfd
*abfd
)
4946 struct module
*module
, *list
= NULL
;
4949 if ((dmt
= bfd_get_section_by_name (abfd
, "$DMT$")))
4951 /* We have a DMT section so this must be an image. Parse the
4952 section and build the list of modules. This is sufficient
4953 since we can compute the start address and the end address
4954 of every module from the section contents. */
4955 bfd_size_type size
= bfd_section_size (dmt
);
4956 unsigned char *buf
, *ptr
, *end
;
4958 if (! bfd_malloc_and_get_section (abfd
, dmt
, &buf
))
4961 vms_debug2 ((2, "DMT\n"));
4965 while (end
- ptr
>= DBG_S_C_DMT_HEADER_SIZE
)
4967 /* Each header declares a module with its start offset and size
4968 of debug info in the DST section, as well as the count of
4969 program sections (i.e. address spans) it contains. */
4970 unsigned int modbeg
= bfd_getl32 (ptr
+ DBG_S_L_DMT_MODBEG
);
4971 unsigned int msize
= bfd_getl32 (ptr
+ DBG_S_L_DST_SIZE
);
4972 int count
= bfd_getl16 (ptr
+ DBG_S_W_DMT_PSECT_COUNT
);
4973 ptr
+= DBG_S_C_DMT_HEADER_SIZE
;
4975 vms_debug2 ((3, "module: modbeg = %u, size = %u, count = %d\n",
4976 modbeg
, msize
, count
));
4978 /* We create a 'module' structure for each program section since
4979 we only support contiguous addresses in a 'module' structure.
4980 As a consequence, the actual debug info in the DST section is
4981 shared and can be parsed multiple times; that doesn't seem to
4982 cause problems in practice. */
4983 while (count
-- > 0 && end
- ptr
>= DBG_S_C_DMT_PSECT_SIZE
)
4985 unsigned int start
= bfd_getl32 (ptr
+ DBG_S_L_DMT_PSECT_START
);
4986 unsigned int length
= bfd_getl32 (ptr
+ DBG_S_L_DMT_PSECT_LENGTH
);
4987 module
= new_module (abfd
);
4988 module
->modbeg
= modbeg
;
4989 module
->size
= msize
;
4990 module
->low
= start
;
4991 module
->high
= start
+ length
;
4992 module
->next
= list
;
4994 ptr
+= DBG_S_C_DMT_PSECT_SIZE
;
4996 vms_debug2 ((4, "section: start = 0x%x, length = %u\n",
5004 /* We don't have a DMT section so this must be an object. Parse
5005 the module right now in order to compute its start address and
5007 void *dst
= PRIV (dst_section
)->contents
;
5012 module
= new_module (abfd
);
5013 if (!parse_module (abfd
, module
, PRIV (dst_section
)->contents
,
5014 PRIV (dst_section
)->size
))
5022 /* Calculate and return the name of the source file and the line nearest
5023 to the wanted location in the specified module. */
5026 module_find_nearest_line (bfd
*abfd
, struct module
*module
, bfd_vma addr
,
5027 const char **file
, const char **func
,
5030 struct funcinfo
*funcinfo
;
5031 struct lineinfo
*lineinfo
;
5032 struct srecinfo
*srecinfo
;
5035 /* Parse this module if that was not done at module creation. */
5036 if (! IS_MODULE_PARSED (module
))
5038 unsigned int size
= module
->size
;
5039 unsigned int modbeg
= PRIV (dst_section
)->filepos
+ module
->modbeg
;
5040 unsigned char *buffer
;
5042 if (bfd_seek (abfd
, modbeg
, SEEK_SET
) != 0
5043 || (buffer
= _bfd_malloc_and_read (abfd
, size
, size
)) == NULL
)
5045 bfd_set_error (bfd_error_no_debug_section
);
5049 ret
= parse_module (abfd
, module
, buffer
, size
);
5055 /* Find out the function (if any) that contains the address. */
5056 for (funcinfo
= module
->func_table
; funcinfo
; funcinfo
= funcinfo
->next
)
5057 if (addr
>= funcinfo
->low
&& addr
<= funcinfo
->high
)
5059 *func
= funcinfo
->name
;
5064 /* Find out the source file and the line nearest to the address. */
5065 for (lineinfo
= module
->line_table
; lineinfo
; lineinfo
= lineinfo
->next
)
5066 if (lineinfo
->next
&& addr
< lineinfo
->next
->address
)
5068 for (srecinfo
= module
->srec_table
; srecinfo
; srecinfo
= srecinfo
->next
)
5069 if (srecinfo
->next
&& lineinfo
->line
< srecinfo
->next
->line
)
5071 if (srecinfo
->sfile
> 0)
5073 *file
= module
->file_table
[srecinfo
->sfile
].name
;
5074 *line
= srecinfo
->srec
+ lineinfo
->line
- srecinfo
->line
;
5078 *file
= module
->name
;
5079 *line
= lineinfo
->line
;
5090 /* Provided a BFD, a section and an offset into the section, calculate and
5091 return the name of the source file and the line nearest to the wanted
5095 _bfd_vms_find_nearest_line (bfd
*abfd
,
5096 asymbol
**symbols ATTRIBUTE_UNUSED
,
5102 unsigned int *discriminator
)
5104 struct module
*module
;
5106 /* What address are we looking for? */
5107 bfd_vma addr
= section
->vma
+ offset
;
5115 /* We can't do anything if there is no DST (debug symbol table). */
5116 if (PRIV (dst_section
) == NULL
)
5119 /* Create the module list - if not already done. */
5120 if (PRIV (modules
) == NULL
)
5122 PRIV (modules
) = build_module_list (abfd
);
5123 if (PRIV (modules
) == NULL
)
5127 for (module
= PRIV (modules
); module
; module
= module
->next
)
5128 if (addr
>= module
->low
&& addr
<= module
->high
)
5129 return module_find_nearest_line (abfd
, module
, addr
, file
, func
, line
);
5134 /* Canonicalizations. */
5135 /* Set name, value, section and flags of SYM from E. */
5138 alpha_vms_convert_symbol (bfd
*abfd
, struct vms_symbol_entry
*e
, asymbol
*sym
)
5147 flags
= BSF_NO_FLAGS
;
5153 if (e
->flags
& EGSY__V_WEAK
)
5156 if (e
->flags
& EGSY__V_DEF
)
5158 /* Symbol definition. */
5159 flags
|= BSF_GLOBAL
;
5160 if (e
->flags
& EGSY__V_NORM
)
5161 flags
|= BSF_FUNCTION
;
5167 /* Symbol reference. */
5168 sec
= bfd_und_section_ptr
;
5173 /* A universal symbol is by definition global... */
5174 flags
|= BSF_GLOBAL
;
5176 /* ...and dynamic in shared libraries. */
5177 if (abfd
->flags
& DYNAMIC
)
5178 flags
|= BSF_DYNAMIC
;
5180 if (e
->flags
& EGSY__V_WEAK
)
5183 if (!(e
->flags
& EGSY__V_DEF
))
5186 if (e
->flags
& EGSY__V_NORM
)
5187 flags
|= BSF_FUNCTION
;
5190 /* sec = e->section; */
5191 sec
= bfd_abs_section_ptr
;
5206 /* Return the number of bytes required to store a vector of pointers
5207 to asymbols for all the symbols in the BFD abfd, including a
5208 terminal NULL pointer. If there are no symbols in the BFD,
5209 then return 0. If an error occurs, return -1. */
5212 alpha_vms_get_symtab_upper_bound (bfd
*abfd
)
5214 vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
5215 abfd
, PRIV (gsd_sym_count
)));
5217 return (PRIV (gsd_sym_count
) + 1) * sizeof (asymbol
*);
5220 /* Read the symbols from the BFD abfd, and fills in the vector
5221 location with pointers to the symbols and a trailing NULL.
5223 Return number of symbols read. */
5226 alpha_vms_canonicalize_symtab (bfd
*abfd
, asymbol
**symbols
)
5230 vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd
));
5232 if (PRIV (csymbols
) == NULL
)
5234 PRIV (csymbols
) = (asymbol
**) bfd_alloc
5235 (abfd
, PRIV (gsd_sym_count
) * sizeof (asymbol
*));
5237 /* Traverse table and fill symbols vector. */
5238 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5240 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
5243 sym
= bfd_make_empty_symbol (abfd
);
5244 if (sym
== NULL
|| !alpha_vms_convert_symbol (abfd
, e
, sym
))
5246 bfd_release (abfd
, PRIV (csymbols
));
5247 PRIV (csymbols
) = NULL
;
5251 PRIV (csymbols
)[i
] = sym
;
5255 if (symbols
!= NULL
)
5257 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5258 symbols
[i
] = PRIV (csymbols
)[i
];
5262 return PRIV (gsd_sym_count
);
5265 /* Read and convert relocations from ETIR. We do it once for all sections. */
5268 alpha_vms_slurp_relocs (bfd
*abfd
)
5272 vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
5274 /* We slurp relocs only once, for all sections. */
5275 if (PRIV (reloc_done
) != 0)
5276 return PRIV (reloc_done
) == 1;
5278 if (alpha_vms_canonicalize_symtab (abfd
, NULL
) < 0)
5281 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
5286 unsigned char *begin
;
5289 bfd_reloc_code_real_type reloc_code
;
5295 bfd_vma cur_address
;
5297 unsigned char *cur_sym
= NULL
;
5299 bfd_vma cur_addend
= 0;
5301 /* Skip non-ETIR records. */
5302 type
= _bfd_vms_get_object_record (abfd
);
5305 if (type
== EOBJ__C_EEOM
)
5307 if (type
!= EOBJ__C_ETIR
)
5310 begin
= PRIV (recrd
.rec
) + 4;
5311 end
= PRIV (recrd
.rec
) + PRIV (recrd
.rec_size
);
5313 for (ptr
= begin
; ptr
+ 4 <= end
; ptr
+= length
)
5317 cmd
= bfd_getl16 (ptr
);
5318 length
= bfd_getl16 (ptr
+ 2);
5319 if (length
< 4 || length
> end
- ptr
)
5322 _bfd_error_handler (_("corrupt reloc record"));
5326 cur_address
= vaddr
;
5328 vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
5329 _bfd_vms_etir_name (cmd
)));
5333 case ETIR__C_STA_GBL
: /* ALPHA_R_REFLONG und_section, step 1 */
5334 /* ALPHA_R_REFQUAD und_section, step 1 */
5339 case ETIR__C_STA_PQ
: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
5342 cur_psidx
= bfd_getl32 (ptr
+ 4);
5343 cur_addend
= bfd_getl64 (ptr
+ 8);
5347 case ETIR__C_CTL_SETRB
:
5348 if (prev_cmd
!= ETIR__C_STA_PQ
)
5351 /* xgettext:c-format */
5352 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd
),
5353 _bfd_vms_etir_name (cmd
));
5356 cur_psect
= cur_psidx
;
5362 case ETIR__C_STA_LW
: /* ALPHA_R_REFLONG abs_section, step 1 */
5363 /* ALPHA_R_REFLONG und_section, step 2 */
5366 if (prev_cmd
!= ETIR__C_STA_GBL
)
5369 /* xgettext:c-format */
5370 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
5371 _bfd_vms_etir_name (ETIR__C_STA_LW
));
5377 cur_addend
= bfd_getl32 (ptr
+ 4);
5381 case ETIR__C_STA_QW
: /* ALPHA_R_REFQUAD abs_section, step 1 */
5382 /* ALPHA_R_REFQUAD und_section, step 2 */
5383 if (prev_cmd
!= -1 && prev_cmd
!= ETIR__C_STA_GBL
)
5386 /* xgettext:c-format */
5387 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
5388 _bfd_vms_etir_name (ETIR__C_STA_QW
));
5393 cur_addend
= bfd_getl64 (ptr
+ 4);
5397 case ETIR__C_STO_LW
: /* ALPHA_R_REFLONG und_section, step 4 */
5398 /* ALPHA_R_REFLONG abs_section, step 2 */
5399 /* ALPHA_R_REFLONG others, step 2 */
5400 if (prev_cmd
!= ETIR__C_OPR_ADD
5401 && prev_cmd
!= ETIR__C_STA_LW
5402 && prev_cmd
!= ETIR__C_STA_PQ
)
5404 /* xgettext:c-format */
5405 _bfd_error_handler (_("unknown reloc %s + %s"),
5406 _bfd_vms_etir_name (prev_cmd
),
5407 _bfd_vms_etir_name (ETIR__C_STO_LW
));
5410 reloc_code
= BFD_RELOC_32
;
5413 case ETIR__C_STO_QW
: /* ALPHA_R_REFQUAD und_section, step 4 */
5414 /* ALPHA_R_REFQUAD abs_section, step 2 */
5415 if (prev_cmd
!= ETIR__C_OPR_ADD
&& prev_cmd
!= ETIR__C_STA_QW
)
5417 /* xgettext:c-format */
5418 _bfd_error_handler (_("unknown reloc %s + %s"),
5419 _bfd_vms_etir_name (prev_cmd
),
5420 _bfd_vms_etir_name (ETIR__C_STO_QW
));
5423 reloc_code
= BFD_RELOC_64
;
5426 case ETIR__C_STO_OFF
: /* ALPHA_R_REFQUAD others, step 2 */
5427 if (prev_cmd
!= ETIR__C_STA_PQ
)
5429 /* xgettext:c-format */
5430 _bfd_error_handler (_("unknown reloc %s + %s"),
5431 _bfd_vms_etir_name (prev_cmd
),
5432 _bfd_vms_etir_name (ETIR__C_STO_OFF
));
5435 reloc_code
= BFD_RELOC_64
;
5438 case ETIR__C_OPR_ADD
: /* ALPHA_R_REFLONG und_section, step 3 */
5439 /* ALPHA_R_REFQUAD und_section, step 3 */
5440 if (prev_cmd
!= ETIR__C_STA_LW
&& prev_cmd
!= ETIR__C_STA_QW
)
5442 /* xgettext:c-format */
5443 _bfd_error_handler (_("unknown reloc %s + %s"),
5444 _bfd_vms_etir_name (prev_cmd
),
5445 _bfd_vms_etir_name (ETIR__C_OPR_ADD
));
5448 prev_cmd
= ETIR__C_OPR_ADD
;
5451 case ETIR__C_STO_CA
: /* ALPHA_R_CODEADDR */
5452 reloc_code
= BFD_RELOC_ALPHA_CODEADDR
;
5456 case ETIR__C_STO_GBL
: /* ALPHA_R_REFQUAD und_section */
5457 reloc_code
= BFD_RELOC_64
;
5461 case ETIR__C_STO_GBL_LW
: /* ALPHA_R_REFLONG und_section */
5462 reloc_code
= BFD_RELOC_32
;
5466 case ETIR__C_STC_LP_PSB
: /* ALPHA_R_LINKAGE */
5467 reloc_code
= BFD_RELOC_ALPHA_LINKAGE
;
5471 case ETIR__C_STC_NOP_GBL
: /* ALPHA_R_NOP */
5472 reloc_code
= BFD_RELOC_ALPHA_NOP
;
5475 case ETIR__C_STC_BSR_GBL
: /* ALPHA_R_BSR */
5476 reloc_code
= BFD_RELOC_ALPHA_BSR
;
5479 case ETIR__C_STC_LDA_GBL
: /* ALPHA_R_LDA */
5480 reloc_code
= BFD_RELOC_ALPHA_LDA
;
5483 case ETIR__C_STC_BOH_GBL
: /* ALPHA_R_BOH */
5484 reloc_code
= BFD_RELOC_ALPHA_BOH
;
5490 cur_sym
= ptr
+ 4 + 32;
5491 cur_address
= bfd_getl64 (ptr
+ 4 + 8);
5492 cur_addend
= bfd_getl64 (ptr
+ 4 + 24);
5495 case ETIR__C_STO_IMM
:
5498 vaddr
+= bfd_getl32 (ptr
+ 4);
5502 _bfd_error_handler (_("unknown reloc %s"),
5503 _bfd_vms_etir_name (cmd
));
5509 struct vms_section_data_struct
*vms_sec
;
5513 /* Get section to which the relocation applies. */
5514 if (cur_psect
< 0 || cur_psect
> (int)PRIV (section_count
))
5516 _bfd_error_handler (_("invalid section index in ETIR"));
5520 if (PRIV (sections
) == NULL
)
5522 sec
= PRIV (sections
)[cur_psect
];
5523 if (sec
== bfd_abs_section_ptr
)
5525 _bfd_error_handler (_("relocation for non-REL psect"));
5529 vms_sec
= vms_section_data (sec
);
5531 /* Allocate a reloc entry. */
5532 if (sec
->reloc_count
>= vms_sec
->reloc_max
)
5534 if (vms_sec
->reloc_max
== 0)
5536 vms_sec
->reloc_max
= 64;
5537 sec
->relocation
= bfd_zmalloc
5538 (vms_sec
->reloc_max
* sizeof (arelent
));
5542 vms_sec
->reloc_max
*= 2;
5543 sec
->relocation
= bfd_realloc_or_free
5544 (sec
->relocation
, vms_sec
->reloc_max
* sizeof (arelent
));
5545 if (sec
->relocation
== NULL
)
5549 reloc
= &sec
->relocation
[sec
->reloc_count
];
5552 reloc
->howto
= bfd_reloc_type_lookup (abfd
, reloc_code
);
5554 if (cur_sym
!= NULL
)
5560 /* Linear search. */
5561 if (end
- cur_sym
< 1)
5565 if (end
- cur_sym
< symlen
)
5569 for (j
= 0; j
< PRIV (gsd_sym_count
); j
++)
5570 if (PRIV (syms
)[j
]->namelen
== symlen
5571 && memcmp (PRIV (syms
)[j
]->name
, cur_sym
, symlen
) == 0)
5573 sym
= &PRIV (csymbols
)[j
];
5578 _bfd_error_handler (_("unknown symbol in command %s"),
5579 _bfd_vms_etir_name (cmd
));
5580 reloc
->sym_ptr_ptr
= NULL
;
5583 reloc
->sym_ptr_ptr
= sym
;
5585 else if (cur_psidx
>= 0)
5587 if (PRIV (sections
) == NULL
|| cur_psidx
>= (int) PRIV (section_count
))
5589 reloc
->sym_ptr_ptr
= &PRIV (sections
)[cur_psidx
]->symbol
;
5592 reloc
->sym_ptr_ptr
= NULL
;
5594 reloc
->address
= cur_address
;
5595 reloc
->addend
= cur_addend
;
5597 if (reloc_code
== ALPHA_R_LINKAGE
)
5600 size
= bfd_get_reloc_size (reloc
->howto
);
5610 vms_debug2 ((3, "alpha_vms_slurp_relocs: result = true\n"));
5611 PRIV (reloc_done
) = 1;
5615 PRIV (reloc_done
) = -1;
5619 /* Return the number of bytes required to store the relocation
5620 information associated with the given section. */
5623 alpha_vms_get_reloc_upper_bound (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*section
)
5625 if (!alpha_vms_slurp_relocs (abfd
))
5628 return (section
->reloc_count
+ 1L) * sizeof (arelent
*);
5631 /* Convert relocations from VMS (external) form into BFD internal
5632 form. Return the number of relocations. */
5635 alpha_vms_canonicalize_reloc (bfd
*abfd
, asection
*section
, arelent
**relptr
,
5636 asymbol
**symbols ATTRIBUTE_UNUSED
)
5641 if (!alpha_vms_slurp_relocs (abfd
))
5644 count
= section
->reloc_count
;
5645 tblptr
= section
->relocation
;
5648 *relptr
++ = tblptr
++;
5650 *relptr
= (arelent
*) NULL
;
5651 return section
->reloc_count
;
5654 /* Install a new set of internal relocs. */
5656 #define alpha_vms_set_reloc _bfd_generic_set_reloc
5659 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
5661 /* How to process the various reloc types. */
5663 static bfd_reloc_status_type
5664 reloc_nil (bfd
* abfd ATTRIBUTE_UNUSED
,
5665 arelent
*reloc ATTRIBUTE_UNUSED
,
5666 asymbol
*sym ATTRIBUTE_UNUSED
,
5667 void * data ATTRIBUTE_UNUSED
,
5668 asection
*sec ATTRIBUTE_UNUSED
,
5669 bfd
*output_bfd ATTRIBUTE_UNUSED
,
5670 char **error_message ATTRIBUTE_UNUSED
)
5673 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd
, output_bfd
);
5674 vms_debug (2, "In section %s, symbol %s\n",
5675 sec
->name
, sym
->name
);
5676 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5677 reloc
->sym_ptr_ptr
[0]->name
,
5678 (unsigned long)reloc
->address
,
5679 (unsigned long)reloc
->addend
, reloc
->howto
->name
);
5680 vms_debug (2, "data at %p\n", data
);
5681 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5684 return bfd_reloc_ok
;
5687 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5688 from smaller values. Start with zero, widen, *then* decrement. */
5689 #define MINUS_ONE (((bfd_vma)0) - 1)
5691 static reloc_howto_type alpha_howto_table
[] =
5693 HOWTO (ALPHA_R_IGNORE
, /* Type. */
5694 0, /* Rightshift. */
5697 true, /* PC relative. */
5699 complain_overflow_dont
,/* Complain_on_overflow. */
5700 reloc_nil
, /* Special_function. */
5701 "IGNORE", /* Name. */
5702 true, /* Partial_inplace. */
5703 0, /* Source mask */
5705 true), /* PC rel offset. */
5707 /* A 64 bit reference to a symbol. */
5708 HOWTO (ALPHA_R_REFQUAD
, /* Type. */
5709 0, /* Rightshift. */
5712 false, /* PC relative. */
5714 complain_overflow_bitfield
, /* Complain_on_overflow. */
5715 reloc_nil
, /* Special_function. */
5716 "REFQUAD", /* Name. */
5717 true, /* Partial_inplace. */
5718 MINUS_ONE
, /* Source mask. */
5719 MINUS_ONE
, /* Dest mask. */
5720 false), /* PC rel offset. */
5722 /* A 21 bit branch. The native assembler generates these for
5723 branches within the text segment, and also fills in the PC
5724 relative offset in the instruction. */
5725 HOWTO (ALPHA_R_BRADDR
, /* Type. */
5726 2, /* Rightshift. */
5729 true, /* PC relative. */
5731 complain_overflow_signed
, /* Complain_on_overflow. */
5732 reloc_nil
, /* Special_function. */
5733 "BRADDR", /* Name. */
5734 true, /* Partial_inplace. */
5735 0x1fffff, /* Source mask. */
5736 0x1fffff, /* Dest mask. */
5737 false), /* PC rel offset. */
5739 /* A hint for a jump to a register. */
5740 HOWTO (ALPHA_R_HINT
, /* Type. */
5741 2, /* Rightshift. */
5744 true, /* PC relative. */
5746 complain_overflow_dont
,/* Complain_on_overflow. */
5747 reloc_nil
, /* Special_function. */
5749 true, /* Partial_inplace. */
5750 0x3fff, /* Source mask. */
5751 0x3fff, /* Dest mask. */
5752 false), /* PC rel offset. */
5754 /* 16 bit PC relative offset. */
5755 HOWTO (ALPHA_R_SREL16
, /* Type. */
5756 0, /* Rightshift. */
5759 true, /* PC relative. */
5761 complain_overflow_signed
, /* Complain_on_overflow. */
5762 reloc_nil
, /* Special_function. */
5763 "SREL16", /* Name. */
5764 true, /* Partial_inplace. */
5765 0xffff, /* Source mask. */
5766 0xffff, /* Dest mask. */
5767 false), /* PC rel offset. */
5769 /* 32 bit PC relative offset. */
5770 HOWTO (ALPHA_R_SREL32
, /* Type. */
5771 0, /* Rightshift. */
5774 true, /* PC relative. */
5776 complain_overflow_signed
, /* Complain_on_overflow. */
5777 reloc_nil
, /* Special_function. */
5778 "SREL32", /* Name. */
5779 true, /* Partial_inplace. */
5780 0xffffffff, /* Source mask. */
5781 0xffffffff, /* Dest mask. */
5782 false), /* PC rel offset. */
5784 /* A 64 bit PC relative offset. */
5785 HOWTO (ALPHA_R_SREL64
, /* Type. */
5786 0, /* Rightshift. */
5789 true, /* PC relative. */
5791 complain_overflow_signed
, /* Complain_on_overflow. */
5792 reloc_nil
, /* Special_function. */
5793 "SREL64", /* Name. */
5794 true, /* Partial_inplace. */
5795 MINUS_ONE
, /* Source mask. */
5796 MINUS_ONE
, /* Dest mask. */
5797 false), /* PC rel offset. */
5799 /* Push a value on the reloc evaluation stack. */
5800 HOWTO (ALPHA_R_OP_PUSH
, /* Type. */
5801 0, /* Rightshift. */
5804 false, /* PC relative. */
5806 complain_overflow_dont
,/* Complain_on_overflow. */
5807 reloc_nil
, /* Special_function. */
5808 "OP_PUSH", /* Name. */
5809 false, /* Partial_inplace. */
5810 0, /* Source mask. */
5812 false), /* PC rel offset. */
5814 /* Store the value from the stack at the given address. Store it in
5815 a bitfield of size r_size starting at bit position r_offset. */
5816 HOWTO (ALPHA_R_OP_STORE
, /* Type. */
5817 0, /* Rightshift. */
5820 false, /* PC relative. */
5822 complain_overflow_dont
,/* Complain_on_overflow. */
5823 reloc_nil
, /* Special_function. */
5824 "OP_STORE", /* Name. */
5825 false, /* Partial_inplace. */
5826 0, /* Source mask. */
5827 MINUS_ONE
, /* Dest mask. */
5828 false), /* PC rel offset. */
5830 /* Subtract the reloc address from the value on the top of the
5831 relocation stack. */
5832 HOWTO (ALPHA_R_OP_PSUB
, /* Type. */
5833 0, /* Rightshift. */
5836 false, /* PC relative. */
5838 complain_overflow_dont
,/* Complain_on_overflow. */
5839 reloc_nil
, /* Special_function. */
5840 "OP_PSUB", /* Name. */
5841 false, /* Partial_inplace. */
5842 0, /* Source mask. */
5844 false), /* PC rel offset. */
5846 /* Shift the value on the top of the relocation stack right by the
5848 HOWTO (ALPHA_R_OP_PRSHIFT
, /* Type. */
5849 0, /* Rightshift. */
5852 false, /* PC relative. */
5854 complain_overflow_dont
,/* Complain_on_overflow. */
5855 reloc_nil
, /* Special_function. */
5856 "OP_PRSHIFT", /* Name. */
5857 false, /* Partial_inplace. */
5858 0, /* Source mask. */
5860 false), /* PC rel offset. */
5862 /* Hack. Linkage is done by linker. */
5863 HOWTO (ALPHA_R_LINKAGE
, /* Type. */
5864 0, /* Rightshift. */
5867 false, /* PC relative. */
5869 complain_overflow_dont
,/* Complain_on_overflow. */
5870 reloc_nil
, /* Special_function. */
5871 "LINKAGE", /* Name. */
5872 false, /* Partial_inplace. */
5873 0, /* Source mask. */
5875 false), /* PC rel offset. */
5877 /* A 32 bit reference to a symbol. */
5878 HOWTO (ALPHA_R_REFLONG
, /* Type. */
5879 0, /* Rightshift. */
5882 false, /* PC relative. */
5884 complain_overflow_bitfield
, /* Complain_on_overflow. */
5885 reloc_nil
, /* Special_function. */
5886 "REFLONG", /* Name. */
5887 true, /* Partial_inplace. */
5888 0xffffffff, /* Source mask. */
5889 0xffffffff, /* Dest mask. */
5890 false), /* PC rel offset. */
5892 /* A 64 bit reference to a procedure, written as 32 bit value. */
5893 HOWTO (ALPHA_R_CODEADDR
, /* Type. */
5894 0, /* Rightshift. */
5897 false, /* PC relative. */
5899 complain_overflow_signed
,/* Complain_on_overflow. */
5900 reloc_nil
, /* Special_function. */
5901 "CODEADDR", /* Name. */
5902 false, /* Partial_inplace. */
5903 0xffffffff, /* Source mask. */
5904 0xffffffff, /* Dest mask. */
5905 false), /* PC rel offset. */
5907 HOWTO (ALPHA_R_NOP
, /* Type. */
5908 0, /* Rightshift. */
5911 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5912 because the calculations for the 3 relocations are the same.
5913 See B.4.5.2 of the OpenVMS Linker Utility Manual. */
5914 true, /* PC relative. */
5916 complain_overflow_dont
,/* Complain_on_overflow. */
5917 reloc_nil
, /* Special_function. */
5919 false, /* Partial_inplace. */
5920 0xffffffff, /* Source mask. */
5921 0xffffffff, /* Dest mask. */
5922 false), /* PC rel offset. */
5924 HOWTO (ALPHA_R_BSR
, /* Type. */
5925 0, /* Rightshift. */
5928 true, /* PC relative. */
5930 complain_overflow_dont
,/* Complain_on_overflow. */
5931 reloc_nil
, /* Special_function. */
5933 false, /* Partial_inplace. */
5934 0xffffffff, /* Source mask. */
5935 0xffffffff, /* Dest mask. */
5936 false), /* PC rel offset. */
5938 HOWTO (ALPHA_R_LDA
, /* Type. */
5939 0, /* Rightshift. */
5942 false, /* PC relative. */
5944 complain_overflow_dont
,/* Complain_on_overflow. */
5945 reloc_nil
, /* Special_function. */
5947 false, /* Partial_inplace. */
5948 0xffffffff, /* Source mask. */
5949 0xffffffff, /* Dest mask. */
5950 false), /* PC rel offset. */
5952 HOWTO (ALPHA_R_BOH
, /* Type. */
5953 0, /* Rightshift. */
5956 true, /* PC relative. */
5958 complain_overflow_dont
,/* Complain_on_overflow. */
5959 reloc_nil
, /* Special_function. */
5961 false, /* Partial_inplace. */
5962 0xffffffff, /* Source mask. */
5963 0xffffffff, /* Dest mask. */
5964 false), /* PC rel offset. */
5967 /* Return a pointer to a howto structure which, when invoked, will perform
5968 the relocation code on data from the architecture noted. */
5970 static reloc_howto_type
*
5971 alpha_vms_bfd_reloc_type_lookup (bfd
* abfd ATTRIBUTE_UNUSED
,
5972 bfd_reloc_code_real_type code
)
5976 vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd
, code
));
5980 case BFD_RELOC_16
: alpha_type
= ALPHA_R_SREL16
; break;
5981 case BFD_RELOC_32
: alpha_type
= ALPHA_R_REFLONG
; break;
5982 case BFD_RELOC_64
: alpha_type
= ALPHA_R_REFQUAD
; break;
5983 case BFD_RELOC_CTOR
: alpha_type
= ALPHA_R_REFQUAD
; break;
5984 case BFD_RELOC_23_PCREL_S2
: alpha_type
= ALPHA_R_BRADDR
; break;
5985 case BFD_RELOC_ALPHA_HINT
: alpha_type
= ALPHA_R_HINT
; break;
5986 case BFD_RELOC_16_PCREL
: alpha_type
= ALPHA_R_SREL16
; break;
5987 case BFD_RELOC_32_PCREL
: alpha_type
= ALPHA_R_SREL32
; break;
5988 case BFD_RELOC_64_PCREL
: alpha_type
= ALPHA_R_SREL64
; break;
5989 case BFD_RELOC_ALPHA_LINKAGE
: alpha_type
= ALPHA_R_LINKAGE
; break;
5990 case BFD_RELOC_ALPHA_CODEADDR
: alpha_type
= ALPHA_R_CODEADDR
; break;
5991 case BFD_RELOC_ALPHA_NOP
: alpha_type
= ALPHA_R_NOP
; break;
5992 case BFD_RELOC_ALPHA_BSR
: alpha_type
= ALPHA_R_BSR
; break;
5993 case BFD_RELOC_ALPHA_LDA
: alpha_type
= ALPHA_R_LDA
; break;
5994 case BFD_RELOC_ALPHA_BOH
: alpha_type
= ALPHA_R_BOH
; break;
5996 _bfd_error_handler (_("reloc (%d) is *UNKNOWN*"), code
);
5999 vms_debug2 ((2, "reloc is %s\n", alpha_howto_table
[alpha_type
].name
));
6000 return & alpha_howto_table
[alpha_type
];
6003 static reloc_howto_type
*
6004 alpha_vms_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
6010 i
< sizeof (alpha_howto_table
) / sizeof (alpha_howto_table
[0]);
6012 if (alpha_howto_table
[i
].name
!= NULL
6013 && strcasecmp (alpha_howto_table
[i
].name
, r_name
) == 0)
6014 return &alpha_howto_table
[i
];
6020 alpha_vms_get_synthetic_symtab (bfd
*abfd
,
6021 long symcount ATTRIBUTE_UNUSED
,
6022 asymbol
**usyms ATTRIBUTE_UNUSED
,
6023 long dynsymcount ATTRIBUTE_UNUSED
,
6024 asymbol
**dynsyms ATTRIBUTE_UNUSED
,
6031 syms
= (asymbol
*) bfd_malloc (PRIV (norm_sym_count
) * sizeof (asymbol
));
6036 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
6038 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
6049 flags
= BSF_LOCAL
| BSF_SYNTHETIC
;
6056 if ((e
->flags
& EGSY__V_DEF
) && (e
->flags
& EGSY__V_NORM
))
6058 value
= e
->code_value
;
6059 sec
= e
->code_section
;
6070 sname
= bfd_alloc (abfd
, l
+ 5);
6073 memcpy (sname
, name
, l
);
6074 memcpy (sname
+ l
, "..en", 5);
6081 sym
->udata
.p
= NULL
;
6090 vms_time_to_str (unsigned char *buf
)
6092 time_t t
= vms_rawtime_to_time_t (buf
);
6093 char *res
= ctime (&t
);
6096 res
= "*invalid time*";
6103 evax_bfd_print_emh (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
6105 struct vms_emh_common
*emh
= (struct vms_emh_common
*)rec
;
6109 if (rec_len
>= sizeof (*emh
))
6110 subtype
= bfd_getl16 (emh
->subtyp
);
6112 /* xgettext:c-format */
6113 fprintf (file
, _(" EMH %d (len=%u): "), subtype
, rec_len
);
6115 /* PR 21618: Check for invalid lengths. */
6116 if (rec_len
< sizeof (*emh
))
6118 fprintf (file
, _(" Error: %s min length is %u\n"),
6119 "EMH", (unsigned) sizeof (*emh
));
6123 extra
= rec_len
- sizeof (struct vms_emh_common
);
6129 struct vms_emh_mhd
*mhd
= (struct vms_emh_mhd
*) rec
;
6130 unsigned char *name
;
6131 unsigned char *nextname
;
6132 unsigned char *maxname
;
6134 /* PR 21840: Check for invalid lengths. */
6135 if (rec_len
< sizeof (* mhd
))
6137 fprintf (file
, _(" Error: %s min length is %u\n"),
6138 "EMH_MHD", (unsigned) sizeof (*mhd
));
6141 fprintf (file
, _("Module header\n"));
6142 fprintf (file
, _(" structure level: %u\n"), mhd
->strlvl
);
6143 fprintf (file
, _(" max record size: %u\n"),
6144 (unsigned) bfd_getl32 (mhd
->recsiz
));
6145 name
= (unsigned char *) (mhd
+ 1);
6146 maxname
= (unsigned char *) rec
+ rec_len
;
6147 if (name
> maxname
- 2)
6149 fprintf (file
, _(" Error: The module name is missing\n"));
6152 nextname
= name
+ name
[0] + 1;
6153 if (nextname
>= maxname
)
6155 fprintf (file
, _(" Error: The module name is too long\n"));
6158 fprintf (file
, _(" module name : %.*s\n"), name
[0], name
+ 1);
6160 if (name
> maxname
- 2)
6162 fprintf (file
, _(" Error: The module version is missing\n"));
6165 nextname
= name
+ name
[0] + 1;
6166 if (nextname
>= maxname
)
6168 fprintf (file
, _(" Error: The module version is too long\n"));
6171 fprintf (file
, _(" module version : %.*s\n"), name
[0], name
+ 1);
6173 if ((maxname
- name
) < 17 && maxname
[-1] != 0)
6174 fprintf (file
, _(" Error: The compile date is truncated\n"));
6176 fprintf (file
, _(" compile date : %.17s\n"), name
);
6181 fprintf (file
, _("Language Processor Name\n"));
6182 fprintf (file
, _(" language name: %.*s\n"), extra
, (char *)(emh
+ 1));
6186 fprintf (file
, _("Source Files Header\n"));
6187 fprintf (file
, _(" file: %.*s\n"), extra
, (char *)(emh
+ 1));
6191 fprintf (file
, _("Title Text Header\n"));
6192 fprintf (file
, _(" title: %.*s\n"), extra
, (char *)(emh
+ 1));
6196 fprintf (file
, _("Copyright Header\n"));
6197 fprintf (file
, _(" copyright: %.*s\n"), extra
, (char *)(emh
+ 1));
6201 fprintf (file
, _("unhandled emh subtype %u\n"), subtype
);
6207 evax_bfd_print_eeom (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
6209 struct vms_eeom
*eeom
= (struct vms_eeom
*)rec
;
6211 fprintf (file
, _(" EEOM (len=%u):\n"), rec_len
);
6213 /* PR 21618: Check for invalid lengths. */
6216 fprintf (file
, _(" Error: %s min length is %u\n"),
6221 fprintf (file
, _(" number of cond linkage pairs: %u\n"),
6222 (unsigned)bfd_getl32 (eeom
->total_lps
));
6223 fprintf (file
, _(" completion code: %u\n"),
6224 (unsigned)bfd_getl16 (eeom
->comcod
));
6226 if (rec_len
>= sizeof (*eeom
))
6228 fprintf (file
, _(" transfer addr flags: 0x%02x\n"), eeom
->tfrflg
);
6229 fprintf (file
, _(" transfer addr psect: %u\n"),
6230 (unsigned)bfd_getl32 (eeom
->psindx
));
6231 fprintf (file
, _(" transfer address : 0x%08x\n"),
6232 (unsigned)bfd_getl32 (eeom
->tfradr
));
6237 exav_bfd_print_egsy_flags (unsigned int flags
, FILE *file
)
6239 if (flags
& EGSY__V_WEAK
)
6240 fputs (_(" WEAK"), file
);
6241 if (flags
& EGSY__V_DEF
)
6242 fputs (_(" DEF"), file
);
6243 if (flags
& EGSY__V_UNI
)
6244 fputs (_(" UNI"), file
);
6245 if (flags
& EGSY__V_REL
)
6246 fputs (_(" REL"), file
);
6247 if (flags
& EGSY__V_COMM
)
6248 fputs (_(" COMM"), file
);
6249 if (flags
& EGSY__V_VECEP
)
6250 fputs (_(" VECEP"), file
);
6251 if (flags
& EGSY__V_NORM
)
6252 fputs (_(" NORM"), file
);
6253 if (flags
& EGSY__V_QUAD_VAL
)
6254 fputs (_(" QVAL"), file
);
6258 evax_bfd_print_egsd_flags (FILE *file
, unsigned int flags
)
6260 if (flags
& EGPS__V_PIC
)
6261 fputs (_(" PIC"), file
);
6262 if (flags
& EGPS__V_LIB
)
6263 fputs (_(" LIB"), file
);
6264 if (flags
& EGPS__V_OVR
)
6265 fputs (_(" OVR"), file
);
6266 if (flags
& EGPS__V_REL
)
6267 fputs (_(" REL"), file
);
6268 if (flags
& EGPS__V_GBL
)
6269 fputs (_(" GBL"), file
);
6270 if (flags
& EGPS__V_SHR
)
6271 fputs (_(" SHR"), file
);
6272 if (flags
& EGPS__V_EXE
)
6273 fputs (_(" EXE"), file
);
6274 if (flags
& EGPS__V_RD
)
6275 fputs (_(" RD"), file
);
6276 if (flags
& EGPS__V_WRT
)
6277 fputs (_(" WRT"), file
);
6278 if (flags
& EGPS__V_VEC
)
6279 fputs (_(" VEC"), file
);
6280 if (flags
& EGPS__V_NOMOD
)
6281 fputs (_(" NOMOD"), file
);
6282 if (flags
& EGPS__V_COM
)
6283 fputs (_(" COM"), file
);
6284 if (flags
& EGPS__V_ALLOC_64BIT
)
6285 fputs (_(" 64B"), file
);
6289 evax_bfd_print_egsd (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
6291 unsigned int off
= sizeof (struct vms_egsd
);
6294 fprintf (file
, _(" EGSD (len=%u):\n"), rec_len
);
6295 if (rec_len
< sizeof (struct vms_egsd
) + sizeof (struct vms_egsd_entry
))
6298 while (off
<= rec_len
- sizeof (struct vms_egsd_entry
))
6300 struct vms_egsd_entry
*e
= (struct vms_egsd_entry
*)(rec
+ off
);
6305 type
= (unsigned)bfd_getl16 (e
->gsdtyp
);
6306 len
= (unsigned)bfd_getl16 (e
->gsdsiz
);
6308 /* xgettext:c-format */
6309 fprintf (file
, _(" EGSD entry %2u (type: %u, len: %u): "),
6313 if (len
< sizeof (struct vms_egsd_entry
) || len
> rec_len
- off
)
6315 fprintf (file
, _(" Erroneous length\n"));
6322 if (len
>= offsetof (struct vms_egps
, name
))
6324 struct vms_egps
*egps
= (struct vms_egps
*) e
;
6325 unsigned int flags
= bfd_getl16 (egps
->flags
);
6328 fprintf (file
, _("PSC - Program section definition\n"));
6329 fprintf (file
, _(" alignment : 2**%u\n"), egps
->align
);
6330 fprintf (file
, _(" flags : 0x%04x"), flags
);
6331 evax_bfd_print_egsd_flags (file
, flags
);
6333 l
= bfd_getl32 (egps
->alloc
);
6334 fprintf (file
, _(" alloc (len): %u (0x%08x)\n"), l
, l
);
6335 rest
= len
- offsetof (struct vms_egps
, name
);
6336 fprintf (file
, _(" name : %.*s\n"),
6337 egps
->namlng
> rest
? rest
: egps
->namlng
,
6342 if (len
>= offsetof (struct vms_esgps
, name
))
6344 struct vms_esgps
*esgps
= (struct vms_esgps
*) e
;
6345 unsigned int flags
= bfd_getl16 (esgps
->flags
);
6348 fprintf (file
, _("SPSC - Shared Image Program section def\n"));
6349 fprintf (file
, _(" alignment : 2**%u\n"), esgps
->align
);
6350 fprintf (file
, _(" flags : 0x%04x"), flags
);
6351 evax_bfd_print_egsd_flags (file
, flags
);
6353 l
= bfd_getl32 (esgps
->alloc
);
6354 fprintf (file
, _(" alloc (len) : %u (0x%08x)\n"), l
, l
);
6355 fprintf (file
, _(" image offset : 0x%08x\n"),
6356 (unsigned int) bfd_getl32 (esgps
->base
));
6357 fprintf (file
, _(" symvec offset : 0x%08x\n"),
6358 (unsigned int) bfd_getl32 (esgps
->value
));
6359 rest
= len
- offsetof (struct vms_esgps
, name
);
6360 fprintf (file
, _(" name : %.*s\n"),
6361 esgps
->namlng
> rest
? rest
: esgps
->namlng
,
6366 if (len
>= sizeof (struct vms_egsy
))
6368 struct vms_egsy
*egsy
= (struct vms_egsy
*) e
;
6369 unsigned int flags
= bfd_getl16 (egsy
->flags
);
6371 if ((flags
& EGSY__V_DEF
) != 0
6372 && len
>= offsetof (struct vms_esdf
, name
))
6374 struct vms_esdf
*esdf
= (struct vms_esdf
*) e
;
6376 fprintf (file
, _("SYM - Global symbol definition\n"));
6377 fprintf (file
, _(" flags: 0x%04x"), flags
);
6378 exav_bfd_print_egsy_flags (flags
, file
);
6380 fprintf (file
, _(" psect offset: 0x%08x\n"),
6381 (unsigned) bfd_getl32 (esdf
->value
));
6382 if (flags
& EGSY__V_NORM
)
6384 fprintf (file
, _(" code address: 0x%08x\n"),
6385 (unsigned) bfd_getl32 (esdf
->code_address
));
6386 fprintf (file
, _(" psect index for entry point : %u\n"),
6387 (unsigned) bfd_getl32 (esdf
->ca_psindx
));
6389 fprintf (file
, _(" psect index : %u\n"),
6390 (unsigned) bfd_getl32 (esdf
->psindx
));
6391 rest
= len
- offsetof (struct vms_esdf
, name
);
6392 fprintf (file
, _(" name : %.*s\n"),
6393 esdf
->namlng
> rest
? rest
: esdf
->namlng
,
6396 else if (len
>= offsetof (struct vms_esrf
, name
))
6398 struct vms_esrf
*esrf
= (struct vms_esrf
*)e
;
6400 fprintf (file
, _("SYM - Global symbol reference\n"));
6401 rest
= len
- offsetof (struct vms_esrf
, name
);
6402 fprintf (file
, _(" name : %.*s\n"),
6403 esrf
->namlng
> rest
? rest
: esrf
->namlng
,
6409 if (len
>= sizeof (struct vms_eidc
))
6411 struct vms_eidc
*eidc
= (struct vms_eidc
*) e
;
6412 unsigned int flags
= bfd_getl32 (eidc
->flags
);
6415 fprintf (file
, _("IDC - Ident Consistency check\n"));
6416 fprintf (file
, _(" flags : 0x%08x"), flags
);
6417 if (flags
& EIDC__V_BINIDENT
)
6418 fputs (" BINDENT", file
);
6420 fprintf (file
, _(" id match : %x\n"),
6421 (flags
>> EIDC__V_IDMATCH_SH
) & EIDC__V_IDMATCH_MASK
);
6422 fprintf (file
, _(" error severity: %x\n"),
6423 (flags
>> EIDC__V_ERRSEV_SH
) & EIDC__V_ERRSEV_MASK
);
6425 rest
= len
- (p
- (unsigned char *) e
);
6426 fprintf (file
, _(" entity name : %.*s\n"),
6427 p
[0] > rest
- 1 ? rest
- 1 : p
[0], p
+ 1);
6428 if (rest
> 1u + p
[0])
6432 fprintf (file
, _(" object name : %.*s\n"),
6433 p
[0] > rest
- 1 ? rest
- 1 : p
[0], p
+ 1);
6434 if (rest
> 1u + p
[0])
6438 if (flags
& EIDC__V_BINIDENT
)
6441 fprintf (file
, _(" binary ident : 0x%08x\n"),
6442 (unsigned) bfd_getl32 (p
));
6445 fprintf (file
, _(" ascii ident : %.*s\n"),
6446 p
[0] > rest
- 1 ? rest
- 1 : p
[0], p
+ 1);
6452 if (len
>= offsetof (struct vms_egst
, name
))
6454 struct vms_egst
*egst
= (struct vms_egst
*) e
;
6455 unsigned int flags
= bfd_getl16 (egst
->header
.flags
);
6457 fprintf (file
, _("SYMG - Universal symbol definition\n"));
6458 fprintf (file
, _(" flags: 0x%04x"), flags
);
6459 exav_bfd_print_egsy_flags (flags
, file
);
6461 fprintf (file
, _(" symbol vector offset: 0x%08x\n"),
6462 (unsigned) bfd_getl32 (egst
->value
));
6463 fprintf (file
, _(" entry point: 0x%08x\n"),
6464 (unsigned) bfd_getl32 (egst
->lp_1
));
6465 fprintf (file
, _(" proc descr : 0x%08x\n"),
6466 (unsigned) bfd_getl32 (egst
->lp_2
));
6467 fprintf (file
, _(" psect index: %u\n"),
6468 (unsigned) bfd_getl32 (egst
->psindx
));
6469 rest
= len
- offsetof (struct vms_egst
, name
);
6470 fprintf (file
, _(" name : %.*s\n"),
6471 egst
->namlng
> rest
? rest
: egst
->namlng
,
6476 if (len
>= offsetof (struct vms_esdfv
, name
))
6478 struct vms_esdfv
*esdfv
= (struct vms_esdfv
*) e
;
6479 unsigned int flags
= bfd_getl16 (esdfv
->flags
);
6481 fprintf (file
, _("SYMV - Vectored symbol definition\n"));
6482 fprintf (file
, _(" flags: 0x%04x"), flags
);
6483 exav_bfd_print_egsy_flags (flags
, file
);
6485 fprintf (file
, _(" vector : 0x%08x\n"),
6486 (unsigned) bfd_getl32 (esdfv
->vector
));
6487 fprintf (file
, _(" psect offset: %u\n"),
6488 (unsigned) bfd_getl32 (esdfv
->value
));
6489 fprintf (file
, _(" psect index : %u\n"),
6490 (unsigned) bfd_getl32 (esdfv
->psindx
));
6491 rest
= len
- offsetof (struct vms_esdfv
, name
);
6492 fprintf (file
, _(" name : %.*s\n"),
6493 esdfv
->namlng
> rest
? rest
: esdfv
->namlng
,
6498 if (len
>= offsetof (struct vms_esdfm
, name
))
6500 struct vms_esdfm
*esdfm
= (struct vms_esdfm
*) e
;
6501 unsigned int flags
= bfd_getl16 (esdfm
->flags
);
6504 _("SYMM - Global symbol definition with version\n"));
6505 fprintf (file
, _(" flags: 0x%04x"), flags
);
6506 exav_bfd_print_egsy_flags (flags
, file
);
6508 fprintf (file
, _(" version mask: 0x%08x\n"),
6509 (unsigned)bfd_getl32 (esdfm
->version_mask
));
6510 fprintf (file
, _(" psect offset: %u\n"),
6511 (unsigned)bfd_getl32 (esdfm
->value
));
6512 fprintf (file
, _(" psect index : %u\n"),
6513 (unsigned)bfd_getl32 (esdfm
->psindx
));
6514 rest
= len
- offsetof (struct vms_esdfm
, name
);
6515 fprintf (file
, _(" name : %.*s\n"),
6516 esdfm
->namlng
> rest
? rest
: esdfm
->namlng
,
6521 fprintf (file
, _("unhandled egsd entry type %u\n"), type
);
6529 evax_bfd_print_hex (FILE *file
, const char *pfx
,
6530 const unsigned char *buf
, unsigned int len
)
6536 for (i
= 0; i
< len
; i
++)
6540 fprintf (file
, " %02x", buf
[i
]);
6553 evax_bfd_print_etir_stc_ir (FILE *file
, const unsigned char *buf
,
6554 unsigned int len
, int is_ps
)
6556 if (is_ps
? len
< 44 : len
< 33)
6559 /* xgettext:c-format */
6560 fprintf (file
, _(" linkage index: %u, replacement insn: 0x%08x\n"),
6561 (unsigned)bfd_getl32 (buf
),
6562 (unsigned)bfd_getl32 (buf
+ 16));
6563 /* xgettext:c-format */
6564 fprintf (file
, _(" psect idx 1: %u, offset 1: 0x%08x %08x\n"),
6565 (unsigned)bfd_getl32 (buf
+ 4),
6566 (unsigned)bfd_getl32 (buf
+ 12),
6567 (unsigned)bfd_getl32 (buf
+ 8));
6568 /* xgettext:c-format */
6569 fprintf (file
, _(" psect idx 2: %u, offset 2: 0x%08x %08x\n"),
6570 (unsigned)bfd_getl32 (buf
+ 20),
6571 (unsigned)bfd_getl32 (buf
+ 28),
6572 (unsigned)bfd_getl32 (buf
+ 24));
6574 /* xgettext:c-format */
6575 fprintf (file
, _(" psect idx 3: %u, offset 3: 0x%08x %08x\n"),
6576 (unsigned)bfd_getl32 (buf
+ 32),
6577 (unsigned)bfd_getl32 (buf
+ 40),
6578 (unsigned)bfd_getl32 (buf
+ 36));
6580 fprintf (file
, _(" global name: %.*s\n"),
6581 buf
[32] > len
- 33 ? len
- 33 : buf
[32],
6586 evax_bfd_print_etir (FILE *file
, const char *name
,
6587 unsigned char *rec
, unsigned int rec_len
)
6589 unsigned int off
= sizeof (struct vms_eobjrec
);
6591 /* xgettext:c-format */
6592 fprintf (file
, _(" %s (len=%u):\n"), name
, (unsigned) rec_len
);
6593 if (rec_len
< sizeof (struct vms_eobjrec
) + sizeof (struct vms_etir
))
6596 while (off
<= rec_len
- sizeof (struct vms_etir
))
6598 struct vms_etir
*etir
= (struct vms_etir
*)(rec
+ off
);
6604 type
= bfd_getl16 (etir
->rectyp
);
6605 size
= bfd_getl16 (etir
->size
);
6606 buf
= rec
+ off
+ sizeof (struct vms_etir
);
6608 if (size
< sizeof (struct vms_etir
) || size
> rec_len
- off
)
6610 fprintf (file
, _(" Erroneous length\n"));
6614 /* xgettext:c-format */
6615 fprintf (file
, _(" (type: %3u, size: %3u): "), type
, size
);
6616 rest
= size
- sizeof (struct vms_etir
);
6619 case ETIR__C_STA_GBL
:
6621 fprintf (file
, _("STA_GBL (stack global) %.*s\n"),
6622 buf
[0] > rest
- 1 ? rest
- 1 : buf
[0], buf
+ 1);
6624 case ETIR__C_STA_LW
:
6625 fprintf (file
, _("STA_LW (stack longword)"));
6627 fprintf (file
, " 0x%08x\n",
6628 (unsigned) bfd_getl32 (buf
));
6630 case ETIR__C_STA_QW
:
6631 fprintf (file
, _("STA_QW (stack quadword)"));
6633 fprintf (file
, " 0x%08x %08x\n",
6634 (unsigned) bfd_getl32 (buf
+ 4),
6635 (unsigned) bfd_getl32 (buf
+ 0));
6637 case ETIR__C_STA_PQ
:
6638 fprintf (file
, _("STA_PQ (stack psect base + offset)\n"));
6640 /* xgettext:c-format */
6641 fprintf (file
, _(" psect: %u, offset: 0x%08x %08x\n"),
6642 (unsigned) bfd_getl32 (buf
+ 0),
6643 (unsigned) bfd_getl32 (buf
+ 8),
6644 (unsigned) bfd_getl32 (buf
+ 4));
6646 case ETIR__C_STA_LI
:
6647 fprintf (file
, _("STA_LI (stack literal)\n"));
6649 case ETIR__C_STA_MOD
:
6650 fprintf (file
, _("STA_MOD (stack module)\n"));
6652 case ETIR__C_STA_CKARG
:
6653 fprintf (file
, _("STA_CKARG (compare procedure argument)\n"));
6657 fprintf (file
, _("STO_B (store byte)\n"));
6660 fprintf (file
, _("STO_W (store word)\n"));
6662 case ETIR__C_STO_LW
:
6663 fprintf (file
, _("STO_LW (store longword)\n"));
6665 case ETIR__C_STO_QW
:
6666 fprintf (file
, _("STO_QW (store quadword)\n"));
6668 case ETIR__C_STO_IMMR
:
6671 unsigned int rpt
= bfd_getl32 (buf
);
6673 _("STO_IMMR (store immediate repeat) %u bytes\n"),
6677 evax_bfd_print_hex (file
, " ", buf
+ 4, rpt
);
6680 case ETIR__C_STO_GBL
:
6682 fprintf (file
, _("STO_GBL (store global) %.*s\n"),
6683 buf
[0] > rest
- 1 ? rest
- 1 : buf
[0], buf
+ 1);
6685 case ETIR__C_STO_CA
:
6687 fprintf (file
, _("STO_CA (store code address) %.*s\n"),
6688 buf
[0] > rest
- 1 ? rest
- 1 : buf
[0], buf
+ 1);
6690 case ETIR__C_STO_RB
:
6691 fprintf (file
, _("STO_RB (store relative branch)\n"));
6693 case ETIR__C_STO_AB
:
6694 fprintf (file
, _("STO_AB (store absolute branch)\n"));
6696 case ETIR__C_STO_OFF
:
6697 fprintf (file
, _("STO_OFF (store offset to psect)\n"));
6699 case ETIR__C_STO_IMM
:
6702 unsigned int rpt
= bfd_getl32 (buf
);
6704 _("STO_IMM (store immediate) %u bytes\n"),
6708 evax_bfd_print_hex (file
, " ", buf
+ 4, rpt
);
6711 case ETIR__C_STO_GBL_LW
:
6713 fprintf (file
, _("STO_GBL_LW (store global longword) %.*s\n"),
6714 buf
[0] > rest
- 1 ? rest
- 1 : buf
[0], buf
+ 1);
6716 case ETIR__C_STO_LP_PSB
:
6717 fprintf (file
, _("STO_OFF (store LP with procedure signature)\n"));
6719 case ETIR__C_STO_HINT_GBL
:
6720 fprintf (file
, _("STO_BR_GBL (store branch global) *todo*\n"));
6722 case ETIR__C_STO_HINT_PS
:
6723 fprintf (file
, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6726 case ETIR__C_OPR_NOP
:
6727 fprintf (file
, _("OPR_NOP (no-operation)\n"));
6729 case ETIR__C_OPR_ADD
:
6730 fprintf (file
, _("OPR_ADD (add)\n"));
6732 case ETIR__C_OPR_SUB
:
6733 fprintf (file
, _("OPR_SUB (subtract)\n"));
6735 case ETIR__C_OPR_MUL
:
6736 fprintf (file
, _("OPR_MUL (multiply)\n"));
6738 case ETIR__C_OPR_DIV
:
6739 fprintf (file
, _("OPR_DIV (divide)\n"));
6741 case ETIR__C_OPR_AND
:
6742 fprintf (file
, _("OPR_AND (logical and)\n"));
6744 case ETIR__C_OPR_IOR
:
6745 fprintf (file
, _("OPR_IOR (logical inclusive or)\n"));
6747 case ETIR__C_OPR_EOR
:
6748 fprintf (file
, _("OPR_EOR (logical exclusive or)\n"));
6750 case ETIR__C_OPR_NEG
:
6751 fprintf (file
, _("OPR_NEG (negate)\n"));
6753 case ETIR__C_OPR_COM
:
6754 fprintf (file
, _("OPR_COM (complement)\n"));
6756 case ETIR__C_OPR_INSV
:
6757 fprintf (file
, _("OPR_INSV (insert field)\n"));
6759 case ETIR__C_OPR_ASH
:
6760 fprintf (file
, _("OPR_ASH (arithmetic shift)\n"));
6762 case ETIR__C_OPR_USH
:
6763 fprintf (file
, _("OPR_USH (unsigned shift)\n"));
6765 case ETIR__C_OPR_ROT
:
6766 fprintf (file
, _("OPR_ROT (rotate)\n"));
6768 case ETIR__C_OPR_SEL
:
6769 fprintf (file
, _("OPR_SEL (select)\n"));
6771 case ETIR__C_OPR_REDEF
:
6772 fprintf (file
, _("OPR_REDEF (redefine symbol to curr location)\n"));
6774 case ETIR__C_OPR_DFLIT
:
6775 fprintf (file
, _("OPR_REDEF (define a literal)\n"));
6778 case ETIR__C_STC_LP
:
6779 fprintf (file
, _("STC_LP (store cond linkage pair)\n"));
6781 case ETIR__C_STC_LP_PSB
:
6783 _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6786 /* xgettext:c-format */
6787 fprintf (file
, _(" linkage index: %u, procedure: %.*s\n"),
6788 (unsigned) bfd_getl32 (buf
),
6789 buf
[4] > rest
- 5 ? rest
- 5 : buf
[4], buf
+ 5);
6790 if (rest
> 4 + 1u + buf
[4])
6792 rest
-= 4 + 1 + buf
[4];
6793 buf
+= 4 + 1 + buf
[4];
6794 fprintf (file
, _(" signature: %.*s\n"),
6795 buf
[0] > rest
- 1 ? rest
- 1: buf
[0], buf
+ 1);
6799 case ETIR__C_STC_GBL
:
6800 fprintf (file
, _("STC_GBL (store cond global)\n"));
6802 /* xgettext:c-format */
6803 fprintf (file
, _(" linkage index: %u, global: %.*s\n"),
6804 (unsigned) bfd_getl32 (buf
),
6805 buf
[4] > rest
- 5 ? rest
- 5 : buf
[4], buf
+ 5);
6807 case ETIR__C_STC_GCA
:
6808 fprintf (file
, _("STC_GCA (store cond code address)\n"));
6810 /* xgettext:c-format */
6811 fprintf (file
, _(" linkage index: %u, procedure name: %.*s\n"),
6812 (unsigned) bfd_getl32 (buf
),
6813 buf
[4] > rest
- 5 ? rest
- 5 : buf
[4], buf
+ 5);
6815 case ETIR__C_STC_PS
:
6816 fprintf (file
, _("STC_PS (store cond psect + offset)\n"));
6819 /* xgettext:c-format */
6820 _(" linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6821 (unsigned)bfd_getl32 (buf
),
6822 (unsigned)bfd_getl32 (buf
+ 4),
6823 (unsigned)bfd_getl32 (buf
+ 12),
6824 (unsigned)bfd_getl32 (buf
+ 8));
6826 case ETIR__C_STC_NOP_GBL
:
6827 fprintf (file
, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6828 evax_bfd_print_etir_stc_ir (file
, buf
, rest
, 0);
6830 case ETIR__C_STC_NOP_PS
:
6831 fprintf (file
, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6832 evax_bfd_print_etir_stc_ir (file
, buf
, rest
, 1);
6834 case ETIR__C_STC_BSR_GBL
:
6835 fprintf (file
, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6836 evax_bfd_print_etir_stc_ir (file
, buf
, rest
, 0);
6838 case ETIR__C_STC_BSR_PS
:
6839 fprintf (file
, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6840 evax_bfd_print_etir_stc_ir (file
, buf
, rest
, 1);
6842 case ETIR__C_STC_LDA_GBL
:
6843 fprintf (file
, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6844 evax_bfd_print_etir_stc_ir (file
, buf
, rest
, 0);
6846 case ETIR__C_STC_LDA_PS
:
6847 fprintf (file
, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6848 evax_bfd_print_etir_stc_ir (file
, buf
, rest
, 1);
6850 case ETIR__C_STC_BOH_GBL
:
6851 fprintf (file
, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6852 evax_bfd_print_etir_stc_ir (file
, buf
, rest
, 0);
6854 case ETIR__C_STC_BOH_PS
:
6855 fprintf (file
, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6856 evax_bfd_print_etir_stc_ir (file
, buf
, rest
, 1);
6858 case ETIR__C_STC_NBH_GBL
:
6860 _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6862 case ETIR__C_STC_NBH_PS
:
6864 _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6867 case ETIR__C_CTL_SETRB
:
6868 fprintf (file
, _("CTL_SETRB (set relocation base)\n"));
6870 case ETIR__C_CTL_AUGRB
:
6873 unsigned int val
= bfd_getl32 (buf
);
6874 fprintf (file
, _("CTL_AUGRB (augment relocation base) %u\n"),
6878 case ETIR__C_CTL_DFLOC
:
6879 fprintf (file
, _("CTL_DFLOC (define location)\n"));
6881 case ETIR__C_CTL_STLOC
:
6882 fprintf (file
, _("CTL_STLOC (set location)\n"));
6884 case ETIR__C_CTL_STKDL
:
6885 fprintf (file
, _("CTL_STKDL (stack defined location)\n"));
6888 fprintf (file
, _("*unhandled*\n"));
6896 evax_bfd_print_eobj (struct bfd
*abfd
, FILE *file
)
6898 bool is_first
= true;
6899 bool has_records
= true;
6903 unsigned int rec_len
;
6904 unsigned int pad_len
;
6906 unsigned int hdr_size
;
6908 unsigned char buf
[6];
6910 hdr_size
= has_records
? 6 : 4;
6911 if (bfd_read (buf
, hdr_size
, abfd
) != hdr_size
)
6913 fprintf (file
, _("cannot read GST record header\n"));
6917 type
= bfd_getl16 (buf
);
6918 rec_len
= bfd_getl16 (buf
+ 2);
6922 unsigned int rec_len2
= bfd_getl16 (buf
+ 4);
6927 if (type
== rec_len2
&& rec_len
== EOBJ__C_EMH
)
6928 /* Matched a VMS record EMH. */
6932 has_records
= false;
6933 if (type
!= EOBJ__C_EMH
)
6936 fprintf (file
, _("cannot find EMH in first GST record\n"));
6944 /* VMS record format is: record-size, type, record-size.
6945 See maybe_adjust_record_pointer_for_object comment. */
6946 if (type
== rec_len2
)
6953 pad_len
= (rec_len
+ 1) & ~1U;
6958 if (rec_len
< hdr_size
)
6960 fprintf (file
, _("corrupted GST\n"));
6964 rec
= bfd_malloc (pad_len
);
6968 memcpy (rec
, buf
+ (has_records
? 2 : 0), hdr_size
);
6970 if (bfd_read (rec
+ hdr_size
, pad_len
- hdr_size
, abfd
)
6971 != pad_len
- hdr_size
)
6973 fprintf (file
, _("cannot read GST record\n"));
6981 evax_bfd_print_emh (file
, rec
, rec_len
);
6984 evax_bfd_print_egsd (file
, rec
, rec_len
);
6987 evax_bfd_print_eeom (file
, rec
, rec_len
);
6991 evax_bfd_print_etir (file
, "ETIR", rec
, rec_len
);
6994 evax_bfd_print_etir (file
, "EDBG", rec
, rec_len
);
6997 evax_bfd_print_etir (file
, "ETBT", rec
, rec_len
);
7000 fprintf (file
, _(" unhandled EOBJ record type %u\n"), type
);
7008 evax_bfd_print_relocation_records (FILE *file
, const unsigned char *buf
,
7009 size_t buf_size
, size_t off
,
7010 unsigned int stride
)
7012 while (off
<= buf_size
- 8)
7018 count
= bfd_getl32 (buf
+ off
+ 0);
7022 base
= bfd_getl32 (buf
+ off
+ 4);
7024 /* xgettext:c-format */
7025 fprintf (file
, _(" bitcount: %u, base addr: 0x%08x\n"),
7029 for (j
= 0; count
> 0 && off
<= buf_size
- 4; j
+= 4, count
-= 32)
7035 val
= bfd_getl32 (buf
+ off
);
7038 /* xgettext:c-format */
7039 fprintf (file
, _(" bitmap: 0x%08x (count: %u):\n"), val
, count
);
7041 for (k
= 0; k
< 32; k
++)
7042 if (val
& (1u << k
))
7046 fprintf (file
, _(" %08x"), base
+ (j
* 8 + k
) * stride
);
7061 evax_bfd_print_address_fixups (FILE *file
, const unsigned char *buf
,
7062 size_t buf_size
, size_t off
)
7064 while (off
<= buf_size
- 8)
7069 count
= bfd_getl32 (buf
+ off
+ 0);
7072 /* xgettext:c-format */
7073 fprintf (file
, _(" image %u (%u entries)\n"),
7074 (unsigned) bfd_getl32 (buf
+ off
+ 4), count
);
7076 for (j
= 0; j
< count
&& off
<= buf_size
- 8; j
++)
7078 /* xgettext:c-format */
7079 fprintf (file
, _(" offset: 0x%08x, val: 0x%08x\n"),
7080 (unsigned) bfd_getl32 (buf
+ off
+ 0),
7081 (unsigned) bfd_getl32 (buf
+ off
+ 4));
7088 evax_bfd_print_reference_fixups (FILE *file
, const unsigned char *buf
,
7089 size_t buf_size
, size_t off
)
7093 while (off
<= buf_size
- 8)
7098 count
= bfd_getl32 (buf
+ off
+ 0);
7101 /* xgettext:c-format */
7102 fprintf (file
, _(" image %u (%u entries), offsets:\n"),
7103 (unsigned) bfd_getl32 (buf
+ off
+ 4), count
);
7105 for (j
= 0; j
< count
&& off
<= buf_size
- 4; j
++)
7109 fprintf (file
, _(" 0x%08x"), (unsigned) bfd_getl32 (buf
+ off
));
7124 evax_bfd_print_indent (int indent
, FILE *file
)
7126 for (; indent
; indent
--)
7131 evax_bfd_get_dsc_name (unsigned int v
)
7135 case DSC__K_DTYPE_Z
:
7136 return "Z (Unspecified)";
7137 case DSC__K_DTYPE_V
:
7139 case DSC__K_DTYPE_BU
:
7140 return "BU (Byte logical)";
7141 case DSC__K_DTYPE_WU
:
7142 return "WU (Word logical)";
7143 case DSC__K_DTYPE_LU
:
7144 return "LU (Longword logical)";
7145 case DSC__K_DTYPE_QU
:
7146 return "QU (Quadword logical)";
7147 case DSC__K_DTYPE_B
:
7148 return "B (Byte integer)";
7149 case DSC__K_DTYPE_W
:
7150 return "W (Word integer)";
7151 case DSC__K_DTYPE_L
:
7152 return "L (Longword integer)";
7153 case DSC__K_DTYPE_Q
:
7154 return "Q (Quadword integer)";
7155 case DSC__K_DTYPE_F
:
7156 return "F (Single-precision floating)";
7157 case DSC__K_DTYPE_D
:
7158 return "D (Double-precision floating)";
7159 case DSC__K_DTYPE_FC
:
7160 return "FC (Complex)";
7161 case DSC__K_DTYPE_DC
:
7162 return "DC (Double-precision Complex)";
7163 case DSC__K_DTYPE_T
:
7164 return "T (ASCII text string)";
7165 case DSC__K_DTYPE_NU
:
7166 return "NU (Numeric string, unsigned)";
7167 case DSC__K_DTYPE_NL
:
7168 return "NL (Numeric string, left separate sign)";
7169 case DSC__K_DTYPE_NLO
:
7170 return "NLO (Numeric string, left overpunched sign)";
7171 case DSC__K_DTYPE_NR
:
7172 return "NR (Numeric string, right separate sign)";
7173 case DSC__K_DTYPE_NRO
:
7174 return "NRO (Numeric string, right overpunched sig)";
7175 case DSC__K_DTYPE_NZ
:
7176 return "NZ (Numeric string, zoned sign)";
7177 case DSC__K_DTYPE_P
:
7178 return "P (Packed decimal string)";
7179 case DSC__K_DTYPE_ZI
:
7180 return "ZI (Sequence of instructions)";
7181 case DSC__K_DTYPE_ZEM
:
7182 return "ZEM (Procedure entry mask)";
7183 case DSC__K_DTYPE_DSC
:
7184 return "DSC (Descriptor, used for arrays of dyn strings)";
7185 case DSC__K_DTYPE_OU
:
7186 return "OU (Octaword logical)";
7187 case DSC__K_DTYPE_O
:
7188 return "O (Octaword integer)";
7189 case DSC__K_DTYPE_G
:
7190 return "G (Double precision G floating, 64 bit)";
7191 case DSC__K_DTYPE_H
:
7192 return "H (Quadruple precision floating, 128 bit)";
7193 case DSC__K_DTYPE_GC
:
7194 return "GC (Double precision complex, G floating)";
7195 case DSC__K_DTYPE_HC
:
7196 return "HC (Quadruple precision complex, H floating)";
7197 case DSC__K_DTYPE_CIT
:
7198 return "CIT (COBOL intermediate temporary)";
7199 case DSC__K_DTYPE_BPV
:
7200 return "BPV (Bound Procedure Value)";
7201 case DSC__K_DTYPE_BLV
:
7202 return "BLV (Bound Label Value)";
7203 case DSC__K_DTYPE_VU
:
7204 return "VU (Bit Unaligned)";
7205 case DSC__K_DTYPE_ADT
:
7206 return "ADT (Absolute Date-Time)";
7207 case DSC__K_DTYPE_VT
:
7208 return "VT (Varying Text)";
7209 case DSC__K_DTYPE_T2
:
7210 return "T2 (16-bit char)";
7211 case DSC__K_DTYPE_VT2
:
7212 return "VT2 (16-bit varying char)";
7214 return "?? (unknown)";
7219 evax_bfd_print_desc (const unsigned char *buf
, unsigned int bufsize
,
7220 int indent
, FILE *file
)
7225 unsigned char bclass
= buf
[3];
7226 unsigned char dtype
= buf
[2];
7227 unsigned int len
= (unsigned)bfd_getl16 (buf
);
7228 unsigned int pointer
= (unsigned)bfd_getl32 (buf
+ 4);
7230 evax_bfd_print_indent (indent
, file
);
7232 if (len
== 1 && pointer
== 0xffffffffUL
)
7235 fprintf (file
, _("64 bits *unhandled*\n"));
7239 /* xgettext:c-format */
7240 fprintf (file
, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
7241 bclass
, dtype
, len
, pointer
);
7244 case DSC__K_CLASS_NCA
:
7246 const struct vms_dsc_nca
*dsc
= (const void *)buf
;
7248 const unsigned char *b
;
7250 evax_bfd_print_indent (indent
, file
);
7251 fprintf (file
, _("non-contiguous array of %s\n"),
7252 evax_bfd_get_dsc_name (dsc
->dtype
));
7253 if (bufsize
>= sizeof (*dsc
))
7255 evax_bfd_print_indent (indent
+ 1, file
);
7257 /* xgettext:c-format */
7258 _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
7259 dsc
->dimct
, dsc
->aflags
, dsc
->digits
, dsc
->scale
);
7260 evax_bfd_print_indent (indent
+ 1, file
);
7262 /* xgettext:c-format */
7263 _("arsize: %u, a0: 0x%08x\n"),
7264 (unsigned) bfd_getl32 (dsc
->arsize
),
7265 (unsigned) bfd_getl32 (dsc
->a0
));
7266 evax_bfd_print_indent (indent
+ 1, file
);
7267 fprintf (file
, _("Strides:\n"));
7268 b
= buf
+ sizeof (*dsc
);
7269 bufsize
-= sizeof (*dsc
);
7270 for (i
= 0; i
< dsc
->dimct
; i
++)
7274 evax_bfd_print_indent (indent
+ 2, file
);
7275 fprintf (file
, "[%u]: %u\n", i
+ 1,
7276 (unsigned) bfd_getl32 (b
));
7280 evax_bfd_print_indent (indent
+ 1, file
);
7281 fprintf (file
, _("Bounds:\n"));
7282 for (i
= 0; i
< dsc
->dimct
; i
++)
7286 evax_bfd_print_indent (indent
+ 2, file
);
7287 /* xgettext:c-format */
7288 fprintf (file
, _("[%u]: Lower: %u, upper: %u\n"), i
+ 1,
7289 (unsigned) bfd_getl32 (b
+ 0),
7290 (unsigned) bfd_getl32 (b
+ 4));
7297 case DSC__K_CLASS_UBS
:
7299 const struct vms_dsc_ubs
*ubs
= (const void *)buf
;
7301 evax_bfd_print_indent (indent
, file
);
7302 fprintf (file
, _("unaligned bit-string of %s\n"),
7303 evax_bfd_get_dsc_name (ubs
->dtype
));
7304 if (bufsize
>= sizeof (*ubs
))
7306 evax_bfd_print_indent (indent
+ 1, file
);
7308 /* xgettext:c-format */
7309 _("base: %u, pos: %u\n"),
7310 (unsigned) bfd_getl32 (ubs
->base
),
7311 (unsigned) bfd_getl32 (ubs
->pos
));
7316 fprintf (file
, _("*unhandled*\n"));
7323 evax_bfd_print_valspec (const unsigned char *buf
, unsigned int bufsize
,
7324 int indent
, FILE *file
)
7329 unsigned int vflags
= buf
[0];
7330 unsigned int value
= (unsigned) bfd_getl32 (buf
+ 1);
7331 unsigned int len
= 5;
7333 evax_bfd_print_indent (indent
, file
);
7334 /* xgettext:c-format */
7335 fprintf (file
, _("vflags: 0x%02x, value: 0x%08x "), vflags
, value
);
7341 case DST__K_VFLAGS_NOVAL
:
7342 fprintf (file
, _("(no value)\n"));
7344 case DST__K_VFLAGS_NOTACTIVE
:
7345 fprintf (file
, _("(not active)\n"));
7347 case DST__K_VFLAGS_UNALLOC
:
7348 fprintf (file
, _("(not allocated)\n"));
7350 case DST__K_VFLAGS_DSC
:
7351 fprintf (file
, _("(descriptor)\n"));
7352 if (value
<= bufsize
)
7353 evax_bfd_print_desc (buf
+ value
, bufsize
- value
, indent
+ 1, file
);
7355 case DST__K_VFLAGS_TVS
:
7356 fprintf (file
, _("(trailing value)\n"));
7358 case DST__K_VS_FOLLOWS
:
7359 fprintf (file
, _("(value spec follows)\n"));
7361 case DST__K_VFLAGS_BITOFFS
:
7362 fprintf (file
, _("(at bit offset %u)\n"), value
);
7365 /* xgettext:c-format */
7366 fprintf (file
, _("(reg: %u, disp: %u, indir: %u, kind: "),
7367 (vflags
& DST__K_REGNUM_MASK
) >> DST__K_REGNUM_SHIFT
,
7368 vflags
& DST__K_DISP
? 1 : 0,
7369 vflags
& DST__K_INDIR
? 1 : 0);
7370 switch (vflags
& DST__K_VALKIND_MASK
)
7372 case DST__K_VALKIND_LITERAL
:
7373 fputs (_("literal"), file
);
7375 case DST__K_VALKIND_ADDR
:
7376 fputs (_("address"), file
);
7378 case DST__K_VALKIND_DESC
:
7379 fputs (_("desc"), file
);
7381 case DST__K_VALKIND_REG
:
7382 fputs (_("reg"), file
);
7385 fputs (")\n", file
);
7392 evax_bfd_print_typspec (const unsigned char *buf
, unsigned int bufsize
,
7393 int indent
, FILE *file
)
7398 unsigned char kind
= buf
[2];
7399 unsigned int len
= (unsigned) bfd_getl16 (buf
);
7401 evax_bfd_print_indent (indent
, file
);
7402 /* xgettext:c-format */
7403 fprintf (file
, _("len: %2u, kind: %2u "), len
, kind
);
7408 case DST__K_TS_ATOM
:
7409 /* xgettext:c-format */
7411 fprintf (file
, _("atomic, type=0x%02x %s\n"),
7412 buf
[0], evax_bfd_get_dsc_name (buf
[0]));
7416 fprintf (file
, _("indirect, defined at 0x%08x\n"),
7417 (unsigned) bfd_getl32 (buf
));
7419 case DST__K_TS_TPTR
:
7420 fprintf (file
, _("typed pointer\n"));
7421 evax_bfd_print_typspec (buf
, bufsize
, indent
+ 1, file
);
7424 fprintf (file
, _("pointer\n"));
7426 case DST__K_TS_ARRAY
:
7428 const unsigned char *vs
;
7429 unsigned int vs_len
;
7430 unsigned int vec_len
;
7435 fprintf (file
, _("array, dim: %u, bitmap: "), buf
[0]);
7437 vec_len
= (buf
[0] + 1 + 7) / 8;
7438 for (i
= 0; i
< vec_len
; i
++)
7442 fprintf (file
, " %02x", buf
[i
+ 1]);
7448 vs
= buf
+ 1 + vec_len
;
7449 evax_bfd_print_indent (indent
, file
);
7450 fprintf (file
, _("array descriptor:\n"));
7451 vs_len
= evax_bfd_print_valspec (vs
, bufsize
, indent
+ 1, file
);
7453 if (bufsize
> vs_len
)
7456 for (i
= 0; i
< buf
[0] + 1U; i
++)
7457 if (buf
[1 + i
/ 8] & (1 << (i
% 8)))
7459 evax_bfd_print_indent (indent
, file
);
7461 fprintf (file
, _("type spec for element:\n"));
7463 fprintf (file
, _("type spec for subscript %u:\n"), i
);
7464 evax_bfd_print_typspec (vs
, bufsize
, indent
+ 1, file
);
7467 vs_len
= bfd_getl16 (vs
);
7468 if (bufsize
<= vs_len
)
7477 fprintf (file
, _("*unhandled*\n"));
7482 evax_bfd_print_dst (struct bfd
*abfd
, unsigned int dst_size
, FILE *file
)
7484 unsigned int off
= 0;
7485 unsigned int pc
= 0;
7486 unsigned int line
= 0;
7488 fprintf (file
, _("Debug symbol table:\n"));
7490 while (dst_size
> 0)
7492 struct vms_dst_header dsth
;
7497 if (bfd_read (&dsth
, sizeof (dsth
), abfd
) != sizeof (dsth
))
7499 fprintf (file
, _("cannot read DST header\n"));
7502 len
= bfd_getl16 (dsth
.length
);
7503 type
= bfd_getl16 (dsth
.type
);
7504 /* xgettext:c-format */
7505 fprintf (file
, _(" type: %3u, len: %3u (at 0x%08x): "),
7509 if (len
< sizeof (dsth
))
7516 len
-= sizeof (dsth
);
7521 buf
= _bfd_malloc_and_read (abfd
, len
, len
);
7524 fprintf (file
, _("cannot read DST symbol\n"));
7530 case DSC__K_DTYPE_V
:
7531 case DSC__K_DTYPE_BU
:
7532 case DSC__K_DTYPE_WU
:
7533 case DSC__K_DTYPE_LU
:
7534 case DSC__K_DTYPE_QU
:
7535 case DSC__K_DTYPE_B
:
7536 case DSC__K_DTYPE_W
:
7537 case DSC__K_DTYPE_L
:
7538 case DSC__K_DTYPE_Q
:
7539 case DSC__K_DTYPE_F
:
7540 case DSC__K_DTYPE_D
:
7541 case DSC__K_DTYPE_FC
:
7542 case DSC__K_DTYPE_DC
:
7543 case DSC__K_DTYPE_T
:
7544 case DSC__K_DTYPE_NU
:
7545 case DSC__K_DTYPE_NL
:
7546 case DSC__K_DTYPE_NLO
:
7547 case DSC__K_DTYPE_NR
:
7548 case DSC__K_DTYPE_NRO
:
7549 case DSC__K_DTYPE_NZ
:
7550 case DSC__K_DTYPE_P
:
7551 case DSC__K_DTYPE_ZI
:
7552 case DSC__K_DTYPE_ZEM
:
7553 case DSC__K_DTYPE_DSC
:
7554 case DSC__K_DTYPE_OU
:
7555 case DSC__K_DTYPE_O
:
7556 case DSC__K_DTYPE_G
:
7557 case DSC__K_DTYPE_H
:
7558 case DSC__K_DTYPE_GC
:
7559 case DSC__K_DTYPE_HC
:
7560 case DSC__K_DTYPE_CIT
:
7561 case DSC__K_DTYPE_BPV
:
7562 case DSC__K_DTYPE_BLV
:
7563 case DSC__K_DTYPE_VU
:
7564 case DSC__K_DTYPE_ADT
:
7565 case DSC__K_DTYPE_VT
:
7566 case DSC__K_DTYPE_T2
:
7567 case DSC__K_DTYPE_VT2
:
7568 fprintf (file
, _("standard data: %s\n"),
7569 evax_bfd_get_dsc_name (type
));
7570 evax_bfd_print_valspec (buf
, len
, 4, file
);
7572 fprintf (file
, _(" name: %.*s\n"),
7573 buf
[5] > len
- 6 ? len
- 6 : buf
[5], buf
+ 6);
7577 struct vms_dst_modbeg
*dst
= (void *)buf
;
7578 unsigned char *name
= buf
+ sizeof (*dst
);
7580 fprintf (file
, _("modbeg\n"));
7581 if (len
< sizeof (*dst
))
7583 /* xgettext:c-format */
7584 fprintf (file
, _(" flags: %d, language: %u, "
7585 "major: %u, minor: %u\n"),
7587 (unsigned)bfd_getl32 (dst
->language
),
7588 (unsigned)bfd_getl16 (dst
->major
),
7589 (unsigned)bfd_getl16 (dst
->minor
));
7590 len
-= sizeof (*dst
);
7594 fprintf (file
, _(" module name: %.*s\n"),
7595 name
[0] > nlen
? nlen
: name
[0], name
+ 1);
7599 name
+= name
[0] + 1;
7601 fprintf (file
, _(" compiler : %.*s\n"),
7602 name
[0] > nlen
? nlen
: name
[0], name
+ 1);
7608 fprintf (file
, _("modend\n"));
7612 struct vms_dst_rtnbeg
*dst
= (void *)buf
;
7613 unsigned char *name
= buf
+ sizeof (*dst
);
7615 fputs (_("rtnbeg\n"), file
);
7616 if (len
>= sizeof (*dst
))
7618 /* xgettext:c-format */
7619 fprintf (file
, _(" flags: %u, address: 0x%08x, "
7620 "pd-address: 0x%08x\n"),
7622 (unsigned) bfd_getl32 (dst
->address
),
7623 (unsigned) bfd_getl32 (dst
->pd_address
));
7624 len
-= sizeof (*dst
);
7628 fprintf (file
, _(" routine name: %.*s\n"),
7629 name
[0] > nlen
? nlen
: name
[0], name
+ 1);
7636 struct vms_dst_rtnend
*dst
= (void *)buf
;
7638 if (len
>= sizeof (*dst
))
7639 fprintf (file
, _("rtnend: size 0x%08x\n"),
7640 (unsigned) bfd_getl32 (dst
->size
));
7645 struct vms_dst_prolog
*dst
= (void *)buf
;
7647 if (len
>= sizeof (*dst
))
7648 /* xgettext:c-format */
7649 fprintf (file
, _("prolog: bkpt address 0x%08x\n"),
7650 (unsigned) bfd_getl32 (dst
->bkpt_addr
));
7655 struct vms_dst_epilog
*dst
= (void *)buf
;
7657 if (len
>= sizeof (*dst
))
7658 /* xgettext:c-format */
7659 fprintf (file
, _("epilog: flags: %u, count: %u\n"),
7660 dst
->flags
, (unsigned) bfd_getl32 (dst
->count
));
7665 struct vms_dst_blkbeg
*dst
= (void *)buf
;
7666 unsigned char *name
= buf
+ sizeof (*dst
);
7668 if (len
> sizeof (*dst
))
7671 len
-= sizeof (*dst
);
7673 /* xgettext:c-format */
7674 fprintf (file
, _("blkbeg: address: 0x%08x, name: %.*s\n"),
7675 (unsigned) bfd_getl32 (dst
->address
),
7676 name
[0] > nlen
? nlen
: name
[0], name
+ 1);
7682 struct vms_dst_blkend
*dst
= (void *)buf
;
7684 if (len
>= sizeof (*dst
))
7685 /* xgettext:c-format */
7686 fprintf (file
, _("blkend: size: 0x%08x\n"),
7687 (unsigned) bfd_getl32 (dst
->size
));
7690 case DST__K_TYPSPEC
:
7692 fprintf (file
, _("typspec (len: %u)\n"), len
);
7696 fprintf (file
, _(" name: %.*s\n"),
7697 buf
[0] > nlen
? nlen
: buf
[0], buf
+ 1);
7699 evax_bfd_print_typspec (buf
+ 1 + buf
[0], len
- (1 + buf
[0]),
7708 fprintf (file
, _("septyp, name: %.*s\n"),
7709 buf
[5] > len
- 6 ? len
- 6 : buf
[5], buf
+ 6);
7710 evax_bfd_print_valspec (buf
, len
, 4, file
);
7716 struct vms_dst_recbeg
*recbeg
= (void *)buf
;
7718 if (len
> sizeof (*recbeg
))
7720 unsigned char *name
= buf
+ sizeof (*recbeg
);
7721 int nlen
= len
- sizeof (*recbeg
) - 1;
7725 fprintf (file
, _("recbeg: name: %.*s\n"), nlen
, name
+ 1);
7727 evax_bfd_print_valspec (buf
, len
, 4, file
);
7729 len
-= sizeof (*recbeg
) + 1 + nlen
;
7731 fprintf (file
, _(" len: %u bits\n"),
7732 (unsigned) bfd_getl32 (name
+ 1 + nlen
));
7737 fprintf (file
, _("recend\n"));
7739 case DST__K_ENUMBEG
:
7741 /* xgettext:c-format */
7742 fprintf (file
, _("enumbeg, len: %u, name: %.*s\n"),
7743 buf
[0], buf
[1] > len
- 2 ? len
- 2 : buf
[1], buf
+ 2);
7745 case DST__K_ENUMELT
:
7748 fprintf (file
, _("enumelt, name: %.*s\n"),
7749 buf
[5] > len
- 6 ? len
- 6 : buf
[5], buf
+ 6);
7750 evax_bfd_print_valspec (buf
, len
, 4, file
);
7753 case DST__K_ENUMEND
:
7754 fprintf (file
, _("enumend\n"));
7758 struct vms_dst_label
*lab
= (void *)buf
;
7759 if (len
>= sizeof (*lab
))
7761 fprintf (file
, _("label, name: %.*s\n"),
7762 lab
->name
[0] > len
- 1 ? len
- 1 : lab
->name
[0],
7764 fprintf (file
, _(" address: 0x%08x\n"),
7765 (unsigned) bfd_getl32 (lab
->value
));
7769 case DST__K_DIS_RANGE
:
7772 unsigned int cnt
= bfd_getl32 (buf
);
7773 unsigned char *rng
= buf
+ 4;
7776 fprintf (file
, _("discontiguous range (nbr: %u)\n"), cnt
);
7778 for (i
= 0; i
< cnt
; i
++, rng
+= 8)
7782 /* xgettext:c-format */
7783 fprintf (file
, _(" address: 0x%08x, size: %u\n"),
7784 (unsigned) bfd_getl32 (rng
),
7785 (unsigned) bfd_getl32 (rng
+ 4));
7790 case DST__K_LINE_NUM
:
7792 unsigned char *buf_orig
= buf
;
7794 fprintf (file
, _("line num (len: %u)\n"), len
);
7809 case DST__K_DELTA_PC_W
:
7812 val
= bfd_getl16 (buf
);
7813 fprintf (file
, _("delta_pc_w %u\n"), val
);
7818 case DST__K_INCR_LINUM
:
7822 fprintf (file
, _("incr_linum(b): +%u\n"), val
);
7826 case DST__K_INCR_LINUM_W
:
7829 val
= bfd_getl16 (buf
);
7830 fprintf (file
, _("incr_linum_w: +%u\n"), val
);
7834 case DST__K_INCR_LINUM_L
:
7837 val
= bfd_getl32 (buf
);
7838 fprintf (file
, _("incr_linum_l: +%u\n"), val
);
7842 case DST__K_SET_LINUM
:
7845 line
= bfd_getl16 (buf
);
7846 fprintf (file
, _("set_line_num(w) %u\n"), line
);
7849 case DST__K_SET_LINUM_B
:
7853 fprintf (file
, _("set_line_num_b %u\n"), line
);
7856 case DST__K_SET_LINUM_L
:
7859 line
= bfd_getl32 (buf
);
7860 fprintf (file
, _("set_line_num_l %u\n"), line
);
7863 case DST__K_SET_ABS_PC
:
7866 pc
= bfd_getl32 (buf
);
7867 fprintf (file
, _("set_abs_pc: 0x%08x\n"), pc
);
7870 case DST__K_DELTA_PC_L
:
7873 fprintf (file
, _("delta_pc_l: +0x%08x\n"),
7874 (unsigned) bfd_getl32 (buf
));
7880 fprintf (file
, _("term(b): 0x%02x"), *buf
);
7882 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7888 val
= bfd_getl16 (buf
);
7889 fprintf (file
, _("term_w: 0x%04x"), val
);
7891 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7897 fprintf (file
, _("delta pc +%-4d"), -cmd
);
7898 line
++; /* FIXME: curr increment. */
7900 /* xgettext:c-format */
7901 fprintf (file
, _(" pc: 0x%08x line: %5u\n"),
7906 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
7919 unsigned char *buf_orig
= buf
;
7921 fprintf (file
, _("source (len: %u)\n"), len
);
7931 case DST__K_SRC_DECLFILE
:
7933 struct vms_dst_src_decl_src
*src
= (void *) buf
;
7934 unsigned char *name
;
7937 if (len
< sizeof (*src
))
7939 /* xgettext:c-format */
7940 fprintf (file
, _(" declfile: len: %u, flags: %u, "
7942 src
->length
, src
->flags
,
7943 (unsigned)bfd_getl16 (src
->fileid
));
7944 /* xgettext:c-format */
7945 fprintf (file
, _(" rms: cdt: 0x%08x %08x, "
7946 "ebk: 0x%08x, ffb: 0x%04x, "
7948 (unsigned)bfd_getl32 (src
->rms_cdt
+ 4),
7949 (unsigned)bfd_getl32 (src
->rms_cdt
+ 0),
7950 (unsigned)bfd_getl32 (src
->rms_ebk
),
7951 (unsigned)bfd_getl16 (src
->rms_ffb
),
7953 if (src
->length
> len
|| src
->length
<= sizeof (*src
))
7955 nlen
= src
->length
- sizeof (*src
) - 1;
7956 name
= buf
+ sizeof (*src
);
7957 fprintf (file
, _(" filename : %.*s\n"),
7958 name
[0] > nlen
? nlen
: name
[0], name
+ 1);
7959 if (name
[0] >= nlen
)
7961 nlen
-= name
[0] + 1;
7962 name
+= name
[0] + 1;
7963 fprintf (file
, _(" module name: %.*s\n"),
7964 name
[0] > nlen
? nlen
: name
[0], name
+ 1);
7967 cmdlen
= src
->length
;
7970 case DST__K_SRC_SETFILE
:
7973 fprintf (file
, _(" setfile %u\n"),
7974 (unsigned) bfd_getl16 (buf
));
7977 case DST__K_SRC_SETREC_W
:
7980 fprintf (file
, _(" setrec %u\n"),
7981 (unsigned) bfd_getl16 (buf
));
7984 case DST__K_SRC_SETREC_L
:
7987 fprintf (file
, _(" setrec %u\n"),
7988 (unsigned) bfd_getl32 (buf
));
7991 case DST__K_SRC_SETLNUM_W
:
7994 fprintf (file
, _(" setlnum %u\n"),
7995 (unsigned) bfd_getl16 (buf
));
7998 case DST__K_SRC_SETLNUM_L
:
8001 fprintf (file
, _(" setlnum %u\n"),
8002 (unsigned) bfd_getl32 (buf
));
8005 case DST__K_SRC_DEFLINES_W
:
8008 fprintf (file
, _(" deflines %u\n"),
8009 (unsigned) bfd_getl16 (buf
));
8012 case DST__K_SRC_DEFLINES_B
:
8015 fprintf (file
, _(" deflines %u\n"), *buf
);
8018 case DST__K_SRC_FORMFEED
:
8019 fprintf (file
, _(" formfeed\n"));
8023 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
8035 fprintf (file
, _("*unhandled* dst type %u\n"), type
);
8043 evax_bfd_print_image (bfd
*abfd
, FILE *file
)
8045 struct vms_eihd eihd
;
8048 unsigned int eiha_off
;
8049 unsigned int eihi_off
;
8050 unsigned int eihs_off
;
8051 unsigned int eisd_off
;
8052 unsigned int eihef_off
= 0;
8053 unsigned int eihnp_off
= 0;
8054 unsigned int dmt_vbn
= 0;
8055 unsigned int dmt_size
= 0;
8056 unsigned int dst_vbn
= 0;
8057 unsigned int dst_size
= 0;
8058 unsigned int gst_vbn
= 0;
8059 unsigned int gst_size
= 0;
8060 unsigned int eiaf_vbn
= 0;
8061 unsigned int eiaf_size
= 0;
8062 unsigned int eihvn_off
;
8064 if (bfd_seek (abfd
, 0, SEEK_SET
)
8065 || bfd_read (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
8067 fprintf (file
, _("cannot read EIHD\n"));
8070 /* xgettext:c-format */
8071 fprintf (file
, _("EIHD: (size: %u, nbr blocks: %u)\n"),
8072 (unsigned)bfd_getl32 (eihd
.size
),
8073 (unsigned)bfd_getl32 (eihd
.hdrblkcnt
));
8074 /* xgettext:c-format */
8075 fprintf (file
, _(" majorid: %u, minorid: %u\n"),
8076 (unsigned)bfd_getl32 (eihd
.majorid
),
8077 (unsigned)bfd_getl32 (eihd
.minorid
));
8079 val
= (unsigned)bfd_getl32 (eihd
.imgtype
);
8083 name
= _("executable");
8086 name
= _("linkable image");
8089 name
= _("unknown");
8092 /* xgettext:c-format */
8093 fprintf (file
, _(" image type: %u (%s)"), val
, name
);
8095 val
= (unsigned)bfd_getl32 (eihd
.subtype
);
8098 case EIHD__C_NATIVE
:
8105 name
= _("unknown");
8108 /* xgettext:c-format */
8109 fprintf (file
, _(", subtype: %u (%s)\n"), val
, name
);
8111 eisd_off
= bfd_getl32 (eihd
.isdoff
);
8112 eiha_off
= bfd_getl32 (eihd
.activoff
);
8113 eihi_off
= bfd_getl32 (eihd
.imgidoff
);
8114 eihs_off
= bfd_getl32 (eihd
.symdbgoff
);
8115 /* xgettext:c-format */
8116 fprintf (file
, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
8117 "imgid: %u, patch: %u\n"),
8118 eisd_off
, eiha_off
, eihs_off
, eihi_off
,
8119 (unsigned)bfd_getl32 (eihd
.patchoff
));
8120 fprintf (file
, _(" fixup info rva: "));
8121 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.iafva
));
8122 fprintf (file
, _(", symbol vector rva: "));
8123 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.symvva
));
8124 eihvn_off
= bfd_getl32 (eihd
.version_array_off
);
8125 fprintf (file
, _("\n"
8126 " version array off: %u\n"),
8129 /* xgettext:c-format */
8130 _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
8131 (unsigned)bfd_getl32 (eihd
.imgiocnt
),
8132 (unsigned)bfd_getl32 (eihd
.iochancnt
),
8133 (unsigned)bfd_getl32 (eihd
.privreqs
+ 4),
8134 (unsigned)bfd_getl32 (eihd
.privreqs
+ 0));
8135 val
= (unsigned)bfd_getl32 (eihd
.lnkflags
);
8136 fprintf (file
, _(" linker flags: %08x:"), val
);
8137 if (val
& EIHD__M_LNKDEBUG
)
8138 fprintf (file
, " LNKDEBUG");
8139 if (val
& EIHD__M_LNKNOTFR
)
8140 fprintf (file
, " LNKNOTFR");
8141 if (val
& EIHD__M_NOP0BUFS
)
8142 fprintf (file
, " NOP0BUFS");
8143 if (val
& EIHD__M_PICIMG
)
8144 fprintf (file
, " PICIMG");
8145 if (val
& EIHD__M_P0IMAGE
)
8146 fprintf (file
, " P0IMAGE");
8147 if (val
& EIHD__M_DBGDMT
)
8148 fprintf (file
, " DBGDMT");
8149 if (val
& EIHD__M_INISHR
)
8150 fprintf (file
, " INISHR");
8151 if (val
& EIHD__M_XLATED
)
8152 fprintf (file
, " XLATED");
8153 if (val
& EIHD__M_BIND_CODE_SEC
)
8154 fprintf (file
, " BIND_CODE_SEC");
8155 if (val
& EIHD__M_BIND_DATA_SEC
)
8156 fprintf (file
, " BIND_DATA_SEC");
8157 if (val
& EIHD__M_MKTHREADS
)
8158 fprintf (file
, " MKTHREADS");
8159 if (val
& EIHD__M_UPCALLS
)
8160 fprintf (file
, " UPCALLS");
8161 if (val
& EIHD__M_OMV_READY
)
8162 fprintf (file
, " OMV_READY");
8163 if (val
& EIHD__M_EXT_BIND_SECT
)
8164 fprintf (file
, " EXT_BIND_SECT");
8165 fprintf (file
, "\n");
8166 /* xgettext:c-format */
8167 fprintf (file
, _(" ident: 0x%08x, sysver: 0x%08x, "
8168 "match ctrl: %u, symvect_size: %u\n"),
8169 (unsigned)bfd_getl32 (eihd
.ident
),
8170 (unsigned)bfd_getl32 (eihd
.sysver
),
8172 (unsigned)bfd_getl32 (eihd
.symvect_size
));
8173 fprintf (file
, _(" BPAGE: %u"),
8174 (unsigned)bfd_getl32 (eihd
.virt_mem_block_size
));
8175 if (val
& (EIHD__M_OMV_READY
| EIHD__M_EXT_BIND_SECT
))
8177 eihef_off
= bfd_getl32 (eihd
.ext_fixup_off
);
8178 eihnp_off
= bfd_getl32 (eihd
.noopt_psect_off
);
8179 /* xgettext:c-format */
8180 fprintf (file
, _(", ext fixup offset: %u, no_opt psect off: %u"),
8181 eihef_off
, eihnp_off
);
8183 fprintf (file
, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd
.alias
));
8187 struct vms_eihvn eihvn
;
8191 fprintf (file
, _("system version array information:\n"));
8192 if (bfd_seek (abfd
, eihvn_off
, SEEK_SET
)
8193 || bfd_read (&eihvn
, sizeof (eihvn
), abfd
) != sizeof (eihvn
))
8195 fprintf (file
, _("cannot read EIHVN header\n"));
8198 mask
= bfd_getl32 (eihvn
.subsystem_mask
);
8199 for (j
= 0; j
< 32; j
++)
8200 if (mask
& (1u << j
))
8202 struct vms_eihvn_subversion ver
;
8203 if (bfd_read (&ver
, sizeof (ver
), abfd
) != sizeof (ver
))
8205 fprintf (file
, _("cannot read EIHVN version\n"));
8208 fprintf (file
, _(" %02u "), j
);
8211 case EIHVN__BASE_IMAGE_BIT
:
8212 fputs (_("BASE_IMAGE "), file
);
8214 case EIHVN__MEMORY_MANAGEMENT_BIT
:
8215 fputs (_("MEMORY_MANAGEMENT"), file
);
8218 fputs (_("IO "), file
);
8220 case EIHVN__FILES_VOLUMES_BIT
:
8221 fputs (_("FILES_VOLUMES "), file
);
8223 case EIHVN__PROCESS_SCHED_BIT
:
8224 fputs (_("PROCESS_SCHED "), file
);
8226 case EIHVN__SYSGEN_BIT
:
8227 fputs (_("SYSGEN "), file
);
8229 case EIHVN__CLUSTERS_LOCKMGR_BIT
:
8230 fputs (_("CLUSTERS_LOCKMGR "), file
);
8232 case EIHVN__LOGICAL_NAMES_BIT
:
8233 fputs (_("LOGICAL_NAMES "), file
);
8235 case EIHVN__SECURITY_BIT
:
8236 fputs (_("SECURITY "), file
);
8238 case EIHVN__IMAGE_ACTIVATOR_BIT
:
8239 fputs (_("IMAGE_ACTIVATOR "), file
);
8241 case EIHVN__NETWORKS_BIT
:
8242 fputs (_("NETWORKS "), file
);
8244 case EIHVN__COUNTERS_BIT
:
8245 fputs (_("COUNTERS "), file
);
8247 case EIHVN__STABLE_BIT
:
8248 fputs (_("STABLE "), file
);
8250 case EIHVN__MISC_BIT
:
8251 fputs (_("MISC "), file
);
8253 case EIHVN__CPU_BIT
:
8254 fputs (_("CPU "), file
);
8256 case EIHVN__VOLATILE_BIT
:
8257 fputs (_("VOLATILE "), file
);
8259 case EIHVN__SHELL_BIT
:
8260 fputs (_("SHELL "), file
);
8262 case EIHVN__POSIX_BIT
:
8263 fputs (_("POSIX "), file
);
8265 case EIHVN__MULTI_PROCESSING_BIT
:
8266 fputs (_("MULTI_PROCESSING "), file
);
8268 case EIHVN__GALAXY_BIT
:
8269 fputs (_("GALAXY "), file
);
8272 fputs (_("*unknown* "), file
);
8275 fprintf (file
, ": %u.%u\n",
8276 (unsigned)bfd_getl16 (ver
.major
),
8277 (unsigned)bfd_getl16 (ver
.minor
));
8283 struct vms_eiha eiha
;
8285 if (bfd_seek (abfd
, eiha_off
, SEEK_SET
)
8286 || bfd_read (&eiha
, sizeof (eiha
), abfd
) != sizeof (eiha
))
8288 fprintf (file
, _("cannot read EIHA\n"));
8291 fprintf (file
, _("Image activation: (size=%u)\n"),
8292 (unsigned)bfd_getl32 (eiha
.size
));
8293 /* xgettext:c-format */
8294 fprintf (file
, _(" First address : 0x%08x 0x%08x\n"),
8295 (unsigned)bfd_getl32 (eiha
.tfradr1_h
),
8296 (unsigned)bfd_getl32 (eiha
.tfradr1
));
8297 /* xgettext:c-format */
8298 fprintf (file
, _(" Second address: 0x%08x 0x%08x\n"),
8299 (unsigned)bfd_getl32 (eiha
.tfradr2_h
),
8300 (unsigned)bfd_getl32 (eiha
.tfradr2
));
8301 /* xgettext:c-format */
8302 fprintf (file
, _(" Third address : 0x%08x 0x%08x\n"),
8303 (unsigned)bfd_getl32 (eiha
.tfradr3_h
),
8304 (unsigned)bfd_getl32 (eiha
.tfradr3
));
8305 /* xgettext:c-format */
8306 fprintf (file
, _(" Fourth address: 0x%08x 0x%08x\n"),
8307 (unsigned)bfd_getl32 (eiha
.tfradr4_h
),
8308 (unsigned)bfd_getl32 (eiha
.tfradr4
));
8309 /* xgettext:c-format */
8310 fprintf (file
, _(" Shared image : 0x%08x 0x%08x\n"),
8311 (unsigned)bfd_getl32 (eiha
.inishr_h
),
8312 (unsigned)bfd_getl32 (eiha
.inishr
));
8316 struct vms_eihi eihi
;
8318 if (bfd_seek (abfd
, eihi_off
, SEEK_SET
)
8319 || bfd_read (&eihi
, sizeof (eihi
), abfd
) != sizeof (eihi
))
8321 fprintf (file
, _("cannot read EIHI\n"));
8324 /* xgettext:c-format */
8325 fprintf (file
, _("Image identification: (major: %u, minor: %u)\n"),
8326 (unsigned) bfd_getl32 (eihi
.majorid
),
8327 (unsigned) bfd_getl32 (eihi
.minorid
));
8328 unsigned int nlen
= eihi
.imgnam
[0];
8329 if (nlen
> sizeof (eihi
.imgnam
) - 1)
8330 nlen
= sizeof (eihi
.imgnam
) - 1;
8331 fprintf (file
, _(" image name : %.*s\n"), nlen
, eihi
.imgnam
+ 1);
8332 fprintf (file
, _(" link time : %s\n"),
8333 vms_time_to_str (eihi
.linktime
));
8334 nlen
= eihi
.imgid
[0];
8335 if (nlen
> sizeof (eihi
.imgid
) - 1)
8336 nlen
= sizeof (eihi
.imgid
) - 1;
8337 fprintf (file
, _(" image ident : %.*s\n"), nlen
, eihi
.imgid
+ 1);
8338 nlen
= eihi
.linkid
[0];
8339 if (nlen
> sizeof (eihi
.linkid
) - 1)
8340 nlen
= sizeof (eihi
.linkid
) - 1;
8341 fprintf (file
, _(" linker ident : %.*s\n"), nlen
, eihi
.linkid
+ 1);
8342 nlen
= eihi
.imgbid
[0];
8343 if (nlen
> sizeof (eihi
.imgbid
) -1 )
8344 nlen
= sizeof (eihi
.imgbid
) - 1;
8345 fprintf (file
, _(" image build ident: %.*s\n"), nlen
, eihi
.imgbid
+ 1);
8349 struct vms_eihs eihs
;
8351 if (bfd_seek (abfd
, eihs_off
, SEEK_SET
)
8352 || bfd_read (&eihs
, sizeof (eihs
), abfd
) != sizeof (eihs
))
8354 fprintf (file
, _("cannot read EIHS\n"));
8357 /* xgettext:c-format */
8358 fprintf (file
, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
8359 (unsigned)bfd_getl32 (eihs
.majorid
),
8360 (unsigned)bfd_getl32 (eihs
.minorid
));
8361 dst_vbn
= bfd_getl32 (eihs
.dstvbn
);
8362 dst_size
= bfd_getl32 (eihs
.dstsize
);
8363 /* xgettext:c-format */
8364 fprintf (file
, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
8365 dst_vbn
, dst_size
, dst_size
);
8366 gst_vbn
= bfd_getl32 (eihs
.gstvbn
);
8367 gst_size
= bfd_getl32 (eihs
.gstsize
);
8368 /* xgettext:c-format */
8369 fprintf (file
, _(" global symbol table: vbn: %u, records: %u\n"),
8371 dmt_vbn
= bfd_getl32 (eihs
.dmtvbn
);
8372 dmt_size
= bfd_getl32 (eihs
.dmtsize
);
8373 /* xgettext:c-format */
8374 fprintf (file
, _(" debug module table : vbn: %u, size: %u\n"),
8377 while (eisd_off
!= 0)
8379 struct vms_eisd eisd
;
8384 if (bfd_seek (abfd
, eisd_off
, SEEK_SET
)
8385 || bfd_read (&eisd
, sizeof (eisd
), abfd
) != sizeof (eisd
))
8387 fprintf (file
, _("cannot read EISD\n"));
8390 len
= (unsigned)bfd_getl32 (eisd
.eisdsize
);
8391 if (len
!= (unsigned)-1)
8395 eisd_off
= (eisd_off
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
8397 /* xgettext:c-format */
8398 fprintf (file
, _("Image section descriptor: (major: %u, minor: %u, "
8399 "size: %u, offset: %u)\n"),
8400 (unsigned)bfd_getl32 (eisd
.majorid
),
8401 (unsigned)bfd_getl32 (eisd
.minorid
),
8405 /* xgettext:c-format */
8406 fprintf (file
, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
8407 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 4),
8408 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 0),
8409 (unsigned)bfd_getl32 (eisd
.secsize
));
8410 val
= (unsigned)bfd_getl32 (eisd
.flags
);
8411 fprintf (file
, _(" flags: 0x%04x"), val
);
8412 if (val
& EISD__M_GBL
)
8413 fprintf (file
, " GBL");
8414 if (val
& EISD__M_CRF
)
8415 fprintf (file
, " CRF");
8416 if (val
& EISD__M_DZRO
)
8417 fprintf (file
, " DZRO");
8418 if (val
& EISD__M_WRT
)
8419 fprintf (file
, " WRT");
8420 if (val
& EISD__M_INITALCODE
)
8421 fprintf (file
, " INITALCODE");
8422 if (val
& EISD__M_BASED
)
8423 fprintf (file
, " BASED");
8424 if (val
& EISD__M_FIXUPVEC
)
8425 fprintf (file
, " FIXUPVEC");
8426 if (val
& EISD__M_RESIDENT
)
8427 fprintf (file
, " RESIDENT");
8428 if (val
& EISD__M_VECTOR
)
8429 fprintf (file
, " VECTOR");
8430 if (val
& EISD__M_PROTECT
)
8431 fprintf (file
, " PROTECT");
8432 if (val
& EISD__M_LASTCLU
)
8433 fprintf (file
, " LASTCLU");
8434 if (val
& EISD__M_EXE
)
8435 fprintf (file
, " EXE");
8436 if (val
& EISD__M_NONSHRADR
)
8437 fprintf (file
, " NONSHRADR");
8438 if (val
& EISD__M_QUAD_LENGTH
)
8439 fprintf (file
, " QUAD_LENGTH");
8440 if (val
& EISD__M_ALLOC_64BIT
)
8441 fprintf (file
, " ALLOC_64BIT");
8442 fprintf (file
, "\n");
8443 if (val
& EISD__M_FIXUPVEC
)
8445 eiaf_vbn
= bfd_getl32 (eisd
.vbn
);
8446 eiaf_size
= bfd_getl32 (eisd
.secsize
);
8448 /* xgettext:c-format */
8449 fprintf (file
, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
8450 (unsigned)bfd_getl32 (eisd
.vbn
),
8451 eisd
.pfc
, eisd
.matchctl
, eisd
.type
);
8454 case EISD__K_NORMAL
:
8455 fputs (_("NORMAL"), file
);
8457 case EISD__K_SHRFXD
:
8458 fputs (_("SHRFXD"), file
);
8460 case EISD__K_PRVFXD
:
8461 fputs (_("PRVFXD"), file
);
8463 case EISD__K_SHRPIC
:
8464 fputs (_("SHRPIC"), file
);
8466 case EISD__K_PRVPIC
:
8467 fputs (_("PRVPIC"), file
);
8469 case EISD__K_USRSTACK
:
8470 fputs (_("USRSTACK"), file
);
8473 fputs (_("*unknown*"), file
);
8476 fputs (_(")\n"), file
);
8477 if (val
& EISD__M_GBL
)
8479 unsigned int nlen
= eisd
.gblnam
[0];
8480 if (nlen
> sizeof (eisd
.gblnam
) - 1)
8481 nlen
= sizeof (eisd
.gblnam
) - 1;
8482 /* xgettext:c-format */
8483 fprintf (file
, _(" ident: 0x%08x, name: %.*s\n"),
8484 (unsigned) bfd_getl32 (eisd
.ident
),
8485 nlen
, eisd
.gblnam
+ 1);
8492 if (bfd_seek (abfd
, (file_ptr
) (dmt_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
8494 fprintf (file
, _("cannot read DMT\n"));
8498 fprintf (file
, _("Debug module table:\n"));
8500 while (dmt_size
> 0)
8502 struct vms_dmt_header dmth
;
8505 if (bfd_read (&dmth
, sizeof (dmth
), abfd
) != sizeof (dmth
))
8507 fprintf (file
, _("cannot read DMT header\n"));
8510 count
= bfd_getl16 (dmth
.psect_count
);
8512 /* xgettext:c-format */
8513 _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
8514 (unsigned)bfd_getl32 (dmth
.modbeg
),
8515 (unsigned)bfd_getl32 (dmth
.size
), count
);
8516 dmt_size
-= sizeof (dmth
);
8519 struct vms_dmt_psect dmtp
;
8521 if (bfd_read (&dmtp
, sizeof (dmtp
), abfd
) != sizeof (dmtp
))
8523 fprintf (file
, _("cannot read DMT psect\n"));
8526 /* xgettext:c-format */
8527 fprintf (file
, _(" psect start: 0x%08x, length: %u\n"),
8528 (unsigned)bfd_getl32 (dmtp
.start
),
8529 (unsigned)bfd_getl32 (dmtp
.length
));
8531 dmt_size
-= sizeof (dmtp
);
8538 if (bfd_seek (abfd
, (file_ptr
) (dst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
8540 fprintf (file
, _("cannot read DST\n"));
8544 evax_bfd_print_dst (abfd
, dst_size
, file
);
8548 if (bfd_seek (abfd
, (file_ptr
) (gst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
8550 fprintf (file
, _("cannot read GST\n"));
8554 fprintf (file
, _("Global symbol table:\n"));
8555 evax_bfd_print_eobj (abfd
, file
);
8557 if (eiaf_vbn
!= 0 && eiaf_size
>= sizeof (struct vms_eiaf
))
8560 struct vms_eiaf
*eiaf
;
8561 unsigned int qrelfixoff
;
8562 unsigned int lrelfixoff
;
8563 unsigned int qdotadroff
;
8564 unsigned int ldotadroff
;
8565 unsigned int shrimgcnt
;
8566 unsigned int shlstoff
;
8567 unsigned int codeadroff
;
8568 unsigned int lpfixoff
;
8569 unsigned int chgprtoff
;
8570 file_ptr f_off
= (file_ptr
) (eiaf_vbn
- 1) * VMS_BLOCK_SIZE
;
8572 if (bfd_seek (abfd
, f_off
, SEEK_SET
) != 0
8573 || (buf
= _bfd_malloc_and_read (abfd
, eiaf_size
, eiaf_size
)) == NULL
)
8575 fprintf (file
, _("cannot read EIHA\n"));
8578 eiaf
= (struct vms_eiaf
*)buf
;
8580 /* xgettext:c-format */
8581 _("Image activator fixup: (major: %u, minor: %u)\n"),
8582 (unsigned)bfd_getl32 (eiaf
->majorid
),
8583 (unsigned)bfd_getl32 (eiaf
->minorid
));
8584 /* xgettext:c-format */
8585 fprintf (file
, _(" iaflink : 0x%08x %08x\n"),
8586 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 0),
8587 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 4));
8588 /* xgettext:c-format */
8589 fprintf (file
, _(" fixuplnk: 0x%08x %08x\n"),
8590 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 0),
8591 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 4));
8592 fprintf (file
, _(" size : %u\n"),
8593 (unsigned)bfd_getl32 (eiaf
->size
));
8594 fprintf (file
, _(" flags: 0x%08x\n"),
8595 (unsigned)bfd_getl32 (eiaf
->flags
));
8596 qrelfixoff
= bfd_getl32 (eiaf
->qrelfixoff
);
8597 lrelfixoff
= bfd_getl32 (eiaf
->lrelfixoff
);
8598 /* xgettext:c-format */
8599 fprintf (file
, _(" qrelfixoff: %5u, lrelfixoff: %5u\n"),
8600 qrelfixoff
, lrelfixoff
);
8601 qdotadroff
= bfd_getl32 (eiaf
->qdotadroff
);
8602 ldotadroff
= bfd_getl32 (eiaf
->ldotadroff
);
8603 /* xgettext:c-format */
8604 fprintf (file
, _(" qdotadroff: %5u, ldotadroff: %5u\n"),
8605 qdotadroff
, ldotadroff
);
8606 codeadroff
= bfd_getl32 (eiaf
->codeadroff
);
8607 lpfixoff
= bfd_getl32 (eiaf
->lpfixoff
);
8608 /* xgettext:c-format */
8609 fprintf (file
, _(" codeadroff: %5u, lpfixoff : %5u\n"),
8610 codeadroff
, lpfixoff
);
8611 chgprtoff
= bfd_getl32 (eiaf
->chgprtoff
);
8612 fprintf (file
, _(" chgprtoff : %5u\n"), chgprtoff
);
8613 shrimgcnt
= bfd_getl32 (eiaf
->shrimgcnt
);
8614 shlstoff
= bfd_getl32 (eiaf
->shlstoff
);
8615 /* xgettext:c-format */
8616 fprintf (file
, _(" shlstoff : %5u, shrimgcnt : %5u\n"),
8617 shlstoff
, shrimgcnt
);
8618 /* xgettext:c-format */
8619 fprintf (file
, _(" shlextra : %5u, permctx : %5u\n"),
8620 (unsigned)bfd_getl32 (eiaf
->shlextra
),
8621 (unsigned)bfd_getl32 (eiaf
->permctx
));
8622 fprintf (file
, _(" base_va : 0x%08x\n"),
8623 (unsigned)bfd_getl32 (eiaf
->base_va
));
8624 fprintf (file
, _(" lppsbfixoff: %5u\n"),
8625 (unsigned)bfd_getl32 (eiaf
->lppsbfixoff
));
8631 fprintf (file
, _(" Shareable images:\n"));
8633 j
< shrimgcnt
&& shlstoff
<= eiaf_size
- sizeof (struct vms_shl
);
8634 j
++, shlstoff
+= sizeof (struct vms_shl
))
8636 struct vms_shl
*shl
= (struct vms_shl
*) (buf
+ shlstoff
);
8637 unsigned int nlen
= shl
->imgnam
[0];
8638 if (nlen
> sizeof (shl
->imgnam
) - 1)
8639 nlen
= sizeof (shl
->imgnam
) - 1;
8641 /* xgettext:c-format */
8642 _(" %u: size: %u, flags: 0x%02x, name: %.*s\n"),
8643 j
, shl
->size
, shl
->flags
,
8644 nlen
, shl
->imgnam
+ 1);
8647 if (qrelfixoff
!= 0)
8649 fprintf (file
, _(" quad-word relocation fixups:\n"));
8650 evax_bfd_print_relocation_records (file
, buf
, eiaf_size
,
8653 if (lrelfixoff
!= 0)
8655 fprintf (file
, _(" long-word relocation fixups:\n"));
8656 evax_bfd_print_relocation_records (file
, buf
, eiaf_size
,
8659 if (qdotadroff
!= 0)
8661 fprintf (file
, _(" quad-word .address reference fixups:\n"));
8662 evax_bfd_print_address_fixups (file
, buf
, eiaf_size
, qdotadroff
);
8664 if (ldotadroff
!= 0)
8666 fprintf (file
, _(" long-word .address reference fixups:\n"));
8667 evax_bfd_print_address_fixups (file
, buf
, eiaf_size
, ldotadroff
);
8669 if (codeadroff
!= 0)
8671 fprintf (file
, _(" Code Address Reference Fixups:\n"));
8672 evax_bfd_print_reference_fixups (file
, buf
, eiaf_size
, codeadroff
);
8676 fprintf (file
, _(" Linkage Pairs Reference Fixups:\n"));
8677 evax_bfd_print_reference_fixups (file
, buf
, eiaf_size
, lpfixoff
);
8679 if (chgprtoff
&& chgprtoff
<= eiaf_size
- 4)
8681 unsigned int count
= (unsigned) bfd_getl32 (buf
+ chgprtoff
);
8684 fprintf (file
, _(" Change Protection (%u entries):\n"), count
);
8685 for (j
= 0, chgprtoff
+= 4;
8686 j
< count
&& chgprtoff
<= eiaf_size
- sizeof (struct vms_eicp
);
8687 j
++, chgprtoff
+= sizeof (struct vms_eicp
))
8689 struct vms_eicp
*eicp
= (struct vms_eicp
*) (buf
+ chgprtoff
);
8690 unsigned int prot
= bfd_getl32 (eicp
->newprt
);
8692 /* xgettext:c-format */
8693 _(" base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
8694 (unsigned) bfd_getl32 (eicp
->baseva
+ 4),
8695 (unsigned) bfd_getl32 (eicp
->baseva
+ 0),
8696 (unsigned) bfd_getl32 (eicp
->size
),
8697 (unsigned) bfd_getl32 (eicp
->newprt
));
8701 fprintf (file
, "NA");
8703 case PRT__C_RESERVED
:
8704 fprintf (file
, "RES");
8707 fprintf (file
, "KW");
8710 fprintf (file
, "KR");
8713 fprintf (file
, "UW");
8716 fprintf (file
, "EW");
8719 fprintf (file
, "ERKW");
8722 fprintf (file
, "ER");
8725 fprintf (file
, "SW");
8728 fprintf (file
, "SREW");
8731 fprintf (file
, "SRKW");
8734 fprintf (file
, "SR");
8737 fprintf (file
, "URSW");
8740 fprintf (file
, "UREW");
8743 fprintf (file
, "URKW");
8746 fprintf (file
, "UR");
8760 vms_bfd_print_private_bfd_data (bfd
*abfd
, void *ptr
)
8762 FILE *file
= (FILE *)ptr
;
8764 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
8765 evax_bfd_print_image (abfd
, file
);
8768 if (bfd_seek (abfd
, 0, SEEK_SET
))
8770 evax_bfd_print_eobj (abfd
, file
);
8777 /* Slurp ETIR/EDBG/ETBT VMS object records. */
8780 alpha_vms_read_sections_content (bfd
*abfd
, struct bfd_link_info
*info
)
8782 asection
*cur_section
;
8783 file_ptr cur_offset
;
8784 asection
*dst_section
;
8785 file_ptr dst_offset
;
8787 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
8793 dst_section
= PRIV (dst_section
);
8797 if (info
->strip
== strip_all
|| info
->strip
== strip_debugger
)
8799 /* Discard the DST section. */
8803 else if (dst_section
)
8805 dst_offset
= dst_section
->output_offset
;
8806 dst_section
= dst_section
->output_section
;
8815 type
= _bfd_vms_get_object_record (abfd
);
8818 vms_debug2 ((2, "next_record failed\n"));
8824 PRIV (image_section
) = cur_section
;
8825 PRIV (image_offset
) = cur_offset
;
8826 res
= _bfd_vms_slurp_etir (abfd
, info
);
8827 cur_section
= PRIV (image_section
);
8828 cur_offset
= PRIV (image_offset
);
8832 if (dst_section
== NULL
)
8834 PRIV (image_section
) = dst_section
;
8835 PRIV (image_offset
) = dst_offset
;
8836 res
= _bfd_vms_slurp_etir (abfd
, info
);
8837 dst_offset
= PRIV (image_offset
);
8846 vms_debug2 ((2, "slurp eobj type %d failed\n", type
));
8853 alpha_vms_sizeof_headers (bfd
*abfd ATTRIBUTE_UNUSED
,
8854 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8859 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
8862 alpha_vms_add_fixup_lp (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
8864 struct alpha_vms_shlib_el
*sl
;
8865 asection
*sect
= PRIV2 (src
, image_section
);
8866 file_ptr offset
= PRIV2 (src
, image_offset
);
8869 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8870 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8871 sl
->has_fixups
= true;
8872 p
= VEC_APPEND (sl
->lp
, bfd_vma
);
8875 *p
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
8876 sect
->output_section
->flags
|= SEC_RELOC
;
8880 /* Add a code address fixup at address SECT + OFFSET to SHLIB. */
8883 alpha_vms_add_fixup_ca (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
8885 struct alpha_vms_shlib_el
*sl
;
8886 asection
*sect
= PRIV2 (src
, image_section
);
8887 file_ptr offset
= PRIV2 (src
, image_offset
);
8890 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8891 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8892 sl
->has_fixups
= true;
8893 p
= VEC_APPEND (sl
->ca
, bfd_vma
);
8896 *p
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
8897 sect
->output_section
->flags
|= SEC_RELOC
;
8901 /* Add a quad word relocation fixup at address SECT + OFFSET to SHLIB. */
8904 alpha_vms_add_fixup_qr (struct bfd_link_info
*info
, bfd
*src
,
8905 bfd
*shlib
, bfd_vma vec
)
8907 struct alpha_vms_shlib_el
*sl
;
8908 struct alpha_vms_vma_ref
*r
;
8909 asection
*sect
= PRIV2 (src
, image_section
);
8910 file_ptr offset
= PRIV2 (src
, image_offset
);
8912 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8913 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8914 sl
->has_fixups
= true;
8915 r
= VEC_APPEND (sl
->qr
, struct alpha_vms_vma_ref
);
8918 r
->vma
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
8920 sect
->output_section
->flags
|= SEC_RELOC
;
8925 alpha_vms_add_fixup_lr (struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
8926 unsigned int shr ATTRIBUTE_UNUSED
,
8927 bfd_vma vec ATTRIBUTE_UNUSED
)
8929 /* Not yet supported. */
8933 /* Add relocation. FIXME: Not yet emitted. */
8936 alpha_vms_add_lw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8942 alpha_vms_add_qw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8947 static struct bfd_hash_entry
*
8948 alpha_vms_link_hash_newfunc (struct bfd_hash_entry
*entry
,
8949 struct bfd_hash_table
*table
,
8952 struct alpha_vms_link_hash_entry
*ret
=
8953 (struct alpha_vms_link_hash_entry
*) entry
;
8955 /* Allocate the structure if it has not already been allocated by a
8958 ret
= ((struct alpha_vms_link_hash_entry
*)
8959 bfd_hash_allocate (table
,
8960 sizeof (struct alpha_vms_link_hash_entry
)));
8964 /* Call the allocation method of the superclass. */
8965 ret
= ((struct alpha_vms_link_hash_entry
*)
8966 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
8971 return (struct bfd_hash_entry
*) ret
;
8975 alpha_vms_bfd_link_hash_table_free (bfd
*abfd
)
8977 struct alpha_vms_link_hash_table
*t
;
8980 t
= (struct alpha_vms_link_hash_table
*) abfd
->link
.hash
;
8981 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8983 struct alpha_vms_shlib_el
*shlib
;
8985 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8986 free (&VEC_EL (shlib
->ca
, bfd_vma
, 0));
8987 free (&VEC_EL (shlib
->lp
, bfd_vma
, 0));
8988 free (&VEC_EL (shlib
->qr
, struct alpha_vms_vma_ref
, 0));
8990 free (&VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, 0));
8992 _bfd_generic_link_hash_table_free (abfd
);
8995 /* Create an Alpha/VMS link hash table. */
8997 static struct bfd_link_hash_table
*
8998 alpha_vms_bfd_link_hash_table_create (bfd
*abfd
)
9000 struct alpha_vms_link_hash_table
*ret
;
9001 size_t amt
= sizeof (struct alpha_vms_link_hash_table
);
9003 ret
= (struct alpha_vms_link_hash_table
*) bfd_malloc (amt
);
9006 if (!_bfd_link_hash_table_init (&ret
->root
, abfd
,
9007 alpha_vms_link_hash_newfunc
,
9008 sizeof (struct alpha_vms_link_hash_entry
)))
9014 VEC_INIT (ret
->shrlibs
);
9016 ret
->root
.hash_table_free
= alpha_vms_bfd_link_hash_table_free
;
9022 alpha_vms_link_add_object_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
9026 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
9028 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
9029 struct alpha_vms_link_hash_entry
*h
;
9030 struct bfd_link_hash_entry
*h_root
;
9033 if (!alpha_vms_convert_symbol (abfd
, e
, &sym
))
9036 if ((e
->flags
& EGSY__V_DEF
) && abfd
->selective_search
)
9038 /* In selective_search mode, only add definition that are
9040 h
= (struct alpha_vms_link_hash_entry
*)bfd_link_hash_lookup
9041 (info
->hash
, sym
.name
, false, false, false);
9042 if (h
== NULL
|| h
->root
.type
!= bfd_link_hash_undefined
)
9048 h_root
= (struct bfd_link_hash_entry
*) h
;
9049 if (!_bfd_generic_link_add_one_symbol (info
, abfd
, sym
.name
, sym
.flags
,
9050 sym
.section
, sym
.value
, NULL
,
9051 false, false, &h_root
))
9053 h
= (struct alpha_vms_link_hash_entry
*) h_root
;
9055 if ((e
->flags
& EGSY__V_DEF
)
9057 && abfd
->xvec
== info
->output_bfd
->xvec
)
9061 if (abfd
->flags
& DYNAMIC
)
9063 struct alpha_vms_shlib_el
*shlib
;
9065 /* We do not want to include any of the sections in a dynamic
9066 object in the output file. See comment in elflink.c. */
9067 bfd_section_list_clear (abfd
);
9069 shlib
= VEC_APPEND (alpha_vms_link_hash (info
)->shrlibs
,
9070 struct alpha_vms_shlib_el
);
9074 VEC_INIT (shlib
->ca
);
9075 VEC_INIT (shlib
->lp
);
9076 VEC_INIT (shlib
->qr
);
9077 PRIV (shr_index
) = VEC_COUNT (alpha_vms_link_hash (info
)->shrlibs
) - 1;
9084 alpha_vms_link_add_archive_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
9087 struct bfd_link_hash_entry
**pundef
;
9088 struct bfd_link_hash_entry
**next_pundef
;
9090 /* We only accept VMS libraries. */
9091 if (info
->output_bfd
->xvec
!= abfd
->xvec
)
9093 bfd_set_error (bfd_error_wrong_format
);
9097 /* The archive_pass field in the archive itself is used to
9098 initialize PASS, since we may search the same archive multiple
9100 pass
= ++abfd
->archive_pass
;
9102 /* Look through the list of undefined symbols. */
9103 for (pundef
= &info
->hash
->undefs
; *pundef
!= NULL
; pundef
= next_pundef
)
9105 struct bfd_link_hash_entry
*h
;
9111 next_pundef
= &(*pundef
)->u
.undef
.next
;
9113 /* When a symbol is defined, it is not necessarily removed from
9115 if (h
->type
!= bfd_link_hash_undefined
9116 && h
->type
!= bfd_link_hash_common
)
9118 /* Remove this entry from the list, for general cleanliness
9119 and because we are going to look through the list again
9120 if we search any more libraries. We can't remove the
9121 entry if it is the tail, because that would lose any
9122 entries we add to the list later on. */
9123 if (*pundef
!= info
->hash
->undefs_tail
)
9125 *pundef
= *next_pundef
;
9126 next_pundef
= pundef
;
9131 /* Look for this symbol in the archive hash table. */
9132 symidx
= _bfd_vms_lib_find_symbol (abfd
, h
->root
.string
);
9133 if (symidx
== BFD_NO_MORE_SYMBOLS
)
9135 /* Nothing in this slot. */
9139 element
= bfd_get_elt_at_index (abfd
, symidx
);
9140 if (element
== NULL
)
9143 if (element
->archive_pass
== -1 || element
->archive_pass
== pass
)
9145 /* Next symbol if this archive is wrong or already handled. */
9149 if (! bfd_check_format (element
, bfd_object
))
9151 element
->archive_pass
= -1;
9155 orig_element
= element
;
9156 if (bfd_is_thin_archive (abfd
))
9158 element
= _bfd_vms_lib_get_imagelib_file (element
);
9159 if (element
== NULL
|| !bfd_check_format (element
, bfd_object
))
9161 orig_element
->archive_pass
= -1;
9166 /* Unlike the generic linker, we know that this element provides
9167 a definition for an undefined symbol and we know that we want
9168 to include it. We don't need to check anything. */
9169 if (!(*info
->callbacks
9170 ->add_archive_element
) (info
, element
, h
->root
.string
, &element
))
9172 if (!alpha_vms_link_add_object_symbols (element
, info
))
9175 orig_element
->archive_pass
= pass
;
9182 alpha_vms_bfd_link_add_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
9184 switch (bfd_get_format (abfd
))
9187 vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
9189 return alpha_vms_link_add_object_symbols (abfd
, info
);
9192 vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
9194 return alpha_vms_link_add_archive_symbols (abfd
, info
);
9197 bfd_set_error (bfd_error_wrong_format
);
9203 alpha_vms_build_fixups (struct bfd_link_info
*info
)
9205 struct alpha_vms_link_hash_table
*t
= alpha_vms_link_hash (info
);
9206 unsigned char *content
;
9208 unsigned int sz
= 0;
9209 unsigned int lp_sz
= 0;
9210 unsigned int ca_sz
= 0;
9211 unsigned int qr_sz
= 0;
9212 unsigned int shrimg_cnt
= 0;
9213 unsigned int chgprt_num
= 0;
9214 unsigned int chgprt_sz
= 0;
9215 struct vms_eiaf
*eiaf
;
9219 /* Shared libraries. */
9220 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
9222 struct alpha_vms_shlib_el
*shlib
;
9224 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
9226 if (!shlib
->has_fixups
)
9231 if (VEC_COUNT (shlib
->ca
) > 0)
9233 /* Header + entries. */
9235 ca_sz
+= VEC_COUNT (shlib
->ca
) * 4;
9237 if (VEC_COUNT (shlib
->lp
) > 0)
9239 /* Header + entries. */
9241 lp_sz
+= VEC_COUNT (shlib
->lp
) * 4;
9243 if (VEC_COUNT (shlib
->qr
) > 0)
9245 /* Header + entries. */
9247 qr_sz
+= VEC_COUNT (shlib
->qr
) * 8;
9258 /* Finish now if there is no content. */
9259 if (ca_sz
+ lp_sz
+ qr_sz
== 0)
9262 /* Add an eicp entry for the fixup itself. */
9264 for (sec
= info
->output_bfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
9266 /* This isect could be made RO or EXE after relocations are applied. */
9267 if ((sec
->flags
& SEC_RELOC
) != 0
9268 && (sec
->flags
& (SEC_CODE
| SEC_READONLY
)) != 0)
9271 chgprt_sz
= 4 + chgprt_num
* sizeof (struct vms_eicp
);
9273 /* Allocate section content (round-up size) */
9274 sz
= sizeof (struct vms_eiaf
) + shrimg_cnt
* sizeof (struct vms_shl
)
9275 + ca_sz
+ lp_sz
+ qr_sz
+ chgprt_sz
;
9276 sz
= (sz
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
9277 content
= bfd_zalloc (info
->output_bfd
, sz
);
9278 if (content
== NULL
)
9281 sec
= alpha_vms_link_hash (info
)->fixup
;
9282 sec
->contents
= content
;
9286 eiaf
= (struct vms_eiaf
*)content
;
9287 off
= sizeof (struct vms_eiaf
);
9288 bfd_putl32 (0, eiaf
->majorid
);
9289 bfd_putl32 (0, eiaf
->minorid
);
9290 bfd_putl32 (0, eiaf
->iaflink
);
9291 bfd_putl32 (0, eiaf
->fixuplnk
);
9292 bfd_putl32 (sizeof (struct vms_eiaf
), eiaf
->size
);
9293 bfd_putl32 (0, eiaf
->flags
);
9294 bfd_putl32 (0, eiaf
->qrelfixoff
);
9295 bfd_putl32 (0, eiaf
->lrelfixoff
);
9296 bfd_putl32 (0, eiaf
->qdotadroff
);
9297 bfd_putl32 (0, eiaf
->ldotadroff
);
9298 bfd_putl32 (0, eiaf
->codeadroff
);
9299 bfd_putl32 (0, eiaf
->lpfixoff
);
9300 bfd_putl32 (0, eiaf
->chgprtoff
);
9301 bfd_putl32 (shrimg_cnt
? off
: 0, eiaf
->shlstoff
);
9302 bfd_putl32 (shrimg_cnt
, eiaf
->shrimgcnt
);
9303 bfd_putl32 (0, eiaf
->shlextra
);
9304 bfd_putl32 (0, eiaf
->permctx
);
9305 bfd_putl32 (0, eiaf
->base_va
);
9306 bfd_putl32 (0, eiaf
->lppsbfixoff
);
9313 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
9315 struct alpha_vms_shlib_el
*shlib
;
9316 struct vms_shl
*shl
;
9318 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
9320 if (!shlib
->has_fixups
)
9323 /* Renumber shared images. */
9324 PRIV2 (shlib
->abfd
, shr_index
) = shrimg_cnt
++;
9326 shl
= (struct vms_shl
*)(content
+ off
);
9327 bfd_putl32 (0, shl
->baseva
);
9328 bfd_putl32 (0, shl
->shlptr
);
9329 bfd_putl32 (0, shl
->ident
);
9330 bfd_putl32 (0, shl
->permctx
);
9331 shl
->size
= sizeof (struct vms_shl
);
9332 bfd_putl16 (0, shl
->fill_1
);
9334 bfd_putl32 (0, shl
->icb
);
9335 shl
->imgnam
[0] = strlen (PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
));
9336 memcpy (shl
->imgnam
+ 1, PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
),
9339 off
+= sizeof (struct vms_shl
);
9345 bfd_putl32 (off
, eiaf
->codeadroff
);
9347 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
9349 struct alpha_vms_shlib_el
*shlib
;
9352 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
9354 if (VEC_COUNT (shlib
->ca
) == 0)
9357 bfd_putl32 (VEC_COUNT (shlib
->ca
), content
+ off
);
9358 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
9361 for (j
= 0; j
< VEC_COUNT (shlib
->ca
); j
++)
9363 bfd_putl32 (VEC_EL (shlib
->ca
, bfd_vma
, j
) - t
->base_addr
,
9369 bfd_putl32 (0, content
+ off
);
9370 bfd_putl32 (0, content
+ off
+ 4);
9377 bfd_putl32 (off
, eiaf
->lpfixoff
);
9379 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
9381 struct alpha_vms_shlib_el
*shlib
;
9384 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
9386 if (VEC_COUNT (shlib
->lp
) == 0)
9389 bfd_putl32 (VEC_COUNT (shlib
->lp
), content
+ off
);
9390 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
9393 for (j
= 0; j
< VEC_COUNT (shlib
->lp
); j
++)
9395 bfd_putl32 (VEC_EL (shlib
->lp
, bfd_vma
, j
) - t
->base_addr
,
9401 bfd_putl32 (0, content
+ off
);
9402 bfd_putl32 (0, content
+ off
+ 4);
9409 bfd_putl32 (off
, eiaf
->qdotadroff
);
9411 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
9413 struct alpha_vms_shlib_el
*shlib
;
9416 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
9418 if (VEC_COUNT (shlib
->qr
) == 0)
9421 bfd_putl32 (VEC_COUNT (shlib
->qr
), content
+ off
);
9422 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
9425 for (j
= 0; j
< VEC_COUNT (shlib
->qr
); j
++)
9427 struct alpha_vms_vma_ref
*r
;
9428 r
= &VEC_EL (shlib
->qr
, struct alpha_vms_vma_ref
, j
);
9429 bfd_putl32 (r
->vma
- t
->base_addr
, content
+ off
);
9430 bfd_putl32 (r
->ref
, content
+ off
+ 4);
9435 bfd_putl32 (0, content
+ off
);
9436 bfd_putl32 (0, content
+ off
+ 4);
9441 /* Write the change protection table. */
9442 bfd_putl32 (off
, eiaf
->chgprtoff
);
9443 bfd_putl32 (chgprt_num
, content
+ off
);
9446 for (sec
= info
->output_bfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
9448 struct vms_eicp
*eicp
;
9451 if ((sec
->flags
& SEC_LINKER_CREATED
) != 0 &&
9452 strcmp (sec
->name
, "$FIXUP$") == 0)
9454 else if ((sec
->flags
& SEC_RELOC
) != 0
9455 && (sec
->flags
& (SEC_CODE
| SEC_READONLY
)) != 0)
9460 eicp
= (struct vms_eicp
*)(content
+ off
);
9461 bfd_putl64 (sec
->vma
- t
->base_addr
, eicp
->baseva
);
9462 bfd_putl32 ((sec
->size
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1),
9464 bfd_putl32 (prot
, eicp
->newprt
);
9465 off
+= sizeof (struct vms_eicp
);
9471 /* Called by bfd_hash_traverse to fill the symbol table.
9472 Return FALSE in case of failure. */
9475 alpha_vms_link_output_symbol (struct bfd_hash_entry
*bh
, void *infov
)
9477 struct bfd_link_hash_entry
*hc
= (struct bfd_link_hash_entry
*) bh
;
9478 struct bfd_link_info
*info
= (struct bfd_link_info
*)infov
;
9479 struct alpha_vms_link_hash_entry
*h
;
9480 struct vms_symbol_entry
*sym
;
9482 if (hc
->type
== bfd_link_hash_warning
)
9485 if (hc
->type
== bfd_link_hash_new
)
9488 h
= (struct alpha_vms_link_hash_entry
*) hc
;
9490 switch (h
->root
.type
)
9492 case bfd_link_hash_undefined
:
9494 case bfd_link_hash_new
:
9495 case bfd_link_hash_warning
:
9497 case bfd_link_hash_undefweak
:
9499 case bfd_link_hash_defined
:
9500 case bfd_link_hash_defweak
:
9502 asection
*sec
= h
->root
.u
.def
.section
;
9504 /* FIXME: this is certainly a symbol from a dynamic library. */
9505 if (bfd_is_abs_section (sec
))
9508 if (sec
->owner
->flags
& DYNAMIC
)
9512 case bfd_link_hash_common
:
9514 case bfd_link_hash_indirect
:
9518 /* Do not write not kept symbols. */
9519 if (info
->strip
== strip_some
9520 && bfd_hash_lookup (info
->keep_hash
, h
->root
.root
.string
,
9521 false, false) != NULL
)
9526 /* This symbol doesn't come from a VMS object. So we suppose it is
9528 int len
= strlen (h
->root
.root
.string
);
9530 sym
= (struct vms_symbol_entry
*)bfd_zalloc (info
->output_bfd
,
9531 sizeof (*sym
) + len
);
9535 memcpy (sym
->name
, h
->root
.root
.string
, len
);
9537 sym
->owner
= info
->output_bfd
;
9539 sym
->typ
= EGSD__C_SYMG
;
9541 sym
->flags
= EGSY__V_DEF
| EGSY__V_REL
;
9542 sym
->symbol_vector
= h
->root
.u
.def
.value
;
9543 sym
->section
= h
->root
.u
.def
.section
;
9544 sym
->value
= h
->root
.u
.def
.value
;
9549 if (!add_symbol_entry (info
->output_bfd
, sym
))
9556 alpha_vms_bfd_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
9559 struct bfd_link_order
*p
;
9567 if (bfd_link_relocatable (info
))
9569 /* FIXME: we do not yet support relocatable link. It is not obvious
9570 how to do it for debug infos. */
9571 (*info
->callbacks
->einfo
)(_("%P: relocatable link is not supported\n"));
9575 abfd
->outsymbols
= NULL
;
9578 /* Mark all sections which will be included in the output file. */
9579 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9580 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9581 if (p
->type
== bfd_indirect_link_order
)
9582 p
->u
.indirect
.section
->linker_mark
= true;
9585 /* Handle all the link order information for the sections. */
9586 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9588 printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
9589 o
->name
, (unsigned)o
->vma
, (unsigned)o
->flags
);
9591 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9593 printf (" at 0x%08x - 0x%08x: ",
9594 (unsigned)p
->offset
, (unsigned)(p
->offset
+ p
->size
- 1));
9597 case bfd_section_reloc_link_order
:
9598 case bfd_symbol_reloc_link_order
:
9599 printf (" section/symbol reloc\n");
9601 case bfd_indirect_link_order
:
9602 printf (" section %s of %s\n",
9603 p
->u
.indirect
.section
->name
,
9604 p
->u
.indirect
.section
->owner
->filename
);
9606 case bfd_data_link_order
:
9607 printf (" explicit data\n");
9610 printf (" *unknown* type %u\n", p
->type
);
9617 /* Generate the symbol table. */
9618 BFD_ASSERT (PRIV (syms
) == NULL
);
9619 if (info
->strip
!= strip_all
)
9620 bfd_hash_traverse (&info
->hash
->table
, alpha_vms_link_output_symbol
, info
);
9622 /* Find the entry point. */
9623 if (bfd_get_start_address (abfd
) == 0)
9625 bfd
*startbfd
= NULL
;
9627 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9629 /* Consider only VMS object files. */
9630 if (sub
->xvec
!= abfd
->xvec
)
9633 if (!PRIV2 (sub
, eom_data
).eom_has_transfer
)
9635 if ((PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
) && startbfd
)
9637 if (startbfd
!= NULL
9638 && !(PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
))
9640 (*info
->callbacks
->einfo
)
9641 /* xgettext:c-format */
9642 (_("%P: multiple entry points: in modules %pB and %pB\n"),
9651 unsigned int ps_idx
= PRIV2 (startbfd
, eom_data
).eom_l_psindx
;
9652 bfd_vma tfradr
= PRIV2 (startbfd
, eom_data
).eom_l_tfradr
;
9655 sec
= PRIV2 (startbfd
, sections
)[ps_idx
];
9657 bfd_set_start_address
9658 (abfd
, sec
->output_section
->vma
+ sec
->output_offset
+ tfradr
);
9662 /* Set transfer addresses. */
9665 struct bfd_link_hash_entry
*h
;
9668 PRIV (transfer_address
[i
++]) = 0xffffffff00000340ULL
; /* SYS$IMGACT */
9669 h
= bfd_link_hash_lookup (info
->hash
, "LIB$INITIALIZE", false, false, true);
9670 if (h
!= NULL
&& h
->type
== bfd_link_hash_defined
)
9671 PRIV (transfer_address
[i
++]) =
9672 alpha_vms_get_sym_value (h
->u
.def
.section
, h
->u
.def
.value
);
9673 PRIV (transfer_address
[i
++]) = bfd_get_start_address (abfd
);
9675 PRIV (transfer_address
[i
++]) = 0;
9678 /* Allocate contents.
9679 Also compute the virtual base address. */
9680 base_addr
= (bfd_vma
)-1;
9682 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9684 if (o
->flags
& SEC_HAS_CONTENTS
)
9686 o
->contents
= bfd_alloc (abfd
, o
->size
);
9687 if (o
->contents
== NULL
)
9691 if (o
->flags
& SEC_LOAD
)
9693 if (o
->vma
< base_addr
)
9695 if (o
->vma
+ o
->size
> last_addr
)
9696 last_addr
= o
->vma
+ o
->size
;
9698 /* Clear the RELOC flags. Currently we don't support incremental
9699 linking. We use the RELOC flag for computing the eicp entries. */
9700 o
->flags
&= ~SEC_RELOC
;
9703 /* Create the fixup section. */
9704 fixupsec
= bfd_make_section_anyway_with_flags
9705 (info
->output_bfd
, "$FIXUP$",
9706 SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
9707 if (fixupsec
== NULL
)
9709 last_addr
= (last_addr
+ 0xffff) & ~0xffff;
9710 fixupsec
->vma
= last_addr
;
9712 alpha_vms_link_hash (info
)->fixup
= fixupsec
;
9713 alpha_vms_link_hash (info
)->base_addr
= base_addr
;
9715 /* Create the DMT section, if necessary. */
9716 BFD_ASSERT (PRIV (dst_section
) == NULL
);
9717 dst
= bfd_get_section_by_name (abfd
, "$DST$");
9718 if (dst
!= NULL
&& dst
->size
== 0)
9722 PRIV (dst_section
) = dst
;
9723 dmt
= bfd_make_section_anyway_with_flags
9724 (info
->output_bfd
, "$DMT$",
9725 SEC_DEBUGGING
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
9732 /* Read all sections from the inputs. */
9733 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9735 if (sub
->flags
& DYNAMIC
)
9737 alpha_vms_create_eisd_for_shared (abfd
, sub
);
9741 if (!alpha_vms_read_sections_content (sub
, info
))
9745 /* Handle all the link order information for the sections.
9746 Note: past this point, it is not possible to create new sections. */
9747 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9749 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9753 case bfd_section_reloc_link_order
:
9754 case bfd_symbol_reloc_link_order
:
9757 case bfd_indirect_link_order
:
9761 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
9768 /* Compute fixups. */
9769 if (!alpha_vms_build_fixups (info
))
9772 /* Compute the DMT. */
9776 unsigned char *contents
= NULL
;
9778 /* In pass 1, compute the size. In pass 2, write the DMT contents. */
9779 for (pass
= 0; pass
< 2; pass
++)
9781 unsigned int off
= 0;
9783 /* For each object file (ie for each module). */
9784 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9787 struct vms_dmt_header
*dmth
= NULL
;
9788 unsigned int psect_count
;
9790 /* Skip this module if it has no DST. */
9791 sub_dst
= PRIV2 (sub
, dst_section
);
9792 if (sub_dst
== NULL
|| sub_dst
->size
== 0)
9797 /* Write the header. */
9798 dmth
= (struct vms_dmt_header
*)(contents
+ off
);
9799 bfd_putl32 (sub_dst
->output_offset
, dmth
->modbeg
);
9800 bfd_putl32 (sub_dst
->size
, dmth
->size
);
9803 off
+= sizeof (struct vms_dmt_header
);
9806 /* For each section (ie for each psect). */
9807 for (o
= sub
->sections
; o
!= NULL
; o
= o
->next
)
9809 /* Only consider interesting sections. */
9810 if (!(o
->flags
& SEC_ALLOC
))
9812 if (o
->flags
& SEC_LINKER_CREATED
)
9817 /* Write an entry. */
9818 struct vms_dmt_psect
*dmtp
;
9820 dmtp
= (struct vms_dmt_psect
*)(contents
+ off
);
9821 bfd_putl32 (o
->output_offset
+ o
->output_section
->vma
,
9823 bfd_putl32 (o
->size
, dmtp
->length
);
9826 off
+= sizeof (struct vms_dmt_psect
);
9829 bfd_putl32 (psect_count
, dmth
->psect_count
);
9834 contents
= bfd_zalloc (info
->output_bfd
, off
);
9835 if (contents
== NULL
)
9837 dmt
->contents
= contents
;
9843 BFD_ASSERT (off
== dmt
->size
);
9851 /* Read the contents of a section.
9852 buf points to a buffer of buf_size bytes to be filled with
9853 section data (starting at offset into section) */
9856 alpha_vms_get_section_contents (bfd
*abfd
, asection
*section
,
9857 void *buf
, file_ptr offset
,
9858 bfd_size_type count
)
9860 /* Handle image sections. */
9861 if (section
->filepos
!= 0
9862 || (section
->flags
& SEC_HAS_CONTENTS
) == 0)
9863 return _bfd_generic_get_section_contents (abfd
, section
,
9864 buf
, offset
, count
);
9866 /* A section with a zero filepos implies the section has no direct
9867 file backing. Its contents must be calculated by processing ETIR
9871 if (offset
+ count
< count
9872 || offset
+ count
> section
->size
)
9874 bfd_set_error (bfd_error_invalid_operation
);
9878 if (section
->size
== 0)
9881 /* If we haven't yet read ETIR/EDBG/ETBT records, do so. */
9882 if ((section
->flags
& SEC_IN_MEMORY
) == 0)
9884 /* Alloc memory and read ETIRs. */
9885 for (asection
*sec
= abfd
->sections
; sec
; sec
= sec
->next
)
9888 && sec
->filepos
== 0
9889 && (sec
->flags
& SEC_HAS_CONTENTS
) != 0)
9891 BFD_ASSERT (sec
->contents
== NULL
);
9893 sec
->contents
= bfd_zalloc (abfd
, sec
->size
);
9894 sec
->flags
|= SEC_IN_MEMORY
;
9895 if (sec
->contents
== NULL
)
9900 if (!alpha_vms_read_sections_content (abfd
, NULL
))
9904 BFD_ASSERT (section
->contents
!= NULL
);
9905 memcpy (buf
, section
->contents
+ offset
, count
);
9910 /* Set the format of a file being written. */
9913 alpha_vms_mkobject (bfd
* abfd
)
9915 const bfd_arch_info_type
*arch
;
9917 vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd
));
9919 if (!vms_initialize (abfd
))
9922 PRIV (recwr
.buf
) = bfd_alloc (abfd
, MAX_OUTREC_SIZE
);
9923 if (PRIV (recwr
.buf
) == NULL
)
9926 arch
= bfd_scan_arch ("alpha");
9930 bfd_set_error (bfd_error_wrong_format
);
9934 abfd
->arch_info
= arch
;
9941 /* Called when the BFD is being closed to do any necessary cleanup. */
9944 vms_close_and_cleanup (bfd
* abfd
)
9946 vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd
));
9948 if (abfd
== NULL
|| abfd
->tdata
.any
== NULL
)
9951 if (abfd
->format
== bfd_object
)
9953 alpha_vms_free_private (abfd
);
9956 if (abfd
->direction
== write_direction
)
9958 /* Last step on VMS is to convert the file to variable record length
9960 if (!bfd_cache_close (abfd
))
9962 if (!_bfd_vms_convert_to_var_unix_filename (abfd
->filename
))
9968 return _bfd_generic_close_and_cleanup (abfd
);
9971 /* Called when a new section is created. */
9974 vms_new_section_hook (bfd
* abfd
, asection
*section
)
9978 vms_debug2 ((1, "vms_new_section_hook (%p, [%u]%s)\n",
9979 abfd
, section
->index
, section
->name
));
9981 if (!bfd_set_section_alignment (section
, 0))
9984 vms_debug2 ((7, "%u: %s\n", section
->index
, section
->name
));
9986 amt
= sizeof (struct vms_section_data_struct
);
9987 section
->used_by_bfd
= bfd_zalloc (abfd
, amt
);
9988 if (section
->used_by_bfd
== NULL
)
9991 /* Create the section symbol. */
9992 return _bfd_generic_new_section_hook (abfd
, section
);
9995 /* Part 4.5, symbols. */
9997 /* Print symbol to file according to how. how is one of
9998 bfd_print_symbol_name just print the name
9999 bfd_print_symbol_more print more (???)
10000 bfd_print_symbol_all print all we know, which is not much right now :-). */
10003 vms_print_symbol (bfd
* abfd
,
10006 bfd_print_symbol_type how
)
10008 vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
10009 abfd
, file
, symbol
, how
));
10013 case bfd_print_symbol_name
:
10014 case bfd_print_symbol_more
:
10015 fprintf ((FILE *)file
," %s", symbol
->name
);
10018 case bfd_print_symbol_all
:
10020 const char *section_name
= symbol
->section
->name
;
10022 bfd_print_symbol_vandf (abfd
, file
, symbol
);
10024 fprintf ((FILE *) file
," %-8s %s", section_name
, symbol
->name
);
10030 /* Return information about symbol in ret.
10032 fill type, value and name
10035 B bss segment symbol
10037 D data segment symbol
10039 t a static function symbol
10040 T text segment symbol
10045 vms_get_symbol_info (bfd
* abfd ATTRIBUTE_UNUSED
,
10051 vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd
, symbol
, ret
));
10053 sec
= symbol
->section
;
10060 else if (bfd_is_com_section (sec
))
10062 else if (bfd_is_abs_section (sec
))
10064 else if (bfd_is_und_section (sec
))
10066 else if (bfd_is_ind_section (sec
))
10068 else if ((symbol
->flags
& BSF_FUNCTION
)
10069 || (bfd_section_flags (sec
) & SEC_CODE
))
10071 else if (bfd_section_flags (sec
) & SEC_DATA
)
10073 else if (bfd_section_flags (sec
) & SEC_ALLOC
)
10078 if (ret
->type
!= 'U')
10079 ret
->value
= symbol
->value
+ symbol
->section
->vma
;
10082 ret
->name
= symbol
->name
;
10085 /* Return TRUE if the given symbol sym in the BFD abfd is
10086 a compiler generated local label, else return FALSE. */
10089 vms_bfd_is_local_label_name (bfd
* abfd ATTRIBUTE_UNUSED
,
10092 return name
[0] == '$';
10095 /* Part 4.7, writing an object file. */
10097 /* Sets the contents of the section section in BFD abfd to the data starting
10098 in memory at LOCATION. The data is written to the output section starting
10099 at offset offset for count bytes.
10101 Normally TRUE is returned, else FALSE. Possible error returns are:
10102 o bfd_error_no_contents - The output section does not have the
10103 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
10104 o and some more too */
10107 _bfd_vms_set_section_contents (bfd
* abfd
,
10109 const void * location
,
10111 bfd_size_type count
)
10113 if (section
->contents
== NULL
)
10115 section
->contents
= bfd_alloc (abfd
, section
->size
);
10116 if (section
->contents
== NULL
)
10118 section
->alloced
= 1;
10120 memcpy (section
->contents
+ offset
, location
, (size_t) count
);
10126 /* Set the architecture and machine type in BFD abfd to arch and mach.
10127 Find the correct pointer to a structure and insert it into the arch_info
10131 alpha_vms_set_arch_mach (bfd
*abfd
,
10132 enum bfd_architecture arch
, unsigned long mach
)
10134 if (arch
!= bfd_arch_alpha
10135 && arch
!= bfd_arch_unknown
)
10138 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
10141 /* Set section VMS flags. Clear NO_FLAGS and set FLAGS. */
10144 bfd_vms_set_section_flags (bfd
*abfd ATTRIBUTE_UNUSED
,
10145 asection
*sec
, flagword no_flags
, flagword flags
)
10147 vms_section_data (sec
)->no_flags
= no_flags
;
10148 vms_section_data (sec
)->flags
= flags
;
10151 struct vms_private_data_struct
*
10152 bfd_vms_get_data (bfd
*abfd
)
10154 return (struct vms_private_data_struct
*)abfd
->tdata
.any
;
10157 #define vms_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
10158 #define vms_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
10159 #define vms_init_private_section_data _bfd_generic_init_private_section_data
10160 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
10161 #define vms_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
10162 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
10163 #define vms_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
10165 /* Symbols table. */
10166 #define alpha_vms_make_empty_symbol _bfd_generic_make_empty_symbol
10167 #define alpha_vms_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
10168 #define alpha_vms_print_symbol vms_print_symbol
10169 #define alpha_vms_get_symbol_info vms_get_symbol_info
10170 #define alpha_vms_get_symbol_version_string \
10171 _bfd_nosymbols_get_symbol_version_string
10173 #define alpha_vms_read_minisymbols _bfd_generic_read_minisymbols
10174 #define alpha_vms_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
10175 #define alpha_vms_get_lineno _bfd_nosymbols_get_lineno
10176 #define alpha_vms_find_inliner_info _bfd_nosymbols_find_inliner_info
10177 #define alpha_vms_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
10178 #define alpha_vms_find_nearest_line _bfd_vms_find_nearest_line
10179 #define alpha_vms_find_nearest_line_with_alt \
10180 _bfd_nosymbols_find_nearest_line_with_alt
10181 #define alpha_vms_find_line _bfd_nosymbols_find_line
10182 #define alpha_vms_bfd_is_local_label_name vms_bfd_is_local_label_name
10184 /* Generic table. */
10185 #define alpha_vms_close_and_cleanup vms_close_and_cleanup
10186 #define alpha_vms_bfd_free_cached_info _bfd_bool_bfd_true
10187 #define alpha_vms_new_section_hook vms_new_section_hook
10188 #define alpha_vms_set_section_contents _bfd_vms_set_section_contents
10190 #define alpha_vms_bfd_get_relocated_section_contents \
10191 bfd_generic_get_relocated_section_contents
10193 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
10194 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
10195 #define alpha_vms_bfd_lookup_section_flags bfd_generic_lookup_section_flags
10196 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
10197 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
10198 #define alpha_vms_bfd_group_name bfd_generic_group_name
10199 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
10200 #define alpha_vms_section_already_linked \
10201 _bfd_generic_section_already_linked
10203 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
10204 #define alpha_vms_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
10205 #define alpha_vms_bfd_define_start_stop bfd_generic_define_start_stop
10206 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
10207 #define alpha_vms_bfd_copy_link_hash_symbol_type \
10208 _bfd_generic_copy_link_hash_symbol_type
10210 #define alpha_vms_bfd_link_split_section _bfd_generic_link_split_section
10212 #define alpha_vms_get_dynamic_symtab_upper_bound \
10213 _bfd_nodynamic_get_dynamic_symtab_upper_bound
10214 #define alpha_vms_canonicalize_dynamic_symtab \
10215 _bfd_nodynamic_canonicalize_dynamic_symtab
10216 #define alpha_vms_get_dynamic_reloc_upper_bound \
10217 _bfd_nodynamic_get_dynamic_reloc_upper_bound
10218 #define alpha_vms_canonicalize_dynamic_reloc \
10219 _bfd_nodynamic_canonicalize_dynamic_reloc
10220 #define alpha_vms_bfd_link_check_relocs _bfd_generic_link_check_relocs
10222 const bfd_target alpha_vms_vec
=
10224 "vms-alpha", /* Name. */
10225 bfd_target_evax_flavour
,
10226 BFD_ENDIAN_LITTLE
, /* Data byte order is little. */
10227 BFD_ENDIAN_LITTLE
, /* Header byte order is little. */
10229 (HAS_RELOC
| EXEC_P
| HAS_LINENO
| HAS_DEBUG
| HAS_SYMS
| HAS_LOCALS
10230 | WP_TEXT
| D_PAGED
), /* Object flags. */
10231 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
10232 | SEC_READONLY
| SEC_CODE
| SEC_DATA
10233 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* Sect flags. */
10234 0, /* symbol_leading_char. */
10235 ' ', /* ar_pad_char. */
10236 15, /* ar_max_namelen. */
10237 0, /* match priority. */
10238 TARGET_KEEP_UNUSED_SECTION_SYMBOLS
, /* keep unused section symbols. */
10239 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
10240 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
10241 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
10242 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
10243 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
10244 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
10246 { /* bfd_check_format. */
10248 alpha_vms_object_p
,
10249 _bfd_vms_lib_alpha_archive_p
,
10252 { /* bfd_set_format. */
10253 _bfd_bool_bfd_false_error
,
10254 alpha_vms_mkobject
,
10255 _bfd_vms_lib_alpha_mkarchive
,
10256 _bfd_bool_bfd_false_error
10258 { /* bfd_write_contents. */
10259 _bfd_bool_bfd_false_error
,
10260 alpha_vms_write_object_contents
,
10261 _bfd_vms_lib_write_archive_contents
,
10262 _bfd_bool_bfd_false_error
10265 BFD_JUMP_TABLE_GENERIC (alpha_vms
),
10266 BFD_JUMP_TABLE_COPY (vms
),
10267 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
10268 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib
),
10269 BFD_JUMP_TABLE_SYMBOLS (alpha_vms
),
10270 BFD_JUMP_TABLE_RELOCS (alpha_vms
),
10271 BFD_JUMP_TABLE_WRITE (alpha_vms
),
10272 BFD_JUMP_TABLE_LINK (alpha_vms
),
10273 BFD_JUMP_TABLE_DYNAMIC (alpha_vms
),