1 /* vms.c -- BFD back-end for EVAX (openVMS/Alpha) files.
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5 Initial version written by Klaus Kaempf (kkaempf@rmi.de)
6 Major rewrite by Adacore.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
26 o Generation of shared image
27 o Generation of GST in image
28 o Relocation optimizations
50 #include "vms/eihvn.h"
51 #include "vms/eobjrec.h"
54 #include "vms/esgps.h"
63 #include "vms/esdfm.h"
64 #include "vms/esdfv.h"
70 #include "vms/internal.h"
73 #define MIN(a,b) ((a) < (b) ? (a) : (b))
75 /* The r_type field in a reloc is one of the following values. */
76 #define ALPHA_R_IGNORE 0
77 #define ALPHA_R_REFQUAD 1
78 #define ALPHA_R_BRADDR 2
79 #define ALPHA_R_HINT 3
80 #define ALPHA_R_SREL16 4
81 #define ALPHA_R_SREL32 5
82 #define ALPHA_R_SREL64 6
83 #define ALPHA_R_OP_PUSH 7
84 #define ALPHA_R_OP_STORE 8
85 #define ALPHA_R_OP_PSUB 9
86 #define ALPHA_R_OP_PRSHIFT 10
87 #define ALPHA_R_LINKAGE 11
88 #define ALPHA_R_REFLONG 12
89 #define ALPHA_R_CODEADDR 13
90 #define ALPHA_R_NOP 14
91 #define ALPHA_R_BSR 15
92 #define ALPHA_R_LDA 16
93 #define ALPHA_R_BOH 17
95 /* These are used with DST_S_C_LINE_NUM. */
96 #define DST_S_C_LINE_NUM_HEADER_SIZE 4
98 /* These are used with DST_S_C_SOURCE */
100 #define DST_S_B_PCLINE_UNSBYTE 1
101 #define DST_S_W_PCLINE_UNSWORD 1
102 #define DST_S_L_PCLINE_UNSLONG 1
104 #define DST_S_B_MODBEG_NAME 14
105 #define DST_S_L_RTNBEG_ADDRESS 5
106 #define DST_S_B_RTNBEG_NAME 13
107 #define DST_S_L_RTNEND_SIZE 5
109 /* These are used with DST_S_C_SOURCE. */
110 #define DST_S_C_SOURCE_HEADER_SIZE 4
112 #define DST_S_B_SRC_DF_LENGTH 1
113 #define DST_S_W_SRC_DF_FILEID 3
114 #define DST_S_B_SRC_DF_FILENAME 20
115 #define DST_S_B_SRC_UNSBYTE 1
116 #define DST_S_W_SRC_UNSWORD 1
117 #define DST_S_L_SRC_UNSLONG 1
119 /* Debugger symbol definitions. */
121 #define DBG_S_L_DMT_MODBEG 0
122 #define DBG_S_L_DST_SIZE 4
123 #define DBG_S_W_DMT_PSECT_COUNT 8
124 #define DBG_S_C_DMT_HEADER_SIZE 12
126 #define DBG_S_L_DMT_PSECT_START 0
127 #define DBG_S_L_DMT_PSECT_LENGTH 4
128 #define DBG_S_C_DMT_PSECT_SIZE 8
130 /* VMS module header. */
146 #define EMH_DATE_LENGTH 17
148 /* VMS End-Of-Module records (EOM/EEOM). */
152 unsigned int eom_l_total_lps
;
153 unsigned short eom_w_comcod
;
154 bfd_boolean eom_has_transfer
;
155 unsigned char eom_b_tfrflg
;
156 unsigned int eom_l_psindx
;
157 unsigned int eom_l_tfradr
;
160 struct vms_symbol_entry
166 unsigned char data_type
;
167 unsigned short flags
;
169 /* Section and offset/value of the symbol. */
170 unsigned int section
;
173 /* Section and offset/value for the entry point (only for subprg). */
174 unsigned int code_section
;
175 unsigned int code_value
;
177 /* Symbol vector offset. */
178 unsigned int symbol_vector
;
180 /* Length of the name. */
181 unsigned char namelen
;
186 /* Stack value for push/pop commands. */
194 #define STACKSIZE 128
196 /* A minimal decoding of DST compilation units. We only decode
197 what's needed to get to the line number information. */
207 struct srecinfo
*next
;
215 struct lineinfo
*next
;
222 struct funcinfo
*next
;
230 /* Chain the previously read compilation unit. */
233 /* The module name. */
236 /* The start offset and size of debug info in the DST section. */
240 /* The lowest and highest addresses contained in this compilation
241 unit as specified in the compilation unit header. */
245 /* The listing line table. */
246 struct lineinfo
*line_table
;
248 /* The source record table. */
249 struct srecinfo
*srec_table
;
251 /* A list of the functions found in this module. */
252 struct funcinfo
*func_table
;
254 /* Current allocation of file_table. */
255 unsigned int file_table_count
;
257 /* An array of the files making up this module. */
258 struct fileinfo
*file_table
;
261 /* BFD private data for alpha-vms. */
263 struct vms_private_data_struct
265 /* If true, relocs have been read. */
266 bfd_boolean reloc_done
;
268 /* Record input buffer. */
269 struct vms_rec_rd recrd
;
270 struct vms_rec_wr recwr
;
272 struct hdr_struct hdr_data
; /* data from HDR/EMH record */
273 struct eom_struct eom_data
; /* data from EOM/EEOM record */
275 /* Array of GSD sections to get the correspond BFD one. */
276 unsigned int section_max
; /* Size of the sections array. */
277 unsigned int section_count
; /* Number of GSD sections. */
280 /* Array of raw symbols. */
281 struct vms_symbol_entry
**syms
;
283 /* Canonicalized symbols. */
286 /* Number of symbols. */
287 unsigned int gsd_sym_count
;
288 /* Size of the syms array. */
289 unsigned int max_sym_count
;
290 /* Number of procedure symbols. */
291 unsigned int norm_sym_count
;
293 /* Stack used to evaluate TIR/ETIR commands. */
294 struct stack_struct
*stack
;
297 /* Content reading. */
298 asection
*image_section
; /* section for image_ptr */
299 file_ptr image_offset
; /* Offset for image_ptr. */
301 struct module
*modules
; /* list of all compilation units */
303 struct dst_info
*dst_info
;
304 asection
*dst_section
;
306 unsigned int dst_ptr_offsets_count
; /* # of offsets in following array */
307 unsigned int *dst_ptr_offsets
; /* array of saved image_ptr offsets */
309 /* Shared library support */
310 bfd_vma symvva
; /* relative virtual address of symbol vector */
312 unsigned char matchctl
;
314 /* Shared library index. This is used for input bfd while linking. */
315 unsigned int shr_index
;
317 /* Used to place structures in the file. */
320 /* Simply linked list of eisd. */
321 struct vms_internal_eisd_map
*eisd_head
;
322 struct vms_internal_eisd_map
*eisd_tail
;
324 /* Simply linked list of eisd for shared libraries. */
325 struct vms_internal_eisd_map
*gbl_eisd_head
;
326 struct vms_internal_eisd_map
*gbl_eisd_tail
;
328 /* linkage index counter used by conditional store commands */
329 int vms_linkage_index
;
331 /* see tc-alpha.c of gas for a description. */
332 int flag_hash_long_names
; /* -+, hash instead of truncate */
333 int flag_show_after_trunc
; /* -H, show hashing/truncation */
336 #define PRIV2(abfd, name) \
337 (((struct vms_private_data_struct *)(abfd)->tdata.any)->name)
338 #define PRIV(name) PRIV2(abfd,name)
341 /* Used to keep extra VMS specific information for a given section.
343 reloc_size holds the size of the relocation stream, note this
344 is very different from the number of relocations as VMS relocations
347 reloc_stream is the actual stream of relocation entries. */
349 struct vms_section_data_struct
351 /* Maximnum number of entries in sec->relocation. */
354 /* Corresponding eisd. Used only while generating executables. */
355 struct vms_internal_eisd_map
*eisd
;
357 /* PSC flags to be clear. */
360 /* PSC flags to be set. */
364 #define vms_section_data(sec) \
365 ((struct vms_section_data_struct *)sec->used_by_bfd)
367 /* To be called from the debugger. */
368 struct vms_private_data_struct
*bfd_vms_get_data (bfd
*abfd
);
370 static int vms_get_remaining_object_record (bfd
*abfd
, int read_so_far
);
371 static bfd_boolean
_bfd_vms_slurp_object_records (bfd
* abfd
);
372 static void alpha_vms_add_fixup_lp (struct bfd_link_info
*, bfd
*, bfd
*);
373 static void alpha_vms_add_fixup_ca (struct bfd_link_info
*, bfd
*, bfd
*);
374 static void alpha_vms_add_fixup_qr (struct bfd_link_info
*, bfd
*, bfd
*,
376 static void alpha_vms_add_lw_reloc (struct bfd_link_info
*info
);
377 static void alpha_vms_add_qw_reloc (struct bfd_link_info
*info
);
378 static void alpha_vms_add_lw_fixup (struct bfd_link_info
*, unsigned int,
388 /* Number of elements in VEC. */
390 #define VEC_COUNT(VEC) ((VEC).nbr_el)
392 /* Get the address of the Nth element. */
394 #define VEC_EL(VEC, TYPE, N) (((TYPE *)((VEC).els))[N])
396 #define VEC_INIT(VEC) \
403 /* Be sure there is room for a new element. */
405 static void vector_grow1 (struct vector_type
*vec
, size_t elsz
);
407 /* Allocate room for a new element and return its address. */
409 #define VEC_APPEND(VEC, TYPE) \
410 (vector_grow1 (&VEC, sizeof (TYPE)), &VEC_EL(VEC, TYPE, (VEC).nbr_el++))
412 /* Append an element. */
414 #define VEC_APPEND_EL(VEC, TYPE, EL) \
415 (*(VEC_APPEND (VEC, TYPE)) = EL)
417 struct alpha_vms_vma_ref
419 bfd_vma vma
; /* Vma in the output. */
420 bfd_vma ref
; /* Reference in the input. */
423 struct alpha_vms_shlib_el
426 bfd_boolean has_fixups
;
428 struct vector_type lp
; /* Vector of bfd_vma. */
429 struct vector_type ca
; /* Vector of bfd_vma. */
430 struct vector_type qr
; /* Vector of struct alpha_vms_vma_ref. */
433 /* Alpha VMS linker hash table. */
435 struct alpha_vms_link_hash_table
437 struct bfd_link_hash_table root
;
439 /* Vector of shared libaries. */
440 struct vector_type shrlibs
;
445 /* Base address. Used by fixups. */
449 #define alpha_vms_link_hash(INFO) \
450 ((struct alpha_vms_link_hash_table *)(INFO->hash))
452 /* Alpha VMS linker hash table entry. */
454 struct alpha_vms_link_hash_entry
456 struct bfd_link_hash_entry root
;
458 /* Pointer to the original vms symbol. */
459 struct vms_symbol_entry
*sym
;
464 /* Read & process EIHD record.
465 Return TRUE on success, FALSE on error. */
468 _bfd_vms_slurp_eihd (bfd
*abfd
, unsigned int *eisd_offset
,
469 unsigned int *eihs_offset
)
471 unsigned int imgtype
, size
;
473 struct vms_eihd
*eihd
= (struct vms_eihd
*)PRIV (recrd
.rec
);
475 vms_debug2 ((8, "_bfd_vms_slurp_eihd\n"));
477 size
= bfd_getl32 (eihd
->size
);
478 imgtype
= bfd_getl32 (eihd
->imgtype
);
480 if (imgtype
== EIHD__K_EXE
|| imgtype
== EIHD__K_LIM
)
481 abfd
->flags
|= EXEC_P
;
483 symvva
= bfd_getl64 (eihd
->symvva
);
486 PRIV (symvva
) = symvva
;
487 abfd
->flags
|= DYNAMIC
;
490 PRIV (ident
) = bfd_getl32 (eihd
->ident
);
491 PRIV (matchctl
) = eihd
->matchctl
;
493 *eisd_offset
= bfd_getl32 (eihd
->isdoff
);
494 *eihs_offset
= bfd_getl32 (eihd
->symdbgoff
);
496 vms_debug2 ((4, "EIHD size %d imgtype %d symvva 0x%lx eisd %d eihs %d\n",
497 size
, imgtype
, (unsigned long)symvva
,
498 *eisd_offset
, *eihs_offset
));
503 /* Read & process EISD record.
504 Return TRUE on success, FALSE on error. */
507 _bfd_vms_slurp_eisd (bfd
*abfd
, unsigned int offset
)
509 int section_count
= 0;
511 vms_debug2 ((8, "_bfd_vms_slurp_eisd\n"));
515 struct vms_eisd
*eisd
;
516 unsigned int rec_size
;
518 unsigned long long vaddr
;
525 eisd
= (struct vms_eisd
*)(PRIV (recrd
.rec
) + offset
);
526 rec_size
= bfd_getl32 (eisd
->eisdsize
);
531 /* Skip to next block if pad. */
532 if (rec_size
== 0xffffffff)
534 offset
= (offset
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
540 size
= bfd_getl32 (eisd
->secsize
);
541 vaddr
= bfd_getl64 (eisd
->virt_addr
);
542 flags
= bfd_getl32 (eisd
->flags
);
543 vbn
= bfd_getl32 (eisd
->vbn
);
545 vms_debug2 ((4, "EISD at 0x%x size 0x%x addr 0x%lx flags 0x%x blk %d\n",
546 offset
, size
, (unsigned long)vaddr
, flags
, vbn
));
548 /* VMS combines psects from .obj files into isects in the .exe. This
549 process doesn't preserve enough information to reliably determine
550 what's in each section without examining the data. This is
551 especially true of DWARF debug sections. */
552 bfd_flags
= SEC_ALLOC
;
554 bfd_flags
|= SEC_HAS_CONTENTS
| SEC_LOAD
;
556 if (flags
& EISD__M_EXE
)
557 bfd_flags
|= SEC_CODE
;
559 if (flags
& EISD__M_NONSHRADR
)
560 bfd_flags
|= SEC_DATA
;
562 if (!(flags
& EISD__M_WRT
))
563 bfd_flags
|= SEC_READONLY
;
565 if (flags
& EISD__M_DZRO
)
566 bfd_flags
|= SEC_DATA
;
568 if (flags
& EISD__M_FIXUPVEC
)
569 bfd_flags
|= SEC_DATA
;
571 if (flags
& EISD__M_CRF
)
572 bfd_flags
|= SEC_DATA
;
574 if (flags
& EISD__M_GBL
)
576 name
= _bfd_vms_save_counted_string (eisd
->gblnam
);
577 bfd_flags
|= SEC_COFF_SHARED_LIBRARY
;
578 bfd_flags
&= ~(SEC_ALLOC
| SEC_LOAD
);
580 else if (flags
& EISD__M_FIXUPVEC
)
582 else if (eisd
->type
== EISD__K_USRSTACK
)
588 name
= (char*) bfd_alloc (abfd
, 32);
589 if (flags
& EISD__M_DZRO
)
591 else if (flags
& EISD__M_EXE
)
593 else if (!(flags
& EISD__M_WRT
))
597 BFD_ASSERT (section_count
< 999);
598 sprintf (name
, "$%s_%03d$", pfx
, section_count
++);
601 section
= bfd_make_section (abfd
, name
);
606 section
->filepos
= vbn
? VMS_BLOCK_SIZE
* (vbn
- 1) : 0;
607 section
->size
= size
;
608 section
->vma
= vaddr
;
610 if (!bfd_set_section_flags (abfd
, section
, bfd_flags
))
617 /* Read & process EIHS record.
618 Return TRUE on success, FALSE on error. */
621 _bfd_vms_slurp_eihs (bfd
*abfd
, unsigned int offset
)
623 unsigned char *p
= PRIV (recrd
.rec
) + offset
;
624 unsigned int gstvbn
= bfd_getl32 (p
+ EIHS__L_GSTVBN
);
625 unsigned int gstsize ATTRIBUTE_UNUSED
= bfd_getl32 (p
+ EIHS__L_GSTSIZE
);
626 unsigned int dstvbn
= bfd_getl32 (p
+ EIHS__L_DSTVBN
);
627 unsigned int dstsize
= bfd_getl32 (p
+ EIHS__L_DSTSIZE
);
628 unsigned int dmtvbn
= bfd_getl32 (p
+ EIHS__L_DMTVBN
);
629 unsigned int dmtbytes
= bfd_getl32 (p
+ EIHS__L_DMTBYTES
);
633 vms_debug (8, "_bfd_vms_slurp_ihs\n");
634 vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
635 gstvbn
, gstsize
, dstvbn
, dstsize
, dmtvbn
, dmtbytes
);
640 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
642 section
= bfd_make_section (abfd
, "$DST$");
646 section
->size
= dstsize
;
647 section
->filepos
= VMS_BLOCK_SIZE
* (dstvbn
- 1);
649 if (!bfd_set_section_flags (abfd
, section
, bfd_flags
))
652 PRIV (dst_section
) = section
;
653 abfd
->flags
|= (HAS_DEBUG
| HAS_LINENO
);
658 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
660 section
= bfd_make_section (abfd
, "$DMT$");
664 section
->size
= dmtbytes
;
665 section
->filepos
= VMS_BLOCK_SIZE
* (dmtvbn
- 1);
667 if (!bfd_set_section_flags (abfd
, section
, bfd_flags
))
673 if (bfd_seek (abfd
, VMS_BLOCK_SIZE
* (gstvbn
- 1), SEEK_SET
))
675 bfd_set_error (bfd_error_file_truncated
);
679 if (_bfd_vms_slurp_object_records (abfd
) != TRUE
)
682 abfd
->flags
|= HAS_SYMS
;
688 /* Object file reading. */
690 /* Object file input functions. */
692 /* Get next record from object file to vms_buf.
693 Set PRIV(buf_size) and return it
695 This is a little tricky since it should be portable.
697 The openVMS object file has 'variable length' which means that
698 read() returns data in chunks of (hopefully) correct and expected
699 size. The linker (and other tools on VMS) depend on that. Unix
700 doesn't know about 'formatted' files, so reading and writing such
701 an object file in a Unix environment is not trivial.
703 With the tool 'file' (available on all VMS FTP sites), one
704 can view and change the attributes of a file. Changing from
705 'variable length' to 'fixed length, 512 bytes' reveals the
706 record size at the first 2 bytes of every record. The same
707 may happen during the transfer of object files from VMS to Unix,
708 at least with UCX, the DEC implementation of TCP/IP.
710 The VMS format repeats the size at bytes 2 & 3 of every record.
712 On the first call (file_format == FF_UNKNOWN) we check if
713 the first and the third byte pair (!) of the record match.
714 If they do it's an object file in an Unix environment or with
715 wrong attributes (FF_FOREIGN), else we should be in a VMS
716 environment where read() returns the record size (FF_NATIVE).
718 Reading is always done in 2 steps:
719 1. first just the record header is read and the size extracted,
720 2. then the read buffer is adjusted and the remaining bytes are
723 All file I/O is done on even file positions. */
725 #define VMS_OBJECT_ADJUSTMENT 2
728 maybe_adjust_record_pointer_for_object (bfd
*abfd
)
730 /* Set the file format once for all on the first invocation. */
731 if (PRIV (recrd
.file_format
) == FF_UNKNOWN
)
733 if (PRIV (recrd
.rec
)[0] == PRIV (recrd
.rec
)[4]
734 && PRIV (recrd
.rec
)[1] == PRIV (recrd
.rec
)[5])
735 PRIV (recrd
.file_format
) = FF_FOREIGN
;
737 PRIV (recrd
.file_format
) = FF_NATIVE
;
740 /* The adjustment is needed only in an Unix environment. */
741 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
742 PRIV (recrd
.rec
) += VMS_OBJECT_ADJUSTMENT
;
745 /* Implement step #1 of the object record reading procedure.
746 Return the record type or -1 on failure. */
749 _bfd_vms_get_object_record (bfd
*abfd
)
751 unsigned int test_len
= 6;
754 vms_debug2 ((8, "_bfd_vms_get_obj_record\n"));
756 /* Skip alignment byte if the current position is odd. */
757 if (PRIV (recrd
.file_format
) == FF_FOREIGN
&& (bfd_tell (abfd
) & 1))
759 if (bfd_bread (PRIV (recrd
.buf
), 1, abfd
) != 1)
761 bfd_set_error (bfd_error_file_truncated
);
766 /* Read the record header */
767 if (bfd_bread (PRIV (recrd
.buf
), test_len
, abfd
) != test_len
)
769 bfd_set_error (bfd_error_file_truncated
);
773 /* Reset the record pointer. */
774 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
775 maybe_adjust_record_pointer_for_object (abfd
);
777 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
780 type
= bfd_getl16 (PRIV (recrd
.rec
));
782 vms_debug2 ((8, "_bfd_vms_get_obj_record: rec %p, size %d, type %d\n",
783 PRIV (recrd
.rec
), PRIV (recrd
.rec_size
), type
));
788 /* Implement step #2 of the object record reading procedure.
789 Return the size of the record or 0 on failure. */
792 vms_get_remaining_object_record (bfd
*abfd
, int read_so_far
)
794 unsigned int to_read
;
796 vms_debug2 ((8, "vms_get_remaining_obj_record\n"));
798 /* Extract record size. */
799 PRIV (recrd
.rec_size
) = bfd_getl16 (PRIV (recrd
.rec
) + 2);
801 if (PRIV (recrd
.rec_size
) <= 0)
803 bfd_set_error (bfd_error_file_truncated
);
807 /* That's what the linker manual says. */
808 if (PRIV (recrd
.rec_size
) > EOBJ__C_MAXRECSIZ
)
810 bfd_set_error (bfd_error_file_truncated
);
814 /* Take into account object adjustment. */
815 to_read
= PRIV (recrd
.rec_size
);
816 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
817 to_read
+= VMS_OBJECT_ADJUSTMENT
;
819 /* Adjust the buffer. */
820 if (to_read
> PRIV (recrd
.buf_size
))
823 = (unsigned char *) bfd_realloc (PRIV (recrd
.buf
), to_read
);
824 if (PRIV (recrd
.buf
) == NULL
)
826 PRIV (recrd
.buf_size
) = to_read
;
829 /* Read the remaining record. */
830 to_read
-= read_so_far
;
832 vms_debug2 ((8, "vms_get_remaining_obj_record: to_read %d\n", to_read
));
834 if (bfd_bread (PRIV (recrd
.buf
) + read_so_far
, to_read
, abfd
) != to_read
)
836 bfd_set_error (bfd_error_file_truncated
);
840 /* Reset the record pointer. */
841 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
842 maybe_adjust_record_pointer_for_object (abfd
);
844 vms_debug2 ((8, "vms_get_remaining_obj_record: size %d\n",
845 PRIV (recrd
.rec_size
)));
847 return PRIV (recrd
.rec_size
);
850 /* Read and process emh record.
851 Return TRUE on success, FALSE on error. */
854 _bfd_vms_slurp_ehdr (bfd
*abfd
)
857 unsigned char *vms_rec
;
860 vms_rec
= PRIV (recrd
.rec
);
862 vms_debug2 ((2, "HDR/EMH\n"));
864 subtype
= bfd_getl16 (vms_rec
+ 4);
866 vms_debug2 ((3, "subtype %d\n", subtype
));
872 PRIV (hdr_data
).hdr_b_strlvl
= vms_rec
[6];
873 PRIV (hdr_data
).hdr_l_arch1
= bfd_getl32 (vms_rec
+ 8);
874 PRIV (hdr_data
).hdr_l_arch2
= bfd_getl32 (vms_rec
+ 12);
875 PRIV (hdr_data
).hdr_l_recsiz
= bfd_getl32 (vms_rec
+ 16);
876 PRIV (hdr_data
).hdr_t_name
= _bfd_vms_save_counted_string (vms_rec
+ 20);
877 ptr
= vms_rec
+ 20 + vms_rec
[20] + 1;
878 PRIV (hdr_data
).hdr_t_version
=_bfd_vms_save_counted_string (ptr
);
880 PRIV (hdr_data
).hdr_t_date
= _bfd_vms_save_sized_string (ptr
, 17);
884 PRIV (hdr_data
).hdr_c_lnm
=
885 _bfd_vms_save_sized_string (vms_rec
, PRIV (recrd
.rec_size
- 6));
889 PRIV (hdr_data
).hdr_c_src
=
890 _bfd_vms_save_sized_string (vms_rec
, PRIV (recrd
.rec_size
- 6));
894 PRIV (hdr_data
).hdr_c_ttl
=
895 _bfd_vms_save_sized_string (vms_rec
, PRIV (recrd
.rec_size
- 6));
904 bfd_set_error (bfd_error_wrong_format
);
911 /* Typical sections for evax object files. */
913 #define EVAX_ABS_NAME "$ABS$"
914 #define EVAX_CODE_NAME "$CODE$"
915 #define EVAX_LINK_NAME "$LINK$"
916 #define EVAX_DATA_NAME "$DATA$"
917 #define EVAX_BSS_NAME "$BSS$"
918 #define EVAX_READONLYADDR_NAME "$READONLY_ADDR$"
919 #define EVAX_READONLY_NAME "$READONLY$"
920 #define EVAX_LITERAL_NAME "$LITERAL$"
921 #define EVAX_LITERALS_NAME "$LITERALS"
922 #define EVAX_COMMON_NAME "$COMMON$"
923 #define EVAX_LOCAL_NAME "$LOCAL$"
925 struct sec_flags_struct
927 const char *name
; /* Name of section. */
929 flagword flags_always
; /* Flags we set always. */
931 flagword flags_hassize
; /* Flags we set if the section has a size > 0. */
934 /* These flags are deccrtl/vaxcrtl (openVMS 6.2 Alpha) compatible. */
936 static struct sec_flags_struct evax_section_flags
[] =
942 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
) },
944 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
),
946 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
),
947 (SEC_CODE
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
) },
949 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
),
950 (SEC_DATA
| SEC_READONLY
),
951 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
),
952 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_READONLY
| SEC_LOAD
) },
954 (EGPS__V_REL
| EGPS__V_RD
),
955 (SEC_DATA
| SEC_READONLY
),
956 (EGPS__V_REL
| EGPS__V_RD
),
957 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_READONLY
| SEC_LOAD
) },
959 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
),
961 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
),
962 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
) },
964 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
),
966 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
),
968 { EVAX_READONLYADDR_NAME
,
969 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
),
970 (SEC_DATA
| SEC_READONLY
),
971 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
),
972 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_READONLY
| SEC_LOAD
) },
973 { EVAX_READONLY_NAME
,
974 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
),
975 (SEC_DATA
| SEC_READONLY
),
976 (EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
),
977 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_READONLY
| SEC_LOAD
) },
979 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
),
981 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
),
982 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
) },
983 { EVAX_LITERALS_NAME
,
984 (EGPS__V_PIC
| EGPS__V_OVR
),
985 (SEC_DATA
| SEC_READONLY
),
986 (EGPS__V_PIC
| EGPS__V_OVR
),
987 (SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_READONLY
| SEC_LOAD
) },
989 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
),
991 (EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
),
992 (SEC_IN_MEMORY
| SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
) }
995 /* Retrieve bfd section flags by name and size. */
998 vms_secflag_by_name (bfd
*abfd ATTRIBUTE_UNUSED
,
999 struct sec_flags_struct
*section_flags
,
1005 while (section_flags
[i
].name
!= NULL
)
1007 if (strcmp (name
, section_flags
[i
].name
) == 0)
1010 return section_flags
[i
].flags_hassize
;
1012 return section_flags
[i
].flags_always
;
1017 return section_flags
[i
].flags_hassize
;
1018 return section_flags
[i
].flags_always
;
1021 /* Retrieve vms section flags by name and size. */
1024 vms_esecflag_by_name (struct sec_flags_struct
*section_flags
,
1030 while (section_flags
[i
].name
!= NULL
)
1032 if (strcmp (name
, section_flags
[i
].name
) == 0)
1035 return section_flags
[i
].vflags_hassize
;
1037 return section_flags
[i
].vflags_always
;
1042 return section_flags
[i
].vflags_hassize
;
1043 return section_flags
[i
].vflags_always
;
1046 /* Add SYM to the symbol table of ABFD.
1047 Return FALSE in case of error. */
1050 add_symbol_entry (bfd
*abfd
, struct vms_symbol_entry
*sym
)
1052 if (PRIV (gsd_sym_count
) >= PRIV (max_sym_count
))
1054 if (PRIV (max_sym_count
) == 0)
1056 PRIV (max_sym_count
) = 128;
1057 PRIV (syms
) = bfd_malloc
1058 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*));
1062 PRIV (max_sym_count
) *= 2;
1063 PRIV (syms
) = bfd_realloc
1065 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*)));
1067 if (PRIV (syms
) == NULL
)
1071 PRIV (syms
)[PRIV (gsd_sym_count
)++] = sym
;
1075 /* Create a symbol whose name is ASCIC and add it to ABFD.
1076 Return NULL in case of error. */
1078 static struct vms_symbol_entry
*
1079 add_symbol (bfd
*abfd
, const unsigned char *ascic
)
1081 struct vms_symbol_entry
*entry
;
1085 entry
= (struct vms_symbol_entry
*)bfd_zalloc (abfd
, sizeof (*entry
) + len
);
1088 entry
->namelen
= len
;
1089 memcpy (entry
->name
, ascic
, len
);
1090 entry
->name
[len
] = 0;
1091 entry
->owner
= abfd
;
1093 if (!add_symbol_entry (abfd
, entry
))
1098 /* Read and process EGSD. Return FALSE on failure. */
1101 _bfd_vms_slurp_egsd (bfd
*abfd
)
1103 int gsd_type
, gsd_size
;
1105 unsigned char *vms_rec
;
1106 flagword new_flags
, old_flags
;
1108 unsigned long base_addr
;
1109 unsigned long align_addr
;
1111 vms_debug2 ((2, "EGSD\n"));
1113 PRIV (recrd
.rec
) += 8; /* Skip type, size, align pad. */
1114 PRIV (recrd
.rec_size
) -= 8;
1116 /* Calculate base address for each section. */
1119 while (PRIV (recrd
.rec_size
) > 0)
1121 vms_rec
= PRIV (recrd
.rec
);
1123 gsd_type
= bfd_getl16 (vms_rec
);
1124 gsd_size
= bfd_getl16 (vms_rec
+ 2);
1126 vms_debug2 ((3, "egsd_type %d\n", gsd_type
));
1132 /* Program section definition. */
1133 struct vms_egps
*egps
= (struct vms_egps
*)vms_rec
;
1135 name
= _bfd_vms_save_counted_string (&egps
->namlng
);
1136 section
= bfd_make_section (abfd
, name
);
1140 old_flags
= bfd_getl16 (egps
->flags
);
1141 vms_section_data (section
)->flags
= old_flags
;
1142 vms_section_data (section
)->no_flags
= 0;
1143 section
->size
= bfd_getl32 (egps
->alloc
);
1144 new_flags
= vms_secflag_by_name (abfd
, evax_section_flags
, name
,
1146 if (!(old_flags
& EGPS__V_NOMOD
))
1148 new_flags
|= SEC_HAS_CONTENTS
;
1149 if (old_flags
& EGPS__V_REL
)
1150 new_flags
|= SEC_RELOC
;
1152 if (!bfd_set_section_flags (abfd
, section
, new_flags
))
1154 section
->alignment_power
= egps
->align
;
1155 align_addr
= (1 << section
->alignment_power
);
1156 if ((base_addr
% align_addr
) != 0)
1157 base_addr
+= (align_addr
- (base_addr
% align_addr
));
1158 section
->vma
= (bfd_vma
)base_addr
;
1159 base_addr
+= section
->size
;
1160 section
->filepos
= (unsigned int)-1;
1162 /* Append it to the section array. */
1163 if (PRIV (section_count
) >= PRIV (section_max
))
1165 if (PRIV (section_max
) == 0)
1166 PRIV (section_max
) = 16;
1168 PRIV (section_max
) *= 2;
1169 PRIV (sections
) = bfd_realloc_or_free
1170 (PRIV (sections
), PRIV (section_max
) * sizeof (asection
*));
1171 if (PRIV (sections
) == NULL
)
1175 PRIV (sections
)[PRIV (section_count
)] = section
;
1176 PRIV (section_count
)++;
1179 vms_debug (4, "EGSD P-section %d (%s, flags %04x) ",
1180 section
->index
, name
, old_flags
);
1181 vms_debug (4, "%lu bytes at 0x%08lx (mem %p)\n",
1182 (unsigned long)section
->size
,
1183 (unsigned long)section
->vma
, section
->contents
);
1191 struct vms_symbol_entry
*entry
;
1192 struct vms_egsy
*egsy
= (struct vms_egsy
*) vms_rec
;
1194 old_flags
= bfd_getl16 (egsy
->flags
);
1195 if (old_flags
& EGSY__V_DEF
)
1196 nameoff
= ESDF__B_NAMLNG
;
1198 nameoff
= ESRF__B_NAMLNG
;
1200 entry
= add_symbol (abfd
, vms_rec
+ nameoff
);
1204 /* Allow only duplicate reference. */
1205 if ((entry
->flags
& EGSY__V_DEF
) && (old_flags
& EGSY__V_DEF
))
1208 if (entry
->typ
== 0)
1210 entry
->typ
= gsd_type
;
1211 entry
->data_type
= egsy
->datyp
;
1212 entry
->flags
= old_flags
;
1215 if (old_flags
& EGSY__V_DEF
)
1217 struct vms_esdf
*esdf
= (struct vms_esdf
*)vms_rec
;
1219 entry
->value
= bfd_getl64 (esdf
->value
);
1220 entry
->section
= bfd_getl32 (esdf
->psindx
);
1222 if (old_flags
& EGSY__V_NORM
)
1224 PRIV (norm_sym_count
)++;
1226 entry
->code_value
= bfd_getl64 (esdf
->code_address
);
1227 entry
->code_section
= bfd_getl32 (esdf
->ca_psindx
);
1236 struct vms_symbol_entry
*entry
;
1237 struct vms_egst
*egst
= (struct vms_egst
*)vms_rec
;
1239 old_flags
= bfd_getl16 (egst
->header
.flags
);
1240 if (old_flags
& EGSY__V_DEF
)
1241 nameoff
= ESDF__B_NAMLNG
;
1243 nameoff
= ESRF__B_NAMLNG
;
1245 entry
= add_symbol (abfd
, &egst
->namlng
);
1250 entry
->typ
= gsd_type
;
1251 entry
->data_type
= egst
->header
.datyp
;
1252 entry
->flags
= old_flags
;
1254 entry
->symbol_vector
= bfd_getl32 (egst
->value
);
1256 entry
->section
= bfd_getl32 (egst
->psindx
);
1257 entry
->value
= bfd_getl64 (egst
->lp_2
);
1259 if (old_flags
& EGSY__V_NORM
)
1261 PRIV (norm_sym_count
)++;
1263 entry
->code_value
= bfd_getl64 (egst
->lp_1
);
1264 entry
->code_section
= 0;
1271 /* Currently ignored. */
1276 (*_bfd_error_handler
) (_("Unknown EGSD subtype %d"), gsd_type
);
1277 bfd_set_error (bfd_error_bad_value
);
1281 PRIV (recrd
.rec_size
) -= gsd_size
;
1282 PRIV (recrd
.rec
) += gsd_size
;
1285 if (PRIV (gsd_sym_count
) > 0)
1286 abfd
->flags
|= HAS_SYMS
;
1291 /* Stack routines for vms ETIR commands. */
1293 /* Push value and section index. */
1296 _bfd_vms_push (bfd
*abfd
, bfd_vma val
, unsigned int reloc
)
1298 vms_debug2 ((4, "<push %08lx (0x%08x) at %d>\n",
1299 (unsigned long)val
, reloc
, PRIV (stackptr
)));
1301 PRIV (stack
[PRIV (stackptr
)]).value
= val
;
1302 PRIV (stack
[PRIV (stackptr
)]).reloc
= reloc
;
1304 if (PRIV (stackptr
) >= STACKSIZE
)
1306 bfd_set_error (bfd_error_bad_value
);
1307 (*_bfd_error_handler
) (_("Stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr
));
1312 /* Pop value and section index. */
1315 _bfd_vms_pop (bfd
*abfd
, bfd_vma
*val
, unsigned int *rel
)
1317 if (PRIV (stackptr
) == 0)
1319 bfd_set_error (bfd_error_bad_value
);
1320 (*_bfd_error_handler
) (_("Stack underflow in _bfd_vms_pop"));
1324 *val
= PRIV (stack
[PRIV (stackptr
)]).value
;
1325 *rel
= PRIV (stack
[PRIV (stackptr
)]).reloc
;
1327 vms_debug2 ((4, "<pop %08lx (0x%08x)>\n", (unsigned long)*val
, *rel
));
1330 /* Routines to fill sections contents during tir/etir read. */
1332 /* Initialize image buffer pointer to be filled. */
1335 image_set_ptr (bfd
*abfd
, bfd_vma vma
, int sect
, struct bfd_link_info
*info
)
1339 vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma
, sect
));
1341 sec
= PRIV (sections
)[sect
];
1345 /* Reading contents to an output bfd. */
1347 if (sec
->output_section
== NULL
)
1349 /* Section discarded. */
1350 vms_debug2 ((5, " section %s discarded\n", sec
->name
));
1352 /* This is not used. */
1353 PRIV (image_section
) = NULL
;
1354 PRIV (image_offset
) = 0;
1357 PRIV (image_offset
) = sec
->output_offset
+ vma
;
1358 PRIV (image_section
) = sec
->output_section
;
1362 PRIV (image_offset
) = vma
;
1363 PRIV (image_section
) = sec
;
1367 /* Increment image buffer pointer by offset. */
1370 image_inc_ptr (bfd
*abfd
, bfd_vma offset
)
1372 vms_debug2 ((4, "image_inc_ptr (%u)\n", (unsigned)offset
));
1374 PRIV (image_offset
) += offset
;
1377 /* Save current DST location counter under specified index. */
1380 dst_define_location (bfd
*abfd
, unsigned int loc
)
1382 vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc
));
1384 /* Grow the ptr offset table if necessary. */
1385 if (loc
+ 1 > PRIV (dst_ptr_offsets_count
))
1387 PRIV (dst_ptr_offsets
) = bfd_realloc (PRIV (dst_ptr_offsets
),
1388 (loc
+ 1) * sizeof (unsigned int));
1389 PRIV (dst_ptr_offsets_count
) = loc
+ 1;
1392 PRIV (dst_ptr_offsets
)[loc
] = PRIV (image_offset
);
1395 /* Restore saved DST location counter from specified index. */
1398 dst_restore_location (bfd
*abfd
, unsigned int loc
)
1400 vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc
));
1402 PRIV (image_offset
) = PRIV (dst_ptr_offsets
)[loc
];
1405 /* Retrieve saved DST location counter from specified index. */
1408 dst_retrieve_location (bfd
*abfd
, unsigned int loc
)
1410 vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int)loc
));
1412 return PRIV (dst_ptr_offsets
)[loc
];
1415 /* Write multiple bytes to section image. */
1418 image_write (bfd
*abfd
, unsigned char *ptr
, int size
)
1421 _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr
, size
,
1422 (long)PRIV (image_offset
));
1423 _bfd_hexdump (9, ptr
, size
, 0);
1426 if (PRIV (image_section
)->contents
!= NULL
)
1428 asection
*sec
= PRIV (image_section
);
1429 file_ptr off
= PRIV (image_offset
);
1432 if (off
> (file_ptr
)sec
->size
1433 || size
> (file_ptr
)sec
->size
1434 || off
+ size
> (file_ptr
)sec
->size
)
1436 bfd_set_error (bfd_error_bad_value
);
1440 memcpy (sec
->contents
+ off
, ptr
, size
);
1443 PRIV (image_offset
) += size
;
1447 /* Write byte to section image. */
1450 image_write_b (bfd
* abfd
, unsigned int value
)
1452 unsigned char data
[1];
1454 vms_debug2 ((6, "image_write_b (%02x)\n", (int) value
));
1458 return image_write (abfd
, data
, sizeof (data
));
1461 /* Write 2-byte word to image. */
1464 image_write_w (bfd
* abfd
, unsigned int value
)
1466 unsigned char data
[2];
1468 vms_debug2 ((6, "image_write_w (%04x)\n", (int) value
));
1470 bfd_putl16 (value
, data
);
1471 return image_write (abfd
, data
, sizeof (data
));
1474 /* Write 4-byte long to image. */
1477 image_write_l (bfd
* abfd
, unsigned long value
)
1479 unsigned char data
[4];
1481 vms_debug2 ((6, "image_write_l (%08lx)\n", value
));
1483 bfd_putl32 (value
, data
);
1484 return image_write (abfd
, data
, sizeof (data
));
1487 /* Write 8-byte quad to image. */
1490 image_write_q (bfd
* abfd
, bfd_vma value
)
1492 unsigned char data
[8];
1494 vms_debug2 ((6, "image_write_q (%08lx)\n", (unsigned long)value
));
1496 bfd_putl64 (value
, data
);
1497 return image_write (abfd
, data
, sizeof (data
));
1501 _bfd_vms_etir_name (int cmd
)
1505 case ETIR__C_STA_GBL
: return "ETIR__C_STA_GBL";
1506 case ETIR__C_STA_LW
: return "ETIR__C_STA_LW";
1507 case ETIR__C_STA_QW
: return "ETIR__C_STA_QW";
1508 case ETIR__C_STA_PQ
: return "ETIR__C_STA_PQ";
1509 case ETIR__C_STA_LI
: return "ETIR__C_STA_LI";
1510 case ETIR__C_STA_MOD
: return "ETIR__C_STA_MOD";
1511 case ETIR__C_STA_CKARG
: return "ETIR__C_STA_CKARG";
1512 case ETIR__C_STO_B
: return "ETIR__C_STO_B";
1513 case ETIR__C_STO_W
: return "ETIR__C_STO_W";
1514 case ETIR__C_STO_GBL
: return "ETIR__C_STO_GBL";
1515 case ETIR__C_STO_CA
: return "ETIR__C_STO_CA";
1516 case ETIR__C_STO_RB
: return "ETIR__C_STO_RB";
1517 case ETIR__C_STO_AB
: return "ETIR__C_STO_AB";
1518 case ETIR__C_STO_OFF
: return "ETIR__C_STO_OFF";
1519 case ETIR__C_STO_IMM
: return "ETIR__C_STO_IMM";
1520 case ETIR__C_STO_IMMR
: return "ETIR__C_STO_IMMR";
1521 case ETIR__C_STO_LW
: return "ETIR__C_STO_LW";
1522 case ETIR__C_STO_QW
: return "ETIR__C_STO_QW";
1523 case ETIR__C_STO_GBL_LW
: return "ETIR__C_STO_GBL_LW";
1524 case ETIR__C_STO_LP_PSB
: return "ETIR__C_STO_LP_PSB";
1525 case ETIR__C_STO_HINT_GBL
: return "ETIR__C_STO_HINT_GBL";
1526 case ETIR__C_STO_HINT_PS
: return "ETIR__C_STO_HINT_PS";
1527 case ETIR__C_OPR_ADD
: return "ETIR__C_OPR_ADD";
1528 case ETIR__C_OPR_SUB
: return "ETIR__C_OPR_SUB";
1529 case ETIR__C_OPR_INSV
: return "ETIR__C_OPR_INSV";
1530 case ETIR__C_OPR_USH
: return "ETIR__C_OPR_USH";
1531 case ETIR__C_OPR_ROT
: return "ETIR__C_OPR_ROT";
1532 case ETIR__C_OPR_REDEF
: return "ETIR__C_OPR_REDEF";
1533 case ETIR__C_OPR_DFLIT
: return "ETIR__C_OPR_DFLIT";
1534 case ETIR__C_STC_LP
: return "ETIR__C_STC_LP";
1535 case ETIR__C_STC_GBL
: return "ETIR__C_STC_GBL";
1536 case ETIR__C_STC_GCA
: return "ETIR__C_STC_GCA";
1537 case ETIR__C_STC_PS
: return "ETIR__C_STC_PS";
1538 case ETIR__C_STC_NBH_PS
: return "ETIR__C_STC_NBH_PS";
1539 case ETIR__C_STC_NOP_GBL
: return "ETIR__C_STC_NOP_GBL";
1540 case ETIR__C_STC_NOP_PS
: return "ETIR__C_STC_NOP_PS";
1541 case ETIR__C_STC_BSR_GBL
: return "ETIR__C_STC_BSR_GBL";
1542 case ETIR__C_STC_BSR_PS
: return "ETIR__C_STC_BSR_PS";
1543 case ETIR__C_STC_LDA_GBL
: return "ETIR__C_STC_LDA_GBL";
1544 case ETIR__C_STC_LDA_PS
: return "ETIR__C_STC_LDA_PS";
1545 case ETIR__C_STC_BOH_GBL
: return "ETIR__C_STC_BOH_GBL";
1546 case ETIR__C_STC_BOH_PS
: return "ETIR__C_STC_BOH_PS";
1547 case ETIR__C_STC_NBH_GBL
: return "ETIR__C_STC_NBH_GBL";
1548 case ETIR__C_STC_LP_PSB
: return "ETIR__C_STC_LP_PSB";
1549 case ETIR__C_CTL_SETRB
: return "ETIR__C_CTL_SETRB";
1550 case ETIR__C_CTL_AUGRB
: return "ETIR__C_CTL_AUGRB";
1551 case ETIR__C_CTL_DFLOC
: return "ETIR__C_CTL_DFLOC";
1552 case ETIR__C_CTL_STLOC
: return "ETIR__C_CTL_STLOC";
1553 case ETIR__C_CTL_STKDL
: return "ETIR__C_CTL_STKDL";
1556 /* These names have not yet been added to this switch statement. */
1557 (*_bfd_error_handler
) (_("unknown ETIR command %d"), cmd
);
1562 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
1565 _bfd_vms_get_value (bfd
*abfd
, const unsigned char *ascic
,
1566 struct bfd_link_info
*info
,
1568 struct alpha_vms_link_hash_entry
**hp
)
1573 struct alpha_vms_link_hash_entry
*h
;
1575 /* Not linking. Do not try to resolve the symbol. */
1584 for (i
= 0; i
< len
; i
++)
1585 name
[i
] = ascic
[i
+ 1];
1588 h
= (struct alpha_vms_link_hash_entry
*)
1589 bfd_link_hash_lookup (info
->hash
, name
, FALSE
, FALSE
, TRUE
);
1594 && (h
->root
.type
== bfd_link_hash_defined
1595 || h
->root
.type
== bfd_link_hash_defweak
))
1596 *vma
= h
->root
.u
.def
.value
1597 + h
->root
.u
.def
.section
->output_offset
1598 + h
->root
.u
.def
.section
->output_section
->vma
;
1599 else if (h
&& h
->root
.type
== bfd_link_hash_undefweak
)
1603 if (!(*info
->callbacks
->undefined_symbol
)
1604 (info
, name
, abfd
, PRIV (image_section
), PRIV (image_offset
), TRUE
))
1612 #define RELC_SHR_BASE 0x10000
1613 #define RELC_SEC_BASE 0x20000
1614 #define RELC_MASK 0x0ffff
1617 alpha_vms_sym_to_ctxt (struct alpha_vms_link_hash_entry
*h
)
1619 /* Handle undefined symbols. */
1620 if (h
== NULL
|| h
->sym
== NULL
)
1623 if (h
->sym
->typ
== EGSD__C_SYMG
)
1625 if (h
->sym
->flags
& EGSY__V_REL
)
1626 return RELC_SHR_BASE
+ PRIV2 (h
->sym
->owner
, shr_index
);
1629 /* Can this happen ? I'd like to see an example. */
1633 if (h
->sym
->typ
== EGSD__C_SYM
)
1635 if (h
->sym
->flags
& EGSY__V_REL
)
1644 alpha_vms_get_sym_value (unsigned int sect
, bfd_vma addr
,
1645 struct alpha_vms_link_hash_entry
*h
)
1649 BFD_ASSERT (h
&& (h
->root
.type
== bfd_link_hash_defined
1650 || h
->root
.type
== bfd_link_hash_defweak
));
1652 s
= PRIV2 (h
->root
.u
.def
.section
->owner
, sections
)[sect
];
1653 return s
->output_section
->vma
+ s
->output_offset
+ addr
;
1657 alpha_vms_fix_sec_rel (bfd
*abfd
, struct bfd_link_info
*info
,
1658 unsigned int rel
, bfd_vma vma
)
1660 asection
*sec
= PRIV (sections
)[rel
& RELC_MASK
];
1664 if (sec
->output_section
== NULL
)
1666 return vma
+ sec
->output_section
->vma
+ sec
->output_offset
;
1669 return vma
+ sec
->vma
;
1672 /* Read an ETIR record from ABFD. If INFO is not null, put the content into
1673 the output section (used during linking).
1674 Return FALSE in case of error. */
1677 _bfd_vms_slurp_etir (bfd
*abfd
, struct bfd_link_info
*info
)
1680 unsigned int length
;
1681 unsigned char *maxptr
;
1686 struct alpha_vms_link_hash_entry
*h
;
1688 PRIV (recrd
.rec
) += ETIR__C_HEADER_SIZE
;
1689 PRIV (recrd
.rec_size
) -= ETIR__C_HEADER_SIZE
;
1691 ptr
= PRIV (recrd
.rec
);
1692 length
= PRIV (recrd
.rec_size
);
1693 maxptr
= ptr
+ length
;
1695 vms_debug2 ((2, "ETIR: %d bytes\n", length
));
1697 while (ptr
< maxptr
)
1699 int cmd
= bfd_getl16 (ptr
);
1700 int cmd_length
= bfd_getl16 (ptr
+ 2);
1705 _bfd_vms_debug (4, "etir: %s(%d)\n",
1706 _bfd_vms_etir_name (cmd
), cmd
);
1707 _bfd_hexdump (8, ptr
, cmd_length
- 4, (long) ptr
);
1715 stack 32 bit value of symbol (high bits set to 0). */
1716 case ETIR__C_STA_GBL
:
1717 _bfd_vms_get_value (abfd
, ptr
, info
, &op1
, &h
);
1718 _bfd_vms_push (abfd
, op1
, alpha_vms_sym_to_ctxt (h
));
1724 stack 32 bit value, sign extend to 64 bit. */
1725 case ETIR__C_STA_LW
:
1726 _bfd_vms_push (abfd
, bfd_getl32 (ptr
), RELC_NONE
);
1732 stack 64 bit value of symbol. */
1733 case ETIR__C_STA_QW
:
1734 _bfd_vms_push (abfd
, bfd_getl64 (ptr
), RELC_NONE
);
1737 /* Stack psect base plus quadword offset
1738 arg: lw section index
1739 qw signed quadword offset (low 32 bits)
1741 Stack qw argument and section index
1742 (see ETIR__C_STO_OFF, ETIR__C_CTL_SETRB). */
1743 case ETIR__C_STA_PQ
:
1747 psect
= bfd_getl32 (ptr
);
1748 if ((unsigned int) psect
>= PRIV (section_count
))
1750 (*_bfd_error_handler
) (_("bad section index in %s"),
1751 _bfd_vms_etir_name (cmd
));
1752 bfd_set_error (bfd_error_bad_value
);
1755 op1
= bfd_getl64 (ptr
+ 4);
1756 _bfd_vms_push (abfd
, op1
, psect
| RELC_SEC_BASE
);
1760 case ETIR__C_STA_LI
:
1761 case ETIR__C_STA_MOD
:
1762 case ETIR__C_STA_CKARG
:
1763 (*_bfd_error_handler
) (_("unsupported STA cmd %s"),
1764 _bfd_vms_etir_name (cmd
));
1768 /* Store byte: pop stack, write byte
1771 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1772 if (rel1
!= RELC_NONE
)
1774 image_write_b (abfd
, (unsigned int) op1
& 0xff);
1777 /* Store word: pop stack, write word
1780 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1781 if (rel1
!= RELC_NONE
)
1783 image_write_w (abfd
, (unsigned int) op1
& 0xffff);
1786 /* Store longword: pop stack, write longword
1788 case ETIR__C_STO_LW
:
1789 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1790 if (rel1
& RELC_SEC_BASE
)
1792 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
1795 else if (rel1
& RELC_SHR_BASE
)
1797 alpha_vms_add_lw_fixup (info
, rel1
& RELC_MASK
, op1
);
1800 if (rel1
!= RELC_NONE
)
1802 if (rel1
!= RELC_REL
)
1804 alpha_vms_add_lw_reloc (info
);
1806 image_write_l (abfd
, op1
);
1809 /* Store quadword: pop stack, write quadword
1811 case ETIR__C_STO_QW
:
1812 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1813 if (rel1
& RELC_SEC_BASE
)
1815 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
1818 else if (rel1
& RELC_SHR_BASE
)
1820 if (rel1
!= RELC_NONE
)
1822 if (rel1
!= RELC_REL
)
1824 alpha_vms_add_qw_reloc (info
);
1826 image_write_q (abfd
, op1
);
1829 /* Store immediate repeated: pop stack for repeat count
1832 case ETIR__C_STO_IMMR
:
1836 size
= bfd_getl32 (ptr
);
1837 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1838 if (rel1
!= RELC_NONE
)
1841 image_write (abfd
, ptr
+ 4, size
);
1845 /* Store global: write symbol value
1846 arg: cs global symbol name. */
1847 case ETIR__C_STO_GBL
:
1848 _bfd_vms_get_value (abfd
, ptr
, info
, &op1
, &h
);
1851 if (h
->sym
->typ
== EGSD__C_SYMG
)
1853 alpha_vms_add_fixup_qr
1854 (info
, abfd
, h
->sym
->owner
, h
->sym
->symbol_vector
);
1859 op1
= alpha_vms_get_sym_value (h
->sym
->section
,
1861 alpha_vms_add_qw_reloc (info
);
1864 image_write_q (abfd
, op1
);
1867 /* Store code address: write address of entry point
1868 arg: cs global symbol name (procedure). */
1869 case ETIR__C_STO_CA
:
1870 _bfd_vms_get_value (abfd
, ptr
, info
, &op1
, &h
);
1873 if (h
->sym
->flags
& EGSY__V_NORM
)
1875 /* That's really a procedure. */
1876 if (h
->sym
->typ
== EGSD__C_SYMG
)
1878 alpha_vms_add_fixup_ca (info
, abfd
, h
->sym
->owner
);
1879 op1
= h
->sym
->symbol_vector
;
1883 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
1884 h
->sym
->code_value
, h
);
1885 alpha_vms_add_qw_reloc (info
);
1890 /* Symbol is not a procedure. */
1894 image_write_q (abfd
, op1
);
1897 /* Store offset to psect: pop stack, add low 32 bits to base of psect
1899 case ETIR__C_STO_OFF
:
1900 _bfd_vms_pop (abfd
, &op1
, &rel1
);
1902 if (!(rel1
& RELC_SEC_BASE
))
1905 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
1907 image_write_q (abfd
, op1
);
1911 arg: lw count of bytes
1913 case ETIR__C_STO_IMM
:
1917 size
= bfd_getl32 (ptr
);
1918 image_write (abfd
, ptr
+ 4, size
);
1922 /* This code is 'reserved to digital' according to the openVMS
1923 linker manual, however it is generated by the DEC C compiler
1924 and defined in the include file.
1925 FIXME, since the following is just a guess
1926 store global longword: store 32bit value of symbol
1927 arg: cs symbol name. */
1928 case ETIR__C_STO_GBL_LW
:
1929 _bfd_vms_get_value (abfd
, ptr
, info
, &op1
, &h
);
1933 image_write_l (abfd
, op1
);
1936 case ETIR__C_STO_RB
:
1937 case ETIR__C_STO_AB
:
1938 case ETIR__C_STO_LP_PSB
:
1939 (*_bfd_error_handler
) (_("%s: not supported"),
1940 _bfd_vms_etir_name (cmd
));
1943 case ETIR__C_STO_HINT_GBL
:
1944 case ETIR__C_STO_HINT_PS
:
1945 (*_bfd_error_handler
) (_("%s: not implemented"),
1946 _bfd_vms_etir_name (cmd
));
1950 /* 200 Store-conditional Linkage Pair
1952 case ETIR__C_STC_LP
:
1954 /* 202 Store-conditional Address at global address
1958 case ETIR__C_STC_GBL
:
1960 /* 203 Store-conditional Code Address at global address
1962 cs procedure name. */
1963 case ETIR__C_STC_GCA
:
1965 /* 204 Store-conditional Address at psect + offset
1969 case ETIR__C_STC_PS
:
1970 (*_bfd_error_handler
) (_("%s: not supported"),
1971 _bfd_vms_etir_name (cmd
));
1975 /* 201 Store-conditional Linkage Pair with Procedure Signature
1981 case ETIR__C_STC_LP_PSB
:
1982 _bfd_vms_get_value (abfd
, ptr
+ 4, info
, &op1
, &h
);
1985 if (h
->sym
->typ
== EGSD__C_SYMG
)
1987 alpha_vms_add_fixup_lp (info
, abfd
, h
->sym
->owner
);
1988 op1
= h
->sym
->symbol_vector
;
1993 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
1994 h
->sym
->code_value
, h
);
1995 op2
= alpha_vms_get_sym_value (h
->sym
->section
,
2001 /* Undefined symbol. */
2005 image_write_q (abfd
, op1
);
2006 image_write_q (abfd
, op2
);
2009 /* 205 Store-conditional NOP at address of global
2011 case ETIR__C_STC_NOP_GBL
:
2014 /* 207 Store-conditional BSR at global address
2017 case ETIR__C_STC_BSR_GBL
:
2020 /* 209 Store-conditional LDA at global address
2023 case ETIR__C_STC_LDA_GBL
:
2026 /* 211 Store-conditional BSR or Hint at global address
2029 case ETIR__C_STC_BOH_GBL
:
2030 /* Currentl ignored. */
2033 /* 213 Store-conditional NOP,BSR or HINT at global address
2036 case ETIR__C_STC_NBH_GBL
:
2038 /* 206 Store-conditional NOP at pect + offset
2041 case ETIR__C_STC_NOP_PS
:
2043 /* 208 Store-conditional BSR at pect + offset
2046 case ETIR__C_STC_BSR_PS
:
2048 /* 210 Store-conditional LDA at psect + offset
2051 case ETIR__C_STC_LDA_PS
:
2053 /* 212 Store-conditional BSR or Hint at pect + offset
2056 case ETIR__C_STC_BOH_PS
:
2058 /* 214 Store-conditional NOP, BSR or HINT at psect + offset
2060 case ETIR__C_STC_NBH_PS
:
2061 (*_bfd_error_handler
) ("%s: not supported",
2062 _bfd_vms_etir_name (cmd
));
2066 /* Det relocation base: pop stack, set image location counter
2068 case ETIR__C_CTL_SETRB
:
2069 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2070 if (!(rel1
& RELC_SEC_BASE
))
2072 image_set_ptr (abfd
, op1
, rel1
& RELC_MASK
, info
);
2075 /* Augment relocation base: increment image location counter by offset
2076 arg: lw offset value. */
2077 case ETIR__C_CTL_AUGRB
:
2078 op1
= bfd_getl32 (ptr
);
2079 image_inc_ptr (abfd
, op1
);
2082 /* Define location: pop index, save location counter under index
2084 case ETIR__C_CTL_DFLOC
:
2085 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2086 if (rel1
!= RELC_NONE
)
2088 dst_define_location (abfd
, op1
);
2091 /* Set location: pop index, restore location counter from index
2093 case ETIR__C_CTL_STLOC
:
2094 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2095 if (rel1
!= RELC_NONE
)
2097 dst_restore_location (abfd
, op1
);
2100 /* Stack defined location: pop index, push location counter from index
2102 case ETIR__C_CTL_STKDL
:
2103 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2104 if (rel1
!= RELC_NONE
)
2106 _bfd_vms_push (abfd
, dst_retrieve_location (abfd
, op1
), RELC_NONE
);
2109 case ETIR__C_OPR_NOP
: /* No-op. */
2112 case ETIR__C_OPR_ADD
: /* Add. */
2113 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2114 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2115 if (rel1
== RELC_NONE
&& rel2
!= RELC_NONE
)
2117 else if (rel1
!= RELC_NONE
&& rel2
!= RELC_NONE
)
2119 _bfd_vms_push (abfd
, op1
+ op2
, rel1
);
2122 case ETIR__C_OPR_SUB
: /* Subtract. */
2123 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2124 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2125 if (rel1
== RELC_NONE
&& rel2
!= RELC_NONE
)
2127 else if ((rel1
& RELC_SEC_BASE
) && (rel2
& RELC_SEC_BASE
))
2129 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2130 op2
= alpha_vms_fix_sec_rel (abfd
, info
, rel2
, op2
);
2133 else if (rel1
!= RELC_NONE
&& rel2
!= RELC_NONE
)
2135 _bfd_vms_push (abfd
, op2
- op1
, rel1
);
2138 case ETIR__C_OPR_MUL
: /* Multiply. */
2139 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2140 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2141 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2143 _bfd_vms_push (abfd
, op1
* op2
, RELC_NONE
);
2146 case ETIR__C_OPR_DIV
: /* Divide. */
2147 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2148 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2149 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2152 _bfd_vms_push (abfd
, 0, RELC_NONE
);
2154 _bfd_vms_push (abfd
, op2
/ op1
, RELC_NONE
);
2157 case ETIR__C_OPR_AND
: /* Logical AND. */
2158 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2159 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2160 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2162 _bfd_vms_push (abfd
, op1
& op2
, RELC_NONE
);
2165 case ETIR__C_OPR_IOR
: /* Logical inclusive OR. */
2166 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2167 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2168 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2170 _bfd_vms_push (abfd
, op1
| op2
, RELC_NONE
);
2173 case ETIR__C_OPR_EOR
: /* Logical exclusive OR. */
2174 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2175 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2176 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2178 _bfd_vms_push (abfd
, op1
^ op2
, RELC_NONE
);
2181 case ETIR__C_OPR_NEG
: /* Negate. */
2182 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2183 if (rel1
!= RELC_NONE
)
2185 _bfd_vms_push (abfd
, -op1
, RELC_NONE
);
2188 case ETIR__C_OPR_COM
: /* Complement. */
2189 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2190 if (rel1
!= RELC_NONE
)
2192 _bfd_vms_push (abfd
, ~op1
, RELC_NONE
);
2195 case ETIR__C_OPR_ASH
: /* Arithmetic shift. */
2196 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2197 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2198 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2201 (*_bfd_error_handler
) (_("invalid use of %s with contexts"),
2202 _bfd_vms_etir_name (cmd
));
2205 if ((int)op2
< 0) /* Shift right. */
2207 else /* Shift left. */
2209 _bfd_vms_push (abfd
, op1
, RELC_NONE
); /* FIXME: sym. */
2212 case ETIR__C_OPR_INSV
: /* Insert field. */
2213 case ETIR__C_OPR_USH
: /* Unsigned shift. */
2214 case ETIR__C_OPR_ROT
: /* Rotate. */
2215 case ETIR__C_OPR_REDEF
: /* Redefine symbol to current location. */
2216 case ETIR__C_OPR_DFLIT
: /* Define a literal. */
2217 (*_bfd_error_handler
) (_("%s: not supported"),
2218 _bfd_vms_etir_name (cmd
));
2222 case ETIR__C_OPR_SEL
: /* Select. */
2223 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2225 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2228 _bfd_vms_pop (abfd
, &op1
, &rel1
);
2229 _bfd_vms_pop (abfd
, &op2
, &rel2
);
2230 _bfd_vms_push (abfd
, op1
, rel1
);
2235 (*_bfd_error_handler
) (_("reserved cmd %d"), cmd
);
2240 ptr
+= cmd_length
- 4;
2246 /* Process EDBG/ETBT record.
2247 Return TRUE on success, FALSE on error */
2250 vms_slurp_debug (bfd
*abfd
)
2252 asection
*section
= PRIV (dst_section
);
2254 if (section
== NULL
)
2256 /* We have no way to find out beforehand how much debug info there
2257 is in an object file, so pick an initial amount and grow it as
2259 flagword flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
| SEC_RELOC
2262 section
= bfd_make_section (abfd
, "$DST$");
2265 if (!bfd_set_section_flags (abfd
, section
, flags
))
2267 PRIV (dst_section
) = section
;
2270 PRIV (image_section
) = section
;
2271 PRIV (image_offset
) = section
->size
;
2273 if (!_bfd_vms_slurp_etir (abfd
, NULL
))
2276 section
->size
= PRIV (image_offset
);
2280 /* Process EDBG record.
2281 Return TRUE on success, FALSE on error. */
2284 _bfd_vms_slurp_edbg (bfd
*abfd
)
2286 vms_debug2 ((2, "EDBG\n"));
2288 abfd
->flags
|= HAS_DEBUG
| HAS_LINENO
;
2290 return vms_slurp_debug (abfd
);
2293 /* Process ETBT record.
2294 Return TRUE on success, FALSE on error. */
2297 _bfd_vms_slurp_etbt (bfd
*abfd
)
2299 vms_debug2 ((2, "ETBT\n"));
2301 abfd
->flags
|= HAS_LINENO
;
2303 return vms_slurp_debug (abfd
);
2306 /* Process EEOM record.
2307 Return TRUE on success, FALSE on error. */
2310 _bfd_vms_slurp_eeom (bfd
*abfd
)
2312 struct vms_eeom
*eeom
= (struct vms_eeom
*) PRIV (recrd
.rec
);
2314 vms_debug2 ((2, "EEOM\n"));
2316 PRIV (eom_data
).eom_l_total_lps
= bfd_getl32 (eeom
->total_lps
);
2317 PRIV (eom_data
).eom_w_comcod
= bfd_getl16 (eeom
->comcod
);
2318 if (PRIV (eom_data
).eom_w_comcod
> 1)
2320 (*_bfd_error_handler
) (_("Object module NOT error-free !\n"));
2321 bfd_set_error (bfd_error_bad_value
);
2325 PRIV (eom_data
).eom_has_transfer
= FALSE
;
2326 if (PRIV (recrd
.rec_size
) > 10)
2328 PRIV (eom_data
).eom_has_transfer
= TRUE
;
2329 PRIV (eom_data
).eom_b_tfrflg
= eeom
->tfrflg
;
2330 PRIV (eom_data
).eom_l_psindx
= bfd_getl32 (eeom
->psindx
);
2331 PRIV (eom_data
).eom_l_tfradr
= bfd_getl32 (eeom
->tfradr
);
2333 abfd
->start_address
= PRIV (eom_data
).eom_l_tfradr
;
2338 /* Slurp an ordered set of VMS object records. Return FALSE on error. */
2341 _bfd_vms_slurp_object_records (bfd
* abfd
)
2348 vms_debug2 ((7, "reading at %08lx\n", (unsigned long)bfd_tell (abfd
)));
2350 type
= _bfd_vms_get_object_record (abfd
);
2353 vms_debug2 ((2, "next_record failed\n"));
2360 err
= _bfd_vms_slurp_ehdr (abfd
);
2363 err
= _bfd_vms_slurp_eeom (abfd
);
2366 err
= _bfd_vms_slurp_egsd (abfd
);
2369 err
= TRUE
; /* _bfd_vms_slurp_etir (abfd); */
2372 err
= _bfd_vms_slurp_edbg (abfd
);
2375 err
= _bfd_vms_slurp_etbt (abfd
);
2382 vms_debug2 ((2, "slurp type %d failed\n", type
));
2386 while (type
!= EOBJ__C_EEOM
);
2391 /* Initialize private data */
2393 vms_initialize (bfd
* abfd
)
2397 amt
= sizeof (struct vms_private_data_struct
);
2398 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
2399 if (abfd
->tdata
.any
== NULL
)
2402 PRIV (recrd
.file_format
) = FF_UNKNOWN
;
2404 amt
= sizeof (struct stack_struct
) * STACKSIZE
;
2405 PRIV (stack
) = bfd_alloc (abfd
, amt
);
2406 if (PRIV (stack
) == NULL
)
2412 bfd_release (abfd
, abfd
->tdata
.any
);
2413 abfd
->tdata
.any
= NULL
;
2417 /* Check the format for a file being read.
2418 Return a (bfd_target *) if it's an object file or zero if not. */
2420 static const struct bfd_target
*
2421 alpha_vms_object_p (bfd
*abfd
)
2423 PTR tdata_save
= abfd
->tdata
.any
;
2424 unsigned int test_len
;
2427 vms_debug2 ((1, "vms_object_p(%p)\n", abfd
));
2429 /* Allocate alpha-vms specific data. */
2430 if (!vms_initialize (abfd
))
2433 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
))
2434 goto err_wrong_format
;
2436 /* The first challenge with VMS is to discover the kind of the file.
2438 Image files (executable or shared images) are stored as a raw
2439 stream of bytes (like on UNIX), but there is no magic number.
2441 Object files are written with RMS (record management service), ie
2442 each records are preceeded by its length (on a word - 2 bytes), and
2443 padded for word-alignment. That would be simple but when files
2444 are transfered to a UNIX filesystem (using ftp), records are lost.
2445 Only the raw content of the records are transfered. Fortunately,
2446 the Alpha Object file format also store the length of the record
2447 in the records. Is that clear ? */
2449 /* Minimum is 6 bytes for objects (2 bytes size, 2 bytes record id,
2450 2 bytes size repeated) and 12 bytes for images (4 bytes major id,
2451 4 bytes minor id, 4 bytes length). */
2454 /* Size the main buffer. */
2455 buf
= (unsigned char *) bfd_malloc (test_len
);
2458 PRIV (recrd
.buf
) = buf
;
2459 PRIV (recrd
.buf_size
) = test_len
;
2461 /* Initialize the record pointer. */
2462 PRIV (recrd
.rec
) = buf
;
2464 if (bfd_bread (buf
, test_len
, abfd
) != test_len
)
2466 bfd_set_error (bfd_error_file_truncated
);
2470 /* Is it an image? */
2471 if ((bfd_getl32 (buf
) == EIHD__K_MAJORID
)
2472 && (bfd_getl32 (buf
+ 4) == EIHD__K_MINORID
))
2474 unsigned int to_read
;
2475 unsigned int read_so_far
;
2476 unsigned int remaining
;
2477 unsigned int eisd_offset
, eihs_offset
;
2479 /* Extract the header size. */
2480 PRIV (recrd
.rec_size
) = bfd_getl32 (buf
+ EIHD__L_SIZE
);
2482 /* The header size is 0 for DSF files. */
2483 if (PRIV (recrd
.rec_size
) == 0)
2484 PRIV (recrd
.rec_size
) = sizeof (struct vms_eihd
);
2486 if (PRIV (recrd
.rec_size
) > PRIV (recrd
.buf_size
))
2488 buf
= bfd_realloc_or_free (buf
, PRIV (recrd
.rec_size
));
2492 PRIV (recrd
.buf
) = NULL
;
2493 bfd_set_error (bfd_error_no_memory
);
2496 PRIV (recrd
.buf
) = buf
;
2497 PRIV (recrd
.buf_size
) = PRIV (recrd
.rec_size
);
2500 /* Read the remaining record. */
2501 remaining
= PRIV (recrd
.rec_size
) - test_len
;
2502 to_read
= MIN (VMS_BLOCK_SIZE
- test_len
, remaining
);
2503 read_so_far
= test_len
;
2505 while (remaining
> 0)
2507 if (bfd_bread (buf
+ read_so_far
, to_read
, abfd
) != to_read
)
2509 bfd_set_error (bfd_error_file_truncated
);
2510 goto err_wrong_format
;
2513 read_so_far
+= to_read
;
2514 remaining
-= to_read
;
2516 to_read
= MIN (VMS_BLOCK_SIZE
, remaining
);
2519 /* Reset the record pointer. */
2520 PRIV (recrd
.rec
) = buf
;
2522 vms_debug2 ((2, "file type is image\n"));
2524 if (_bfd_vms_slurp_eihd (abfd
, &eisd_offset
, &eihs_offset
) != TRUE
)
2525 goto err_wrong_format
;
2527 if (_bfd_vms_slurp_eisd (abfd
, eisd_offset
) != TRUE
)
2528 goto err_wrong_format
;
2530 /* EIHS is optional. */
2531 if (eihs_offset
!= 0 && _bfd_vms_slurp_eihs (abfd
, eihs_offset
) != TRUE
)
2532 goto err_wrong_format
;
2538 /* Assume it's a module and adjust record pointer if necessary. */
2539 maybe_adjust_record_pointer_for_object (abfd
);
2541 /* But is it really a module? */
2542 if (bfd_getl16 (PRIV (recrd
.rec
)) <= EOBJ__C_MAXRECTYP
2543 && bfd_getl16 (PRIV (recrd
.rec
) + 2) <= EOBJ__C_MAXRECSIZ
)
2545 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
2546 goto err_wrong_format
;
2548 vms_debug2 ((2, "file type is module\n"));
2550 type
= bfd_getl16 (PRIV (recrd
.rec
));
2551 if (type
!= EOBJ__C_EMH
|| _bfd_vms_slurp_ehdr (abfd
) != TRUE
)
2552 goto err_wrong_format
;
2554 if (_bfd_vms_slurp_object_records (abfd
) != TRUE
)
2555 goto err_wrong_format
;
2558 goto err_wrong_format
;
2561 /* Set arch_info to alpha. */
2563 if (! bfd_default_set_arch_mach (abfd
, bfd_arch_alpha
, 0))
2564 goto err_wrong_format
;
2569 bfd_set_error (bfd_error_wrong_format
);
2572 if (PRIV (recrd
.buf
))
2573 free (PRIV (recrd
.buf
));
2574 if (abfd
->tdata
.any
!= tdata_save
&& abfd
->tdata
.any
!= NULL
)
2575 bfd_release (abfd
, abfd
->tdata
.any
);
2576 abfd
->tdata
.any
= tdata_save
;
2582 /* Write an EMH/MHD record. */
2585 _bfd_vms_write_emh (bfd
*abfd
)
2587 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2589 _bfd_vms_output_alignment (recwr
, 2);
2592 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2593 _bfd_vms_output_short (recwr
, EMH__C_MHD
);
2594 _bfd_vms_output_short (recwr
, EOBJ__C_STRLVL
);
2595 _bfd_vms_output_long (recwr
, 0);
2596 _bfd_vms_output_long (recwr
, 0);
2597 _bfd_vms_output_long (recwr
, MAX_OUTREC_SIZE
);
2599 /* Create module name from filename. */
2600 if (bfd_get_filename (abfd
) != 0)
2602 char *module
= vms_get_module_name (bfd_get_filename (abfd
), TRUE
);
2603 _bfd_vms_output_counted (recwr
, module
);
2607 _bfd_vms_output_counted (recwr
, "NONAME");
2609 _bfd_vms_output_counted (recwr
, BFD_VERSION_STRING
);
2610 _bfd_vms_output_dump (recwr
, get_vms_time_string (), EMH_DATE_LENGTH
);
2611 _bfd_vms_output_fill (recwr
, 0, EMH_DATE_LENGTH
);
2612 _bfd_vms_output_end (abfd
, recwr
);
2615 /* Write an EMH/LMN record. */
2618 _bfd_vms_write_lmn (bfd
*abfd
, const char *name
)
2621 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2622 unsigned int ver
= BFD_VERSION
/ 10000;
2625 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2626 _bfd_vms_output_short (recwr
, EMH__C_LNM
);
2627 snprintf (version
, sizeof (version
), "%s %d.%d.%d", name
,
2628 ver
/ 10000, (ver
/ 100) % 100, ver
% 100);
2629 _bfd_vms_output_dump (recwr
, (unsigned char *)version
, strlen (version
));
2630 _bfd_vms_output_end (abfd
, recwr
);
2634 /* Write eom record for bfd abfd. Return FALSE on error. */
2637 _bfd_vms_write_eeom (bfd
*abfd
)
2639 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2641 vms_debug2 ((2, "vms_write_eeom\n"));
2643 _bfd_vms_output_alignment (recwr
, 2);
2645 _bfd_vms_output_begin (recwr
, EOBJ__C_EEOM
);
2646 _bfd_vms_output_long (recwr
, (unsigned long) (PRIV (vms_linkage_index
) >> 1));
2647 _bfd_vms_output_byte (recwr
, 0); /* Completion code. */
2648 _bfd_vms_output_byte (recwr
, 0); /* Fill byte. */
2650 if ((abfd
->flags
& EXEC_P
) == 0
2651 && bfd_get_start_address (abfd
) != (bfd_vma
)-1)
2655 section
= bfd_get_section_by_name (abfd
, ".link");
2658 bfd_set_error (bfd_error_nonrepresentable_section
);
2661 _bfd_vms_output_short (recwr
, 0);
2662 _bfd_vms_output_long (recwr
, (unsigned long) (section
->index
));
2663 _bfd_vms_output_long (recwr
,
2664 (unsigned long) bfd_get_start_address (abfd
));
2665 _bfd_vms_output_long (recwr
, 0);
2668 _bfd_vms_output_end (abfd
, recwr
);
2672 /* This hash routine borrowed from GNU-EMACS, and strengthened
2676 hash_string (const char *ptr
)
2678 const unsigned char *p
= (unsigned char *) ptr
;
2679 const unsigned char *end
= p
+ strlen (ptr
);
2686 hash
= ((hash
<< 3) + (hash
<< 15) + (hash
>> 28) + c
);
2691 /* Generate a length-hashed VMS symbol name (limited to maxlen chars). */
2694 _bfd_vms_length_hash_symbol (bfd
*abfd
, const char *in
, int maxlen
)
2696 unsigned long result
;
2699 const char *old_name
;
2701 static char outbuf
[EOBJ__C_SYMSIZ
+ 1];
2705 vms_debug (4, "_bfd_vms_length_hash_symbol \"%s\"\n", in
);
2708 if (maxlen
> EOBJ__C_SYMSIZ
)
2709 maxlen
= EOBJ__C_SYMSIZ
;
2711 /* Save this for later. */
2714 /* We may need to truncate the symbol, save the hash for later. */
2715 in_len
= strlen (in
);
2717 result
= (in_len
> maxlen
) ? hash_string (in
) : 0;
2721 /* Do the length checking. */
2722 if (in_len
<= maxlen
)
2726 if (PRIV (flag_hash_long_names
))
2732 strncpy (out
, in
, (size_t) i
);
2736 if ((in_len
> maxlen
)
2737 && PRIV (flag_hash_long_names
))
2738 sprintf (out
, "_%08lx", result
);
2743 vms_debug (4, "--> [%d]\"%s\"\n", (int)strlen (outbuf
), outbuf
);
2747 && PRIV (flag_hash_long_names
)
2748 && PRIV (flag_show_after_trunc
))
2749 printf (_("Symbol %s replaced by %s\n"), old_name
, new_name
);
2755 vector_grow1 (struct vector_type
*vec
, size_t elsz
)
2757 if (vec
->nbr_el
+ 1 < vec
->max_el
)
2760 if (vec
->max_el
== 0)
2763 vec
->els
= bfd_malloc2 (vec
->max_el
, elsz
);
2768 vec
->els
= bfd_realloc2 (vec
->els
, vec
->max_el
, elsz
);
2772 /* Bump ABFD file position to next block. */
2775 alpha_vms_file_position_block (bfd
*abfd
)
2778 PRIV (file_pos
) += VMS_BLOCK_SIZE
- 1;
2779 PRIV (file_pos
) -= (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
2782 /* Convert from internal structure SRC to external structure DST. */
2785 alpha_vms_swap_eisd_out (struct vms_internal_eisd_map
*src
,
2786 struct vms_eisd
*dst
)
2788 bfd_putl32 (src
->u
.eisd
.majorid
, dst
->majorid
);
2789 bfd_putl32 (src
->u
.eisd
.minorid
, dst
->minorid
);
2790 bfd_putl32 (src
->u
.eisd
.eisdsize
, dst
->eisdsize
);
2791 if (src
->u
.eisd
.eisdsize
<= EISD__K_LENEND
)
2793 bfd_putl32 (src
->u
.eisd
.secsize
, dst
->secsize
);
2794 bfd_putl64 (src
->u
.eisd
.virt_addr
, dst
->virt_addr
);
2795 bfd_putl32 (src
->u
.eisd
.flags
, dst
->flags
);
2796 bfd_putl32 (src
->u
.eisd
.vbn
, dst
->vbn
);
2797 dst
->pfc
= src
->u
.eisd
.pfc
;
2798 dst
->matchctl
= src
->u
.eisd
.matchctl
;
2799 dst
->type
= src
->u
.eisd
.type
;
2801 if (src
->u
.eisd
.flags
& EISD__M_GBL
)
2803 bfd_putl32 (src
->u
.gbl_eisd
.ident
, dst
->ident
);
2804 memcpy (dst
->gblnam
, src
->u
.gbl_eisd
.gblnam
,
2805 src
->u
.gbl_eisd
.gblnam
[0] + 1);
2809 /* Append EISD to the list of extra eisd for ABFD. */
2812 alpha_vms_append_extra_eisd (bfd
*abfd
, struct vms_internal_eisd_map
*eisd
)
2815 if (PRIV (gbl_eisd_head
) == NULL
)
2816 PRIV (gbl_eisd_head
) = eisd
;
2818 PRIV (gbl_eisd_tail
)->next
= eisd
;
2819 PRIV (gbl_eisd_tail
) = eisd
;
2822 /* Create an EISD for shared image SHRIMG.
2823 Return FALSE in case of error. */
2826 alpha_vms_create_eisd_for_shared (bfd
*abfd
, bfd
*shrimg
)
2828 struct vms_internal_eisd_map
*eisd
;
2831 namlen
= strlen (PRIV2 (shrimg
, hdr_data
.hdr_t_name
));
2832 if (namlen
+ 5 > EISD__K_GBLNAMLEN
)
2838 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
2842 /* Fill the fields. */
2843 eisd
->u
.gbl_eisd
.common
.majorid
= EISD__K_MAJORID
;
2844 eisd
->u
.gbl_eisd
.common
.minorid
= EISD__K_MINORID
;
2845 eisd
->u
.gbl_eisd
.common
.eisdsize
= (EISD__K_LEN
+ 4 + namlen
+ 5 + 3) & ~3;
2846 eisd
->u
.gbl_eisd
.common
.secsize
= VMS_BLOCK_SIZE
; /* Must not be 0. */
2847 eisd
->u
.gbl_eisd
.common
.virt_addr
= 0;
2848 eisd
->u
.gbl_eisd
.common
.flags
= EISD__M_GBL
;
2849 eisd
->u
.gbl_eisd
.common
.vbn
= 0;
2850 eisd
->u
.gbl_eisd
.common
.pfc
= 0;
2851 eisd
->u
.gbl_eisd
.common
.matchctl
= PRIV2 (shrimg
, matchctl
);
2852 eisd
->u
.gbl_eisd
.common
.type
= EISD__K_SHRPIC
;
2854 eisd
->u
.gbl_eisd
.ident
= PRIV2 (shrimg
, ident
);
2855 eisd
->u
.gbl_eisd
.gblnam
[0] = namlen
+ 4;
2856 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1, PRIV2 (shrimg
, hdr_data
.hdr_t_name
),
2858 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1 + namlen
, "_001", 4);
2860 /* Append it to the list. */
2861 alpha_vms_append_extra_eisd (abfd
, eisd
);
2866 /* Create an EISD for section SEC.
2867 Return FALSE in case of failure. */
2870 alpha_vms_create_eisd_for_section (bfd
*abfd
, asection
*sec
)
2872 struct vms_internal_eisd_map
*eisd
;
2874 /* Only for allocating section. */
2875 if (!(sec
->flags
& SEC_ALLOC
))
2878 BFD_ASSERT (vms_section_data (sec
)->eisd
== NULL
);
2879 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
2882 vms_section_data (sec
)->eisd
= eisd
;
2884 /* Fill the fields. */
2885 eisd
->u
.eisd
.majorid
= EISD__K_MAJORID
;
2886 eisd
->u
.eisd
.minorid
= EISD__K_MINORID
;
2887 eisd
->u
.eisd
.eisdsize
= EISD__K_LEN
;
2888 eisd
->u
.eisd
.secsize
=
2889 (sec
->size
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
2890 eisd
->u
.eisd
.virt_addr
= sec
->vma
;
2891 eisd
->u
.eisd
.flags
= 0;
2892 eisd
->u
.eisd
.vbn
= 0; /* To be later defined. */
2893 eisd
->u
.eisd
.pfc
= 0; /* Default. */
2894 eisd
->u
.eisd
.matchctl
= EISD__K_MATALL
;
2895 eisd
->u
.eisd
.type
= EISD__K_NORMAL
;
2897 if (sec
->flags
& SEC_CODE
)
2898 eisd
->u
.eisd
.flags
|= EISD__M_EXE
;
2899 if (!(sec
->flags
& SEC_READONLY
))
2900 eisd
->u
.eisd
.flags
|= EISD__M_WRT
| EISD__M_CRF
;
2902 if (!(sec
->flags
& SEC_LOAD
))
2904 eisd
->u
.eisd
.flags
|= EISD__M_DZRO
;
2905 eisd
->u
.eisd
.flags
&= ~EISD__M_CRF
;
2907 if (sec
->flags
& SEC_LINKER_CREATED
)
2909 if (strcmp (sec
->name
, "$FIXUP$") == 0)
2910 eisd
->u
.eisd
.flags
|= EISD__M_FIXUPVEC
;
2913 /* Append it to the list. */
2915 if (PRIV (eisd_head
) == NULL
)
2916 PRIV (eisd_head
) = eisd
;
2918 PRIV (eisd_tail
)->next
= eisd
;
2919 PRIV (eisd_tail
) = eisd
;
2924 /* Layout executable ABFD and write it to the disk.
2925 Return FALSE in case of failure. */
2928 alpha_vms_write_exec (bfd
*abfd
)
2930 struct vms_eihd eihd
;
2931 struct vms_eiha
*eiha
;
2932 struct vms_eihi
*eihi
;
2933 struct vms_eihs
*eihs
= NULL
;
2935 struct vms_internal_eisd_map
*first_eisd
;
2936 struct vms_internal_eisd_map
*eisd
;
2940 /* Build the EIHD. */
2941 PRIV (file_pos
) = EIHD__C_LENGTH
;
2943 memset (&eihd
, 0, sizeof (eihd
));
2944 memset (eihd
.fill_2
, 0xff, sizeof (eihd
.fill_2
));
2946 bfd_putl32 (EIHD__K_MAJORID
, eihd
.majorid
);
2947 bfd_putl32 (EIHD__K_MINORID
, eihd
.minorid
);
2949 bfd_putl32 (sizeof (eihd
), eihd
.size
);
2950 bfd_putl32 (0, eihd
.isdoff
);
2951 bfd_putl32 (0, eihd
.activoff
);
2952 bfd_putl32 (0, eihd
.symdbgoff
);
2953 bfd_putl32 (0, eihd
.imgidoff
);
2954 bfd_putl32 (0, eihd
.patchoff
);
2955 bfd_putl64 (0, eihd
.iafva
);
2956 bfd_putl32 (0, eihd
.version_array_off
);
2958 bfd_putl32 (EIHD__K_EXE
, eihd
.imgtype
);
2959 bfd_putl32 (0, eihd
.subtype
);
2961 bfd_putl32 (0, eihd
.imgiocnt
);
2962 bfd_putl32 (-1, eihd
.privreqs
);
2963 bfd_putl32 (-1, eihd
.privreqs
+ 4);
2965 bfd_putl32 ((sizeof (eihd
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
2967 bfd_putl32 (0, eihd
.lnkflags
);
2968 bfd_putl32 (0, eihd
.ident
);
2969 bfd_putl32 (0, eihd
.sysver
);
2972 bfd_putl32 (0, eihd
.symvect_size
);
2973 bfd_putl32 (16, eihd
.virt_mem_block_size
);
2974 bfd_putl32 (0, eihd
.ext_fixup_off
);
2975 bfd_putl32 (0, eihd
.noopt_psect_off
);
2976 bfd_putl32 (-1, eihd
.alias
);
2979 eiha
= (struct vms_eiha
*)((char *) &eihd
+ PRIV (file_pos
));
2980 bfd_putl32 (PRIV (file_pos
), eihd
.activoff
);
2981 PRIV (file_pos
) += sizeof (struct vms_eiha
);
2983 bfd_putl32 (sizeof (struct vms_eiha
), eiha
->size
);
2984 bfd_putl32 (0, eiha
->spare
);
2985 bfd_putl32 (0x00000340, eiha
->tfradr1
); /* SYS$IMGACT */
2986 bfd_putl32 (0xffffffff, eiha
->tfradr1_h
);
2987 bfd_putl64 (bfd_get_start_address (abfd
), eiha
->tfradr2
);
2988 bfd_putl64 (0, eiha
->tfradr3
);
2989 bfd_putl64 (0, eiha
->tfradr4
);
2990 bfd_putl64 (0, eiha
->inishr
);
2993 eihi
= (struct vms_eihi
*)((char *) &eihd
+ PRIV (file_pos
));
2994 bfd_putl32 (PRIV (file_pos
), eihd
.imgidoff
);
2995 PRIV (file_pos
) += sizeof (struct vms_eihi
);
2997 bfd_putl32 (EIHI__K_MAJORID
, eihi
->majorid
);
2998 bfd_putl32 (EIHI__K_MINORID
, eihi
->minorid
);
3003 module
= vms_get_module_name (bfd_get_filename (abfd
), TRUE
);
3004 len
= strlen (module
);
3005 if (len
> sizeof (eihi
->imgnam
) - 1)
3006 len
= sizeof (eihi
->imgnam
) - 1;
3007 eihi
->imgnam
[0] = len
;
3008 memcpy (eihi
->imgnam
+ 1, module
, len
);
3011 bfd_putl32 (0, eihi
->linktime
+ 0);
3012 bfd_putl32 (0, eihi
->linktime
+ 4);
3014 eihi
->linkid
[0] = 0;
3015 eihi
->imgbid
[0] = 0;
3018 dst
= PRIV (dst_section
);
3019 dmt
= bfd_get_section_by_name (abfd
, "$DMT$");
3020 if (dst
!= NULL
&& dst
->size
!= 0)
3022 eihs
= (struct vms_eihs
*)((char *) &eihd
+ PRIV (file_pos
));
3023 bfd_putl32 (PRIV (file_pos
), eihd
.symdbgoff
);
3024 PRIV (file_pos
) += sizeof (struct vms_eihs
);
3026 bfd_putl32 (EIHS__K_MAJORID
, eihs
->majorid
);
3027 bfd_putl32 (EIHS__K_MINORID
, eihs
->minorid
);
3028 bfd_putl32 (0, eihs
->dstvbn
);
3029 bfd_putl32 (0, eihs
->dstsize
);
3030 bfd_putl32 (0, eihs
->gstvbn
);
3031 bfd_putl32 (0, eihs
->gstsize
);
3032 bfd_putl32 (0, eihs
->dmtvbn
);
3033 bfd_putl32 (0, eihs
->dmtsize
);
3036 /* One EISD per section. */
3037 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3039 if (!alpha_vms_create_eisd_for_section (abfd
, sec
))
3043 /* Merge section EIDS which extra ones. */
3044 if (PRIV (eisd_tail
))
3045 PRIV (eisd_tail
)->next
= PRIV (gbl_eisd_head
);
3047 PRIV (eisd_head
) = PRIV (gbl_eisd_head
);
3048 if (PRIV (gbl_eisd_tail
))
3049 PRIV (eisd_tail
) = PRIV (gbl_eisd_tail
);
3051 first_eisd
= PRIV (eisd_head
);
3053 /* Add end of eisd. */
3056 eisd
= bfd_zalloc (abfd
, sizeof (*eisd
));
3059 eisd
->u
.eisd
.majorid
= 0;
3060 eisd
->u
.eisd
.minorid
= 0;
3061 eisd
->u
.eisd
.eisdsize
= 0;
3062 alpha_vms_append_extra_eisd (abfd
, eisd
);
3065 /* Place EISD in the file. */
3066 for (eisd
= first_eisd
; eisd
; eisd
= eisd
->next
)
3068 file_ptr room
= VMS_BLOCK_SIZE
- (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
3070 /* First block is a little bit special: there is a word at the end. */
3071 if (PRIV (file_pos
) < VMS_BLOCK_SIZE
&& room
> 2)
3073 if (room
< eisd
->u
.eisd
.eisdsize
+ EISD__K_LENEND
)
3074 alpha_vms_file_position_block (abfd
);
3076 eisd
->file_pos
= PRIV (file_pos
);
3077 PRIV (file_pos
) += eisd
->u
.eisd
.eisdsize
;
3079 if (eisd
->u
.eisd
.flags
& EISD__M_FIXUPVEC
)
3080 bfd_putl64 (eisd
->u
.eisd
.virt_addr
, eihd
.iafva
);
3083 if (first_eisd
!= NULL
)
3085 bfd_putl32 (first_eisd
->file_pos
, eihd
.isdoff
);
3086 /* Real size of end of eisd marker. */
3087 PRIV (file_pos
) += EISD__K_LENEND
;
3090 bfd_putl32 (PRIV (file_pos
), eihd
.size
);
3091 bfd_putl32 ((PRIV (file_pos
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
3094 /* Place sections. */
3095 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3097 if (!(sec
->flags
& SEC_HAS_CONTENTS
))
3100 eisd
= vms_section_data (sec
)->eisd
;
3102 /* Align on a block. */
3103 alpha_vms_file_position_block (abfd
);
3104 sec
->filepos
= PRIV (file_pos
);
3107 eisd
->u
.eisd
.vbn
= (sec
->filepos
/ VMS_BLOCK_SIZE
) + 1;
3109 PRIV (file_pos
) += sec
->size
;
3113 if (eihs
!= NULL
&& dst
!= NULL
)
3115 bfd_putl32 ((dst
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dstvbn
);
3116 bfd_putl32 (dst
->size
, eihs
->dstsize
);
3120 bfd_putl32 ((dmt
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dmtvbn
);
3121 bfd_putl32 (dmt
->size
, eihs
->dmtsize
);
3125 /* Write EISD in hdr. */
3126 for (eisd
= first_eisd
; eisd
&& eisd
->file_pos
< VMS_BLOCK_SIZE
;
3128 alpha_vms_swap_eisd_out
3129 (eisd
, (struct vms_eisd
*)((char *)&eihd
+ eisd
->file_pos
));
3131 /* Write first block. */
3132 if (bfd_bwrite (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
3135 /* Write remaining eisd. */
3138 unsigned char blk
[VMS_BLOCK_SIZE
];
3139 struct vms_internal_eisd_map
*next_eisd
;
3141 memset (blk
, 0xff, sizeof (blk
));
3142 while (eisd
!= NULL
)
3144 alpha_vms_swap_eisd_out
3146 (struct vms_eisd
*)(blk
+ (eisd
->file_pos
% VMS_BLOCK_SIZE
)));
3148 next_eisd
= eisd
->next
;
3149 if (next_eisd
== NULL
3150 || (next_eisd
->file_pos
/ VMS_BLOCK_SIZE
3151 != eisd
->file_pos
/ VMS_BLOCK_SIZE
))
3153 if (bfd_bwrite (blk
, sizeof (blk
), abfd
) != sizeof (blk
))
3156 memset (blk
, 0xff, sizeof (blk
));
3162 /* Write sections. */
3163 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3165 unsigned char blk
[VMS_BLOCK_SIZE
];
3168 if (sec
->size
== 0 || !(sec
->flags
& SEC_HAS_CONTENTS
))
3170 if (bfd_bwrite (sec
->contents
, sec
->size
, abfd
) != sec
->size
)
3174 len
= VMS_BLOCK_SIZE
- sec
->size
% VMS_BLOCK_SIZE
;
3175 if (len
!= VMS_BLOCK_SIZE
)
3177 memset (blk
, 0, len
);
3178 if (bfd_bwrite (blk
, len
, abfd
) != len
)
3188 /* Write section and symbol directory of bfd abfd. Return FALSE on error. */
3191 _bfd_vms_write_egsd (bfd
*abfd
)
3195 unsigned int symnum
;
3196 int last_index
= -1;
3197 char dummy_name
[10];
3199 flagword new_flags
, old_flags
;
3200 int abs_section_index
= 0;
3201 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3203 vms_debug2 ((2, "vms_write_gsd\n"));
3205 /* Output sections. */
3206 section
= abfd
->sections
;
3207 vms_debug2 ((3, "%d sections found\n", abfd
->section_count
));
3209 /* Egsd is quadword aligned. */
3210 _bfd_vms_output_alignment (recwr
, 8);
3212 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3213 _bfd_vms_output_long (recwr
, 0);
3215 while (section
!= 0)
3217 vms_debug2 ((3, "Section #%d %s, %d bytes\n",
3218 section
->index
, section
->name
, (int)section
->size
));
3220 /* Don't write out the VMS debug info section since it is in the
3221 ETBT and EDBG sections in etir. */
3222 if (!strcmp (section
->name
, ".vmsdebug"))
3225 /* 13 bytes egsd, max 31 chars name -> should be 44 bytes. */
3226 if (_bfd_vms_output_check (recwr
, 64) < 0)
3228 _bfd_vms_output_end (abfd
, recwr
);
3229 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3230 _bfd_vms_output_long (recwr
, 0);
3233 /* Create dummy sections to keep consecutive indices. */
3234 while (section
->index
- last_index
> 1)
3236 vms_debug2 ((3, "index %d, last %d\n", section
->index
, last_index
));
3237 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3238 _bfd_vms_output_short (recwr
, 0);
3239 _bfd_vms_output_short (recwr
, 0);
3240 _bfd_vms_output_long (recwr
, 0);
3241 sprintf (dummy_name
, ".DUMMY%02d", last_index
);
3242 _bfd_vms_output_counted (recwr
, dummy_name
);
3243 _bfd_vms_output_end_subrec (recwr
);
3247 /* Don't know if this is necessary for the linker but for now it keeps
3248 vms_slurp_gsd happy. */
3249 sname
= (char *)section
->name
;
3252 /* Remove leading dot. */
3254 if ((*sname
== 't') && (strcmp (sname
, "text") == 0))
3255 sname
= EVAX_CODE_NAME
;
3256 else if ((*sname
== 'd') && (strcmp (sname
, "data") == 0))
3257 sname
= EVAX_DATA_NAME
;
3258 else if ((*sname
== 'b') && (strcmp (sname
, "bss") == 0))
3259 sname
= EVAX_BSS_NAME
;
3260 else if ((*sname
== 'l') && (strcmp (sname
, "link") == 0))
3261 sname
= EVAX_LINK_NAME
;
3262 else if ((*sname
== 'r') && (strcmp (sname
, "rdata") == 0))
3263 sname
= EVAX_READONLY_NAME
;
3264 else if ((*sname
== 'l') && (strcmp (sname
, "literal") == 0))
3265 sname
= EVAX_LITERAL_NAME
;
3266 else if ((*sname
== 'l') && (strcmp (sname
, "literals") == 0))
3268 sname
= EVAX_LITERALS_NAME
;
3269 abs_section_index
= section
->index
;
3271 else if ((*sname
== 'c') && (strcmp (sname
, "comm") == 0))
3272 sname
= EVAX_COMMON_NAME
;
3273 else if ((*sname
== 'l') && (strcmp (sname
, "lcomm") == 0))
3274 sname
= EVAX_LOCAL_NAME
;
3277 sname
= _bfd_vms_length_hash_symbol (abfd
, sname
, EOBJ__C_SECSIZ
);
3279 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3280 _bfd_vms_output_short (recwr
, section
->alignment_power
& 0xff);
3282 if (bfd_is_com_section (section
))
3283 new_flags
= (EGPS__V_OVR
| EGPS__V_REL
| EGPS__V_GBL
| EGPS__V_RD
3284 | EGPS__V_WRT
| EGPS__V_NOMOD
| EGPS__V_COM
);
3286 new_flags
= vms_esecflag_by_name (evax_section_flags
, sname
,
3289 /* Modify them as directed. */
3290 if (section
->flags
& SEC_READONLY
)
3291 new_flags
&= ~EGPS__V_WRT
;
3293 new_flags
&= ~vms_section_data (section
)->no_flags
;
3294 new_flags
|= vms_section_data (section
)->flags
;
3296 vms_debug2 ((3, "sec flags %x\n", section
->flags
));
3297 vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
3298 new_flags
, (unsigned long)section
->size
));
3300 _bfd_vms_output_short (recwr
, new_flags
);
3301 _bfd_vms_output_long (recwr
, (unsigned long) section
->size
);
3302 _bfd_vms_output_counted (recwr
, sname
);
3303 _bfd_vms_output_end_subrec (recwr
);
3305 last_index
= section
->index
;
3307 section
= section
->next
;
3310 /* Output symbols. */
3311 vms_debug2 ((3, "%d symbols found\n", abfd
->symcount
));
3313 bfd_set_start_address (abfd
, (bfd_vma
) -1);
3315 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3319 symbol
= abfd
->outsymbols
[symnum
];
3320 if (*(symbol
->name
) == '_')
3322 if (strcmp (symbol
->name
, "__main") == 0)
3323 bfd_set_start_address (abfd
, (bfd_vma
)symbol
->value
);
3325 old_flags
= symbol
->flags
;
3327 if (old_flags
& BSF_FILE
)
3330 if ((old_flags
& BSF_GLOBAL
) == 0 /* Not xdef... */
3331 && !bfd_is_und_section (symbol
->section
) /* and not xref... */
3332 && !((old_flags
& BSF_SECTION_SYM
) != 0 /* and not LIB$INITIALIZE. */
3333 && strcmp (symbol
->section
->name
, "LIB$INITIALIZE") == 0))
3336 /* 13 bytes egsd, max 64 chars name -> should be 77 bytes. */
3337 if (_bfd_vms_output_check (recwr
, 80) < 0)
3339 _bfd_vms_output_end (abfd
, recwr
);
3340 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3341 _bfd_vms_output_long (recwr
, 0);
3344 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_SYM
);
3346 /* Data type, alignment. */
3347 _bfd_vms_output_short (recwr
, 0);
3351 if (old_flags
& BSF_WEAK
)
3352 new_flags
|= EGSY__V_WEAK
;
3353 if (bfd_is_com_section (symbol
->section
)) /* .comm */
3354 new_flags
|= (EGSY__V_WEAK
| EGSY__V_COMM
);
3356 if (old_flags
& BSF_FUNCTION
)
3358 new_flags
|= EGSY__V_NORM
;
3359 new_flags
|= EGSY__V_REL
;
3361 if (old_flags
& BSF_GLOBAL
)
3363 new_flags
|= EGSY__V_DEF
;
3364 if (!bfd_is_abs_section (symbol
->section
))
3365 new_flags
|= EGSY__V_REL
;
3367 _bfd_vms_output_short (recwr
, new_flags
);
3369 if (old_flags
& BSF_GLOBAL
)
3371 /* Symbol definition. */
3372 bfd_vma code_address
= 0;
3373 unsigned long ca_psindx
= 0;
3374 unsigned long psindx
;
3376 if ((old_flags
& BSF_FUNCTION
) && symbol
->udata
.p
!= NULL
)
3380 sym
= ((struct evax_private_udata_struct
*)symbol
->udata
.p
)->enbsym
;
3381 code_address
= sym
->value
;
3382 ca_psindx
= sym
->section
->index
;
3384 if (bfd_is_abs_section (symbol
->section
))
3385 psindx
= abs_section_index
;
3387 psindx
= symbol
->section
->index
;
3389 _bfd_vms_output_quad (recwr
, symbol
->value
);
3390 _bfd_vms_output_quad (recwr
, code_address
);
3391 _bfd_vms_output_long (recwr
, ca_psindx
);
3392 _bfd_vms_output_long (recwr
, psindx
);
3394 hash
= _bfd_vms_length_hash_symbol (abfd
, symbol
->name
, EOBJ__C_SYMSIZ
);
3395 _bfd_vms_output_counted (recwr
, hash
);
3397 _bfd_vms_output_end_subrec (recwr
);
3400 _bfd_vms_output_alignment (recwr
, 8);
3401 _bfd_vms_output_end (abfd
, recwr
);
3406 /* Write object header for bfd abfd. Return FALSE on error. */
3409 _bfd_vms_write_ehdr (bfd
*abfd
)
3412 unsigned int symnum
;
3415 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3417 vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd
));
3419 _bfd_vms_output_alignment (recwr
, 2);
3421 _bfd_vms_write_emh (abfd
);
3422 _bfd_vms_write_lmn (abfd
, "GNU AS");
3425 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3426 _bfd_vms_output_short (recwr
, EMH__C_SRC
);
3428 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3430 symbol
= abfd
->outsymbols
[symnum
];
3432 if (symbol
->flags
& BSF_FILE
)
3434 if (CONST_STRNEQ ((char *)symbol
->name
, "<CASE:"))
3436 PRIV (flag_hash_long_names
) = symbol
->name
[6] - '0';
3437 PRIV (flag_show_after_trunc
) = symbol
->name
[7] - '0';
3445 _bfd_vms_output_dump (recwr
, (unsigned char *) symbol
->name
,
3446 (int) strlen (symbol
->name
));
3453 if (symnum
== abfd
->symcount
)
3454 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("noname"));
3456 _bfd_vms_output_end (abfd
, recwr
);
3459 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3460 _bfd_vms_output_short (recwr
, EMH__C_TTL
);
3461 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("TTL"));
3462 _bfd_vms_output_end (abfd
, recwr
);
3465 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3466 _bfd_vms_output_short (recwr
, EMH__C_CPR
);
3467 _bfd_vms_output_dump (recwr
,
3468 (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
3470 _bfd_vms_output_end (abfd
, recwr
);
3475 /* Part 4.6, relocations. */
3478 /* WRITE ETIR SECTION
3480 This is still under construction and therefore not documented. */
3482 /* Close the etir/etbt record. */
3485 end_etir_record (bfd
* abfd
)
3487 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3489 _bfd_vms_output_end (abfd
, recwr
);
3493 start_etir_or_etbt_record (bfd
*abfd
, asection
*section
, bfd_vma offset
)
3495 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3497 if (section
->name
[0] == '.' && section
->name
[1] == 'v'
3498 && !strcmp (section
->name
, ".vmsdebug"))
3500 _bfd_vms_output_begin (recwr
, EOBJ__C_ETBT
);
3504 /* Push start offset. */
3505 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
3506 _bfd_vms_output_long (recwr
, (unsigned long) 0);
3507 _bfd_vms_output_end_subrec (recwr
);
3510 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_DFLOC
);
3511 _bfd_vms_output_end_subrec (recwr
);
3516 _bfd_vms_output_begin (recwr
, EOBJ__C_ETIR
);
3520 /* Push start offset. */
3521 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
3522 _bfd_vms_output_long (recwr
, (unsigned long) section
->index
);
3523 _bfd_vms_output_quad (recwr
, offset
);
3524 _bfd_vms_output_end_subrec (recwr
);
3526 /* Start = pop (). */
3527 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_SETRB
);
3528 _bfd_vms_output_end_subrec (recwr
);
3533 /* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
3534 address VADDR in section specified by SEC_INDEX and NAME. */
3537 sto_imm (bfd
*abfd
, asection
*section
,
3538 bfd_size_type ssize
, unsigned char *cptr
, bfd_vma vaddr
)
3541 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3544 _bfd_vms_debug (8, "sto_imm %d bytes\n", (int) ssize
);
3545 _bfd_hexdump (9, cptr
, (int) ssize
, (int) vaddr
);
3550 /* Try all the rest. */
3553 if (_bfd_vms_output_check (recwr
, size
) < 0)
3555 /* Doesn't fit, split ! */
3556 end_etir_record (abfd
);
3558 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3560 size
= _bfd_vms_output_check (recwr
, 0); /* get max size */
3561 if (size
> ssize
) /* more than what's left ? */
3565 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_IMM
);
3566 _bfd_vms_output_long (recwr
, (unsigned long) (size
));
3567 _bfd_vms_output_dump (recwr
, cptr
, size
);
3568 _bfd_vms_output_end_subrec (recwr
);
3571 _bfd_vms_debug (10, "dumped %d bytes\n", (int) size
);
3572 _bfd_hexdump (10, cptr
, (int) size
, (int) vaddr
);
3582 etir_output_check (bfd
*abfd
, asection
*section
, bfd_vma vaddr
, int checklen
)
3584 if (_bfd_vms_output_check (&PRIV (recwr
), checklen
) < 0)
3586 /* Not enough room in this record. Close it and open a new one. */
3587 end_etir_record (abfd
);
3588 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3592 /* Return whether RELOC must be deferred till the end. */
3595 defer_reloc_p (arelent
*reloc
)
3597 switch (reloc
->howto
->type
)
3610 /* Write section contents for bfd abfd. Return FALSE on error. */
3613 _bfd_vms_write_etir (bfd
* abfd
, int objtype ATTRIBUTE_UNUSED
)
3616 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3618 vms_debug2 ((2, "vms_write_tir (%p, %d)\n", abfd
, objtype
));
3620 _bfd_vms_output_alignment (recwr
, 4);
3622 PRIV (vms_linkage_index
) = 1;
3624 for (section
= abfd
->sections
; section
; section
= section
->next
)
3626 vms_debug2 ((4, "writing %d. section '%s' (%d bytes)\n",
3627 section
->index
, section
->name
, (int) (section
->size
)));
3629 if (!(section
->flags
& SEC_HAS_CONTENTS
)
3630 || bfd_is_com_section (section
))
3633 if (!section
->contents
)
3635 bfd_set_error (bfd_error_no_contents
);
3639 start_etir_or_etbt_record (abfd
, section
, 0);
3641 if (section
->flags
& SEC_RELOC
)
3643 bfd_vma curr_addr
= 0;
3644 unsigned char *curr_data
= section
->contents
;
3646 int pass2_needed
= 0;
3647 int pass2_in_progress
= 0;
3650 if (section
->reloc_count
<= 0)
3651 (*_bfd_error_handler
)
3652 (_("SEC_RELOC with no relocs in section %s"), section
->name
);
3657 int i
= section
->reloc_count
;
3658 arelent
**rptr
= section
->orelocation
;
3659 _bfd_vms_debug (4, "%d relocations:\n", i
);
3662 _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, "
3663 "addr %08lx, off %08lx, len %d: %s\n",
3664 (*(*rptr
)->sym_ptr_ptr
)->name
,
3665 (*(*rptr
)->sym_ptr_ptr
)->section
->name
,
3666 (long) (*(*rptr
)->sym_ptr_ptr
)->value
,
3667 (unsigned long)(*rptr
)->address
,
3668 (unsigned long)(*rptr
)->addend
,
3669 bfd_get_reloc_size ((*rptr
)->howto
),
3670 ( *rptr
)->howto
->name
);
3677 for (irel
= 0; irel
< section
->reloc_count
; irel
++)
3679 struct evax_private_udata_struct
*udata
;
3680 arelent
*rptr
= section
->orelocation
[irel
];
3681 bfd_vma addr
= rptr
->address
;
3682 asymbol
*sym
= *rptr
->sym_ptr_ptr
;
3683 asection
*sec
= sym
->section
;
3684 bfd_boolean defer
= defer_reloc_p (rptr
);
3688 if (pass2_in_progress
)
3690 /* Non-deferred relocs have already been output. */
3696 /* Deferred relocs must be output at the very end. */
3703 /* Regular relocs are intertwined with binary data. */
3704 if (curr_addr
> addr
)
3705 (*_bfd_error_handler
) (_("Size error in section %s"),
3707 size
= addr
- curr_addr
;
3708 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
3713 size
= bfd_get_reloc_size (rptr
->howto
);
3715 switch (rptr
->howto
->type
)
3717 case ALPHA_R_IGNORE
:
3720 case ALPHA_R_REFLONG
:
3721 if (bfd_is_und_section (sym
->section
))
3723 bfd_vma addend
= rptr
->addend
;
3724 slen
= strlen ((char *) sym
->name
);
3725 hash
= _bfd_vms_length_hash_symbol
3726 (abfd
, sym
->name
, EOBJ__C_SYMSIZ
);
3727 etir_output_check (abfd
, section
, curr_addr
, slen
);
3730 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
3731 _bfd_vms_output_counted (recwr
, hash
);
3732 _bfd_vms_output_end_subrec (recwr
);
3733 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
3734 _bfd_vms_output_long (recwr
, (unsigned long) addend
);
3735 _bfd_vms_output_end_subrec (recwr
);
3736 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
3737 _bfd_vms_output_end_subrec (recwr
);
3738 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
3739 _bfd_vms_output_end_subrec (recwr
);
3743 _bfd_vms_output_begin_subrec
3744 (recwr
, ETIR__C_STO_GBL_LW
);
3745 _bfd_vms_output_counted (recwr
, hash
);
3746 _bfd_vms_output_end_subrec (recwr
);
3749 else if (bfd_is_abs_section (sym
->section
))
3751 etir_output_check (abfd
, section
, curr_addr
, 16);
3752 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
3753 _bfd_vms_output_long (recwr
, (unsigned long) sym
->value
);
3754 _bfd_vms_output_end_subrec (recwr
);
3755 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
3756 _bfd_vms_output_end_subrec (recwr
);
3760 etir_output_check (abfd
, section
, curr_addr
, 32);
3761 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
3762 _bfd_vms_output_long (recwr
, (unsigned long) sec
->index
);
3763 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
3764 _bfd_vms_output_end_subrec (recwr
);
3765 /* ??? Table B-8 of the OpenVMS Linker Utilily Manual
3766 says that we should have a ETIR__C_STO_OFF here.
3767 But the relocation would not be BFD_RELOC_32 then.
3768 This case is very likely unreachable. */
3769 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
3770 _bfd_vms_output_end_subrec (recwr
);
3774 case ALPHA_R_REFQUAD
:
3775 if (bfd_is_und_section (sym
->section
))
3777 bfd_vma addend
= rptr
->addend
;
3778 slen
= strlen ((char *) sym
->name
);
3779 hash
= _bfd_vms_length_hash_symbol
3780 (abfd
, sym
->name
, EOBJ__C_SYMSIZ
);
3781 etir_output_check (abfd
, section
, curr_addr
, slen
);
3784 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
3785 _bfd_vms_output_counted (recwr
, hash
);
3786 _bfd_vms_output_end_subrec (recwr
);
3787 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
3788 _bfd_vms_output_quad (recwr
, addend
);
3789 _bfd_vms_output_end_subrec (recwr
);
3790 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
3791 _bfd_vms_output_end_subrec (recwr
);
3792 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
3793 _bfd_vms_output_end_subrec (recwr
);
3797 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_GBL
);
3798 _bfd_vms_output_counted (recwr
, hash
);
3799 _bfd_vms_output_end_subrec (recwr
);
3802 else if (bfd_is_abs_section (sym
->section
))
3804 etir_output_check (abfd
, section
, curr_addr
, 16);
3805 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
3806 _bfd_vms_output_quad (recwr
, sym
->value
);
3807 _bfd_vms_output_end_subrec (recwr
);
3808 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
3809 _bfd_vms_output_end_subrec (recwr
);
3813 etir_output_check (abfd
, section
, curr_addr
, 32);
3814 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
3815 _bfd_vms_output_long (recwr
, (unsigned long) sec
->index
);
3816 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
3817 _bfd_vms_output_end_subrec (recwr
);
3818 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_OFF
);
3819 _bfd_vms_output_end_subrec (recwr
);
3824 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
3827 case ALPHA_R_LINKAGE
:
3828 etir_output_check (abfd
, section
, curr_addr
, 64);
3829 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LP_PSB
);
3830 _bfd_vms_output_long
3831 (recwr
, (unsigned long) PRIV (vms_linkage_index
));
3832 PRIV (vms_linkage_index
) += 2;
3833 hash
= _bfd_vms_length_hash_symbol
3834 (abfd
, sym
->name
, EOBJ__C_SYMSIZ
);
3835 _bfd_vms_output_counted (recwr
, hash
);
3836 _bfd_vms_output_byte (recwr
, 0);
3837 _bfd_vms_output_end_subrec (recwr
);
3840 case ALPHA_R_CODEADDR
:
3841 slen
= strlen ((char *) sym
->name
);
3842 hash
= _bfd_vms_length_hash_symbol
3843 (abfd
, sym
->name
, EOBJ__C_SYMSIZ
);
3844 etir_output_check (abfd
, section
, curr_addr
, slen
);
3845 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_CA
);
3846 _bfd_vms_output_counted (recwr
, hash
);
3847 _bfd_vms_output_end_subrec (recwr
);
3852 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
3853 etir_output_check (abfd
, section
, curr_addr
,
3854 32 + 1 + strlen (udata
->origname
));
3855 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_NOP_GBL
);
3856 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
3857 _bfd_vms_output_long
3858 (recwr
, (unsigned long) udata
->enbsym
->section
->index
);
3859 _bfd_vms_output_quad (recwr
, rptr
->address
);
3860 _bfd_vms_output_long (recwr
, (unsigned long) 0x47ff041f);
3861 _bfd_vms_output_long
3862 (recwr
, (unsigned long) udata
->enbsym
->section
->index
);
3863 _bfd_vms_output_quad (recwr
, rptr
->addend
);
3864 _bfd_vms_output_counted
3865 (recwr
, _bfd_vms_length_hash_symbol
3866 (abfd
, udata
->origname
, EOBJ__C_SYMSIZ
));
3867 _bfd_vms_output_end_subrec (recwr
);
3871 (*_bfd_error_handler
) (_("Spurious ALPHA_R_BSR reloc"));
3876 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
3877 etir_output_check (abfd
, section
, curr_addr
,
3878 32 + 1 + strlen (udata
->origname
));
3879 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LDA_GBL
);
3880 _bfd_vms_output_long
3881 (recwr
, (unsigned long) udata
->lkindex
+ 1);
3882 _bfd_vms_output_long
3883 (recwr
, (unsigned long) udata
->enbsym
->section
->index
);
3884 _bfd_vms_output_quad (recwr
, rptr
->address
);
3885 _bfd_vms_output_long (recwr
, (unsigned long) 0x237B0000);
3886 _bfd_vms_output_long
3887 (recwr
, (unsigned long) udata
->bsym
->section
->index
);
3888 _bfd_vms_output_quad (recwr
, rptr
->addend
);
3889 _bfd_vms_output_counted
3890 (recwr
, _bfd_vms_length_hash_symbol
3891 (abfd
, udata
->origname
, EOBJ__C_SYMSIZ
));
3892 _bfd_vms_output_end_subrec (recwr
);
3897 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
3898 etir_output_check (abfd
, section
, curr_addr
,
3899 32 + 1 + strlen (udata
->origname
));
3900 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_BOH_GBL
);
3901 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
3902 _bfd_vms_output_long
3903 (recwr
, (unsigned long) udata
->enbsym
->section
->index
);
3904 _bfd_vms_output_quad (recwr
, rptr
->address
);
3905 _bfd_vms_output_long (recwr
, (unsigned long) 0xD3400000);
3906 _bfd_vms_output_long
3907 (recwr
, (unsigned long) udata
->enbsym
->section
->index
);
3908 _bfd_vms_output_quad (recwr
, rptr
->addend
);
3909 _bfd_vms_output_counted
3910 (recwr
, _bfd_vms_length_hash_symbol
3911 (abfd
, udata
->origname
, EOBJ__C_SYMSIZ
));
3912 _bfd_vms_output_end_subrec (recwr
);
3916 (*_bfd_error_handler
) (_("Unhandled relocation %s"),
3923 } /* End of relocs loop. */
3925 if (!pass2_in_progress
)
3927 /* Output rest of section. */
3928 if (curr_addr
> section
->size
)
3929 (*_bfd_error_handler
) (_("Size error in section %s"),
3931 size
= section
->size
- curr_addr
;
3932 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
3938 pass2_in_progress
= 1;
3944 else /* (section->flags & SEC_RELOC) */
3945 sto_imm (abfd
, section
, section
->size
, section
->contents
, 0);
3947 end_etir_record (abfd
);
3950 _bfd_vms_output_alignment (recwr
, 2);
3954 /* Write cached information into a file being written, at bfd_close. */
3957 alpha_vms_write_object_contents (bfd
*abfd
)
3959 vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd
));
3961 if (abfd
->flags
& (EXEC_P
| DYNAMIC
))
3963 return alpha_vms_write_exec (abfd
);
3967 if (abfd
->section_count
> 0) /* we have sections */
3969 if (_bfd_vms_write_ehdr (abfd
) != TRUE
)
3971 if (_bfd_vms_write_egsd (abfd
) != TRUE
)
3973 if (_bfd_vms_write_etir (abfd
, EOBJ__C_ETIR
) != TRUE
)
3975 if (_bfd_vms_write_eeom (abfd
) != TRUE
)
3982 /* Debug stuff: nearest line. */
3984 #define SET_MODULE_PARSED(m) \
3985 do { if ((m)->name == NULL) (m)->name = ""; } while (0)
3986 #define IS_MODULE_PARSED(m) ((m)->name != NULL)
3988 /* Build a new module for the specified BFD. */
3990 static struct module
*
3991 new_module (bfd
*abfd
)
3993 struct module
*module
3994 = (struct module
*) bfd_zalloc (abfd
, sizeof (struct module
));
3995 module
->file_table_count
= 16; /* Arbitrary. */
3997 = bfd_malloc (module
->file_table_count
* sizeof (struct fileinfo
));
4001 /* Parse debug info for a module and internalize it. */
4004 parse_module (bfd
*abfd
, struct module
*module
, unsigned char *ptr
,
4007 unsigned char *maxptr
= ptr
+ length
;
4008 unsigned char *src_ptr
, *pcl_ptr
;
4009 unsigned int prev_linum
= 0, curr_linenum
= 0;
4010 bfd_vma prev_pc
= 0, curr_pc
= 0;
4011 struct srecinfo
*curr_srec
, *srec
;
4012 struct lineinfo
*curr_line
, *line
;
4013 struct funcinfo
*funcinfo
;
4015 /* Initialize tables with zero element. */
4016 curr_srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4017 module
->srec_table
= curr_srec
;
4019 curr_line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4020 module
->line_table
= curr_line
;
4022 while (length
== -1 || ptr
< maxptr
)
4024 /* The first byte is not counted in the recorded length. */
4025 int rec_length
= bfd_getl16 (ptr
) + 1;
4026 int rec_type
= bfd_getl16 (ptr
+ 2);
4028 vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length
, rec_type
));
4030 if (length
== -1 && rec_type
== DST__K_MODEND
)
4037 = _bfd_vms_save_counted_string (ptr
+ DST_S_B_MODBEG_NAME
);
4044 vms_debug2 ((3, "module: %s\n", module
->name
));
4051 funcinfo
= (struct funcinfo
*)
4052 bfd_zalloc (abfd
, sizeof (struct funcinfo
));
4054 = _bfd_vms_save_counted_string (ptr
+ DST_S_B_RTNBEG_NAME
);
4055 funcinfo
->low
= bfd_getl32 (ptr
+ DST_S_L_RTNBEG_ADDRESS
);
4056 funcinfo
->next
= module
->func_table
;
4057 module
->func_table
= funcinfo
;
4059 vms_debug2 ((3, "routine: %s at 0x%lx\n",
4060 funcinfo
->name
, (unsigned long) funcinfo
->low
));
4064 module
->func_table
->high
= module
->func_table
->low
4065 + bfd_getl32 (ptr
+ DST_S_L_RTNEND_SIZE
) - 1;
4067 if (module
->func_table
->high
> module
->high
)
4068 module
->high
= module
->func_table
->high
;
4070 vms_debug2 ((3, "end routine\n"));
4074 vms_debug2 ((3, "prologue\n"));
4078 vms_debug2 ((3, "epilog\n"));
4082 vms_debug2 ((3, "block\n"));
4086 vms_debug2 ((3, "end block\n"));
4090 src_ptr
= ptr
+ DST_S_C_SOURCE_HEADER_SIZE
;
4092 vms_debug2 ((3, "source info\n"));
4094 while (src_ptr
< ptr
+ rec_length
)
4096 int cmd
= src_ptr
[0], cmd_length
, data
;
4100 case DST__K_SRC_DECLFILE
:
4103 = bfd_getl16 (src_ptr
+ DST_S_W_SRC_DF_FILEID
);
4105 = _bfd_vms_save_counted_string (src_ptr
4106 + DST_S_B_SRC_DF_FILENAME
);
4108 while (fileid
>= module
->file_table_count
)
4110 module
->file_table_count
*= 2;
4112 = bfd_realloc (module
->file_table
,
4113 module
->file_table_count
4114 * sizeof (struct fileinfo
));
4117 module
->file_table
[fileid
].name
= filename
;
4118 module
->file_table
[fileid
].srec
= 1;
4119 cmd_length
= src_ptr
[DST_S_B_SRC_DF_LENGTH
] + 2;
4120 vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4121 fileid
, module
->file_table
[fileid
].name
));
4125 case DST__K_SRC_DEFLINES_B
:
4126 /* Perform the association and set the next higher index
4128 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4129 srec
= (struct srecinfo
*)
4130 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4131 srec
->line
= curr_srec
->line
+ data
;
4132 srec
->srec
= curr_srec
->srec
+ data
;
4133 srec
->sfile
= curr_srec
->sfile
;
4134 curr_srec
->next
= srec
;
4137 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data
));
4140 case DST__K_SRC_DEFLINES_W
:
4141 /* Perform the association and set the next higher index
4143 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4144 srec
= (struct srecinfo
*)
4145 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4146 srec
->line
= curr_srec
->line
+ data
;
4147 srec
->srec
= curr_srec
->srec
+ data
,
4148 srec
->sfile
= curr_srec
->sfile
;
4149 curr_srec
->next
= srec
;
4152 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data
));
4155 case DST__K_SRC_INCRLNUM_B
:
4156 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4157 curr_srec
->line
+= data
;
4159 vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data
));
4162 case DST__K_SRC_SETFILE
:
4163 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4164 curr_srec
->sfile
= data
;
4165 curr_srec
->srec
= module
->file_table
[data
].srec
;
4167 vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data
));
4170 case DST__K_SRC_SETLNUM_L
:
4171 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4172 curr_srec
->line
= data
;
4174 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data
));
4177 case DST__K_SRC_SETLNUM_W
:
4178 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4179 curr_srec
->line
= data
;
4181 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data
));
4184 case DST__K_SRC_SETREC_L
:
4185 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4186 curr_srec
->srec
= data
;
4187 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4189 vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data
));
4192 case DST__K_SRC_SETREC_W
:
4193 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4194 curr_srec
->srec
= data
;
4195 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4197 vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data
));
4200 case DST__K_SRC_FORMFEED
:
4202 vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4206 (*_bfd_error_handler
) (_("unknown source command %d"),
4212 src_ptr
+= cmd_length
;
4216 case DST__K_LINE_NUM
:
4217 pcl_ptr
= ptr
+ DST_S_C_LINE_NUM_HEADER_SIZE
;
4219 vms_debug2 ((3, "line info\n"));
4221 while (pcl_ptr
< ptr
+ rec_length
)
4223 /* The command byte is signed so we must sign-extend it. */
4224 int cmd
= ((signed char *)pcl_ptr
)[0], cmd_length
, data
;
4228 case DST__K_DELTA_PC_W
:
4229 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4233 vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data
));
4236 case DST__K_DELTA_PC_L
:
4237 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4241 vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data
));
4244 case DST__K_INCR_LINUM
:
4245 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4246 curr_linenum
+= data
;
4248 vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data
));
4251 case DST__K_INCR_LINUM_W
:
4252 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4253 curr_linenum
+= data
;
4255 vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data
));
4258 case DST__K_INCR_LINUM_L
:
4259 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4260 curr_linenum
+= data
;
4262 vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data
));
4265 case DST__K_SET_LINUM_INCR
:
4266 (*_bfd_error_handler
)
4267 (_("DST__K_SET_LINUM_INCR not implemented"));
4271 case DST__K_SET_LINUM_INCR_W
:
4272 (*_bfd_error_handler
)
4273 (_("DST__K_SET_LINUM_INCR_W not implemented"));
4277 case DST__K_RESET_LINUM_INCR
:
4278 (*_bfd_error_handler
)
4279 (_("DST__K_RESET_LINUM_INCR not implemented"));
4283 case DST__K_BEG_STMT_MODE
:
4284 (*_bfd_error_handler
)
4285 (_("DST__K_BEG_STMT_MODE not implemented"));
4289 case DST__K_END_STMT_MODE
:
4290 (*_bfd_error_handler
)
4291 (_("DST__K_END_STMT_MODE not implemented"));
4295 case DST__K_SET_LINUM_B
:
4296 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4297 curr_linenum
= data
;
4299 vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data
));
4302 case DST__K_SET_LINUM
:
4303 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4304 curr_linenum
= data
;
4306 vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data
));
4309 case DST__K_SET_LINUM_L
:
4310 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4311 curr_linenum
= data
;
4313 vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data
));
4317 (*_bfd_error_handler
)
4318 (_("DST__K_SET_PC not implemented"));
4322 case DST__K_SET_PC_W
:
4323 (*_bfd_error_handler
)
4324 (_("DST__K_SET_PC_W not implemented"));
4328 case DST__K_SET_PC_L
:
4329 (*_bfd_error_handler
)
4330 (_("DST__K_SET_PC_L not implemented"));
4334 case DST__K_SET_STMTNUM
:
4335 (*_bfd_error_handler
)
4336 (_("DST__K_SET_STMTNUM not implemented"));
4341 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4344 vms_debug2 ((4, "DST__K_TERM: %d\n", data
));
4348 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4351 vms_debug2 ((4, "DST__K_TERM_W: %d\n", data
));
4355 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4358 vms_debug2 ((4, "DST__K_TERM_L: %d\n", data
));
4361 case DST__K_SET_ABS_PC
:
4362 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4365 vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data
));
4374 vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4375 (unsigned long)curr_pc
, curr_linenum
));
4379 (*_bfd_error_handler
) (_("unknown line command %d"),
4386 if ((curr_linenum
!= prev_linum
&& curr_pc
!= prev_pc
)
4388 || cmd
== DST__K_DELTA_PC_L
4389 || cmd
== DST__K_DELTA_PC_W
)
4391 line
= (struct lineinfo
*)
4392 bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4393 line
->address
= curr_pc
;
4394 line
->line
= curr_linenum
;
4396 curr_line
->next
= line
;
4399 prev_linum
= curr_linenum
;
4401 vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4402 (unsigned long)curr_pc
, curr_linenum
));
4405 pcl_ptr
+= cmd_length
;
4409 case 0x17: /* Undocumented type used by DEC C to declare equates. */
4410 vms_debug2 ((3, "undocumented type 0x17\n"));
4414 vms_debug2 ((3, "ignoring record\n"));
4422 /* Finalize tables with EOL marker. */
4423 srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4424 srec
->line
= (unsigned int) -1;
4425 srec
->srec
= (unsigned int) -1;
4426 curr_srec
->next
= srec
;
4428 line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4429 line
->line
= (unsigned int) -1;
4430 line
->address
= (bfd_vma
) -1;
4431 curr_line
->next
= line
;
4433 /* Advertise that this module has been parsed. This is needed
4434 because parsing can be either performed at module creation
4435 or deferred until debug info is consumed. */
4436 SET_MODULE_PARSED (module
);
4439 /* Build the list of modules for the specified BFD. */
4441 static struct module
*
4442 build_module_list (bfd
*abfd
)
4444 struct module
*module
, *list
= NULL
;
4447 if ((dmt
= bfd_get_section_by_name (abfd
, "$DMT$")))
4449 /* We have a DMT section so this must be an image. Parse the
4450 section and build the list of modules. This is sufficient
4451 since we can compute the start address and the end address
4452 of every module from the section contents. */
4453 bfd_size_type size
= bfd_get_section_size (dmt
);
4454 unsigned char *ptr
, *end
;
4456 ptr
= (unsigned char *) bfd_alloc (abfd
, size
);
4460 if (! bfd_get_section_contents (abfd
, dmt
, ptr
, 0, size
))
4463 vms_debug2 ((2, "DMT\n"));
4469 /* Each header declares a module with its start offset and size
4470 of debug info in the DST section, as well as the count of
4471 program sections (i.e. address spans) it contains. */
4472 int modbeg
= bfd_getl32 (ptr
+ DBG_S_L_DMT_MODBEG
);
4473 int msize
= bfd_getl32 (ptr
+ DBG_S_L_DST_SIZE
);
4474 int count
= bfd_getl16 (ptr
+ DBG_S_W_DMT_PSECT_COUNT
);
4475 ptr
+= DBG_S_C_DMT_HEADER_SIZE
;
4477 vms_debug2 ((3, "module: modbeg = %d, size = %d, count = %d\n",
4478 modbeg
, msize
, count
));
4480 /* We create a 'module' structure for each program section since
4481 we only support contiguous addresses in a 'module' structure.
4482 As a consequence, the actual debug info in the DST section is
4483 shared and can be parsed multiple times; that doesn't seem to
4484 cause problems in practice. */
4487 int start
= bfd_getl32 (ptr
+ DBG_S_L_DMT_PSECT_START
);
4488 int length
= bfd_getl32 (ptr
+ DBG_S_L_DMT_PSECT_LENGTH
);
4489 module
= new_module (abfd
);
4490 module
->modbeg
= modbeg
;
4491 module
->size
= msize
;
4492 module
->low
= start
;
4493 module
->high
= start
+ length
;
4494 module
->next
= list
;
4496 ptr
+= DBG_S_C_DMT_PSECT_SIZE
;
4498 vms_debug2 ((4, "section: start = 0x%x, length = %d\n",
4505 /* We don't have a DMT section so this must be an object. Parse
4506 the module right now in order to compute its start address and
4508 module
= new_module (abfd
);
4509 parse_module (abfd
, module
, PRIV (dst_section
)->contents
, -1);
4516 /* Calculate and return the name of the source file and the line nearest
4517 to the wanted location in the specified module. */
4520 module_find_nearest_line (bfd
*abfd
, struct module
*module
, bfd_vma addr
,
4521 const char **file
, const char **func
,
4524 struct funcinfo
*funcinfo
;
4525 struct lineinfo
*lineinfo
;
4526 struct srecinfo
*srecinfo
;
4527 bfd_boolean ret
= FALSE
;
4529 /* Parse this module if that was not done at module creation. */
4530 if (! IS_MODULE_PARSED (module
))
4532 unsigned int size
= module
->size
;
4533 unsigned int modbeg
= PRIV (dst_section
)->filepos
+ module
->modbeg
;
4534 unsigned char *buffer
= (unsigned char *) bfd_malloc (module
->size
);
4536 if (bfd_seek (abfd
, modbeg
, SEEK_SET
) != 0
4537 || bfd_bread (buffer
, size
, abfd
) != size
)
4539 bfd_set_error (bfd_error_no_debug_section
);
4543 parse_module (abfd
, module
, buffer
, size
);
4547 /* Find out the function (if any) that contains the address. */
4548 for (funcinfo
= module
->func_table
; funcinfo
; funcinfo
= funcinfo
->next
)
4549 if (addr
>= funcinfo
->low
&& addr
<= funcinfo
->high
)
4551 *func
= funcinfo
->name
;
4556 /* Find out the source file and the line nearest to the address. */
4557 for (lineinfo
= module
->line_table
; lineinfo
; lineinfo
= lineinfo
->next
)
4558 if (lineinfo
->next
&& addr
< lineinfo
->next
->address
)
4560 for (srecinfo
= module
->srec_table
; srecinfo
; srecinfo
= srecinfo
->next
)
4561 if (srecinfo
->next
&& lineinfo
->line
< srecinfo
->next
->line
)
4563 if (srecinfo
->sfile
> 0)
4565 *file
= module
->file_table
[srecinfo
->sfile
].name
;
4566 *line
= srecinfo
->srec
+ lineinfo
->line
- srecinfo
->line
;
4570 *file
= module
->name
;
4571 *line
= lineinfo
->line
;
4582 /* Provided a BFD, a section and an offset into the section, calculate and
4583 return the name of the source file and the line nearest to the wanted
4587 _bfd_vms_find_nearest_dst_line (bfd
*abfd
, asection
*section
,
4588 asymbol
**symbols ATTRIBUTE_UNUSED
,
4589 bfd_vma offset
, const char **file
,
4590 const char **func
, unsigned int *line
)
4592 struct module
*module
;
4594 /* What address are we looking for? */
4595 bfd_vma addr
= section
->vma
+ offset
;
4601 if (PRIV (dst_section
) == NULL
|| !(abfd
->flags
& (EXEC_P
| DYNAMIC
)))
4604 if (PRIV (modules
) == NULL
)
4606 PRIV (modules
) = build_module_list (abfd
);
4607 if (PRIV (modules
) == NULL
)
4611 for (module
= PRIV (modules
); module
; module
= module
->next
)
4612 if (addr
>= module
->low
&& addr
<= module
->high
)
4613 return module_find_nearest_line (abfd
, module
, addr
, file
, func
, line
);
4618 /* Canonicalizations. */
4619 /* Set name, value, section and flags of SYM from E. */
4622 alpha_vms_convert_symbol (bfd
*abfd
, struct vms_symbol_entry
*e
, asymbol
*sym
)
4631 flags
= BSF_NO_FLAGS
;
4637 if (e
->flags
& EGSY__V_WEAK
)
4640 if (e
->flags
& EGSY__V_DEF
)
4642 /* Symbol definition. */
4643 flags
|= BSF_GLOBAL
;
4644 if (e
->flags
& EGSY__V_NORM
)
4645 flags
|= BSF_FUNCTION
;
4647 sec
= PRIV (sections
)[e
->section
];
4651 /* Symbol reference. */
4652 sec
= bfd_und_section_ptr
;
4657 /* A universal symbol is by definition global... */
4658 flags
|= BSF_GLOBAL
;
4660 /* ...and dynamic in shared libraries. */
4661 if (abfd
->flags
& DYNAMIC
)
4662 flags
|= BSF_DYNAMIC
;
4664 if (e
->flags
& EGSY__V_WEAK
)
4667 if (!(e
->flags
& EGSY__V_DEF
))
4670 if (e
->flags
& EGSY__V_NORM
)
4671 flags
|= BSF_FUNCTION
;
4673 value
= e
->symbol_vector
;
4675 /* Adding this offset is necessary in order for GDB to
4676 read the DWARF-2 debug info from shared libraries. */
4677 if ((abfd
->flags
& DYNAMIC
) && strstr (name
, "$DWARF2.DEBUG") != 0)
4678 value
+= PRIV (symvva
);
4680 sec
= bfd_abs_section_ptr
;
4682 /* Find containing section. */
4687 for (s
= abfd
->sections
; s
; s
= s
->next
)
4691 && !(s
->flags
& SEC_COFF_SHARED_LIBRARY
)
4692 && (s
->size
> 0 || !(e
->flags
& EGSY__V_REL
)))
4715 /* Return the number of bytes required to store a vector of pointers
4716 to asymbols for all the symbols in the BFD abfd, including a
4717 terminal NULL pointer. If there are no symbols in the BFD,
4718 then return 0. If an error occurs, return -1. */
4721 alpha_vms_get_symtab_upper_bound (bfd
*abfd
)
4723 vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
4724 abfd
, PRIV (gsd_sym_count
)));
4726 return (PRIV (gsd_sym_count
) + 1) * sizeof (asymbol
*);
4729 /* Read the symbols from the BFD abfd, and fills in the vector
4730 location with pointers to the symbols and a trailing NULL.
4732 Return number of symbols read. */
4735 alpha_vms_canonicalize_symtab (bfd
*abfd
, asymbol
**symbols
)
4739 vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd
));
4741 if (PRIV (csymbols
) == NULL
)
4743 PRIV (csymbols
) = (asymbol
**) bfd_alloc
4744 (abfd
, PRIV (gsd_sym_count
) * sizeof (asymbol
*));
4746 /* Traverse table and fill symbols vector. */
4747 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
4749 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
4752 sym
= bfd_make_empty_symbol (abfd
);
4753 if (sym
== NULL
|| !alpha_vms_convert_symbol (abfd
, e
, sym
))
4755 bfd_release (abfd
, PRIV (csymbols
));
4756 PRIV (csymbols
) = NULL
;
4760 PRIV (csymbols
)[i
] = sym
;
4764 if (symbols
!= NULL
)
4766 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
4767 symbols
[i
] = PRIV (csymbols
)[i
];
4771 return PRIV (gsd_sym_count
);
4774 /* Read and convert relocations from ETIR. We do it once for all sections. */
4777 alpha_vms_slurp_relocs (bfd
*abfd
)
4781 vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
4783 /* We slurp relocs only once, for all sections. */
4784 if (PRIV (reloc_done
))
4786 PRIV (reloc_done
) = TRUE
;
4788 if (alpha_vms_canonicalize_symtab (abfd
, NULL
) < 0)
4791 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
4796 unsigned char *begin
;
4799 bfd_reloc_code_real_type reloc_code
;
4805 bfd_vma cur_address
;
4807 unsigned char *cur_sym
= NULL
;
4809 bfd_vma cur_addend
= 0;
4811 /* Skip non-ETIR records. */
4812 type
= _bfd_vms_get_object_record (abfd
);
4813 if (type
== EOBJ__C_EEOM
)
4815 if (type
!= EOBJ__C_ETIR
)
4818 begin
= PRIV (recrd
.rec
) + 4;
4819 end
= PRIV (recrd
.rec
) + PRIV (recrd
.rec_size
);
4821 for (ptr
= begin
; ptr
< end
; ptr
+= length
)
4825 cmd
= bfd_getl16 (ptr
);
4826 length
= bfd_getl16 (ptr
+ 2);
4828 cur_address
= vaddr
;
4830 vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
4831 _bfd_vms_etir_name (cmd
)));
4835 case ETIR__C_STA_GBL
: /* ALPHA_R_REFLONG und_section, step 1 */
4836 /* ALPHA_R_REFQUAD und_section, step 1 */
4841 case ETIR__C_STA_PQ
: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
4842 cur_psidx
= bfd_getl32 (ptr
+ 4);
4843 cur_addend
= bfd_getl64 (ptr
+ 8);
4847 case ETIR__C_CTL_SETRB
:
4848 if (prev_cmd
!= ETIR__C_STA_PQ
)
4850 (*_bfd_error_handler
)
4851 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd
),
4852 _bfd_vms_etir_name (cmd
));
4855 cur_psect
= cur_psidx
;
4861 case ETIR__C_STA_LW
: /* ALPHA_R_REFLONG abs_section, step 1 */
4862 /* ALPHA_R_REFLONG und_section, step 2 */
4865 if (prev_cmd
!= ETIR__C_STA_GBL
)
4867 (*_bfd_error_handler
)
4868 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
4869 _bfd_vms_etir_name (ETIR__C_STA_LW
));
4873 cur_addend
= bfd_getl32 (ptr
+ 4);
4877 case ETIR__C_STA_QW
: /* ALPHA_R_REFQUAD abs_section, step 1 */
4878 /* ALPHA_R_REFQUAD und_section, step 2 */
4879 if (prev_cmd
!= -1 && prev_cmd
!= ETIR__C_STA_GBL
)
4881 (*_bfd_error_handler
)
4882 (_("Unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
4883 _bfd_vms_etir_name (ETIR__C_STA_QW
));
4886 cur_addend
= bfd_getl64 (ptr
+ 4);
4890 case ETIR__C_STO_LW
: /* ALPHA_R_REFLONG und_section, step 4 */
4891 /* ALPHA_R_REFLONG abs_section, step 2 */
4892 /* ALPHA_R_REFLONG others, step 2 */
4893 if (prev_cmd
!= ETIR__C_OPR_ADD
4894 && prev_cmd
!= ETIR__C_STA_LW
4895 && prev_cmd
!= ETIR__C_STA_PQ
)
4897 (*_bfd_error_handler
) (_("Unknown reloc %s + %s"),
4898 _bfd_vms_etir_name (prev_cmd
),
4899 _bfd_vms_etir_name (ETIR__C_STO_LW
));
4902 reloc_code
= BFD_RELOC_32
;
4905 case ETIR__C_STO_QW
: /* ALPHA_R_REFQUAD und_section, step 4 */
4906 /* ALPHA_R_REFQUAD abs_section, step 2 */
4907 if (prev_cmd
!= ETIR__C_OPR_ADD
&& prev_cmd
!= ETIR__C_STA_QW
)
4909 (*_bfd_error_handler
) (_("Unknown reloc %s + %s"),
4910 _bfd_vms_etir_name (prev_cmd
),
4911 _bfd_vms_etir_name (ETIR__C_STO_QW
));
4914 reloc_code
= BFD_RELOC_64
;
4917 case ETIR__C_STO_OFF
: /* ALPHA_R_REFQUAD others, step 2 */
4918 if (prev_cmd
!= ETIR__C_STA_PQ
)
4920 (*_bfd_error_handler
) (_("Unknown reloc %s + %s"),
4921 _bfd_vms_etir_name (prev_cmd
),
4922 _bfd_vms_etir_name (ETIR__C_STO_OFF
));
4925 reloc_code
= BFD_RELOC_64
;
4928 case ETIR__C_OPR_ADD
: /* ALPHA_R_REFLONG und_section, step 3 */
4929 /* ALPHA_R_REFQUAD und_section, step 3 */
4930 if (prev_cmd
!= ETIR__C_STA_LW
&& prev_cmd
!= ETIR__C_STA_QW
)
4932 (*_bfd_error_handler
) (_("Unknown reloc %s + %s"),
4933 _bfd_vms_etir_name (prev_cmd
),
4934 _bfd_vms_etir_name (ETIR__C_OPR_ADD
));
4937 prev_cmd
= ETIR__C_OPR_ADD
;
4940 case ETIR__C_STO_CA
: /* ALPHA_R_CODEADDR */
4941 reloc_code
= BFD_RELOC_ALPHA_CODEADDR
;
4945 case ETIR__C_STO_GBL
: /* ALPHA_R_REFQUAD und_section */
4946 reloc_code
= BFD_RELOC_64
;
4950 case ETIR__C_STO_GBL_LW
: /* ALPHA_R_REFLONG und_section */
4951 reloc_code
= BFD_RELOC_32
;
4955 case ETIR__C_STC_LP_PSB
: /* ALPHA_R_LINKAGE */
4956 reloc_code
= BFD_RELOC_ALPHA_LINKAGE
;
4960 case ETIR__C_STC_NOP_GBL
: /* ALPHA_R_NOP */
4961 reloc_code
= BFD_RELOC_ALPHA_NOP
;
4964 case ETIR__C_STC_BSR_GBL
: /* ALPHA_R_BSR */
4965 reloc_code
= BFD_RELOC_ALPHA_BSR
;
4968 case ETIR__C_STC_LDA_GBL
: /* ALPHA_R_LDA */
4969 reloc_code
= BFD_RELOC_ALPHA_LDA
;
4972 case ETIR__C_STC_BOH_GBL
: /* ALPHA_R_BOH */
4973 reloc_code
= BFD_RELOC_ALPHA_BOH
;
4977 cur_sym
= ptr
+ 4 + 32;
4978 cur_address
= bfd_getl64 (ptr
+ 4 + 8);
4979 cur_addend
= bfd_getl64 (ptr
+ 4 + 24);
4982 case ETIR__C_STO_IMM
:
4983 vaddr
+= bfd_getl32 (ptr
+ 4);
4987 (*_bfd_error_handler
) (_("Unknown reloc %s"),
4988 _bfd_vms_etir_name (cmd
));
4994 struct vms_section_data_struct
*vms_sec
;
4997 /* Get section to which the relocation applies. */
4998 if (cur_psect
< 0 || cur_psect
> (int)PRIV (section_count
))
5000 (*_bfd_error_handler
) (_("Invalid section index in ETIR"));
5003 sec
= PRIV (sections
)[cur_psect
];
5004 vms_sec
= vms_section_data (sec
);
5006 /* Allocate a reloc entry. */
5007 if (sec
->reloc_count
>= vms_sec
->reloc_max
)
5009 if (vms_sec
->reloc_max
== 0)
5011 vms_sec
->reloc_max
= 64;
5012 sec
->relocation
= bfd_zmalloc
5013 (vms_sec
->reloc_max
* sizeof (arelent
));
5017 vms_sec
->reloc_max
*= 2;
5018 sec
->relocation
= bfd_realloc
5019 (sec
->relocation
, vms_sec
->reloc_max
* sizeof (arelent
));
5022 reloc
= &sec
->relocation
[sec
->reloc_count
];
5025 reloc
->howto
= bfd_reloc_type_lookup (abfd
, reloc_code
);
5027 if (cur_sym
!= NULL
)
5030 unsigned int symlen
= *cur_sym
;
5033 /* Linear search. */
5038 for (j
= 0; j
< PRIV (gsd_sym_count
); j
++)
5039 if (PRIV (syms
)[j
]->namelen
== symlen
5040 && memcmp (PRIV (syms
)[j
]->name
, cur_sym
, symlen
) == 0)
5042 sym
= &PRIV (csymbols
)[j
];
5047 (*_bfd_error_handler
) (_("Unknown symbol in command %s"),
5048 _bfd_vms_etir_name (cmd
));
5049 reloc
->sym_ptr_ptr
= NULL
;
5052 reloc
->sym_ptr_ptr
= sym
;
5054 else if (cur_psidx
>= 0)
5055 reloc
->sym_ptr_ptr
=
5056 PRIV (sections
)[cur_psidx
]->symbol_ptr_ptr
;
5058 reloc
->sym_ptr_ptr
= NULL
;
5060 reloc
->address
= cur_address
;
5061 reloc
->addend
= cur_addend
;
5063 vaddr
+= bfd_get_reloc_size (reloc
->howto
);
5072 vms_debug2 ((3, "alpha_vms_slurp_relocs: result = TRUE\n"));
5077 /* Return the number of bytes required to store the relocation
5078 information associated with the given section. */
5081 alpha_vms_get_reloc_upper_bound (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*section
)
5083 alpha_vms_slurp_relocs (abfd
);
5085 return (section
->reloc_count
+ 1) * sizeof (arelent
*);
5088 /* Convert relocations from VMS (external) form into BFD internal
5089 form. Return the number of relocations. */
5092 alpha_vms_canonicalize_reloc (bfd
*abfd
, asection
*section
, arelent
**relptr
,
5093 asymbol
**symbols ATTRIBUTE_UNUSED
)
5098 if (!alpha_vms_slurp_relocs (abfd
))
5101 count
= section
->reloc_count
;
5102 tblptr
= section
->relocation
;
5105 *relptr
++ = tblptr
++;
5107 *relptr
= (arelent
*) NULL
;
5108 return section
->reloc_count
;
5111 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
5113 /* How to process the various reloc types. */
5115 static bfd_reloc_status_type
5116 reloc_nil (bfd
* abfd ATTRIBUTE_UNUSED
,
5117 arelent
*reloc ATTRIBUTE_UNUSED
,
5118 asymbol
*sym ATTRIBUTE_UNUSED
,
5119 void * data ATTRIBUTE_UNUSED
,
5120 asection
*sec ATTRIBUTE_UNUSED
,
5121 bfd
*output_bfd ATTRIBUTE_UNUSED
,
5122 char **error_message ATTRIBUTE_UNUSED
)
5125 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd
, output_bfd
);
5126 vms_debug (2, "In section %s, symbol %s\n",
5127 sec
->name
, sym
->name
);
5128 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5129 reloc
->sym_ptr_ptr
[0]->name
,
5130 (unsigned long)reloc
->address
,
5131 (unsigned long)reloc
->addend
, reloc
->howto
->name
);
5132 vms_debug (2, "data at %p\n", data
);
5133 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5136 return bfd_reloc_ok
;
5139 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5140 from smaller values. Start with zero, widen, *then* decrement. */
5141 #define MINUS_ONE (((bfd_vma)0) - 1)
5143 static reloc_howto_type alpha_howto_table
[] =
5145 HOWTO (ALPHA_R_IGNORE
, /* Type. */
5146 0, /* Rightshift. */
5147 0, /* Size (0 = byte, 1 = short, 2 = long). */
5149 TRUE
, /* PC relative. */
5151 complain_overflow_dont
,/* Complain_on_overflow. */
5152 reloc_nil
, /* Special_function. */
5153 "IGNORE", /* Name. */
5154 TRUE
, /* Partial_inplace. */
5155 0, /* Source mask */
5157 TRUE
), /* PC rel offset. */
5159 /* A 64 bit reference to a symbol. */
5160 HOWTO (ALPHA_R_REFQUAD
, /* Type. */
5161 0, /* Rightshift. */
5162 4, /* Size (0 = byte, 1 = short, 2 = long). */
5164 FALSE
, /* PC relative. */
5166 complain_overflow_bitfield
, /* Complain_on_overflow. */
5167 reloc_nil
, /* Special_function. */
5168 "REFQUAD", /* Name. */
5169 TRUE
, /* Partial_inplace. */
5170 MINUS_ONE
, /* Source mask. */
5171 MINUS_ONE
, /* Dest mask. */
5172 FALSE
), /* PC rel offset. */
5174 /* A 21 bit branch. The native assembler generates these for
5175 branches within the text segment, and also fills in the PC
5176 relative offset in the instruction. */
5177 HOWTO (ALPHA_R_BRADDR
, /* Type. */
5178 2, /* Rightshift. */
5179 2, /* Size (0 = byte, 1 = short, 2 = long). */
5181 TRUE
, /* PC relative. */
5183 complain_overflow_signed
, /* Complain_on_overflow. */
5184 reloc_nil
, /* Special_function. */
5185 "BRADDR", /* Name. */
5186 TRUE
, /* Partial_inplace. */
5187 0x1fffff, /* Source mask. */
5188 0x1fffff, /* Dest mask. */
5189 FALSE
), /* PC rel offset. */
5191 /* A hint for a jump to a register. */
5192 HOWTO (ALPHA_R_HINT
, /* Type. */
5193 2, /* Rightshift. */
5194 1, /* Size (0 = byte, 1 = short, 2 = long). */
5196 TRUE
, /* PC relative. */
5198 complain_overflow_dont
,/* Complain_on_overflow. */
5199 reloc_nil
, /* Special_function. */
5201 TRUE
, /* Partial_inplace. */
5202 0x3fff, /* Source mask. */
5203 0x3fff, /* Dest mask. */
5204 FALSE
), /* PC rel offset. */
5206 /* 16 bit PC relative offset. */
5207 HOWTO (ALPHA_R_SREL16
, /* Type. */
5208 0, /* Rightshift. */
5209 1, /* Size (0 = byte, 1 = short, 2 = long). */
5211 TRUE
, /* PC relative. */
5213 complain_overflow_signed
, /* Complain_on_overflow. */
5214 reloc_nil
, /* Special_function. */
5215 "SREL16", /* Name. */
5216 TRUE
, /* Partial_inplace. */
5217 0xffff, /* Source mask. */
5218 0xffff, /* Dest mask. */
5219 FALSE
), /* PC rel offset. */
5221 /* 32 bit PC relative offset. */
5222 HOWTO (ALPHA_R_SREL32
, /* Type. */
5223 0, /* Rightshift. */
5224 2, /* Size (0 = byte, 1 = short, 2 = long). */
5226 TRUE
, /* PC relative. */
5228 complain_overflow_signed
, /* Complain_on_overflow. */
5229 reloc_nil
, /* Special_function. */
5230 "SREL32", /* Name. */
5231 TRUE
, /* Partial_inplace. */
5232 0xffffffff, /* Source mask. */
5233 0xffffffff, /* Dest mask. */
5234 FALSE
), /* PC rel offset. */
5236 /* A 64 bit PC relative offset. */
5237 HOWTO (ALPHA_R_SREL64
, /* Type. */
5238 0, /* Rightshift. */
5239 4, /* Size (0 = byte, 1 = short, 2 = long). */
5241 TRUE
, /* PC relative. */
5243 complain_overflow_signed
, /* Complain_on_overflow. */
5244 reloc_nil
, /* Special_function. */
5245 "SREL64", /* Name. */
5246 TRUE
, /* Partial_inplace. */
5247 MINUS_ONE
, /* Source mask. */
5248 MINUS_ONE
, /* Dest mask. */
5249 FALSE
), /* PC rel offset. */
5251 /* Push a value on the reloc evaluation stack. */
5252 HOWTO (ALPHA_R_OP_PUSH
, /* Type. */
5253 0, /* Rightshift. */
5254 0, /* Size (0 = byte, 1 = short, 2 = long). */
5256 FALSE
, /* PC relative. */
5258 complain_overflow_dont
,/* Complain_on_overflow. */
5259 reloc_nil
, /* Special_function. */
5260 "OP_PUSH", /* Name. */
5261 FALSE
, /* Partial_inplace. */
5262 0, /* Source mask. */
5264 FALSE
), /* PC rel offset. */
5266 /* Store the value from the stack at the given address. Store it in
5267 a bitfield of size r_size starting at bit position r_offset. */
5268 HOWTO (ALPHA_R_OP_STORE
, /* Type. */
5269 0, /* Rightshift. */
5270 4, /* Size (0 = byte, 1 = short, 2 = long). */
5272 FALSE
, /* PC relative. */
5274 complain_overflow_dont
,/* Complain_on_overflow. */
5275 reloc_nil
, /* Special_function. */
5276 "OP_STORE", /* Name. */
5277 FALSE
, /* Partial_inplace. */
5278 0, /* Source mask. */
5279 MINUS_ONE
, /* Dest mask. */
5280 FALSE
), /* PC rel offset. */
5282 /* Subtract the reloc address from the value on the top of the
5283 relocation stack. */
5284 HOWTO (ALPHA_R_OP_PSUB
, /* Type. */
5285 0, /* Rightshift. */
5286 0, /* Size (0 = byte, 1 = short, 2 = long). */
5288 FALSE
, /* PC relative. */
5290 complain_overflow_dont
,/* Complain_on_overflow. */
5291 reloc_nil
, /* Special_function. */
5292 "OP_PSUB", /* Name. */
5293 FALSE
, /* Partial_inplace. */
5294 0, /* Source mask. */
5296 FALSE
), /* PC rel offset. */
5298 /* Shift the value on the top of the relocation stack right by the
5300 HOWTO (ALPHA_R_OP_PRSHIFT
, /* Type. */
5301 0, /* Rightshift. */
5302 0, /* Size (0 = byte, 1 = short, 2 = long). */
5304 FALSE
, /* PC relative. */
5306 complain_overflow_dont
,/* Complain_on_overflow. */
5307 reloc_nil
, /* Special_function. */
5308 "OP_PRSHIFT", /* Name. */
5309 FALSE
, /* Partial_inplace. */
5310 0, /* Source mask. */
5312 FALSE
), /* PC rel offset. */
5314 /* Hack. Linkage is done by linker. */
5315 HOWTO (ALPHA_R_LINKAGE
, /* Type. */
5316 0, /* Rightshift. */
5317 8, /* Size (0 = byte, 1 = short, 2 = long). */
5319 FALSE
, /* PC relative. */
5321 complain_overflow_dont
,/* Complain_on_overflow. */
5322 reloc_nil
, /* Special_function. */
5323 "LINKAGE", /* Name. */
5324 FALSE
, /* Partial_inplace. */
5325 0, /* Source mask. */
5327 FALSE
), /* PC rel offset. */
5329 /* A 32 bit reference to a symbol. */
5330 HOWTO (ALPHA_R_REFLONG
, /* Type. */
5331 0, /* Rightshift. */
5332 2, /* Size (0 = byte, 1 = short, 2 = long). */
5334 FALSE
, /* PC relative. */
5336 complain_overflow_bitfield
, /* Complain_on_overflow. */
5337 reloc_nil
, /* Special_function. */
5338 "REFLONG", /* Name. */
5339 TRUE
, /* Partial_inplace. */
5340 0xffffffff, /* Source mask. */
5341 0xffffffff, /* Dest mask. */
5342 FALSE
), /* PC rel offset. */
5344 /* A 64 bit reference to a procedure, written as 32 bit value. */
5345 HOWTO (ALPHA_R_CODEADDR
, /* Type. */
5346 0, /* Rightshift. */
5347 4, /* Size (0 = byte, 1 = short, 2 = long). */
5349 FALSE
, /* PC relative. */
5351 complain_overflow_signed
,/* Complain_on_overflow. */
5352 reloc_nil
, /* Special_function. */
5353 "CODEADDR", /* Name. */
5354 FALSE
, /* Partial_inplace. */
5355 0xffffffff, /* Source mask. */
5356 0xffffffff, /* Dest mask. */
5357 FALSE
), /* PC rel offset. */
5359 HOWTO (ALPHA_R_NOP
, /* Type. */
5360 0, /* Rightshift. */
5361 3, /* Size (0 = byte, 1 = short, 2 = long). */
5363 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5364 because the calculations for the 3 relocations are the same.
5365 See B.4.5.2 of the OpenVMS Linker Utility Manual. */
5366 TRUE
, /* PC relative. */
5368 complain_overflow_dont
,/* Complain_on_overflow. */
5369 reloc_nil
, /* Special_function. */
5371 FALSE
, /* Partial_inplace. */
5372 0xffffffff, /* Source mask. */
5373 0xffffffff, /* Dest mask. */
5374 FALSE
), /* PC rel offset. */
5376 HOWTO (ALPHA_R_BSR
, /* Type. */
5377 0, /* Rightshift. */
5378 3, /* Size (0 = byte, 1 = short, 2 = long). */
5380 TRUE
, /* PC relative. */
5382 complain_overflow_dont
,/* Complain_on_overflow. */
5383 reloc_nil
, /* Special_function. */
5385 FALSE
, /* Partial_inplace. */
5386 0xffffffff, /* Source mask. */
5387 0xffffffff, /* Dest mask. */
5388 FALSE
), /* PC rel offset. */
5390 HOWTO (ALPHA_R_LDA
, /* Type. */
5391 0, /* Rightshift. */
5392 3, /* Size (0 = byte, 1 = short, 2 = long). */
5394 FALSE
, /* PC relative. */
5396 complain_overflow_dont
,/* Complain_on_overflow. */
5397 reloc_nil
, /* Special_function. */
5399 FALSE
, /* Partial_inplace. */
5400 0xffffffff, /* Source mask. */
5401 0xffffffff, /* Dest mask. */
5402 FALSE
), /* PC rel offset. */
5404 HOWTO (ALPHA_R_BOH
, /* Type. */
5405 0, /* Rightshift. */
5406 3, /* Size (0 = byte, 1 = short, 2 = long, 3 = nil). */
5408 TRUE
, /* PC relative. */
5410 complain_overflow_dont
,/* Complain_on_overflow. */
5411 reloc_nil
, /* Special_function. */
5413 FALSE
, /* Partial_inplace. */
5414 0xffffffff, /* Source mask. */
5415 0xffffffff, /* Dest mask. */
5416 FALSE
), /* PC rel offset. */
5419 /* Return a pointer to a howto structure which, when invoked, will perform
5420 the relocation code on data from the architecture noted. */
5422 static const struct reloc_howto_struct
*
5423 alpha_vms_bfd_reloc_type_lookup (bfd
* abfd ATTRIBUTE_UNUSED
,
5424 bfd_reloc_code_real_type code
)
5428 vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd
, code
));
5432 case BFD_RELOC_16
: alpha_type
= ALPHA_R_SREL16
; break;
5433 case BFD_RELOC_32
: alpha_type
= ALPHA_R_REFLONG
; break;
5434 case BFD_RELOC_64
: alpha_type
= ALPHA_R_REFQUAD
; break;
5435 case BFD_RELOC_CTOR
: alpha_type
= ALPHA_R_REFQUAD
; break;
5436 case BFD_RELOC_23_PCREL_S2
: alpha_type
= ALPHA_R_BRADDR
; break;
5437 case BFD_RELOC_ALPHA_HINT
: alpha_type
= ALPHA_R_HINT
; break;
5438 case BFD_RELOC_16_PCREL
: alpha_type
= ALPHA_R_SREL16
; break;
5439 case BFD_RELOC_32_PCREL
: alpha_type
= ALPHA_R_SREL32
; break;
5440 case BFD_RELOC_64_PCREL
: alpha_type
= ALPHA_R_SREL64
; break;
5441 case BFD_RELOC_ALPHA_LINKAGE
: alpha_type
= ALPHA_R_LINKAGE
; break;
5442 case BFD_RELOC_ALPHA_CODEADDR
: alpha_type
= ALPHA_R_CODEADDR
; break;
5443 case BFD_RELOC_ALPHA_NOP
: alpha_type
= ALPHA_R_NOP
; break;
5444 case BFD_RELOC_ALPHA_BSR
: alpha_type
= ALPHA_R_BSR
; break;
5445 case BFD_RELOC_ALPHA_LDA
: alpha_type
= ALPHA_R_LDA
; break;
5446 case BFD_RELOC_ALPHA_BOH
: alpha_type
= ALPHA_R_BOH
; break;
5448 (*_bfd_error_handler
) ("reloc (%d) is *UNKNOWN*", code
);
5451 vms_debug2 ((2, "reloc is %s\n", alpha_howto_table
[alpha_type
].name
));
5452 return & alpha_howto_table
[alpha_type
];
5455 static reloc_howto_type
*
5456 alpha_vms_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
5462 i
< sizeof (alpha_howto_table
) / sizeof (alpha_howto_table
[0]);
5464 if (alpha_howto_table
[i
].name
!= NULL
5465 && strcasecmp (alpha_howto_table
[i
].name
, r_name
) == 0)
5466 return &alpha_howto_table
[i
];
5472 alpha_vms_get_synthetic_symtab (bfd
*abfd
,
5473 long symcount ATTRIBUTE_UNUSED
,
5474 asymbol
**usyms ATTRIBUTE_UNUSED
,
5475 long dynsymcount ATTRIBUTE_UNUSED
,
5476 asymbol
**dynsyms ATTRIBUTE_UNUSED
,
5483 syms
= (asymbol
*) bfd_malloc (PRIV (norm_sym_count
) * sizeof (asymbol
));
5488 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5490 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
5501 flags
= BSF_LOCAL
| BSF_SYNTHETIC
;
5507 if ((e
->flags
& EGSY__V_DEF
) && (e
->flags
& EGSY__V_NORM
))
5509 value
= e
->code_value
;
5510 sec
= PRIV (sections
)[e
->code_section
];
5517 if ((e
->flags
& EGSY__V_DEF
) && (e
->flags
& EGSY__V_NORM
))
5522 value
= e
->code_value
;
5524 /* Find containing section. */
5525 for (s
= abfd
->sections
; s
; s
= s
->next
)
5529 && !(s
->flags
& SEC_COFF_SHARED_LIBRARY
)
5530 && (s
->size
> 0 || !(e
->flags
& EGSY__V_REL
)))
5547 sname
= bfd_alloc (abfd
, l
+ 5);
5550 memcpy (sname
, name
, l
);
5551 memcpy (sname
+ l
, "..en", 5);
5558 sym
->udata
.p
= NULL
;
5567 vms_time_to_str (unsigned char *buf
)
5569 time_t t
= vms_rawtime_to_time_t (buf
);
5570 char *res
= ctime (&t
);
5573 res
= "*invalid time*";
5580 evax_bfd_print_emh (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
5582 struct vms_emh_common
*emh
= (struct vms_emh_common
*)rec
;
5583 unsigned int subtype
;
5585 subtype
= (unsigned)bfd_getl16 (emh
->subtyp
);
5587 fprintf (file
, _(" EMH %u (len=%u): "), subtype
, rec_len
);
5593 struct vms_emh_mhd
*mhd
= (struct vms_emh_mhd
*)rec
;
5596 fprintf (file
, _("Module header\n"));
5597 fprintf (file
, _(" structure level: %u\n"), mhd
->strlvl
);
5598 fprintf (file
, _(" max record size: %u\n"),
5599 (unsigned)bfd_getl32 (mhd
->recsiz
));
5600 name
= (char *)(mhd
+ 1);
5601 fprintf (file
, _(" module name : %.*s\n"), name
[0], name
+ 1);
5602 name
+= name
[0] + 1;
5603 fprintf (file
, _(" module version : %.*s\n"), name
[0], name
+ 1);
5604 name
+= name
[0] + 1;
5605 fprintf (file
, _(" compile date : %.17s\n"), name
);
5610 fprintf (file
, _("Language Processor Name\n"));
5611 fprintf (file
, _(" language name: %.*s\n"),
5612 (int)(rec_len
- sizeof (struct vms_emh_common
)),
5613 (char *)rec
+ sizeof (struct vms_emh_common
));
5618 fprintf (file
, _("Source Files Header\n"));
5619 fprintf (file
, _(" file: %.*s\n"),
5620 (int)(rec_len
- sizeof (struct vms_emh_common
)),
5621 (char *)rec
+ sizeof (struct vms_emh_common
));
5626 fprintf (file
, _("Title Text Header\n"));
5627 fprintf (file
, _(" title: %.*s\n"),
5628 (int)(rec_len
- sizeof (struct vms_emh_common
)),
5629 (char *)rec
+ sizeof (struct vms_emh_common
));
5634 fprintf (file
, _("Copyright Header\n"));
5635 fprintf (file
, _(" copyright: %.*s\n"),
5636 (int)(rec_len
- sizeof (struct vms_emh_common
)),
5637 (char *)rec
+ sizeof (struct vms_emh_common
));
5641 fprintf (file
, _("unhandled emh subtype %u\n"), subtype
);
5647 evax_bfd_print_eeom (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
5649 struct vms_eeom
*eeom
= (struct vms_eeom
*)rec
;
5651 fprintf (file
, _(" EEOM (len=%u):\n"), rec_len
);
5652 fprintf (file
, _(" number of cond linkage pairs: %u\n"),
5653 (unsigned)bfd_getl32 (eeom
->total_lps
));
5654 fprintf (file
, _(" completion code: %u\n"),
5655 (unsigned)bfd_getl16 (eeom
->comcod
));
5658 fprintf (file
, _(" transfer addr flags: 0x%02x\n"), eeom
->tfrflg
);
5659 fprintf (file
, _(" transfer addr psect: %u\n"),
5660 (unsigned)bfd_getl32 (eeom
->psindx
));
5661 fprintf (file
, _(" transfer address : 0x%08x\n"),
5662 (unsigned)bfd_getl32 (eeom
->tfradr
));
5667 exav_bfd_print_egsy_flags (unsigned int flags
, FILE *file
)
5669 if (flags
& EGSY__V_WEAK
)
5670 fputs (_(" WEAK"), file
);
5671 if (flags
& EGSY__V_DEF
)
5672 fputs (_(" DEF"), file
);
5673 if (flags
& EGSY__V_UNI
)
5674 fputs (_(" UNI"), file
);
5675 if (flags
& EGSY__V_REL
)
5676 fputs (_(" REL"), file
);
5677 if (flags
& EGSY__V_COMM
)
5678 fputs (_(" COMM"), file
);
5679 if (flags
& EGSY__V_VECEP
)
5680 fputs (_(" VECEP"), file
);
5681 if (flags
& EGSY__V_NORM
)
5682 fputs (_(" NORM"), file
);
5683 if (flags
& EGSY__V_QUAD_VAL
)
5684 fputs (_(" QVAL"), file
);
5688 evax_bfd_print_egsd_flags (FILE *file
, unsigned int flags
)
5690 if (flags
& EGPS__V_PIC
)
5691 fputs (_(" PIC"), file
);
5692 if (flags
& EGPS__V_LIB
)
5693 fputs (_(" LIB"), file
);
5694 if (flags
& EGPS__V_OVR
)
5695 fputs (_(" OVR"), file
);
5696 if (flags
& EGPS__V_REL
)
5697 fputs (_(" REL"), file
);
5698 if (flags
& EGPS__V_GBL
)
5699 fputs (_(" GBL"), file
);
5700 if (flags
& EGPS__V_SHR
)
5701 fputs (_(" SHR"), file
);
5702 if (flags
& EGPS__V_EXE
)
5703 fputs (_(" EXE"), file
);
5704 if (flags
& EGPS__V_RD
)
5705 fputs (_(" RD"), file
);
5706 if (flags
& EGPS__V_WRT
)
5707 fputs (_(" WRT"), file
);
5708 if (flags
& EGPS__V_VEC
)
5709 fputs (_(" VEC"), file
);
5710 if (flags
& EGPS__V_NOMOD
)
5711 fputs (_(" NOMOD"), file
);
5712 if (flags
& EGPS__V_COM
)
5713 fputs (_(" COM"), file
);
5714 if (flags
& EGPS__V_ALLOC_64BIT
)
5715 fputs (_(" 64B"), file
);
5719 evax_bfd_print_egsd (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
5721 unsigned int off
= sizeof (struct vms_egsd
);
5724 fprintf (file
, _(" EGSD (len=%u):\n"), rec_len
);
5727 for (off
= sizeof (struct vms_egsd
); off
< rec_len
; )
5729 struct vms_egsd_entry
*e
= (struct vms_egsd_entry
*)(rec
+ off
);
5733 type
= (unsigned)bfd_getl16 (e
->gsdtyp
);
5734 len
= (unsigned)bfd_getl16 (e
->gsdsiz
);
5736 fprintf (file
, _(" EGSD entry %2u (type: %u, len: %u): "),
5744 struct vms_egps
*egps
= (struct vms_egps
*)e
;
5745 unsigned int flags
= bfd_getl16 (egps
->flags
);
5748 fprintf (file
, _("PSC - Program section definition\n"));
5749 fprintf (file
, _(" alignment : 2**%u\n"), egps
->align
);
5750 fprintf (file
, _(" flags : 0x%04x"), flags
);
5751 evax_bfd_print_egsd_flags (file
, flags
);
5753 l
= bfd_getl32 (egps
->alloc
);
5754 fprintf (file
, _(" alloc (len): %u (0x%08x)\n"), l
, l
);
5755 fprintf (file
, _(" name : %.*s\n"),
5756 egps
->namlng
, egps
->name
);
5761 struct vms_esgps
*esgps
= (struct vms_esgps
*)e
;
5762 unsigned int flags
= bfd_getl16 (esgps
->flags
);
5765 fprintf (file
, _("SPSC - Shared Image Program section def\n"));
5766 fprintf (file
, _(" alignment : 2**%u\n"), esgps
->align
);
5767 fprintf (file
, _(" flags : 0x%04x"), flags
);
5768 evax_bfd_print_egsd_flags (file
, flags
);
5770 l
= bfd_getl32 (esgps
->alloc
);
5771 fprintf (file
, _(" alloc (len) : %u (0x%08x)\n"), l
, l
);
5772 fprintf (file
, _(" image offset : 0x%08x\n"),
5773 (unsigned int)bfd_getl32 (esgps
->base
));
5774 fprintf (file
, _(" symvec offset : 0x%08x\n"),
5775 (unsigned int)bfd_getl32 (esgps
->value
));
5776 fprintf (file
, _(" name : %.*s\n"),
5777 esgps
->namlng
, esgps
->name
);
5782 struct vms_egsy
*egsy
= (struct vms_egsy
*)e
;
5783 unsigned int flags
= bfd_getl16 (egsy
->flags
);
5785 if (flags
& EGSY__V_DEF
)
5787 struct vms_esdf
*esdf
= (struct vms_esdf
*)e
;
5789 fprintf (file
, _("SYM - Global symbol definition\n"));
5790 fprintf (file
, _(" flags: 0x%04x"), flags
);
5791 exav_bfd_print_egsy_flags (flags
, file
);
5793 fprintf (file
, _(" psect offset: 0x%08x\n"),
5794 (unsigned)bfd_getl32 (esdf
->value
));
5795 if (flags
& EGSY__V_NORM
)
5797 fprintf (file
, _(" code address: 0x%08x\n"),
5798 (unsigned)bfd_getl32 (esdf
->code_address
));
5799 fprintf (file
, _(" psect index for entry point : %u\n"),
5800 (unsigned)bfd_getl32 (esdf
->ca_psindx
));
5802 fprintf (file
, _(" psect index : %u\n"),
5803 (unsigned)bfd_getl32 (esdf
->psindx
));
5804 fprintf (file
, _(" name : %.*s\n"),
5805 esdf
->namlng
, esdf
->name
);
5809 struct vms_esrf
*esrf
= (struct vms_esrf
*)e
;
5811 fprintf (file
, _("SYM - Global symbol reference\n"));
5812 fprintf (file
, _(" name : %.*s\n"),
5813 esrf
->namlng
, esrf
->name
);
5819 struct vms_eidc
*eidc
= (struct vms_eidc
*)e
;
5820 unsigned int flags
= bfd_getl32 (eidc
->flags
);
5823 fprintf (file
, _("IDC - Ident Consistency check\n"));
5824 fprintf (file
, _(" flags : 0x%08x"), flags
);
5825 if (flags
& EIDC__V_BINIDENT
)
5826 fputs (" BINDENT", file
);
5828 fprintf (file
, _(" id match : %x\n"),
5829 (flags
>> EIDC__V_IDMATCH_SH
) & EIDC__V_IDMATCH_MASK
);
5830 fprintf (file
, _(" error severity: %x\n"),
5831 (flags
>> EIDC__V_ERRSEV_SH
) & EIDC__V_ERRSEV_MASK
);
5833 fprintf (file
, _(" entity name : %.*s\n"), p
[0], p
+ 1);
5835 fprintf (file
, _(" object name : %.*s\n"), p
[0], p
+ 1);
5837 if (flags
& EIDC__V_BINIDENT
)
5838 fprintf (file
, _(" binary ident : 0x%08x\n"),
5839 (unsigned)bfd_getl32 (p
+ 1));
5841 fprintf (file
, _(" ascii ident : %.*s\n"), p
[0], p
+ 1);
5846 struct vms_egst
*egst
= (struct vms_egst
*)e
;
5847 unsigned int flags
= bfd_getl16 (egst
->header
.flags
);
5849 fprintf (file
, _("SYMG - Universal symbol definition\n"));
5850 fprintf (file
, _(" flags: 0x%04x"), flags
);
5851 exav_bfd_print_egsy_flags (flags
, file
);
5853 fprintf (file
, _(" symbol vector offset: 0x%08x\n"),
5854 (unsigned)bfd_getl32 (egst
->value
));
5855 fprintf (file
, _(" entry point: 0x%08x\n"),
5856 (unsigned)bfd_getl32 (egst
->lp_1
));
5857 fprintf (file
, _(" proc descr : 0x%08x\n"),
5858 (unsigned)bfd_getl32 (egst
->lp_2
));
5859 fprintf (file
, _(" psect index: %u\n"),
5860 (unsigned)bfd_getl32 (egst
->psindx
));
5861 fprintf (file
, _(" name : %.*s\n"),
5862 egst
->namlng
, egst
->name
);
5867 struct vms_esdfv
*esdfv
= (struct vms_esdfv
*)e
;
5868 unsigned int flags
= bfd_getl16 (esdfv
->flags
);
5870 fprintf (file
, _("SYMV - Vectored symbol definition\n"));
5871 fprintf (file
, _(" flags: 0x%04x"), flags
);
5872 exav_bfd_print_egsy_flags (flags
, file
);
5874 fprintf (file
, _(" vector : 0x%08x\n"),
5875 (unsigned)bfd_getl32 (esdfv
->vector
));
5876 fprintf (file
, _(" psect offset: %u\n"),
5877 (unsigned)bfd_getl32 (esdfv
->value
));
5878 fprintf (file
, _(" psect index : %u\n"),
5879 (unsigned)bfd_getl32 (esdfv
->psindx
));
5880 fprintf (file
, _(" name : %.*s\n"),
5881 esdfv
->namlng
, esdfv
->name
);
5886 struct vms_esdfm
*esdfm
= (struct vms_esdfm
*)e
;
5887 unsigned int flags
= bfd_getl16 (esdfm
->flags
);
5889 fprintf (file
, _("SYMM - Global symbol definition with version\n"));
5890 fprintf (file
, _(" flags: 0x%04x"), flags
);
5891 exav_bfd_print_egsy_flags (flags
, file
);
5893 fprintf (file
, _(" version mask: 0x%08x\n"),
5894 (unsigned)bfd_getl32 (esdfm
->version_mask
));
5895 fprintf (file
, _(" psect offset: %u\n"),
5896 (unsigned)bfd_getl32 (esdfm
->value
));
5897 fprintf (file
, _(" psect index : %u\n"),
5898 (unsigned)bfd_getl32 (esdfm
->psindx
));
5899 fprintf (file
, _(" name : %.*s\n"),
5900 esdfm
->namlng
, esdfm
->name
);
5904 fprintf (file
, _("unhandled egsd entry type %u\n"), type
);
5912 evax_bfd_print_hex (FILE *file
, const char *pfx
,
5913 const unsigned char *buf
, unsigned int len
)
5919 for (i
= 0; i
< len
; i
++)
5923 fprintf (file
, " %02x", buf
[i
]);
5936 evax_bfd_print_etir_stc_ir (FILE *file
, const unsigned char *buf
, int is_ps
)
5938 fprintf (file
, _(" linkage index: %u, replacement insn: 0x%08x\n"),
5939 (unsigned)bfd_getl32 (buf
),
5940 (unsigned)bfd_getl32 (buf
+ 16));
5941 fprintf (file
, _(" psect idx 1: %u, offset 1: 0x%08x %08x\n"),
5942 (unsigned)bfd_getl32 (buf
+ 4),
5943 (unsigned)bfd_getl32 (buf
+ 12),
5944 (unsigned)bfd_getl32 (buf
+ 8));
5945 fprintf (file
, _(" psect idx 2: %u, offset 2: 0x%08x %08x\n"),
5946 (unsigned)bfd_getl32 (buf
+ 20),
5947 (unsigned)bfd_getl32 (buf
+ 28),
5948 (unsigned)bfd_getl32 (buf
+ 24));
5950 fprintf (file
, _(" psect idx 3: %u, offset 3: 0x%08x %08x\n"),
5951 (unsigned)bfd_getl32 (buf
+ 32),
5952 (unsigned)bfd_getl32 (buf
+ 40),
5953 (unsigned)bfd_getl32 (buf
+ 36));
5955 fprintf (file
, _(" global name: %.*s\n"), buf
[32], buf
+ 33);
5959 evax_bfd_print_etir (FILE *file
, const char *name
,
5960 unsigned char *rec
, unsigned int rec_len
)
5962 unsigned int off
= sizeof (struct vms_egsd
);
5963 unsigned int sec_len
;
5965 fprintf (file
, _(" %s (len=%u+%u):\n"), name
,
5966 (unsigned)(rec_len
- sizeof (struct vms_eobjrec
)),
5967 (unsigned)sizeof (struct vms_eobjrec
));
5969 for (off
= sizeof (struct vms_eobjrec
); off
< rec_len
; )
5971 struct vms_etir
*etir
= (struct vms_etir
*)(rec
+ off
);
5976 type
= bfd_getl16 (etir
->rectyp
);
5977 size
= bfd_getl16 (etir
->size
);
5978 buf
= rec
+ off
+ sizeof (struct vms_etir
);
5980 fprintf (file
, _(" (type: %3u, size: 4+%3u): "), type
, size
- 4);
5983 case ETIR__C_STA_GBL
:
5984 fprintf (file
, _("STA_GBL (stack global) %.*s\n"),
5987 case ETIR__C_STA_LW
:
5988 fprintf (file
, _("STA_LW (stack longword) 0x%08x\n"),
5989 (unsigned)bfd_getl32 (buf
));
5991 case ETIR__C_STA_QW
:
5992 fprintf (file
, _("STA_QW (stack quadword) 0x%08x %08x\n"),
5993 (unsigned)bfd_getl32 (buf
+ 4),
5994 (unsigned)bfd_getl32 (buf
+ 0));
5996 case ETIR__C_STA_PQ
:
5997 fprintf (file
, _("STA_PQ (stack psect base + offset)\n"));
5998 fprintf (file
, _(" psect: %u, offset: 0x%08x %08x\n"),
5999 (unsigned)bfd_getl32 (buf
+ 0),
6000 (unsigned)bfd_getl32 (buf
+ 8),
6001 (unsigned)bfd_getl32 (buf
+ 4));
6003 case ETIR__C_STA_LI
:
6004 fprintf (file
, _("STA_LI (stack literal)\n"));
6006 case ETIR__C_STA_MOD
:
6007 fprintf (file
, _("STA_MOD (stack module)\n"));
6009 case ETIR__C_STA_CKARG
:
6010 fprintf (file
, _("STA_CKARG (compare procedure argument)\n"));
6014 fprintf (file
, _("STO_B (store byte)\n"));
6017 fprintf (file
, _("STO_W (store word)\n"));
6019 case ETIR__C_STO_LW
:
6020 fprintf (file
, _("STO_LW (store longword)\n"));
6022 case ETIR__C_STO_QW
:
6023 fprintf (file
, _("STO_QW (store quadword)\n"));
6025 case ETIR__C_STO_IMMR
:
6027 unsigned int len
= bfd_getl32 (buf
);
6029 _("STO_IMMR (store immediate repeat) %u bytes\n"),
6031 evax_bfd_print_hex (file
, " ", buf
+ 4, len
);
6035 case ETIR__C_STO_GBL
:
6036 fprintf (file
, _("STO_GBL (store global) %.*s\n"),
6039 case ETIR__C_STO_CA
:
6040 fprintf (file
, _("STO_CA (store code address) %.*s\n"),
6043 case ETIR__C_STO_RB
:
6044 fprintf (file
, _("STO_RB (store relative branch)\n"));
6046 case ETIR__C_STO_AB
:
6047 fprintf (file
, _("STO_AB (store absolute branch)\n"));
6049 case ETIR__C_STO_OFF
:
6050 fprintf (file
, _("STO_OFF (store offset to psect)\n"));
6052 case ETIR__C_STO_IMM
:
6054 unsigned int len
= bfd_getl32 (buf
);
6056 _("STO_IMM (store immediate) %u bytes\n"),
6058 evax_bfd_print_hex (file
, " ", buf
+ 4, len
);
6062 case ETIR__C_STO_LP_PSB
:
6063 fprintf (file
, _("STO_OFF (store LP with procedure signature)\n"));
6065 case ETIR__C_STO_HINT_GBL
:
6066 fprintf (file
, _("STO_BR_GBL (store branch global) *todo*\n"));
6068 case ETIR__C_STO_HINT_PS
:
6069 fprintf (file
, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6072 case ETIR__C_OPR_NOP
:
6073 fprintf (file
, _("OPR_NOP (no-operation)\n"));
6075 case ETIR__C_OPR_ADD
:
6076 fprintf (file
, _("OPR_ADD (add)\n"));
6078 case ETIR__C_OPR_SUB
:
6079 fprintf (file
, _("OPR_SUB (substract)\n"));
6081 case ETIR__C_OPR_MUL
:
6082 fprintf (file
, _("OPR_MUL (multiply)\n"));
6084 case ETIR__C_OPR_DIV
:
6085 fprintf (file
, _("OPR_DIV (divide)\n"));
6087 case ETIR__C_OPR_AND
:
6088 fprintf (file
, _("OPR_AND (logical and)\n"));
6090 case ETIR__C_OPR_IOR
:
6091 fprintf (file
, _("OPR_IOR (logical inclusive or)\n"));
6093 case ETIR__C_OPR_EOR
:
6094 fprintf (file
, _("OPR_EOR (logical exclusive or)\n"));
6096 case ETIR__C_OPR_NEG
:
6097 fprintf (file
, _("OPR_NEG (negate)\n"));
6099 case ETIR__C_OPR_COM
:
6100 fprintf (file
, _("OPR_COM (complement)\n"));
6102 case ETIR__C_OPR_INSV
:
6103 fprintf (file
, _("OPR_INSV (insert field)\n"));
6105 case ETIR__C_OPR_ASH
:
6106 fprintf (file
, _("OPR_ASH (arithmetic shift)\n"));
6108 case ETIR__C_OPR_USH
:
6109 fprintf (file
, _("OPR_USH (unsigned shift)\n"));
6111 case ETIR__C_OPR_ROT
:
6112 fprintf (file
, _("OPR_ROT (rotate)\n"));
6114 case ETIR__C_OPR_SEL
:
6115 fprintf (file
, _("OPR_SEL (select)\n"));
6117 case ETIR__C_OPR_REDEF
:
6118 fprintf (file
, _("OPR_REDEF (redefine symbol to curr location)\n"));
6120 case ETIR__C_OPR_DFLIT
:
6121 fprintf (file
, _("OPR_REDEF (define a literal)\n"));
6124 case ETIR__C_STC_LP
:
6125 fprintf (file
, _("STC_LP (store cond linkage pair)\n"));
6127 case ETIR__C_STC_LP_PSB
:
6129 _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6130 fprintf (file
, _(" linkage index: %u, procedure: %.*s\n"),
6131 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6132 buf
+= 4 + 1 + buf
[4];
6133 fprintf (file
, _(" signature: %.*s\n"), buf
[0], buf
+ 1);
6135 case ETIR__C_STC_GBL
:
6136 fprintf (file
, _("STC_GBL (store cond global)\n"));
6137 fprintf (file
, _(" linkage index: %u, global: %.*s\n"),
6138 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6140 case ETIR__C_STC_GCA
:
6141 fprintf (file
, _("STC_GCA (store cond code address)\n"));
6142 fprintf (file
, _(" linkage index: %u, procedure name: %.*s\n"),
6143 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6145 case ETIR__C_STC_PS
:
6146 fprintf (file
, _("STC_PS (store cond psect + offset)\n"));
6148 _(" linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6149 (unsigned)bfd_getl32 (buf
),
6150 (unsigned)bfd_getl32 (buf
+ 4),
6151 (unsigned)bfd_getl32 (buf
+ 12),
6152 (unsigned)bfd_getl32 (buf
+ 8));
6154 case ETIR__C_STC_NOP_GBL
:
6155 fprintf (file
, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6156 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6158 case ETIR__C_STC_NOP_PS
:
6159 fprintf (file
, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6160 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6162 case ETIR__C_STC_BSR_GBL
:
6163 fprintf (file
, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6164 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6166 case ETIR__C_STC_BSR_PS
:
6167 fprintf (file
, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6168 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6170 case ETIR__C_STC_LDA_GBL
:
6171 fprintf (file
, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6172 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6174 case ETIR__C_STC_LDA_PS
:
6175 fprintf (file
, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6176 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6178 case ETIR__C_STC_BOH_GBL
:
6179 fprintf (file
, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6180 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6182 case ETIR__C_STC_BOH_PS
:
6183 fprintf (file
, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6184 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6186 case ETIR__C_STC_NBH_GBL
:
6188 _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6190 case ETIR__C_STC_NBH_PS
:
6192 _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6195 case ETIR__C_CTL_SETRB
:
6196 fprintf (file
, _("CTL_SETRB (set relocation base)\n"));
6199 case ETIR__C_CTL_AUGRB
:
6201 unsigned int val
= bfd_getl32 (buf
);
6202 fprintf (file
, _("CTL_AUGRB (augment relocation base) %u\n"), val
);
6205 case ETIR__C_CTL_DFLOC
:
6206 fprintf (file
, _("CTL_DFLOC (define location)\n"));
6208 case ETIR__C_CTL_STLOC
:
6209 fprintf (file
, _("CTL_STLOC (set location)\n"));
6211 case ETIR__C_CTL_STKDL
:
6212 fprintf (file
, _("CTL_STKDL (stack defined location)\n"));
6215 fprintf (file
, _("*unhandled*\n"));
6223 evax_bfd_print_eobj (struct bfd
*abfd
, FILE *file
)
6225 bfd_boolean is_first
= TRUE
;
6226 bfd_boolean has_records
= FALSE
;
6230 unsigned int rec_len
;
6231 unsigned int pad_len
;
6233 unsigned int hdr_size
;
6238 unsigned char buf
[6];
6243 if (bfd_bread (buf
, sizeof (buf
), abfd
) != sizeof (buf
))
6245 fprintf (file
, _("cannot read GST record length\n"));
6248 rec_len
= bfd_getl16 (buf
+ 0);
6249 if (rec_len
== bfd_getl16 (buf
+ 4)
6250 && bfd_getl16 (buf
+ 2) == EOBJ__C_EMH
)
6252 /* The format is raw: record-size, type, record-size. */
6254 pad_len
= (rec_len
+ 1) & ~1U;
6257 else if (rec_len
== EOBJ__C_EMH
)
6259 has_records
= FALSE
;
6260 pad_len
= bfd_getl16 (buf
+ 2);
6266 fprintf (file
, _("cannot find EMH in first GST record\n"));
6269 rec
= bfd_malloc (pad_len
);
6270 memcpy (rec
, buf
+ sizeof (buf
) - hdr_size
, hdr_size
);
6274 unsigned int rec_len2
= 0;
6275 unsigned char hdr
[4];
6279 unsigned char buf_len
[2];
6281 if (bfd_bread (buf_len
, sizeof (buf_len
), abfd
)
6282 != sizeof (buf_len
))
6284 fprintf (file
, _("cannot read GST record length\n"));
6287 rec_len2
= (unsigned)bfd_getl16 (buf_len
);
6290 if (bfd_bread (hdr
, sizeof (hdr
), abfd
) != sizeof (hdr
))
6292 fprintf (file
, _("cannot read GST record header\n"));
6295 rec_len
= (unsigned)bfd_getl16 (hdr
+ 2);
6297 pad_len
= (rec_len
+ 1) & ~1U;
6300 rec
= bfd_malloc (pad_len
);
6301 memcpy (rec
, hdr
, sizeof (hdr
));
6302 hdr_size
= sizeof (hdr
);
6303 if (has_records
&& rec_len2
!= rec_len
)
6305 fprintf (file
, _(" corrupted GST\n"));
6310 if (bfd_bread (rec
+ hdr_size
, pad_len
- hdr_size
, abfd
)
6311 != pad_len
- hdr_size
)
6313 fprintf (file
, _("cannot read GST record\n"));
6317 type
= (unsigned)bfd_getl16 (rec
);
6322 evax_bfd_print_emh (file
, rec
, rec_len
);
6325 evax_bfd_print_egsd (file
, rec
, rec_len
);
6328 evax_bfd_print_eeom (file
, rec
, rec_len
);
6333 evax_bfd_print_etir (file
, "ETIR", rec
, rec_len
);
6336 evax_bfd_print_etir (file
, "EDBG", rec
, rec_len
);
6339 evax_bfd_print_etir (file
, "ETBT", rec
, rec_len
);
6342 fprintf (file
, _(" unhandled EOBJ record type %u\n"), type
);
6350 evax_bfd_print_relocation_records (FILE *file
, const unsigned char *rel
,
6351 unsigned int stride
)
6359 count
= bfd_getl32 (rel
+ 0);
6363 base
= bfd_getl32 (rel
+ 4);
6365 fprintf (file
, _(" bitcount: %u, base addr: 0x%08x\n"),
6369 for (j
= 0; count
> 0; j
+= 4, count
-= 32)
6375 val
= bfd_getl32 (rel
);
6378 fprintf (file
, _(" bitmap: 0x%08x (count: %u):\n"), val
, count
);
6380 for (k
= 0; k
< 32; k
++)
6385 fprintf (file
, _(" %08x"), base
+ (j
* 8 + k
) * stride
);
6400 evax_bfd_print_address_fixups (FILE *file
, const unsigned char *rel
)
6407 count
= bfd_getl32 (rel
+ 0);
6410 fprintf (file
, _(" image %u (%u entries)\n"),
6411 (unsigned)bfd_getl32 (rel
+ 4), count
);
6413 for (j
= 0; j
< count
; j
++)
6415 fprintf (file
, _(" offset: 0x%08x, val: 0x%08x\n"),
6416 (unsigned)bfd_getl32 (rel
+ 0),
6417 (unsigned)bfd_getl32 (rel
+ 4));
6424 evax_bfd_print_reference_fixups (FILE *file
, const unsigned char *rel
)
6433 count
= bfd_getl32 (rel
+ 0);
6436 fprintf (file
, _(" image %u (%u entries), offsets:\n"),
6437 (unsigned)bfd_getl32 (rel
+ 4), count
);
6439 for (j
= 0; j
< count
; j
++)
6443 fprintf (file
, _(" 0x%08x"), (unsigned)bfd_getl32 (rel
));
6458 evax_bfd_print_indent (int indent
, FILE *file
)
6460 for (; indent
; indent
--)
6465 evax_bfd_get_dsc_name (unsigned int v
)
6469 case DSC__K_DTYPE_Z
:
6470 return "Z (Unspecified)";
6471 case DSC__K_DTYPE_V
:
6473 case DSC__K_DTYPE_BU
:
6474 return "BU (Byte logical)";
6475 case DSC__K_DTYPE_WU
:
6476 return "WU (Word logical)";
6477 case DSC__K_DTYPE_LU
:
6478 return "LU (Longword logical)";
6479 case DSC__K_DTYPE_QU
:
6480 return "QU (Quadword logical)";
6481 case DSC__K_DTYPE_B
:
6482 return "B (Byte integer)";
6483 case DSC__K_DTYPE_W
:
6484 return "W (Word integer)";
6485 case DSC__K_DTYPE_L
:
6486 return "L (Longword integer)";
6487 case DSC__K_DTYPE_Q
:
6488 return "Q (Quadword integer)";
6489 case DSC__K_DTYPE_F
:
6490 return "F (Single-precision floating)";
6491 case DSC__K_DTYPE_D
:
6492 return "D (Double-precision floating)";
6493 case DSC__K_DTYPE_FC
:
6494 return "FC (Complex)";
6495 case DSC__K_DTYPE_DC
:
6496 return "DC (Double-precision Complex)";
6497 case DSC__K_DTYPE_T
:
6498 return "T (ASCII text string)";
6499 case DSC__K_DTYPE_NU
:
6500 return "NU (Numeric string, unsigned)";
6501 case DSC__K_DTYPE_NL
:
6502 return "NL (Numeric string, left separate sign)";
6503 case DSC__K_DTYPE_NLO
:
6504 return "NLO (Numeric string, left overpunched sign)";
6505 case DSC__K_DTYPE_NR
:
6506 return "NR (Numeric string, right separate sign)";
6507 case DSC__K_DTYPE_NRO
:
6508 return "NRO (Numeric string, right overpunched sig)";
6509 case DSC__K_DTYPE_NZ
:
6510 return "NZ (Numeric string, zoned sign)";
6511 case DSC__K_DTYPE_P
:
6512 return "P (Packed decimal string)";
6513 case DSC__K_DTYPE_ZI
:
6514 return "ZI (Sequence of instructions)";
6515 case DSC__K_DTYPE_ZEM
:
6516 return "ZEM (Procedure entry mask)";
6517 case DSC__K_DTYPE_DSC
:
6518 return "DSC (Descriptor, used for arrays of dyn strings)";
6519 case DSC__K_DTYPE_OU
:
6520 return "OU (Octaword logical)";
6521 case DSC__K_DTYPE_O
:
6522 return "O (Octaword integer)";
6523 case DSC__K_DTYPE_G
:
6524 return "G (Double precision G floating, 64 bit)";
6525 case DSC__K_DTYPE_H
:
6526 return "H (Quadruple precision floating, 128 bit)";
6527 case DSC__K_DTYPE_GC
:
6528 return "GC (Double precision complex, G floating)";
6529 case DSC__K_DTYPE_HC
:
6530 return "HC (Quadruple precision complex, H floating)";
6531 case DSC__K_DTYPE_CIT
:
6532 return "CIT (COBOL intermediate temporary)";
6533 case DSC__K_DTYPE_BPV
:
6534 return "BPV (Bound Procedure Value)";
6535 case DSC__K_DTYPE_BLV
:
6536 return "BLV (Bound Label Value)";
6537 case DSC__K_DTYPE_VU
:
6538 return "VU (Bit Unaligned)";
6539 case DSC__K_DTYPE_ADT
:
6540 return "ADT (Absolute Date-Time)";
6541 case DSC__K_DTYPE_VT
:
6542 return "VT (Varying Text)";
6543 case DSC__K_DTYPE_T2
:
6544 return "T2 (16-bit char)";
6545 case DSC__K_DTYPE_VT2
:
6546 return "VT2 (16-bit varying char)";
6548 return "?? (unknown)";
6553 evax_bfd_print_desc (const unsigned char *buf
, int indent
, FILE *file
)
6555 unsigned char bclass
= buf
[3];
6556 unsigned char dtype
= buf
[2];
6557 unsigned int len
= (unsigned)bfd_getl16 (buf
);
6558 unsigned int pointer
= (unsigned)bfd_getl32 (buf
+ 4);
6560 evax_bfd_print_indent (indent
, file
);
6562 if (len
== 1 && pointer
== 0xffffffffUL
)
6565 fprintf (file
, _("64 bits *unhandled*\n"));
6569 fprintf (file
, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
6570 bclass
, dtype
, len
, pointer
);
6573 case DSC__K_CLASS_NCA
:
6575 const struct vms_dsc_nca
*dsc
= (const void *)buf
;
6577 const unsigned char *b
;
6579 evax_bfd_print_indent (indent
, file
);
6580 fprintf (file
, _("non-contiguous array of %s\n"),
6581 evax_bfd_get_dsc_name (dsc
->dtype
));
6582 evax_bfd_print_indent (indent
+ 1, file
);
6584 _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
6585 dsc
->dimct
, dsc
->aflags
, dsc
->digits
, dsc
->scale
);
6586 evax_bfd_print_indent (indent
+ 1, file
);
6588 _("arsize: %u, a0: 0x%08x\n"),
6589 (unsigned)bfd_getl32 (dsc
->arsize
),
6590 (unsigned)bfd_getl32 (dsc
->a0
));
6591 evax_bfd_print_indent (indent
+ 1, file
);
6592 fprintf (file
, _("Strides:\n"));
6593 b
= buf
+ sizeof (*dsc
);
6594 for (i
= 0; i
< dsc
->dimct
; i
++)
6596 evax_bfd_print_indent (indent
+ 2, file
);
6597 fprintf (file
, _("[%u]: %u\n"), i
+ 1,
6598 (unsigned)bfd_getl32 (b
));
6601 evax_bfd_print_indent (indent
+ 1, file
);
6602 fprintf (file
, _("Bounds:\n"));
6603 b
= buf
+ sizeof (*dsc
);
6604 for (i
= 0; i
< dsc
->dimct
; i
++)
6606 evax_bfd_print_indent (indent
+ 2, file
);
6607 fprintf (file
, _("[%u]: Lower: %u, upper: %u\n"), i
+ 1,
6608 (unsigned)bfd_getl32 (b
+ 0),
6609 (unsigned)bfd_getl32 (b
+ 4));
6614 case DSC__K_CLASS_UBS
:
6616 const struct vms_dsc_ubs
*ubs
= (const void *)buf
;
6618 evax_bfd_print_indent (indent
, file
);
6619 fprintf (file
, _("unaligned bit-string of %s\n"),
6620 evax_bfd_get_dsc_name (ubs
->dtype
));
6621 evax_bfd_print_indent (indent
+ 1, file
);
6623 _("base: %u, pos: %u\n"),
6624 (unsigned)bfd_getl32 (ubs
->base
),
6625 (unsigned)bfd_getl32 (ubs
->pos
));
6629 fprintf (file
, _("*unhandled*\n"));
6636 evax_bfd_print_valspec (const unsigned char *buf
, int indent
, FILE *file
)
6638 unsigned int vflags
= buf
[0];
6639 unsigned int value
= (unsigned)bfd_getl32 (buf
+ 1);
6640 unsigned int len
= 5;
6642 evax_bfd_print_indent (indent
, file
);
6643 fprintf (file
, _("vflags: 0x%02x, value: 0x%08x "), vflags
, value
);
6648 case DST__K_VFLAGS_NOVAL
:
6649 fprintf (file
, _("(no value)\n"));
6651 case DST__K_VFLAGS_NOTACTIVE
:
6652 fprintf (file
, _("(not active)\n"));
6654 case DST__K_VFLAGS_UNALLOC
:
6655 fprintf (file
, _("(not allocated)\n"));
6657 case DST__K_VFLAGS_DSC
:
6658 fprintf (file
, _("(descriptor)\n"));
6659 evax_bfd_print_desc (buf
+ value
, indent
+ 1, file
);
6661 case DST__K_VFLAGS_TVS
:
6662 fprintf (file
, _("(trailing value)\n"));
6664 case DST__K_VS_FOLLOWS
:
6665 fprintf (file
, _("(value spec follows)\n"));
6667 case DST__K_VFLAGS_BITOFFS
:
6668 fprintf (file
, _("(at bit offset %u)\n"), value
);
6671 fprintf (file
, _("(reg: %u, disp: %u, indir: %u, kind: "),
6672 (vflags
& DST__K_REGNUM_MASK
) >> DST__K_REGNUM_SHIFT
,
6673 vflags
& DST__K_DISP
? 1 : 0,
6674 vflags
& DST__K_INDIR
? 1 : 0);
6675 switch (vflags
& DST__K_VALKIND_MASK
)
6677 case DST__K_VALKIND_LITERAL
:
6678 fputs (_("literal"), file
);
6680 case DST__K_VALKIND_ADDR
:
6681 fputs (_("address"), file
);
6683 case DST__K_VALKIND_DESC
:
6684 fputs (_("desc"), file
);
6686 case DST__K_VALKIND_REG
:
6687 fputs (_("reg"), file
);
6690 fputs (")\n", file
);
6697 evax_bfd_print_typspec (const unsigned char *buf
, int indent
, FILE *file
)
6699 unsigned char kind
= buf
[2];
6700 unsigned int len
= (unsigned)bfd_getl16 (buf
);
6702 evax_bfd_print_indent (indent
, file
);
6703 fprintf (file
, ("len: %2u, kind: %2u "), len
, kind
);
6707 case DST__K_TS_ATOM
:
6708 fprintf (file
, ("atomic, type=0x%02x %s\n"),
6709 buf
[0], evax_bfd_get_dsc_name (buf
[0]));
6712 fprintf (file
, ("indirect, defined at 0x%08x\n"),
6713 (unsigned)bfd_getl32 (buf
));
6715 case DST__K_TS_TPTR
:
6716 fprintf (file
, ("typed pointer\n"));
6717 evax_bfd_print_typspec (buf
, indent
+ 1, file
);
6720 fprintf (file
, ("pointer\n"));
6722 case DST__K_TS_ARRAY
:
6724 const unsigned char *vs
;
6725 unsigned int vec_len
;
6728 fprintf (file
, ("array, dim: %u, bitmap: "), buf
[0]);
6729 vec_len
= (buf
[0] + 1 + 7) / 8;
6730 for (i
= 0; i
< vec_len
; i
++)
6731 fprintf (file
, " %02x", buf
[i
+ 1]);
6733 vs
= buf
+ 1 + vec_len
;
6734 evax_bfd_print_indent (indent
, file
);
6735 fprintf (file
, ("array descriptor:\n"));
6736 vs
+= evax_bfd_print_valspec (vs
, indent
+ 1, file
);
6737 for (i
= 0; i
< buf
[0] + 1U; i
++)
6738 if (buf
[1 + i
/ 8] & (1 << (i
% 8)))
6740 evax_bfd_print_indent (indent
, file
);
6742 fprintf (file
, ("type spec for element:\n"));
6744 fprintf (file
, ("type spec for subscript %u:\n"), i
);
6745 evax_bfd_print_typspec (vs
, indent
+ 1, file
);
6746 vs
+= bfd_getl16 (vs
);
6751 fprintf (file
, ("*unhandled*\n"));
6756 evax_bfd_print_dst (struct bfd
*abfd
, unsigned int dst_size
, FILE *file
)
6758 unsigned int off
= 0;
6759 unsigned int pc
= 0;
6760 unsigned int line
= 0;
6762 fprintf (file
, _("Debug symbol table:\n"));
6764 while (dst_size
> 0)
6766 struct vms_dst_header dsth
;
6771 if (bfd_bread (&dsth
, sizeof (dsth
), abfd
) != sizeof (dsth
))
6773 fprintf (file
, _("cannot read DST header\n"));
6776 len
= bfd_getl16 (dsth
.length
);
6777 type
= bfd_getl16 (dsth
.type
);
6778 fprintf (file
, _(" type: %3u, len: %3u (at 0x%08x): "),
6788 len
-= sizeof (dsth
);
6789 buf
= bfd_malloc (len
);
6790 if (bfd_bread (buf
, len
, abfd
) != len
)
6792 fprintf (file
, _("cannot read DST symbol\n"));
6797 case DSC__K_DTYPE_V
:
6798 case DSC__K_DTYPE_BU
:
6799 case DSC__K_DTYPE_WU
:
6800 case DSC__K_DTYPE_LU
:
6801 case DSC__K_DTYPE_QU
:
6802 case DSC__K_DTYPE_B
:
6803 case DSC__K_DTYPE_W
:
6804 case DSC__K_DTYPE_L
:
6805 case DSC__K_DTYPE_Q
:
6806 case DSC__K_DTYPE_F
:
6807 case DSC__K_DTYPE_D
:
6808 case DSC__K_DTYPE_FC
:
6809 case DSC__K_DTYPE_DC
:
6810 case DSC__K_DTYPE_T
:
6811 case DSC__K_DTYPE_NU
:
6812 case DSC__K_DTYPE_NL
:
6813 case DSC__K_DTYPE_NLO
:
6814 case DSC__K_DTYPE_NR
:
6815 case DSC__K_DTYPE_NRO
:
6816 case DSC__K_DTYPE_NZ
:
6817 case DSC__K_DTYPE_P
:
6818 case DSC__K_DTYPE_ZI
:
6819 case DSC__K_DTYPE_ZEM
:
6820 case DSC__K_DTYPE_DSC
:
6821 case DSC__K_DTYPE_OU
:
6822 case DSC__K_DTYPE_O
:
6823 case DSC__K_DTYPE_G
:
6824 case DSC__K_DTYPE_H
:
6825 case DSC__K_DTYPE_GC
:
6826 case DSC__K_DTYPE_HC
:
6827 case DSC__K_DTYPE_CIT
:
6828 case DSC__K_DTYPE_BPV
:
6829 case DSC__K_DTYPE_BLV
:
6830 case DSC__K_DTYPE_VU
:
6831 case DSC__K_DTYPE_ADT
:
6832 case DSC__K_DTYPE_VT
:
6833 case DSC__K_DTYPE_T2
:
6834 case DSC__K_DTYPE_VT2
:
6835 fprintf (file
, _("standard data: %s\n"),
6836 evax_bfd_get_dsc_name (type
));
6837 evax_bfd_print_valspec (buf
, 4, file
);
6838 fprintf (file
, _(" name: %.*s\n"), buf
[5], buf
+ 6);
6842 struct vms_dst_modbeg
*dst
= (void *)buf
;
6843 const char *name
= (const char *)buf
+ sizeof (*dst
);
6845 fprintf (file
, _("modbeg\n"));
6846 fprintf (file
, _(" flags: %d, language: %u, "
6847 "major: %u, minor: %u\n"),
6849 (unsigned)bfd_getl32 (dst
->language
),
6850 (unsigned)bfd_getl16 (dst
->major
),
6851 (unsigned)bfd_getl16 (dst
->minor
));
6852 fprintf (file
, _(" module name: %.*s\n"),
6854 name
+= name
[0] + 1;
6855 fprintf (file
, _(" compiler : %.*s\n"),
6860 fprintf (file
, _("modend\n"));
6864 struct vms_dst_rtnbeg
*dst
= (void *)buf
;
6865 const char *name
= (const char *)buf
+ sizeof (*dst
);
6867 fputs (_("rtnbeg\n"), file
);
6868 fprintf (file
, _(" flags: %u, address: 0x%08x, "
6869 "pd-address: 0x%08x\n"),
6871 (unsigned)bfd_getl32 (dst
->address
),
6872 (unsigned)bfd_getl32 (dst
->pd_address
));
6873 fprintf (file
, _(" routine name: %.*s\n"),
6879 struct vms_dst_rtnend
*dst
= (void *)buf
;
6881 fprintf (file
, _("rtnend: size 0x%08x\n"),
6882 (unsigned)bfd_getl32 (dst
->size
));
6887 struct vms_dst_prolog
*dst
= (void *)buf
;
6889 fprintf (file
, _("prolog: bkpt address 0x%08x\n"),
6890 (unsigned)bfd_getl32 (dst
->bkpt_addr
));
6895 struct vms_dst_epilog
*dst
= (void *)buf
;
6897 fprintf (file
, _("epilog: flags: %u, count: %u\n"),
6898 dst
->flags
, (unsigned)bfd_getl32 (dst
->count
));
6903 struct vms_dst_blkbeg
*dst
= (void *)buf
;
6904 const char *name
= (const char *)buf
+ sizeof (*dst
);
6906 fprintf (file
, _("blkbeg: address: 0x%08x, name: %.*s\n"),
6907 (unsigned)bfd_getl32 (dst
->address
),
6913 struct vms_dst_blkend
*dst
= (void *)buf
;
6915 fprintf (file
, _("blkend: size: 0x%08x\n"),
6916 (unsigned)bfd_getl32 (dst
->size
));
6919 case DST__K_TYPSPEC
:
6921 fprintf (file
, _("typspec (len: %u)\n"), len
);
6922 fprintf (file
, _(" name: %.*s\n"), buf
[0], buf
+ 1);
6923 evax_bfd_print_typspec (buf
+ 1 + buf
[0], 5, file
);
6928 fprintf (file
, _("septyp, name: %.*s\n"), buf
[5], buf
+ 6);
6929 evax_bfd_print_valspec (buf
, 4, file
);
6934 struct vms_dst_recbeg
*recbeg
= (void *)buf
;
6935 const char *name
= (const char *)buf
+ sizeof (*recbeg
);
6937 fprintf (file
, _("recbeg: name: %.*s\n"), name
[0], name
+ 1);
6938 evax_bfd_print_valspec (buf
, 4, file
);
6939 fprintf (file
, (" len: %u bits\n"),
6940 (unsigned)bfd_getl32 (name
+ 1 + name
[0]));
6944 fprintf (file
, _("recend\n"));
6946 case DST__K_ENUMBEG
:
6947 fprintf (file
, _("enumbeg, len: %u, name: %.*s\n"),
6948 buf
[0], buf
[1], buf
+ 2);
6950 case DST__K_ENUMELT
:
6951 fprintf (file
, _("enumelt, name: %.*s\n"), buf
[5], buf
+ 6);
6952 evax_bfd_print_valspec (buf
, 4, file
);
6954 case DST__K_ENUMEND
:
6955 fprintf (file
, _("enumend\n"));
6959 struct vms_dst_label
*lab
= (void *)buf
;
6960 fprintf (file
, ("label, name: %.*s\n"),
6961 lab
->name
[0], lab
->name
+ 1);
6962 fprintf (file
, (" address: 0x%08x\n"),
6963 (unsigned)bfd_getl32 (lab
->value
));
6966 case DST__K_DIS_RANGE
:
6968 unsigned int cnt
= bfd_getl32 (buf
);
6969 unsigned char *rng
= buf
+ 4;
6972 fprintf (file
, _("discontiguous range (nbr: %u)\n"), cnt
);
6973 for (i
= 0; i
< cnt
; i
++, rng
+= 8)
6974 fprintf (file
, _(" address: 0x%08x, size: %u\n"),
6975 (unsigned)bfd_getl32 (rng
),
6976 (unsigned)bfd_getl32 (rng
+ 4));
6980 case DST__K_LINE_NUM
:
6982 unsigned char *buf_orig
= buf
;
6984 fprintf (file
, _("line num (len: %u)\n"), len
);
6989 unsigned char cmdlen
;
6999 case DST__K_DELTA_PC_W
:
7000 val
= bfd_getl16 (buf
+ 1);
7001 fprintf (file
, _("delta_pc_w %u\n"), val
);
7006 case DST__K_INCR_LINUM
:
7008 fprintf (file
, _("incr_linum(b): +%u\n"), val
);
7012 case DST__K_INCR_LINUM_W
:
7013 val
= bfd_getl16 (buf
+ 1);
7014 fprintf (file
, _("incr_linum_w: +%u\n"), val
);
7018 case DST__K_INCR_LINUM_L
:
7019 val
= bfd_getl32 (buf
+ 1);
7020 fprintf (file
, _("incr_linum_l: +%u\n"), val
);
7024 case DST__K_SET_LINUM
:
7025 line
= bfd_getl16 (buf
+ 1);
7026 fprintf (file
, _("set_line_num(w) %u\n"), line
);
7029 case DST__K_SET_LINUM_B
:
7031 fprintf (file
, _("set_line_num_b %u\n"), line
);
7034 case DST__K_SET_LINUM_L
:
7035 line
= bfd_getl32 (buf
+ 1);
7036 fprintf (file
, _("set_line_num_l %u\n"), line
);
7039 case DST__K_SET_ABS_PC
:
7040 pc
= bfd_getl32 (buf
+ 1);
7041 fprintf (file
, _("set_abs_pc: 0x%08x\n"), pc
);
7044 case DST__K_DELTA_PC_L
:
7045 fprintf (file
, _("delta_pc_l: +0x%08x\n"),
7046 (unsigned)bfd_getl32 (buf
+ 1));
7050 fprintf (file
, _("term(b): 0x%02x"), buf
[1]);
7052 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7056 val
= bfd_getl16 (buf
+ 1);
7057 fprintf (file
, _("term_w: 0x%04x"), val
);
7059 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7065 fprintf (file
, _("delta pc +%-4d"), -cmd
);
7066 line
++; /* FIXME: curr increment. */
7068 fprintf (file
, _(" pc: 0x%08x line: %5u\n"),
7073 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
7086 unsigned char *buf_orig
= buf
;
7088 fprintf (file
, _("source (len: %u)\n"), len
);
7092 signed char cmd
= buf
[0];
7093 unsigned char cmdlen
= 0;
7097 case DST__K_SRC_DECLFILE
:
7099 struct vms_dst_src_decl_src
*src
= (void *)(buf
+ 1);
7102 fprintf (file
, _(" declfile: len: %u, flags: %u, "
7104 src
->length
, src
->flags
,
7105 (unsigned)bfd_getl16 (src
->fileid
));
7106 fprintf (file
, _(" rms: cdt: 0x%08x %08x, "
7107 "ebk: 0x%08x, ffb: 0x%04x, "
7109 (unsigned)bfd_getl32 (src
->rms_cdt
+ 4),
7110 (unsigned)bfd_getl32 (src
->rms_cdt
+ 0),
7111 (unsigned)bfd_getl32 (src
->rms_ebk
),
7112 (unsigned)bfd_getl16 (src
->rms_ffb
),
7114 name
= (const char *)buf
+ 1 + sizeof (*src
);
7115 fprintf (file
, _(" filename : %.*s\n"),
7117 name
+= name
[0] + 1;
7118 fprintf (file
, _(" module name: %.*s\n"),
7120 cmdlen
= 2 + src
->length
;
7123 case DST__K_SRC_SETFILE
:
7124 fprintf (file
, _(" setfile %u\n"),
7125 (unsigned)bfd_getl16 (buf
+ 1));
7128 case DST__K_SRC_SETREC_W
:
7129 fprintf (file
, _(" setrec %u\n"),
7130 (unsigned)bfd_getl16 (buf
+ 1));
7133 case DST__K_SRC_SETREC_L
:
7134 fprintf (file
, _(" setrec %u\n"),
7135 (unsigned)bfd_getl32 (buf
+ 1));
7138 case DST__K_SRC_SETLNUM_W
:
7139 fprintf (file
, _(" setlnum %u\n"),
7140 (unsigned)bfd_getl16 (buf
+ 1));
7143 case DST__K_SRC_SETLNUM_L
:
7144 fprintf (file
, _(" setlnum %u\n"),
7145 (unsigned)bfd_getl32 (buf
+ 1));
7148 case DST__K_SRC_DEFLINES_W
:
7149 fprintf (file
, _(" deflines %u\n"),
7150 (unsigned)bfd_getl16 (buf
+ 1));
7153 case DST__K_SRC_DEFLINES_B
:
7154 fprintf (file
, _(" deflines %u\n"), buf
[1]);
7157 case DST__K_SRC_FORMFEED
:
7158 fprintf (file
, _(" formfeed\n"));
7162 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
7174 fprintf (file
, _("*unhandled* dst type %u\n"), type
);
7182 evax_bfd_print_image (bfd
*abfd
, FILE *file
)
7184 struct vms_eihd eihd
;
7187 unsigned int eiha_off
;
7188 unsigned int eihi_off
;
7189 unsigned int eihs_off
;
7190 unsigned int eisd_off
;
7191 unsigned int eihef_off
= 0;
7192 unsigned int eihnp_off
= 0;
7193 unsigned int dmt_vbn
= 0;
7194 unsigned int dmt_size
= 0;
7195 unsigned int dst_vbn
= 0;
7196 unsigned int dst_size
= 0;
7197 unsigned int gst_vbn
= 0;
7198 unsigned int gst_size
= 0;
7199 unsigned int eiaf_vbn
= 0;
7200 unsigned int eiaf_size
= 0;
7201 unsigned int eihvn_off
;
7203 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
)
7204 || bfd_bread (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
7206 fprintf (file
, _("cannot read EIHD\n"));
7209 fprintf (file
, _("EIHD: (size: %u, nbr blocks: %u)\n"),
7210 (unsigned)bfd_getl32 (eihd
.size
),
7211 (unsigned)bfd_getl32 (eihd
.hdrblkcnt
));
7212 fprintf (file
, _(" majorid: %u, minorid: %u\n"),
7213 (unsigned)bfd_getl32 (eihd
.majorid
),
7214 (unsigned)bfd_getl32 (eihd
.minorid
));
7216 val
= (unsigned)bfd_getl32 (eihd
.imgtype
);
7220 name
= _("executable");
7223 name
= _("linkable image");
7226 name
= _("unknown");
7229 fprintf (file
, _(" image type: %u (%s)"), val
, name
);
7231 val
= (unsigned)bfd_getl32 (eihd
.subtype
);
7234 case EIHD__C_NATIVE
:
7241 name
= _("unknown");
7244 fprintf (file
, _(", subtype: %u (%s)\n"), val
, name
);
7246 eisd_off
= bfd_getl32 (eihd
.isdoff
);
7247 eiha_off
= bfd_getl32 (eihd
.activoff
);
7248 eihi_off
= bfd_getl32 (eihd
.imgidoff
);
7249 eihs_off
= bfd_getl32 (eihd
.symdbgoff
);
7250 fprintf (file
, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
7251 "imgid: %u, patch: %u\n"),
7252 eisd_off
, eiha_off
, eihs_off
, eihi_off
,
7253 (unsigned)bfd_getl32 (eihd
.patchoff
));
7254 fprintf (file
, _(" fixup info rva: "));
7255 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.iafva
));
7256 fprintf (file
, _(", symbol vector rva: "));
7257 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.symvva
));
7258 eihvn_off
= bfd_getl32 (eihd
.version_array_off
);
7259 fprintf (file
, _("\n"
7260 " version array off: %u\n"),
7263 _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
7264 (unsigned)bfd_getl32 (eihd
.imgiocnt
),
7265 (unsigned)bfd_getl32 (eihd
.iochancnt
),
7266 (unsigned)bfd_getl32 (eihd
.privreqs
+ 4),
7267 (unsigned)bfd_getl32 (eihd
.privreqs
+ 0));
7268 val
= (unsigned)bfd_getl32 (eihd
.lnkflags
);
7269 fprintf (file
, _(" linker flags: %08x:"), val
);
7270 if (val
& EIHD__M_LNKDEBUG
)
7271 fprintf (file
, " LNKDEBUG");
7272 if (val
& EIHD__M_LNKNOTFR
)
7273 fprintf (file
, " LNKNOTFR");
7274 if (val
& EIHD__M_NOP0BUFS
)
7275 fprintf (file
, " NOP0BUFS");
7276 if (val
& EIHD__M_PICIMG
)
7277 fprintf (file
, " PICIMG");
7278 if (val
& EIHD__M_P0IMAGE
)
7279 fprintf (file
, " P0IMAGE");
7280 if (val
& EIHD__M_DBGDMT
)
7281 fprintf (file
, " DBGDMT");
7282 if (val
& EIHD__M_INISHR
)
7283 fprintf (file
, " INISHR");
7284 if (val
& EIHD__M_XLATED
)
7285 fprintf (file
, " XLATED");
7286 if (val
& EIHD__M_BIND_CODE_SEC
)
7287 fprintf (file
, " BIND_CODE_SEC");
7288 if (val
& EIHD__M_BIND_DATA_SEC
)
7289 fprintf (file
, " BIND_DATA_SEC");
7290 if (val
& EIHD__M_MKTHREADS
)
7291 fprintf (file
, " MKTHREADS");
7292 if (val
& EIHD__M_UPCALLS
)
7293 fprintf (file
, " UPCALLS");
7294 if (val
& EIHD__M_OMV_READY
)
7295 fprintf (file
, " OMV_READY");
7296 if (val
& EIHD__M_EXT_BIND_SECT
)
7297 fprintf (file
, " EXT_BIND_SECT");
7298 fprintf (file
, "\n");
7299 fprintf (file
, _(" ident: 0x%08x, sysver: 0x%08x, "
7300 "match ctrl: %u, symvect_size: %u\n"),
7301 (unsigned)bfd_getl32 (eihd
.ident
),
7302 (unsigned)bfd_getl32 (eihd
.sysver
),
7304 (unsigned)bfd_getl32 (eihd
.symvect_size
));
7305 fprintf (file
, _(" BPAGE: %u"),
7306 (unsigned)bfd_getl32 (eihd
.virt_mem_block_size
));
7307 if (val
& (EIHD__M_OMV_READY
| EIHD__M_EXT_BIND_SECT
))
7309 eihef_off
= bfd_getl32 (eihd
.ext_fixup_off
);
7310 eihnp_off
= bfd_getl32 (eihd
.noopt_psect_off
);
7311 fprintf (file
, _(", ext fixup offset: %u, no_opt psect off: %u"),
7312 eihef_off
, eihnp_off
);
7314 fprintf (file
, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd
.alias
));
7318 struct vms_eihvn eihvn
;
7322 fprintf (file
, _("system version array information:\n"));
7323 if (bfd_seek (abfd
, (file_ptr
) eihvn_off
, SEEK_SET
)
7324 || bfd_bread (&eihvn
, sizeof (eihvn
), abfd
) != sizeof (eihvn
))
7326 fprintf (file
, _("cannot read EIHVN header\n"));
7329 mask
= bfd_getl32 (eihvn
.subsystem_mask
);
7330 for (j
= 0; j
< 32; j
++)
7331 if (mask
& (1 << j
))
7333 struct vms_eihvn_subversion ver
;
7334 if (bfd_bread (&ver
, sizeof (ver
), abfd
) != sizeof (ver
))
7336 fprintf (file
, _("cannot read EIHVN version\n"));
7339 fprintf (file
, _(" %02u "), j
);
7342 case EIHVN__BASE_IMAGE_BIT
:
7343 fputs (_("BASE_IMAGE "), file
);
7345 case EIHVN__MEMORY_MANAGEMENT_BIT
:
7346 fputs (_("MEMORY_MANAGEMENT"), file
);
7349 fputs (_("IO "), file
);
7351 case EIHVN__FILES_VOLUMES_BIT
:
7352 fputs (_("FILES_VOLUMES "), file
);
7354 case EIHVN__PROCESS_SCHED_BIT
:
7355 fputs (_("PROCESS_SCHED "), file
);
7357 case EIHVN__SYSGEN_BIT
:
7358 fputs (_("SYSGEN "), file
);
7360 case EIHVN__CLUSTERS_LOCKMGR_BIT
:
7361 fputs (_("CLUSTERS_LOCKMGR "), file
);
7363 case EIHVN__LOGICAL_NAMES_BIT
:
7364 fputs (_("LOGICAL_NAMES "), file
);
7366 case EIHVN__SECURITY_BIT
:
7367 fputs (_("SECURITY "), file
);
7369 case EIHVN__IMAGE_ACTIVATOR_BIT
:
7370 fputs (_("IMAGE_ACTIVATOR "), file
);
7372 case EIHVN__NETWORKS_BIT
:
7373 fputs (_("NETWORKS "), file
);
7375 case EIHVN__COUNTERS_BIT
:
7376 fputs (_("COUNTERS "), file
);
7378 case EIHVN__STABLE_BIT
:
7379 fputs (_("STABLE "), file
);
7381 case EIHVN__MISC_BIT
:
7382 fputs (_("MISC "), file
);
7384 case EIHVN__CPU_BIT
:
7385 fputs (_("CPU "), file
);
7387 case EIHVN__VOLATILE_BIT
:
7388 fputs (_("VOLATILE "), file
);
7390 case EIHVN__SHELL_BIT
:
7391 fputs (_("SHELL "), file
);
7393 case EIHVN__POSIX_BIT
:
7394 fputs (_("POSIX "), file
);
7396 case EIHVN__MULTI_PROCESSING_BIT
:
7397 fputs (_("MULTI_PROCESSING "), file
);
7399 case EIHVN__GALAXY_BIT
:
7400 fputs (_("GALAXY "), file
);
7403 fputs (_("*unknown* "), file
);
7406 fprintf (file
, _(": %u.%u\n"),
7407 (unsigned)bfd_getl16 (ver
.major
),
7408 (unsigned)bfd_getl16 (ver
.minor
));
7414 struct vms_eiha eiha
;
7416 if (bfd_seek (abfd
, (file_ptr
) eiha_off
, SEEK_SET
)
7417 || bfd_bread (&eiha
, sizeof (eiha
), abfd
) != sizeof (eiha
))
7419 fprintf (file
, _("cannot read EIHA\n"));
7422 fprintf (file
, _("Image activation: (size=%u)\n"),
7423 (unsigned)bfd_getl32 (eiha
.size
));
7424 fprintf (file
, _(" First address : 0x%08x 0x%08x\n"),
7425 (unsigned)bfd_getl32 (eiha
.tfradr1_h
),
7426 (unsigned)bfd_getl32 (eiha
.tfradr1
));
7427 fprintf (file
, _(" Second address: 0x%08x 0x%08x\n"),
7428 (unsigned)bfd_getl32 (eiha
.tfradr2_h
),
7429 (unsigned)bfd_getl32 (eiha
.tfradr2
));
7430 fprintf (file
, _(" Third address : 0x%08x 0x%08x\n"),
7431 (unsigned)bfd_getl32 (eiha
.tfradr3_h
),
7432 (unsigned)bfd_getl32 (eiha
.tfradr3
));
7433 fprintf (file
, _(" Fourth address: 0x%08x 0x%08x\n"),
7434 (unsigned)bfd_getl32 (eiha
.tfradr4_h
),
7435 (unsigned)bfd_getl32 (eiha
.tfradr4
));
7436 fprintf (file
, _(" Shared image : 0x%08x 0x%08x\n"),
7437 (unsigned)bfd_getl32 (eiha
.inishr_h
),
7438 (unsigned)bfd_getl32 (eiha
.inishr
));
7442 struct vms_eihi eihi
;
7444 if (bfd_seek (abfd
, (file_ptr
) eihi_off
, SEEK_SET
)
7445 || bfd_bread (&eihi
, sizeof (eihi
), abfd
) != sizeof (eihi
))
7447 fprintf (file
, _("cannot read EIHI\n"));
7450 fprintf (file
, _("Image identification: (major: %u, minor: %u)\n"),
7451 (unsigned)bfd_getl32 (eihi
.majorid
),
7452 (unsigned)bfd_getl32 (eihi
.minorid
));
7453 fprintf (file
, _(" image name : %.*s\n"),
7454 eihi
.imgnam
[0], eihi
.imgnam
+ 1);
7455 fprintf (file
, _(" link time : %s\n"),
7456 vms_time_to_str (eihi
.linktime
));
7457 fprintf (file
, _(" image ident : %.*s\n"),
7458 eihi
.imgid
[0], eihi
.imgid
+ 1);
7459 fprintf (file
, _(" linker ident : %.*s\n"),
7460 eihi
.linkid
[0], eihi
.linkid
+ 1);
7461 fprintf (file
, _(" image build ident: %.*s\n"),
7462 eihi
.imgbid
[0], eihi
.imgbid
+ 1);
7466 struct vms_eihs eihs
;
7468 if (bfd_seek (abfd
, (file_ptr
) eihs_off
, SEEK_SET
)
7469 || bfd_bread (&eihs
, sizeof (eihs
), abfd
) != sizeof (eihs
))
7471 fprintf (file
, _("cannot read EIHS\n"));
7474 fprintf (file
, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
7475 (unsigned)bfd_getl32 (eihs
.majorid
),
7476 (unsigned)bfd_getl32 (eihs
.minorid
));
7477 dst_vbn
= bfd_getl32 (eihs
.dstvbn
);
7478 dst_size
= bfd_getl32 (eihs
.dstsize
);
7479 fprintf (file
, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
7480 dst_vbn
, dst_size
, dst_size
);
7481 gst_vbn
= bfd_getl32 (eihs
.gstvbn
);
7482 gst_size
= bfd_getl32 (eihs
.gstsize
);
7483 fprintf (file
, _(" global symbol table: vbn: %u, records: %u\n"),
7485 dmt_vbn
= bfd_getl32 (eihs
.dmtvbn
);
7486 dmt_size
= bfd_getl32 (eihs
.dmtsize
);
7487 fprintf (file
, _(" debug module table : vbn: %u, size: %u\n"),
7490 while (eisd_off
!= 0)
7492 struct vms_eisd eisd
;
7497 if (bfd_seek (abfd
, (file_ptr
) eisd_off
, SEEK_SET
)
7498 || bfd_bread (&eisd
, sizeof (eisd
), abfd
) != sizeof (eisd
))
7500 fprintf (file
, _("cannot read EISD\n"));
7503 len
= (unsigned)bfd_getl32 (eisd
.eisdsize
);
7504 if (len
!= (unsigned)-1)
7508 eisd_off
= (eisd_off
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
7510 fprintf (file
, _("Image section descriptor: (major: %u, minor: %u, "
7511 "size: %u, offset: %u)\n"),
7512 (unsigned)bfd_getl32 (eisd
.majorid
),
7513 (unsigned)bfd_getl32 (eisd
.minorid
),
7517 fprintf (file
, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
7518 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 4),
7519 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 0),
7520 (unsigned)bfd_getl32 (eisd
.secsize
));
7521 val
= (unsigned)bfd_getl32 (eisd
.flags
);
7522 fprintf (file
, _(" flags: 0x%04x"), val
);
7523 if (val
& EISD__M_GBL
)
7524 fprintf (file
, " GBL");
7525 if (val
& EISD__M_CRF
)
7526 fprintf (file
, " CRF");
7527 if (val
& EISD__M_DZRO
)
7528 fprintf (file
, " DZRO");
7529 if (val
& EISD__M_WRT
)
7530 fprintf (file
, " WRT");
7531 if (val
& EISD__M_INITALCODE
)
7532 fprintf (file
, " INITALCODE");
7533 if (val
& EISD__M_BASED
)
7534 fprintf (file
, " BASED");
7535 if (val
& EISD__M_FIXUPVEC
)
7536 fprintf (file
, " FIXUPVEC");
7537 if (val
& EISD__M_RESIDENT
)
7538 fprintf (file
, " RESIDENT");
7539 if (val
& EISD__M_VECTOR
)
7540 fprintf (file
, " VECTOR");
7541 if (val
& EISD__M_PROTECT
)
7542 fprintf (file
, " PROTECT");
7543 if (val
& EISD__M_LASTCLU
)
7544 fprintf (file
, " LASTCLU");
7545 if (val
& EISD__M_EXE
)
7546 fprintf (file
, " EXE");
7547 if (val
& EISD__M_NONSHRADR
)
7548 fprintf (file
, " NONSHRADR");
7549 if (val
& EISD__M_QUAD_LENGTH
)
7550 fprintf (file
, " QUAD_LENGTH");
7551 if (val
& EISD__M_ALLOC_64BIT
)
7552 fprintf (file
, " ALLOC_64BIT");
7553 fprintf (file
, "\n");
7554 if (val
& EISD__M_FIXUPVEC
)
7556 eiaf_vbn
= bfd_getl32 (eisd
.vbn
);
7557 eiaf_size
= bfd_getl32 (eisd
.secsize
);
7559 fprintf (file
, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
7560 (unsigned)bfd_getl32 (eisd
.vbn
),
7561 eisd
.pfc
, eisd
.matchctl
, eisd
.type
);
7564 case EISD__K_NORMAL
:
7565 fputs (_("NORMAL"), file
);
7567 case EISD__K_SHRFXD
:
7568 fputs (_("SHRFXD"), file
);
7570 case EISD__K_PRVFXD
:
7571 fputs (_("PRVFXD"), file
);
7573 case EISD__K_SHRPIC
:
7574 fputs (_("SHRPIC"), file
);
7576 case EISD__K_PRVPIC
:
7577 fputs (_("PRVPIC"), file
);
7579 case EISD__K_USRSTACK
:
7580 fputs (_("USRSTACK"), file
);
7583 fputs (_("*unknown*"), file
);
7586 fputs (_(")\n"), file
);
7587 if (val
& EISD__M_GBL
)
7588 fprintf (file
, _(" ident: 0x%08x, name: %.*s\n"),
7589 (unsigned)bfd_getl32 (eisd
.ident
),
7590 eisd
.gblnam
[0], eisd
.gblnam
+ 1);
7596 if (bfd_seek (abfd
, (file_ptr
) (dmt_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
7598 fprintf (file
, _("cannot read DMT\n"));
7602 fprintf (file
, _("Debug module table:\n"));
7604 while (dmt_size
> 0)
7606 struct vms_dmt_header dmth
;
7609 if (bfd_bread (&dmth
, sizeof (dmth
), abfd
) != sizeof (dmth
))
7611 fprintf (file
, _("cannot read DMT header\n"));
7614 count
= bfd_getl16 (dmth
.psect_count
);
7616 _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
7617 (unsigned)bfd_getl32 (dmth
.modbeg
),
7618 (unsigned)bfd_getl32 (dmth
.size
), count
);
7619 dmt_size
-= sizeof (dmth
);
7622 struct vms_dmt_psect dmtp
;
7624 if (bfd_bread (&dmtp
, sizeof (dmtp
), abfd
) != sizeof (dmtp
))
7626 fprintf (file
, _("cannot read DMT psect\n"));
7629 fprintf (file
, _(" psect start: 0x%08x, length: %u\n"),
7630 (unsigned)bfd_getl32 (dmtp
.start
),
7631 (unsigned)bfd_getl32 (dmtp
.length
));
7633 dmt_size
-= sizeof (dmtp
);
7640 if (bfd_seek (abfd
, (file_ptr
) (dst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
7642 fprintf (file
, _("cannot read DST\n"));
7646 evax_bfd_print_dst (abfd
, dst_size
, file
);
7650 if (bfd_seek (abfd
, (file_ptr
) (gst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
7652 fprintf (file
, _("cannot read GST\n"));
7656 fprintf (file
, _("Global symbol table:\n"));
7657 evax_bfd_print_eobj (abfd
, file
);
7662 struct vms_eiaf
*eiaf
;
7663 unsigned int qrelfixoff
;
7664 unsigned int lrelfixoff
;
7665 unsigned int qdotadroff
;
7666 unsigned int ldotadroff
;
7667 unsigned int shrimgcnt
;
7668 unsigned int shlstoff
;
7669 unsigned int codeadroff
;
7670 unsigned int lpfixoff
;
7671 unsigned int chgprtoff
;
7673 buf
= bfd_malloc (eiaf_size
);
7675 if (bfd_seek (abfd
, (file_ptr
) (eiaf_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
)
7676 || bfd_bread (buf
, eiaf_size
, abfd
) != eiaf_size
)
7678 fprintf (file
, _("cannot read EIHA\n"));
7682 eiaf
= (struct vms_eiaf
*)buf
;
7684 _("Image activator fixup: (major: %u, minor: %u)\n"),
7685 (unsigned)bfd_getl32 (eiaf
->majorid
),
7686 (unsigned)bfd_getl32 (eiaf
->minorid
));
7687 fprintf (file
, _(" iaflink : 0x%08x %08x\n"),
7688 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 0),
7689 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 4));
7690 fprintf (file
, _(" fixuplnk: 0x%08x %08x\n"),
7691 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 0),
7692 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 4));
7693 fprintf (file
, _(" size : %u\n"),
7694 (unsigned)bfd_getl32 (eiaf
->size
));
7695 fprintf (file
, _(" flags: 0x%08x\n"),
7696 (unsigned)bfd_getl32 (eiaf
->flags
));
7697 qrelfixoff
= bfd_getl32 (eiaf
->qrelfixoff
);
7698 lrelfixoff
= bfd_getl32 (eiaf
->lrelfixoff
);
7699 fprintf (file
, _(" qrelfixoff: %5u, lrelfixoff: %5u\n"),
7700 qrelfixoff
, lrelfixoff
);
7701 qdotadroff
= bfd_getl32 (eiaf
->qdotadroff
);
7702 ldotadroff
= bfd_getl32 (eiaf
->ldotadroff
);
7703 fprintf (file
, _(" qdotadroff: %5u, ldotadroff: %5u\n"),
7704 qdotadroff
, ldotadroff
);
7705 codeadroff
= bfd_getl32 (eiaf
->codeadroff
);
7706 lpfixoff
= bfd_getl32 (eiaf
->lpfixoff
);
7707 fprintf (file
, _(" codeadroff: %5u, lpfixoff : %5u\n"),
7708 codeadroff
, lpfixoff
);
7709 chgprtoff
= bfd_getl32 (eiaf
->chgprtoff
);
7710 fprintf (file
, _(" chgprtoff : %5u\n"), chgprtoff
);
7711 shrimgcnt
= bfd_getl32 (eiaf
->shrimgcnt
);
7712 shlstoff
= bfd_getl32 (eiaf
->shlstoff
);
7713 fprintf (file
, _(" shlstoff : %5u, shrimgcnt : %5u\n"),
7714 shlstoff
, shrimgcnt
);
7715 fprintf (file
, _(" shlextra : %5u, permctx : %5u\n"),
7716 (unsigned)bfd_getl32 (eiaf
->shlextra
),
7717 (unsigned)bfd_getl32 (eiaf
->permctx
));
7718 fprintf (file
, _(" base_va : 0x%08x\n"),
7719 (unsigned)bfd_getl32 (eiaf
->base_va
));
7720 fprintf (file
, _(" lppsbfixoff: %5u\n"),
7721 (unsigned)bfd_getl32 (eiaf
->lppsbfixoff
));
7725 struct vms_shl
*shl
= (struct vms_shl
*)(buf
+ shlstoff
);
7728 fprintf (file
, _(" Shareable images:\n"));
7729 for (j
= 0; j
< shrimgcnt
; j
++, shl
++)
7732 _(" %u: size: %u, flags: 0x%02x, name: %.*s\n"),
7733 j
, shl
->size
, shl
->flags
,
7734 shl
->imgnam
[0], shl
->imgnam
+ 1);
7737 if (qrelfixoff
!= 0)
7739 fprintf (file
, _(" quad-word relocation fixups:\n"));
7740 evax_bfd_print_relocation_records (file
, buf
+ qrelfixoff
, 8);
7742 if (lrelfixoff
!= 0)
7744 fprintf (file
, _(" long-word relocation fixups:\n"));
7745 evax_bfd_print_relocation_records (file
, buf
+ lrelfixoff
, 4);
7747 if (qdotadroff
!= 0)
7749 fprintf (file
, _(" quad-word .address reference fixups:\n"));
7750 evax_bfd_print_address_fixups (file
, buf
+ qdotadroff
);
7752 if (ldotadroff
!= 0)
7754 fprintf (file
, _(" long-word .address reference fixups:\n"));
7755 evax_bfd_print_address_fixups (file
, buf
+ ldotadroff
);
7757 if (codeadroff
!= 0)
7759 fprintf (file
, _(" Code Address Reference Fixups:\n"));
7760 evax_bfd_print_reference_fixups (file
, buf
+ codeadroff
);
7764 fprintf (file
, _(" Linkage Pairs Referece Fixups:\n"));
7765 evax_bfd_print_reference_fixups (file
, buf
+ lpfixoff
);
7769 unsigned int count
= (unsigned)bfd_getl32 (buf
+ chgprtoff
);
7770 struct vms_eicp
*eicp
= (struct vms_eicp
*)(buf
+ chgprtoff
+ 4);
7773 fprintf (file
, _(" Change Protection (%u entries):\n"), count
);
7774 for (j
= 0; j
< count
; j
++, eicp
++)
7776 unsigned int prot
= bfd_getl32 (eicp
->newprt
);
7778 _(" base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
7779 (unsigned)bfd_getl32 (eicp
->baseva
+ 4),
7780 (unsigned)bfd_getl32 (eicp
->baseva
+ 0),
7781 (unsigned)bfd_getl32 (eicp
->size
),
7782 (unsigned)bfd_getl32 (eicp
->newprt
));
7786 fprintf (file
, "NA");
7788 case PRT__C_RESERVED
:
7789 fprintf (file
, "RES");
7792 fprintf (file
, "KW");
7795 fprintf (file
, "KR");
7798 fprintf (file
, "UW");
7801 fprintf (file
, "EW");
7804 fprintf (file
, "ERKW");
7807 fprintf (file
, "ER");
7810 fprintf (file
, "SW");
7813 fprintf (file
, "SREW");
7816 fprintf (file
, "SRKW");
7819 fprintf (file
, "SR");
7822 fprintf (file
, "URSW");
7825 fprintf (file
, "UREW");
7828 fprintf (file
, "URKW");
7831 fprintf (file
, "UR");
7845 vms_bfd_print_private_bfd_data (bfd
*abfd
, void *ptr
)
7847 FILE *file
= (FILE *)ptr
;
7849 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
7850 evax_bfd_print_image (abfd
, file
);
7853 if (bfd_seek (abfd
, 0, SEEK_SET
))
7855 evax_bfd_print_eobj (abfd
, file
);
7862 /* Slurp ETIR/EDBG/ETBT VMS object records. */
7865 alpha_vms_read_sections_content (bfd
*abfd
, struct bfd_link_info
*info
)
7867 asection
*cur_section
;
7868 file_ptr cur_offset
;
7869 asection
*dst_section
;
7870 file_ptr dst_offset
;
7872 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
7878 dst_section
= PRIV (dst_section
);
7882 if (info
->strip
== strip_all
|| info
->strip
== strip_debugger
)
7884 /* Discard the DST section. */
7888 else if (dst_section
)
7890 dst_offset
= dst_section
->output_offset
;
7891 dst_section
= dst_section
->output_section
;
7900 type
= _bfd_vms_get_object_record (abfd
);
7903 vms_debug2 ((2, "next_record failed\n"));
7909 PRIV (image_section
) = cur_section
;
7910 PRIV (image_offset
) = cur_offset
;
7911 res
= _bfd_vms_slurp_etir (abfd
, info
);
7912 cur_section
= PRIV (image_section
);
7913 cur_offset
= PRIV (image_offset
);
7917 if (dst_section
== NULL
)
7919 PRIV (image_section
) = dst_section
;
7920 PRIV (image_offset
) = dst_offset
;
7921 res
= _bfd_vms_slurp_etir (abfd
, info
);
7922 dst_offset
= PRIV (image_offset
);
7931 vms_debug2 ((2, "slurp eobj type %d failed\n", type
));
7938 alpha_vms_sizeof_headers (bfd
*abfd ATTRIBUTE_UNUSED
,
7939 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
7944 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
7947 alpha_vms_add_fixup_lp (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
7949 struct alpha_vms_shlib_el
*sl
;
7950 asection
*sect
= PRIV2 (src
, image_section
);
7951 file_ptr offset
= PRIV2 (src
, image_offset
);
7953 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
7954 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
7955 sl
->has_fixups
= TRUE
;
7956 VEC_APPEND_EL (sl
->lp
, bfd_vma
,
7957 sect
->output_section
->vma
+ sect
->output_offset
+ offset
);
7961 alpha_vms_add_fixup_ca (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
7963 struct alpha_vms_shlib_el
*sl
;
7964 asection
*sect
= PRIV2 (src
, image_section
);
7965 file_ptr offset
= PRIV2 (src
, image_offset
);
7967 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
7968 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
7969 sl
->has_fixups
= TRUE
;
7970 VEC_APPEND_EL (sl
->ca
, bfd_vma
,
7971 sect
->output_section
->vma
+ sect
->output_offset
+ offset
);
7975 alpha_vms_add_fixup_qr (struct bfd_link_info
*info
, bfd
*src
,
7976 bfd
*shlib
, bfd_vma vec
)
7978 struct alpha_vms_shlib_el
*sl
;
7979 struct alpha_vms_vma_ref
*r
;
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 r
= VEC_APPEND (sl
->qr
, struct alpha_vms_vma_ref
);
7987 r
->vma
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
7992 alpha_vms_add_lw_fixup (struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
7993 unsigned int shr ATTRIBUTE_UNUSED
,
7994 bfd_vma vec ATTRIBUTE_UNUSED
)
8001 alpha_vms_add_qw_fixup (struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
8002 unsigned int shr ATTRIBUTE_UNUSED
,
8003 bfd_vma vec ATTRIBUTE_UNUSED
)
8010 alpha_vms_add_lw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8015 alpha_vms_add_qw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8019 static struct bfd_hash_entry
*
8020 alpha_vms_link_hash_newfunc (struct bfd_hash_entry
*entry
,
8021 struct bfd_hash_table
*table
,
8024 struct alpha_vms_link_hash_entry
*ret
=
8025 (struct alpha_vms_link_hash_entry
*) entry
;
8027 /* Allocate the structure if it has not already been allocated by a
8030 ret
= ((struct alpha_vms_link_hash_entry
*)
8031 bfd_hash_allocate (table
,
8032 sizeof (struct alpha_vms_link_hash_entry
)));
8036 /* Call the allocation method of the superclass. */
8037 ret
= ((struct alpha_vms_link_hash_entry
*)
8038 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
8043 return (struct bfd_hash_entry
*) ret
;
8046 /* Create an Alpha/VMS link hash table. */
8048 static struct bfd_link_hash_table
*
8049 alpha_vms_bfd_link_hash_table_create (bfd
*abfd
)
8051 struct alpha_vms_link_hash_table
*ret
;
8052 bfd_size_type amt
= sizeof (struct alpha_vms_link_hash_table
);
8054 ret
= (struct alpha_vms_link_hash_table
*) bfd_malloc (amt
);
8057 if (!_bfd_link_hash_table_init (&ret
->root
, abfd
,
8058 alpha_vms_link_hash_newfunc
,
8059 sizeof (struct alpha_vms_link_hash_entry
)))
8065 VEC_INIT (ret
->shrlibs
);
8072 alpha_vms_link_add_object_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8076 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
8078 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
8079 struct alpha_vms_link_hash_entry
*h
;
8080 struct bfd_link_hash_entry
*h_root
;
8083 if (!alpha_vms_convert_symbol (abfd
, e
, &sym
))
8086 if ((e
->flags
& EGSY__V_DEF
) && abfd
->selective_search
)
8088 /* In selective_search mode, only add definition that are
8090 h
= (struct alpha_vms_link_hash_entry
*)bfd_link_hash_lookup
8091 (info
->hash
, sym
.name
, FALSE
, FALSE
, FALSE
);
8092 if (h
== NULL
|| h
->root
.type
!= bfd_link_hash_undefined
)
8098 h_root
= (struct bfd_link_hash_entry
*) h
;
8099 if (_bfd_generic_link_add_one_symbol
8100 (info
, abfd
, sym
.name
, sym
.flags
, sym
.section
, sym
.value
,
8101 NULL
, FALSE
, FALSE
, &h_root
) == FALSE
)
8103 h
= (struct alpha_vms_link_hash_entry
*) h_root
;
8105 if ((e
->flags
& EGSY__V_DEF
)
8107 && abfd
->xvec
== info
->output_bfd
->xvec
)
8111 if (abfd
->flags
& DYNAMIC
)
8113 struct alpha_vms_shlib_el
*shlib
;
8115 /* We do not want to include any of the sections in a dynamic
8116 object in the output file. See comment in elflink.c. */
8117 bfd_section_list_clear (abfd
);
8119 shlib
= VEC_APPEND (alpha_vms_link_hash (info
)->shrlibs
,
8120 struct alpha_vms_shlib_el
);
8122 VEC_INIT (shlib
->ca
);
8123 VEC_INIT (shlib
->lp
);
8124 VEC_INIT (shlib
->qr
);
8125 PRIV (shr_index
) = VEC_COUNT (alpha_vms_link_hash (info
)->shrlibs
) - 1;
8132 alpha_vms_link_add_archive_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8135 struct bfd_link_hash_entry
**pundef
;
8136 struct bfd_link_hash_entry
**next_pundef
;
8138 /* We only accept VMS libraries. */
8139 if (info
->output_bfd
->xvec
!= abfd
->xvec
)
8141 bfd_set_error (bfd_error_wrong_format
);
8145 /* The archive_pass field in the archive itself is used to
8146 initialize PASS, since we may search the same archive multiple
8148 pass
= ++abfd
->archive_pass
;
8150 /* Look through the list of undefined symbols. */
8151 for (pundef
= &info
->hash
->undefs
; *pundef
!= NULL
; pundef
= next_pundef
)
8153 struct bfd_link_hash_entry
*h
;
8159 next_pundef
= &(*pundef
)->u
.undef
.next
;
8161 /* When a symbol is defined, it is not necessarily removed from
8163 if (h
->type
!= bfd_link_hash_undefined
8164 && h
->type
!= bfd_link_hash_common
)
8166 /* Remove this entry from the list, for general cleanliness
8167 and because we are going to look through the list again
8168 if we search any more libraries. We can't remove the
8169 entry if it is the tail, because that would lose any
8170 entries we add to the list later on. */
8171 if (*pundef
!= info
->hash
->undefs_tail
)
8173 *pundef
= *next_pundef
;
8174 next_pundef
= pundef
;
8179 /* Look for this symbol in the archive hash table. */
8180 symidx
= _bfd_vms_lib_find_symbol (abfd
, h
->root
.string
);
8181 if (symidx
== BFD_NO_MORE_SYMBOLS
)
8183 /* Nothing in this slot. */
8187 element
= bfd_get_elt_at_index (abfd
, symidx
);
8188 if (element
== NULL
)
8191 if (element
->archive_pass
== -1 || element
->archive_pass
== pass
)
8194 if (! bfd_check_format (element
, bfd_object
))
8196 element
->archive_pass
= -1;
8200 orig_element
= element
;
8201 if (bfd_is_thin_archive (abfd
))
8203 element
= _bfd_vms_lib_get_imagelib_file (element
);
8204 if (element
== NULL
|| !bfd_check_format (element
, bfd_object
))
8206 orig_element
->archive_pass
= -1;
8211 /* Unlike the generic linker, we know that this element provides
8212 a definition for an undefined symbol and we know that we want
8213 to include it. We don't need to check anything. */
8214 if (! (*info
->callbacks
->add_archive_element
) (info
, element
,
8217 if (! alpha_vms_link_add_object_symbols (element
, info
))
8220 orig_element
->archive_pass
= pass
;
8227 alpha_vms_bfd_link_add_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8229 switch (bfd_get_format (abfd
))
8232 vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
8234 return alpha_vms_link_add_object_symbols (abfd
, info
);
8237 vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
8239 return alpha_vms_link_add_archive_symbols (abfd
, info
);
8242 bfd_set_error (bfd_error_wrong_format
);
8248 alpha_vms_build_fixups (struct bfd_link_info
*info
)
8250 struct alpha_vms_link_hash_table
*t
= alpha_vms_link_hash (info
);
8251 unsigned char *content
;
8253 unsigned int sz
= 0;
8254 unsigned int lp_sz
= 0;
8255 unsigned int ca_sz
= 0;
8256 unsigned int qr_sz
= 0;
8257 unsigned int shrimg_cnt
= 0;
8258 struct vms_eiaf
*eiaf
;
8262 /* Shared libraries. */
8263 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8265 struct alpha_vms_shlib_el
*shlib
;
8267 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8269 if (!shlib
->has_fixups
)
8274 if (VEC_COUNT (shlib
->ca
) > 0)
8276 /* Header + entries. */
8278 ca_sz
+= VEC_COUNT (shlib
->ca
) * 4;
8280 if (VEC_COUNT (shlib
->lp
) > 0)
8282 /* Header + entries. */
8284 lp_sz
+= VEC_COUNT (shlib
->lp
) * 4;
8286 if (VEC_COUNT (shlib
->qr
) > 0)
8288 /* Header + entries. */
8290 qr_sz
+= VEC_COUNT (shlib
->qr
) * 8;
8301 /* Finish now if there is no content. */
8302 if (ca_sz
+ lp_sz
+ qr_sz
== 0)
8305 /* Allocate section content (round-up size) */
8306 sz
= sizeof (struct vms_eiaf
) + shrimg_cnt
* sizeof (struct vms_shl
)
8307 + ca_sz
+ lp_sz
+ qr_sz
;
8308 sz
= (sz
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
8309 content
= bfd_zalloc (info
->output_bfd
, sz
);
8310 if (content
== NULL
)
8313 sec
= alpha_vms_link_hash (info
)->fixup
;
8314 sec
->contents
= content
;
8317 eiaf
= (struct vms_eiaf
*)content
;
8318 off
= sizeof (struct vms_eiaf
);
8319 bfd_putl32 (0, eiaf
->majorid
);
8320 bfd_putl32 (0, eiaf
->minorid
);
8321 bfd_putl32 (0, eiaf
->iaflink
);
8322 bfd_putl32 (0, eiaf
->fixuplnk
);
8323 bfd_putl32 (sizeof (struct vms_eiaf
), eiaf
->size
);
8324 bfd_putl32 (0, eiaf
->flags
);
8325 bfd_putl32 (0, eiaf
->qrelfixoff
);
8326 bfd_putl32 (0, eiaf
->lrelfixoff
);
8327 bfd_putl32 (0, eiaf
->qdotadroff
);
8328 bfd_putl32 (0, eiaf
->ldotadroff
);
8329 bfd_putl32 (0, eiaf
->codeadroff
);
8330 bfd_putl32 (0, eiaf
->lpfixoff
);
8331 bfd_putl32 (0, eiaf
->chgprtoff
);
8332 bfd_putl32 (shrimg_cnt
? off
: 0, eiaf
->shlstoff
);
8333 bfd_putl32 (shrimg_cnt
, eiaf
->shrimgcnt
);
8334 bfd_putl32 (0, eiaf
->shlextra
);
8335 bfd_putl32 (0, eiaf
->permctx
);
8336 bfd_putl32 (0, eiaf
->base_va
);
8337 bfd_putl32 (0, eiaf
->lppsbfixoff
);
8344 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8346 struct alpha_vms_shlib_el
*shlib
;
8347 struct vms_shl
*shl
;
8349 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8351 if (!shlib
->has_fixups
)
8354 /* Renumber shared images. */
8355 PRIV2 (shlib
->abfd
, shr_index
) = shrimg_cnt
++;
8357 shl
= (struct vms_shl
*)(content
+ off
);
8358 bfd_putl32 (0, shl
->baseva
);
8359 bfd_putl32 (0, shl
->shlptr
);
8360 bfd_putl32 (0, shl
->ident
);
8361 bfd_putl32 (0, shl
->permctx
);
8362 shl
->size
= sizeof (struct vms_shl
);
8363 bfd_putl16 (0, shl
->fill_1
);
8365 bfd_putl32 (0, shl
->icb
);
8366 shl
->imgnam
[0] = strlen (PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
));
8367 memcpy (shl
->imgnam
+ 1, PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
),
8370 off
+= sizeof (struct vms_shl
);
8376 bfd_putl32 (off
, eiaf
->codeadroff
);
8378 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8380 struct alpha_vms_shlib_el
*shlib
;
8383 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8385 if (VEC_COUNT (shlib
->ca
) == 0)
8388 bfd_putl32 (VEC_COUNT (shlib
->ca
), content
+ off
);
8389 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8392 for (j
= 0; j
< VEC_COUNT (shlib
->ca
); j
++)
8394 bfd_putl32 (VEC_EL (shlib
->ca
, bfd_vma
, j
) - t
->base_addr
,
8400 bfd_putl32 (0, content
+ off
);
8401 bfd_putl32 (0, content
+ off
+ 4);
8408 bfd_putl32 (off
, eiaf
->lpfixoff
);
8410 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8412 struct alpha_vms_shlib_el
*shlib
;
8415 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8417 if (VEC_COUNT (shlib
->lp
) == 0)
8420 bfd_putl32 (VEC_COUNT (shlib
->lp
), content
+ off
);
8421 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8424 for (j
= 0; j
< VEC_COUNT (shlib
->lp
); j
++)
8426 bfd_putl32 (VEC_EL (shlib
->lp
, bfd_vma
, j
) - t
->base_addr
,
8432 bfd_putl32 (0, content
+ off
);
8433 bfd_putl32 (0, content
+ off
+ 4);
8440 bfd_putl32 (off
, eiaf
->qdotadroff
);
8442 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8444 struct alpha_vms_shlib_el
*shlib
;
8447 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8449 if (VEC_COUNT (shlib
->qr
) == 0)
8452 bfd_putl32 (VEC_COUNT (shlib
->qr
), content
+ off
);
8453 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8456 for (j
= 0; j
< VEC_COUNT (shlib
->qr
); j
++)
8458 struct alpha_vms_vma_ref
*r
;
8459 r
= &VEC_EL (shlib
->qr
, struct alpha_vms_vma_ref
, j
);
8460 bfd_putl32 (r
->vma
- t
->base_addr
, content
+ off
);
8461 bfd_putl32 (r
->ref
, content
+ off
+ 4);
8466 bfd_putl32 (0, content
+ off
);
8467 bfd_putl32 (0, content
+ off
+ 4);
8478 alpha_vms_bfd_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
8481 struct bfd_link_order
*p
;
8489 bfd_get_outsymbols (abfd
) = NULL
;
8490 bfd_get_symcount (abfd
) = 0;
8492 /* Mark all sections which will be included in the output file. */
8493 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
8494 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
8495 if (p
->type
== bfd_indirect_link_order
)
8496 p
->u
.indirect
.section
->linker_mark
= TRUE
;
8499 /* Handle all the link order information for the sections. */
8500 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
8502 printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
8503 o
->name
, (unsigned)o
->vma
, (unsigned)o
->flags
);
8505 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
8507 printf (" at 0x%08x - 0x%08x: ",
8508 (unsigned)p
->offset
, (unsigned)(p
->offset
+ p
->size
- 1));
8511 case bfd_section_reloc_link_order
:
8512 case bfd_symbol_reloc_link_order
:
8513 printf (" section/symbol reloc\n");
8515 case bfd_indirect_link_order
:
8516 printf (" section %s of %s\n",
8517 p
->u
.indirect
.section
->name
,
8518 p
->u
.indirect
.section
->owner
->filename
);
8520 case bfd_data_link_order
:
8521 printf (" explicit data\n");
8524 printf (" *unknown* type %u\n", p
->type
);
8531 /* Find the entry point. */
8532 if (bfd_get_start_address (abfd
) == 0)
8534 bfd
*startbfd
= NULL
;
8536 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link_next
)
8538 /* Consider only VMS object files. */
8539 if (sub
->xvec
!= abfd
->xvec
)
8542 if (!PRIV2 (sub
, eom_data
).eom_has_transfer
)
8544 if ((PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
) && startbfd
)
8546 if (startbfd
!= NULL
8547 && !(PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
))
8549 (*info
->callbacks
->einfo
)
8550 (_("%P: multiple entry points: in modules %B and %B\n"),
8559 unsigned int ps_idx
= PRIV2 (startbfd
, eom_data
).eom_l_psindx
;
8560 bfd_vma tfradr
= PRIV2 (startbfd
, eom_data
).eom_l_tfradr
;
8563 sec
= PRIV2 (startbfd
, sections
)[ps_idx
];
8565 bfd_set_start_address
8566 (abfd
, sec
->output_section
->vma
+ sec
->output_offset
+ tfradr
);
8570 /* Allocate contents. */
8571 base_addr
= (bfd_vma
)-1;
8573 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
8575 if (o
->flags
& SEC_HAS_CONTENTS
)
8577 o
->contents
= bfd_alloc (abfd
, o
->size
);
8578 if (o
->contents
== NULL
)
8581 if (o
->flags
& SEC_LOAD
)
8583 if (o
->vma
< base_addr
)
8585 if (o
->vma
+ o
->size
> last_addr
)
8586 last_addr
= o
->vma
+ o
->size
;
8590 /* Create the fixup section. */
8591 fixupsec
= bfd_make_section_anyway_with_flags
8592 (info
->output_bfd
, "$FIXUP$",
8593 SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
8594 if (fixupsec
== NULL
)
8596 last_addr
= (last_addr
+ 0xffff) & ~0xffff;
8597 fixupsec
->vma
= last_addr
;
8599 alpha_vms_link_hash (info
)->fixup
= fixupsec
;
8600 alpha_vms_link_hash (info
)->base_addr
= base_addr
;
8602 /* Create the DMT section, if necessary. */
8603 dst
= PRIV (dst_section
);
8604 if (dst
!= NULL
&& dst
->size
== 0)
8608 dmt
= bfd_make_section_anyway_with_flags
8609 (info
->output_bfd
, "$DMT$",
8610 SEC_DEBUGGING
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
8617 /* Read all sections from the inputs. */
8618 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link_next
)
8620 if (sub
->flags
& DYNAMIC
)
8622 alpha_vms_create_eisd_for_shared (abfd
, sub
);
8626 if (!alpha_vms_read_sections_content (sub
, info
))
8630 /* Handle all the link order information for the sections.
8631 Note: past this point, it is not possible to create new sections. */
8632 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
8634 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
8638 case bfd_section_reloc_link_order
:
8639 case bfd_symbol_reloc_link_order
:
8642 case bfd_indirect_link_order
:
8646 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
8653 /* Compute fixups. */
8654 if (!alpha_vms_build_fixups (info
))
8657 /* Compute the DMT. */
8661 unsigned char *contents
= NULL
;
8663 /* In pass 1, compute the size. In pass 2, write the DMT contents. */
8664 for (pass
= 0; pass
< 2; pass
++)
8666 unsigned int off
= 0;
8668 /* For each object file (ie for each module). */
8669 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link_next
)
8672 struct vms_dmt_header
*dmth
= NULL
;
8673 unsigned int psect_count
;
8675 /* Skip this module if it has no DST. */
8676 sub_dst
= PRIV2 (sub
, dst_section
);
8677 if (sub_dst
== NULL
|| sub_dst
->size
== 0)
8682 /* Write the header. */
8683 dmth
= (struct vms_dmt_header
*)(contents
+ off
);
8684 bfd_putl32 (sub_dst
->output_offset
, dmth
->modbeg
);
8685 bfd_putl32 (sub_dst
->size
, dmth
->size
);
8688 off
+= sizeof (struct vms_dmt_header
);
8691 /* For each section (ie for each psect). */
8692 for (o
= sub
->sections
; o
!= NULL
; o
= o
->next
)
8694 /* Only consider interesting sections. */
8695 if (!(o
->flags
& SEC_ALLOC
))
8697 if (o
->flags
& SEC_LINKER_CREATED
)
8702 /* Write an entry. */
8703 struct vms_dmt_psect
*dmtp
;
8705 dmtp
= (struct vms_dmt_psect
*)(contents
+ off
);
8706 bfd_putl32 (o
->output_offset
+ o
->output_section
->vma
,
8708 bfd_putl32 (o
->size
, dmtp
->length
);
8711 off
+= sizeof (struct vms_dmt_psect
);
8714 bfd_putl32 (psect_count
, dmth
->psect_count
);
8719 contents
= bfd_zalloc (info
->output_bfd
, off
);
8720 if (contents
== NULL
)
8722 dmt
->contents
= contents
;
8727 BFD_ASSERT (off
== dmt
->size
);
8735 /* Read the contents of a section.
8736 buf points to a buffer of buf_size bytes to be filled with
8737 section data (starting at offset into section) */
8740 alpha_vms_get_section_contents (bfd
*abfd
, asection
*section
,
8741 void *buf
, file_ptr offset
,
8742 bfd_size_type count
)
8746 /* Image are easy. */
8747 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
8748 return _bfd_generic_get_section_contents (abfd
, section
,
8749 buf
, offset
, count
);
8752 if (offset
+ count
< count
8753 || offset
+ count
> section
->size
)
8755 bfd_set_error (bfd_error_invalid_operation
);
8759 /* Alloc in memory and read ETIRs. */
8760 BFD_ASSERT (section
->contents
== NULL
);
8762 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
8764 BFD_ASSERT (sec
->contents
== NULL
);
8766 if (sec
->size
!= 0 && (sec
->flags
& SEC_HAS_CONTENTS
))
8768 sec
->contents
= bfd_alloc (abfd
, sec
->size
);
8769 if (sec
->contents
== NULL
)
8773 if (!alpha_vms_read_sections_content (abfd
, NULL
))
8775 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
8776 if (section
->contents
)
8777 section
->flags
|= SEC_IN_MEMORY
;
8778 memcpy (buf
, section
->contents
+ offset
, count
);
8783 /* Set the format of a file being written. */
8786 alpha_vms_mkobject (bfd
* abfd
)
8788 const bfd_arch_info_type
*arch
;
8790 vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd
));
8792 if (!vms_initialize (abfd
))
8795 PRIV (recwr
.buf
) = bfd_alloc (abfd
, MAX_OUTREC_SIZE
);
8796 if (PRIV (recwr
.buf
) == NULL
)
8799 arch
= bfd_scan_arch ("alpha");
8803 bfd_set_error (bfd_error_wrong_format
);
8807 abfd
->arch_info
= arch
;
8814 /* Called when the BFD is being closed to do any necessary cleanup. */
8817 vms_close_and_cleanup (bfd
* abfd
)
8819 vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd
));
8821 if (abfd
== NULL
|| abfd
->tdata
.any
== NULL
)
8824 if (abfd
->format
== bfd_archive
)
8826 bfd_release (abfd
, abfd
->tdata
.any
);
8827 abfd
->tdata
.any
= NULL
;
8831 if (PRIV (recrd
.buf
) != NULL
)
8832 free (PRIV (recrd
.buf
));
8834 if (PRIV (sections
) != NULL
)
8835 free (PRIV (sections
));
8837 bfd_release (abfd
, abfd
->tdata
.any
);
8838 abfd
->tdata
.any
= NULL
;
8841 if (abfd
->direction
== write_direction
)
8843 /* Last step on VMS is to convert the file to variable record length
8845 if (bfd_cache_close (abfd
) != TRUE
)
8847 if (vms_convert_to_var_unix_filename (abfd
->filename
) != TRUE
)
8855 /* Called when a new section is created. */
8858 vms_new_section_hook (bfd
* abfd
, asection
*section
)
8862 vms_debug2 ((1, "vms_new_section_hook (%p, [%d]%s)\n",
8863 abfd
, section
->index
, section
->name
));
8865 bfd_set_section_alignment (abfd
, section
, 0);
8867 vms_debug2 ((7, "%d: %s\n", section
->index
, section
->name
));
8869 amt
= sizeof (struct vms_section_data_struct
);
8870 section
->used_by_bfd
= (PTR
) bfd_zalloc (abfd
, amt
);
8871 if (section
->used_by_bfd
== NULL
)
8874 if (strcmp (bfd_get_section_name (abfd
, section
), "$DST$") == 0)
8875 PRIV (dst_section
) = section
;
8877 /* Create the section symbol. */
8878 return _bfd_generic_new_section_hook (abfd
, section
);
8881 /* Part 4.5, symbols. */
8883 /* Print symbol to file according to how. how is one of
8884 bfd_print_symbol_name just print the name
8885 bfd_print_symbol_more print more (???)
8886 bfd_print_symbol_all print all we know, which is not much right now :-). */
8889 vms_print_symbol (bfd
* abfd
,
8892 bfd_print_symbol_type how
)
8894 vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
8895 abfd
, file
, symbol
, how
));
8899 case bfd_print_symbol_name
:
8900 case bfd_print_symbol_more
:
8901 fprintf ((FILE *)file
," %s", symbol
->name
);
8904 case bfd_print_symbol_all
:
8906 const char *section_name
= symbol
->section
->name
;
8908 bfd_print_symbol_vandf (abfd
, file
, symbol
);
8910 fprintf ((FILE *) file
," %-8s %s", section_name
, symbol
->name
);
8916 /* Return information about symbol in ret.
8918 fill type, value and name
8921 B bss segment symbol
8923 D data segment symbol
8925 t a static function symbol
8926 T text segment symbol
8931 vms_get_symbol_info (bfd
* abfd ATTRIBUTE_UNUSED
,
8937 vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd
, symbol
, ret
));
8939 sec
= symbol
->section
;
8946 else if (bfd_is_com_section (sec
))
8948 else if (bfd_is_abs_section (sec
))
8950 else if (bfd_is_und_section (sec
))
8952 else if (bfd_is_ind_section (sec
))
8954 else if ((symbol
->flags
& BSF_FUNCTION
)
8955 || (bfd_get_section_flags (abfd
, sec
) & SEC_CODE
))
8957 else if (bfd_get_section_flags (abfd
, sec
) & SEC_DATA
)
8959 else if (bfd_get_section_flags (abfd
, sec
) & SEC_ALLOC
)
8964 if (ret
->type
!= 'U')
8965 ret
->value
= symbol
->value
+ symbol
->section
->vma
;
8968 ret
->name
= symbol
->name
;
8971 /* Return TRUE if the given symbol sym in the BFD abfd is
8972 a compiler generated local label, else return FALSE. */
8975 vms_bfd_is_local_label_name (bfd
* abfd ATTRIBUTE_UNUSED
,
8978 vms_debug2 ((1, "vms_bfd_is_local_label_name (%p, %s)\n", abfd
, name
));
8979 return name
[0] == '$';
8982 /* Part 4.7, writing an object file. */
8984 /* Sets the contents of the section section in BFD abfd to the data starting
8985 in memory at LOCATION. The data is written to the output section starting
8986 at offset offset for count bytes.
8988 Normally TRUE is returned, else FALSE. Possible error returns are:
8989 o bfd_error_no_contents - The output section does not have the
8990 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
8991 o and some more too */
8994 _bfd_vms_set_section_contents (bfd
* abfd
,
8996 const void * location
,
8998 bfd_size_type count
)
9000 if (section
->contents
== NULL
)
9002 section
->contents
= bfd_alloc (abfd
, section
->size
);
9003 if (section
->contents
== NULL
)
9006 memcpy (section
->contents
+ offset
, location
, (size_t) count
);
9012 /* Set the architecture and machine type in BFD abfd to arch and mach.
9013 Find the correct pointer to a structure and insert it into the arch_info
9017 alpha_vms_set_arch_mach (bfd
*abfd
,
9018 enum bfd_architecture arch
, unsigned long mach
)
9020 if (arch
!= bfd_arch_alpha
9021 && arch
!= bfd_arch_unknown
)
9024 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
9027 /* Set section VMS flags. Clear NO_FLAGS and set FLAGS. */
9030 bfd_vms_set_section_flags (bfd
*abfd ATTRIBUTE_UNUSED
,
9031 asection
*sec
, flagword no_flags
, flagword flags
)
9033 vms_section_data (sec
)->no_flags
= no_flags
;
9034 vms_section_data (sec
)->flags
= flags
;
9037 struct vms_private_data_struct
*
9038 bfd_vms_get_data (bfd
*abfd
)
9040 return (struct vms_private_data_struct
*)abfd
->tdata
.any
;
9043 #define vms_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9044 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms
9045 #define vms_bfd_copy_link_hash_symbol_type \
9046 _bfd_generic_copy_link_hash_symbol_type
9047 #define vms_bfd_is_group_section bfd_generic_is_group_section
9048 #define vms_bfd_discard_group bfd_generic_discard_group
9049 #define vms_section_already_linked _bfd_generic_section_already_linked
9050 #define vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9051 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
9053 #define vms_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
9054 #define vms_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
9055 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
9056 #define vms_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
9057 #define vms_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
9058 #define vms_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
9060 /* Symbols table. */
9061 #define alpha_vms_make_empty_symbol _bfd_generic_make_empty_symbol
9062 #define alpha_vms_bfd_is_target_special_symbol \
9063 ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
9064 #define alpha_vms_print_symbol vms_print_symbol
9065 #define alpha_vms_get_symbol_info vms_get_symbol_info
9066 #define alpha_vms_read_minisymbols _bfd_generic_read_minisymbols
9067 #define alpha_vms_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
9068 #define alpha_vms_get_lineno _bfd_nosymbols_get_lineno
9069 #define alpha_vms_find_inliner_info _bfd_nosymbols_find_inliner_info
9070 #define alpha_vms_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
9071 #define alpha_vms_find_nearest_line _bfd_vms_find_nearest_dst_line
9072 #define alpha_vms_bfd_is_local_label_name vms_bfd_is_local_label_name
9074 /* Generic table. */
9075 #define alpha_vms_close_and_cleanup vms_close_and_cleanup
9076 #define alpha_vms_bfd_free_cached_info vms_bfd_free_cached_info
9077 #define alpha_vms_new_section_hook vms_new_section_hook
9078 #define alpha_vms_set_section_contents _bfd_vms_set_section_contents
9079 #define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
9081 #define alpha_vms_bfd_get_relocated_section_contents \
9082 bfd_generic_get_relocated_section_contents
9084 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
9085 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
9086 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
9087 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
9088 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
9089 #define alpha_vms_section_already_linked \
9090 _bfd_generic_section_already_linked
9092 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9093 #define alpha_vms_bfd_link_hash_table_free _bfd_generic_link_hash_table_free
9094 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
9095 #define alpha_vms_bfd_copy_link_hash_symbol_type \
9096 _bfd_generic_copy_link_hash_symbol_type
9098 #define alpha_vms_bfd_link_split_section _bfd_generic_link_split_section
9100 #define alpha_vms_get_dynamic_symtab_upper_bound \
9101 _bfd_nodynamic_get_dynamic_symtab_upper_bound
9102 #define alpha_vms_canonicalize_dynamic_symtab \
9103 _bfd_nodynamic_canonicalize_dynamic_symtab
9104 #define alpha_vms_get_dynamic_reloc_upper_bound \
9105 _bfd_nodynamic_get_dynamic_reloc_upper_bound
9106 #define alpha_vms_canonicalize_dynamic_reloc \
9107 _bfd_nodynamic_canonicalize_dynamic_reloc
9109 const bfd_target vms_alpha_vec
=
9111 "vms-alpha", /* Name. */
9112 bfd_target_evax_flavour
,
9113 BFD_ENDIAN_LITTLE
, /* Data byte order is little. */
9114 BFD_ENDIAN_LITTLE
, /* Header byte order is little. */
9116 (HAS_RELOC
| EXEC_P
| HAS_LINENO
| HAS_DEBUG
| HAS_SYMS
| HAS_LOCALS
9117 | WP_TEXT
| D_PAGED
), /* Object flags. */
9118 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
9119 | SEC_READONLY
| SEC_CODE
| SEC_DATA
9120 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* Sect flags. */
9121 0, /* symbol_leading_char. */
9122 ' ', /* ar_pad_char. */
9123 15, /* ar_max_namelen. */
9124 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
9125 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
9126 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
9127 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
9128 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
9129 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
9131 {_bfd_dummy_target
, alpha_vms_object_p
, /* bfd_check_format. */
9132 _bfd_vms_lib_alpha_archive_p
, _bfd_dummy_target
},
9133 {bfd_false
, alpha_vms_mkobject
, /* bfd_set_format. */
9134 _bfd_vms_lib_mkarchive
, bfd_false
},
9135 {bfd_false
, alpha_vms_write_object_contents
, /* bfd_write_contents. */
9136 _bfd_vms_lib_write_archive_contents
, bfd_false
},
9138 BFD_JUMP_TABLE_GENERIC (alpha_vms
),
9139 BFD_JUMP_TABLE_COPY (vms
),
9140 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
9141 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib
),
9142 BFD_JUMP_TABLE_SYMBOLS (alpha_vms
),
9143 BFD_JUMP_TABLE_RELOCS (alpha_vms
),
9144 BFD_JUMP_TABLE_WRITE (alpha_vms
),
9145 BFD_JUMP_TABLE_LINK (alpha_vms
),
9146 BFD_JUMP_TABLE_DYNAMIC (alpha_vms
),