1 /* vms.c -- BFD back-end for EVAX (openVMS/Alpha) files.
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5 Initial version written by Klaus Kaempf (kkaempf@rmi.de)
6 Major rewrite by Adacore.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
26 o Generation of shared image
27 o Relocation optimizations
33 o protected sections (for messages)
51 #include "vms/eihvn.h"
52 #include "vms/eobjrec.h"
55 #include "vms/esgps.h"
64 #include "vms/esdfm.h"
65 #include "vms/esdfv.h"
71 #include "vms/internal.h"
74 #define MIN(a,b) ((a) < (b) ? (a) : (b))
76 /* The r_type field in a reloc is one of the following values. */
77 #define ALPHA_R_IGNORE 0
78 #define ALPHA_R_REFQUAD 1
79 #define ALPHA_R_BRADDR 2
80 #define ALPHA_R_HINT 3
81 #define ALPHA_R_SREL16 4
82 #define ALPHA_R_SREL32 5
83 #define ALPHA_R_SREL64 6
84 #define ALPHA_R_OP_PUSH 7
85 #define ALPHA_R_OP_STORE 8
86 #define ALPHA_R_OP_PSUB 9
87 #define ALPHA_R_OP_PRSHIFT 10
88 #define ALPHA_R_LINKAGE 11
89 #define ALPHA_R_REFLONG 12
90 #define ALPHA_R_CODEADDR 13
91 #define ALPHA_R_NOP 14
92 #define ALPHA_R_BSR 15
93 #define ALPHA_R_LDA 16
94 #define ALPHA_R_BOH 17
96 /* These are used with DST_S_C_LINE_NUM. */
97 #define DST_S_C_LINE_NUM_HEADER_SIZE 4
99 /* These are used with DST_S_C_SOURCE */
101 #define DST_S_B_PCLINE_UNSBYTE 1
102 #define DST_S_W_PCLINE_UNSWORD 1
103 #define DST_S_L_PCLINE_UNSLONG 1
105 #define DST_S_B_MODBEG_NAME 14
106 #define DST_S_L_RTNBEG_ADDRESS 5
107 #define DST_S_B_RTNBEG_NAME 13
108 #define DST_S_L_RTNEND_SIZE 5
110 /* These are used with DST_S_C_SOURCE. */
111 #define DST_S_C_SOURCE_HEADER_SIZE 4
113 #define DST_S_B_SRC_DF_LENGTH 1
114 #define DST_S_W_SRC_DF_FILEID 3
115 #define DST_S_B_SRC_DF_FILENAME 20
116 #define DST_S_B_SRC_UNSBYTE 1
117 #define DST_S_W_SRC_UNSWORD 1
118 #define DST_S_L_SRC_UNSLONG 1
120 /* Debugger symbol definitions. */
122 #define DBG_S_L_DMT_MODBEG 0
123 #define DBG_S_L_DST_SIZE 4
124 #define DBG_S_W_DMT_PSECT_COUNT 8
125 #define DBG_S_C_DMT_HEADER_SIZE 12
127 #define DBG_S_L_DMT_PSECT_START 0
128 #define DBG_S_L_DMT_PSECT_LENGTH 4
129 #define DBG_S_C_DMT_PSECT_SIZE 8
131 /* VMS module header. */
147 #define EMH_DATE_LENGTH 17
149 /* VMS End-Of-Module records (EOM/EEOM). */
153 unsigned int eom_l_total_lps
;
154 unsigned short eom_w_comcod
;
155 bfd_boolean eom_has_transfer
;
156 unsigned char eom_b_tfrflg
;
157 unsigned int eom_l_psindx
;
158 unsigned int eom_l_tfradr
;
161 struct vms_symbol_entry
167 unsigned char data_type
;
168 unsigned short flags
;
170 /* Section and offset/value of the symbol. */
174 /* Section and offset/value for the entry point (only for subprg). */
175 asection
*code_section
;
176 unsigned int code_value
;
178 /* Symbol vector offset. */
179 unsigned int symbol_vector
;
181 /* Length of the name. */
182 unsigned char namelen
;
187 /* Stack value for push/pop commands. */
195 #define STACKSIZE 128
197 /* A minimal decoding of DST compilation units. We only decode
198 what's needed to get to the line number information. */
208 struct srecinfo
*next
;
216 struct lineinfo
*next
;
223 struct funcinfo
*next
;
231 /* Chain the previously read compilation unit. */
234 /* The module name. */
237 /* The start offset and size of debug info in the DST section. */
241 /* The lowest and highest addresses contained in this compilation
242 unit as specified in the compilation unit header. */
246 /* The listing line table. */
247 struct lineinfo
*line_table
;
249 /* The source record table. */
250 struct srecinfo
*srec_table
;
252 /* A list of the functions found in this module. */
253 struct funcinfo
*func_table
;
255 /* Current allocation of file_table. */
256 unsigned int file_table_count
;
258 /* An array of the files making up this module. */
259 struct fileinfo
*file_table
;
262 /* BFD private data for alpha-vms. */
264 struct vms_private_data_struct
266 /* If true, relocs have been read. */
267 bfd_boolean reloc_done
;
269 /* Record input buffer. */
270 struct vms_rec_rd recrd
;
271 struct vms_rec_wr recwr
;
273 struct hdr_struct hdr_data
; /* data from HDR/EMH record */
274 struct eom_struct eom_data
; /* data from EOM/EEOM record */
276 /* Transfer addresses (entry points). */
277 bfd_vma transfer_address
[4];
279 /* Array of GSD sections to get the correspond BFD one. */
280 unsigned int section_max
; /* Size of the sections array. */
281 unsigned int section_count
; /* Number of GSD sections. */
284 /* Array of raw symbols. */
285 struct vms_symbol_entry
**syms
;
287 /* Canonicalized symbols. */
290 /* Number of symbols. */
291 unsigned int gsd_sym_count
;
292 /* Size of the syms array. */
293 unsigned int max_sym_count
;
294 /* Number of procedure symbols. */
295 unsigned int norm_sym_count
;
297 /* Stack used to evaluate TIR/ETIR commands. */
298 struct stack_struct
*stack
;
301 /* Content reading. */
302 asection
*image_section
; /* section for image_ptr */
303 file_ptr image_offset
; /* Offset for image_ptr. */
305 struct module
*modules
; /* list of all compilation units */
307 asection
*dst_section
;
309 unsigned int dst_ptr_offsets_count
; /* # of offsets in following array */
310 unsigned int *dst_ptr_offsets
; /* array of saved image_ptr offsets */
312 /* Shared library support */
313 bfd_vma symvva
; /* relative virtual address of symbol vector */
315 unsigned char matchctl
;
317 /* Shared library index. This is used for input bfd while linking. */
318 unsigned int shr_index
;
320 /* Used to place structures in the file. */
323 /* Simply linked list of eisd. */
324 struct vms_internal_eisd_map
*eisd_head
;
325 struct vms_internal_eisd_map
*eisd_tail
;
327 /* Simply linked list of eisd for shared libraries. */
328 struct vms_internal_eisd_map
*gbl_eisd_head
;
329 struct vms_internal_eisd_map
*gbl_eisd_tail
;
331 /* linkage index counter used by conditional store commands */
332 int vms_linkage_index
;
334 /* see tc-alpha.c of gas for a description. */
335 int flag_hash_long_names
; /* -+, hash instead of truncate */
336 int flag_show_after_trunc
; /* -H, show hashing/truncation */
339 #define PRIV2(abfd, name) \
340 (((struct vms_private_data_struct *)(abfd)->tdata.any)->name)
341 #define PRIV(name) PRIV2(abfd,name)
344 /* Used to keep extra VMS specific information for a given section.
346 reloc_size holds the size of the relocation stream, note this
347 is very different from the number of relocations as VMS relocations
350 reloc_stream is the actual stream of relocation entries. */
352 struct vms_section_data_struct
354 /* Maximnum number of entries in sec->relocation. */
357 /* Corresponding eisd. Used only while generating executables. */
358 struct vms_internal_eisd_map
*eisd
;
360 /* PSC flags to be clear. */
363 /* PSC flags to be set. */
367 #define vms_section_data(sec) \
368 ((struct vms_section_data_struct *)sec->used_by_bfd)
370 /* To be called from the debugger. */
371 struct vms_private_data_struct
*bfd_vms_get_data (bfd
*abfd
);
373 static int vms_get_remaining_object_record (bfd
*abfd
, int read_so_far
);
374 static bfd_boolean
_bfd_vms_slurp_object_records (bfd
* abfd
);
375 static void alpha_vms_add_fixup_lp (struct bfd_link_info
*, bfd
*, bfd
*);
376 static void alpha_vms_add_fixup_ca (struct bfd_link_info
*, bfd
*, bfd
*);
377 static void alpha_vms_add_fixup_qr (struct bfd_link_info
*, bfd
*, bfd
*,
379 static void alpha_vms_add_lw_reloc (struct bfd_link_info
*info
);
380 static void alpha_vms_add_qw_reloc (struct bfd_link_info
*info
);
381 static void alpha_vms_add_lw_fixup (struct bfd_link_info
*, unsigned int,
391 /* Number of elements in VEC. */
393 #define VEC_COUNT(VEC) ((VEC).nbr_el)
395 /* Get the address of the Nth element. */
397 #define VEC_EL(VEC, TYPE, N) (((TYPE *)((VEC).els))[N])
399 #define VEC_INIT(VEC) \
406 /* Be sure there is room for a new element. */
408 static void vector_grow1 (struct vector_type
*vec
, size_t elsz
);
410 /* Allocate room for a new element and return its address. */
412 #define VEC_APPEND(VEC, TYPE) \
413 (vector_grow1 (&VEC, sizeof (TYPE)), &VEC_EL(VEC, TYPE, (VEC).nbr_el++))
415 /* Append an element. */
417 #define VEC_APPEND_EL(VEC, TYPE, EL) \
418 (*(VEC_APPEND (VEC, TYPE)) = EL)
420 struct alpha_vms_vma_ref
422 bfd_vma vma
; /* Vma in the output. */
423 bfd_vma ref
; /* Reference in the input. */
426 struct alpha_vms_shlib_el
429 bfd_boolean has_fixups
;
431 struct vector_type lp
; /* Vector of bfd_vma. */
432 struct vector_type ca
; /* Vector of bfd_vma. */
433 struct vector_type qr
; /* Vector of struct alpha_vms_vma_ref. */
436 /* Alpha VMS linker hash table. */
438 struct alpha_vms_link_hash_table
440 struct bfd_link_hash_table root
;
442 /* Vector of shared libaries. */
443 struct vector_type shrlibs
;
448 /* Base address. Used by fixups. */
452 #define alpha_vms_link_hash(INFO) \
453 ((struct alpha_vms_link_hash_table *)(INFO->hash))
455 /* Alpha VMS linker hash table entry. */
457 struct alpha_vms_link_hash_entry
459 struct bfd_link_hash_entry root
;
461 /* Pointer to the original vms symbol. */
462 struct vms_symbol_entry
*sym
;
467 /* Read & process EIHD record.
468 Return TRUE on success, FALSE on error. */
471 _bfd_vms_slurp_eihd (bfd
*abfd
, unsigned int *eisd_offset
,
472 unsigned int *eihs_offset
)
474 unsigned int imgtype
, size
;
476 struct vms_eihd
*eihd
= (struct vms_eihd
*)PRIV (recrd
.rec
);
478 vms_debug2 ((8, "_bfd_vms_slurp_eihd\n"));
480 size
= bfd_getl32 (eihd
->size
);
481 imgtype
= bfd_getl32 (eihd
->imgtype
);
483 if (imgtype
== EIHD__K_EXE
|| imgtype
== EIHD__K_LIM
)
484 abfd
->flags
|= EXEC_P
;
486 symvva
= bfd_getl64 (eihd
->symvva
);
489 PRIV (symvva
) = symvva
;
490 abfd
->flags
|= DYNAMIC
;
493 PRIV (ident
) = bfd_getl32 (eihd
->ident
);
494 PRIV (matchctl
) = eihd
->matchctl
;
496 *eisd_offset
= bfd_getl32 (eihd
->isdoff
);
497 *eihs_offset
= bfd_getl32 (eihd
->symdbgoff
);
499 vms_debug2 ((4, "EIHD size %d imgtype %d symvva 0x%lx eisd %d eihs %d\n",
500 size
, imgtype
, (unsigned long)symvva
,
501 *eisd_offset
, *eihs_offset
));
506 /* Read & process EISD record.
507 Return TRUE on success, FALSE on error. */
510 _bfd_vms_slurp_eisd (bfd
*abfd
, unsigned int offset
)
512 int section_count
= 0;
514 vms_debug2 ((8, "_bfd_vms_slurp_eisd\n"));
518 struct vms_eisd
*eisd
;
519 unsigned int rec_size
;
521 unsigned long long vaddr
;
528 eisd
= (struct vms_eisd
*)(PRIV (recrd
.rec
) + offset
);
529 rec_size
= bfd_getl32 (eisd
->eisdsize
);
534 /* Skip to next block if pad. */
535 if (rec_size
== 0xffffffff)
537 offset
= (offset
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
543 size
= bfd_getl32 (eisd
->secsize
);
544 vaddr
= bfd_getl64 (eisd
->virt_addr
);
545 flags
= bfd_getl32 (eisd
->flags
);
546 vbn
= bfd_getl32 (eisd
->vbn
);
548 vms_debug2 ((4, "EISD at 0x%x size 0x%x addr 0x%lx flags 0x%x blk %d\n",
549 offset
, size
, (unsigned long)vaddr
, flags
, vbn
));
551 /* VMS combines psects from .obj files into isects in the .exe. This
552 process doesn't preserve enough information to reliably determine
553 what's in each section without examining the data. This is
554 especially true of DWARF debug sections. */
555 bfd_flags
= SEC_ALLOC
;
557 bfd_flags
|= SEC_HAS_CONTENTS
| SEC_LOAD
;
559 if (flags
& EISD__M_EXE
)
560 bfd_flags
|= SEC_CODE
;
562 if (flags
& EISD__M_NONSHRADR
)
563 bfd_flags
|= SEC_DATA
;
565 if (!(flags
& EISD__M_WRT
))
566 bfd_flags
|= SEC_READONLY
;
568 if (flags
& EISD__M_DZRO
)
569 bfd_flags
|= SEC_DATA
;
571 if (flags
& EISD__M_FIXUPVEC
)
572 bfd_flags
|= SEC_DATA
;
574 if (flags
& EISD__M_CRF
)
575 bfd_flags
|= SEC_DATA
;
577 if (flags
& EISD__M_GBL
)
579 name
= _bfd_vms_save_counted_string (eisd
->gblnam
);
580 bfd_flags
|= SEC_COFF_SHARED_LIBRARY
;
581 bfd_flags
&= ~(SEC_ALLOC
| SEC_LOAD
);
583 else if (flags
& EISD__M_FIXUPVEC
)
585 else if (eisd
->type
== EISD__K_USRSTACK
)
591 name
= (char*) bfd_alloc (abfd
, 32);
592 if (flags
& EISD__M_DZRO
)
594 else if (flags
& EISD__M_EXE
)
596 else if (!(flags
& EISD__M_WRT
))
600 BFD_ASSERT (section_count
< 999);
601 sprintf (name
, "$%s_%03d$", pfx
, section_count
++);
604 section
= bfd_make_section (abfd
, name
);
609 section
->filepos
= vbn
? VMS_BLOCK_SIZE
* (vbn
- 1) : 0;
610 section
->size
= size
;
611 section
->vma
= vaddr
;
613 if (!bfd_set_section_flags (abfd
, section
, bfd_flags
))
620 /* Read & process EIHS record.
621 Return TRUE on success, FALSE on error. */
624 _bfd_vms_slurp_eihs (bfd
*abfd
, unsigned int offset
)
626 unsigned char *p
= PRIV (recrd
.rec
) + offset
;
627 unsigned int gstvbn
= bfd_getl32 (p
+ EIHS__L_GSTVBN
);
628 unsigned int gstsize ATTRIBUTE_UNUSED
= bfd_getl32 (p
+ EIHS__L_GSTSIZE
);
629 unsigned int dstvbn
= bfd_getl32 (p
+ EIHS__L_DSTVBN
);
630 unsigned int dstsize
= bfd_getl32 (p
+ EIHS__L_DSTSIZE
);
631 unsigned int dmtvbn
= bfd_getl32 (p
+ EIHS__L_DMTVBN
);
632 unsigned int dmtbytes
= bfd_getl32 (p
+ EIHS__L_DMTBYTES
);
636 vms_debug (8, "_bfd_vms_slurp_ihs\n");
637 vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
638 gstvbn
, gstsize
, dstvbn
, dstsize
, dmtvbn
, dmtbytes
);
643 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
645 section
= bfd_make_section (abfd
, "$DST$");
649 section
->size
= dstsize
;
650 section
->filepos
= VMS_BLOCK_SIZE
* (dstvbn
- 1);
652 if (!bfd_set_section_flags (abfd
, section
, bfd_flags
))
655 PRIV (dst_section
) = section
;
656 abfd
->flags
|= (HAS_DEBUG
| HAS_LINENO
);
661 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
663 section
= bfd_make_section (abfd
, "$DMT$");
667 section
->size
= dmtbytes
;
668 section
->filepos
= VMS_BLOCK_SIZE
* (dmtvbn
- 1);
670 if (!bfd_set_section_flags (abfd
, section
, bfd_flags
))
676 if (bfd_seek (abfd
, VMS_BLOCK_SIZE
* (gstvbn
- 1), SEEK_SET
))
678 bfd_set_error (bfd_error_file_truncated
);
682 if (_bfd_vms_slurp_object_records (abfd
) != TRUE
)
685 abfd
->flags
|= HAS_SYMS
;
691 /* Object file reading. */
693 /* Object file input functions. */
695 /* Get next record from object file to vms_buf.
696 Set PRIV(buf_size) and return it
698 This is a little tricky since it should be portable.
700 The openVMS object file has 'variable length' which means that
701 read() returns data in chunks of (hopefully) correct and expected
702 size. The linker (and other tools on VMS) depend on that. Unix
703 doesn't know about 'formatted' files, so reading and writing such
704 an object file in a Unix environment is not trivial.
706 With the tool 'file' (available on all VMS FTP sites), one
707 can view and change the attributes of a file. Changing from
708 'variable length' to 'fixed length, 512 bytes' reveals the
709 record size at the first 2 bytes of every record. The same
710 may happen during the transfer of object files from VMS to Unix,
711 at least with UCX, the DEC implementation of TCP/IP.
713 The VMS format repeats the size at bytes 2 & 3 of every record.
715 On the first call (file_format == FF_UNKNOWN) we check if
716 the first and the third byte pair (!) of the record match.
717 If they do it's an object file in an Unix environment or with
718 wrong attributes (FF_FOREIGN), else we should be in a VMS
719 environment where read() returns the record size (FF_NATIVE).
721 Reading is always done in 2 steps:
722 1. first just the record header is read and the size extracted,
723 2. then the read buffer is adjusted and the remaining bytes are
726 All file I/O is done on even file positions. */
728 #define VMS_OBJECT_ADJUSTMENT 2
731 maybe_adjust_record_pointer_for_object (bfd
*abfd
)
733 /* Set the file format once for all on the first invocation. */
734 if (PRIV (recrd
.file_format
) == FF_UNKNOWN
)
736 if (PRIV (recrd
.rec
)[0] == PRIV (recrd
.rec
)[4]
737 && PRIV (recrd
.rec
)[1] == PRIV (recrd
.rec
)[5])
738 PRIV (recrd
.file_format
) = FF_FOREIGN
;
740 PRIV (recrd
.file_format
) = FF_NATIVE
;
743 /* The adjustment is needed only in an Unix environment. */
744 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
745 PRIV (recrd
.rec
) += VMS_OBJECT_ADJUSTMENT
;
748 /* Implement step #1 of the object record reading procedure.
749 Return the record type or -1 on failure. */
752 _bfd_vms_get_object_record (bfd
*abfd
)
754 unsigned int test_len
= 6;
757 vms_debug2 ((8, "_bfd_vms_get_obj_record\n"));
759 /* Skip alignment byte if the current position is odd. */
760 if (PRIV (recrd
.file_format
) == FF_FOREIGN
&& (bfd_tell (abfd
) & 1))
762 if (bfd_bread (PRIV (recrd
.buf
), 1, abfd
) != 1)
764 bfd_set_error (bfd_error_file_truncated
);
769 /* Read the record header */
770 if (bfd_bread (PRIV (recrd
.buf
), test_len
, abfd
) != test_len
)
772 bfd_set_error (bfd_error_file_truncated
);
776 /* Reset the record pointer. */
777 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
778 maybe_adjust_record_pointer_for_object (abfd
);
780 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
783 type
= bfd_getl16 (PRIV (recrd
.rec
));
785 vms_debug2 ((8, "_bfd_vms_get_obj_record: rec %p, size %d, type %d\n",
786 PRIV (recrd
.rec
), PRIV (recrd
.rec_size
), type
));
791 /* Implement step #2 of the object record reading procedure.
792 Return the size of the record or 0 on failure. */
795 vms_get_remaining_object_record (bfd
*abfd
, int read_so_far
)
797 unsigned int to_read
;
799 vms_debug2 ((8, "vms_get_remaining_obj_record\n"));
801 /* Extract record size. */
802 PRIV (recrd
.rec_size
) = bfd_getl16 (PRIV (recrd
.rec
) + 2);
804 if (PRIV (recrd
.rec_size
) <= 0)
806 bfd_set_error (bfd_error_file_truncated
);
810 /* That's what the linker manual says. */
811 if (PRIV (recrd
.rec_size
) > EOBJ__C_MAXRECSIZ
)
813 bfd_set_error (bfd_error_file_truncated
);
817 /* Take into account object adjustment. */
818 to_read
= PRIV (recrd
.rec_size
);
819 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
820 to_read
+= VMS_OBJECT_ADJUSTMENT
;
822 /* Adjust the buffer. */
823 if (to_read
> PRIV (recrd
.buf_size
))
826 = (unsigned char *) bfd_realloc (PRIV (recrd
.buf
), to_read
);
827 if (PRIV (recrd
.buf
) == NULL
)
829 PRIV (recrd
.buf_size
) = to_read
;
832 /* Read the remaining record. */
833 to_read
-= read_so_far
;
835 vms_debug2 ((8, "vms_get_remaining_obj_record: to_read %d\n", to_read
));
837 if (bfd_bread (PRIV (recrd
.buf
) + read_so_far
, to_read
, abfd
) != to_read
)
839 bfd_set_error (bfd_error_file_truncated
);
843 /* Reset the record pointer. */
844 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
845 maybe_adjust_record_pointer_for_object (abfd
);
847 vms_debug2 ((8, "vms_get_remaining_obj_record: size %d\n",
848 PRIV (recrd
.rec_size
)));
850 return PRIV (recrd
.rec_size
);
853 /* Read and process emh record.
854 Return TRUE on success, FALSE on error. */
857 _bfd_vms_slurp_ehdr (bfd
*abfd
)
860 unsigned char *vms_rec
;
863 vms_rec
= PRIV (recrd
.rec
);
865 vms_debug2 ((2, "HDR/EMH\n"));
867 subtype
= bfd_getl16 (vms_rec
+ 4);
869 vms_debug2 ((3, "subtype %d\n", subtype
));
875 PRIV (hdr_data
).hdr_b_strlvl
= vms_rec
[6];
876 PRIV (hdr_data
).hdr_l_arch1
= bfd_getl32 (vms_rec
+ 8);
877 PRIV (hdr_data
).hdr_l_arch2
= bfd_getl32 (vms_rec
+ 12);
878 PRIV (hdr_data
).hdr_l_recsiz
= bfd_getl32 (vms_rec
+ 16);
879 PRIV (hdr_data
).hdr_t_name
= _bfd_vms_save_counted_string (vms_rec
+ 20);
880 ptr
= vms_rec
+ 20 + vms_rec
[20] + 1;
881 PRIV (hdr_data
).hdr_t_version
=_bfd_vms_save_counted_string (ptr
);
883 PRIV (hdr_data
).hdr_t_date
= _bfd_vms_save_sized_string (ptr
, 17);
887 PRIV (hdr_data
).hdr_c_lnm
=
888 _bfd_vms_save_sized_string (vms_rec
, PRIV (recrd
.rec_size
- 6));
892 PRIV (hdr_data
).hdr_c_src
=
893 _bfd_vms_save_sized_string (vms_rec
, PRIV (recrd
.rec_size
- 6));
897 PRIV (hdr_data
).hdr_c_ttl
=
898 _bfd_vms_save_sized_string (vms_rec
, PRIV (recrd
.rec_size
- 6));
907 bfd_set_error (bfd_error_wrong_format
);
914 /* Typical sections for evax object files. */
916 #define EVAX_ABS_NAME "$ABS$"
917 #define EVAX_CODE_NAME "$CODE$"
918 #define EVAX_LINK_NAME "$LINK$"
919 #define EVAX_DATA_NAME "$DATA$"
920 #define EVAX_BSS_NAME "$BSS$"
921 #define EVAX_READONLYADDR_NAME "$READONLY_ADDR$"
922 #define EVAX_READONLY_NAME "$READONLY$"
923 #define EVAX_LITERAL_NAME "$LITERAL$"
924 #define EVAX_LITERALS_NAME "$LITERALS"
925 #define EVAX_COMMON_NAME "$COMMON$"
926 #define EVAX_LOCAL_NAME "$LOCAL$"
928 struct sec_flags_struct
930 const char *name
; /* Name of section. */
932 flagword flags_always
; /* Flags we set always. */
934 flagword flags_hassize
; /* Flags we set if the section has a size > 0. */
937 /* These flags are deccrtl/vaxcrtl (openVMS 6.2 Alpha) compatible. */
939 static struct sec_flags_struct evax_section_flags
[] =
945 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
) },
947 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
),
949 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
),
950 (SEC_CODE
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
) },
952 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
),
953 (SEC_DATA
| SEC_READONLY
),
954 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
),
955 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_READONLY
| SEC_LOAD
) },
957 (EGPS__V_REL
| EGPS__V_RD
),
958 (SEC_DATA
| SEC_READONLY
),
959 (EGPS__V_REL
| EGPS__V_RD
),
960 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_READONLY
| SEC_LOAD
) },
962 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
),
964 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
),
965 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
) },
967 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
),
969 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
),
971 { EVAX_READONLYADDR_NAME
,
972 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
),
973 (SEC_DATA
| SEC_READONLY
),
974 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
),
975 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_READONLY
| SEC_LOAD
) },
976 { EVAX_READONLY_NAME
,
977 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
),
978 (SEC_DATA
| SEC_READONLY
),
979 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
),
980 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_READONLY
| SEC_LOAD
) },
982 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
),
984 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
),
985 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
) },
986 { EVAX_LITERALS_NAME
,
987 (EGPS__V_PIC
| EGPS__V_OVR
),
988 (SEC_DATA
| SEC_READONLY
),
989 (EGPS__V_PIC
| EGPS__V_OVR
),
990 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_READONLY
| SEC_LOAD
) },
992 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
),
994 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
),
995 (SEC_IN_MEMORY
| SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
) }
998 /* Retrieve bfd section flags by name and size. */
1001 vms_secflag_by_name (bfd
*abfd ATTRIBUTE_UNUSED
,
1002 struct sec_flags_struct
*section_flags
,
1008 while (section_flags
[i
].name
!= NULL
)
1010 if (strcmp (name
, section_flags
[i
].name
) == 0)
1013 return section_flags
[i
].flags_hassize
;
1015 return section_flags
[i
].flags_always
;
1020 return section_flags
[i
].flags_hassize
;
1021 return section_flags
[i
].flags_always
;
1024 /* Retrieve vms section flags by name and size. */
1027 vms_esecflag_by_name (struct sec_flags_struct
*section_flags
,
1033 while (section_flags
[i
].name
!= NULL
)
1035 if (strcmp (name
, section_flags
[i
].name
) == 0)
1038 return section_flags
[i
].vflags_hassize
;
1040 return section_flags
[i
].vflags_always
;
1045 return section_flags
[i
].vflags_hassize
;
1046 return section_flags
[i
].vflags_always
;
1049 /* Add SYM to the symbol table of ABFD.
1050 Return FALSE in case of error. */
1053 add_symbol_entry (bfd
*abfd
, struct vms_symbol_entry
*sym
)
1055 if (PRIV (gsd_sym_count
) >= PRIV (max_sym_count
))
1057 if (PRIV (max_sym_count
) == 0)
1059 PRIV (max_sym_count
) = 128;
1060 PRIV (syms
) = bfd_malloc
1061 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*));
1065 PRIV (max_sym_count
) *= 2;
1066 PRIV (syms
) = bfd_realloc
1068 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*)));
1070 if (PRIV (syms
) == NULL
)
1074 PRIV (syms
)[PRIV (gsd_sym_count
)++] = sym
;
1078 /* Create a symbol whose name is ASCIC and add it to ABFD.
1079 Return NULL in case of error. */
1081 static struct vms_symbol_entry
*
1082 add_symbol (bfd
*abfd
, const unsigned char *ascic
)
1084 struct vms_symbol_entry
*entry
;
1088 entry
= (struct vms_symbol_entry
*)bfd_zalloc (abfd
, sizeof (*entry
) + len
);
1091 entry
->namelen
= len
;
1092 memcpy (entry
->name
, ascic
, len
);
1093 entry
->name
[len
] = 0;
1094 entry
->owner
= abfd
;
1096 if (!add_symbol_entry (abfd
, entry
))
1101 /* Read and process EGSD. Return FALSE on failure. */
1104 _bfd_vms_slurp_egsd (bfd
*abfd
)
1106 int gsd_type
, gsd_size
;
1108 unsigned char *vms_rec
;
1109 flagword new_flags
, old_flags
;
1111 unsigned long base_addr
;
1112 unsigned long align_addr
;
1114 vms_debug2 ((2, "EGSD\n"));
1116 PRIV (recrd
.rec
) += 8; /* Skip type, size, align pad. */
1117 PRIV (recrd
.rec_size
) -= 8;
1119 /* Calculate base address for each section. */
1122 while (PRIV (recrd
.rec_size
) > 0)
1124 vms_rec
= PRIV (recrd
.rec
);
1126 gsd_type
= bfd_getl16 (vms_rec
);
1127 gsd_size
= bfd_getl16 (vms_rec
+ 2);
1129 vms_debug2 ((3, "egsd_type %d\n", gsd_type
));
1135 /* Program section definition. */
1136 struct vms_egps
*egps
= (struct vms_egps
*)vms_rec
;
1138 name
= _bfd_vms_save_counted_string (&egps
->namlng
);
1139 section
= bfd_make_section (abfd
, name
);
1143 old_flags
= bfd_getl16 (egps
->flags
);
1144 vms_section_data (section
)->flags
= old_flags
;
1145 vms_section_data (section
)->no_flags
= 0;
1146 section
->size
= bfd_getl32 (egps
->alloc
);
1147 new_flags
= vms_secflag_by_name (abfd
, evax_section_flags
, name
,
1149 if (!(old_flags
& EGPS__V_NOMOD
))
1151 new_flags
|= SEC_HAS_CONTENTS
;
1152 if (old_flags
& EGPS__V_REL
)
1153 new_flags
|= SEC_RELOC
;
1155 if (!bfd_set_section_flags (abfd
, section
, new_flags
))
1157 section
->alignment_power
= egps
->align
;
1158 align_addr
= (1 << section
->alignment_power
);
1159 if ((base_addr
% align_addr
) != 0)
1160 base_addr
+= (align_addr
- (base_addr
% align_addr
));
1161 section
->vma
= (bfd_vma
)base_addr
;
1162 base_addr
+= section
->size
;
1163 section
->filepos
= (unsigned int)-1;
1165 /* Append it to the section array. */
1166 if (PRIV (section_count
) >= PRIV (section_max
))
1168 if (PRIV (section_max
) == 0)
1169 PRIV (section_max
) = 16;
1171 PRIV (section_max
) *= 2;
1172 PRIV (sections
) = bfd_realloc_or_free
1173 (PRIV (sections
), PRIV (section_max
) * sizeof (asection
*));
1174 if (PRIV (sections
) == NULL
)
1178 PRIV (sections
)[PRIV (section_count
)] = section
;
1179 PRIV (section_count
)++;
1182 vms_debug (4, "EGSD P-section %d (%s, flags %04x) ",
1183 section
->index
, name
, old_flags
);
1184 vms_debug (4, "%lu bytes at 0x%08lx (mem %p)\n",
1185 (unsigned long)section
->size
,
1186 (unsigned long)section
->vma
, section
->contents
);
1194 struct vms_symbol_entry
*entry
;
1195 struct vms_egsy
*egsy
= (struct vms_egsy
*) vms_rec
;
1197 old_flags
= bfd_getl16 (egsy
->flags
);
1198 if (old_flags
& EGSY__V_DEF
)
1199 nameoff
= ESDF__B_NAMLNG
;
1201 nameoff
= ESRF__B_NAMLNG
;
1203 entry
= add_symbol (abfd
, vms_rec
+ nameoff
);
1207 /* Allow only duplicate reference. */
1208 if ((entry
->flags
& EGSY__V_DEF
) && (old_flags
& EGSY__V_DEF
))
1211 if (entry
->typ
== 0)
1213 entry
->typ
= gsd_type
;
1214 entry
->data_type
= egsy
->datyp
;
1215 entry
->flags
= old_flags
;
1218 if (old_flags
& EGSY__V_DEF
)
1220 struct vms_esdf
*esdf
= (struct vms_esdf
*)vms_rec
;
1222 entry
->value
= bfd_getl64 (esdf
->value
);
1223 entry
->section
= PRIV (sections
)[bfd_getl32 (esdf
->psindx
)];
1225 if (old_flags
& EGSY__V_NORM
)
1227 PRIV (norm_sym_count
)++;
1229 entry
->code_value
= bfd_getl64 (esdf
->code_address
);
1230 entry
->code_section
=
1231 PRIV (sections
)[bfd_getl32 (esdf
->ca_psindx
)];
1240 struct vms_symbol_entry
*entry
;
1241 struct vms_egst
*egst
= (struct vms_egst
*)vms_rec
;
1243 old_flags
= bfd_getl16 (egst
->header
.flags
);
1244 if (old_flags
& EGSY__V_DEF
)
1245 nameoff
= ESDF__B_NAMLNG
;
1247 nameoff
= ESRF__B_NAMLNG
;
1249 entry
= add_symbol (abfd
, &egst
->namlng
);
1254 entry
->typ
= gsd_type
;
1255 entry
->data_type
= egst
->header
.datyp
;
1256 entry
->flags
= old_flags
;
1258 entry
->symbol_vector
= bfd_getl32 (egst
->value
);
1260 if (old_flags
& EGSY__V_REL
)
1261 entry
->section
= PRIV (sections
)[bfd_getl32 (egst
->psindx
)];
1263 entry
->section
= bfd_abs_section_ptr
;
1265 entry
->value
= bfd_getl64 (egst
->lp_2
);
1267 if (old_flags
& EGSY__V_NORM
)
1269 PRIV (norm_sym_count
)++;
1271 entry
->code_value
= bfd_getl64 (egst
->lp_1
);
1272 entry
->code_section
= bfd_abs_section_ptr
;
1279 /* Currently ignored. */
1284 (*_bfd_error_handler
) (_("Unknown EGSD subtype %d"), gsd_type
);
1285 bfd_set_error (bfd_error_bad_value
);
1289 PRIV (recrd
.rec_size
) -= gsd_size
;
1290 PRIV (recrd
.rec
) += gsd_size
;
1293 if (PRIV (gsd_sym_count
) > 0)
1294 abfd
->flags
|= HAS_SYMS
;
1299 /* Stack routines for vms ETIR commands. */
1301 /* Push value and section index. */
1304 _bfd_vms_push (bfd
*abfd
, bfd_vma val
, unsigned int reloc
)
1306 vms_debug2 ((4, "<push %08lx (0x%08x) at %d>\n",
1307 (unsigned long)val
, reloc
, PRIV (stackptr
)));
1309 PRIV (stack
[PRIV (stackptr
)]).value
= val
;
1310 PRIV (stack
[PRIV (stackptr
)]).reloc
= reloc
;
1312 if (PRIV (stackptr
) >= STACKSIZE
)
1314 bfd_set_error (bfd_error_bad_value
);
1315 (*_bfd_error_handler
) (_("Stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr
));
1320 /* Pop value and section index. */
1323 _bfd_vms_pop (bfd
*abfd
, bfd_vma
*val
, unsigned int *rel
)
1325 if (PRIV (stackptr
) == 0)
1327 bfd_set_error (bfd_error_bad_value
);
1328 (*_bfd_error_handler
) (_("Stack underflow in _bfd_vms_pop"));
1332 *val
= PRIV (stack
[PRIV (stackptr
)]).value
;
1333 *rel
= PRIV (stack
[PRIV (stackptr
)]).reloc
;
1335 vms_debug2 ((4, "<pop %08lx (0x%08x)>\n", (unsigned long)*val
, *rel
));
1338 /* Routines to fill sections contents during tir/etir read. */
1340 /* Initialize image buffer pointer to be filled. */
1343 image_set_ptr (bfd
*abfd
, bfd_vma vma
, int sect
, struct bfd_link_info
*info
)
1347 vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma
, sect
));
1349 sec
= PRIV (sections
)[sect
];
1353 /* Reading contents to an output bfd. */
1355 if (sec
->output_section
== NULL
)
1357 /* Section discarded. */
1358 vms_debug2 ((5, " section %s discarded\n", sec
->name
));
1360 /* This is not used. */
1361 PRIV (image_section
) = NULL
;
1362 PRIV (image_offset
) = 0;
1365 PRIV (image_offset
) = sec
->output_offset
+ vma
;
1366 PRIV (image_section
) = sec
->output_section
;
1370 PRIV (image_offset
) = vma
;
1371 PRIV (image_section
) = sec
;
1375 /* Increment image buffer pointer by offset. */
1378 image_inc_ptr (bfd
*abfd
, bfd_vma offset
)
1380 vms_debug2 ((4, "image_inc_ptr (%u)\n", (unsigned)offset
));
1382 PRIV (image_offset
) += offset
;
1385 /* Save current DST location counter under specified index. */
1388 dst_define_location (bfd
*abfd
, unsigned int loc
)
1390 vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc
));
1392 /* Grow the ptr offset table if necessary. */
1393 if (loc
+ 1 > PRIV (dst_ptr_offsets_count
))
1395 PRIV (dst_ptr_offsets
) = bfd_realloc (PRIV (dst_ptr_offsets
),
1396 (loc
+ 1) * sizeof (unsigned int));
1397 PRIV (dst_ptr_offsets_count
) = loc
+ 1;
1400 PRIV (dst_ptr_offsets
)[loc
] = PRIV (image_offset
);
1403 /* Restore saved DST location counter from specified index. */
1406 dst_restore_location (bfd
*abfd
, unsigned int loc
)
1408 vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc
));
1410 PRIV (image_offset
) = PRIV (dst_ptr_offsets
)[loc
];
1413 /* Retrieve saved DST location counter from specified index. */
1416 dst_retrieve_location (bfd
*abfd
, unsigned int loc
)
1418 vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int)loc
));
1420 return PRIV (dst_ptr_offsets
)[loc
];
1423 /* Write multiple bytes to section image. */
1426 image_write (bfd
*abfd
, unsigned char *ptr
, int size
)
1429 _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr
, size
,
1430 (long)PRIV (image_offset
));
1431 _bfd_hexdump (9, ptr
, size
, 0);
1434 if (PRIV (image_section
)->contents
!= NULL
)
1436 asection
*sec
= PRIV (image_section
);
1437 file_ptr off
= PRIV (image_offset
);
1440 if (off
> (file_ptr
)sec
->size
1441 || size
> (file_ptr
)sec
->size
1442 || off
+ size
> (file_ptr
)sec
->size
)
1444 bfd_set_error (bfd_error_bad_value
);
1448 memcpy (sec
->contents
+ off
, ptr
, size
);
1451 PRIV (image_offset
) += size
;
1455 /* Write byte to section image. */
1458 image_write_b (bfd
* abfd
, unsigned int value
)
1460 unsigned char data
[1];
1462 vms_debug2 ((6, "image_write_b (%02x)\n", (int) value
));
1466 return image_write (abfd
, data
, sizeof (data
));
1469 /* Write 2-byte word to image. */
1472 image_write_w (bfd
* abfd
, unsigned int value
)
1474 unsigned char data
[2];
1476 vms_debug2 ((6, "image_write_w (%04x)\n", (int) value
));
1478 bfd_putl16 (value
, data
);
1479 return image_write (abfd
, data
, sizeof (data
));
1482 /* Write 4-byte long to image. */
1485 image_write_l (bfd
* abfd
, unsigned long value
)
1487 unsigned char data
[4];
1489 vms_debug2 ((6, "image_write_l (%08lx)\n", value
));
1491 bfd_putl32 (value
, data
);
1492 return image_write (abfd
, data
, sizeof (data
));
1495 /* Write 8-byte quad to image. */
1498 image_write_q (bfd
* abfd
, bfd_vma value
)
1500 unsigned char data
[8];
1502 vms_debug2 ((6, "image_write_q (%08lx)\n", (unsigned long)value
));
1504 bfd_putl64 (value
, data
);
1505 return image_write (abfd
, data
, sizeof (data
));
1509 _bfd_vms_etir_name (int cmd
)
1513 case ETIR__C_STA_GBL
: return "ETIR__C_STA_GBL";
1514 case ETIR__C_STA_LW
: return "ETIR__C_STA_LW";
1515 case ETIR__C_STA_QW
: return "ETIR__C_STA_QW";
1516 case ETIR__C_STA_PQ
: return "ETIR__C_STA_PQ";
1517 case ETIR__C_STA_LI
: return "ETIR__C_STA_LI";
1518 case ETIR__C_STA_MOD
: return "ETIR__C_STA_MOD";
1519 case ETIR__C_STA_CKARG
: return "ETIR__C_STA_CKARG";
1520 case ETIR__C_STO_B
: return "ETIR__C_STO_B";
1521 case ETIR__C_STO_W
: return "ETIR__C_STO_W";
1522 case ETIR__C_STO_GBL
: return "ETIR__C_STO_GBL";
1523 case ETIR__C_STO_CA
: return "ETIR__C_STO_CA";
1524 case ETIR__C_STO_RB
: return "ETIR__C_STO_RB";
1525 case ETIR__C_STO_AB
: return "ETIR__C_STO_AB";
1526 case ETIR__C_STO_OFF
: return "ETIR__C_STO_OFF";
1527 case ETIR__C_STO_IMM
: return "ETIR__C_STO_IMM";
1528 case ETIR__C_STO_IMMR
: return "ETIR__C_STO_IMMR";
1529 case ETIR__C_STO_LW
: return "ETIR__C_STO_LW";
1530 case ETIR__C_STO_QW
: return "ETIR__C_STO_QW";
1531 case ETIR__C_STO_GBL_LW
: return "ETIR__C_STO_GBL_LW";
1532 case ETIR__C_STO_LP_PSB
: return "ETIR__C_STO_LP_PSB";
1533 case ETIR__C_STO_HINT_GBL
: return "ETIR__C_STO_HINT_GBL";
1534 case ETIR__C_STO_HINT_PS
: return "ETIR__C_STO_HINT_PS";
1535 case ETIR__C_OPR_ADD
: return "ETIR__C_OPR_ADD";
1536 case ETIR__C_OPR_SUB
: return "ETIR__C_OPR_SUB";
1537 case ETIR__C_OPR_INSV
: return "ETIR__C_OPR_INSV";
1538 case ETIR__C_OPR_USH
: return "ETIR__C_OPR_USH";
1539 case ETIR__C_OPR_ROT
: return "ETIR__C_OPR_ROT";
1540 case ETIR__C_OPR_REDEF
: return "ETIR__C_OPR_REDEF";
1541 case ETIR__C_OPR_DFLIT
: return "ETIR__C_OPR_DFLIT";
1542 case ETIR__C_STC_LP
: return "ETIR__C_STC_LP";
1543 case ETIR__C_STC_GBL
: return "ETIR__C_STC_GBL";
1544 case ETIR__C_STC_GCA
: return "ETIR__C_STC_GCA";
1545 case ETIR__C_STC_PS
: return "ETIR__C_STC_PS";
1546 case ETIR__C_STC_NBH_PS
: return "ETIR__C_STC_NBH_PS";
1547 case ETIR__C_STC_NOP_GBL
: return "ETIR__C_STC_NOP_GBL";
1548 case ETIR__C_STC_NOP_PS
: return "ETIR__C_STC_NOP_PS";
1549 case ETIR__C_STC_BSR_GBL
: return "ETIR__C_STC_BSR_GBL";
1550 case ETIR__C_STC_BSR_PS
: return "ETIR__C_STC_BSR_PS";
1551 case ETIR__C_STC_LDA_GBL
: return "ETIR__C_STC_LDA_GBL";
1552 case ETIR__C_STC_LDA_PS
: return "ETIR__C_STC_LDA_PS";
1553 case ETIR__C_STC_BOH_GBL
: return "ETIR__C_STC_BOH_GBL";
1554 case ETIR__C_STC_BOH_PS
: return "ETIR__C_STC_BOH_PS";
1555 case ETIR__C_STC_NBH_GBL
: return "ETIR__C_STC_NBH_GBL";
1556 case ETIR__C_STC_LP_PSB
: return "ETIR__C_STC_LP_PSB";
1557 case ETIR__C_CTL_SETRB
: return "ETIR__C_CTL_SETRB";
1558 case ETIR__C_CTL_AUGRB
: return "ETIR__C_CTL_AUGRB";
1559 case ETIR__C_CTL_DFLOC
: return "ETIR__C_CTL_DFLOC";
1560 case ETIR__C_CTL_STLOC
: return "ETIR__C_CTL_STLOC";
1561 case ETIR__C_CTL_STKDL
: return "ETIR__C_CTL_STKDL";
1564 /* These names have not yet been added to this switch statement. */
1565 (*_bfd_error_handler
) (_("unknown ETIR command %d"), cmd
);
1570 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
1573 _bfd_vms_get_value (bfd
*abfd
, const unsigned char *ascic
,
1574 struct bfd_link_info
*info
,
1576 struct alpha_vms_link_hash_entry
**hp
)
1581 struct alpha_vms_link_hash_entry
*h
;
1583 /* Not linking. Do not try to resolve the symbol. */
1592 for (i
= 0; i
< len
; i
++)
1593 name
[i
] = ascic
[i
+ 1];
1596 h
= (struct alpha_vms_link_hash_entry
*)
1597 bfd_link_hash_lookup (info
->hash
, name
, FALSE
, FALSE
, TRUE
);
1602 && (h
->root
.type
== bfd_link_hash_defined
1603 || h
->root
.type
== bfd_link_hash_defweak
))
1604 *vma
= h
->root
.u
.def
.value
1605 + h
->root
.u
.def
.section
->output_offset
1606 + h
->root
.u
.def
.section
->output_section
->vma
;
1607 else if (h
&& h
->root
.type
== bfd_link_hash_undefweak
)
1611 if (!(*info
->callbacks
->undefined_symbol
)
1612 (info
, name
, abfd
, PRIV (image_section
), PRIV (image_offset
), TRUE
))
1620 #define RELC_SHR_BASE 0x10000
1621 #define RELC_SEC_BASE 0x20000
1622 #define RELC_MASK 0x0ffff
1625 alpha_vms_sym_to_ctxt (struct alpha_vms_link_hash_entry
*h
)
1627 /* Handle undefined symbols. */
1628 if (h
== NULL
|| h
->sym
== NULL
)
1631 if (h
->sym
->typ
== EGSD__C_SYMG
)
1633 if (h
->sym
->flags
& EGSY__V_REL
)
1634 return RELC_SHR_BASE
+ PRIV2 (h
->sym
->owner
, shr_index
);
1637 /* Can this happen (non-relocatable symg) ? I'd like to see
1642 if (h
->sym
->typ
== EGSD__C_SYM
)
1644 if (h
->sym
->flags
& EGSY__V_REL
)
1653 alpha_vms_get_sym_value (asection
*sect
, bfd_vma addr
)
1655 return sect
->output_section
->vma
+ sect
->output_offset
+ addr
;
1659 alpha_vms_fix_sec_rel (bfd
*abfd
, struct bfd_link_info
*info
,
1660 unsigned int rel
, bfd_vma vma
)
1662 asection
*sec
= PRIV (sections
)[rel
& RELC_MASK
];
1666 if (sec
->output_section
== NULL
)
1668 return vma
+ sec
->output_section
->vma
+ sec
->output_offset
;
1671 return vma
+ sec
->vma
;
1674 /* Read an ETIR record from ABFD. If INFO is not null, put the content into
1675 the output section (used during linking).
1676 Return FALSE in case of error. */
1679 _bfd_vms_slurp_etir (bfd
*abfd
, struct bfd_link_info
*info
)
1682 unsigned int length
;
1683 unsigned char *maxptr
;
1688 struct alpha_vms_link_hash_entry
*h
;
1690 PRIV (recrd
.rec
) += ETIR__C_HEADER_SIZE
;
1691 PRIV (recrd
.rec_size
) -= ETIR__C_HEADER_SIZE
;
1693 ptr
= PRIV (recrd
.rec
);
1694 length
= PRIV (recrd
.rec_size
);
1695 maxptr
= ptr
+ length
;
1697 vms_debug2 ((2, "ETIR: %d bytes\n", length
));
1699 while (ptr
< maxptr
)
1701 int cmd
= bfd_getl16 (ptr
);
1702 int cmd_length
= bfd_getl16 (ptr
+ 2);
1707 _bfd_vms_debug (4, "etir: %s(%d)\n",
1708 _bfd_vms_etir_name (cmd
), cmd
);
1709 _bfd_hexdump (8, ptr
, cmd_length
- 4, (long) ptr
);
1717 stack 32 bit value of symbol (high bits set to 0). */
1718 case ETIR__C_STA_GBL
:
1719 _bfd_vms_get_value (abfd
, ptr
, info
, &op1
, &h
);
1720 _bfd_vms_push (abfd
, op1
, alpha_vms_sym_to_ctxt (h
));
1726 stack 32 bit value, sign extend to 64 bit. */
1727 case ETIR__C_STA_LW
:
1728 _bfd_vms_push (abfd
, bfd_getl32 (ptr
), RELC_NONE
);
1734 stack 64 bit value of symbol. */
1735 case ETIR__C_STA_QW
:
1736 _bfd_vms_push (abfd
, bfd_getl64 (ptr
), RELC_NONE
);
1739 /* Stack psect base plus quadword offset
1740 arg: lw section index
1741 qw signed quadword offset (low 32 bits)
1743 Stack qw argument and section index
1744 (see ETIR__C_STO_OFF, ETIR__C_CTL_SETRB). */
1745 case ETIR__C_STA_PQ
:
1749 psect
= bfd_getl32 (ptr
);
1750 if ((unsigned int) psect
>= PRIV (section_count
))
1752 (*_bfd_error_handler
) (_("bad section index in %s"),
1753 _bfd_vms_etir_name (cmd
));
1754 bfd_set_error (bfd_error_bad_value
);
1757 op1
= bfd_getl64 (ptr
+ 4);
1758 _bfd_vms_push (abfd
, op1
, psect
| RELC_SEC_BASE
);
1762 case ETIR__C_STA_LI
:
1763 case ETIR__C_STA_MOD
:
1764 case ETIR__C_STA_CKARG
:
1765 (*_bfd_error_handler
) (_("unsupported STA cmd %s"),
1766 _bfd_vms_etir_name (cmd
));
1770 /* Store byte: pop stack, write byte
1773 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1774 if (rel1
!= RELC_NONE
)
1776 image_write_b (abfd
, (unsigned int) op1
& 0xff);
1779 /* Store word: pop stack, write word
1782 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1783 if (rel1
!= RELC_NONE
)
1785 image_write_w (abfd
, (unsigned int) op1
& 0xffff);
1788 /* Store longword: pop stack, write longword
1790 case ETIR__C_STO_LW
:
1791 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1792 if (rel1
& RELC_SEC_BASE
)
1794 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
1797 else if (rel1
& RELC_SHR_BASE
)
1799 alpha_vms_add_lw_fixup (info
, rel1
& RELC_MASK
, op1
);
1802 if (rel1
!= RELC_NONE
)
1804 if (rel1
!= RELC_REL
)
1806 alpha_vms_add_lw_reloc (info
);
1808 image_write_l (abfd
, op1
);
1811 /* Store quadword: pop stack, write quadword
1813 case ETIR__C_STO_QW
:
1814 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1815 if (rel1
& RELC_SEC_BASE
)
1817 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
1820 else if (rel1
& RELC_SHR_BASE
)
1822 if (rel1
!= RELC_NONE
)
1824 if (rel1
!= RELC_REL
)
1826 alpha_vms_add_qw_reloc (info
);
1828 image_write_q (abfd
, op1
);
1831 /* Store immediate repeated: pop stack for repeat count
1834 case ETIR__C_STO_IMMR
:
1838 size
= bfd_getl32 (ptr
);
1839 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1840 if (rel1
!= RELC_NONE
)
1843 image_write (abfd
, ptr
+ 4, size
);
1847 /* Store global: write symbol value
1848 arg: cs global symbol name. */
1849 case ETIR__C_STO_GBL
:
1850 _bfd_vms_get_value (abfd
, ptr
, info
, &op1
, &h
);
1853 if (h
->sym
->typ
== EGSD__C_SYMG
)
1855 alpha_vms_add_fixup_qr
1856 (info
, abfd
, h
->sym
->owner
, h
->sym
->symbol_vector
);
1861 op1
= alpha_vms_get_sym_value (h
->sym
->section
,
1863 alpha_vms_add_qw_reloc (info
);
1866 image_write_q (abfd
, op1
);
1869 /* Store code address: write address of entry point
1870 arg: cs global symbol name (procedure). */
1871 case ETIR__C_STO_CA
:
1872 _bfd_vms_get_value (abfd
, ptr
, info
, &op1
, &h
);
1875 if (h
->sym
->flags
& EGSY__V_NORM
)
1877 /* That's really a procedure. */
1878 if (h
->sym
->typ
== EGSD__C_SYMG
)
1880 alpha_vms_add_fixup_ca (info
, abfd
, h
->sym
->owner
);
1881 op1
= h
->sym
->symbol_vector
;
1885 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
1886 h
->sym
->code_value
);
1887 alpha_vms_add_qw_reloc (info
);
1892 /* Symbol is not a procedure. */
1896 image_write_q (abfd
, op1
);
1899 /* Store offset to psect: pop stack, add low 32 bits to base of psect
1901 case ETIR__C_STO_OFF
:
1902 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1904 if (!(rel1
& RELC_SEC_BASE
))
1907 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
1909 image_write_q (abfd
, op1
);
1913 arg: lw count of bytes
1915 case ETIR__C_STO_IMM
:
1919 size
= bfd_getl32 (ptr
);
1920 image_write (abfd
, ptr
+ 4, size
);
1924 /* This code is 'reserved to digital' according to the openVMS
1925 linker manual, however it is generated by the DEC C compiler
1926 and defined in the include file.
1927 FIXME, since the following is just a guess
1928 store global longword: store 32bit value of symbol
1929 arg: cs symbol name. */
1930 case ETIR__C_STO_GBL_LW
:
1931 _bfd_vms_get_value (abfd
, ptr
, info
, &op1
, &h
);
1935 image_write_l (abfd
, op1
);
1938 case ETIR__C_STO_RB
:
1939 case ETIR__C_STO_AB
:
1940 case ETIR__C_STO_LP_PSB
:
1941 (*_bfd_error_handler
) (_("%s: not supported"),
1942 _bfd_vms_etir_name (cmd
));
1945 case ETIR__C_STO_HINT_GBL
:
1946 case ETIR__C_STO_HINT_PS
:
1947 (*_bfd_error_handler
) (_("%s: not implemented"),
1948 _bfd_vms_etir_name (cmd
));
1952 /* 200 Store-conditional Linkage Pair
1954 case ETIR__C_STC_LP
:
1956 /* 202 Store-conditional Address at global address
1960 case ETIR__C_STC_GBL
:
1962 /* 203 Store-conditional Code Address at global address
1964 cs procedure name. */
1965 case ETIR__C_STC_GCA
:
1967 /* 204 Store-conditional Address at psect + offset
1971 case ETIR__C_STC_PS
:
1972 (*_bfd_error_handler
) (_("%s: not supported"),
1973 _bfd_vms_etir_name (cmd
));
1977 /* 201 Store-conditional Linkage Pair with Procedure Signature
1983 case ETIR__C_STC_LP_PSB
:
1984 _bfd_vms_get_value (abfd
, ptr
+ 4, info
, &op1
, &h
);
1987 if (h
->sym
->typ
== EGSD__C_SYMG
)
1989 alpha_vms_add_fixup_lp (info
, abfd
, h
->sym
->owner
);
1990 op1
= h
->sym
->symbol_vector
;
1995 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
1996 h
->sym
->code_value
);
1997 op2
= alpha_vms_get_sym_value (h
->sym
->section
,
2003 /* Undefined symbol. */
2007 image_write_q (abfd
, op1
);
2008 image_write_q (abfd
, op2
);
2011 /* 205 Store-conditional NOP at address of global
2013 case ETIR__C_STC_NOP_GBL
:
2016 /* 207 Store-conditional BSR at global address
2019 case ETIR__C_STC_BSR_GBL
:
2022 /* 209 Store-conditional LDA at global address
2025 case ETIR__C_STC_LDA_GBL
:
2028 /* 211 Store-conditional BSR or Hint at global address
2031 case ETIR__C_STC_BOH_GBL
:
2032 /* Currentl ignored. */
2035 /* 213 Store-conditional NOP,BSR or HINT at global address
2038 case ETIR__C_STC_NBH_GBL
:
2040 /* 206 Store-conditional NOP at pect + offset
2043 case ETIR__C_STC_NOP_PS
:
2045 /* 208 Store-conditional BSR at pect + offset
2048 case ETIR__C_STC_BSR_PS
:
2050 /* 210 Store-conditional LDA at psect + offset
2053 case ETIR__C_STC_LDA_PS
:
2055 /* 212 Store-conditional BSR or Hint at pect + offset
2058 case ETIR__C_STC_BOH_PS
:
2060 /* 214 Store-conditional NOP, BSR or HINT at psect + offset
2062 case ETIR__C_STC_NBH_PS
:
2063 (*_bfd_error_handler
) ("%s: not supported",
2064 _bfd_vms_etir_name (cmd
));
2068 /* Det relocation base: pop stack, set image location counter
2070 case ETIR__C_CTL_SETRB
:
2071 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2072 if (!(rel1
& RELC_SEC_BASE
))
2074 image_set_ptr (abfd
, op1
, rel1
& RELC_MASK
, info
);
2077 /* Augment relocation base: increment image location counter by offset
2078 arg: lw offset value. */
2079 case ETIR__C_CTL_AUGRB
:
2080 op1
= bfd_getl32 (ptr
);
2081 image_inc_ptr (abfd
, op1
);
2084 /* Define location: pop index, save location counter under index
2086 case ETIR__C_CTL_DFLOC
:
2087 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2088 if (rel1
!= RELC_NONE
)
2090 dst_define_location (abfd
, op1
);
2093 /* Set location: pop index, restore location counter from index
2095 case ETIR__C_CTL_STLOC
:
2096 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2097 if (rel1
!= RELC_NONE
)
2099 dst_restore_location (abfd
, op1
);
2102 /* Stack defined location: pop index, push location counter from index
2104 case ETIR__C_CTL_STKDL
:
2105 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2106 if (rel1
!= RELC_NONE
)
2108 _bfd_vms_push (abfd
, dst_retrieve_location (abfd
, op1
), RELC_NONE
);
2111 case ETIR__C_OPR_NOP
: /* No-op. */
2114 case ETIR__C_OPR_ADD
: /* Add. */
2115 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2116 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2117 if (rel1
== RELC_NONE
&& rel2
!= RELC_NONE
)
2119 else if (rel1
!= RELC_NONE
&& rel2
!= RELC_NONE
)
2121 _bfd_vms_push (abfd
, op1
+ op2
, rel1
);
2124 case ETIR__C_OPR_SUB
: /* Subtract. */
2125 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2126 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2127 if (rel1
== RELC_NONE
&& rel2
!= RELC_NONE
)
2129 else if ((rel1
& RELC_SEC_BASE
) && (rel2
& RELC_SEC_BASE
))
2131 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2132 op2
= alpha_vms_fix_sec_rel (abfd
, info
, rel2
, op2
);
2135 else if (rel1
!= RELC_NONE
&& rel2
!= RELC_NONE
)
2137 _bfd_vms_push (abfd
, op2
- op1
, rel1
);
2140 case ETIR__C_OPR_MUL
: /* Multiply. */
2141 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2142 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2143 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2145 _bfd_vms_push (abfd
, op1
* op2
, RELC_NONE
);
2148 case ETIR__C_OPR_DIV
: /* Divide. */
2149 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2150 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2151 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2154 _bfd_vms_push (abfd
, 0, RELC_NONE
);
2156 _bfd_vms_push (abfd
, op2
/ op1
, RELC_NONE
);
2159 case ETIR__C_OPR_AND
: /* Logical AND. */
2160 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2161 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2162 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2164 _bfd_vms_push (abfd
, op1
& op2
, RELC_NONE
);
2167 case ETIR__C_OPR_IOR
: /* Logical inclusive OR. */
2168 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2169 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2170 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2172 _bfd_vms_push (abfd
, op1
| op2
, RELC_NONE
);
2175 case ETIR__C_OPR_EOR
: /* Logical exclusive OR. */
2176 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2177 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2178 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2180 _bfd_vms_push (abfd
, op1
^ op2
, RELC_NONE
);
2183 case ETIR__C_OPR_NEG
: /* Negate. */
2184 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2185 if (rel1
!= RELC_NONE
)
2187 _bfd_vms_push (abfd
, -op1
, RELC_NONE
);
2190 case ETIR__C_OPR_COM
: /* Complement. */
2191 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2192 if (rel1
!= RELC_NONE
)
2194 _bfd_vms_push (abfd
, ~op1
, RELC_NONE
);
2197 case ETIR__C_OPR_ASH
: /* Arithmetic shift. */
2198 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2199 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2200 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2203 (*_bfd_error_handler
) (_("invalid use of %s with contexts"),
2204 _bfd_vms_etir_name (cmd
));
2207 if ((int)op2
< 0) /* Shift right. */
2209 else /* Shift left. */
2211 _bfd_vms_push (abfd
, op1
, RELC_NONE
); /* FIXME: sym. */
2214 case ETIR__C_OPR_INSV
: /* Insert field. */
2215 case ETIR__C_OPR_USH
: /* Unsigned shift. */
2216 case ETIR__C_OPR_ROT
: /* Rotate. */
2217 case ETIR__C_OPR_REDEF
: /* Redefine symbol to current location. */
2218 case ETIR__C_OPR_DFLIT
: /* Define a literal. */
2219 (*_bfd_error_handler
) (_("%s: not supported"),
2220 _bfd_vms_etir_name (cmd
));
2224 case ETIR__C_OPR_SEL
: /* Select. */
2225 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2227 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2230 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2231 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2232 _bfd_vms_push (abfd
, op1
, rel1
);
2237 (*_bfd_error_handler
) (_("reserved cmd %d"), cmd
);
2242 ptr
+= cmd_length
- 4;
2248 /* Process EDBG/ETBT record.
2249 Return TRUE on success, FALSE on error */
2252 vms_slurp_debug (bfd
*abfd
)
2254 asection
*section
= PRIV (dst_section
);
2256 if (section
== NULL
)
2258 /* We have no way to find out beforehand how much debug info there
2259 is in an object file, so pick an initial amount and grow it as
2261 flagword flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
| SEC_RELOC
2264 section
= bfd_make_section (abfd
, "$DST$");
2267 if (!bfd_set_section_flags (abfd
, section
, flags
))
2269 PRIV (dst_section
) = section
;
2272 PRIV (image_section
) = section
;
2273 PRIV (image_offset
) = section
->size
;
2275 if (!_bfd_vms_slurp_etir (abfd
, NULL
))
2278 section
->size
= PRIV (image_offset
);
2282 /* Process EDBG record.
2283 Return TRUE on success, FALSE on error. */
2286 _bfd_vms_slurp_edbg (bfd
*abfd
)
2288 vms_debug2 ((2, "EDBG\n"));
2290 abfd
->flags
|= HAS_DEBUG
| HAS_LINENO
;
2292 return vms_slurp_debug (abfd
);
2295 /* Process ETBT record.
2296 Return TRUE on success, FALSE on error. */
2299 _bfd_vms_slurp_etbt (bfd
*abfd
)
2301 vms_debug2 ((2, "ETBT\n"));
2303 abfd
->flags
|= HAS_LINENO
;
2305 return vms_slurp_debug (abfd
);
2308 /* Process EEOM record.
2309 Return TRUE on success, FALSE on error. */
2312 _bfd_vms_slurp_eeom (bfd
*abfd
)
2314 struct vms_eeom
*eeom
= (struct vms_eeom
*) PRIV (recrd
.rec
);
2316 vms_debug2 ((2, "EEOM\n"));
2318 PRIV (eom_data
).eom_l_total_lps
= bfd_getl32 (eeom
->total_lps
);
2319 PRIV (eom_data
).eom_w_comcod
= bfd_getl16 (eeom
->comcod
);
2320 if (PRIV (eom_data
).eom_w_comcod
> 1)
2322 (*_bfd_error_handler
) (_("Object module NOT error-free !\n"));
2323 bfd_set_error (bfd_error_bad_value
);
2327 PRIV (eom_data
).eom_has_transfer
= FALSE
;
2328 if (PRIV (recrd
.rec_size
) > 10)
2330 PRIV (eom_data
).eom_has_transfer
= TRUE
;
2331 PRIV (eom_data
).eom_b_tfrflg
= eeom
->tfrflg
;
2332 PRIV (eom_data
).eom_l_psindx
= bfd_getl32 (eeom
->psindx
);
2333 PRIV (eom_data
).eom_l_tfradr
= bfd_getl32 (eeom
->tfradr
);
2335 abfd
->start_address
= PRIV (eom_data
).eom_l_tfradr
;
2340 /* Slurp an ordered set of VMS object records. Return FALSE on error. */
2343 _bfd_vms_slurp_object_records (bfd
* abfd
)
2350 vms_debug2 ((7, "reading at %08lx\n", (unsigned long)bfd_tell (abfd
)));
2352 type
= _bfd_vms_get_object_record (abfd
);
2355 vms_debug2 ((2, "next_record failed\n"));
2362 err
= _bfd_vms_slurp_ehdr (abfd
);
2365 err
= _bfd_vms_slurp_eeom (abfd
);
2368 err
= _bfd_vms_slurp_egsd (abfd
);
2371 err
= TRUE
; /* _bfd_vms_slurp_etir (abfd); */
2374 err
= _bfd_vms_slurp_edbg (abfd
);
2377 err
= _bfd_vms_slurp_etbt (abfd
);
2384 vms_debug2 ((2, "slurp type %d failed\n", type
));
2388 while (type
!= EOBJ__C_EEOM
);
2393 /* Initialize private data */
2395 vms_initialize (bfd
* abfd
)
2399 amt
= sizeof (struct vms_private_data_struct
);
2400 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
2401 if (abfd
->tdata
.any
== NULL
)
2404 PRIV (recrd
.file_format
) = FF_UNKNOWN
;
2406 amt
= sizeof (struct stack_struct
) * STACKSIZE
;
2407 PRIV (stack
) = bfd_alloc (abfd
, amt
);
2408 if (PRIV (stack
) == NULL
)
2414 bfd_release (abfd
, abfd
->tdata
.any
);
2415 abfd
->tdata
.any
= NULL
;
2419 /* Check the format for a file being read.
2420 Return a (bfd_target *) if it's an object file or zero if not. */
2422 static const struct bfd_target
*
2423 alpha_vms_object_p (bfd
*abfd
)
2425 PTR tdata_save
= abfd
->tdata
.any
;
2426 unsigned int test_len
;
2429 vms_debug2 ((1, "vms_object_p(%p)\n", abfd
));
2431 /* Allocate alpha-vms specific data. */
2432 if (!vms_initialize (abfd
))
2435 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
))
2436 goto err_wrong_format
;
2438 /* The first challenge with VMS is to discover the kind of the file.
2440 Image files (executable or shared images) are stored as a raw
2441 stream of bytes (like on UNIX), but there is no magic number.
2443 Object files are written with RMS (record management service), ie
2444 each records are preceeded by its length (on a word - 2 bytes), and
2445 padded for word-alignment. That would be simple but when files
2446 are transfered to a UNIX filesystem (using ftp), records are lost.
2447 Only the raw content of the records are transfered. Fortunately,
2448 the Alpha Object file format also store the length of the record
2449 in the records. Is that clear ? */
2451 /* Minimum is 6 bytes for objects (2 bytes size, 2 bytes record id,
2452 2 bytes size repeated) and 12 bytes for images (4 bytes major id,
2453 4 bytes minor id, 4 bytes length). */
2456 /* Size the main buffer. */
2457 buf
= (unsigned char *) bfd_malloc (test_len
);
2460 PRIV (recrd
.buf
) = buf
;
2461 PRIV (recrd
.buf_size
) = test_len
;
2463 /* Initialize the record pointer. */
2464 PRIV (recrd
.rec
) = buf
;
2466 if (bfd_bread (buf
, test_len
, abfd
) != test_len
)
2468 bfd_set_error (bfd_error_file_truncated
);
2472 /* Is it an image? */
2473 if ((bfd_getl32 (buf
) == EIHD__K_MAJORID
)
2474 && (bfd_getl32 (buf
+ 4) == EIHD__K_MINORID
))
2476 unsigned int to_read
;
2477 unsigned int read_so_far
;
2478 unsigned int remaining
;
2479 unsigned int eisd_offset
, eihs_offset
;
2481 /* Extract the header size. */
2482 PRIV (recrd
.rec_size
) = bfd_getl32 (buf
+ EIHD__L_SIZE
);
2484 /* The header size is 0 for DSF files. */
2485 if (PRIV (recrd
.rec_size
) == 0)
2486 PRIV (recrd
.rec_size
) = sizeof (struct vms_eihd
);
2488 if (PRIV (recrd
.rec_size
) > PRIV (recrd
.buf_size
))
2490 buf
= bfd_realloc_or_free (buf
, PRIV (recrd
.rec_size
));
2494 PRIV (recrd
.buf
) = NULL
;
2495 bfd_set_error (bfd_error_no_memory
);
2498 PRIV (recrd
.buf
) = buf
;
2499 PRIV (recrd
.buf_size
) = PRIV (recrd
.rec_size
);
2502 /* Read the remaining record. */
2503 remaining
= PRIV (recrd
.rec_size
) - test_len
;
2504 to_read
= MIN (VMS_BLOCK_SIZE
- test_len
, remaining
);
2505 read_so_far
= test_len
;
2507 while (remaining
> 0)
2509 if (bfd_bread (buf
+ read_so_far
, to_read
, abfd
) != to_read
)
2511 bfd_set_error (bfd_error_file_truncated
);
2512 goto err_wrong_format
;
2515 read_so_far
+= to_read
;
2516 remaining
-= to_read
;
2518 to_read
= MIN (VMS_BLOCK_SIZE
, remaining
);
2521 /* Reset the record pointer. */
2522 PRIV (recrd
.rec
) = buf
;
2524 vms_debug2 ((2, "file type is image\n"));
2526 if (_bfd_vms_slurp_eihd (abfd
, &eisd_offset
, &eihs_offset
) != TRUE
)
2527 goto err_wrong_format
;
2529 if (_bfd_vms_slurp_eisd (abfd
, eisd_offset
) != TRUE
)
2530 goto err_wrong_format
;
2532 /* EIHS is optional. */
2533 if (eihs_offset
!= 0 && _bfd_vms_slurp_eihs (abfd
, eihs_offset
) != TRUE
)
2534 goto err_wrong_format
;
2540 /* Assume it's a module and adjust record pointer if necessary. */
2541 maybe_adjust_record_pointer_for_object (abfd
);
2543 /* But is it really a module? */
2544 if (bfd_getl16 (PRIV (recrd
.rec
)) <= EOBJ__C_MAXRECTYP
2545 && bfd_getl16 (PRIV (recrd
.rec
) + 2) <= EOBJ__C_MAXRECSIZ
)
2547 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
2548 goto err_wrong_format
;
2550 vms_debug2 ((2, "file type is module\n"));
2552 type
= bfd_getl16 (PRIV (recrd
.rec
));
2553 if (type
!= EOBJ__C_EMH
|| _bfd_vms_slurp_ehdr (abfd
) != TRUE
)
2554 goto err_wrong_format
;
2556 if (_bfd_vms_slurp_object_records (abfd
) != TRUE
)
2557 goto err_wrong_format
;
2560 goto err_wrong_format
;
2563 /* Set arch_info to alpha. */
2565 if (! bfd_default_set_arch_mach (abfd
, bfd_arch_alpha
, 0))
2566 goto err_wrong_format
;
2571 bfd_set_error (bfd_error_wrong_format
);
2574 if (PRIV (recrd
.buf
))
2575 free (PRIV (recrd
.buf
));
2576 if (abfd
->tdata
.any
!= tdata_save
&& abfd
->tdata
.any
!= NULL
)
2577 bfd_release (abfd
, abfd
->tdata
.any
);
2578 abfd
->tdata
.any
= tdata_save
;
2584 /* Write an EMH/MHD record. */
2587 _bfd_vms_write_emh (bfd
*abfd
)
2589 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2591 _bfd_vms_output_alignment (recwr
, 2);
2594 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2595 _bfd_vms_output_short (recwr
, EMH__C_MHD
);
2596 _bfd_vms_output_short (recwr
, EOBJ__C_STRLVL
);
2597 _bfd_vms_output_long (recwr
, 0);
2598 _bfd_vms_output_long (recwr
, 0);
2599 _bfd_vms_output_long (recwr
, MAX_OUTREC_SIZE
);
2601 /* Create module name from filename. */
2602 if (bfd_get_filename (abfd
) != 0)
2604 char *module
= vms_get_module_name (bfd_get_filename (abfd
), TRUE
);
2605 _bfd_vms_output_counted (recwr
, module
);
2609 _bfd_vms_output_counted (recwr
, "NONAME");
2611 _bfd_vms_output_counted (recwr
, BFD_VERSION_STRING
);
2612 _bfd_vms_output_dump (recwr
, get_vms_time_string (), EMH_DATE_LENGTH
);
2613 _bfd_vms_output_fill (recwr
, 0, EMH_DATE_LENGTH
);
2614 _bfd_vms_output_end (abfd
, recwr
);
2617 /* Write an EMH/LMN record. */
2620 _bfd_vms_write_lmn (bfd
*abfd
, const char *name
)
2623 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2624 unsigned int ver
= BFD_VERSION
/ 10000;
2627 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2628 _bfd_vms_output_short (recwr
, EMH__C_LNM
);
2629 snprintf (version
, sizeof (version
), "%s %d.%d.%d", name
,
2630 ver
/ 10000, (ver
/ 100) % 100, ver
% 100);
2631 _bfd_vms_output_dump (recwr
, (unsigned char *)version
, strlen (version
));
2632 _bfd_vms_output_end (abfd
, recwr
);
2636 /* Write eom record for bfd abfd. Return FALSE on error. */
2639 _bfd_vms_write_eeom (bfd
*abfd
)
2641 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2643 vms_debug2 ((2, "vms_write_eeom\n"));
2645 _bfd_vms_output_alignment (recwr
, 2);
2647 _bfd_vms_output_begin (recwr
, EOBJ__C_EEOM
);
2648 _bfd_vms_output_long (recwr
, (unsigned long) (PRIV (vms_linkage_index
) >> 1));
2649 _bfd_vms_output_byte (recwr
, 0); /* Completion code. */
2650 _bfd_vms_output_byte (recwr
, 0); /* Fill byte. */
2652 if ((abfd
->flags
& EXEC_P
) == 0
2653 && bfd_get_start_address (abfd
) != (bfd_vma
)-1)
2657 section
= bfd_get_section_by_name (abfd
, ".link");
2660 bfd_set_error (bfd_error_nonrepresentable_section
);
2663 _bfd_vms_output_short (recwr
, 0);
2664 _bfd_vms_output_long (recwr
, (unsigned long) (section
->index
));
2665 _bfd_vms_output_long (recwr
,
2666 (unsigned long) bfd_get_start_address (abfd
));
2667 _bfd_vms_output_long (recwr
, 0);
2670 _bfd_vms_output_end (abfd
, recwr
);
2674 /* This hash routine borrowed from GNU-EMACS, and strengthened
2678 hash_string (const char *ptr
)
2680 const unsigned char *p
= (unsigned char *) ptr
;
2681 const unsigned char *end
= p
+ strlen (ptr
);
2688 hash
= ((hash
<< 3) + (hash
<< 15) + (hash
>> 28) + c
);
2693 /* Generate a length-hashed VMS symbol name (limited to maxlen chars). */
2696 _bfd_vms_length_hash_symbol (bfd
*abfd
, const char *in
, int maxlen
)
2698 unsigned long result
;
2701 const char *old_name
;
2703 static char outbuf
[EOBJ__C_SYMSIZ
+ 1];
2707 vms_debug (4, "_bfd_vms_length_hash_symbol \"%s\"\n", in
);
2710 if (maxlen
> EOBJ__C_SYMSIZ
)
2711 maxlen
= EOBJ__C_SYMSIZ
;
2713 /* Save this for later. */
2716 /* We may need to truncate the symbol, save the hash for later. */
2717 in_len
= strlen (in
);
2719 result
= (in_len
> maxlen
) ? hash_string (in
) : 0;
2723 /* Do the length checking. */
2724 if (in_len
<= maxlen
)
2728 if (PRIV (flag_hash_long_names
))
2734 strncpy (out
, in
, (size_t) i
);
2738 if ((in_len
> maxlen
)
2739 && PRIV (flag_hash_long_names
))
2740 sprintf (out
, "_%08lx", result
);
2745 vms_debug (4, "--> [%d]\"%s\"\n", (int)strlen (outbuf
), outbuf
);
2749 && PRIV (flag_hash_long_names
)
2750 && PRIV (flag_show_after_trunc
))
2751 printf (_("Symbol %s replaced by %s\n"), old_name
, new_name
);
2757 vector_grow1 (struct vector_type
*vec
, size_t elsz
)
2759 if (vec
->nbr_el
+ 1 < vec
->max_el
)
2762 if (vec
->max_el
== 0)
2765 vec
->els
= bfd_malloc2 (vec
->max_el
, elsz
);
2770 vec
->els
= bfd_realloc2 (vec
->els
, vec
->max_el
, elsz
);
2774 /* Bump ABFD file position to next block. */
2777 alpha_vms_file_position_block (bfd
*abfd
)
2780 PRIV (file_pos
) += VMS_BLOCK_SIZE
- 1;
2781 PRIV (file_pos
) -= (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
2784 /* Convert from internal structure SRC to external structure DST. */
2787 alpha_vms_swap_eisd_out (struct vms_internal_eisd_map
*src
,
2788 struct vms_eisd
*dst
)
2790 bfd_putl32 (src
->u
.eisd
.majorid
, dst
->majorid
);
2791 bfd_putl32 (src
->u
.eisd
.minorid
, dst
->minorid
);
2792 bfd_putl32 (src
->u
.eisd
.eisdsize
, dst
->eisdsize
);
2793 if (src
->u
.eisd
.eisdsize
<= EISD__K_LENEND
)
2795 bfd_putl32 (src
->u
.eisd
.secsize
, dst
->secsize
);
2796 bfd_putl64 (src
->u
.eisd
.virt_addr
, dst
->virt_addr
);
2797 bfd_putl32 (src
->u
.eisd
.flags
, dst
->flags
);
2798 bfd_putl32 (src
->u
.eisd
.vbn
, dst
->vbn
);
2799 dst
->pfc
= src
->u
.eisd
.pfc
;
2800 dst
->matchctl
= src
->u
.eisd
.matchctl
;
2801 dst
->type
= src
->u
.eisd
.type
;
2803 if (src
->u
.eisd
.flags
& EISD__M_GBL
)
2805 bfd_putl32 (src
->u
.gbl_eisd
.ident
, dst
->ident
);
2806 memcpy (dst
->gblnam
, src
->u
.gbl_eisd
.gblnam
,
2807 src
->u
.gbl_eisd
.gblnam
[0] + 1);
2811 /* Append EISD to the list of extra eisd for ABFD. */
2814 alpha_vms_append_extra_eisd (bfd
*abfd
, struct vms_internal_eisd_map
*eisd
)
2817 if (PRIV (gbl_eisd_head
) == NULL
)
2818 PRIV (gbl_eisd_head
) = eisd
;
2820 PRIV (gbl_eisd_tail
)->next
= eisd
;
2821 PRIV (gbl_eisd_tail
) = eisd
;
2824 /* Create an EISD for shared image SHRIMG.
2825 Return FALSE in case of error. */
2828 alpha_vms_create_eisd_for_shared (bfd
*abfd
, bfd
*shrimg
)
2830 struct vms_internal_eisd_map
*eisd
;
2833 namlen
= strlen (PRIV2 (shrimg
, hdr_data
.hdr_t_name
));
2834 if (namlen
+ 5 > EISD__K_GBLNAMLEN
)
2840 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
2844 /* Fill the fields. */
2845 eisd
->u
.gbl_eisd
.common
.majorid
= EISD__K_MAJORID
;
2846 eisd
->u
.gbl_eisd
.common
.minorid
= EISD__K_MINORID
;
2847 eisd
->u
.gbl_eisd
.common
.eisdsize
= (EISD__K_LEN
+ 4 + namlen
+ 5 + 3) & ~3;
2848 eisd
->u
.gbl_eisd
.common
.secsize
= VMS_BLOCK_SIZE
; /* Must not be 0. */
2849 eisd
->u
.gbl_eisd
.common
.virt_addr
= 0;
2850 eisd
->u
.gbl_eisd
.common
.flags
= EISD__M_GBL
;
2851 eisd
->u
.gbl_eisd
.common
.vbn
= 0;
2852 eisd
->u
.gbl_eisd
.common
.pfc
= 0;
2853 eisd
->u
.gbl_eisd
.common
.matchctl
= PRIV2 (shrimg
, matchctl
);
2854 eisd
->u
.gbl_eisd
.common
.type
= EISD__K_SHRPIC
;
2856 eisd
->u
.gbl_eisd
.ident
= PRIV2 (shrimg
, ident
);
2857 eisd
->u
.gbl_eisd
.gblnam
[0] = namlen
+ 4;
2858 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1, PRIV2 (shrimg
, hdr_data
.hdr_t_name
),
2860 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1 + namlen
, "_001", 4);
2862 /* Append it to the list. */
2863 alpha_vms_append_extra_eisd (abfd
, eisd
);
2868 /* Create an EISD for section SEC.
2869 Return FALSE in case of failure. */
2872 alpha_vms_create_eisd_for_section (bfd
*abfd
, asection
*sec
)
2874 struct vms_internal_eisd_map
*eisd
;
2876 /* Only for allocating section. */
2877 if (!(sec
->flags
& SEC_ALLOC
))
2880 BFD_ASSERT (vms_section_data (sec
)->eisd
== NULL
);
2881 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
2884 vms_section_data (sec
)->eisd
= eisd
;
2886 /* Fill the fields. */
2887 eisd
->u
.eisd
.majorid
= EISD__K_MAJORID
;
2888 eisd
->u
.eisd
.minorid
= EISD__K_MINORID
;
2889 eisd
->u
.eisd
.eisdsize
= EISD__K_LEN
;
2890 eisd
->u
.eisd
.secsize
=
2891 (sec
->size
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
2892 eisd
->u
.eisd
.virt_addr
= sec
->vma
;
2893 eisd
->u
.eisd
.flags
= 0;
2894 eisd
->u
.eisd
.vbn
= 0; /* To be later defined. */
2895 eisd
->u
.eisd
.pfc
= 0; /* Default. */
2896 eisd
->u
.eisd
.matchctl
= EISD__K_MATALL
;
2897 eisd
->u
.eisd
.type
= EISD__K_NORMAL
;
2899 if (sec
->flags
& SEC_CODE
)
2900 eisd
->u
.eisd
.flags
|= EISD__M_EXE
;
2901 if (!(sec
->flags
& SEC_READONLY
))
2902 eisd
->u
.eisd
.flags
|= EISD__M_WRT
| EISD__M_CRF
;
2904 if (!(sec
->flags
& SEC_LOAD
))
2906 eisd
->u
.eisd
.flags
|= EISD__M_DZRO
;
2907 eisd
->u
.eisd
.flags
&= ~EISD__M_CRF
;
2909 if (sec
->flags
& SEC_LINKER_CREATED
)
2911 if (strcmp (sec
->name
, "$FIXUP$") == 0)
2912 eisd
->u
.eisd
.flags
|= EISD__M_FIXUPVEC
;
2915 /* Append it to the list. */
2917 if (PRIV (eisd_head
) == NULL
)
2918 PRIV (eisd_head
) = eisd
;
2920 PRIV (eisd_tail
)->next
= eisd
;
2921 PRIV (eisd_tail
) = eisd
;
2926 /* Layout executable ABFD and write it to the disk.
2927 Return FALSE in case of failure. */
2930 alpha_vms_write_exec (bfd
*abfd
)
2932 struct vms_eihd eihd
;
2933 struct vms_eiha
*eiha
;
2934 struct vms_eihi
*eihi
;
2935 struct vms_eihs
*eihs
= NULL
;
2937 struct vms_internal_eisd_map
*first_eisd
;
2938 struct vms_internal_eisd_map
*eisd
;
2941 file_ptr gst_filepos
= 0;
2942 unsigned int lnkflags
= 0;
2944 /* Build the EIHD. */
2945 PRIV (file_pos
) = EIHD__C_LENGTH
;
2947 memset (&eihd
, 0, sizeof (eihd
));
2948 memset (eihd
.fill_2
, 0xff, sizeof (eihd
.fill_2
));
2950 bfd_putl32 (EIHD__K_MAJORID
, eihd
.majorid
);
2951 bfd_putl32 (EIHD__K_MINORID
, eihd
.minorid
);
2953 bfd_putl32 (sizeof (eihd
), eihd
.size
);
2954 bfd_putl32 (0, eihd
.isdoff
);
2955 bfd_putl32 (0, eihd
.activoff
);
2956 bfd_putl32 (0, eihd
.symdbgoff
);
2957 bfd_putl32 (0, eihd
.imgidoff
);
2958 bfd_putl32 (0, eihd
.patchoff
);
2959 bfd_putl64 (0, eihd
.iafva
);
2960 bfd_putl32 (0, eihd
.version_array_off
);
2962 bfd_putl32 (EIHD__K_EXE
, eihd
.imgtype
);
2963 bfd_putl32 (0, eihd
.subtype
);
2965 bfd_putl32 (0, eihd
.imgiocnt
);
2966 bfd_putl32 (-1, eihd
.privreqs
);
2967 bfd_putl32 (-1, eihd
.privreqs
+ 4);
2969 bfd_putl32 ((sizeof (eihd
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
2971 bfd_putl32 (0, eihd
.ident
);
2972 bfd_putl32 (0, eihd
.sysver
);
2975 bfd_putl32 (0, eihd
.symvect_size
);
2976 bfd_putl32 (16, eihd
.virt_mem_block_size
);
2977 bfd_putl32 (0, eihd
.ext_fixup_off
);
2978 bfd_putl32 (0, eihd
.noopt_psect_off
);
2979 bfd_putl32 (-1, eihd
.alias
);
2982 eiha
= (struct vms_eiha
*)((char *) &eihd
+ PRIV (file_pos
));
2983 bfd_putl32 (PRIV (file_pos
), eihd
.activoff
);
2984 PRIV (file_pos
) += sizeof (struct vms_eiha
);
2986 bfd_putl32 (sizeof (struct vms_eiha
), eiha
->size
);
2987 bfd_putl32 (0, eiha
->spare
);
2988 bfd_putl64 (PRIV (transfer_address
[0]), eiha
->tfradr1
);
2989 bfd_putl64 (PRIV (transfer_address
[1]), eiha
->tfradr2
);
2990 bfd_putl64 (PRIV (transfer_address
[2]), eiha
->tfradr3
);
2991 bfd_putl64 (PRIV (transfer_address
[3]), eiha
->tfradr4
);
2992 bfd_putl64 (0, eiha
->inishr
);
2995 eihi
= (struct vms_eihi
*)((char *) &eihd
+ PRIV (file_pos
));
2996 bfd_putl32 (PRIV (file_pos
), eihd
.imgidoff
);
2997 PRIV (file_pos
) += sizeof (struct vms_eihi
);
2999 bfd_putl32 (EIHI__K_MAJORID
, eihi
->majorid
);
3000 bfd_putl32 (EIHI__K_MINORID
, eihi
->minorid
);
3005 module
= vms_get_module_name (bfd_get_filename (abfd
), TRUE
);
3006 len
= strlen (module
);
3007 if (len
> sizeof (eihi
->imgnam
) - 1)
3008 len
= sizeof (eihi
->imgnam
) - 1;
3009 eihi
->imgnam
[0] = len
;
3010 memcpy (eihi
->imgnam
+ 1, module
, len
);
3013 bfd_putl32 (0, eihi
->linktime
+ 0);
3014 bfd_putl32 (0, eihi
->linktime
+ 4);
3016 eihi
->linkid
[0] = 0;
3017 eihi
->imgbid
[0] = 0;
3020 dst
= PRIV (dst_section
);
3021 dmt
= bfd_get_section_by_name (abfd
, "$DMT$");
3022 if (dst
!= NULL
&& dst
->size
!= 0)
3024 eihs
= (struct vms_eihs
*)((char *) &eihd
+ PRIV (file_pos
));
3025 bfd_putl32 (PRIV (file_pos
), eihd
.symdbgoff
);
3026 PRIV (file_pos
) += sizeof (struct vms_eihs
);
3028 bfd_putl32 (EIHS__K_MAJORID
, eihs
->majorid
);
3029 bfd_putl32 (EIHS__K_MINORID
, eihs
->minorid
);
3030 bfd_putl32 (0, eihs
->dstvbn
);
3031 bfd_putl32 (0, eihs
->dstsize
);
3032 bfd_putl32 (0, eihs
->gstvbn
);
3033 bfd_putl32 (0, eihs
->gstsize
);
3034 bfd_putl32 (0, eihs
->dmtvbn
);
3035 bfd_putl32 (0, eihs
->dmtsize
);
3038 /* One EISD per section. */
3039 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3041 if (!alpha_vms_create_eisd_for_section (abfd
, sec
))
3045 /* Merge section EIDS which extra ones. */
3046 if (PRIV (eisd_tail
))
3047 PRIV (eisd_tail
)->next
= PRIV (gbl_eisd_head
);
3049 PRIV (eisd_head
) = PRIV (gbl_eisd_head
);
3050 if (PRIV (gbl_eisd_tail
))
3051 PRIV (eisd_tail
) = PRIV (gbl_eisd_tail
);
3053 first_eisd
= PRIV (eisd_head
);
3055 /* Add end of eisd. */
3058 eisd
= bfd_zalloc (abfd
, sizeof (*eisd
));
3061 eisd
->u
.eisd
.majorid
= 0;
3062 eisd
->u
.eisd
.minorid
= 0;
3063 eisd
->u
.eisd
.eisdsize
= 0;
3064 alpha_vms_append_extra_eisd (abfd
, eisd
);
3067 /* Place EISD in the file. */
3068 for (eisd
= first_eisd
; eisd
; eisd
= eisd
->next
)
3070 file_ptr room
= VMS_BLOCK_SIZE
- (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
3072 /* First block is a little bit special: there is a word at the end. */
3073 if (PRIV (file_pos
) < VMS_BLOCK_SIZE
&& room
> 2)
3075 if (room
< eisd
->u
.eisd
.eisdsize
+ EISD__K_LENEND
)
3076 alpha_vms_file_position_block (abfd
);
3078 eisd
->file_pos
= PRIV (file_pos
);
3079 PRIV (file_pos
) += eisd
->u
.eisd
.eisdsize
;
3081 if (eisd
->u
.eisd
.flags
& EISD__M_FIXUPVEC
)
3082 bfd_putl64 (eisd
->u
.eisd
.virt_addr
, eihd
.iafva
);
3085 if (first_eisd
!= NULL
)
3087 bfd_putl32 (first_eisd
->file_pos
, eihd
.isdoff
);
3088 /* Real size of end of eisd marker. */
3089 PRIV (file_pos
) += EISD__K_LENEND
;
3092 bfd_putl32 (PRIV (file_pos
), eihd
.size
);
3093 bfd_putl32 ((PRIV (file_pos
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
3096 /* Place sections. */
3097 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3099 if (!(sec
->flags
& SEC_HAS_CONTENTS
))
3102 eisd
= vms_section_data (sec
)->eisd
;
3104 /* Align on a block. */
3105 alpha_vms_file_position_block (abfd
);
3106 sec
->filepos
= PRIV (file_pos
);
3109 eisd
->u
.eisd
.vbn
= (sec
->filepos
/ VMS_BLOCK_SIZE
) + 1;
3111 PRIV (file_pos
) += sec
->size
;
3115 if (eihs
!= NULL
&& dst
!= NULL
)
3117 bfd_putl32 ((dst
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dstvbn
);
3118 bfd_putl32 (dst
->size
, eihs
->dstsize
);
3122 lnkflags
|= EIHD__M_DBGDMT
;
3123 bfd_putl32 ((dmt
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dmtvbn
);
3124 bfd_putl32 (dmt
->size
, eihs
->dmtsize
);
3126 if (PRIV (gsd_sym_count
) != 0)
3128 alpha_vms_file_position_block (abfd
);
3129 gst_filepos
= PRIV (file_pos
);
3130 bfd_putl32 ((gst_filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->gstvbn
);
3131 bfd_putl32 ((PRIV (gsd_sym_count
) + 4) / 5 + 4, eihs
->gstsize
);
3135 /* Write EISD in hdr. */
3136 for (eisd
= first_eisd
; eisd
&& eisd
->file_pos
< VMS_BLOCK_SIZE
;
3138 alpha_vms_swap_eisd_out
3139 (eisd
, (struct vms_eisd
*)((char *)&eihd
+ eisd
->file_pos
));
3141 /* Write first block. */
3142 bfd_putl32 (lnkflags
, eihd
.lnkflags
);
3143 if (bfd_bwrite (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
3146 /* Write remaining eisd. */
3149 unsigned char blk
[VMS_BLOCK_SIZE
];
3150 struct vms_internal_eisd_map
*next_eisd
;
3152 memset (blk
, 0xff, sizeof (blk
));
3153 while (eisd
!= NULL
)
3155 alpha_vms_swap_eisd_out
3157 (struct vms_eisd
*)(blk
+ (eisd
->file_pos
% VMS_BLOCK_SIZE
)));
3159 next_eisd
= eisd
->next
;
3160 if (next_eisd
== NULL
3161 || (next_eisd
->file_pos
/ VMS_BLOCK_SIZE
3162 != eisd
->file_pos
/ VMS_BLOCK_SIZE
))
3164 if (bfd_bwrite (blk
, sizeof (blk
), abfd
) != sizeof (blk
))
3167 memset (blk
, 0xff, sizeof (blk
));
3173 /* Write sections. */
3174 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3176 unsigned char blk
[VMS_BLOCK_SIZE
];
3179 if (sec
->size
== 0 || !(sec
->flags
& SEC_HAS_CONTENTS
))
3181 if (bfd_bwrite (sec
->contents
, sec
->size
, abfd
) != sec
->size
)
3185 len
= VMS_BLOCK_SIZE
- sec
->size
% VMS_BLOCK_SIZE
;
3186 if (len
!= VMS_BLOCK_SIZE
)
3188 memset (blk
, 0, len
);
3189 if (bfd_bwrite (blk
, len
, abfd
) != len
)
3195 if (gst_filepos
!= 0)
3197 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3200 _bfd_vms_write_emh (abfd
);
3201 _bfd_vms_write_lmn (abfd
, "GNU LD");
3203 /* PSC for the absolute section. */
3204 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3205 _bfd_vms_output_long (recwr
, 0);
3206 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3207 _bfd_vms_output_short (recwr
, 0);
3208 _bfd_vms_output_short (recwr
, EGPS__V_PIC
| EGPS__V_LIB
| EGPS__V_RD
);
3209 _bfd_vms_output_long (recwr
, 0);
3210 _bfd_vms_output_counted (recwr
, ".$$ABS$$.");
3211 _bfd_vms_output_end_subrec (recwr
);
3212 _bfd_vms_output_end (abfd
, recwr
);
3214 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
3216 struct vms_symbol_entry
*sym
= PRIV (syms
)[i
];
3223 _bfd_vms_output_alignment (recwr
, 8);
3224 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3225 _bfd_vms_output_long (recwr
, 0);
3227 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_SYMG
);
3228 _bfd_vms_output_short (recwr
, 0); /* Data type, alignment. */
3229 _bfd_vms_output_short (recwr
, sym
->flags
);
3231 if (sym
->code_section
)
3232 ep
= alpha_vms_get_sym_value (sym
->code_section
, sym
->code_value
);
3235 BFD_ASSERT (sym
->code_value
== 0);
3238 val
= alpha_vms_get_sym_value (sym
->section
, sym
->value
);
3239 _bfd_vms_output_quad
3240 (recwr
, sym
->typ
== EGSD__C_SYMG
? sym
->symbol_vector
: val
);
3241 _bfd_vms_output_quad (recwr
, ep
);
3242 _bfd_vms_output_quad (recwr
, val
);
3243 _bfd_vms_output_long (recwr
, 0);
3244 hash
= _bfd_vms_length_hash_symbol (abfd
, sym
->name
, EOBJ__C_SYMSIZ
);
3245 _bfd_vms_output_counted (recwr
, hash
);
3246 _bfd_vms_output_end_subrec (recwr
);
3248 _bfd_vms_output_end (abfd
, recwr
);
3251 _bfd_vms_output_end (abfd
, recwr
);
3253 if (!_bfd_vms_write_eeom (abfd
))
3261 /* Write section and symbol directory of bfd abfd. Return FALSE on error. */
3264 _bfd_vms_write_egsd (bfd
*abfd
)
3268 unsigned int symnum
;
3269 int last_index
= -1;
3270 char dummy_name
[10];
3272 flagword new_flags
, old_flags
;
3273 int abs_section_index
= 0;
3274 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3276 vms_debug2 ((2, "vms_write_gsd\n"));
3278 /* Output sections. */
3279 section
= abfd
->sections
;
3280 vms_debug2 ((3, "%d sections found\n", abfd
->section_count
));
3282 /* Egsd is quadword aligned. */
3283 _bfd_vms_output_alignment (recwr
, 8);
3285 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3286 _bfd_vms_output_long (recwr
, 0);
3288 while (section
!= 0)
3290 vms_debug2 ((3, "Section #%d %s, %d bytes\n",
3291 section
->index
, section
->name
, (int)section
->size
));
3293 /* Don't write out the VMS debug info section since it is in the
3294 ETBT and EDBG sections in etir. */
3295 if (!strcmp (section
->name
, ".vmsdebug"))
3298 /* 13 bytes egsd, max 31 chars name -> should be 44 bytes. */
3299 if (_bfd_vms_output_check (recwr
, 64) < 0)
3301 _bfd_vms_output_end (abfd
, recwr
);
3302 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3303 _bfd_vms_output_long (recwr
, 0);
3306 /* Create dummy sections to keep consecutive indices. */
3307 while (section
->index
- last_index
> 1)
3309 vms_debug2 ((3, "index %d, last %d\n", section
->index
, last_index
));
3310 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3311 _bfd_vms_output_short (recwr
, 0);
3312 _bfd_vms_output_short (recwr
, 0);
3313 _bfd_vms_output_long (recwr
, 0);
3314 sprintf (dummy_name
, ".DUMMY%02d", last_index
);
3315 _bfd_vms_output_counted (recwr
, dummy_name
);
3316 _bfd_vms_output_end_subrec (recwr
);
3320 /* Don't know if this is necessary for the linker but for now it keeps
3321 vms_slurp_gsd happy. */
3322 sname
= (char *)section
->name
;
3325 /* Remove leading dot. */
3327 if ((*sname
== 't') && (strcmp (sname
, "text") == 0))
3328 sname
= EVAX_CODE_NAME
;
3329 else if ((*sname
== 'd') && (strcmp (sname
, "data") == 0))
3330 sname
= EVAX_DATA_NAME
;
3331 else if ((*sname
== 'b') && (strcmp (sname
, "bss") == 0))
3332 sname
= EVAX_BSS_NAME
;
3333 else if ((*sname
== 'l') && (strcmp (sname
, "link") == 0))
3334 sname
= EVAX_LINK_NAME
;
3335 else if ((*sname
== 'r') && (strcmp (sname
, "rdata") == 0))
3336 sname
= EVAX_READONLY_NAME
;
3337 else if ((*sname
== 'l') && (strcmp (sname
, "literal") == 0))
3338 sname
= EVAX_LITERAL_NAME
;
3339 else if ((*sname
== 'l') && (strcmp (sname
, "literals") == 0))
3341 sname
= EVAX_LITERALS_NAME
;
3342 abs_section_index
= section
->index
;
3344 else if ((*sname
== 'c') && (strcmp (sname
, "comm") == 0))
3345 sname
= EVAX_COMMON_NAME
;
3346 else if ((*sname
== 'l') && (strcmp (sname
, "lcomm") == 0))
3347 sname
= EVAX_LOCAL_NAME
;
3350 sname
= _bfd_vms_length_hash_symbol (abfd
, sname
, EOBJ__C_SECSIZ
);
3352 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3353 _bfd_vms_output_short (recwr
, section
->alignment_power
& 0xff);
3355 if (bfd_is_com_section (section
))
3356 new_flags
= (EGPS__V_OVR
| EGPS__V_REL
| EGPS__V_GBL
| EGPS__V_RD
3357 | EGPS__V_WRT
| EGPS__V_NOMOD
| EGPS__V_COM
);
3359 new_flags
= vms_esecflag_by_name (evax_section_flags
, sname
,
3362 /* Modify them as directed. */
3363 if (section
->flags
& SEC_READONLY
)
3364 new_flags
&= ~EGPS__V_WRT
;
3366 new_flags
&= ~vms_section_data (section
)->no_flags
;
3367 new_flags
|= vms_section_data (section
)->flags
;
3369 vms_debug2 ((3, "sec flags %x\n", section
->flags
));
3370 vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
3371 new_flags
, (unsigned long)section
->size
));
3373 _bfd_vms_output_short (recwr
, new_flags
);
3374 _bfd_vms_output_long (recwr
, (unsigned long) section
->size
);
3375 _bfd_vms_output_counted (recwr
, sname
);
3376 _bfd_vms_output_end_subrec (recwr
);
3378 last_index
= section
->index
;
3380 section
= section
->next
;
3383 /* Output symbols. */
3384 vms_debug2 ((3, "%d symbols found\n", abfd
->symcount
));
3386 bfd_set_start_address (abfd
, (bfd_vma
) -1);
3388 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3392 symbol
= abfd
->outsymbols
[symnum
];
3393 old_flags
= symbol
->flags
;
3395 /* Work-around a missing feature: consider __main as the main entry point. */
3396 if (*(symbol
->name
) == '_')
3398 if (strcmp (symbol
->name
, "__main") == 0)
3399 bfd_set_start_address (abfd
, (bfd_vma
)symbol
->value
);
3402 /* Only put in the GSD the global and the undefined symbols. */
3403 if (old_flags
& BSF_FILE
)
3406 if ((old_flags
& BSF_GLOBAL
) == 0 && !bfd_is_und_section (symbol
->section
))
3408 /* If the LIB$INITIIALIZE section is present, add a reference to
3409 LIB$INITIALIZE symbol. FIXME: this should be done explicitely
3410 in the assembly file. */
3411 if (!((old_flags
& BSF_SECTION_SYM
) != 0
3412 && strcmp (symbol
->section
->name
, "LIB$INITIALIZE") == 0))
3416 /* 13 bytes egsd, max 64 chars name -> should be 77 bytes. */
3417 if (_bfd_vms_output_check (recwr
, 80) < 0)
3419 _bfd_vms_output_end (abfd
, recwr
);
3420 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3421 _bfd_vms_output_long (recwr
, 0);
3424 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_SYM
);
3426 /* Data type, alignment. */
3427 _bfd_vms_output_short (recwr
, 0);
3431 if (old_flags
& BSF_WEAK
)
3432 new_flags
|= EGSY__V_WEAK
;
3433 if (bfd_is_com_section (symbol
->section
)) /* .comm */
3434 new_flags
|= (EGSY__V_WEAK
| EGSY__V_COMM
);
3436 if (old_flags
& BSF_FUNCTION
)
3438 new_flags
|= EGSY__V_NORM
;
3439 new_flags
|= EGSY__V_REL
;
3441 if (old_flags
& BSF_GLOBAL
)
3443 new_flags
|= EGSY__V_DEF
;
3444 if (!bfd_is_abs_section (symbol
->section
))
3445 new_flags
|= EGSY__V_REL
;
3447 _bfd_vms_output_short (recwr
, new_flags
);
3449 if (old_flags
& BSF_GLOBAL
)
3451 /* Symbol definition. */
3452 bfd_vma code_address
= 0;
3453 unsigned long ca_psindx
= 0;
3454 unsigned long psindx
;
3456 if ((old_flags
& BSF_FUNCTION
) && symbol
->udata
.p
!= NULL
)
3460 sym
= ((struct evax_private_udata_struct
*)symbol
->udata
.p
)->enbsym
;
3461 code_address
= sym
->value
;
3462 ca_psindx
= sym
->section
->index
;
3464 if (bfd_is_abs_section (symbol
->section
))
3465 psindx
= abs_section_index
;
3467 psindx
= symbol
->section
->index
;
3469 _bfd_vms_output_quad (recwr
, symbol
->value
);
3470 _bfd_vms_output_quad (recwr
, code_address
);
3471 _bfd_vms_output_long (recwr
, ca_psindx
);
3472 _bfd_vms_output_long (recwr
, psindx
);
3474 hash
= _bfd_vms_length_hash_symbol (abfd
, symbol
->name
, EOBJ__C_SYMSIZ
);
3475 _bfd_vms_output_counted (recwr
, hash
);
3477 _bfd_vms_output_end_subrec (recwr
);
3480 _bfd_vms_output_alignment (recwr
, 8);
3481 _bfd_vms_output_end (abfd
, recwr
);
3486 /* Write object header for bfd abfd. Return FALSE on error. */
3489 _bfd_vms_write_ehdr (bfd
*abfd
)
3492 unsigned int symnum
;
3495 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3497 vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd
));
3499 _bfd_vms_output_alignment (recwr
, 2);
3501 _bfd_vms_write_emh (abfd
);
3502 _bfd_vms_write_lmn (abfd
, "GNU AS");
3505 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3506 _bfd_vms_output_short (recwr
, EMH__C_SRC
);
3508 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3510 symbol
= abfd
->outsymbols
[symnum
];
3512 if (symbol
->flags
& BSF_FILE
)
3514 if (CONST_STRNEQ ((char *)symbol
->name
, "<CASE:"))
3516 PRIV (flag_hash_long_names
) = symbol
->name
[6] - '0';
3517 PRIV (flag_show_after_trunc
) = symbol
->name
[7] - '0';
3525 _bfd_vms_output_dump (recwr
, (unsigned char *) symbol
->name
,
3526 (int) strlen (symbol
->name
));
3533 if (symnum
== abfd
->symcount
)
3534 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("noname"));
3536 _bfd_vms_output_end (abfd
, recwr
);
3539 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3540 _bfd_vms_output_short (recwr
, EMH__C_TTL
);
3541 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("TTL"));
3542 _bfd_vms_output_end (abfd
, recwr
);
3545 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3546 _bfd_vms_output_short (recwr
, EMH__C_CPR
);
3547 _bfd_vms_output_dump (recwr
,
3548 (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
3550 _bfd_vms_output_end (abfd
, recwr
);
3555 /* Part 4.6, relocations. */
3558 /* WRITE ETIR SECTION
3560 This is still under construction and therefore not documented. */
3562 /* Close the etir/etbt record. */
3565 end_etir_record (bfd
* abfd
)
3567 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3569 _bfd_vms_output_end (abfd
, recwr
);
3573 start_etir_or_etbt_record (bfd
*abfd
, asection
*section
, bfd_vma offset
)
3575 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3577 if (section
->name
[0] == '.' && section
->name
[1] == 'v'
3578 && !strcmp (section
->name
, ".vmsdebug"))
3580 _bfd_vms_output_begin (recwr
, EOBJ__C_ETBT
);
3584 /* Push start offset. */
3585 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
3586 _bfd_vms_output_long (recwr
, (unsigned long) 0);
3587 _bfd_vms_output_end_subrec (recwr
);
3590 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_DFLOC
);
3591 _bfd_vms_output_end_subrec (recwr
);
3596 _bfd_vms_output_begin (recwr
, EOBJ__C_ETIR
);
3600 /* Push start offset. */
3601 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
3602 _bfd_vms_output_long (recwr
, (unsigned long) section
->index
);
3603 _bfd_vms_output_quad (recwr
, offset
);
3604 _bfd_vms_output_end_subrec (recwr
);
3606 /* Start = pop (). */
3607 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_SETRB
);
3608 _bfd_vms_output_end_subrec (recwr
);
3613 /* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
3614 address VADDR in section specified by SEC_INDEX and NAME. */
3617 sto_imm (bfd
*abfd
, asection
*section
,
3618 bfd_size_type ssize
, unsigned char *cptr
, bfd_vma vaddr
)
3621 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3624 _bfd_vms_debug (8, "sto_imm %d bytes\n", (int) ssize
);
3625 _bfd_hexdump (9, cptr
, (int) ssize
, (int) vaddr
);
3630 /* Try all the rest. */
3633 if (_bfd_vms_output_check (recwr
, size
) < 0)
3635 /* Doesn't fit, split ! */
3636 end_etir_record (abfd
);
3638 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3640 size
= _bfd_vms_output_check (recwr
, 0); /* get max size */
3641 if (size
> ssize
) /* more than what's left ? */
3645 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_IMM
);
3646 _bfd_vms_output_long (recwr
, (unsigned long) (size
));
3647 _bfd_vms_output_dump (recwr
, cptr
, size
);
3648 _bfd_vms_output_end_subrec (recwr
);
3651 _bfd_vms_debug (10, "dumped %d bytes\n", (int) size
);
3652 _bfd_hexdump (10, cptr
, (int) size
, (int) vaddr
);
3662 etir_output_check (bfd
*abfd
, asection
*section
, bfd_vma vaddr
, int checklen
)
3664 if (_bfd_vms_output_check (&PRIV (recwr
), checklen
) < 0)
3666 /* Not enough room in this record. Close it and open a new one. */
3667 end_etir_record (abfd
);
3668 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3672 /* Return whether RELOC must be deferred till the end. */
3675 defer_reloc_p (arelent
*reloc
)
3677 switch (reloc
->howto
->type
)
3690 /* Write section contents for bfd abfd. Return FALSE on error. */
3693 _bfd_vms_write_etir (bfd
* abfd
, int objtype ATTRIBUTE_UNUSED
)
3696 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3698 vms_debug2 ((2, "vms_write_tir (%p, %d)\n", abfd
, objtype
));
3700 _bfd_vms_output_alignment (recwr
, 4);
3702 PRIV (vms_linkage_index
) = 1;
3704 for (section
= abfd
->sections
; section
; section
= section
->next
)
3706 vms_debug2 ((4, "writing %d. section '%s' (%d bytes)\n",
3707 section
->index
, section
->name
, (int) (section
->size
)));
3709 if (!(section
->flags
& SEC_HAS_CONTENTS
)
3710 || bfd_is_com_section (section
))
3713 if (!section
->contents
)
3715 bfd_set_error (bfd_error_no_contents
);
3719 start_etir_or_etbt_record (abfd
, section
, 0);
3721 if (section
->flags
& SEC_RELOC
)
3723 bfd_vma curr_addr
= 0;
3724 unsigned char *curr_data
= section
->contents
;
3726 int pass2_needed
= 0;
3727 int pass2_in_progress
= 0;
3730 if (section
->reloc_count
<= 0)
3731 (*_bfd_error_handler
)
3732 (_("SEC_RELOC with no relocs in section %s"), section
->name
);
3737 int i
= section
->reloc_count
;
3738 arelent
**rptr
= section
->orelocation
;
3739 _bfd_vms_debug (4, "%d relocations:\n", i
);
3742 _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, "
3743 "addr %08lx, off %08lx, len %d: %s\n",
3744 (*(*rptr
)->sym_ptr_ptr
)->name
,
3745 (*(*rptr
)->sym_ptr_ptr
)->section
->name
,
3746 (long) (*(*rptr
)->sym_ptr_ptr
)->value
,
3747 (unsigned long)(*rptr
)->address
,
3748 (unsigned long)(*rptr
)->addend
,
3749 bfd_get_reloc_size ((*rptr
)->howto
),
3750 ( *rptr
)->howto
->name
);
3757 for (irel
= 0; irel
< section
->reloc_count
; irel
++)
3759 struct evax_private_udata_struct
*udata
;
3760 arelent
*rptr
= section
->orelocation
[irel
];
3761 bfd_vma addr
= rptr
->address
;
3762 asymbol
*sym
= *rptr
->sym_ptr_ptr
;
3763 asection
*sec
= sym
->section
;
3764 bfd_boolean defer
= defer_reloc_p (rptr
);
3768 if (pass2_in_progress
)
3770 /* Non-deferred relocs have already been output. */
3776 /* Deferred relocs must be output at the very end. */
3783 /* Regular relocs are intertwined with binary data. */
3784 if (curr_addr
> addr
)
3785 (*_bfd_error_handler
) (_("Size error in section %s"),
3787 size
= addr
- curr_addr
;
3788 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
3793 size
= bfd_get_reloc_size (rptr
->howto
);
3795 switch (rptr
->howto
->type
)
3797 case ALPHA_R_IGNORE
:
3800 case ALPHA_R_REFLONG
:
3801 if (bfd_is_und_section (sym
->section
))
3803 bfd_vma addend
= rptr
->addend
;
3804 slen
= strlen ((char *) sym
->name
);
3805 hash
= _bfd_vms_length_hash_symbol
3806 (abfd
, sym
->name
, EOBJ__C_SYMSIZ
);
3807 etir_output_check (abfd
, section
, curr_addr
, slen
);
3810 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
3811 _bfd_vms_output_counted (recwr
, hash
);
3812 _bfd_vms_output_end_subrec (recwr
);
3813 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
3814 _bfd_vms_output_long (recwr
, (unsigned long) addend
);
3815 _bfd_vms_output_end_subrec (recwr
);
3816 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
3817 _bfd_vms_output_end_subrec (recwr
);
3818 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
3819 _bfd_vms_output_end_subrec (recwr
);
3823 _bfd_vms_output_begin_subrec
3824 (recwr
, ETIR__C_STO_GBL_LW
);
3825 _bfd_vms_output_counted (recwr
, hash
);
3826 _bfd_vms_output_end_subrec (recwr
);
3829 else if (bfd_is_abs_section (sym
->section
))
3831 etir_output_check (abfd
, section
, curr_addr
, 16);
3832 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
3833 _bfd_vms_output_long (recwr
, (unsigned long) sym
->value
);
3834 _bfd_vms_output_end_subrec (recwr
);
3835 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
3836 _bfd_vms_output_end_subrec (recwr
);
3840 etir_output_check (abfd
, section
, curr_addr
, 32);
3841 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
3842 _bfd_vms_output_long (recwr
, (unsigned long) sec
->index
);
3843 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
3844 _bfd_vms_output_end_subrec (recwr
);
3845 /* ??? Table B-8 of the OpenVMS Linker Utilily Manual
3846 says that we should have a ETIR__C_STO_OFF here.
3847 But the relocation would not be BFD_RELOC_32 then.
3848 This case is very likely unreachable. */
3849 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
3850 _bfd_vms_output_end_subrec (recwr
);
3854 case ALPHA_R_REFQUAD
:
3855 if (bfd_is_und_section (sym
->section
))
3857 bfd_vma addend
= rptr
->addend
;
3858 slen
= strlen ((char *) sym
->name
);
3859 hash
= _bfd_vms_length_hash_symbol
3860 (abfd
, sym
->name
, EOBJ__C_SYMSIZ
);
3861 etir_output_check (abfd
, section
, curr_addr
, slen
);
3864 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
3865 _bfd_vms_output_counted (recwr
, hash
);
3866 _bfd_vms_output_end_subrec (recwr
);
3867 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
3868 _bfd_vms_output_quad (recwr
, addend
);
3869 _bfd_vms_output_end_subrec (recwr
);
3870 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
3871 _bfd_vms_output_end_subrec (recwr
);
3872 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
3873 _bfd_vms_output_end_subrec (recwr
);
3877 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_GBL
);
3878 _bfd_vms_output_counted (recwr
, hash
);
3879 _bfd_vms_output_end_subrec (recwr
);
3882 else if (bfd_is_abs_section (sym
->section
))
3884 etir_output_check (abfd
, section
, curr_addr
, 16);
3885 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
3886 _bfd_vms_output_quad (recwr
, sym
->value
);
3887 _bfd_vms_output_end_subrec (recwr
);
3888 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
3889 _bfd_vms_output_end_subrec (recwr
);
3893 etir_output_check (abfd
, section
, curr_addr
, 32);
3894 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
3895 _bfd_vms_output_long (recwr
, (unsigned long) sec
->index
);
3896 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
3897 _bfd_vms_output_end_subrec (recwr
);
3898 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_OFF
);
3899 _bfd_vms_output_end_subrec (recwr
);
3904 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
3907 case ALPHA_R_LINKAGE
:
3908 etir_output_check (abfd
, section
, curr_addr
, 64);
3909 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LP_PSB
);
3910 _bfd_vms_output_long
3911 (recwr
, (unsigned long) PRIV (vms_linkage_index
));
3912 PRIV (vms_linkage_index
) += 2;
3913 hash
= _bfd_vms_length_hash_symbol
3914 (abfd
, sym
->name
, EOBJ__C_SYMSIZ
);
3915 _bfd_vms_output_counted (recwr
, hash
);
3916 _bfd_vms_output_byte (recwr
, 0);
3917 _bfd_vms_output_end_subrec (recwr
);
3920 case ALPHA_R_CODEADDR
:
3921 slen
= strlen ((char *) sym
->name
);
3922 hash
= _bfd_vms_length_hash_symbol
3923 (abfd
, sym
->name
, EOBJ__C_SYMSIZ
);
3924 etir_output_check (abfd
, section
, curr_addr
, slen
);
3925 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_CA
);
3926 _bfd_vms_output_counted (recwr
, hash
);
3927 _bfd_vms_output_end_subrec (recwr
);
3932 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
3933 etir_output_check (abfd
, section
, curr_addr
,
3934 32 + 1 + strlen (udata
->origname
));
3935 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_NOP_GBL
);
3936 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
3937 _bfd_vms_output_long
3938 (recwr
, (unsigned long) udata
->enbsym
->section
->index
);
3939 _bfd_vms_output_quad (recwr
, rptr
->address
);
3940 _bfd_vms_output_long (recwr
, (unsigned long) 0x47ff041f);
3941 _bfd_vms_output_long
3942 (recwr
, (unsigned long) udata
->enbsym
->section
->index
);
3943 _bfd_vms_output_quad (recwr
, rptr
->addend
);
3944 _bfd_vms_output_counted
3945 (recwr
, _bfd_vms_length_hash_symbol
3946 (abfd
, udata
->origname
, EOBJ__C_SYMSIZ
));
3947 _bfd_vms_output_end_subrec (recwr
);
3951 (*_bfd_error_handler
) (_("Spurious ALPHA_R_BSR reloc"));
3956 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
3957 etir_output_check (abfd
, section
, curr_addr
,
3958 32 + 1 + strlen (udata
->origname
));
3959 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LDA_GBL
);
3960 _bfd_vms_output_long
3961 (recwr
, (unsigned long) udata
->lkindex
+ 1);
3962 _bfd_vms_output_long
3963 (recwr
, (unsigned long) udata
->enbsym
->section
->index
);
3964 _bfd_vms_output_quad (recwr
, rptr
->address
);
3965 _bfd_vms_output_long (recwr
, (unsigned long) 0x237B0000);
3966 _bfd_vms_output_long
3967 (recwr
, (unsigned long) udata
->bsym
->section
->index
);
3968 _bfd_vms_output_quad (recwr
, rptr
->addend
);
3969 _bfd_vms_output_counted
3970 (recwr
, _bfd_vms_length_hash_symbol
3971 (abfd
, udata
->origname
, EOBJ__C_SYMSIZ
));
3972 _bfd_vms_output_end_subrec (recwr
);
3977 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
3978 etir_output_check (abfd
, section
, curr_addr
,
3979 32 + 1 + strlen (udata
->origname
));
3980 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_BOH_GBL
);
3981 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
3982 _bfd_vms_output_long
3983 (recwr
, (unsigned long) udata
->enbsym
->section
->index
);
3984 _bfd_vms_output_quad (recwr
, rptr
->address
);
3985 _bfd_vms_output_long (recwr
, (unsigned long) 0xD3400000);
3986 _bfd_vms_output_long
3987 (recwr
, (unsigned long) udata
->enbsym
->section
->index
);
3988 _bfd_vms_output_quad (recwr
, rptr
->addend
);
3989 _bfd_vms_output_counted
3990 (recwr
, _bfd_vms_length_hash_symbol
3991 (abfd
, udata
->origname
, EOBJ__C_SYMSIZ
));
3992 _bfd_vms_output_end_subrec (recwr
);
3996 (*_bfd_error_handler
) (_("Unhandled relocation %s"),
4003 } /* End of relocs loop. */
4005 if (!pass2_in_progress
)
4007 /* Output rest of section. */
4008 if (curr_addr
> section
->size
)
4009 (*_bfd_error_handler
) (_("Size error in section %s"),
4011 size
= section
->size
- curr_addr
;
4012 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
4018 pass2_in_progress
= 1;
4024 else /* (section->flags & SEC_RELOC) */
4025 sto_imm (abfd
, section
, section
->size
, section
->contents
, 0);
4027 end_etir_record (abfd
);
4030 _bfd_vms_output_alignment (recwr
, 2);
4034 /* Write cached information into a file being written, at bfd_close. */
4037 alpha_vms_write_object_contents (bfd
*abfd
)
4039 vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd
));
4041 if (abfd
->flags
& (EXEC_P
| DYNAMIC
))
4043 return alpha_vms_write_exec (abfd
);
4047 if (abfd
->section_count
> 0) /* we have sections */
4049 if (_bfd_vms_write_ehdr (abfd
) != TRUE
)
4051 if (_bfd_vms_write_egsd (abfd
) != TRUE
)
4053 if (_bfd_vms_write_etir (abfd
, EOBJ__C_ETIR
) != TRUE
)
4055 if (_bfd_vms_write_eeom (abfd
) != TRUE
)
4062 /* Debug stuff: nearest line. */
4064 #define SET_MODULE_PARSED(m) \
4065 do { if ((m)->name == NULL) (m)->name = ""; } while (0)
4066 #define IS_MODULE_PARSED(m) ((m)->name != NULL)
4068 /* Build a new module for the specified BFD. */
4070 static struct module
*
4071 new_module (bfd
*abfd
)
4073 struct module
*module
4074 = (struct module
*) bfd_zalloc (abfd
, sizeof (struct module
));
4075 module
->file_table_count
= 16; /* Arbitrary. */
4077 = bfd_malloc (module
->file_table_count
* sizeof (struct fileinfo
));
4081 /* Parse debug info for a module and internalize it. */
4084 parse_module (bfd
*abfd
, struct module
*module
, unsigned char *ptr
,
4087 unsigned char *maxptr
= ptr
+ length
;
4088 unsigned char *src_ptr
, *pcl_ptr
;
4089 unsigned int prev_linum
= 0, curr_linenum
= 0;
4090 bfd_vma prev_pc
= 0, curr_pc
= 0;
4091 struct srecinfo
*curr_srec
, *srec
;
4092 struct lineinfo
*curr_line
, *line
;
4093 struct funcinfo
*funcinfo
;
4095 /* Initialize tables with zero element. */
4096 curr_srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4097 module
->srec_table
= curr_srec
;
4099 curr_line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4100 module
->line_table
= curr_line
;
4102 while (length
== -1 || ptr
< maxptr
)
4104 /* The first byte is not counted in the recorded length. */
4105 int rec_length
= bfd_getl16 (ptr
) + 1;
4106 int rec_type
= bfd_getl16 (ptr
+ 2);
4108 vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length
, rec_type
));
4110 if (length
== -1 && rec_type
== DST__K_MODEND
)
4117 = _bfd_vms_save_counted_string (ptr
+ DST_S_B_MODBEG_NAME
);
4124 vms_debug2 ((3, "module: %s\n", module
->name
));
4131 funcinfo
= (struct funcinfo
*)
4132 bfd_zalloc (abfd
, sizeof (struct funcinfo
));
4134 = _bfd_vms_save_counted_string (ptr
+ DST_S_B_RTNBEG_NAME
);
4135 funcinfo
->low
= bfd_getl32 (ptr
+ DST_S_L_RTNBEG_ADDRESS
);
4136 funcinfo
->next
= module
->func_table
;
4137 module
->func_table
= funcinfo
;
4139 vms_debug2 ((3, "routine: %s at 0x%lx\n",
4140 funcinfo
->name
, (unsigned long) funcinfo
->low
));
4144 module
->func_table
->high
= module
->func_table
->low
4145 + bfd_getl32 (ptr
+ DST_S_L_RTNEND_SIZE
) - 1;
4147 if (module
->func_table
->high
> module
->high
)
4148 module
->high
= module
->func_table
->high
;
4150 vms_debug2 ((3, "end routine\n"));
4154 vms_debug2 ((3, "prologue\n"));
4158 vms_debug2 ((3, "epilog\n"));
4162 vms_debug2 ((3, "block\n"));
4166 vms_debug2 ((3, "end block\n"));
4170 src_ptr
= ptr
+ DST_S_C_SOURCE_HEADER_SIZE
;
4172 vms_debug2 ((3, "source info\n"));
4174 while (src_ptr
< ptr
+ rec_length
)
4176 int cmd
= src_ptr
[0], cmd_length
, data
;
4180 case DST__K_SRC_DECLFILE
:
4183 = bfd_getl16 (src_ptr
+ DST_S_W_SRC_DF_FILEID
);
4185 = _bfd_vms_save_counted_string (src_ptr
4186 + DST_S_B_SRC_DF_FILENAME
);
4188 while (fileid
>= module
->file_table_count
)
4190 module
->file_table_count
*= 2;
4192 = bfd_realloc (module
->file_table
,
4193 module
->file_table_count
4194 * sizeof (struct fileinfo
));
4197 module
->file_table
[fileid
].name
= filename
;
4198 module
->file_table
[fileid
].srec
= 1;
4199 cmd_length
= src_ptr
[DST_S_B_SRC_DF_LENGTH
] + 2;
4200 vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4201 fileid
, module
->file_table
[fileid
].name
));
4205 case DST__K_SRC_DEFLINES_B
:
4206 /* Perform the association and set the next higher index
4208 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4209 srec
= (struct srecinfo
*)
4210 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4211 srec
->line
= curr_srec
->line
+ data
;
4212 srec
->srec
= curr_srec
->srec
+ data
;
4213 srec
->sfile
= curr_srec
->sfile
;
4214 curr_srec
->next
= srec
;
4217 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data
));
4220 case DST__K_SRC_DEFLINES_W
:
4221 /* Perform the association and set the next higher index
4223 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4224 srec
= (struct srecinfo
*)
4225 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4226 srec
->line
= curr_srec
->line
+ data
;
4227 srec
->srec
= curr_srec
->srec
+ data
,
4228 srec
->sfile
= curr_srec
->sfile
;
4229 curr_srec
->next
= srec
;
4232 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data
));
4235 case DST__K_SRC_INCRLNUM_B
:
4236 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4237 curr_srec
->line
+= data
;
4239 vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data
));
4242 case DST__K_SRC_SETFILE
:
4243 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4244 curr_srec
->sfile
= data
;
4245 curr_srec
->srec
= module
->file_table
[data
].srec
;
4247 vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data
));
4250 case DST__K_SRC_SETLNUM_L
:
4251 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4252 curr_srec
->line
= data
;
4254 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data
));
4257 case DST__K_SRC_SETLNUM_W
:
4258 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4259 curr_srec
->line
= data
;
4261 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data
));
4264 case DST__K_SRC_SETREC_L
:
4265 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4266 curr_srec
->srec
= data
;
4267 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4269 vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data
));
4272 case DST__K_SRC_SETREC_W
:
4273 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4274 curr_srec
->srec
= data
;
4275 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4277 vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data
));
4280 case DST__K_SRC_FORMFEED
:
4282 vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4286 (*_bfd_error_handler
) (_("unknown source command %d"),
4292 src_ptr
+= cmd_length
;
4296 case DST__K_LINE_NUM
:
4297 pcl_ptr
= ptr
+ DST_S_C_LINE_NUM_HEADER_SIZE
;
4299 vms_debug2 ((3, "line info\n"));
4301 while (pcl_ptr
< ptr
+ rec_length
)
4303 /* The command byte is signed so we must sign-extend it. */
4304 int cmd
= ((signed char *)pcl_ptr
)[0], cmd_length
, data
;
4308 case DST__K_DELTA_PC_W
:
4309 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4313 vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data
));
4316 case DST__K_DELTA_PC_L
:
4317 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4321 vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data
));
4324 case DST__K_INCR_LINUM
:
4325 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4326 curr_linenum
+= data
;
4328 vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data
));
4331 case DST__K_INCR_LINUM_W
:
4332 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4333 curr_linenum
+= data
;
4335 vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data
));
4338 case DST__K_INCR_LINUM_L
:
4339 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4340 curr_linenum
+= data
;
4342 vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data
));
4345 case DST__K_SET_LINUM_INCR
:
4346 (*_bfd_error_handler
)
4347 (_("DST__K_SET_LINUM_INCR not implemented"));
4351 case DST__K_SET_LINUM_INCR_W
:
4352 (*_bfd_error_handler
)
4353 (_("DST__K_SET_LINUM_INCR_W not implemented"));
4357 case DST__K_RESET_LINUM_INCR
:
4358 (*_bfd_error_handler
)
4359 (_("DST__K_RESET_LINUM_INCR not implemented"));
4363 case DST__K_BEG_STMT_MODE
:
4364 (*_bfd_error_handler
)
4365 (_("DST__K_BEG_STMT_MODE not implemented"));
4369 case DST__K_END_STMT_MODE
:
4370 (*_bfd_error_handler
)
4371 (_("DST__K_END_STMT_MODE not implemented"));
4375 case DST__K_SET_LINUM_B
:
4376 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4377 curr_linenum
= data
;
4379 vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data
));
4382 case DST__K_SET_LINUM
:
4383 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4384 curr_linenum
= data
;
4386 vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data
));
4389 case DST__K_SET_LINUM_L
:
4390 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4391 curr_linenum
= data
;
4393 vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data
));
4397 (*_bfd_error_handler
)
4398 (_("DST__K_SET_PC not implemented"));
4402 case DST__K_SET_PC_W
:
4403 (*_bfd_error_handler
)
4404 (_("DST__K_SET_PC_W not implemented"));
4408 case DST__K_SET_PC_L
:
4409 (*_bfd_error_handler
)
4410 (_("DST__K_SET_PC_L not implemented"));
4414 case DST__K_SET_STMTNUM
:
4415 (*_bfd_error_handler
)
4416 (_("DST__K_SET_STMTNUM not implemented"));
4421 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4424 vms_debug2 ((4, "DST__K_TERM: %d\n", data
));
4428 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4431 vms_debug2 ((4, "DST__K_TERM_W: %d\n", data
));
4435 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4438 vms_debug2 ((4, "DST__K_TERM_L: %d\n", data
));
4441 case DST__K_SET_ABS_PC
:
4442 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4445 vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data
));
4454 vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4455 (unsigned long)curr_pc
, curr_linenum
));
4459 (*_bfd_error_handler
) (_("unknown line command %d"),
4466 if ((curr_linenum
!= prev_linum
&& curr_pc
!= prev_pc
)
4468 || cmd
== DST__K_DELTA_PC_L
4469 || cmd
== DST__K_DELTA_PC_W
)
4471 line
= (struct lineinfo
*)
4472 bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4473 line
->address
= curr_pc
;
4474 line
->line
= curr_linenum
;
4476 curr_line
->next
= line
;
4479 prev_linum
= curr_linenum
;
4481 vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4482 (unsigned long)curr_pc
, curr_linenum
));
4485 pcl_ptr
+= cmd_length
;
4489 case 0x17: /* Undocumented type used by DEC C to declare equates. */
4490 vms_debug2 ((3, "undocumented type 0x17\n"));
4494 vms_debug2 ((3, "ignoring record\n"));
4502 /* Finalize tables with EOL marker. */
4503 srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4504 srec
->line
= (unsigned int) -1;
4505 srec
->srec
= (unsigned int) -1;
4506 curr_srec
->next
= srec
;
4508 line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4509 line
->line
= (unsigned int) -1;
4510 line
->address
= (bfd_vma
) -1;
4511 curr_line
->next
= line
;
4513 /* Advertise that this module has been parsed. This is needed
4514 because parsing can be either performed at module creation
4515 or deferred until debug info is consumed. */
4516 SET_MODULE_PARSED (module
);
4519 /* Build the list of modules for the specified BFD. */
4521 static struct module
*
4522 build_module_list (bfd
*abfd
)
4524 struct module
*module
, *list
= NULL
;
4527 if ((dmt
= bfd_get_section_by_name (abfd
, "$DMT$")))
4529 /* We have a DMT section so this must be an image. Parse the
4530 section and build the list of modules. This is sufficient
4531 since we can compute the start address and the end address
4532 of every module from the section contents. */
4533 bfd_size_type size
= bfd_get_section_size (dmt
);
4534 unsigned char *ptr
, *end
;
4536 ptr
= (unsigned char *) bfd_alloc (abfd
, size
);
4540 if (! bfd_get_section_contents (abfd
, dmt
, ptr
, 0, size
))
4543 vms_debug2 ((2, "DMT\n"));
4549 /* Each header declares a module with its start offset and size
4550 of debug info in the DST section, as well as the count of
4551 program sections (i.e. address spans) it contains. */
4552 int modbeg
= bfd_getl32 (ptr
+ DBG_S_L_DMT_MODBEG
);
4553 int msize
= bfd_getl32 (ptr
+ DBG_S_L_DST_SIZE
);
4554 int count
= bfd_getl16 (ptr
+ DBG_S_W_DMT_PSECT_COUNT
);
4555 ptr
+= DBG_S_C_DMT_HEADER_SIZE
;
4557 vms_debug2 ((3, "module: modbeg = %d, size = %d, count = %d\n",
4558 modbeg
, msize
, count
));
4560 /* We create a 'module' structure for each program section since
4561 we only support contiguous addresses in a 'module' structure.
4562 As a consequence, the actual debug info in the DST section is
4563 shared and can be parsed multiple times; that doesn't seem to
4564 cause problems in practice. */
4567 int start
= bfd_getl32 (ptr
+ DBG_S_L_DMT_PSECT_START
);
4568 int length
= bfd_getl32 (ptr
+ DBG_S_L_DMT_PSECT_LENGTH
);
4569 module
= new_module (abfd
);
4570 module
->modbeg
= modbeg
;
4571 module
->size
= msize
;
4572 module
->low
= start
;
4573 module
->high
= start
+ length
;
4574 module
->next
= list
;
4576 ptr
+= DBG_S_C_DMT_PSECT_SIZE
;
4578 vms_debug2 ((4, "section: start = 0x%x, length = %d\n",
4585 /* We don't have a DMT section so this must be an object. Parse
4586 the module right now in order to compute its start address and
4588 module
= new_module (abfd
);
4589 parse_module (abfd
, module
, PRIV (dst_section
)->contents
, -1);
4596 /* Calculate and return the name of the source file and the line nearest
4597 to the wanted location in the specified module. */
4600 module_find_nearest_line (bfd
*abfd
, struct module
*module
, bfd_vma addr
,
4601 const char **file
, const char **func
,
4604 struct funcinfo
*funcinfo
;
4605 struct lineinfo
*lineinfo
;
4606 struct srecinfo
*srecinfo
;
4607 bfd_boolean ret
= FALSE
;
4609 /* Parse this module if that was not done at module creation. */
4610 if (! IS_MODULE_PARSED (module
))
4612 unsigned int size
= module
->size
;
4613 unsigned int modbeg
= PRIV (dst_section
)->filepos
+ module
->modbeg
;
4614 unsigned char *buffer
= (unsigned char *) bfd_malloc (module
->size
);
4616 if (bfd_seek (abfd
, modbeg
, SEEK_SET
) != 0
4617 || bfd_bread (buffer
, size
, abfd
) != size
)
4619 bfd_set_error (bfd_error_no_debug_section
);
4623 parse_module (abfd
, module
, buffer
, size
);
4627 /* Find out the function (if any) that contains the address. */
4628 for (funcinfo
= module
->func_table
; funcinfo
; funcinfo
= funcinfo
->next
)
4629 if (addr
>= funcinfo
->low
&& addr
<= funcinfo
->high
)
4631 *func
= funcinfo
->name
;
4636 /* Find out the source file and the line nearest to the address. */
4637 for (lineinfo
= module
->line_table
; lineinfo
; lineinfo
= lineinfo
->next
)
4638 if (lineinfo
->next
&& addr
< lineinfo
->next
->address
)
4640 for (srecinfo
= module
->srec_table
; srecinfo
; srecinfo
= srecinfo
->next
)
4641 if (srecinfo
->next
&& lineinfo
->line
< srecinfo
->next
->line
)
4643 if (srecinfo
->sfile
> 0)
4645 *file
= module
->file_table
[srecinfo
->sfile
].name
;
4646 *line
= srecinfo
->srec
+ lineinfo
->line
- srecinfo
->line
;
4650 *file
= module
->name
;
4651 *line
= lineinfo
->line
;
4662 /* Provided a BFD, a section and an offset into the section, calculate and
4663 return the name of the source file and the line nearest to the wanted
4667 _bfd_vms_find_nearest_dst_line (bfd
*abfd
, asection
*section
,
4668 asymbol
**symbols ATTRIBUTE_UNUSED
,
4669 bfd_vma offset
, const char **file
,
4670 const char **func
, unsigned int *line
)
4672 struct module
*module
;
4674 /* What address are we looking for? */
4675 bfd_vma addr
= section
->vma
+ offset
;
4681 if (PRIV (dst_section
) == NULL
|| !(abfd
->flags
& (EXEC_P
| DYNAMIC
)))
4684 if (PRIV (modules
) == NULL
)
4686 PRIV (modules
) = build_module_list (abfd
);
4687 if (PRIV (modules
) == NULL
)
4691 for (module
= PRIV (modules
); module
; module
= module
->next
)
4692 if (addr
>= module
->low
&& addr
<= module
->high
)
4693 return module_find_nearest_line (abfd
, module
, addr
, file
, func
, line
);
4698 /* Canonicalizations. */
4699 /* Set name, value, section and flags of SYM from E. */
4702 alpha_vms_convert_symbol (bfd
*abfd
, struct vms_symbol_entry
*e
, asymbol
*sym
)
4711 flags
= BSF_NO_FLAGS
;
4717 if (e
->flags
& EGSY__V_WEAK
)
4720 if (e
->flags
& EGSY__V_DEF
)
4722 /* Symbol definition. */
4723 flags
|= BSF_GLOBAL
;
4724 if (e
->flags
& EGSY__V_NORM
)
4725 flags
|= BSF_FUNCTION
;
4731 /* Symbol reference. */
4732 sec
= bfd_und_section_ptr
;
4737 /* A universal symbol is by definition global... */
4738 flags
|= BSF_GLOBAL
;
4740 /* ...and dynamic in shared libraries. */
4741 if (abfd
->flags
& DYNAMIC
)
4742 flags
|= BSF_DYNAMIC
;
4744 if (e
->flags
& EGSY__V_WEAK
)
4747 if (!(e
->flags
& EGSY__V_DEF
))
4750 if (e
->flags
& EGSY__V_NORM
)
4751 flags
|= BSF_FUNCTION
;
4754 /* sec = e->section; */
4755 sec
= bfd_abs_section_ptr
;
4770 /* Return the number of bytes required to store a vector of pointers
4771 to asymbols for all the symbols in the BFD abfd, including a
4772 terminal NULL pointer. If there are no symbols in the BFD,
4773 then return 0. If an error occurs, return -1. */
4776 alpha_vms_get_symtab_upper_bound (bfd
*abfd
)
4778 vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
4779 abfd
, PRIV (gsd_sym_count
)));
4781 return (PRIV (gsd_sym_count
) + 1) * sizeof (asymbol
*);
4784 /* Read the symbols from the BFD abfd, and fills in the vector
4785 location with pointers to the symbols and a trailing NULL.
4787 Return number of symbols read. */
4790 alpha_vms_canonicalize_symtab (bfd
*abfd
, asymbol
**symbols
)
4794 vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd
));
4796 if (PRIV (csymbols
) == NULL
)
4798 PRIV (csymbols
) = (asymbol
**) bfd_alloc
4799 (abfd
, PRIV (gsd_sym_count
) * sizeof (asymbol
*));
4801 /* Traverse table and fill symbols vector. */
4802 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
4804 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
4807 sym
= bfd_make_empty_symbol (abfd
);
4808 if (sym
== NULL
|| !alpha_vms_convert_symbol (abfd
, e
, sym
))
4810 bfd_release (abfd
, PRIV (csymbols
));
4811 PRIV (csymbols
) = NULL
;
4815 PRIV (csymbols
)[i
] = sym
;
4819 if (symbols
!= NULL
)
4821 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
4822 symbols
[i
] = PRIV (csymbols
)[i
];
4826 return PRIV (gsd_sym_count
);
4829 /* Read and convert relocations from ETIR. We do it once for all sections. */
4832 alpha_vms_slurp_relocs (bfd
*abfd
)
4836 vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
4838 /* We slurp relocs only once, for all sections. */
4839 if (PRIV (reloc_done
))
4841 PRIV (reloc_done
) = TRUE
;
4843 if (alpha_vms_canonicalize_symtab (abfd
, NULL
) < 0)
4846 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
4851 unsigned char *begin
;
4854 bfd_reloc_code_real_type reloc_code
;
4860 bfd_vma cur_address
;
4862 unsigned char *cur_sym
= NULL
;
4864 bfd_vma cur_addend
= 0;
4866 /* Skip non-ETIR records. */
4867 type
= _bfd_vms_get_object_record (abfd
);
4868 if (type
== EOBJ__C_EEOM
)
4870 if (type
!= EOBJ__C_ETIR
)
4873 begin
= PRIV (recrd
.rec
) + 4;
4874 end
= PRIV (recrd
.rec
) + PRIV (recrd
.rec_size
);
4876 for (ptr
= begin
; ptr
< end
; ptr
+= length
)
4880 cmd
= bfd_getl16 (ptr
);
4881 length
= bfd_getl16 (ptr
+ 2);
4883 cur_address
= vaddr
;
4885 vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
4886 _bfd_vms_etir_name (cmd
)));
4890 case ETIR__C_STA_GBL
: /* ALPHA_R_REFLONG und_section, step 1 */
4891 /* ALPHA_R_REFQUAD und_section, step 1 */
4896 case ETIR__C_STA_PQ
: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
4897 cur_psidx
= bfd_getl32 (ptr
+ 4);
4898 cur_addend
= bfd_getl64 (ptr
+ 8);
4902 case ETIR__C_CTL_SETRB
:
4903 if (prev_cmd
!= ETIR__C_STA_PQ
)
4905 (*_bfd_error_handler
)
4906 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd
),
4907 _bfd_vms_etir_name (cmd
));
4910 cur_psect
= cur_psidx
;
4916 case ETIR__C_STA_LW
: /* ALPHA_R_REFLONG abs_section, step 1 */
4917 /* ALPHA_R_REFLONG und_section, step 2 */
4920 if (prev_cmd
!= ETIR__C_STA_GBL
)
4922 (*_bfd_error_handler
)
4923 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
4924 _bfd_vms_etir_name (ETIR__C_STA_LW
));
4928 cur_addend
= bfd_getl32 (ptr
+ 4);
4932 case ETIR__C_STA_QW
: /* ALPHA_R_REFQUAD abs_section, step 1 */
4933 /* ALPHA_R_REFQUAD und_section, step 2 */
4934 if (prev_cmd
!= -1 && prev_cmd
!= ETIR__C_STA_GBL
)
4936 (*_bfd_error_handler
)
4937 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
4938 _bfd_vms_etir_name (ETIR__C_STA_QW
));
4941 cur_addend
= bfd_getl64 (ptr
+ 4);
4945 case ETIR__C_STO_LW
: /* ALPHA_R_REFLONG und_section, step 4 */
4946 /* ALPHA_R_REFLONG abs_section, step 2 */
4947 /* ALPHA_R_REFLONG others, step 2 */
4948 if (prev_cmd
!= ETIR__C_OPR_ADD
4949 && prev_cmd
!= ETIR__C_STA_LW
4950 && prev_cmd
!= ETIR__C_STA_PQ
)
4952 (*_bfd_error_handler
) (_("Unknown reloc %s + %s"),
4953 _bfd_vms_etir_name (prev_cmd
),
4954 _bfd_vms_etir_name (ETIR__C_STO_LW
));
4957 reloc_code
= BFD_RELOC_32
;
4960 case ETIR__C_STO_QW
: /* ALPHA_R_REFQUAD und_section, step 4 */
4961 /* ALPHA_R_REFQUAD abs_section, step 2 */
4962 if (prev_cmd
!= ETIR__C_OPR_ADD
&& prev_cmd
!= ETIR__C_STA_QW
)
4964 (*_bfd_error_handler
) (_("Unknown reloc %s + %s"),
4965 _bfd_vms_etir_name (prev_cmd
),
4966 _bfd_vms_etir_name (ETIR__C_STO_QW
));
4969 reloc_code
= BFD_RELOC_64
;
4972 case ETIR__C_STO_OFF
: /* ALPHA_R_REFQUAD others, step 2 */
4973 if (prev_cmd
!= ETIR__C_STA_PQ
)
4975 (*_bfd_error_handler
) (_("Unknown reloc %s + %s"),
4976 _bfd_vms_etir_name (prev_cmd
),
4977 _bfd_vms_etir_name (ETIR__C_STO_OFF
));
4980 reloc_code
= BFD_RELOC_64
;
4983 case ETIR__C_OPR_ADD
: /* ALPHA_R_REFLONG und_section, step 3 */
4984 /* ALPHA_R_REFQUAD und_section, step 3 */
4985 if (prev_cmd
!= ETIR__C_STA_LW
&& prev_cmd
!= ETIR__C_STA_QW
)
4987 (*_bfd_error_handler
) (_("Unknown reloc %s + %s"),
4988 _bfd_vms_etir_name (prev_cmd
),
4989 _bfd_vms_etir_name (ETIR__C_OPR_ADD
));
4992 prev_cmd
= ETIR__C_OPR_ADD
;
4995 case ETIR__C_STO_CA
: /* ALPHA_R_CODEADDR */
4996 reloc_code
= BFD_RELOC_ALPHA_CODEADDR
;
5000 case ETIR__C_STO_GBL
: /* ALPHA_R_REFQUAD und_section */
5001 reloc_code
= BFD_RELOC_64
;
5005 case ETIR__C_STO_GBL_LW
: /* ALPHA_R_REFLONG und_section */
5006 reloc_code
= BFD_RELOC_32
;
5010 case ETIR__C_STC_LP_PSB
: /* ALPHA_R_LINKAGE */
5011 reloc_code
= BFD_RELOC_ALPHA_LINKAGE
;
5015 case ETIR__C_STC_NOP_GBL
: /* ALPHA_R_NOP */
5016 reloc_code
= BFD_RELOC_ALPHA_NOP
;
5019 case ETIR__C_STC_BSR_GBL
: /* ALPHA_R_BSR */
5020 reloc_code
= BFD_RELOC_ALPHA_BSR
;
5023 case ETIR__C_STC_LDA_GBL
: /* ALPHA_R_LDA */
5024 reloc_code
= BFD_RELOC_ALPHA_LDA
;
5027 case ETIR__C_STC_BOH_GBL
: /* ALPHA_R_BOH */
5028 reloc_code
= BFD_RELOC_ALPHA_BOH
;
5032 cur_sym
= ptr
+ 4 + 32;
5033 cur_address
= bfd_getl64 (ptr
+ 4 + 8);
5034 cur_addend
= bfd_getl64 (ptr
+ 4 + 24);
5037 case ETIR__C_STO_IMM
:
5038 vaddr
+= bfd_getl32 (ptr
+ 4);
5042 (*_bfd_error_handler
) (_("Unknown reloc %s"),
5043 _bfd_vms_etir_name (cmd
));
5049 struct vms_section_data_struct
*vms_sec
;
5052 /* Get section to which the relocation applies. */
5053 if (cur_psect
< 0 || cur_psect
> (int)PRIV (section_count
))
5055 (*_bfd_error_handler
) (_("Invalid section index in ETIR"));
5058 sec
= PRIV (sections
)[cur_psect
];
5059 vms_sec
= vms_section_data (sec
);
5061 /* Allocate a reloc entry. */
5062 if (sec
->reloc_count
>= vms_sec
->reloc_max
)
5064 if (vms_sec
->reloc_max
== 0)
5066 vms_sec
->reloc_max
= 64;
5067 sec
->relocation
= bfd_zmalloc
5068 (vms_sec
->reloc_max
* sizeof (arelent
));
5072 vms_sec
->reloc_max
*= 2;
5073 sec
->relocation
= bfd_realloc
5074 (sec
->relocation
, vms_sec
->reloc_max
* sizeof (arelent
));
5077 reloc
= &sec
->relocation
[sec
->reloc_count
];
5080 reloc
->howto
= bfd_reloc_type_lookup (abfd
, reloc_code
);
5082 if (cur_sym
!= NULL
)
5085 unsigned int symlen
= *cur_sym
;
5088 /* Linear search. */
5093 for (j
= 0; j
< PRIV (gsd_sym_count
); j
++)
5094 if (PRIV (syms
)[j
]->namelen
== symlen
5095 && memcmp (PRIV (syms
)[j
]->name
, cur_sym
, symlen
) == 0)
5097 sym
= &PRIV (csymbols
)[j
];
5102 (*_bfd_error_handler
) (_("Unknown symbol in command %s"),
5103 _bfd_vms_etir_name (cmd
));
5104 reloc
->sym_ptr_ptr
= NULL
;
5107 reloc
->sym_ptr_ptr
= sym
;
5109 else if (cur_psidx
>= 0)
5110 reloc
->sym_ptr_ptr
=
5111 PRIV (sections
)[cur_psidx
]->symbol_ptr_ptr
;
5113 reloc
->sym_ptr_ptr
= NULL
;
5115 reloc
->address
= cur_address
;
5116 reloc
->addend
= cur_addend
;
5118 vaddr
+= bfd_get_reloc_size (reloc
->howto
);
5127 vms_debug2 ((3, "alpha_vms_slurp_relocs: result = TRUE\n"));
5132 /* Return the number of bytes required to store the relocation
5133 information associated with the given section. */
5136 alpha_vms_get_reloc_upper_bound (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*section
)
5138 alpha_vms_slurp_relocs (abfd
);
5140 return (section
->reloc_count
+ 1) * sizeof (arelent
*);
5143 /* Convert relocations from VMS (external) form into BFD internal
5144 form. Return the number of relocations. */
5147 alpha_vms_canonicalize_reloc (bfd
*abfd
, asection
*section
, arelent
**relptr
,
5148 asymbol
**symbols ATTRIBUTE_UNUSED
)
5153 if (!alpha_vms_slurp_relocs (abfd
))
5156 count
= section
->reloc_count
;
5157 tblptr
= section
->relocation
;
5160 *relptr
++ = tblptr
++;
5162 *relptr
= (arelent
*) NULL
;
5163 return section
->reloc_count
;
5166 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
5168 /* How to process the various reloc types. */
5170 static bfd_reloc_status_type
5171 reloc_nil (bfd
* abfd ATTRIBUTE_UNUSED
,
5172 arelent
*reloc ATTRIBUTE_UNUSED
,
5173 asymbol
*sym ATTRIBUTE_UNUSED
,
5174 void * data ATTRIBUTE_UNUSED
,
5175 asection
*sec ATTRIBUTE_UNUSED
,
5176 bfd
*output_bfd ATTRIBUTE_UNUSED
,
5177 char **error_message ATTRIBUTE_UNUSED
)
5180 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd
, output_bfd
);
5181 vms_debug (2, "In section %s, symbol %s\n",
5182 sec
->name
, sym
->name
);
5183 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5184 reloc
->sym_ptr_ptr
[0]->name
,
5185 (unsigned long)reloc
->address
,
5186 (unsigned long)reloc
->addend
, reloc
->howto
->name
);
5187 vms_debug (2, "data at %p\n", data
);
5188 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5191 return bfd_reloc_ok
;
5194 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5195 from smaller values. Start with zero, widen, *then* decrement. */
5196 #define MINUS_ONE (((bfd_vma)0) - 1)
5198 static reloc_howto_type alpha_howto_table
[] =
5200 HOWTO (ALPHA_R_IGNORE
, /* Type. */
5201 0, /* Rightshift. */
5202 0, /* Size (0 = byte, 1 = short, 2 = long). */
5204 TRUE
, /* PC relative. */
5206 complain_overflow_dont
,/* Complain_on_overflow. */
5207 reloc_nil
, /* Special_function. */
5208 "IGNORE", /* Name. */
5209 TRUE
, /* Partial_inplace. */
5210 0, /* Source mask */
5212 TRUE
), /* PC rel offset. */
5214 /* A 64 bit reference to a symbol. */
5215 HOWTO (ALPHA_R_REFQUAD
, /* Type. */
5216 0, /* Rightshift. */
5217 4, /* Size (0 = byte, 1 = short, 2 = long). */
5219 FALSE
, /* PC relative. */
5221 complain_overflow_bitfield
, /* Complain_on_overflow. */
5222 reloc_nil
, /* Special_function. */
5223 "REFQUAD", /* Name. */
5224 TRUE
, /* Partial_inplace. */
5225 MINUS_ONE
, /* Source mask. */
5226 MINUS_ONE
, /* Dest mask. */
5227 FALSE
), /* PC rel offset. */
5229 /* A 21 bit branch. The native assembler generates these for
5230 branches within the text segment, and also fills in the PC
5231 relative offset in the instruction. */
5232 HOWTO (ALPHA_R_BRADDR
, /* Type. */
5233 2, /* Rightshift. */
5234 2, /* Size (0 = byte, 1 = short, 2 = long). */
5236 TRUE
, /* PC relative. */
5238 complain_overflow_signed
, /* Complain_on_overflow. */
5239 reloc_nil
, /* Special_function. */
5240 "BRADDR", /* Name. */
5241 TRUE
, /* Partial_inplace. */
5242 0x1fffff, /* Source mask. */
5243 0x1fffff, /* Dest mask. */
5244 FALSE
), /* PC rel offset. */
5246 /* A hint for a jump to a register. */
5247 HOWTO (ALPHA_R_HINT
, /* Type. */
5248 2, /* Rightshift. */
5249 1, /* Size (0 = byte, 1 = short, 2 = long). */
5251 TRUE
, /* PC relative. */
5253 complain_overflow_dont
,/* Complain_on_overflow. */
5254 reloc_nil
, /* Special_function. */
5256 TRUE
, /* Partial_inplace. */
5257 0x3fff, /* Source mask. */
5258 0x3fff, /* Dest mask. */
5259 FALSE
), /* PC rel offset. */
5261 /* 16 bit PC relative offset. */
5262 HOWTO (ALPHA_R_SREL16
, /* Type. */
5263 0, /* Rightshift. */
5264 1, /* Size (0 = byte, 1 = short, 2 = long). */
5266 TRUE
, /* PC relative. */
5268 complain_overflow_signed
, /* Complain_on_overflow. */
5269 reloc_nil
, /* Special_function. */
5270 "SREL16", /* Name. */
5271 TRUE
, /* Partial_inplace. */
5272 0xffff, /* Source mask. */
5273 0xffff, /* Dest mask. */
5274 FALSE
), /* PC rel offset. */
5276 /* 32 bit PC relative offset. */
5277 HOWTO (ALPHA_R_SREL32
, /* Type. */
5278 0, /* Rightshift. */
5279 2, /* Size (0 = byte, 1 = short, 2 = long). */
5281 TRUE
, /* PC relative. */
5283 complain_overflow_signed
, /* Complain_on_overflow. */
5284 reloc_nil
, /* Special_function. */
5285 "SREL32", /* Name. */
5286 TRUE
, /* Partial_inplace. */
5287 0xffffffff, /* Source mask. */
5288 0xffffffff, /* Dest mask. */
5289 FALSE
), /* PC rel offset. */
5291 /* A 64 bit PC relative offset. */
5292 HOWTO (ALPHA_R_SREL64
, /* Type. */
5293 0, /* Rightshift. */
5294 4, /* Size (0 = byte, 1 = short, 2 = long). */
5296 TRUE
, /* PC relative. */
5298 complain_overflow_signed
, /* Complain_on_overflow. */
5299 reloc_nil
, /* Special_function. */
5300 "SREL64", /* Name. */
5301 TRUE
, /* Partial_inplace. */
5302 MINUS_ONE
, /* Source mask. */
5303 MINUS_ONE
, /* Dest mask. */
5304 FALSE
), /* PC rel offset. */
5306 /* Push a value on the reloc evaluation stack. */
5307 HOWTO (ALPHA_R_OP_PUSH
, /* Type. */
5308 0, /* Rightshift. */
5309 0, /* Size (0 = byte, 1 = short, 2 = long). */
5311 FALSE
, /* PC relative. */
5313 complain_overflow_dont
,/* Complain_on_overflow. */
5314 reloc_nil
, /* Special_function. */
5315 "OP_PUSH", /* Name. */
5316 FALSE
, /* Partial_inplace. */
5317 0, /* Source mask. */
5319 FALSE
), /* PC rel offset. */
5321 /* Store the value from the stack at the given address. Store it in
5322 a bitfield of size r_size starting at bit position r_offset. */
5323 HOWTO (ALPHA_R_OP_STORE
, /* Type. */
5324 0, /* Rightshift. */
5325 4, /* Size (0 = byte, 1 = short, 2 = long). */
5327 FALSE
, /* PC relative. */
5329 complain_overflow_dont
,/* Complain_on_overflow. */
5330 reloc_nil
, /* Special_function. */
5331 "OP_STORE", /* Name. */
5332 FALSE
, /* Partial_inplace. */
5333 0, /* Source mask. */
5334 MINUS_ONE
, /* Dest mask. */
5335 FALSE
), /* PC rel offset. */
5337 /* Subtract the reloc address from the value on the top of the
5338 relocation stack. */
5339 HOWTO (ALPHA_R_OP_PSUB
, /* Type. */
5340 0, /* Rightshift. */
5341 0, /* Size (0 = byte, 1 = short, 2 = long). */
5343 FALSE
, /* PC relative. */
5345 complain_overflow_dont
,/* Complain_on_overflow. */
5346 reloc_nil
, /* Special_function. */
5347 "OP_PSUB", /* Name. */
5348 FALSE
, /* Partial_inplace. */
5349 0, /* Source mask. */
5351 FALSE
), /* PC rel offset. */
5353 /* Shift the value on the top of the relocation stack right by the
5355 HOWTO (ALPHA_R_OP_PRSHIFT
, /* Type. */
5356 0, /* Rightshift. */
5357 0, /* Size (0 = byte, 1 = short, 2 = long). */
5359 FALSE
, /* PC relative. */
5361 complain_overflow_dont
,/* Complain_on_overflow. */
5362 reloc_nil
, /* Special_function. */
5363 "OP_PRSHIFT", /* Name. */
5364 FALSE
, /* Partial_inplace. */
5365 0, /* Source mask. */
5367 FALSE
), /* PC rel offset. */
5369 /* Hack. Linkage is done by linker. */
5370 HOWTO (ALPHA_R_LINKAGE
, /* Type. */
5371 0, /* Rightshift. */
5372 8, /* Size (0 = byte, 1 = short, 2 = long). */
5374 FALSE
, /* PC relative. */
5376 complain_overflow_dont
,/* Complain_on_overflow. */
5377 reloc_nil
, /* Special_function. */
5378 "LINKAGE", /* Name. */
5379 FALSE
, /* Partial_inplace. */
5380 0, /* Source mask. */
5382 FALSE
), /* PC rel offset. */
5384 /* A 32 bit reference to a symbol. */
5385 HOWTO (ALPHA_R_REFLONG
, /* Type. */
5386 0, /* Rightshift. */
5387 2, /* Size (0 = byte, 1 = short, 2 = long). */
5389 FALSE
, /* PC relative. */
5391 complain_overflow_bitfield
, /* Complain_on_overflow. */
5392 reloc_nil
, /* Special_function. */
5393 "REFLONG", /* Name. */
5394 TRUE
, /* Partial_inplace. */
5395 0xffffffff, /* Source mask. */
5396 0xffffffff, /* Dest mask. */
5397 FALSE
), /* PC rel offset. */
5399 /* A 64 bit reference to a procedure, written as 32 bit value. */
5400 HOWTO (ALPHA_R_CODEADDR
, /* Type. */
5401 0, /* Rightshift. */
5402 4, /* Size (0 = byte, 1 = short, 2 = long). */
5404 FALSE
, /* PC relative. */
5406 complain_overflow_signed
,/* Complain_on_overflow. */
5407 reloc_nil
, /* Special_function. */
5408 "CODEADDR", /* Name. */
5409 FALSE
, /* Partial_inplace. */
5410 0xffffffff, /* Source mask. */
5411 0xffffffff, /* Dest mask. */
5412 FALSE
), /* PC rel offset. */
5414 HOWTO (ALPHA_R_NOP
, /* Type. */
5415 0, /* Rightshift. */
5416 3, /* Size (0 = byte, 1 = short, 2 = long). */
5418 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5419 because the calculations for the 3 relocations are the same.
5420 See B.4.5.2 of the OpenVMS Linker Utility Manual. */
5421 TRUE
, /* PC relative. */
5423 complain_overflow_dont
,/* Complain_on_overflow. */
5424 reloc_nil
, /* Special_function. */
5426 FALSE
, /* Partial_inplace. */
5427 0xffffffff, /* Source mask. */
5428 0xffffffff, /* Dest mask. */
5429 FALSE
), /* PC rel offset. */
5431 HOWTO (ALPHA_R_BSR
, /* Type. */
5432 0, /* Rightshift. */
5433 3, /* Size (0 = byte, 1 = short, 2 = long). */
5435 TRUE
, /* PC relative. */
5437 complain_overflow_dont
,/* Complain_on_overflow. */
5438 reloc_nil
, /* Special_function. */
5440 FALSE
, /* Partial_inplace. */
5441 0xffffffff, /* Source mask. */
5442 0xffffffff, /* Dest mask. */
5443 FALSE
), /* PC rel offset. */
5445 HOWTO (ALPHA_R_LDA
, /* Type. */
5446 0, /* Rightshift. */
5447 3, /* Size (0 = byte, 1 = short, 2 = long). */
5449 FALSE
, /* PC relative. */
5451 complain_overflow_dont
,/* Complain_on_overflow. */
5452 reloc_nil
, /* Special_function. */
5454 FALSE
, /* Partial_inplace. */
5455 0xffffffff, /* Source mask. */
5456 0xffffffff, /* Dest mask. */
5457 FALSE
), /* PC rel offset. */
5459 HOWTO (ALPHA_R_BOH
, /* Type. */
5460 0, /* Rightshift. */
5461 3, /* Size (0 = byte, 1 = short, 2 = long, 3 = nil). */
5463 TRUE
, /* PC relative. */
5465 complain_overflow_dont
,/* Complain_on_overflow. */
5466 reloc_nil
, /* Special_function. */
5468 FALSE
, /* Partial_inplace. */
5469 0xffffffff, /* Source mask. */
5470 0xffffffff, /* Dest mask. */
5471 FALSE
), /* PC rel offset. */
5474 /* Return a pointer to a howto structure which, when invoked, will perform
5475 the relocation code on data from the architecture noted. */
5477 static const struct reloc_howto_struct
*
5478 alpha_vms_bfd_reloc_type_lookup (bfd
* abfd ATTRIBUTE_UNUSED
,
5479 bfd_reloc_code_real_type code
)
5483 vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd
, code
));
5487 case BFD_RELOC_16
: alpha_type
= ALPHA_R_SREL16
; break;
5488 case BFD_RELOC_32
: alpha_type
= ALPHA_R_REFLONG
; break;
5489 case BFD_RELOC_64
: alpha_type
= ALPHA_R_REFQUAD
; break;
5490 case BFD_RELOC_CTOR
: alpha_type
= ALPHA_R_REFQUAD
; break;
5491 case BFD_RELOC_23_PCREL_S2
: alpha_type
= ALPHA_R_BRADDR
; break;
5492 case BFD_RELOC_ALPHA_HINT
: alpha_type
= ALPHA_R_HINT
; break;
5493 case BFD_RELOC_16_PCREL
: alpha_type
= ALPHA_R_SREL16
; break;
5494 case BFD_RELOC_32_PCREL
: alpha_type
= ALPHA_R_SREL32
; break;
5495 case BFD_RELOC_64_PCREL
: alpha_type
= ALPHA_R_SREL64
; break;
5496 case BFD_RELOC_ALPHA_LINKAGE
: alpha_type
= ALPHA_R_LINKAGE
; break;
5497 case BFD_RELOC_ALPHA_CODEADDR
: alpha_type
= ALPHA_R_CODEADDR
; break;
5498 case BFD_RELOC_ALPHA_NOP
: alpha_type
= ALPHA_R_NOP
; break;
5499 case BFD_RELOC_ALPHA_BSR
: alpha_type
= ALPHA_R_BSR
; break;
5500 case BFD_RELOC_ALPHA_LDA
: alpha_type
= ALPHA_R_LDA
; break;
5501 case BFD_RELOC_ALPHA_BOH
: alpha_type
= ALPHA_R_BOH
; break;
5503 (*_bfd_error_handler
) ("reloc (%d) is *UNKNOWN*", code
);
5506 vms_debug2 ((2, "reloc is %s\n", alpha_howto_table
[alpha_type
].name
));
5507 return & alpha_howto_table
[alpha_type
];
5510 static reloc_howto_type
*
5511 alpha_vms_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
5517 i
< sizeof (alpha_howto_table
) / sizeof (alpha_howto_table
[0]);
5519 if (alpha_howto_table
[i
].name
!= NULL
5520 && strcasecmp (alpha_howto_table
[i
].name
, r_name
) == 0)
5521 return &alpha_howto_table
[i
];
5527 alpha_vms_get_synthetic_symtab (bfd
*abfd
,
5528 long symcount ATTRIBUTE_UNUSED
,
5529 asymbol
**usyms ATTRIBUTE_UNUSED
,
5530 long dynsymcount ATTRIBUTE_UNUSED
,
5531 asymbol
**dynsyms ATTRIBUTE_UNUSED
,
5538 syms
= (asymbol
*) bfd_malloc (PRIV (norm_sym_count
) * sizeof (asymbol
));
5543 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5545 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
5556 flags
= BSF_LOCAL
| BSF_SYNTHETIC
;
5563 if ((e
->flags
& EGSY__V_DEF
) && (e
->flags
& EGSY__V_NORM
))
5565 value
= e
->code_value
;
5566 sec
= e
->code_section
;
5577 sname
= bfd_alloc (abfd
, l
+ 5);
5580 memcpy (sname
, name
, l
);
5581 memcpy (sname
+ l
, "..en", 5);
5588 sym
->udata
.p
= NULL
;
5597 vms_time_to_str (unsigned char *buf
)
5599 time_t t
= vms_rawtime_to_time_t (buf
);
5600 char *res
= ctime (&t
);
5603 res
= "*invalid time*";
5610 evax_bfd_print_emh (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
5612 struct vms_emh_common
*emh
= (struct vms_emh_common
*)rec
;
5613 unsigned int subtype
;
5615 subtype
= (unsigned)bfd_getl16 (emh
->subtyp
);
5617 fprintf (file
, _(" EMH %u (len=%u): "), subtype
, rec_len
);
5623 struct vms_emh_mhd
*mhd
= (struct vms_emh_mhd
*)rec
;
5626 fprintf (file
, _("Module header\n"));
5627 fprintf (file
, _(" structure level: %u\n"), mhd
->strlvl
);
5628 fprintf (file
, _(" max record size: %u\n"),
5629 (unsigned)bfd_getl32 (mhd
->recsiz
));
5630 name
= (char *)(mhd
+ 1);
5631 fprintf (file
, _(" module name : %.*s\n"), name
[0], name
+ 1);
5632 name
+= name
[0] + 1;
5633 fprintf (file
, _(" module version : %.*s\n"), name
[0], name
+ 1);
5634 name
+= name
[0] + 1;
5635 fprintf (file
, _(" compile date : %.17s\n"), name
);
5640 fprintf (file
, _("Language Processor Name\n"));
5641 fprintf (file
, _(" language name: %.*s\n"),
5642 (int)(rec_len
- sizeof (struct vms_emh_common
)),
5643 (char *)rec
+ sizeof (struct vms_emh_common
));
5648 fprintf (file
, _("Source Files Header\n"));
5649 fprintf (file
, _(" file: %.*s\n"),
5650 (int)(rec_len
- sizeof (struct vms_emh_common
)),
5651 (char *)rec
+ sizeof (struct vms_emh_common
));
5656 fprintf (file
, _("Title Text Header\n"));
5657 fprintf (file
, _(" title: %.*s\n"),
5658 (int)(rec_len
- sizeof (struct vms_emh_common
)),
5659 (char *)rec
+ sizeof (struct vms_emh_common
));
5664 fprintf (file
, _("Copyright Header\n"));
5665 fprintf (file
, _(" copyright: %.*s\n"),
5666 (int)(rec_len
- sizeof (struct vms_emh_common
)),
5667 (char *)rec
+ sizeof (struct vms_emh_common
));
5671 fprintf (file
, _("unhandled emh subtype %u\n"), subtype
);
5677 evax_bfd_print_eeom (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
5679 struct vms_eeom
*eeom
= (struct vms_eeom
*)rec
;
5681 fprintf (file
, _(" EEOM (len=%u):\n"), rec_len
);
5682 fprintf (file
, _(" number of cond linkage pairs: %u\n"),
5683 (unsigned)bfd_getl32 (eeom
->total_lps
));
5684 fprintf (file
, _(" completion code: %u\n"),
5685 (unsigned)bfd_getl16 (eeom
->comcod
));
5688 fprintf (file
, _(" transfer addr flags: 0x%02x\n"), eeom
->tfrflg
);
5689 fprintf (file
, _(" transfer addr psect: %u\n"),
5690 (unsigned)bfd_getl32 (eeom
->psindx
));
5691 fprintf (file
, _(" transfer address : 0x%08x\n"),
5692 (unsigned)bfd_getl32 (eeom
->tfradr
));
5697 exav_bfd_print_egsy_flags (unsigned int flags
, FILE *file
)
5699 if (flags
& EGSY__V_WEAK
)
5700 fputs (_(" WEAK"), file
);
5701 if (flags
& EGSY__V_DEF
)
5702 fputs (_(" DEF"), file
);
5703 if (flags
& EGSY__V_UNI
)
5704 fputs (_(" UNI"), file
);
5705 if (flags
& EGSY__V_REL
)
5706 fputs (_(" REL"), file
);
5707 if (flags
& EGSY__V_COMM
)
5708 fputs (_(" COMM"), file
);
5709 if (flags
& EGSY__V_VECEP
)
5710 fputs (_(" VECEP"), file
);
5711 if (flags
& EGSY__V_NORM
)
5712 fputs (_(" NORM"), file
);
5713 if (flags
& EGSY__V_QUAD_VAL
)
5714 fputs (_(" QVAL"), file
);
5718 evax_bfd_print_egsd_flags (FILE *file
, unsigned int flags
)
5720 if (flags
& EGPS__V_PIC
)
5721 fputs (_(" PIC"), file
);
5722 if (flags
& EGPS__V_LIB
)
5723 fputs (_(" LIB"), file
);
5724 if (flags
& EGPS__V_OVR
)
5725 fputs (_(" OVR"), file
);
5726 if (flags
& EGPS__V_REL
)
5727 fputs (_(" REL"), file
);
5728 if (flags
& EGPS__V_GBL
)
5729 fputs (_(" GBL"), file
);
5730 if (flags
& EGPS__V_SHR
)
5731 fputs (_(" SHR"), file
);
5732 if (flags
& EGPS__V_EXE
)
5733 fputs (_(" EXE"), file
);
5734 if (flags
& EGPS__V_RD
)
5735 fputs (_(" RD"), file
);
5736 if (flags
& EGPS__V_WRT
)
5737 fputs (_(" WRT"), file
);
5738 if (flags
& EGPS__V_VEC
)
5739 fputs (_(" VEC"), file
);
5740 if (flags
& EGPS__V_NOMOD
)
5741 fputs (_(" NOMOD"), file
);
5742 if (flags
& EGPS__V_COM
)
5743 fputs (_(" COM"), file
);
5744 if (flags
& EGPS__V_ALLOC_64BIT
)
5745 fputs (_(" 64B"), file
);
5749 evax_bfd_print_egsd (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
5751 unsigned int off
= sizeof (struct vms_egsd
);
5754 fprintf (file
, _(" EGSD (len=%u):\n"), rec_len
);
5757 for (off
= sizeof (struct vms_egsd
); off
< rec_len
; )
5759 struct vms_egsd_entry
*e
= (struct vms_egsd_entry
*)(rec
+ off
);
5763 type
= (unsigned)bfd_getl16 (e
->gsdtyp
);
5764 len
= (unsigned)bfd_getl16 (e
->gsdsiz
);
5766 fprintf (file
, _(" EGSD entry %2u (type: %u, len: %u): "),
5774 struct vms_egps
*egps
= (struct vms_egps
*)e
;
5775 unsigned int flags
= bfd_getl16 (egps
->flags
);
5778 fprintf (file
, _("PSC - Program section definition\n"));
5779 fprintf (file
, _(" alignment : 2**%u\n"), egps
->align
);
5780 fprintf (file
, _(" flags : 0x%04x"), flags
);
5781 evax_bfd_print_egsd_flags (file
, flags
);
5783 l
= bfd_getl32 (egps
->alloc
);
5784 fprintf (file
, _(" alloc (len): %u (0x%08x)\n"), l
, l
);
5785 fprintf (file
, _(" name : %.*s\n"),
5786 egps
->namlng
, egps
->name
);
5791 struct vms_esgps
*esgps
= (struct vms_esgps
*)e
;
5792 unsigned int flags
= bfd_getl16 (esgps
->flags
);
5795 fprintf (file
, _("SPSC - Shared Image Program section def\n"));
5796 fprintf (file
, _(" alignment : 2**%u\n"), esgps
->align
);
5797 fprintf (file
, _(" flags : 0x%04x"), flags
);
5798 evax_bfd_print_egsd_flags (file
, flags
);
5800 l
= bfd_getl32 (esgps
->alloc
);
5801 fprintf (file
, _(" alloc (len) : %u (0x%08x)\n"), l
, l
);
5802 fprintf (file
, _(" image offset : 0x%08x\n"),
5803 (unsigned int)bfd_getl32 (esgps
->base
));
5804 fprintf (file
, _(" symvec offset : 0x%08x\n"),
5805 (unsigned int)bfd_getl32 (esgps
->value
));
5806 fprintf (file
, _(" name : %.*s\n"),
5807 esgps
->namlng
, esgps
->name
);
5812 struct vms_egsy
*egsy
= (struct vms_egsy
*)e
;
5813 unsigned int flags
= bfd_getl16 (egsy
->flags
);
5815 if (flags
& EGSY__V_DEF
)
5817 struct vms_esdf
*esdf
= (struct vms_esdf
*)e
;
5819 fprintf (file
, _("SYM - Global symbol definition\n"));
5820 fprintf (file
, _(" flags: 0x%04x"), flags
);
5821 exav_bfd_print_egsy_flags (flags
, file
);
5823 fprintf (file
, _(" psect offset: 0x%08x\n"),
5824 (unsigned)bfd_getl32 (esdf
->value
));
5825 if (flags
& EGSY__V_NORM
)
5827 fprintf (file
, _(" code address: 0x%08x\n"),
5828 (unsigned)bfd_getl32 (esdf
->code_address
));
5829 fprintf (file
, _(" psect index for entry point : %u\n"),
5830 (unsigned)bfd_getl32 (esdf
->ca_psindx
));
5832 fprintf (file
, _(" psect index : %u\n"),
5833 (unsigned)bfd_getl32 (esdf
->psindx
));
5834 fprintf (file
, _(" name : %.*s\n"),
5835 esdf
->namlng
, esdf
->name
);
5839 struct vms_esrf
*esrf
= (struct vms_esrf
*)e
;
5841 fprintf (file
, _("SYM - Global symbol reference\n"));
5842 fprintf (file
, _(" name : %.*s\n"),
5843 esrf
->namlng
, esrf
->name
);
5849 struct vms_eidc
*eidc
= (struct vms_eidc
*)e
;
5850 unsigned int flags
= bfd_getl32 (eidc
->flags
);
5853 fprintf (file
, _("IDC - Ident Consistency check\n"));
5854 fprintf (file
, _(" flags : 0x%08x"), flags
);
5855 if (flags
& EIDC__V_BINIDENT
)
5856 fputs (" BINDENT", file
);
5858 fprintf (file
, _(" id match : %x\n"),
5859 (flags
>> EIDC__V_IDMATCH_SH
) & EIDC__V_IDMATCH_MASK
);
5860 fprintf (file
, _(" error severity: %x\n"),
5861 (flags
>> EIDC__V_ERRSEV_SH
) & EIDC__V_ERRSEV_MASK
);
5863 fprintf (file
, _(" entity name : %.*s\n"), p
[0], p
+ 1);
5865 fprintf (file
, _(" object name : %.*s\n"), p
[0], p
+ 1);
5867 if (flags
& EIDC__V_BINIDENT
)
5868 fprintf (file
, _(" binary ident : 0x%08x\n"),
5869 (unsigned)bfd_getl32 (p
+ 1));
5871 fprintf (file
, _(" ascii ident : %.*s\n"), p
[0], p
+ 1);
5876 struct vms_egst
*egst
= (struct vms_egst
*)e
;
5877 unsigned int flags
= bfd_getl16 (egst
->header
.flags
);
5879 fprintf (file
, _("SYMG - Universal symbol definition\n"));
5880 fprintf (file
, _(" flags: 0x%04x"), flags
);
5881 exav_bfd_print_egsy_flags (flags
, file
);
5883 fprintf (file
, _(" symbol vector offset: 0x%08x\n"),
5884 (unsigned)bfd_getl32 (egst
->value
));
5885 fprintf (file
, _(" entry point: 0x%08x\n"),
5886 (unsigned)bfd_getl32 (egst
->lp_1
));
5887 fprintf (file
, _(" proc descr : 0x%08x\n"),
5888 (unsigned)bfd_getl32 (egst
->lp_2
));
5889 fprintf (file
, _(" psect index: %u\n"),
5890 (unsigned)bfd_getl32 (egst
->psindx
));
5891 fprintf (file
, _(" name : %.*s\n"),
5892 egst
->namlng
, egst
->name
);
5897 struct vms_esdfv
*esdfv
= (struct vms_esdfv
*)e
;
5898 unsigned int flags
= bfd_getl16 (esdfv
->flags
);
5900 fprintf (file
, _("SYMV - Vectored symbol definition\n"));
5901 fprintf (file
, _(" flags: 0x%04x"), flags
);
5902 exav_bfd_print_egsy_flags (flags
, file
);
5904 fprintf (file
, _(" vector : 0x%08x\n"),
5905 (unsigned)bfd_getl32 (esdfv
->vector
));
5906 fprintf (file
, _(" psect offset: %u\n"),
5907 (unsigned)bfd_getl32 (esdfv
->value
));
5908 fprintf (file
, _(" psect index : %u\n"),
5909 (unsigned)bfd_getl32 (esdfv
->psindx
));
5910 fprintf (file
, _(" name : %.*s\n"),
5911 esdfv
->namlng
, esdfv
->name
);
5916 struct vms_esdfm
*esdfm
= (struct vms_esdfm
*)e
;
5917 unsigned int flags
= bfd_getl16 (esdfm
->flags
);
5919 fprintf (file
, _("SYMM - Global symbol definition with version\n"));
5920 fprintf (file
, _(" flags: 0x%04x"), flags
);
5921 exav_bfd_print_egsy_flags (flags
, file
);
5923 fprintf (file
, _(" version mask: 0x%08x\n"),
5924 (unsigned)bfd_getl32 (esdfm
->version_mask
));
5925 fprintf (file
, _(" psect offset: %u\n"),
5926 (unsigned)bfd_getl32 (esdfm
->value
));
5927 fprintf (file
, _(" psect index : %u\n"),
5928 (unsigned)bfd_getl32 (esdfm
->psindx
));
5929 fprintf (file
, _(" name : %.*s\n"),
5930 esdfm
->namlng
, esdfm
->name
);
5934 fprintf (file
, _("unhandled egsd entry type %u\n"), type
);
5942 evax_bfd_print_hex (FILE *file
, const char *pfx
,
5943 const unsigned char *buf
, unsigned int len
)
5949 for (i
= 0; i
< len
; i
++)
5953 fprintf (file
, " %02x", buf
[i
]);
5966 evax_bfd_print_etir_stc_ir (FILE *file
, const unsigned char *buf
, int is_ps
)
5968 fprintf (file
, _(" linkage index: %u, replacement insn: 0x%08x\n"),
5969 (unsigned)bfd_getl32 (buf
),
5970 (unsigned)bfd_getl32 (buf
+ 16));
5971 fprintf (file
, _(" psect idx 1: %u, offset 1: 0x%08x %08x\n"),
5972 (unsigned)bfd_getl32 (buf
+ 4),
5973 (unsigned)bfd_getl32 (buf
+ 12),
5974 (unsigned)bfd_getl32 (buf
+ 8));
5975 fprintf (file
, _(" psect idx 2: %u, offset 2: 0x%08x %08x\n"),
5976 (unsigned)bfd_getl32 (buf
+ 20),
5977 (unsigned)bfd_getl32 (buf
+ 28),
5978 (unsigned)bfd_getl32 (buf
+ 24));
5980 fprintf (file
, _(" psect idx 3: %u, offset 3: 0x%08x %08x\n"),
5981 (unsigned)bfd_getl32 (buf
+ 32),
5982 (unsigned)bfd_getl32 (buf
+ 40),
5983 (unsigned)bfd_getl32 (buf
+ 36));
5985 fprintf (file
, _(" global name: %.*s\n"), buf
[32], buf
+ 33);
5989 evax_bfd_print_etir (FILE *file
, const char *name
,
5990 unsigned char *rec
, unsigned int rec_len
)
5992 unsigned int off
= sizeof (struct vms_egsd
);
5993 unsigned int sec_len
;
5995 fprintf (file
, _(" %s (len=%u+%u):\n"), name
,
5996 (unsigned)(rec_len
- sizeof (struct vms_eobjrec
)),
5997 (unsigned)sizeof (struct vms_eobjrec
));
5999 for (off
= sizeof (struct vms_eobjrec
); off
< rec_len
; )
6001 struct vms_etir
*etir
= (struct vms_etir
*)(rec
+ off
);
6006 type
= bfd_getl16 (etir
->rectyp
);
6007 size
= bfd_getl16 (etir
->size
);
6008 buf
= rec
+ off
+ sizeof (struct vms_etir
);
6010 fprintf (file
, _(" (type: %3u, size: 4+%3u): "), type
, size
- 4);
6013 case ETIR__C_STA_GBL
:
6014 fprintf (file
, _("STA_GBL (stack global) %.*s\n"),
6017 case ETIR__C_STA_LW
:
6018 fprintf (file
, _("STA_LW (stack longword) 0x%08x\n"),
6019 (unsigned)bfd_getl32 (buf
));
6021 case ETIR__C_STA_QW
:
6022 fprintf (file
, _("STA_QW (stack quadword) 0x%08x %08x\n"),
6023 (unsigned)bfd_getl32 (buf
+ 4),
6024 (unsigned)bfd_getl32 (buf
+ 0));
6026 case ETIR__C_STA_PQ
:
6027 fprintf (file
, _("STA_PQ (stack psect base + offset)\n"));
6028 fprintf (file
, _(" psect: %u, offset: 0x%08x %08x\n"),
6029 (unsigned)bfd_getl32 (buf
+ 0),
6030 (unsigned)bfd_getl32 (buf
+ 8),
6031 (unsigned)bfd_getl32 (buf
+ 4));
6033 case ETIR__C_STA_LI
:
6034 fprintf (file
, _("STA_LI (stack literal)\n"));
6036 case ETIR__C_STA_MOD
:
6037 fprintf (file
, _("STA_MOD (stack module)\n"));
6039 case ETIR__C_STA_CKARG
:
6040 fprintf (file
, _("STA_CKARG (compare procedure argument)\n"));
6044 fprintf (file
, _("STO_B (store byte)\n"));
6047 fprintf (file
, _("STO_W (store word)\n"));
6049 case ETIR__C_STO_LW
:
6050 fprintf (file
, _("STO_LW (store longword)\n"));
6052 case ETIR__C_STO_QW
:
6053 fprintf (file
, _("STO_QW (store quadword)\n"));
6055 case ETIR__C_STO_IMMR
:
6057 unsigned int len
= bfd_getl32 (buf
);
6059 _("STO_IMMR (store immediate repeat) %u bytes\n"),
6061 evax_bfd_print_hex (file
, " ", buf
+ 4, len
);
6065 case ETIR__C_STO_GBL
:
6066 fprintf (file
, _("STO_GBL (store global) %.*s\n"),
6069 case ETIR__C_STO_CA
:
6070 fprintf (file
, _("STO_CA (store code address) %.*s\n"),
6073 case ETIR__C_STO_RB
:
6074 fprintf (file
, _("STO_RB (store relative branch)\n"));
6076 case ETIR__C_STO_AB
:
6077 fprintf (file
, _("STO_AB (store absolute branch)\n"));
6079 case ETIR__C_STO_OFF
:
6080 fprintf (file
, _("STO_OFF (store offset to psect)\n"));
6082 case ETIR__C_STO_IMM
:
6084 unsigned int len
= bfd_getl32 (buf
);
6086 _("STO_IMM (store immediate) %u bytes\n"),
6088 evax_bfd_print_hex (file
, " ", buf
+ 4, len
);
6092 case ETIR__C_STO_LP_PSB
:
6093 fprintf (file
, _("STO_OFF (store LP with procedure signature)\n"));
6095 case ETIR__C_STO_HINT_GBL
:
6096 fprintf (file
, _("STO_BR_GBL (store branch global) *todo*\n"));
6098 case ETIR__C_STO_HINT_PS
:
6099 fprintf (file
, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6102 case ETIR__C_OPR_NOP
:
6103 fprintf (file
, _("OPR_NOP (no-operation)\n"));
6105 case ETIR__C_OPR_ADD
:
6106 fprintf (file
, _("OPR_ADD (add)\n"));
6108 case ETIR__C_OPR_SUB
:
6109 fprintf (file
, _("OPR_SUB (substract)\n"));
6111 case ETIR__C_OPR_MUL
:
6112 fprintf (file
, _("OPR_MUL (multiply)\n"));
6114 case ETIR__C_OPR_DIV
:
6115 fprintf (file
, _("OPR_DIV (divide)\n"));
6117 case ETIR__C_OPR_AND
:
6118 fprintf (file
, _("OPR_AND (logical and)\n"));
6120 case ETIR__C_OPR_IOR
:
6121 fprintf (file
, _("OPR_IOR (logical inclusive or)\n"));
6123 case ETIR__C_OPR_EOR
:
6124 fprintf (file
, _("OPR_EOR (logical exclusive or)\n"));
6126 case ETIR__C_OPR_NEG
:
6127 fprintf (file
, _("OPR_NEG (negate)\n"));
6129 case ETIR__C_OPR_COM
:
6130 fprintf (file
, _("OPR_COM (complement)\n"));
6132 case ETIR__C_OPR_INSV
:
6133 fprintf (file
, _("OPR_INSV (insert field)\n"));
6135 case ETIR__C_OPR_ASH
:
6136 fprintf (file
, _("OPR_ASH (arithmetic shift)\n"));
6138 case ETIR__C_OPR_USH
:
6139 fprintf (file
, _("OPR_USH (unsigned shift)\n"));
6141 case ETIR__C_OPR_ROT
:
6142 fprintf (file
, _("OPR_ROT (rotate)\n"));
6144 case ETIR__C_OPR_SEL
:
6145 fprintf (file
, _("OPR_SEL (select)\n"));
6147 case ETIR__C_OPR_REDEF
:
6148 fprintf (file
, _("OPR_REDEF (redefine symbol to curr location)\n"));
6150 case ETIR__C_OPR_DFLIT
:
6151 fprintf (file
, _("OPR_REDEF (define a literal)\n"));
6154 case ETIR__C_STC_LP
:
6155 fprintf (file
, _("STC_LP (store cond linkage pair)\n"));
6157 case ETIR__C_STC_LP_PSB
:
6159 _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6160 fprintf (file
, _(" linkage index: %u, procedure: %.*s\n"),
6161 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6162 buf
+= 4 + 1 + buf
[4];
6163 fprintf (file
, _(" signature: %.*s\n"), buf
[0], buf
+ 1);
6165 case ETIR__C_STC_GBL
:
6166 fprintf (file
, _("STC_GBL (store cond global)\n"));
6167 fprintf (file
, _(" linkage index: %u, global: %.*s\n"),
6168 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6170 case ETIR__C_STC_GCA
:
6171 fprintf (file
, _("STC_GCA (store cond code address)\n"));
6172 fprintf (file
, _(" linkage index: %u, procedure name: %.*s\n"),
6173 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6175 case ETIR__C_STC_PS
:
6176 fprintf (file
, _("STC_PS (store cond psect + offset)\n"));
6178 _(" linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6179 (unsigned)bfd_getl32 (buf
),
6180 (unsigned)bfd_getl32 (buf
+ 4),
6181 (unsigned)bfd_getl32 (buf
+ 12),
6182 (unsigned)bfd_getl32 (buf
+ 8));
6184 case ETIR__C_STC_NOP_GBL
:
6185 fprintf (file
, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6186 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6188 case ETIR__C_STC_NOP_PS
:
6189 fprintf (file
, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6190 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6192 case ETIR__C_STC_BSR_GBL
:
6193 fprintf (file
, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6194 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6196 case ETIR__C_STC_BSR_PS
:
6197 fprintf (file
, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6198 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6200 case ETIR__C_STC_LDA_GBL
:
6201 fprintf (file
, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6202 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6204 case ETIR__C_STC_LDA_PS
:
6205 fprintf (file
, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6206 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6208 case ETIR__C_STC_BOH_GBL
:
6209 fprintf (file
, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6210 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6212 case ETIR__C_STC_BOH_PS
:
6213 fprintf (file
, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6214 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6216 case ETIR__C_STC_NBH_GBL
:
6218 _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6220 case ETIR__C_STC_NBH_PS
:
6222 _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6225 case ETIR__C_CTL_SETRB
:
6226 fprintf (file
, _("CTL_SETRB (set relocation base)\n"));
6229 case ETIR__C_CTL_AUGRB
:
6231 unsigned int val
= bfd_getl32 (buf
);
6232 fprintf (file
, _("CTL_AUGRB (augment relocation base) %u\n"), val
);
6235 case ETIR__C_CTL_DFLOC
:
6236 fprintf (file
, _("CTL_DFLOC (define location)\n"));
6238 case ETIR__C_CTL_STLOC
:
6239 fprintf (file
, _("CTL_STLOC (set location)\n"));
6241 case ETIR__C_CTL_STKDL
:
6242 fprintf (file
, _("CTL_STKDL (stack defined location)\n"));
6245 fprintf (file
, _("*unhandled*\n"));
6253 evax_bfd_print_eobj (struct bfd
*abfd
, FILE *file
)
6255 bfd_boolean is_first
= TRUE
;
6256 bfd_boolean has_records
= FALSE
;
6260 unsigned int rec_len
;
6261 unsigned int pad_len
;
6263 unsigned int hdr_size
;
6268 unsigned char buf
[6];
6273 if (bfd_bread (buf
, sizeof (buf
), abfd
) != sizeof (buf
))
6275 fprintf (file
, _("cannot read GST record length\n"));
6278 rec_len
= bfd_getl16 (buf
+ 0);
6279 if (rec_len
== bfd_getl16 (buf
+ 4)
6280 && bfd_getl16 (buf
+ 2) == EOBJ__C_EMH
)
6282 /* The format is raw: record-size, type, record-size. */
6284 pad_len
= (rec_len
+ 1) & ~1U;
6287 else if (rec_len
== EOBJ__C_EMH
)
6289 has_records
= FALSE
;
6290 pad_len
= bfd_getl16 (buf
+ 2);
6296 fprintf (file
, _("cannot find EMH in first GST record\n"));
6299 rec
= bfd_malloc (pad_len
);
6300 memcpy (rec
, buf
+ sizeof (buf
) - hdr_size
, hdr_size
);
6304 unsigned int rec_len2
= 0;
6305 unsigned char hdr
[4];
6309 unsigned char buf_len
[2];
6311 if (bfd_bread (buf_len
, sizeof (buf_len
), abfd
)
6312 != sizeof (buf_len
))
6314 fprintf (file
, _("cannot read GST record length\n"));
6317 rec_len2
= (unsigned)bfd_getl16 (buf_len
);
6320 if (bfd_bread (hdr
, sizeof (hdr
), abfd
) != sizeof (hdr
))
6322 fprintf (file
, _("cannot read GST record header\n"));
6325 rec_len
= (unsigned)bfd_getl16 (hdr
+ 2);
6327 pad_len
= (rec_len
+ 1) & ~1U;
6330 rec
= bfd_malloc (pad_len
);
6331 memcpy (rec
, hdr
, sizeof (hdr
));
6332 hdr_size
= sizeof (hdr
);
6333 if (has_records
&& rec_len2
!= rec_len
)
6335 fprintf (file
, _(" corrupted GST\n"));
6340 if (bfd_bread (rec
+ hdr_size
, pad_len
- hdr_size
, abfd
)
6341 != pad_len
- hdr_size
)
6343 fprintf (file
, _("cannot read GST record\n"));
6347 type
= (unsigned)bfd_getl16 (rec
);
6352 evax_bfd_print_emh (file
, rec
, rec_len
);
6355 evax_bfd_print_egsd (file
, rec
, rec_len
);
6358 evax_bfd_print_eeom (file
, rec
, rec_len
);
6363 evax_bfd_print_etir (file
, "ETIR", rec
, rec_len
);
6366 evax_bfd_print_etir (file
, "EDBG", rec
, rec_len
);
6369 evax_bfd_print_etir (file
, "ETBT", rec
, rec_len
);
6372 fprintf (file
, _(" unhandled EOBJ record type %u\n"), type
);
6380 evax_bfd_print_relocation_records (FILE *file
, const unsigned char *rel
,
6381 unsigned int stride
)
6389 count
= bfd_getl32 (rel
+ 0);
6393 base
= bfd_getl32 (rel
+ 4);
6395 fprintf (file
, _(" bitcount: %u, base addr: 0x%08x\n"),
6399 for (j
= 0; count
> 0; j
+= 4, count
-= 32)
6405 val
= bfd_getl32 (rel
);
6408 fprintf (file
, _(" bitmap: 0x%08x (count: %u):\n"), val
, count
);
6410 for (k
= 0; k
< 32; k
++)
6415 fprintf (file
, _(" %08x"), base
+ (j
* 8 + k
) * stride
);
6430 evax_bfd_print_address_fixups (FILE *file
, const unsigned char *rel
)
6437 count
= bfd_getl32 (rel
+ 0);
6440 fprintf (file
, _(" image %u (%u entries)\n"),
6441 (unsigned)bfd_getl32 (rel
+ 4), count
);
6443 for (j
= 0; j
< count
; j
++)
6445 fprintf (file
, _(" offset: 0x%08x, val: 0x%08x\n"),
6446 (unsigned)bfd_getl32 (rel
+ 0),
6447 (unsigned)bfd_getl32 (rel
+ 4));
6454 evax_bfd_print_reference_fixups (FILE *file
, const unsigned char *rel
)
6463 count
= bfd_getl32 (rel
+ 0);
6466 fprintf (file
, _(" image %u (%u entries), offsets:\n"),
6467 (unsigned)bfd_getl32 (rel
+ 4), count
);
6469 for (j
= 0; j
< count
; j
++)
6473 fprintf (file
, _(" 0x%08x"), (unsigned)bfd_getl32 (rel
));
6488 evax_bfd_print_indent (int indent
, FILE *file
)
6490 for (; indent
; indent
--)
6495 evax_bfd_get_dsc_name (unsigned int v
)
6499 case DSC__K_DTYPE_Z
:
6500 return "Z (Unspecified)";
6501 case DSC__K_DTYPE_V
:
6503 case DSC__K_DTYPE_BU
:
6504 return "BU (Byte logical)";
6505 case DSC__K_DTYPE_WU
:
6506 return "WU (Word logical)";
6507 case DSC__K_DTYPE_LU
:
6508 return "LU (Longword logical)";
6509 case DSC__K_DTYPE_QU
:
6510 return "QU (Quadword logical)";
6511 case DSC__K_DTYPE_B
:
6512 return "B (Byte integer)";
6513 case DSC__K_DTYPE_W
:
6514 return "W (Word integer)";
6515 case DSC__K_DTYPE_L
:
6516 return "L (Longword integer)";
6517 case DSC__K_DTYPE_Q
:
6518 return "Q (Quadword integer)";
6519 case DSC__K_DTYPE_F
:
6520 return "F (Single-precision floating)";
6521 case DSC__K_DTYPE_D
:
6522 return "D (Double-precision floating)";
6523 case DSC__K_DTYPE_FC
:
6524 return "FC (Complex)";
6525 case DSC__K_DTYPE_DC
:
6526 return "DC (Double-precision Complex)";
6527 case DSC__K_DTYPE_T
:
6528 return "T (ASCII text string)";
6529 case DSC__K_DTYPE_NU
:
6530 return "NU (Numeric string, unsigned)";
6531 case DSC__K_DTYPE_NL
:
6532 return "NL (Numeric string, left separate sign)";
6533 case DSC__K_DTYPE_NLO
:
6534 return "NLO (Numeric string, left overpunched sign)";
6535 case DSC__K_DTYPE_NR
:
6536 return "NR (Numeric string, right separate sign)";
6537 case DSC__K_DTYPE_NRO
:
6538 return "NRO (Numeric string, right overpunched sig)";
6539 case DSC__K_DTYPE_NZ
:
6540 return "NZ (Numeric string, zoned sign)";
6541 case DSC__K_DTYPE_P
:
6542 return "P (Packed decimal string)";
6543 case DSC__K_DTYPE_ZI
:
6544 return "ZI (Sequence of instructions)";
6545 case DSC__K_DTYPE_ZEM
:
6546 return "ZEM (Procedure entry mask)";
6547 case DSC__K_DTYPE_DSC
:
6548 return "DSC (Descriptor, used for arrays of dyn strings)";
6549 case DSC__K_DTYPE_OU
:
6550 return "OU (Octaword logical)";
6551 case DSC__K_DTYPE_O
:
6552 return "O (Octaword integer)";
6553 case DSC__K_DTYPE_G
:
6554 return "G (Double precision G floating, 64 bit)";
6555 case DSC__K_DTYPE_H
:
6556 return "H (Quadruple precision floating, 128 bit)";
6557 case DSC__K_DTYPE_GC
:
6558 return "GC (Double precision complex, G floating)";
6559 case DSC__K_DTYPE_HC
:
6560 return "HC (Quadruple precision complex, H floating)";
6561 case DSC__K_DTYPE_CIT
:
6562 return "CIT (COBOL intermediate temporary)";
6563 case DSC__K_DTYPE_BPV
:
6564 return "BPV (Bound Procedure Value)";
6565 case DSC__K_DTYPE_BLV
:
6566 return "BLV (Bound Label Value)";
6567 case DSC__K_DTYPE_VU
:
6568 return "VU (Bit Unaligned)";
6569 case DSC__K_DTYPE_ADT
:
6570 return "ADT (Absolute Date-Time)";
6571 case DSC__K_DTYPE_VT
:
6572 return "VT (Varying Text)";
6573 case DSC__K_DTYPE_T2
:
6574 return "T2 (16-bit char)";
6575 case DSC__K_DTYPE_VT2
:
6576 return "VT2 (16-bit varying char)";
6578 return "?? (unknown)";
6583 evax_bfd_print_desc (const unsigned char *buf
, int indent
, FILE *file
)
6585 unsigned char bclass
= buf
[3];
6586 unsigned char dtype
= buf
[2];
6587 unsigned int len
= (unsigned)bfd_getl16 (buf
);
6588 unsigned int pointer
= (unsigned)bfd_getl32 (buf
+ 4);
6590 evax_bfd_print_indent (indent
, file
);
6592 if (len
== 1 && pointer
== 0xffffffffUL
)
6595 fprintf (file
, _("64 bits *unhandled*\n"));
6599 fprintf (file
, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
6600 bclass
, dtype
, len
, pointer
);
6603 case DSC__K_CLASS_NCA
:
6605 const struct vms_dsc_nca
*dsc
= (const void *)buf
;
6607 const unsigned char *b
;
6609 evax_bfd_print_indent (indent
, file
);
6610 fprintf (file
, _("non-contiguous array of %s\n"),
6611 evax_bfd_get_dsc_name (dsc
->dtype
));
6612 evax_bfd_print_indent (indent
+ 1, file
);
6614 _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
6615 dsc
->dimct
, dsc
->aflags
, dsc
->digits
, dsc
->scale
);
6616 evax_bfd_print_indent (indent
+ 1, file
);
6618 _("arsize: %u, a0: 0x%08x\n"),
6619 (unsigned)bfd_getl32 (dsc
->arsize
),
6620 (unsigned)bfd_getl32 (dsc
->a0
));
6621 evax_bfd_print_indent (indent
+ 1, file
);
6622 fprintf (file
, _("Strides:\n"));
6623 b
= buf
+ sizeof (*dsc
);
6624 for (i
= 0; i
< dsc
->dimct
; i
++)
6626 evax_bfd_print_indent (indent
+ 2, file
);
6627 fprintf (file
, _("[%u]: %u\n"), i
+ 1,
6628 (unsigned)bfd_getl32 (b
));
6631 evax_bfd_print_indent (indent
+ 1, file
);
6632 fprintf (file
, _("Bounds:\n"));
6633 b
= buf
+ sizeof (*dsc
);
6634 for (i
= 0; i
< dsc
->dimct
; i
++)
6636 evax_bfd_print_indent (indent
+ 2, file
);
6637 fprintf (file
, _("[%u]: Lower: %u, upper: %u\n"), i
+ 1,
6638 (unsigned)bfd_getl32 (b
+ 0),
6639 (unsigned)bfd_getl32 (b
+ 4));
6644 case DSC__K_CLASS_UBS
:
6646 const struct vms_dsc_ubs
*ubs
= (const void *)buf
;
6648 evax_bfd_print_indent (indent
, file
);
6649 fprintf (file
, _("unaligned bit-string of %s\n"),
6650 evax_bfd_get_dsc_name (ubs
->dtype
));
6651 evax_bfd_print_indent (indent
+ 1, file
);
6653 _("base: %u, pos: %u\n"),
6654 (unsigned)bfd_getl32 (ubs
->base
),
6655 (unsigned)bfd_getl32 (ubs
->pos
));
6659 fprintf (file
, _("*unhandled*\n"));
6666 evax_bfd_print_valspec (const unsigned char *buf
, int indent
, FILE *file
)
6668 unsigned int vflags
= buf
[0];
6669 unsigned int value
= (unsigned)bfd_getl32 (buf
+ 1);
6670 unsigned int len
= 5;
6672 evax_bfd_print_indent (indent
, file
);
6673 fprintf (file
, _("vflags: 0x%02x, value: 0x%08x "), vflags
, value
);
6678 case DST__K_VFLAGS_NOVAL
:
6679 fprintf (file
, _("(no value)\n"));
6681 case DST__K_VFLAGS_NOTACTIVE
:
6682 fprintf (file
, _("(not active)\n"));
6684 case DST__K_VFLAGS_UNALLOC
:
6685 fprintf (file
, _("(not allocated)\n"));
6687 case DST__K_VFLAGS_DSC
:
6688 fprintf (file
, _("(descriptor)\n"));
6689 evax_bfd_print_desc (buf
+ value
, indent
+ 1, file
);
6691 case DST__K_VFLAGS_TVS
:
6692 fprintf (file
, _("(trailing value)\n"));
6694 case DST__K_VS_FOLLOWS
:
6695 fprintf (file
, _("(value spec follows)\n"));
6697 case DST__K_VFLAGS_BITOFFS
:
6698 fprintf (file
, _("(at bit offset %u)\n"), value
);
6701 fprintf (file
, _("(reg: %u, disp: %u, indir: %u, kind: "),
6702 (vflags
& DST__K_REGNUM_MASK
) >> DST__K_REGNUM_SHIFT
,
6703 vflags
& DST__K_DISP
? 1 : 0,
6704 vflags
& DST__K_INDIR
? 1 : 0);
6705 switch (vflags
& DST__K_VALKIND_MASK
)
6707 case DST__K_VALKIND_LITERAL
:
6708 fputs (_("literal"), file
);
6710 case DST__K_VALKIND_ADDR
:
6711 fputs (_("address"), file
);
6713 case DST__K_VALKIND_DESC
:
6714 fputs (_("desc"), file
);
6716 case DST__K_VALKIND_REG
:
6717 fputs (_("reg"), file
);
6720 fputs (")\n", file
);
6727 evax_bfd_print_typspec (const unsigned char *buf
, int indent
, FILE *file
)
6729 unsigned char kind
= buf
[2];
6730 unsigned int len
= (unsigned)bfd_getl16 (buf
);
6732 evax_bfd_print_indent (indent
, file
);
6733 fprintf (file
, ("len: %2u, kind: %2u "), len
, kind
);
6737 case DST__K_TS_ATOM
:
6738 fprintf (file
, ("atomic, type=0x%02x %s\n"),
6739 buf
[0], evax_bfd_get_dsc_name (buf
[0]));
6742 fprintf (file
, ("indirect, defined at 0x%08x\n"),
6743 (unsigned)bfd_getl32 (buf
));
6745 case DST__K_TS_TPTR
:
6746 fprintf (file
, ("typed pointer\n"));
6747 evax_bfd_print_typspec (buf
, indent
+ 1, file
);
6750 fprintf (file
, ("pointer\n"));
6752 case DST__K_TS_ARRAY
:
6754 const unsigned char *vs
;
6755 unsigned int vec_len
;
6758 fprintf (file
, ("array, dim: %u, bitmap: "), buf
[0]);
6759 vec_len
= (buf
[0] + 1 + 7) / 8;
6760 for (i
= 0; i
< vec_len
; i
++)
6761 fprintf (file
, " %02x", buf
[i
+ 1]);
6763 vs
= buf
+ 1 + vec_len
;
6764 evax_bfd_print_indent (indent
, file
);
6765 fprintf (file
, ("array descriptor:\n"));
6766 vs
+= evax_bfd_print_valspec (vs
, indent
+ 1, file
);
6767 for (i
= 0; i
< buf
[0] + 1U; i
++)
6768 if (buf
[1 + i
/ 8] & (1 << (i
% 8)))
6770 evax_bfd_print_indent (indent
, file
);
6772 fprintf (file
, ("type spec for element:\n"));
6774 fprintf (file
, ("type spec for subscript %u:\n"), i
);
6775 evax_bfd_print_typspec (vs
, indent
+ 1, file
);
6776 vs
+= bfd_getl16 (vs
);
6781 fprintf (file
, ("*unhandled*\n"));
6786 evax_bfd_print_dst (struct bfd
*abfd
, unsigned int dst_size
, FILE *file
)
6788 unsigned int off
= 0;
6789 unsigned int pc
= 0;
6790 unsigned int line
= 0;
6792 fprintf (file
, _("Debug symbol table:\n"));
6794 while (dst_size
> 0)
6796 struct vms_dst_header dsth
;
6801 if (bfd_bread (&dsth
, sizeof (dsth
), abfd
) != sizeof (dsth
))
6803 fprintf (file
, _("cannot read DST header\n"));
6806 len
= bfd_getl16 (dsth
.length
);
6807 type
= bfd_getl16 (dsth
.type
);
6808 fprintf (file
, _(" type: %3u, len: %3u (at 0x%08x): "),
6818 len
-= sizeof (dsth
);
6819 buf
= bfd_malloc (len
);
6820 if (bfd_bread (buf
, len
, abfd
) != len
)
6822 fprintf (file
, _("cannot read DST symbol\n"));
6827 case DSC__K_DTYPE_V
:
6828 case DSC__K_DTYPE_BU
:
6829 case DSC__K_DTYPE_WU
:
6830 case DSC__K_DTYPE_LU
:
6831 case DSC__K_DTYPE_QU
:
6832 case DSC__K_DTYPE_B
:
6833 case DSC__K_DTYPE_W
:
6834 case DSC__K_DTYPE_L
:
6835 case DSC__K_DTYPE_Q
:
6836 case DSC__K_DTYPE_F
:
6837 case DSC__K_DTYPE_D
:
6838 case DSC__K_DTYPE_FC
:
6839 case DSC__K_DTYPE_DC
:
6840 case DSC__K_DTYPE_T
:
6841 case DSC__K_DTYPE_NU
:
6842 case DSC__K_DTYPE_NL
:
6843 case DSC__K_DTYPE_NLO
:
6844 case DSC__K_DTYPE_NR
:
6845 case DSC__K_DTYPE_NRO
:
6846 case DSC__K_DTYPE_NZ
:
6847 case DSC__K_DTYPE_P
:
6848 case DSC__K_DTYPE_ZI
:
6849 case DSC__K_DTYPE_ZEM
:
6850 case DSC__K_DTYPE_DSC
:
6851 case DSC__K_DTYPE_OU
:
6852 case DSC__K_DTYPE_O
:
6853 case DSC__K_DTYPE_G
:
6854 case DSC__K_DTYPE_H
:
6855 case DSC__K_DTYPE_GC
:
6856 case DSC__K_DTYPE_HC
:
6857 case DSC__K_DTYPE_CIT
:
6858 case DSC__K_DTYPE_BPV
:
6859 case DSC__K_DTYPE_BLV
:
6860 case DSC__K_DTYPE_VU
:
6861 case DSC__K_DTYPE_ADT
:
6862 case DSC__K_DTYPE_VT
:
6863 case DSC__K_DTYPE_T2
:
6864 case DSC__K_DTYPE_VT2
:
6865 fprintf (file
, _("standard data: %s\n"),
6866 evax_bfd_get_dsc_name (type
));
6867 evax_bfd_print_valspec (buf
, 4, file
);
6868 fprintf (file
, _(" name: %.*s\n"), buf
[5], buf
+ 6);
6872 struct vms_dst_modbeg
*dst
= (void *)buf
;
6873 const char *name
= (const char *)buf
+ sizeof (*dst
);
6875 fprintf (file
, _("modbeg\n"));
6876 fprintf (file
, _(" flags: %d, language: %u, "
6877 "major: %u, minor: %u\n"),
6879 (unsigned)bfd_getl32 (dst
->language
),
6880 (unsigned)bfd_getl16 (dst
->major
),
6881 (unsigned)bfd_getl16 (dst
->minor
));
6882 fprintf (file
, _(" module name: %.*s\n"),
6884 name
+= name
[0] + 1;
6885 fprintf (file
, _(" compiler : %.*s\n"),
6890 fprintf (file
, _("modend\n"));
6894 struct vms_dst_rtnbeg
*dst
= (void *)buf
;
6895 const char *name
= (const char *)buf
+ sizeof (*dst
);
6897 fputs (_("rtnbeg\n"), file
);
6898 fprintf (file
, _(" flags: %u, address: 0x%08x, "
6899 "pd-address: 0x%08x\n"),
6901 (unsigned)bfd_getl32 (dst
->address
),
6902 (unsigned)bfd_getl32 (dst
->pd_address
));
6903 fprintf (file
, _(" routine name: %.*s\n"),
6909 struct vms_dst_rtnend
*dst
= (void *)buf
;
6911 fprintf (file
, _("rtnend: size 0x%08x\n"),
6912 (unsigned)bfd_getl32 (dst
->size
));
6917 struct vms_dst_prolog
*dst
= (void *)buf
;
6919 fprintf (file
, _("prolog: bkpt address 0x%08x\n"),
6920 (unsigned)bfd_getl32 (dst
->bkpt_addr
));
6925 struct vms_dst_epilog
*dst
= (void *)buf
;
6927 fprintf (file
, _("epilog: flags: %u, count: %u\n"),
6928 dst
->flags
, (unsigned)bfd_getl32 (dst
->count
));
6933 struct vms_dst_blkbeg
*dst
= (void *)buf
;
6934 const char *name
= (const char *)buf
+ sizeof (*dst
);
6936 fprintf (file
, _("blkbeg: address: 0x%08x, name: %.*s\n"),
6937 (unsigned)bfd_getl32 (dst
->address
),
6943 struct vms_dst_blkend
*dst
= (void *)buf
;
6945 fprintf (file
, _("blkend: size: 0x%08x\n"),
6946 (unsigned)bfd_getl32 (dst
->size
));
6949 case DST__K_TYPSPEC
:
6951 fprintf (file
, _("typspec (len: %u)\n"), len
);
6952 fprintf (file
, _(" name: %.*s\n"), buf
[0], buf
+ 1);
6953 evax_bfd_print_typspec (buf
+ 1 + buf
[0], 5, file
);
6958 fprintf (file
, _("septyp, name: %.*s\n"), buf
[5], buf
+ 6);
6959 evax_bfd_print_valspec (buf
, 4, file
);
6964 struct vms_dst_recbeg
*recbeg
= (void *)buf
;
6965 const char *name
= (const char *)buf
+ sizeof (*recbeg
);
6967 fprintf (file
, _("recbeg: name: %.*s\n"), name
[0], name
+ 1);
6968 evax_bfd_print_valspec (buf
, 4, file
);
6969 fprintf (file
, (" len: %u bits\n"),
6970 (unsigned)bfd_getl32 (name
+ 1 + name
[0]));
6974 fprintf (file
, _("recend\n"));
6976 case DST__K_ENUMBEG
:
6977 fprintf (file
, _("enumbeg, len: %u, name: %.*s\n"),
6978 buf
[0], buf
[1], buf
+ 2);
6980 case DST__K_ENUMELT
:
6981 fprintf (file
, _("enumelt, name: %.*s\n"), buf
[5], buf
+ 6);
6982 evax_bfd_print_valspec (buf
, 4, file
);
6984 case DST__K_ENUMEND
:
6985 fprintf (file
, _("enumend\n"));
6989 struct vms_dst_label
*lab
= (void *)buf
;
6990 fprintf (file
, ("label, name: %.*s\n"),
6991 lab
->name
[0], lab
->name
+ 1);
6992 fprintf (file
, (" address: 0x%08x\n"),
6993 (unsigned)bfd_getl32 (lab
->value
));
6996 case DST__K_DIS_RANGE
:
6998 unsigned int cnt
= bfd_getl32 (buf
);
6999 unsigned char *rng
= buf
+ 4;
7002 fprintf (file
, _("discontiguous range (nbr: %u)\n"), cnt
);
7003 for (i
= 0; i
< cnt
; i
++, rng
+= 8)
7004 fprintf (file
, _(" address: 0x%08x, size: %u\n"),
7005 (unsigned)bfd_getl32 (rng
),
7006 (unsigned)bfd_getl32 (rng
+ 4));
7010 case DST__K_LINE_NUM
:
7012 unsigned char *buf_orig
= buf
;
7014 fprintf (file
, _("line num (len: %u)\n"), len
);
7019 unsigned char cmdlen
;
7029 case DST__K_DELTA_PC_W
:
7030 val
= bfd_getl16 (buf
+ 1);
7031 fprintf (file
, _("delta_pc_w %u\n"), val
);
7036 case DST__K_INCR_LINUM
:
7038 fprintf (file
, _("incr_linum(b): +%u\n"), val
);
7042 case DST__K_INCR_LINUM_W
:
7043 val
= bfd_getl16 (buf
+ 1);
7044 fprintf (file
, _("incr_linum_w: +%u\n"), val
);
7048 case DST__K_INCR_LINUM_L
:
7049 val
= bfd_getl32 (buf
+ 1);
7050 fprintf (file
, _("incr_linum_l: +%u\n"), val
);
7054 case DST__K_SET_LINUM
:
7055 line
= bfd_getl16 (buf
+ 1);
7056 fprintf (file
, _("set_line_num(w) %u\n"), line
);
7059 case DST__K_SET_LINUM_B
:
7061 fprintf (file
, _("set_line_num_b %u\n"), line
);
7064 case DST__K_SET_LINUM_L
:
7065 line
= bfd_getl32 (buf
+ 1);
7066 fprintf (file
, _("set_line_num_l %u\n"), line
);
7069 case DST__K_SET_ABS_PC
:
7070 pc
= bfd_getl32 (buf
+ 1);
7071 fprintf (file
, _("set_abs_pc: 0x%08x\n"), pc
);
7074 case DST__K_DELTA_PC_L
:
7075 fprintf (file
, _("delta_pc_l: +0x%08x\n"),
7076 (unsigned)bfd_getl32 (buf
+ 1));
7080 fprintf (file
, _("term(b): 0x%02x"), buf
[1]);
7082 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7086 val
= bfd_getl16 (buf
+ 1);
7087 fprintf (file
, _("term_w: 0x%04x"), val
);
7089 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7095 fprintf (file
, _("delta pc +%-4d"), -cmd
);
7096 line
++; /* FIXME: curr increment. */
7098 fprintf (file
, _(" pc: 0x%08x line: %5u\n"),
7103 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
7116 unsigned char *buf_orig
= buf
;
7118 fprintf (file
, _("source (len: %u)\n"), len
);
7122 signed char cmd
= buf
[0];
7123 unsigned char cmdlen
= 0;
7127 case DST__K_SRC_DECLFILE
:
7129 struct vms_dst_src_decl_src
*src
= (void *)(buf
+ 1);
7132 fprintf (file
, _(" declfile: len: %u, flags: %u, "
7134 src
->length
, src
->flags
,
7135 (unsigned)bfd_getl16 (src
->fileid
));
7136 fprintf (file
, _(" rms: cdt: 0x%08x %08x, "
7137 "ebk: 0x%08x, ffb: 0x%04x, "
7139 (unsigned)bfd_getl32 (src
->rms_cdt
+ 4),
7140 (unsigned)bfd_getl32 (src
->rms_cdt
+ 0),
7141 (unsigned)bfd_getl32 (src
->rms_ebk
),
7142 (unsigned)bfd_getl16 (src
->rms_ffb
),
7144 name
= (const char *)buf
+ 1 + sizeof (*src
);
7145 fprintf (file
, _(" filename : %.*s\n"),
7147 name
+= name
[0] + 1;
7148 fprintf (file
, _(" module name: %.*s\n"),
7150 cmdlen
= 2 + src
->length
;
7153 case DST__K_SRC_SETFILE
:
7154 fprintf (file
, _(" setfile %u\n"),
7155 (unsigned)bfd_getl16 (buf
+ 1));
7158 case DST__K_SRC_SETREC_W
:
7159 fprintf (file
, _(" setrec %u\n"),
7160 (unsigned)bfd_getl16 (buf
+ 1));
7163 case DST__K_SRC_SETREC_L
:
7164 fprintf (file
, _(" setrec %u\n"),
7165 (unsigned)bfd_getl32 (buf
+ 1));
7168 case DST__K_SRC_SETLNUM_W
:
7169 fprintf (file
, _(" setlnum %u\n"),
7170 (unsigned)bfd_getl16 (buf
+ 1));
7173 case DST__K_SRC_SETLNUM_L
:
7174 fprintf (file
, _(" setlnum %u\n"),
7175 (unsigned)bfd_getl32 (buf
+ 1));
7178 case DST__K_SRC_DEFLINES_W
:
7179 fprintf (file
, _(" deflines %u\n"),
7180 (unsigned)bfd_getl16 (buf
+ 1));
7183 case DST__K_SRC_DEFLINES_B
:
7184 fprintf (file
, _(" deflines %u\n"), buf
[1]);
7187 case DST__K_SRC_FORMFEED
:
7188 fprintf (file
, _(" formfeed\n"));
7192 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
7204 fprintf (file
, _("*unhandled* dst type %u\n"), type
);
7212 evax_bfd_print_image (bfd
*abfd
, FILE *file
)
7214 struct vms_eihd eihd
;
7217 unsigned int eiha_off
;
7218 unsigned int eihi_off
;
7219 unsigned int eihs_off
;
7220 unsigned int eisd_off
;
7221 unsigned int eihef_off
= 0;
7222 unsigned int eihnp_off
= 0;
7223 unsigned int dmt_vbn
= 0;
7224 unsigned int dmt_size
= 0;
7225 unsigned int dst_vbn
= 0;
7226 unsigned int dst_size
= 0;
7227 unsigned int gst_vbn
= 0;
7228 unsigned int gst_size
= 0;
7229 unsigned int eiaf_vbn
= 0;
7230 unsigned int eiaf_size
= 0;
7231 unsigned int eihvn_off
;
7233 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
)
7234 || bfd_bread (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
7236 fprintf (file
, _("cannot read EIHD\n"));
7239 fprintf (file
, _("EIHD: (size: %u, nbr blocks: %u)\n"),
7240 (unsigned)bfd_getl32 (eihd
.size
),
7241 (unsigned)bfd_getl32 (eihd
.hdrblkcnt
));
7242 fprintf (file
, _(" majorid: %u, minorid: %u\n"),
7243 (unsigned)bfd_getl32 (eihd
.majorid
),
7244 (unsigned)bfd_getl32 (eihd
.minorid
));
7246 val
= (unsigned)bfd_getl32 (eihd
.imgtype
);
7250 name
= _("executable");
7253 name
= _("linkable image");
7256 name
= _("unknown");
7259 fprintf (file
, _(" image type: %u (%s)"), val
, name
);
7261 val
= (unsigned)bfd_getl32 (eihd
.subtype
);
7264 case EIHD__C_NATIVE
:
7271 name
= _("unknown");
7274 fprintf (file
, _(", subtype: %u (%s)\n"), val
, name
);
7276 eisd_off
= bfd_getl32 (eihd
.isdoff
);
7277 eiha_off
= bfd_getl32 (eihd
.activoff
);
7278 eihi_off
= bfd_getl32 (eihd
.imgidoff
);
7279 eihs_off
= bfd_getl32 (eihd
.symdbgoff
);
7280 fprintf (file
, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
7281 "imgid: %u, patch: %u\n"),
7282 eisd_off
, eiha_off
, eihs_off
, eihi_off
,
7283 (unsigned)bfd_getl32 (eihd
.patchoff
));
7284 fprintf (file
, _(" fixup info rva: "));
7285 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.iafva
));
7286 fprintf (file
, _(", symbol vector rva: "));
7287 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.symvva
));
7288 eihvn_off
= bfd_getl32 (eihd
.version_array_off
);
7289 fprintf (file
, _("\n"
7290 " version array off: %u\n"),
7293 _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
7294 (unsigned)bfd_getl32 (eihd
.imgiocnt
),
7295 (unsigned)bfd_getl32 (eihd
.iochancnt
),
7296 (unsigned)bfd_getl32 (eihd
.privreqs
+ 4),
7297 (unsigned)bfd_getl32 (eihd
.privreqs
+ 0));
7298 val
= (unsigned)bfd_getl32 (eihd
.lnkflags
);
7299 fprintf (file
, _(" linker flags: %08x:"), val
);
7300 if (val
& EIHD__M_LNKDEBUG
)
7301 fprintf (file
, " LNKDEBUG");
7302 if (val
& EIHD__M_LNKNOTFR
)
7303 fprintf (file
, " LNKNOTFR");
7304 if (val
& EIHD__M_NOP0BUFS
)
7305 fprintf (file
, " NOP0BUFS");
7306 if (val
& EIHD__M_PICIMG
)
7307 fprintf (file
, " PICIMG");
7308 if (val
& EIHD__M_P0IMAGE
)
7309 fprintf (file
, " P0IMAGE");
7310 if (val
& EIHD__M_DBGDMT
)
7311 fprintf (file
, " DBGDMT");
7312 if (val
& EIHD__M_INISHR
)
7313 fprintf (file
, " INISHR");
7314 if (val
& EIHD__M_XLATED
)
7315 fprintf (file
, " XLATED");
7316 if (val
& EIHD__M_BIND_CODE_SEC
)
7317 fprintf (file
, " BIND_CODE_SEC");
7318 if (val
& EIHD__M_BIND_DATA_SEC
)
7319 fprintf (file
, " BIND_DATA_SEC");
7320 if (val
& EIHD__M_MKTHREADS
)
7321 fprintf (file
, " MKTHREADS");
7322 if (val
& EIHD__M_UPCALLS
)
7323 fprintf (file
, " UPCALLS");
7324 if (val
& EIHD__M_OMV_READY
)
7325 fprintf (file
, " OMV_READY");
7326 if (val
& EIHD__M_EXT_BIND_SECT
)
7327 fprintf (file
, " EXT_BIND_SECT");
7328 fprintf (file
, "\n");
7329 fprintf (file
, _(" ident: 0x%08x, sysver: 0x%08x, "
7330 "match ctrl: %u, symvect_size: %u\n"),
7331 (unsigned)bfd_getl32 (eihd
.ident
),
7332 (unsigned)bfd_getl32 (eihd
.sysver
),
7334 (unsigned)bfd_getl32 (eihd
.symvect_size
));
7335 fprintf (file
, _(" BPAGE: %u"),
7336 (unsigned)bfd_getl32 (eihd
.virt_mem_block_size
));
7337 if (val
& (EIHD__M_OMV_READY
| EIHD__M_EXT_BIND_SECT
))
7339 eihef_off
= bfd_getl32 (eihd
.ext_fixup_off
);
7340 eihnp_off
= bfd_getl32 (eihd
.noopt_psect_off
);
7341 fprintf (file
, _(", ext fixup offset: %u, no_opt psect off: %u"),
7342 eihef_off
, eihnp_off
);
7344 fprintf (file
, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd
.alias
));
7348 struct vms_eihvn eihvn
;
7352 fprintf (file
, _("system version array information:\n"));
7353 if (bfd_seek (abfd
, (file_ptr
) eihvn_off
, SEEK_SET
)
7354 || bfd_bread (&eihvn
, sizeof (eihvn
), abfd
) != sizeof (eihvn
))
7356 fprintf (file
, _("cannot read EIHVN header\n"));
7359 mask
= bfd_getl32 (eihvn
.subsystem_mask
);
7360 for (j
= 0; j
< 32; j
++)
7361 if (mask
& (1 << j
))
7363 struct vms_eihvn_subversion ver
;
7364 if (bfd_bread (&ver
, sizeof (ver
), abfd
) != sizeof (ver
))
7366 fprintf (file
, _("cannot read EIHVN version\n"));
7369 fprintf (file
, _(" %02u "), j
);
7372 case EIHVN__BASE_IMAGE_BIT
:
7373 fputs (_("BASE_IMAGE "), file
);
7375 case EIHVN__MEMORY_MANAGEMENT_BIT
:
7376 fputs (_("MEMORY_MANAGEMENT"), file
);
7379 fputs (_("IO "), file
);
7381 case EIHVN__FILES_VOLUMES_BIT
:
7382 fputs (_("FILES_VOLUMES "), file
);
7384 case EIHVN__PROCESS_SCHED_BIT
:
7385 fputs (_("PROCESS_SCHED "), file
);
7387 case EIHVN__SYSGEN_BIT
:
7388 fputs (_("SYSGEN "), file
);
7390 case EIHVN__CLUSTERS_LOCKMGR_BIT
:
7391 fputs (_("CLUSTERS_LOCKMGR "), file
);
7393 case EIHVN__LOGICAL_NAMES_BIT
:
7394 fputs (_("LOGICAL_NAMES "), file
);
7396 case EIHVN__SECURITY_BIT
:
7397 fputs (_("SECURITY "), file
);
7399 case EIHVN__IMAGE_ACTIVATOR_BIT
:
7400 fputs (_("IMAGE_ACTIVATOR "), file
);
7402 case EIHVN__NETWORKS_BIT
:
7403 fputs (_("NETWORKS "), file
);
7405 case EIHVN__COUNTERS_BIT
:
7406 fputs (_("COUNTERS "), file
);
7408 case EIHVN__STABLE_BIT
:
7409 fputs (_("STABLE "), file
);
7411 case EIHVN__MISC_BIT
:
7412 fputs (_("MISC "), file
);
7414 case EIHVN__CPU_BIT
:
7415 fputs (_("CPU "), file
);
7417 case EIHVN__VOLATILE_BIT
:
7418 fputs (_("VOLATILE "), file
);
7420 case EIHVN__SHELL_BIT
:
7421 fputs (_("SHELL "), file
);
7423 case EIHVN__POSIX_BIT
:
7424 fputs (_("POSIX "), file
);
7426 case EIHVN__MULTI_PROCESSING_BIT
:
7427 fputs (_("MULTI_PROCESSING "), file
);
7429 case EIHVN__GALAXY_BIT
:
7430 fputs (_("GALAXY "), file
);
7433 fputs (_("*unknown* "), file
);
7436 fprintf (file
, _(": %u.%u\n"),
7437 (unsigned)bfd_getl16 (ver
.major
),
7438 (unsigned)bfd_getl16 (ver
.minor
));
7444 struct vms_eiha eiha
;
7446 if (bfd_seek (abfd
, (file_ptr
) eiha_off
, SEEK_SET
)
7447 || bfd_bread (&eiha
, sizeof (eiha
), abfd
) != sizeof (eiha
))
7449 fprintf (file
, _("cannot read EIHA\n"));
7452 fprintf (file
, _("Image activation: (size=%u)\n"),
7453 (unsigned)bfd_getl32 (eiha
.size
));
7454 fprintf (file
, _(" First address : 0x%08x 0x%08x\n"),
7455 (unsigned)bfd_getl32 (eiha
.tfradr1_h
),
7456 (unsigned)bfd_getl32 (eiha
.tfradr1
));
7457 fprintf (file
, _(" Second address: 0x%08x 0x%08x\n"),
7458 (unsigned)bfd_getl32 (eiha
.tfradr2_h
),
7459 (unsigned)bfd_getl32 (eiha
.tfradr2
));
7460 fprintf (file
, _(" Third address : 0x%08x 0x%08x\n"),
7461 (unsigned)bfd_getl32 (eiha
.tfradr3_h
),
7462 (unsigned)bfd_getl32 (eiha
.tfradr3
));
7463 fprintf (file
, _(" Fourth address: 0x%08x 0x%08x\n"),
7464 (unsigned)bfd_getl32 (eiha
.tfradr4_h
),
7465 (unsigned)bfd_getl32 (eiha
.tfradr4
));
7466 fprintf (file
, _(" Shared image : 0x%08x 0x%08x\n"),
7467 (unsigned)bfd_getl32 (eiha
.inishr_h
),
7468 (unsigned)bfd_getl32 (eiha
.inishr
));
7472 struct vms_eihi eihi
;
7474 if (bfd_seek (abfd
, (file_ptr
) eihi_off
, SEEK_SET
)
7475 || bfd_bread (&eihi
, sizeof (eihi
), abfd
) != sizeof (eihi
))
7477 fprintf (file
, _("cannot read EIHI\n"));
7480 fprintf (file
, _("Image identification: (major: %u, minor: %u)\n"),
7481 (unsigned)bfd_getl32 (eihi
.majorid
),
7482 (unsigned)bfd_getl32 (eihi
.minorid
));
7483 fprintf (file
, _(" image name : %.*s\n"),
7484 eihi
.imgnam
[0], eihi
.imgnam
+ 1);
7485 fprintf (file
, _(" link time : %s\n"),
7486 vms_time_to_str (eihi
.linktime
));
7487 fprintf (file
, _(" image ident : %.*s\n"),
7488 eihi
.imgid
[0], eihi
.imgid
+ 1);
7489 fprintf (file
, _(" linker ident : %.*s\n"),
7490 eihi
.linkid
[0], eihi
.linkid
+ 1);
7491 fprintf (file
, _(" image build ident: %.*s\n"),
7492 eihi
.imgbid
[0], eihi
.imgbid
+ 1);
7496 struct vms_eihs eihs
;
7498 if (bfd_seek (abfd
, (file_ptr
) eihs_off
, SEEK_SET
)
7499 || bfd_bread (&eihs
, sizeof (eihs
), abfd
) != sizeof (eihs
))
7501 fprintf (file
, _("cannot read EIHS\n"));
7504 fprintf (file
, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
7505 (unsigned)bfd_getl32 (eihs
.majorid
),
7506 (unsigned)bfd_getl32 (eihs
.minorid
));
7507 dst_vbn
= bfd_getl32 (eihs
.dstvbn
);
7508 dst_size
= bfd_getl32 (eihs
.dstsize
);
7509 fprintf (file
, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
7510 dst_vbn
, dst_size
, dst_size
);
7511 gst_vbn
= bfd_getl32 (eihs
.gstvbn
);
7512 gst_size
= bfd_getl32 (eihs
.gstsize
);
7513 fprintf (file
, _(" global symbol table: vbn: %u, records: %u\n"),
7515 dmt_vbn
= bfd_getl32 (eihs
.dmtvbn
);
7516 dmt_size
= bfd_getl32 (eihs
.dmtsize
);
7517 fprintf (file
, _(" debug module table : vbn: %u, size: %u\n"),
7520 while (eisd_off
!= 0)
7522 struct vms_eisd eisd
;
7527 if (bfd_seek (abfd
, (file_ptr
) eisd_off
, SEEK_SET
)
7528 || bfd_bread (&eisd
, sizeof (eisd
), abfd
) != sizeof (eisd
))
7530 fprintf (file
, _("cannot read EISD\n"));
7533 len
= (unsigned)bfd_getl32 (eisd
.eisdsize
);
7534 if (len
!= (unsigned)-1)
7538 eisd_off
= (eisd_off
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
7540 fprintf (file
, _("Image section descriptor: (major: %u, minor: %u, "
7541 "size: %u, offset: %u)\n"),
7542 (unsigned)bfd_getl32 (eisd
.majorid
),
7543 (unsigned)bfd_getl32 (eisd
.minorid
),
7547 fprintf (file
, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
7548 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 4),
7549 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 0),
7550 (unsigned)bfd_getl32 (eisd
.secsize
));
7551 val
= (unsigned)bfd_getl32 (eisd
.flags
);
7552 fprintf (file
, _(" flags: 0x%04x"), val
);
7553 if (val
& EISD__M_GBL
)
7554 fprintf (file
, " GBL");
7555 if (val
& EISD__M_CRF
)
7556 fprintf (file
, " CRF");
7557 if (val
& EISD__M_DZRO
)
7558 fprintf (file
, " DZRO");
7559 if (val
& EISD__M_WRT
)
7560 fprintf (file
, " WRT");
7561 if (val
& EISD__M_INITALCODE
)
7562 fprintf (file
, " INITALCODE");
7563 if (val
& EISD__M_BASED
)
7564 fprintf (file
, " BASED");
7565 if (val
& EISD__M_FIXUPVEC
)
7566 fprintf (file
, " FIXUPVEC");
7567 if (val
& EISD__M_RESIDENT
)
7568 fprintf (file
, " RESIDENT");
7569 if (val
& EISD__M_VECTOR
)
7570 fprintf (file
, " VECTOR");
7571 if (val
& EISD__M_PROTECT
)
7572 fprintf (file
, " PROTECT");
7573 if (val
& EISD__M_LASTCLU
)
7574 fprintf (file
, " LASTCLU");
7575 if (val
& EISD__M_EXE
)
7576 fprintf (file
, " EXE");
7577 if (val
& EISD__M_NONSHRADR
)
7578 fprintf (file
, " NONSHRADR");
7579 if (val
& EISD__M_QUAD_LENGTH
)
7580 fprintf (file
, " QUAD_LENGTH");
7581 if (val
& EISD__M_ALLOC_64BIT
)
7582 fprintf (file
, " ALLOC_64BIT");
7583 fprintf (file
, "\n");
7584 if (val
& EISD__M_FIXUPVEC
)
7586 eiaf_vbn
= bfd_getl32 (eisd
.vbn
);
7587 eiaf_size
= bfd_getl32 (eisd
.secsize
);
7589 fprintf (file
, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
7590 (unsigned)bfd_getl32 (eisd
.vbn
),
7591 eisd
.pfc
, eisd
.matchctl
, eisd
.type
);
7594 case EISD__K_NORMAL
:
7595 fputs (_("NORMAL"), file
);
7597 case EISD__K_SHRFXD
:
7598 fputs (_("SHRFXD"), file
);
7600 case EISD__K_PRVFXD
:
7601 fputs (_("PRVFXD"), file
);
7603 case EISD__K_SHRPIC
:
7604 fputs (_("SHRPIC"), file
);
7606 case EISD__K_PRVPIC
:
7607 fputs (_("PRVPIC"), file
);
7609 case EISD__K_USRSTACK
:
7610 fputs (_("USRSTACK"), file
);
7613 fputs (_("*unknown*"), file
);
7616 fputs (_(")\n"), file
);
7617 if (val
& EISD__M_GBL
)
7618 fprintf (file
, _(" ident: 0x%08x, name: %.*s\n"),
7619 (unsigned)bfd_getl32 (eisd
.ident
),
7620 eisd
.gblnam
[0], eisd
.gblnam
+ 1);
7626 if (bfd_seek (abfd
, (file_ptr
) (dmt_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
7628 fprintf (file
, _("cannot read DMT\n"));
7632 fprintf (file
, _("Debug module table:\n"));
7634 while (dmt_size
> 0)
7636 struct vms_dmt_header dmth
;
7639 if (bfd_bread (&dmth
, sizeof (dmth
), abfd
) != sizeof (dmth
))
7641 fprintf (file
, _("cannot read DMT header\n"));
7644 count
= bfd_getl16 (dmth
.psect_count
);
7646 _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
7647 (unsigned)bfd_getl32 (dmth
.modbeg
),
7648 (unsigned)bfd_getl32 (dmth
.size
), count
);
7649 dmt_size
-= sizeof (dmth
);
7652 struct vms_dmt_psect dmtp
;
7654 if (bfd_bread (&dmtp
, sizeof (dmtp
), abfd
) != sizeof (dmtp
))
7656 fprintf (file
, _("cannot read DMT psect\n"));
7659 fprintf (file
, _(" psect start: 0x%08x, length: %u\n"),
7660 (unsigned)bfd_getl32 (dmtp
.start
),
7661 (unsigned)bfd_getl32 (dmtp
.length
));
7663 dmt_size
-= sizeof (dmtp
);
7670 if (bfd_seek (abfd
, (file_ptr
) (dst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
7672 fprintf (file
, _("cannot read DST\n"));
7676 evax_bfd_print_dst (abfd
, dst_size
, file
);
7680 if (bfd_seek (abfd
, (file_ptr
) (gst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
7682 fprintf (file
, _("cannot read GST\n"));
7686 fprintf (file
, _("Global symbol table:\n"));
7687 evax_bfd_print_eobj (abfd
, file
);
7692 struct vms_eiaf
*eiaf
;
7693 unsigned int qrelfixoff
;
7694 unsigned int lrelfixoff
;
7695 unsigned int qdotadroff
;
7696 unsigned int ldotadroff
;
7697 unsigned int shrimgcnt
;
7698 unsigned int shlstoff
;
7699 unsigned int codeadroff
;
7700 unsigned int lpfixoff
;
7701 unsigned int chgprtoff
;
7703 buf
= bfd_malloc (eiaf_size
);
7705 if (bfd_seek (abfd
, (file_ptr
) (eiaf_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
)
7706 || bfd_bread (buf
, eiaf_size
, abfd
) != eiaf_size
)
7708 fprintf (file
, _("cannot read EIHA\n"));
7712 eiaf
= (struct vms_eiaf
*)buf
;
7714 _("Image activator fixup: (major: %u, minor: %u)\n"),
7715 (unsigned)bfd_getl32 (eiaf
->majorid
),
7716 (unsigned)bfd_getl32 (eiaf
->minorid
));
7717 fprintf (file
, _(" iaflink : 0x%08x %08x\n"),
7718 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 0),
7719 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 4));
7720 fprintf (file
, _(" fixuplnk: 0x%08x %08x\n"),
7721 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 0),
7722 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 4));
7723 fprintf (file
, _(" size : %u\n"),
7724 (unsigned)bfd_getl32 (eiaf
->size
));
7725 fprintf (file
, _(" flags: 0x%08x\n"),
7726 (unsigned)bfd_getl32 (eiaf
->flags
));
7727 qrelfixoff
= bfd_getl32 (eiaf
->qrelfixoff
);
7728 lrelfixoff
= bfd_getl32 (eiaf
->lrelfixoff
);
7729 fprintf (file
, _(" qrelfixoff: %5u, lrelfixoff: %5u\n"),
7730 qrelfixoff
, lrelfixoff
);
7731 qdotadroff
= bfd_getl32 (eiaf
->qdotadroff
);
7732 ldotadroff
= bfd_getl32 (eiaf
->ldotadroff
);
7733 fprintf (file
, _(" qdotadroff: %5u, ldotadroff: %5u\n"),
7734 qdotadroff
, ldotadroff
);
7735 codeadroff
= bfd_getl32 (eiaf
->codeadroff
);
7736 lpfixoff
= bfd_getl32 (eiaf
->lpfixoff
);
7737 fprintf (file
, _(" codeadroff: %5u, lpfixoff : %5u\n"),
7738 codeadroff
, lpfixoff
);
7739 chgprtoff
= bfd_getl32 (eiaf
->chgprtoff
);
7740 fprintf (file
, _(" chgprtoff : %5u\n"), chgprtoff
);
7741 shrimgcnt
= bfd_getl32 (eiaf
->shrimgcnt
);
7742 shlstoff
= bfd_getl32 (eiaf
->shlstoff
);
7743 fprintf (file
, _(" shlstoff : %5u, shrimgcnt : %5u\n"),
7744 shlstoff
, shrimgcnt
);
7745 fprintf (file
, _(" shlextra : %5u, permctx : %5u\n"),
7746 (unsigned)bfd_getl32 (eiaf
->shlextra
),
7747 (unsigned)bfd_getl32 (eiaf
->permctx
));
7748 fprintf (file
, _(" base_va : 0x%08x\n"),
7749 (unsigned)bfd_getl32 (eiaf
->base_va
));
7750 fprintf (file
, _(" lppsbfixoff: %5u\n"),
7751 (unsigned)bfd_getl32 (eiaf
->lppsbfixoff
));
7755 struct vms_shl
*shl
= (struct vms_shl
*)(buf
+ shlstoff
);
7758 fprintf (file
, _(" Shareable images:\n"));
7759 for (j
= 0; j
< shrimgcnt
; j
++, shl
++)
7762 _(" %u: size: %u, flags: 0x%02x, name: %.*s\n"),
7763 j
, shl
->size
, shl
->flags
,
7764 shl
->imgnam
[0], shl
->imgnam
+ 1);
7767 if (qrelfixoff
!= 0)
7769 fprintf (file
, _(" quad-word relocation fixups:\n"));
7770 evax_bfd_print_relocation_records (file
, buf
+ qrelfixoff
, 8);
7772 if (lrelfixoff
!= 0)
7774 fprintf (file
, _(" long-word relocation fixups:\n"));
7775 evax_bfd_print_relocation_records (file
, buf
+ lrelfixoff
, 4);
7777 if (qdotadroff
!= 0)
7779 fprintf (file
, _(" quad-word .address reference fixups:\n"));
7780 evax_bfd_print_address_fixups (file
, buf
+ qdotadroff
);
7782 if (ldotadroff
!= 0)
7784 fprintf (file
, _(" long-word .address reference fixups:\n"));
7785 evax_bfd_print_address_fixups (file
, buf
+ ldotadroff
);
7787 if (codeadroff
!= 0)
7789 fprintf (file
, _(" Code Address Reference Fixups:\n"));
7790 evax_bfd_print_reference_fixups (file
, buf
+ codeadroff
);
7794 fprintf (file
, _(" Linkage Pairs Referece Fixups:\n"));
7795 evax_bfd_print_reference_fixups (file
, buf
+ lpfixoff
);
7799 unsigned int count
= (unsigned)bfd_getl32 (buf
+ chgprtoff
);
7800 struct vms_eicp
*eicp
= (struct vms_eicp
*)(buf
+ chgprtoff
+ 4);
7803 fprintf (file
, _(" Change Protection (%u entries):\n"), count
);
7804 for (j
= 0; j
< count
; j
++, eicp
++)
7806 unsigned int prot
= bfd_getl32 (eicp
->newprt
);
7808 _(" base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
7809 (unsigned)bfd_getl32 (eicp
->baseva
+ 4),
7810 (unsigned)bfd_getl32 (eicp
->baseva
+ 0),
7811 (unsigned)bfd_getl32 (eicp
->size
),
7812 (unsigned)bfd_getl32 (eicp
->newprt
));
7816 fprintf (file
, "NA");
7818 case PRT__C_RESERVED
:
7819 fprintf (file
, "RES");
7822 fprintf (file
, "KW");
7825 fprintf (file
, "KR");
7828 fprintf (file
, "UW");
7831 fprintf (file
, "EW");
7834 fprintf (file
, "ERKW");
7837 fprintf (file
, "ER");
7840 fprintf (file
, "SW");
7843 fprintf (file
, "SREW");
7846 fprintf (file
, "SRKW");
7849 fprintf (file
, "SR");
7852 fprintf (file
, "URSW");
7855 fprintf (file
, "UREW");
7858 fprintf (file
, "URKW");
7861 fprintf (file
, "UR");
7875 vms_bfd_print_private_bfd_data (bfd
*abfd
, void *ptr
)
7877 FILE *file
= (FILE *)ptr
;
7879 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
7880 evax_bfd_print_image (abfd
, file
);
7883 if (bfd_seek (abfd
, 0, SEEK_SET
))
7885 evax_bfd_print_eobj (abfd
, file
);
7892 /* Slurp ETIR/EDBG/ETBT VMS object records. */
7895 alpha_vms_read_sections_content (bfd
*abfd
, struct bfd_link_info
*info
)
7897 asection
*cur_section
;
7898 file_ptr cur_offset
;
7899 asection
*dst_section
;
7900 file_ptr dst_offset
;
7902 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
7908 dst_section
= PRIV (dst_section
);
7912 if (info
->strip
== strip_all
|| info
->strip
== strip_debugger
)
7914 /* Discard the DST section. */
7918 else if (dst_section
)
7920 dst_offset
= dst_section
->output_offset
;
7921 dst_section
= dst_section
->output_section
;
7930 type
= _bfd_vms_get_object_record (abfd
);
7933 vms_debug2 ((2, "next_record failed\n"));
7939 PRIV (image_section
) = cur_section
;
7940 PRIV (image_offset
) = cur_offset
;
7941 res
= _bfd_vms_slurp_etir (abfd
, info
);
7942 cur_section
= PRIV (image_section
);
7943 cur_offset
= PRIV (image_offset
);
7947 if (dst_section
== NULL
)
7949 PRIV (image_section
) = dst_section
;
7950 PRIV (image_offset
) = dst_offset
;
7951 res
= _bfd_vms_slurp_etir (abfd
, info
);
7952 dst_offset
= PRIV (image_offset
);
7961 vms_debug2 ((2, "slurp eobj type %d failed\n", type
));
7968 alpha_vms_sizeof_headers (bfd
*abfd ATTRIBUTE_UNUSED
,
7969 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
7974 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
7977 alpha_vms_add_fixup_lp (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
7979 struct alpha_vms_shlib_el
*sl
;
7980 asection
*sect
= PRIV2 (src
, image_section
);
7981 file_ptr offset
= PRIV2 (src
, image_offset
);
7983 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
7984 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
7985 sl
->has_fixups
= TRUE
;
7986 VEC_APPEND_EL (sl
->lp
, bfd_vma
,
7987 sect
->output_section
->vma
+ sect
->output_offset
+ offset
);
7991 alpha_vms_add_fixup_ca (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
7993 struct alpha_vms_shlib_el
*sl
;
7994 asection
*sect
= PRIV2 (src
, image_section
);
7995 file_ptr offset
= PRIV2 (src
, image_offset
);
7997 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
7998 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
7999 sl
->has_fixups
= TRUE
;
8000 VEC_APPEND_EL (sl
->ca
, bfd_vma
,
8001 sect
->output_section
->vma
+ sect
->output_offset
+ offset
);
8005 alpha_vms_add_fixup_qr (struct bfd_link_info
*info
, bfd
*src
,
8006 bfd
*shlib
, bfd_vma vec
)
8008 struct alpha_vms_shlib_el
*sl
;
8009 struct alpha_vms_vma_ref
*r
;
8010 asection
*sect
= PRIV2 (src
, image_section
);
8011 file_ptr offset
= PRIV2 (src
, image_offset
);
8013 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8014 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8015 sl
->has_fixups
= TRUE
;
8016 r
= VEC_APPEND (sl
->qr
, struct alpha_vms_vma_ref
);
8017 r
->vma
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
8022 alpha_vms_add_lw_fixup (struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
8023 unsigned int shr ATTRIBUTE_UNUSED
,
8024 bfd_vma vec ATTRIBUTE_UNUSED
)
8031 alpha_vms_add_qw_fixup (struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
8032 unsigned int shr ATTRIBUTE_UNUSED
,
8033 bfd_vma vec ATTRIBUTE_UNUSED
)
8040 alpha_vms_add_lw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8045 alpha_vms_add_qw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8049 static struct bfd_hash_entry
*
8050 alpha_vms_link_hash_newfunc (struct bfd_hash_entry
*entry
,
8051 struct bfd_hash_table
*table
,
8054 struct alpha_vms_link_hash_entry
*ret
=
8055 (struct alpha_vms_link_hash_entry
*) entry
;
8057 /* Allocate the structure if it has not already been allocated by a
8060 ret
= ((struct alpha_vms_link_hash_entry
*)
8061 bfd_hash_allocate (table
,
8062 sizeof (struct alpha_vms_link_hash_entry
)));
8066 /* Call the allocation method of the superclass. */
8067 ret
= ((struct alpha_vms_link_hash_entry
*)
8068 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
8073 return (struct bfd_hash_entry
*) ret
;
8076 /* Create an Alpha/VMS link hash table. */
8078 static struct bfd_link_hash_table
*
8079 alpha_vms_bfd_link_hash_table_create (bfd
*abfd
)
8081 struct alpha_vms_link_hash_table
*ret
;
8082 bfd_size_type amt
= sizeof (struct alpha_vms_link_hash_table
);
8084 ret
= (struct alpha_vms_link_hash_table
*) bfd_malloc (amt
);
8087 if (!_bfd_link_hash_table_init (&ret
->root
, abfd
,
8088 alpha_vms_link_hash_newfunc
,
8089 sizeof (struct alpha_vms_link_hash_entry
)))
8095 VEC_INIT (ret
->shrlibs
);
8102 alpha_vms_link_add_object_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8106 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
8108 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
8109 struct alpha_vms_link_hash_entry
*h
;
8110 struct bfd_link_hash_entry
*h_root
;
8113 if (!alpha_vms_convert_symbol (abfd
, e
, &sym
))
8116 if ((e
->flags
& EGSY__V_DEF
) && abfd
->selective_search
)
8118 /* In selective_search mode, only add definition that are
8120 h
= (struct alpha_vms_link_hash_entry
*)bfd_link_hash_lookup
8121 (info
->hash
, sym
.name
, FALSE
, FALSE
, FALSE
);
8122 if (h
== NULL
|| h
->root
.type
!= bfd_link_hash_undefined
)
8128 h_root
= (struct bfd_link_hash_entry
*) h
;
8129 if (_bfd_generic_link_add_one_symbol
8130 (info
, abfd
, sym
.name
, sym
.flags
, sym
.section
, sym
.value
,
8131 NULL
, FALSE
, FALSE
, &h_root
) == FALSE
)
8133 h
= (struct alpha_vms_link_hash_entry
*) h_root
;
8135 if ((e
->flags
& EGSY__V_DEF
)
8137 && abfd
->xvec
== info
->output_bfd
->xvec
)
8141 if (abfd
->flags
& DYNAMIC
)
8143 struct alpha_vms_shlib_el
*shlib
;
8145 /* We do not want to include any of the sections in a dynamic
8146 object in the output file. See comment in elflink.c. */
8147 bfd_section_list_clear (abfd
);
8149 shlib
= VEC_APPEND (alpha_vms_link_hash (info
)->shrlibs
,
8150 struct alpha_vms_shlib_el
);
8152 VEC_INIT (shlib
->ca
);
8153 VEC_INIT (shlib
->lp
);
8154 VEC_INIT (shlib
->qr
);
8155 PRIV (shr_index
) = VEC_COUNT (alpha_vms_link_hash (info
)->shrlibs
) - 1;
8162 alpha_vms_link_add_archive_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8165 struct bfd_link_hash_entry
**pundef
;
8166 struct bfd_link_hash_entry
**next_pundef
;
8168 /* We only accept VMS libraries. */
8169 if (info
->output_bfd
->xvec
!= abfd
->xvec
)
8171 bfd_set_error (bfd_error_wrong_format
);
8175 /* The archive_pass field in the archive itself is used to
8176 initialize PASS, since we may search the same archive multiple
8178 pass
= ++abfd
->archive_pass
;
8180 /* Look through the list of undefined symbols. */
8181 for (pundef
= &info
->hash
->undefs
; *pundef
!= NULL
; pundef
= next_pundef
)
8183 struct bfd_link_hash_entry
*h
;
8189 next_pundef
= &(*pundef
)->u
.undef
.next
;
8191 /* When a symbol is defined, it is not necessarily removed from
8193 if (h
->type
!= bfd_link_hash_undefined
8194 && h
->type
!= bfd_link_hash_common
)
8196 /* Remove this entry from the list, for general cleanliness
8197 and because we are going to look through the list again
8198 if we search any more libraries. We can't remove the
8199 entry if it is the tail, because that would lose any
8200 entries we add to the list later on. */
8201 if (*pundef
!= info
->hash
->undefs_tail
)
8203 *pundef
= *next_pundef
;
8204 next_pundef
= pundef
;
8209 /* Look for this symbol in the archive hash table. */
8210 symidx
= _bfd_vms_lib_find_symbol (abfd
, h
->root
.string
);
8211 if (symidx
== BFD_NO_MORE_SYMBOLS
)
8213 /* Nothing in this slot. */
8217 element
= bfd_get_elt_at_index (abfd
, symidx
);
8218 if (element
== NULL
)
8221 if (element
->archive_pass
== -1 || element
->archive_pass
== pass
)
8224 if (! bfd_check_format (element
, bfd_object
))
8226 element
->archive_pass
= -1;
8230 orig_element
= element
;
8231 if (bfd_is_thin_archive (abfd
))
8233 element
= _bfd_vms_lib_get_imagelib_file (element
);
8234 if (element
== NULL
|| !bfd_check_format (element
, bfd_object
))
8236 orig_element
->archive_pass
= -1;
8241 /* Unlike the generic linker, we know that this element provides
8242 a definition for an undefined symbol and we know that we want
8243 to include it. We don't need to check anything. */
8244 if (! (*info
->callbacks
->add_archive_element
) (info
, element
,
8247 if (! alpha_vms_link_add_object_symbols (element
, info
))
8250 orig_element
->archive_pass
= pass
;
8257 alpha_vms_bfd_link_add_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8259 switch (bfd_get_format (abfd
))
8262 vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
8264 return alpha_vms_link_add_object_symbols (abfd
, info
);
8267 vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
8269 return alpha_vms_link_add_archive_symbols (abfd
, info
);
8272 bfd_set_error (bfd_error_wrong_format
);
8278 alpha_vms_build_fixups (struct bfd_link_info
*info
)
8280 struct alpha_vms_link_hash_table
*t
= alpha_vms_link_hash (info
);
8281 unsigned char *content
;
8283 unsigned int sz
= 0;
8284 unsigned int lp_sz
= 0;
8285 unsigned int ca_sz
= 0;
8286 unsigned int qr_sz
= 0;
8287 unsigned int shrimg_cnt
= 0;
8288 struct vms_eiaf
*eiaf
;
8292 /* Shared libraries. */
8293 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8295 struct alpha_vms_shlib_el
*shlib
;
8297 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8299 if (!shlib
->has_fixups
)
8304 if (VEC_COUNT (shlib
->ca
) > 0)
8306 /* Header + entries. */
8308 ca_sz
+= VEC_COUNT (shlib
->ca
) * 4;
8310 if (VEC_COUNT (shlib
->lp
) > 0)
8312 /* Header + entries. */
8314 lp_sz
+= VEC_COUNT (shlib
->lp
) * 4;
8316 if (VEC_COUNT (shlib
->qr
) > 0)
8318 /* Header + entries. */
8320 qr_sz
+= VEC_COUNT (shlib
->qr
) * 8;
8331 /* Finish now if there is no content. */
8332 if (ca_sz
+ lp_sz
+ qr_sz
== 0)
8335 /* Allocate section content (round-up size) */
8336 sz
= sizeof (struct vms_eiaf
) + shrimg_cnt
* sizeof (struct vms_shl
)
8337 + ca_sz
+ lp_sz
+ qr_sz
;
8338 sz
= (sz
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
8339 content
= bfd_zalloc (info
->output_bfd
, sz
);
8340 if (content
== NULL
)
8343 sec
= alpha_vms_link_hash (info
)->fixup
;
8344 sec
->contents
= content
;
8347 eiaf
= (struct vms_eiaf
*)content
;
8348 off
= sizeof (struct vms_eiaf
);
8349 bfd_putl32 (0, eiaf
->majorid
);
8350 bfd_putl32 (0, eiaf
->minorid
);
8351 bfd_putl32 (0, eiaf
->iaflink
);
8352 bfd_putl32 (0, eiaf
->fixuplnk
);
8353 bfd_putl32 (sizeof (struct vms_eiaf
), eiaf
->size
);
8354 bfd_putl32 (0, eiaf
->flags
);
8355 bfd_putl32 (0, eiaf
->qrelfixoff
);
8356 bfd_putl32 (0, eiaf
->lrelfixoff
);
8357 bfd_putl32 (0, eiaf
->qdotadroff
);
8358 bfd_putl32 (0, eiaf
->ldotadroff
);
8359 bfd_putl32 (0, eiaf
->codeadroff
);
8360 bfd_putl32 (0, eiaf
->lpfixoff
);
8361 bfd_putl32 (0, eiaf
->chgprtoff
);
8362 bfd_putl32 (shrimg_cnt
? off
: 0, eiaf
->shlstoff
);
8363 bfd_putl32 (shrimg_cnt
, eiaf
->shrimgcnt
);
8364 bfd_putl32 (0, eiaf
->shlextra
);
8365 bfd_putl32 (0, eiaf
->permctx
);
8366 bfd_putl32 (0, eiaf
->base_va
);
8367 bfd_putl32 (0, eiaf
->lppsbfixoff
);
8374 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8376 struct alpha_vms_shlib_el
*shlib
;
8377 struct vms_shl
*shl
;
8379 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8381 if (!shlib
->has_fixups
)
8384 /* Renumber shared images. */
8385 PRIV2 (shlib
->abfd
, shr_index
) = shrimg_cnt
++;
8387 shl
= (struct vms_shl
*)(content
+ off
);
8388 bfd_putl32 (0, shl
->baseva
);
8389 bfd_putl32 (0, shl
->shlptr
);
8390 bfd_putl32 (0, shl
->ident
);
8391 bfd_putl32 (0, shl
->permctx
);
8392 shl
->size
= sizeof (struct vms_shl
);
8393 bfd_putl16 (0, shl
->fill_1
);
8395 bfd_putl32 (0, shl
->icb
);
8396 shl
->imgnam
[0] = strlen (PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
));
8397 memcpy (shl
->imgnam
+ 1, PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
),
8400 off
+= sizeof (struct vms_shl
);
8406 bfd_putl32 (off
, eiaf
->codeadroff
);
8408 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8410 struct alpha_vms_shlib_el
*shlib
;
8413 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8415 if (VEC_COUNT (shlib
->ca
) == 0)
8418 bfd_putl32 (VEC_COUNT (shlib
->ca
), content
+ off
);
8419 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8422 for (j
= 0; j
< VEC_COUNT (shlib
->ca
); j
++)
8424 bfd_putl32 (VEC_EL (shlib
->ca
, bfd_vma
, j
) - t
->base_addr
,
8430 bfd_putl32 (0, content
+ off
);
8431 bfd_putl32 (0, content
+ off
+ 4);
8438 bfd_putl32 (off
, eiaf
->lpfixoff
);
8440 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8442 struct alpha_vms_shlib_el
*shlib
;
8445 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8447 if (VEC_COUNT (shlib
->lp
) == 0)
8450 bfd_putl32 (VEC_COUNT (shlib
->lp
), content
+ off
);
8451 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8454 for (j
= 0; j
< VEC_COUNT (shlib
->lp
); j
++)
8456 bfd_putl32 (VEC_EL (shlib
->lp
, bfd_vma
, j
) - t
->base_addr
,
8462 bfd_putl32 (0, content
+ off
);
8463 bfd_putl32 (0, content
+ off
+ 4);
8470 bfd_putl32 (off
, eiaf
->qdotadroff
);
8472 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8474 struct alpha_vms_shlib_el
*shlib
;
8477 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8479 if (VEC_COUNT (shlib
->qr
) == 0)
8482 bfd_putl32 (VEC_COUNT (shlib
->qr
), content
+ off
);
8483 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8486 for (j
= 0; j
< VEC_COUNT (shlib
->qr
); j
++)
8488 struct alpha_vms_vma_ref
*r
;
8489 r
= &VEC_EL (shlib
->qr
, struct alpha_vms_vma_ref
, j
);
8490 bfd_putl32 (r
->vma
- t
->base_addr
, content
+ off
);
8491 bfd_putl32 (r
->ref
, content
+ off
+ 4);
8496 bfd_putl32 (0, content
+ off
);
8497 bfd_putl32 (0, content
+ off
+ 4);
8507 /* Called by bfd_link_hash_traverse to fill the symbol table.
8508 Return FALSE in case of failure. */
8511 alpha_vms_link_output_symbol (struct bfd_link_hash_entry
*hc
, void *infov
)
8513 struct bfd_link_info
*info
= (struct bfd_link_info
*)infov
;
8514 struct alpha_vms_link_hash_entry
*h
= (struct alpha_vms_link_hash_entry
*)hc
;
8515 struct vms_symbol_entry
*sym
;
8517 switch (h
->root
.type
)
8519 case bfd_link_hash_new
:
8520 case bfd_link_hash_undefined
:
8522 case bfd_link_hash_undefweak
:
8524 case bfd_link_hash_defined
:
8525 case bfd_link_hash_defweak
:
8527 asection
*sec
= h
->root
.u
.def
.section
;
8529 /* FIXME: this is certainly a symbol from a dynamic library. */
8530 if (bfd_is_abs_section (sec
))
8533 if (sec
->owner
->flags
& DYNAMIC
)
8537 case bfd_link_hash_common
:
8539 case bfd_link_hash_indirect
:
8540 case bfd_link_hash_warning
:
8544 /* Do not write not kept symbols. */
8545 if (info
->strip
== strip_some
8546 && bfd_hash_lookup (info
->keep_hash
, h
->root
.root
.string
,
8547 FALSE
, FALSE
) != NULL
)
8552 /* This symbol doesn't come from a VMS object. So we suppose it is
8554 int len
= strlen (h
->root
.root
.string
);
8556 sym
= (struct vms_symbol_entry
*)bfd_zalloc (info
->output_bfd
,
8557 sizeof (*sym
) + len
);
8561 memcpy (sym
->name
, h
->root
.root
.string
, len
);
8563 sym
->owner
= info
->output_bfd
;
8565 sym
->typ
= EGSD__C_SYMG
;
8567 sym
->flags
= EGSY__V_DEF
| EGSY__V_REL
;
8568 sym
->symbol_vector
= h
->root
.u
.def
.value
;
8569 sym
->section
= h
->root
.u
.def
.section
;
8570 sym
->value
= h
->root
.u
.def
.value
;
8575 if (!add_symbol_entry (info
->output_bfd
, sym
))
8582 alpha_vms_bfd_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
8585 struct bfd_link_order
*p
;
8593 bfd_get_outsymbols (abfd
) = NULL
;
8594 bfd_get_symcount (abfd
) = 0;
8596 /* Mark all sections which will be included in the output file. */
8597 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
8598 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
8599 if (p
->type
== bfd_indirect_link_order
)
8600 p
->u
.indirect
.section
->linker_mark
= TRUE
;
8603 /* Handle all the link order information for the sections. */
8604 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
8606 printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
8607 o
->name
, (unsigned)o
->vma
, (unsigned)o
->flags
);
8609 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
8611 printf (" at 0x%08x - 0x%08x: ",
8612 (unsigned)p
->offset
, (unsigned)(p
->offset
+ p
->size
- 1));
8615 case bfd_section_reloc_link_order
:
8616 case bfd_symbol_reloc_link_order
:
8617 printf (" section/symbol reloc\n");
8619 case bfd_indirect_link_order
:
8620 printf (" section %s of %s\n",
8621 p
->u
.indirect
.section
->name
,
8622 p
->u
.indirect
.section
->owner
->filename
);
8624 case bfd_data_link_order
:
8625 printf (" explicit data\n");
8628 printf (" *unknown* type %u\n", p
->type
);
8635 /* Generate the symbol table. */
8636 BFD_ASSERT (PRIV (syms
) == NULL
);
8637 if (info
->strip
!= strip_all
)
8638 bfd_link_hash_traverse (info
->hash
, alpha_vms_link_output_symbol
, info
);
8640 /* Find the entry point. */
8641 if (bfd_get_start_address (abfd
) == 0)
8643 bfd
*startbfd
= NULL
;
8645 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link_next
)
8647 /* Consider only VMS object files. */
8648 if (sub
->xvec
!= abfd
->xvec
)
8651 if (!PRIV2 (sub
, eom_data
).eom_has_transfer
)
8653 if ((PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
) && startbfd
)
8655 if (startbfd
!= NULL
8656 && !(PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
))
8658 (*info
->callbacks
->einfo
)
8659 (_("%P: multiple entry points: in modules %B and %B\n"),
8668 unsigned int ps_idx
= PRIV2 (startbfd
, eom_data
).eom_l_psindx
;
8669 bfd_vma tfradr
= PRIV2 (startbfd
, eom_data
).eom_l_tfradr
;
8672 sec
= PRIV2 (startbfd
, sections
)[ps_idx
];
8674 bfd_set_start_address
8675 (abfd
, sec
->output_section
->vma
+ sec
->output_offset
+ tfradr
);
8679 /* Set transfer addresses. */
8682 struct bfd_link_hash_entry
*h
;
8685 PRIV (transfer_address
[i
++]) = 0xffffffff00000340ULL
; /* SYS$IMGACT */
8686 h
= bfd_link_hash_lookup (info
->hash
, "LIB$INITIALIZE", FALSE
, FALSE
, TRUE
);
8687 if (h
!= NULL
&& h
->type
== bfd_link_hash_defined
)
8688 PRIV (transfer_address
[i
++]) =
8689 alpha_vms_get_sym_value (h
->u
.def
.section
, h
->u
.def
.value
);
8690 PRIV (transfer_address
[i
++]) = bfd_get_start_address (abfd
);
8692 PRIV (transfer_address
[i
++]) = 0;
8695 /* Allocate contents. */
8696 base_addr
= (bfd_vma
)-1;
8698 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
8700 if (o
->flags
& SEC_HAS_CONTENTS
)
8702 o
->contents
= bfd_alloc (abfd
, o
->size
);
8703 if (o
->contents
== NULL
)
8706 if (o
->flags
& SEC_LOAD
)
8708 if (o
->vma
< base_addr
)
8710 if (o
->vma
+ o
->size
> last_addr
)
8711 last_addr
= o
->vma
+ o
->size
;
8715 /* Create the fixup section. */
8716 fixupsec
= bfd_make_section_anyway_with_flags
8717 (info
->output_bfd
, "$FIXUP$",
8718 SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
8719 if (fixupsec
== NULL
)
8721 last_addr
= (last_addr
+ 0xffff) & ~0xffff;
8722 fixupsec
->vma
= last_addr
;
8724 alpha_vms_link_hash (info
)->fixup
= fixupsec
;
8725 alpha_vms_link_hash (info
)->base_addr
= base_addr
;
8727 /* Create the DMT section, if necessary. */
8728 BFD_ASSERT (PRIV (dst_section
) == NULL
);
8729 dst
= bfd_get_section_by_name (abfd
, "$DST$");
8730 if (dst
!= NULL
&& dst
->size
== 0)
8734 PRIV (dst_section
) = dst
;
8735 dmt
= bfd_make_section_anyway_with_flags
8736 (info
->output_bfd
, "$DMT$",
8737 SEC_DEBUGGING
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
8744 /* Read all sections from the inputs. */
8745 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link_next
)
8747 if (sub
->flags
& DYNAMIC
)
8749 alpha_vms_create_eisd_for_shared (abfd
, sub
);
8753 if (!alpha_vms_read_sections_content (sub
, info
))
8757 /* Handle all the link order information for the sections.
8758 Note: past this point, it is not possible to create new sections. */
8759 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
8761 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
8765 case bfd_section_reloc_link_order
:
8766 case bfd_symbol_reloc_link_order
:
8769 case bfd_indirect_link_order
:
8773 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
8780 /* Compute fixups. */
8781 if (!alpha_vms_build_fixups (info
))
8784 /* Compute the DMT. */
8788 unsigned char *contents
= NULL
;
8790 /* In pass 1, compute the size. In pass 2, write the DMT contents. */
8791 for (pass
= 0; pass
< 2; pass
++)
8793 unsigned int off
= 0;
8795 /* For each object file (ie for each module). */
8796 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link_next
)
8799 struct vms_dmt_header
*dmth
= NULL
;
8800 unsigned int psect_count
;
8802 /* Skip this module if it has no DST. */
8803 sub_dst
= PRIV2 (sub
, dst_section
);
8804 if (sub_dst
== NULL
|| sub_dst
->size
== 0)
8809 /* Write the header. */
8810 dmth
= (struct vms_dmt_header
*)(contents
+ off
);
8811 bfd_putl32 (sub_dst
->output_offset
, dmth
->modbeg
);
8812 bfd_putl32 (sub_dst
->size
, dmth
->size
);
8815 off
+= sizeof (struct vms_dmt_header
);
8818 /* For each section (ie for each psect). */
8819 for (o
= sub
->sections
; o
!= NULL
; o
= o
->next
)
8821 /* Only consider interesting sections. */
8822 if (!(o
->flags
& SEC_ALLOC
))
8824 if (o
->flags
& SEC_LINKER_CREATED
)
8829 /* Write an entry. */
8830 struct vms_dmt_psect
*dmtp
;
8832 dmtp
= (struct vms_dmt_psect
*)(contents
+ off
);
8833 bfd_putl32 (o
->output_offset
+ o
->output_section
->vma
,
8835 bfd_putl32 (o
->size
, dmtp
->length
);
8838 off
+= sizeof (struct vms_dmt_psect
);
8841 bfd_putl32 (psect_count
, dmth
->psect_count
);
8846 contents
= bfd_zalloc (info
->output_bfd
, off
);
8847 if (contents
== NULL
)
8849 dmt
->contents
= contents
;
8854 BFD_ASSERT (off
== dmt
->size
);
8862 /* Read the contents of a section.
8863 buf points to a buffer of buf_size bytes to be filled with
8864 section data (starting at offset into section) */
8867 alpha_vms_get_section_contents (bfd
*abfd
, asection
*section
,
8868 void *buf
, file_ptr offset
,
8869 bfd_size_type count
)
8873 /* Image are easy. */
8874 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
8875 return _bfd_generic_get_section_contents (abfd
, section
,
8876 buf
, offset
, count
);
8879 if (offset
+ count
< count
8880 || offset
+ count
> section
->size
)
8882 bfd_set_error (bfd_error_invalid_operation
);
8886 /* Alloc in memory and read ETIRs. */
8887 BFD_ASSERT (section
->contents
== NULL
);
8889 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
8891 BFD_ASSERT (sec
->contents
== NULL
);
8893 if (sec
->size
!= 0 && (sec
->flags
& SEC_HAS_CONTENTS
))
8895 sec
->contents
= bfd_alloc (abfd
, sec
->size
);
8896 if (sec
->contents
== NULL
)
8900 if (!alpha_vms_read_sections_content (abfd
, NULL
))
8902 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
8903 if (section
->contents
)
8904 section
->flags
|= SEC_IN_MEMORY
;
8905 memcpy (buf
, section
->contents
+ offset
, count
);
8910 /* Set the format of a file being written. */
8913 alpha_vms_mkobject (bfd
* abfd
)
8915 const bfd_arch_info_type
*arch
;
8917 vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd
));
8919 if (!vms_initialize (abfd
))
8922 PRIV (recwr
.buf
) = bfd_alloc (abfd
, MAX_OUTREC_SIZE
);
8923 if (PRIV (recwr
.buf
) == NULL
)
8926 arch
= bfd_scan_arch ("alpha");
8930 bfd_set_error (bfd_error_wrong_format
);
8934 abfd
->arch_info
= arch
;
8941 /* Called when the BFD is being closed to do any necessary cleanup. */
8944 vms_close_and_cleanup (bfd
* abfd
)
8946 vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd
));
8948 if (abfd
== NULL
|| abfd
->tdata
.any
== NULL
)
8951 if (abfd
->format
== bfd_archive
)
8953 bfd_release (abfd
, abfd
->tdata
.any
);
8954 abfd
->tdata
.any
= NULL
;
8958 if (PRIV (recrd
.buf
) != NULL
)
8959 free (PRIV (recrd
.buf
));
8961 if (PRIV (sections
) != NULL
)
8962 free (PRIV (sections
));
8964 bfd_release (abfd
, abfd
->tdata
.any
);
8965 abfd
->tdata
.any
= NULL
;
8968 if (abfd
->direction
== write_direction
)
8970 /* Last step on VMS is to convert the file to variable record length
8972 if (bfd_cache_close (abfd
) != TRUE
)
8974 if (_bfd_vms_convert_to_var_unix_filename (abfd
->filename
) != TRUE
)
8982 /* Called when a new section is created. */
8985 vms_new_section_hook (bfd
* abfd
, asection
*section
)
8989 vms_debug2 ((1, "vms_new_section_hook (%p, [%d]%s)\n",
8990 abfd
, section
->index
, section
->name
));
8992 bfd_set_section_alignment (abfd
, section
, 0);
8994 vms_debug2 ((7, "%d: %s\n", section
->index
, section
->name
));
8996 amt
= sizeof (struct vms_section_data_struct
);
8997 section
->used_by_bfd
= (PTR
) bfd_zalloc (abfd
, amt
);
8998 if (section
->used_by_bfd
== NULL
)
9001 /* Create the section symbol. */
9002 return _bfd_generic_new_section_hook (abfd
, section
);
9005 /* Part 4.5, symbols. */
9007 /* Print symbol to file according to how. how is one of
9008 bfd_print_symbol_name just print the name
9009 bfd_print_symbol_more print more (???)
9010 bfd_print_symbol_all print all we know, which is not much right now :-). */
9013 vms_print_symbol (bfd
* abfd
,
9016 bfd_print_symbol_type how
)
9018 vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
9019 abfd
, file
, symbol
, how
));
9023 case bfd_print_symbol_name
:
9024 case bfd_print_symbol_more
:
9025 fprintf ((FILE *)file
," %s", symbol
->name
);
9028 case bfd_print_symbol_all
:
9030 const char *section_name
= symbol
->section
->name
;
9032 bfd_print_symbol_vandf (abfd
, file
, symbol
);
9034 fprintf ((FILE *) file
," %-8s %s", section_name
, symbol
->name
);
9040 /* Return information about symbol in ret.
9042 fill type, value and name
9045 B bss segment symbol
9047 D data segment symbol
9049 t a static function symbol
9050 T text segment symbol
9055 vms_get_symbol_info (bfd
* abfd ATTRIBUTE_UNUSED
,
9061 vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd
, symbol
, ret
));
9063 sec
= symbol
->section
;
9070 else if (bfd_is_com_section (sec
))
9072 else if (bfd_is_abs_section (sec
))
9074 else if (bfd_is_und_section (sec
))
9076 else if (bfd_is_ind_section (sec
))
9078 else if ((symbol
->flags
& BSF_FUNCTION
)
9079 || (bfd_get_section_flags (abfd
, sec
) & SEC_CODE
))
9081 else if (bfd_get_section_flags (abfd
, sec
) & SEC_DATA
)
9083 else if (bfd_get_section_flags (abfd
, sec
) & SEC_ALLOC
)
9088 if (ret
->type
!= 'U')
9089 ret
->value
= symbol
->value
+ symbol
->section
->vma
;
9092 ret
->name
= symbol
->name
;
9095 /* Return TRUE if the given symbol sym in the BFD abfd is
9096 a compiler generated local label, else return FALSE. */
9099 vms_bfd_is_local_label_name (bfd
* abfd ATTRIBUTE_UNUSED
,
9102 vms_debug2 ((1, "vms_bfd_is_local_label_name (%p, %s)\n", abfd
, name
));
9103 return name
[0] == '$';
9106 /* Part 4.7, writing an object file. */
9108 /* Sets the contents of the section section in BFD abfd to the data starting
9109 in memory at LOCATION. The data is written to the output section starting
9110 at offset offset for count bytes.
9112 Normally TRUE is returned, else FALSE. Possible error returns are:
9113 o bfd_error_no_contents - The output section does not have the
9114 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
9115 o and some more too */
9118 _bfd_vms_set_section_contents (bfd
* abfd
,
9120 const void * location
,
9122 bfd_size_type count
)
9124 if (section
->contents
== NULL
)
9126 section
->contents
= bfd_alloc (abfd
, section
->size
);
9127 if (section
->contents
== NULL
)
9130 memcpy (section
->contents
+ offset
, location
, (size_t) count
);
9136 /* Set the architecture and machine type in BFD abfd to arch and mach.
9137 Find the correct pointer to a structure and insert it into the arch_info
9141 alpha_vms_set_arch_mach (bfd
*abfd
,
9142 enum bfd_architecture arch
, unsigned long mach
)
9144 if (arch
!= bfd_arch_alpha
9145 && arch
!= bfd_arch_unknown
)
9148 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
9151 /* Set section VMS flags. Clear NO_FLAGS and set FLAGS. */
9154 bfd_vms_set_section_flags (bfd
*abfd ATTRIBUTE_UNUSED
,
9155 asection
*sec
, flagword no_flags
, flagword flags
)
9157 vms_section_data (sec
)->no_flags
= no_flags
;
9158 vms_section_data (sec
)->flags
= flags
;
9161 struct vms_private_data_struct
*
9162 bfd_vms_get_data (bfd
*abfd
)
9164 return (struct vms_private_data_struct
*)abfd
->tdata
.any
;
9167 #define vms_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9168 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms
9169 #define vms_bfd_copy_link_hash_symbol_type \
9170 _bfd_generic_copy_link_hash_symbol_type
9171 #define vms_bfd_is_group_section bfd_generic_is_group_section
9172 #define vms_bfd_discard_group bfd_generic_discard_group
9173 #define vms_section_already_linked _bfd_generic_section_already_linked
9174 #define vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9175 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
9177 #define vms_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
9178 #define vms_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
9179 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
9180 #define vms_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
9181 #define vms_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
9182 #define vms_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
9184 /* Symbols table. */
9185 #define alpha_vms_make_empty_symbol _bfd_generic_make_empty_symbol
9186 #define alpha_vms_bfd_is_target_special_symbol \
9187 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9188 #define alpha_vms_print_symbol vms_print_symbol
9189 #define alpha_vms_get_symbol_info vms_get_symbol_info
9190 #define alpha_vms_read_minisymbols _bfd_generic_read_minisymbols
9191 #define alpha_vms_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
9192 #define alpha_vms_get_lineno _bfd_nosymbols_get_lineno
9193 #define alpha_vms_find_inliner_info _bfd_nosymbols_find_inliner_info
9194 #define alpha_vms_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
9195 #define alpha_vms_find_nearest_line _bfd_vms_find_nearest_dst_line
9196 #define alpha_vms_bfd_is_local_label_name vms_bfd_is_local_label_name
9198 /* Generic table. */
9199 #define alpha_vms_close_and_cleanup vms_close_and_cleanup
9200 #define alpha_vms_bfd_free_cached_info vms_bfd_free_cached_info
9201 #define alpha_vms_new_section_hook vms_new_section_hook
9202 #define alpha_vms_set_section_contents _bfd_vms_set_section_contents
9203 #define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
9205 #define alpha_vms_bfd_get_relocated_section_contents \
9206 bfd_generic_get_relocated_section_contents
9208 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
9209 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
9210 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
9211 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
9212 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
9213 #define alpha_vms_section_already_linked \
9214 _bfd_generic_section_already_linked
9216 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9217 #define alpha_vms_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
9218 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
9219 #define alpha_vms_bfd_copy_link_hash_symbol_type \
9220 _bfd_generic_copy_link_hash_symbol_type
9222 #define alpha_vms_bfd_link_split_section _bfd_generic_link_split_section
9224 #define alpha_vms_get_dynamic_symtab_upper_bound \
9225 _bfd_nodynamic_get_dynamic_symtab_upper_bound
9226 #define alpha_vms_canonicalize_dynamic_symtab \
9227 _bfd_nodynamic_canonicalize_dynamic_symtab
9228 #define alpha_vms_get_dynamic_reloc_upper_bound \
9229 _bfd_nodynamic_get_dynamic_reloc_upper_bound
9230 #define alpha_vms_canonicalize_dynamic_reloc \
9231 _bfd_nodynamic_canonicalize_dynamic_reloc
9233 const bfd_target vms_alpha_vec
=
9235 "vms-alpha", /* Name. */
9236 bfd_target_evax_flavour
,
9237 BFD_ENDIAN_LITTLE
, /* Data byte order is little. */
9238 BFD_ENDIAN_LITTLE
, /* Header byte order is little. */
9240 (HAS_RELOC
| EXEC_P
| HAS_LINENO
| HAS_DEBUG
| HAS_SYMS
| HAS_LOCALS
9241 | WP_TEXT
| D_PAGED
), /* Object flags. */
9242 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
9243 | SEC_READONLY
| SEC_CODE
| SEC_DATA
9244 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* Sect flags. */
9245 0, /* symbol_leading_char. */
9246 ' ', /* ar_pad_char. */
9247 15, /* ar_max_namelen. */
9248 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
9249 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
9250 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
9251 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
9252 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
9253 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
9255 {_bfd_dummy_target
, alpha_vms_object_p
, /* bfd_check_format. */
9256 _bfd_vms_lib_alpha_archive_p
, _bfd_dummy_target
},
9257 {bfd_false
, alpha_vms_mkobject
, /* bfd_set_format. */
9258 _bfd_vms_lib_alpha_mkarchive
, bfd_false
},
9259 {bfd_false
, alpha_vms_write_object_contents
, /* bfd_write_contents. */
9260 _bfd_vms_lib_write_archive_contents
, bfd_false
},
9262 BFD_JUMP_TABLE_GENERIC (alpha_vms
),
9263 BFD_JUMP_TABLE_COPY (vms
),
9264 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
9265 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib
),
9266 BFD_JUMP_TABLE_SYMBOLS (alpha_vms
),
9267 BFD_JUMP_TABLE_RELOCS (alpha_vms
),
9268 BFD_JUMP_TABLE_WRITE (alpha_vms
),
9269 BFD_JUMP_TABLE_LINK (alpha_vms
),
9270 BFD_JUMP_TABLE_DYNAMIC (alpha_vms
),