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)
50 #include "vms/eihvn.h"
51 #include "vms/eobjrec.h"
54 #include "vms/esgps.h"
63 #include "vms/esdfm.h"
64 #include "vms/esdfv.h"
70 #include "vms/internal.h"
73 #define MIN(a,b) ((a) < (b) ? (a) : (b))
75 /* The r_type field in a reloc is one of the following values. */
76 #define ALPHA_R_IGNORE 0
77 #define ALPHA_R_REFQUAD 1
78 #define ALPHA_R_BRADDR 2
79 #define ALPHA_R_HINT 3
80 #define ALPHA_R_SREL16 4
81 #define ALPHA_R_SREL32 5
82 #define ALPHA_R_SREL64 6
83 #define ALPHA_R_OP_PUSH 7
84 #define ALPHA_R_OP_STORE 8
85 #define ALPHA_R_OP_PSUB 9
86 #define ALPHA_R_OP_PRSHIFT 10
87 #define ALPHA_R_LINKAGE 11
88 #define ALPHA_R_REFLONG 12
89 #define ALPHA_R_CODEADDR 13
90 #define ALPHA_R_NOP 14
91 #define ALPHA_R_BSR 15
92 #define ALPHA_R_LDA 16
93 #define ALPHA_R_BOH 17
95 /* These are used with DST_S_C_LINE_NUM. */
96 #define DST_S_C_LINE_NUM_HEADER_SIZE 4
98 /* These are used with DST_S_C_SOURCE */
100 #define DST_S_B_PCLINE_UNSBYTE 1
101 #define DST_S_W_PCLINE_UNSWORD 1
102 #define DST_S_L_PCLINE_UNSLONG 1
104 #define DST_S_B_MODBEG_NAME 14
105 #define DST_S_L_RTNBEG_ADDRESS 5
106 #define DST_S_B_RTNBEG_NAME 13
107 #define DST_S_L_RTNEND_SIZE 5
109 /* These are used with DST_S_C_SOURCE. */
110 #define DST_S_C_SOURCE_HEADER_SIZE 4
112 #define DST_S_B_SRC_DF_LENGTH 1
113 #define DST_S_W_SRC_DF_FILEID 3
114 #define DST_S_B_SRC_DF_FILENAME 20
115 #define DST_S_B_SRC_UNSBYTE 1
116 #define DST_S_W_SRC_UNSWORD 1
117 #define DST_S_L_SRC_UNSLONG 1
119 /* Debugger symbol definitions. */
121 #define DBG_S_L_DMT_MODBEG 0
122 #define DBG_S_L_DST_SIZE 4
123 #define DBG_S_W_DMT_PSECT_COUNT 8
124 #define DBG_S_C_DMT_HEADER_SIZE 12
126 #define DBG_S_L_DMT_PSECT_START 0
127 #define DBG_S_L_DMT_PSECT_LENGTH 4
128 #define DBG_S_C_DMT_PSECT_SIZE 8
130 /* VMS module header. */
146 #define EMH_DATE_LENGTH 17
148 /* VMS End-Of-Module records (EOM/EEOM). */
152 unsigned int eom_l_total_lps
;
153 unsigned short eom_w_comcod
;
154 bfd_boolean eom_has_transfer
;
155 unsigned char eom_b_tfrflg
;
156 unsigned int eom_l_psindx
;
157 unsigned int eom_l_tfradr
;
160 struct vms_symbol_entry
166 unsigned char data_type
;
167 unsigned short flags
;
169 /* Section and offset/value of the symbol. */
173 /* Section and offset/value for the entry point (only for subprg). */
174 asection
*code_section
;
175 unsigned int code_value
;
177 /* Symbol vector offset. */
178 unsigned int symbol_vector
;
180 /* Length of the name. */
181 unsigned char namelen
;
186 /* Stack value for push/pop commands. */
194 #define STACKSIZE 128
196 /* A minimal decoding of DST compilation units. We only decode
197 what's needed to get to the line number information. */
207 struct srecinfo
*next
;
215 struct lineinfo
*next
;
222 struct funcinfo
*next
;
230 /* Chain the previously read compilation unit. */
233 /* The module name. */
236 /* The start offset and size of debug info in the DST section. */
240 /* The lowest and highest addresses contained in this compilation
241 unit as specified in the compilation unit header. */
245 /* The listing line table. */
246 struct lineinfo
*line_table
;
248 /* The source record table. */
249 struct srecinfo
*srec_table
;
251 /* A list of the functions found in this module. */
252 struct funcinfo
*func_table
;
254 /* Current allocation of file_table. */
255 unsigned int file_table_count
;
257 /* An array of the files making up this module. */
258 struct fileinfo
*file_table
;
261 /* BFD private data for alpha-vms. */
263 struct vms_private_data_struct
265 /* If true, relocs have been read. */
266 bfd_boolean reloc_done
;
268 /* Record input buffer. */
269 struct vms_rec_rd recrd
;
270 struct vms_rec_wr recwr
;
272 struct hdr_struct hdr_data
; /* data from HDR/EMH record */
273 struct eom_struct eom_data
; /* data from EOM/EEOM record */
275 /* Transfer addresses (entry points). */
276 bfd_vma transfer_address
[4];
278 /* Array of GSD sections to get the correspond BFD one. */
279 unsigned int section_max
; /* Size of the sections array. */
280 unsigned int section_count
; /* Number of GSD sections. */
283 /* Array of raw symbols. */
284 struct vms_symbol_entry
**syms
;
286 /* Canonicalized symbols. */
289 /* Number of symbols. */
290 unsigned int gsd_sym_count
;
291 /* Size of the syms array. */
292 unsigned int max_sym_count
;
293 /* Number of procedure symbols. */
294 unsigned int norm_sym_count
;
296 /* Stack used to evaluate TIR/ETIR commands. */
297 struct stack_struct
*stack
;
300 /* Content reading. */
301 asection
*image_section
; /* section for image_ptr */
302 file_ptr image_offset
; /* Offset for image_ptr. */
304 struct module
*modules
; /* list of all compilation units */
306 /* The DST section. */
307 asection
*dst_section
;
309 unsigned int dst_ptr_offsets_count
; /* # of offsets in following array */
310 unsigned int *dst_ptr_offsets
; /* array of saved image_ptr offsets */
312 /* Shared library support */
313 bfd_vma symvva
; /* relative virtual address of symbol vector */
315 unsigned char matchctl
;
317 /* Shared library index. This is used for input bfd while linking. */
318 unsigned int shr_index
;
320 /* Used to place structures in the file. */
323 /* Simply linked list of eisd. */
324 struct vms_internal_eisd_map
*eisd_head
;
325 struct vms_internal_eisd_map
*eisd_tail
;
327 /* Simply linked list of eisd for shared libraries. */
328 struct vms_internal_eisd_map
*gbl_eisd_head
;
329 struct vms_internal_eisd_map
*gbl_eisd_tail
;
331 /* linkage index counter used by conditional store commands */
332 unsigned int vms_linkage_index
;
335 #define PRIV2(abfd, name) \
336 (((struct vms_private_data_struct *)(abfd)->tdata.any)->name)
337 #define PRIV(name) PRIV2(abfd,name)
340 /* Used to keep extra VMS specific information for a given section.
342 reloc_size holds the size of the relocation stream, note this
343 is very different from the number of relocations as VMS relocations
346 reloc_stream is the actual stream of relocation entries. */
348 struct vms_section_data_struct
350 /* Maximnum number of entries in sec->relocation. */
353 /* Corresponding eisd. Used only while generating executables. */
354 struct vms_internal_eisd_map
*eisd
;
356 /* PSC flags to be clear. */
359 /* PSC flags to be set. */
363 #define vms_section_data(sec) \
364 ((struct vms_section_data_struct *)sec->used_by_bfd)
366 /* To be called from the debugger. */
367 struct vms_private_data_struct
*bfd_vms_get_data (bfd
*);
369 static int vms_get_remaining_object_record (bfd
*, unsigned int);
370 static bfd_boolean
_bfd_vms_slurp_object_records (bfd
* abfd
);
371 static void alpha_vms_add_fixup_lp (struct bfd_link_info
*, bfd
*, bfd
*);
372 static void alpha_vms_add_fixup_ca (struct bfd_link_info
*, bfd
*, bfd
*);
373 static void alpha_vms_add_fixup_qr (struct bfd_link_info
*, bfd
*, bfd
*,
375 static void alpha_vms_add_fixup_lr (struct bfd_link_info
*, unsigned int,
377 static void alpha_vms_add_lw_reloc (struct bfd_link_info
*);
378 static void alpha_vms_add_qw_reloc (struct bfd_link_info
*);
387 /* Number of elements in VEC. */
389 #define VEC_COUNT(VEC) ((VEC).nbr_el)
391 /* Get the address of the Nth element. */
393 #define VEC_EL(VEC, TYPE, N) (((TYPE *)((VEC).els))[N])
395 #define VEC_INIT(VEC) \
402 /* Be sure there is room for a new element. */
404 static void vector_grow1 (struct vector_type
*vec
, size_t elsz
);
406 /* Allocate room for a new element and return its address. */
408 #define VEC_APPEND(VEC, TYPE) \
409 (vector_grow1 (&VEC, sizeof (TYPE)), &VEC_EL(VEC, TYPE, (VEC).nbr_el++))
411 /* Append an element. */
413 #define VEC_APPEND_EL(VEC, TYPE, EL) \
414 (*(VEC_APPEND (VEC, TYPE)) = EL)
416 struct alpha_vms_vma_ref
418 bfd_vma vma
; /* Vma in the output. */
419 bfd_vma ref
; /* Reference in the input. */
422 struct alpha_vms_shlib_el
425 bfd_boolean has_fixups
;
427 struct vector_type lp
; /* Vector of bfd_vma. */
428 struct vector_type ca
; /* Vector of bfd_vma. */
429 struct vector_type qr
; /* Vector of struct alpha_vms_vma_ref. */
432 /* Alpha VMS linker hash table. */
434 struct alpha_vms_link_hash_table
436 struct bfd_link_hash_table root
;
438 /* Vector of shared libraries. */
439 struct vector_type shrlibs
;
444 /* Base address. Used by fixups. */
448 #define alpha_vms_link_hash(INFO) \
449 ((struct alpha_vms_link_hash_table *)(INFO->hash))
451 /* Alpha VMS linker hash table entry. */
453 struct alpha_vms_link_hash_entry
455 struct bfd_link_hash_entry root
;
457 /* Pointer to the original vms symbol. */
458 struct vms_symbol_entry
*sym
;
463 /* Read & process EIHD record.
464 Return TRUE on success, FALSE on error. */
467 _bfd_vms_slurp_eihd (bfd
*abfd
, unsigned int *eisd_offset
,
468 unsigned int *eihs_offset
)
470 unsigned int imgtype
, size
;
472 struct vms_eihd
*eihd
= (struct vms_eihd
*)PRIV (recrd
.rec
);
474 vms_debug2 ((8, "_bfd_vms_slurp_eihd\n"));
476 /* PR 21813: Check for an undersized record. */
477 if (PRIV (recrd
.buf_size
) < sizeof (* eihd
))
479 _bfd_error_handler (_("corrupt EIHD record - size is too small"));
480 bfd_set_error (bfd_error_bad_value
);
484 size
= bfd_getl32 (eihd
->size
);
485 imgtype
= bfd_getl32 (eihd
->imgtype
);
487 if (imgtype
== EIHD__K_EXE
|| imgtype
== EIHD__K_LIM
)
488 abfd
->flags
|= EXEC_P
;
490 symvva
= bfd_getl64 (eihd
->symvva
);
493 PRIV (symvva
) = symvva
;
494 abfd
->flags
|= DYNAMIC
;
497 PRIV (ident
) = bfd_getl32 (eihd
->ident
);
498 PRIV (matchctl
) = eihd
->matchctl
;
500 *eisd_offset
= bfd_getl32 (eihd
->isdoff
);
501 *eihs_offset
= bfd_getl32 (eihd
->symdbgoff
);
503 vms_debug2 ((4, "EIHD size %d imgtype %d symvva 0x%lx eisd %d eihs %d\n",
504 size
, imgtype
, (unsigned long)symvva
,
505 *eisd_offset
, *eihs_offset
));
510 /* Read & process EISD record.
511 Return TRUE on success, FALSE on error. */
514 _bfd_vms_slurp_eisd (bfd
*abfd
, unsigned int offset
)
516 int section_count
= 0;
518 vms_debug2 ((8, "_bfd_vms_slurp_eisd\n"));
522 struct vms_eisd
*eisd
;
523 unsigned int rec_size
;
532 /* PR 17512: file: 3d9e9fe9. */
533 if (offset
> PRIV (recrd
.rec_size
)
534 || (PRIV (recrd
.rec_size
) - offset
535 < offsetof (struct vms_eisd
, eisdsize
) + 4))
537 eisd
= (struct vms_eisd
*) (PRIV (recrd
.rec
) + offset
);
538 rec_size
= bfd_getl32 (eisd
->eisdsize
);
542 /* Skip to next block if pad. */
543 if (rec_size
== 0xffffffff)
545 offset
= (offset
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
549 /* Make sure that there is enough data present in the record. */
550 if (rec_size
< offsetof (struct vms_eisd
, type
) + 1)
552 /* Make sure that the record is not too big either. */
553 if (rec_size
> PRIV (recrd
.rec_size
) - offset
)
558 size
= bfd_getl32 (eisd
->secsize
);
559 vaddr
= bfd_getl64 (eisd
->virt_addr
);
560 flags
= bfd_getl32 (eisd
->flags
);
561 vbn
= bfd_getl32 (eisd
->vbn
);
563 vms_debug2 ((4, "EISD at 0x%x size 0x%x addr 0x%lx flags 0x%x blk %d\n",
564 offset
, size
, (unsigned long)vaddr
, flags
, vbn
));
566 /* VMS combines psects from .obj files into isects in the .exe. This
567 process doesn't preserve enough information to reliably determine
568 what's in each section without examining the data. This is
569 especially true of DWARF debug sections. */
570 bfd_flags
= SEC_ALLOC
;
572 bfd_flags
|= SEC_HAS_CONTENTS
| SEC_LOAD
;
574 if (flags
& EISD__M_EXE
)
575 bfd_flags
|= SEC_CODE
;
577 if (flags
& EISD__M_NONSHRADR
)
578 bfd_flags
|= SEC_DATA
;
580 if (!(flags
& EISD__M_WRT
))
581 bfd_flags
|= SEC_READONLY
;
583 if (flags
& EISD__M_DZRO
)
584 bfd_flags
|= SEC_DATA
;
586 if (flags
& EISD__M_FIXUPVEC
)
587 bfd_flags
|= SEC_DATA
;
589 if (flags
& EISD__M_CRF
)
590 bfd_flags
|= SEC_DATA
;
592 if (flags
& EISD__M_GBL
)
594 if (rec_size
<= offsetof (struct vms_eisd
, gblnam
))
596 else if (rec_size
< sizeof (struct vms_eisd
))
597 name
= _bfd_vms_save_counted_string (abfd
, eisd
->gblnam
,
598 rec_size
- offsetof (struct vms_eisd
, gblnam
));
600 name
= _bfd_vms_save_counted_string (abfd
, eisd
->gblnam
,
602 if (name
== NULL
|| name
[0] == 0)
604 bfd_flags
|= SEC_COFF_SHARED_LIBRARY
;
605 bfd_flags
&= ~(SEC_ALLOC
| SEC_LOAD
);
607 else if (flags
& EISD__M_FIXUPVEC
)
609 else if (eisd
->type
== EISD__K_USRSTACK
)
615 name
= (char *) bfd_alloc (abfd
, 32);
618 if (flags
& EISD__M_DZRO
)
620 else if (flags
& EISD__M_EXE
)
622 else if (!(flags
& EISD__M_WRT
))
626 BFD_ASSERT (section_count
< 999);
627 sprintf (name
, "$%s_%03d$", pfx
, section_count
++);
630 section
= bfd_make_section (abfd
, name
);
635 section
->filepos
= vbn
? VMS_BLOCK_SIZE
* (vbn
- 1) : 0;
636 section
->size
= size
;
637 section
->vma
= vaddr
;
639 if (!bfd_set_section_flags (section
, bfd_flags
))
646 /* Read & process EIHS record.
647 Return TRUE on success, FALSE on error. */
650 _bfd_vms_slurp_eihs (bfd
*abfd
, unsigned int offset
)
652 unsigned char *p
= PRIV (recrd
.rec
) + offset
;
654 unsigned int gstsize ATTRIBUTE_UNUSED
;
656 unsigned int dstsize
;
658 unsigned int dmtbytes
;
661 /* PR 21611: Check that offset is valid. */
662 if (offset
> PRIV (recrd
.rec_size
) - (EIHS__L_DMTBYTES
+ 4))
664 _bfd_error_handler (_("unable to read EIHS record at offset %#x"),
666 bfd_set_error (bfd_error_file_truncated
);
670 gstvbn
= bfd_getl32 (p
+ EIHS__L_GSTVBN
);
671 gstsize
= bfd_getl32 (p
+ EIHS__L_GSTSIZE
);
672 dstvbn
= bfd_getl32 (p
+ EIHS__L_DSTVBN
);
673 dstsize
= bfd_getl32 (p
+ EIHS__L_DSTSIZE
);
674 dmtvbn
= bfd_getl32 (p
+ EIHS__L_DMTVBN
);
675 dmtbytes
= bfd_getl32 (p
+ EIHS__L_DMTBYTES
);
678 vms_debug (8, "_bfd_vms_slurp_ihs\n");
679 vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
680 gstvbn
, gstsize
, dstvbn
, dstsize
, dmtvbn
, dmtbytes
);
685 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
687 section
= bfd_make_section (abfd
, "$DST$");
691 section
->size
= dstsize
;
692 section
->filepos
= VMS_BLOCK_SIZE
* (dstvbn
- 1);
694 if (!bfd_set_section_flags (section
, bfd_flags
))
697 PRIV (dst_section
) = section
;
698 abfd
->flags
|= (HAS_DEBUG
| HAS_LINENO
);
703 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
705 section
= bfd_make_section (abfd
, "$DMT$");
709 section
->size
= dmtbytes
;
710 section
->filepos
= VMS_BLOCK_SIZE
* (dmtvbn
- 1);
712 if (!bfd_set_section_flags (section
, bfd_flags
))
718 if (bfd_seek (abfd
, VMS_BLOCK_SIZE
* (gstvbn
- 1), SEEK_SET
))
720 bfd_set_error (bfd_error_file_truncated
);
724 if (!_bfd_vms_slurp_object_records (abfd
))
727 abfd
->flags
|= HAS_SYMS
;
733 /* Object file reading. */
735 /* Object file input functions. */
737 /* Get next record from object file to vms_buf.
738 Set PRIV(buf_size) and return it
740 This is a little tricky since it should be portable.
742 The openVMS object file has 'variable length' which means that
743 read() returns data in chunks of (hopefully) correct and expected
744 size. The linker (and other tools on VMS) depend on that. Unix
745 doesn't know about 'formatted' files, so reading and writing such
746 an object file in a Unix environment is not trivial.
748 With the tool 'file' (available on all VMS FTP sites), one
749 can view and change the attributes of a file. Changing from
750 'variable length' to 'fixed length, 512 bytes' reveals the
751 record size at the first 2 bytes of every record. The same
752 may happen during the transfer of object files from VMS to Unix,
753 at least with UCX, the DEC implementation of TCP/IP.
755 The VMS format repeats the size at bytes 2 & 3 of every record.
757 On the first call (file_format == FF_UNKNOWN) we check if
758 the first and the third byte pair (!) of the record match.
759 If they do it's an object file in an Unix environment or with
760 wrong attributes (FF_FOREIGN), else we should be in a VMS
761 environment where read() returns the record size (FF_NATIVE).
763 Reading is always done in 2 steps:
764 1. first just the record header is read and the size extracted,
765 2. then the read buffer is adjusted and the remaining bytes are
768 All file I/O is done on even file positions. */
770 #define VMS_OBJECT_ADJUSTMENT 2
773 maybe_adjust_record_pointer_for_object (bfd
*abfd
)
775 /* Set the file format once for all on the first invocation. */
776 if (PRIV (recrd
.file_format
) == FF_UNKNOWN
)
778 if (PRIV (recrd
.rec
)[0] == PRIV (recrd
.rec
)[4]
779 && PRIV (recrd
.rec
)[1] == PRIV (recrd
.rec
)[5])
780 PRIV (recrd
.file_format
) = FF_FOREIGN
;
782 PRIV (recrd
.file_format
) = FF_NATIVE
;
785 /* The adjustment is needed only in an Unix environment. */
786 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
787 PRIV (recrd
.rec
) += VMS_OBJECT_ADJUSTMENT
;
790 /* Implement step #1 of the object record reading procedure.
791 Return the record type or -1 on failure. */
794 _bfd_vms_get_object_record (bfd
*abfd
)
796 unsigned int test_len
= 6;
799 vms_debug2 ((8, "_bfd_vms_get_obj_record\n"));
801 /* Skip alignment byte if the current position is odd. */
802 if (PRIV (recrd
.file_format
) == FF_FOREIGN
&& (bfd_tell (abfd
) & 1))
804 if (bfd_bread (PRIV (recrd
.buf
), 1, abfd
) != 1)
806 bfd_set_error (bfd_error_file_truncated
);
811 /* Read the record header */
812 if (bfd_bread (PRIV (recrd
.buf
), test_len
, abfd
) != test_len
)
814 bfd_set_error (bfd_error_file_truncated
);
818 /* Reset the record pointer. */
819 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
820 maybe_adjust_record_pointer_for_object (abfd
);
822 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
825 type
= bfd_getl16 (PRIV (recrd
.rec
));
827 vms_debug2 ((8, "_bfd_vms_get_obj_record: rec %p, size %d, type %d\n",
828 PRIV (recrd
.rec
), PRIV (recrd
.rec_size
), type
));
833 /* Implement step #2 of the object record reading procedure.
834 Return the size of the record or 0 on failure. */
837 vms_get_remaining_object_record (bfd
*abfd
, unsigned int read_so_far
)
839 unsigned int to_read
;
841 vms_debug2 ((8, "vms_get_remaining_obj_record\n"));
843 /* Extract record size. */
844 PRIV (recrd
.rec_size
) = bfd_getl16 (PRIV (recrd
.rec
) + 2);
846 if (PRIV (recrd
.rec_size
) == 0)
848 bfd_set_error (bfd_error_file_truncated
);
852 /* That's what the linker manual says. */
853 if (PRIV (recrd
.rec_size
) > EOBJ__C_MAXRECSIZ
)
855 bfd_set_error (bfd_error_file_truncated
);
859 /* Take into account object adjustment. */
860 to_read
= PRIV (recrd
.rec_size
);
861 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
862 to_read
+= VMS_OBJECT_ADJUSTMENT
;
864 /* Adjust the buffer. */
865 if (to_read
> PRIV (recrd
.buf_size
))
868 = (unsigned char *) bfd_realloc (PRIV (recrd
.buf
), to_read
);
869 if (PRIV (recrd
.buf
) == NULL
)
871 PRIV (recrd
.buf_size
) = to_read
;
873 /* PR 17512: file: 025-1974-0.004. */
874 else if (to_read
<= read_so_far
)
877 /* Read the remaining record. */
878 to_read
-= read_so_far
;
880 vms_debug2 ((8, "vms_get_remaining_obj_record: to_read %d\n", to_read
));
882 if (bfd_bread (PRIV (recrd
.buf
) + read_so_far
, to_read
, abfd
) != to_read
)
884 bfd_set_error (bfd_error_file_truncated
);
888 /* Reset the record pointer. */
889 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
890 maybe_adjust_record_pointer_for_object (abfd
);
892 vms_debug2 ((8, "vms_get_remaining_obj_record: size %d\n",
893 PRIV (recrd
.rec_size
)));
895 return PRIV (recrd
.rec_size
);
898 /* Read and process emh record.
899 Return TRUE on success, FALSE on error. */
902 _bfd_vms_slurp_ehdr (bfd
*abfd
)
905 unsigned char *vms_rec
;
909 vms_rec
= PRIV (recrd
.rec
);
910 /* PR 17512: file: 62736583. */
911 end
= PRIV (recrd
.buf
) + PRIV (recrd
.buf_size
);
913 vms_debug2 ((2, "HDR/EMH\n"));
915 subtype
= bfd_getl16 (vms_rec
+ 4);
917 vms_debug2 ((3, "subtype %d\n", subtype
));
923 if (vms_rec
+ 21 >= end
)
925 PRIV (hdr_data
).hdr_b_strlvl
= vms_rec
[6];
926 PRIV (hdr_data
).hdr_l_arch1
= bfd_getl32 (vms_rec
+ 8);
927 PRIV (hdr_data
).hdr_l_arch2
= bfd_getl32 (vms_rec
+ 12);
928 PRIV (hdr_data
).hdr_l_recsiz
= bfd_getl32 (vms_rec
+ 16);
929 if ((vms_rec
+ 20 + vms_rec
[20] + 1) >= end
)
931 PRIV (hdr_data
).hdr_t_name
932 = _bfd_vms_save_counted_string (abfd
, vms_rec
+ 20, vms_rec
[20]);
933 ptr
= vms_rec
+ 20 + vms_rec
[20] + 1;
934 if ((ptr
+ *ptr
+ 1) >= end
)
936 PRIV (hdr_data
).hdr_t_version
937 = _bfd_vms_save_counted_string (abfd
, ptr
, *ptr
);
941 PRIV (hdr_data
).hdr_t_date
942 = _bfd_vms_save_sized_string (abfd
, ptr
, 17);
946 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
948 PRIV (hdr_data
).hdr_c_lnm
949 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
953 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
955 PRIV (hdr_data
).hdr_c_src
956 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
960 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
962 PRIV (hdr_data
).hdr_c_ttl
963 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
973 bfd_set_error (bfd_error_wrong_format
);
980 /* Typical sections for evax object files. */
982 #define EVAX_ABS_NAME "$ABS$"
983 #define EVAX_CODE_NAME "$CODE$"
984 #define EVAX_LINK_NAME "$LINK$"
985 #define EVAX_DATA_NAME "$DATA$"
986 #define EVAX_BSS_NAME "$BSS$"
987 #define EVAX_READONLYADDR_NAME "$READONLY_ADDR$"
988 #define EVAX_READONLY_NAME "$READONLY$"
989 #define EVAX_LITERAL_NAME "$LITERAL$"
990 #define EVAX_LITERALS_NAME "$LITERALS"
991 #define EVAX_COMMON_NAME "$COMMON$"
992 #define EVAX_LOCAL_NAME "$LOCAL$"
994 struct sec_flags_struct
996 const char *name
; /* Name of section. */
998 flagword flags_always
; /* Flags we set always. */
1000 flagword flags_hassize
; /* Flags we set if the section has a size > 0. */
1003 /* These flags are deccrtl/vaxcrtl (openVMS 6.2 Alpha) compatible. */
1005 static const struct sec_flags_struct evax_section_flags
[] =
1013 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
,
1014 SEC_CODE
| SEC_READONLY
,
1015 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
,
1016 SEC_CODE
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1017 { EVAX_LITERAL_NAME
,
1018 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
,
1019 SEC_DATA
| SEC_READONLY
,
1020 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
,
1021 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1023 EGPS__V_REL
| EGPS__V_RD
,
1024 SEC_DATA
| SEC_READONLY
,
1025 EGPS__V_REL
| EGPS__V_RD
,
1026 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1028 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1030 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1031 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1033 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1035 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1037 { EVAX_READONLYADDR_NAME
,
1038 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
,
1039 SEC_DATA
| SEC_READONLY
,
1040 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
,
1041 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1042 { EVAX_READONLY_NAME
,
1043 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
,
1044 SEC_DATA
| SEC_READONLY
,
1045 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
,
1046 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1048 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1050 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1051 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1052 { EVAX_LITERALS_NAME
,
1053 EGPS__V_PIC
| EGPS__V_OVR
,
1054 SEC_DATA
| SEC_READONLY
,
1055 EGPS__V_PIC
| EGPS__V_OVR
,
1056 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1058 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1060 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1061 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
}
1064 /* Retrieve BFD section flags by name and size. */
1067 vms_secflag_by_name (const struct sec_flags_struct
*section_flags
,
1073 while (section_flags
[i
].name
!= NULL
)
1075 if (strcmp (name
, section_flags
[i
].name
) == 0)
1078 return section_flags
[i
].flags_hassize
;
1080 return section_flags
[i
].flags_always
;
1085 return section_flags
[i
].flags_hassize
;
1086 return section_flags
[i
].flags_always
;
1089 /* Retrieve VMS section flags by name and size. */
1092 vms_esecflag_by_name (const struct sec_flags_struct
*section_flags
,
1098 while (section_flags
[i
].name
!= NULL
)
1100 if (strcmp (name
, section_flags
[i
].name
) == 0)
1103 return section_flags
[i
].vflags_hassize
;
1105 return section_flags
[i
].vflags_always
;
1110 return section_flags
[i
].vflags_hassize
;
1111 return section_flags
[i
].vflags_always
;
1114 /* Add SYM to the symbol table of ABFD.
1115 Return FALSE in case of error. */
1118 add_symbol_entry (bfd
*abfd
, struct vms_symbol_entry
*sym
)
1120 if (PRIV (gsd_sym_count
) >= PRIV (max_sym_count
))
1122 if (PRIV (max_sym_count
) == 0)
1124 PRIV (max_sym_count
) = 128;
1125 PRIV (syms
) = bfd_malloc
1126 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*));
1130 PRIV (max_sym_count
) *= 2;
1131 PRIV (syms
) = bfd_realloc
1133 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*)));
1135 if (PRIV (syms
) == NULL
)
1139 PRIV (syms
)[PRIV (gsd_sym_count
)++] = sym
;
1143 /* Create a symbol whose name is ASCIC and add it to ABFD.
1144 Return NULL in case of error. */
1146 static struct vms_symbol_entry
*
1147 add_symbol (bfd
*abfd
, const unsigned char *ascic
, unsigned int max
)
1149 struct vms_symbol_entry
*entry
;
1156 _bfd_error_handler (_("record is too small for symbol name length"));
1157 bfd_set_error (bfd_error_bad_value
);
1161 entry
= (struct vms_symbol_entry
*)bfd_zalloc (abfd
, sizeof (*entry
) + len
);
1164 entry
->namelen
= len
;
1165 memcpy (entry
->name
, ascic
, len
);
1166 entry
->name
[len
] = 0;
1167 entry
->owner
= abfd
;
1169 if (!add_symbol_entry (abfd
, entry
))
1174 /* Read and process EGSD. Return FALSE on failure. */
1177 _bfd_vms_slurp_egsd (bfd
*abfd
)
1180 unsigned int gsd_size
;
1181 unsigned char *vms_rec
;
1185 vms_debug2 ((2, "EGSD\n"));
1187 if (PRIV (recrd
.rec_size
) < 8)
1189 _bfd_error_handler (_("corrupt EGSD record: its size (%#x) is too small"),
1190 PRIV (recrd
.rec_size
));
1191 bfd_set_error (bfd_error_bad_value
);
1195 PRIV (recrd
.rec
) += 8; /* Skip type, size, align pad. */
1196 PRIV (recrd
.rec_size
) -= 8;
1198 /* Calculate base address for each section. */
1201 while (PRIV (recrd
.rec_size
) > 4)
1203 vms_rec
= PRIV (recrd
.rec
);
1205 gsd_type
= bfd_getl16 (vms_rec
);
1206 gsd_size
= bfd_getl16 (vms_rec
+ 2);
1208 vms_debug2 ((3, "egsd_type %d\n", gsd_type
));
1210 /* PR 21615: Check for size overflow. */
1211 if (PRIV (recrd
.rec_size
) < gsd_size
)
1213 _bfd_error_handler (_("corrupt EGSD record type %d: size (%#x) "
1214 "is larger than remaining space (%#x)"),
1215 gsd_type
, gsd_size
, PRIV (recrd
.rec_size
));
1216 bfd_set_error (bfd_error_bad_value
);
1223 _bfd_error_handler (_("corrupt EGSD record type %d: size (%#x) "
1225 gsd_type
, gsd_size
);
1226 bfd_set_error (bfd_error_bad_value
);
1233 /* Program section definition. */
1235 struct vms_egps
*egps
= (struct vms_egps
*) vms_rec
;
1236 flagword new_flags
, vms_flags
;
1239 if (offsetof (struct vms_egps
, flags
) + 2 > gsd_size
)
1241 vms_flags
= bfd_getl16 (egps
->flags
);
1243 if ((vms_flags
& EGPS__V_REL
) == 0)
1245 /* Use the global absolute section for all
1246 absolute sections. */
1247 section
= bfd_abs_section_ptr
;
1255 if (offsetof (struct vms_egps
, namlng
) >= gsd_size
)
1257 left
= gsd_size
- offsetof (struct vms_egps
, namlng
);
1258 name
= _bfd_vms_save_counted_string (abfd
, &egps
->namlng
, left
);
1259 if (name
== NULL
|| name
[0] == 0)
1262 section
= bfd_make_section (abfd
, name
);
1266 section
->filepos
= 0;
1267 section
->size
= bfd_getl32 (egps
->alloc
);
1268 section
->alignment_power
= egps
->align
& 31;
1270 vms_section_data (section
)->flags
= vms_flags
;
1271 vms_section_data (section
)->no_flags
= 0;
1273 new_flags
= vms_secflag_by_name (evax_section_flags
,
1276 if (section
->size
> 0)
1277 new_flags
|= SEC_LOAD
;
1278 if (!(vms_flags
& EGPS__V_NOMOD
) && section
->size
> 0)
1280 /* Set RELOC and HAS_CONTENTS if the section is not
1281 demand-zero and not empty. */
1282 new_flags
|= SEC_HAS_CONTENTS
;
1283 if (vms_flags
& EGPS__V_REL
)
1284 new_flags
|= SEC_RELOC
;
1286 if (vms_flags
& EGPS__V_EXE
)
1288 /* Set CODE if section is executable. */
1289 new_flags
|= SEC_CODE
;
1290 new_flags
&= ~SEC_DATA
;
1292 if (!bfd_set_section_flags (section
, new_flags
))
1295 /* Give a non-overlapping vma to non absolute sections. */
1296 align_addr
= (bfd_vma
) 1 << section
->alignment_power
;
1297 base_addr
= (base_addr
+ align_addr
- 1) & -align_addr
;
1298 section
->vma
= base_addr
;
1299 base_addr
+= section
->size
;
1302 /* Append it to the section array. */
1303 if (PRIV (section_count
) >= PRIV (section_max
))
1305 if (PRIV (section_max
) == 0)
1306 PRIV (section_max
) = 16;
1308 PRIV (section_max
) *= 2;
1309 PRIV (sections
) = bfd_realloc_or_free
1310 (PRIV (sections
), PRIV (section_max
) * sizeof (asection
*));
1311 if (PRIV (sections
) == NULL
)
1315 PRIV (sections
)[PRIV (section_count
)] = section
;
1316 PRIV (section_count
)++;
1322 unsigned int nameoff
;
1323 struct vms_symbol_entry
*entry
;
1324 struct vms_egsy
*egsy
= (struct vms_egsy
*) vms_rec
;
1327 if (offsetof (struct vms_egsy
, flags
) + 2 > gsd_size
)
1329 old_flags
= bfd_getl16 (egsy
->flags
);
1330 if (old_flags
& EGSY__V_DEF
)
1331 nameoff
= ESDF__B_NAMLNG
;
1333 nameoff
= ESRF__B_NAMLNG
;
1335 if (nameoff
>= gsd_size
)
1337 entry
= add_symbol (abfd
, vms_rec
+ nameoff
, gsd_size
- nameoff
);
1341 /* Allow only duplicate reference. */
1342 if ((entry
->flags
& EGSY__V_DEF
) && (old_flags
& EGSY__V_DEF
))
1345 if (entry
->typ
== 0)
1347 entry
->typ
= gsd_type
;
1348 entry
->data_type
= egsy
->datyp
;
1349 entry
->flags
= old_flags
;
1352 if (old_flags
& EGSY__V_DEF
)
1354 struct vms_esdf
*esdf
= (struct vms_esdf
*) vms_rec
;
1356 entry
->value
= bfd_getl64 (esdf
->value
);
1357 if (PRIV (sections
) == NULL
)
1360 psindx
= bfd_getl32 (esdf
->psindx
);
1361 /* PR 21813: Check for an out of range index. */
1362 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1365 _bfd_error_handler (_("corrupt EGSD record: its psindx "
1366 "field is too big (%#lx)"),
1368 bfd_set_error (bfd_error_bad_value
);
1371 entry
->section
= PRIV (sections
)[psindx
];
1373 if (old_flags
& EGSY__V_NORM
)
1375 PRIV (norm_sym_count
)++;
1377 entry
->code_value
= bfd_getl64 (esdf
->code_address
);
1378 psindx
= bfd_getl32 (esdf
->ca_psindx
);
1379 /* PR 21813: Check for an out of range index. */
1380 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1382 entry
->code_section
= PRIV (sections
)[psindx
];
1390 struct vms_symbol_entry
*entry
;
1391 struct vms_egst
*egst
= (struct vms_egst
*)vms_rec
;
1393 unsigned int nameoff
= offsetof (struct vms_egst
, namlng
);
1395 old_flags
= bfd_getl16 (egst
->header
.flags
);
1397 if (nameoff
>= gsd_size
)
1399 entry
= add_symbol (abfd
, &egst
->namlng
, gsd_size
- nameoff
);
1403 entry
->typ
= gsd_type
;
1404 entry
->data_type
= egst
->header
.datyp
;
1405 entry
->flags
= old_flags
;
1407 entry
->symbol_vector
= bfd_getl32 (egst
->value
);
1409 if (old_flags
& EGSY__V_REL
)
1411 if (PRIV (sections
) == NULL
)
1413 psindx
= bfd_getl32 (egst
->psindx
);
1414 /* PR 21813: Check for an out of range index. */
1415 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1417 entry
->section
= PRIV (sections
)[psindx
];
1420 entry
->section
= bfd_abs_section_ptr
;
1422 entry
->value
= bfd_getl64 (egst
->lp_2
);
1424 if (old_flags
& EGSY__V_NORM
)
1426 PRIV (norm_sym_count
)++;
1428 entry
->code_value
= bfd_getl64 (egst
->lp_1
);
1429 entry
->code_section
= bfd_abs_section_ptr
;
1436 /* Currently ignored. */
1441 _bfd_error_handler (_("unknown EGSD subtype %d"), gsd_type
);
1442 bfd_set_error (bfd_error_bad_value
);
1446 PRIV (recrd
.rec_size
) -= gsd_size
;
1447 PRIV (recrd
.rec
) += gsd_size
;
1450 /* FIXME: Should we complain if PRIV (recrd.rec_size) is not zero ? */
1452 if (PRIV (gsd_sym_count
) > 0)
1453 abfd
->flags
|= HAS_SYMS
;
1458 /* Stack routines for vms ETIR commands. */
1460 /* Push value and section index. */
1463 _bfd_vms_push (bfd
*abfd
, bfd_vma val
, unsigned int reloc
)
1465 vms_debug2 ((4, "<push %08lx (0x%08x) at %d>\n",
1466 (unsigned long)val
, reloc
, PRIV (stackptr
)));
1468 PRIV (stack
[PRIV (stackptr
)]).value
= val
;
1469 PRIV (stack
[PRIV (stackptr
)]).reloc
= reloc
;
1471 if (PRIV (stackptr
) >= STACKSIZE
)
1473 bfd_set_error (bfd_error_bad_value
);
1474 _bfd_error_handler (_("stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr
));
1480 /* Pop value and section index. */
1483 _bfd_vms_pop (bfd
*abfd
, bfd_vma
*val
, unsigned int *rel
)
1485 if (PRIV (stackptr
) == 0)
1487 bfd_set_error (bfd_error_bad_value
);
1488 _bfd_error_handler (_("stack underflow in _bfd_vms_pop"));
1492 *val
= PRIV (stack
[PRIV (stackptr
)]).value
;
1493 *rel
= PRIV (stack
[PRIV (stackptr
)]).reloc
;
1495 vms_debug2 ((4, "<pop %08lx (0x%08x)>\n", (unsigned long)*val
, *rel
));
1499 /* Routines to fill sections contents during tir/etir read. */
1501 /* Initialize image buffer pointer to be filled. */
1504 image_set_ptr (bfd
*abfd
, bfd_vma vma
, int sect
, struct bfd_link_info
*info
)
1508 vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma
, sect
));
1510 if (PRIV (sections
) == NULL
)
1512 if (sect
< 0 || sect
>= (int) PRIV (section_count
))
1515 sec
= PRIV (sections
)[sect
];
1519 /* Reading contents to an output bfd. */
1521 if (sec
->output_section
== NULL
)
1523 /* Section discarded. */
1524 vms_debug2 ((5, " section %s discarded\n", sec
->name
));
1526 /* This is not used. */
1527 PRIV (image_section
) = NULL
;
1528 PRIV (image_offset
) = 0;
1531 PRIV (image_offset
) = sec
->output_offset
+ vma
;
1532 PRIV (image_section
) = sec
->output_section
;
1536 PRIV (image_offset
) = vma
;
1537 PRIV (image_section
) = sec
;
1541 /* Increment image buffer pointer by offset. */
1544 image_inc_ptr (bfd
*abfd
, bfd_vma offset
)
1546 vms_debug2 ((4, "image_inc_ptr (%u)\n", (unsigned)offset
));
1548 PRIV (image_offset
) += offset
;
1551 /* Save current DST location counter under specified index. */
1554 dst_define_location (bfd
*abfd
, unsigned int loc
)
1556 vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc
));
1558 /* Grow the ptr offset table if necessary. */
1559 if (loc
+ 1 > PRIV (dst_ptr_offsets_count
))
1561 PRIV (dst_ptr_offsets
) = bfd_realloc (PRIV (dst_ptr_offsets
),
1562 (loc
+ 1) * sizeof (unsigned int));
1563 PRIV (dst_ptr_offsets_count
) = loc
+ 1;
1566 PRIV (dst_ptr_offsets
)[loc
] = PRIV (image_offset
);
1569 /* Restore saved DST location counter from specified index. */
1572 dst_restore_location (bfd
*abfd
, unsigned int loc
)
1574 vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc
));
1576 PRIV (image_offset
) = PRIV (dst_ptr_offsets
)[loc
];
1579 /* Retrieve saved DST location counter from specified index. */
1582 dst_retrieve_location (bfd
*abfd
, unsigned int loc
)
1584 vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int)loc
));
1586 return PRIV (dst_ptr_offsets
)[loc
];
1589 /* Write multiple bytes to section image. */
1592 image_write (bfd
*abfd
, unsigned char *ptr
, unsigned int size
)
1595 _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr
, size
,
1596 (long)PRIV (image_offset
));
1597 _bfd_hexdump (9, ptr
, size
, 0);
1600 if (PRIV (image_section
)->contents
!= NULL
)
1602 asection
*sec
= PRIV (image_section
);
1603 file_ptr off
= PRIV (image_offset
);
1606 if (off
> (file_ptr
)sec
->size
1607 || size
> (file_ptr
)sec
->size
1608 || off
+ size
> (file_ptr
)sec
->size
)
1610 bfd_set_error (bfd_error_bad_value
);
1614 memcpy (sec
->contents
+ off
, ptr
, size
);
1617 PRIV (image_offset
) += size
;
1621 /* Write byte to section image. */
1624 image_write_b (bfd
* abfd
, unsigned int value
)
1626 unsigned char data
[1];
1628 vms_debug2 ((6, "image_write_b (%02x)\n", (int) value
));
1632 return image_write (abfd
, data
, sizeof (data
));
1635 /* Write 2-byte word to image. */
1638 image_write_w (bfd
* abfd
, unsigned int value
)
1640 unsigned char data
[2];
1642 vms_debug2 ((6, "image_write_w (%04x)\n", (int) value
));
1644 bfd_putl16 (value
, data
);
1645 return image_write (abfd
, data
, sizeof (data
));
1648 /* Write 4-byte long to image. */
1651 image_write_l (bfd
* abfd
, unsigned long value
)
1653 unsigned char data
[4];
1655 vms_debug2 ((6, "image_write_l (%08lx)\n", value
));
1657 bfd_putl32 (value
, data
);
1658 return image_write (abfd
, data
, sizeof (data
));
1661 /* Write 8-byte quad to image. */
1664 image_write_q (bfd
* abfd
, bfd_vma value
)
1666 unsigned char data
[8];
1668 vms_debug2 ((6, "image_write_q (%08lx)\n", (unsigned long)value
));
1670 bfd_putl64 (value
, data
);
1671 return image_write (abfd
, data
, sizeof (data
));
1675 _bfd_vms_etir_name (int cmd
)
1679 case ETIR__C_STA_GBL
: return "ETIR__C_STA_GBL";
1680 case ETIR__C_STA_LW
: return "ETIR__C_STA_LW";
1681 case ETIR__C_STA_QW
: return "ETIR__C_STA_QW";
1682 case ETIR__C_STA_PQ
: return "ETIR__C_STA_PQ";
1683 case ETIR__C_STA_LI
: return "ETIR__C_STA_LI";
1684 case ETIR__C_STA_MOD
: return "ETIR__C_STA_MOD";
1685 case ETIR__C_STA_CKARG
: return "ETIR__C_STA_CKARG";
1686 case ETIR__C_STO_B
: return "ETIR__C_STO_B";
1687 case ETIR__C_STO_W
: return "ETIR__C_STO_W";
1688 case ETIR__C_STO_GBL
: return "ETIR__C_STO_GBL";
1689 case ETIR__C_STO_CA
: return "ETIR__C_STO_CA";
1690 case ETIR__C_STO_RB
: return "ETIR__C_STO_RB";
1691 case ETIR__C_STO_AB
: return "ETIR__C_STO_AB";
1692 case ETIR__C_STO_OFF
: return "ETIR__C_STO_OFF";
1693 case ETIR__C_STO_IMM
: return "ETIR__C_STO_IMM";
1694 case ETIR__C_STO_IMMR
: return "ETIR__C_STO_IMMR";
1695 case ETIR__C_STO_LW
: return "ETIR__C_STO_LW";
1696 case ETIR__C_STO_QW
: return "ETIR__C_STO_QW";
1697 case ETIR__C_STO_GBL_LW
: return "ETIR__C_STO_GBL_LW";
1698 case ETIR__C_STO_LP_PSB
: return "ETIR__C_STO_LP_PSB";
1699 case ETIR__C_STO_HINT_GBL
: return "ETIR__C_STO_HINT_GBL";
1700 case ETIR__C_STO_HINT_PS
: return "ETIR__C_STO_HINT_PS";
1701 case ETIR__C_OPR_ADD
: return "ETIR__C_OPR_ADD";
1702 case ETIR__C_OPR_SUB
: return "ETIR__C_OPR_SUB";
1703 case ETIR__C_OPR_INSV
: return "ETIR__C_OPR_INSV";
1704 case ETIR__C_OPR_USH
: return "ETIR__C_OPR_USH";
1705 case ETIR__C_OPR_ROT
: return "ETIR__C_OPR_ROT";
1706 case ETIR__C_OPR_REDEF
: return "ETIR__C_OPR_REDEF";
1707 case ETIR__C_OPR_DFLIT
: return "ETIR__C_OPR_DFLIT";
1708 case ETIR__C_STC_LP
: return "ETIR__C_STC_LP";
1709 case ETIR__C_STC_GBL
: return "ETIR__C_STC_GBL";
1710 case ETIR__C_STC_GCA
: return "ETIR__C_STC_GCA";
1711 case ETIR__C_STC_PS
: return "ETIR__C_STC_PS";
1712 case ETIR__C_STC_NBH_PS
: return "ETIR__C_STC_NBH_PS";
1713 case ETIR__C_STC_NOP_GBL
: return "ETIR__C_STC_NOP_GBL";
1714 case ETIR__C_STC_NOP_PS
: return "ETIR__C_STC_NOP_PS";
1715 case ETIR__C_STC_BSR_GBL
: return "ETIR__C_STC_BSR_GBL";
1716 case ETIR__C_STC_BSR_PS
: return "ETIR__C_STC_BSR_PS";
1717 case ETIR__C_STC_LDA_GBL
: return "ETIR__C_STC_LDA_GBL";
1718 case ETIR__C_STC_LDA_PS
: return "ETIR__C_STC_LDA_PS";
1719 case ETIR__C_STC_BOH_GBL
: return "ETIR__C_STC_BOH_GBL";
1720 case ETIR__C_STC_BOH_PS
: return "ETIR__C_STC_BOH_PS";
1721 case ETIR__C_STC_NBH_GBL
: return "ETIR__C_STC_NBH_GBL";
1722 case ETIR__C_STC_LP_PSB
: return "ETIR__C_STC_LP_PSB";
1723 case ETIR__C_CTL_SETRB
: return "ETIR__C_CTL_SETRB";
1724 case ETIR__C_CTL_AUGRB
: return "ETIR__C_CTL_AUGRB";
1725 case ETIR__C_CTL_DFLOC
: return "ETIR__C_CTL_DFLOC";
1726 case ETIR__C_CTL_STLOC
: return "ETIR__C_CTL_STLOC";
1727 case ETIR__C_CTL_STKDL
: return "ETIR__C_CTL_STKDL";
1730 /* These names have not yet been added to this switch statement. */
1731 _bfd_error_handler (_("unknown ETIR command %d"), cmd
);
1736 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
1739 _bfd_vms_get_value (bfd
*abfd
,
1740 const unsigned char *ascic
,
1741 const unsigned char *max_ascic
,
1742 struct bfd_link_info
*info
,
1744 struct alpha_vms_link_hash_entry
**hp
)
1749 struct alpha_vms_link_hash_entry
*h
;
1751 /* Not linking. Do not try to resolve the symbol. */
1760 if (ascic
+ len
>= max_ascic
)
1762 _bfd_error_handler (_("corrupt vms value"));
1768 for (i
= 0; i
< len
; i
++)
1769 name
[i
] = ascic
[i
+ 1];
1772 h
= (struct alpha_vms_link_hash_entry
*)
1773 bfd_link_hash_lookup (info
->hash
, name
, FALSE
, FALSE
, TRUE
);
1778 && (h
->root
.type
== bfd_link_hash_defined
1779 || h
->root
.type
== bfd_link_hash_defweak
))
1780 *vma
= h
->root
.u
.def
.value
1781 + h
->root
.u
.def
.section
->output_offset
1782 + h
->root
.u
.def
.section
->output_section
->vma
;
1783 else if (h
&& h
->root
.type
== bfd_link_hash_undefweak
)
1787 (*info
->callbacks
->undefined_symbol
)
1788 (info
, name
, abfd
, PRIV (image_section
), PRIV (image_offset
), TRUE
);
1795 #define RELC_SHR_BASE 0x10000
1796 #define RELC_SEC_BASE 0x20000
1797 #define RELC_MASK 0x0ffff
1800 alpha_vms_sym_to_ctxt (struct alpha_vms_link_hash_entry
*h
)
1802 /* Handle undefined symbols. */
1803 if (h
== NULL
|| h
->sym
== NULL
)
1806 if (h
->sym
->typ
== EGSD__C_SYMG
)
1808 if (h
->sym
->flags
& EGSY__V_REL
)
1809 return RELC_SHR_BASE
+ PRIV2 (h
->sym
->owner
, shr_index
);
1812 /* Can this happen (non-relocatable symg) ? I'd like to see
1817 if (h
->sym
->typ
== EGSD__C_SYM
)
1819 if (h
->sym
->flags
& EGSY__V_REL
)
1828 alpha_vms_get_sym_value (asection
*sect
, bfd_vma addr
)
1830 return sect
->output_section
->vma
+ sect
->output_offset
+ addr
;
1834 alpha_vms_fix_sec_rel (bfd
*abfd
, struct bfd_link_info
*info
,
1835 unsigned int rel
, bfd_vma vma
)
1839 if (PRIV (sections
) == NULL
)
1842 sec
= PRIV (sections
)[rel
& RELC_MASK
];
1846 if (sec
->output_section
== NULL
)
1848 return vma
+ sec
->output_section
->vma
+ sec
->output_offset
;
1851 return vma
+ sec
->vma
;
1854 /* Read an ETIR record from ABFD. If INFO is not null, put the content into
1855 the output section (used during linking).
1856 Return FALSE in case of error. */
1859 _bfd_vms_slurp_etir (bfd
*abfd
, struct bfd_link_info
*info
)
1862 unsigned int length
;
1863 unsigned char *maxptr
;
1868 struct alpha_vms_link_hash_entry
*h
;
1870 PRIV (recrd
.rec
) += ETIR__C_HEADER_SIZE
;
1871 PRIV (recrd
.rec_size
) -= ETIR__C_HEADER_SIZE
;
1873 ptr
= PRIV (recrd
.rec
);
1874 length
= PRIV (recrd
.rec_size
);
1875 maxptr
= ptr
+ length
;
1877 vms_debug2 ((2, "ETIR: %d bytes\n", length
));
1879 while (ptr
< maxptr
)
1881 int cmd
, cmd_length
;
1883 if (ptr
+ 4 > maxptr
)
1886 cmd
= bfd_getl16 (ptr
);
1887 cmd_length
= bfd_getl16 (ptr
+ 2);
1889 /* PR 21589 and 21579: Check for a corrupt ETIR record. */
1890 if (cmd_length
< 4 || ptr
+ cmd_length
> maxptr
)
1893 _bfd_error_handler (_("corrupt ETIR record encountered"));
1894 bfd_set_error (bfd_error_bad_value
);
1900 _bfd_vms_debug (4, "etir: %s(%d)\n",
1901 _bfd_vms_etir_name (cmd
), cmd
);
1902 _bfd_hexdump (8, ptr
, cmd_length
- 4, 0);
1910 stack 32 bit value of symbol (high bits set to 0). */
1911 case ETIR__C_STA_GBL
:
1912 _bfd_vms_get_value (abfd
, ptr
, maxptr
, info
, &op1
, &h
);
1913 if (!_bfd_vms_push (abfd
, op1
, alpha_vms_sym_to_ctxt (h
)))
1920 stack 32 bit value, sign extend to 64 bit. */
1921 case ETIR__C_STA_LW
:
1922 if (ptr
+ 4 > maxptr
)
1924 if (!_bfd_vms_push (abfd
, bfd_getl32 (ptr
), RELC_NONE
))
1931 stack 64 bit value of symbol. */
1932 case ETIR__C_STA_QW
:
1933 if (ptr
+ 8 > maxptr
)
1935 if (!_bfd_vms_push (abfd
, bfd_getl64 (ptr
), RELC_NONE
))
1939 /* Stack psect base plus quadword offset
1940 arg: lw section index
1941 qw signed quadword offset (low 32 bits)
1943 Stack qw argument and section index
1944 (see ETIR__C_STO_OFF, ETIR__C_CTL_SETRB). */
1945 case ETIR__C_STA_PQ
:
1949 if (ptr
+ 12 > maxptr
)
1951 psect
= bfd_getl32 (ptr
);
1952 if ((unsigned int) psect
>= PRIV (section_count
))
1954 _bfd_error_handler (_("bad section index in %s"),
1955 _bfd_vms_etir_name (cmd
));
1956 bfd_set_error (bfd_error_bad_value
);
1959 op1
= bfd_getl64 (ptr
+ 4);
1960 if (!_bfd_vms_push (abfd
, op1
, psect
| RELC_SEC_BASE
))
1965 case ETIR__C_STA_LI
:
1966 case ETIR__C_STA_MOD
:
1967 case ETIR__C_STA_CKARG
:
1968 _bfd_error_handler (_("unsupported STA cmd %s"),
1969 _bfd_vms_etir_name (cmd
));
1973 /* Store byte: pop stack, write byte
1976 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
1978 if (rel1
!= RELC_NONE
)
1980 image_write_b (abfd
, (unsigned int) op1
& 0xff);
1983 /* Store word: pop stack, write word
1986 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
1988 if (rel1
!= RELC_NONE
)
1990 image_write_w (abfd
, (unsigned int) op1
& 0xffff);
1993 /* Store longword: pop stack, write longword
1995 case ETIR__C_STO_LW
:
1996 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
1998 if (rel1
& RELC_SEC_BASE
)
2000 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2003 else if (rel1
& RELC_SHR_BASE
)
2005 alpha_vms_add_fixup_lr (info
, rel1
& RELC_MASK
, op1
);
2008 if (rel1
!= RELC_NONE
)
2010 if (rel1
!= RELC_REL
)
2012 alpha_vms_add_lw_reloc (info
);
2014 image_write_l (abfd
, op1
);
2017 /* Store quadword: pop stack, write quadword
2019 case ETIR__C_STO_QW
:
2020 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2022 if (rel1
& RELC_SEC_BASE
)
2024 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2027 else if (rel1
& RELC_SHR_BASE
)
2029 if (rel1
!= RELC_NONE
)
2031 if (rel1
!= RELC_REL
)
2033 alpha_vms_add_qw_reloc (info
);
2035 image_write_q (abfd
, op1
);
2038 /* Store immediate repeated: pop stack for repeat count
2041 case ETIR__C_STO_IMMR
:
2045 if (ptr
+ 4 > maxptr
)
2047 size
= bfd_getl32 (ptr
);
2048 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2050 if (rel1
!= RELC_NONE
)
2053 image_write (abfd
, ptr
+ 4, size
);
2057 /* Store global: write symbol value
2058 arg: cs global symbol name. */
2059 case ETIR__C_STO_GBL
:
2060 _bfd_vms_get_value (abfd
, ptr
, maxptr
, info
, &op1
, &h
);
2063 if (h
->sym
->typ
== EGSD__C_SYMG
)
2065 alpha_vms_add_fixup_qr
2066 (info
, abfd
, h
->sym
->owner
, h
->sym
->symbol_vector
);
2071 op1
= alpha_vms_get_sym_value (h
->sym
->section
,
2073 alpha_vms_add_qw_reloc (info
);
2076 image_write_q (abfd
, op1
);
2079 /* Store code address: write address of entry point
2080 arg: cs global symbol name (procedure). */
2081 case ETIR__C_STO_CA
:
2082 _bfd_vms_get_value (abfd
, ptr
, maxptr
, info
, &op1
, &h
);
2085 if (h
->sym
->flags
& EGSY__V_NORM
)
2087 /* That's really a procedure. */
2088 if (h
->sym
->typ
== EGSD__C_SYMG
)
2090 alpha_vms_add_fixup_ca (info
, abfd
, h
->sym
->owner
);
2091 op1
= h
->sym
->symbol_vector
;
2095 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
2096 h
->sym
->code_value
);
2097 alpha_vms_add_qw_reloc (info
);
2102 /* Symbol is not a procedure. */
2106 image_write_q (abfd
, op1
);
2109 /* Store offset to psect: pop stack, add low 32 bits to base of psect
2111 case ETIR__C_STO_OFF
:
2112 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2115 if (!(rel1
& RELC_SEC_BASE
))
2118 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2120 image_write_q (abfd
, op1
);
2124 arg: lw count of bytes
2126 case ETIR__C_STO_IMM
:
2130 if (ptr
+ 4 > maxptr
)
2132 size
= bfd_getl32 (ptr
);
2133 image_write (abfd
, ptr
+ 4, size
);
2137 /* This code is 'reserved to digital' according to the openVMS
2138 linker manual, however it is generated by the DEC C compiler
2139 and defined in the include file.
2140 FIXME, since the following is just a guess
2141 store global longword: store 32bit value of symbol
2142 arg: cs symbol name. */
2143 case ETIR__C_STO_GBL_LW
:
2144 _bfd_vms_get_value (abfd
, ptr
, maxptr
, info
, &op1
, &h
);
2148 image_write_l (abfd
, op1
);
2151 case ETIR__C_STO_RB
:
2152 case ETIR__C_STO_AB
:
2153 case ETIR__C_STO_LP_PSB
:
2154 _bfd_error_handler (_("%s: not supported"),
2155 _bfd_vms_etir_name (cmd
));
2158 case ETIR__C_STO_HINT_GBL
:
2159 case ETIR__C_STO_HINT_PS
:
2160 _bfd_error_handler (_("%s: not implemented"),
2161 _bfd_vms_etir_name (cmd
));
2165 /* 200 Store-conditional Linkage Pair
2167 case ETIR__C_STC_LP
:
2169 /* 202 Store-conditional Address at global address
2173 case ETIR__C_STC_GBL
:
2175 /* 203 Store-conditional Code Address at global address
2177 cs procedure name. */
2178 case ETIR__C_STC_GCA
:
2180 /* 204 Store-conditional Address at psect + offset
2184 case ETIR__C_STC_PS
:
2185 _bfd_error_handler (_("%s: not supported"),
2186 _bfd_vms_etir_name (cmd
));
2190 /* 201 Store-conditional Linkage Pair with Procedure Signature
2196 case ETIR__C_STC_LP_PSB
:
2197 _bfd_vms_get_value (abfd
, ptr
+ 4, maxptr
, info
, &op1
, &h
);
2200 if (h
->sym
->typ
== EGSD__C_SYMG
)
2202 alpha_vms_add_fixup_lp (info
, abfd
, h
->sym
->owner
);
2203 op1
= h
->sym
->symbol_vector
;
2208 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
2209 h
->sym
->code_value
);
2210 op2
= alpha_vms_get_sym_value (h
->sym
->section
,
2216 /* Undefined symbol. */
2220 image_write_q (abfd
, op1
);
2221 image_write_q (abfd
, op2
);
2224 /* 205 Store-conditional NOP at address of global
2226 case ETIR__C_STC_NOP_GBL
:
2229 /* 207 Store-conditional BSR at global address
2232 case ETIR__C_STC_BSR_GBL
:
2235 /* 209 Store-conditional LDA at global address
2238 case ETIR__C_STC_LDA_GBL
:
2241 /* 211 Store-conditional BSR or Hint at global address
2244 case ETIR__C_STC_BOH_GBL
:
2245 /* Currentl ignored. */
2248 /* 213 Store-conditional NOP,BSR or HINT at global address
2251 case ETIR__C_STC_NBH_GBL
:
2253 /* 206 Store-conditional NOP at pect + offset
2256 case ETIR__C_STC_NOP_PS
:
2258 /* 208 Store-conditional BSR at pect + offset
2261 case ETIR__C_STC_BSR_PS
:
2263 /* 210 Store-conditional LDA at psect + offset
2266 case ETIR__C_STC_LDA_PS
:
2268 /* 212 Store-conditional BSR or Hint at pect + offset
2271 case ETIR__C_STC_BOH_PS
:
2273 /* 214 Store-conditional NOP, BSR or HINT at psect + offset
2275 case ETIR__C_STC_NBH_PS
:
2276 _bfd_error_handler (_("%s: not supported"),
2277 _bfd_vms_etir_name (cmd
));
2281 /* Det relocation base: pop stack, set image location counter
2283 case ETIR__C_CTL_SETRB
:
2284 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2286 if (!(rel1
& RELC_SEC_BASE
))
2288 image_set_ptr (abfd
, op1
, rel1
& RELC_MASK
, info
);
2291 /* Augment relocation base: increment image location counter by offset
2292 arg: lw offset value. */
2293 case ETIR__C_CTL_AUGRB
:
2294 if (ptr
+ 4 > maxptr
)
2296 op1
= bfd_getl32 (ptr
);
2297 image_inc_ptr (abfd
, op1
);
2300 /* Define location: pop index, save location counter under index
2302 case ETIR__C_CTL_DFLOC
:
2303 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2305 if (rel1
!= RELC_NONE
)
2307 dst_define_location (abfd
, op1
);
2310 /* Set location: pop index, restore location counter from index
2312 case ETIR__C_CTL_STLOC
:
2313 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2315 if (rel1
!= RELC_NONE
)
2317 dst_restore_location (abfd
, op1
);
2320 /* Stack defined location: pop index, push location counter from index
2322 case ETIR__C_CTL_STKDL
:
2323 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2325 if (rel1
!= RELC_NONE
)
2327 if (!_bfd_vms_push (abfd
, dst_retrieve_location (abfd
, op1
),
2332 case ETIR__C_OPR_NOP
: /* No-op. */
2335 case ETIR__C_OPR_ADD
: /* Add. */
2336 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2337 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2339 if (rel1
== RELC_NONE
&& rel2
!= RELC_NONE
)
2341 else if (rel1
!= RELC_NONE
&& rel2
!= RELC_NONE
)
2343 if (!_bfd_vms_push (abfd
, op1
+ op2
, rel1
))
2347 case ETIR__C_OPR_SUB
: /* Subtract. */
2348 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2349 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2351 if (rel1
== RELC_NONE
&& rel2
!= RELC_NONE
)
2353 else if ((rel1
& RELC_SEC_BASE
) && (rel2
& RELC_SEC_BASE
))
2355 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2356 op2
= alpha_vms_fix_sec_rel (abfd
, info
, rel2
, op2
);
2359 else if (rel1
!= RELC_NONE
&& rel2
!= RELC_NONE
)
2361 if (!_bfd_vms_push (abfd
, op2
- op1
, rel1
))
2365 case ETIR__C_OPR_MUL
: /* Multiply. */
2366 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2367 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2369 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2371 if (!_bfd_vms_push (abfd
, op1
* op2
, RELC_NONE
))
2375 case ETIR__C_OPR_DIV
: /* Divide. */
2376 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2377 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2379 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2383 if (!_bfd_vms_push (abfd
, 0, RELC_NONE
))
2388 if (!_bfd_vms_push (abfd
, op2
/ op1
, RELC_NONE
))
2393 case ETIR__C_OPR_AND
: /* Logical AND. */
2394 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2395 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2397 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2399 if (!_bfd_vms_push (abfd
, op1
& op2
, RELC_NONE
))
2403 case ETIR__C_OPR_IOR
: /* Logical inclusive OR. */
2404 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2405 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2407 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2409 if (!_bfd_vms_push (abfd
, op1
| op2
, RELC_NONE
))
2413 case ETIR__C_OPR_EOR
: /* Logical exclusive OR. */
2414 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2415 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2417 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2419 if (!_bfd_vms_push (abfd
, op1
^ op2
, RELC_NONE
))
2423 case ETIR__C_OPR_NEG
: /* Negate. */
2424 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2426 if (rel1
!= RELC_NONE
)
2428 if (!_bfd_vms_push (abfd
, -op1
, RELC_NONE
))
2432 case ETIR__C_OPR_COM
: /* Complement. */
2433 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2435 if (rel1
!= RELC_NONE
)
2437 if (!_bfd_vms_push (abfd
, ~op1
, RELC_NONE
))
2441 case ETIR__C_OPR_ASH
: /* Arithmetic shift. */
2442 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2443 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2445 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2448 _bfd_error_handler (_("invalid use of %s with contexts"),
2449 _bfd_vms_etir_name (cmd
));
2452 if ((int)op2
< 0) /* Shift right. */
2454 else /* Shift left. */
2456 if (!_bfd_vms_push (abfd
, op1
, RELC_NONE
)) /* FIXME: sym. */
2460 case ETIR__C_OPR_INSV
: /* Insert field. */
2461 case ETIR__C_OPR_USH
: /* Unsigned shift. */
2462 case ETIR__C_OPR_ROT
: /* Rotate. */
2463 case ETIR__C_OPR_REDEF
: /* Redefine symbol to current location. */
2464 case ETIR__C_OPR_DFLIT
: /* Define a literal. */
2465 _bfd_error_handler (_("%s: not supported"),
2466 _bfd_vms_etir_name (cmd
));
2470 case ETIR__C_OPR_SEL
: /* Select. */
2471 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2475 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2480 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2481 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2483 if (!_bfd_vms_push (abfd
, op1
, rel1
))
2489 _bfd_error_handler (_("reserved cmd %d"), cmd
);
2494 ptr
+= cmd_length
- 4;
2500 /* Process EDBG/ETBT record.
2501 Return TRUE on success, FALSE on error */
2504 vms_slurp_debug (bfd
*abfd
)
2506 asection
*section
= PRIV (dst_section
);
2508 if (section
== NULL
)
2510 /* We have no way to find out beforehand how much debug info there
2511 is in an object file, so pick an initial amount and grow it as
2513 flagword flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
| SEC_RELOC
2516 section
= bfd_make_section (abfd
, "$DST$");
2519 if (!bfd_set_section_flags (section
, flags
))
2521 PRIV (dst_section
) = section
;
2524 PRIV (image_section
) = section
;
2525 PRIV (image_offset
) = section
->size
;
2527 if (!_bfd_vms_slurp_etir (abfd
, NULL
))
2530 section
->size
= PRIV (image_offset
);
2534 /* Process EDBG record.
2535 Return TRUE on success, FALSE on error. */
2538 _bfd_vms_slurp_edbg (bfd
*abfd
)
2540 vms_debug2 ((2, "EDBG\n"));
2542 abfd
->flags
|= HAS_DEBUG
| HAS_LINENO
;
2544 return vms_slurp_debug (abfd
);
2547 /* Process ETBT record.
2548 Return TRUE on success, FALSE on error. */
2551 _bfd_vms_slurp_etbt (bfd
*abfd
)
2553 vms_debug2 ((2, "ETBT\n"));
2555 abfd
->flags
|= HAS_LINENO
;
2557 return vms_slurp_debug (abfd
);
2560 /* Process EEOM record.
2561 Return TRUE on success, FALSE on error. */
2564 _bfd_vms_slurp_eeom (bfd
*abfd
)
2566 struct vms_eeom
*eeom
= (struct vms_eeom
*) PRIV (recrd
.rec
);
2568 vms_debug2 ((2, "EEOM\n"));
2570 /* PR 21813: Check for an undersized record. */
2571 if (PRIV (recrd
.buf_size
) < sizeof (* eeom
))
2573 _bfd_error_handler (_("corrupt EEOM record - size is too small"));
2574 bfd_set_error (bfd_error_bad_value
);
2578 PRIV (eom_data
).eom_l_total_lps
= bfd_getl32 (eeom
->total_lps
);
2579 PRIV (eom_data
).eom_w_comcod
= bfd_getl16 (eeom
->comcod
);
2580 if (PRIV (eom_data
).eom_w_comcod
> 1)
2582 _bfd_error_handler (_("object module not error-free !"));
2583 bfd_set_error (bfd_error_bad_value
);
2587 PRIV (eom_data
).eom_has_transfer
= FALSE
;
2588 if (PRIV (recrd
.rec_size
) > 10)
2590 PRIV (eom_data
).eom_has_transfer
= TRUE
;
2591 PRIV (eom_data
).eom_b_tfrflg
= eeom
->tfrflg
;
2592 PRIV (eom_data
).eom_l_psindx
= bfd_getl32 (eeom
->psindx
);
2593 PRIV (eom_data
).eom_l_tfradr
= bfd_getl32 (eeom
->tfradr
);
2595 abfd
->start_address
= PRIV (eom_data
).eom_l_tfradr
;
2600 /* Slurp an ordered set of VMS object records. Return FALSE on error. */
2603 _bfd_vms_slurp_object_records (bfd
* abfd
)
2610 vms_debug2 ((7, "reading at %08lx\n", (unsigned long)bfd_tell (abfd
)));
2612 type
= _bfd_vms_get_object_record (abfd
);
2615 vms_debug2 ((2, "next_record failed\n"));
2622 err
= _bfd_vms_slurp_ehdr (abfd
);
2625 err
= _bfd_vms_slurp_eeom (abfd
);
2628 err
= _bfd_vms_slurp_egsd (abfd
);
2631 err
= TRUE
; /* _bfd_vms_slurp_etir (abfd); */
2634 err
= _bfd_vms_slurp_edbg (abfd
);
2637 err
= _bfd_vms_slurp_etbt (abfd
);
2644 vms_debug2 ((2, "slurp type %d failed\n", type
));
2648 while (type
!= EOBJ__C_EEOM
);
2653 /* Initialize private data */
2655 vms_initialize (bfd
* abfd
)
2659 amt
= sizeof (struct vms_private_data_struct
);
2660 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
2661 if (abfd
->tdata
.any
== NULL
)
2664 PRIV (recrd
.file_format
) = FF_UNKNOWN
;
2666 amt
= sizeof (struct stack_struct
) * STACKSIZE
;
2667 PRIV (stack
) = bfd_alloc (abfd
, amt
);
2668 if (PRIV (stack
) == NULL
)
2674 bfd_release (abfd
, abfd
->tdata
.any
);
2675 abfd
->tdata
.any
= NULL
;
2679 /* Free malloc'd memory. */
2682 alpha_vms_free_private (bfd
*abfd
)
2684 struct module
*module
;
2686 free (PRIV (recrd
.buf
));
2687 free (PRIV (sections
));
2689 free (PRIV (dst_ptr_offsets
));
2691 for (module
= PRIV (modules
); module
; module
= module
->next
)
2692 free (module
->file_table
);
2695 /* Check the format for a file being read.
2696 Return a (bfd_target *) if it's an object file or zero if not. */
2698 static const struct bfd_target
*
2699 alpha_vms_object_p (bfd
*abfd
)
2701 void *tdata_save
= abfd
->tdata
.any
;
2702 unsigned int test_len
;
2705 vms_debug2 ((1, "vms_object_p(%p)\n", abfd
));
2707 /* Allocate alpha-vms specific data. */
2708 if (!vms_initialize (abfd
))
2710 abfd
->tdata
.any
= tdata_save
;
2714 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
))
2715 goto err_wrong_format
;
2717 /* The first challenge with VMS is to discover the kind of the file.
2719 Image files (executable or shared images) are stored as a raw
2720 stream of bytes (like on UNIX), but there is no magic number.
2722 Object files are written with RMS (record management service), ie
2723 each records are preceeded by its length (on a word - 2 bytes), and
2724 padded for word-alignment. That would be simple but when files
2725 are transfered to a UNIX filesystem (using ftp), records are lost.
2726 Only the raw content of the records are transfered. Fortunately,
2727 the Alpha Object file format also store the length of the record
2728 in the records. Is that clear ? */
2730 /* Minimum is 6 bytes for objects (2 bytes size, 2 bytes record id,
2731 2 bytes size repeated) and 12 bytes for images (4 bytes major id,
2732 4 bytes minor id, 4 bytes length). */
2735 /* Size the main buffer. */
2736 buf
= (unsigned char *) bfd_malloc (test_len
);
2739 PRIV (recrd
.buf
) = buf
;
2740 PRIV (recrd
.buf_size
) = test_len
;
2742 /* Initialize the record pointer. */
2743 PRIV (recrd
.rec
) = buf
;
2745 if (bfd_bread (buf
, test_len
, abfd
) != test_len
)
2746 goto err_wrong_format
;
2748 /* Is it an image? */
2749 if ((bfd_getl32 (buf
) == EIHD__K_MAJORID
)
2750 && (bfd_getl32 (buf
+ 4) == EIHD__K_MINORID
))
2752 unsigned int to_read
;
2753 unsigned int read_so_far
;
2754 unsigned int remaining
;
2755 unsigned int eisd_offset
, eihs_offset
;
2757 /* Extract the header size. */
2758 PRIV (recrd
.rec_size
) = bfd_getl32 (buf
+ EIHD__L_SIZE
);
2760 /* The header size is 0 for DSF files. */
2761 if (PRIV (recrd
.rec_size
) == 0)
2762 PRIV (recrd
.rec_size
) = sizeof (struct vms_eihd
);
2764 if (PRIV (recrd
.rec_size
) > PRIV (recrd
.buf_size
))
2766 buf
= bfd_realloc_or_free (buf
, PRIV (recrd
.rec_size
));
2770 PRIV (recrd
.buf
) = NULL
;
2773 PRIV (recrd
.buf
) = buf
;
2774 PRIV (recrd
.buf_size
) = PRIV (recrd
.rec_size
);
2777 /* PR 21813: Check for a truncated record. */
2778 if (PRIV (recrd
.rec_size
< test_len
))
2780 /* Read the remaining record. */
2781 remaining
= PRIV (recrd
.rec_size
) - test_len
;
2782 to_read
= MIN (VMS_BLOCK_SIZE
- test_len
, remaining
);
2783 read_so_far
= test_len
;
2785 while (remaining
> 0)
2787 if (bfd_bread (buf
+ read_so_far
, to_read
, abfd
) != to_read
)
2788 goto err_wrong_format
;
2790 read_so_far
+= to_read
;
2791 remaining
-= to_read
;
2793 to_read
= MIN (VMS_BLOCK_SIZE
, remaining
);
2796 /* Reset the record pointer. */
2797 PRIV (recrd
.rec
) = buf
;
2799 /* PR 17512: file: 7d7c57c2. */
2800 if (PRIV (recrd
.rec_size
) < sizeof (struct vms_eihd
))
2802 vms_debug2 ((2, "file type is image\n"));
2804 if (!_bfd_vms_slurp_eihd (abfd
, &eisd_offset
, &eihs_offset
))
2805 goto err_wrong_format
;
2807 if (!_bfd_vms_slurp_eisd (abfd
, eisd_offset
))
2808 goto err_wrong_format
;
2810 /* EIHS is optional. */
2811 if (eihs_offset
!= 0 && !_bfd_vms_slurp_eihs (abfd
, eihs_offset
))
2812 goto err_wrong_format
;
2818 /* Assume it's a module and adjust record pointer if necessary. */
2819 maybe_adjust_record_pointer_for_object (abfd
);
2821 /* But is it really a module? */
2822 if (bfd_getl16 (PRIV (recrd
.rec
)) <= EOBJ__C_MAXRECTYP
2823 && bfd_getl16 (PRIV (recrd
.rec
) + 2) <= EOBJ__C_MAXRECSIZ
)
2825 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
2826 goto err_wrong_format
;
2828 vms_debug2 ((2, "file type is module\n"));
2830 type
= bfd_getl16 (PRIV (recrd
.rec
));
2831 if (type
!= EOBJ__C_EMH
|| !_bfd_vms_slurp_ehdr (abfd
))
2832 goto err_wrong_format
;
2834 if (!_bfd_vms_slurp_object_records (abfd
))
2835 goto err_wrong_format
;
2838 goto err_wrong_format
;
2841 /* Set arch_info to alpha. */
2843 if (! bfd_default_set_arch_mach (abfd
, bfd_arch_alpha
, 0))
2844 goto err_wrong_format
;
2849 bfd_set_error (bfd_error_wrong_format
);
2852 alpha_vms_free_private (abfd
);
2853 if (abfd
->tdata
.any
!= tdata_save
&& abfd
->tdata
.any
!= NULL
)
2854 bfd_release (abfd
, abfd
->tdata
.any
);
2855 abfd
->tdata
.any
= tdata_save
;
2861 /* Write an EMH/MHD record. */
2864 _bfd_vms_write_emh (bfd
*abfd
)
2866 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2868 _bfd_vms_output_alignment (recwr
, 2);
2871 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2872 _bfd_vms_output_short (recwr
, EMH__C_MHD
);
2873 _bfd_vms_output_short (recwr
, EOBJ__C_STRLVL
);
2874 _bfd_vms_output_long (recwr
, 0);
2875 _bfd_vms_output_long (recwr
, 0);
2876 _bfd_vms_output_long (recwr
, MAX_OUTREC_SIZE
);
2878 /* Create module name from filename. */
2879 if (bfd_get_filename (abfd
) != 0)
2881 char *module
= vms_get_module_name (bfd_get_filename (abfd
), TRUE
);
2882 _bfd_vms_output_counted (recwr
, module
);
2886 _bfd_vms_output_counted (recwr
, "NONAME");
2888 _bfd_vms_output_counted (recwr
, BFD_VERSION_STRING
);
2889 _bfd_vms_output_dump (recwr
, get_vms_time_string (), EMH_DATE_LENGTH
);
2890 _bfd_vms_output_fill (recwr
, 0, EMH_DATE_LENGTH
);
2891 _bfd_vms_output_end (abfd
, recwr
);
2894 /* Write an EMH/LMN record. */
2897 _bfd_vms_write_lmn (bfd
*abfd
, const char *name
)
2900 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2901 unsigned int ver
= BFD_VERSION
/ 10000;
2904 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2905 _bfd_vms_output_short (recwr
, EMH__C_LNM
);
2906 snprintf (version
, sizeof (version
), "%s %d.%d.%d", name
,
2907 ver
/ 10000, (ver
/ 100) % 100, ver
% 100);
2908 _bfd_vms_output_dump (recwr
, (unsigned char *)version
, strlen (version
));
2909 _bfd_vms_output_end (abfd
, recwr
);
2913 /* Write eom record for bfd abfd. Return FALSE on error. */
2916 _bfd_vms_write_eeom (bfd
*abfd
)
2918 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2920 vms_debug2 ((2, "vms_write_eeom\n"));
2922 _bfd_vms_output_alignment (recwr
, 2);
2924 _bfd_vms_output_begin (recwr
, EOBJ__C_EEOM
);
2925 _bfd_vms_output_long (recwr
, PRIV (vms_linkage_index
+ 1) >> 1);
2926 _bfd_vms_output_byte (recwr
, 0); /* Completion code. */
2927 _bfd_vms_output_byte (recwr
, 0); /* Fill byte. */
2929 if ((abfd
->flags
& EXEC_P
) == 0
2930 && bfd_get_start_address (abfd
) != (bfd_vma
)-1)
2934 section
= bfd_get_section_by_name (abfd
, ".link");
2937 bfd_set_error (bfd_error_nonrepresentable_section
);
2940 _bfd_vms_output_short (recwr
, 0);
2941 _bfd_vms_output_long (recwr
, (unsigned long) section
->target_index
);
2942 _bfd_vms_output_long (recwr
,
2943 (unsigned long) bfd_get_start_address (abfd
));
2944 _bfd_vms_output_long (recwr
, 0);
2947 _bfd_vms_output_end (abfd
, recwr
);
2952 vector_grow1 (struct vector_type
*vec
, size_t elsz
)
2954 if (vec
->nbr_el
+ 1 < vec
->max_el
)
2957 if (vec
->max_el
== 0)
2960 vec
->els
= bfd_malloc2 (vec
->max_el
, elsz
);
2965 vec
->els
= bfd_realloc2 (vec
->els
, vec
->max_el
, elsz
);
2969 /* Bump ABFD file position to next block. */
2972 alpha_vms_file_position_block (bfd
*abfd
)
2975 PRIV (file_pos
) += VMS_BLOCK_SIZE
- 1;
2976 PRIV (file_pos
) -= (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
2979 /* Convert from internal structure SRC to external structure DST. */
2982 alpha_vms_swap_eisd_out (struct vms_internal_eisd_map
*src
,
2983 struct vms_eisd
*dst
)
2985 bfd_putl32 (src
->u
.eisd
.majorid
, dst
->majorid
);
2986 bfd_putl32 (src
->u
.eisd
.minorid
, dst
->minorid
);
2987 bfd_putl32 (src
->u
.eisd
.eisdsize
, dst
->eisdsize
);
2988 if (src
->u
.eisd
.eisdsize
<= EISD__K_LENEND
)
2990 bfd_putl32 (src
->u
.eisd
.secsize
, dst
->secsize
);
2991 bfd_putl64 (src
->u
.eisd
.virt_addr
, dst
->virt_addr
);
2992 bfd_putl32 (src
->u
.eisd
.flags
, dst
->flags
);
2993 bfd_putl32 (src
->u
.eisd
.vbn
, dst
->vbn
);
2994 dst
->pfc
= src
->u
.eisd
.pfc
;
2995 dst
->matchctl
= src
->u
.eisd
.matchctl
;
2996 dst
->type
= src
->u
.eisd
.type
;
2998 if (src
->u
.eisd
.flags
& EISD__M_GBL
)
3000 bfd_putl32 (src
->u
.gbl_eisd
.ident
, dst
->ident
);
3001 memcpy (dst
->gblnam
, src
->u
.gbl_eisd
.gblnam
,
3002 src
->u
.gbl_eisd
.gblnam
[0] + 1);
3006 /* Append EISD to the list of extra eisd for ABFD. */
3009 alpha_vms_append_extra_eisd (bfd
*abfd
, struct vms_internal_eisd_map
*eisd
)
3012 if (PRIV (gbl_eisd_head
) == NULL
)
3013 PRIV (gbl_eisd_head
) = eisd
;
3015 PRIV (gbl_eisd_tail
)->next
= eisd
;
3016 PRIV (gbl_eisd_tail
) = eisd
;
3019 /* Create an EISD for shared image SHRIMG.
3020 Return FALSE in case of error. */
3023 alpha_vms_create_eisd_for_shared (bfd
*abfd
, bfd
*shrimg
)
3025 struct vms_internal_eisd_map
*eisd
;
3028 namlen
= strlen (PRIV2 (shrimg
, hdr_data
.hdr_t_name
));
3029 if (namlen
+ 5 > EISD__K_GBLNAMLEN
)
3035 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
3039 /* Fill the fields. */
3040 eisd
->u
.gbl_eisd
.common
.majorid
= EISD__K_MAJORID
;
3041 eisd
->u
.gbl_eisd
.common
.minorid
= EISD__K_MINORID
;
3042 eisd
->u
.gbl_eisd
.common
.eisdsize
= (EISD__K_LEN
+ 4 + namlen
+ 5 + 3) & ~3;
3043 eisd
->u
.gbl_eisd
.common
.secsize
= VMS_BLOCK_SIZE
; /* Must not be 0. */
3044 eisd
->u
.gbl_eisd
.common
.virt_addr
= 0;
3045 eisd
->u
.gbl_eisd
.common
.flags
= EISD__M_GBL
;
3046 eisd
->u
.gbl_eisd
.common
.vbn
= 0;
3047 eisd
->u
.gbl_eisd
.common
.pfc
= 0;
3048 eisd
->u
.gbl_eisd
.common
.matchctl
= PRIV2 (shrimg
, matchctl
);
3049 eisd
->u
.gbl_eisd
.common
.type
= EISD__K_SHRPIC
;
3051 eisd
->u
.gbl_eisd
.ident
= PRIV2 (shrimg
, ident
);
3052 eisd
->u
.gbl_eisd
.gblnam
[0] = namlen
+ 4;
3053 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1, PRIV2 (shrimg
, hdr_data
.hdr_t_name
),
3055 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1 + namlen
, "_001", 4);
3057 /* Append it to the list. */
3058 alpha_vms_append_extra_eisd (abfd
, eisd
);
3063 /* Create an EISD for section SEC.
3064 Return FALSE in case of failure. */
3067 alpha_vms_create_eisd_for_section (bfd
*abfd
, asection
*sec
)
3069 struct vms_internal_eisd_map
*eisd
;
3071 /* Only for allocating section. */
3072 if (!(sec
->flags
& SEC_ALLOC
))
3075 BFD_ASSERT (vms_section_data (sec
)->eisd
== NULL
);
3076 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
3079 vms_section_data (sec
)->eisd
= eisd
;
3081 /* Fill the fields. */
3082 eisd
->u
.eisd
.majorid
= EISD__K_MAJORID
;
3083 eisd
->u
.eisd
.minorid
= EISD__K_MINORID
;
3084 eisd
->u
.eisd
.eisdsize
= EISD__K_LEN
;
3085 eisd
->u
.eisd
.secsize
=
3086 (sec
->size
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
3087 eisd
->u
.eisd
.virt_addr
= sec
->vma
;
3088 eisd
->u
.eisd
.flags
= 0;
3089 eisd
->u
.eisd
.vbn
= 0; /* To be later defined. */
3090 eisd
->u
.eisd
.pfc
= 0; /* Default. */
3091 eisd
->u
.eisd
.matchctl
= EISD__K_MATALL
;
3092 eisd
->u
.eisd
.type
= EISD__K_NORMAL
;
3094 if (sec
->flags
& SEC_CODE
)
3095 eisd
->u
.eisd
.flags
|= EISD__M_EXE
;
3096 if (!(sec
->flags
& SEC_READONLY
))
3097 eisd
->u
.eisd
.flags
|= EISD__M_WRT
| EISD__M_CRF
;
3099 /* If relocations or fixup will be applied, make this isect writeable. */
3100 if (sec
->flags
& SEC_RELOC
)
3101 eisd
->u
.eisd
.flags
|= EISD__M_WRT
| EISD__M_CRF
;
3103 if (!(sec
->flags
& SEC_HAS_CONTENTS
))
3105 eisd
->u
.eisd
.flags
|= EISD__M_DZRO
;
3106 eisd
->u
.eisd
.flags
&= ~EISD__M_CRF
;
3108 if (sec
->flags
& SEC_LINKER_CREATED
)
3110 if (strcmp (sec
->name
, "$FIXUP$") == 0)
3111 eisd
->u
.eisd
.flags
|= EISD__M_FIXUPVEC
;
3114 /* Append it to the list. */
3116 if (PRIV (eisd_head
) == NULL
)
3117 PRIV (eisd_head
) = eisd
;
3119 PRIV (eisd_tail
)->next
= eisd
;
3120 PRIV (eisd_tail
) = eisd
;
3125 /* Layout executable ABFD and write it to the disk.
3126 Return FALSE in case of failure. */
3129 alpha_vms_write_exec (bfd
*abfd
)
3131 struct vms_eihd eihd
;
3132 struct vms_eiha
*eiha
;
3133 struct vms_eihi
*eihi
;
3134 struct vms_eihs
*eihs
= NULL
;
3136 struct vms_internal_eisd_map
*first_eisd
;
3137 struct vms_internal_eisd_map
*eisd
;
3140 file_ptr gst_filepos
= 0;
3141 unsigned int lnkflags
= 0;
3143 /* Build the EIHD. */
3144 PRIV (file_pos
) = EIHD__C_LENGTH
;
3146 memset (&eihd
, 0, sizeof (eihd
));
3147 memset (eihd
.fill_2
, 0xff, sizeof (eihd
.fill_2
));
3149 bfd_putl32 (EIHD__K_MAJORID
, eihd
.majorid
);
3150 bfd_putl32 (EIHD__K_MINORID
, eihd
.minorid
);
3152 bfd_putl32 (sizeof (eihd
), eihd
.size
);
3153 bfd_putl32 (0, eihd
.isdoff
);
3154 bfd_putl32 (0, eihd
.activoff
);
3155 bfd_putl32 (0, eihd
.symdbgoff
);
3156 bfd_putl32 (0, eihd
.imgidoff
);
3157 bfd_putl32 (0, eihd
.patchoff
);
3158 bfd_putl64 (0, eihd
.iafva
);
3159 bfd_putl32 (0, eihd
.version_array_off
);
3161 bfd_putl32 (EIHD__K_EXE
, eihd
.imgtype
);
3162 bfd_putl32 (0, eihd
.subtype
);
3164 bfd_putl32 (0, eihd
.imgiocnt
);
3165 bfd_putl32 (-1, eihd
.privreqs
);
3166 bfd_putl32 (-1, eihd
.privreqs
+ 4);
3168 bfd_putl32 ((sizeof (eihd
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
3170 bfd_putl32 (0, eihd
.ident
);
3171 bfd_putl32 (0, eihd
.sysver
);
3174 bfd_putl32 (0, eihd
.symvect_size
);
3175 bfd_putl32 (16, eihd
.virt_mem_block_size
);
3176 bfd_putl32 (0, eihd
.ext_fixup_off
);
3177 bfd_putl32 (0, eihd
.noopt_psect_off
);
3178 bfd_putl32 (-1, eihd
.alias
);
3181 eiha
= (struct vms_eiha
*)((char *) &eihd
+ PRIV (file_pos
));
3182 bfd_putl32 (PRIV (file_pos
), eihd
.activoff
);
3183 PRIV (file_pos
) += sizeof (struct vms_eiha
);
3185 bfd_putl32 (sizeof (struct vms_eiha
), eiha
->size
);
3186 bfd_putl32 (0, eiha
->spare
);
3187 bfd_putl64 (PRIV (transfer_address
[0]), eiha
->tfradr1
);
3188 bfd_putl64 (PRIV (transfer_address
[1]), eiha
->tfradr2
);
3189 bfd_putl64 (PRIV (transfer_address
[2]), eiha
->tfradr3
);
3190 bfd_putl64 (PRIV (transfer_address
[3]), eiha
->tfradr4
);
3191 bfd_putl64 (0, eiha
->inishr
);
3194 eihi
= (struct vms_eihi
*)((char *) &eihd
+ PRIV (file_pos
));
3195 bfd_putl32 (PRIV (file_pos
), eihd
.imgidoff
);
3196 PRIV (file_pos
) += sizeof (struct vms_eihi
);
3198 bfd_putl32 (EIHI__K_MAJORID
, eihi
->majorid
);
3199 bfd_putl32 (EIHI__K_MINORID
, eihi
->minorid
);
3204 /* Set module name. */
3205 module
= vms_get_module_name (bfd_get_filename (abfd
), TRUE
);
3206 len
= strlen (module
);
3207 if (len
> sizeof (eihi
->imgnam
) - 1)
3208 len
= sizeof (eihi
->imgnam
) - 1;
3209 eihi
->imgnam
[0] = len
;
3210 memcpy (eihi
->imgnam
+ 1, module
, len
);
3218 vms_get_time (&hi
, &lo
);
3219 bfd_putl32 (lo
, eihi
->linktime
+ 0);
3220 bfd_putl32 (hi
, eihi
->linktime
+ 4);
3223 eihi
->linkid
[0] = 0;
3224 eihi
->imgbid
[0] = 0;
3227 dst
= PRIV (dst_section
);
3228 dmt
= bfd_get_section_by_name (abfd
, "$DMT$");
3229 if (dst
!= NULL
&& dst
->size
!= 0)
3231 eihs
= (struct vms_eihs
*)((char *) &eihd
+ PRIV (file_pos
));
3232 bfd_putl32 (PRIV (file_pos
), eihd
.symdbgoff
);
3233 PRIV (file_pos
) += sizeof (struct vms_eihs
);
3235 bfd_putl32 (EIHS__K_MAJORID
, eihs
->majorid
);
3236 bfd_putl32 (EIHS__K_MINORID
, eihs
->minorid
);
3237 bfd_putl32 (0, eihs
->dstvbn
);
3238 bfd_putl32 (0, eihs
->dstsize
);
3239 bfd_putl32 (0, eihs
->gstvbn
);
3240 bfd_putl32 (0, eihs
->gstsize
);
3241 bfd_putl32 (0, eihs
->dmtvbn
);
3242 bfd_putl32 (0, eihs
->dmtsize
);
3245 /* One EISD per section. */
3246 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3248 if (!alpha_vms_create_eisd_for_section (abfd
, sec
))
3252 /* Merge section EIDS which extra ones. */
3253 if (PRIV (eisd_tail
))
3254 PRIV (eisd_tail
)->next
= PRIV (gbl_eisd_head
);
3256 PRIV (eisd_head
) = PRIV (gbl_eisd_head
);
3257 if (PRIV (gbl_eisd_tail
))
3258 PRIV (eisd_tail
) = PRIV (gbl_eisd_tail
);
3260 first_eisd
= PRIV (eisd_head
);
3262 /* Add end of eisd. */
3265 eisd
= bfd_zalloc (abfd
, sizeof (*eisd
));
3268 eisd
->u
.eisd
.majorid
= 0;
3269 eisd
->u
.eisd
.minorid
= 0;
3270 eisd
->u
.eisd
.eisdsize
= 0;
3271 alpha_vms_append_extra_eisd (abfd
, eisd
);
3274 /* Place EISD in the file. */
3275 for (eisd
= first_eisd
; eisd
; eisd
= eisd
->next
)
3277 file_ptr room
= VMS_BLOCK_SIZE
- (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
3279 /* First block is a little bit special: there is a word at the end. */
3280 if (PRIV (file_pos
) < VMS_BLOCK_SIZE
&& room
> 2)
3282 if (room
< eisd
->u
.eisd
.eisdsize
+ EISD__K_LENEND
)
3283 alpha_vms_file_position_block (abfd
);
3285 eisd
->file_pos
= PRIV (file_pos
);
3286 PRIV (file_pos
) += eisd
->u
.eisd
.eisdsize
;
3288 if (eisd
->u
.eisd
.flags
& EISD__M_FIXUPVEC
)
3289 bfd_putl64 (eisd
->u
.eisd
.virt_addr
, eihd
.iafva
);
3292 if (first_eisd
!= NULL
)
3294 bfd_putl32 (first_eisd
->file_pos
, eihd
.isdoff
);
3295 /* Real size of end of eisd marker. */
3296 PRIV (file_pos
) += EISD__K_LENEND
;
3299 bfd_putl32 (PRIV (file_pos
), eihd
.size
);
3300 bfd_putl32 ((PRIV (file_pos
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
3303 /* Place sections. */
3304 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3306 if (!(sec
->flags
& SEC_HAS_CONTENTS
))
3309 eisd
= vms_section_data (sec
)->eisd
;
3311 /* Align on a block. */
3312 alpha_vms_file_position_block (abfd
);
3313 sec
->filepos
= PRIV (file_pos
);
3316 eisd
->u
.eisd
.vbn
= (sec
->filepos
/ VMS_BLOCK_SIZE
) + 1;
3318 PRIV (file_pos
) += sec
->size
;
3322 if (eihs
!= NULL
&& dst
!= NULL
)
3324 bfd_putl32 ((dst
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dstvbn
);
3325 bfd_putl32 (dst
->size
, eihs
->dstsize
);
3329 lnkflags
|= EIHD__M_DBGDMT
;
3330 bfd_putl32 ((dmt
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dmtvbn
);
3331 bfd_putl32 (dmt
->size
, eihs
->dmtsize
);
3333 if (PRIV (gsd_sym_count
) != 0)
3335 alpha_vms_file_position_block (abfd
);
3336 gst_filepos
= PRIV (file_pos
);
3337 bfd_putl32 ((gst_filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->gstvbn
);
3338 bfd_putl32 ((PRIV (gsd_sym_count
) + 4) / 5 + 4, eihs
->gstsize
);
3342 /* Write EISD in hdr. */
3343 for (eisd
= first_eisd
; eisd
&& eisd
->file_pos
< VMS_BLOCK_SIZE
;
3345 alpha_vms_swap_eisd_out
3346 (eisd
, (struct vms_eisd
*)((char *)&eihd
+ eisd
->file_pos
));
3348 /* Write first block. */
3349 bfd_putl32 (lnkflags
, eihd
.lnkflags
);
3350 if (bfd_bwrite (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
3353 /* Write remaining eisd. */
3356 unsigned char blk
[VMS_BLOCK_SIZE
];
3357 struct vms_internal_eisd_map
*next_eisd
;
3359 memset (blk
, 0xff, sizeof (blk
));
3360 while (eisd
!= NULL
)
3362 alpha_vms_swap_eisd_out
3364 (struct vms_eisd
*)(blk
+ (eisd
->file_pos
% VMS_BLOCK_SIZE
)));
3366 next_eisd
= eisd
->next
;
3367 if (next_eisd
== NULL
3368 || (next_eisd
->file_pos
/ VMS_BLOCK_SIZE
3369 != eisd
->file_pos
/ VMS_BLOCK_SIZE
))
3371 if (bfd_bwrite (blk
, sizeof (blk
), abfd
) != sizeof (blk
))
3374 memset (blk
, 0xff, sizeof (blk
));
3380 /* Write sections. */
3381 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3383 unsigned char blk
[VMS_BLOCK_SIZE
];
3386 if (sec
->size
== 0 || !(sec
->flags
& SEC_HAS_CONTENTS
))
3388 if (bfd_bwrite (sec
->contents
, sec
->size
, abfd
) != sec
->size
)
3392 len
= VMS_BLOCK_SIZE
- sec
->size
% VMS_BLOCK_SIZE
;
3393 if (len
!= VMS_BLOCK_SIZE
)
3395 memset (blk
, 0, len
);
3396 if (bfd_bwrite (blk
, len
, abfd
) != len
)
3402 if (gst_filepos
!= 0)
3404 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3407 _bfd_vms_write_emh (abfd
);
3408 _bfd_vms_write_lmn (abfd
, "GNU LD");
3410 /* PSC for the absolute section. */
3411 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3412 _bfd_vms_output_long (recwr
, 0);
3413 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3414 _bfd_vms_output_short (recwr
, 0);
3415 _bfd_vms_output_short (recwr
, EGPS__V_PIC
| EGPS__V_LIB
| EGPS__V_RD
);
3416 _bfd_vms_output_long (recwr
, 0);
3417 _bfd_vms_output_counted (recwr
, ".$$ABS$$.");
3418 _bfd_vms_output_end_subrec (recwr
);
3419 _bfd_vms_output_end (abfd
, recwr
);
3421 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
3423 struct vms_symbol_entry
*sym
= PRIV (syms
)[i
];
3429 _bfd_vms_output_alignment (recwr
, 8);
3430 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3431 _bfd_vms_output_long (recwr
, 0);
3433 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_SYMG
);
3434 _bfd_vms_output_short (recwr
, 0); /* Data type, alignment. */
3435 _bfd_vms_output_short (recwr
, sym
->flags
);
3437 if (sym
->code_section
)
3438 ep
= alpha_vms_get_sym_value (sym
->code_section
, sym
->code_value
);
3441 BFD_ASSERT (sym
->code_value
== 0);
3444 val
= alpha_vms_get_sym_value (sym
->section
, sym
->value
);
3445 _bfd_vms_output_quad
3446 (recwr
, sym
->typ
== EGSD__C_SYMG
? sym
->symbol_vector
: val
);
3447 _bfd_vms_output_quad (recwr
, ep
);
3448 _bfd_vms_output_quad (recwr
, val
);
3449 _bfd_vms_output_long (recwr
, 0);
3450 _bfd_vms_output_counted (recwr
, sym
->name
);
3451 _bfd_vms_output_end_subrec (recwr
);
3453 _bfd_vms_output_end (abfd
, recwr
);
3456 _bfd_vms_output_end (abfd
, recwr
);
3458 if (!_bfd_vms_write_eeom (abfd
))
3466 /* Write section and symbol directory of bfd abfd. Return FALSE on error. */
3469 _bfd_vms_write_egsd (bfd
*abfd
)
3473 unsigned int symnum
;
3475 flagword new_flags
, old_flags
;
3476 int abs_section_index
= -1;
3477 unsigned int target_index
= 0;
3478 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3480 vms_debug2 ((2, "vms_write_egsd\n"));
3482 /* Egsd is quadword aligned. */
3483 _bfd_vms_output_alignment (recwr
, 8);
3485 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3486 _bfd_vms_output_long (recwr
, 0);
3488 /* Number sections. */
3489 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
3491 if (section
->flags
& SEC_DEBUGGING
)
3493 if (!strcmp (section
->name
, ".vmsdebug"))
3495 section
->flags
|= SEC_DEBUGGING
;
3498 section
->target_index
= target_index
++;
3501 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
3503 vms_debug2 ((3, "Section #%d %s, %d bytes\n",
3504 section
->target_index
, section
->name
, (int)section
->size
));
3506 /* Don't write out the VMS debug info section since it is in the
3507 ETBT and EDBG sections in etir. */
3508 if (section
->flags
& SEC_DEBUGGING
)
3511 /* 13 bytes egsd, max 31 chars name -> should be 44 bytes. */
3512 if (_bfd_vms_output_check (recwr
, 64) < 0)
3514 _bfd_vms_output_end (abfd
, recwr
);
3515 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3516 _bfd_vms_output_long (recwr
, 0);
3519 /* Don't know if this is necessary for the linker but for now it keeps
3520 vms_slurp_gsd happy. */
3521 sname
= section
->name
;
3524 /* Remove leading dot. */
3526 if ((*sname
== 't') && (strcmp (sname
, "text") == 0))
3527 sname
= EVAX_CODE_NAME
;
3528 else if ((*sname
== 'd') && (strcmp (sname
, "data") == 0))
3529 sname
= EVAX_DATA_NAME
;
3530 else if ((*sname
== 'b') && (strcmp (sname
, "bss") == 0))
3531 sname
= EVAX_BSS_NAME
;
3532 else if ((*sname
== 'l') && (strcmp (sname
, "link") == 0))
3533 sname
= EVAX_LINK_NAME
;
3534 else if ((*sname
== 'r') && (strcmp (sname
, "rdata") == 0))
3535 sname
= EVAX_READONLY_NAME
;
3536 else if ((*sname
== 'l') && (strcmp (sname
, "literal") == 0))
3537 sname
= EVAX_LITERAL_NAME
;
3538 else if ((*sname
== 'l') && (strcmp (sname
, "literals") == 0))
3539 sname
= EVAX_LITERALS_NAME
;
3540 else if ((*sname
== 'c') && (strcmp (sname
, "comm") == 0))
3541 sname
= EVAX_COMMON_NAME
;
3542 else if ((*sname
== 'l') && (strcmp (sname
, "lcomm") == 0))
3543 sname
= EVAX_LOCAL_NAME
;
3546 if (bfd_is_com_section (section
))
3547 new_flags
= (EGPS__V_OVR
| EGPS__V_REL
| EGPS__V_GBL
| EGPS__V_RD
3548 | EGPS__V_WRT
| EGPS__V_NOMOD
| EGPS__V_COM
);
3550 new_flags
= vms_esecflag_by_name (evax_section_flags
, sname
,
3553 /* Modify them as directed. */
3554 if (section
->flags
& SEC_READONLY
)
3555 new_flags
&= ~EGPS__V_WRT
;
3557 new_flags
&= ~vms_section_data (section
)->no_flags
;
3558 new_flags
|= vms_section_data (section
)->flags
;
3560 vms_debug2 ((3, "sec flags %x\n", section
->flags
));
3561 vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
3562 new_flags
, (unsigned long)section
->size
));
3564 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3565 _bfd_vms_output_short (recwr
, section
->alignment_power
& 0xff);
3566 _bfd_vms_output_short (recwr
, new_flags
);
3567 _bfd_vms_output_long (recwr
, (unsigned long) section
->size
);
3568 _bfd_vms_output_counted (recwr
, sname
);
3569 _bfd_vms_output_end_subrec (recwr
);
3571 /* If the section is an obsolute one, remind its index as it will be
3572 used later for absolute symbols. */
3573 if ((new_flags
& EGPS__V_REL
) == 0 && abs_section_index
< 0)
3574 abs_section_index
= section
->target_index
;
3577 /* Output symbols. */
3578 vms_debug2 ((3, "%d symbols found\n", abfd
->symcount
));
3580 bfd_set_start_address (abfd
, (bfd_vma
) -1);
3582 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3584 symbol
= abfd
->outsymbols
[symnum
];
3585 old_flags
= symbol
->flags
;
3587 /* Work-around a missing feature: consider __main as the main entry
3589 if (symbol
->name
[0] == '_' && strcmp (symbol
->name
, "__main") == 0)
3590 bfd_set_start_address (abfd
, (bfd_vma
)symbol
->value
);
3592 /* Only put in the GSD the global and the undefined symbols. */
3593 if (old_flags
& BSF_FILE
)
3596 if ((old_flags
& BSF_GLOBAL
) == 0 && !bfd_is_und_section (symbol
->section
))
3598 /* If the LIB$INITIIALIZE section is present, add a reference to
3599 LIB$INITIALIZE symbol. FIXME: this should be done explicitely
3600 in the assembly file. */
3601 if (!((old_flags
& BSF_SECTION_SYM
) != 0
3602 && strcmp (symbol
->section
->name
, "LIB$INITIALIZE") == 0))
3606 /* 13 bytes egsd, max 64 chars name -> should be 77 bytes. Add 16 more
3607 bytes for a possible ABS section. */
3608 if (_bfd_vms_output_check (recwr
, 80 + 16) < 0)
3610 _bfd_vms_output_end (abfd
, recwr
);
3611 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3612 _bfd_vms_output_long (recwr
, 0);
3615 if ((old_flags
& BSF_GLOBAL
) != 0
3616 && bfd_is_abs_section (symbol
->section
)
3617 && abs_section_index
<= 0)
3619 /* Create an absolute section if none was defined. It is highly
3620 unlikely that the name $ABS$ clashes with a user defined
3621 non-absolute section name. */
3622 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3623 _bfd_vms_output_short (recwr
, 4);
3624 _bfd_vms_output_short (recwr
, EGPS__V_SHR
);
3625 _bfd_vms_output_long (recwr
, 0);
3626 _bfd_vms_output_counted (recwr
, "$ABS$");
3627 _bfd_vms_output_end_subrec (recwr
);
3629 abs_section_index
= target_index
++;
3632 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_SYM
);
3634 /* Data type, alignment. */
3635 _bfd_vms_output_short (recwr
, 0);
3639 if (old_flags
& BSF_WEAK
)
3640 new_flags
|= EGSY__V_WEAK
;
3641 if (bfd_is_com_section (symbol
->section
)) /* .comm */
3642 new_flags
|= (EGSY__V_WEAK
| EGSY__V_COMM
);
3644 if (old_flags
& BSF_FUNCTION
)
3646 new_flags
|= EGSY__V_NORM
;
3647 new_flags
|= EGSY__V_REL
;
3649 if (old_flags
& BSF_GLOBAL
)
3651 new_flags
|= EGSY__V_DEF
;
3652 if (!bfd_is_abs_section (symbol
->section
))
3653 new_flags
|= EGSY__V_REL
;
3655 _bfd_vms_output_short (recwr
, new_flags
);
3657 if (old_flags
& BSF_GLOBAL
)
3659 /* Symbol definition. */
3660 bfd_vma code_address
= 0;
3661 unsigned long ca_psindx
= 0;
3662 unsigned long psindx
;
3664 if ((old_flags
& BSF_FUNCTION
) && symbol
->udata
.p
!= NULL
)
3669 ((struct evax_private_udata_struct
*)symbol
->udata
.p
)->enbsym
;
3670 code_address
= sym
->value
;
3671 ca_psindx
= sym
->section
->target_index
;
3673 if (bfd_is_abs_section (symbol
->section
))
3674 psindx
= abs_section_index
;
3676 psindx
= symbol
->section
->target_index
;
3678 _bfd_vms_output_quad (recwr
, symbol
->value
);
3679 _bfd_vms_output_quad (recwr
, code_address
);
3680 _bfd_vms_output_long (recwr
, ca_psindx
);
3681 _bfd_vms_output_long (recwr
, psindx
);
3683 _bfd_vms_output_counted (recwr
, symbol
->name
);
3685 _bfd_vms_output_end_subrec (recwr
);
3688 _bfd_vms_output_alignment (recwr
, 8);
3689 _bfd_vms_output_end (abfd
, recwr
);
3694 /* Write object header for bfd abfd. Return FALSE on error. */
3697 _bfd_vms_write_ehdr (bfd
*abfd
)
3700 unsigned int symnum
;
3701 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3703 vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd
));
3705 _bfd_vms_output_alignment (recwr
, 2);
3707 _bfd_vms_write_emh (abfd
);
3708 _bfd_vms_write_lmn (abfd
, "GNU AS");
3711 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3712 _bfd_vms_output_short (recwr
, EMH__C_SRC
);
3714 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3716 symbol
= abfd
->outsymbols
[symnum
];
3718 if (symbol
->flags
& BSF_FILE
)
3720 _bfd_vms_output_dump (recwr
, (unsigned char *) symbol
->name
,
3721 (int) strlen (symbol
->name
));
3726 if (symnum
== abfd
->symcount
)
3727 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("noname"));
3729 _bfd_vms_output_end (abfd
, recwr
);
3732 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3733 _bfd_vms_output_short (recwr
, EMH__C_TTL
);
3734 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("TTL"));
3735 _bfd_vms_output_end (abfd
, recwr
);
3738 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3739 _bfd_vms_output_short (recwr
, EMH__C_CPR
);
3740 _bfd_vms_output_dump (recwr
,
3741 (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
3743 _bfd_vms_output_end (abfd
, recwr
);
3748 /* Part 4.6, relocations. */
3751 /* WRITE ETIR SECTION
3753 This is still under construction and therefore not documented. */
3755 /* Close the etir/etbt record. */
3758 end_etir_record (bfd
* abfd
)
3760 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3762 _bfd_vms_output_end (abfd
, recwr
);
3766 start_etir_or_etbt_record (bfd
*abfd
, asection
*section
, bfd_vma offset
)
3768 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3770 if (section
->flags
& SEC_DEBUGGING
)
3772 _bfd_vms_output_begin (recwr
, EOBJ__C_ETBT
);
3776 /* Push start offset. */
3777 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
3778 _bfd_vms_output_long (recwr
, (unsigned long) 0);
3779 _bfd_vms_output_end_subrec (recwr
);
3782 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_DFLOC
);
3783 _bfd_vms_output_end_subrec (recwr
);
3788 _bfd_vms_output_begin (recwr
, EOBJ__C_ETIR
);
3792 /* Push start offset. */
3793 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
3794 _bfd_vms_output_long (recwr
, (unsigned long) section
->target_index
);
3795 _bfd_vms_output_quad (recwr
, offset
);
3796 _bfd_vms_output_end_subrec (recwr
);
3798 /* Start = pop (). */
3799 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_SETRB
);
3800 _bfd_vms_output_end_subrec (recwr
);
3805 /* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
3806 address VADDR in section specified by SEC_INDEX and NAME. */
3809 sto_imm (bfd
*abfd
, asection
*section
,
3810 bfd_size_type ssize
, unsigned char *cptr
, bfd_vma vaddr
)
3813 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3816 _bfd_vms_debug (8, "sto_imm %d bytes\n", (int) ssize
);
3817 _bfd_hexdump (9, cptr
, (int) ssize
, (int) vaddr
);
3822 /* Try all the rest. */
3825 if (_bfd_vms_output_check (recwr
, size
) < 0)
3827 /* Doesn't fit, split ! */
3828 end_etir_record (abfd
);
3830 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3832 size
= _bfd_vms_output_check (recwr
, 0); /* get max size */
3833 if (size
> ssize
) /* more than what's left ? */
3837 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_IMM
);
3838 _bfd_vms_output_long (recwr
, (unsigned long) (size
));
3839 _bfd_vms_output_dump (recwr
, cptr
, size
);
3840 _bfd_vms_output_end_subrec (recwr
);
3843 _bfd_vms_debug (10, "dumped %d bytes\n", (int) size
);
3844 _bfd_hexdump (10, cptr
, (int) size
, (int) vaddr
);
3854 etir_output_check (bfd
*abfd
, asection
*section
, bfd_vma vaddr
, int checklen
)
3856 if (_bfd_vms_output_check (&PRIV (recwr
), checklen
) < 0)
3858 /* Not enough room in this record. Close it and open a new one. */
3859 end_etir_record (abfd
);
3860 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3864 /* Return whether RELOC must be deferred till the end. */
3867 defer_reloc_p (arelent
*reloc
)
3869 switch (reloc
->howto
->type
)
3882 /* Write section contents for bfd abfd. Return FALSE on error. */
3885 _bfd_vms_write_etir (bfd
* abfd
, int objtype ATTRIBUTE_UNUSED
)
3888 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3890 vms_debug2 ((2, "vms_write_tir (%p, %d)\n", abfd
, objtype
));
3892 _bfd_vms_output_alignment (recwr
, 4);
3894 PRIV (vms_linkage_index
) = 0;
3896 for (section
= abfd
->sections
; section
; section
= section
->next
)
3898 vms_debug2 ((4, "writing %d. section '%s' (%d bytes)\n",
3899 section
->target_index
, section
->name
, (int) (section
->size
)));
3901 if (!(section
->flags
& SEC_HAS_CONTENTS
)
3902 || bfd_is_com_section (section
))
3905 if (!section
->contents
)
3907 bfd_set_error (bfd_error_no_contents
);
3911 start_etir_or_etbt_record (abfd
, section
, 0);
3913 if (section
->flags
& SEC_RELOC
)
3915 bfd_vma curr_addr
= 0;
3916 unsigned char *curr_data
= section
->contents
;
3918 int pass2_needed
= 0;
3919 int pass2_in_progress
= 0;
3922 if (section
->reloc_count
== 0)
3924 (_("SEC_RELOC with no relocs in section %pA"), section
);
3929 int i
= section
->reloc_count
;
3930 arelent
**rptr
= section
->orelocation
;
3931 _bfd_vms_debug (4, "%d relocations:\n", i
);
3934 _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, "
3935 "addr %08lx, off %08lx, len %d: %s\n",
3936 (*(*rptr
)->sym_ptr_ptr
)->name
,
3937 (*(*rptr
)->sym_ptr_ptr
)->section
->name
,
3938 (long) (*(*rptr
)->sym_ptr_ptr
)->value
,
3939 (unsigned long)(*rptr
)->address
,
3940 (unsigned long)(*rptr
)->addend
,
3941 bfd_get_reloc_size ((*rptr
)->howto
),
3942 ( *rptr
)->howto
->name
);
3949 for (irel
= 0; irel
< section
->reloc_count
; irel
++)
3951 struct evax_private_udata_struct
*udata
;
3952 arelent
*rptr
= section
->orelocation
[irel
];
3953 bfd_vma addr
= rptr
->address
;
3954 asymbol
*sym
= *rptr
->sym_ptr_ptr
;
3955 asection
*sec
= sym
->section
;
3956 bfd_boolean defer
= defer_reloc_p (rptr
);
3959 if (pass2_in_progress
)
3961 /* Non-deferred relocs have already been output. */
3967 /* Deferred relocs must be output at the very end. */
3974 /* Regular relocs are intertwined with binary data. */
3975 if (curr_addr
> addr
)
3976 _bfd_error_handler (_("size error in section %pA"),
3978 size
= addr
- curr_addr
;
3979 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
3984 size
= bfd_get_reloc_size (rptr
->howto
);
3986 switch (rptr
->howto
->type
)
3988 case ALPHA_R_IGNORE
:
3991 case ALPHA_R_REFLONG
:
3992 if (bfd_is_und_section (sym
->section
))
3994 bfd_vma addend
= rptr
->addend
;
3995 slen
= strlen ((char *) sym
->name
);
3996 etir_output_check (abfd
, section
, curr_addr
, slen
);
3999 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
4000 _bfd_vms_output_counted (recwr
, sym
->name
);
4001 _bfd_vms_output_end_subrec (recwr
);
4002 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
4003 _bfd_vms_output_long (recwr
, (unsigned long) addend
);
4004 _bfd_vms_output_end_subrec (recwr
);
4005 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
4006 _bfd_vms_output_end_subrec (recwr
);
4007 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4008 _bfd_vms_output_end_subrec (recwr
);
4012 _bfd_vms_output_begin_subrec
4013 (recwr
, ETIR__C_STO_GBL_LW
);
4014 _bfd_vms_output_counted (recwr
, sym
->name
);
4015 _bfd_vms_output_end_subrec (recwr
);
4018 else if (bfd_is_abs_section (sym
->section
))
4020 etir_output_check (abfd
, section
, curr_addr
, 16);
4021 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
4022 _bfd_vms_output_long (recwr
, (unsigned long) sym
->value
);
4023 _bfd_vms_output_end_subrec (recwr
);
4024 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4025 _bfd_vms_output_end_subrec (recwr
);
4029 etir_output_check (abfd
, section
, curr_addr
, 32);
4030 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
4031 _bfd_vms_output_long (recwr
,
4032 (unsigned long) sec
->target_index
);
4033 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
4034 _bfd_vms_output_end_subrec (recwr
);
4035 /* ??? Table B-8 of the OpenVMS Linker Utilily Manual
4036 says that we should have a ETIR__C_STO_OFF here.
4037 But the relocation would not be BFD_RELOC_32 then.
4038 This case is very likely unreachable. */
4039 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4040 _bfd_vms_output_end_subrec (recwr
);
4044 case ALPHA_R_REFQUAD
:
4045 if (bfd_is_und_section (sym
->section
))
4047 bfd_vma addend
= rptr
->addend
;
4048 slen
= strlen ((char *) sym
->name
);
4049 etir_output_check (abfd
, section
, curr_addr
, slen
);
4052 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
4053 _bfd_vms_output_counted (recwr
, sym
->name
);
4054 _bfd_vms_output_end_subrec (recwr
);
4055 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
4056 _bfd_vms_output_quad (recwr
, addend
);
4057 _bfd_vms_output_end_subrec (recwr
);
4058 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
4059 _bfd_vms_output_end_subrec (recwr
);
4060 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
4061 _bfd_vms_output_end_subrec (recwr
);
4065 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_GBL
);
4066 _bfd_vms_output_counted (recwr
, sym
->name
);
4067 _bfd_vms_output_end_subrec (recwr
);
4070 else if (bfd_is_abs_section (sym
->section
))
4072 etir_output_check (abfd
, section
, curr_addr
, 16);
4073 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
4074 _bfd_vms_output_quad (recwr
, sym
->value
);
4075 _bfd_vms_output_end_subrec (recwr
);
4076 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
4077 _bfd_vms_output_end_subrec (recwr
);
4081 etir_output_check (abfd
, section
, curr_addr
, 32);
4082 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
4083 _bfd_vms_output_long (recwr
,
4084 (unsigned long) sec
->target_index
);
4085 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
4086 _bfd_vms_output_end_subrec (recwr
);
4087 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_OFF
);
4088 _bfd_vms_output_end_subrec (recwr
);
4093 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
4096 case ALPHA_R_LINKAGE
:
4098 etir_output_check (abfd
, section
, curr_addr
, 64);
4099 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LP_PSB
);
4100 _bfd_vms_output_long
4101 (recwr
, (unsigned long) rptr
->addend
);
4102 if (rptr
->addend
> PRIV (vms_linkage_index
))
4103 PRIV (vms_linkage_index
) = rptr
->addend
;
4104 _bfd_vms_output_counted (recwr
, sym
->name
);
4105 _bfd_vms_output_byte (recwr
, 0);
4106 _bfd_vms_output_end_subrec (recwr
);
4109 case ALPHA_R_CODEADDR
:
4110 slen
= strlen ((char *) sym
->name
);
4111 etir_output_check (abfd
, section
, curr_addr
, slen
);
4112 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_CA
);
4113 _bfd_vms_output_counted (recwr
, sym
->name
);
4114 _bfd_vms_output_end_subrec (recwr
);
4119 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4120 etir_output_check (abfd
, section
, curr_addr
,
4121 32 + 1 + strlen (udata
->origname
));
4122 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_NOP_GBL
);
4123 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
4124 _bfd_vms_output_long
4125 (recwr
, (unsigned long) section
->target_index
);
4126 _bfd_vms_output_quad (recwr
, rptr
->address
);
4127 _bfd_vms_output_long (recwr
, (unsigned long) 0x47ff041f);
4128 _bfd_vms_output_long
4129 (recwr
, (unsigned long) section
->target_index
);
4130 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4131 _bfd_vms_output_counted (recwr
, udata
->origname
);
4132 _bfd_vms_output_end_subrec (recwr
);
4136 _bfd_error_handler (_("spurious ALPHA_R_BSR reloc"));
4141 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4142 etir_output_check (abfd
, section
, curr_addr
,
4143 32 + 1 + strlen (udata
->origname
));
4144 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LDA_GBL
);
4145 _bfd_vms_output_long
4146 (recwr
, (unsigned long) udata
->lkindex
+ 1);
4147 _bfd_vms_output_long
4148 (recwr
, (unsigned long) section
->target_index
);
4149 _bfd_vms_output_quad (recwr
, rptr
->address
);
4150 _bfd_vms_output_long (recwr
, (unsigned long) 0x237B0000);
4151 _bfd_vms_output_long
4152 (recwr
, (unsigned long) udata
->bsym
->section
->target_index
);
4153 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4154 _bfd_vms_output_counted (recwr
, udata
->origname
);
4155 _bfd_vms_output_end_subrec (recwr
);
4160 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4161 etir_output_check (abfd
, section
, curr_addr
,
4162 32 + 1 + strlen (udata
->origname
));
4163 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_BOH_GBL
);
4164 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
4165 _bfd_vms_output_long
4166 (recwr
, (unsigned long) section
->target_index
);
4167 _bfd_vms_output_quad (recwr
, rptr
->address
);
4168 _bfd_vms_output_long (recwr
, (unsigned long) 0xD3400000);
4169 _bfd_vms_output_long
4170 (recwr
, (unsigned long) section
->target_index
);
4171 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4172 _bfd_vms_output_counted (recwr
, udata
->origname
);
4173 _bfd_vms_output_end_subrec (recwr
);
4177 _bfd_error_handler (_("unhandled relocation %s"),
4184 } /* End of relocs loop. */
4186 if (!pass2_in_progress
)
4188 /* Output rest of section. */
4189 if (curr_addr
> section
->size
)
4191 _bfd_error_handler (_("size error in section %pA"), section
);
4194 size
= section
->size
- curr_addr
;
4195 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
4201 pass2_in_progress
= 1;
4207 else /* (section->flags & SEC_RELOC) */
4208 sto_imm (abfd
, section
, section
->size
, section
->contents
, 0);
4210 end_etir_record (abfd
);
4213 _bfd_vms_output_alignment (recwr
, 2);
4217 /* Write cached information into a file being written, at bfd_close. */
4220 alpha_vms_write_object_contents (bfd
*abfd
)
4222 vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd
));
4224 if (abfd
->flags
& (EXEC_P
| DYNAMIC
))
4226 return alpha_vms_write_exec (abfd
);
4230 if (abfd
->section_count
> 0) /* we have sections */
4232 if (!_bfd_vms_write_ehdr (abfd
))
4234 if (!_bfd_vms_write_egsd (abfd
))
4236 if (!_bfd_vms_write_etir (abfd
, EOBJ__C_ETIR
))
4238 if (!_bfd_vms_write_eeom (abfd
))
4245 /* Debug stuff: nearest line. */
4247 #define SET_MODULE_PARSED(m) \
4248 do { if ((m)->name == NULL) (m)->name = ""; } while (0)
4249 #define IS_MODULE_PARSED(m) ((m)->name != NULL)
4251 /* Build a new module for the specified BFD. */
4253 static struct module
*
4254 new_module (bfd
*abfd
)
4256 struct module
*module
4257 = (struct module
*) bfd_zalloc (abfd
, sizeof (struct module
));
4258 module
->file_table_count
= 16; /* Arbitrary. */
4260 = bfd_malloc (module
->file_table_count
* sizeof (struct fileinfo
));
4264 /* Parse debug info for a module and internalize it. */
4267 parse_module (bfd
*abfd
, struct module
*module
, unsigned char *ptr
,
4270 unsigned char *maxptr
= ptr
+ length
;
4271 unsigned char *src_ptr
, *pcl_ptr
;
4272 unsigned int prev_linum
= 0, curr_linenum
= 0;
4273 bfd_vma prev_pc
= 0, curr_pc
= 0;
4274 struct srecinfo
*curr_srec
, *srec
;
4275 struct lineinfo
*curr_line
, *line
;
4276 struct funcinfo
*funcinfo
;
4278 /* Initialize tables with zero element. */
4279 curr_srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4280 module
->srec_table
= curr_srec
;
4282 curr_line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4283 module
->line_table
= curr_line
;
4285 while (length
== -1 || ptr
< maxptr
)
4287 /* The first byte is not counted in the recorded length. */
4288 int rec_length
= bfd_getl16 (ptr
) + 1;
4289 int rec_type
= bfd_getl16 (ptr
+ 2);
4291 vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length
, rec_type
));
4293 if (length
== -1 && rec_type
== DST__K_MODEND
)
4300 = _bfd_vms_save_counted_string (abfd
, ptr
+ DST_S_B_MODBEG_NAME
,
4301 maxptr
- (ptr
+ DST_S_B_MODBEG_NAME
));
4308 vms_debug2 ((3, "module: %s\n", module
->name
));
4315 funcinfo
= (struct funcinfo
*)
4316 bfd_zalloc (abfd
, sizeof (struct funcinfo
));
4318 = _bfd_vms_save_counted_string (abfd
, ptr
+ DST_S_B_RTNBEG_NAME
,
4319 maxptr
- (ptr
+ DST_S_B_RTNBEG_NAME
));
4320 funcinfo
->low
= bfd_getl32 (ptr
+ DST_S_L_RTNBEG_ADDRESS
);
4321 funcinfo
->next
= module
->func_table
;
4322 module
->func_table
= funcinfo
;
4324 vms_debug2 ((3, "routine: %s at 0x%lx\n",
4325 funcinfo
->name
, (unsigned long) funcinfo
->low
));
4329 module
->func_table
->high
= module
->func_table
->low
4330 + bfd_getl32 (ptr
+ DST_S_L_RTNEND_SIZE
) - 1;
4332 if (module
->func_table
->high
> module
->high
)
4333 module
->high
= module
->func_table
->high
;
4335 vms_debug2 ((3, "end routine\n"));
4339 vms_debug2 ((3, "prologue\n"));
4343 vms_debug2 ((3, "epilog\n"));
4347 vms_debug2 ((3, "block\n"));
4351 vms_debug2 ((3, "end block\n"));
4355 src_ptr
= ptr
+ DST_S_C_SOURCE_HEADER_SIZE
;
4357 vms_debug2 ((3, "source info\n"));
4359 while (src_ptr
< ptr
+ rec_length
)
4361 int cmd
= src_ptr
[0], cmd_length
, data
;
4365 case DST__K_SRC_DECLFILE
:
4368 = bfd_getl16 (src_ptr
+ DST_S_W_SRC_DF_FILEID
);
4369 char *filename
= _bfd_vms_save_counted_string
4371 src_ptr
+ DST_S_B_SRC_DF_FILENAME
,
4372 ptr
+ rec_length
- (src_ptr
+ DST_S_B_SRC_DF_FILENAME
));
4374 while (fileid
>= module
->file_table_count
)
4376 module
->file_table_count
*= 2;
4378 = bfd_realloc (module
->file_table
,
4379 module
->file_table_count
4380 * sizeof (struct fileinfo
));
4383 module
->file_table
[fileid
].name
= filename
;
4384 module
->file_table
[fileid
].srec
= 1;
4385 cmd_length
= src_ptr
[DST_S_B_SRC_DF_LENGTH
] + 2;
4386 vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4387 fileid
, module
->file_table
[fileid
].name
));
4391 case DST__K_SRC_DEFLINES_B
:
4392 /* Perform the association and set the next higher index
4394 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4395 srec
= (struct srecinfo
*)
4396 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4397 srec
->line
= curr_srec
->line
+ data
;
4398 srec
->srec
= curr_srec
->srec
+ data
;
4399 srec
->sfile
= curr_srec
->sfile
;
4400 curr_srec
->next
= srec
;
4403 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data
));
4406 case DST__K_SRC_DEFLINES_W
:
4407 /* Perform the association and set the next higher index
4409 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4410 srec
= (struct srecinfo
*)
4411 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4412 srec
->line
= curr_srec
->line
+ data
;
4413 srec
->srec
= curr_srec
->srec
+ data
,
4414 srec
->sfile
= curr_srec
->sfile
;
4415 curr_srec
->next
= srec
;
4418 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data
));
4421 case DST__K_SRC_INCRLNUM_B
:
4422 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4423 curr_srec
->line
+= data
;
4425 vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data
));
4428 case DST__K_SRC_SETFILE
:
4429 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4430 curr_srec
->sfile
= data
;
4431 curr_srec
->srec
= module
->file_table
[data
].srec
;
4433 vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data
));
4436 case DST__K_SRC_SETLNUM_L
:
4437 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4438 curr_srec
->line
= data
;
4440 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data
));
4443 case DST__K_SRC_SETLNUM_W
:
4444 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4445 curr_srec
->line
= data
;
4447 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data
));
4450 case DST__K_SRC_SETREC_L
:
4451 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4452 curr_srec
->srec
= data
;
4453 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4455 vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data
));
4458 case DST__K_SRC_SETREC_W
:
4459 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4460 curr_srec
->srec
= data
;
4461 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4463 vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data
));
4466 case DST__K_SRC_FORMFEED
:
4468 vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4472 _bfd_error_handler (_("unknown source command %d"),
4478 src_ptr
+= cmd_length
;
4482 case DST__K_LINE_NUM
:
4483 pcl_ptr
= ptr
+ DST_S_C_LINE_NUM_HEADER_SIZE
;
4485 vms_debug2 ((3, "line info\n"));
4487 while (pcl_ptr
< ptr
+ rec_length
)
4489 /* The command byte is signed so we must sign-extend it. */
4490 int cmd
= ((signed char *)pcl_ptr
)[0], cmd_length
, data
;
4494 case DST__K_DELTA_PC_W
:
4495 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4499 vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data
));
4502 case DST__K_DELTA_PC_L
:
4503 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4507 vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data
));
4510 case DST__K_INCR_LINUM
:
4511 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4512 curr_linenum
+= data
;
4514 vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data
));
4517 case DST__K_INCR_LINUM_W
:
4518 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4519 curr_linenum
+= data
;
4521 vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data
));
4524 case DST__K_INCR_LINUM_L
:
4525 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4526 curr_linenum
+= data
;
4528 vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data
));
4531 case DST__K_SET_LINUM_INCR
:
4533 (_("%s not implemented"), "DST__K_SET_LINUM_INCR");
4537 case DST__K_SET_LINUM_INCR_W
:
4539 (_("%s not implemented"), "DST__K_SET_LINUM_INCR_W");
4543 case DST__K_RESET_LINUM_INCR
:
4545 (_("%s not implemented"), "DST__K_RESET_LINUM_INCR");
4549 case DST__K_BEG_STMT_MODE
:
4551 (_("%s not implemented"), "DST__K_BEG_STMT_MODE");
4555 case DST__K_END_STMT_MODE
:
4557 (_("%s not implemented"), "DST__K_END_STMT_MODE");
4561 case DST__K_SET_LINUM_B
:
4562 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4563 curr_linenum
= data
;
4565 vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data
));
4568 case DST__K_SET_LINUM
:
4569 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4570 curr_linenum
= data
;
4572 vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data
));
4575 case DST__K_SET_LINUM_L
:
4576 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4577 curr_linenum
= data
;
4579 vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data
));
4584 (_("%s not implemented"), "DST__K_SET_PC");
4588 case DST__K_SET_PC_W
:
4590 (_("%s not implemented"), "DST__K_SET_PC_W");
4594 case DST__K_SET_PC_L
:
4596 (_("%s not implemented"), "DST__K_SET_PC_L");
4600 case DST__K_SET_STMTNUM
:
4602 (_("%s not implemented"), "DST__K_SET_STMTNUM");
4607 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4610 vms_debug2 ((4, "DST__K_TERM: %d\n", data
));
4614 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4617 vms_debug2 ((4, "DST__K_TERM_W: %d\n", data
));
4621 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4624 vms_debug2 ((4, "DST__K_TERM_L: %d\n", data
));
4627 case DST__K_SET_ABS_PC
:
4628 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4631 vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data
));
4640 vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4641 (unsigned long)curr_pc
, curr_linenum
));
4645 _bfd_error_handler (_("unknown line command %d"), cmd
);
4651 if ((curr_linenum
!= prev_linum
&& curr_pc
!= prev_pc
)
4653 || cmd
== DST__K_DELTA_PC_L
4654 || cmd
== DST__K_DELTA_PC_W
)
4656 line
= (struct lineinfo
*)
4657 bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4658 line
->address
= curr_pc
;
4659 line
->line
= curr_linenum
;
4661 curr_line
->next
= line
;
4664 prev_linum
= curr_linenum
;
4666 vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4667 (unsigned long)curr_pc
, curr_linenum
));
4670 pcl_ptr
+= cmd_length
;
4674 case 0x17: /* Undocumented type used by DEC C to declare equates. */
4675 vms_debug2 ((3, "undocumented type 0x17\n"));
4679 vms_debug2 ((3, "ignoring record\n"));
4687 /* Finalize tables with EOL marker. */
4688 srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4689 srec
->line
= (unsigned int) -1;
4690 srec
->srec
= (unsigned int) -1;
4691 curr_srec
->next
= srec
;
4693 line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4694 line
->line
= (unsigned int) -1;
4695 line
->address
= (bfd_vma
) -1;
4696 curr_line
->next
= line
;
4698 /* Advertise that this module has been parsed. This is needed
4699 because parsing can be either performed at module creation
4700 or deferred until debug info is consumed. */
4701 SET_MODULE_PARSED (module
);
4704 /* Build the list of modules for the specified BFD. */
4706 static struct module
*
4707 build_module_list (bfd
*abfd
)
4709 struct module
*module
, *list
= NULL
;
4712 if ((dmt
= bfd_get_section_by_name (abfd
, "$DMT$")))
4714 /* We have a DMT section so this must be an image. Parse the
4715 section and build the list of modules. This is sufficient
4716 since we can compute the start address and the end address
4717 of every module from the section contents. */
4718 bfd_size_type size
= bfd_section_size (dmt
);
4719 unsigned char *ptr
, *end
;
4721 ptr
= (unsigned char *) bfd_alloc (abfd
, size
);
4725 if (! bfd_get_section_contents (abfd
, dmt
, ptr
, 0, size
))
4728 vms_debug2 ((2, "DMT\n"));
4734 /* Each header declares a module with its start offset and size
4735 of debug info in the DST section, as well as the count of
4736 program sections (i.e. address spans) it contains. */
4737 int modbeg
= bfd_getl32 (ptr
+ DBG_S_L_DMT_MODBEG
);
4738 int msize
= bfd_getl32 (ptr
+ DBG_S_L_DST_SIZE
);
4739 int count
= bfd_getl16 (ptr
+ DBG_S_W_DMT_PSECT_COUNT
);
4740 ptr
+= DBG_S_C_DMT_HEADER_SIZE
;
4742 vms_debug2 ((3, "module: modbeg = %d, size = %d, count = %d\n",
4743 modbeg
, msize
, count
));
4745 /* We create a 'module' structure for each program section since
4746 we only support contiguous addresses in a 'module' structure.
4747 As a consequence, the actual debug info in the DST section is
4748 shared and can be parsed multiple times; that doesn't seem to
4749 cause problems in practice. */
4752 int start
= bfd_getl32 (ptr
+ DBG_S_L_DMT_PSECT_START
);
4753 int length
= bfd_getl32 (ptr
+ DBG_S_L_DMT_PSECT_LENGTH
);
4754 module
= new_module (abfd
);
4755 module
->modbeg
= modbeg
;
4756 module
->size
= msize
;
4757 module
->low
= start
;
4758 module
->high
= start
+ length
;
4759 module
->next
= list
;
4761 ptr
+= DBG_S_C_DMT_PSECT_SIZE
;
4763 vms_debug2 ((4, "section: start = 0x%x, length = %d\n",
4770 /* We don't have a DMT section so this must be an object. Parse
4771 the module right now in order to compute its start address and
4773 void *dst
= PRIV (dst_section
)->contents
;
4778 module
= new_module (abfd
);
4779 parse_module (abfd
, module
, PRIV (dst_section
)->contents
, -1);
4786 /* Calculate and return the name of the source file and the line nearest
4787 to the wanted location in the specified module. */
4790 module_find_nearest_line (bfd
*abfd
, struct module
*module
, bfd_vma addr
,
4791 const char **file
, const char **func
,
4794 struct funcinfo
*funcinfo
;
4795 struct lineinfo
*lineinfo
;
4796 struct srecinfo
*srecinfo
;
4797 bfd_boolean ret
= FALSE
;
4799 /* Parse this module if that was not done at module creation. */
4800 if (! IS_MODULE_PARSED (module
))
4802 unsigned int size
= module
->size
;
4803 unsigned int modbeg
= PRIV (dst_section
)->filepos
+ module
->modbeg
;
4804 unsigned char *buffer
= (unsigned char *) bfd_malloc (module
->size
);
4806 if (bfd_seek (abfd
, modbeg
, SEEK_SET
) != 0
4807 || bfd_bread (buffer
, size
, abfd
) != size
)
4809 bfd_set_error (bfd_error_no_debug_section
);
4813 parse_module (abfd
, module
, buffer
, size
);
4817 /* Find out the function (if any) that contains the address. */
4818 for (funcinfo
= module
->func_table
; funcinfo
; funcinfo
= funcinfo
->next
)
4819 if (addr
>= funcinfo
->low
&& addr
<= funcinfo
->high
)
4821 *func
= funcinfo
->name
;
4826 /* Find out the source file and the line nearest to the address. */
4827 for (lineinfo
= module
->line_table
; lineinfo
; lineinfo
= lineinfo
->next
)
4828 if (lineinfo
->next
&& addr
< lineinfo
->next
->address
)
4830 for (srecinfo
= module
->srec_table
; srecinfo
; srecinfo
= srecinfo
->next
)
4831 if (srecinfo
->next
&& lineinfo
->line
< srecinfo
->next
->line
)
4833 if (srecinfo
->sfile
> 0)
4835 *file
= module
->file_table
[srecinfo
->sfile
].name
;
4836 *line
= srecinfo
->srec
+ lineinfo
->line
- srecinfo
->line
;
4840 *file
= module
->name
;
4841 *line
= lineinfo
->line
;
4852 /* Provided a BFD, a section and an offset into the section, calculate and
4853 return the name of the source file and the line nearest to the wanted
4857 _bfd_vms_find_nearest_line (bfd
*abfd
,
4858 asymbol
**symbols ATTRIBUTE_UNUSED
,
4864 unsigned int *discriminator
)
4866 struct module
*module
;
4868 /* What address are we looking for? */
4869 bfd_vma addr
= section
->vma
+ offset
;
4877 /* We can't do anything if there is no DST (debug symbol table). */
4878 if (PRIV (dst_section
) == NULL
)
4881 /* Create the module list - if not already done. */
4882 if (PRIV (modules
) == NULL
)
4884 PRIV (modules
) = build_module_list (abfd
);
4885 if (PRIV (modules
) == NULL
)
4889 for (module
= PRIV (modules
); module
; module
= module
->next
)
4890 if (addr
>= module
->low
&& addr
<= module
->high
)
4891 return module_find_nearest_line (abfd
, module
, addr
, file
, func
, line
);
4896 /* Canonicalizations. */
4897 /* Set name, value, section and flags of SYM from E. */
4900 alpha_vms_convert_symbol (bfd
*abfd
, struct vms_symbol_entry
*e
, asymbol
*sym
)
4909 flags
= BSF_NO_FLAGS
;
4915 if (e
->flags
& EGSY__V_WEAK
)
4918 if (e
->flags
& EGSY__V_DEF
)
4920 /* Symbol definition. */
4921 flags
|= BSF_GLOBAL
;
4922 if (e
->flags
& EGSY__V_NORM
)
4923 flags
|= BSF_FUNCTION
;
4929 /* Symbol reference. */
4930 sec
= bfd_und_section_ptr
;
4935 /* A universal symbol is by definition global... */
4936 flags
|= BSF_GLOBAL
;
4938 /* ...and dynamic in shared libraries. */
4939 if (abfd
->flags
& DYNAMIC
)
4940 flags
|= BSF_DYNAMIC
;
4942 if (e
->flags
& EGSY__V_WEAK
)
4945 if (!(e
->flags
& EGSY__V_DEF
))
4948 if (e
->flags
& EGSY__V_NORM
)
4949 flags
|= BSF_FUNCTION
;
4952 /* sec = e->section; */
4953 sec
= bfd_abs_section_ptr
;
4968 /* Return the number of bytes required to store a vector of pointers
4969 to asymbols for all the symbols in the BFD abfd, including a
4970 terminal NULL pointer. If there are no symbols in the BFD,
4971 then return 0. If an error occurs, return -1. */
4974 alpha_vms_get_symtab_upper_bound (bfd
*abfd
)
4976 vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
4977 abfd
, PRIV (gsd_sym_count
)));
4979 return (PRIV (gsd_sym_count
) + 1) * sizeof (asymbol
*);
4982 /* Read the symbols from the BFD abfd, and fills in the vector
4983 location with pointers to the symbols and a trailing NULL.
4985 Return number of symbols read. */
4988 alpha_vms_canonicalize_symtab (bfd
*abfd
, asymbol
**symbols
)
4992 vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd
));
4994 if (PRIV (csymbols
) == NULL
)
4996 PRIV (csymbols
) = (asymbol
**) bfd_alloc
4997 (abfd
, PRIV (gsd_sym_count
) * sizeof (asymbol
*));
4999 /* Traverse table and fill symbols vector. */
5000 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5002 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
5005 sym
= bfd_make_empty_symbol (abfd
);
5006 if (sym
== NULL
|| !alpha_vms_convert_symbol (abfd
, e
, sym
))
5008 bfd_release (abfd
, PRIV (csymbols
));
5009 PRIV (csymbols
) = NULL
;
5013 PRIV (csymbols
)[i
] = sym
;
5017 if (symbols
!= NULL
)
5019 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5020 symbols
[i
] = PRIV (csymbols
)[i
];
5024 return PRIV (gsd_sym_count
);
5027 /* Read and convert relocations from ETIR. We do it once for all sections. */
5030 alpha_vms_slurp_relocs (bfd
*abfd
)
5034 vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
5036 /* We slurp relocs only once, for all sections. */
5037 if (PRIV (reloc_done
))
5039 PRIV (reloc_done
) = TRUE
;
5041 if (alpha_vms_canonicalize_symtab (abfd
, NULL
) < 0)
5044 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
5049 unsigned char *begin
;
5052 bfd_reloc_code_real_type reloc_code
;
5058 bfd_vma cur_address
;
5060 unsigned char *cur_sym
= NULL
;
5062 bfd_vma cur_addend
= 0;
5064 /* Skip non-ETIR records. */
5065 type
= _bfd_vms_get_object_record (abfd
);
5066 if (type
== EOBJ__C_EEOM
)
5068 if (type
!= EOBJ__C_ETIR
)
5071 begin
= PRIV (recrd
.rec
) + 4;
5072 end
= PRIV (recrd
.rec
) + PRIV (recrd
.rec_size
);
5074 for (ptr
= begin
; ptr
< end
; ptr
+= length
)
5078 cmd
= bfd_getl16 (ptr
);
5079 length
= bfd_getl16 (ptr
+ 2);
5081 cur_address
= vaddr
;
5083 vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
5084 _bfd_vms_etir_name (cmd
)));
5088 case ETIR__C_STA_GBL
: /* ALPHA_R_REFLONG und_section, step 1 */
5089 /* ALPHA_R_REFQUAD und_section, step 1 */
5094 case ETIR__C_STA_PQ
: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
5095 cur_psidx
= bfd_getl32 (ptr
+ 4);
5096 cur_addend
= bfd_getl64 (ptr
+ 8);
5100 case ETIR__C_CTL_SETRB
:
5101 if (prev_cmd
!= ETIR__C_STA_PQ
)
5104 /* xgettext:c-format */
5105 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd
),
5106 _bfd_vms_etir_name (cmd
));
5109 cur_psect
= cur_psidx
;
5115 case ETIR__C_STA_LW
: /* ALPHA_R_REFLONG abs_section, step 1 */
5116 /* ALPHA_R_REFLONG und_section, step 2 */
5119 if (prev_cmd
!= ETIR__C_STA_GBL
)
5122 /* xgettext:c-format */
5123 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
5124 _bfd_vms_etir_name (ETIR__C_STA_LW
));
5128 cur_addend
= bfd_getl32 (ptr
+ 4);
5132 case ETIR__C_STA_QW
: /* ALPHA_R_REFQUAD abs_section, step 1 */
5133 /* ALPHA_R_REFQUAD und_section, step 2 */
5134 if (prev_cmd
!= -1 && prev_cmd
!= ETIR__C_STA_GBL
)
5137 /* xgettext:c-format */
5138 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
5139 _bfd_vms_etir_name (ETIR__C_STA_QW
));
5142 cur_addend
= bfd_getl64 (ptr
+ 4);
5146 case ETIR__C_STO_LW
: /* ALPHA_R_REFLONG und_section, step 4 */
5147 /* ALPHA_R_REFLONG abs_section, step 2 */
5148 /* ALPHA_R_REFLONG others, step 2 */
5149 if (prev_cmd
!= ETIR__C_OPR_ADD
5150 && prev_cmd
!= ETIR__C_STA_LW
5151 && prev_cmd
!= ETIR__C_STA_PQ
)
5153 /* xgettext:c-format */
5154 _bfd_error_handler (_("unknown reloc %s + %s"),
5155 _bfd_vms_etir_name (prev_cmd
),
5156 _bfd_vms_etir_name (ETIR__C_STO_LW
));
5159 reloc_code
= BFD_RELOC_32
;
5162 case ETIR__C_STO_QW
: /* ALPHA_R_REFQUAD und_section, step 4 */
5163 /* ALPHA_R_REFQUAD abs_section, step 2 */
5164 if (prev_cmd
!= ETIR__C_OPR_ADD
&& prev_cmd
!= ETIR__C_STA_QW
)
5166 /* xgettext:c-format */
5167 _bfd_error_handler (_("unknown reloc %s + %s"),
5168 _bfd_vms_etir_name (prev_cmd
),
5169 _bfd_vms_etir_name (ETIR__C_STO_QW
));
5172 reloc_code
= BFD_RELOC_64
;
5175 case ETIR__C_STO_OFF
: /* ALPHA_R_REFQUAD others, step 2 */
5176 if (prev_cmd
!= ETIR__C_STA_PQ
)
5178 /* xgettext:c-format */
5179 _bfd_error_handler (_("unknown reloc %s + %s"),
5180 _bfd_vms_etir_name (prev_cmd
),
5181 _bfd_vms_etir_name (ETIR__C_STO_OFF
));
5184 reloc_code
= BFD_RELOC_64
;
5187 case ETIR__C_OPR_ADD
: /* ALPHA_R_REFLONG und_section, step 3 */
5188 /* ALPHA_R_REFQUAD und_section, step 3 */
5189 if (prev_cmd
!= ETIR__C_STA_LW
&& prev_cmd
!= ETIR__C_STA_QW
)
5191 /* xgettext:c-format */
5192 _bfd_error_handler (_("unknown reloc %s + %s"),
5193 _bfd_vms_etir_name (prev_cmd
),
5194 _bfd_vms_etir_name (ETIR__C_OPR_ADD
));
5197 prev_cmd
= ETIR__C_OPR_ADD
;
5200 case ETIR__C_STO_CA
: /* ALPHA_R_CODEADDR */
5201 reloc_code
= BFD_RELOC_ALPHA_CODEADDR
;
5205 case ETIR__C_STO_GBL
: /* ALPHA_R_REFQUAD und_section */
5206 reloc_code
= BFD_RELOC_64
;
5210 case ETIR__C_STO_GBL_LW
: /* ALPHA_R_REFLONG und_section */
5211 reloc_code
= BFD_RELOC_32
;
5215 case ETIR__C_STC_LP_PSB
: /* ALPHA_R_LINKAGE */
5216 reloc_code
= BFD_RELOC_ALPHA_LINKAGE
;
5220 case ETIR__C_STC_NOP_GBL
: /* ALPHA_R_NOP */
5221 reloc_code
= BFD_RELOC_ALPHA_NOP
;
5224 case ETIR__C_STC_BSR_GBL
: /* ALPHA_R_BSR */
5225 reloc_code
= BFD_RELOC_ALPHA_BSR
;
5228 case ETIR__C_STC_LDA_GBL
: /* ALPHA_R_LDA */
5229 reloc_code
= BFD_RELOC_ALPHA_LDA
;
5232 case ETIR__C_STC_BOH_GBL
: /* ALPHA_R_BOH */
5233 reloc_code
= BFD_RELOC_ALPHA_BOH
;
5237 cur_sym
= ptr
+ 4 + 32;
5238 cur_address
= bfd_getl64 (ptr
+ 4 + 8);
5239 cur_addend
= bfd_getl64 (ptr
+ 4 + 24);
5242 case ETIR__C_STO_IMM
:
5243 vaddr
+= bfd_getl32 (ptr
+ 4);
5247 _bfd_error_handler (_("unknown reloc %s"),
5248 _bfd_vms_etir_name (cmd
));
5254 struct vms_section_data_struct
*vms_sec
;
5258 /* Get section to which the relocation applies. */
5259 if (cur_psect
< 0 || cur_psect
> (int)PRIV (section_count
))
5261 _bfd_error_handler (_("invalid section index in ETIR"));
5265 if (PRIV (sections
) == NULL
)
5267 sec
= PRIV (sections
)[cur_psect
];
5268 if (sec
== bfd_abs_section_ptr
)
5270 _bfd_error_handler (_("relocation for non-REL psect"));
5274 vms_sec
= vms_section_data (sec
);
5276 /* Allocate a reloc entry. */
5277 if (sec
->reloc_count
>= vms_sec
->reloc_max
)
5279 if (vms_sec
->reloc_max
== 0)
5281 vms_sec
->reloc_max
= 64;
5282 sec
->relocation
= bfd_zmalloc
5283 (vms_sec
->reloc_max
* sizeof (arelent
));
5287 vms_sec
->reloc_max
*= 2;
5288 sec
->relocation
= bfd_realloc
5289 (sec
->relocation
, vms_sec
->reloc_max
* sizeof (arelent
));
5292 reloc
= &sec
->relocation
[sec
->reloc_count
];
5295 reloc
->howto
= bfd_reloc_type_lookup (abfd
, reloc_code
);
5297 if (cur_sym
!= NULL
)
5300 unsigned int symlen
= *cur_sym
;
5303 /* Linear search. */
5308 for (j
= 0; j
< PRIV (gsd_sym_count
); j
++)
5309 if (PRIV (syms
)[j
]->namelen
== symlen
5310 && memcmp (PRIV (syms
)[j
]->name
, cur_sym
, symlen
) == 0)
5312 sym
= &PRIV (csymbols
)[j
];
5317 _bfd_error_handler (_("unknown symbol in command %s"),
5318 _bfd_vms_etir_name (cmd
));
5319 reloc
->sym_ptr_ptr
= NULL
;
5322 reloc
->sym_ptr_ptr
= sym
;
5324 else if (cur_psidx
>= 0)
5326 if (PRIV (sections
) == NULL
|| cur_psidx
>= (int) PRIV (section_count
))
5328 reloc
->sym_ptr_ptr
=
5329 PRIV (sections
)[cur_psidx
]->symbol_ptr_ptr
;
5332 reloc
->sym_ptr_ptr
= NULL
;
5334 reloc
->address
= cur_address
;
5335 reloc
->addend
= cur_addend
;
5337 if (reloc_code
== ALPHA_R_LINKAGE
)
5340 size
= bfd_get_reloc_size (reloc
->howto
);
5350 vms_debug2 ((3, "alpha_vms_slurp_relocs: result = TRUE\n"));
5355 /* Return the number of bytes required to store the relocation
5356 information associated with the given section. */
5359 alpha_vms_get_reloc_upper_bound (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*section
)
5361 alpha_vms_slurp_relocs (abfd
);
5363 return (section
->reloc_count
+ 1) * sizeof (arelent
*);
5366 /* Convert relocations from VMS (external) form into BFD internal
5367 form. Return the number of relocations. */
5370 alpha_vms_canonicalize_reloc (bfd
*abfd
, asection
*section
, arelent
**relptr
,
5371 asymbol
**symbols ATTRIBUTE_UNUSED
)
5376 if (!alpha_vms_slurp_relocs (abfd
))
5379 count
= section
->reloc_count
;
5380 tblptr
= section
->relocation
;
5383 *relptr
++ = tblptr
++;
5385 *relptr
= (arelent
*) NULL
;
5386 return section
->reloc_count
;
5389 /* Install a new set of internal relocs. */
5391 #define alpha_vms_set_reloc _bfd_generic_set_reloc
5394 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
5396 /* How to process the various reloc types. */
5398 static bfd_reloc_status_type
5399 reloc_nil (bfd
* abfd ATTRIBUTE_UNUSED
,
5400 arelent
*reloc ATTRIBUTE_UNUSED
,
5401 asymbol
*sym ATTRIBUTE_UNUSED
,
5402 void * data ATTRIBUTE_UNUSED
,
5403 asection
*sec ATTRIBUTE_UNUSED
,
5404 bfd
*output_bfd ATTRIBUTE_UNUSED
,
5405 char **error_message ATTRIBUTE_UNUSED
)
5408 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd
, output_bfd
);
5409 vms_debug (2, "In section %s, symbol %s\n",
5410 sec
->name
, sym
->name
);
5411 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5412 reloc
->sym_ptr_ptr
[0]->name
,
5413 (unsigned long)reloc
->address
,
5414 (unsigned long)reloc
->addend
, reloc
->howto
->name
);
5415 vms_debug (2, "data at %p\n", data
);
5416 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5419 return bfd_reloc_ok
;
5422 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5423 from smaller values. Start with zero, widen, *then* decrement. */
5424 #define MINUS_ONE (((bfd_vma)0) - 1)
5426 static reloc_howto_type alpha_howto_table
[] =
5428 HOWTO (ALPHA_R_IGNORE
, /* Type. */
5429 0, /* Rightshift. */
5430 0, /* Size (0 = byte, 1 = short, 2 = long). */
5432 TRUE
, /* PC relative. */
5434 complain_overflow_dont
,/* Complain_on_overflow. */
5435 reloc_nil
, /* Special_function. */
5436 "IGNORE", /* Name. */
5437 TRUE
, /* Partial_inplace. */
5438 0, /* Source mask */
5440 TRUE
), /* PC rel offset. */
5442 /* A 64 bit reference to a symbol. */
5443 HOWTO (ALPHA_R_REFQUAD
, /* Type. */
5444 0, /* Rightshift. */
5445 4, /* Size (0 = byte, 1 = short, 2 = long). */
5447 FALSE
, /* PC relative. */
5449 complain_overflow_bitfield
, /* Complain_on_overflow. */
5450 reloc_nil
, /* Special_function. */
5451 "REFQUAD", /* Name. */
5452 TRUE
, /* Partial_inplace. */
5453 MINUS_ONE
, /* Source mask. */
5454 MINUS_ONE
, /* Dest mask. */
5455 FALSE
), /* PC rel offset. */
5457 /* A 21 bit branch. The native assembler generates these for
5458 branches within the text segment, and also fills in the PC
5459 relative offset in the instruction. */
5460 HOWTO (ALPHA_R_BRADDR
, /* Type. */
5461 2, /* Rightshift. */
5462 2, /* Size (0 = byte, 1 = short, 2 = long). */
5464 TRUE
, /* PC relative. */
5466 complain_overflow_signed
, /* Complain_on_overflow. */
5467 reloc_nil
, /* Special_function. */
5468 "BRADDR", /* Name. */
5469 TRUE
, /* Partial_inplace. */
5470 0x1fffff, /* Source mask. */
5471 0x1fffff, /* Dest mask. */
5472 FALSE
), /* PC rel offset. */
5474 /* A hint for a jump to a register. */
5475 HOWTO (ALPHA_R_HINT
, /* Type. */
5476 2, /* Rightshift. */
5477 1, /* Size (0 = byte, 1 = short, 2 = long). */
5479 TRUE
, /* PC relative. */
5481 complain_overflow_dont
,/* Complain_on_overflow. */
5482 reloc_nil
, /* Special_function. */
5484 TRUE
, /* Partial_inplace. */
5485 0x3fff, /* Source mask. */
5486 0x3fff, /* Dest mask. */
5487 FALSE
), /* PC rel offset. */
5489 /* 16 bit PC relative offset. */
5490 HOWTO (ALPHA_R_SREL16
, /* Type. */
5491 0, /* Rightshift. */
5492 1, /* Size (0 = byte, 1 = short, 2 = long). */
5494 TRUE
, /* PC relative. */
5496 complain_overflow_signed
, /* Complain_on_overflow. */
5497 reloc_nil
, /* Special_function. */
5498 "SREL16", /* Name. */
5499 TRUE
, /* Partial_inplace. */
5500 0xffff, /* Source mask. */
5501 0xffff, /* Dest mask. */
5502 FALSE
), /* PC rel offset. */
5504 /* 32 bit PC relative offset. */
5505 HOWTO (ALPHA_R_SREL32
, /* Type. */
5506 0, /* Rightshift. */
5507 2, /* Size (0 = byte, 1 = short, 2 = long). */
5509 TRUE
, /* PC relative. */
5511 complain_overflow_signed
, /* Complain_on_overflow. */
5512 reloc_nil
, /* Special_function. */
5513 "SREL32", /* Name. */
5514 TRUE
, /* Partial_inplace. */
5515 0xffffffff, /* Source mask. */
5516 0xffffffff, /* Dest mask. */
5517 FALSE
), /* PC rel offset. */
5519 /* A 64 bit PC relative offset. */
5520 HOWTO (ALPHA_R_SREL64
, /* Type. */
5521 0, /* Rightshift. */
5522 4, /* Size (0 = byte, 1 = short, 2 = long). */
5524 TRUE
, /* PC relative. */
5526 complain_overflow_signed
, /* Complain_on_overflow. */
5527 reloc_nil
, /* Special_function. */
5528 "SREL64", /* Name. */
5529 TRUE
, /* Partial_inplace. */
5530 MINUS_ONE
, /* Source mask. */
5531 MINUS_ONE
, /* Dest mask. */
5532 FALSE
), /* PC rel offset. */
5534 /* Push a value on the reloc evaluation stack. */
5535 HOWTO (ALPHA_R_OP_PUSH
, /* Type. */
5536 0, /* Rightshift. */
5537 0, /* Size (0 = byte, 1 = short, 2 = long). */
5539 FALSE
, /* PC relative. */
5541 complain_overflow_dont
,/* Complain_on_overflow. */
5542 reloc_nil
, /* Special_function. */
5543 "OP_PUSH", /* Name. */
5544 FALSE
, /* Partial_inplace. */
5545 0, /* Source mask. */
5547 FALSE
), /* PC rel offset. */
5549 /* Store the value from the stack at the given address. Store it in
5550 a bitfield of size r_size starting at bit position r_offset. */
5551 HOWTO (ALPHA_R_OP_STORE
, /* Type. */
5552 0, /* Rightshift. */
5553 4, /* Size (0 = byte, 1 = short, 2 = long). */
5555 FALSE
, /* PC relative. */
5557 complain_overflow_dont
,/* Complain_on_overflow. */
5558 reloc_nil
, /* Special_function. */
5559 "OP_STORE", /* Name. */
5560 FALSE
, /* Partial_inplace. */
5561 0, /* Source mask. */
5562 MINUS_ONE
, /* Dest mask. */
5563 FALSE
), /* PC rel offset. */
5565 /* Subtract the reloc address from the value on the top of the
5566 relocation stack. */
5567 HOWTO (ALPHA_R_OP_PSUB
, /* Type. */
5568 0, /* Rightshift. */
5569 0, /* Size (0 = byte, 1 = short, 2 = long). */
5571 FALSE
, /* PC relative. */
5573 complain_overflow_dont
,/* Complain_on_overflow. */
5574 reloc_nil
, /* Special_function. */
5575 "OP_PSUB", /* Name. */
5576 FALSE
, /* Partial_inplace. */
5577 0, /* Source mask. */
5579 FALSE
), /* PC rel offset. */
5581 /* Shift the value on the top of the relocation stack right by the
5583 HOWTO (ALPHA_R_OP_PRSHIFT
, /* Type. */
5584 0, /* Rightshift. */
5585 0, /* Size (0 = byte, 1 = short, 2 = long). */
5587 FALSE
, /* PC relative. */
5589 complain_overflow_dont
,/* Complain_on_overflow. */
5590 reloc_nil
, /* Special_function. */
5591 "OP_PRSHIFT", /* Name. */
5592 FALSE
, /* Partial_inplace. */
5593 0, /* Source mask. */
5595 FALSE
), /* PC rel offset. */
5597 /* Hack. Linkage is done by linker. */
5598 HOWTO (ALPHA_R_LINKAGE
, /* Type. */
5599 0, /* Rightshift. */
5600 0, /* Size (0 = byte, 1 = short, 2 = long). */
5602 FALSE
, /* PC relative. */
5604 complain_overflow_dont
,/* Complain_on_overflow. */
5605 reloc_nil
, /* Special_function. */
5606 "LINKAGE", /* Name. */
5607 FALSE
, /* Partial_inplace. */
5608 0, /* Source mask. */
5610 FALSE
), /* PC rel offset. */
5612 /* A 32 bit reference to a symbol. */
5613 HOWTO (ALPHA_R_REFLONG
, /* Type. */
5614 0, /* Rightshift. */
5615 2, /* Size (0 = byte, 1 = short, 2 = long). */
5617 FALSE
, /* PC relative. */
5619 complain_overflow_bitfield
, /* Complain_on_overflow. */
5620 reloc_nil
, /* Special_function. */
5621 "REFLONG", /* Name. */
5622 TRUE
, /* Partial_inplace. */
5623 0xffffffff, /* Source mask. */
5624 0xffffffff, /* Dest mask. */
5625 FALSE
), /* PC rel offset. */
5627 /* A 64 bit reference to a procedure, written as 32 bit value. */
5628 HOWTO (ALPHA_R_CODEADDR
, /* Type. */
5629 0, /* Rightshift. */
5630 4, /* Size (0 = byte, 1 = short, 2 = long). */
5632 FALSE
, /* PC relative. */
5634 complain_overflow_signed
,/* Complain_on_overflow. */
5635 reloc_nil
, /* Special_function. */
5636 "CODEADDR", /* Name. */
5637 FALSE
, /* Partial_inplace. */
5638 0xffffffff, /* Source mask. */
5639 0xffffffff, /* Dest mask. */
5640 FALSE
), /* PC rel offset. */
5642 HOWTO (ALPHA_R_NOP
, /* Type. */
5643 0, /* Rightshift. */
5644 3, /* Size (0 = byte, 1 = short, 2 = long). */
5646 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5647 because the calculations for the 3 relocations are the same.
5648 See B.4.5.2 of the OpenVMS Linker Utility Manual. */
5649 TRUE
, /* PC relative. */
5651 complain_overflow_dont
,/* Complain_on_overflow. */
5652 reloc_nil
, /* Special_function. */
5654 FALSE
, /* Partial_inplace. */
5655 0xffffffff, /* Source mask. */
5656 0xffffffff, /* Dest mask. */
5657 FALSE
), /* PC rel offset. */
5659 HOWTO (ALPHA_R_BSR
, /* Type. */
5660 0, /* Rightshift. */
5661 3, /* Size (0 = byte, 1 = short, 2 = long). */
5663 TRUE
, /* PC relative. */
5665 complain_overflow_dont
,/* Complain_on_overflow. */
5666 reloc_nil
, /* Special_function. */
5668 FALSE
, /* Partial_inplace. */
5669 0xffffffff, /* Source mask. */
5670 0xffffffff, /* Dest mask. */
5671 FALSE
), /* PC rel offset. */
5673 HOWTO (ALPHA_R_LDA
, /* Type. */
5674 0, /* Rightshift. */
5675 3, /* Size (0 = byte, 1 = short, 2 = long). */
5677 FALSE
, /* PC relative. */
5679 complain_overflow_dont
,/* Complain_on_overflow. */
5680 reloc_nil
, /* Special_function. */
5682 FALSE
, /* Partial_inplace. */
5683 0xffffffff, /* Source mask. */
5684 0xffffffff, /* Dest mask. */
5685 FALSE
), /* PC rel offset. */
5687 HOWTO (ALPHA_R_BOH
, /* Type. */
5688 0, /* Rightshift. */
5689 3, /* Size (0 = byte, 1 = short, 2 = long, 3 = nil). */
5691 TRUE
, /* PC relative. */
5693 complain_overflow_dont
,/* Complain_on_overflow. */
5694 reloc_nil
, /* Special_function. */
5696 FALSE
, /* Partial_inplace. */
5697 0xffffffff, /* Source mask. */
5698 0xffffffff, /* Dest mask. */
5699 FALSE
), /* PC rel offset. */
5702 /* Return a pointer to a howto structure which, when invoked, will perform
5703 the relocation code on data from the architecture noted. */
5705 static reloc_howto_type
*
5706 alpha_vms_bfd_reloc_type_lookup (bfd
* abfd ATTRIBUTE_UNUSED
,
5707 bfd_reloc_code_real_type code
)
5711 vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd
, code
));
5715 case BFD_RELOC_16
: alpha_type
= ALPHA_R_SREL16
; break;
5716 case BFD_RELOC_32
: alpha_type
= ALPHA_R_REFLONG
; break;
5717 case BFD_RELOC_64
: alpha_type
= ALPHA_R_REFQUAD
; break;
5718 case BFD_RELOC_CTOR
: alpha_type
= ALPHA_R_REFQUAD
; break;
5719 case BFD_RELOC_23_PCREL_S2
: alpha_type
= ALPHA_R_BRADDR
; break;
5720 case BFD_RELOC_ALPHA_HINT
: alpha_type
= ALPHA_R_HINT
; break;
5721 case BFD_RELOC_16_PCREL
: alpha_type
= ALPHA_R_SREL16
; break;
5722 case BFD_RELOC_32_PCREL
: alpha_type
= ALPHA_R_SREL32
; break;
5723 case BFD_RELOC_64_PCREL
: alpha_type
= ALPHA_R_SREL64
; break;
5724 case BFD_RELOC_ALPHA_LINKAGE
: alpha_type
= ALPHA_R_LINKAGE
; break;
5725 case BFD_RELOC_ALPHA_CODEADDR
: alpha_type
= ALPHA_R_CODEADDR
; break;
5726 case BFD_RELOC_ALPHA_NOP
: alpha_type
= ALPHA_R_NOP
; break;
5727 case BFD_RELOC_ALPHA_BSR
: alpha_type
= ALPHA_R_BSR
; break;
5728 case BFD_RELOC_ALPHA_LDA
: alpha_type
= ALPHA_R_LDA
; break;
5729 case BFD_RELOC_ALPHA_BOH
: alpha_type
= ALPHA_R_BOH
; break;
5731 _bfd_error_handler (_("reloc (%d) is *UNKNOWN*"), code
);
5734 vms_debug2 ((2, "reloc is %s\n", alpha_howto_table
[alpha_type
].name
));
5735 return & alpha_howto_table
[alpha_type
];
5738 static reloc_howto_type
*
5739 alpha_vms_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
5745 i
< sizeof (alpha_howto_table
) / sizeof (alpha_howto_table
[0]);
5747 if (alpha_howto_table
[i
].name
!= NULL
5748 && strcasecmp (alpha_howto_table
[i
].name
, r_name
) == 0)
5749 return &alpha_howto_table
[i
];
5755 alpha_vms_get_synthetic_symtab (bfd
*abfd
,
5756 long symcount ATTRIBUTE_UNUSED
,
5757 asymbol
**usyms ATTRIBUTE_UNUSED
,
5758 long dynsymcount ATTRIBUTE_UNUSED
,
5759 asymbol
**dynsyms ATTRIBUTE_UNUSED
,
5766 syms
= (asymbol
*) bfd_malloc (PRIV (norm_sym_count
) * sizeof (asymbol
));
5771 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5773 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
5784 flags
= BSF_LOCAL
| BSF_SYNTHETIC
;
5791 if ((e
->flags
& EGSY__V_DEF
) && (e
->flags
& EGSY__V_NORM
))
5793 value
= e
->code_value
;
5794 sec
= e
->code_section
;
5805 sname
= bfd_alloc (abfd
, l
+ 5);
5808 memcpy (sname
, name
, l
);
5809 memcpy (sname
+ l
, "..en", 5);
5816 sym
->udata
.p
= NULL
;
5825 vms_time_to_str (unsigned char *buf
)
5827 time_t t
= vms_rawtime_to_time_t (buf
);
5828 char *res
= ctime (&t
);
5831 res
= "*invalid time*";
5838 evax_bfd_print_emh (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
5840 struct vms_emh_common
*emh
= (struct vms_emh_common
*)rec
;
5841 unsigned int subtype
;
5844 subtype
= (unsigned) bfd_getl16 (emh
->subtyp
);
5846 /* xgettext:c-format */
5847 fprintf (file
, _(" EMH %u (len=%u): "), subtype
, rec_len
);
5849 /* PR 21618: Check for invalid lengths. */
5850 if (rec_len
< sizeof (* emh
))
5852 fprintf (file
, _(" Error: The length is less than the length of an EMH record\n"));
5855 extra
= rec_len
- sizeof (struct vms_emh_common
);
5861 struct vms_emh_mhd
*mhd
= (struct vms_emh_mhd
*) rec
;
5863 const char * nextname
;
5864 const char * maxname
;
5866 /* PR 21840: Check for invalid lengths. */
5867 if (rec_len
< sizeof (* mhd
))
5869 fprintf (file
, _(" Error: The record length is less than the size of an EMH_MHD record\n"));
5872 fprintf (file
, _("Module header\n"));
5873 fprintf (file
, _(" structure level: %u\n"), mhd
->strlvl
);
5874 fprintf (file
, _(" max record size: %u\n"),
5875 (unsigned) bfd_getl32 (mhd
->recsiz
));
5876 name
= (char *)(mhd
+ 1);
5877 maxname
= (char *) rec
+ rec_len
;
5878 if (name
> maxname
- 2)
5880 fprintf (file
, _(" Error: The module name is missing\n"));
5883 nextname
= name
+ name
[0] + 1;
5884 if (nextname
>= maxname
)
5886 fprintf (file
, _(" Error: The module name is too long\n"));
5889 fprintf (file
, _(" module name : %.*s\n"), name
[0], name
+ 1);
5891 if (name
> maxname
- 2)
5893 fprintf (file
, _(" Error: The module version is missing\n"));
5896 nextname
= name
+ name
[0] + 1;
5897 if (nextname
>= maxname
)
5899 fprintf (file
, _(" Error: The module version is too long\n"));
5902 fprintf (file
, _(" module version : %.*s\n"), name
[0], name
+ 1);
5904 if ((maxname
- name
) < 17 && maxname
[-1] != 0)
5905 fprintf (file
, _(" Error: The compile date is truncated\n"));
5907 fprintf (file
, _(" compile date : %.17s\n"), name
);
5912 fprintf (file
, _("Language Processor Name\n"));
5913 fprintf (file
, _(" language name: %.*s\n"), extra
, (char *)(emh
+ 1));
5917 fprintf (file
, _("Source Files Header\n"));
5918 fprintf (file
, _(" file: %.*s\n"), extra
, (char *)(emh
+ 1));
5922 fprintf (file
, _("Title Text Header\n"));
5923 fprintf (file
, _(" title: %.*s\n"), extra
, (char *)(emh
+ 1));
5927 fprintf (file
, _("Copyright Header\n"));
5928 fprintf (file
, _(" copyright: %.*s\n"), extra
, (char *)(emh
+ 1));
5932 fprintf (file
, _("unhandled emh subtype %u\n"), subtype
);
5938 evax_bfd_print_eeom (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
5940 struct vms_eeom
*eeom
= (struct vms_eeom
*)rec
;
5942 fprintf (file
, _(" EEOM (len=%u):\n"), rec_len
);
5944 /* PR 21618: Check for invalid lengths. */
5945 if (rec_len
< sizeof (* eeom
))
5947 fprintf (file
, _(" Error: The length is less than the length of an EEOM record\n"));
5951 fprintf (file
, _(" number of cond linkage pairs: %u\n"),
5952 (unsigned)bfd_getl32 (eeom
->total_lps
));
5953 fprintf (file
, _(" completion code: %u\n"),
5954 (unsigned)bfd_getl16 (eeom
->comcod
));
5957 fprintf (file
, _(" transfer addr flags: 0x%02x\n"), eeom
->tfrflg
);
5958 fprintf (file
, _(" transfer addr psect: %u\n"),
5959 (unsigned)bfd_getl32 (eeom
->psindx
));
5960 fprintf (file
, _(" transfer address : 0x%08x\n"),
5961 (unsigned)bfd_getl32 (eeom
->tfradr
));
5966 exav_bfd_print_egsy_flags (unsigned int flags
, FILE *file
)
5968 if (flags
& EGSY__V_WEAK
)
5969 fputs (_(" WEAK"), file
);
5970 if (flags
& EGSY__V_DEF
)
5971 fputs (_(" DEF"), file
);
5972 if (flags
& EGSY__V_UNI
)
5973 fputs (_(" UNI"), file
);
5974 if (flags
& EGSY__V_REL
)
5975 fputs (_(" REL"), file
);
5976 if (flags
& EGSY__V_COMM
)
5977 fputs (_(" COMM"), file
);
5978 if (flags
& EGSY__V_VECEP
)
5979 fputs (_(" VECEP"), file
);
5980 if (flags
& EGSY__V_NORM
)
5981 fputs (_(" NORM"), file
);
5982 if (flags
& EGSY__V_QUAD_VAL
)
5983 fputs (_(" QVAL"), file
);
5987 evax_bfd_print_egsd_flags (FILE *file
, unsigned int flags
)
5989 if (flags
& EGPS__V_PIC
)
5990 fputs (_(" PIC"), file
);
5991 if (flags
& EGPS__V_LIB
)
5992 fputs (_(" LIB"), file
);
5993 if (flags
& EGPS__V_OVR
)
5994 fputs (_(" OVR"), file
);
5995 if (flags
& EGPS__V_REL
)
5996 fputs (_(" REL"), file
);
5997 if (flags
& EGPS__V_GBL
)
5998 fputs (_(" GBL"), file
);
5999 if (flags
& EGPS__V_SHR
)
6000 fputs (_(" SHR"), file
);
6001 if (flags
& EGPS__V_EXE
)
6002 fputs (_(" EXE"), file
);
6003 if (flags
& EGPS__V_RD
)
6004 fputs (_(" RD"), file
);
6005 if (flags
& EGPS__V_WRT
)
6006 fputs (_(" WRT"), file
);
6007 if (flags
& EGPS__V_VEC
)
6008 fputs (_(" VEC"), file
);
6009 if (flags
& EGPS__V_NOMOD
)
6010 fputs (_(" NOMOD"), file
);
6011 if (flags
& EGPS__V_COM
)
6012 fputs (_(" COM"), file
);
6013 if (flags
& EGPS__V_ALLOC_64BIT
)
6014 fputs (_(" 64B"), file
);
6018 evax_bfd_print_egsd (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
6020 unsigned int off
= sizeof (struct vms_egsd
);
6023 fprintf (file
, _(" EGSD (len=%u):\n"), rec_len
);
6026 for (off
= sizeof (struct vms_egsd
); off
< rec_len
; )
6028 struct vms_egsd_entry
*e
= (struct vms_egsd_entry
*)(rec
+ off
);
6032 type
= (unsigned)bfd_getl16 (e
->gsdtyp
);
6033 len
= (unsigned)bfd_getl16 (e
->gsdsiz
);
6035 /* xgettext:c-format */
6036 fprintf (file
, _(" EGSD entry %2u (type: %u, len: %u): "),
6040 if (off
+ len
> rec_len
|| off
+ len
< off
)
6042 fprintf (file
, _(" Error: length larger than remaining space in record\n"));
6050 struct vms_egps
*egps
= (struct vms_egps
*)e
;
6051 unsigned int flags
= bfd_getl16 (egps
->flags
);
6054 fprintf (file
, _("PSC - Program section definition\n"));
6055 fprintf (file
, _(" alignment : 2**%u\n"), egps
->align
);
6056 fprintf (file
, _(" flags : 0x%04x"), flags
);
6057 evax_bfd_print_egsd_flags (file
, flags
);
6059 l
= bfd_getl32 (egps
->alloc
);
6060 fprintf (file
, _(" alloc (len): %u (0x%08x)\n"), l
, l
);
6061 fprintf (file
, _(" name : %.*s\n"),
6062 egps
->namlng
, egps
->name
);
6067 struct vms_esgps
*esgps
= (struct vms_esgps
*)e
;
6068 unsigned int flags
= bfd_getl16 (esgps
->flags
);
6071 fprintf (file
, _("SPSC - Shared Image Program section def\n"));
6072 fprintf (file
, _(" alignment : 2**%u\n"), esgps
->align
);
6073 fprintf (file
, _(" flags : 0x%04x"), flags
);
6074 evax_bfd_print_egsd_flags (file
, flags
);
6076 l
= bfd_getl32 (esgps
->alloc
);
6077 fprintf (file
, _(" alloc (len) : %u (0x%08x)\n"), l
, l
);
6078 fprintf (file
, _(" image offset : 0x%08x\n"),
6079 (unsigned int)bfd_getl32 (esgps
->base
));
6080 fprintf (file
, _(" symvec offset : 0x%08x\n"),
6081 (unsigned int)bfd_getl32 (esgps
->value
));
6082 fprintf (file
, _(" name : %.*s\n"),
6083 esgps
->namlng
, esgps
->name
);
6088 struct vms_egsy
*egsy
= (struct vms_egsy
*)e
;
6089 unsigned int flags
= bfd_getl16 (egsy
->flags
);
6091 if (flags
& EGSY__V_DEF
)
6093 struct vms_esdf
*esdf
= (struct vms_esdf
*)e
;
6095 fprintf (file
, _("SYM - Global symbol definition\n"));
6096 fprintf (file
, _(" flags: 0x%04x"), flags
);
6097 exav_bfd_print_egsy_flags (flags
, file
);
6099 fprintf (file
, _(" psect offset: 0x%08x\n"),
6100 (unsigned)bfd_getl32 (esdf
->value
));
6101 if (flags
& EGSY__V_NORM
)
6103 fprintf (file
, _(" code address: 0x%08x\n"),
6104 (unsigned)bfd_getl32 (esdf
->code_address
));
6105 fprintf (file
, _(" psect index for entry point : %u\n"),
6106 (unsigned)bfd_getl32 (esdf
->ca_psindx
));
6108 fprintf (file
, _(" psect index : %u\n"),
6109 (unsigned)bfd_getl32 (esdf
->psindx
));
6110 fprintf (file
, _(" name : %.*s\n"),
6111 esdf
->namlng
, esdf
->name
);
6115 struct vms_esrf
*esrf
= (struct vms_esrf
*)e
;
6117 fprintf (file
, _("SYM - Global symbol reference\n"));
6118 fprintf (file
, _(" name : %.*s\n"),
6119 esrf
->namlng
, esrf
->name
);
6125 struct vms_eidc
*eidc
= (struct vms_eidc
*)e
;
6126 unsigned int flags
= bfd_getl32 (eidc
->flags
);
6129 fprintf (file
, _("IDC - Ident Consistency check\n"));
6130 fprintf (file
, _(" flags : 0x%08x"), flags
);
6131 if (flags
& EIDC__V_BINIDENT
)
6132 fputs (" BINDENT", file
);
6134 fprintf (file
, _(" id match : %x\n"),
6135 (flags
>> EIDC__V_IDMATCH_SH
) & EIDC__V_IDMATCH_MASK
);
6136 fprintf (file
, _(" error severity: %x\n"),
6137 (flags
>> EIDC__V_ERRSEV_SH
) & EIDC__V_ERRSEV_MASK
);
6139 fprintf (file
, _(" entity name : %.*s\n"), p
[0], p
+ 1);
6141 fprintf (file
, _(" object name : %.*s\n"), p
[0], p
+ 1);
6143 if (flags
& EIDC__V_BINIDENT
)
6144 fprintf (file
, _(" binary ident : 0x%08x\n"),
6145 (unsigned)bfd_getl32 (p
+ 1));
6147 fprintf (file
, _(" ascii ident : %.*s\n"), p
[0], p
+ 1);
6152 struct vms_egst
*egst
= (struct vms_egst
*)e
;
6153 unsigned int flags
= bfd_getl16 (egst
->header
.flags
);
6155 fprintf (file
, _("SYMG - Universal symbol definition\n"));
6156 fprintf (file
, _(" flags: 0x%04x"), flags
);
6157 exav_bfd_print_egsy_flags (flags
, file
);
6159 fprintf (file
, _(" symbol vector offset: 0x%08x\n"),
6160 (unsigned)bfd_getl32 (egst
->value
));
6161 fprintf (file
, _(" entry point: 0x%08x\n"),
6162 (unsigned)bfd_getl32 (egst
->lp_1
));
6163 fprintf (file
, _(" proc descr : 0x%08x\n"),
6164 (unsigned)bfd_getl32 (egst
->lp_2
));
6165 fprintf (file
, _(" psect index: %u\n"),
6166 (unsigned)bfd_getl32 (egst
->psindx
));
6167 fprintf (file
, _(" name : %.*s\n"),
6168 egst
->namlng
, egst
->name
);
6173 struct vms_esdfv
*esdfv
= (struct vms_esdfv
*)e
;
6174 unsigned int flags
= bfd_getl16 (esdfv
->flags
);
6176 fprintf (file
, _("SYMV - Vectored symbol definition\n"));
6177 fprintf (file
, _(" flags: 0x%04x"), flags
);
6178 exav_bfd_print_egsy_flags (flags
, file
);
6180 fprintf (file
, _(" vector : 0x%08x\n"),
6181 (unsigned)bfd_getl32 (esdfv
->vector
));
6182 fprintf (file
, _(" psect offset: %u\n"),
6183 (unsigned)bfd_getl32 (esdfv
->value
));
6184 fprintf (file
, _(" psect index : %u\n"),
6185 (unsigned)bfd_getl32 (esdfv
->psindx
));
6186 fprintf (file
, _(" name : %.*s\n"),
6187 esdfv
->namlng
, esdfv
->name
);
6192 struct vms_esdfm
*esdfm
= (struct vms_esdfm
*)e
;
6193 unsigned int flags
= bfd_getl16 (esdfm
->flags
);
6195 fprintf (file
, _("SYMM - Global symbol definition with version\n"));
6196 fprintf (file
, _(" flags: 0x%04x"), flags
);
6197 exav_bfd_print_egsy_flags (flags
, file
);
6199 fprintf (file
, _(" version mask: 0x%08x\n"),
6200 (unsigned)bfd_getl32 (esdfm
->version_mask
));
6201 fprintf (file
, _(" psect offset: %u\n"),
6202 (unsigned)bfd_getl32 (esdfm
->value
));
6203 fprintf (file
, _(" psect index : %u\n"),
6204 (unsigned)bfd_getl32 (esdfm
->psindx
));
6205 fprintf (file
, _(" name : %.*s\n"),
6206 esdfm
->namlng
, esdfm
->name
);
6210 fprintf (file
, _("unhandled egsd entry type %u\n"), type
);
6218 evax_bfd_print_hex (FILE *file
, const char *pfx
,
6219 const unsigned char *buf
, unsigned int len
)
6225 for (i
= 0; i
< len
; i
++)
6229 fprintf (file
, " %02x", buf
[i
]);
6242 evax_bfd_print_etir_stc_ir (FILE *file
, const unsigned char *buf
, int is_ps
)
6244 /* xgettext:c-format */
6245 fprintf (file
, _(" linkage index: %u, replacement insn: 0x%08x\n"),
6246 (unsigned)bfd_getl32 (buf
),
6247 (unsigned)bfd_getl32 (buf
+ 16));
6248 /* xgettext:c-format */
6249 fprintf (file
, _(" psect idx 1: %u, offset 1: 0x%08x %08x\n"),
6250 (unsigned)bfd_getl32 (buf
+ 4),
6251 (unsigned)bfd_getl32 (buf
+ 12),
6252 (unsigned)bfd_getl32 (buf
+ 8));
6253 /* xgettext:c-format */
6254 fprintf (file
, _(" psect idx 2: %u, offset 2: 0x%08x %08x\n"),
6255 (unsigned)bfd_getl32 (buf
+ 20),
6256 (unsigned)bfd_getl32 (buf
+ 28),
6257 (unsigned)bfd_getl32 (buf
+ 24));
6259 /* xgettext:c-format */
6260 fprintf (file
, _(" psect idx 3: %u, offset 3: 0x%08x %08x\n"),
6261 (unsigned)bfd_getl32 (buf
+ 32),
6262 (unsigned)bfd_getl32 (buf
+ 40),
6263 (unsigned)bfd_getl32 (buf
+ 36));
6265 fprintf (file
, _(" global name: %.*s\n"), buf
[32], buf
+ 33);
6269 evax_bfd_print_etir (FILE *file
, const char *name
,
6270 unsigned char *rec
, unsigned int rec_len
)
6272 unsigned int off
= sizeof (struct vms_egsd
);
6273 unsigned int sec_len
= 0;
6275 /* xgettext:c-format */
6276 fprintf (file
, _(" %s (len=%u+%u):\n"), name
,
6277 (unsigned)(rec_len
- sizeof (struct vms_eobjrec
)),
6278 (unsigned)sizeof (struct vms_eobjrec
));
6280 for (off
= sizeof (struct vms_eobjrec
); off
< rec_len
; )
6282 struct vms_etir
*etir
= (struct vms_etir
*)(rec
+ off
);
6287 type
= bfd_getl16 (etir
->rectyp
);
6288 size
= bfd_getl16 (etir
->size
);
6289 buf
= rec
+ off
+ sizeof (struct vms_etir
);
6291 if (off
+ size
> rec_len
|| off
+ size
< off
)
6293 fprintf (file
, _(" Error: length larger than remaining space in record\n"));
6297 /* xgettext:c-format */
6298 fprintf (file
, _(" (type: %3u, size: 4+%3u): "), type
, size
- 4);
6301 case ETIR__C_STA_GBL
:
6302 fprintf (file
, _("STA_GBL (stack global) %.*s\n"),
6305 case ETIR__C_STA_LW
:
6306 fprintf (file
, _("STA_LW (stack longword) 0x%08x\n"),
6307 (unsigned)bfd_getl32 (buf
));
6309 case ETIR__C_STA_QW
:
6310 fprintf (file
, _("STA_QW (stack quadword) 0x%08x %08x\n"),
6311 (unsigned)bfd_getl32 (buf
+ 4),
6312 (unsigned)bfd_getl32 (buf
+ 0));
6314 case ETIR__C_STA_PQ
:
6315 fprintf (file
, _("STA_PQ (stack psect base + offset)\n"));
6316 /* xgettext:c-format */
6317 fprintf (file
, _(" psect: %u, offset: 0x%08x %08x\n"),
6318 (unsigned)bfd_getl32 (buf
+ 0),
6319 (unsigned)bfd_getl32 (buf
+ 8),
6320 (unsigned)bfd_getl32 (buf
+ 4));
6322 case ETIR__C_STA_LI
:
6323 fprintf (file
, _("STA_LI (stack literal)\n"));
6325 case ETIR__C_STA_MOD
:
6326 fprintf (file
, _("STA_MOD (stack module)\n"));
6328 case ETIR__C_STA_CKARG
:
6329 fprintf (file
, _("STA_CKARG (compare procedure argument)\n"));
6333 fprintf (file
, _("STO_B (store byte)\n"));
6336 fprintf (file
, _("STO_W (store word)\n"));
6338 case ETIR__C_STO_LW
:
6339 fprintf (file
, _("STO_LW (store longword)\n"));
6341 case ETIR__C_STO_QW
:
6342 fprintf (file
, _("STO_QW (store quadword)\n"));
6344 case ETIR__C_STO_IMMR
:
6346 unsigned int len
= bfd_getl32 (buf
);
6348 _("STO_IMMR (store immediate repeat) %u bytes\n"),
6350 evax_bfd_print_hex (file
, " ", buf
+ 4, len
);
6354 case ETIR__C_STO_GBL
:
6355 fprintf (file
, _("STO_GBL (store global) %.*s\n"),
6358 case ETIR__C_STO_CA
:
6359 fprintf (file
, _("STO_CA (store code address) %.*s\n"),
6362 case ETIR__C_STO_RB
:
6363 fprintf (file
, _("STO_RB (store relative branch)\n"));
6365 case ETIR__C_STO_AB
:
6366 fprintf (file
, _("STO_AB (store absolute branch)\n"));
6368 case ETIR__C_STO_OFF
:
6369 fprintf (file
, _("STO_OFF (store offset to psect)\n"));
6371 case ETIR__C_STO_IMM
:
6373 unsigned int len
= bfd_getl32 (buf
);
6375 _("STO_IMM (store immediate) %u bytes\n"),
6377 evax_bfd_print_hex (file
, " ", buf
+ 4, len
);
6381 case ETIR__C_STO_GBL_LW
:
6382 fprintf (file
, _("STO_GBL_LW (store global longword) %.*s\n"),
6385 case ETIR__C_STO_LP_PSB
:
6386 fprintf (file
, _("STO_OFF (store LP with procedure signature)\n"));
6388 case ETIR__C_STO_HINT_GBL
:
6389 fprintf (file
, _("STO_BR_GBL (store branch global) *todo*\n"));
6391 case ETIR__C_STO_HINT_PS
:
6392 fprintf (file
, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6395 case ETIR__C_OPR_NOP
:
6396 fprintf (file
, _("OPR_NOP (no-operation)\n"));
6398 case ETIR__C_OPR_ADD
:
6399 fprintf (file
, _("OPR_ADD (add)\n"));
6401 case ETIR__C_OPR_SUB
:
6402 fprintf (file
, _("OPR_SUB (subtract)\n"));
6404 case ETIR__C_OPR_MUL
:
6405 fprintf (file
, _("OPR_MUL (multiply)\n"));
6407 case ETIR__C_OPR_DIV
:
6408 fprintf (file
, _("OPR_DIV (divide)\n"));
6410 case ETIR__C_OPR_AND
:
6411 fprintf (file
, _("OPR_AND (logical and)\n"));
6413 case ETIR__C_OPR_IOR
:
6414 fprintf (file
, _("OPR_IOR (logical inclusive or)\n"));
6416 case ETIR__C_OPR_EOR
:
6417 fprintf (file
, _("OPR_EOR (logical exclusive or)\n"));
6419 case ETIR__C_OPR_NEG
:
6420 fprintf (file
, _("OPR_NEG (negate)\n"));
6422 case ETIR__C_OPR_COM
:
6423 fprintf (file
, _("OPR_COM (complement)\n"));
6425 case ETIR__C_OPR_INSV
:
6426 fprintf (file
, _("OPR_INSV (insert field)\n"));
6428 case ETIR__C_OPR_ASH
:
6429 fprintf (file
, _("OPR_ASH (arithmetic shift)\n"));
6431 case ETIR__C_OPR_USH
:
6432 fprintf (file
, _("OPR_USH (unsigned shift)\n"));
6434 case ETIR__C_OPR_ROT
:
6435 fprintf (file
, _("OPR_ROT (rotate)\n"));
6437 case ETIR__C_OPR_SEL
:
6438 fprintf (file
, _("OPR_SEL (select)\n"));
6440 case ETIR__C_OPR_REDEF
:
6441 fprintf (file
, _("OPR_REDEF (redefine symbol to curr location)\n"));
6443 case ETIR__C_OPR_DFLIT
:
6444 fprintf (file
, _("OPR_REDEF (define a literal)\n"));
6447 case ETIR__C_STC_LP
:
6448 fprintf (file
, _("STC_LP (store cond linkage pair)\n"));
6450 case ETIR__C_STC_LP_PSB
:
6452 _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6453 /* xgettext:c-format */
6454 fprintf (file
, _(" linkage index: %u, procedure: %.*s\n"),
6455 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6456 buf
+= 4 + 1 + buf
[4];
6457 fprintf (file
, _(" signature: %.*s\n"), buf
[0], buf
+ 1);
6459 case ETIR__C_STC_GBL
:
6460 fprintf (file
, _("STC_GBL (store cond global)\n"));
6461 /* xgettext:c-format */
6462 fprintf (file
, _(" linkage index: %u, global: %.*s\n"),
6463 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6465 case ETIR__C_STC_GCA
:
6466 fprintf (file
, _("STC_GCA (store cond code address)\n"));
6467 /* xgettext:c-format */
6468 fprintf (file
, _(" linkage index: %u, procedure name: %.*s\n"),
6469 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6471 case ETIR__C_STC_PS
:
6472 fprintf (file
, _("STC_PS (store cond psect + offset)\n"));
6474 /* xgettext:c-format */
6475 _(" linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6476 (unsigned)bfd_getl32 (buf
),
6477 (unsigned)bfd_getl32 (buf
+ 4),
6478 (unsigned)bfd_getl32 (buf
+ 12),
6479 (unsigned)bfd_getl32 (buf
+ 8));
6481 case ETIR__C_STC_NOP_GBL
:
6482 fprintf (file
, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6483 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6485 case ETIR__C_STC_NOP_PS
:
6486 fprintf (file
, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6487 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6489 case ETIR__C_STC_BSR_GBL
:
6490 fprintf (file
, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6491 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6493 case ETIR__C_STC_BSR_PS
:
6494 fprintf (file
, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6495 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6497 case ETIR__C_STC_LDA_GBL
:
6498 fprintf (file
, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6499 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6501 case ETIR__C_STC_LDA_PS
:
6502 fprintf (file
, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6503 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6505 case ETIR__C_STC_BOH_GBL
:
6506 fprintf (file
, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6507 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6509 case ETIR__C_STC_BOH_PS
:
6510 fprintf (file
, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6511 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6513 case ETIR__C_STC_NBH_GBL
:
6515 _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6517 case ETIR__C_STC_NBH_PS
:
6519 _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6522 case ETIR__C_CTL_SETRB
:
6523 fprintf (file
, _("CTL_SETRB (set relocation base)\n"));
6526 case ETIR__C_CTL_AUGRB
:
6528 unsigned int val
= bfd_getl32 (buf
);
6529 fprintf (file
, _("CTL_AUGRB (augment relocation base) %u\n"), val
);
6532 case ETIR__C_CTL_DFLOC
:
6533 fprintf (file
, _("CTL_DFLOC (define location)\n"));
6535 case ETIR__C_CTL_STLOC
:
6536 fprintf (file
, _("CTL_STLOC (set location)\n"));
6538 case ETIR__C_CTL_STKDL
:
6539 fprintf (file
, _("CTL_STKDL (stack defined location)\n"));
6542 fprintf (file
, _("*unhandled*\n"));
6550 evax_bfd_print_eobj (struct bfd
*abfd
, FILE *file
)
6552 bfd_boolean is_first
= TRUE
;
6553 bfd_boolean has_records
= FALSE
;
6557 unsigned int rec_len
;
6558 unsigned int pad_len
;
6560 unsigned int hdr_size
;
6565 unsigned char buf
[6];
6570 if (bfd_bread (buf
, sizeof (buf
), abfd
) != sizeof (buf
))
6572 fprintf (file
, _("cannot read GST record length\n"));
6575 rec_len
= bfd_getl16 (buf
+ 0);
6576 if (rec_len
== bfd_getl16 (buf
+ 4)
6577 && bfd_getl16 (buf
+ 2) == EOBJ__C_EMH
)
6579 /* The format is raw: record-size, type, record-size. */
6581 pad_len
= (rec_len
+ 1) & ~1U;
6584 else if (rec_len
== EOBJ__C_EMH
)
6586 has_records
= FALSE
;
6587 pad_len
= bfd_getl16 (buf
+ 2);
6593 fprintf (file
, _("cannot find EMH in first GST record\n"));
6596 rec
= bfd_malloc (pad_len
);
6597 memcpy (rec
, buf
+ sizeof (buf
) - hdr_size
, hdr_size
);
6601 unsigned int rec_len2
= 0;
6602 unsigned char hdr
[4];
6606 unsigned char buf_len
[2];
6608 if (bfd_bread (buf_len
, sizeof (buf_len
), abfd
)
6609 != sizeof (buf_len
))
6611 fprintf (file
, _("cannot read GST record length\n"));
6614 rec_len2
= (unsigned)bfd_getl16 (buf_len
);
6617 if (bfd_bread (hdr
, sizeof (hdr
), abfd
) != sizeof (hdr
))
6619 fprintf (file
, _("cannot read GST record header\n"));
6622 rec_len
= (unsigned)bfd_getl16 (hdr
+ 2);
6624 pad_len
= (rec_len
+ 1) & ~1U;
6627 rec
= bfd_malloc (pad_len
);
6628 memcpy (rec
, hdr
, sizeof (hdr
));
6629 hdr_size
= sizeof (hdr
);
6630 if (has_records
&& rec_len2
!= rec_len
)
6632 fprintf (file
, _(" corrupted GST\n"));
6637 if (bfd_bread (rec
+ hdr_size
, pad_len
- hdr_size
, abfd
)
6638 != pad_len
- hdr_size
)
6640 fprintf (file
, _("cannot read GST record\n"));
6644 type
= (unsigned)bfd_getl16 (rec
);
6649 evax_bfd_print_emh (file
, rec
, rec_len
);
6652 evax_bfd_print_egsd (file
, rec
, rec_len
);
6655 evax_bfd_print_eeom (file
, rec
, rec_len
);
6660 evax_bfd_print_etir (file
, "ETIR", rec
, rec_len
);
6663 evax_bfd_print_etir (file
, "EDBG", rec
, rec_len
);
6666 evax_bfd_print_etir (file
, "ETBT", rec
, rec_len
);
6669 fprintf (file
, _(" unhandled EOBJ record type %u\n"), type
);
6677 evax_bfd_print_relocation_records (FILE *file
, const unsigned char *rel
,
6678 unsigned int stride
)
6686 count
= bfd_getl32 (rel
+ 0);
6690 base
= bfd_getl32 (rel
+ 4);
6692 /* xgettext:c-format */
6693 fprintf (file
, _(" bitcount: %u, base addr: 0x%08x\n"),
6697 for (j
= 0; count
> 0; j
+= 4, count
-= 32)
6703 val
= bfd_getl32 (rel
);
6706 /* xgettext:c-format */
6707 fprintf (file
, _(" bitmap: 0x%08x (count: %u):\n"), val
, count
);
6709 for (k
= 0; k
< 32; k
++)
6710 if (val
& (1u << k
))
6714 fprintf (file
, _(" %08x"), base
+ (j
* 8 + k
) * stride
);
6729 evax_bfd_print_address_fixups (FILE *file
, const unsigned char *rel
)
6736 count
= bfd_getl32 (rel
+ 0);
6739 /* xgettext:c-format */
6740 fprintf (file
, _(" image %u (%u entries)\n"),
6741 (unsigned)bfd_getl32 (rel
+ 4), count
);
6743 for (j
= 0; j
< count
; j
++)
6745 /* xgettext:c-format */
6746 fprintf (file
, _(" offset: 0x%08x, val: 0x%08x\n"),
6747 (unsigned)bfd_getl32 (rel
+ 0),
6748 (unsigned)bfd_getl32 (rel
+ 4));
6755 evax_bfd_print_reference_fixups (FILE *file
, const unsigned char *rel
)
6764 count
= bfd_getl32 (rel
+ 0);
6767 /* xgettext:c-format */
6768 fprintf (file
, _(" image %u (%u entries), offsets:\n"),
6769 (unsigned)bfd_getl32 (rel
+ 4), count
);
6771 for (j
= 0; j
< count
; j
++)
6775 fprintf (file
, _(" 0x%08x"), (unsigned)bfd_getl32 (rel
));
6790 evax_bfd_print_indent (int indent
, FILE *file
)
6792 for (; indent
; indent
--)
6797 evax_bfd_get_dsc_name (unsigned int v
)
6801 case DSC__K_DTYPE_Z
:
6802 return "Z (Unspecified)";
6803 case DSC__K_DTYPE_V
:
6805 case DSC__K_DTYPE_BU
:
6806 return "BU (Byte logical)";
6807 case DSC__K_DTYPE_WU
:
6808 return "WU (Word logical)";
6809 case DSC__K_DTYPE_LU
:
6810 return "LU (Longword logical)";
6811 case DSC__K_DTYPE_QU
:
6812 return "QU (Quadword logical)";
6813 case DSC__K_DTYPE_B
:
6814 return "B (Byte integer)";
6815 case DSC__K_DTYPE_W
:
6816 return "W (Word integer)";
6817 case DSC__K_DTYPE_L
:
6818 return "L (Longword integer)";
6819 case DSC__K_DTYPE_Q
:
6820 return "Q (Quadword integer)";
6821 case DSC__K_DTYPE_F
:
6822 return "F (Single-precision floating)";
6823 case DSC__K_DTYPE_D
:
6824 return "D (Double-precision floating)";
6825 case DSC__K_DTYPE_FC
:
6826 return "FC (Complex)";
6827 case DSC__K_DTYPE_DC
:
6828 return "DC (Double-precision Complex)";
6829 case DSC__K_DTYPE_T
:
6830 return "T (ASCII text string)";
6831 case DSC__K_DTYPE_NU
:
6832 return "NU (Numeric string, unsigned)";
6833 case DSC__K_DTYPE_NL
:
6834 return "NL (Numeric string, left separate sign)";
6835 case DSC__K_DTYPE_NLO
:
6836 return "NLO (Numeric string, left overpunched sign)";
6837 case DSC__K_DTYPE_NR
:
6838 return "NR (Numeric string, right separate sign)";
6839 case DSC__K_DTYPE_NRO
:
6840 return "NRO (Numeric string, right overpunched sig)";
6841 case DSC__K_DTYPE_NZ
:
6842 return "NZ (Numeric string, zoned sign)";
6843 case DSC__K_DTYPE_P
:
6844 return "P (Packed decimal string)";
6845 case DSC__K_DTYPE_ZI
:
6846 return "ZI (Sequence of instructions)";
6847 case DSC__K_DTYPE_ZEM
:
6848 return "ZEM (Procedure entry mask)";
6849 case DSC__K_DTYPE_DSC
:
6850 return "DSC (Descriptor, used for arrays of dyn strings)";
6851 case DSC__K_DTYPE_OU
:
6852 return "OU (Octaword logical)";
6853 case DSC__K_DTYPE_O
:
6854 return "O (Octaword integer)";
6855 case DSC__K_DTYPE_G
:
6856 return "G (Double precision G floating, 64 bit)";
6857 case DSC__K_DTYPE_H
:
6858 return "H (Quadruple precision floating, 128 bit)";
6859 case DSC__K_DTYPE_GC
:
6860 return "GC (Double precision complex, G floating)";
6861 case DSC__K_DTYPE_HC
:
6862 return "HC (Quadruple precision complex, H floating)";
6863 case DSC__K_DTYPE_CIT
:
6864 return "CIT (COBOL intermediate temporary)";
6865 case DSC__K_DTYPE_BPV
:
6866 return "BPV (Bound Procedure Value)";
6867 case DSC__K_DTYPE_BLV
:
6868 return "BLV (Bound Label Value)";
6869 case DSC__K_DTYPE_VU
:
6870 return "VU (Bit Unaligned)";
6871 case DSC__K_DTYPE_ADT
:
6872 return "ADT (Absolute Date-Time)";
6873 case DSC__K_DTYPE_VT
:
6874 return "VT (Varying Text)";
6875 case DSC__K_DTYPE_T2
:
6876 return "T2 (16-bit char)";
6877 case DSC__K_DTYPE_VT2
:
6878 return "VT2 (16-bit varying char)";
6880 return "?? (unknown)";
6885 evax_bfd_print_desc (const unsigned char *buf
, int indent
, FILE *file
)
6887 unsigned char bclass
= buf
[3];
6888 unsigned char dtype
= buf
[2];
6889 unsigned int len
= (unsigned)bfd_getl16 (buf
);
6890 unsigned int pointer
= (unsigned)bfd_getl32 (buf
+ 4);
6892 evax_bfd_print_indent (indent
, file
);
6894 if (len
== 1 && pointer
== 0xffffffffUL
)
6897 fprintf (file
, _("64 bits *unhandled*\n"));
6901 /* xgettext:c-format */
6902 fprintf (file
, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
6903 bclass
, dtype
, len
, pointer
);
6906 case DSC__K_CLASS_NCA
:
6908 const struct vms_dsc_nca
*dsc
= (const void *)buf
;
6910 const unsigned char *b
;
6912 evax_bfd_print_indent (indent
, file
);
6913 fprintf (file
, _("non-contiguous array of %s\n"),
6914 evax_bfd_get_dsc_name (dsc
->dtype
));
6915 evax_bfd_print_indent (indent
+ 1, file
);
6917 /* xgettext:c-format */
6918 _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
6919 dsc
->dimct
, dsc
->aflags
, dsc
->digits
, dsc
->scale
);
6920 evax_bfd_print_indent (indent
+ 1, file
);
6922 /* xgettext:c-format */
6923 _("arsize: %u, a0: 0x%08x\n"),
6924 (unsigned)bfd_getl32 (dsc
->arsize
),
6925 (unsigned)bfd_getl32 (dsc
->a0
));
6926 evax_bfd_print_indent (indent
+ 1, file
);
6927 fprintf (file
, _("Strides:\n"));
6928 b
= buf
+ sizeof (*dsc
);
6929 for (i
= 0; i
< dsc
->dimct
; i
++)
6931 evax_bfd_print_indent (indent
+ 2, file
);
6932 fprintf (file
, "[%u]: %u\n", i
+ 1,
6933 (unsigned)bfd_getl32 (b
));
6936 evax_bfd_print_indent (indent
+ 1, file
);
6937 fprintf (file
, _("Bounds:\n"));
6938 b
= buf
+ sizeof (*dsc
);
6939 for (i
= 0; i
< dsc
->dimct
; i
++)
6941 evax_bfd_print_indent (indent
+ 2, file
);
6942 /* xgettext:c-format */
6943 fprintf (file
, _("[%u]: Lower: %u, upper: %u\n"), i
+ 1,
6944 (unsigned)bfd_getl32 (b
+ 0),
6945 (unsigned)bfd_getl32 (b
+ 4));
6950 case DSC__K_CLASS_UBS
:
6952 const struct vms_dsc_ubs
*ubs
= (const void *)buf
;
6954 evax_bfd_print_indent (indent
, file
);
6955 fprintf (file
, _("unaligned bit-string of %s\n"),
6956 evax_bfd_get_dsc_name (ubs
->dtype
));
6957 evax_bfd_print_indent (indent
+ 1, file
);
6959 /* xgettext:c-format */
6960 _("base: %u, pos: %u\n"),
6961 (unsigned)bfd_getl32 (ubs
->base
),
6962 (unsigned)bfd_getl32 (ubs
->pos
));
6966 fprintf (file
, _("*unhandled*\n"));
6973 evax_bfd_print_valspec (const unsigned char *buf
, int indent
, FILE *file
)
6975 unsigned int vflags
= buf
[0];
6976 unsigned int value
= (unsigned)bfd_getl32 (buf
+ 1);
6977 unsigned int len
= 5;
6979 evax_bfd_print_indent (indent
, file
);
6980 /* xgettext:c-format */
6981 fprintf (file
, _("vflags: 0x%02x, value: 0x%08x "), vflags
, value
);
6986 case DST__K_VFLAGS_NOVAL
:
6987 fprintf (file
, _("(no value)\n"));
6989 case DST__K_VFLAGS_NOTACTIVE
:
6990 fprintf (file
, _("(not active)\n"));
6992 case DST__K_VFLAGS_UNALLOC
:
6993 fprintf (file
, _("(not allocated)\n"));
6995 case DST__K_VFLAGS_DSC
:
6996 fprintf (file
, _("(descriptor)\n"));
6997 evax_bfd_print_desc (buf
+ value
, indent
+ 1, file
);
6999 case DST__K_VFLAGS_TVS
:
7000 fprintf (file
, _("(trailing value)\n"));
7002 case DST__K_VS_FOLLOWS
:
7003 fprintf (file
, _("(value spec follows)\n"));
7005 case DST__K_VFLAGS_BITOFFS
:
7006 fprintf (file
, _("(at bit offset %u)\n"), value
);
7009 /* xgettext:c-format */
7010 fprintf (file
, _("(reg: %u, disp: %u, indir: %u, kind: "),
7011 (vflags
& DST__K_REGNUM_MASK
) >> DST__K_REGNUM_SHIFT
,
7012 vflags
& DST__K_DISP
? 1 : 0,
7013 vflags
& DST__K_INDIR
? 1 : 0);
7014 switch (vflags
& DST__K_VALKIND_MASK
)
7016 case DST__K_VALKIND_LITERAL
:
7017 fputs (_("literal"), file
);
7019 case DST__K_VALKIND_ADDR
:
7020 fputs (_("address"), file
);
7022 case DST__K_VALKIND_DESC
:
7023 fputs (_("desc"), file
);
7025 case DST__K_VALKIND_REG
:
7026 fputs (_("reg"), file
);
7029 fputs (")\n", file
);
7036 evax_bfd_print_typspec (const unsigned char *buf
, int indent
, FILE *file
)
7038 unsigned char kind
= buf
[2];
7039 unsigned int len
= (unsigned)bfd_getl16 (buf
);
7041 evax_bfd_print_indent (indent
, file
);
7042 /* xgettext:c-format */
7043 fprintf (file
, _("len: %2u, kind: %2u "), len
, kind
);
7047 case DST__K_TS_ATOM
:
7048 /* xgettext:c-format */
7049 fprintf (file
, _("atomic, type=0x%02x %s\n"),
7050 buf
[0], evax_bfd_get_dsc_name (buf
[0]));
7053 fprintf (file
, _("indirect, defined at 0x%08x\n"),
7054 (unsigned)bfd_getl32 (buf
));
7056 case DST__K_TS_TPTR
:
7057 fprintf (file
, _("typed pointer\n"));
7058 evax_bfd_print_typspec (buf
, indent
+ 1, file
);
7061 fprintf (file
, _("pointer\n"));
7063 case DST__K_TS_ARRAY
:
7065 const unsigned char *vs
;
7066 unsigned int vec_len
;
7069 fprintf (file
, _("array, dim: %u, bitmap: "), buf
[0]);
7070 vec_len
= (buf
[0] + 1 + 7) / 8;
7071 for (i
= 0; i
< vec_len
; i
++)
7072 fprintf (file
, " %02x", buf
[i
+ 1]);
7074 vs
= buf
+ 1 + vec_len
;
7075 evax_bfd_print_indent (indent
, file
);
7076 fprintf (file
, _("array descriptor:\n"));
7077 vs
+= evax_bfd_print_valspec (vs
, indent
+ 1, file
);
7078 for (i
= 0; i
< buf
[0] + 1U; i
++)
7079 if (buf
[1 + i
/ 8] & (1 << (i
% 8)))
7081 evax_bfd_print_indent (indent
, file
);
7083 fprintf (file
, _("type spec for element:\n"));
7085 fprintf (file
, _("type spec for subscript %u:\n"), i
);
7086 evax_bfd_print_typspec (vs
, indent
+ 1, file
);
7087 vs
+= bfd_getl16 (vs
);
7092 fprintf (file
, _("*unhandled*\n"));
7097 evax_bfd_print_dst (struct bfd
*abfd
, unsigned int dst_size
, FILE *file
)
7099 unsigned int off
= 0;
7100 unsigned int pc
= 0;
7101 unsigned int line
= 0;
7103 fprintf (file
, _("Debug symbol table:\n"));
7105 while (dst_size
> 0)
7107 struct vms_dst_header dsth
;
7112 if (bfd_bread (&dsth
, sizeof (dsth
), abfd
) != sizeof (dsth
))
7114 fprintf (file
, _("cannot read DST header\n"));
7117 len
= bfd_getl16 (dsth
.length
);
7118 type
= bfd_getl16 (dsth
.type
);
7119 /* xgettext:c-format */
7120 fprintf (file
, _(" type: %3u, len: %3u (at 0x%08x): "),
7130 len
-= sizeof (dsth
);
7131 buf
= bfd_malloc (len
);
7132 if (bfd_bread (buf
, len
, abfd
) != len
)
7134 fprintf (file
, _("cannot read DST symbol\n"));
7139 case DSC__K_DTYPE_V
:
7140 case DSC__K_DTYPE_BU
:
7141 case DSC__K_DTYPE_WU
:
7142 case DSC__K_DTYPE_LU
:
7143 case DSC__K_DTYPE_QU
:
7144 case DSC__K_DTYPE_B
:
7145 case DSC__K_DTYPE_W
:
7146 case DSC__K_DTYPE_L
:
7147 case DSC__K_DTYPE_Q
:
7148 case DSC__K_DTYPE_F
:
7149 case DSC__K_DTYPE_D
:
7150 case DSC__K_DTYPE_FC
:
7151 case DSC__K_DTYPE_DC
:
7152 case DSC__K_DTYPE_T
:
7153 case DSC__K_DTYPE_NU
:
7154 case DSC__K_DTYPE_NL
:
7155 case DSC__K_DTYPE_NLO
:
7156 case DSC__K_DTYPE_NR
:
7157 case DSC__K_DTYPE_NRO
:
7158 case DSC__K_DTYPE_NZ
:
7159 case DSC__K_DTYPE_P
:
7160 case DSC__K_DTYPE_ZI
:
7161 case DSC__K_DTYPE_ZEM
:
7162 case DSC__K_DTYPE_DSC
:
7163 case DSC__K_DTYPE_OU
:
7164 case DSC__K_DTYPE_O
:
7165 case DSC__K_DTYPE_G
:
7166 case DSC__K_DTYPE_H
:
7167 case DSC__K_DTYPE_GC
:
7168 case DSC__K_DTYPE_HC
:
7169 case DSC__K_DTYPE_CIT
:
7170 case DSC__K_DTYPE_BPV
:
7171 case DSC__K_DTYPE_BLV
:
7172 case DSC__K_DTYPE_VU
:
7173 case DSC__K_DTYPE_ADT
:
7174 case DSC__K_DTYPE_VT
:
7175 case DSC__K_DTYPE_T2
:
7176 case DSC__K_DTYPE_VT2
:
7177 fprintf (file
, _("standard data: %s\n"),
7178 evax_bfd_get_dsc_name (type
));
7179 evax_bfd_print_valspec (buf
, 4, file
);
7180 fprintf (file
, _(" name: %.*s\n"), buf
[5], buf
+ 6);
7184 struct vms_dst_modbeg
*dst
= (void *)buf
;
7185 const char *name
= (const char *)buf
+ sizeof (*dst
);
7187 fprintf (file
, _("modbeg\n"));
7188 /* xgettext:c-format */
7189 fprintf (file
, _(" flags: %d, language: %u, "
7190 "major: %u, minor: %u\n"),
7192 (unsigned)bfd_getl32 (dst
->language
),
7193 (unsigned)bfd_getl16 (dst
->major
),
7194 (unsigned)bfd_getl16 (dst
->minor
));
7195 fprintf (file
, _(" module name: %.*s\n"),
7197 name
+= name
[0] + 1;
7198 fprintf (file
, _(" compiler : %.*s\n"),
7203 fprintf (file
, _("modend\n"));
7207 struct vms_dst_rtnbeg
*dst
= (void *)buf
;
7208 const char *name
= (const char *)buf
+ sizeof (*dst
);
7210 fputs (_("rtnbeg\n"), file
);
7211 /* xgettext:c-format */
7212 fprintf (file
, _(" flags: %u, address: 0x%08x, "
7213 "pd-address: 0x%08x\n"),
7215 (unsigned)bfd_getl32 (dst
->address
),
7216 (unsigned)bfd_getl32 (dst
->pd_address
));
7217 fprintf (file
, _(" routine name: %.*s\n"),
7223 struct vms_dst_rtnend
*dst
= (void *)buf
;
7225 fprintf (file
, _("rtnend: size 0x%08x\n"),
7226 (unsigned)bfd_getl32 (dst
->size
));
7231 struct vms_dst_prolog
*dst
= (void *)buf
;
7233 fprintf (file
, _("prolog: bkpt address 0x%08x\n"),
7234 (unsigned)bfd_getl32 (dst
->bkpt_addr
));
7239 struct vms_dst_epilog
*dst
= (void *)buf
;
7241 /* xgettext:c-format */
7242 fprintf (file
, _("epilog: flags: %u, count: %u\n"),
7243 dst
->flags
, (unsigned)bfd_getl32 (dst
->count
));
7248 struct vms_dst_blkbeg
*dst
= (void *)buf
;
7249 const char *name
= (const char *)buf
+ sizeof (*dst
);
7251 /* xgettext:c-format */
7252 fprintf (file
, _("blkbeg: address: 0x%08x, name: %.*s\n"),
7253 (unsigned)bfd_getl32 (dst
->address
),
7259 struct vms_dst_blkend
*dst
= (void *)buf
;
7261 fprintf (file
, _("blkend: size: 0x%08x\n"),
7262 (unsigned)bfd_getl32 (dst
->size
));
7265 case DST__K_TYPSPEC
:
7267 fprintf (file
, _("typspec (len: %u)\n"), len
);
7268 fprintf (file
, _(" name: %.*s\n"), buf
[0], buf
+ 1);
7269 evax_bfd_print_typspec (buf
+ 1 + buf
[0], 5, file
);
7274 fprintf (file
, _("septyp, name: %.*s\n"), buf
[5], buf
+ 6);
7275 evax_bfd_print_valspec (buf
, 4, file
);
7280 struct vms_dst_recbeg
*recbeg
= (void *)buf
;
7281 const char *name
= (const char *)buf
+ sizeof (*recbeg
);
7283 fprintf (file
, _("recbeg: name: %.*s\n"), name
[0], name
+ 1);
7284 evax_bfd_print_valspec (buf
, 4, file
);
7285 fprintf (file
, _(" len: %u bits\n"),
7286 (unsigned)bfd_getl32 (name
+ 1 + name
[0]));
7290 fprintf (file
, _("recend\n"));
7292 case DST__K_ENUMBEG
:
7293 /* xgettext:c-format */
7294 fprintf (file
, _("enumbeg, len: %u, name: %.*s\n"),
7295 buf
[0], buf
[1], buf
+ 2);
7297 case DST__K_ENUMELT
:
7298 fprintf (file
, _("enumelt, name: %.*s\n"), buf
[5], buf
+ 6);
7299 evax_bfd_print_valspec (buf
, 4, file
);
7301 case DST__K_ENUMEND
:
7302 fprintf (file
, _("enumend\n"));
7306 struct vms_dst_label
*lab
= (void *)buf
;
7307 fprintf (file
, _("label, name: %.*s\n"),
7308 lab
->name
[0], lab
->name
+ 1);
7309 fprintf (file
, _(" address: 0x%08x\n"),
7310 (unsigned)bfd_getl32 (lab
->value
));
7313 case DST__K_DIS_RANGE
:
7315 unsigned int cnt
= bfd_getl32 (buf
);
7316 unsigned char *rng
= buf
+ 4;
7319 fprintf (file
, _("discontiguous range (nbr: %u)\n"), cnt
);
7320 for (i
= 0; i
< cnt
; i
++, rng
+= 8)
7321 /* xgettext:c-format */
7322 fprintf (file
, _(" address: 0x%08x, size: %u\n"),
7323 (unsigned)bfd_getl32 (rng
),
7324 (unsigned)bfd_getl32 (rng
+ 4));
7328 case DST__K_LINE_NUM
:
7330 unsigned char *buf_orig
= buf
;
7332 fprintf (file
, _("line num (len: %u)\n"), len
);
7337 unsigned char cmdlen
;
7347 case DST__K_DELTA_PC_W
:
7348 val
= bfd_getl16 (buf
+ 1);
7349 fprintf (file
, _("delta_pc_w %u\n"), val
);
7354 case DST__K_INCR_LINUM
:
7356 fprintf (file
, _("incr_linum(b): +%u\n"), val
);
7360 case DST__K_INCR_LINUM_W
:
7361 val
= bfd_getl16 (buf
+ 1);
7362 fprintf (file
, _("incr_linum_w: +%u\n"), val
);
7366 case DST__K_INCR_LINUM_L
:
7367 val
= bfd_getl32 (buf
+ 1);
7368 fprintf (file
, _("incr_linum_l: +%u\n"), val
);
7372 case DST__K_SET_LINUM
:
7373 line
= bfd_getl16 (buf
+ 1);
7374 fprintf (file
, _("set_line_num(w) %u\n"), line
);
7377 case DST__K_SET_LINUM_B
:
7379 fprintf (file
, _("set_line_num_b %u\n"), line
);
7382 case DST__K_SET_LINUM_L
:
7383 line
= bfd_getl32 (buf
+ 1);
7384 fprintf (file
, _("set_line_num_l %u\n"), line
);
7387 case DST__K_SET_ABS_PC
:
7388 pc
= bfd_getl32 (buf
+ 1);
7389 fprintf (file
, _("set_abs_pc: 0x%08x\n"), pc
);
7392 case DST__K_DELTA_PC_L
:
7393 fprintf (file
, _("delta_pc_l: +0x%08x\n"),
7394 (unsigned)bfd_getl32 (buf
+ 1));
7398 fprintf (file
, _("term(b): 0x%02x"), buf
[1]);
7400 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7404 val
= bfd_getl16 (buf
+ 1);
7405 fprintf (file
, _("term_w: 0x%04x"), val
);
7407 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7413 fprintf (file
, _("delta pc +%-4d"), -cmd
);
7414 line
++; /* FIXME: curr increment. */
7416 /* xgettext:c-format */
7417 fprintf (file
, _(" pc: 0x%08x line: %5u\n"),
7422 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
7435 unsigned char *buf_orig
= buf
;
7437 fprintf (file
, _("source (len: %u)\n"), len
);
7441 signed char cmd
= buf
[0];
7442 unsigned char cmdlen
= 0;
7446 case DST__K_SRC_DECLFILE
:
7448 struct vms_dst_src_decl_src
*src
= (void *)(buf
+ 1);
7451 /* xgettext:c-format */
7452 fprintf (file
, _(" declfile: len: %u, flags: %u, "
7454 src
->length
, src
->flags
,
7455 (unsigned)bfd_getl16 (src
->fileid
));
7456 /* xgettext:c-format */
7457 fprintf (file
, _(" rms: cdt: 0x%08x %08x, "
7458 "ebk: 0x%08x, ffb: 0x%04x, "
7460 (unsigned)bfd_getl32 (src
->rms_cdt
+ 4),
7461 (unsigned)bfd_getl32 (src
->rms_cdt
+ 0),
7462 (unsigned)bfd_getl32 (src
->rms_ebk
),
7463 (unsigned)bfd_getl16 (src
->rms_ffb
),
7465 name
= (const char *)buf
+ 1 + sizeof (*src
);
7466 fprintf (file
, _(" filename : %.*s\n"),
7468 name
+= name
[0] + 1;
7469 fprintf (file
, _(" module name: %.*s\n"),
7471 cmdlen
= 2 + src
->length
;
7474 case DST__K_SRC_SETFILE
:
7475 fprintf (file
, _(" setfile %u\n"),
7476 (unsigned)bfd_getl16 (buf
+ 1));
7479 case DST__K_SRC_SETREC_W
:
7480 fprintf (file
, _(" setrec %u\n"),
7481 (unsigned)bfd_getl16 (buf
+ 1));
7484 case DST__K_SRC_SETREC_L
:
7485 fprintf (file
, _(" setrec %u\n"),
7486 (unsigned)bfd_getl32 (buf
+ 1));
7489 case DST__K_SRC_SETLNUM_W
:
7490 fprintf (file
, _(" setlnum %u\n"),
7491 (unsigned)bfd_getl16 (buf
+ 1));
7494 case DST__K_SRC_SETLNUM_L
:
7495 fprintf (file
, _(" setlnum %u\n"),
7496 (unsigned)bfd_getl32 (buf
+ 1));
7499 case DST__K_SRC_DEFLINES_W
:
7500 fprintf (file
, _(" deflines %u\n"),
7501 (unsigned)bfd_getl16 (buf
+ 1));
7504 case DST__K_SRC_DEFLINES_B
:
7505 fprintf (file
, _(" deflines %u\n"), buf
[1]);
7508 case DST__K_SRC_FORMFEED
:
7509 fprintf (file
, _(" formfeed\n"));
7513 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
7525 fprintf (file
, _("*unhandled* dst type %u\n"), type
);
7533 evax_bfd_print_image (bfd
*abfd
, FILE *file
)
7535 struct vms_eihd eihd
;
7538 unsigned int eiha_off
;
7539 unsigned int eihi_off
;
7540 unsigned int eihs_off
;
7541 unsigned int eisd_off
;
7542 unsigned int eihef_off
= 0;
7543 unsigned int eihnp_off
= 0;
7544 unsigned int dmt_vbn
= 0;
7545 unsigned int dmt_size
= 0;
7546 unsigned int dst_vbn
= 0;
7547 unsigned int dst_size
= 0;
7548 unsigned int gst_vbn
= 0;
7549 unsigned int gst_size
= 0;
7550 unsigned int eiaf_vbn
= 0;
7551 unsigned int eiaf_size
= 0;
7552 unsigned int eihvn_off
;
7554 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
)
7555 || bfd_bread (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
7557 fprintf (file
, _("cannot read EIHD\n"));
7560 /* xgettext:c-format */
7561 fprintf (file
, _("EIHD: (size: %u, nbr blocks: %u)\n"),
7562 (unsigned)bfd_getl32 (eihd
.size
),
7563 (unsigned)bfd_getl32 (eihd
.hdrblkcnt
));
7564 /* xgettext:c-format */
7565 fprintf (file
, _(" majorid: %u, minorid: %u\n"),
7566 (unsigned)bfd_getl32 (eihd
.majorid
),
7567 (unsigned)bfd_getl32 (eihd
.minorid
));
7569 val
= (unsigned)bfd_getl32 (eihd
.imgtype
);
7573 name
= _("executable");
7576 name
= _("linkable image");
7579 name
= _("unknown");
7582 /* xgettext:c-format */
7583 fprintf (file
, _(" image type: %u (%s)"), val
, name
);
7585 val
= (unsigned)bfd_getl32 (eihd
.subtype
);
7588 case EIHD__C_NATIVE
:
7595 name
= _("unknown");
7598 /* xgettext:c-format */
7599 fprintf (file
, _(", subtype: %u (%s)\n"), val
, name
);
7601 eisd_off
= bfd_getl32 (eihd
.isdoff
);
7602 eiha_off
= bfd_getl32 (eihd
.activoff
);
7603 eihi_off
= bfd_getl32 (eihd
.imgidoff
);
7604 eihs_off
= bfd_getl32 (eihd
.symdbgoff
);
7605 /* xgettext:c-format */
7606 fprintf (file
, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
7607 "imgid: %u, patch: %u\n"),
7608 eisd_off
, eiha_off
, eihs_off
, eihi_off
,
7609 (unsigned)bfd_getl32 (eihd
.patchoff
));
7610 fprintf (file
, _(" fixup info rva: "));
7611 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.iafva
));
7612 fprintf (file
, _(", symbol vector rva: "));
7613 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.symvva
));
7614 eihvn_off
= bfd_getl32 (eihd
.version_array_off
);
7615 fprintf (file
, _("\n"
7616 " version array off: %u\n"),
7619 /* xgettext:c-format */
7620 _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
7621 (unsigned)bfd_getl32 (eihd
.imgiocnt
),
7622 (unsigned)bfd_getl32 (eihd
.iochancnt
),
7623 (unsigned)bfd_getl32 (eihd
.privreqs
+ 4),
7624 (unsigned)bfd_getl32 (eihd
.privreqs
+ 0));
7625 val
= (unsigned)bfd_getl32 (eihd
.lnkflags
);
7626 fprintf (file
, _(" linker flags: %08x:"), val
);
7627 if (val
& EIHD__M_LNKDEBUG
)
7628 fprintf (file
, " LNKDEBUG");
7629 if (val
& EIHD__M_LNKNOTFR
)
7630 fprintf (file
, " LNKNOTFR");
7631 if (val
& EIHD__M_NOP0BUFS
)
7632 fprintf (file
, " NOP0BUFS");
7633 if (val
& EIHD__M_PICIMG
)
7634 fprintf (file
, " PICIMG");
7635 if (val
& EIHD__M_P0IMAGE
)
7636 fprintf (file
, " P0IMAGE");
7637 if (val
& EIHD__M_DBGDMT
)
7638 fprintf (file
, " DBGDMT");
7639 if (val
& EIHD__M_INISHR
)
7640 fprintf (file
, " INISHR");
7641 if (val
& EIHD__M_XLATED
)
7642 fprintf (file
, " XLATED");
7643 if (val
& EIHD__M_BIND_CODE_SEC
)
7644 fprintf (file
, " BIND_CODE_SEC");
7645 if (val
& EIHD__M_BIND_DATA_SEC
)
7646 fprintf (file
, " BIND_DATA_SEC");
7647 if (val
& EIHD__M_MKTHREADS
)
7648 fprintf (file
, " MKTHREADS");
7649 if (val
& EIHD__M_UPCALLS
)
7650 fprintf (file
, " UPCALLS");
7651 if (val
& EIHD__M_OMV_READY
)
7652 fprintf (file
, " OMV_READY");
7653 if (val
& EIHD__M_EXT_BIND_SECT
)
7654 fprintf (file
, " EXT_BIND_SECT");
7655 fprintf (file
, "\n");
7656 /* xgettext:c-format */
7657 fprintf (file
, _(" ident: 0x%08x, sysver: 0x%08x, "
7658 "match ctrl: %u, symvect_size: %u\n"),
7659 (unsigned)bfd_getl32 (eihd
.ident
),
7660 (unsigned)bfd_getl32 (eihd
.sysver
),
7662 (unsigned)bfd_getl32 (eihd
.symvect_size
));
7663 fprintf (file
, _(" BPAGE: %u"),
7664 (unsigned)bfd_getl32 (eihd
.virt_mem_block_size
));
7665 if (val
& (EIHD__M_OMV_READY
| EIHD__M_EXT_BIND_SECT
))
7667 eihef_off
= bfd_getl32 (eihd
.ext_fixup_off
);
7668 eihnp_off
= bfd_getl32 (eihd
.noopt_psect_off
);
7669 /* xgettext:c-format */
7670 fprintf (file
, _(", ext fixup offset: %u, no_opt psect off: %u"),
7671 eihef_off
, eihnp_off
);
7673 fprintf (file
, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd
.alias
));
7677 struct vms_eihvn eihvn
;
7681 fprintf (file
, _("system version array information:\n"));
7682 if (bfd_seek (abfd
, (file_ptr
) eihvn_off
, SEEK_SET
)
7683 || bfd_bread (&eihvn
, sizeof (eihvn
), abfd
) != sizeof (eihvn
))
7685 fprintf (file
, _("cannot read EIHVN header\n"));
7688 mask
= bfd_getl32 (eihvn
.subsystem_mask
);
7689 for (j
= 0; j
< 32; j
++)
7690 if (mask
& (1 << j
))
7692 struct vms_eihvn_subversion ver
;
7693 if (bfd_bread (&ver
, sizeof (ver
), abfd
) != sizeof (ver
))
7695 fprintf (file
, _("cannot read EIHVN version\n"));
7698 fprintf (file
, _(" %02u "), j
);
7701 case EIHVN__BASE_IMAGE_BIT
:
7702 fputs (_("BASE_IMAGE "), file
);
7704 case EIHVN__MEMORY_MANAGEMENT_BIT
:
7705 fputs (_("MEMORY_MANAGEMENT"), file
);
7708 fputs (_("IO "), file
);
7710 case EIHVN__FILES_VOLUMES_BIT
:
7711 fputs (_("FILES_VOLUMES "), file
);
7713 case EIHVN__PROCESS_SCHED_BIT
:
7714 fputs (_("PROCESS_SCHED "), file
);
7716 case EIHVN__SYSGEN_BIT
:
7717 fputs (_("SYSGEN "), file
);
7719 case EIHVN__CLUSTERS_LOCKMGR_BIT
:
7720 fputs (_("CLUSTERS_LOCKMGR "), file
);
7722 case EIHVN__LOGICAL_NAMES_BIT
:
7723 fputs (_("LOGICAL_NAMES "), file
);
7725 case EIHVN__SECURITY_BIT
:
7726 fputs (_("SECURITY "), file
);
7728 case EIHVN__IMAGE_ACTIVATOR_BIT
:
7729 fputs (_("IMAGE_ACTIVATOR "), file
);
7731 case EIHVN__NETWORKS_BIT
:
7732 fputs (_("NETWORKS "), file
);
7734 case EIHVN__COUNTERS_BIT
:
7735 fputs (_("COUNTERS "), file
);
7737 case EIHVN__STABLE_BIT
:
7738 fputs (_("STABLE "), file
);
7740 case EIHVN__MISC_BIT
:
7741 fputs (_("MISC "), file
);
7743 case EIHVN__CPU_BIT
:
7744 fputs (_("CPU "), file
);
7746 case EIHVN__VOLATILE_BIT
:
7747 fputs (_("VOLATILE "), file
);
7749 case EIHVN__SHELL_BIT
:
7750 fputs (_("SHELL "), file
);
7752 case EIHVN__POSIX_BIT
:
7753 fputs (_("POSIX "), file
);
7755 case EIHVN__MULTI_PROCESSING_BIT
:
7756 fputs (_("MULTI_PROCESSING "), file
);
7758 case EIHVN__GALAXY_BIT
:
7759 fputs (_("GALAXY "), file
);
7762 fputs (_("*unknown* "), file
);
7765 fprintf (file
, ": %u.%u\n",
7766 (unsigned)bfd_getl16 (ver
.major
),
7767 (unsigned)bfd_getl16 (ver
.minor
));
7773 struct vms_eiha eiha
;
7775 if (bfd_seek (abfd
, (file_ptr
) eiha_off
, SEEK_SET
)
7776 || bfd_bread (&eiha
, sizeof (eiha
), abfd
) != sizeof (eiha
))
7778 fprintf (file
, _("cannot read EIHA\n"));
7781 fprintf (file
, _("Image activation: (size=%u)\n"),
7782 (unsigned)bfd_getl32 (eiha
.size
));
7783 /* xgettext:c-format */
7784 fprintf (file
, _(" First address : 0x%08x 0x%08x\n"),
7785 (unsigned)bfd_getl32 (eiha
.tfradr1_h
),
7786 (unsigned)bfd_getl32 (eiha
.tfradr1
));
7787 /* xgettext:c-format */
7788 fprintf (file
, _(" Second address: 0x%08x 0x%08x\n"),
7789 (unsigned)bfd_getl32 (eiha
.tfradr2_h
),
7790 (unsigned)bfd_getl32 (eiha
.tfradr2
));
7791 /* xgettext:c-format */
7792 fprintf (file
, _(" Third address : 0x%08x 0x%08x\n"),
7793 (unsigned)bfd_getl32 (eiha
.tfradr3_h
),
7794 (unsigned)bfd_getl32 (eiha
.tfradr3
));
7795 /* xgettext:c-format */
7796 fprintf (file
, _(" Fourth address: 0x%08x 0x%08x\n"),
7797 (unsigned)bfd_getl32 (eiha
.tfradr4_h
),
7798 (unsigned)bfd_getl32 (eiha
.tfradr4
));
7799 /* xgettext:c-format */
7800 fprintf (file
, _(" Shared image : 0x%08x 0x%08x\n"),
7801 (unsigned)bfd_getl32 (eiha
.inishr_h
),
7802 (unsigned)bfd_getl32 (eiha
.inishr
));
7806 struct vms_eihi eihi
;
7808 if (bfd_seek (abfd
, (file_ptr
) eihi_off
, SEEK_SET
)
7809 || bfd_bread (&eihi
, sizeof (eihi
), abfd
) != sizeof (eihi
))
7811 fprintf (file
, _("cannot read EIHI\n"));
7814 /* xgettext:c-format */
7815 fprintf (file
, _("Image identification: (major: %u, minor: %u)\n"),
7816 (unsigned)bfd_getl32 (eihi
.majorid
),
7817 (unsigned)bfd_getl32 (eihi
.minorid
));
7818 fprintf (file
, _(" image name : %.*s\n"),
7819 eihi
.imgnam
[0], eihi
.imgnam
+ 1);
7820 fprintf (file
, _(" link time : %s\n"),
7821 vms_time_to_str (eihi
.linktime
));
7822 fprintf (file
, _(" image ident : %.*s\n"),
7823 eihi
.imgid
[0], eihi
.imgid
+ 1);
7824 fprintf (file
, _(" linker ident : %.*s\n"),
7825 eihi
.linkid
[0], eihi
.linkid
+ 1);
7826 fprintf (file
, _(" image build ident: %.*s\n"),
7827 eihi
.imgbid
[0], eihi
.imgbid
+ 1);
7831 struct vms_eihs eihs
;
7833 if (bfd_seek (abfd
, (file_ptr
) eihs_off
, SEEK_SET
)
7834 || bfd_bread (&eihs
, sizeof (eihs
), abfd
) != sizeof (eihs
))
7836 fprintf (file
, _("cannot read EIHS\n"));
7839 /* xgettext:c-format */
7840 fprintf (file
, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
7841 (unsigned)bfd_getl32 (eihs
.majorid
),
7842 (unsigned)bfd_getl32 (eihs
.minorid
));
7843 dst_vbn
= bfd_getl32 (eihs
.dstvbn
);
7844 dst_size
= bfd_getl32 (eihs
.dstsize
);
7845 /* xgettext:c-format */
7846 fprintf (file
, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
7847 dst_vbn
, dst_size
, dst_size
);
7848 gst_vbn
= bfd_getl32 (eihs
.gstvbn
);
7849 gst_size
= bfd_getl32 (eihs
.gstsize
);
7850 /* xgettext:c-format */
7851 fprintf (file
, _(" global symbol table: vbn: %u, records: %u\n"),
7853 dmt_vbn
= bfd_getl32 (eihs
.dmtvbn
);
7854 dmt_size
= bfd_getl32 (eihs
.dmtsize
);
7855 /* xgettext:c-format */
7856 fprintf (file
, _(" debug module table : vbn: %u, size: %u\n"),
7859 while (eisd_off
!= 0)
7861 struct vms_eisd eisd
;
7866 if (bfd_seek (abfd
, (file_ptr
) eisd_off
, SEEK_SET
)
7867 || bfd_bread (&eisd
, sizeof (eisd
), abfd
) != sizeof (eisd
))
7869 fprintf (file
, _("cannot read EISD\n"));
7872 len
= (unsigned)bfd_getl32 (eisd
.eisdsize
);
7873 if (len
!= (unsigned)-1)
7877 eisd_off
= (eisd_off
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
7879 /* xgettext:c-format */
7880 fprintf (file
, _("Image section descriptor: (major: %u, minor: %u, "
7881 "size: %u, offset: %u)\n"),
7882 (unsigned)bfd_getl32 (eisd
.majorid
),
7883 (unsigned)bfd_getl32 (eisd
.minorid
),
7887 /* xgettext:c-format */
7888 fprintf (file
, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
7889 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 4),
7890 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 0),
7891 (unsigned)bfd_getl32 (eisd
.secsize
));
7892 val
= (unsigned)bfd_getl32 (eisd
.flags
);
7893 fprintf (file
, _(" flags: 0x%04x"), val
);
7894 if (val
& EISD__M_GBL
)
7895 fprintf (file
, " GBL");
7896 if (val
& EISD__M_CRF
)
7897 fprintf (file
, " CRF");
7898 if (val
& EISD__M_DZRO
)
7899 fprintf (file
, " DZRO");
7900 if (val
& EISD__M_WRT
)
7901 fprintf (file
, " WRT");
7902 if (val
& EISD__M_INITALCODE
)
7903 fprintf (file
, " INITALCODE");
7904 if (val
& EISD__M_BASED
)
7905 fprintf (file
, " BASED");
7906 if (val
& EISD__M_FIXUPVEC
)
7907 fprintf (file
, " FIXUPVEC");
7908 if (val
& EISD__M_RESIDENT
)
7909 fprintf (file
, " RESIDENT");
7910 if (val
& EISD__M_VECTOR
)
7911 fprintf (file
, " VECTOR");
7912 if (val
& EISD__M_PROTECT
)
7913 fprintf (file
, " PROTECT");
7914 if (val
& EISD__M_LASTCLU
)
7915 fprintf (file
, " LASTCLU");
7916 if (val
& EISD__M_EXE
)
7917 fprintf (file
, " EXE");
7918 if (val
& EISD__M_NONSHRADR
)
7919 fprintf (file
, " NONSHRADR");
7920 if (val
& EISD__M_QUAD_LENGTH
)
7921 fprintf (file
, " QUAD_LENGTH");
7922 if (val
& EISD__M_ALLOC_64BIT
)
7923 fprintf (file
, " ALLOC_64BIT");
7924 fprintf (file
, "\n");
7925 if (val
& EISD__M_FIXUPVEC
)
7927 eiaf_vbn
= bfd_getl32 (eisd
.vbn
);
7928 eiaf_size
= bfd_getl32 (eisd
.secsize
);
7930 /* xgettext:c-format */
7931 fprintf (file
, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
7932 (unsigned)bfd_getl32 (eisd
.vbn
),
7933 eisd
.pfc
, eisd
.matchctl
, eisd
.type
);
7936 case EISD__K_NORMAL
:
7937 fputs (_("NORMAL"), file
);
7939 case EISD__K_SHRFXD
:
7940 fputs (_("SHRFXD"), file
);
7942 case EISD__K_PRVFXD
:
7943 fputs (_("PRVFXD"), file
);
7945 case EISD__K_SHRPIC
:
7946 fputs (_("SHRPIC"), file
);
7948 case EISD__K_PRVPIC
:
7949 fputs (_("PRVPIC"), file
);
7951 case EISD__K_USRSTACK
:
7952 fputs (_("USRSTACK"), file
);
7955 fputs (_("*unknown*"), file
);
7958 fputs (_(")\n"), file
);
7959 if (val
& EISD__M_GBL
)
7960 /* xgettext:c-format */
7961 fprintf (file
, _(" ident: 0x%08x, name: %.*s\n"),
7962 (unsigned)bfd_getl32 (eisd
.ident
),
7963 eisd
.gblnam
[0], eisd
.gblnam
+ 1);
7969 if (bfd_seek (abfd
, (file_ptr
) (dmt_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
7971 fprintf (file
, _("cannot read DMT\n"));
7975 fprintf (file
, _("Debug module table:\n"));
7977 while (dmt_size
> 0)
7979 struct vms_dmt_header dmth
;
7982 if (bfd_bread (&dmth
, sizeof (dmth
), abfd
) != sizeof (dmth
))
7984 fprintf (file
, _("cannot read DMT header\n"));
7987 count
= bfd_getl16 (dmth
.psect_count
);
7989 /* xgettext:c-format */
7990 _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
7991 (unsigned)bfd_getl32 (dmth
.modbeg
),
7992 (unsigned)bfd_getl32 (dmth
.size
), count
);
7993 dmt_size
-= sizeof (dmth
);
7996 struct vms_dmt_psect dmtp
;
7998 if (bfd_bread (&dmtp
, sizeof (dmtp
), abfd
) != sizeof (dmtp
))
8000 fprintf (file
, _("cannot read DMT psect\n"));
8003 /* xgettext:c-format */
8004 fprintf (file
, _(" psect start: 0x%08x, length: %u\n"),
8005 (unsigned)bfd_getl32 (dmtp
.start
),
8006 (unsigned)bfd_getl32 (dmtp
.length
));
8008 dmt_size
-= sizeof (dmtp
);
8015 if (bfd_seek (abfd
, (file_ptr
) (dst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
8017 fprintf (file
, _("cannot read DST\n"));
8021 evax_bfd_print_dst (abfd
, dst_size
, file
);
8025 if (bfd_seek (abfd
, (file_ptr
) (gst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
8027 fprintf (file
, _("cannot read GST\n"));
8031 fprintf (file
, _("Global symbol table:\n"));
8032 evax_bfd_print_eobj (abfd
, file
);
8037 struct vms_eiaf
*eiaf
;
8038 unsigned int qrelfixoff
;
8039 unsigned int lrelfixoff
;
8040 unsigned int qdotadroff
;
8041 unsigned int ldotadroff
;
8042 unsigned int shrimgcnt
;
8043 unsigned int shlstoff
;
8044 unsigned int codeadroff
;
8045 unsigned int lpfixoff
;
8046 unsigned int chgprtoff
;
8048 buf
= bfd_malloc (eiaf_size
);
8050 if (bfd_seek (abfd
, (file_ptr
) (eiaf_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
)
8051 || bfd_bread (buf
, eiaf_size
, abfd
) != eiaf_size
)
8053 fprintf (file
, _("cannot read EIHA\n"));
8057 eiaf
= (struct vms_eiaf
*)buf
;
8059 /* xgettext:c-format */
8060 _("Image activator fixup: (major: %u, minor: %u)\n"),
8061 (unsigned)bfd_getl32 (eiaf
->majorid
),
8062 (unsigned)bfd_getl32 (eiaf
->minorid
));
8063 /* xgettext:c-format */
8064 fprintf (file
, _(" iaflink : 0x%08x %08x\n"),
8065 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 0),
8066 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 4));
8067 /* xgettext:c-format */
8068 fprintf (file
, _(" fixuplnk: 0x%08x %08x\n"),
8069 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 0),
8070 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 4));
8071 fprintf (file
, _(" size : %u\n"),
8072 (unsigned)bfd_getl32 (eiaf
->size
));
8073 fprintf (file
, _(" flags: 0x%08x\n"),
8074 (unsigned)bfd_getl32 (eiaf
->flags
));
8075 qrelfixoff
= bfd_getl32 (eiaf
->qrelfixoff
);
8076 lrelfixoff
= bfd_getl32 (eiaf
->lrelfixoff
);
8077 /* xgettext:c-format */
8078 fprintf (file
, _(" qrelfixoff: %5u, lrelfixoff: %5u\n"),
8079 qrelfixoff
, lrelfixoff
);
8080 qdotadroff
= bfd_getl32 (eiaf
->qdotadroff
);
8081 ldotadroff
= bfd_getl32 (eiaf
->ldotadroff
);
8082 /* xgettext:c-format */
8083 fprintf (file
, _(" qdotadroff: %5u, ldotadroff: %5u\n"),
8084 qdotadroff
, ldotadroff
);
8085 codeadroff
= bfd_getl32 (eiaf
->codeadroff
);
8086 lpfixoff
= bfd_getl32 (eiaf
->lpfixoff
);
8087 /* xgettext:c-format */
8088 fprintf (file
, _(" codeadroff: %5u, lpfixoff : %5u\n"),
8089 codeadroff
, lpfixoff
);
8090 chgprtoff
= bfd_getl32 (eiaf
->chgprtoff
);
8091 fprintf (file
, _(" chgprtoff : %5u\n"), chgprtoff
);
8092 shrimgcnt
= bfd_getl32 (eiaf
->shrimgcnt
);
8093 shlstoff
= bfd_getl32 (eiaf
->shlstoff
);
8094 /* xgettext:c-format */
8095 fprintf (file
, _(" shlstoff : %5u, shrimgcnt : %5u\n"),
8096 shlstoff
, shrimgcnt
);
8097 /* xgettext:c-format */
8098 fprintf (file
, _(" shlextra : %5u, permctx : %5u\n"),
8099 (unsigned)bfd_getl32 (eiaf
->shlextra
),
8100 (unsigned)bfd_getl32 (eiaf
->permctx
));
8101 fprintf (file
, _(" base_va : 0x%08x\n"),
8102 (unsigned)bfd_getl32 (eiaf
->base_va
));
8103 fprintf (file
, _(" lppsbfixoff: %5u\n"),
8104 (unsigned)bfd_getl32 (eiaf
->lppsbfixoff
));
8108 struct vms_shl
*shl
= (struct vms_shl
*)(buf
+ shlstoff
);
8111 fprintf (file
, _(" Shareable images:\n"));
8112 for (j
= 0; j
< shrimgcnt
; j
++, shl
++)
8115 /* xgettext:c-format */
8116 _(" %u: size: %u, flags: 0x%02x, name: %.*s\n"),
8117 j
, shl
->size
, shl
->flags
,
8118 shl
->imgnam
[0], shl
->imgnam
+ 1);
8121 if (qrelfixoff
!= 0)
8123 fprintf (file
, _(" quad-word relocation fixups:\n"));
8124 evax_bfd_print_relocation_records (file
, buf
+ qrelfixoff
, 8);
8126 if (lrelfixoff
!= 0)
8128 fprintf (file
, _(" long-word relocation fixups:\n"));
8129 evax_bfd_print_relocation_records (file
, buf
+ lrelfixoff
, 4);
8131 if (qdotadroff
!= 0)
8133 fprintf (file
, _(" quad-word .address reference fixups:\n"));
8134 evax_bfd_print_address_fixups (file
, buf
+ qdotadroff
);
8136 if (ldotadroff
!= 0)
8138 fprintf (file
, _(" long-word .address reference fixups:\n"));
8139 evax_bfd_print_address_fixups (file
, buf
+ ldotadroff
);
8141 if (codeadroff
!= 0)
8143 fprintf (file
, _(" Code Address Reference Fixups:\n"));
8144 evax_bfd_print_reference_fixups (file
, buf
+ codeadroff
);
8148 fprintf (file
, _(" Linkage Pairs Reference Fixups:\n"));
8149 evax_bfd_print_reference_fixups (file
, buf
+ lpfixoff
);
8153 unsigned int count
= (unsigned)bfd_getl32 (buf
+ chgprtoff
);
8154 struct vms_eicp
*eicp
= (struct vms_eicp
*)(buf
+ chgprtoff
+ 4);
8157 fprintf (file
, _(" Change Protection (%u entries):\n"), count
);
8158 for (j
= 0; j
< count
; j
++, eicp
++)
8160 unsigned int prot
= bfd_getl32 (eicp
->newprt
);
8162 /* xgettext:c-format */
8163 _(" base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
8164 (unsigned)bfd_getl32 (eicp
->baseva
+ 4),
8165 (unsigned)bfd_getl32 (eicp
->baseva
+ 0),
8166 (unsigned)bfd_getl32 (eicp
->size
),
8167 (unsigned)bfd_getl32 (eicp
->newprt
));
8171 fprintf (file
, "NA");
8173 case PRT__C_RESERVED
:
8174 fprintf (file
, "RES");
8177 fprintf (file
, "KW");
8180 fprintf (file
, "KR");
8183 fprintf (file
, "UW");
8186 fprintf (file
, "EW");
8189 fprintf (file
, "ERKW");
8192 fprintf (file
, "ER");
8195 fprintf (file
, "SW");
8198 fprintf (file
, "SREW");
8201 fprintf (file
, "SRKW");
8204 fprintf (file
, "SR");
8207 fprintf (file
, "URSW");
8210 fprintf (file
, "UREW");
8213 fprintf (file
, "URKW");
8216 fprintf (file
, "UR");
8230 vms_bfd_print_private_bfd_data (bfd
*abfd
, void *ptr
)
8232 FILE *file
= (FILE *)ptr
;
8234 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
8235 evax_bfd_print_image (abfd
, file
);
8238 if (bfd_seek (abfd
, 0, SEEK_SET
))
8240 evax_bfd_print_eobj (abfd
, file
);
8247 /* Slurp ETIR/EDBG/ETBT VMS object records. */
8250 alpha_vms_read_sections_content (bfd
*abfd
, struct bfd_link_info
*info
)
8252 asection
*cur_section
;
8253 file_ptr cur_offset
;
8254 asection
*dst_section
;
8255 file_ptr dst_offset
;
8257 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
8263 dst_section
= PRIV (dst_section
);
8267 if (info
->strip
== strip_all
|| info
->strip
== strip_debugger
)
8269 /* Discard the DST section. */
8273 else if (dst_section
)
8275 dst_offset
= dst_section
->output_offset
;
8276 dst_section
= dst_section
->output_section
;
8285 type
= _bfd_vms_get_object_record (abfd
);
8288 vms_debug2 ((2, "next_record failed\n"));
8294 PRIV (image_section
) = cur_section
;
8295 PRIV (image_offset
) = cur_offset
;
8296 res
= _bfd_vms_slurp_etir (abfd
, info
);
8297 cur_section
= PRIV (image_section
);
8298 cur_offset
= PRIV (image_offset
);
8302 if (dst_section
== NULL
)
8304 PRIV (image_section
) = dst_section
;
8305 PRIV (image_offset
) = dst_offset
;
8306 res
= _bfd_vms_slurp_etir (abfd
, info
);
8307 dst_offset
= PRIV (image_offset
);
8316 vms_debug2 ((2, "slurp eobj type %d failed\n", type
));
8323 alpha_vms_sizeof_headers (bfd
*abfd ATTRIBUTE_UNUSED
,
8324 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8329 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
8332 alpha_vms_add_fixup_lp (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
8334 struct alpha_vms_shlib_el
*sl
;
8335 asection
*sect
= PRIV2 (src
, image_section
);
8336 file_ptr offset
= PRIV2 (src
, image_offset
);
8338 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8339 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8340 sl
->has_fixups
= TRUE
;
8341 VEC_APPEND_EL (sl
->lp
, bfd_vma
,
8342 sect
->output_section
->vma
+ sect
->output_offset
+ offset
);
8343 sect
->output_section
->flags
|= SEC_RELOC
;
8346 /* Add a code address fixup at address SECT + OFFSET to SHLIB. */
8349 alpha_vms_add_fixup_ca (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
8351 struct alpha_vms_shlib_el
*sl
;
8352 asection
*sect
= PRIV2 (src
, image_section
);
8353 file_ptr offset
= PRIV2 (src
, image_offset
);
8355 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8356 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8357 sl
->has_fixups
= TRUE
;
8358 VEC_APPEND_EL (sl
->ca
, bfd_vma
,
8359 sect
->output_section
->vma
+ sect
->output_offset
+ offset
);
8360 sect
->output_section
->flags
|= SEC_RELOC
;
8363 /* Add a quad word relocation fixup at address SECT + OFFSET to SHLIB. */
8366 alpha_vms_add_fixup_qr (struct bfd_link_info
*info
, bfd
*src
,
8367 bfd
*shlib
, bfd_vma vec
)
8369 struct alpha_vms_shlib_el
*sl
;
8370 struct alpha_vms_vma_ref
*r
;
8371 asection
*sect
= PRIV2 (src
, image_section
);
8372 file_ptr offset
= PRIV2 (src
, image_offset
);
8374 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8375 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8376 sl
->has_fixups
= TRUE
;
8377 r
= VEC_APPEND (sl
->qr
, struct alpha_vms_vma_ref
);
8378 r
->vma
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
8380 sect
->output_section
->flags
|= SEC_RELOC
;
8384 alpha_vms_add_fixup_lr (struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
8385 unsigned int shr ATTRIBUTE_UNUSED
,
8386 bfd_vma vec ATTRIBUTE_UNUSED
)
8388 /* Not yet supported. */
8392 /* Add relocation. FIXME: Not yet emitted. */
8395 alpha_vms_add_lw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8400 alpha_vms_add_qw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8404 static struct bfd_hash_entry
*
8405 alpha_vms_link_hash_newfunc (struct bfd_hash_entry
*entry
,
8406 struct bfd_hash_table
*table
,
8409 struct alpha_vms_link_hash_entry
*ret
=
8410 (struct alpha_vms_link_hash_entry
*) entry
;
8412 /* Allocate the structure if it has not already been allocated by a
8415 ret
= ((struct alpha_vms_link_hash_entry
*)
8416 bfd_hash_allocate (table
,
8417 sizeof (struct alpha_vms_link_hash_entry
)));
8421 /* Call the allocation method of the superclass. */
8422 ret
= ((struct alpha_vms_link_hash_entry
*)
8423 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
8428 return (struct bfd_hash_entry
*) ret
;
8432 alpha_vms_bfd_link_hash_table_free (bfd
*abfd
)
8434 struct alpha_vms_link_hash_table
*t
;
8437 t
= (struct alpha_vms_link_hash_table
*) abfd
->link
.hash
;
8438 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8440 struct alpha_vms_shlib_el
*shlib
;
8442 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8443 free (&VEC_EL (shlib
->ca
, bfd_vma
, 0));
8444 free (&VEC_EL (shlib
->lp
, bfd_vma
, 0));
8445 free (&VEC_EL (shlib
->qr
, struct alpha_vms_vma_ref
, 0));
8447 free (&VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, 0));
8449 _bfd_generic_link_hash_table_free (abfd
);
8452 /* Create an Alpha/VMS link hash table. */
8454 static struct bfd_link_hash_table
*
8455 alpha_vms_bfd_link_hash_table_create (bfd
*abfd
)
8457 struct alpha_vms_link_hash_table
*ret
;
8458 bfd_size_type amt
= sizeof (struct alpha_vms_link_hash_table
);
8460 ret
= (struct alpha_vms_link_hash_table
*) bfd_malloc (amt
);
8463 if (!_bfd_link_hash_table_init (&ret
->root
, abfd
,
8464 alpha_vms_link_hash_newfunc
,
8465 sizeof (struct alpha_vms_link_hash_entry
)))
8471 VEC_INIT (ret
->shrlibs
);
8473 ret
->root
.hash_table_free
= alpha_vms_bfd_link_hash_table_free
;
8479 alpha_vms_link_add_object_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8483 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
8485 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
8486 struct alpha_vms_link_hash_entry
*h
;
8487 struct bfd_link_hash_entry
*h_root
;
8490 if (!alpha_vms_convert_symbol (abfd
, e
, &sym
))
8493 if ((e
->flags
& EGSY__V_DEF
) && abfd
->selective_search
)
8495 /* In selective_search mode, only add definition that are
8497 h
= (struct alpha_vms_link_hash_entry
*)bfd_link_hash_lookup
8498 (info
->hash
, sym
.name
, FALSE
, FALSE
, FALSE
);
8499 if (h
== NULL
|| h
->root
.type
!= bfd_link_hash_undefined
)
8505 h_root
= (struct bfd_link_hash_entry
*) h
;
8506 if (!_bfd_generic_link_add_one_symbol (info
, abfd
, sym
.name
, sym
.flags
,
8507 sym
.section
, sym
.value
, NULL
,
8508 FALSE
, FALSE
, &h_root
))
8510 h
= (struct alpha_vms_link_hash_entry
*) h_root
;
8512 if ((e
->flags
& EGSY__V_DEF
)
8514 && abfd
->xvec
== info
->output_bfd
->xvec
)
8518 if (abfd
->flags
& DYNAMIC
)
8520 struct alpha_vms_shlib_el
*shlib
;
8522 /* We do not want to include any of the sections in a dynamic
8523 object in the output file. See comment in elflink.c. */
8524 bfd_section_list_clear (abfd
);
8526 shlib
= VEC_APPEND (alpha_vms_link_hash (info
)->shrlibs
,
8527 struct alpha_vms_shlib_el
);
8529 VEC_INIT (shlib
->ca
);
8530 VEC_INIT (shlib
->lp
);
8531 VEC_INIT (shlib
->qr
);
8532 PRIV (shr_index
) = VEC_COUNT (alpha_vms_link_hash (info
)->shrlibs
) - 1;
8539 alpha_vms_link_add_archive_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8542 struct bfd_link_hash_entry
**pundef
;
8543 struct bfd_link_hash_entry
**next_pundef
;
8545 /* We only accept VMS libraries. */
8546 if (info
->output_bfd
->xvec
!= abfd
->xvec
)
8548 bfd_set_error (bfd_error_wrong_format
);
8552 /* The archive_pass field in the archive itself is used to
8553 initialize PASS, since we may search the same archive multiple
8555 pass
= ++abfd
->archive_pass
;
8557 /* Look through the list of undefined symbols. */
8558 for (pundef
= &info
->hash
->undefs
; *pundef
!= NULL
; pundef
= next_pundef
)
8560 struct bfd_link_hash_entry
*h
;
8566 next_pundef
= &(*pundef
)->u
.undef
.next
;
8568 /* When a symbol is defined, it is not necessarily removed from
8570 if (h
->type
!= bfd_link_hash_undefined
8571 && h
->type
!= bfd_link_hash_common
)
8573 /* Remove this entry from the list, for general cleanliness
8574 and because we are going to look through the list again
8575 if we search any more libraries. We can't remove the
8576 entry if it is the tail, because that would lose any
8577 entries we add to the list later on. */
8578 if (*pundef
!= info
->hash
->undefs_tail
)
8580 *pundef
= *next_pundef
;
8581 next_pundef
= pundef
;
8586 /* Look for this symbol in the archive hash table. */
8587 symidx
= _bfd_vms_lib_find_symbol (abfd
, h
->root
.string
);
8588 if (symidx
== BFD_NO_MORE_SYMBOLS
)
8590 /* Nothing in this slot. */
8594 element
= bfd_get_elt_at_index (abfd
, symidx
);
8595 if (element
== NULL
)
8598 if (element
->archive_pass
== -1 || element
->archive_pass
== pass
)
8600 /* Next symbol if this archive is wrong or already handled. */
8604 if (! bfd_check_format (element
, bfd_object
))
8606 element
->archive_pass
= -1;
8610 orig_element
= element
;
8611 if (bfd_is_thin_archive (abfd
))
8613 element
= _bfd_vms_lib_get_imagelib_file (element
);
8614 if (element
== NULL
|| !bfd_check_format (element
, bfd_object
))
8616 orig_element
->archive_pass
= -1;
8621 /* Unlike the generic linker, we know that this element provides
8622 a definition for an undefined symbol and we know that we want
8623 to include it. We don't need to check anything. */
8624 if (!(*info
->callbacks
8625 ->add_archive_element
) (info
, element
, h
->root
.string
, &element
))
8627 if (!alpha_vms_link_add_object_symbols (element
, info
))
8630 orig_element
->archive_pass
= pass
;
8637 alpha_vms_bfd_link_add_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8639 switch (bfd_get_format (abfd
))
8642 vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
8644 return alpha_vms_link_add_object_symbols (abfd
, info
);
8647 vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
8649 return alpha_vms_link_add_archive_symbols (abfd
, info
);
8652 bfd_set_error (bfd_error_wrong_format
);
8658 alpha_vms_build_fixups (struct bfd_link_info
*info
)
8660 struct alpha_vms_link_hash_table
*t
= alpha_vms_link_hash (info
);
8661 unsigned char *content
;
8663 unsigned int sz
= 0;
8664 unsigned int lp_sz
= 0;
8665 unsigned int ca_sz
= 0;
8666 unsigned int qr_sz
= 0;
8667 unsigned int shrimg_cnt
= 0;
8668 unsigned int chgprt_num
= 0;
8669 unsigned int chgprt_sz
= 0;
8670 struct vms_eiaf
*eiaf
;
8674 /* Shared libraries. */
8675 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8677 struct alpha_vms_shlib_el
*shlib
;
8679 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8681 if (!shlib
->has_fixups
)
8686 if (VEC_COUNT (shlib
->ca
) > 0)
8688 /* Header + entries. */
8690 ca_sz
+= VEC_COUNT (shlib
->ca
) * 4;
8692 if (VEC_COUNT (shlib
->lp
) > 0)
8694 /* Header + entries. */
8696 lp_sz
+= VEC_COUNT (shlib
->lp
) * 4;
8698 if (VEC_COUNT (shlib
->qr
) > 0)
8700 /* Header + entries. */
8702 qr_sz
+= VEC_COUNT (shlib
->qr
) * 8;
8713 /* Finish now if there is no content. */
8714 if (ca_sz
+ lp_sz
+ qr_sz
== 0)
8717 /* Add an eicp entry for the fixup itself. */
8719 for (sec
= info
->output_bfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
8721 /* This isect could be made RO or EXE after relocations are applied. */
8722 if ((sec
->flags
& SEC_RELOC
) != 0
8723 && (sec
->flags
& (SEC_CODE
| SEC_READONLY
)) != 0)
8726 chgprt_sz
= 4 + chgprt_num
* sizeof (struct vms_eicp
);
8728 /* Allocate section content (round-up size) */
8729 sz
= sizeof (struct vms_eiaf
) + shrimg_cnt
* sizeof (struct vms_shl
)
8730 + ca_sz
+ lp_sz
+ qr_sz
+ chgprt_sz
;
8731 sz
= (sz
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
8732 content
= bfd_zalloc (info
->output_bfd
, sz
);
8733 if (content
== NULL
)
8736 sec
= alpha_vms_link_hash (info
)->fixup
;
8737 sec
->contents
= content
;
8740 eiaf
= (struct vms_eiaf
*)content
;
8741 off
= sizeof (struct vms_eiaf
);
8742 bfd_putl32 (0, eiaf
->majorid
);
8743 bfd_putl32 (0, eiaf
->minorid
);
8744 bfd_putl32 (0, eiaf
->iaflink
);
8745 bfd_putl32 (0, eiaf
->fixuplnk
);
8746 bfd_putl32 (sizeof (struct vms_eiaf
), eiaf
->size
);
8747 bfd_putl32 (0, eiaf
->flags
);
8748 bfd_putl32 (0, eiaf
->qrelfixoff
);
8749 bfd_putl32 (0, eiaf
->lrelfixoff
);
8750 bfd_putl32 (0, eiaf
->qdotadroff
);
8751 bfd_putl32 (0, eiaf
->ldotadroff
);
8752 bfd_putl32 (0, eiaf
->codeadroff
);
8753 bfd_putl32 (0, eiaf
->lpfixoff
);
8754 bfd_putl32 (0, eiaf
->chgprtoff
);
8755 bfd_putl32 (shrimg_cnt
? off
: 0, eiaf
->shlstoff
);
8756 bfd_putl32 (shrimg_cnt
, eiaf
->shrimgcnt
);
8757 bfd_putl32 (0, eiaf
->shlextra
);
8758 bfd_putl32 (0, eiaf
->permctx
);
8759 bfd_putl32 (0, eiaf
->base_va
);
8760 bfd_putl32 (0, eiaf
->lppsbfixoff
);
8767 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8769 struct alpha_vms_shlib_el
*shlib
;
8770 struct vms_shl
*shl
;
8772 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8774 if (!shlib
->has_fixups
)
8777 /* Renumber shared images. */
8778 PRIV2 (shlib
->abfd
, shr_index
) = shrimg_cnt
++;
8780 shl
= (struct vms_shl
*)(content
+ off
);
8781 bfd_putl32 (0, shl
->baseva
);
8782 bfd_putl32 (0, shl
->shlptr
);
8783 bfd_putl32 (0, shl
->ident
);
8784 bfd_putl32 (0, shl
->permctx
);
8785 shl
->size
= sizeof (struct vms_shl
);
8786 bfd_putl16 (0, shl
->fill_1
);
8788 bfd_putl32 (0, shl
->icb
);
8789 shl
->imgnam
[0] = strlen (PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
));
8790 memcpy (shl
->imgnam
+ 1, PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
),
8793 off
+= sizeof (struct vms_shl
);
8799 bfd_putl32 (off
, eiaf
->codeadroff
);
8801 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8803 struct alpha_vms_shlib_el
*shlib
;
8806 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8808 if (VEC_COUNT (shlib
->ca
) == 0)
8811 bfd_putl32 (VEC_COUNT (shlib
->ca
), content
+ off
);
8812 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8815 for (j
= 0; j
< VEC_COUNT (shlib
->ca
); j
++)
8817 bfd_putl32 (VEC_EL (shlib
->ca
, bfd_vma
, j
) - t
->base_addr
,
8823 bfd_putl32 (0, content
+ off
);
8824 bfd_putl32 (0, content
+ off
+ 4);
8831 bfd_putl32 (off
, eiaf
->lpfixoff
);
8833 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8835 struct alpha_vms_shlib_el
*shlib
;
8838 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8840 if (VEC_COUNT (shlib
->lp
) == 0)
8843 bfd_putl32 (VEC_COUNT (shlib
->lp
), content
+ off
);
8844 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8847 for (j
= 0; j
< VEC_COUNT (shlib
->lp
); j
++)
8849 bfd_putl32 (VEC_EL (shlib
->lp
, bfd_vma
, j
) - t
->base_addr
,
8855 bfd_putl32 (0, content
+ off
);
8856 bfd_putl32 (0, content
+ off
+ 4);
8863 bfd_putl32 (off
, eiaf
->qdotadroff
);
8865 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8867 struct alpha_vms_shlib_el
*shlib
;
8870 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8872 if (VEC_COUNT (shlib
->qr
) == 0)
8875 bfd_putl32 (VEC_COUNT (shlib
->qr
), content
+ off
);
8876 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8879 for (j
= 0; j
< VEC_COUNT (shlib
->qr
); j
++)
8881 struct alpha_vms_vma_ref
*r
;
8882 r
= &VEC_EL (shlib
->qr
, struct alpha_vms_vma_ref
, j
);
8883 bfd_putl32 (r
->vma
- t
->base_addr
, content
+ off
);
8884 bfd_putl32 (r
->ref
, content
+ off
+ 4);
8889 bfd_putl32 (0, content
+ off
);
8890 bfd_putl32 (0, content
+ off
+ 4);
8895 /* Write the change protection table. */
8896 bfd_putl32 (off
, eiaf
->chgprtoff
);
8897 bfd_putl32 (chgprt_num
, content
+ off
);
8900 for (sec
= info
->output_bfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
8902 struct vms_eicp
*eicp
;
8905 if ((sec
->flags
& SEC_LINKER_CREATED
) != 0 &&
8906 strcmp (sec
->name
, "$FIXUP$") == 0)
8908 else if ((sec
->flags
& SEC_RELOC
) != 0
8909 && (sec
->flags
& (SEC_CODE
| SEC_READONLY
)) != 0)
8914 eicp
= (struct vms_eicp
*)(content
+ off
);
8915 bfd_putl64 (sec
->vma
- t
->base_addr
, eicp
->baseva
);
8916 bfd_putl32 ((sec
->size
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1),
8918 bfd_putl32 (prot
, eicp
->newprt
);
8919 off
+= sizeof (struct vms_eicp
);
8925 /* Called by bfd_hash_traverse to fill the symbol table.
8926 Return FALSE in case of failure. */
8929 alpha_vms_link_output_symbol (struct bfd_hash_entry
*bh
, void *infov
)
8931 struct bfd_link_hash_entry
*hc
= (struct bfd_link_hash_entry
*) bh
;
8932 struct bfd_link_info
*info
= (struct bfd_link_info
*)infov
;
8933 struct alpha_vms_link_hash_entry
*h
;
8934 struct vms_symbol_entry
*sym
;
8936 if (hc
->type
== bfd_link_hash_warning
)
8939 if (hc
->type
== bfd_link_hash_new
)
8942 h
= (struct alpha_vms_link_hash_entry
*) hc
;
8944 switch (h
->root
.type
)
8946 case bfd_link_hash_undefined
:
8948 case bfd_link_hash_new
:
8949 case bfd_link_hash_warning
:
8951 case bfd_link_hash_undefweak
:
8953 case bfd_link_hash_defined
:
8954 case bfd_link_hash_defweak
:
8956 asection
*sec
= h
->root
.u
.def
.section
;
8958 /* FIXME: this is certainly a symbol from a dynamic library. */
8959 if (bfd_is_abs_section (sec
))
8962 if (sec
->owner
->flags
& DYNAMIC
)
8966 case bfd_link_hash_common
:
8968 case bfd_link_hash_indirect
:
8972 /* Do not write not kept symbols. */
8973 if (info
->strip
== strip_some
8974 && bfd_hash_lookup (info
->keep_hash
, h
->root
.root
.string
,
8975 FALSE
, FALSE
) != NULL
)
8980 /* This symbol doesn't come from a VMS object. So we suppose it is
8982 int len
= strlen (h
->root
.root
.string
);
8984 sym
= (struct vms_symbol_entry
*)bfd_zalloc (info
->output_bfd
,
8985 sizeof (*sym
) + len
);
8989 memcpy (sym
->name
, h
->root
.root
.string
, len
);
8991 sym
->owner
= info
->output_bfd
;
8993 sym
->typ
= EGSD__C_SYMG
;
8995 sym
->flags
= EGSY__V_DEF
| EGSY__V_REL
;
8996 sym
->symbol_vector
= h
->root
.u
.def
.value
;
8997 sym
->section
= h
->root
.u
.def
.section
;
8998 sym
->value
= h
->root
.u
.def
.value
;
9003 if (!add_symbol_entry (info
->output_bfd
, sym
))
9010 alpha_vms_bfd_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
9013 struct bfd_link_order
*p
;
9021 if (bfd_link_relocatable (info
))
9023 /* FIXME: we do not yet support relocatable link. It is not obvious
9024 how to do it for debug infos. */
9025 (*info
->callbacks
->einfo
)(_("%P: relocatable link is not supported\n"));
9029 abfd
->outsymbols
= NULL
;
9032 /* Mark all sections which will be included in the output file. */
9033 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9034 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9035 if (p
->type
== bfd_indirect_link_order
)
9036 p
->u
.indirect
.section
->linker_mark
= TRUE
;
9039 /* Handle all the link order information for the sections. */
9040 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9042 printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
9043 o
->name
, (unsigned)o
->vma
, (unsigned)o
->flags
);
9045 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9047 printf (" at 0x%08x - 0x%08x: ",
9048 (unsigned)p
->offset
, (unsigned)(p
->offset
+ p
->size
- 1));
9051 case bfd_section_reloc_link_order
:
9052 case bfd_symbol_reloc_link_order
:
9053 printf (" section/symbol reloc\n");
9055 case bfd_indirect_link_order
:
9056 printf (" section %s of %s\n",
9057 p
->u
.indirect
.section
->name
,
9058 p
->u
.indirect
.section
->owner
->filename
);
9060 case bfd_data_link_order
:
9061 printf (" explicit data\n");
9064 printf (" *unknown* type %u\n", p
->type
);
9071 /* Generate the symbol table. */
9072 BFD_ASSERT (PRIV (syms
) == NULL
);
9073 if (info
->strip
!= strip_all
)
9074 bfd_hash_traverse (&info
->hash
->table
, alpha_vms_link_output_symbol
, info
);
9076 /* Find the entry point. */
9077 if (bfd_get_start_address (abfd
) == 0)
9079 bfd
*startbfd
= NULL
;
9081 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9083 /* Consider only VMS object files. */
9084 if (sub
->xvec
!= abfd
->xvec
)
9087 if (!PRIV2 (sub
, eom_data
).eom_has_transfer
)
9089 if ((PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
) && startbfd
)
9091 if (startbfd
!= NULL
9092 && !(PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
))
9094 (*info
->callbacks
->einfo
)
9095 /* xgettext:c-format */
9096 (_("%P: multiple entry points: in modules %pB and %pB\n"),
9105 unsigned int ps_idx
= PRIV2 (startbfd
, eom_data
).eom_l_psindx
;
9106 bfd_vma tfradr
= PRIV2 (startbfd
, eom_data
).eom_l_tfradr
;
9109 sec
= PRIV2 (startbfd
, sections
)[ps_idx
];
9111 bfd_set_start_address
9112 (abfd
, sec
->output_section
->vma
+ sec
->output_offset
+ tfradr
);
9116 /* Set transfer addresses. */
9119 struct bfd_link_hash_entry
*h
;
9122 PRIV (transfer_address
[i
++]) = 0xffffffff00000340ULL
; /* SYS$IMGACT */
9123 h
= bfd_link_hash_lookup (info
->hash
, "LIB$INITIALIZE", FALSE
, FALSE
, TRUE
);
9124 if (h
!= NULL
&& h
->type
== bfd_link_hash_defined
)
9125 PRIV (transfer_address
[i
++]) =
9126 alpha_vms_get_sym_value (h
->u
.def
.section
, h
->u
.def
.value
);
9127 PRIV (transfer_address
[i
++]) = bfd_get_start_address (abfd
);
9129 PRIV (transfer_address
[i
++]) = 0;
9132 /* Allocate contents.
9133 Also compute the virtual base address. */
9134 base_addr
= (bfd_vma
)-1;
9136 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9138 if (o
->flags
& SEC_HAS_CONTENTS
)
9140 o
->contents
= bfd_alloc (abfd
, o
->size
);
9141 if (o
->contents
== NULL
)
9144 if (o
->flags
& SEC_LOAD
)
9146 if (o
->vma
< base_addr
)
9148 if (o
->vma
+ o
->size
> last_addr
)
9149 last_addr
= o
->vma
+ o
->size
;
9151 /* Clear the RELOC flags. Currently we don't support incremental
9152 linking. We use the RELOC flag for computing the eicp entries. */
9153 o
->flags
&= ~SEC_RELOC
;
9156 /* Create the fixup section. */
9157 fixupsec
= bfd_make_section_anyway_with_flags
9158 (info
->output_bfd
, "$FIXUP$",
9159 SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
9160 if (fixupsec
== NULL
)
9162 last_addr
= (last_addr
+ 0xffff) & ~0xffff;
9163 fixupsec
->vma
= last_addr
;
9165 alpha_vms_link_hash (info
)->fixup
= fixupsec
;
9166 alpha_vms_link_hash (info
)->base_addr
= base_addr
;
9168 /* Create the DMT section, if necessary. */
9169 BFD_ASSERT (PRIV (dst_section
) == NULL
);
9170 dst
= bfd_get_section_by_name (abfd
, "$DST$");
9171 if (dst
!= NULL
&& dst
->size
== 0)
9175 PRIV (dst_section
) = dst
;
9176 dmt
= bfd_make_section_anyway_with_flags
9177 (info
->output_bfd
, "$DMT$",
9178 SEC_DEBUGGING
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
9185 /* Read all sections from the inputs. */
9186 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9188 if (sub
->flags
& DYNAMIC
)
9190 alpha_vms_create_eisd_for_shared (abfd
, sub
);
9194 if (!alpha_vms_read_sections_content (sub
, info
))
9198 /* Handle all the link order information for the sections.
9199 Note: past this point, it is not possible to create new sections. */
9200 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9202 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9206 case bfd_section_reloc_link_order
:
9207 case bfd_symbol_reloc_link_order
:
9210 case bfd_indirect_link_order
:
9214 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
9221 /* Compute fixups. */
9222 if (!alpha_vms_build_fixups (info
))
9225 /* Compute the DMT. */
9229 unsigned char *contents
= NULL
;
9231 /* In pass 1, compute the size. In pass 2, write the DMT contents. */
9232 for (pass
= 0; pass
< 2; pass
++)
9234 unsigned int off
= 0;
9236 /* For each object file (ie for each module). */
9237 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9240 struct vms_dmt_header
*dmth
= NULL
;
9241 unsigned int psect_count
;
9243 /* Skip this module if it has no DST. */
9244 sub_dst
= PRIV2 (sub
, dst_section
);
9245 if (sub_dst
== NULL
|| sub_dst
->size
== 0)
9250 /* Write the header. */
9251 dmth
= (struct vms_dmt_header
*)(contents
+ off
);
9252 bfd_putl32 (sub_dst
->output_offset
, dmth
->modbeg
);
9253 bfd_putl32 (sub_dst
->size
, dmth
->size
);
9256 off
+= sizeof (struct vms_dmt_header
);
9259 /* For each section (ie for each psect). */
9260 for (o
= sub
->sections
; o
!= NULL
; o
= o
->next
)
9262 /* Only consider interesting sections. */
9263 if (!(o
->flags
& SEC_ALLOC
))
9265 if (o
->flags
& SEC_LINKER_CREATED
)
9270 /* Write an entry. */
9271 struct vms_dmt_psect
*dmtp
;
9273 dmtp
= (struct vms_dmt_psect
*)(contents
+ off
);
9274 bfd_putl32 (o
->output_offset
+ o
->output_section
->vma
,
9276 bfd_putl32 (o
->size
, dmtp
->length
);
9279 off
+= sizeof (struct vms_dmt_psect
);
9282 bfd_putl32 (psect_count
, dmth
->psect_count
);
9287 contents
= bfd_zalloc (info
->output_bfd
, off
);
9288 if (contents
== NULL
)
9290 dmt
->contents
= contents
;
9295 BFD_ASSERT (off
== dmt
->size
);
9303 /* Read the contents of a section.
9304 buf points to a buffer of buf_size bytes to be filled with
9305 section data (starting at offset into section) */
9308 alpha_vms_get_section_contents (bfd
*abfd
, asection
*section
,
9309 void *buf
, file_ptr offset
,
9310 bfd_size_type count
)
9314 /* Image are easy. */
9315 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
9316 return _bfd_generic_get_section_contents (abfd
, section
,
9317 buf
, offset
, count
);
9320 if (offset
+ count
< count
9321 || offset
+ count
> section
->size
)
9323 bfd_set_error (bfd_error_invalid_operation
);
9327 /* If the section is already in memory, just copy it. */
9328 if (section
->flags
& SEC_IN_MEMORY
)
9330 BFD_ASSERT (section
->contents
!= NULL
);
9331 memcpy (buf
, section
->contents
+ offset
, count
);
9334 if (section
->size
== 0)
9337 /* Alloc in memory and read ETIRs. */
9338 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
9340 BFD_ASSERT (sec
->contents
== NULL
);
9342 if (sec
->size
!= 0 && (sec
->flags
& SEC_HAS_CONTENTS
))
9344 sec
->contents
= bfd_alloc (abfd
, sec
->size
);
9345 if (sec
->contents
== NULL
)
9349 if (!alpha_vms_read_sections_content (abfd
, NULL
))
9351 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
9353 sec
->flags
|= SEC_IN_MEMORY
;
9354 memcpy (buf
, section
->contents
+ offset
, count
);
9359 /* Set the format of a file being written. */
9362 alpha_vms_mkobject (bfd
* abfd
)
9364 const bfd_arch_info_type
*arch
;
9366 vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd
));
9368 if (!vms_initialize (abfd
))
9371 PRIV (recwr
.buf
) = bfd_alloc (abfd
, MAX_OUTREC_SIZE
);
9372 if (PRIV (recwr
.buf
) == NULL
)
9375 arch
= bfd_scan_arch ("alpha");
9379 bfd_set_error (bfd_error_wrong_format
);
9383 abfd
->arch_info
= arch
;
9390 /* Called when the BFD is being closed to do any necessary cleanup. */
9393 vms_close_and_cleanup (bfd
* abfd
)
9395 vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd
));
9397 if (abfd
== NULL
|| abfd
->tdata
.any
== NULL
)
9400 if (abfd
->format
== bfd_object
)
9402 alpha_vms_free_private (abfd
);
9405 if (abfd
->direction
== write_direction
)
9407 /* Last step on VMS is to convert the file to variable record length
9409 if (!bfd_cache_close (abfd
))
9411 if (!_bfd_vms_convert_to_var_unix_filename (abfd
->filename
))
9417 return _bfd_generic_close_and_cleanup (abfd
);
9420 /* Called when a new section is created. */
9423 vms_new_section_hook (bfd
* abfd
, asection
*section
)
9427 vms_debug2 ((1, "vms_new_section_hook (%p, [%u]%s)\n",
9428 abfd
, section
->index
, section
->name
));
9430 if (!bfd_set_section_alignment (section
, 0))
9433 vms_debug2 ((7, "%u: %s\n", section
->index
, section
->name
));
9435 amt
= sizeof (struct vms_section_data_struct
);
9436 section
->used_by_bfd
= bfd_zalloc (abfd
, amt
);
9437 if (section
->used_by_bfd
== NULL
)
9440 /* Create the section symbol. */
9441 return _bfd_generic_new_section_hook (abfd
, section
);
9444 /* Part 4.5, symbols. */
9446 /* Print symbol to file according to how. how is one of
9447 bfd_print_symbol_name just print the name
9448 bfd_print_symbol_more print more (???)
9449 bfd_print_symbol_all print all we know, which is not much right now :-). */
9452 vms_print_symbol (bfd
* abfd
,
9455 bfd_print_symbol_type how
)
9457 vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
9458 abfd
, file
, symbol
, how
));
9462 case bfd_print_symbol_name
:
9463 case bfd_print_symbol_more
:
9464 fprintf ((FILE *)file
," %s", symbol
->name
);
9467 case bfd_print_symbol_all
:
9469 const char *section_name
= symbol
->section
->name
;
9471 bfd_print_symbol_vandf (abfd
, file
, symbol
);
9473 fprintf ((FILE *) file
," %-8s %s", section_name
, symbol
->name
);
9479 /* Return information about symbol in ret.
9481 fill type, value and name
9484 B bss segment symbol
9486 D data segment symbol
9488 t a static function symbol
9489 T text segment symbol
9494 vms_get_symbol_info (bfd
* abfd ATTRIBUTE_UNUSED
,
9500 vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd
, symbol
, ret
));
9502 sec
= symbol
->section
;
9509 else if (bfd_is_com_section (sec
))
9511 else if (bfd_is_abs_section (sec
))
9513 else if (bfd_is_und_section (sec
))
9515 else if (bfd_is_ind_section (sec
))
9517 else if ((symbol
->flags
& BSF_FUNCTION
)
9518 || (bfd_section_flags (sec
) & SEC_CODE
))
9520 else if (bfd_section_flags (sec
) & SEC_DATA
)
9522 else if (bfd_section_flags (sec
) & SEC_ALLOC
)
9527 if (ret
->type
!= 'U')
9528 ret
->value
= symbol
->value
+ symbol
->section
->vma
;
9531 ret
->name
= symbol
->name
;
9534 /* Return TRUE if the given symbol sym in the BFD abfd is
9535 a compiler generated local label, else return FALSE. */
9538 vms_bfd_is_local_label_name (bfd
* abfd ATTRIBUTE_UNUSED
,
9541 return name
[0] == '$';
9544 /* Part 4.7, writing an object file. */
9546 /* Sets the contents of the section section in BFD abfd to the data starting
9547 in memory at LOCATION. The data is written to the output section starting
9548 at offset offset for count bytes.
9550 Normally TRUE is returned, else FALSE. Possible error returns are:
9551 o bfd_error_no_contents - The output section does not have the
9552 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
9553 o and some more too */
9556 _bfd_vms_set_section_contents (bfd
* abfd
,
9558 const void * location
,
9560 bfd_size_type count
)
9562 if (section
->contents
== NULL
)
9564 section
->contents
= bfd_alloc (abfd
, section
->size
);
9565 if (section
->contents
== NULL
)
9568 memcpy (section
->contents
+ offset
, location
, (size_t) count
);
9574 /* Set the architecture and machine type in BFD abfd to arch and mach.
9575 Find the correct pointer to a structure and insert it into the arch_info
9579 alpha_vms_set_arch_mach (bfd
*abfd
,
9580 enum bfd_architecture arch
, unsigned long mach
)
9582 if (arch
!= bfd_arch_alpha
9583 && arch
!= bfd_arch_unknown
)
9586 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
9589 /* Set section VMS flags. Clear NO_FLAGS and set FLAGS. */
9592 bfd_vms_set_section_flags (bfd
*abfd ATTRIBUTE_UNUSED
,
9593 asection
*sec
, flagword no_flags
, flagword flags
)
9595 vms_section_data (sec
)->no_flags
= no_flags
;
9596 vms_section_data (sec
)->flags
= flags
;
9599 struct vms_private_data_struct
*
9600 bfd_vms_get_data (bfd
*abfd
)
9602 return (struct vms_private_data_struct
*)abfd
->tdata
.any
;
9605 #define vms_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
9606 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms
9607 #define vms_bfd_copy_link_hash_symbol_type \
9608 _bfd_generic_copy_link_hash_symbol_type
9609 #define vms_bfd_is_group_section bfd_generic_is_group_section
9610 #define vms_bfd_group_name bfd_generic_group_name
9611 #define vms_bfd_discard_group bfd_generic_discard_group
9612 #define vms_section_already_linked _bfd_generic_section_already_linked
9613 #define vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9614 #define vms_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
9615 #define vms_bfd_define_start_stop bfd_generic_define_start_stop
9616 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
9618 #define vms_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
9619 #define vms_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
9620 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
9621 #define vms_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
9622 #define vms_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
9623 #define vms_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
9625 /* Symbols table. */
9626 #define alpha_vms_make_empty_symbol _bfd_generic_make_empty_symbol
9627 #define alpha_vms_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
9628 #define alpha_vms_print_symbol vms_print_symbol
9629 #define alpha_vms_get_symbol_info vms_get_symbol_info
9630 #define alpha_vms_get_symbol_version_string \
9631 _bfd_nosymbols_get_symbol_version_string
9633 #define alpha_vms_read_minisymbols _bfd_generic_read_minisymbols
9634 #define alpha_vms_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
9635 #define alpha_vms_get_lineno _bfd_nosymbols_get_lineno
9636 #define alpha_vms_find_inliner_info _bfd_nosymbols_find_inliner_info
9637 #define alpha_vms_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
9638 #define alpha_vms_find_nearest_line _bfd_vms_find_nearest_line
9639 #define alpha_vms_find_line _bfd_nosymbols_find_line
9640 #define alpha_vms_bfd_is_local_label_name vms_bfd_is_local_label_name
9642 /* Generic table. */
9643 #define alpha_vms_close_and_cleanup vms_close_and_cleanup
9644 #define alpha_vms_bfd_free_cached_info vms_bfd_free_cached_info
9645 #define alpha_vms_new_section_hook vms_new_section_hook
9646 #define alpha_vms_set_section_contents _bfd_vms_set_section_contents
9647 #define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
9649 #define alpha_vms_bfd_get_relocated_section_contents \
9650 bfd_generic_get_relocated_section_contents
9652 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
9653 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
9654 #define alpha_vms_bfd_lookup_section_flags bfd_generic_lookup_section_flags
9655 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
9656 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
9657 #define alpha_vms_bfd_group_name bfd_generic_group_name
9658 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
9659 #define alpha_vms_section_already_linked \
9660 _bfd_generic_section_already_linked
9662 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9663 #define alpha_vms_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
9664 #define alpha_vms_bfd_define_start_stop bfd_generic_define_start_stop
9665 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
9666 #define alpha_vms_bfd_copy_link_hash_symbol_type \
9667 _bfd_generic_copy_link_hash_symbol_type
9669 #define alpha_vms_bfd_link_split_section _bfd_generic_link_split_section
9671 #define alpha_vms_get_dynamic_symtab_upper_bound \
9672 _bfd_nodynamic_get_dynamic_symtab_upper_bound
9673 #define alpha_vms_canonicalize_dynamic_symtab \
9674 _bfd_nodynamic_canonicalize_dynamic_symtab
9675 #define alpha_vms_get_dynamic_reloc_upper_bound \
9676 _bfd_nodynamic_get_dynamic_reloc_upper_bound
9677 #define alpha_vms_canonicalize_dynamic_reloc \
9678 _bfd_nodynamic_canonicalize_dynamic_reloc
9679 #define alpha_vms_bfd_link_check_relocs _bfd_generic_link_check_relocs
9681 const bfd_target alpha_vms_vec
=
9683 "vms-alpha", /* Name. */
9684 bfd_target_evax_flavour
,
9685 BFD_ENDIAN_LITTLE
, /* Data byte order is little. */
9686 BFD_ENDIAN_LITTLE
, /* Header byte order is little. */
9688 (HAS_RELOC
| EXEC_P
| HAS_LINENO
| HAS_DEBUG
| HAS_SYMS
| HAS_LOCALS
9689 | WP_TEXT
| D_PAGED
), /* Object flags. */
9690 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
9691 | SEC_READONLY
| SEC_CODE
| SEC_DATA
9692 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* Sect flags. */
9693 0, /* symbol_leading_char. */
9694 ' ', /* ar_pad_char. */
9695 15, /* ar_max_namelen. */
9696 0, /* match priority. */
9697 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
9698 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
9699 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
9700 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
9701 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
9702 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
9704 { /* bfd_check_format. */
9707 _bfd_vms_lib_alpha_archive_p
,
9710 { /* bfd_set_format. */
9711 _bfd_bool_bfd_false_error
,
9713 _bfd_vms_lib_alpha_mkarchive
,
9714 _bfd_bool_bfd_false_error
9716 { /* bfd_write_contents. */
9717 _bfd_bool_bfd_false_error
,
9718 alpha_vms_write_object_contents
,
9719 _bfd_vms_lib_write_archive_contents
,
9720 _bfd_bool_bfd_false_error
9723 BFD_JUMP_TABLE_GENERIC (alpha_vms
),
9724 BFD_JUMP_TABLE_COPY (vms
),
9725 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
9726 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib
),
9727 BFD_JUMP_TABLE_SYMBOLS (alpha_vms
),
9728 BFD_JUMP_TABLE_RELOCS (alpha_vms
),
9729 BFD_JUMP_TABLE_WRITE (alpha_vms
),
9730 BFD_JUMP_TABLE_LINK (alpha_vms
),
9731 BFD_JUMP_TABLE_DYNAMIC (alpha_vms
),