1 /* vms.c -- BFD back-end for EVAX (openVMS/Alpha) files.
2 Copyright (C) 1996-2020 Free Software Foundation, Inc.
4 Initial version written by Klaus Kaempf (kkaempf@rmi.de)
5 Major rewrite by Adacore.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
25 o Generation of shared image
26 o Relocation optimizations
32 o protected sections (for messages)
51 #include "vms/eihvn.h"
52 #include "vms/eobjrec.h"
55 #include "vms/esgps.h"
64 #include "vms/esdfm.h"
65 #include "vms/esdfv.h"
71 #include "vms/internal.h"
74 #define MIN(a,b) ((a) < (b) ? (a) : (b))
79 /* The r_type field in a reloc is one of the following values. */
80 #define ALPHA_R_IGNORE 0
81 #define ALPHA_R_REFQUAD 1
82 #define ALPHA_R_BRADDR 2
83 #define ALPHA_R_HINT 3
84 #define ALPHA_R_SREL16 4
85 #define ALPHA_R_SREL32 5
86 #define ALPHA_R_SREL64 6
87 #define ALPHA_R_OP_PUSH 7
88 #define ALPHA_R_OP_STORE 8
89 #define ALPHA_R_OP_PSUB 9
90 #define ALPHA_R_OP_PRSHIFT 10
91 #define ALPHA_R_LINKAGE 11
92 #define ALPHA_R_REFLONG 12
93 #define ALPHA_R_CODEADDR 13
94 #define ALPHA_R_NOP 14
95 #define ALPHA_R_BSR 15
96 #define ALPHA_R_LDA 16
97 #define ALPHA_R_BOH 17
99 /* These are used with DST_S_C_LINE_NUM. */
100 #define DST_S_C_LINE_NUM_HEADER_SIZE 4
102 /* These are used with DST_S_C_SOURCE */
104 #define DST_S_B_PCLINE_UNSBYTE 1
105 #define DST_S_W_PCLINE_UNSWORD 1
106 #define DST_S_L_PCLINE_UNSLONG 1
108 #define DST_S_B_MODBEG_NAME 14
109 #define DST_S_L_RTNBEG_ADDRESS 5
110 #define DST_S_B_RTNBEG_NAME 13
111 #define DST_S_L_RTNEND_SIZE 5
113 /* These are used with DST_S_C_SOURCE. */
114 #define DST_S_C_SOURCE_HEADER_SIZE 4
116 #define DST_S_B_SRC_DF_LENGTH 1
117 #define DST_S_W_SRC_DF_FILEID 3
118 #define DST_S_B_SRC_DF_FILENAME 20
119 #define DST_S_B_SRC_UNSBYTE 1
120 #define DST_S_W_SRC_UNSWORD 1
121 #define DST_S_L_SRC_UNSLONG 1
123 /* Debugger symbol definitions. */
125 #define DBG_S_L_DMT_MODBEG 0
126 #define DBG_S_L_DST_SIZE 4
127 #define DBG_S_W_DMT_PSECT_COUNT 8
128 #define DBG_S_C_DMT_HEADER_SIZE 12
130 #define DBG_S_L_DMT_PSECT_START 0
131 #define DBG_S_L_DMT_PSECT_LENGTH 4
132 #define DBG_S_C_DMT_PSECT_SIZE 8
134 /* VMS module header. */
150 #define EMH_DATE_LENGTH 17
152 /* VMS End-Of-Module records (EOM/EEOM). */
156 unsigned int eom_l_total_lps
;
157 unsigned short eom_w_comcod
;
158 bfd_boolean eom_has_transfer
;
159 unsigned char eom_b_tfrflg
;
160 unsigned int eom_l_psindx
;
161 unsigned int eom_l_tfradr
;
164 struct vms_symbol_entry
170 unsigned char data_type
;
171 unsigned short flags
;
173 /* Section and offset/value of the symbol. */
177 /* Section and offset/value for the entry point (only for subprg). */
178 asection
*code_section
;
179 unsigned int code_value
;
181 /* Symbol vector offset. */
182 unsigned int symbol_vector
;
184 /* Length of the name. */
185 unsigned char namelen
;
190 /* Stack value for push/pop commands. */
198 #define STACKSIZE 128
200 /* A minimal decoding of DST compilation units. We only decode
201 what's needed to get to the line number information. */
211 struct srecinfo
*next
;
219 struct lineinfo
*next
;
226 struct funcinfo
*next
;
234 /* Chain the previously read compilation unit. */
237 /* The module name. */
240 /* The start offset and size of debug info in the DST section. */
244 /* The lowest and highest addresses contained in this compilation
245 unit as specified in the compilation unit header. */
249 /* The listing line table. */
250 struct lineinfo
*line_table
;
252 /* The source record table. */
253 struct srecinfo
*srec_table
;
255 /* A list of the functions found in this module. */
256 struct funcinfo
*func_table
;
258 /* Current allocation of file_table. */
259 unsigned int file_table_count
;
261 /* An array of the files making up this module. */
262 struct fileinfo
*file_table
;
265 /* BFD private data for alpha-vms. */
267 struct vms_private_data_struct
269 /* If true, relocs have been read. */
270 bfd_boolean reloc_done
;
272 /* Record input buffer. */
273 struct vms_rec_rd recrd
;
274 struct vms_rec_wr recwr
;
276 struct hdr_struct hdr_data
; /* data from HDR/EMH record */
277 struct eom_struct eom_data
; /* data from EOM/EEOM record */
279 /* Transfer addresses (entry points). */
280 bfd_vma transfer_address
[4];
282 /* Array of GSD sections to get the correspond BFD one. */
283 unsigned int section_max
; /* Size of the sections array. */
284 unsigned int section_count
; /* Number of GSD sections. */
287 /* Array of raw symbols. */
288 struct vms_symbol_entry
**syms
;
290 /* Canonicalized symbols. */
293 /* Number of symbols. */
294 unsigned int gsd_sym_count
;
295 /* Size of the syms array. */
296 unsigned int max_sym_count
;
297 /* Number of procedure symbols. */
298 unsigned int norm_sym_count
;
300 /* Stack used to evaluate TIR/ETIR commands. */
301 struct stack_struct
*stack
;
304 /* Content reading. */
305 asection
*image_section
; /* section for image_ptr */
306 file_ptr image_offset
; /* Offset for image_ptr. */
308 struct module
*modules
; /* list of all compilation units */
310 /* The DST section. */
311 asection
*dst_section
;
313 unsigned int dst_ptr_offsets_count
; /* # of offsets in following array */
314 unsigned int *dst_ptr_offsets
; /* array of saved image_ptr offsets */
316 /* Shared library support */
317 bfd_vma symvva
; /* relative virtual address of symbol vector */
319 unsigned char matchctl
;
321 /* Shared library index. This is used for input bfd while linking. */
322 unsigned int shr_index
;
324 /* Used to place structures in the file. */
327 /* Simply linked list of eisd. */
328 struct vms_internal_eisd_map
*eisd_head
;
329 struct vms_internal_eisd_map
*eisd_tail
;
331 /* Simply linked list of eisd for shared libraries. */
332 struct vms_internal_eisd_map
*gbl_eisd_head
;
333 struct vms_internal_eisd_map
*gbl_eisd_tail
;
335 /* linkage index counter used by conditional store commands */
336 unsigned int vms_linkage_index
;
339 #define PRIV2(abfd, name) \
340 (((struct vms_private_data_struct *)(abfd)->tdata.any)->name)
341 #define PRIV(name) PRIV2(abfd,name)
344 /* Used to keep extra VMS specific information for a given section.
346 reloc_size holds the size of the relocation stream, note this
347 is very different from the number of relocations as VMS relocations
350 reloc_stream is the actual stream of relocation entries. */
352 struct vms_section_data_struct
354 /* Maximnum number of entries in sec->relocation. */
357 /* Corresponding eisd. Used only while generating executables. */
358 struct vms_internal_eisd_map
*eisd
;
360 /* PSC flags to be clear. */
363 /* PSC flags to be set. */
367 #define vms_section_data(sec) \
368 ((struct vms_section_data_struct *)sec->used_by_bfd)
370 /* To be called from the debugger. */
371 struct vms_private_data_struct
*bfd_vms_get_data (bfd
*);
373 static int vms_get_remaining_object_record (bfd
*, unsigned int);
374 static bfd_boolean
_bfd_vms_slurp_object_records (bfd
* abfd
);
375 static bfd_boolean
alpha_vms_add_fixup_lp (struct bfd_link_info
*,
377 static bfd_boolean
alpha_vms_add_fixup_ca (struct bfd_link_info
*,
379 static bfd_boolean
alpha_vms_add_fixup_qr (struct bfd_link_info
*,
380 bfd
*, bfd
*, bfd_vma
);
381 static bfd_boolean
alpha_vms_add_fixup_lr (struct bfd_link_info
*,
382 unsigned int, bfd_vma
);
383 static bfd_boolean
alpha_vms_add_lw_reloc (struct bfd_link_info
*);
384 static bfd_boolean
alpha_vms_add_qw_reloc (struct bfd_link_info
*);
393 /* Number of elements in VEC. */
395 #define VEC_COUNT(VEC) ((VEC).nbr_el)
397 /* Get the address of the Nth element. */
399 #define VEC_EL(VEC, TYPE, N) (((TYPE *)((VEC).els))[N])
401 #define VEC_INIT(VEC) \
408 /* Be sure there is room for a new element. */
410 static void *vector_grow1 (struct vector_type
*vec
, size_t elsz
);
412 /* Allocate room for a new element and return its address. */
414 #define VEC_APPEND(VEC, TYPE) \
415 ((TYPE *) vector_grow1 (&VEC, sizeof (TYPE)))
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 libraries. */
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 /* PR 21813: Check for an undersized record. */
478 if (PRIV (recrd
.buf_size
) < sizeof (* eihd
))
480 _bfd_error_handler (_("corrupt EIHD record - size is too small"));
481 bfd_set_error (bfd_error_bad_value
);
485 size
= bfd_getl32 (eihd
->size
);
486 imgtype
= bfd_getl32 (eihd
->imgtype
);
488 if (imgtype
== EIHD__K_EXE
|| imgtype
== EIHD__K_LIM
)
489 abfd
->flags
|= EXEC_P
;
491 symvva
= bfd_getl64 (eihd
->symvva
);
494 PRIV (symvva
) = symvva
;
495 abfd
->flags
|= DYNAMIC
;
498 PRIV (ident
) = bfd_getl32 (eihd
->ident
);
499 PRIV (matchctl
) = eihd
->matchctl
;
501 *eisd_offset
= bfd_getl32 (eihd
->isdoff
);
502 *eihs_offset
= bfd_getl32 (eihd
->symdbgoff
);
504 vms_debug2 ((4, "EIHD size %d imgtype %d symvva 0x%lx eisd %d eihs %d\n",
505 size
, imgtype
, (unsigned long)symvva
,
506 *eisd_offset
, *eihs_offset
));
512 /* Read & process EISD record.
513 Return TRUE on success, FALSE on error. */
516 _bfd_vms_slurp_eisd (bfd
*abfd
, unsigned int offset
)
518 int section_count
= 0;
520 vms_debug2 ((8, "_bfd_vms_slurp_eisd\n"));
524 struct vms_eisd
*eisd
;
525 unsigned int rec_size
;
534 /* PR 17512: file: 3d9e9fe9. */
535 if (offset
> PRIV (recrd
.rec_size
)
536 || (PRIV (recrd
.rec_size
) - offset
537 < offsetof (struct vms_eisd
, eisdsize
) + 4))
539 eisd
= (struct vms_eisd
*) (PRIV (recrd
.rec
) + offset
);
540 rec_size
= bfd_getl32 (eisd
->eisdsize
);
544 /* Skip to next block if pad. */
545 if (rec_size
== 0xffffffff)
547 offset
= (offset
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
551 /* Make sure that there is enough data present in the record. */
552 if (rec_size
< offsetof (struct vms_eisd
, type
) + 1)
554 /* Make sure that the record is not too big either. */
555 if (rec_size
> PRIV (recrd
.rec_size
) - offset
)
560 size
= bfd_getl32 (eisd
->secsize
);
561 vaddr
= bfd_getl64 (eisd
->virt_addr
);
562 flags
= bfd_getl32 (eisd
->flags
);
563 vbn
= bfd_getl32 (eisd
->vbn
);
565 vms_debug2 ((4, "EISD at 0x%x size 0x%x addr 0x%lx flags 0x%x blk %d\n",
566 offset
, size
, (unsigned long)vaddr
, flags
, vbn
));
568 /* VMS combines psects from .obj files into isects in the .exe. This
569 process doesn't preserve enough information to reliably determine
570 what's in each section without examining the data. This is
571 especially true of DWARF debug sections. */
572 bfd_flags
= SEC_ALLOC
;
574 bfd_flags
|= SEC_HAS_CONTENTS
| SEC_LOAD
;
576 if (flags
& EISD__M_EXE
)
577 bfd_flags
|= SEC_CODE
;
579 if (flags
& EISD__M_NONSHRADR
)
580 bfd_flags
|= SEC_DATA
;
582 if (!(flags
& EISD__M_WRT
))
583 bfd_flags
|= SEC_READONLY
;
585 if (flags
& EISD__M_DZRO
)
586 bfd_flags
|= SEC_DATA
;
588 if (flags
& EISD__M_FIXUPVEC
)
589 bfd_flags
|= SEC_DATA
;
591 if (flags
& EISD__M_CRF
)
592 bfd_flags
|= SEC_DATA
;
594 if (flags
& EISD__M_GBL
)
596 if (rec_size
<= offsetof (struct vms_eisd
, gblnam
))
598 else if (rec_size
< sizeof (struct vms_eisd
))
599 name
= _bfd_vms_save_counted_string (abfd
, eisd
->gblnam
,
600 rec_size
- offsetof (struct vms_eisd
, gblnam
));
602 name
= _bfd_vms_save_counted_string (abfd
, eisd
->gblnam
,
604 if (name
== NULL
|| name
[0] == 0)
606 bfd_flags
|= SEC_COFF_SHARED_LIBRARY
;
607 bfd_flags
&= ~(SEC_ALLOC
| SEC_LOAD
);
609 else if (flags
& EISD__M_FIXUPVEC
)
611 else if (eisd
->type
== EISD__K_USRSTACK
)
617 name
= (char *) bfd_alloc (abfd
, 32);
620 if (flags
& EISD__M_DZRO
)
622 else if (flags
& EISD__M_EXE
)
624 else if (!(flags
& EISD__M_WRT
))
628 BFD_ASSERT (section_count
< 999);
629 sprintf (name
, "$%s_%03d$", pfx
, section_count
++);
632 section
= bfd_make_section (abfd
, name
);
637 section
->filepos
= vbn
? VMS_BLOCK_SIZE
* (vbn
- 1) : 0;
638 section
->size
= size
;
639 section
->vma
= vaddr
;
641 if (!bfd_set_section_flags (section
, bfd_flags
))
648 /* Read & process EIHS record.
649 Return TRUE on success, FALSE on error. */
652 _bfd_vms_slurp_eihs (bfd
*abfd
, unsigned int offset
)
654 unsigned char *p
= PRIV (recrd
.rec
) + offset
;
656 unsigned int gstsize ATTRIBUTE_UNUSED
;
658 unsigned int dstsize
;
660 unsigned int dmtbytes
;
663 /* PR 21611: Check that offset is valid. */
664 if (offset
> PRIV (recrd
.rec_size
) - (EIHS__L_DMTBYTES
+ 4))
666 _bfd_error_handler (_("unable to read EIHS record at offset %#x"),
668 bfd_set_error (bfd_error_file_truncated
);
672 gstvbn
= bfd_getl32 (p
+ EIHS__L_GSTVBN
);
673 gstsize
= bfd_getl32 (p
+ EIHS__L_GSTSIZE
);
674 dstvbn
= bfd_getl32 (p
+ EIHS__L_DSTVBN
);
675 dstsize
= bfd_getl32 (p
+ EIHS__L_DSTSIZE
);
676 dmtvbn
= bfd_getl32 (p
+ EIHS__L_DMTVBN
);
677 dmtbytes
= bfd_getl32 (p
+ EIHS__L_DMTBYTES
);
680 vms_debug (8, "_bfd_vms_slurp_ihs\n");
681 vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
682 gstvbn
, gstsize
, dstvbn
, dstsize
, dmtvbn
, dmtbytes
);
687 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
689 section
= bfd_make_section (abfd
, "$DST$");
693 section
->size
= dstsize
;
694 section
->filepos
= VMS_BLOCK_SIZE
* (dstvbn
- 1);
696 if (!bfd_set_section_flags (section
, bfd_flags
))
699 PRIV (dst_section
) = section
;
700 abfd
->flags
|= (HAS_DEBUG
| HAS_LINENO
);
705 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
707 section
= bfd_make_section (abfd
, "$DMT$");
711 section
->size
= dmtbytes
;
712 section
->filepos
= VMS_BLOCK_SIZE
* (dmtvbn
- 1);
714 if (!bfd_set_section_flags (section
, bfd_flags
))
720 if (bfd_seek (abfd
, VMS_BLOCK_SIZE
* (gstvbn
- 1), SEEK_SET
))
722 bfd_set_error (bfd_error_file_truncated
);
726 if (!_bfd_vms_slurp_object_records (abfd
))
729 abfd
->flags
|= HAS_SYMS
;
735 /* Object file reading. */
737 /* Object file input functions. */
739 /* Get next record from object file to vms_buf.
740 Set PRIV(buf_size) and return it
742 This is a little tricky since it should be portable.
744 The openVMS object file has 'variable length' which means that
745 read() returns data in chunks of (hopefully) correct and expected
746 size. The linker (and other tools on VMS) depend on that. Unix
747 doesn't know about 'formatted' files, so reading and writing such
748 an object file in a Unix environment is not trivial.
750 With the tool 'file' (available on all VMS FTP sites), one
751 can view and change the attributes of a file. Changing from
752 'variable length' to 'fixed length, 512 bytes' reveals the
753 record size at the first 2 bytes of every record. The same
754 may happen during the transfer of object files from VMS to Unix,
755 at least with UCX, the DEC implementation of TCP/IP.
757 The VMS format repeats the size at bytes 2 & 3 of every record.
759 On the first call (file_format == FF_UNKNOWN) we check if
760 the first and the third byte pair (!) of the record match.
761 If they do it's an object file in an Unix environment or with
762 wrong attributes (FF_FOREIGN), else we should be in a VMS
763 environment where read() returns the record size (FF_NATIVE).
765 Reading is always done in 2 steps:
766 1. first just the record header is read and the size extracted,
767 2. then the read buffer is adjusted and the remaining bytes are
770 All file I/O is done on even file positions. */
772 #define VMS_OBJECT_ADJUSTMENT 2
775 maybe_adjust_record_pointer_for_object (bfd
*abfd
)
777 /* Set the file format once for all on the first invocation. */
778 if (PRIV (recrd
.file_format
) == FF_UNKNOWN
)
780 if (PRIV (recrd
.rec
)[0] == PRIV (recrd
.rec
)[4]
781 && PRIV (recrd
.rec
)[1] == PRIV (recrd
.rec
)[5])
782 PRIV (recrd
.file_format
) = FF_FOREIGN
;
784 PRIV (recrd
.file_format
) = FF_NATIVE
;
787 /* The adjustment is needed only in an Unix environment. */
788 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
789 PRIV (recrd
.rec
) += VMS_OBJECT_ADJUSTMENT
;
792 /* Implement step #1 of the object record reading procedure.
793 Return the record type or -1 on failure. */
796 _bfd_vms_get_object_record (bfd
*abfd
)
798 unsigned int test_len
= 6;
801 vms_debug2 ((8, "_bfd_vms_get_obj_record\n"));
803 /* Skip alignment byte if the current position is odd. */
804 if (PRIV (recrd
.file_format
) == FF_FOREIGN
&& (bfd_tell (abfd
) & 1))
806 if (bfd_bread (PRIV (recrd
.buf
), 1, abfd
) != 1)
808 bfd_set_error (bfd_error_file_truncated
);
813 /* Read the record header */
814 if (bfd_bread (PRIV (recrd
.buf
), test_len
, abfd
) != test_len
)
816 bfd_set_error (bfd_error_file_truncated
);
820 /* Reset the record pointer. */
821 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
822 maybe_adjust_record_pointer_for_object (abfd
);
824 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
827 type
= bfd_getl16 (PRIV (recrd
.rec
));
829 vms_debug2 ((8, "_bfd_vms_get_obj_record: rec %p, size %d, type %d\n",
830 PRIV (recrd
.rec
), PRIV (recrd
.rec_size
), type
));
835 /* Implement step #2 of the object record reading procedure.
836 Return the size of the record or 0 on failure. */
839 vms_get_remaining_object_record (bfd
*abfd
, unsigned int read_so_far
)
841 unsigned int to_read
;
843 vms_debug2 ((8, "vms_get_remaining_obj_record\n"));
845 /* Extract record size. */
846 PRIV (recrd
.rec_size
) = bfd_getl16 (PRIV (recrd
.rec
) + 2);
848 if (PRIV (recrd
.rec_size
) == 0)
850 bfd_set_error (bfd_error_file_truncated
);
854 /* That's what the linker manual says. */
855 if (PRIV (recrd
.rec_size
) > EOBJ__C_MAXRECSIZ
)
857 bfd_set_error (bfd_error_file_truncated
);
861 /* Take into account object adjustment. */
862 to_read
= PRIV (recrd
.rec_size
);
863 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
864 to_read
+= VMS_OBJECT_ADJUSTMENT
;
866 /* Adjust the buffer. */
867 if (to_read
> PRIV (recrd
.buf_size
))
870 = (unsigned char *) bfd_realloc_or_free (PRIV (recrd
.buf
), to_read
);
871 if (PRIV (recrd
.buf
) == NULL
)
873 PRIV (recrd
.buf_size
) = to_read
;
875 /* PR 17512: file: 025-1974-0.004. */
876 else if (to_read
<= read_so_far
)
879 /* Read the remaining record. */
880 to_read
-= read_so_far
;
882 vms_debug2 ((8, "vms_get_remaining_obj_record: to_read %d\n", to_read
));
884 if (bfd_bread (PRIV (recrd
.buf
) + read_so_far
, to_read
, abfd
) != to_read
)
886 bfd_set_error (bfd_error_file_truncated
);
890 /* Reset the record pointer. */
891 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
892 maybe_adjust_record_pointer_for_object (abfd
);
894 vms_debug2 ((8, "vms_get_remaining_obj_record: size %d\n",
895 PRIV (recrd
.rec_size
)));
897 return PRIV (recrd
.rec_size
);
900 /* Read and process emh record.
901 Return TRUE on success, FALSE on error. */
904 _bfd_vms_slurp_ehdr (bfd
*abfd
)
907 unsigned char *vms_rec
;
911 vms_rec
= PRIV (recrd
.rec
);
912 /* PR 17512: file: 62736583. */
913 end
= PRIV (recrd
.buf
) + PRIV (recrd
.buf_size
);
915 vms_debug2 ((2, "HDR/EMH\n"));
917 subtype
= bfd_getl16 (vms_rec
+ 4);
919 vms_debug2 ((3, "subtype %d\n", subtype
));
925 if (vms_rec
+ 21 >= end
)
927 PRIV (hdr_data
).hdr_b_strlvl
= vms_rec
[6];
928 PRIV (hdr_data
).hdr_l_arch1
= bfd_getl32 (vms_rec
+ 8);
929 PRIV (hdr_data
).hdr_l_arch2
= bfd_getl32 (vms_rec
+ 12);
930 PRIV (hdr_data
).hdr_l_recsiz
= bfd_getl32 (vms_rec
+ 16);
931 if ((vms_rec
+ 20 + vms_rec
[20] + 1) >= end
)
933 PRIV (hdr_data
).hdr_t_name
934 = _bfd_vms_save_counted_string (abfd
, vms_rec
+ 20, vms_rec
[20]);
935 ptr
= vms_rec
+ 20 + vms_rec
[20] + 1;
936 if ((ptr
+ *ptr
+ 1) >= end
)
938 PRIV (hdr_data
).hdr_t_version
939 = _bfd_vms_save_counted_string (abfd
, ptr
, *ptr
);
943 PRIV (hdr_data
).hdr_t_date
944 = _bfd_vms_save_sized_string (abfd
, ptr
, 17);
948 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
950 PRIV (hdr_data
).hdr_c_lnm
951 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
955 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
957 PRIV (hdr_data
).hdr_c_src
958 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
962 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
964 PRIV (hdr_data
).hdr_c_ttl
965 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
975 bfd_set_error (bfd_error_wrong_format
);
982 /* Typical sections for evax object files. */
984 #define EVAX_ABS_NAME "$ABS$"
985 #define EVAX_CODE_NAME "$CODE$"
986 #define EVAX_LINK_NAME "$LINK$"
987 #define EVAX_DATA_NAME "$DATA$"
988 #define EVAX_BSS_NAME "$BSS$"
989 #define EVAX_READONLYADDR_NAME "$READONLY_ADDR$"
990 #define EVAX_READONLY_NAME "$READONLY$"
991 #define EVAX_LITERAL_NAME "$LITERAL$"
992 #define EVAX_LITERALS_NAME "$LITERALS"
993 #define EVAX_COMMON_NAME "$COMMON$"
994 #define EVAX_LOCAL_NAME "$LOCAL$"
996 struct sec_flags_struct
998 const char *name
; /* Name of section. */
1000 flagword flags_always
; /* Flags we set always. */
1002 flagword flags_hassize
; /* Flags we set if the section has a size > 0. */
1005 /* These flags are deccrtl/vaxcrtl (openVMS 6.2 Alpha) compatible. */
1007 static const struct sec_flags_struct evax_section_flags
[] =
1015 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
,
1016 SEC_CODE
| SEC_READONLY
,
1017 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
,
1018 SEC_CODE
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1019 { EVAX_LITERAL_NAME
,
1020 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
,
1021 SEC_DATA
| SEC_READONLY
,
1022 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
,
1023 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1025 EGPS__V_REL
| EGPS__V_RD
,
1026 SEC_DATA
| SEC_READONLY
,
1027 EGPS__V_REL
| EGPS__V_RD
,
1028 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1030 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1032 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1033 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1035 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1037 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1039 { EVAX_READONLYADDR_NAME
,
1040 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
,
1041 SEC_DATA
| SEC_READONLY
,
1042 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
,
1043 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1044 { EVAX_READONLY_NAME
,
1045 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
,
1046 SEC_DATA
| SEC_READONLY
,
1047 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
,
1048 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1050 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1052 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1053 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1054 { EVAX_LITERALS_NAME
,
1055 EGPS__V_PIC
| EGPS__V_OVR
,
1056 SEC_DATA
| SEC_READONLY
,
1057 EGPS__V_PIC
| EGPS__V_OVR
,
1058 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1060 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1062 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1063 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
}
1066 /* Retrieve BFD section flags by name and size. */
1069 vms_secflag_by_name (const struct sec_flags_struct
*section_flags
,
1075 while (section_flags
[i
].name
!= NULL
)
1077 if (strcmp (name
, section_flags
[i
].name
) == 0)
1080 return section_flags
[i
].flags_hassize
;
1082 return section_flags
[i
].flags_always
;
1087 return section_flags
[i
].flags_hassize
;
1088 return section_flags
[i
].flags_always
;
1091 /* Retrieve VMS section flags by name and size. */
1094 vms_esecflag_by_name (const struct sec_flags_struct
*section_flags
,
1100 while (section_flags
[i
].name
!= NULL
)
1102 if (strcmp (name
, section_flags
[i
].name
) == 0)
1105 return section_flags
[i
].vflags_hassize
;
1107 return section_flags
[i
].vflags_always
;
1112 return section_flags
[i
].vflags_hassize
;
1113 return section_flags
[i
].vflags_always
;
1116 /* Add SYM to the symbol table of ABFD.
1117 Return FALSE in case of error. */
1120 add_symbol_entry (bfd
*abfd
, struct vms_symbol_entry
*sym
)
1122 if (PRIV (gsd_sym_count
) >= PRIV (max_sym_count
))
1124 if (PRIV (max_sym_count
) == 0)
1126 PRIV (max_sym_count
) = 128;
1127 PRIV (syms
) = bfd_malloc
1128 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*));
1132 PRIV (max_sym_count
) *= 2;
1133 PRIV (syms
) = bfd_realloc_or_free
1135 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*)));
1137 if (PRIV (syms
) == NULL
)
1141 PRIV (syms
)[PRIV (gsd_sym_count
)++] = sym
;
1145 /* Create a symbol whose name is ASCIC and add it to ABFD.
1146 Return NULL in case of error. */
1148 static struct vms_symbol_entry
*
1149 add_symbol (bfd
*abfd
, const unsigned char *ascic
, unsigned int max
)
1151 struct vms_symbol_entry
*entry
;
1158 _bfd_error_handler (_("record is too small for symbol name length"));
1159 bfd_set_error (bfd_error_bad_value
);
1163 entry
= (struct vms_symbol_entry
*)bfd_zalloc (abfd
, sizeof (*entry
) + len
);
1166 entry
->namelen
= len
;
1167 memcpy (entry
->name
, ascic
, len
);
1168 entry
->name
[len
] = 0;
1169 entry
->owner
= abfd
;
1171 if (!add_symbol_entry (abfd
, entry
))
1176 /* Read and process EGSD. Return FALSE on failure. */
1179 _bfd_vms_slurp_egsd (bfd
*abfd
)
1182 unsigned int gsd_size
;
1183 unsigned char *vms_rec
;
1187 vms_debug2 ((2, "EGSD\n"));
1189 if (PRIV (recrd
.rec_size
) < 8)
1191 _bfd_error_handler (_("corrupt EGSD record: its size (%#x) is too small"),
1192 PRIV (recrd
.rec_size
));
1193 bfd_set_error (bfd_error_bad_value
);
1197 PRIV (recrd
.rec
) += 8; /* Skip type, size, align pad. */
1198 PRIV (recrd
.rec_size
) -= 8;
1200 /* Calculate base address for each section. */
1203 while (PRIV (recrd
.rec_size
) > 4)
1205 vms_rec
= PRIV (recrd
.rec
);
1207 gsd_type
= bfd_getl16 (vms_rec
);
1208 gsd_size
= bfd_getl16 (vms_rec
+ 2);
1210 vms_debug2 ((3, "egsd_type %d\n", gsd_type
));
1212 /* PR 21615: Check for size overflow. */
1213 if (PRIV (recrd
.rec_size
) < gsd_size
)
1215 _bfd_error_handler (_("corrupt EGSD record type %d: size (%#x) "
1216 "is larger than remaining space (%#x)"),
1217 gsd_type
, gsd_size
, PRIV (recrd
.rec_size
));
1218 bfd_set_error (bfd_error_bad_value
);
1225 _bfd_error_handler (_("corrupt EGSD record type %d: size (%#x) "
1227 gsd_type
, gsd_size
);
1228 bfd_set_error (bfd_error_bad_value
);
1235 /* Program section definition. */
1237 struct vms_egps
*egps
= (struct vms_egps
*) vms_rec
;
1238 flagword new_flags
, vms_flags
;
1241 if (offsetof (struct vms_egps
, flags
) + 2 > gsd_size
)
1243 vms_flags
= bfd_getl16 (egps
->flags
);
1245 if ((vms_flags
& EGPS__V_REL
) == 0)
1247 /* Use the global absolute section for all
1248 absolute sections. */
1249 section
= bfd_abs_section_ptr
;
1257 if (offsetof (struct vms_egps
, namlng
) >= gsd_size
)
1259 left
= gsd_size
- offsetof (struct vms_egps
, namlng
);
1260 name
= _bfd_vms_save_counted_string (abfd
, &egps
->namlng
, left
);
1261 if (name
== NULL
|| name
[0] == 0)
1264 section
= bfd_make_section (abfd
, name
);
1268 section
->filepos
= 0;
1269 section
->size
= bfd_getl32 (egps
->alloc
);
1270 section
->alignment_power
= egps
->align
& 31;
1272 vms_section_data (section
)->flags
= vms_flags
;
1273 vms_section_data (section
)->no_flags
= 0;
1275 new_flags
= vms_secflag_by_name (evax_section_flags
,
1278 if (section
->size
> 0)
1279 new_flags
|= SEC_LOAD
;
1280 if (!(vms_flags
& EGPS__V_NOMOD
) && section
->size
> 0)
1282 /* Set RELOC and HAS_CONTENTS if the section is not
1283 demand-zero and not empty. */
1284 new_flags
|= SEC_HAS_CONTENTS
;
1285 if (vms_flags
& EGPS__V_REL
)
1286 new_flags
|= SEC_RELOC
;
1288 if (vms_flags
& EGPS__V_EXE
)
1290 /* Set CODE if section is executable. */
1291 new_flags
|= SEC_CODE
;
1292 new_flags
&= ~SEC_DATA
;
1294 if (!bfd_set_section_flags (section
, new_flags
))
1297 /* Give a non-overlapping vma to non absolute sections. */
1298 align_addr
= (bfd_vma
) 1 << section
->alignment_power
;
1299 base_addr
= (base_addr
+ align_addr
- 1) & -align_addr
;
1300 section
->vma
= base_addr
;
1301 base_addr
+= section
->size
;
1304 /* Append it to the section array. */
1305 if (PRIV (section_count
) >= PRIV (section_max
))
1307 if (PRIV (section_max
) == 0)
1308 PRIV (section_max
) = 16;
1310 PRIV (section_max
) *= 2;
1311 PRIV (sections
) = bfd_realloc_or_free
1312 (PRIV (sections
), PRIV (section_max
) * sizeof (asection
*));
1313 if (PRIV (sections
) == NULL
)
1317 PRIV (sections
)[PRIV (section_count
)] = section
;
1318 PRIV (section_count
)++;
1324 unsigned int nameoff
;
1325 struct vms_symbol_entry
*entry
;
1326 struct vms_egsy
*egsy
= (struct vms_egsy
*) vms_rec
;
1329 if (offsetof (struct vms_egsy
, flags
) + 2 > gsd_size
)
1331 old_flags
= bfd_getl16 (egsy
->flags
);
1332 if (old_flags
& EGSY__V_DEF
)
1333 nameoff
= ESDF__B_NAMLNG
;
1335 nameoff
= ESRF__B_NAMLNG
;
1337 if (nameoff
>= gsd_size
)
1339 entry
= add_symbol (abfd
, vms_rec
+ nameoff
, gsd_size
- nameoff
);
1343 /* Allow only duplicate reference. */
1344 if ((entry
->flags
& EGSY__V_DEF
) && (old_flags
& EGSY__V_DEF
))
1347 if (entry
->typ
== 0)
1349 entry
->typ
= gsd_type
;
1350 entry
->data_type
= egsy
->datyp
;
1351 entry
->flags
= old_flags
;
1354 if (old_flags
& EGSY__V_DEF
)
1356 struct vms_esdf
*esdf
= (struct vms_esdf
*) vms_rec
;
1358 entry
->value
= bfd_getl64 (esdf
->value
);
1359 if (PRIV (sections
) == NULL
)
1362 psindx
= bfd_getl32 (esdf
->psindx
);
1363 /* PR 21813: Check for an out of range index. */
1364 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1367 _bfd_error_handler (_("corrupt EGSD record: its psindx "
1368 "field is too big (%#lx)"),
1370 bfd_set_error (bfd_error_bad_value
);
1373 entry
->section
= PRIV (sections
)[psindx
];
1375 if (old_flags
& EGSY__V_NORM
)
1377 PRIV (norm_sym_count
)++;
1379 entry
->code_value
= bfd_getl64 (esdf
->code_address
);
1380 psindx
= bfd_getl32 (esdf
->ca_psindx
);
1381 /* PR 21813: Check for an out of range index. */
1382 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1384 entry
->code_section
= PRIV (sections
)[psindx
];
1392 struct vms_symbol_entry
*entry
;
1393 struct vms_egst
*egst
= (struct vms_egst
*)vms_rec
;
1395 unsigned int nameoff
= offsetof (struct vms_egst
, namlng
);
1397 old_flags
= bfd_getl16 (egst
->header
.flags
);
1399 if (nameoff
>= gsd_size
)
1401 entry
= add_symbol (abfd
, &egst
->namlng
, gsd_size
- nameoff
);
1405 entry
->typ
= gsd_type
;
1406 entry
->data_type
= egst
->header
.datyp
;
1407 entry
->flags
= old_flags
;
1409 entry
->symbol_vector
= bfd_getl32 (egst
->value
);
1411 if (old_flags
& EGSY__V_REL
)
1413 if (PRIV (sections
) == NULL
)
1415 psindx
= bfd_getl32 (egst
->psindx
);
1416 /* PR 21813: Check for an out of range index. */
1417 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1419 entry
->section
= PRIV (sections
)[psindx
];
1422 entry
->section
= bfd_abs_section_ptr
;
1424 entry
->value
= bfd_getl64 (egst
->lp_2
);
1426 if (old_flags
& EGSY__V_NORM
)
1428 PRIV (norm_sym_count
)++;
1430 entry
->code_value
= bfd_getl64 (egst
->lp_1
);
1431 entry
->code_section
= bfd_abs_section_ptr
;
1438 /* Currently ignored. */
1443 _bfd_error_handler (_("unknown EGSD subtype %d"), gsd_type
);
1444 bfd_set_error (bfd_error_bad_value
);
1448 PRIV (recrd
.rec_size
) -= gsd_size
;
1449 PRIV (recrd
.rec
) += gsd_size
;
1452 /* FIXME: Should we complain if PRIV (recrd.rec_size) is not zero ? */
1454 if (PRIV (gsd_sym_count
) > 0)
1455 abfd
->flags
|= HAS_SYMS
;
1460 /* Stack routines for vms ETIR commands. */
1462 /* Push value and section index. */
1465 _bfd_vms_push (bfd
*abfd
, bfd_vma val
, unsigned int reloc
)
1467 vms_debug2 ((4, "<push %08lx (0x%08x) at %d>\n",
1468 (unsigned long)val
, reloc
, PRIV (stackptr
)));
1470 PRIV (stack
[PRIV (stackptr
)]).value
= val
;
1471 PRIV (stack
[PRIV (stackptr
)]).reloc
= reloc
;
1473 if (PRIV (stackptr
) >= STACKSIZE
)
1475 bfd_set_error (bfd_error_bad_value
);
1476 _bfd_error_handler (_("stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr
));
1482 /* Pop value and section index. */
1485 _bfd_vms_pop (bfd
*abfd
, bfd_vma
*val
, unsigned int *rel
)
1487 if (PRIV (stackptr
) == 0)
1489 bfd_set_error (bfd_error_bad_value
);
1490 _bfd_error_handler (_("stack underflow in _bfd_vms_pop"));
1494 *val
= PRIV (stack
[PRIV (stackptr
)]).value
;
1495 *rel
= PRIV (stack
[PRIV (stackptr
)]).reloc
;
1497 vms_debug2 ((4, "<pop %08lx (0x%08x)>\n", (unsigned long)*val
, *rel
));
1501 /* Routines to fill sections contents during tir/etir read. */
1503 /* Initialize image buffer pointer to be filled. */
1506 image_set_ptr (bfd
*abfd
, bfd_vma vma
, int sect
, struct bfd_link_info
*info
)
1510 vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma
, sect
));
1512 if (PRIV (sections
) == NULL
)
1514 if (sect
< 0 || sect
>= (int) PRIV (section_count
))
1517 sec
= PRIV (sections
)[sect
];
1521 /* Reading contents to an output bfd. */
1523 if (sec
->output_section
== NULL
)
1525 /* Section discarded. */
1526 vms_debug2 ((5, " section %s discarded\n", sec
->name
));
1528 /* This is not used. */
1529 PRIV (image_section
) = NULL
;
1530 PRIV (image_offset
) = 0;
1533 PRIV (image_offset
) = sec
->output_offset
+ vma
;
1534 PRIV (image_section
) = sec
->output_section
;
1538 PRIV (image_offset
) = vma
;
1539 PRIV (image_section
) = sec
;
1543 /* Increment image buffer pointer by offset. */
1546 image_inc_ptr (bfd
*abfd
, bfd_vma offset
)
1548 vms_debug2 ((4, "image_inc_ptr (%u)\n", (unsigned)offset
));
1550 PRIV (image_offset
) += offset
;
1553 /* Save current DST location counter under specified index. */
1556 dst_define_location (bfd
*abfd
, unsigned int loc
)
1558 vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc
));
1562 /* 16M entries ought to be plenty. */
1563 bfd_set_error (bfd_error_bad_value
);
1564 _bfd_error_handler (_("dst_define_location %u too large"), loc
);
1568 /* Grow the ptr offset table if necessary. */
1569 if (loc
+ 1 > PRIV (dst_ptr_offsets_count
))
1571 PRIV (dst_ptr_offsets
)
1572 = bfd_realloc_or_free (PRIV (dst_ptr_offsets
),
1573 (loc
+ 1) * sizeof (unsigned int));
1574 if (PRIV (dst_ptr_offsets
) == NULL
)
1576 PRIV (dst_ptr_offsets_count
) = loc
+ 1;
1579 PRIV (dst_ptr_offsets
)[loc
] = PRIV (image_offset
);
1583 /* Restore saved DST location counter from specified index. */
1586 dst_restore_location (bfd
*abfd
, unsigned int loc
)
1588 vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc
));
1590 if (loc
< PRIV (dst_ptr_offsets_count
))
1592 PRIV (image_offset
) = PRIV (dst_ptr_offsets
)[loc
];
1598 /* Retrieve saved DST location counter from specified index. */
1601 dst_retrieve_location (bfd
*abfd
, bfd_vma
*loc
)
1603 vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int) *loc
));
1605 if (*loc
< PRIV (dst_ptr_offsets_count
))
1607 *loc
= PRIV (dst_ptr_offsets
)[*loc
];
1613 /* Write multiple bytes to section image. */
1616 image_write (bfd
*abfd
, unsigned char *ptr
, unsigned int size
)
1618 asection
*sec
= PRIV (image_section
);
1619 size_t off
= PRIV (image_offset
);
1623 || size
> sec
->size
- off
)
1625 bfd_set_error (bfd_error_bad_value
);
1630 _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr
, size
,
1634 if (PRIV (image_section
)->contents
!= NULL
)
1635 memcpy (sec
->contents
+ off
, ptr
, size
);
1639 for (i
= 0; i
< size
; i
++)
1642 bfd_set_error (bfd_error_bad_value
);
1648 _bfd_hexdump (9, ptr
, size
, 0);
1651 PRIV (image_offset
) += size
;
1655 /* Write byte to section image. */
1658 image_write_b (bfd
* abfd
, unsigned int value
)
1660 unsigned char data
[1];
1662 vms_debug2 ((6, "image_write_b (%02x)\n", (int) value
));
1666 return image_write (abfd
, data
, sizeof (data
));
1669 /* Write 2-byte word to image. */
1672 image_write_w (bfd
* abfd
, unsigned int value
)
1674 unsigned char data
[2];
1676 vms_debug2 ((6, "image_write_w (%04x)\n", (int) value
));
1678 bfd_putl16 (value
, data
);
1679 return image_write (abfd
, data
, sizeof (data
));
1682 /* Write 4-byte long to image. */
1685 image_write_l (bfd
* abfd
, unsigned long value
)
1687 unsigned char data
[4];
1689 vms_debug2 ((6, "image_write_l (%08lx)\n", value
));
1691 bfd_putl32 (value
, data
);
1692 return image_write (abfd
, data
, sizeof (data
));
1695 /* Write 8-byte quad to image. */
1698 image_write_q (bfd
* abfd
, bfd_vma value
)
1700 unsigned char data
[8];
1702 vms_debug2 ((6, "image_write_q (%08lx)\n", (unsigned long)value
));
1704 bfd_putl64 (value
, data
);
1705 return image_write (abfd
, data
, sizeof (data
));
1709 _bfd_vms_etir_name (int cmd
)
1713 case ETIR__C_STA_GBL
: return "ETIR__C_STA_GBL";
1714 case ETIR__C_STA_LW
: return "ETIR__C_STA_LW";
1715 case ETIR__C_STA_QW
: return "ETIR__C_STA_QW";
1716 case ETIR__C_STA_PQ
: return "ETIR__C_STA_PQ";
1717 case ETIR__C_STA_LI
: return "ETIR__C_STA_LI";
1718 case ETIR__C_STA_MOD
: return "ETIR__C_STA_MOD";
1719 case ETIR__C_STA_CKARG
: return "ETIR__C_STA_CKARG";
1720 case ETIR__C_STO_B
: return "ETIR__C_STO_B";
1721 case ETIR__C_STO_W
: return "ETIR__C_STO_W";
1722 case ETIR__C_STO_GBL
: return "ETIR__C_STO_GBL";
1723 case ETIR__C_STO_CA
: return "ETIR__C_STO_CA";
1724 case ETIR__C_STO_RB
: return "ETIR__C_STO_RB";
1725 case ETIR__C_STO_AB
: return "ETIR__C_STO_AB";
1726 case ETIR__C_STO_OFF
: return "ETIR__C_STO_OFF";
1727 case ETIR__C_STO_IMM
: return "ETIR__C_STO_IMM";
1728 case ETIR__C_STO_IMMR
: return "ETIR__C_STO_IMMR";
1729 case ETIR__C_STO_LW
: return "ETIR__C_STO_LW";
1730 case ETIR__C_STO_QW
: return "ETIR__C_STO_QW";
1731 case ETIR__C_STO_GBL_LW
: return "ETIR__C_STO_GBL_LW";
1732 case ETIR__C_STO_LP_PSB
: return "ETIR__C_STO_LP_PSB";
1733 case ETIR__C_STO_HINT_GBL
: return "ETIR__C_STO_HINT_GBL";
1734 case ETIR__C_STO_HINT_PS
: return "ETIR__C_STO_HINT_PS";
1735 case ETIR__C_OPR_ADD
: return "ETIR__C_OPR_ADD";
1736 case ETIR__C_OPR_SUB
: return "ETIR__C_OPR_SUB";
1737 case ETIR__C_OPR_INSV
: return "ETIR__C_OPR_INSV";
1738 case ETIR__C_OPR_USH
: return "ETIR__C_OPR_USH";
1739 case ETIR__C_OPR_ROT
: return "ETIR__C_OPR_ROT";
1740 case ETIR__C_OPR_REDEF
: return "ETIR__C_OPR_REDEF";
1741 case ETIR__C_OPR_DFLIT
: return "ETIR__C_OPR_DFLIT";
1742 case ETIR__C_STC_LP
: return "ETIR__C_STC_LP";
1743 case ETIR__C_STC_GBL
: return "ETIR__C_STC_GBL";
1744 case ETIR__C_STC_GCA
: return "ETIR__C_STC_GCA";
1745 case ETIR__C_STC_PS
: return "ETIR__C_STC_PS";
1746 case ETIR__C_STC_NBH_PS
: return "ETIR__C_STC_NBH_PS";
1747 case ETIR__C_STC_NOP_GBL
: return "ETIR__C_STC_NOP_GBL";
1748 case ETIR__C_STC_NOP_PS
: return "ETIR__C_STC_NOP_PS";
1749 case ETIR__C_STC_BSR_GBL
: return "ETIR__C_STC_BSR_GBL";
1750 case ETIR__C_STC_BSR_PS
: return "ETIR__C_STC_BSR_PS";
1751 case ETIR__C_STC_LDA_GBL
: return "ETIR__C_STC_LDA_GBL";
1752 case ETIR__C_STC_LDA_PS
: return "ETIR__C_STC_LDA_PS";
1753 case ETIR__C_STC_BOH_GBL
: return "ETIR__C_STC_BOH_GBL";
1754 case ETIR__C_STC_BOH_PS
: return "ETIR__C_STC_BOH_PS";
1755 case ETIR__C_STC_NBH_GBL
: return "ETIR__C_STC_NBH_GBL";
1756 case ETIR__C_STC_LP_PSB
: return "ETIR__C_STC_LP_PSB";
1757 case ETIR__C_CTL_SETRB
: return "ETIR__C_CTL_SETRB";
1758 case ETIR__C_CTL_AUGRB
: return "ETIR__C_CTL_AUGRB";
1759 case ETIR__C_CTL_DFLOC
: return "ETIR__C_CTL_DFLOC";
1760 case ETIR__C_CTL_STLOC
: return "ETIR__C_CTL_STLOC";
1761 case ETIR__C_CTL_STKDL
: return "ETIR__C_CTL_STKDL";
1764 /* These names have not yet been added to this switch statement. */
1765 _bfd_error_handler (_("unknown ETIR command %d"), cmd
);
1770 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
1773 _bfd_vms_get_value (bfd
*abfd
,
1774 const unsigned char *ascic
,
1775 const unsigned char *max_ascic
,
1776 struct bfd_link_info
*info
,
1778 struct alpha_vms_link_hash_entry
**hp
)
1783 struct alpha_vms_link_hash_entry
*h
;
1785 /* Not linking. Do not try to resolve the symbol. */
1794 if (ascic
+ len
>= max_ascic
)
1796 _bfd_error_handler (_("corrupt vms value"));
1802 for (i
= 0; i
< len
; i
++)
1803 name
[i
] = ascic
[i
+ 1];
1806 h
= (struct alpha_vms_link_hash_entry
*)
1807 bfd_link_hash_lookup (info
->hash
, name
, FALSE
, FALSE
, TRUE
);
1812 && (h
->root
.type
== bfd_link_hash_defined
1813 || h
->root
.type
== bfd_link_hash_defweak
))
1814 *vma
= h
->root
.u
.def
.value
1815 + h
->root
.u
.def
.section
->output_offset
1816 + h
->root
.u
.def
.section
->output_section
->vma
;
1817 else if (h
&& h
->root
.type
== bfd_link_hash_undefweak
)
1821 (*info
->callbacks
->undefined_symbol
)
1822 (info
, name
, abfd
, PRIV (image_section
), PRIV (image_offset
), TRUE
);
1829 #define RELC_SHR_BASE 0x10000
1830 #define RELC_SEC_BASE 0x20000
1831 #define RELC_MASK 0x0ffff
1834 alpha_vms_sym_to_ctxt (struct alpha_vms_link_hash_entry
*h
)
1836 /* Handle undefined symbols. */
1837 if (h
== NULL
|| h
->sym
== NULL
)
1840 if (h
->sym
->typ
== EGSD__C_SYMG
)
1842 if (h
->sym
->flags
& EGSY__V_REL
)
1843 return RELC_SHR_BASE
+ PRIV2 (h
->sym
->owner
, shr_index
);
1846 /* Can this happen (non-relocatable symg) ? I'd like to see
1851 if (h
->sym
->typ
== EGSD__C_SYM
)
1853 if (h
->sym
->flags
& EGSY__V_REL
)
1862 alpha_vms_get_sym_value (asection
*sect
, bfd_vma addr
)
1864 return sect
->output_section
->vma
+ sect
->output_offset
+ addr
;
1868 alpha_vms_fix_sec_rel (bfd
*abfd
, struct bfd_link_info
*info
,
1869 unsigned int rel
, bfd_vma vma
)
1873 if (PRIV (sections
) == NULL
)
1876 sec
= PRIV (sections
)[rel
& RELC_MASK
];
1880 if (sec
->output_section
== NULL
)
1882 return vma
+ sec
->output_section
->vma
+ sec
->output_offset
;
1885 return vma
+ sec
->vma
;
1888 /* Read an ETIR record from ABFD. If INFO is not null, put the content into
1889 the output section (used during linking).
1890 Return FALSE in case of error. */
1893 _bfd_vms_slurp_etir (bfd
*abfd
, struct bfd_link_info
*info
)
1896 unsigned int length
;
1897 unsigned char *maxptr
;
1900 unsigned int rel1
= RELC_NONE
;
1901 unsigned int rel2
= RELC_NONE
;
1902 struct alpha_vms_link_hash_entry
*h
;
1904 PRIV (recrd
.rec
) += ETIR__C_HEADER_SIZE
;
1905 PRIV (recrd
.rec_size
) -= ETIR__C_HEADER_SIZE
;
1907 ptr
= PRIV (recrd
.rec
);
1908 length
= PRIV (recrd
.rec_size
);
1909 maxptr
= ptr
+ length
;
1911 vms_debug2 ((2, "ETIR: %d bytes\n", length
));
1913 while (ptr
< maxptr
)
1915 int cmd
, cmd_length
;
1917 if (ptr
+ 4 > maxptr
)
1920 cmd
= bfd_getl16 (ptr
);
1921 cmd_length
= bfd_getl16 (ptr
+ 2);
1923 /* PR 21589 and 21579: Check for a corrupt ETIR record. */
1924 if (cmd_length
< 4 || ptr
+ cmd_length
> maxptr
)
1927 _bfd_error_handler (_("corrupt ETIR record encountered"));
1928 bfd_set_error (bfd_error_bad_value
);
1935 _bfd_vms_debug (4, "etir: %s(%d)\n",
1936 _bfd_vms_etir_name (cmd
), cmd
);
1937 _bfd_hexdump (8, ptr
, cmd_length
, 0);
1945 stack 32 bit value of symbol (high bits set to 0). */
1946 case ETIR__C_STA_GBL
:
1947 _bfd_vms_get_value (abfd
, ptr
, ptr
+ cmd_length
, info
, &op1
, &h
);
1948 if (!_bfd_vms_push (abfd
, op1
, alpha_vms_sym_to_ctxt (h
)))
1955 stack 32 bit value, sign extend to 64 bit. */
1956 case ETIR__C_STA_LW
:
1959 if (!_bfd_vms_push (abfd
, bfd_getl32 (ptr
), RELC_NONE
))
1966 stack 64 bit value of symbol. */
1967 case ETIR__C_STA_QW
:
1970 if (!_bfd_vms_push (abfd
, bfd_getl64 (ptr
), RELC_NONE
))
1974 /* Stack psect base plus quadword offset
1975 arg: lw section index
1976 qw signed quadword offset (low 32 bits)
1978 Stack qw argument and section index
1979 (see ETIR__C_STO_OFF, ETIR__C_CTL_SETRB). */
1980 case ETIR__C_STA_PQ
:
1984 if (cmd_length
< 12)
1986 psect
= bfd_getl32 (ptr
);
1987 if ((unsigned int) psect
>= PRIV (section_count
))
1989 _bfd_error_handler (_("bad section index in %s"),
1990 _bfd_vms_etir_name (cmd
));
1991 bfd_set_error (bfd_error_bad_value
);
1994 op1
= bfd_getl64 (ptr
+ 4);
1995 if (!_bfd_vms_push (abfd
, op1
, psect
| RELC_SEC_BASE
))
2000 case ETIR__C_STA_LI
:
2001 case ETIR__C_STA_MOD
:
2002 case ETIR__C_STA_CKARG
:
2003 _bfd_error_handler (_("unsupported STA cmd %s"),
2004 _bfd_vms_etir_name (cmd
));
2008 /* Store byte: pop stack, write byte
2011 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2013 if (rel1
!= RELC_NONE
)
2015 if (!image_write_b (abfd
, (unsigned int) op1
& 0xff))
2019 /* Store word: pop stack, write word
2022 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2024 if (rel1
!= RELC_NONE
)
2026 if (!image_write_w (abfd
, (unsigned int) op1
& 0xffff))
2030 /* Store longword: pop stack, write longword
2032 case ETIR__C_STO_LW
:
2033 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2035 if (rel1
& RELC_SEC_BASE
)
2037 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2040 else if (rel1
& RELC_SHR_BASE
)
2042 if (!alpha_vms_add_fixup_lr (info
, rel1
& RELC_MASK
, op1
))
2046 if (rel1
!= RELC_NONE
)
2048 if (rel1
!= RELC_REL
)
2050 if (!alpha_vms_add_lw_reloc (info
))
2053 if (!image_write_l (abfd
, op1
))
2057 /* Store quadword: pop stack, write quadword
2059 case ETIR__C_STO_QW
:
2060 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2062 if (rel1
& RELC_SEC_BASE
)
2064 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2067 else if (rel1
& RELC_SHR_BASE
)
2069 if (rel1
!= RELC_NONE
)
2071 if (rel1
!= RELC_REL
)
2073 if (!alpha_vms_add_qw_reloc (info
))
2076 if (!image_write_q (abfd
, op1
))
2080 /* Store immediate repeated: pop stack for repeat count
2083 case ETIR__C_STO_IMMR
:
2089 size
= bfd_getl32 (ptr
);
2090 if (size
> cmd_length
- 4)
2092 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2094 if (rel1
!= RELC_NONE
)
2100 if (!image_write (abfd
, ptr
+ 4, size
))
2105 /* Store global: write symbol value
2106 arg: cs global symbol name. */
2107 case ETIR__C_STO_GBL
:
2108 _bfd_vms_get_value (abfd
, ptr
, ptr
+ cmd_length
, info
, &op1
, &h
);
2111 if (h
->sym
->typ
== EGSD__C_SYMG
)
2113 if (!alpha_vms_add_fixup_qr (info
, abfd
, h
->sym
->owner
,
2114 h
->sym
->symbol_vector
))
2120 op1
= alpha_vms_get_sym_value (h
->sym
->section
,
2122 if (!alpha_vms_add_qw_reloc (info
))
2126 if (!image_write_q (abfd
, op1
))
2130 /* Store code address: write address of entry point
2131 arg: cs global symbol name (procedure). */
2132 case ETIR__C_STO_CA
:
2133 _bfd_vms_get_value (abfd
, ptr
, ptr
+ cmd_length
, info
, &op1
, &h
);
2136 if (h
->sym
->flags
& EGSY__V_NORM
)
2138 /* That's really a procedure. */
2139 if (h
->sym
->typ
== EGSD__C_SYMG
)
2141 if (!alpha_vms_add_fixup_ca (info
, abfd
, h
->sym
->owner
))
2143 op1
= h
->sym
->symbol_vector
;
2147 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
2148 h
->sym
->code_value
);
2149 if (!alpha_vms_add_qw_reloc (info
))
2155 /* Symbol is not a procedure. */
2159 if (!image_write_q (abfd
, op1
))
2163 /* Store offset to psect: pop stack, add low 32 bits to base of psect
2165 case ETIR__C_STO_OFF
:
2166 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2169 if (!(rel1
& RELC_SEC_BASE
))
2172 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2174 if (!image_write_q (abfd
, op1
))
2179 arg: lw count of bytes
2181 case ETIR__C_STO_IMM
:
2187 size
= bfd_getl32 (ptr
);
2188 if (!image_write (abfd
, ptr
+ 4, size
))
2193 /* This code is 'reserved to digital' according to the openVMS
2194 linker manual, however it is generated by the DEC C compiler
2195 and defined in the include file.
2196 FIXME, since the following is just a guess
2197 store global longword: store 32bit value of symbol
2198 arg: cs symbol name. */
2199 case ETIR__C_STO_GBL_LW
:
2200 _bfd_vms_get_value (abfd
, ptr
, ptr
+ cmd_length
, info
, &op1
, &h
);
2204 if (!image_write_l (abfd
, op1
))
2208 case ETIR__C_STO_RB
:
2209 case ETIR__C_STO_AB
:
2210 case ETIR__C_STO_LP_PSB
:
2211 _bfd_error_handler (_("%s: not supported"),
2212 _bfd_vms_etir_name (cmd
));
2215 case ETIR__C_STO_HINT_GBL
:
2216 case ETIR__C_STO_HINT_PS
:
2217 _bfd_error_handler (_("%s: not implemented"),
2218 _bfd_vms_etir_name (cmd
));
2222 /* 200 Store-conditional Linkage Pair
2224 case ETIR__C_STC_LP
:
2226 /* 202 Store-conditional Address at global address
2230 case ETIR__C_STC_GBL
:
2232 /* 203 Store-conditional Code Address at global address
2234 cs procedure name. */
2235 case ETIR__C_STC_GCA
:
2237 /* 204 Store-conditional Address at psect + offset
2241 case ETIR__C_STC_PS
:
2242 _bfd_error_handler (_("%s: not supported"),
2243 _bfd_vms_etir_name (cmd
));
2247 /* 201 Store-conditional Linkage Pair with Procedure Signature
2253 case ETIR__C_STC_LP_PSB
:
2256 _bfd_vms_get_value (abfd
, ptr
+ 4, ptr
+ cmd_length
, info
, &op1
, &h
);
2259 if (h
->sym
->typ
== EGSD__C_SYMG
)
2261 if (!alpha_vms_add_fixup_lp (info
, abfd
, h
->sym
->owner
))
2263 op1
= h
->sym
->symbol_vector
;
2268 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
2269 h
->sym
->code_value
);
2270 op2
= alpha_vms_get_sym_value (h
->sym
->section
,
2276 /* Undefined symbol. */
2280 if (!image_write_q (abfd
, op1
)
2281 || !image_write_q (abfd
, op2
))
2285 /* 205 Store-conditional NOP at address of global
2287 case ETIR__C_STC_NOP_GBL
:
2290 /* 207 Store-conditional BSR at global address
2293 case ETIR__C_STC_BSR_GBL
:
2296 /* 209 Store-conditional LDA at global address
2299 case ETIR__C_STC_LDA_GBL
:
2302 /* 211 Store-conditional BSR or Hint at global address
2305 case ETIR__C_STC_BOH_GBL
:
2306 /* Currentl ignored. */
2309 /* 213 Store-conditional NOP,BSR or HINT at global address
2312 case ETIR__C_STC_NBH_GBL
:
2314 /* 206 Store-conditional NOP at pect + offset
2317 case ETIR__C_STC_NOP_PS
:
2319 /* 208 Store-conditional BSR at pect + offset
2322 case ETIR__C_STC_BSR_PS
:
2324 /* 210 Store-conditional LDA at psect + offset
2327 case ETIR__C_STC_LDA_PS
:
2329 /* 212 Store-conditional BSR or Hint at pect + offset
2332 case ETIR__C_STC_BOH_PS
:
2334 /* 214 Store-conditional NOP, BSR or HINT at psect + offset
2336 case ETIR__C_STC_NBH_PS
:
2337 _bfd_error_handler (_("%s: not supported"),
2338 _bfd_vms_etir_name (cmd
));
2342 /* Det relocation base: pop stack, set image location counter
2344 case ETIR__C_CTL_SETRB
:
2345 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2347 if (!(rel1
& RELC_SEC_BASE
))
2349 image_set_ptr (abfd
, op1
, rel1
& RELC_MASK
, info
);
2352 /* Augment relocation base: increment image location counter by offset
2353 arg: lw offset value. */
2354 case ETIR__C_CTL_AUGRB
:
2357 op1
= bfd_getl32 (ptr
);
2358 image_inc_ptr (abfd
, op1
);
2361 /* Define location: pop index, save location counter under index
2363 case ETIR__C_CTL_DFLOC
:
2364 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2366 if (rel1
!= RELC_NONE
)
2368 if (!dst_define_location (abfd
, op1
))
2372 /* Set location: pop index, restore location counter from index
2374 case ETIR__C_CTL_STLOC
:
2375 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2377 if (rel1
!= RELC_NONE
)
2379 if (!dst_restore_location (abfd
, op1
))
2381 bfd_set_error (bfd_error_bad_value
);
2382 _bfd_error_handler (_("invalid %s"), "ETIR__C_CTL_STLOC");
2387 /* Stack defined location: pop index, push location counter from index
2389 case ETIR__C_CTL_STKDL
:
2390 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2392 if (rel1
!= RELC_NONE
)
2394 if (!dst_retrieve_location (abfd
, &op1
))
2396 bfd_set_error (bfd_error_bad_value
);
2397 _bfd_error_handler (_("invalid %s"), "ETIR__C_CTL_STKDL");
2400 if (!_bfd_vms_push (abfd
, op1
, RELC_NONE
))
2404 case ETIR__C_OPR_NOP
: /* No-op. */
2407 case ETIR__C_OPR_ADD
: /* Add. */
2408 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2409 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2411 if (rel1
== RELC_NONE
&& rel2
!= RELC_NONE
)
2413 else if (rel1
!= RELC_NONE
&& rel2
!= RELC_NONE
)
2415 if (!_bfd_vms_push (abfd
, op1
+ op2
, rel1
))
2419 case ETIR__C_OPR_SUB
: /* Subtract. */
2420 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2421 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2423 if (rel1
== RELC_NONE
&& rel2
!= RELC_NONE
)
2425 else if ((rel1
& RELC_SEC_BASE
) && (rel2
& RELC_SEC_BASE
))
2427 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2428 op2
= alpha_vms_fix_sec_rel (abfd
, info
, rel2
, op2
);
2431 else if (rel1
!= RELC_NONE
&& rel2
!= RELC_NONE
)
2433 if (!_bfd_vms_push (abfd
, op2
- op1
, rel1
))
2437 case ETIR__C_OPR_MUL
: /* Multiply. */
2438 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2439 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2441 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2443 if (!_bfd_vms_push (abfd
, op1
* op2
, RELC_NONE
))
2447 case ETIR__C_OPR_DIV
: /* Divide. */
2448 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2449 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2451 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2455 /* Divide by zero is supposed to give a result of zero,
2456 and a non-fatal warning message. */
2457 _bfd_error_handler (_("%s divide by zero"), "ETIR__C_OPR_DIV");
2458 if (!_bfd_vms_push (abfd
, 0, RELC_NONE
))
2463 if (!_bfd_vms_push (abfd
, op2
/ op1
, RELC_NONE
))
2468 case ETIR__C_OPR_AND
: /* Logical AND. */
2469 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2470 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2472 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2474 if (!_bfd_vms_push (abfd
, op1
& op2
, RELC_NONE
))
2478 case ETIR__C_OPR_IOR
: /* Logical inclusive OR. */
2479 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2480 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2482 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2484 if (!_bfd_vms_push (abfd
, op1
| op2
, RELC_NONE
))
2488 case ETIR__C_OPR_EOR
: /* Logical exclusive OR. */
2489 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2490 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2492 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2494 if (!_bfd_vms_push (abfd
, op1
^ op2
, RELC_NONE
))
2498 case ETIR__C_OPR_NEG
: /* Negate. */
2499 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2501 if (rel1
!= RELC_NONE
)
2503 if (!_bfd_vms_push (abfd
, -op1
, RELC_NONE
))
2507 case ETIR__C_OPR_COM
: /* Complement. */
2508 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2510 if (rel1
!= RELC_NONE
)
2512 if (!_bfd_vms_push (abfd
, ~op1
, RELC_NONE
))
2516 case ETIR__C_OPR_ASH
: /* Arithmetic shift. */
2517 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2518 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2520 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2523 _bfd_error_handler (_("invalid use of %s with contexts"),
2524 _bfd_vms_etir_name (cmd
));
2527 if ((bfd_signed_vma
) op2
< 0)
2532 if (op2
>= CHAR_BIT
* sizeof (op1
))
2533 op2
= CHAR_BIT
* sizeof (op1
) - 1;
2534 /* op1 = (bfd_signed_vma) op1 >> op2; */
2535 sign
= op1
& ((bfd_vma
) 1 << (CHAR_BIT
* sizeof (op1
) - 1));
2538 op1
= (op1
^ sign
) - sign
;
2543 if (op2
>= CHAR_BIT
* sizeof (op1
))
2548 if (!_bfd_vms_push (abfd
, op1
, RELC_NONE
)) /* FIXME: sym. */
2552 case ETIR__C_OPR_INSV
: /* Insert field. */
2553 case ETIR__C_OPR_USH
: /* Unsigned shift. */
2554 case ETIR__C_OPR_ROT
: /* Rotate. */
2555 case ETIR__C_OPR_REDEF
: /* Redefine symbol to current location. */
2556 case ETIR__C_OPR_DFLIT
: /* Define a literal. */
2557 _bfd_error_handler (_("%s: not supported"),
2558 _bfd_vms_etir_name (cmd
));
2562 case ETIR__C_OPR_SEL
: /* Select. */
2563 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2567 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2572 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2573 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2575 if (!_bfd_vms_push (abfd
, op1
, rel1
))
2581 _bfd_error_handler (_("reserved cmd %d"), cmd
);
2592 /* Process EDBG/ETBT record.
2593 Return TRUE on success, FALSE on error */
2596 vms_slurp_debug (bfd
*abfd
)
2598 asection
*section
= PRIV (dst_section
);
2600 if (section
== NULL
)
2602 /* We have no way to find out beforehand how much debug info there
2603 is in an object file, so pick an initial amount and grow it as
2605 flagword flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
| SEC_RELOC
2608 section
= bfd_make_section (abfd
, "$DST$");
2611 if (!bfd_set_section_flags (section
, flags
))
2613 PRIV (dst_section
) = section
;
2616 PRIV (image_section
) = section
;
2617 PRIV (image_offset
) = section
->size
;
2619 if (!_bfd_vms_slurp_etir (abfd
, NULL
))
2622 section
->size
= PRIV (image_offset
);
2626 /* Process EDBG record.
2627 Return TRUE on success, FALSE on error. */
2630 _bfd_vms_slurp_edbg (bfd
*abfd
)
2632 vms_debug2 ((2, "EDBG\n"));
2634 abfd
->flags
|= HAS_DEBUG
| HAS_LINENO
;
2636 return vms_slurp_debug (abfd
);
2639 /* Process ETBT record.
2640 Return TRUE on success, FALSE on error. */
2643 _bfd_vms_slurp_etbt (bfd
*abfd
)
2645 vms_debug2 ((2, "ETBT\n"));
2647 abfd
->flags
|= HAS_LINENO
;
2649 return vms_slurp_debug (abfd
);
2652 /* Process EEOM record.
2653 Return TRUE on success, FALSE on error. */
2656 _bfd_vms_slurp_eeom (bfd
*abfd
)
2658 struct vms_eeom
*eeom
= (struct vms_eeom
*) PRIV (recrd
.rec
);
2660 vms_debug2 ((2, "EEOM\n"));
2662 /* PR 21813: Check for an undersized record. */
2663 if (PRIV (recrd
.buf_size
) < sizeof (* eeom
))
2665 _bfd_error_handler (_("corrupt EEOM record - size is too small"));
2666 bfd_set_error (bfd_error_bad_value
);
2670 PRIV (eom_data
).eom_l_total_lps
= bfd_getl32 (eeom
->total_lps
);
2671 PRIV (eom_data
).eom_w_comcod
= bfd_getl16 (eeom
->comcod
);
2672 if (PRIV (eom_data
).eom_w_comcod
> 1)
2674 _bfd_error_handler (_("object module not error-free !"));
2675 bfd_set_error (bfd_error_bad_value
);
2679 PRIV (eom_data
).eom_has_transfer
= FALSE
;
2680 if (PRIV (recrd
.rec_size
) > 10)
2682 PRIV (eom_data
).eom_has_transfer
= TRUE
;
2683 PRIV (eom_data
).eom_b_tfrflg
= eeom
->tfrflg
;
2684 PRIV (eom_data
).eom_l_psindx
= bfd_getl32 (eeom
->psindx
);
2685 PRIV (eom_data
).eom_l_tfradr
= bfd_getl32 (eeom
->tfradr
);
2687 abfd
->start_address
= PRIV (eom_data
).eom_l_tfradr
;
2692 /* Slurp an ordered set of VMS object records. Return FALSE on error. */
2695 _bfd_vms_slurp_object_records (bfd
* abfd
)
2702 vms_debug2 ((7, "reading at %08lx\n", (unsigned long)bfd_tell (abfd
)));
2704 type
= _bfd_vms_get_object_record (abfd
);
2707 vms_debug2 ((2, "next_record failed\n"));
2714 ok
= _bfd_vms_slurp_ehdr (abfd
);
2717 ok
= _bfd_vms_slurp_eeom (abfd
);
2720 ok
= _bfd_vms_slurp_egsd (abfd
);
2723 ok
= TRUE
; /* _bfd_vms_slurp_etir (abfd); */
2726 ok
= _bfd_vms_slurp_edbg (abfd
);
2729 ok
= _bfd_vms_slurp_etbt (abfd
);
2736 vms_debug2 ((2, "slurp type %d failed\n", type
));
2740 while (type
!= EOBJ__C_EEOM
);
2745 /* Initialize private data */
2747 vms_initialize (bfd
* abfd
)
2751 amt
= sizeof (struct vms_private_data_struct
);
2752 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
2753 if (abfd
->tdata
.any
== NULL
)
2756 PRIV (recrd
.file_format
) = FF_UNKNOWN
;
2758 amt
= sizeof (struct stack_struct
) * STACKSIZE
;
2759 PRIV (stack
) = bfd_alloc (abfd
, amt
);
2760 if (PRIV (stack
) == NULL
)
2766 bfd_release (abfd
, abfd
->tdata
.any
);
2767 abfd
->tdata
.any
= NULL
;
2771 /* Free malloc'd memory. */
2774 alpha_vms_free_private (bfd
*abfd
)
2776 struct module
*module
;
2778 free (PRIV (recrd
.buf
));
2779 free (PRIV (sections
));
2781 free (PRIV (dst_ptr_offsets
));
2783 for (module
= PRIV (modules
); module
; module
= module
->next
)
2784 free (module
->file_table
);
2787 /* Check the format for a file being read.
2788 Return a (bfd_target *) if it's an object file or zero if not. */
2791 alpha_vms_object_p (bfd
*abfd
)
2793 void *tdata_save
= abfd
->tdata
.any
;
2794 unsigned int test_len
;
2797 vms_debug2 ((1, "vms_object_p(%p)\n", abfd
));
2799 /* Allocate alpha-vms specific data. */
2800 if (!vms_initialize (abfd
))
2802 abfd
->tdata
.any
= tdata_save
;
2806 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
))
2809 /* The first challenge with VMS is to discover the kind of the file.
2811 Image files (executable or shared images) are stored as a raw
2812 stream of bytes (like on UNIX), but there is no magic number.
2814 Object files are written with RMS (record management service), ie
2815 each records are preceeded by its length (on a word - 2 bytes), and
2816 padded for word-alignment. That would be simple but when files
2817 are transfered to a UNIX filesystem (using ftp), records are lost.
2818 Only the raw content of the records are transfered. Fortunately,
2819 the Alpha Object file format also store the length of the record
2820 in the records. Is that clear ? */
2822 /* Minimum is 6 bytes for objects (2 bytes size, 2 bytes record id,
2823 2 bytes size repeated) and 12 bytes for images (4 bytes major id,
2824 4 bytes minor id, 4 bytes length). */
2826 buf
= _bfd_malloc_and_read (abfd
, test_len
, test_len
);
2829 PRIV (recrd
.buf
) = buf
;
2830 PRIV (recrd
.buf_size
) = test_len
;
2831 PRIV (recrd
.rec
) = buf
;
2833 /* Is it an image? */
2834 if ((bfd_getl32 (buf
) == EIHD__K_MAJORID
)
2835 && (bfd_getl32 (buf
+ 4) == EIHD__K_MINORID
))
2837 unsigned int eisd_offset
, eihs_offset
;
2839 /* Extract the header size. */
2840 PRIV (recrd
.rec_size
) = bfd_getl32 (buf
+ EIHD__L_SIZE
);
2842 /* The header size is 0 for DSF files. */
2843 if (PRIV (recrd
.rec_size
) == 0)
2844 PRIV (recrd
.rec_size
) = sizeof (struct vms_eihd
);
2846 /* PR 21813: Check for a truncated record. */
2847 /* PR 17512: file: 7d7c57c2. */
2848 if (PRIV (recrd
.rec_size
) < sizeof (struct vms_eihd
))
2849 goto err_wrong_format
;
2851 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
))
2854 free (PRIV (recrd
.buf
));
2855 PRIV (recrd
.buf
) = NULL
;
2856 buf
= _bfd_malloc_and_read (abfd
, PRIV (recrd
.rec_size
),
2857 PRIV (recrd
.rec_size
));
2861 PRIV (recrd
.buf
) = buf
;
2862 PRIV (recrd
.buf_size
) = PRIV (recrd
.rec_size
);
2863 PRIV (recrd
.rec
) = buf
;
2865 vms_debug2 ((2, "file type is image\n"));
2867 if (!_bfd_vms_slurp_eihd (abfd
, &eisd_offset
, &eihs_offset
))
2868 goto err_wrong_format
;
2870 if (!_bfd_vms_slurp_eisd (abfd
, eisd_offset
))
2871 goto err_wrong_format
;
2873 /* EIHS is optional. */
2874 if (eihs_offset
!= 0 && !_bfd_vms_slurp_eihs (abfd
, eihs_offset
))
2875 goto err_wrong_format
;
2881 /* Assume it's a module and adjust record pointer if necessary. */
2882 maybe_adjust_record_pointer_for_object (abfd
);
2884 /* But is it really a module? */
2885 if (bfd_getl16 (PRIV (recrd
.rec
)) <= EOBJ__C_MAXRECTYP
2886 && bfd_getl16 (PRIV (recrd
.rec
) + 2) <= EOBJ__C_MAXRECSIZ
)
2888 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
2889 goto err_wrong_format
;
2891 vms_debug2 ((2, "file type is module\n"));
2893 type
= bfd_getl16 (PRIV (recrd
.rec
));
2894 if (type
!= EOBJ__C_EMH
|| !_bfd_vms_slurp_ehdr (abfd
))
2895 goto err_wrong_format
;
2897 if (!_bfd_vms_slurp_object_records (abfd
))
2898 goto err_wrong_format
;
2901 goto err_wrong_format
;
2904 /* Set arch_info to alpha. */
2906 if (! bfd_default_set_arch_mach (abfd
, bfd_arch_alpha
, 0))
2907 goto err_wrong_format
;
2909 return alpha_vms_free_private
;
2912 bfd_set_error (bfd_error_wrong_format
);
2915 alpha_vms_free_private (abfd
);
2916 if (abfd
->tdata
.any
!= tdata_save
&& abfd
->tdata
.any
!= NULL
)
2917 bfd_release (abfd
, abfd
->tdata
.any
);
2918 abfd
->tdata
.any
= tdata_save
;
2924 /* Write an EMH/MHD record. */
2927 _bfd_vms_write_emh (bfd
*abfd
)
2929 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2931 _bfd_vms_output_alignment (recwr
, 2);
2934 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2935 _bfd_vms_output_short (recwr
, EMH__C_MHD
);
2936 _bfd_vms_output_short (recwr
, EOBJ__C_STRLVL
);
2937 _bfd_vms_output_long (recwr
, 0);
2938 _bfd_vms_output_long (recwr
, 0);
2939 _bfd_vms_output_long (recwr
, MAX_OUTREC_SIZE
);
2941 /* Create module name from filename. */
2942 if (bfd_get_filename (abfd
) != 0)
2944 char *module
= vms_get_module_name (bfd_get_filename (abfd
), TRUE
);
2945 _bfd_vms_output_counted (recwr
, module
);
2949 _bfd_vms_output_counted (recwr
, "NONAME");
2951 _bfd_vms_output_counted (recwr
, BFD_VERSION_STRING
);
2952 _bfd_vms_output_dump (recwr
, get_vms_time_string (), EMH_DATE_LENGTH
);
2953 _bfd_vms_output_fill (recwr
, 0, EMH_DATE_LENGTH
);
2954 _bfd_vms_output_end (abfd
, recwr
);
2957 /* Write an EMH/LMN record. */
2960 _bfd_vms_write_lmn (bfd
*abfd
, const char *name
)
2963 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2964 unsigned int ver
= BFD_VERSION
/ 10000;
2967 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2968 _bfd_vms_output_short (recwr
, EMH__C_LNM
);
2969 snprintf (version
, sizeof (version
), "%s %d.%d.%d", name
,
2970 ver
/ 10000, (ver
/ 100) % 100, ver
% 100);
2971 _bfd_vms_output_dump (recwr
, (unsigned char *)version
, strlen (version
));
2972 _bfd_vms_output_end (abfd
, recwr
);
2976 /* Write eom record for bfd abfd. Return FALSE on error. */
2979 _bfd_vms_write_eeom (bfd
*abfd
)
2981 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2983 vms_debug2 ((2, "vms_write_eeom\n"));
2985 _bfd_vms_output_alignment (recwr
, 2);
2987 _bfd_vms_output_begin (recwr
, EOBJ__C_EEOM
);
2988 _bfd_vms_output_long (recwr
, PRIV (vms_linkage_index
+ 1) >> 1);
2989 _bfd_vms_output_byte (recwr
, 0); /* Completion code. */
2990 _bfd_vms_output_byte (recwr
, 0); /* Fill byte. */
2992 if ((abfd
->flags
& EXEC_P
) == 0
2993 && bfd_get_start_address (abfd
) != (bfd_vma
)-1)
2997 section
= bfd_get_section_by_name (abfd
, ".link");
3000 bfd_set_error (bfd_error_nonrepresentable_section
);
3003 _bfd_vms_output_short (recwr
, 0);
3004 _bfd_vms_output_long (recwr
, (unsigned long) section
->target_index
);
3005 _bfd_vms_output_long (recwr
,
3006 (unsigned long) bfd_get_start_address (abfd
));
3007 _bfd_vms_output_long (recwr
, 0);
3010 _bfd_vms_output_end (abfd
, recwr
);
3015 vector_grow1 (struct vector_type
*vec
, size_t elsz
)
3017 if (vec
->nbr_el
>= vec
->max_el
)
3019 if (vec
->max_el
== 0)
3022 vec
->els
= bfd_malloc (vec
->max_el
* elsz
);
3027 if (vec
->max_el
> -1u / 2)
3029 bfd_set_error (bfd_error_file_too_big
);
3033 if (_bfd_mul_overflow (vec
->max_el
, elsz
, &amt
))
3035 bfd_set_error (bfd_error_file_too_big
);
3038 vec
->els
= bfd_realloc_or_free (vec
->els
, amt
);
3041 if (vec
->els
== NULL
)
3043 return (char *) vec
->els
+ elsz
* vec
->nbr_el
++;
3046 /* Bump ABFD file position to next block. */
3049 alpha_vms_file_position_block (bfd
*abfd
)
3052 PRIV (file_pos
) += VMS_BLOCK_SIZE
- 1;
3053 PRIV (file_pos
) -= (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
3056 /* Convert from internal structure SRC to external structure DST. */
3059 alpha_vms_swap_eisd_out (struct vms_internal_eisd_map
*src
,
3060 struct vms_eisd
*dst
)
3062 bfd_putl32 (src
->u
.eisd
.majorid
, dst
->majorid
);
3063 bfd_putl32 (src
->u
.eisd
.minorid
, dst
->minorid
);
3064 bfd_putl32 (src
->u
.eisd
.eisdsize
, dst
->eisdsize
);
3065 if (src
->u
.eisd
.eisdsize
<= EISD__K_LENEND
)
3067 bfd_putl32 (src
->u
.eisd
.secsize
, dst
->secsize
);
3068 bfd_putl64 (src
->u
.eisd
.virt_addr
, dst
->virt_addr
);
3069 bfd_putl32 (src
->u
.eisd
.flags
, dst
->flags
);
3070 bfd_putl32 (src
->u
.eisd
.vbn
, dst
->vbn
);
3071 dst
->pfc
= src
->u
.eisd
.pfc
;
3072 dst
->matchctl
= src
->u
.eisd
.matchctl
;
3073 dst
->type
= src
->u
.eisd
.type
;
3075 if (src
->u
.eisd
.flags
& EISD__M_GBL
)
3077 bfd_putl32 (src
->u
.gbl_eisd
.ident
, dst
->ident
);
3078 memcpy (dst
->gblnam
, src
->u
.gbl_eisd
.gblnam
,
3079 src
->u
.gbl_eisd
.gblnam
[0] + 1);
3083 /* Append EISD to the list of extra eisd for ABFD. */
3086 alpha_vms_append_extra_eisd (bfd
*abfd
, struct vms_internal_eisd_map
*eisd
)
3089 if (PRIV (gbl_eisd_head
) == NULL
)
3090 PRIV (gbl_eisd_head
) = eisd
;
3092 PRIV (gbl_eisd_tail
)->next
= eisd
;
3093 PRIV (gbl_eisd_tail
) = eisd
;
3096 /* Create an EISD for shared image SHRIMG.
3097 Return FALSE in case of error. */
3100 alpha_vms_create_eisd_for_shared (bfd
*abfd
, bfd
*shrimg
)
3102 struct vms_internal_eisd_map
*eisd
;
3105 namlen
= strlen (PRIV2 (shrimg
, hdr_data
.hdr_t_name
));
3106 if (namlen
+ 5 > EISD__K_GBLNAMLEN
)
3112 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
3116 /* Fill the fields. */
3117 eisd
->u
.gbl_eisd
.common
.majorid
= EISD__K_MAJORID
;
3118 eisd
->u
.gbl_eisd
.common
.minorid
= EISD__K_MINORID
;
3119 eisd
->u
.gbl_eisd
.common
.eisdsize
= (EISD__K_LEN
+ 4 + namlen
+ 5 + 3) & ~3;
3120 eisd
->u
.gbl_eisd
.common
.secsize
= VMS_BLOCK_SIZE
; /* Must not be 0. */
3121 eisd
->u
.gbl_eisd
.common
.virt_addr
= 0;
3122 eisd
->u
.gbl_eisd
.common
.flags
= EISD__M_GBL
;
3123 eisd
->u
.gbl_eisd
.common
.vbn
= 0;
3124 eisd
->u
.gbl_eisd
.common
.pfc
= 0;
3125 eisd
->u
.gbl_eisd
.common
.matchctl
= PRIV2 (shrimg
, matchctl
);
3126 eisd
->u
.gbl_eisd
.common
.type
= EISD__K_SHRPIC
;
3128 eisd
->u
.gbl_eisd
.ident
= PRIV2 (shrimg
, ident
);
3129 eisd
->u
.gbl_eisd
.gblnam
[0] = namlen
+ 4;
3130 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1, PRIV2 (shrimg
, hdr_data
.hdr_t_name
),
3132 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1 + namlen
, "_001", 4);
3134 /* Append it to the list. */
3135 alpha_vms_append_extra_eisd (abfd
, eisd
);
3140 /* Create an EISD for section SEC.
3141 Return FALSE in case of failure. */
3144 alpha_vms_create_eisd_for_section (bfd
*abfd
, asection
*sec
)
3146 struct vms_internal_eisd_map
*eisd
;
3148 /* Only for allocating section. */
3149 if (!(sec
->flags
& SEC_ALLOC
))
3152 BFD_ASSERT (vms_section_data (sec
)->eisd
== NULL
);
3153 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
3156 vms_section_data (sec
)->eisd
= eisd
;
3158 /* Fill the fields. */
3159 eisd
->u
.eisd
.majorid
= EISD__K_MAJORID
;
3160 eisd
->u
.eisd
.minorid
= EISD__K_MINORID
;
3161 eisd
->u
.eisd
.eisdsize
= EISD__K_LEN
;
3162 eisd
->u
.eisd
.secsize
=
3163 (sec
->size
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
3164 eisd
->u
.eisd
.virt_addr
= sec
->vma
;
3165 eisd
->u
.eisd
.flags
= 0;
3166 eisd
->u
.eisd
.vbn
= 0; /* To be later defined. */
3167 eisd
->u
.eisd
.pfc
= 0; /* Default. */
3168 eisd
->u
.eisd
.matchctl
= EISD__K_MATALL
;
3169 eisd
->u
.eisd
.type
= EISD__K_NORMAL
;
3171 if (sec
->flags
& SEC_CODE
)
3172 eisd
->u
.eisd
.flags
|= EISD__M_EXE
;
3173 if (!(sec
->flags
& SEC_READONLY
))
3174 eisd
->u
.eisd
.flags
|= EISD__M_WRT
| EISD__M_CRF
;
3176 /* If relocations or fixup will be applied, make this isect writeable. */
3177 if (sec
->flags
& SEC_RELOC
)
3178 eisd
->u
.eisd
.flags
|= EISD__M_WRT
| EISD__M_CRF
;
3180 if (!(sec
->flags
& SEC_HAS_CONTENTS
))
3182 eisd
->u
.eisd
.flags
|= EISD__M_DZRO
;
3183 eisd
->u
.eisd
.flags
&= ~EISD__M_CRF
;
3185 if (sec
->flags
& SEC_LINKER_CREATED
)
3187 if (strcmp (sec
->name
, "$FIXUP$") == 0)
3188 eisd
->u
.eisd
.flags
|= EISD__M_FIXUPVEC
;
3191 /* Append it to the list. */
3193 if (PRIV (eisd_head
) == NULL
)
3194 PRIV (eisd_head
) = eisd
;
3196 PRIV (eisd_tail
)->next
= eisd
;
3197 PRIV (eisd_tail
) = eisd
;
3202 /* Layout executable ABFD and write it to the disk.
3203 Return FALSE in case of failure. */
3206 alpha_vms_write_exec (bfd
*abfd
)
3208 struct vms_eihd eihd
;
3209 struct vms_eiha
*eiha
;
3210 struct vms_eihi
*eihi
;
3211 struct vms_eihs
*eihs
= NULL
;
3213 struct vms_internal_eisd_map
*first_eisd
;
3214 struct vms_internal_eisd_map
*eisd
;
3217 file_ptr gst_filepos
= 0;
3218 unsigned int lnkflags
= 0;
3220 /* Build the EIHD. */
3221 PRIV (file_pos
) = EIHD__C_LENGTH
;
3223 memset (&eihd
, 0, sizeof (eihd
));
3224 memset (eihd
.fill_2
, 0xff, sizeof (eihd
.fill_2
));
3226 bfd_putl32 (EIHD__K_MAJORID
, eihd
.majorid
);
3227 bfd_putl32 (EIHD__K_MINORID
, eihd
.minorid
);
3229 bfd_putl32 (sizeof (eihd
), eihd
.size
);
3230 bfd_putl32 (0, eihd
.isdoff
);
3231 bfd_putl32 (0, eihd
.activoff
);
3232 bfd_putl32 (0, eihd
.symdbgoff
);
3233 bfd_putl32 (0, eihd
.imgidoff
);
3234 bfd_putl32 (0, eihd
.patchoff
);
3235 bfd_putl64 (0, eihd
.iafva
);
3236 bfd_putl32 (0, eihd
.version_array_off
);
3238 bfd_putl32 (EIHD__K_EXE
, eihd
.imgtype
);
3239 bfd_putl32 (0, eihd
.subtype
);
3241 bfd_putl32 (0, eihd
.imgiocnt
);
3242 bfd_putl32 (-1, eihd
.privreqs
);
3243 bfd_putl32 (-1, eihd
.privreqs
+ 4);
3245 bfd_putl32 ((sizeof (eihd
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
3247 bfd_putl32 (0, eihd
.ident
);
3248 bfd_putl32 (0, eihd
.sysver
);
3251 bfd_putl32 (0, eihd
.symvect_size
);
3252 bfd_putl32 (16, eihd
.virt_mem_block_size
);
3253 bfd_putl32 (0, eihd
.ext_fixup_off
);
3254 bfd_putl32 (0, eihd
.noopt_psect_off
);
3255 bfd_putl32 (-1, eihd
.alias
);
3258 eiha
= (struct vms_eiha
*)((char *) &eihd
+ PRIV (file_pos
));
3259 bfd_putl32 (PRIV (file_pos
), eihd
.activoff
);
3260 PRIV (file_pos
) += sizeof (struct vms_eiha
);
3262 bfd_putl32 (sizeof (struct vms_eiha
), eiha
->size
);
3263 bfd_putl32 (0, eiha
->spare
);
3264 bfd_putl64 (PRIV (transfer_address
[0]), eiha
->tfradr1
);
3265 bfd_putl64 (PRIV (transfer_address
[1]), eiha
->tfradr2
);
3266 bfd_putl64 (PRIV (transfer_address
[2]), eiha
->tfradr3
);
3267 bfd_putl64 (PRIV (transfer_address
[3]), eiha
->tfradr4
);
3268 bfd_putl64 (0, eiha
->inishr
);
3271 eihi
= (struct vms_eihi
*)((char *) &eihd
+ PRIV (file_pos
));
3272 bfd_putl32 (PRIV (file_pos
), eihd
.imgidoff
);
3273 PRIV (file_pos
) += sizeof (struct vms_eihi
);
3275 bfd_putl32 (EIHI__K_MAJORID
, eihi
->majorid
);
3276 bfd_putl32 (EIHI__K_MINORID
, eihi
->minorid
);
3281 /* Set module name. */
3282 module
= vms_get_module_name (bfd_get_filename (abfd
), TRUE
);
3283 len
= strlen (module
);
3284 if (len
> sizeof (eihi
->imgnam
) - 1)
3285 len
= sizeof (eihi
->imgnam
) - 1;
3286 eihi
->imgnam
[0] = len
;
3287 memcpy (eihi
->imgnam
+ 1, module
, len
);
3295 vms_get_time (&hi
, &lo
);
3296 bfd_putl32 (lo
, eihi
->linktime
+ 0);
3297 bfd_putl32 (hi
, eihi
->linktime
+ 4);
3300 eihi
->linkid
[0] = 0;
3301 eihi
->imgbid
[0] = 0;
3304 dst
= PRIV (dst_section
);
3305 dmt
= bfd_get_section_by_name (abfd
, "$DMT$");
3306 if (dst
!= NULL
&& dst
->size
!= 0)
3308 eihs
= (struct vms_eihs
*)((char *) &eihd
+ PRIV (file_pos
));
3309 bfd_putl32 (PRIV (file_pos
), eihd
.symdbgoff
);
3310 PRIV (file_pos
) += sizeof (struct vms_eihs
);
3312 bfd_putl32 (EIHS__K_MAJORID
, eihs
->majorid
);
3313 bfd_putl32 (EIHS__K_MINORID
, eihs
->minorid
);
3314 bfd_putl32 (0, eihs
->dstvbn
);
3315 bfd_putl32 (0, eihs
->dstsize
);
3316 bfd_putl32 (0, eihs
->gstvbn
);
3317 bfd_putl32 (0, eihs
->gstsize
);
3318 bfd_putl32 (0, eihs
->dmtvbn
);
3319 bfd_putl32 (0, eihs
->dmtsize
);
3322 /* One EISD per section. */
3323 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3325 if (!alpha_vms_create_eisd_for_section (abfd
, sec
))
3329 /* Merge section EIDS which extra ones. */
3330 if (PRIV (eisd_tail
))
3331 PRIV (eisd_tail
)->next
= PRIV (gbl_eisd_head
);
3333 PRIV (eisd_head
) = PRIV (gbl_eisd_head
);
3334 if (PRIV (gbl_eisd_tail
))
3335 PRIV (eisd_tail
) = PRIV (gbl_eisd_tail
);
3337 first_eisd
= PRIV (eisd_head
);
3339 /* Add end of eisd. */
3342 eisd
= bfd_zalloc (abfd
, sizeof (*eisd
));
3345 eisd
->u
.eisd
.majorid
= 0;
3346 eisd
->u
.eisd
.minorid
= 0;
3347 eisd
->u
.eisd
.eisdsize
= 0;
3348 alpha_vms_append_extra_eisd (abfd
, eisd
);
3351 /* Place EISD in the file. */
3352 for (eisd
= first_eisd
; eisd
; eisd
= eisd
->next
)
3354 file_ptr room
= VMS_BLOCK_SIZE
- (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
3356 /* First block is a little bit special: there is a word at the end. */
3357 if (PRIV (file_pos
) < VMS_BLOCK_SIZE
&& room
> 2)
3359 if (room
< eisd
->u
.eisd
.eisdsize
+ EISD__K_LENEND
)
3360 alpha_vms_file_position_block (abfd
);
3362 eisd
->file_pos
= PRIV (file_pos
);
3363 PRIV (file_pos
) += eisd
->u
.eisd
.eisdsize
;
3365 if (eisd
->u
.eisd
.flags
& EISD__M_FIXUPVEC
)
3366 bfd_putl64 (eisd
->u
.eisd
.virt_addr
, eihd
.iafva
);
3369 if (first_eisd
!= NULL
)
3371 bfd_putl32 (first_eisd
->file_pos
, eihd
.isdoff
);
3372 /* Real size of end of eisd marker. */
3373 PRIV (file_pos
) += EISD__K_LENEND
;
3376 bfd_putl32 (PRIV (file_pos
), eihd
.size
);
3377 bfd_putl32 ((PRIV (file_pos
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
3380 /* Place sections. */
3381 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3383 if (!(sec
->flags
& SEC_HAS_CONTENTS
))
3386 eisd
= vms_section_data (sec
)->eisd
;
3388 /* Align on a block. */
3389 alpha_vms_file_position_block (abfd
);
3390 sec
->filepos
= PRIV (file_pos
);
3393 eisd
->u
.eisd
.vbn
= (sec
->filepos
/ VMS_BLOCK_SIZE
) + 1;
3395 PRIV (file_pos
) += sec
->size
;
3399 if (eihs
!= NULL
&& dst
!= NULL
)
3401 bfd_putl32 ((dst
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dstvbn
);
3402 bfd_putl32 (dst
->size
, eihs
->dstsize
);
3406 lnkflags
|= EIHD__M_DBGDMT
;
3407 bfd_putl32 ((dmt
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dmtvbn
);
3408 bfd_putl32 (dmt
->size
, eihs
->dmtsize
);
3410 if (PRIV (gsd_sym_count
) != 0)
3412 alpha_vms_file_position_block (abfd
);
3413 gst_filepos
= PRIV (file_pos
);
3414 bfd_putl32 ((gst_filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->gstvbn
);
3415 bfd_putl32 ((PRIV (gsd_sym_count
) + 4) / 5 + 4, eihs
->gstsize
);
3419 /* Write EISD in hdr. */
3420 for (eisd
= first_eisd
; eisd
&& eisd
->file_pos
< VMS_BLOCK_SIZE
;
3422 alpha_vms_swap_eisd_out
3423 (eisd
, (struct vms_eisd
*)((char *)&eihd
+ eisd
->file_pos
));
3425 /* Write first block. */
3426 bfd_putl32 (lnkflags
, eihd
.lnkflags
);
3427 if (bfd_bwrite (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
3430 /* Write remaining eisd. */
3433 unsigned char blk
[VMS_BLOCK_SIZE
];
3434 struct vms_internal_eisd_map
*next_eisd
;
3436 memset (blk
, 0xff, sizeof (blk
));
3437 while (eisd
!= NULL
)
3439 alpha_vms_swap_eisd_out
3441 (struct vms_eisd
*)(blk
+ (eisd
->file_pos
% VMS_BLOCK_SIZE
)));
3443 next_eisd
= eisd
->next
;
3444 if (next_eisd
== NULL
3445 || (next_eisd
->file_pos
/ VMS_BLOCK_SIZE
3446 != eisd
->file_pos
/ VMS_BLOCK_SIZE
))
3448 if (bfd_bwrite (blk
, sizeof (blk
), abfd
) != sizeof (blk
))
3451 memset (blk
, 0xff, sizeof (blk
));
3457 /* Write sections. */
3458 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3460 unsigned char blk
[VMS_BLOCK_SIZE
];
3463 if (sec
->size
== 0 || !(sec
->flags
& SEC_HAS_CONTENTS
))
3465 if (bfd_bwrite (sec
->contents
, sec
->size
, abfd
) != sec
->size
)
3469 len
= VMS_BLOCK_SIZE
- sec
->size
% VMS_BLOCK_SIZE
;
3470 if (len
!= VMS_BLOCK_SIZE
)
3472 memset (blk
, 0, len
);
3473 if (bfd_bwrite (blk
, len
, abfd
) != len
)
3479 if (gst_filepos
!= 0)
3481 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3484 _bfd_vms_write_emh (abfd
);
3485 _bfd_vms_write_lmn (abfd
, "GNU LD");
3487 /* PSC for the absolute section. */
3488 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3489 _bfd_vms_output_long (recwr
, 0);
3490 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3491 _bfd_vms_output_short (recwr
, 0);
3492 _bfd_vms_output_short (recwr
, EGPS__V_PIC
| EGPS__V_LIB
| EGPS__V_RD
);
3493 _bfd_vms_output_long (recwr
, 0);
3494 _bfd_vms_output_counted (recwr
, ".$$ABS$$.");
3495 _bfd_vms_output_end_subrec (recwr
);
3496 _bfd_vms_output_end (abfd
, recwr
);
3498 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
3500 struct vms_symbol_entry
*sym
= PRIV (syms
)[i
];
3506 _bfd_vms_output_alignment (recwr
, 8);
3507 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3508 _bfd_vms_output_long (recwr
, 0);
3510 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_SYMG
);
3511 _bfd_vms_output_short (recwr
, 0); /* Data type, alignment. */
3512 _bfd_vms_output_short (recwr
, sym
->flags
);
3514 if (sym
->code_section
)
3515 ep
= alpha_vms_get_sym_value (sym
->code_section
, sym
->code_value
);
3518 BFD_ASSERT (sym
->code_value
== 0);
3521 val
= alpha_vms_get_sym_value (sym
->section
, sym
->value
);
3522 _bfd_vms_output_quad
3523 (recwr
, sym
->typ
== EGSD__C_SYMG
? sym
->symbol_vector
: val
);
3524 _bfd_vms_output_quad (recwr
, ep
);
3525 _bfd_vms_output_quad (recwr
, val
);
3526 _bfd_vms_output_long (recwr
, 0);
3527 _bfd_vms_output_counted (recwr
, sym
->name
);
3528 _bfd_vms_output_end_subrec (recwr
);
3530 _bfd_vms_output_end (abfd
, recwr
);
3533 _bfd_vms_output_end (abfd
, recwr
);
3535 if (!_bfd_vms_write_eeom (abfd
))
3543 /* Write section and symbol directory of bfd abfd. Return FALSE on error. */
3546 _bfd_vms_write_egsd (bfd
*abfd
)
3550 unsigned int symnum
;
3552 flagword new_flags
, old_flags
;
3553 int abs_section_index
= -1;
3554 unsigned int target_index
= 0;
3555 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3557 vms_debug2 ((2, "vms_write_egsd\n"));
3559 /* Egsd is quadword aligned. */
3560 _bfd_vms_output_alignment (recwr
, 8);
3562 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3563 _bfd_vms_output_long (recwr
, 0);
3565 /* Number sections. */
3566 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
3568 if (section
->flags
& SEC_DEBUGGING
)
3570 if (!strcmp (section
->name
, ".vmsdebug"))
3572 section
->flags
|= SEC_DEBUGGING
;
3575 section
->target_index
= target_index
++;
3578 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
3580 vms_debug2 ((3, "Section #%d %s, %d bytes\n",
3581 section
->target_index
, section
->name
, (int)section
->size
));
3583 /* Don't write out the VMS debug info section since it is in the
3584 ETBT and EDBG sections in etir. */
3585 if (section
->flags
& SEC_DEBUGGING
)
3588 /* 13 bytes egsd, max 31 chars name -> should be 44 bytes. */
3589 if (_bfd_vms_output_check (recwr
, 64) < 0)
3591 _bfd_vms_output_end (abfd
, recwr
);
3592 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3593 _bfd_vms_output_long (recwr
, 0);
3596 /* Don't know if this is necessary for the linker but for now it keeps
3597 vms_slurp_gsd happy. */
3598 sname
= section
->name
;
3601 /* Remove leading dot. */
3603 if ((*sname
== 't') && (strcmp (sname
, "text") == 0))
3604 sname
= EVAX_CODE_NAME
;
3605 else if ((*sname
== 'd') && (strcmp (sname
, "data") == 0))
3606 sname
= EVAX_DATA_NAME
;
3607 else if ((*sname
== 'b') && (strcmp (sname
, "bss") == 0))
3608 sname
= EVAX_BSS_NAME
;
3609 else if ((*sname
== 'l') && (strcmp (sname
, "link") == 0))
3610 sname
= EVAX_LINK_NAME
;
3611 else if ((*sname
== 'r') && (strcmp (sname
, "rdata") == 0))
3612 sname
= EVAX_READONLY_NAME
;
3613 else if ((*sname
== 'l') && (strcmp (sname
, "literal") == 0))
3614 sname
= EVAX_LITERAL_NAME
;
3615 else if ((*sname
== 'l') && (strcmp (sname
, "literals") == 0))
3616 sname
= EVAX_LITERALS_NAME
;
3617 else if ((*sname
== 'c') && (strcmp (sname
, "comm") == 0))
3618 sname
= EVAX_COMMON_NAME
;
3619 else if ((*sname
== 'l') && (strcmp (sname
, "lcomm") == 0))
3620 sname
= EVAX_LOCAL_NAME
;
3623 if (bfd_is_com_section (section
))
3624 new_flags
= (EGPS__V_OVR
| EGPS__V_REL
| EGPS__V_GBL
| EGPS__V_RD
3625 | EGPS__V_WRT
| EGPS__V_NOMOD
| EGPS__V_COM
);
3627 new_flags
= vms_esecflag_by_name (evax_section_flags
, sname
,
3630 /* Modify them as directed. */
3631 if (section
->flags
& SEC_READONLY
)
3632 new_flags
&= ~EGPS__V_WRT
;
3634 new_flags
&= ~vms_section_data (section
)->no_flags
;
3635 new_flags
|= vms_section_data (section
)->flags
;
3637 vms_debug2 ((3, "sec flags %x\n", section
->flags
));
3638 vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
3639 new_flags
, (unsigned long)section
->size
));
3641 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3642 _bfd_vms_output_short (recwr
, section
->alignment_power
& 0xff);
3643 _bfd_vms_output_short (recwr
, new_flags
);
3644 _bfd_vms_output_long (recwr
, (unsigned long) section
->size
);
3645 _bfd_vms_output_counted (recwr
, sname
);
3646 _bfd_vms_output_end_subrec (recwr
);
3648 /* If the section is an obsolute one, remind its index as it will be
3649 used later for absolute symbols. */
3650 if ((new_flags
& EGPS__V_REL
) == 0 && abs_section_index
< 0)
3651 abs_section_index
= section
->target_index
;
3654 /* Output symbols. */
3655 vms_debug2 ((3, "%d symbols found\n", abfd
->symcount
));
3657 bfd_set_start_address (abfd
, (bfd_vma
) -1);
3659 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3661 symbol
= abfd
->outsymbols
[symnum
];
3662 old_flags
= symbol
->flags
;
3664 /* Work-around a missing feature: consider __main as the main entry
3666 if (symbol
->name
[0] == '_' && strcmp (symbol
->name
, "__main") == 0)
3667 bfd_set_start_address (abfd
, (bfd_vma
)symbol
->value
);
3669 /* Only put in the GSD the global and the undefined symbols. */
3670 if (old_flags
& BSF_FILE
)
3673 if ((old_flags
& BSF_GLOBAL
) == 0 && !bfd_is_und_section (symbol
->section
))
3675 /* If the LIB$INITIIALIZE section is present, add a reference to
3676 LIB$INITIALIZE symbol. FIXME: this should be done explicitely
3677 in the assembly file. */
3678 if (!((old_flags
& BSF_SECTION_SYM
) != 0
3679 && strcmp (symbol
->section
->name
, "LIB$INITIALIZE") == 0))
3683 /* 13 bytes egsd, max 64 chars name -> should be 77 bytes. Add 16 more
3684 bytes for a possible ABS section. */
3685 if (_bfd_vms_output_check (recwr
, 80 + 16) < 0)
3687 _bfd_vms_output_end (abfd
, recwr
);
3688 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3689 _bfd_vms_output_long (recwr
, 0);
3692 if ((old_flags
& BSF_GLOBAL
) != 0
3693 && bfd_is_abs_section (symbol
->section
)
3694 && abs_section_index
<= 0)
3696 /* Create an absolute section if none was defined. It is highly
3697 unlikely that the name $ABS$ clashes with a user defined
3698 non-absolute section name. */
3699 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3700 _bfd_vms_output_short (recwr
, 4);
3701 _bfd_vms_output_short (recwr
, EGPS__V_SHR
);
3702 _bfd_vms_output_long (recwr
, 0);
3703 _bfd_vms_output_counted (recwr
, "$ABS$");
3704 _bfd_vms_output_end_subrec (recwr
);
3706 abs_section_index
= target_index
++;
3709 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_SYM
);
3711 /* Data type, alignment. */
3712 _bfd_vms_output_short (recwr
, 0);
3716 if (old_flags
& BSF_WEAK
)
3717 new_flags
|= EGSY__V_WEAK
;
3718 if (bfd_is_com_section (symbol
->section
)) /* .comm */
3719 new_flags
|= (EGSY__V_WEAK
| EGSY__V_COMM
);
3721 if (old_flags
& BSF_FUNCTION
)
3723 new_flags
|= EGSY__V_NORM
;
3724 new_flags
|= EGSY__V_REL
;
3726 if (old_flags
& BSF_GLOBAL
)
3728 new_flags
|= EGSY__V_DEF
;
3729 if (!bfd_is_abs_section (symbol
->section
))
3730 new_flags
|= EGSY__V_REL
;
3732 _bfd_vms_output_short (recwr
, new_flags
);
3734 if (old_flags
& BSF_GLOBAL
)
3736 /* Symbol definition. */
3737 bfd_vma code_address
= 0;
3738 unsigned long ca_psindx
= 0;
3739 unsigned long psindx
;
3741 if ((old_flags
& BSF_FUNCTION
) && symbol
->udata
.p
!= NULL
)
3746 ((struct evax_private_udata_struct
*)symbol
->udata
.p
)->enbsym
;
3747 code_address
= sym
->value
;
3748 ca_psindx
= sym
->section
->target_index
;
3750 if (bfd_is_abs_section (symbol
->section
))
3751 psindx
= abs_section_index
;
3753 psindx
= symbol
->section
->target_index
;
3755 _bfd_vms_output_quad (recwr
, symbol
->value
);
3756 _bfd_vms_output_quad (recwr
, code_address
);
3757 _bfd_vms_output_long (recwr
, ca_psindx
);
3758 _bfd_vms_output_long (recwr
, psindx
);
3760 _bfd_vms_output_counted (recwr
, symbol
->name
);
3762 _bfd_vms_output_end_subrec (recwr
);
3765 _bfd_vms_output_alignment (recwr
, 8);
3766 _bfd_vms_output_end (abfd
, recwr
);
3771 /* Write object header for bfd abfd. Return FALSE on error. */
3774 _bfd_vms_write_ehdr (bfd
*abfd
)
3777 unsigned int symnum
;
3778 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3780 vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd
));
3782 _bfd_vms_output_alignment (recwr
, 2);
3784 _bfd_vms_write_emh (abfd
);
3785 _bfd_vms_write_lmn (abfd
, "GNU AS");
3788 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3789 _bfd_vms_output_short (recwr
, EMH__C_SRC
);
3791 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3793 symbol
= abfd
->outsymbols
[symnum
];
3795 if (symbol
->flags
& BSF_FILE
)
3797 _bfd_vms_output_dump (recwr
, (unsigned char *) symbol
->name
,
3798 (int) strlen (symbol
->name
));
3803 if (symnum
== abfd
->symcount
)
3804 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("noname"));
3806 _bfd_vms_output_end (abfd
, recwr
);
3809 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3810 _bfd_vms_output_short (recwr
, EMH__C_TTL
);
3811 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("TTL"));
3812 _bfd_vms_output_end (abfd
, recwr
);
3815 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3816 _bfd_vms_output_short (recwr
, EMH__C_CPR
);
3817 _bfd_vms_output_dump (recwr
,
3818 (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
3820 _bfd_vms_output_end (abfd
, recwr
);
3825 /* Part 4.6, relocations. */
3828 /* WRITE ETIR SECTION
3830 This is still under construction and therefore not documented. */
3832 /* Close the etir/etbt record. */
3835 end_etir_record (bfd
* abfd
)
3837 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3839 _bfd_vms_output_end (abfd
, recwr
);
3843 start_etir_or_etbt_record (bfd
*abfd
, asection
*section
, bfd_vma offset
)
3845 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3847 if (section
->flags
& SEC_DEBUGGING
)
3849 _bfd_vms_output_begin (recwr
, EOBJ__C_ETBT
);
3853 /* Push start offset. */
3854 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
3855 _bfd_vms_output_long (recwr
, (unsigned long) 0);
3856 _bfd_vms_output_end_subrec (recwr
);
3859 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_DFLOC
);
3860 _bfd_vms_output_end_subrec (recwr
);
3865 _bfd_vms_output_begin (recwr
, EOBJ__C_ETIR
);
3869 /* Push start offset. */
3870 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
3871 _bfd_vms_output_long (recwr
, (unsigned long) section
->target_index
);
3872 _bfd_vms_output_quad (recwr
, offset
);
3873 _bfd_vms_output_end_subrec (recwr
);
3875 /* Start = pop (). */
3876 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_SETRB
);
3877 _bfd_vms_output_end_subrec (recwr
);
3882 /* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
3883 address VADDR in section specified by SEC_INDEX and NAME. */
3886 sto_imm (bfd
*abfd
, asection
*section
,
3887 bfd_size_type ssize
, unsigned char *cptr
, bfd_vma vaddr
)
3890 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3893 _bfd_vms_debug (8, "sto_imm %d bytes\n", (int) ssize
);
3894 _bfd_hexdump (9, cptr
, (int) ssize
, (int) vaddr
);
3899 /* Try all the rest. */
3902 if (_bfd_vms_output_check (recwr
, size
) < 0)
3904 /* Doesn't fit, split ! */
3905 end_etir_record (abfd
);
3907 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3909 size
= _bfd_vms_output_check (recwr
, 0); /* get max size */
3910 if (size
> ssize
) /* more than what's left ? */
3914 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_IMM
);
3915 _bfd_vms_output_long (recwr
, (unsigned long) (size
));
3916 _bfd_vms_output_dump (recwr
, cptr
, size
);
3917 _bfd_vms_output_end_subrec (recwr
);
3920 _bfd_vms_debug (10, "dumped %d bytes\n", (int) size
);
3921 _bfd_hexdump (10, cptr
, (int) size
, (int) vaddr
);
3931 etir_output_check (bfd
*abfd
, asection
*section
, bfd_vma vaddr
, int checklen
)
3933 if (_bfd_vms_output_check (&PRIV (recwr
), checklen
) < 0)
3935 /* Not enough room in this record. Close it and open a new one. */
3936 end_etir_record (abfd
);
3937 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3941 /* Return whether RELOC must be deferred till the end. */
3944 defer_reloc_p (arelent
*reloc
)
3946 switch (reloc
->howto
->type
)
3959 /* Write section contents for bfd abfd. Return FALSE on error. */
3962 _bfd_vms_write_etir (bfd
* abfd
, int objtype ATTRIBUTE_UNUSED
)
3965 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3967 vms_debug2 ((2, "vms_write_tir (%p, %d)\n", abfd
, objtype
));
3969 _bfd_vms_output_alignment (recwr
, 4);
3971 PRIV (vms_linkage_index
) = 0;
3973 for (section
= abfd
->sections
; section
; section
= section
->next
)
3975 vms_debug2 ((4, "writing %d. section '%s' (%d bytes)\n",
3976 section
->target_index
, section
->name
, (int) (section
->size
)));
3978 if (!(section
->flags
& SEC_HAS_CONTENTS
)
3979 || bfd_is_com_section (section
))
3982 if (!section
->contents
)
3984 bfd_set_error (bfd_error_no_contents
);
3988 start_etir_or_etbt_record (abfd
, section
, 0);
3990 if (section
->flags
& SEC_RELOC
)
3992 bfd_vma curr_addr
= 0;
3993 unsigned char *curr_data
= section
->contents
;
3995 int pass2_needed
= 0;
3996 int pass2_in_progress
= 0;
3999 if (section
->reloc_count
== 0)
4001 (_("SEC_RELOC with no relocs in section %pA"), section
);
4006 int i
= section
->reloc_count
;
4007 arelent
**rptr
= section
->orelocation
;
4008 _bfd_vms_debug (4, "%d relocations:\n", i
);
4011 _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, "
4012 "addr %08lx, off %08lx, len %d: %s\n",
4013 (*(*rptr
)->sym_ptr_ptr
)->name
,
4014 (*(*rptr
)->sym_ptr_ptr
)->section
->name
,
4015 (long) (*(*rptr
)->sym_ptr_ptr
)->value
,
4016 (unsigned long)(*rptr
)->address
,
4017 (unsigned long)(*rptr
)->addend
,
4018 bfd_get_reloc_size ((*rptr
)->howto
),
4019 ( *rptr
)->howto
->name
);
4026 for (irel
= 0; irel
< section
->reloc_count
; irel
++)
4028 struct evax_private_udata_struct
*udata
;
4029 arelent
*rptr
= section
->orelocation
[irel
];
4030 bfd_vma addr
= rptr
->address
;
4031 asymbol
*sym
= *rptr
->sym_ptr_ptr
;
4032 asection
*sec
= sym
->section
;
4033 bfd_boolean defer
= defer_reloc_p (rptr
);
4036 if (pass2_in_progress
)
4038 /* Non-deferred relocs have already been output. */
4044 /* Deferred relocs must be output at the very end. */
4051 /* Regular relocs are intertwined with binary data. */
4052 if (curr_addr
> addr
)
4053 _bfd_error_handler (_("size error in section %pA"),
4055 size
= addr
- curr_addr
;
4056 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
4061 size
= bfd_get_reloc_size (rptr
->howto
);
4063 switch (rptr
->howto
->type
)
4065 case ALPHA_R_IGNORE
:
4068 case ALPHA_R_REFLONG
:
4069 if (bfd_is_und_section (sym
->section
))
4071 bfd_vma addend
= rptr
->addend
;
4072 slen
= strlen ((char *) sym
->name
);
4073 etir_output_check (abfd
, section
, curr_addr
, slen
);
4076 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
4077 _bfd_vms_output_counted (recwr
, sym
->name
);
4078 _bfd_vms_output_end_subrec (recwr
);
4079 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
4080 _bfd_vms_output_long (recwr
, (unsigned long) addend
);
4081 _bfd_vms_output_end_subrec (recwr
);
4082 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
4083 _bfd_vms_output_end_subrec (recwr
);
4084 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4085 _bfd_vms_output_end_subrec (recwr
);
4089 _bfd_vms_output_begin_subrec
4090 (recwr
, ETIR__C_STO_GBL_LW
);
4091 _bfd_vms_output_counted (recwr
, sym
->name
);
4092 _bfd_vms_output_end_subrec (recwr
);
4095 else if (bfd_is_abs_section (sym
->section
))
4097 etir_output_check (abfd
, section
, curr_addr
, 16);
4098 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
4099 _bfd_vms_output_long (recwr
, (unsigned long) sym
->value
);
4100 _bfd_vms_output_end_subrec (recwr
);
4101 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4102 _bfd_vms_output_end_subrec (recwr
);
4106 etir_output_check (abfd
, section
, curr_addr
, 32);
4107 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
4108 _bfd_vms_output_long (recwr
,
4109 (unsigned long) sec
->target_index
);
4110 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
4111 _bfd_vms_output_end_subrec (recwr
);
4112 /* ??? Table B-8 of the OpenVMS Linker Utilily Manual
4113 says that we should have a ETIR__C_STO_OFF here.
4114 But the relocation would not be BFD_RELOC_32 then.
4115 This case is very likely unreachable. */
4116 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4117 _bfd_vms_output_end_subrec (recwr
);
4121 case ALPHA_R_REFQUAD
:
4122 if (bfd_is_und_section (sym
->section
))
4124 bfd_vma addend
= rptr
->addend
;
4125 slen
= strlen ((char *) sym
->name
);
4126 etir_output_check (abfd
, section
, curr_addr
, slen
);
4129 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
4130 _bfd_vms_output_counted (recwr
, sym
->name
);
4131 _bfd_vms_output_end_subrec (recwr
);
4132 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
4133 _bfd_vms_output_quad (recwr
, addend
);
4134 _bfd_vms_output_end_subrec (recwr
);
4135 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
4136 _bfd_vms_output_end_subrec (recwr
);
4137 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
4138 _bfd_vms_output_end_subrec (recwr
);
4142 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_GBL
);
4143 _bfd_vms_output_counted (recwr
, sym
->name
);
4144 _bfd_vms_output_end_subrec (recwr
);
4147 else if (bfd_is_abs_section (sym
->section
))
4149 etir_output_check (abfd
, section
, curr_addr
, 16);
4150 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
4151 _bfd_vms_output_quad (recwr
, sym
->value
);
4152 _bfd_vms_output_end_subrec (recwr
);
4153 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
4154 _bfd_vms_output_end_subrec (recwr
);
4158 etir_output_check (abfd
, section
, curr_addr
, 32);
4159 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
4160 _bfd_vms_output_long (recwr
,
4161 (unsigned long) sec
->target_index
);
4162 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
4163 _bfd_vms_output_end_subrec (recwr
);
4164 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_OFF
);
4165 _bfd_vms_output_end_subrec (recwr
);
4170 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
4173 case ALPHA_R_LINKAGE
:
4175 etir_output_check (abfd
, section
, curr_addr
, 64);
4176 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LP_PSB
);
4177 _bfd_vms_output_long
4178 (recwr
, (unsigned long) rptr
->addend
);
4179 if (rptr
->addend
> PRIV (vms_linkage_index
))
4180 PRIV (vms_linkage_index
) = rptr
->addend
;
4181 _bfd_vms_output_counted (recwr
, sym
->name
);
4182 _bfd_vms_output_byte (recwr
, 0);
4183 _bfd_vms_output_end_subrec (recwr
);
4186 case ALPHA_R_CODEADDR
:
4187 slen
= strlen ((char *) sym
->name
);
4188 etir_output_check (abfd
, section
, curr_addr
, slen
);
4189 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_CA
);
4190 _bfd_vms_output_counted (recwr
, sym
->name
);
4191 _bfd_vms_output_end_subrec (recwr
);
4196 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4197 etir_output_check (abfd
, section
, curr_addr
,
4198 32 + 1 + strlen (udata
->origname
));
4199 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_NOP_GBL
);
4200 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
4201 _bfd_vms_output_long
4202 (recwr
, (unsigned long) section
->target_index
);
4203 _bfd_vms_output_quad (recwr
, rptr
->address
);
4204 _bfd_vms_output_long (recwr
, (unsigned long) 0x47ff041f);
4205 _bfd_vms_output_long
4206 (recwr
, (unsigned long) section
->target_index
);
4207 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4208 _bfd_vms_output_counted (recwr
, udata
->origname
);
4209 _bfd_vms_output_end_subrec (recwr
);
4213 _bfd_error_handler (_("spurious ALPHA_R_BSR reloc"));
4218 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4219 etir_output_check (abfd
, section
, curr_addr
,
4220 32 + 1 + strlen (udata
->origname
));
4221 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LDA_GBL
);
4222 _bfd_vms_output_long
4223 (recwr
, (unsigned long) udata
->lkindex
+ 1);
4224 _bfd_vms_output_long
4225 (recwr
, (unsigned long) section
->target_index
);
4226 _bfd_vms_output_quad (recwr
, rptr
->address
);
4227 _bfd_vms_output_long (recwr
, (unsigned long) 0x237B0000);
4228 _bfd_vms_output_long
4229 (recwr
, (unsigned long) udata
->bsym
->section
->target_index
);
4230 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4231 _bfd_vms_output_counted (recwr
, udata
->origname
);
4232 _bfd_vms_output_end_subrec (recwr
);
4237 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4238 etir_output_check (abfd
, section
, curr_addr
,
4239 32 + 1 + strlen (udata
->origname
));
4240 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_BOH_GBL
);
4241 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
4242 _bfd_vms_output_long
4243 (recwr
, (unsigned long) section
->target_index
);
4244 _bfd_vms_output_quad (recwr
, rptr
->address
);
4245 _bfd_vms_output_long (recwr
, (unsigned long) 0xD3400000);
4246 _bfd_vms_output_long
4247 (recwr
, (unsigned long) section
->target_index
);
4248 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4249 _bfd_vms_output_counted (recwr
, udata
->origname
);
4250 _bfd_vms_output_end_subrec (recwr
);
4254 _bfd_error_handler (_("unhandled relocation %s"),
4261 } /* End of relocs loop. */
4263 if (!pass2_in_progress
)
4265 /* Output rest of section. */
4266 if (curr_addr
> section
->size
)
4268 _bfd_error_handler (_("size error in section %pA"), section
);
4271 size
= section
->size
- curr_addr
;
4272 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
4278 pass2_in_progress
= 1;
4284 else /* (section->flags & SEC_RELOC) */
4285 sto_imm (abfd
, section
, section
->size
, section
->contents
, 0);
4287 end_etir_record (abfd
);
4290 _bfd_vms_output_alignment (recwr
, 2);
4294 /* Write cached information into a file being written, at bfd_close. */
4297 alpha_vms_write_object_contents (bfd
*abfd
)
4299 vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd
));
4301 if (abfd
->flags
& (EXEC_P
| DYNAMIC
))
4303 return alpha_vms_write_exec (abfd
);
4307 if (abfd
->section_count
> 0) /* we have sections */
4309 if (!_bfd_vms_write_ehdr (abfd
))
4311 if (!_bfd_vms_write_egsd (abfd
))
4313 if (!_bfd_vms_write_etir (abfd
, EOBJ__C_ETIR
))
4315 if (!_bfd_vms_write_eeom (abfd
))
4322 /* Debug stuff: nearest line. */
4324 #define SET_MODULE_PARSED(m) \
4325 do { if ((m)->name == NULL) (m)->name = ""; } while (0)
4326 #define IS_MODULE_PARSED(m) ((m)->name != NULL)
4328 /* Build a new module for the specified BFD. */
4330 static struct module
*
4331 new_module (bfd
*abfd
)
4333 struct module
*module
4334 = (struct module
*) bfd_zalloc (abfd
, sizeof (struct module
));
4335 module
->file_table_count
= 16; /* Arbitrary. */
4337 = bfd_malloc (module
->file_table_count
* sizeof (struct fileinfo
));
4341 /* Parse debug info for a module and internalize it. */
4344 parse_module (bfd
*abfd
, struct module
*module
, unsigned char *ptr
,
4347 unsigned char *maxptr
= ptr
+ length
;
4348 unsigned char *src_ptr
, *pcl_ptr
;
4349 unsigned int prev_linum
= 0, curr_linenum
= 0;
4350 bfd_vma prev_pc
= 0, curr_pc
= 0;
4351 struct srecinfo
*curr_srec
, *srec
;
4352 struct lineinfo
*curr_line
, *line
;
4353 struct funcinfo
*funcinfo
;
4355 /* Initialize tables with zero element. */
4356 curr_srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4357 module
->srec_table
= curr_srec
;
4359 curr_line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4360 module
->line_table
= curr_line
;
4362 while (length
== -1 || ptr
< maxptr
)
4364 /* The first byte is not counted in the recorded length. */
4365 int rec_length
= bfd_getl16 (ptr
) + 1;
4366 int rec_type
= bfd_getl16 (ptr
+ 2);
4368 vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length
, rec_type
));
4370 if (length
== -1 && rec_type
== DST__K_MODEND
)
4377 = _bfd_vms_save_counted_string (abfd
, ptr
+ DST_S_B_MODBEG_NAME
,
4378 maxptr
- (ptr
+ DST_S_B_MODBEG_NAME
));
4385 vms_debug2 ((3, "module: %s\n", module
->name
));
4392 funcinfo
= (struct funcinfo
*)
4393 bfd_zalloc (abfd
, sizeof (struct funcinfo
));
4395 = _bfd_vms_save_counted_string (abfd
, ptr
+ DST_S_B_RTNBEG_NAME
,
4396 maxptr
- (ptr
+ DST_S_B_RTNBEG_NAME
));
4397 funcinfo
->low
= bfd_getl32 (ptr
+ DST_S_L_RTNBEG_ADDRESS
);
4398 funcinfo
->next
= module
->func_table
;
4399 module
->func_table
= funcinfo
;
4401 vms_debug2 ((3, "routine: %s at 0x%lx\n",
4402 funcinfo
->name
, (unsigned long) funcinfo
->low
));
4406 module
->func_table
->high
= module
->func_table
->low
4407 + bfd_getl32 (ptr
+ DST_S_L_RTNEND_SIZE
) - 1;
4409 if (module
->func_table
->high
> module
->high
)
4410 module
->high
= module
->func_table
->high
;
4412 vms_debug2 ((3, "end routine\n"));
4416 vms_debug2 ((3, "prologue\n"));
4420 vms_debug2 ((3, "epilog\n"));
4424 vms_debug2 ((3, "block\n"));
4428 vms_debug2 ((3, "end block\n"));
4432 src_ptr
= ptr
+ DST_S_C_SOURCE_HEADER_SIZE
;
4434 vms_debug2 ((3, "source info\n"));
4436 while (src_ptr
< ptr
+ rec_length
)
4438 int cmd
= src_ptr
[0], cmd_length
, data
;
4442 case DST__K_SRC_DECLFILE
:
4445 = bfd_getl16 (src_ptr
+ DST_S_W_SRC_DF_FILEID
);
4446 char *filename
= _bfd_vms_save_counted_string
4448 src_ptr
+ DST_S_B_SRC_DF_FILENAME
,
4449 ptr
+ rec_length
- (src_ptr
+ DST_S_B_SRC_DF_FILENAME
));
4451 while (fileid
>= module
->file_table_count
)
4453 module
->file_table_count
*= 2;
4455 = bfd_realloc_or_free (module
->file_table
,
4456 module
->file_table_count
4457 * sizeof (struct fileinfo
));
4458 if (module
->file_table
== NULL
)
4462 module
->file_table
[fileid
].name
= filename
;
4463 module
->file_table
[fileid
].srec
= 1;
4464 cmd_length
= src_ptr
[DST_S_B_SRC_DF_LENGTH
] + 2;
4465 vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4466 fileid
, module
->file_table
[fileid
].name
));
4470 case DST__K_SRC_DEFLINES_B
:
4471 /* Perform the association and set the next higher index
4473 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4474 srec
= (struct srecinfo
*)
4475 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4476 srec
->line
= curr_srec
->line
+ data
;
4477 srec
->srec
= curr_srec
->srec
+ data
;
4478 srec
->sfile
= curr_srec
->sfile
;
4479 curr_srec
->next
= srec
;
4482 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data
));
4485 case DST__K_SRC_DEFLINES_W
:
4486 /* Perform the association and set the next higher index
4488 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4489 srec
= (struct srecinfo
*)
4490 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4491 srec
->line
= curr_srec
->line
+ data
;
4492 srec
->srec
= curr_srec
->srec
+ data
,
4493 srec
->sfile
= curr_srec
->sfile
;
4494 curr_srec
->next
= srec
;
4497 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data
));
4500 case DST__K_SRC_INCRLNUM_B
:
4501 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4502 curr_srec
->line
+= data
;
4504 vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data
));
4507 case DST__K_SRC_SETFILE
:
4508 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4509 curr_srec
->sfile
= data
;
4510 curr_srec
->srec
= module
->file_table
[data
].srec
;
4512 vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data
));
4515 case DST__K_SRC_SETLNUM_L
:
4516 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4517 curr_srec
->line
= data
;
4519 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data
));
4522 case DST__K_SRC_SETLNUM_W
:
4523 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4524 curr_srec
->line
= data
;
4526 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data
));
4529 case DST__K_SRC_SETREC_L
:
4530 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4531 curr_srec
->srec
= data
;
4532 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4534 vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data
));
4537 case DST__K_SRC_SETREC_W
:
4538 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4539 curr_srec
->srec
= data
;
4540 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4542 vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data
));
4545 case DST__K_SRC_FORMFEED
:
4547 vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4551 _bfd_error_handler (_("unknown source command %d"),
4557 src_ptr
+= cmd_length
;
4561 case DST__K_LINE_NUM
:
4562 pcl_ptr
= ptr
+ DST_S_C_LINE_NUM_HEADER_SIZE
;
4564 vms_debug2 ((3, "line info\n"));
4566 while (pcl_ptr
< ptr
+ rec_length
)
4568 /* The command byte is signed so we must sign-extend it. */
4569 int cmd
= ((signed char *)pcl_ptr
)[0], cmd_length
, data
;
4573 case DST__K_DELTA_PC_W
:
4574 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4578 vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data
));
4581 case DST__K_DELTA_PC_L
:
4582 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4586 vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data
));
4589 case DST__K_INCR_LINUM
:
4590 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4591 curr_linenum
+= data
;
4593 vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data
));
4596 case DST__K_INCR_LINUM_W
:
4597 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4598 curr_linenum
+= data
;
4600 vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data
));
4603 case DST__K_INCR_LINUM_L
:
4604 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4605 curr_linenum
+= data
;
4607 vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data
));
4610 case DST__K_SET_LINUM_INCR
:
4612 (_("%s not implemented"), "DST__K_SET_LINUM_INCR");
4616 case DST__K_SET_LINUM_INCR_W
:
4618 (_("%s not implemented"), "DST__K_SET_LINUM_INCR_W");
4622 case DST__K_RESET_LINUM_INCR
:
4624 (_("%s not implemented"), "DST__K_RESET_LINUM_INCR");
4628 case DST__K_BEG_STMT_MODE
:
4630 (_("%s not implemented"), "DST__K_BEG_STMT_MODE");
4634 case DST__K_END_STMT_MODE
:
4636 (_("%s not implemented"), "DST__K_END_STMT_MODE");
4640 case DST__K_SET_LINUM_B
:
4641 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4642 curr_linenum
= data
;
4644 vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data
));
4647 case DST__K_SET_LINUM
:
4648 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4649 curr_linenum
= data
;
4651 vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data
));
4654 case DST__K_SET_LINUM_L
:
4655 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4656 curr_linenum
= data
;
4658 vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data
));
4663 (_("%s not implemented"), "DST__K_SET_PC");
4667 case DST__K_SET_PC_W
:
4669 (_("%s not implemented"), "DST__K_SET_PC_W");
4673 case DST__K_SET_PC_L
:
4675 (_("%s not implemented"), "DST__K_SET_PC_L");
4679 case DST__K_SET_STMTNUM
:
4681 (_("%s not implemented"), "DST__K_SET_STMTNUM");
4686 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4689 vms_debug2 ((4, "DST__K_TERM: %d\n", data
));
4693 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4696 vms_debug2 ((4, "DST__K_TERM_W: %d\n", data
));
4700 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4703 vms_debug2 ((4, "DST__K_TERM_L: %d\n", data
));
4706 case DST__K_SET_ABS_PC
:
4707 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4710 vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data
));
4719 vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4720 (unsigned long)curr_pc
, curr_linenum
));
4724 _bfd_error_handler (_("unknown line command %d"), cmd
);
4730 if ((curr_linenum
!= prev_linum
&& curr_pc
!= prev_pc
)
4732 || cmd
== DST__K_DELTA_PC_L
4733 || cmd
== DST__K_DELTA_PC_W
)
4735 line
= (struct lineinfo
*)
4736 bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4737 line
->address
= curr_pc
;
4738 line
->line
= curr_linenum
;
4740 curr_line
->next
= line
;
4743 prev_linum
= curr_linenum
;
4745 vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4746 (unsigned long)curr_pc
, curr_linenum
));
4749 pcl_ptr
+= cmd_length
;
4753 case 0x17: /* Undocumented type used by DEC C to declare equates. */
4754 vms_debug2 ((3, "undocumented type 0x17\n"));
4758 vms_debug2 ((3, "ignoring record\n"));
4766 /* Finalize tables with EOL marker. */
4767 srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4768 srec
->line
= (unsigned int) -1;
4769 srec
->srec
= (unsigned int) -1;
4770 curr_srec
->next
= srec
;
4772 line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4773 line
->line
= (unsigned int) -1;
4774 line
->address
= (bfd_vma
) -1;
4775 curr_line
->next
= line
;
4777 /* Advertise that this module has been parsed. This is needed
4778 because parsing can be either performed at module creation
4779 or deferred until debug info is consumed. */
4780 SET_MODULE_PARSED (module
);
4784 /* Build the list of modules for the specified BFD. */
4786 static struct module
*
4787 build_module_list (bfd
*abfd
)
4789 struct module
*module
, *list
= NULL
;
4792 if ((dmt
= bfd_get_section_by_name (abfd
, "$DMT$")))
4794 /* We have a DMT section so this must be an image. Parse the
4795 section and build the list of modules. This is sufficient
4796 since we can compute the start address and the end address
4797 of every module from the section contents. */
4798 bfd_size_type size
= bfd_section_size (dmt
);
4799 unsigned char *ptr
, *end
;
4801 ptr
= (unsigned char *) bfd_alloc (abfd
, size
);
4805 if (! bfd_get_section_contents (abfd
, dmt
, ptr
, 0, size
))
4808 vms_debug2 ((2, "DMT\n"));
4814 /* Each header declares a module with its start offset and size
4815 of debug info in the DST section, as well as the count of
4816 program sections (i.e. address spans) it contains. */
4817 int modbeg
= bfd_getl32 (ptr
+ DBG_S_L_DMT_MODBEG
);
4818 int msize
= bfd_getl32 (ptr
+ DBG_S_L_DST_SIZE
);
4819 int count
= bfd_getl16 (ptr
+ DBG_S_W_DMT_PSECT_COUNT
);
4820 ptr
+= DBG_S_C_DMT_HEADER_SIZE
;
4822 vms_debug2 ((3, "module: modbeg = %d, size = %d, count = %d\n",
4823 modbeg
, msize
, count
));
4825 /* We create a 'module' structure for each program section since
4826 we only support contiguous addresses in a 'module' structure.
4827 As a consequence, the actual debug info in the DST section is
4828 shared and can be parsed multiple times; that doesn't seem to
4829 cause problems in practice. */
4832 int start
= bfd_getl32 (ptr
+ DBG_S_L_DMT_PSECT_START
);
4833 int length
= bfd_getl32 (ptr
+ DBG_S_L_DMT_PSECT_LENGTH
);
4834 module
= new_module (abfd
);
4835 module
->modbeg
= modbeg
;
4836 module
->size
= msize
;
4837 module
->low
= start
;
4838 module
->high
= start
+ length
;
4839 module
->next
= list
;
4841 ptr
+= DBG_S_C_DMT_PSECT_SIZE
;
4843 vms_debug2 ((4, "section: start = 0x%x, length = %d\n",
4850 /* We don't have a DMT section so this must be an object. Parse
4851 the module right now in order to compute its start address and
4853 void *dst
= PRIV (dst_section
)->contents
;
4858 module
= new_module (abfd
);
4859 if (!parse_module (abfd
, module
, PRIV (dst_section
)->contents
, -1))
4867 /* Calculate and return the name of the source file and the line nearest
4868 to the wanted location in the specified module. */
4871 module_find_nearest_line (bfd
*abfd
, struct module
*module
, bfd_vma addr
,
4872 const char **file
, const char **func
,
4875 struct funcinfo
*funcinfo
;
4876 struct lineinfo
*lineinfo
;
4877 struct srecinfo
*srecinfo
;
4878 bfd_boolean ret
= FALSE
;
4880 /* Parse this module if that was not done at module creation. */
4881 if (! IS_MODULE_PARSED (module
))
4883 unsigned int size
= module
->size
;
4884 unsigned int modbeg
= PRIV (dst_section
)->filepos
+ module
->modbeg
;
4885 unsigned char *buffer
;
4887 if (bfd_seek (abfd
, modbeg
, SEEK_SET
) != 0
4888 || (buffer
= _bfd_malloc_and_read (abfd
, size
, size
)) == NULL
)
4890 bfd_set_error (bfd_error_no_debug_section
);
4894 ret
= parse_module (abfd
, module
, buffer
, size
);
4900 /* Find out the function (if any) that contains the address. */
4901 for (funcinfo
= module
->func_table
; funcinfo
; funcinfo
= funcinfo
->next
)
4902 if (addr
>= funcinfo
->low
&& addr
<= funcinfo
->high
)
4904 *func
= funcinfo
->name
;
4909 /* Find out the source file and the line nearest to the address. */
4910 for (lineinfo
= module
->line_table
; lineinfo
; lineinfo
= lineinfo
->next
)
4911 if (lineinfo
->next
&& addr
< lineinfo
->next
->address
)
4913 for (srecinfo
= module
->srec_table
; srecinfo
; srecinfo
= srecinfo
->next
)
4914 if (srecinfo
->next
&& lineinfo
->line
< srecinfo
->next
->line
)
4916 if (srecinfo
->sfile
> 0)
4918 *file
= module
->file_table
[srecinfo
->sfile
].name
;
4919 *line
= srecinfo
->srec
+ lineinfo
->line
- srecinfo
->line
;
4923 *file
= module
->name
;
4924 *line
= lineinfo
->line
;
4935 /* Provided a BFD, a section and an offset into the section, calculate and
4936 return the name of the source file and the line nearest to the wanted
4940 _bfd_vms_find_nearest_line (bfd
*abfd
,
4941 asymbol
**symbols ATTRIBUTE_UNUSED
,
4947 unsigned int *discriminator
)
4949 struct module
*module
;
4951 /* What address are we looking for? */
4952 bfd_vma addr
= section
->vma
+ offset
;
4960 /* We can't do anything if there is no DST (debug symbol table). */
4961 if (PRIV (dst_section
) == NULL
)
4964 /* Create the module list - if not already done. */
4965 if (PRIV (modules
) == NULL
)
4967 PRIV (modules
) = build_module_list (abfd
);
4968 if (PRIV (modules
) == NULL
)
4972 for (module
= PRIV (modules
); module
; module
= module
->next
)
4973 if (addr
>= module
->low
&& addr
<= module
->high
)
4974 return module_find_nearest_line (abfd
, module
, addr
, file
, func
, line
);
4979 /* Canonicalizations. */
4980 /* Set name, value, section and flags of SYM from E. */
4983 alpha_vms_convert_symbol (bfd
*abfd
, struct vms_symbol_entry
*e
, asymbol
*sym
)
4992 flags
= BSF_NO_FLAGS
;
4998 if (e
->flags
& EGSY__V_WEAK
)
5001 if (e
->flags
& EGSY__V_DEF
)
5003 /* Symbol definition. */
5004 flags
|= BSF_GLOBAL
;
5005 if (e
->flags
& EGSY__V_NORM
)
5006 flags
|= BSF_FUNCTION
;
5012 /* Symbol reference. */
5013 sec
= bfd_und_section_ptr
;
5018 /* A universal symbol is by definition global... */
5019 flags
|= BSF_GLOBAL
;
5021 /* ...and dynamic in shared libraries. */
5022 if (abfd
->flags
& DYNAMIC
)
5023 flags
|= BSF_DYNAMIC
;
5025 if (e
->flags
& EGSY__V_WEAK
)
5028 if (!(e
->flags
& EGSY__V_DEF
))
5031 if (e
->flags
& EGSY__V_NORM
)
5032 flags
|= BSF_FUNCTION
;
5035 /* sec = e->section; */
5036 sec
= bfd_abs_section_ptr
;
5051 /* Return the number of bytes required to store a vector of pointers
5052 to asymbols for all the symbols in the BFD abfd, including a
5053 terminal NULL pointer. If there are no symbols in the BFD,
5054 then return 0. If an error occurs, return -1. */
5057 alpha_vms_get_symtab_upper_bound (bfd
*abfd
)
5059 vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
5060 abfd
, PRIV (gsd_sym_count
)));
5062 return (PRIV (gsd_sym_count
) + 1) * sizeof (asymbol
*);
5065 /* Read the symbols from the BFD abfd, and fills in the vector
5066 location with pointers to the symbols and a trailing NULL.
5068 Return number of symbols read. */
5071 alpha_vms_canonicalize_symtab (bfd
*abfd
, asymbol
**symbols
)
5075 vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd
));
5077 if (PRIV (csymbols
) == NULL
)
5079 PRIV (csymbols
) = (asymbol
**) bfd_alloc
5080 (abfd
, PRIV (gsd_sym_count
) * sizeof (asymbol
*));
5082 /* Traverse table and fill symbols vector. */
5083 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5085 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
5088 sym
= bfd_make_empty_symbol (abfd
);
5089 if (sym
== NULL
|| !alpha_vms_convert_symbol (abfd
, e
, sym
))
5091 bfd_release (abfd
, PRIV (csymbols
));
5092 PRIV (csymbols
) = NULL
;
5096 PRIV (csymbols
)[i
] = sym
;
5100 if (symbols
!= NULL
)
5102 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5103 symbols
[i
] = PRIV (csymbols
)[i
];
5107 return PRIV (gsd_sym_count
);
5110 /* Read and convert relocations from ETIR. We do it once for all sections. */
5113 alpha_vms_slurp_relocs (bfd
*abfd
)
5117 vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
5119 /* We slurp relocs only once, for all sections. */
5120 if (PRIV (reloc_done
))
5122 PRIV (reloc_done
) = TRUE
;
5124 if (alpha_vms_canonicalize_symtab (abfd
, NULL
) < 0)
5127 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
5132 unsigned char *begin
;
5135 bfd_reloc_code_real_type reloc_code
;
5141 bfd_vma cur_address
;
5143 unsigned char *cur_sym
= NULL
;
5145 bfd_vma cur_addend
= 0;
5147 /* Skip non-ETIR records. */
5148 type
= _bfd_vms_get_object_record (abfd
);
5149 if (type
== EOBJ__C_EEOM
)
5151 if (type
!= EOBJ__C_ETIR
)
5154 begin
= PRIV (recrd
.rec
) + 4;
5155 end
= PRIV (recrd
.rec
) + PRIV (recrd
.rec_size
);
5157 for (ptr
= begin
; ptr
< end
; ptr
+= length
)
5161 cmd
= bfd_getl16 (ptr
);
5162 length
= bfd_getl16 (ptr
+ 2);
5164 cur_address
= vaddr
;
5166 vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
5167 _bfd_vms_etir_name (cmd
)));
5171 case ETIR__C_STA_GBL
: /* ALPHA_R_REFLONG und_section, step 1 */
5172 /* ALPHA_R_REFQUAD und_section, step 1 */
5177 case ETIR__C_STA_PQ
: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
5178 cur_psidx
= bfd_getl32 (ptr
+ 4);
5179 cur_addend
= bfd_getl64 (ptr
+ 8);
5183 case ETIR__C_CTL_SETRB
:
5184 if (prev_cmd
!= ETIR__C_STA_PQ
)
5187 /* xgettext:c-format */
5188 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd
),
5189 _bfd_vms_etir_name (cmd
));
5192 cur_psect
= cur_psidx
;
5198 case ETIR__C_STA_LW
: /* ALPHA_R_REFLONG abs_section, step 1 */
5199 /* ALPHA_R_REFLONG und_section, step 2 */
5202 if (prev_cmd
!= ETIR__C_STA_GBL
)
5205 /* xgettext:c-format */
5206 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
5207 _bfd_vms_etir_name (ETIR__C_STA_LW
));
5211 cur_addend
= bfd_getl32 (ptr
+ 4);
5215 case ETIR__C_STA_QW
: /* ALPHA_R_REFQUAD abs_section, step 1 */
5216 /* ALPHA_R_REFQUAD und_section, step 2 */
5217 if (prev_cmd
!= -1 && prev_cmd
!= ETIR__C_STA_GBL
)
5220 /* xgettext:c-format */
5221 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
5222 _bfd_vms_etir_name (ETIR__C_STA_QW
));
5225 cur_addend
= bfd_getl64 (ptr
+ 4);
5229 case ETIR__C_STO_LW
: /* ALPHA_R_REFLONG und_section, step 4 */
5230 /* ALPHA_R_REFLONG abs_section, step 2 */
5231 /* ALPHA_R_REFLONG others, step 2 */
5232 if (prev_cmd
!= ETIR__C_OPR_ADD
5233 && prev_cmd
!= ETIR__C_STA_LW
5234 && prev_cmd
!= ETIR__C_STA_PQ
)
5236 /* xgettext:c-format */
5237 _bfd_error_handler (_("unknown reloc %s + %s"),
5238 _bfd_vms_etir_name (prev_cmd
),
5239 _bfd_vms_etir_name (ETIR__C_STO_LW
));
5242 reloc_code
= BFD_RELOC_32
;
5245 case ETIR__C_STO_QW
: /* ALPHA_R_REFQUAD und_section, step 4 */
5246 /* ALPHA_R_REFQUAD abs_section, step 2 */
5247 if (prev_cmd
!= ETIR__C_OPR_ADD
&& prev_cmd
!= ETIR__C_STA_QW
)
5249 /* xgettext:c-format */
5250 _bfd_error_handler (_("unknown reloc %s + %s"),
5251 _bfd_vms_etir_name (prev_cmd
),
5252 _bfd_vms_etir_name (ETIR__C_STO_QW
));
5255 reloc_code
= BFD_RELOC_64
;
5258 case ETIR__C_STO_OFF
: /* ALPHA_R_REFQUAD others, step 2 */
5259 if (prev_cmd
!= ETIR__C_STA_PQ
)
5261 /* xgettext:c-format */
5262 _bfd_error_handler (_("unknown reloc %s + %s"),
5263 _bfd_vms_etir_name (prev_cmd
),
5264 _bfd_vms_etir_name (ETIR__C_STO_OFF
));
5267 reloc_code
= BFD_RELOC_64
;
5270 case ETIR__C_OPR_ADD
: /* ALPHA_R_REFLONG und_section, step 3 */
5271 /* ALPHA_R_REFQUAD und_section, step 3 */
5272 if (prev_cmd
!= ETIR__C_STA_LW
&& prev_cmd
!= ETIR__C_STA_QW
)
5274 /* xgettext:c-format */
5275 _bfd_error_handler (_("unknown reloc %s + %s"),
5276 _bfd_vms_etir_name (prev_cmd
),
5277 _bfd_vms_etir_name (ETIR__C_OPR_ADD
));
5280 prev_cmd
= ETIR__C_OPR_ADD
;
5283 case ETIR__C_STO_CA
: /* ALPHA_R_CODEADDR */
5284 reloc_code
= BFD_RELOC_ALPHA_CODEADDR
;
5288 case ETIR__C_STO_GBL
: /* ALPHA_R_REFQUAD und_section */
5289 reloc_code
= BFD_RELOC_64
;
5293 case ETIR__C_STO_GBL_LW
: /* ALPHA_R_REFLONG und_section */
5294 reloc_code
= BFD_RELOC_32
;
5298 case ETIR__C_STC_LP_PSB
: /* ALPHA_R_LINKAGE */
5299 reloc_code
= BFD_RELOC_ALPHA_LINKAGE
;
5303 case ETIR__C_STC_NOP_GBL
: /* ALPHA_R_NOP */
5304 reloc_code
= BFD_RELOC_ALPHA_NOP
;
5307 case ETIR__C_STC_BSR_GBL
: /* ALPHA_R_BSR */
5308 reloc_code
= BFD_RELOC_ALPHA_BSR
;
5311 case ETIR__C_STC_LDA_GBL
: /* ALPHA_R_LDA */
5312 reloc_code
= BFD_RELOC_ALPHA_LDA
;
5315 case ETIR__C_STC_BOH_GBL
: /* ALPHA_R_BOH */
5316 reloc_code
= BFD_RELOC_ALPHA_BOH
;
5320 cur_sym
= ptr
+ 4 + 32;
5321 cur_address
= bfd_getl64 (ptr
+ 4 + 8);
5322 cur_addend
= bfd_getl64 (ptr
+ 4 + 24);
5325 case ETIR__C_STO_IMM
:
5326 vaddr
+= bfd_getl32 (ptr
+ 4);
5330 _bfd_error_handler (_("unknown reloc %s"),
5331 _bfd_vms_etir_name (cmd
));
5337 struct vms_section_data_struct
*vms_sec
;
5341 /* Get section to which the relocation applies. */
5342 if (cur_psect
< 0 || cur_psect
> (int)PRIV (section_count
))
5344 _bfd_error_handler (_("invalid section index in ETIR"));
5348 if (PRIV (sections
) == NULL
)
5350 sec
= PRIV (sections
)[cur_psect
];
5351 if (sec
== bfd_abs_section_ptr
)
5353 _bfd_error_handler (_("relocation for non-REL psect"));
5357 vms_sec
= vms_section_data (sec
);
5359 /* Allocate a reloc entry. */
5360 if (sec
->reloc_count
>= vms_sec
->reloc_max
)
5362 if (vms_sec
->reloc_max
== 0)
5364 vms_sec
->reloc_max
= 64;
5365 sec
->relocation
= bfd_zmalloc
5366 (vms_sec
->reloc_max
* sizeof (arelent
));
5370 vms_sec
->reloc_max
*= 2;
5371 sec
->relocation
= bfd_realloc_or_free
5372 (sec
->relocation
, vms_sec
->reloc_max
* sizeof (arelent
));
5373 if (sec
->relocation
== NULL
)
5377 reloc
= &sec
->relocation
[sec
->reloc_count
];
5380 reloc
->howto
= bfd_reloc_type_lookup (abfd
, reloc_code
);
5382 if (cur_sym
!= NULL
)
5385 unsigned int symlen
= *cur_sym
;
5388 /* Linear search. */
5393 for (j
= 0; j
< PRIV (gsd_sym_count
); j
++)
5394 if (PRIV (syms
)[j
]->namelen
== symlen
5395 && memcmp (PRIV (syms
)[j
]->name
, cur_sym
, symlen
) == 0)
5397 sym
= &PRIV (csymbols
)[j
];
5402 _bfd_error_handler (_("unknown symbol in command %s"),
5403 _bfd_vms_etir_name (cmd
));
5404 reloc
->sym_ptr_ptr
= NULL
;
5407 reloc
->sym_ptr_ptr
= sym
;
5409 else if (cur_psidx
>= 0)
5411 if (PRIV (sections
) == NULL
|| cur_psidx
>= (int) PRIV (section_count
))
5413 reloc
->sym_ptr_ptr
=
5414 PRIV (sections
)[cur_psidx
]->symbol_ptr_ptr
;
5417 reloc
->sym_ptr_ptr
= NULL
;
5419 reloc
->address
= cur_address
;
5420 reloc
->addend
= cur_addend
;
5422 if (reloc_code
== ALPHA_R_LINKAGE
)
5425 size
= bfd_get_reloc_size (reloc
->howto
);
5435 vms_debug2 ((3, "alpha_vms_slurp_relocs: result = TRUE\n"));
5440 /* Return the number of bytes required to store the relocation
5441 information associated with the given section. */
5444 alpha_vms_get_reloc_upper_bound (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*section
)
5446 alpha_vms_slurp_relocs (abfd
);
5448 return (section
->reloc_count
+ 1) * sizeof (arelent
*);
5451 /* Convert relocations from VMS (external) form into BFD internal
5452 form. Return the number of relocations. */
5455 alpha_vms_canonicalize_reloc (bfd
*abfd
, asection
*section
, arelent
**relptr
,
5456 asymbol
**symbols ATTRIBUTE_UNUSED
)
5461 if (!alpha_vms_slurp_relocs (abfd
))
5464 count
= section
->reloc_count
;
5465 tblptr
= section
->relocation
;
5468 *relptr
++ = tblptr
++;
5470 *relptr
= (arelent
*) NULL
;
5471 return section
->reloc_count
;
5474 /* Install a new set of internal relocs. */
5476 #define alpha_vms_set_reloc _bfd_generic_set_reloc
5479 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
5481 /* How to process the various reloc types. */
5483 static bfd_reloc_status_type
5484 reloc_nil (bfd
* abfd ATTRIBUTE_UNUSED
,
5485 arelent
*reloc ATTRIBUTE_UNUSED
,
5486 asymbol
*sym ATTRIBUTE_UNUSED
,
5487 void * data ATTRIBUTE_UNUSED
,
5488 asection
*sec ATTRIBUTE_UNUSED
,
5489 bfd
*output_bfd ATTRIBUTE_UNUSED
,
5490 char **error_message ATTRIBUTE_UNUSED
)
5493 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd
, output_bfd
);
5494 vms_debug (2, "In section %s, symbol %s\n",
5495 sec
->name
, sym
->name
);
5496 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5497 reloc
->sym_ptr_ptr
[0]->name
,
5498 (unsigned long)reloc
->address
,
5499 (unsigned long)reloc
->addend
, reloc
->howto
->name
);
5500 vms_debug (2, "data at %p\n", data
);
5501 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5504 return bfd_reloc_ok
;
5507 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5508 from smaller values. Start with zero, widen, *then* decrement. */
5509 #define MINUS_ONE (((bfd_vma)0) - 1)
5511 static reloc_howto_type alpha_howto_table
[] =
5513 HOWTO (ALPHA_R_IGNORE
, /* Type. */
5514 0, /* Rightshift. */
5515 0, /* Size (0 = byte, 1 = short, 2 = long). */
5517 TRUE
, /* PC relative. */
5519 complain_overflow_dont
,/* Complain_on_overflow. */
5520 reloc_nil
, /* Special_function. */
5521 "IGNORE", /* Name. */
5522 TRUE
, /* Partial_inplace. */
5523 0, /* Source mask */
5525 TRUE
), /* PC rel offset. */
5527 /* A 64 bit reference to a symbol. */
5528 HOWTO (ALPHA_R_REFQUAD
, /* Type. */
5529 0, /* Rightshift. */
5530 4, /* Size (0 = byte, 1 = short, 2 = long). */
5532 FALSE
, /* PC relative. */
5534 complain_overflow_bitfield
, /* Complain_on_overflow. */
5535 reloc_nil
, /* Special_function. */
5536 "REFQUAD", /* Name. */
5537 TRUE
, /* Partial_inplace. */
5538 MINUS_ONE
, /* Source mask. */
5539 MINUS_ONE
, /* Dest mask. */
5540 FALSE
), /* PC rel offset. */
5542 /* A 21 bit branch. The native assembler generates these for
5543 branches within the text segment, and also fills in the PC
5544 relative offset in the instruction. */
5545 HOWTO (ALPHA_R_BRADDR
, /* Type. */
5546 2, /* Rightshift. */
5547 2, /* Size (0 = byte, 1 = short, 2 = long). */
5549 TRUE
, /* PC relative. */
5551 complain_overflow_signed
, /* Complain_on_overflow. */
5552 reloc_nil
, /* Special_function. */
5553 "BRADDR", /* Name. */
5554 TRUE
, /* Partial_inplace. */
5555 0x1fffff, /* Source mask. */
5556 0x1fffff, /* Dest mask. */
5557 FALSE
), /* PC rel offset. */
5559 /* A hint for a jump to a register. */
5560 HOWTO (ALPHA_R_HINT
, /* Type. */
5561 2, /* Rightshift. */
5562 1, /* Size (0 = byte, 1 = short, 2 = long). */
5564 TRUE
, /* PC relative. */
5566 complain_overflow_dont
,/* Complain_on_overflow. */
5567 reloc_nil
, /* Special_function. */
5569 TRUE
, /* Partial_inplace. */
5570 0x3fff, /* Source mask. */
5571 0x3fff, /* Dest mask. */
5572 FALSE
), /* PC rel offset. */
5574 /* 16 bit PC relative offset. */
5575 HOWTO (ALPHA_R_SREL16
, /* Type. */
5576 0, /* Rightshift. */
5577 1, /* Size (0 = byte, 1 = short, 2 = long). */
5579 TRUE
, /* PC relative. */
5581 complain_overflow_signed
, /* Complain_on_overflow. */
5582 reloc_nil
, /* Special_function. */
5583 "SREL16", /* Name. */
5584 TRUE
, /* Partial_inplace. */
5585 0xffff, /* Source mask. */
5586 0xffff, /* Dest mask. */
5587 FALSE
), /* PC rel offset. */
5589 /* 32 bit PC relative offset. */
5590 HOWTO (ALPHA_R_SREL32
, /* Type. */
5591 0, /* Rightshift. */
5592 2, /* Size (0 = byte, 1 = short, 2 = long). */
5594 TRUE
, /* PC relative. */
5596 complain_overflow_signed
, /* Complain_on_overflow. */
5597 reloc_nil
, /* Special_function. */
5598 "SREL32", /* Name. */
5599 TRUE
, /* Partial_inplace. */
5600 0xffffffff, /* Source mask. */
5601 0xffffffff, /* Dest mask. */
5602 FALSE
), /* PC rel offset. */
5604 /* A 64 bit PC relative offset. */
5605 HOWTO (ALPHA_R_SREL64
, /* Type. */
5606 0, /* Rightshift. */
5607 4, /* Size (0 = byte, 1 = short, 2 = long). */
5609 TRUE
, /* PC relative. */
5611 complain_overflow_signed
, /* Complain_on_overflow. */
5612 reloc_nil
, /* Special_function. */
5613 "SREL64", /* Name. */
5614 TRUE
, /* Partial_inplace. */
5615 MINUS_ONE
, /* Source mask. */
5616 MINUS_ONE
, /* Dest mask. */
5617 FALSE
), /* PC rel offset. */
5619 /* Push a value on the reloc evaluation stack. */
5620 HOWTO (ALPHA_R_OP_PUSH
, /* Type. */
5621 0, /* Rightshift. */
5622 0, /* Size (0 = byte, 1 = short, 2 = long). */
5624 FALSE
, /* PC relative. */
5626 complain_overflow_dont
,/* Complain_on_overflow. */
5627 reloc_nil
, /* Special_function. */
5628 "OP_PUSH", /* Name. */
5629 FALSE
, /* Partial_inplace. */
5630 0, /* Source mask. */
5632 FALSE
), /* PC rel offset. */
5634 /* Store the value from the stack at the given address. Store it in
5635 a bitfield of size r_size starting at bit position r_offset. */
5636 HOWTO (ALPHA_R_OP_STORE
, /* Type. */
5637 0, /* Rightshift. */
5638 4, /* Size (0 = byte, 1 = short, 2 = long). */
5640 FALSE
, /* PC relative. */
5642 complain_overflow_dont
,/* Complain_on_overflow. */
5643 reloc_nil
, /* Special_function. */
5644 "OP_STORE", /* Name. */
5645 FALSE
, /* Partial_inplace. */
5646 0, /* Source mask. */
5647 MINUS_ONE
, /* Dest mask. */
5648 FALSE
), /* PC rel offset. */
5650 /* Subtract the reloc address from the value on the top of the
5651 relocation stack. */
5652 HOWTO (ALPHA_R_OP_PSUB
, /* Type. */
5653 0, /* Rightshift. */
5654 0, /* Size (0 = byte, 1 = short, 2 = long). */
5656 FALSE
, /* PC relative. */
5658 complain_overflow_dont
,/* Complain_on_overflow. */
5659 reloc_nil
, /* Special_function. */
5660 "OP_PSUB", /* Name. */
5661 FALSE
, /* Partial_inplace. */
5662 0, /* Source mask. */
5664 FALSE
), /* PC rel offset. */
5666 /* Shift the value on the top of the relocation stack right by the
5668 HOWTO (ALPHA_R_OP_PRSHIFT
, /* Type. */
5669 0, /* Rightshift. */
5670 0, /* Size (0 = byte, 1 = short, 2 = long). */
5672 FALSE
, /* PC relative. */
5674 complain_overflow_dont
,/* Complain_on_overflow. */
5675 reloc_nil
, /* Special_function. */
5676 "OP_PRSHIFT", /* Name. */
5677 FALSE
, /* Partial_inplace. */
5678 0, /* Source mask. */
5680 FALSE
), /* PC rel offset. */
5682 /* Hack. Linkage is done by linker. */
5683 HOWTO (ALPHA_R_LINKAGE
, /* Type. */
5684 0, /* Rightshift. */
5685 0, /* Size (0 = byte, 1 = short, 2 = long). */
5687 FALSE
, /* PC relative. */
5689 complain_overflow_dont
,/* Complain_on_overflow. */
5690 reloc_nil
, /* Special_function. */
5691 "LINKAGE", /* Name. */
5692 FALSE
, /* Partial_inplace. */
5693 0, /* Source mask. */
5695 FALSE
), /* PC rel offset. */
5697 /* A 32 bit reference to a symbol. */
5698 HOWTO (ALPHA_R_REFLONG
, /* Type. */
5699 0, /* Rightshift. */
5700 2, /* Size (0 = byte, 1 = short, 2 = long). */
5702 FALSE
, /* PC relative. */
5704 complain_overflow_bitfield
, /* Complain_on_overflow. */
5705 reloc_nil
, /* Special_function. */
5706 "REFLONG", /* Name. */
5707 TRUE
, /* Partial_inplace. */
5708 0xffffffff, /* Source mask. */
5709 0xffffffff, /* Dest mask. */
5710 FALSE
), /* PC rel offset. */
5712 /* A 64 bit reference to a procedure, written as 32 bit value. */
5713 HOWTO (ALPHA_R_CODEADDR
, /* Type. */
5714 0, /* Rightshift. */
5715 4, /* Size (0 = byte, 1 = short, 2 = long). */
5717 FALSE
, /* PC relative. */
5719 complain_overflow_signed
,/* Complain_on_overflow. */
5720 reloc_nil
, /* Special_function. */
5721 "CODEADDR", /* Name. */
5722 FALSE
, /* Partial_inplace. */
5723 0xffffffff, /* Source mask. */
5724 0xffffffff, /* Dest mask. */
5725 FALSE
), /* PC rel offset. */
5727 HOWTO (ALPHA_R_NOP
, /* Type. */
5728 0, /* Rightshift. */
5729 3, /* Size (0 = byte, 1 = short, 2 = long). */
5731 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5732 because the calculations for the 3 relocations are the same.
5733 See B.4.5.2 of the OpenVMS Linker Utility Manual. */
5734 TRUE
, /* PC relative. */
5736 complain_overflow_dont
,/* Complain_on_overflow. */
5737 reloc_nil
, /* Special_function. */
5739 FALSE
, /* Partial_inplace. */
5740 0xffffffff, /* Source mask. */
5741 0xffffffff, /* Dest mask. */
5742 FALSE
), /* PC rel offset. */
5744 HOWTO (ALPHA_R_BSR
, /* Type. */
5745 0, /* Rightshift. */
5746 3, /* Size (0 = byte, 1 = short, 2 = long). */
5748 TRUE
, /* PC relative. */
5750 complain_overflow_dont
,/* Complain_on_overflow. */
5751 reloc_nil
, /* Special_function. */
5753 FALSE
, /* Partial_inplace. */
5754 0xffffffff, /* Source mask. */
5755 0xffffffff, /* Dest mask. */
5756 FALSE
), /* PC rel offset. */
5758 HOWTO (ALPHA_R_LDA
, /* Type. */
5759 0, /* Rightshift. */
5760 3, /* Size (0 = byte, 1 = short, 2 = long). */
5762 FALSE
, /* PC relative. */
5764 complain_overflow_dont
,/* Complain_on_overflow. */
5765 reloc_nil
, /* Special_function. */
5767 FALSE
, /* Partial_inplace. */
5768 0xffffffff, /* Source mask. */
5769 0xffffffff, /* Dest mask. */
5770 FALSE
), /* PC rel offset. */
5772 HOWTO (ALPHA_R_BOH
, /* Type. */
5773 0, /* Rightshift. */
5774 3, /* Size (0 = byte, 1 = short, 2 = long, 3 = nil). */
5776 TRUE
, /* PC relative. */
5778 complain_overflow_dont
,/* Complain_on_overflow. */
5779 reloc_nil
, /* Special_function. */
5781 FALSE
, /* Partial_inplace. */
5782 0xffffffff, /* Source mask. */
5783 0xffffffff, /* Dest mask. */
5784 FALSE
), /* PC rel offset. */
5787 /* Return a pointer to a howto structure which, when invoked, will perform
5788 the relocation code on data from the architecture noted. */
5790 static reloc_howto_type
*
5791 alpha_vms_bfd_reloc_type_lookup (bfd
* abfd ATTRIBUTE_UNUSED
,
5792 bfd_reloc_code_real_type code
)
5796 vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd
, code
));
5800 case BFD_RELOC_16
: alpha_type
= ALPHA_R_SREL16
; break;
5801 case BFD_RELOC_32
: alpha_type
= ALPHA_R_REFLONG
; break;
5802 case BFD_RELOC_64
: alpha_type
= ALPHA_R_REFQUAD
; break;
5803 case BFD_RELOC_CTOR
: alpha_type
= ALPHA_R_REFQUAD
; break;
5804 case BFD_RELOC_23_PCREL_S2
: alpha_type
= ALPHA_R_BRADDR
; break;
5805 case BFD_RELOC_ALPHA_HINT
: alpha_type
= ALPHA_R_HINT
; break;
5806 case BFD_RELOC_16_PCREL
: alpha_type
= ALPHA_R_SREL16
; break;
5807 case BFD_RELOC_32_PCREL
: alpha_type
= ALPHA_R_SREL32
; break;
5808 case BFD_RELOC_64_PCREL
: alpha_type
= ALPHA_R_SREL64
; break;
5809 case BFD_RELOC_ALPHA_LINKAGE
: alpha_type
= ALPHA_R_LINKAGE
; break;
5810 case BFD_RELOC_ALPHA_CODEADDR
: alpha_type
= ALPHA_R_CODEADDR
; break;
5811 case BFD_RELOC_ALPHA_NOP
: alpha_type
= ALPHA_R_NOP
; break;
5812 case BFD_RELOC_ALPHA_BSR
: alpha_type
= ALPHA_R_BSR
; break;
5813 case BFD_RELOC_ALPHA_LDA
: alpha_type
= ALPHA_R_LDA
; break;
5814 case BFD_RELOC_ALPHA_BOH
: alpha_type
= ALPHA_R_BOH
; break;
5816 _bfd_error_handler (_("reloc (%d) is *UNKNOWN*"), code
);
5819 vms_debug2 ((2, "reloc is %s\n", alpha_howto_table
[alpha_type
].name
));
5820 return & alpha_howto_table
[alpha_type
];
5823 static reloc_howto_type
*
5824 alpha_vms_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
5830 i
< sizeof (alpha_howto_table
) / sizeof (alpha_howto_table
[0]);
5832 if (alpha_howto_table
[i
].name
!= NULL
5833 && strcasecmp (alpha_howto_table
[i
].name
, r_name
) == 0)
5834 return &alpha_howto_table
[i
];
5840 alpha_vms_get_synthetic_symtab (bfd
*abfd
,
5841 long symcount ATTRIBUTE_UNUSED
,
5842 asymbol
**usyms ATTRIBUTE_UNUSED
,
5843 long dynsymcount ATTRIBUTE_UNUSED
,
5844 asymbol
**dynsyms ATTRIBUTE_UNUSED
,
5851 syms
= (asymbol
*) bfd_malloc (PRIV (norm_sym_count
) * sizeof (asymbol
));
5856 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5858 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
5869 flags
= BSF_LOCAL
| BSF_SYNTHETIC
;
5876 if ((e
->flags
& EGSY__V_DEF
) && (e
->flags
& EGSY__V_NORM
))
5878 value
= e
->code_value
;
5879 sec
= e
->code_section
;
5890 sname
= bfd_alloc (abfd
, l
+ 5);
5893 memcpy (sname
, name
, l
);
5894 memcpy (sname
+ l
, "..en", 5);
5901 sym
->udata
.p
= NULL
;
5910 vms_time_to_str (unsigned char *buf
)
5912 time_t t
= vms_rawtime_to_time_t (buf
);
5913 char *res
= ctime (&t
);
5916 res
= "*invalid time*";
5923 evax_bfd_print_emh (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
5925 struct vms_emh_common
*emh
= (struct vms_emh_common
*)rec
;
5926 unsigned int subtype
;
5929 subtype
= (unsigned) bfd_getl16 (emh
->subtyp
);
5931 /* xgettext:c-format */
5932 fprintf (file
, _(" EMH %u (len=%u): "), subtype
, rec_len
);
5934 /* PR 21618: Check for invalid lengths. */
5935 if (rec_len
< sizeof (* emh
))
5937 fprintf (file
, _(" Error: The length is less than the length of an EMH record\n"));
5940 extra
= rec_len
- sizeof (struct vms_emh_common
);
5946 struct vms_emh_mhd
*mhd
= (struct vms_emh_mhd
*) rec
;
5948 const char * nextname
;
5949 const char * maxname
;
5951 /* PR 21840: Check for invalid lengths. */
5952 if (rec_len
< sizeof (* mhd
))
5954 fprintf (file
, _(" Error: The record length is less than the size of an EMH_MHD record\n"));
5957 fprintf (file
, _("Module header\n"));
5958 fprintf (file
, _(" structure level: %u\n"), mhd
->strlvl
);
5959 fprintf (file
, _(" max record size: %u\n"),
5960 (unsigned) bfd_getl32 (mhd
->recsiz
));
5961 name
= (char *)(mhd
+ 1);
5962 maxname
= (char *) rec
+ rec_len
;
5963 if (name
> maxname
- 2)
5965 fprintf (file
, _(" Error: The module name is missing\n"));
5968 nextname
= name
+ name
[0] + 1;
5969 if (nextname
>= maxname
)
5971 fprintf (file
, _(" Error: The module name is too long\n"));
5974 fprintf (file
, _(" module name : %.*s\n"), name
[0], name
+ 1);
5976 if (name
> maxname
- 2)
5978 fprintf (file
, _(" Error: The module version is missing\n"));
5981 nextname
= name
+ name
[0] + 1;
5982 if (nextname
>= maxname
)
5984 fprintf (file
, _(" Error: The module version is too long\n"));
5987 fprintf (file
, _(" module version : %.*s\n"), name
[0], name
+ 1);
5989 if ((maxname
- name
) < 17 && maxname
[-1] != 0)
5990 fprintf (file
, _(" Error: The compile date is truncated\n"));
5992 fprintf (file
, _(" compile date : %.17s\n"), name
);
5997 fprintf (file
, _("Language Processor Name\n"));
5998 fprintf (file
, _(" language name: %.*s\n"), extra
, (char *)(emh
+ 1));
6002 fprintf (file
, _("Source Files Header\n"));
6003 fprintf (file
, _(" file: %.*s\n"), extra
, (char *)(emh
+ 1));
6007 fprintf (file
, _("Title Text Header\n"));
6008 fprintf (file
, _(" title: %.*s\n"), extra
, (char *)(emh
+ 1));
6012 fprintf (file
, _("Copyright Header\n"));
6013 fprintf (file
, _(" copyright: %.*s\n"), extra
, (char *)(emh
+ 1));
6017 fprintf (file
, _("unhandled emh subtype %u\n"), subtype
);
6023 evax_bfd_print_eeom (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
6025 struct vms_eeom
*eeom
= (struct vms_eeom
*)rec
;
6027 fprintf (file
, _(" EEOM (len=%u):\n"), rec_len
);
6029 /* PR 21618: Check for invalid lengths. */
6030 if (rec_len
< sizeof (* eeom
))
6032 fprintf (file
, _(" Error: The length is less than the length of an EEOM record\n"));
6036 fprintf (file
, _(" number of cond linkage pairs: %u\n"),
6037 (unsigned)bfd_getl32 (eeom
->total_lps
));
6038 fprintf (file
, _(" completion code: %u\n"),
6039 (unsigned)bfd_getl16 (eeom
->comcod
));
6042 fprintf (file
, _(" transfer addr flags: 0x%02x\n"), eeom
->tfrflg
);
6043 fprintf (file
, _(" transfer addr psect: %u\n"),
6044 (unsigned)bfd_getl32 (eeom
->psindx
));
6045 fprintf (file
, _(" transfer address : 0x%08x\n"),
6046 (unsigned)bfd_getl32 (eeom
->tfradr
));
6051 exav_bfd_print_egsy_flags (unsigned int flags
, FILE *file
)
6053 if (flags
& EGSY__V_WEAK
)
6054 fputs (_(" WEAK"), file
);
6055 if (flags
& EGSY__V_DEF
)
6056 fputs (_(" DEF"), file
);
6057 if (flags
& EGSY__V_UNI
)
6058 fputs (_(" UNI"), file
);
6059 if (flags
& EGSY__V_REL
)
6060 fputs (_(" REL"), file
);
6061 if (flags
& EGSY__V_COMM
)
6062 fputs (_(" COMM"), file
);
6063 if (flags
& EGSY__V_VECEP
)
6064 fputs (_(" VECEP"), file
);
6065 if (flags
& EGSY__V_NORM
)
6066 fputs (_(" NORM"), file
);
6067 if (flags
& EGSY__V_QUAD_VAL
)
6068 fputs (_(" QVAL"), file
);
6072 evax_bfd_print_egsd_flags (FILE *file
, unsigned int flags
)
6074 if (flags
& EGPS__V_PIC
)
6075 fputs (_(" PIC"), file
);
6076 if (flags
& EGPS__V_LIB
)
6077 fputs (_(" LIB"), file
);
6078 if (flags
& EGPS__V_OVR
)
6079 fputs (_(" OVR"), file
);
6080 if (flags
& EGPS__V_REL
)
6081 fputs (_(" REL"), file
);
6082 if (flags
& EGPS__V_GBL
)
6083 fputs (_(" GBL"), file
);
6084 if (flags
& EGPS__V_SHR
)
6085 fputs (_(" SHR"), file
);
6086 if (flags
& EGPS__V_EXE
)
6087 fputs (_(" EXE"), file
);
6088 if (flags
& EGPS__V_RD
)
6089 fputs (_(" RD"), file
);
6090 if (flags
& EGPS__V_WRT
)
6091 fputs (_(" WRT"), file
);
6092 if (flags
& EGPS__V_VEC
)
6093 fputs (_(" VEC"), file
);
6094 if (flags
& EGPS__V_NOMOD
)
6095 fputs (_(" NOMOD"), file
);
6096 if (flags
& EGPS__V_COM
)
6097 fputs (_(" COM"), file
);
6098 if (flags
& EGPS__V_ALLOC_64BIT
)
6099 fputs (_(" 64B"), file
);
6103 evax_bfd_print_egsd (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
6105 unsigned int off
= sizeof (struct vms_egsd
);
6108 fprintf (file
, _(" EGSD (len=%u):\n"), rec_len
);
6111 for (off
= sizeof (struct vms_egsd
); off
< rec_len
; )
6113 struct vms_egsd_entry
*e
= (struct vms_egsd_entry
*)(rec
+ off
);
6117 type
= (unsigned)bfd_getl16 (e
->gsdtyp
);
6118 len
= (unsigned)bfd_getl16 (e
->gsdsiz
);
6120 /* xgettext:c-format */
6121 fprintf (file
, _(" EGSD entry %2u (type: %u, len: %u): "),
6125 if (off
+ len
> rec_len
|| off
+ len
< off
)
6127 fprintf (file
, _(" Error: length larger than remaining space in record\n"));
6135 struct vms_egps
*egps
= (struct vms_egps
*)e
;
6136 unsigned int flags
= bfd_getl16 (egps
->flags
);
6139 fprintf (file
, _("PSC - Program section definition\n"));
6140 fprintf (file
, _(" alignment : 2**%u\n"), egps
->align
);
6141 fprintf (file
, _(" flags : 0x%04x"), flags
);
6142 evax_bfd_print_egsd_flags (file
, flags
);
6144 l
= bfd_getl32 (egps
->alloc
);
6145 fprintf (file
, _(" alloc (len): %u (0x%08x)\n"), l
, l
);
6146 fprintf (file
, _(" name : %.*s\n"),
6147 egps
->namlng
, egps
->name
);
6152 struct vms_esgps
*esgps
= (struct vms_esgps
*)e
;
6153 unsigned int flags
= bfd_getl16 (esgps
->flags
);
6156 fprintf (file
, _("SPSC - Shared Image Program section def\n"));
6157 fprintf (file
, _(" alignment : 2**%u\n"), esgps
->align
);
6158 fprintf (file
, _(" flags : 0x%04x"), flags
);
6159 evax_bfd_print_egsd_flags (file
, flags
);
6161 l
= bfd_getl32 (esgps
->alloc
);
6162 fprintf (file
, _(" alloc (len) : %u (0x%08x)\n"), l
, l
);
6163 fprintf (file
, _(" image offset : 0x%08x\n"),
6164 (unsigned int)bfd_getl32 (esgps
->base
));
6165 fprintf (file
, _(" symvec offset : 0x%08x\n"),
6166 (unsigned int)bfd_getl32 (esgps
->value
));
6167 fprintf (file
, _(" name : %.*s\n"),
6168 esgps
->namlng
, esgps
->name
);
6173 struct vms_egsy
*egsy
= (struct vms_egsy
*)e
;
6174 unsigned int flags
= bfd_getl16 (egsy
->flags
);
6176 if (flags
& EGSY__V_DEF
)
6178 struct vms_esdf
*esdf
= (struct vms_esdf
*)e
;
6180 fprintf (file
, _("SYM - Global symbol definition\n"));
6181 fprintf (file
, _(" flags: 0x%04x"), flags
);
6182 exav_bfd_print_egsy_flags (flags
, file
);
6184 fprintf (file
, _(" psect offset: 0x%08x\n"),
6185 (unsigned)bfd_getl32 (esdf
->value
));
6186 if (flags
& EGSY__V_NORM
)
6188 fprintf (file
, _(" code address: 0x%08x\n"),
6189 (unsigned)bfd_getl32 (esdf
->code_address
));
6190 fprintf (file
, _(" psect index for entry point : %u\n"),
6191 (unsigned)bfd_getl32 (esdf
->ca_psindx
));
6193 fprintf (file
, _(" psect index : %u\n"),
6194 (unsigned)bfd_getl32 (esdf
->psindx
));
6195 fprintf (file
, _(" name : %.*s\n"),
6196 esdf
->namlng
, esdf
->name
);
6200 struct vms_esrf
*esrf
= (struct vms_esrf
*)e
;
6202 fprintf (file
, _("SYM - Global symbol reference\n"));
6203 fprintf (file
, _(" name : %.*s\n"),
6204 esrf
->namlng
, esrf
->name
);
6210 struct vms_eidc
*eidc
= (struct vms_eidc
*)e
;
6211 unsigned int flags
= bfd_getl32 (eidc
->flags
);
6214 fprintf (file
, _("IDC - Ident Consistency check\n"));
6215 fprintf (file
, _(" flags : 0x%08x"), flags
);
6216 if (flags
& EIDC__V_BINIDENT
)
6217 fputs (" BINDENT", file
);
6219 fprintf (file
, _(" id match : %x\n"),
6220 (flags
>> EIDC__V_IDMATCH_SH
) & EIDC__V_IDMATCH_MASK
);
6221 fprintf (file
, _(" error severity: %x\n"),
6222 (flags
>> EIDC__V_ERRSEV_SH
) & EIDC__V_ERRSEV_MASK
);
6224 fprintf (file
, _(" entity name : %.*s\n"), p
[0], p
+ 1);
6226 fprintf (file
, _(" object name : %.*s\n"), p
[0], p
+ 1);
6228 if (flags
& EIDC__V_BINIDENT
)
6229 fprintf (file
, _(" binary ident : 0x%08x\n"),
6230 (unsigned)bfd_getl32 (p
+ 1));
6232 fprintf (file
, _(" ascii ident : %.*s\n"), p
[0], p
+ 1);
6237 struct vms_egst
*egst
= (struct vms_egst
*)e
;
6238 unsigned int flags
= bfd_getl16 (egst
->header
.flags
);
6240 fprintf (file
, _("SYMG - Universal symbol definition\n"));
6241 fprintf (file
, _(" flags: 0x%04x"), flags
);
6242 exav_bfd_print_egsy_flags (flags
, file
);
6244 fprintf (file
, _(" symbol vector offset: 0x%08x\n"),
6245 (unsigned)bfd_getl32 (egst
->value
));
6246 fprintf (file
, _(" entry point: 0x%08x\n"),
6247 (unsigned)bfd_getl32 (egst
->lp_1
));
6248 fprintf (file
, _(" proc descr : 0x%08x\n"),
6249 (unsigned)bfd_getl32 (egst
->lp_2
));
6250 fprintf (file
, _(" psect index: %u\n"),
6251 (unsigned)bfd_getl32 (egst
->psindx
));
6252 fprintf (file
, _(" name : %.*s\n"),
6253 egst
->namlng
, egst
->name
);
6258 struct vms_esdfv
*esdfv
= (struct vms_esdfv
*)e
;
6259 unsigned int flags
= bfd_getl16 (esdfv
->flags
);
6261 fprintf (file
, _("SYMV - Vectored symbol definition\n"));
6262 fprintf (file
, _(" flags: 0x%04x"), flags
);
6263 exav_bfd_print_egsy_flags (flags
, file
);
6265 fprintf (file
, _(" vector : 0x%08x\n"),
6266 (unsigned)bfd_getl32 (esdfv
->vector
));
6267 fprintf (file
, _(" psect offset: %u\n"),
6268 (unsigned)bfd_getl32 (esdfv
->value
));
6269 fprintf (file
, _(" psect index : %u\n"),
6270 (unsigned)bfd_getl32 (esdfv
->psindx
));
6271 fprintf (file
, _(" name : %.*s\n"),
6272 esdfv
->namlng
, esdfv
->name
);
6277 struct vms_esdfm
*esdfm
= (struct vms_esdfm
*)e
;
6278 unsigned int flags
= bfd_getl16 (esdfm
->flags
);
6280 fprintf (file
, _("SYMM - Global symbol definition with version\n"));
6281 fprintf (file
, _(" flags: 0x%04x"), flags
);
6282 exav_bfd_print_egsy_flags (flags
, file
);
6284 fprintf (file
, _(" version mask: 0x%08x\n"),
6285 (unsigned)bfd_getl32 (esdfm
->version_mask
));
6286 fprintf (file
, _(" psect offset: %u\n"),
6287 (unsigned)bfd_getl32 (esdfm
->value
));
6288 fprintf (file
, _(" psect index : %u\n"),
6289 (unsigned)bfd_getl32 (esdfm
->psindx
));
6290 fprintf (file
, _(" name : %.*s\n"),
6291 esdfm
->namlng
, esdfm
->name
);
6295 fprintf (file
, _("unhandled egsd entry type %u\n"), type
);
6303 evax_bfd_print_hex (FILE *file
, const char *pfx
,
6304 const unsigned char *buf
, unsigned int len
)
6310 for (i
= 0; i
< len
; i
++)
6314 fprintf (file
, " %02x", buf
[i
]);
6327 evax_bfd_print_etir_stc_ir (FILE *file
, const unsigned char *buf
, int is_ps
)
6329 /* xgettext:c-format */
6330 fprintf (file
, _(" linkage index: %u, replacement insn: 0x%08x\n"),
6331 (unsigned)bfd_getl32 (buf
),
6332 (unsigned)bfd_getl32 (buf
+ 16));
6333 /* xgettext:c-format */
6334 fprintf (file
, _(" psect idx 1: %u, offset 1: 0x%08x %08x\n"),
6335 (unsigned)bfd_getl32 (buf
+ 4),
6336 (unsigned)bfd_getl32 (buf
+ 12),
6337 (unsigned)bfd_getl32 (buf
+ 8));
6338 /* xgettext:c-format */
6339 fprintf (file
, _(" psect idx 2: %u, offset 2: 0x%08x %08x\n"),
6340 (unsigned)bfd_getl32 (buf
+ 20),
6341 (unsigned)bfd_getl32 (buf
+ 28),
6342 (unsigned)bfd_getl32 (buf
+ 24));
6344 /* xgettext:c-format */
6345 fprintf (file
, _(" psect idx 3: %u, offset 3: 0x%08x %08x\n"),
6346 (unsigned)bfd_getl32 (buf
+ 32),
6347 (unsigned)bfd_getl32 (buf
+ 40),
6348 (unsigned)bfd_getl32 (buf
+ 36));
6350 fprintf (file
, _(" global name: %.*s\n"), buf
[32], buf
+ 33);
6354 evax_bfd_print_etir (FILE *file
, const char *name
,
6355 unsigned char *rec
, unsigned int rec_len
)
6357 unsigned int off
= sizeof (struct vms_egsd
);
6358 unsigned int sec_len
= 0;
6360 /* xgettext:c-format */
6361 fprintf (file
, _(" %s (len=%u+%u):\n"), name
,
6362 (unsigned)(rec_len
- sizeof (struct vms_eobjrec
)),
6363 (unsigned)sizeof (struct vms_eobjrec
));
6365 for (off
= sizeof (struct vms_eobjrec
); off
< rec_len
; )
6367 struct vms_etir
*etir
= (struct vms_etir
*)(rec
+ off
);
6372 type
= bfd_getl16 (etir
->rectyp
);
6373 size
= bfd_getl16 (etir
->size
);
6374 buf
= rec
+ off
+ sizeof (struct vms_etir
);
6376 if (off
+ size
> rec_len
|| off
+ size
< off
)
6378 fprintf (file
, _(" Error: length larger than remaining space in record\n"));
6382 /* xgettext:c-format */
6383 fprintf (file
, _(" (type: %3u, size: 4+%3u): "), type
, size
- 4);
6386 case ETIR__C_STA_GBL
:
6387 fprintf (file
, _("STA_GBL (stack global) %.*s\n"),
6390 case ETIR__C_STA_LW
:
6391 fprintf (file
, _("STA_LW (stack longword) 0x%08x\n"),
6392 (unsigned)bfd_getl32 (buf
));
6394 case ETIR__C_STA_QW
:
6395 fprintf (file
, _("STA_QW (stack quadword) 0x%08x %08x\n"),
6396 (unsigned)bfd_getl32 (buf
+ 4),
6397 (unsigned)bfd_getl32 (buf
+ 0));
6399 case ETIR__C_STA_PQ
:
6400 fprintf (file
, _("STA_PQ (stack psect base + offset)\n"));
6401 /* xgettext:c-format */
6402 fprintf (file
, _(" psect: %u, offset: 0x%08x %08x\n"),
6403 (unsigned)bfd_getl32 (buf
+ 0),
6404 (unsigned)bfd_getl32 (buf
+ 8),
6405 (unsigned)bfd_getl32 (buf
+ 4));
6407 case ETIR__C_STA_LI
:
6408 fprintf (file
, _("STA_LI (stack literal)\n"));
6410 case ETIR__C_STA_MOD
:
6411 fprintf (file
, _("STA_MOD (stack module)\n"));
6413 case ETIR__C_STA_CKARG
:
6414 fprintf (file
, _("STA_CKARG (compare procedure argument)\n"));
6418 fprintf (file
, _("STO_B (store byte)\n"));
6421 fprintf (file
, _("STO_W (store word)\n"));
6423 case ETIR__C_STO_LW
:
6424 fprintf (file
, _("STO_LW (store longword)\n"));
6426 case ETIR__C_STO_QW
:
6427 fprintf (file
, _("STO_QW (store quadword)\n"));
6429 case ETIR__C_STO_IMMR
:
6431 unsigned int len
= bfd_getl32 (buf
);
6433 _("STO_IMMR (store immediate repeat) %u bytes\n"),
6435 evax_bfd_print_hex (file
, " ", buf
+ 4, len
);
6439 case ETIR__C_STO_GBL
:
6440 fprintf (file
, _("STO_GBL (store global) %.*s\n"),
6443 case ETIR__C_STO_CA
:
6444 fprintf (file
, _("STO_CA (store code address) %.*s\n"),
6447 case ETIR__C_STO_RB
:
6448 fprintf (file
, _("STO_RB (store relative branch)\n"));
6450 case ETIR__C_STO_AB
:
6451 fprintf (file
, _("STO_AB (store absolute branch)\n"));
6453 case ETIR__C_STO_OFF
:
6454 fprintf (file
, _("STO_OFF (store offset to psect)\n"));
6456 case ETIR__C_STO_IMM
:
6458 unsigned int len
= bfd_getl32 (buf
);
6460 _("STO_IMM (store immediate) %u bytes\n"),
6462 evax_bfd_print_hex (file
, " ", buf
+ 4, len
);
6466 case ETIR__C_STO_GBL_LW
:
6467 fprintf (file
, _("STO_GBL_LW (store global longword) %.*s\n"),
6470 case ETIR__C_STO_LP_PSB
:
6471 fprintf (file
, _("STO_OFF (store LP with procedure signature)\n"));
6473 case ETIR__C_STO_HINT_GBL
:
6474 fprintf (file
, _("STO_BR_GBL (store branch global) *todo*\n"));
6476 case ETIR__C_STO_HINT_PS
:
6477 fprintf (file
, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6480 case ETIR__C_OPR_NOP
:
6481 fprintf (file
, _("OPR_NOP (no-operation)\n"));
6483 case ETIR__C_OPR_ADD
:
6484 fprintf (file
, _("OPR_ADD (add)\n"));
6486 case ETIR__C_OPR_SUB
:
6487 fprintf (file
, _("OPR_SUB (subtract)\n"));
6489 case ETIR__C_OPR_MUL
:
6490 fprintf (file
, _("OPR_MUL (multiply)\n"));
6492 case ETIR__C_OPR_DIV
:
6493 fprintf (file
, _("OPR_DIV (divide)\n"));
6495 case ETIR__C_OPR_AND
:
6496 fprintf (file
, _("OPR_AND (logical and)\n"));
6498 case ETIR__C_OPR_IOR
:
6499 fprintf (file
, _("OPR_IOR (logical inclusive or)\n"));
6501 case ETIR__C_OPR_EOR
:
6502 fprintf (file
, _("OPR_EOR (logical exclusive or)\n"));
6504 case ETIR__C_OPR_NEG
:
6505 fprintf (file
, _("OPR_NEG (negate)\n"));
6507 case ETIR__C_OPR_COM
:
6508 fprintf (file
, _("OPR_COM (complement)\n"));
6510 case ETIR__C_OPR_INSV
:
6511 fprintf (file
, _("OPR_INSV (insert field)\n"));
6513 case ETIR__C_OPR_ASH
:
6514 fprintf (file
, _("OPR_ASH (arithmetic shift)\n"));
6516 case ETIR__C_OPR_USH
:
6517 fprintf (file
, _("OPR_USH (unsigned shift)\n"));
6519 case ETIR__C_OPR_ROT
:
6520 fprintf (file
, _("OPR_ROT (rotate)\n"));
6522 case ETIR__C_OPR_SEL
:
6523 fprintf (file
, _("OPR_SEL (select)\n"));
6525 case ETIR__C_OPR_REDEF
:
6526 fprintf (file
, _("OPR_REDEF (redefine symbol to curr location)\n"));
6528 case ETIR__C_OPR_DFLIT
:
6529 fprintf (file
, _("OPR_REDEF (define a literal)\n"));
6532 case ETIR__C_STC_LP
:
6533 fprintf (file
, _("STC_LP (store cond linkage pair)\n"));
6535 case ETIR__C_STC_LP_PSB
:
6537 _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6538 /* xgettext:c-format */
6539 fprintf (file
, _(" linkage index: %u, procedure: %.*s\n"),
6540 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6541 buf
+= 4 + 1 + buf
[4];
6542 fprintf (file
, _(" signature: %.*s\n"), buf
[0], buf
+ 1);
6544 case ETIR__C_STC_GBL
:
6545 fprintf (file
, _("STC_GBL (store cond global)\n"));
6546 /* xgettext:c-format */
6547 fprintf (file
, _(" linkage index: %u, global: %.*s\n"),
6548 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6550 case ETIR__C_STC_GCA
:
6551 fprintf (file
, _("STC_GCA (store cond code address)\n"));
6552 /* xgettext:c-format */
6553 fprintf (file
, _(" linkage index: %u, procedure name: %.*s\n"),
6554 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6556 case ETIR__C_STC_PS
:
6557 fprintf (file
, _("STC_PS (store cond psect + offset)\n"));
6559 /* xgettext:c-format */
6560 _(" linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6561 (unsigned)bfd_getl32 (buf
),
6562 (unsigned)bfd_getl32 (buf
+ 4),
6563 (unsigned)bfd_getl32 (buf
+ 12),
6564 (unsigned)bfd_getl32 (buf
+ 8));
6566 case ETIR__C_STC_NOP_GBL
:
6567 fprintf (file
, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6568 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6570 case ETIR__C_STC_NOP_PS
:
6571 fprintf (file
, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6572 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6574 case ETIR__C_STC_BSR_GBL
:
6575 fprintf (file
, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6576 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6578 case ETIR__C_STC_BSR_PS
:
6579 fprintf (file
, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6580 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6582 case ETIR__C_STC_LDA_GBL
:
6583 fprintf (file
, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6584 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6586 case ETIR__C_STC_LDA_PS
:
6587 fprintf (file
, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6588 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6590 case ETIR__C_STC_BOH_GBL
:
6591 fprintf (file
, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6592 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6594 case ETIR__C_STC_BOH_PS
:
6595 fprintf (file
, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6596 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6598 case ETIR__C_STC_NBH_GBL
:
6600 _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6602 case ETIR__C_STC_NBH_PS
:
6604 _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6607 case ETIR__C_CTL_SETRB
:
6608 fprintf (file
, _("CTL_SETRB (set relocation base)\n"));
6611 case ETIR__C_CTL_AUGRB
:
6613 unsigned int val
= bfd_getl32 (buf
);
6614 fprintf (file
, _("CTL_AUGRB (augment relocation base) %u\n"), val
);
6617 case ETIR__C_CTL_DFLOC
:
6618 fprintf (file
, _("CTL_DFLOC (define location)\n"));
6620 case ETIR__C_CTL_STLOC
:
6621 fprintf (file
, _("CTL_STLOC (set location)\n"));
6623 case ETIR__C_CTL_STKDL
:
6624 fprintf (file
, _("CTL_STKDL (stack defined location)\n"));
6627 fprintf (file
, _("*unhandled*\n"));
6635 evax_bfd_print_eobj (struct bfd
*abfd
, FILE *file
)
6637 bfd_boolean is_first
= TRUE
;
6638 bfd_boolean has_records
= FALSE
;
6642 unsigned int rec_len
;
6643 unsigned int pad_len
;
6645 unsigned int hdr_size
;
6650 unsigned char buf
[6];
6655 if (bfd_bread (buf
, sizeof (buf
), abfd
) != sizeof (buf
))
6657 fprintf (file
, _("cannot read GST record length\n"));
6660 rec_len
= bfd_getl16 (buf
+ 0);
6661 if (rec_len
== bfd_getl16 (buf
+ 4)
6662 && bfd_getl16 (buf
+ 2) == EOBJ__C_EMH
)
6664 /* The format is raw: record-size, type, record-size. */
6666 pad_len
= (rec_len
+ 1) & ~1U;
6669 else if (rec_len
== EOBJ__C_EMH
)
6671 has_records
= FALSE
;
6672 pad_len
= bfd_getl16 (buf
+ 2);
6678 fprintf (file
, _("cannot find EMH in first GST record\n"));
6681 rec
= bfd_malloc (pad_len
);
6682 memcpy (rec
, buf
+ sizeof (buf
) - hdr_size
, hdr_size
);
6686 unsigned int rec_len2
= 0;
6687 unsigned char hdr
[4];
6691 unsigned char buf_len
[2];
6693 if (bfd_bread (buf_len
, sizeof (buf_len
), abfd
)
6694 != sizeof (buf_len
))
6696 fprintf (file
, _("cannot read GST record length\n"));
6699 rec_len2
= (unsigned)bfd_getl16 (buf_len
);
6702 if (bfd_bread (hdr
, sizeof (hdr
), abfd
) != sizeof (hdr
))
6704 fprintf (file
, _("cannot read GST record header\n"));
6707 rec_len
= (unsigned)bfd_getl16 (hdr
+ 2);
6709 pad_len
= (rec_len
+ 1) & ~1U;
6712 rec
= bfd_malloc (pad_len
);
6713 memcpy (rec
, hdr
, sizeof (hdr
));
6714 hdr_size
= sizeof (hdr
);
6715 if (has_records
&& rec_len2
!= rec_len
)
6717 fprintf (file
, _(" corrupted GST\n"));
6722 if (bfd_bread (rec
+ hdr_size
, pad_len
- hdr_size
, abfd
)
6723 != pad_len
- hdr_size
)
6725 fprintf (file
, _("cannot read GST record\n"));
6729 type
= (unsigned)bfd_getl16 (rec
);
6734 evax_bfd_print_emh (file
, rec
, rec_len
);
6737 evax_bfd_print_egsd (file
, rec
, rec_len
);
6740 evax_bfd_print_eeom (file
, rec
, rec_len
);
6745 evax_bfd_print_etir (file
, "ETIR", rec
, rec_len
);
6748 evax_bfd_print_etir (file
, "EDBG", rec
, rec_len
);
6751 evax_bfd_print_etir (file
, "ETBT", rec
, rec_len
);
6754 fprintf (file
, _(" unhandled EOBJ record type %u\n"), type
);
6762 evax_bfd_print_relocation_records (FILE *file
, const unsigned char *rel
,
6763 unsigned int stride
)
6771 count
= bfd_getl32 (rel
+ 0);
6775 base
= bfd_getl32 (rel
+ 4);
6777 /* xgettext:c-format */
6778 fprintf (file
, _(" bitcount: %u, base addr: 0x%08x\n"),
6782 for (j
= 0; count
> 0; j
+= 4, count
-= 32)
6788 val
= bfd_getl32 (rel
);
6791 /* xgettext:c-format */
6792 fprintf (file
, _(" bitmap: 0x%08x (count: %u):\n"), val
, count
);
6794 for (k
= 0; k
< 32; k
++)
6795 if (val
& (1u << k
))
6799 fprintf (file
, _(" %08x"), base
+ (j
* 8 + k
) * stride
);
6814 evax_bfd_print_address_fixups (FILE *file
, const unsigned char *rel
)
6821 count
= bfd_getl32 (rel
+ 0);
6824 /* xgettext:c-format */
6825 fprintf (file
, _(" image %u (%u entries)\n"),
6826 (unsigned)bfd_getl32 (rel
+ 4), count
);
6828 for (j
= 0; j
< count
; j
++)
6830 /* xgettext:c-format */
6831 fprintf (file
, _(" offset: 0x%08x, val: 0x%08x\n"),
6832 (unsigned)bfd_getl32 (rel
+ 0),
6833 (unsigned)bfd_getl32 (rel
+ 4));
6840 evax_bfd_print_reference_fixups (FILE *file
, const unsigned char *rel
)
6849 count
= bfd_getl32 (rel
+ 0);
6852 /* xgettext:c-format */
6853 fprintf (file
, _(" image %u (%u entries), offsets:\n"),
6854 (unsigned)bfd_getl32 (rel
+ 4), count
);
6856 for (j
= 0; j
< count
; j
++)
6860 fprintf (file
, _(" 0x%08x"), (unsigned)bfd_getl32 (rel
));
6875 evax_bfd_print_indent (int indent
, FILE *file
)
6877 for (; indent
; indent
--)
6882 evax_bfd_get_dsc_name (unsigned int v
)
6886 case DSC__K_DTYPE_Z
:
6887 return "Z (Unspecified)";
6888 case DSC__K_DTYPE_V
:
6890 case DSC__K_DTYPE_BU
:
6891 return "BU (Byte logical)";
6892 case DSC__K_DTYPE_WU
:
6893 return "WU (Word logical)";
6894 case DSC__K_DTYPE_LU
:
6895 return "LU (Longword logical)";
6896 case DSC__K_DTYPE_QU
:
6897 return "QU (Quadword logical)";
6898 case DSC__K_DTYPE_B
:
6899 return "B (Byte integer)";
6900 case DSC__K_DTYPE_W
:
6901 return "W (Word integer)";
6902 case DSC__K_DTYPE_L
:
6903 return "L (Longword integer)";
6904 case DSC__K_DTYPE_Q
:
6905 return "Q (Quadword integer)";
6906 case DSC__K_DTYPE_F
:
6907 return "F (Single-precision floating)";
6908 case DSC__K_DTYPE_D
:
6909 return "D (Double-precision floating)";
6910 case DSC__K_DTYPE_FC
:
6911 return "FC (Complex)";
6912 case DSC__K_DTYPE_DC
:
6913 return "DC (Double-precision Complex)";
6914 case DSC__K_DTYPE_T
:
6915 return "T (ASCII text string)";
6916 case DSC__K_DTYPE_NU
:
6917 return "NU (Numeric string, unsigned)";
6918 case DSC__K_DTYPE_NL
:
6919 return "NL (Numeric string, left separate sign)";
6920 case DSC__K_DTYPE_NLO
:
6921 return "NLO (Numeric string, left overpunched sign)";
6922 case DSC__K_DTYPE_NR
:
6923 return "NR (Numeric string, right separate sign)";
6924 case DSC__K_DTYPE_NRO
:
6925 return "NRO (Numeric string, right overpunched sig)";
6926 case DSC__K_DTYPE_NZ
:
6927 return "NZ (Numeric string, zoned sign)";
6928 case DSC__K_DTYPE_P
:
6929 return "P (Packed decimal string)";
6930 case DSC__K_DTYPE_ZI
:
6931 return "ZI (Sequence of instructions)";
6932 case DSC__K_DTYPE_ZEM
:
6933 return "ZEM (Procedure entry mask)";
6934 case DSC__K_DTYPE_DSC
:
6935 return "DSC (Descriptor, used for arrays of dyn strings)";
6936 case DSC__K_DTYPE_OU
:
6937 return "OU (Octaword logical)";
6938 case DSC__K_DTYPE_O
:
6939 return "O (Octaword integer)";
6940 case DSC__K_DTYPE_G
:
6941 return "G (Double precision G floating, 64 bit)";
6942 case DSC__K_DTYPE_H
:
6943 return "H (Quadruple precision floating, 128 bit)";
6944 case DSC__K_DTYPE_GC
:
6945 return "GC (Double precision complex, G floating)";
6946 case DSC__K_DTYPE_HC
:
6947 return "HC (Quadruple precision complex, H floating)";
6948 case DSC__K_DTYPE_CIT
:
6949 return "CIT (COBOL intermediate temporary)";
6950 case DSC__K_DTYPE_BPV
:
6951 return "BPV (Bound Procedure Value)";
6952 case DSC__K_DTYPE_BLV
:
6953 return "BLV (Bound Label Value)";
6954 case DSC__K_DTYPE_VU
:
6955 return "VU (Bit Unaligned)";
6956 case DSC__K_DTYPE_ADT
:
6957 return "ADT (Absolute Date-Time)";
6958 case DSC__K_DTYPE_VT
:
6959 return "VT (Varying Text)";
6960 case DSC__K_DTYPE_T2
:
6961 return "T2 (16-bit char)";
6962 case DSC__K_DTYPE_VT2
:
6963 return "VT2 (16-bit varying char)";
6965 return "?? (unknown)";
6970 evax_bfd_print_desc (const unsigned char *buf
, int indent
, FILE *file
)
6972 unsigned char bclass
= buf
[3];
6973 unsigned char dtype
= buf
[2];
6974 unsigned int len
= (unsigned)bfd_getl16 (buf
);
6975 unsigned int pointer
= (unsigned)bfd_getl32 (buf
+ 4);
6977 evax_bfd_print_indent (indent
, file
);
6979 if (len
== 1 && pointer
== 0xffffffffUL
)
6982 fprintf (file
, _("64 bits *unhandled*\n"));
6986 /* xgettext:c-format */
6987 fprintf (file
, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
6988 bclass
, dtype
, len
, pointer
);
6991 case DSC__K_CLASS_NCA
:
6993 const struct vms_dsc_nca
*dsc
= (const void *)buf
;
6995 const unsigned char *b
;
6997 evax_bfd_print_indent (indent
, file
);
6998 fprintf (file
, _("non-contiguous array of %s\n"),
6999 evax_bfd_get_dsc_name (dsc
->dtype
));
7000 evax_bfd_print_indent (indent
+ 1, file
);
7002 /* xgettext:c-format */
7003 _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
7004 dsc
->dimct
, dsc
->aflags
, dsc
->digits
, dsc
->scale
);
7005 evax_bfd_print_indent (indent
+ 1, file
);
7007 /* xgettext:c-format */
7008 _("arsize: %u, a0: 0x%08x\n"),
7009 (unsigned)bfd_getl32 (dsc
->arsize
),
7010 (unsigned)bfd_getl32 (dsc
->a0
));
7011 evax_bfd_print_indent (indent
+ 1, file
);
7012 fprintf (file
, _("Strides:\n"));
7013 b
= buf
+ sizeof (*dsc
);
7014 for (i
= 0; i
< dsc
->dimct
; i
++)
7016 evax_bfd_print_indent (indent
+ 2, file
);
7017 fprintf (file
, "[%u]: %u\n", i
+ 1,
7018 (unsigned)bfd_getl32 (b
));
7021 evax_bfd_print_indent (indent
+ 1, file
);
7022 fprintf (file
, _("Bounds:\n"));
7023 b
= buf
+ sizeof (*dsc
);
7024 for (i
= 0; i
< dsc
->dimct
; i
++)
7026 evax_bfd_print_indent (indent
+ 2, file
);
7027 /* xgettext:c-format */
7028 fprintf (file
, _("[%u]: Lower: %u, upper: %u\n"), i
+ 1,
7029 (unsigned)bfd_getl32 (b
+ 0),
7030 (unsigned)bfd_getl32 (b
+ 4));
7035 case DSC__K_CLASS_UBS
:
7037 const struct vms_dsc_ubs
*ubs
= (const void *)buf
;
7039 evax_bfd_print_indent (indent
, file
);
7040 fprintf (file
, _("unaligned bit-string of %s\n"),
7041 evax_bfd_get_dsc_name (ubs
->dtype
));
7042 evax_bfd_print_indent (indent
+ 1, file
);
7044 /* xgettext:c-format */
7045 _("base: %u, pos: %u\n"),
7046 (unsigned)bfd_getl32 (ubs
->base
),
7047 (unsigned)bfd_getl32 (ubs
->pos
));
7051 fprintf (file
, _("*unhandled*\n"));
7058 evax_bfd_print_valspec (const unsigned char *buf
, int indent
, FILE *file
)
7060 unsigned int vflags
= buf
[0];
7061 unsigned int value
= (unsigned)bfd_getl32 (buf
+ 1);
7062 unsigned int len
= 5;
7064 evax_bfd_print_indent (indent
, file
);
7065 /* xgettext:c-format */
7066 fprintf (file
, _("vflags: 0x%02x, value: 0x%08x "), vflags
, value
);
7071 case DST__K_VFLAGS_NOVAL
:
7072 fprintf (file
, _("(no value)\n"));
7074 case DST__K_VFLAGS_NOTACTIVE
:
7075 fprintf (file
, _("(not active)\n"));
7077 case DST__K_VFLAGS_UNALLOC
:
7078 fprintf (file
, _("(not allocated)\n"));
7080 case DST__K_VFLAGS_DSC
:
7081 fprintf (file
, _("(descriptor)\n"));
7082 evax_bfd_print_desc (buf
+ value
, indent
+ 1, file
);
7084 case DST__K_VFLAGS_TVS
:
7085 fprintf (file
, _("(trailing value)\n"));
7087 case DST__K_VS_FOLLOWS
:
7088 fprintf (file
, _("(value spec follows)\n"));
7090 case DST__K_VFLAGS_BITOFFS
:
7091 fprintf (file
, _("(at bit offset %u)\n"), value
);
7094 /* xgettext:c-format */
7095 fprintf (file
, _("(reg: %u, disp: %u, indir: %u, kind: "),
7096 (vflags
& DST__K_REGNUM_MASK
) >> DST__K_REGNUM_SHIFT
,
7097 vflags
& DST__K_DISP
? 1 : 0,
7098 vflags
& DST__K_INDIR
? 1 : 0);
7099 switch (vflags
& DST__K_VALKIND_MASK
)
7101 case DST__K_VALKIND_LITERAL
:
7102 fputs (_("literal"), file
);
7104 case DST__K_VALKIND_ADDR
:
7105 fputs (_("address"), file
);
7107 case DST__K_VALKIND_DESC
:
7108 fputs (_("desc"), file
);
7110 case DST__K_VALKIND_REG
:
7111 fputs (_("reg"), file
);
7114 fputs (")\n", file
);
7121 evax_bfd_print_typspec (const unsigned char *buf
, int indent
, FILE *file
)
7123 unsigned char kind
= buf
[2];
7124 unsigned int len
= (unsigned)bfd_getl16 (buf
);
7126 evax_bfd_print_indent (indent
, file
);
7127 /* xgettext:c-format */
7128 fprintf (file
, _("len: %2u, kind: %2u "), len
, kind
);
7132 case DST__K_TS_ATOM
:
7133 /* xgettext:c-format */
7134 fprintf (file
, _("atomic, type=0x%02x %s\n"),
7135 buf
[0], evax_bfd_get_dsc_name (buf
[0]));
7138 fprintf (file
, _("indirect, defined at 0x%08x\n"),
7139 (unsigned)bfd_getl32 (buf
));
7141 case DST__K_TS_TPTR
:
7142 fprintf (file
, _("typed pointer\n"));
7143 evax_bfd_print_typspec (buf
, indent
+ 1, file
);
7146 fprintf (file
, _("pointer\n"));
7148 case DST__K_TS_ARRAY
:
7150 const unsigned char *vs
;
7151 unsigned int vec_len
;
7154 fprintf (file
, _("array, dim: %u, bitmap: "), buf
[0]);
7155 vec_len
= (buf
[0] + 1 + 7) / 8;
7156 for (i
= 0; i
< vec_len
; i
++)
7157 fprintf (file
, " %02x", buf
[i
+ 1]);
7159 vs
= buf
+ 1 + vec_len
;
7160 evax_bfd_print_indent (indent
, file
);
7161 fprintf (file
, _("array descriptor:\n"));
7162 vs
+= evax_bfd_print_valspec (vs
, indent
+ 1, file
);
7163 for (i
= 0; i
< buf
[0] + 1U; i
++)
7164 if (buf
[1 + i
/ 8] & (1 << (i
% 8)))
7166 evax_bfd_print_indent (indent
, file
);
7168 fprintf (file
, _("type spec for element:\n"));
7170 fprintf (file
, _("type spec for subscript %u:\n"), i
);
7171 evax_bfd_print_typspec (vs
, indent
+ 1, file
);
7172 vs
+= bfd_getl16 (vs
);
7177 fprintf (file
, _("*unhandled*\n"));
7182 evax_bfd_print_dst (struct bfd
*abfd
, unsigned int dst_size
, FILE *file
)
7184 unsigned int off
= 0;
7185 unsigned int pc
= 0;
7186 unsigned int line
= 0;
7188 fprintf (file
, _("Debug symbol table:\n"));
7190 while (dst_size
> 0)
7192 struct vms_dst_header dsth
;
7197 if (bfd_bread (&dsth
, sizeof (dsth
), abfd
) != sizeof (dsth
))
7199 fprintf (file
, _("cannot read DST header\n"));
7202 len
= bfd_getl16 (dsth
.length
);
7203 type
= bfd_getl16 (dsth
.type
);
7204 /* xgettext:c-format */
7205 fprintf (file
, _(" type: %3u, len: %3u (at 0x%08x): "),
7215 len
-= sizeof (dsth
);
7216 buf
= _bfd_malloc_and_read (abfd
, len
, len
);
7219 fprintf (file
, _("cannot read DST symbol\n"));
7224 case DSC__K_DTYPE_V
:
7225 case DSC__K_DTYPE_BU
:
7226 case DSC__K_DTYPE_WU
:
7227 case DSC__K_DTYPE_LU
:
7228 case DSC__K_DTYPE_QU
:
7229 case DSC__K_DTYPE_B
:
7230 case DSC__K_DTYPE_W
:
7231 case DSC__K_DTYPE_L
:
7232 case DSC__K_DTYPE_Q
:
7233 case DSC__K_DTYPE_F
:
7234 case DSC__K_DTYPE_D
:
7235 case DSC__K_DTYPE_FC
:
7236 case DSC__K_DTYPE_DC
:
7237 case DSC__K_DTYPE_T
:
7238 case DSC__K_DTYPE_NU
:
7239 case DSC__K_DTYPE_NL
:
7240 case DSC__K_DTYPE_NLO
:
7241 case DSC__K_DTYPE_NR
:
7242 case DSC__K_DTYPE_NRO
:
7243 case DSC__K_DTYPE_NZ
:
7244 case DSC__K_DTYPE_P
:
7245 case DSC__K_DTYPE_ZI
:
7246 case DSC__K_DTYPE_ZEM
:
7247 case DSC__K_DTYPE_DSC
:
7248 case DSC__K_DTYPE_OU
:
7249 case DSC__K_DTYPE_O
:
7250 case DSC__K_DTYPE_G
:
7251 case DSC__K_DTYPE_H
:
7252 case DSC__K_DTYPE_GC
:
7253 case DSC__K_DTYPE_HC
:
7254 case DSC__K_DTYPE_CIT
:
7255 case DSC__K_DTYPE_BPV
:
7256 case DSC__K_DTYPE_BLV
:
7257 case DSC__K_DTYPE_VU
:
7258 case DSC__K_DTYPE_ADT
:
7259 case DSC__K_DTYPE_VT
:
7260 case DSC__K_DTYPE_T2
:
7261 case DSC__K_DTYPE_VT2
:
7262 fprintf (file
, _("standard data: %s\n"),
7263 evax_bfd_get_dsc_name (type
));
7264 evax_bfd_print_valspec (buf
, 4, file
);
7265 fprintf (file
, _(" name: %.*s\n"), buf
[5], buf
+ 6);
7269 struct vms_dst_modbeg
*dst
= (void *)buf
;
7270 const char *name
= (const char *)buf
+ sizeof (*dst
);
7272 fprintf (file
, _("modbeg\n"));
7273 /* xgettext:c-format */
7274 fprintf (file
, _(" flags: %d, language: %u, "
7275 "major: %u, minor: %u\n"),
7277 (unsigned)bfd_getl32 (dst
->language
),
7278 (unsigned)bfd_getl16 (dst
->major
),
7279 (unsigned)bfd_getl16 (dst
->minor
));
7280 fprintf (file
, _(" module name: %.*s\n"),
7282 name
+= name
[0] + 1;
7283 fprintf (file
, _(" compiler : %.*s\n"),
7288 fprintf (file
, _("modend\n"));
7292 struct vms_dst_rtnbeg
*dst
= (void *)buf
;
7293 const char *name
= (const char *)buf
+ sizeof (*dst
);
7295 fputs (_("rtnbeg\n"), file
);
7296 /* xgettext:c-format */
7297 fprintf (file
, _(" flags: %u, address: 0x%08x, "
7298 "pd-address: 0x%08x\n"),
7300 (unsigned)bfd_getl32 (dst
->address
),
7301 (unsigned)bfd_getl32 (dst
->pd_address
));
7302 fprintf (file
, _(" routine name: %.*s\n"),
7308 struct vms_dst_rtnend
*dst
= (void *)buf
;
7310 fprintf (file
, _("rtnend: size 0x%08x\n"),
7311 (unsigned)bfd_getl32 (dst
->size
));
7316 struct vms_dst_prolog
*dst
= (void *)buf
;
7318 fprintf (file
, _("prolog: bkpt address 0x%08x\n"),
7319 (unsigned)bfd_getl32 (dst
->bkpt_addr
));
7324 struct vms_dst_epilog
*dst
= (void *)buf
;
7326 /* xgettext:c-format */
7327 fprintf (file
, _("epilog: flags: %u, count: %u\n"),
7328 dst
->flags
, (unsigned)bfd_getl32 (dst
->count
));
7333 struct vms_dst_blkbeg
*dst
= (void *)buf
;
7334 const char *name
= (const char *)buf
+ sizeof (*dst
);
7336 /* xgettext:c-format */
7337 fprintf (file
, _("blkbeg: address: 0x%08x, name: %.*s\n"),
7338 (unsigned)bfd_getl32 (dst
->address
),
7344 struct vms_dst_blkend
*dst
= (void *)buf
;
7346 fprintf (file
, _("blkend: size: 0x%08x\n"),
7347 (unsigned)bfd_getl32 (dst
->size
));
7350 case DST__K_TYPSPEC
:
7352 fprintf (file
, _("typspec (len: %u)\n"), len
);
7353 fprintf (file
, _(" name: %.*s\n"), buf
[0], buf
+ 1);
7354 evax_bfd_print_typspec (buf
+ 1 + buf
[0], 5, file
);
7359 fprintf (file
, _("septyp, name: %.*s\n"), buf
[5], buf
+ 6);
7360 evax_bfd_print_valspec (buf
, 4, file
);
7365 struct vms_dst_recbeg
*recbeg
= (void *)buf
;
7366 const char *name
= (const char *)buf
+ sizeof (*recbeg
);
7368 fprintf (file
, _("recbeg: name: %.*s\n"), name
[0], name
+ 1);
7369 evax_bfd_print_valspec (buf
, 4, file
);
7370 fprintf (file
, _(" len: %u bits\n"),
7371 (unsigned)bfd_getl32 (name
+ 1 + name
[0]));
7375 fprintf (file
, _("recend\n"));
7377 case DST__K_ENUMBEG
:
7378 /* xgettext:c-format */
7379 fprintf (file
, _("enumbeg, len: %u, name: %.*s\n"),
7380 buf
[0], buf
[1], buf
+ 2);
7382 case DST__K_ENUMELT
:
7383 fprintf (file
, _("enumelt, name: %.*s\n"), buf
[5], buf
+ 6);
7384 evax_bfd_print_valspec (buf
, 4, file
);
7386 case DST__K_ENUMEND
:
7387 fprintf (file
, _("enumend\n"));
7391 struct vms_dst_label
*lab
= (void *)buf
;
7392 fprintf (file
, _("label, name: %.*s\n"),
7393 lab
->name
[0], lab
->name
+ 1);
7394 fprintf (file
, _(" address: 0x%08x\n"),
7395 (unsigned)bfd_getl32 (lab
->value
));
7398 case DST__K_DIS_RANGE
:
7400 unsigned int cnt
= bfd_getl32 (buf
);
7401 unsigned char *rng
= buf
+ 4;
7404 fprintf (file
, _("discontiguous range (nbr: %u)\n"), cnt
);
7405 for (i
= 0; i
< cnt
; i
++, rng
+= 8)
7406 /* xgettext:c-format */
7407 fprintf (file
, _(" address: 0x%08x, size: %u\n"),
7408 (unsigned)bfd_getl32 (rng
),
7409 (unsigned)bfd_getl32 (rng
+ 4));
7413 case DST__K_LINE_NUM
:
7415 unsigned char *buf_orig
= buf
;
7417 fprintf (file
, _("line num (len: %u)\n"), len
);
7422 unsigned char cmdlen
;
7432 case DST__K_DELTA_PC_W
:
7433 val
= bfd_getl16 (buf
+ 1);
7434 fprintf (file
, _("delta_pc_w %u\n"), val
);
7439 case DST__K_INCR_LINUM
:
7441 fprintf (file
, _("incr_linum(b): +%u\n"), val
);
7445 case DST__K_INCR_LINUM_W
:
7446 val
= bfd_getl16 (buf
+ 1);
7447 fprintf (file
, _("incr_linum_w: +%u\n"), val
);
7451 case DST__K_INCR_LINUM_L
:
7452 val
= bfd_getl32 (buf
+ 1);
7453 fprintf (file
, _("incr_linum_l: +%u\n"), val
);
7457 case DST__K_SET_LINUM
:
7458 line
= bfd_getl16 (buf
+ 1);
7459 fprintf (file
, _("set_line_num(w) %u\n"), line
);
7462 case DST__K_SET_LINUM_B
:
7464 fprintf (file
, _("set_line_num_b %u\n"), line
);
7467 case DST__K_SET_LINUM_L
:
7468 line
= bfd_getl32 (buf
+ 1);
7469 fprintf (file
, _("set_line_num_l %u\n"), line
);
7472 case DST__K_SET_ABS_PC
:
7473 pc
= bfd_getl32 (buf
+ 1);
7474 fprintf (file
, _("set_abs_pc: 0x%08x\n"), pc
);
7477 case DST__K_DELTA_PC_L
:
7478 fprintf (file
, _("delta_pc_l: +0x%08x\n"),
7479 (unsigned)bfd_getl32 (buf
+ 1));
7483 fprintf (file
, _("term(b): 0x%02x"), buf
[1]);
7485 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7489 val
= bfd_getl16 (buf
+ 1);
7490 fprintf (file
, _("term_w: 0x%04x"), val
);
7492 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7498 fprintf (file
, _("delta pc +%-4d"), -cmd
);
7499 line
++; /* FIXME: curr increment. */
7501 /* xgettext:c-format */
7502 fprintf (file
, _(" pc: 0x%08x line: %5u\n"),
7507 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
7520 unsigned char *buf_orig
= buf
;
7522 fprintf (file
, _("source (len: %u)\n"), len
);
7526 signed char cmd
= buf
[0];
7527 unsigned char cmdlen
= 0;
7531 case DST__K_SRC_DECLFILE
:
7533 struct vms_dst_src_decl_src
*src
= (void *)(buf
+ 1);
7536 /* xgettext:c-format */
7537 fprintf (file
, _(" declfile: len: %u, flags: %u, "
7539 src
->length
, src
->flags
,
7540 (unsigned)bfd_getl16 (src
->fileid
));
7541 /* xgettext:c-format */
7542 fprintf (file
, _(" rms: cdt: 0x%08x %08x, "
7543 "ebk: 0x%08x, ffb: 0x%04x, "
7545 (unsigned)bfd_getl32 (src
->rms_cdt
+ 4),
7546 (unsigned)bfd_getl32 (src
->rms_cdt
+ 0),
7547 (unsigned)bfd_getl32 (src
->rms_ebk
),
7548 (unsigned)bfd_getl16 (src
->rms_ffb
),
7550 name
= (const char *)buf
+ 1 + sizeof (*src
);
7551 fprintf (file
, _(" filename : %.*s\n"),
7553 name
+= name
[0] + 1;
7554 fprintf (file
, _(" module name: %.*s\n"),
7556 cmdlen
= 2 + src
->length
;
7559 case DST__K_SRC_SETFILE
:
7560 fprintf (file
, _(" setfile %u\n"),
7561 (unsigned)bfd_getl16 (buf
+ 1));
7564 case DST__K_SRC_SETREC_W
:
7565 fprintf (file
, _(" setrec %u\n"),
7566 (unsigned)bfd_getl16 (buf
+ 1));
7569 case DST__K_SRC_SETREC_L
:
7570 fprintf (file
, _(" setrec %u\n"),
7571 (unsigned)bfd_getl32 (buf
+ 1));
7574 case DST__K_SRC_SETLNUM_W
:
7575 fprintf (file
, _(" setlnum %u\n"),
7576 (unsigned)bfd_getl16 (buf
+ 1));
7579 case DST__K_SRC_SETLNUM_L
:
7580 fprintf (file
, _(" setlnum %u\n"),
7581 (unsigned)bfd_getl32 (buf
+ 1));
7584 case DST__K_SRC_DEFLINES_W
:
7585 fprintf (file
, _(" deflines %u\n"),
7586 (unsigned)bfd_getl16 (buf
+ 1));
7589 case DST__K_SRC_DEFLINES_B
:
7590 fprintf (file
, _(" deflines %u\n"), buf
[1]);
7593 case DST__K_SRC_FORMFEED
:
7594 fprintf (file
, _(" formfeed\n"));
7598 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
7610 fprintf (file
, _("*unhandled* dst type %u\n"), type
);
7618 evax_bfd_print_image (bfd
*abfd
, FILE *file
)
7620 struct vms_eihd eihd
;
7623 unsigned int eiha_off
;
7624 unsigned int eihi_off
;
7625 unsigned int eihs_off
;
7626 unsigned int eisd_off
;
7627 unsigned int eihef_off
= 0;
7628 unsigned int eihnp_off
= 0;
7629 unsigned int dmt_vbn
= 0;
7630 unsigned int dmt_size
= 0;
7631 unsigned int dst_vbn
= 0;
7632 unsigned int dst_size
= 0;
7633 unsigned int gst_vbn
= 0;
7634 unsigned int gst_size
= 0;
7635 unsigned int eiaf_vbn
= 0;
7636 unsigned int eiaf_size
= 0;
7637 unsigned int eihvn_off
;
7639 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
)
7640 || bfd_bread (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
7642 fprintf (file
, _("cannot read EIHD\n"));
7645 /* xgettext:c-format */
7646 fprintf (file
, _("EIHD: (size: %u, nbr blocks: %u)\n"),
7647 (unsigned)bfd_getl32 (eihd
.size
),
7648 (unsigned)bfd_getl32 (eihd
.hdrblkcnt
));
7649 /* xgettext:c-format */
7650 fprintf (file
, _(" majorid: %u, minorid: %u\n"),
7651 (unsigned)bfd_getl32 (eihd
.majorid
),
7652 (unsigned)bfd_getl32 (eihd
.minorid
));
7654 val
= (unsigned)bfd_getl32 (eihd
.imgtype
);
7658 name
= _("executable");
7661 name
= _("linkable image");
7664 name
= _("unknown");
7667 /* xgettext:c-format */
7668 fprintf (file
, _(" image type: %u (%s)"), val
, name
);
7670 val
= (unsigned)bfd_getl32 (eihd
.subtype
);
7673 case EIHD__C_NATIVE
:
7680 name
= _("unknown");
7683 /* xgettext:c-format */
7684 fprintf (file
, _(", subtype: %u (%s)\n"), val
, name
);
7686 eisd_off
= bfd_getl32 (eihd
.isdoff
);
7687 eiha_off
= bfd_getl32 (eihd
.activoff
);
7688 eihi_off
= bfd_getl32 (eihd
.imgidoff
);
7689 eihs_off
= bfd_getl32 (eihd
.symdbgoff
);
7690 /* xgettext:c-format */
7691 fprintf (file
, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
7692 "imgid: %u, patch: %u\n"),
7693 eisd_off
, eiha_off
, eihs_off
, eihi_off
,
7694 (unsigned)bfd_getl32 (eihd
.patchoff
));
7695 fprintf (file
, _(" fixup info rva: "));
7696 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.iafva
));
7697 fprintf (file
, _(", symbol vector rva: "));
7698 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.symvva
));
7699 eihvn_off
= bfd_getl32 (eihd
.version_array_off
);
7700 fprintf (file
, _("\n"
7701 " version array off: %u\n"),
7704 /* xgettext:c-format */
7705 _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
7706 (unsigned)bfd_getl32 (eihd
.imgiocnt
),
7707 (unsigned)bfd_getl32 (eihd
.iochancnt
),
7708 (unsigned)bfd_getl32 (eihd
.privreqs
+ 4),
7709 (unsigned)bfd_getl32 (eihd
.privreqs
+ 0));
7710 val
= (unsigned)bfd_getl32 (eihd
.lnkflags
);
7711 fprintf (file
, _(" linker flags: %08x:"), val
);
7712 if (val
& EIHD__M_LNKDEBUG
)
7713 fprintf (file
, " LNKDEBUG");
7714 if (val
& EIHD__M_LNKNOTFR
)
7715 fprintf (file
, " LNKNOTFR");
7716 if (val
& EIHD__M_NOP0BUFS
)
7717 fprintf (file
, " NOP0BUFS");
7718 if (val
& EIHD__M_PICIMG
)
7719 fprintf (file
, " PICIMG");
7720 if (val
& EIHD__M_P0IMAGE
)
7721 fprintf (file
, " P0IMAGE");
7722 if (val
& EIHD__M_DBGDMT
)
7723 fprintf (file
, " DBGDMT");
7724 if (val
& EIHD__M_INISHR
)
7725 fprintf (file
, " INISHR");
7726 if (val
& EIHD__M_XLATED
)
7727 fprintf (file
, " XLATED");
7728 if (val
& EIHD__M_BIND_CODE_SEC
)
7729 fprintf (file
, " BIND_CODE_SEC");
7730 if (val
& EIHD__M_BIND_DATA_SEC
)
7731 fprintf (file
, " BIND_DATA_SEC");
7732 if (val
& EIHD__M_MKTHREADS
)
7733 fprintf (file
, " MKTHREADS");
7734 if (val
& EIHD__M_UPCALLS
)
7735 fprintf (file
, " UPCALLS");
7736 if (val
& EIHD__M_OMV_READY
)
7737 fprintf (file
, " OMV_READY");
7738 if (val
& EIHD__M_EXT_BIND_SECT
)
7739 fprintf (file
, " EXT_BIND_SECT");
7740 fprintf (file
, "\n");
7741 /* xgettext:c-format */
7742 fprintf (file
, _(" ident: 0x%08x, sysver: 0x%08x, "
7743 "match ctrl: %u, symvect_size: %u\n"),
7744 (unsigned)bfd_getl32 (eihd
.ident
),
7745 (unsigned)bfd_getl32 (eihd
.sysver
),
7747 (unsigned)bfd_getl32 (eihd
.symvect_size
));
7748 fprintf (file
, _(" BPAGE: %u"),
7749 (unsigned)bfd_getl32 (eihd
.virt_mem_block_size
));
7750 if (val
& (EIHD__M_OMV_READY
| EIHD__M_EXT_BIND_SECT
))
7752 eihef_off
= bfd_getl32 (eihd
.ext_fixup_off
);
7753 eihnp_off
= bfd_getl32 (eihd
.noopt_psect_off
);
7754 /* xgettext:c-format */
7755 fprintf (file
, _(", ext fixup offset: %u, no_opt psect off: %u"),
7756 eihef_off
, eihnp_off
);
7758 fprintf (file
, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd
.alias
));
7762 struct vms_eihvn eihvn
;
7766 fprintf (file
, _("system version array information:\n"));
7767 if (bfd_seek (abfd
, (file_ptr
) eihvn_off
, SEEK_SET
)
7768 || bfd_bread (&eihvn
, sizeof (eihvn
), abfd
) != sizeof (eihvn
))
7770 fprintf (file
, _("cannot read EIHVN header\n"));
7773 mask
= bfd_getl32 (eihvn
.subsystem_mask
);
7774 for (j
= 0; j
< 32; j
++)
7775 if (mask
& (1 << j
))
7777 struct vms_eihvn_subversion ver
;
7778 if (bfd_bread (&ver
, sizeof (ver
), abfd
) != sizeof (ver
))
7780 fprintf (file
, _("cannot read EIHVN version\n"));
7783 fprintf (file
, _(" %02u "), j
);
7786 case EIHVN__BASE_IMAGE_BIT
:
7787 fputs (_("BASE_IMAGE "), file
);
7789 case EIHVN__MEMORY_MANAGEMENT_BIT
:
7790 fputs (_("MEMORY_MANAGEMENT"), file
);
7793 fputs (_("IO "), file
);
7795 case EIHVN__FILES_VOLUMES_BIT
:
7796 fputs (_("FILES_VOLUMES "), file
);
7798 case EIHVN__PROCESS_SCHED_BIT
:
7799 fputs (_("PROCESS_SCHED "), file
);
7801 case EIHVN__SYSGEN_BIT
:
7802 fputs (_("SYSGEN "), file
);
7804 case EIHVN__CLUSTERS_LOCKMGR_BIT
:
7805 fputs (_("CLUSTERS_LOCKMGR "), file
);
7807 case EIHVN__LOGICAL_NAMES_BIT
:
7808 fputs (_("LOGICAL_NAMES "), file
);
7810 case EIHVN__SECURITY_BIT
:
7811 fputs (_("SECURITY "), file
);
7813 case EIHVN__IMAGE_ACTIVATOR_BIT
:
7814 fputs (_("IMAGE_ACTIVATOR "), file
);
7816 case EIHVN__NETWORKS_BIT
:
7817 fputs (_("NETWORKS "), file
);
7819 case EIHVN__COUNTERS_BIT
:
7820 fputs (_("COUNTERS "), file
);
7822 case EIHVN__STABLE_BIT
:
7823 fputs (_("STABLE "), file
);
7825 case EIHVN__MISC_BIT
:
7826 fputs (_("MISC "), file
);
7828 case EIHVN__CPU_BIT
:
7829 fputs (_("CPU "), file
);
7831 case EIHVN__VOLATILE_BIT
:
7832 fputs (_("VOLATILE "), file
);
7834 case EIHVN__SHELL_BIT
:
7835 fputs (_("SHELL "), file
);
7837 case EIHVN__POSIX_BIT
:
7838 fputs (_("POSIX "), file
);
7840 case EIHVN__MULTI_PROCESSING_BIT
:
7841 fputs (_("MULTI_PROCESSING "), file
);
7843 case EIHVN__GALAXY_BIT
:
7844 fputs (_("GALAXY "), file
);
7847 fputs (_("*unknown* "), file
);
7850 fprintf (file
, ": %u.%u\n",
7851 (unsigned)bfd_getl16 (ver
.major
),
7852 (unsigned)bfd_getl16 (ver
.minor
));
7858 struct vms_eiha eiha
;
7860 if (bfd_seek (abfd
, (file_ptr
) eiha_off
, SEEK_SET
)
7861 || bfd_bread (&eiha
, sizeof (eiha
), abfd
) != sizeof (eiha
))
7863 fprintf (file
, _("cannot read EIHA\n"));
7866 fprintf (file
, _("Image activation: (size=%u)\n"),
7867 (unsigned)bfd_getl32 (eiha
.size
));
7868 /* xgettext:c-format */
7869 fprintf (file
, _(" First address : 0x%08x 0x%08x\n"),
7870 (unsigned)bfd_getl32 (eiha
.tfradr1_h
),
7871 (unsigned)bfd_getl32 (eiha
.tfradr1
));
7872 /* xgettext:c-format */
7873 fprintf (file
, _(" Second address: 0x%08x 0x%08x\n"),
7874 (unsigned)bfd_getl32 (eiha
.tfradr2_h
),
7875 (unsigned)bfd_getl32 (eiha
.tfradr2
));
7876 /* xgettext:c-format */
7877 fprintf (file
, _(" Third address : 0x%08x 0x%08x\n"),
7878 (unsigned)bfd_getl32 (eiha
.tfradr3_h
),
7879 (unsigned)bfd_getl32 (eiha
.tfradr3
));
7880 /* xgettext:c-format */
7881 fprintf (file
, _(" Fourth address: 0x%08x 0x%08x\n"),
7882 (unsigned)bfd_getl32 (eiha
.tfradr4_h
),
7883 (unsigned)bfd_getl32 (eiha
.tfradr4
));
7884 /* xgettext:c-format */
7885 fprintf (file
, _(" Shared image : 0x%08x 0x%08x\n"),
7886 (unsigned)bfd_getl32 (eiha
.inishr_h
),
7887 (unsigned)bfd_getl32 (eiha
.inishr
));
7891 struct vms_eihi eihi
;
7893 if (bfd_seek (abfd
, (file_ptr
) eihi_off
, SEEK_SET
)
7894 || bfd_bread (&eihi
, sizeof (eihi
), abfd
) != sizeof (eihi
))
7896 fprintf (file
, _("cannot read EIHI\n"));
7899 /* xgettext:c-format */
7900 fprintf (file
, _("Image identification: (major: %u, minor: %u)\n"),
7901 (unsigned)bfd_getl32 (eihi
.majorid
),
7902 (unsigned)bfd_getl32 (eihi
.minorid
));
7903 fprintf (file
, _(" image name : %.*s\n"),
7904 eihi
.imgnam
[0], eihi
.imgnam
+ 1);
7905 fprintf (file
, _(" link time : %s\n"),
7906 vms_time_to_str (eihi
.linktime
));
7907 fprintf (file
, _(" image ident : %.*s\n"),
7908 eihi
.imgid
[0], eihi
.imgid
+ 1);
7909 fprintf (file
, _(" linker ident : %.*s\n"),
7910 eihi
.linkid
[0], eihi
.linkid
+ 1);
7911 fprintf (file
, _(" image build ident: %.*s\n"),
7912 eihi
.imgbid
[0], eihi
.imgbid
+ 1);
7916 struct vms_eihs eihs
;
7918 if (bfd_seek (abfd
, (file_ptr
) eihs_off
, SEEK_SET
)
7919 || bfd_bread (&eihs
, sizeof (eihs
), abfd
) != sizeof (eihs
))
7921 fprintf (file
, _("cannot read EIHS\n"));
7924 /* xgettext:c-format */
7925 fprintf (file
, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
7926 (unsigned)bfd_getl32 (eihs
.majorid
),
7927 (unsigned)bfd_getl32 (eihs
.minorid
));
7928 dst_vbn
= bfd_getl32 (eihs
.dstvbn
);
7929 dst_size
= bfd_getl32 (eihs
.dstsize
);
7930 /* xgettext:c-format */
7931 fprintf (file
, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
7932 dst_vbn
, dst_size
, dst_size
);
7933 gst_vbn
= bfd_getl32 (eihs
.gstvbn
);
7934 gst_size
= bfd_getl32 (eihs
.gstsize
);
7935 /* xgettext:c-format */
7936 fprintf (file
, _(" global symbol table: vbn: %u, records: %u\n"),
7938 dmt_vbn
= bfd_getl32 (eihs
.dmtvbn
);
7939 dmt_size
= bfd_getl32 (eihs
.dmtsize
);
7940 /* xgettext:c-format */
7941 fprintf (file
, _(" debug module table : vbn: %u, size: %u\n"),
7944 while (eisd_off
!= 0)
7946 struct vms_eisd eisd
;
7951 if (bfd_seek (abfd
, (file_ptr
) eisd_off
, SEEK_SET
)
7952 || bfd_bread (&eisd
, sizeof (eisd
), abfd
) != sizeof (eisd
))
7954 fprintf (file
, _("cannot read EISD\n"));
7957 len
= (unsigned)bfd_getl32 (eisd
.eisdsize
);
7958 if (len
!= (unsigned)-1)
7962 eisd_off
= (eisd_off
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
7964 /* xgettext:c-format */
7965 fprintf (file
, _("Image section descriptor: (major: %u, minor: %u, "
7966 "size: %u, offset: %u)\n"),
7967 (unsigned)bfd_getl32 (eisd
.majorid
),
7968 (unsigned)bfd_getl32 (eisd
.minorid
),
7972 /* xgettext:c-format */
7973 fprintf (file
, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
7974 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 4),
7975 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 0),
7976 (unsigned)bfd_getl32 (eisd
.secsize
));
7977 val
= (unsigned)bfd_getl32 (eisd
.flags
);
7978 fprintf (file
, _(" flags: 0x%04x"), val
);
7979 if (val
& EISD__M_GBL
)
7980 fprintf (file
, " GBL");
7981 if (val
& EISD__M_CRF
)
7982 fprintf (file
, " CRF");
7983 if (val
& EISD__M_DZRO
)
7984 fprintf (file
, " DZRO");
7985 if (val
& EISD__M_WRT
)
7986 fprintf (file
, " WRT");
7987 if (val
& EISD__M_INITALCODE
)
7988 fprintf (file
, " INITALCODE");
7989 if (val
& EISD__M_BASED
)
7990 fprintf (file
, " BASED");
7991 if (val
& EISD__M_FIXUPVEC
)
7992 fprintf (file
, " FIXUPVEC");
7993 if (val
& EISD__M_RESIDENT
)
7994 fprintf (file
, " RESIDENT");
7995 if (val
& EISD__M_VECTOR
)
7996 fprintf (file
, " VECTOR");
7997 if (val
& EISD__M_PROTECT
)
7998 fprintf (file
, " PROTECT");
7999 if (val
& EISD__M_LASTCLU
)
8000 fprintf (file
, " LASTCLU");
8001 if (val
& EISD__M_EXE
)
8002 fprintf (file
, " EXE");
8003 if (val
& EISD__M_NONSHRADR
)
8004 fprintf (file
, " NONSHRADR");
8005 if (val
& EISD__M_QUAD_LENGTH
)
8006 fprintf (file
, " QUAD_LENGTH");
8007 if (val
& EISD__M_ALLOC_64BIT
)
8008 fprintf (file
, " ALLOC_64BIT");
8009 fprintf (file
, "\n");
8010 if (val
& EISD__M_FIXUPVEC
)
8012 eiaf_vbn
= bfd_getl32 (eisd
.vbn
);
8013 eiaf_size
= bfd_getl32 (eisd
.secsize
);
8015 /* xgettext:c-format */
8016 fprintf (file
, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
8017 (unsigned)bfd_getl32 (eisd
.vbn
),
8018 eisd
.pfc
, eisd
.matchctl
, eisd
.type
);
8021 case EISD__K_NORMAL
:
8022 fputs (_("NORMAL"), file
);
8024 case EISD__K_SHRFXD
:
8025 fputs (_("SHRFXD"), file
);
8027 case EISD__K_PRVFXD
:
8028 fputs (_("PRVFXD"), file
);
8030 case EISD__K_SHRPIC
:
8031 fputs (_("SHRPIC"), file
);
8033 case EISD__K_PRVPIC
:
8034 fputs (_("PRVPIC"), file
);
8036 case EISD__K_USRSTACK
:
8037 fputs (_("USRSTACK"), file
);
8040 fputs (_("*unknown*"), file
);
8043 fputs (_(")\n"), file
);
8044 if (val
& EISD__M_GBL
)
8045 /* xgettext:c-format */
8046 fprintf (file
, _(" ident: 0x%08x, name: %.*s\n"),
8047 (unsigned)bfd_getl32 (eisd
.ident
),
8048 eisd
.gblnam
[0], eisd
.gblnam
+ 1);
8054 if (bfd_seek (abfd
, (file_ptr
) (dmt_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
8056 fprintf (file
, _("cannot read DMT\n"));
8060 fprintf (file
, _("Debug module table:\n"));
8062 while (dmt_size
> 0)
8064 struct vms_dmt_header dmth
;
8067 if (bfd_bread (&dmth
, sizeof (dmth
), abfd
) != sizeof (dmth
))
8069 fprintf (file
, _("cannot read DMT header\n"));
8072 count
= bfd_getl16 (dmth
.psect_count
);
8074 /* xgettext:c-format */
8075 _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
8076 (unsigned)bfd_getl32 (dmth
.modbeg
),
8077 (unsigned)bfd_getl32 (dmth
.size
), count
);
8078 dmt_size
-= sizeof (dmth
);
8081 struct vms_dmt_psect dmtp
;
8083 if (bfd_bread (&dmtp
, sizeof (dmtp
), abfd
) != sizeof (dmtp
))
8085 fprintf (file
, _("cannot read DMT psect\n"));
8088 /* xgettext:c-format */
8089 fprintf (file
, _(" psect start: 0x%08x, length: %u\n"),
8090 (unsigned)bfd_getl32 (dmtp
.start
),
8091 (unsigned)bfd_getl32 (dmtp
.length
));
8093 dmt_size
-= sizeof (dmtp
);
8100 if (bfd_seek (abfd
, (file_ptr
) (dst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
8102 fprintf (file
, _("cannot read DST\n"));
8106 evax_bfd_print_dst (abfd
, dst_size
, file
);
8110 if (bfd_seek (abfd
, (file_ptr
) (gst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
8112 fprintf (file
, _("cannot read GST\n"));
8116 fprintf (file
, _("Global symbol table:\n"));
8117 evax_bfd_print_eobj (abfd
, file
);
8122 struct vms_eiaf
*eiaf
;
8123 unsigned int qrelfixoff
;
8124 unsigned int lrelfixoff
;
8125 unsigned int qdotadroff
;
8126 unsigned int ldotadroff
;
8127 unsigned int shrimgcnt
;
8128 unsigned int shlstoff
;
8129 unsigned int codeadroff
;
8130 unsigned int lpfixoff
;
8131 unsigned int chgprtoff
;
8132 file_ptr f_off
= (file_ptr
) (eiaf_vbn
- 1) * VMS_BLOCK_SIZE
;
8134 if (bfd_seek (abfd
, f_off
, SEEK_SET
) != 0
8135 || (buf
= _bfd_malloc_and_read (abfd
, eiaf_size
, eiaf_size
)) == NULL
)
8137 fprintf (file
, _("cannot read EIHA\n"));
8140 eiaf
= (struct vms_eiaf
*)buf
;
8142 /* xgettext:c-format */
8143 _("Image activator fixup: (major: %u, minor: %u)\n"),
8144 (unsigned)bfd_getl32 (eiaf
->majorid
),
8145 (unsigned)bfd_getl32 (eiaf
->minorid
));
8146 /* xgettext:c-format */
8147 fprintf (file
, _(" iaflink : 0x%08x %08x\n"),
8148 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 0),
8149 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 4));
8150 /* xgettext:c-format */
8151 fprintf (file
, _(" fixuplnk: 0x%08x %08x\n"),
8152 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 0),
8153 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 4));
8154 fprintf (file
, _(" size : %u\n"),
8155 (unsigned)bfd_getl32 (eiaf
->size
));
8156 fprintf (file
, _(" flags: 0x%08x\n"),
8157 (unsigned)bfd_getl32 (eiaf
->flags
));
8158 qrelfixoff
= bfd_getl32 (eiaf
->qrelfixoff
);
8159 lrelfixoff
= bfd_getl32 (eiaf
->lrelfixoff
);
8160 /* xgettext:c-format */
8161 fprintf (file
, _(" qrelfixoff: %5u, lrelfixoff: %5u\n"),
8162 qrelfixoff
, lrelfixoff
);
8163 qdotadroff
= bfd_getl32 (eiaf
->qdotadroff
);
8164 ldotadroff
= bfd_getl32 (eiaf
->ldotadroff
);
8165 /* xgettext:c-format */
8166 fprintf (file
, _(" qdotadroff: %5u, ldotadroff: %5u\n"),
8167 qdotadroff
, ldotadroff
);
8168 codeadroff
= bfd_getl32 (eiaf
->codeadroff
);
8169 lpfixoff
= bfd_getl32 (eiaf
->lpfixoff
);
8170 /* xgettext:c-format */
8171 fprintf (file
, _(" codeadroff: %5u, lpfixoff : %5u\n"),
8172 codeadroff
, lpfixoff
);
8173 chgprtoff
= bfd_getl32 (eiaf
->chgprtoff
);
8174 fprintf (file
, _(" chgprtoff : %5u\n"), chgprtoff
);
8175 shrimgcnt
= bfd_getl32 (eiaf
->shrimgcnt
);
8176 shlstoff
= bfd_getl32 (eiaf
->shlstoff
);
8177 /* xgettext:c-format */
8178 fprintf (file
, _(" shlstoff : %5u, shrimgcnt : %5u\n"),
8179 shlstoff
, shrimgcnt
);
8180 /* xgettext:c-format */
8181 fprintf (file
, _(" shlextra : %5u, permctx : %5u\n"),
8182 (unsigned)bfd_getl32 (eiaf
->shlextra
),
8183 (unsigned)bfd_getl32 (eiaf
->permctx
));
8184 fprintf (file
, _(" base_va : 0x%08x\n"),
8185 (unsigned)bfd_getl32 (eiaf
->base_va
));
8186 fprintf (file
, _(" lppsbfixoff: %5u\n"),
8187 (unsigned)bfd_getl32 (eiaf
->lppsbfixoff
));
8191 struct vms_shl
*shl
= (struct vms_shl
*)(buf
+ shlstoff
);
8194 fprintf (file
, _(" Shareable images:\n"));
8195 for (j
= 0; j
< shrimgcnt
; j
++, shl
++)
8198 /* xgettext:c-format */
8199 _(" %u: size: %u, flags: 0x%02x, name: %.*s\n"),
8200 j
, shl
->size
, shl
->flags
,
8201 shl
->imgnam
[0], shl
->imgnam
+ 1);
8204 if (qrelfixoff
!= 0)
8206 fprintf (file
, _(" quad-word relocation fixups:\n"));
8207 evax_bfd_print_relocation_records (file
, buf
+ qrelfixoff
, 8);
8209 if (lrelfixoff
!= 0)
8211 fprintf (file
, _(" long-word relocation fixups:\n"));
8212 evax_bfd_print_relocation_records (file
, buf
+ lrelfixoff
, 4);
8214 if (qdotadroff
!= 0)
8216 fprintf (file
, _(" quad-word .address reference fixups:\n"));
8217 evax_bfd_print_address_fixups (file
, buf
+ qdotadroff
);
8219 if (ldotadroff
!= 0)
8221 fprintf (file
, _(" long-word .address reference fixups:\n"));
8222 evax_bfd_print_address_fixups (file
, buf
+ ldotadroff
);
8224 if (codeadroff
!= 0)
8226 fprintf (file
, _(" Code Address Reference Fixups:\n"));
8227 evax_bfd_print_reference_fixups (file
, buf
+ codeadroff
);
8231 fprintf (file
, _(" Linkage Pairs Reference Fixups:\n"));
8232 evax_bfd_print_reference_fixups (file
, buf
+ lpfixoff
);
8236 unsigned int count
= (unsigned)bfd_getl32 (buf
+ chgprtoff
);
8237 struct vms_eicp
*eicp
= (struct vms_eicp
*)(buf
+ chgprtoff
+ 4);
8240 fprintf (file
, _(" Change Protection (%u entries):\n"), count
);
8241 for (j
= 0; j
< count
; j
++, eicp
++)
8243 unsigned int prot
= bfd_getl32 (eicp
->newprt
);
8245 /* xgettext:c-format */
8246 _(" base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
8247 (unsigned)bfd_getl32 (eicp
->baseva
+ 4),
8248 (unsigned)bfd_getl32 (eicp
->baseva
+ 0),
8249 (unsigned)bfd_getl32 (eicp
->size
),
8250 (unsigned)bfd_getl32 (eicp
->newprt
));
8254 fprintf (file
, "NA");
8256 case PRT__C_RESERVED
:
8257 fprintf (file
, "RES");
8260 fprintf (file
, "KW");
8263 fprintf (file
, "KR");
8266 fprintf (file
, "UW");
8269 fprintf (file
, "EW");
8272 fprintf (file
, "ERKW");
8275 fprintf (file
, "ER");
8278 fprintf (file
, "SW");
8281 fprintf (file
, "SREW");
8284 fprintf (file
, "SRKW");
8287 fprintf (file
, "SR");
8290 fprintf (file
, "URSW");
8293 fprintf (file
, "UREW");
8296 fprintf (file
, "URKW");
8299 fprintf (file
, "UR");
8313 vms_bfd_print_private_bfd_data (bfd
*abfd
, void *ptr
)
8315 FILE *file
= (FILE *)ptr
;
8317 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
8318 evax_bfd_print_image (abfd
, file
);
8321 if (bfd_seek (abfd
, 0, SEEK_SET
))
8323 evax_bfd_print_eobj (abfd
, file
);
8330 /* Slurp ETIR/EDBG/ETBT VMS object records. */
8333 alpha_vms_read_sections_content (bfd
*abfd
, struct bfd_link_info
*info
)
8335 asection
*cur_section
;
8336 file_ptr cur_offset
;
8337 asection
*dst_section
;
8338 file_ptr dst_offset
;
8340 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
8346 dst_section
= PRIV (dst_section
);
8350 if (info
->strip
== strip_all
|| info
->strip
== strip_debugger
)
8352 /* Discard the DST section. */
8356 else if (dst_section
)
8358 dst_offset
= dst_section
->output_offset
;
8359 dst_section
= dst_section
->output_section
;
8368 type
= _bfd_vms_get_object_record (abfd
);
8371 vms_debug2 ((2, "next_record failed\n"));
8377 PRIV (image_section
) = cur_section
;
8378 PRIV (image_offset
) = cur_offset
;
8379 res
= _bfd_vms_slurp_etir (abfd
, info
);
8380 cur_section
= PRIV (image_section
);
8381 cur_offset
= PRIV (image_offset
);
8385 if (dst_section
== NULL
)
8387 PRIV (image_section
) = dst_section
;
8388 PRIV (image_offset
) = dst_offset
;
8389 res
= _bfd_vms_slurp_etir (abfd
, info
);
8390 dst_offset
= PRIV (image_offset
);
8399 vms_debug2 ((2, "slurp eobj type %d failed\n", type
));
8406 alpha_vms_sizeof_headers (bfd
*abfd ATTRIBUTE_UNUSED
,
8407 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8412 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
8415 alpha_vms_add_fixup_lp (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
8417 struct alpha_vms_shlib_el
*sl
;
8418 asection
*sect
= PRIV2 (src
, image_section
);
8419 file_ptr offset
= PRIV2 (src
, image_offset
);
8422 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8423 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8424 sl
->has_fixups
= TRUE
;
8425 p
= VEC_APPEND (sl
->lp
, bfd_vma
);
8428 *p
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
8429 sect
->output_section
->flags
|= SEC_RELOC
;
8433 /* Add a code address fixup at address SECT + OFFSET to SHLIB. */
8436 alpha_vms_add_fixup_ca (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
8438 struct alpha_vms_shlib_el
*sl
;
8439 asection
*sect
= PRIV2 (src
, image_section
);
8440 file_ptr offset
= PRIV2 (src
, image_offset
);
8443 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8444 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8445 sl
->has_fixups
= TRUE
;
8446 p
= VEC_APPEND (sl
->ca
, bfd_vma
);
8449 *p
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
8450 sect
->output_section
->flags
|= SEC_RELOC
;
8454 /* Add a quad word relocation fixup at address SECT + OFFSET to SHLIB. */
8457 alpha_vms_add_fixup_qr (struct bfd_link_info
*info
, bfd
*src
,
8458 bfd
*shlib
, bfd_vma vec
)
8460 struct alpha_vms_shlib_el
*sl
;
8461 struct alpha_vms_vma_ref
*r
;
8462 asection
*sect
= PRIV2 (src
, image_section
);
8463 file_ptr offset
= PRIV2 (src
, image_offset
);
8465 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8466 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8467 sl
->has_fixups
= TRUE
;
8468 r
= VEC_APPEND (sl
->qr
, struct alpha_vms_vma_ref
);
8471 r
->vma
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
8473 sect
->output_section
->flags
|= SEC_RELOC
;
8478 alpha_vms_add_fixup_lr (struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
8479 unsigned int shr ATTRIBUTE_UNUSED
,
8480 bfd_vma vec ATTRIBUTE_UNUSED
)
8482 /* Not yet supported. */
8486 /* Add relocation. FIXME: Not yet emitted. */
8489 alpha_vms_add_lw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8495 alpha_vms_add_qw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8500 static struct bfd_hash_entry
*
8501 alpha_vms_link_hash_newfunc (struct bfd_hash_entry
*entry
,
8502 struct bfd_hash_table
*table
,
8505 struct alpha_vms_link_hash_entry
*ret
=
8506 (struct alpha_vms_link_hash_entry
*) entry
;
8508 /* Allocate the structure if it has not already been allocated by a
8511 ret
= ((struct alpha_vms_link_hash_entry
*)
8512 bfd_hash_allocate (table
,
8513 sizeof (struct alpha_vms_link_hash_entry
)));
8517 /* Call the allocation method of the superclass. */
8518 ret
= ((struct alpha_vms_link_hash_entry
*)
8519 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
8524 return (struct bfd_hash_entry
*) ret
;
8528 alpha_vms_bfd_link_hash_table_free (bfd
*abfd
)
8530 struct alpha_vms_link_hash_table
*t
;
8533 t
= (struct alpha_vms_link_hash_table
*) abfd
->link
.hash
;
8534 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8536 struct alpha_vms_shlib_el
*shlib
;
8538 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8539 free (&VEC_EL (shlib
->ca
, bfd_vma
, 0));
8540 free (&VEC_EL (shlib
->lp
, bfd_vma
, 0));
8541 free (&VEC_EL (shlib
->qr
, struct alpha_vms_vma_ref
, 0));
8543 free (&VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, 0));
8545 _bfd_generic_link_hash_table_free (abfd
);
8548 /* Create an Alpha/VMS link hash table. */
8550 static struct bfd_link_hash_table
*
8551 alpha_vms_bfd_link_hash_table_create (bfd
*abfd
)
8553 struct alpha_vms_link_hash_table
*ret
;
8554 size_t amt
= sizeof (struct alpha_vms_link_hash_table
);
8556 ret
= (struct alpha_vms_link_hash_table
*) bfd_malloc (amt
);
8559 if (!_bfd_link_hash_table_init (&ret
->root
, abfd
,
8560 alpha_vms_link_hash_newfunc
,
8561 sizeof (struct alpha_vms_link_hash_entry
)))
8567 VEC_INIT (ret
->shrlibs
);
8569 ret
->root
.hash_table_free
= alpha_vms_bfd_link_hash_table_free
;
8575 alpha_vms_link_add_object_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8579 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
8581 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
8582 struct alpha_vms_link_hash_entry
*h
;
8583 struct bfd_link_hash_entry
*h_root
;
8586 if (!alpha_vms_convert_symbol (abfd
, e
, &sym
))
8589 if ((e
->flags
& EGSY__V_DEF
) && abfd
->selective_search
)
8591 /* In selective_search mode, only add definition that are
8593 h
= (struct alpha_vms_link_hash_entry
*)bfd_link_hash_lookup
8594 (info
->hash
, sym
.name
, FALSE
, FALSE
, FALSE
);
8595 if (h
== NULL
|| h
->root
.type
!= bfd_link_hash_undefined
)
8601 h_root
= (struct bfd_link_hash_entry
*) h
;
8602 if (!_bfd_generic_link_add_one_symbol (info
, abfd
, sym
.name
, sym
.flags
,
8603 sym
.section
, sym
.value
, NULL
,
8604 FALSE
, FALSE
, &h_root
))
8606 h
= (struct alpha_vms_link_hash_entry
*) h_root
;
8608 if ((e
->flags
& EGSY__V_DEF
)
8610 && abfd
->xvec
== info
->output_bfd
->xvec
)
8614 if (abfd
->flags
& DYNAMIC
)
8616 struct alpha_vms_shlib_el
*shlib
;
8618 /* We do not want to include any of the sections in a dynamic
8619 object in the output file. See comment in elflink.c. */
8620 bfd_section_list_clear (abfd
);
8622 shlib
= VEC_APPEND (alpha_vms_link_hash (info
)->shrlibs
,
8623 struct alpha_vms_shlib_el
);
8627 VEC_INIT (shlib
->ca
);
8628 VEC_INIT (shlib
->lp
);
8629 VEC_INIT (shlib
->qr
);
8630 PRIV (shr_index
) = VEC_COUNT (alpha_vms_link_hash (info
)->shrlibs
) - 1;
8637 alpha_vms_link_add_archive_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8640 struct bfd_link_hash_entry
**pundef
;
8641 struct bfd_link_hash_entry
**next_pundef
;
8643 /* We only accept VMS libraries. */
8644 if (info
->output_bfd
->xvec
!= abfd
->xvec
)
8646 bfd_set_error (bfd_error_wrong_format
);
8650 /* The archive_pass field in the archive itself is used to
8651 initialize PASS, since we may search the same archive multiple
8653 pass
= ++abfd
->archive_pass
;
8655 /* Look through the list of undefined symbols. */
8656 for (pundef
= &info
->hash
->undefs
; *pundef
!= NULL
; pundef
= next_pundef
)
8658 struct bfd_link_hash_entry
*h
;
8664 next_pundef
= &(*pundef
)->u
.undef
.next
;
8666 /* When a symbol is defined, it is not necessarily removed from
8668 if (h
->type
!= bfd_link_hash_undefined
8669 && h
->type
!= bfd_link_hash_common
)
8671 /* Remove this entry from the list, for general cleanliness
8672 and because we are going to look through the list again
8673 if we search any more libraries. We can't remove the
8674 entry if it is the tail, because that would lose any
8675 entries we add to the list later on. */
8676 if (*pundef
!= info
->hash
->undefs_tail
)
8678 *pundef
= *next_pundef
;
8679 next_pundef
= pundef
;
8684 /* Look for this symbol in the archive hash table. */
8685 symidx
= _bfd_vms_lib_find_symbol (abfd
, h
->root
.string
);
8686 if (symidx
== BFD_NO_MORE_SYMBOLS
)
8688 /* Nothing in this slot. */
8692 element
= bfd_get_elt_at_index (abfd
, symidx
);
8693 if (element
== NULL
)
8696 if (element
->archive_pass
== -1 || element
->archive_pass
== pass
)
8698 /* Next symbol if this archive is wrong or already handled. */
8702 if (! bfd_check_format (element
, bfd_object
))
8704 element
->archive_pass
= -1;
8708 orig_element
= element
;
8709 if (bfd_is_thin_archive (abfd
))
8711 element
= _bfd_vms_lib_get_imagelib_file (element
);
8712 if (element
== NULL
|| !bfd_check_format (element
, bfd_object
))
8714 orig_element
->archive_pass
= -1;
8719 /* Unlike the generic linker, we know that this element provides
8720 a definition for an undefined symbol and we know that we want
8721 to include it. We don't need to check anything. */
8722 if (!(*info
->callbacks
8723 ->add_archive_element
) (info
, element
, h
->root
.string
, &element
))
8725 if (!alpha_vms_link_add_object_symbols (element
, info
))
8728 orig_element
->archive_pass
= pass
;
8735 alpha_vms_bfd_link_add_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8737 switch (bfd_get_format (abfd
))
8740 vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
8742 return alpha_vms_link_add_object_symbols (abfd
, info
);
8745 vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
8747 return alpha_vms_link_add_archive_symbols (abfd
, info
);
8750 bfd_set_error (bfd_error_wrong_format
);
8756 alpha_vms_build_fixups (struct bfd_link_info
*info
)
8758 struct alpha_vms_link_hash_table
*t
= alpha_vms_link_hash (info
);
8759 unsigned char *content
;
8761 unsigned int sz
= 0;
8762 unsigned int lp_sz
= 0;
8763 unsigned int ca_sz
= 0;
8764 unsigned int qr_sz
= 0;
8765 unsigned int shrimg_cnt
= 0;
8766 unsigned int chgprt_num
= 0;
8767 unsigned int chgprt_sz
= 0;
8768 struct vms_eiaf
*eiaf
;
8772 /* Shared libraries. */
8773 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8775 struct alpha_vms_shlib_el
*shlib
;
8777 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8779 if (!shlib
->has_fixups
)
8784 if (VEC_COUNT (shlib
->ca
) > 0)
8786 /* Header + entries. */
8788 ca_sz
+= VEC_COUNT (shlib
->ca
) * 4;
8790 if (VEC_COUNT (shlib
->lp
) > 0)
8792 /* Header + entries. */
8794 lp_sz
+= VEC_COUNT (shlib
->lp
) * 4;
8796 if (VEC_COUNT (shlib
->qr
) > 0)
8798 /* Header + entries. */
8800 qr_sz
+= VEC_COUNT (shlib
->qr
) * 8;
8811 /* Finish now if there is no content. */
8812 if (ca_sz
+ lp_sz
+ qr_sz
== 0)
8815 /* Add an eicp entry for the fixup itself. */
8817 for (sec
= info
->output_bfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
8819 /* This isect could be made RO or EXE after relocations are applied. */
8820 if ((sec
->flags
& SEC_RELOC
) != 0
8821 && (sec
->flags
& (SEC_CODE
| SEC_READONLY
)) != 0)
8824 chgprt_sz
= 4 + chgprt_num
* sizeof (struct vms_eicp
);
8826 /* Allocate section content (round-up size) */
8827 sz
= sizeof (struct vms_eiaf
) + shrimg_cnt
* sizeof (struct vms_shl
)
8828 + ca_sz
+ lp_sz
+ qr_sz
+ chgprt_sz
;
8829 sz
= (sz
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
8830 content
= bfd_zalloc (info
->output_bfd
, sz
);
8831 if (content
== NULL
)
8834 sec
= alpha_vms_link_hash (info
)->fixup
;
8835 sec
->contents
= content
;
8838 eiaf
= (struct vms_eiaf
*)content
;
8839 off
= sizeof (struct vms_eiaf
);
8840 bfd_putl32 (0, eiaf
->majorid
);
8841 bfd_putl32 (0, eiaf
->minorid
);
8842 bfd_putl32 (0, eiaf
->iaflink
);
8843 bfd_putl32 (0, eiaf
->fixuplnk
);
8844 bfd_putl32 (sizeof (struct vms_eiaf
), eiaf
->size
);
8845 bfd_putl32 (0, eiaf
->flags
);
8846 bfd_putl32 (0, eiaf
->qrelfixoff
);
8847 bfd_putl32 (0, eiaf
->lrelfixoff
);
8848 bfd_putl32 (0, eiaf
->qdotadroff
);
8849 bfd_putl32 (0, eiaf
->ldotadroff
);
8850 bfd_putl32 (0, eiaf
->codeadroff
);
8851 bfd_putl32 (0, eiaf
->lpfixoff
);
8852 bfd_putl32 (0, eiaf
->chgprtoff
);
8853 bfd_putl32 (shrimg_cnt
? off
: 0, eiaf
->shlstoff
);
8854 bfd_putl32 (shrimg_cnt
, eiaf
->shrimgcnt
);
8855 bfd_putl32 (0, eiaf
->shlextra
);
8856 bfd_putl32 (0, eiaf
->permctx
);
8857 bfd_putl32 (0, eiaf
->base_va
);
8858 bfd_putl32 (0, eiaf
->lppsbfixoff
);
8865 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8867 struct alpha_vms_shlib_el
*shlib
;
8868 struct vms_shl
*shl
;
8870 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8872 if (!shlib
->has_fixups
)
8875 /* Renumber shared images. */
8876 PRIV2 (shlib
->abfd
, shr_index
) = shrimg_cnt
++;
8878 shl
= (struct vms_shl
*)(content
+ off
);
8879 bfd_putl32 (0, shl
->baseva
);
8880 bfd_putl32 (0, shl
->shlptr
);
8881 bfd_putl32 (0, shl
->ident
);
8882 bfd_putl32 (0, shl
->permctx
);
8883 shl
->size
= sizeof (struct vms_shl
);
8884 bfd_putl16 (0, shl
->fill_1
);
8886 bfd_putl32 (0, shl
->icb
);
8887 shl
->imgnam
[0] = strlen (PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
));
8888 memcpy (shl
->imgnam
+ 1, PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
),
8891 off
+= sizeof (struct vms_shl
);
8897 bfd_putl32 (off
, eiaf
->codeadroff
);
8899 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8901 struct alpha_vms_shlib_el
*shlib
;
8904 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8906 if (VEC_COUNT (shlib
->ca
) == 0)
8909 bfd_putl32 (VEC_COUNT (shlib
->ca
), content
+ off
);
8910 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8913 for (j
= 0; j
< VEC_COUNT (shlib
->ca
); j
++)
8915 bfd_putl32 (VEC_EL (shlib
->ca
, bfd_vma
, j
) - t
->base_addr
,
8921 bfd_putl32 (0, content
+ off
);
8922 bfd_putl32 (0, content
+ off
+ 4);
8929 bfd_putl32 (off
, eiaf
->lpfixoff
);
8931 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8933 struct alpha_vms_shlib_el
*shlib
;
8936 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8938 if (VEC_COUNT (shlib
->lp
) == 0)
8941 bfd_putl32 (VEC_COUNT (shlib
->lp
), content
+ off
);
8942 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8945 for (j
= 0; j
< VEC_COUNT (shlib
->lp
); j
++)
8947 bfd_putl32 (VEC_EL (shlib
->lp
, bfd_vma
, j
) - t
->base_addr
,
8953 bfd_putl32 (0, content
+ off
);
8954 bfd_putl32 (0, content
+ off
+ 4);
8961 bfd_putl32 (off
, eiaf
->qdotadroff
);
8963 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8965 struct alpha_vms_shlib_el
*shlib
;
8968 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8970 if (VEC_COUNT (shlib
->qr
) == 0)
8973 bfd_putl32 (VEC_COUNT (shlib
->qr
), content
+ off
);
8974 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8977 for (j
= 0; j
< VEC_COUNT (shlib
->qr
); j
++)
8979 struct alpha_vms_vma_ref
*r
;
8980 r
= &VEC_EL (shlib
->qr
, struct alpha_vms_vma_ref
, j
);
8981 bfd_putl32 (r
->vma
- t
->base_addr
, content
+ off
);
8982 bfd_putl32 (r
->ref
, content
+ off
+ 4);
8987 bfd_putl32 (0, content
+ off
);
8988 bfd_putl32 (0, content
+ off
+ 4);
8993 /* Write the change protection table. */
8994 bfd_putl32 (off
, eiaf
->chgprtoff
);
8995 bfd_putl32 (chgprt_num
, content
+ off
);
8998 for (sec
= info
->output_bfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
9000 struct vms_eicp
*eicp
;
9003 if ((sec
->flags
& SEC_LINKER_CREATED
) != 0 &&
9004 strcmp (sec
->name
, "$FIXUP$") == 0)
9006 else if ((sec
->flags
& SEC_RELOC
) != 0
9007 && (sec
->flags
& (SEC_CODE
| SEC_READONLY
)) != 0)
9012 eicp
= (struct vms_eicp
*)(content
+ off
);
9013 bfd_putl64 (sec
->vma
- t
->base_addr
, eicp
->baseva
);
9014 bfd_putl32 ((sec
->size
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1),
9016 bfd_putl32 (prot
, eicp
->newprt
);
9017 off
+= sizeof (struct vms_eicp
);
9023 /* Called by bfd_hash_traverse to fill the symbol table.
9024 Return FALSE in case of failure. */
9027 alpha_vms_link_output_symbol (struct bfd_hash_entry
*bh
, void *infov
)
9029 struct bfd_link_hash_entry
*hc
= (struct bfd_link_hash_entry
*) bh
;
9030 struct bfd_link_info
*info
= (struct bfd_link_info
*)infov
;
9031 struct alpha_vms_link_hash_entry
*h
;
9032 struct vms_symbol_entry
*sym
;
9034 if (hc
->type
== bfd_link_hash_warning
)
9037 if (hc
->type
== bfd_link_hash_new
)
9040 h
= (struct alpha_vms_link_hash_entry
*) hc
;
9042 switch (h
->root
.type
)
9044 case bfd_link_hash_undefined
:
9046 case bfd_link_hash_new
:
9047 case bfd_link_hash_warning
:
9049 case bfd_link_hash_undefweak
:
9051 case bfd_link_hash_defined
:
9052 case bfd_link_hash_defweak
:
9054 asection
*sec
= h
->root
.u
.def
.section
;
9056 /* FIXME: this is certainly a symbol from a dynamic library. */
9057 if (bfd_is_abs_section (sec
))
9060 if (sec
->owner
->flags
& DYNAMIC
)
9064 case bfd_link_hash_common
:
9066 case bfd_link_hash_indirect
:
9070 /* Do not write not kept symbols. */
9071 if (info
->strip
== strip_some
9072 && bfd_hash_lookup (info
->keep_hash
, h
->root
.root
.string
,
9073 FALSE
, FALSE
) != NULL
)
9078 /* This symbol doesn't come from a VMS object. So we suppose it is
9080 int len
= strlen (h
->root
.root
.string
);
9082 sym
= (struct vms_symbol_entry
*)bfd_zalloc (info
->output_bfd
,
9083 sizeof (*sym
) + len
);
9087 memcpy (sym
->name
, h
->root
.root
.string
, len
);
9089 sym
->owner
= info
->output_bfd
;
9091 sym
->typ
= EGSD__C_SYMG
;
9093 sym
->flags
= EGSY__V_DEF
| EGSY__V_REL
;
9094 sym
->symbol_vector
= h
->root
.u
.def
.value
;
9095 sym
->section
= h
->root
.u
.def
.section
;
9096 sym
->value
= h
->root
.u
.def
.value
;
9101 if (!add_symbol_entry (info
->output_bfd
, sym
))
9108 alpha_vms_bfd_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
9111 struct bfd_link_order
*p
;
9119 if (bfd_link_relocatable (info
))
9121 /* FIXME: we do not yet support relocatable link. It is not obvious
9122 how to do it for debug infos. */
9123 (*info
->callbacks
->einfo
)(_("%P: relocatable link is not supported\n"));
9127 abfd
->outsymbols
= NULL
;
9130 /* Mark all sections which will be included in the output file. */
9131 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9132 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9133 if (p
->type
== bfd_indirect_link_order
)
9134 p
->u
.indirect
.section
->linker_mark
= TRUE
;
9137 /* Handle all the link order information for the sections. */
9138 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9140 printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
9141 o
->name
, (unsigned)o
->vma
, (unsigned)o
->flags
);
9143 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9145 printf (" at 0x%08x - 0x%08x: ",
9146 (unsigned)p
->offset
, (unsigned)(p
->offset
+ p
->size
- 1));
9149 case bfd_section_reloc_link_order
:
9150 case bfd_symbol_reloc_link_order
:
9151 printf (" section/symbol reloc\n");
9153 case bfd_indirect_link_order
:
9154 printf (" section %s of %s\n",
9155 p
->u
.indirect
.section
->name
,
9156 p
->u
.indirect
.section
->owner
->filename
);
9158 case bfd_data_link_order
:
9159 printf (" explicit data\n");
9162 printf (" *unknown* type %u\n", p
->type
);
9169 /* Generate the symbol table. */
9170 BFD_ASSERT (PRIV (syms
) == NULL
);
9171 if (info
->strip
!= strip_all
)
9172 bfd_hash_traverse (&info
->hash
->table
, alpha_vms_link_output_symbol
, info
);
9174 /* Find the entry point. */
9175 if (bfd_get_start_address (abfd
) == 0)
9177 bfd
*startbfd
= NULL
;
9179 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9181 /* Consider only VMS object files. */
9182 if (sub
->xvec
!= abfd
->xvec
)
9185 if (!PRIV2 (sub
, eom_data
).eom_has_transfer
)
9187 if ((PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
) && startbfd
)
9189 if (startbfd
!= NULL
9190 && !(PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
))
9192 (*info
->callbacks
->einfo
)
9193 /* xgettext:c-format */
9194 (_("%P: multiple entry points: in modules %pB and %pB\n"),
9203 unsigned int ps_idx
= PRIV2 (startbfd
, eom_data
).eom_l_psindx
;
9204 bfd_vma tfradr
= PRIV2 (startbfd
, eom_data
).eom_l_tfradr
;
9207 sec
= PRIV2 (startbfd
, sections
)[ps_idx
];
9209 bfd_set_start_address
9210 (abfd
, sec
->output_section
->vma
+ sec
->output_offset
+ tfradr
);
9214 /* Set transfer addresses. */
9217 struct bfd_link_hash_entry
*h
;
9220 PRIV (transfer_address
[i
++]) = 0xffffffff00000340ULL
; /* SYS$IMGACT */
9221 h
= bfd_link_hash_lookup (info
->hash
, "LIB$INITIALIZE", FALSE
, FALSE
, TRUE
);
9222 if (h
!= NULL
&& h
->type
== bfd_link_hash_defined
)
9223 PRIV (transfer_address
[i
++]) =
9224 alpha_vms_get_sym_value (h
->u
.def
.section
, h
->u
.def
.value
);
9225 PRIV (transfer_address
[i
++]) = bfd_get_start_address (abfd
);
9227 PRIV (transfer_address
[i
++]) = 0;
9230 /* Allocate contents.
9231 Also compute the virtual base address. */
9232 base_addr
= (bfd_vma
)-1;
9234 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9236 if (o
->flags
& SEC_HAS_CONTENTS
)
9238 o
->contents
= bfd_alloc (abfd
, o
->size
);
9239 if (o
->contents
== NULL
)
9242 if (o
->flags
& SEC_LOAD
)
9244 if (o
->vma
< base_addr
)
9246 if (o
->vma
+ o
->size
> last_addr
)
9247 last_addr
= o
->vma
+ o
->size
;
9249 /* Clear the RELOC flags. Currently we don't support incremental
9250 linking. We use the RELOC flag for computing the eicp entries. */
9251 o
->flags
&= ~SEC_RELOC
;
9254 /* Create the fixup section. */
9255 fixupsec
= bfd_make_section_anyway_with_flags
9256 (info
->output_bfd
, "$FIXUP$",
9257 SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
9258 if (fixupsec
== NULL
)
9260 last_addr
= (last_addr
+ 0xffff) & ~0xffff;
9261 fixupsec
->vma
= last_addr
;
9263 alpha_vms_link_hash (info
)->fixup
= fixupsec
;
9264 alpha_vms_link_hash (info
)->base_addr
= base_addr
;
9266 /* Create the DMT section, if necessary. */
9267 BFD_ASSERT (PRIV (dst_section
) == NULL
);
9268 dst
= bfd_get_section_by_name (abfd
, "$DST$");
9269 if (dst
!= NULL
&& dst
->size
== 0)
9273 PRIV (dst_section
) = dst
;
9274 dmt
= bfd_make_section_anyway_with_flags
9275 (info
->output_bfd
, "$DMT$",
9276 SEC_DEBUGGING
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
9283 /* Read all sections from the inputs. */
9284 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9286 if (sub
->flags
& DYNAMIC
)
9288 alpha_vms_create_eisd_for_shared (abfd
, sub
);
9292 if (!alpha_vms_read_sections_content (sub
, info
))
9296 /* Handle all the link order information for the sections.
9297 Note: past this point, it is not possible to create new sections. */
9298 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9300 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9304 case bfd_section_reloc_link_order
:
9305 case bfd_symbol_reloc_link_order
:
9308 case bfd_indirect_link_order
:
9312 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
9319 /* Compute fixups. */
9320 if (!alpha_vms_build_fixups (info
))
9323 /* Compute the DMT. */
9327 unsigned char *contents
= NULL
;
9329 /* In pass 1, compute the size. In pass 2, write the DMT contents. */
9330 for (pass
= 0; pass
< 2; pass
++)
9332 unsigned int off
= 0;
9334 /* For each object file (ie for each module). */
9335 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9338 struct vms_dmt_header
*dmth
= NULL
;
9339 unsigned int psect_count
;
9341 /* Skip this module if it has no DST. */
9342 sub_dst
= PRIV2 (sub
, dst_section
);
9343 if (sub_dst
== NULL
|| sub_dst
->size
== 0)
9348 /* Write the header. */
9349 dmth
= (struct vms_dmt_header
*)(contents
+ off
);
9350 bfd_putl32 (sub_dst
->output_offset
, dmth
->modbeg
);
9351 bfd_putl32 (sub_dst
->size
, dmth
->size
);
9354 off
+= sizeof (struct vms_dmt_header
);
9357 /* For each section (ie for each psect). */
9358 for (o
= sub
->sections
; o
!= NULL
; o
= o
->next
)
9360 /* Only consider interesting sections. */
9361 if (!(o
->flags
& SEC_ALLOC
))
9363 if (o
->flags
& SEC_LINKER_CREATED
)
9368 /* Write an entry. */
9369 struct vms_dmt_psect
*dmtp
;
9371 dmtp
= (struct vms_dmt_psect
*)(contents
+ off
);
9372 bfd_putl32 (o
->output_offset
+ o
->output_section
->vma
,
9374 bfd_putl32 (o
->size
, dmtp
->length
);
9377 off
+= sizeof (struct vms_dmt_psect
);
9380 bfd_putl32 (psect_count
, dmth
->psect_count
);
9385 contents
= bfd_zalloc (info
->output_bfd
, off
);
9386 if (contents
== NULL
)
9388 dmt
->contents
= contents
;
9393 BFD_ASSERT (off
== dmt
->size
);
9401 /* Read the contents of a section.
9402 buf points to a buffer of buf_size bytes to be filled with
9403 section data (starting at offset into section) */
9406 alpha_vms_get_section_contents (bfd
*abfd
, asection
*section
,
9407 void *buf
, file_ptr offset
,
9408 bfd_size_type count
)
9412 /* Image are easy. */
9413 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
9414 return _bfd_generic_get_section_contents (abfd
, section
,
9415 buf
, offset
, count
);
9418 if (offset
+ count
< count
9419 || offset
+ count
> section
->size
)
9421 bfd_set_error (bfd_error_invalid_operation
);
9425 /* If the section is already in memory, just copy it. */
9426 if (section
->flags
& SEC_IN_MEMORY
)
9428 BFD_ASSERT (section
->contents
!= NULL
);
9429 memcpy (buf
, section
->contents
+ offset
, count
);
9432 if (section
->size
== 0)
9435 /* Alloc in memory and read ETIRs. */
9436 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
9438 BFD_ASSERT (sec
->contents
== NULL
);
9440 if (sec
->size
!= 0 && (sec
->flags
& SEC_HAS_CONTENTS
))
9442 sec
->contents
= bfd_alloc (abfd
, sec
->size
);
9443 if (sec
->contents
== NULL
)
9447 if (!alpha_vms_read_sections_content (abfd
, NULL
))
9449 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
9451 sec
->flags
|= SEC_IN_MEMORY
;
9452 memcpy (buf
, section
->contents
+ offset
, count
);
9457 /* Set the format of a file being written. */
9460 alpha_vms_mkobject (bfd
* abfd
)
9462 const bfd_arch_info_type
*arch
;
9464 vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd
));
9466 if (!vms_initialize (abfd
))
9469 PRIV (recwr
.buf
) = bfd_alloc (abfd
, MAX_OUTREC_SIZE
);
9470 if (PRIV (recwr
.buf
) == NULL
)
9473 arch
= bfd_scan_arch ("alpha");
9477 bfd_set_error (bfd_error_wrong_format
);
9481 abfd
->arch_info
= arch
;
9488 /* Called when the BFD is being closed to do any necessary cleanup. */
9491 vms_close_and_cleanup (bfd
* abfd
)
9493 vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd
));
9495 if (abfd
== NULL
|| abfd
->tdata
.any
== NULL
)
9498 if (abfd
->format
== bfd_object
)
9500 alpha_vms_free_private (abfd
);
9503 if (abfd
->direction
== write_direction
)
9505 /* Last step on VMS is to convert the file to variable record length
9507 if (!bfd_cache_close (abfd
))
9509 if (!_bfd_vms_convert_to_var_unix_filename (abfd
->filename
))
9515 return _bfd_generic_close_and_cleanup (abfd
);
9518 /* Called when a new section is created. */
9521 vms_new_section_hook (bfd
* abfd
, asection
*section
)
9525 vms_debug2 ((1, "vms_new_section_hook (%p, [%u]%s)\n",
9526 abfd
, section
->index
, section
->name
));
9528 if (!bfd_set_section_alignment (section
, 0))
9531 vms_debug2 ((7, "%u: %s\n", section
->index
, section
->name
));
9533 amt
= sizeof (struct vms_section_data_struct
);
9534 section
->used_by_bfd
= bfd_zalloc (abfd
, amt
);
9535 if (section
->used_by_bfd
== NULL
)
9538 /* Create the section symbol. */
9539 return _bfd_generic_new_section_hook (abfd
, section
);
9542 /* Part 4.5, symbols. */
9544 /* Print symbol to file according to how. how is one of
9545 bfd_print_symbol_name just print the name
9546 bfd_print_symbol_more print more (???)
9547 bfd_print_symbol_all print all we know, which is not much right now :-). */
9550 vms_print_symbol (bfd
* abfd
,
9553 bfd_print_symbol_type how
)
9555 vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
9556 abfd
, file
, symbol
, how
));
9560 case bfd_print_symbol_name
:
9561 case bfd_print_symbol_more
:
9562 fprintf ((FILE *)file
," %s", symbol
->name
);
9565 case bfd_print_symbol_all
:
9567 const char *section_name
= symbol
->section
->name
;
9569 bfd_print_symbol_vandf (abfd
, file
, symbol
);
9571 fprintf ((FILE *) file
," %-8s %s", section_name
, symbol
->name
);
9577 /* Return information about symbol in ret.
9579 fill type, value and name
9582 B bss segment symbol
9584 D data segment symbol
9586 t a static function symbol
9587 T text segment symbol
9592 vms_get_symbol_info (bfd
* abfd ATTRIBUTE_UNUSED
,
9598 vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd
, symbol
, ret
));
9600 sec
= symbol
->section
;
9607 else if (bfd_is_com_section (sec
))
9609 else if (bfd_is_abs_section (sec
))
9611 else if (bfd_is_und_section (sec
))
9613 else if (bfd_is_ind_section (sec
))
9615 else if ((symbol
->flags
& BSF_FUNCTION
)
9616 || (bfd_section_flags (sec
) & SEC_CODE
))
9618 else if (bfd_section_flags (sec
) & SEC_DATA
)
9620 else if (bfd_section_flags (sec
) & SEC_ALLOC
)
9625 if (ret
->type
!= 'U')
9626 ret
->value
= symbol
->value
+ symbol
->section
->vma
;
9629 ret
->name
= symbol
->name
;
9632 /* Return TRUE if the given symbol sym in the BFD abfd is
9633 a compiler generated local label, else return FALSE. */
9636 vms_bfd_is_local_label_name (bfd
* abfd ATTRIBUTE_UNUSED
,
9639 return name
[0] == '$';
9642 /* Part 4.7, writing an object file. */
9644 /* Sets the contents of the section section in BFD abfd to the data starting
9645 in memory at LOCATION. The data is written to the output section starting
9646 at offset offset for count bytes.
9648 Normally TRUE is returned, else FALSE. Possible error returns are:
9649 o bfd_error_no_contents - The output section does not have the
9650 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
9651 o and some more too */
9654 _bfd_vms_set_section_contents (bfd
* abfd
,
9656 const void * location
,
9658 bfd_size_type count
)
9660 if (section
->contents
== NULL
)
9662 section
->contents
= bfd_alloc (abfd
, section
->size
);
9663 if (section
->contents
== NULL
)
9666 memcpy (section
->contents
+ offset
, location
, (size_t) count
);
9672 /* Set the architecture and machine type in BFD abfd to arch and mach.
9673 Find the correct pointer to a structure and insert it into the arch_info
9677 alpha_vms_set_arch_mach (bfd
*abfd
,
9678 enum bfd_architecture arch
, unsigned long mach
)
9680 if (arch
!= bfd_arch_alpha
9681 && arch
!= bfd_arch_unknown
)
9684 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
9687 /* Set section VMS flags. Clear NO_FLAGS and set FLAGS. */
9690 bfd_vms_set_section_flags (bfd
*abfd ATTRIBUTE_UNUSED
,
9691 asection
*sec
, flagword no_flags
, flagword flags
)
9693 vms_section_data (sec
)->no_flags
= no_flags
;
9694 vms_section_data (sec
)->flags
= flags
;
9697 struct vms_private_data_struct
*
9698 bfd_vms_get_data (bfd
*abfd
)
9700 return (struct vms_private_data_struct
*)abfd
->tdata
.any
;
9703 #define vms_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
9704 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms
9705 #define vms_bfd_copy_link_hash_symbol_type \
9706 _bfd_generic_copy_link_hash_symbol_type
9707 #define vms_bfd_is_group_section bfd_generic_is_group_section
9708 #define vms_bfd_group_name bfd_generic_group_name
9709 #define vms_bfd_discard_group bfd_generic_discard_group
9710 #define vms_section_already_linked _bfd_generic_section_already_linked
9711 #define vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9712 #define vms_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
9713 #define vms_bfd_define_start_stop bfd_generic_define_start_stop
9714 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
9716 #define vms_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
9717 #define vms_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
9718 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
9719 #define vms_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
9720 #define vms_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
9721 #define vms_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
9723 /* Symbols table. */
9724 #define alpha_vms_make_empty_symbol _bfd_generic_make_empty_symbol
9725 #define alpha_vms_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
9726 #define alpha_vms_print_symbol vms_print_symbol
9727 #define alpha_vms_get_symbol_info vms_get_symbol_info
9728 #define alpha_vms_get_symbol_version_string \
9729 _bfd_nosymbols_get_symbol_version_string
9731 #define alpha_vms_read_minisymbols _bfd_generic_read_minisymbols
9732 #define alpha_vms_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
9733 #define alpha_vms_get_lineno _bfd_nosymbols_get_lineno
9734 #define alpha_vms_find_inliner_info _bfd_nosymbols_find_inliner_info
9735 #define alpha_vms_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
9736 #define alpha_vms_find_nearest_line _bfd_vms_find_nearest_line
9737 #define alpha_vms_find_line _bfd_nosymbols_find_line
9738 #define alpha_vms_bfd_is_local_label_name vms_bfd_is_local_label_name
9740 /* Generic table. */
9741 #define alpha_vms_close_and_cleanup vms_close_and_cleanup
9742 #define alpha_vms_bfd_free_cached_info vms_bfd_free_cached_info
9743 #define alpha_vms_new_section_hook vms_new_section_hook
9744 #define alpha_vms_set_section_contents _bfd_vms_set_section_contents
9745 #define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
9747 #define alpha_vms_bfd_get_relocated_section_contents \
9748 bfd_generic_get_relocated_section_contents
9750 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
9751 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
9752 #define alpha_vms_bfd_lookup_section_flags bfd_generic_lookup_section_flags
9753 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
9754 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
9755 #define alpha_vms_bfd_group_name bfd_generic_group_name
9756 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
9757 #define alpha_vms_section_already_linked \
9758 _bfd_generic_section_already_linked
9760 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9761 #define alpha_vms_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
9762 #define alpha_vms_bfd_define_start_stop bfd_generic_define_start_stop
9763 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
9764 #define alpha_vms_bfd_copy_link_hash_symbol_type \
9765 _bfd_generic_copy_link_hash_symbol_type
9767 #define alpha_vms_bfd_link_split_section _bfd_generic_link_split_section
9769 #define alpha_vms_get_dynamic_symtab_upper_bound \
9770 _bfd_nodynamic_get_dynamic_symtab_upper_bound
9771 #define alpha_vms_canonicalize_dynamic_symtab \
9772 _bfd_nodynamic_canonicalize_dynamic_symtab
9773 #define alpha_vms_get_dynamic_reloc_upper_bound \
9774 _bfd_nodynamic_get_dynamic_reloc_upper_bound
9775 #define alpha_vms_canonicalize_dynamic_reloc \
9776 _bfd_nodynamic_canonicalize_dynamic_reloc
9777 #define alpha_vms_bfd_link_check_relocs _bfd_generic_link_check_relocs
9779 const bfd_target alpha_vms_vec
=
9781 "vms-alpha", /* Name. */
9782 bfd_target_evax_flavour
,
9783 BFD_ENDIAN_LITTLE
, /* Data byte order is little. */
9784 BFD_ENDIAN_LITTLE
, /* Header byte order is little. */
9786 (HAS_RELOC
| EXEC_P
| HAS_LINENO
| HAS_DEBUG
| HAS_SYMS
| HAS_LOCALS
9787 | WP_TEXT
| D_PAGED
), /* Object flags. */
9788 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
9789 | SEC_READONLY
| SEC_CODE
| SEC_DATA
9790 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* Sect flags. */
9791 0, /* symbol_leading_char. */
9792 ' ', /* ar_pad_char. */
9793 15, /* ar_max_namelen. */
9794 0, /* match priority. */
9795 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
9796 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
9797 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
9798 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
9799 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
9800 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
9802 { /* bfd_check_format. */
9805 _bfd_vms_lib_alpha_archive_p
,
9808 { /* bfd_set_format. */
9809 _bfd_bool_bfd_false_error
,
9811 _bfd_vms_lib_alpha_mkarchive
,
9812 _bfd_bool_bfd_false_error
9814 { /* bfd_write_contents. */
9815 _bfd_bool_bfd_false_error
,
9816 alpha_vms_write_object_contents
,
9817 _bfd_vms_lib_write_archive_contents
,
9818 _bfd_bool_bfd_false_error
9821 BFD_JUMP_TABLE_GENERIC (alpha_vms
),
9822 BFD_JUMP_TABLE_COPY (vms
),
9823 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
9824 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib
),
9825 BFD_JUMP_TABLE_SYMBOLS (alpha_vms
),
9826 BFD_JUMP_TABLE_RELOCS (alpha_vms
),
9827 BFD_JUMP_TABLE_WRITE (alpha_vms
),
9828 BFD_JUMP_TABLE_LINK (alpha_vms
),
9829 BFD_JUMP_TABLE_DYNAMIC (alpha_vms
),