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 bfd_boolean
alpha_vms_add_fixup_lp (struct bfd_link_info
*,
373 static bfd_boolean
alpha_vms_add_fixup_ca (struct bfd_link_info
*,
375 static bfd_boolean
alpha_vms_add_fixup_qr (struct bfd_link_info
*,
376 bfd
*, bfd
*, bfd_vma
);
377 static bfd_boolean
alpha_vms_add_fixup_lr (struct bfd_link_info
*,
378 unsigned int, bfd_vma
);
379 static bfd_boolean
alpha_vms_add_lw_reloc (struct bfd_link_info
*);
380 static bfd_boolean
alpha_vms_add_qw_reloc (struct bfd_link_info
*);
389 /* Number of elements in VEC. */
391 #define VEC_COUNT(VEC) ((VEC).nbr_el)
393 /* Get the address of the Nth element. */
395 #define VEC_EL(VEC, TYPE, N) (((TYPE *)((VEC).els))[N])
397 #define VEC_INIT(VEC) \
404 /* Be sure there is room for a new element. */
406 static void *vector_grow1 (struct vector_type
*vec
, size_t elsz
);
408 /* Allocate room for a new element and return its address. */
410 #define VEC_APPEND(VEC, TYPE) \
411 ((TYPE *) vector_grow1 (&VEC, sizeof (TYPE)))
413 struct alpha_vms_vma_ref
415 bfd_vma vma
; /* Vma in the output. */
416 bfd_vma ref
; /* Reference in the input. */
419 struct alpha_vms_shlib_el
422 bfd_boolean has_fixups
;
424 struct vector_type lp
; /* Vector of bfd_vma. */
425 struct vector_type ca
; /* Vector of bfd_vma. */
426 struct vector_type qr
; /* Vector of struct alpha_vms_vma_ref. */
429 /* Alpha VMS linker hash table. */
431 struct alpha_vms_link_hash_table
433 struct bfd_link_hash_table root
;
435 /* Vector of shared libraries. */
436 struct vector_type shrlibs
;
441 /* Base address. Used by fixups. */
445 #define alpha_vms_link_hash(INFO) \
446 ((struct alpha_vms_link_hash_table *)(INFO->hash))
448 /* Alpha VMS linker hash table entry. */
450 struct alpha_vms_link_hash_entry
452 struct bfd_link_hash_entry root
;
454 /* Pointer to the original vms symbol. */
455 struct vms_symbol_entry
*sym
;
460 /* Read & process EIHD record.
461 Return TRUE on success, FALSE on error. */
464 _bfd_vms_slurp_eihd (bfd
*abfd
, unsigned int *eisd_offset
,
465 unsigned int *eihs_offset
)
467 unsigned int imgtype
, size
;
469 struct vms_eihd
*eihd
= (struct vms_eihd
*)PRIV (recrd
.rec
);
471 vms_debug2 ((8, "_bfd_vms_slurp_eihd\n"));
473 /* PR 21813: Check for an undersized record. */
474 if (PRIV (recrd
.buf_size
) < sizeof (* eihd
))
476 _bfd_error_handler (_("corrupt EIHD record - size is too small"));
477 bfd_set_error (bfd_error_bad_value
);
481 size
= bfd_getl32 (eihd
->size
);
482 imgtype
= bfd_getl32 (eihd
->imgtype
);
484 if (imgtype
== EIHD__K_EXE
|| imgtype
== EIHD__K_LIM
)
485 abfd
->flags
|= EXEC_P
;
487 symvva
= bfd_getl64 (eihd
->symvva
);
490 PRIV (symvva
) = symvva
;
491 abfd
->flags
|= DYNAMIC
;
494 PRIV (ident
) = bfd_getl32 (eihd
->ident
);
495 PRIV (matchctl
) = eihd
->matchctl
;
497 *eisd_offset
= bfd_getl32 (eihd
->isdoff
);
498 *eihs_offset
= bfd_getl32 (eihd
->symdbgoff
);
500 vms_debug2 ((4, "EIHD size %d imgtype %d symvva 0x%lx eisd %d eihs %d\n",
501 size
, imgtype
, (unsigned long)symvva
,
502 *eisd_offset
, *eihs_offset
));
508 /* Read & process EISD record.
509 Return TRUE on success, FALSE on error. */
512 _bfd_vms_slurp_eisd (bfd
*abfd
, unsigned int offset
)
514 int section_count
= 0;
516 vms_debug2 ((8, "_bfd_vms_slurp_eisd\n"));
520 struct vms_eisd
*eisd
;
521 unsigned int rec_size
;
530 /* PR 17512: file: 3d9e9fe9. */
531 if (offset
> PRIV (recrd
.rec_size
)
532 || (PRIV (recrd
.rec_size
) - offset
533 < offsetof (struct vms_eisd
, eisdsize
) + 4))
535 eisd
= (struct vms_eisd
*) (PRIV (recrd
.rec
) + offset
);
536 rec_size
= bfd_getl32 (eisd
->eisdsize
);
540 /* Skip to next block if pad. */
541 if (rec_size
== 0xffffffff)
543 offset
= (offset
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
547 /* Make sure that there is enough data present in the record. */
548 if (rec_size
< offsetof (struct vms_eisd
, type
) + 1)
550 /* Make sure that the record is not too big either. */
551 if (rec_size
> PRIV (recrd
.rec_size
) - offset
)
556 size
= bfd_getl32 (eisd
->secsize
);
557 vaddr
= bfd_getl64 (eisd
->virt_addr
);
558 flags
= bfd_getl32 (eisd
->flags
);
559 vbn
= bfd_getl32 (eisd
->vbn
);
561 vms_debug2 ((4, "EISD at 0x%x size 0x%x addr 0x%lx flags 0x%x blk %d\n",
562 offset
, size
, (unsigned long)vaddr
, flags
, vbn
));
564 /* VMS combines psects from .obj files into isects in the .exe. This
565 process doesn't preserve enough information to reliably determine
566 what's in each section without examining the data. This is
567 especially true of DWARF debug sections. */
568 bfd_flags
= SEC_ALLOC
;
570 bfd_flags
|= SEC_HAS_CONTENTS
| SEC_LOAD
;
572 if (flags
& EISD__M_EXE
)
573 bfd_flags
|= SEC_CODE
;
575 if (flags
& EISD__M_NONSHRADR
)
576 bfd_flags
|= SEC_DATA
;
578 if (!(flags
& EISD__M_WRT
))
579 bfd_flags
|= SEC_READONLY
;
581 if (flags
& EISD__M_DZRO
)
582 bfd_flags
|= SEC_DATA
;
584 if (flags
& EISD__M_FIXUPVEC
)
585 bfd_flags
|= SEC_DATA
;
587 if (flags
& EISD__M_CRF
)
588 bfd_flags
|= SEC_DATA
;
590 if (flags
& EISD__M_GBL
)
592 if (rec_size
<= offsetof (struct vms_eisd
, gblnam
))
594 else if (rec_size
< sizeof (struct vms_eisd
))
595 name
= _bfd_vms_save_counted_string (abfd
, eisd
->gblnam
,
596 rec_size
- offsetof (struct vms_eisd
, gblnam
));
598 name
= _bfd_vms_save_counted_string (abfd
, eisd
->gblnam
,
600 if (name
== NULL
|| name
[0] == 0)
602 bfd_flags
|= SEC_COFF_SHARED_LIBRARY
;
603 bfd_flags
&= ~(SEC_ALLOC
| SEC_LOAD
);
605 else if (flags
& EISD__M_FIXUPVEC
)
607 else if (eisd
->type
== EISD__K_USRSTACK
)
613 name
= (char *) bfd_alloc (abfd
, 32);
616 if (flags
& EISD__M_DZRO
)
618 else if (flags
& EISD__M_EXE
)
620 else if (!(flags
& EISD__M_WRT
))
624 BFD_ASSERT (section_count
< 999);
625 sprintf (name
, "$%s_%03d$", pfx
, section_count
++);
628 section
= bfd_make_section (abfd
, name
);
633 section
->filepos
= vbn
? VMS_BLOCK_SIZE
* (vbn
- 1) : 0;
634 section
->size
= size
;
635 section
->vma
= vaddr
;
637 if (!bfd_set_section_flags (section
, bfd_flags
))
644 /* Read & process EIHS record.
645 Return TRUE on success, FALSE on error. */
648 _bfd_vms_slurp_eihs (bfd
*abfd
, unsigned int offset
)
650 unsigned char *p
= PRIV (recrd
.rec
) + offset
;
652 unsigned int gstsize ATTRIBUTE_UNUSED
;
654 unsigned int dstsize
;
656 unsigned int dmtbytes
;
659 /* PR 21611: Check that offset is valid. */
660 if (offset
> PRIV (recrd
.rec_size
) - (EIHS__L_DMTBYTES
+ 4))
662 _bfd_error_handler (_("unable to read EIHS record at offset %#x"),
664 bfd_set_error (bfd_error_file_truncated
);
668 gstvbn
= bfd_getl32 (p
+ EIHS__L_GSTVBN
);
669 gstsize
= bfd_getl32 (p
+ EIHS__L_GSTSIZE
);
670 dstvbn
= bfd_getl32 (p
+ EIHS__L_DSTVBN
);
671 dstsize
= bfd_getl32 (p
+ EIHS__L_DSTSIZE
);
672 dmtvbn
= bfd_getl32 (p
+ EIHS__L_DMTVBN
);
673 dmtbytes
= bfd_getl32 (p
+ EIHS__L_DMTBYTES
);
676 vms_debug (8, "_bfd_vms_slurp_ihs\n");
677 vms_debug (4, "EIHS record gstvbn %d gstsize %d dstvbn %d dstsize %d dmtvbn %d dmtbytes %d\n",
678 gstvbn
, gstsize
, dstvbn
, dstsize
, dmtvbn
, dmtbytes
);
683 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
685 section
= bfd_make_section (abfd
, "$DST$");
689 section
->size
= dstsize
;
690 section
->filepos
= VMS_BLOCK_SIZE
* (dstvbn
- 1);
692 if (!bfd_set_section_flags (section
, bfd_flags
))
695 PRIV (dst_section
) = section
;
696 abfd
->flags
|= (HAS_DEBUG
| HAS_LINENO
);
701 flagword bfd_flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
;
703 section
= bfd_make_section (abfd
, "$DMT$");
707 section
->size
= dmtbytes
;
708 section
->filepos
= VMS_BLOCK_SIZE
* (dmtvbn
- 1);
710 if (!bfd_set_section_flags (section
, bfd_flags
))
716 if (bfd_seek (abfd
, VMS_BLOCK_SIZE
* (gstvbn
- 1), SEEK_SET
))
718 bfd_set_error (bfd_error_file_truncated
);
722 if (!_bfd_vms_slurp_object_records (abfd
))
725 abfd
->flags
|= HAS_SYMS
;
731 /* Object file reading. */
733 /* Object file input functions. */
735 /* Get next record from object file to vms_buf.
736 Set PRIV(buf_size) and return it
738 This is a little tricky since it should be portable.
740 The openVMS object file has 'variable length' which means that
741 read() returns data in chunks of (hopefully) correct and expected
742 size. The linker (and other tools on VMS) depend on that. Unix
743 doesn't know about 'formatted' files, so reading and writing such
744 an object file in a Unix environment is not trivial.
746 With the tool 'file' (available on all VMS FTP sites), one
747 can view and change the attributes of a file. Changing from
748 'variable length' to 'fixed length, 512 bytes' reveals the
749 record size at the first 2 bytes of every record. The same
750 may happen during the transfer of object files from VMS to Unix,
751 at least with UCX, the DEC implementation of TCP/IP.
753 The VMS format repeats the size at bytes 2 & 3 of every record.
755 On the first call (file_format == FF_UNKNOWN) we check if
756 the first and the third byte pair (!) of the record match.
757 If they do it's an object file in an Unix environment or with
758 wrong attributes (FF_FOREIGN), else we should be in a VMS
759 environment where read() returns the record size (FF_NATIVE).
761 Reading is always done in 2 steps:
762 1. first just the record header is read and the size extracted,
763 2. then the read buffer is adjusted and the remaining bytes are
766 All file I/O is done on even file positions. */
768 #define VMS_OBJECT_ADJUSTMENT 2
771 maybe_adjust_record_pointer_for_object (bfd
*abfd
)
773 /* Set the file format once for all on the first invocation. */
774 if (PRIV (recrd
.file_format
) == FF_UNKNOWN
)
776 if (PRIV (recrd
.rec
)[0] == PRIV (recrd
.rec
)[4]
777 && PRIV (recrd
.rec
)[1] == PRIV (recrd
.rec
)[5])
778 PRIV (recrd
.file_format
) = FF_FOREIGN
;
780 PRIV (recrd
.file_format
) = FF_NATIVE
;
783 /* The adjustment is needed only in an Unix environment. */
784 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
785 PRIV (recrd
.rec
) += VMS_OBJECT_ADJUSTMENT
;
788 /* Implement step #1 of the object record reading procedure.
789 Return the record type or -1 on failure. */
792 _bfd_vms_get_object_record (bfd
*abfd
)
794 unsigned int test_len
= 6;
797 vms_debug2 ((8, "_bfd_vms_get_obj_record\n"));
799 /* Skip alignment byte if the current position is odd. */
800 if (PRIV (recrd
.file_format
) == FF_FOREIGN
&& (bfd_tell (abfd
) & 1))
802 if (bfd_bread (PRIV (recrd
.buf
), 1, abfd
) != 1)
804 bfd_set_error (bfd_error_file_truncated
);
809 /* Read the record header */
810 if (bfd_bread (PRIV (recrd
.buf
), test_len
, abfd
) != test_len
)
812 bfd_set_error (bfd_error_file_truncated
);
816 /* Reset the record pointer. */
817 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
818 maybe_adjust_record_pointer_for_object (abfd
);
820 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
823 type
= bfd_getl16 (PRIV (recrd
.rec
));
825 vms_debug2 ((8, "_bfd_vms_get_obj_record: rec %p, size %d, type %d\n",
826 PRIV (recrd
.rec
), PRIV (recrd
.rec_size
), type
));
831 /* Implement step #2 of the object record reading procedure.
832 Return the size of the record or 0 on failure. */
835 vms_get_remaining_object_record (bfd
*abfd
, unsigned int read_so_far
)
837 unsigned int to_read
;
839 vms_debug2 ((8, "vms_get_remaining_obj_record\n"));
841 /* Extract record size. */
842 PRIV (recrd
.rec_size
) = bfd_getl16 (PRIV (recrd
.rec
) + 2);
844 if (PRIV (recrd
.rec_size
) == 0)
846 bfd_set_error (bfd_error_file_truncated
);
850 /* That's what the linker manual says. */
851 if (PRIV (recrd
.rec_size
) > EOBJ__C_MAXRECSIZ
)
853 bfd_set_error (bfd_error_file_truncated
);
857 /* Take into account object adjustment. */
858 to_read
= PRIV (recrd
.rec_size
);
859 if (PRIV (recrd
.file_format
) == FF_FOREIGN
)
860 to_read
+= VMS_OBJECT_ADJUSTMENT
;
862 /* Adjust the buffer. */
863 if (to_read
> PRIV (recrd
.buf_size
))
866 = (unsigned char *) bfd_realloc_or_free (PRIV (recrd
.buf
), to_read
);
867 if (PRIV (recrd
.buf
) == NULL
)
869 PRIV (recrd
.buf_size
) = to_read
;
871 /* PR 17512: file: 025-1974-0.004. */
872 else if (to_read
<= read_so_far
)
875 /* Read the remaining record. */
876 to_read
-= read_so_far
;
878 vms_debug2 ((8, "vms_get_remaining_obj_record: to_read %d\n", to_read
));
880 if (bfd_bread (PRIV (recrd
.buf
) + read_so_far
, to_read
, abfd
) != to_read
)
882 bfd_set_error (bfd_error_file_truncated
);
886 /* Reset the record pointer. */
887 PRIV (recrd
.rec
) = PRIV (recrd
.buf
);
888 maybe_adjust_record_pointer_for_object (abfd
);
890 vms_debug2 ((8, "vms_get_remaining_obj_record: size %d\n",
891 PRIV (recrd
.rec_size
)));
893 return PRIV (recrd
.rec_size
);
896 /* Read and process emh record.
897 Return TRUE on success, FALSE on error. */
900 _bfd_vms_slurp_ehdr (bfd
*abfd
)
903 unsigned char *vms_rec
;
907 vms_rec
= PRIV (recrd
.rec
);
908 /* PR 17512: file: 62736583. */
909 end
= PRIV (recrd
.buf
) + PRIV (recrd
.buf_size
);
911 vms_debug2 ((2, "HDR/EMH\n"));
913 subtype
= bfd_getl16 (vms_rec
+ 4);
915 vms_debug2 ((3, "subtype %d\n", subtype
));
921 if (vms_rec
+ 21 >= end
)
923 PRIV (hdr_data
).hdr_b_strlvl
= vms_rec
[6];
924 PRIV (hdr_data
).hdr_l_arch1
= bfd_getl32 (vms_rec
+ 8);
925 PRIV (hdr_data
).hdr_l_arch2
= bfd_getl32 (vms_rec
+ 12);
926 PRIV (hdr_data
).hdr_l_recsiz
= bfd_getl32 (vms_rec
+ 16);
927 if ((vms_rec
+ 20 + vms_rec
[20] + 1) >= end
)
929 PRIV (hdr_data
).hdr_t_name
930 = _bfd_vms_save_counted_string (abfd
, vms_rec
+ 20, vms_rec
[20]);
931 ptr
= vms_rec
+ 20 + vms_rec
[20] + 1;
932 if ((ptr
+ *ptr
+ 1) >= end
)
934 PRIV (hdr_data
).hdr_t_version
935 = _bfd_vms_save_counted_string (abfd
, ptr
, *ptr
);
939 PRIV (hdr_data
).hdr_t_date
940 = _bfd_vms_save_sized_string (abfd
, ptr
, 17);
944 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
946 PRIV (hdr_data
).hdr_c_lnm
947 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
951 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
953 PRIV (hdr_data
).hdr_c_src
954 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
958 if (vms_rec
+ PRIV (recrd
.rec_size
- 6) > end
)
960 PRIV (hdr_data
).hdr_c_ttl
961 = _bfd_vms_save_sized_string (abfd
, vms_rec
, PRIV (recrd
.rec_size
- 6));
971 bfd_set_error (bfd_error_wrong_format
);
978 /* Typical sections for evax object files. */
980 #define EVAX_ABS_NAME "$ABS$"
981 #define EVAX_CODE_NAME "$CODE$"
982 #define EVAX_LINK_NAME "$LINK$"
983 #define EVAX_DATA_NAME "$DATA$"
984 #define EVAX_BSS_NAME "$BSS$"
985 #define EVAX_READONLYADDR_NAME "$READONLY_ADDR$"
986 #define EVAX_READONLY_NAME "$READONLY$"
987 #define EVAX_LITERAL_NAME "$LITERAL$"
988 #define EVAX_LITERALS_NAME "$LITERALS"
989 #define EVAX_COMMON_NAME "$COMMON$"
990 #define EVAX_LOCAL_NAME "$LOCAL$"
992 struct sec_flags_struct
994 const char *name
; /* Name of section. */
996 flagword flags_always
; /* Flags we set always. */
998 flagword flags_hassize
; /* Flags we set if the section has a size > 0. */
1001 /* These flags are deccrtl/vaxcrtl (openVMS 6.2 Alpha) compatible. */
1003 static const struct sec_flags_struct evax_section_flags
[] =
1011 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
,
1012 SEC_CODE
| SEC_READONLY
,
1013 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_EXE
,
1014 SEC_CODE
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1015 { EVAX_LITERAL_NAME
,
1016 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
,
1017 SEC_DATA
| SEC_READONLY
,
1018 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
,
1019 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1021 EGPS__V_REL
| EGPS__V_RD
,
1022 SEC_DATA
| SEC_READONLY
,
1023 EGPS__V_REL
| EGPS__V_RD
,
1024 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1026 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1028 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1029 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1031 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1033 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
| EGPS__V_NOMOD
,
1035 { EVAX_READONLYADDR_NAME
,
1036 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
,
1037 SEC_DATA
| SEC_READONLY
,
1038 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_RD
,
1039 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1040 { EVAX_READONLY_NAME
,
1041 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
| EGPS__V_NOMOD
,
1042 SEC_DATA
| SEC_READONLY
,
1043 EGPS__V_PIC
| EGPS__V_REL
| EGPS__V_SHR
| EGPS__V_RD
,
1044 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1046 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1048 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1049 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1050 { EVAX_LITERALS_NAME
,
1051 EGPS__V_PIC
| EGPS__V_OVR
,
1052 SEC_DATA
| SEC_READONLY
,
1053 EGPS__V_PIC
| EGPS__V_OVR
,
1054 SEC_DATA
| SEC_READONLY
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
},
1056 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1058 EGPS__V_REL
| EGPS__V_RD
| EGPS__V_WRT
,
1059 SEC_DATA
| SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_LOAD
}
1062 /* Retrieve BFD section flags by name and size. */
1065 vms_secflag_by_name (const struct sec_flags_struct
*section_flags
,
1071 while (section_flags
[i
].name
!= NULL
)
1073 if (strcmp (name
, section_flags
[i
].name
) == 0)
1076 return section_flags
[i
].flags_hassize
;
1078 return section_flags
[i
].flags_always
;
1083 return section_flags
[i
].flags_hassize
;
1084 return section_flags
[i
].flags_always
;
1087 /* Retrieve VMS section flags by name and size. */
1090 vms_esecflag_by_name (const struct sec_flags_struct
*section_flags
,
1096 while (section_flags
[i
].name
!= NULL
)
1098 if (strcmp (name
, section_flags
[i
].name
) == 0)
1101 return section_flags
[i
].vflags_hassize
;
1103 return section_flags
[i
].vflags_always
;
1108 return section_flags
[i
].vflags_hassize
;
1109 return section_flags
[i
].vflags_always
;
1112 /* Add SYM to the symbol table of ABFD.
1113 Return FALSE in case of error. */
1116 add_symbol_entry (bfd
*abfd
, struct vms_symbol_entry
*sym
)
1118 if (PRIV (gsd_sym_count
) >= PRIV (max_sym_count
))
1120 if (PRIV (max_sym_count
) == 0)
1122 PRIV (max_sym_count
) = 128;
1123 PRIV (syms
) = bfd_malloc
1124 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*));
1128 PRIV (max_sym_count
) *= 2;
1129 PRIV (syms
) = bfd_realloc_or_free
1131 (PRIV (max_sym_count
) * sizeof (struct vms_symbol_entry
*)));
1133 if (PRIV (syms
) == NULL
)
1137 PRIV (syms
)[PRIV (gsd_sym_count
)++] = sym
;
1141 /* Create a symbol whose name is ASCIC and add it to ABFD.
1142 Return NULL in case of error. */
1144 static struct vms_symbol_entry
*
1145 add_symbol (bfd
*abfd
, const unsigned char *ascic
, unsigned int max
)
1147 struct vms_symbol_entry
*entry
;
1154 _bfd_error_handler (_("record is too small for symbol name length"));
1155 bfd_set_error (bfd_error_bad_value
);
1159 entry
= (struct vms_symbol_entry
*)bfd_zalloc (abfd
, sizeof (*entry
) + len
);
1162 entry
->namelen
= len
;
1163 memcpy (entry
->name
, ascic
, len
);
1164 entry
->name
[len
] = 0;
1165 entry
->owner
= abfd
;
1167 if (!add_symbol_entry (abfd
, entry
))
1172 /* Read and process EGSD. Return FALSE on failure. */
1175 _bfd_vms_slurp_egsd (bfd
*abfd
)
1178 unsigned int gsd_size
;
1179 unsigned char *vms_rec
;
1183 vms_debug2 ((2, "EGSD\n"));
1185 if (PRIV (recrd
.rec_size
) < 8)
1187 _bfd_error_handler (_("corrupt EGSD record: its size (%#x) is too small"),
1188 PRIV (recrd
.rec_size
));
1189 bfd_set_error (bfd_error_bad_value
);
1193 PRIV (recrd
.rec
) += 8; /* Skip type, size, align pad. */
1194 PRIV (recrd
.rec_size
) -= 8;
1196 /* Calculate base address for each section. */
1199 while (PRIV (recrd
.rec_size
) > 4)
1201 vms_rec
= PRIV (recrd
.rec
);
1203 gsd_type
= bfd_getl16 (vms_rec
);
1204 gsd_size
= bfd_getl16 (vms_rec
+ 2);
1206 vms_debug2 ((3, "egsd_type %d\n", gsd_type
));
1208 /* PR 21615: Check for size overflow. */
1209 if (PRIV (recrd
.rec_size
) < gsd_size
)
1211 _bfd_error_handler (_("corrupt EGSD record type %d: size (%#x) "
1212 "is larger than remaining space (%#x)"),
1213 gsd_type
, gsd_size
, PRIV (recrd
.rec_size
));
1214 bfd_set_error (bfd_error_bad_value
);
1221 _bfd_error_handler (_("corrupt EGSD record type %d: size (%#x) "
1223 gsd_type
, gsd_size
);
1224 bfd_set_error (bfd_error_bad_value
);
1231 /* Program section definition. */
1233 struct vms_egps
*egps
= (struct vms_egps
*) vms_rec
;
1234 flagword new_flags
, vms_flags
;
1237 if (offsetof (struct vms_egps
, flags
) + 2 > gsd_size
)
1239 vms_flags
= bfd_getl16 (egps
->flags
);
1241 if ((vms_flags
& EGPS__V_REL
) == 0)
1243 /* Use the global absolute section for all
1244 absolute sections. */
1245 section
= bfd_abs_section_ptr
;
1253 if (offsetof (struct vms_egps
, namlng
) >= gsd_size
)
1255 left
= gsd_size
- offsetof (struct vms_egps
, namlng
);
1256 name
= _bfd_vms_save_counted_string (abfd
, &egps
->namlng
, left
);
1257 if (name
== NULL
|| name
[0] == 0)
1260 section
= bfd_make_section (abfd
, name
);
1264 section
->filepos
= 0;
1265 section
->size
= bfd_getl32 (egps
->alloc
);
1266 section
->alignment_power
= egps
->align
& 31;
1268 vms_section_data (section
)->flags
= vms_flags
;
1269 vms_section_data (section
)->no_flags
= 0;
1271 new_flags
= vms_secflag_by_name (evax_section_flags
,
1274 if (section
->size
> 0)
1275 new_flags
|= SEC_LOAD
;
1276 if (!(vms_flags
& EGPS__V_NOMOD
) && section
->size
> 0)
1278 /* Set RELOC and HAS_CONTENTS if the section is not
1279 demand-zero and not empty. */
1280 new_flags
|= SEC_HAS_CONTENTS
;
1281 if (vms_flags
& EGPS__V_REL
)
1282 new_flags
|= SEC_RELOC
;
1284 if (vms_flags
& EGPS__V_EXE
)
1286 /* Set CODE if section is executable. */
1287 new_flags
|= SEC_CODE
;
1288 new_flags
&= ~SEC_DATA
;
1290 if (!bfd_set_section_flags (section
, new_flags
))
1293 /* Give a non-overlapping vma to non absolute sections. */
1294 align_addr
= (bfd_vma
) 1 << section
->alignment_power
;
1295 base_addr
= (base_addr
+ align_addr
- 1) & -align_addr
;
1296 section
->vma
= base_addr
;
1297 base_addr
+= section
->size
;
1300 /* Append it to the section array. */
1301 if (PRIV (section_count
) >= PRIV (section_max
))
1303 if (PRIV (section_max
) == 0)
1304 PRIV (section_max
) = 16;
1306 PRIV (section_max
) *= 2;
1307 PRIV (sections
) = bfd_realloc_or_free
1308 (PRIV (sections
), PRIV (section_max
) * sizeof (asection
*));
1309 if (PRIV (sections
) == NULL
)
1313 PRIV (sections
)[PRIV (section_count
)] = section
;
1314 PRIV (section_count
)++;
1320 unsigned int nameoff
;
1321 struct vms_symbol_entry
*entry
;
1322 struct vms_egsy
*egsy
= (struct vms_egsy
*) vms_rec
;
1325 if (offsetof (struct vms_egsy
, flags
) + 2 > gsd_size
)
1327 old_flags
= bfd_getl16 (egsy
->flags
);
1328 if (old_flags
& EGSY__V_DEF
)
1329 nameoff
= ESDF__B_NAMLNG
;
1331 nameoff
= ESRF__B_NAMLNG
;
1333 if (nameoff
>= gsd_size
)
1335 entry
= add_symbol (abfd
, vms_rec
+ nameoff
, gsd_size
- nameoff
);
1339 /* Allow only duplicate reference. */
1340 if ((entry
->flags
& EGSY__V_DEF
) && (old_flags
& EGSY__V_DEF
))
1343 if (entry
->typ
== 0)
1345 entry
->typ
= gsd_type
;
1346 entry
->data_type
= egsy
->datyp
;
1347 entry
->flags
= old_flags
;
1350 if (old_flags
& EGSY__V_DEF
)
1352 struct vms_esdf
*esdf
= (struct vms_esdf
*) vms_rec
;
1354 entry
->value
= bfd_getl64 (esdf
->value
);
1355 if (PRIV (sections
) == NULL
)
1358 psindx
= bfd_getl32 (esdf
->psindx
);
1359 /* PR 21813: Check for an out of range index. */
1360 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1363 _bfd_error_handler (_("corrupt EGSD record: its psindx "
1364 "field is too big (%#lx)"),
1366 bfd_set_error (bfd_error_bad_value
);
1369 entry
->section
= PRIV (sections
)[psindx
];
1371 if (old_flags
& EGSY__V_NORM
)
1373 PRIV (norm_sym_count
)++;
1375 entry
->code_value
= bfd_getl64 (esdf
->code_address
);
1376 psindx
= bfd_getl32 (esdf
->ca_psindx
);
1377 /* PR 21813: Check for an out of range index. */
1378 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1380 entry
->code_section
= PRIV (sections
)[psindx
];
1388 struct vms_symbol_entry
*entry
;
1389 struct vms_egst
*egst
= (struct vms_egst
*)vms_rec
;
1391 unsigned int nameoff
= offsetof (struct vms_egst
, namlng
);
1393 old_flags
= bfd_getl16 (egst
->header
.flags
);
1395 if (nameoff
>= gsd_size
)
1397 entry
= add_symbol (abfd
, &egst
->namlng
, gsd_size
- nameoff
);
1401 entry
->typ
= gsd_type
;
1402 entry
->data_type
= egst
->header
.datyp
;
1403 entry
->flags
= old_flags
;
1405 entry
->symbol_vector
= bfd_getl32 (egst
->value
);
1407 if (old_flags
& EGSY__V_REL
)
1409 if (PRIV (sections
) == NULL
)
1411 psindx
= bfd_getl32 (egst
->psindx
);
1412 /* PR 21813: Check for an out of range index. */
1413 if (psindx
< 0 || psindx
>= (int) PRIV (section_count
))
1415 entry
->section
= PRIV (sections
)[psindx
];
1418 entry
->section
= bfd_abs_section_ptr
;
1420 entry
->value
= bfd_getl64 (egst
->lp_2
);
1422 if (old_flags
& EGSY__V_NORM
)
1424 PRIV (norm_sym_count
)++;
1426 entry
->code_value
= bfd_getl64 (egst
->lp_1
);
1427 entry
->code_section
= bfd_abs_section_ptr
;
1434 /* Currently ignored. */
1439 _bfd_error_handler (_("unknown EGSD subtype %d"), gsd_type
);
1440 bfd_set_error (bfd_error_bad_value
);
1444 PRIV (recrd
.rec_size
) -= gsd_size
;
1445 PRIV (recrd
.rec
) += gsd_size
;
1448 /* FIXME: Should we complain if PRIV (recrd.rec_size) is not zero ? */
1450 if (PRIV (gsd_sym_count
) > 0)
1451 abfd
->flags
|= HAS_SYMS
;
1456 /* Stack routines for vms ETIR commands. */
1458 /* Push value and section index. */
1461 _bfd_vms_push (bfd
*abfd
, bfd_vma val
, unsigned int reloc
)
1463 vms_debug2 ((4, "<push %08lx (0x%08x) at %d>\n",
1464 (unsigned long)val
, reloc
, PRIV (stackptr
)));
1466 PRIV (stack
[PRIV (stackptr
)]).value
= val
;
1467 PRIV (stack
[PRIV (stackptr
)]).reloc
= reloc
;
1469 if (PRIV (stackptr
) >= STACKSIZE
)
1471 bfd_set_error (bfd_error_bad_value
);
1472 _bfd_error_handler (_("stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr
));
1478 /* Pop value and section index. */
1481 _bfd_vms_pop (bfd
*abfd
, bfd_vma
*val
, unsigned int *rel
)
1483 if (PRIV (stackptr
) == 0)
1485 bfd_set_error (bfd_error_bad_value
);
1486 _bfd_error_handler (_("stack underflow in _bfd_vms_pop"));
1490 *val
= PRIV (stack
[PRIV (stackptr
)]).value
;
1491 *rel
= PRIV (stack
[PRIV (stackptr
)]).reloc
;
1493 vms_debug2 ((4, "<pop %08lx (0x%08x)>\n", (unsigned long)*val
, *rel
));
1497 /* Routines to fill sections contents during tir/etir read. */
1499 /* Initialize image buffer pointer to be filled. */
1502 image_set_ptr (bfd
*abfd
, bfd_vma vma
, int sect
, struct bfd_link_info
*info
)
1506 vms_debug2 ((4, "image_set_ptr (0x%08x, sect=%d)\n", (unsigned)vma
, sect
));
1508 if (PRIV (sections
) == NULL
)
1510 if (sect
< 0 || sect
>= (int) PRIV (section_count
))
1513 sec
= PRIV (sections
)[sect
];
1517 /* Reading contents to an output bfd. */
1519 if (sec
->output_section
== NULL
)
1521 /* Section discarded. */
1522 vms_debug2 ((5, " section %s discarded\n", sec
->name
));
1524 /* This is not used. */
1525 PRIV (image_section
) = NULL
;
1526 PRIV (image_offset
) = 0;
1529 PRIV (image_offset
) = sec
->output_offset
+ vma
;
1530 PRIV (image_section
) = sec
->output_section
;
1534 PRIV (image_offset
) = vma
;
1535 PRIV (image_section
) = sec
;
1539 /* Increment image buffer pointer by offset. */
1542 image_inc_ptr (bfd
*abfd
, bfd_vma offset
)
1544 vms_debug2 ((4, "image_inc_ptr (%u)\n", (unsigned)offset
));
1546 PRIV (image_offset
) += offset
;
1549 /* Save current DST location counter under specified index. */
1552 dst_define_location (bfd
*abfd
, unsigned int loc
)
1554 vms_debug2 ((4, "dst_define_location (%d)\n", (int)loc
));
1556 /* Grow the ptr offset table if necessary. */
1557 if (loc
+ 1 > PRIV (dst_ptr_offsets_count
))
1559 PRIV (dst_ptr_offsets
)
1560 = bfd_realloc_or_free (PRIV (dst_ptr_offsets
),
1561 (loc
+ 1) * sizeof (unsigned int));
1562 if (PRIV (dst_ptr_offsets
) == NULL
)
1564 PRIV (dst_ptr_offsets_count
) = loc
+ 1;
1567 PRIV (dst_ptr_offsets
)[loc
] = PRIV (image_offset
);
1571 /* Restore saved DST location counter from specified index. */
1574 dst_restore_location (bfd
*abfd
, unsigned int loc
)
1576 vms_debug2 ((4, "dst_restore_location (%d)\n", (int)loc
));
1578 PRIV (image_offset
) = PRIV (dst_ptr_offsets
)[loc
];
1581 /* Retrieve saved DST location counter from specified index. */
1584 dst_retrieve_location (bfd
*abfd
, unsigned int loc
)
1586 vms_debug2 ((4, "dst_retrieve_location (%d)\n", (int)loc
));
1588 return PRIV (dst_ptr_offsets
)[loc
];
1591 /* Write multiple bytes to section image. */
1594 image_write (bfd
*abfd
, unsigned char *ptr
, unsigned int size
)
1597 _bfd_vms_debug (8, "image_write from (%p, %d) to (%ld)\n", ptr
, size
,
1598 (long)PRIV (image_offset
));
1601 if (PRIV (image_section
)->contents
!= NULL
)
1603 asection
*sec
= PRIV (image_section
);
1604 size_t off
= PRIV (image_offset
);
1608 || size
> sec
->size
- off
)
1610 bfd_set_error (bfd_error_bad_value
);
1614 memcpy (sec
->contents
+ off
, ptr
, size
);
1617 _bfd_hexdump (9, ptr
, size
, 0);
1620 PRIV (image_offset
) += size
;
1624 /* Write byte to section image. */
1627 image_write_b (bfd
* abfd
, unsigned int value
)
1629 unsigned char data
[1];
1631 vms_debug2 ((6, "image_write_b (%02x)\n", (int) value
));
1635 return image_write (abfd
, data
, sizeof (data
));
1638 /* Write 2-byte word to image. */
1641 image_write_w (bfd
* abfd
, unsigned int value
)
1643 unsigned char data
[2];
1645 vms_debug2 ((6, "image_write_w (%04x)\n", (int) value
));
1647 bfd_putl16 (value
, data
);
1648 return image_write (abfd
, data
, sizeof (data
));
1651 /* Write 4-byte long to image. */
1654 image_write_l (bfd
* abfd
, unsigned long value
)
1656 unsigned char data
[4];
1658 vms_debug2 ((6, "image_write_l (%08lx)\n", value
));
1660 bfd_putl32 (value
, data
);
1661 return image_write (abfd
, data
, sizeof (data
));
1664 /* Write 8-byte quad to image. */
1667 image_write_q (bfd
* abfd
, bfd_vma value
)
1669 unsigned char data
[8];
1671 vms_debug2 ((6, "image_write_q (%08lx)\n", (unsigned long)value
));
1673 bfd_putl64 (value
, data
);
1674 return image_write (abfd
, data
, sizeof (data
));
1678 _bfd_vms_etir_name (int cmd
)
1682 case ETIR__C_STA_GBL
: return "ETIR__C_STA_GBL";
1683 case ETIR__C_STA_LW
: return "ETIR__C_STA_LW";
1684 case ETIR__C_STA_QW
: return "ETIR__C_STA_QW";
1685 case ETIR__C_STA_PQ
: return "ETIR__C_STA_PQ";
1686 case ETIR__C_STA_LI
: return "ETIR__C_STA_LI";
1687 case ETIR__C_STA_MOD
: return "ETIR__C_STA_MOD";
1688 case ETIR__C_STA_CKARG
: return "ETIR__C_STA_CKARG";
1689 case ETIR__C_STO_B
: return "ETIR__C_STO_B";
1690 case ETIR__C_STO_W
: return "ETIR__C_STO_W";
1691 case ETIR__C_STO_GBL
: return "ETIR__C_STO_GBL";
1692 case ETIR__C_STO_CA
: return "ETIR__C_STO_CA";
1693 case ETIR__C_STO_RB
: return "ETIR__C_STO_RB";
1694 case ETIR__C_STO_AB
: return "ETIR__C_STO_AB";
1695 case ETIR__C_STO_OFF
: return "ETIR__C_STO_OFF";
1696 case ETIR__C_STO_IMM
: return "ETIR__C_STO_IMM";
1697 case ETIR__C_STO_IMMR
: return "ETIR__C_STO_IMMR";
1698 case ETIR__C_STO_LW
: return "ETIR__C_STO_LW";
1699 case ETIR__C_STO_QW
: return "ETIR__C_STO_QW";
1700 case ETIR__C_STO_GBL_LW
: return "ETIR__C_STO_GBL_LW";
1701 case ETIR__C_STO_LP_PSB
: return "ETIR__C_STO_LP_PSB";
1702 case ETIR__C_STO_HINT_GBL
: return "ETIR__C_STO_HINT_GBL";
1703 case ETIR__C_STO_HINT_PS
: return "ETIR__C_STO_HINT_PS";
1704 case ETIR__C_OPR_ADD
: return "ETIR__C_OPR_ADD";
1705 case ETIR__C_OPR_SUB
: return "ETIR__C_OPR_SUB";
1706 case ETIR__C_OPR_INSV
: return "ETIR__C_OPR_INSV";
1707 case ETIR__C_OPR_USH
: return "ETIR__C_OPR_USH";
1708 case ETIR__C_OPR_ROT
: return "ETIR__C_OPR_ROT";
1709 case ETIR__C_OPR_REDEF
: return "ETIR__C_OPR_REDEF";
1710 case ETIR__C_OPR_DFLIT
: return "ETIR__C_OPR_DFLIT";
1711 case ETIR__C_STC_LP
: return "ETIR__C_STC_LP";
1712 case ETIR__C_STC_GBL
: return "ETIR__C_STC_GBL";
1713 case ETIR__C_STC_GCA
: return "ETIR__C_STC_GCA";
1714 case ETIR__C_STC_PS
: return "ETIR__C_STC_PS";
1715 case ETIR__C_STC_NBH_PS
: return "ETIR__C_STC_NBH_PS";
1716 case ETIR__C_STC_NOP_GBL
: return "ETIR__C_STC_NOP_GBL";
1717 case ETIR__C_STC_NOP_PS
: return "ETIR__C_STC_NOP_PS";
1718 case ETIR__C_STC_BSR_GBL
: return "ETIR__C_STC_BSR_GBL";
1719 case ETIR__C_STC_BSR_PS
: return "ETIR__C_STC_BSR_PS";
1720 case ETIR__C_STC_LDA_GBL
: return "ETIR__C_STC_LDA_GBL";
1721 case ETIR__C_STC_LDA_PS
: return "ETIR__C_STC_LDA_PS";
1722 case ETIR__C_STC_BOH_GBL
: return "ETIR__C_STC_BOH_GBL";
1723 case ETIR__C_STC_BOH_PS
: return "ETIR__C_STC_BOH_PS";
1724 case ETIR__C_STC_NBH_GBL
: return "ETIR__C_STC_NBH_GBL";
1725 case ETIR__C_STC_LP_PSB
: return "ETIR__C_STC_LP_PSB";
1726 case ETIR__C_CTL_SETRB
: return "ETIR__C_CTL_SETRB";
1727 case ETIR__C_CTL_AUGRB
: return "ETIR__C_CTL_AUGRB";
1728 case ETIR__C_CTL_DFLOC
: return "ETIR__C_CTL_DFLOC";
1729 case ETIR__C_CTL_STLOC
: return "ETIR__C_CTL_STLOC";
1730 case ETIR__C_CTL_STKDL
: return "ETIR__C_CTL_STKDL";
1733 /* These names have not yet been added to this switch statement. */
1734 _bfd_error_handler (_("unknown ETIR command %d"), cmd
);
1739 #define HIGHBIT(op) ((op & 0x80000000L) == 0x80000000L)
1742 _bfd_vms_get_value (bfd
*abfd
,
1743 const unsigned char *ascic
,
1744 const unsigned char *max_ascic
,
1745 struct bfd_link_info
*info
,
1747 struct alpha_vms_link_hash_entry
**hp
)
1752 struct alpha_vms_link_hash_entry
*h
;
1754 /* Not linking. Do not try to resolve the symbol. */
1763 if (ascic
+ len
>= max_ascic
)
1765 _bfd_error_handler (_("corrupt vms value"));
1771 for (i
= 0; i
< len
; i
++)
1772 name
[i
] = ascic
[i
+ 1];
1775 h
= (struct alpha_vms_link_hash_entry
*)
1776 bfd_link_hash_lookup (info
->hash
, name
, FALSE
, FALSE
, TRUE
);
1781 && (h
->root
.type
== bfd_link_hash_defined
1782 || h
->root
.type
== bfd_link_hash_defweak
))
1783 *vma
= h
->root
.u
.def
.value
1784 + h
->root
.u
.def
.section
->output_offset
1785 + h
->root
.u
.def
.section
->output_section
->vma
;
1786 else if (h
&& h
->root
.type
== bfd_link_hash_undefweak
)
1790 (*info
->callbacks
->undefined_symbol
)
1791 (info
, name
, abfd
, PRIV (image_section
), PRIV (image_offset
), TRUE
);
1798 #define RELC_SHR_BASE 0x10000
1799 #define RELC_SEC_BASE 0x20000
1800 #define RELC_MASK 0x0ffff
1803 alpha_vms_sym_to_ctxt (struct alpha_vms_link_hash_entry
*h
)
1805 /* Handle undefined symbols. */
1806 if (h
== NULL
|| h
->sym
== NULL
)
1809 if (h
->sym
->typ
== EGSD__C_SYMG
)
1811 if (h
->sym
->flags
& EGSY__V_REL
)
1812 return RELC_SHR_BASE
+ PRIV2 (h
->sym
->owner
, shr_index
);
1815 /* Can this happen (non-relocatable symg) ? I'd like to see
1820 if (h
->sym
->typ
== EGSD__C_SYM
)
1822 if (h
->sym
->flags
& EGSY__V_REL
)
1831 alpha_vms_get_sym_value (asection
*sect
, bfd_vma addr
)
1833 return sect
->output_section
->vma
+ sect
->output_offset
+ addr
;
1837 alpha_vms_fix_sec_rel (bfd
*abfd
, struct bfd_link_info
*info
,
1838 unsigned int rel
, bfd_vma vma
)
1842 if (PRIV (sections
) == NULL
)
1845 sec
= PRIV (sections
)[rel
& RELC_MASK
];
1849 if (sec
->output_section
== NULL
)
1851 return vma
+ sec
->output_section
->vma
+ sec
->output_offset
;
1854 return vma
+ sec
->vma
;
1857 /* Read an ETIR record from ABFD. If INFO is not null, put the content into
1858 the output section (used during linking).
1859 Return FALSE in case of error. */
1862 _bfd_vms_slurp_etir (bfd
*abfd
, struct bfd_link_info
*info
)
1865 unsigned int length
;
1866 unsigned char *maxptr
;
1869 unsigned int rel1
= RELC_NONE
;
1870 unsigned int rel2
= RELC_NONE
;
1871 struct alpha_vms_link_hash_entry
*h
;
1873 PRIV (recrd
.rec
) += ETIR__C_HEADER_SIZE
;
1874 PRIV (recrd
.rec_size
) -= ETIR__C_HEADER_SIZE
;
1876 ptr
= PRIV (recrd
.rec
);
1877 length
= PRIV (recrd
.rec_size
);
1878 maxptr
= ptr
+ length
;
1880 vms_debug2 ((2, "ETIR: %d bytes\n", length
));
1882 while (ptr
< maxptr
)
1884 int cmd
, cmd_length
;
1886 if (ptr
+ 4 > maxptr
)
1889 cmd
= bfd_getl16 (ptr
);
1890 cmd_length
= bfd_getl16 (ptr
+ 2);
1892 /* PR 21589 and 21579: Check for a corrupt ETIR record. */
1893 if (cmd_length
< 4 || ptr
+ cmd_length
> maxptr
)
1896 _bfd_error_handler (_("corrupt ETIR record encountered"));
1897 bfd_set_error (bfd_error_bad_value
);
1903 _bfd_vms_debug (4, "etir: %s(%d)\n",
1904 _bfd_vms_etir_name (cmd
), cmd
);
1905 _bfd_hexdump (8, ptr
, cmd_length
- 4, 0);
1913 stack 32 bit value of symbol (high bits set to 0). */
1914 case ETIR__C_STA_GBL
:
1915 _bfd_vms_get_value (abfd
, ptr
, maxptr
, info
, &op1
, &h
);
1916 if (!_bfd_vms_push (abfd
, op1
, alpha_vms_sym_to_ctxt (h
)))
1923 stack 32 bit value, sign extend to 64 bit. */
1924 case ETIR__C_STA_LW
:
1925 if (ptr
+ 4 > maxptr
)
1927 if (!_bfd_vms_push (abfd
, bfd_getl32 (ptr
), RELC_NONE
))
1934 stack 64 bit value of symbol. */
1935 case ETIR__C_STA_QW
:
1936 if (ptr
+ 8 > maxptr
)
1938 if (!_bfd_vms_push (abfd
, bfd_getl64 (ptr
), RELC_NONE
))
1942 /* Stack psect base plus quadword offset
1943 arg: lw section index
1944 qw signed quadword offset (low 32 bits)
1946 Stack qw argument and section index
1947 (see ETIR__C_STO_OFF, ETIR__C_CTL_SETRB). */
1948 case ETIR__C_STA_PQ
:
1952 if (ptr
+ 12 > maxptr
)
1954 psect
= bfd_getl32 (ptr
);
1955 if ((unsigned int) psect
>= PRIV (section_count
))
1957 _bfd_error_handler (_("bad section index in %s"),
1958 _bfd_vms_etir_name (cmd
));
1959 bfd_set_error (bfd_error_bad_value
);
1962 op1
= bfd_getl64 (ptr
+ 4);
1963 if (!_bfd_vms_push (abfd
, op1
, psect
| RELC_SEC_BASE
))
1968 case ETIR__C_STA_LI
:
1969 case ETIR__C_STA_MOD
:
1970 case ETIR__C_STA_CKARG
:
1971 _bfd_error_handler (_("unsupported STA cmd %s"),
1972 _bfd_vms_etir_name (cmd
));
1976 /* Store byte: pop stack, write byte
1979 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
1981 if (rel1
!= RELC_NONE
)
1983 image_write_b (abfd
, (unsigned int) op1
& 0xff);
1986 /* Store word: pop stack, write word
1989 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
1991 if (rel1
!= RELC_NONE
)
1993 image_write_w (abfd
, (unsigned int) op1
& 0xffff);
1996 /* Store longword: pop stack, write longword
1998 case ETIR__C_STO_LW
:
1999 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2001 if (rel1
& RELC_SEC_BASE
)
2003 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2006 else if (rel1
& RELC_SHR_BASE
)
2008 if (!alpha_vms_add_fixup_lr (info
, rel1
& RELC_MASK
, op1
))
2012 if (rel1
!= RELC_NONE
)
2014 if (rel1
!= RELC_REL
)
2016 if (!alpha_vms_add_lw_reloc (info
))
2019 image_write_l (abfd
, op1
);
2022 /* Store quadword: pop stack, write quadword
2024 case ETIR__C_STO_QW
:
2025 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2027 if (rel1
& RELC_SEC_BASE
)
2029 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2032 else if (rel1
& RELC_SHR_BASE
)
2034 if (rel1
!= RELC_NONE
)
2036 if (rel1
!= RELC_REL
)
2038 if (!alpha_vms_add_qw_reloc (info
))
2041 image_write_q (abfd
, op1
);
2044 /* Store immediate repeated: pop stack for repeat count
2047 case ETIR__C_STO_IMMR
:
2051 if (ptr
+ 4 > maxptr
)
2053 size
= bfd_getl32 (ptr
);
2054 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2056 if (rel1
!= RELC_NONE
)
2059 image_write (abfd
, ptr
+ 4, size
);
2063 /* Store global: write symbol value
2064 arg: cs global symbol name. */
2065 case ETIR__C_STO_GBL
:
2066 _bfd_vms_get_value (abfd
, ptr
, maxptr
, info
, &op1
, &h
);
2069 if (h
->sym
->typ
== EGSD__C_SYMG
)
2071 if (!alpha_vms_add_fixup_qr (info
, abfd
, h
->sym
->owner
,
2072 h
->sym
->symbol_vector
))
2078 op1
= alpha_vms_get_sym_value (h
->sym
->section
,
2080 if (!alpha_vms_add_qw_reloc (info
))
2084 image_write_q (abfd
, op1
);
2087 /* Store code address: write address of entry point
2088 arg: cs global symbol name (procedure). */
2089 case ETIR__C_STO_CA
:
2090 _bfd_vms_get_value (abfd
, ptr
, maxptr
, info
, &op1
, &h
);
2093 if (h
->sym
->flags
& EGSY__V_NORM
)
2095 /* That's really a procedure. */
2096 if (h
->sym
->typ
== EGSD__C_SYMG
)
2098 if (!alpha_vms_add_fixup_ca (info
, abfd
, h
->sym
->owner
))
2100 op1
= h
->sym
->symbol_vector
;
2104 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
2105 h
->sym
->code_value
);
2106 if (!alpha_vms_add_qw_reloc (info
))
2112 /* Symbol is not a procedure. */
2116 image_write_q (abfd
, op1
);
2119 /* Store offset to psect: pop stack, add low 32 bits to base of psect
2121 case ETIR__C_STO_OFF
:
2122 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2125 if (!(rel1
& RELC_SEC_BASE
))
2128 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2130 image_write_q (abfd
, op1
);
2134 arg: lw count of bytes
2136 case ETIR__C_STO_IMM
:
2140 if (ptr
+ 4 > maxptr
)
2142 size
= bfd_getl32 (ptr
);
2143 image_write (abfd
, ptr
+ 4, size
);
2147 /* This code is 'reserved to digital' according to the openVMS
2148 linker manual, however it is generated by the DEC C compiler
2149 and defined in the include file.
2150 FIXME, since the following is just a guess
2151 store global longword: store 32bit value of symbol
2152 arg: cs symbol name. */
2153 case ETIR__C_STO_GBL_LW
:
2154 _bfd_vms_get_value (abfd
, ptr
, maxptr
, info
, &op1
, &h
);
2158 image_write_l (abfd
, op1
);
2161 case ETIR__C_STO_RB
:
2162 case ETIR__C_STO_AB
:
2163 case ETIR__C_STO_LP_PSB
:
2164 _bfd_error_handler (_("%s: not supported"),
2165 _bfd_vms_etir_name (cmd
));
2168 case ETIR__C_STO_HINT_GBL
:
2169 case ETIR__C_STO_HINT_PS
:
2170 _bfd_error_handler (_("%s: not implemented"),
2171 _bfd_vms_etir_name (cmd
));
2175 /* 200 Store-conditional Linkage Pair
2177 case ETIR__C_STC_LP
:
2179 /* 202 Store-conditional Address at global address
2183 case ETIR__C_STC_GBL
:
2185 /* 203 Store-conditional Code Address at global address
2187 cs procedure name. */
2188 case ETIR__C_STC_GCA
:
2190 /* 204 Store-conditional Address at psect + offset
2194 case ETIR__C_STC_PS
:
2195 _bfd_error_handler (_("%s: not supported"),
2196 _bfd_vms_etir_name (cmd
));
2200 /* 201 Store-conditional Linkage Pair with Procedure Signature
2206 case ETIR__C_STC_LP_PSB
:
2207 _bfd_vms_get_value (abfd
, ptr
+ 4, maxptr
, info
, &op1
, &h
);
2210 if (h
->sym
->typ
== EGSD__C_SYMG
)
2212 if (!alpha_vms_add_fixup_lp (info
, abfd
, h
->sym
->owner
))
2214 op1
= h
->sym
->symbol_vector
;
2219 op1
= alpha_vms_get_sym_value (h
->sym
->code_section
,
2220 h
->sym
->code_value
);
2221 op2
= alpha_vms_get_sym_value (h
->sym
->section
,
2227 /* Undefined symbol. */
2231 image_write_q (abfd
, op1
);
2232 image_write_q (abfd
, op2
);
2235 /* 205 Store-conditional NOP at address of global
2237 case ETIR__C_STC_NOP_GBL
:
2240 /* 207 Store-conditional BSR at global address
2243 case ETIR__C_STC_BSR_GBL
:
2246 /* 209 Store-conditional LDA at global address
2249 case ETIR__C_STC_LDA_GBL
:
2252 /* 211 Store-conditional BSR or Hint at global address
2255 case ETIR__C_STC_BOH_GBL
:
2256 /* Currentl ignored. */
2259 /* 213 Store-conditional NOP,BSR or HINT at global address
2262 case ETIR__C_STC_NBH_GBL
:
2264 /* 206 Store-conditional NOP at pect + offset
2267 case ETIR__C_STC_NOP_PS
:
2269 /* 208 Store-conditional BSR at pect + offset
2272 case ETIR__C_STC_BSR_PS
:
2274 /* 210 Store-conditional LDA at psect + offset
2277 case ETIR__C_STC_LDA_PS
:
2279 /* 212 Store-conditional BSR or Hint at pect + offset
2282 case ETIR__C_STC_BOH_PS
:
2284 /* 214 Store-conditional NOP, BSR or HINT at psect + offset
2286 case ETIR__C_STC_NBH_PS
:
2287 _bfd_error_handler (_("%s: not supported"),
2288 _bfd_vms_etir_name (cmd
));
2292 /* Det relocation base: pop stack, set image location counter
2294 case ETIR__C_CTL_SETRB
:
2295 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2297 if (!(rel1
& RELC_SEC_BASE
))
2299 image_set_ptr (abfd
, op1
, rel1
& RELC_MASK
, info
);
2302 /* Augment relocation base: increment image location counter by offset
2303 arg: lw offset value. */
2304 case ETIR__C_CTL_AUGRB
:
2305 if (ptr
+ 4 > maxptr
)
2307 op1
= bfd_getl32 (ptr
);
2308 image_inc_ptr (abfd
, op1
);
2311 /* Define location: pop index, save location counter under index
2313 case ETIR__C_CTL_DFLOC
:
2314 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2316 if (rel1
!= RELC_NONE
)
2318 if (!dst_define_location (abfd
, op1
))
2322 /* Set location: pop index, restore location counter from index
2324 case ETIR__C_CTL_STLOC
:
2325 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2327 if (rel1
!= RELC_NONE
)
2329 dst_restore_location (abfd
, op1
);
2332 /* Stack defined location: pop index, push location counter from index
2334 case ETIR__C_CTL_STKDL
:
2335 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2337 if (rel1
!= RELC_NONE
)
2339 if (!_bfd_vms_push (abfd
, dst_retrieve_location (abfd
, op1
),
2344 case ETIR__C_OPR_NOP
: /* No-op. */
2347 case ETIR__C_OPR_ADD
: /* Add. */
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_NONE
&& rel2
!= RELC_NONE
)
2355 if (!_bfd_vms_push (abfd
, op1
+ op2
, rel1
))
2359 case ETIR__C_OPR_SUB
: /* Subtract. */
2360 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2361 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2363 if (rel1
== RELC_NONE
&& rel2
!= RELC_NONE
)
2365 else if ((rel1
& RELC_SEC_BASE
) && (rel2
& RELC_SEC_BASE
))
2367 op1
= alpha_vms_fix_sec_rel (abfd
, info
, rel1
, op1
);
2368 op2
= alpha_vms_fix_sec_rel (abfd
, info
, rel2
, op2
);
2371 else if (rel1
!= RELC_NONE
&& rel2
!= RELC_NONE
)
2373 if (!_bfd_vms_push (abfd
, op2
- op1
, rel1
))
2377 case ETIR__C_OPR_MUL
: /* Multiply. */
2378 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2379 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2381 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2383 if (!_bfd_vms_push (abfd
, op1
* op2
, RELC_NONE
))
2387 case ETIR__C_OPR_DIV
: /* Divide. */
2388 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2389 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2391 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2395 if (!_bfd_vms_push (abfd
, 0, RELC_NONE
))
2400 if (!_bfd_vms_push (abfd
, op2
/ op1
, RELC_NONE
))
2405 case ETIR__C_OPR_AND
: /* Logical AND. */
2406 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2407 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2409 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2411 if (!_bfd_vms_push (abfd
, op1
& op2
, RELC_NONE
))
2415 case ETIR__C_OPR_IOR
: /* Logical inclusive OR. */
2416 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2417 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2419 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2421 if (!_bfd_vms_push (abfd
, op1
| op2
, RELC_NONE
))
2425 case ETIR__C_OPR_EOR
: /* Logical exclusive OR. */
2426 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2427 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2429 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2431 if (!_bfd_vms_push (abfd
, op1
^ op2
, RELC_NONE
))
2435 case ETIR__C_OPR_NEG
: /* Negate. */
2436 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2438 if (rel1
!= RELC_NONE
)
2440 if (!_bfd_vms_push (abfd
, -op1
, RELC_NONE
))
2444 case ETIR__C_OPR_COM
: /* Complement. */
2445 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2447 if (rel1
!= RELC_NONE
)
2449 if (!_bfd_vms_push (abfd
, ~op1
, RELC_NONE
))
2453 case ETIR__C_OPR_ASH
: /* Arithmetic shift. */
2454 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2455 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2457 if (rel1
!= RELC_NONE
|| rel2
!= RELC_NONE
)
2460 _bfd_error_handler (_("invalid use of %s with contexts"),
2461 _bfd_vms_etir_name (cmd
));
2464 if ((int)op2
< 0) /* Shift right. */
2466 else /* Shift left. */
2468 if (!_bfd_vms_push (abfd
, op1
, RELC_NONE
)) /* FIXME: sym. */
2472 case ETIR__C_OPR_INSV
: /* Insert field. */
2473 case ETIR__C_OPR_USH
: /* Unsigned shift. */
2474 case ETIR__C_OPR_ROT
: /* Rotate. */
2475 case ETIR__C_OPR_REDEF
: /* Redefine symbol to current location. */
2476 case ETIR__C_OPR_DFLIT
: /* Define a literal. */
2477 _bfd_error_handler (_("%s: not supported"),
2478 _bfd_vms_etir_name (cmd
));
2482 case ETIR__C_OPR_SEL
: /* Select. */
2483 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2487 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
))
2492 if (!_bfd_vms_pop (abfd
, &op1
, &rel1
)
2493 || !_bfd_vms_pop (abfd
, &op2
, &rel2
))
2495 if (!_bfd_vms_push (abfd
, op1
, rel1
))
2501 _bfd_error_handler (_("reserved cmd %d"), cmd
);
2506 ptr
+= cmd_length
- 4;
2512 /* Process EDBG/ETBT record.
2513 Return TRUE on success, FALSE on error */
2516 vms_slurp_debug (bfd
*abfd
)
2518 asection
*section
= PRIV (dst_section
);
2520 if (section
== NULL
)
2522 /* We have no way to find out beforehand how much debug info there
2523 is in an object file, so pick an initial amount and grow it as
2525 flagword flags
= SEC_HAS_CONTENTS
| SEC_DEBUGGING
| SEC_RELOC
2528 section
= bfd_make_section (abfd
, "$DST$");
2531 if (!bfd_set_section_flags (section
, flags
))
2533 PRIV (dst_section
) = section
;
2536 PRIV (image_section
) = section
;
2537 PRIV (image_offset
) = section
->size
;
2539 if (!_bfd_vms_slurp_etir (abfd
, NULL
))
2542 section
->size
= PRIV (image_offset
);
2546 /* Process EDBG record.
2547 Return TRUE on success, FALSE on error. */
2550 _bfd_vms_slurp_edbg (bfd
*abfd
)
2552 vms_debug2 ((2, "EDBG\n"));
2554 abfd
->flags
|= HAS_DEBUG
| HAS_LINENO
;
2556 return vms_slurp_debug (abfd
);
2559 /* Process ETBT record.
2560 Return TRUE on success, FALSE on error. */
2563 _bfd_vms_slurp_etbt (bfd
*abfd
)
2565 vms_debug2 ((2, "ETBT\n"));
2567 abfd
->flags
|= HAS_LINENO
;
2569 return vms_slurp_debug (abfd
);
2572 /* Process EEOM record.
2573 Return TRUE on success, FALSE on error. */
2576 _bfd_vms_slurp_eeom (bfd
*abfd
)
2578 struct vms_eeom
*eeom
= (struct vms_eeom
*) PRIV (recrd
.rec
);
2580 vms_debug2 ((2, "EEOM\n"));
2582 /* PR 21813: Check for an undersized record. */
2583 if (PRIV (recrd
.buf_size
) < sizeof (* eeom
))
2585 _bfd_error_handler (_("corrupt EEOM record - size is too small"));
2586 bfd_set_error (bfd_error_bad_value
);
2590 PRIV (eom_data
).eom_l_total_lps
= bfd_getl32 (eeom
->total_lps
);
2591 PRIV (eom_data
).eom_w_comcod
= bfd_getl16 (eeom
->comcod
);
2592 if (PRIV (eom_data
).eom_w_comcod
> 1)
2594 _bfd_error_handler (_("object module not error-free !"));
2595 bfd_set_error (bfd_error_bad_value
);
2599 PRIV (eom_data
).eom_has_transfer
= FALSE
;
2600 if (PRIV (recrd
.rec_size
) > 10)
2602 PRIV (eom_data
).eom_has_transfer
= TRUE
;
2603 PRIV (eom_data
).eom_b_tfrflg
= eeom
->tfrflg
;
2604 PRIV (eom_data
).eom_l_psindx
= bfd_getl32 (eeom
->psindx
);
2605 PRIV (eom_data
).eom_l_tfradr
= bfd_getl32 (eeom
->tfradr
);
2607 abfd
->start_address
= PRIV (eom_data
).eom_l_tfradr
;
2612 /* Slurp an ordered set of VMS object records. Return FALSE on error. */
2615 _bfd_vms_slurp_object_records (bfd
* abfd
)
2622 vms_debug2 ((7, "reading at %08lx\n", (unsigned long)bfd_tell (abfd
)));
2624 type
= _bfd_vms_get_object_record (abfd
);
2627 vms_debug2 ((2, "next_record failed\n"));
2634 err
= _bfd_vms_slurp_ehdr (abfd
);
2637 err
= _bfd_vms_slurp_eeom (abfd
);
2640 err
= _bfd_vms_slurp_egsd (abfd
);
2643 err
= TRUE
; /* _bfd_vms_slurp_etir (abfd); */
2646 err
= _bfd_vms_slurp_edbg (abfd
);
2649 err
= _bfd_vms_slurp_etbt (abfd
);
2656 vms_debug2 ((2, "slurp type %d failed\n", type
));
2660 while (type
!= EOBJ__C_EEOM
);
2665 /* Initialize private data */
2667 vms_initialize (bfd
* abfd
)
2671 amt
= sizeof (struct vms_private_data_struct
);
2672 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
2673 if (abfd
->tdata
.any
== NULL
)
2676 PRIV (recrd
.file_format
) = FF_UNKNOWN
;
2678 amt
= sizeof (struct stack_struct
) * STACKSIZE
;
2679 PRIV (stack
) = bfd_alloc (abfd
, amt
);
2680 if (PRIV (stack
) == NULL
)
2686 bfd_release (abfd
, abfd
->tdata
.any
);
2687 abfd
->tdata
.any
= NULL
;
2691 /* Free malloc'd memory. */
2694 alpha_vms_free_private (bfd
*abfd
)
2696 struct module
*module
;
2698 free (PRIV (recrd
.buf
));
2699 free (PRIV (sections
));
2701 free (PRIV (dst_ptr_offsets
));
2703 for (module
= PRIV (modules
); module
; module
= module
->next
)
2704 free (module
->file_table
);
2707 /* Check the format for a file being read.
2708 Return a (bfd_target *) if it's an object file or zero if not. */
2711 alpha_vms_object_p (bfd
*abfd
)
2713 void *tdata_save
= abfd
->tdata
.any
;
2714 unsigned int test_len
;
2717 vms_debug2 ((1, "vms_object_p(%p)\n", abfd
));
2719 /* Allocate alpha-vms specific data. */
2720 if (!vms_initialize (abfd
))
2722 abfd
->tdata
.any
= tdata_save
;
2726 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
))
2729 /* The first challenge with VMS is to discover the kind of the file.
2731 Image files (executable or shared images) are stored as a raw
2732 stream of bytes (like on UNIX), but there is no magic number.
2734 Object files are written with RMS (record management service), ie
2735 each records are preceeded by its length (on a word - 2 bytes), and
2736 padded for word-alignment. That would be simple but when files
2737 are transfered to a UNIX filesystem (using ftp), records are lost.
2738 Only the raw content of the records are transfered. Fortunately,
2739 the Alpha Object file format also store the length of the record
2740 in the records. Is that clear ? */
2742 /* Minimum is 6 bytes for objects (2 bytes size, 2 bytes record id,
2743 2 bytes size repeated) and 12 bytes for images (4 bytes major id,
2744 4 bytes minor id, 4 bytes length). */
2746 buf
= _bfd_malloc_and_read (abfd
, test_len
, test_len
);
2749 PRIV (recrd
.buf
) = buf
;
2750 PRIV (recrd
.buf_size
) = test_len
;
2751 PRIV (recrd
.rec
) = buf
;
2753 /* Is it an image? */
2754 if ((bfd_getl32 (buf
) == EIHD__K_MAJORID
)
2755 && (bfd_getl32 (buf
+ 4) == EIHD__K_MINORID
))
2757 unsigned int eisd_offset
, eihs_offset
;
2759 /* Extract the header size. */
2760 PRIV (recrd
.rec_size
) = bfd_getl32 (buf
+ EIHD__L_SIZE
);
2762 /* The header size is 0 for DSF files. */
2763 if (PRIV (recrd
.rec_size
) == 0)
2764 PRIV (recrd
.rec_size
) = sizeof (struct vms_eihd
);
2766 /* PR 21813: Check for a truncated record. */
2767 /* PR 17512: file: 7d7c57c2. */
2768 if (PRIV (recrd
.rec_size
) < sizeof (struct vms_eihd
))
2769 goto err_wrong_format
;
2771 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
))
2774 free (PRIV (recrd
.buf
));
2775 PRIV (recrd
.buf
) = NULL
;
2776 buf
= _bfd_malloc_and_read (abfd
, PRIV (recrd
.rec_size
),
2777 PRIV (recrd
.rec_size
));
2781 PRIV (recrd
.buf
) = buf
;
2782 PRIV (recrd
.buf_size
) = PRIV (recrd
.rec_size
);
2783 PRIV (recrd
.rec
) = buf
;
2785 vms_debug2 ((2, "file type is image\n"));
2787 if (!_bfd_vms_slurp_eihd (abfd
, &eisd_offset
, &eihs_offset
))
2788 goto err_wrong_format
;
2790 if (!_bfd_vms_slurp_eisd (abfd
, eisd_offset
))
2791 goto err_wrong_format
;
2793 /* EIHS is optional. */
2794 if (eihs_offset
!= 0 && !_bfd_vms_slurp_eihs (abfd
, eihs_offset
))
2795 goto err_wrong_format
;
2801 /* Assume it's a module and adjust record pointer if necessary. */
2802 maybe_adjust_record_pointer_for_object (abfd
);
2804 /* But is it really a module? */
2805 if (bfd_getl16 (PRIV (recrd
.rec
)) <= EOBJ__C_MAXRECTYP
2806 && bfd_getl16 (PRIV (recrd
.rec
) + 2) <= EOBJ__C_MAXRECSIZ
)
2808 if (vms_get_remaining_object_record (abfd
, test_len
) <= 0)
2809 goto err_wrong_format
;
2811 vms_debug2 ((2, "file type is module\n"));
2813 type
= bfd_getl16 (PRIV (recrd
.rec
));
2814 if (type
!= EOBJ__C_EMH
|| !_bfd_vms_slurp_ehdr (abfd
))
2815 goto err_wrong_format
;
2817 if (!_bfd_vms_slurp_object_records (abfd
))
2818 goto err_wrong_format
;
2821 goto err_wrong_format
;
2824 /* Set arch_info to alpha. */
2826 if (! bfd_default_set_arch_mach (abfd
, bfd_arch_alpha
, 0))
2827 goto err_wrong_format
;
2829 return alpha_vms_free_private
;
2832 bfd_set_error (bfd_error_wrong_format
);
2835 alpha_vms_free_private (abfd
);
2836 if (abfd
->tdata
.any
!= tdata_save
&& abfd
->tdata
.any
!= NULL
)
2837 bfd_release (abfd
, abfd
->tdata
.any
);
2838 abfd
->tdata
.any
= tdata_save
;
2844 /* Write an EMH/MHD record. */
2847 _bfd_vms_write_emh (bfd
*abfd
)
2849 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2851 _bfd_vms_output_alignment (recwr
, 2);
2854 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2855 _bfd_vms_output_short (recwr
, EMH__C_MHD
);
2856 _bfd_vms_output_short (recwr
, EOBJ__C_STRLVL
);
2857 _bfd_vms_output_long (recwr
, 0);
2858 _bfd_vms_output_long (recwr
, 0);
2859 _bfd_vms_output_long (recwr
, MAX_OUTREC_SIZE
);
2861 /* Create module name from filename. */
2862 if (bfd_get_filename (abfd
) != 0)
2864 char *module
= vms_get_module_name (bfd_get_filename (abfd
), TRUE
);
2865 _bfd_vms_output_counted (recwr
, module
);
2869 _bfd_vms_output_counted (recwr
, "NONAME");
2871 _bfd_vms_output_counted (recwr
, BFD_VERSION_STRING
);
2872 _bfd_vms_output_dump (recwr
, get_vms_time_string (), EMH_DATE_LENGTH
);
2873 _bfd_vms_output_fill (recwr
, 0, EMH_DATE_LENGTH
);
2874 _bfd_vms_output_end (abfd
, recwr
);
2877 /* Write an EMH/LMN record. */
2880 _bfd_vms_write_lmn (bfd
*abfd
, const char *name
)
2883 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2884 unsigned int ver
= BFD_VERSION
/ 10000;
2887 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
2888 _bfd_vms_output_short (recwr
, EMH__C_LNM
);
2889 snprintf (version
, sizeof (version
), "%s %d.%d.%d", name
,
2890 ver
/ 10000, (ver
/ 100) % 100, ver
% 100);
2891 _bfd_vms_output_dump (recwr
, (unsigned char *)version
, strlen (version
));
2892 _bfd_vms_output_end (abfd
, recwr
);
2896 /* Write eom record for bfd abfd. Return FALSE on error. */
2899 _bfd_vms_write_eeom (bfd
*abfd
)
2901 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
2903 vms_debug2 ((2, "vms_write_eeom\n"));
2905 _bfd_vms_output_alignment (recwr
, 2);
2907 _bfd_vms_output_begin (recwr
, EOBJ__C_EEOM
);
2908 _bfd_vms_output_long (recwr
, PRIV (vms_linkage_index
+ 1) >> 1);
2909 _bfd_vms_output_byte (recwr
, 0); /* Completion code. */
2910 _bfd_vms_output_byte (recwr
, 0); /* Fill byte. */
2912 if ((abfd
->flags
& EXEC_P
) == 0
2913 && bfd_get_start_address (abfd
) != (bfd_vma
)-1)
2917 section
= bfd_get_section_by_name (abfd
, ".link");
2920 bfd_set_error (bfd_error_nonrepresentable_section
);
2923 _bfd_vms_output_short (recwr
, 0);
2924 _bfd_vms_output_long (recwr
, (unsigned long) section
->target_index
);
2925 _bfd_vms_output_long (recwr
,
2926 (unsigned long) bfd_get_start_address (abfd
));
2927 _bfd_vms_output_long (recwr
, 0);
2930 _bfd_vms_output_end (abfd
, recwr
);
2935 vector_grow1 (struct vector_type
*vec
, size_t elsz
)
2937 if (vec
->nbr_el
>= vec
->max_el
)
2939 if (vec
->max_el
== 0)
2942 vec
->els
= bfd_malloc (vec
->max_el
* elsz
);
2947 if (vec
->max_el
> -1u / 2)
2949 bfd_set_error (bfd_error_file_too_big
);
2953 if (_bfd_mul_overflow (vec
->max_el
, elsz
, &amt
))
2955 bfd_set_error (bfd_error_file_too_big
);
2958 vec
->els
= bfd_realloc_or_free (vec
->els
, amt
);
2961 if (vec
->els
== NULL
)
2963 return (char *) vec
->els
+ elsz
* vec
->nbr_el
++;
2966 /* Bump ABFD file position to next block. */
2969 alpha_vms_file_position_block (bfd
*abfd
)
2972 PRIV (file_pos
) += VMS_BLOCK_SIZE
- 1;
2973 PRIV (file_pos
) -= (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
2976 /* Convert from internal structure SRC to external structure DST. */
2979 alpha_vms_swap_eisd_out (struct vms_internal_eisd_map
*src
,
2980 struct vms_eisd
*dst
)
2982 bfd_putl32 (src
->u
.eisd
.majorid
, dst
->majorid
);
2983 bfd_putl32 (src
->u
.eisd
.minorid
, dst
->minorid
);
2984 bfd_putl32 (src
->u
.eisd
.eisdsize
, dst
->eisdsize
);
2985 if (src
->u
.eisd
.eisdsize
<= EISD__K_LENEND
)
2987 bfd_putl32 (src
->u
.eisd
.secsize
, dst
->secsize
);
2988 bfd_putl64 (src
->u
.eisd
.virt_addr
, dst
->virt_addr
);
2989 bfd_putl32 (src
->u
.eisd
.flags
, dst
->flags
);
2990 bfd_putl32 (src
->u
.eisd
.vbn
, dst
->vbn
);
2991 dst
->pfc
= src
->u
.eisd
.pfc
;
2992 dst
->matchctl
= src
->u
.eisd
.matchctl
;
2993 dst
->type
= src
->u
.eisd
.type
;
2995 if (src
->u
.eisd
.flags
& EISD__M_GBL
)
2997 bfd_putl32 (src
->u
.gbl_eisd
.ident
, dst
->ident
);
2998 memcpy (dst
->gblnam
, src
->u
.gbl_eisd
.gblnam
,
2999 src
->u
.gbl_eisd
.gblnam
[0] + 1);
3003 /* Append EISD to the list of extra eisd for ABFD. */
3006 alpha_vms_append_extra_eisd (bfd
*abfd
, struct vms_internal_eisd_map
*eisd
)
3009 if (PRIV (gbl_eisd_head
) == NULL
)
3010 PRIV (gbl_eisd_head
) = eisd
;
3012 PRIV (gbl_eisd_tail
)->next
= eisd
;
3013 PRIV (gbl_eisd_tail
) = eisd
;
3016 /* Create an EISD for shared image SHRIMG.
3017 Return FALSE in case of error. */
3020 alpha_vms_create_eisd_for_shared (bfd
*abfd
, bfd
*shrimg
)
3022 struct vms_internal_eisd_map
*eisd
;
3025 namlen
= strlen (PRIV2 (shrimg
, hdr_data
.hdr_t_name
));
3026 if (namlen
+ 5 > EISD__K_GBLNAMLEN
)
3032 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
3036 /* Fill the fields. */
3037 eisd
->u
.gbl_eisd
.common
.majorid
= EISD__K_MAJORID
;
3038 eisd
->u
.gbl_eisd
.common
.minorid
= EISD__K_MINORID
;
3039 eisd
->u
.gbl_eisd
.common
.eisdsize
= (EISD__K_LEN
+ 4 + namlen
+ 5 + 3) & ~3;
3040 eisd
->u
.gbl_eisd
.common
.secsize
= VMS_BLOCK_SIZE
; /* Must not be 0. */
3041 eisd
->u
.gbl_eisd
.common
.virt_addr
= 0;
3042 eisd
->u
.gbl_eisd
.common
.flags
= EISD__M_GBL
;
3043 eisd
->u
.gbl_eisd
.common
.vbn
= 0;
3044 eisd
->u
.gbl_eisd
.common
.pfc
= 0;
3045 eisd
->u
.gbl_eisd
.common
.matchctl
= PRIV2 (shrimg
, matchctl
);
3046 eisd
->u
.gbl_eisd
.common
.type
= EISD__K_SHRPIC
;
3048 eisd
->u
.gbl_eisd
.ident
= PRIV2 (shrimg
, ident
);
3049 eisd
->u
.gbl_eisd
.gblnam
[0] = namlen
+ 4;
3050 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1, PRIV2 (shrimg
, hdr_data
.hdr_t_name
),
3052 memcpy (eisd
->u
.gbl_eisd
.gblnam
+ 1 + namlen
, "_001", 4);
3054 /* Append it to the list. */
3055 alpha_vms_append_extra_eisd (abfd
, eisd
);
3060 /* Create an EISD for section SEC.
3061 Return FALSE in case of failure. */
3064 alpha_vms_create_eisd_for_section (bfd
*abfd
, asection
*sec
)
3066 struct vms_internal_eisd_map
*eisd
;
3068 /* Only for allocating section. */
3069 if (!(sec
->flags
& SEC_ALLOC
))
3072 BFD_ASSERT (vms_section_data (sec
)->eisd
== NULL
);
3073 eisd
= bfd_alloc (abfd
, sizeof (*eisd
));
3076 vms_section_data (sec
)->eisd
= eisd
;
3078 /* Fill the fields. */
3079 eisd
->u
.eisd
.majorid
= EISD__K_MAJORID
;
3080 eisd
->u
.eisd
.minorid
= EISD__K_MINORID
;
3081 eisd
->u
.eisd
.eisdsize
= EISD__K_LEN
;
3082 eisd
->u
.eisd
.secsize
=
3083 (sec
->size
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
3084 eisd
->u
.eisd
.virt_addr
= sec
->vma
;
3085 eisd
->u
.eisd
.flags
= 0;
3086 eisd
->u
.eisd
.vbn
= 0; /* To be later defined. */
3087 eisd
->u
.eisd
.pfc
= 0; /* Default. */
3088 eisd
->u
.eisd
.matchctl
= EISD__K_MATALL
;
3089 eisd
->u
.eisd
.type
= EISD__K_NORMAL
;
3091 if (sec
->flags
& SEC_CODE
)
3092 eisd
->u
.eisd
.flags
|= EISD__M_EXE
;
3093 if (!(sec
->flags
& SEC_READONLY
))
3094 eisd
->u
.eisd
.flags
|= EISD__M_WRT
| EISD__M_CRF
;
3096 /* If relocations or fixup will be applied, make this isect writeable. */
3097 if (sec
->flags
& SEC_RELOC
)
3098 eisd
->u
.eisd
.flags
|= EISD__M_WRT
| EISD__M_CRF
;
3100 if (!(sec
->flags
& SEC_HAS_CONTENTS
))
3102 eisd
->u
.eisd
.flags
|= EISD__M_DZRO
;
3103 eisd
->u
.eisd
.flags
&= ~EISD__M_CRF
;
3105 if (sec
->flags
& SEC_LINKER_CREATED
)
3107 if (strcmp (sec
->name
, "$FIXUP$") == 0)
3108 eisd
->u
.eisd
.flags
|= EISD__M_FIXUPVEC
;
3111 /* Append it to the list. */
3113 if (PRIV (eisd_head
) == NULL
)
3114 PRIV (eisd_head
) = eisd
;
3116 PRIV (eisd_tail
)->next
= eisd
;
3117 PRIV (eisd_tail
) = eisd
;
3122 /* Layout executable ABFD and write it to the disk.
3123 Return FALSE in case of failure. */
3126 alpha_vms_write_exec (bfd
*abfd
)
3128 struct vms_eihd eihd
;
3129 struct vms_eiha
*eiha
;
3130 struct vms_eihi
*eihi
;
3131 struct vms_eihs
*eihs
= NULL
;
3133 struct vms_internal_eisd_map
*first_eisd
;
3134 struct vms_internal_eisd_map
*eisd
;
3137 file_ptr gst_filepos
= 0;
3138 unsigned int lnkflags
= 0;
3140 /* Build the EIHD. */
3141 PRIV (file_pos
) = EIHD__C_LENGTH
;
3143 memset (&eihd
, 0, sizeof (eihd
));
3144 memset (eihd
.fill_2
, 0xff, sizeof (eihd
.fill_2
));
3146 bfd_putl32 (EIHD__K_MAJORID
, eihd
.majorid
);
3147 bfd_putl32 (EIHD__K_MINORID
, eihd
.minorid
);
3149 bfd_putl32 (sizeof (eihd
), eihd
.size
);
3150 bfd_putl32 (0, eihd
.isdoff
);
3151 bfd_putl32 (0, eihd
.activoff
);
3152 bfd_putl32 (0, eihd
.symdbgoff
);
3153 bfd_putl32 (0, eihd
.imgidoff
);
3154 bfd_putl32 (0, eihd
.patchoff
);
3155 bfd_putl64 (0, eihd
.iafva
);
3156 bfd_putl32 (0, eihd
.version_array_off
);
3158 bfd_putl32 (EIHD__K_EXE
, eihd
.imgtype
);
3159 bfd_putl32 (0, eihd
.subtype
);
3161 bfd_putl32 (0, eihd
.imgiocnt
);
3162 bfd_putl32 (-1, eihd
.privreqs
);
3163 bfd_putl32 (-1, eihd
.privreqs
+ 4);
3165 bfd_putl32 ((sizeof (eihd
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
3167 bfd_putl32 (0, eihd
.ident
);
3168 bfd_putl32 (0, eihd
.sysver
);
3171 bfd_putl32 (0, eihd
.symvect_size
);
3172 bfd_putl32 (16, eihd
.virt_mem_block_size
);
3173 bfd_putl32 (0, eihd
.ext_fixup_off
);
3174 bfd_putl32 (0, eihd
.noopt_psect_off
);
3175 bfd_putl32 (-1, eihd
.alias
);
3178 eiha
= (struct vms_eiha
*)((char *) &eihd
+ PRIV (file_pos
));
3179 bfd_putl32 (PRIV (file_pos
), eihd
.activoff
);
3180 PRIV (file_pos
) += sizeof (struct vms_eiha
);
3182 bfd_putl32 (sizeof (struct vms_eiha
), eiha
->size
);
3183 bfd_putl32 (0, eiha
->spare
);
3184 bfd_putl64 (PRIV (transfer_address
[0]), eiha
->tfradr1
);
3185 bfd_putl64 (PRIV (transfer_address
[1]), eiha
->tfradr2
);
3186 bfd_putl64 (PRIV (transfer_address
[2]), eiha
->tfradr3
);
3187 bfd_putl64 (PRIV (transfer_address
[3]), eiha
->tfradr4
);
3188 bfd_putl64 (0, eiha
->inishr
);
3191 eihi
= (struct vms_eihi
*)((char *) &eihd
+ PRIV (file_pos
));
3192 bfd_putl32 (PRIV (file_pos
), eihd
.imgidoff
);
3193 PRIV (file_pos
) += sizeof (struct vms_eihi
);
3195 bfd_putl32 (EIHI__K_MAJORID
, eihi
->majorid
);
3196 bfd_putl32 (EIHI__K_MINORID
, eihi
->minorid
);
3201 /* Set module name. */
3202 module
= vms_get_module_name (bfd_get_filename (abfd
), TRUE
);
3203 len
= strlen (module
);
3204 if (len
> sizeof (eihi
->imgnam
) - 1)
3205 len
= sizeof (eihi
->imgnam
) - 1;
3206 eihi
->imgnam
[0] = len
;
3207 memcpy (eihi
->imgnam
+ 1, module
, len
);
3215 vms_get_time (&hi
, &lo
);
3216 bfd_putl32 (lo
, eihi
->linktime
+ 0);
3217 bfd_putl32 (hi
, eihi
->linktime
+ 4);
3220 eihi
->linkid
[0] = 0;
3221 eihi
->imgbid
[0] = 0;
3224 dst
= PRIV (dst_section
);
3225 dmt
= bfd_get_section_by_name (abfd
, "$DMT$");
3226 if (dst
!= NULL
&& dst
->size
!= 0)
3228 eihs
= (struct vms_eihs
*)((char *) &eihd
+ PRIV (file_pos
));
3229 bfd_putl32 (PRIV (file_pos
), eihd
.symdbgoff
);
3230 PRIV (file_pos
) += sizeof (struct vms_eihs
);
3232 bfd_putl32 (EIHS__K_MAJORID
, eihs
->majorid
);
3233 bfd_putl32 (EIHS__K_MINORID
, eihs
->minorid
);
3234 bfd_putl32 (0, eihs
->dstvbn
);
3235 bfd_putl32 (0, eihs
->dstsize
);
3236 bfd_putl32 (0, eihs
->gstvbn
);
3237 bfd_putl32 (0, eihs
->gstsize
);
3238 bfd_putl32 (0, eihs
->dmtvbn
);
3239 bfd_putl32 (0, eihs
->dmtsize
);
3242 /* One EISD per section. */
3243 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3245 if (!alpha_vms_create_eisd_for_section (abfd
, sec
))
3249 /* Merge section EIDS which extra ones. */
3250 if (PRIV (eisd_tail
))
3251 PRIV (eisd_tail
)->next
= PRIV (gbl_eisd_head
);
3253 PRIV (eisd_head
) = PRIV (gbl_eisd_head
);
3254 if (PRIV (gbl_eisd_tail
))
3255 PRIV (eisd_tail
) = PRIV (gbl_eisd_tail
);
3257 first_eisd
= PRIV (eisd_head
);
3259 /* Add end of eisd. */
3262 eisd
= bfd_zalloc (abfd
, sizeof (*eisd
));
3265 eisd
->u
.eisd
.majorid
= 0;
3266 eisd
->u
.eisd
.minorid
= 0;
3267 eisd
->u
.eisd
.eisdsize
= 0;
3268 alpha_vms_append_extra_eisd (abfd
, eisd
);
3271 /* Place EISD in the file. */
3272 for (eisd
= first_eisd
; eisd
; eisd
= eisd
->next
)
3274 file_ptr room
= VMS_BLOCK_SIZE
- (PRIV (file_pos
) % VMS_BLOCK_SIZE
);
3276 /* First block is a little bit special: there is a word at the end. */
3277 if (PRIV (file_pos
) < VMS_BLOCK_SIZE
&& room
> 2)
3279 if (room
< eisd
->u
.eisd
.eisdsize
+ EISD__K_LENEND
)
3280 alpha_vms_file_position_block (abfd
);
3282 eisd
->file_pos
= PRIV (file_pos
);
3283 PRIV (file_pos
) += eisd
->u
.eisd
.eisdsize
;
3285 if (eisd
->u
.eisd
.flags
& EISD__M_FIXUPVEC
)
3286 bfd_putl64 (eisd
->u
.eisd
.virt_addr
, eihd
.iafva
);
3289 if (first_eisd
!= NULL
)
3291 bfd_putl32 (first_eisd
->file_pos
, eihd
.isdoff
);
3292 /* Real size of end of eisd marker. */
3293 PRIV (file_pos
) += EISD__K_LENEND
;
3296 bfd_putl32 (PRIV (file_pos
), eihd
.size
);
3297 bfd_putl32 ((PRIV (file_pos
) + VMS_BLOCK_SIZE
- 1) / VMS_BLOCK_SIZE
,
3300 /* Place sections. */
3301 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3303 if (!(sec
->flags
& SEC_HAS_CONTENTS
))
3306 eisd
= vms_section_data (sec
)->eisd
;
3308 /* Align on a block. */
3309 alpha_vms_file_position_block (abfd
);
3310 sec
->filepos
= PRIV (file_pos
);
3313 eisd
->u
.eisd
.vbn
= (sec
->filepos
/ VMS_BLOCK_SIZE
) + 1;
3315 PRIV (file_pos
) += sec
->size
;
3319 if (eihs
!= NULL
&& dst
!= NULL
)
3321 bfd_putl32 ((dst
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dstvbn
);
3322 bfd_putl32 (dst
->size
, eihs
->dstsize
);
3326 lnkflags
|= EIHD__M_DBGDMT
;
3327 bfd_putl32 ((dmt
->filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->dmtvbn
);
3328 bfd_putl32 (dmt
->size
, eihs
->dmtsize
);
3330 if (PRIV (gsd_sym_count
) != 0)
3332 alpha_vms_file_position_block (abfd
);
3333 gst_filepos
= PRIV (file_pos
);
3334 bfd_putl32 ((gst_filepos
/ VMS_BLOCK_SIZE
) + 1, eihs
->gstvbn
);
3335 bfd_putl32 ((PRIV (gsd_sym_count
) + 4) / 5 + 4, eihs
->gstsize
);
3339 /* Write EISD in hdr. */
3340 for (eisd
= first_eisd
; eisd
&& eisd
->file_pos
< VMS_BLOCK_SIZE
;
3342 alpha_vms_swap_eisd_out
3343 (eisd
, (struct vms_eisd
*)((char *)&eihd
+ eisd
->file_pos
));
3345 /* Write first block. */
3346 bfd_putl32 (lnkflags
, eihd
.lnkflags
);
3347 if (bfd_bwrite (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
3350 /* Write remaining eisd. */
3353 unsigned char blk
[VMS_BLOCK_SIZE
];
3354 struct vms_internal_eisd_map
*next_eisd
;
3356 memset (blk
, 0xff, sizeof (blk
));
3357 while (eisd
!= NULL
)
3359 alpha_vms_swap_eisd_out
3361 (struct vms_eisd
*)(blk
+ (eisd
->file_pos
% VMS_BLOCK_SIZE
)));
3363 next_eisd
= eisd
->next
;
3364 if (next_eisd
== NULL
3365 || (next_eisd
->file_pos
/ VMS_BLOCK_SIZE
3366 != eisd
->file_pos
/ VMS_BLOCK_SIZE
))
3368 if (bfd_bwrite (blk
, sizeof (blk
), abfd
) != sizeof (blk
))
3371 memset (blk
, 0xff, sizeof (blk
));
3377 /* Write sections. */
3378 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
3380 unsigned char blk
[VMS_BLOCK_SIZE
];
3383 if (sec
->size
== 0 || !(sec
->flags
& SEC_HAS_CONTENTS
))
3385 if (bfd_bwrite (sec
->contents
, sec
->size
, abfd
) != sec
->size
)
3389 len
= VMS_BLOCK_SIZE
- sec
->size
% VMS_BLOCK_SIZE
;
3390 if (len
!= VMS_BLOCK_SIZE
)
3392 memset (blk
, 0, len
);
3393 if (bfd_bwrite (blk
, len
, abfd
) != len
)
3399 if (gst_filepos
!= 0)
3401 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3404 _bfd_vms_write_emh (abfd
);
3405 _bfd_vms_write_lmn (abfd
, "GNU LD");
3407 /* PSC for the absolute section. */
3408 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3409 _bfd_vms_output_long (recwr
, 0);
3410 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3411 _bfd_vms_output_short (recwr
, 0);
3412 _bfd_vms_output_short (recwr
, EGPS__V_PIC
| EGPS__V_LIB
| EGPS__V_RD
);
3413 _bfd_vms_output_long (recwr
, 0);
3414 _bfd_vms_output_counted (recwr
, ".$$ABS$$.");
3415 _bfd_vms_output_end_subrec (recwr
);
3416 _bfd_vms_output_end (abfd
, recwr
);
3418 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
3420 struct vms_symbol_entry
*sym
= PRIV (syms
)[i
];
3426 _bfd_vms_output_alignment (recwr
, 8);
3427 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3428 _bfd_vms_output_long (recwr
, 0);
3430 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_SYMG
);
3431 _bfd_vms_output_short (recwr
, 0); /* Data type, alignment. */
3432 _bfd_vms_output_short (recwr
, sym
->flags
);
3434 if (sym
->code_section
)
3435 ep
= alpha_vms_get_sym_value (sym
->code_section
, sym
->code_value
);
3438 BFD_ASSERT (sym
->code_value
== 0);
3441 val
= alpha_vms_get_sym_value (sym
->section
, sym
->value
);
3442 _bfd_vms_output_quad
3443 (recwr
, sym
->typ
== EGSD__C_SYMG
? sym
->symbol_vector
: val
);
3444 _bfd_vms_output_quad (recwr
, ep
);
3445 _bfd_vms_output_quad (recwr
, val
);
3446 _bfd_vms_output_long (recwr
, 0);
3447 _bfd_vms_output_counted (recwr
, sym
->name
);
3448 _bfd_vms_output_end_subrec (recwr
);
3450 _bfd_vms_output_end (abfd
, recwr
);
3453 _bfd_vms_output_end (abfd
, recwr
);
3455 if (!_bfd_vms_write_eeom (abfd
))
3463 /* Write section and symbol directory of bfd abfd. Return FALSE on error. */
3466 _bfd_vms_write_egsd (bfd
*abfd
)
3470 unsigned int symnum
;
3472 flagword new_flags
, old_flags
;
3473 int abs_section_index
= -1;
3474 unsigned int target_index
= 0;
3475 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3477 vms_debug2 ((2, "vms_write_egsd\n"));
3479 /* Egsd is quadword aligned. */
3480 _bfd_vms_output_alignment (recwr
, 8);
3482 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3483 _bfd_vms_output_long (recwr
, 0);
3485 /* Number sections. */
3486 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
3488 if (section
->flags
& SEC_DEBUGGING
)
3490 if (!strcmp (section
->name
, ".vmsdebug"))
3492 section
->flags
|= SEC_DEBUGGING
;
3495 section
->target_index
= target_index
++;
3498 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
3500 vms_debug2 ((3, "Section #%d %s, %d bytes\n",
3501 section
->target_index
, section
->name
, (int)section
->size
));
3503 /* Don't write out the VMS debug info section since it is in the
3504 ETBT and EDBG sections in etir. */
3505 if (section
->flags
& SEC_DEBUGGING
)
3508 /* 13 bytes egsd, max 31 chars name -> should be 44 bytes. */
3509 if (_bfd_vms_output_check (recwr
, 64) < 0)
3511 _bfd_vms_output_end (abfd
, recwr
);
3512 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3513 _bfd_vms_output_long (recwr
, 0);
3516 /* Don't know if this is necessary for the linker but for now it keeps
3517 vms_slurp_gsd happy. */
3518 sname
= section
->name
;
3521 /* Remove leading dot. */
3523 if ((*sname
== 't') && (strcmp (sname
, "text") == 0))
3524 sname
= EVAX_CODE_NAME
;
3525 else if ((*sname
== 'd') && (strcmp (sname
, "data") == 0))
3526 sname
= EVAX_DATA_NAME
;
3527 else if ((*sname
== 'b') && (strcmp (sname
, "bss") == 0))
3528 sname
= EVAX_BSS_NAME
;
3529 else if ((*sname
== 'l') && (strcmp (sname
, "link") == 0))
3530 sname
= EVAX_LINK_NAME
;
3531 else if ((*sname
== 'r') && (strcmp (sname
, "rdata") == 0))
3532 sname
= EVAX_READONLY_NAME
;
3533 else if ((*sname
== 'l') && (strcmp (sname
, "literal") == 0))
3534 sname
= EVAX_LITERAL_NAME
;
3535 else if ((*sname
== 'l') && (strcmp (sname
, "literals") == 0))
3536 sname
= EVAX_LITERALS_NAME
;
3537 else if ((*sname
== 'c') && (strcmp (sname
, "comm") == 0))
3538 sname
= EVAX_COMMON_NAME
;
3539 else if ((*sname
== 'l') && (strcmp (sname
, "lcomm") == 0))
3540 sname
= EVAX_LOCAL_NAME
;
3543 if (bfd_is_com_section (section
))
3544 new_flags
= (EGPS__V_OVR
| EGPS__V_REL
| EGPS__V_GBL
| EGPS__V_RD
3545 | EGPS__V_WRT
| EGPS__V_NOMOD
| EGPS__V_COM
);
3547 new_flags
= vms_esecflag_by_name (evax_section_flags
, sname
,
3550 /* Modify them as directed. */
3551 if (section
->flags
& SEC_READONLY
)
3552 new_flags
&= ~EGPS__V_WRT
;
3554 new_flags
&= ~vms_section_data (section
)->no_flags
;
3555 new_flags
|= vms_section_data (section
)->flags
;
3557 vms_debug2 ((3, "sec flags %x\n", section
->flags
));
3558 vms_debug2 ((3, "new_flags %x, _raw_size %lu\n",
3559 new_flags
, (unsigned long)section
->size
));
3561 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3562 _bfd_vms_output_short (recwr
, section
->alignment_power
& 0xff);
3563 _bfd_vms_output_short (recwr
, new_flags
);
3564 _bfd_vms_output_long (recwr
, (unsigned long) section
->size
);
3565 _bfd_vms_output_counted (recwr
, sname
);
3566 _bfd_vms_output_end_subrec (recwr
);
3568 /* If the section is an obsolute one, remind its index as it will be
3569 used later for absolute symbols. */
3570 if ((new_flags
& EGPS__V_REL
) == 0 && abs_section_index
< 0)
3571 abs_section_index
= section
->target_index
;
3574 /* Output symbols. */
3575 vms_debug2 ((3, "%d symbols found\n", abfd
->symcount
));
3577 bfd_set_start_address (abfd
, (bfd_vma
) -1);
3579 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3581 symbol
= abfd
->outsymbols
[symnum
];
3582 old_flags
= symbol
->flags
;
3584 /* Work-around a missing feature: consider __main as the main entry
3586 if (symbol
->name
[0] == '_' && strcmp (symbol
->name
, "__main") == 0)
3587 bfd_set_start_address (abfd
, (bfd_vma
)symbol
->value
);
3589 /* Only put in the GSD the global and the undefined symbols. */
3590 if (old_flags
& BSF_FILE
)
3593 if ((old_flags
& BSF_GLOBAL
) == 0 && !bfd_is_und_section (symbol
->section
))
3595 /* If the LIB$INITIIALIZE section is present, add a reference to
3596 LIB$INITIALIZE symbol. FIXME: this should be done explicitely
3597 in the assembly file. */
3598 if (!((old_flags
& BSF_SECTION_SYM
) != 0
3599 && strcmp (symbol
->section
->name
, "LIB$INITIALIZE") == 0))
3603 /* 13 bytes egsd, max 64 chars name -> should be 77 bytes. Add 16 more
3604 bytes for a possible ABS section. */
3605 if (_bfd_vms_output_check (recwr
, 80 + 16) < 0)
3607 _bfd_vms_output_end (abfd
, recwr
);
3608 _bfd_vms_output_begin (recwr
, EOBJ__C_EGSD
);
3609 _bfd_vms_output_long (recwr
, 0);
3612 if ((old_flags
& BSF_GLOBAL
) != 0
3613 && bfd_is_abs_section (symbol
->section
)
3614 && abs_section_index
<= 0)
3616 /* Create an absolute section if none was defined. It is highly
3617 unlikely that the name $ABS$ clashes with a user defined
3618 non-absolute section name. */
3619 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_PSC
);
3620 _bfd_vms_output_short (recwr
, 4);
3621 _bfd_vms_output_short (recwr
, EGPS__V_SHR
);
3622 _bfd_vms_output_long (recwr
, 0);
3623 _bfd_vms_output_counted (recwr
, "$ABS$");
3624 _bfd_vms_output_end_subrec (recwr
);
3626 abs_section_index
= target_index
++;
3629 _bfd_vms_output_begin_subrec (recwr
, EGSD__C_SYM
);
3631 /* Data type, alignment. */
3632 _bfd_vms_output_short (recwr
, 0);
3636 if (old_flags
& BSF_WEAK
)
3637 new_flags
|= EGSY__V_WEAK
;
3638 if (bfd_is_com_section (symbol
->section
)) /* .comm */
3639 new_flags
|= (EGSY__V_WEAK
| EGSY__V_COMM
);
3641 if (old_flags
& BSF_FUNCTION
)
3643 new_flags
|= EGSY__V_NORM
;
3644 new_flags
|= EGSY__V_REL
;
3646 if (old_flags
& BSF_GLOBAL
)
3648 new_flags
|= EGSY__V_DEF
;
3649 if (!bfd_is_abs_section (symbol
->section
))
3650 new_flags
|= EGSY__V_REL
;
3652 _bfd_vms_output_short (recwr
, new_flags
);
3654 if (old_flags
& BSF_GLOBAL
)
3656 /* Symbol definition. */
3657 bfd_vma code_address
= 0;
3658 unsigned long ca_psindx
= 0;
3659 unsigned long psindx
;
3661 if ((old_flags
& BSF_FUNCTION
) && symbol
->udata
.p
!= NULL
)
3666 ((struct evax_private_udata_struct
*)symbol
->udata
.p
)->enbsym
;
3667 code_address
= sym
->value
;
3668 ca_psindx
= sym
->section
->target_index
;
3670 if (bfd_is_abs_section (symbol
->section
))
3671 psindx
= abs_section_index
;
3673 psindx
= symbol
->section
->target_index
;
3675 _bfd_vms_output_quad (recwr
, symbol
->value
);
3676 _bfd_vms_output_quad (recwr
, code_address
);
3677 _bfd_vms_output_long (recwr
, ca_psindx
);
3678 _bfd_vms_output_long (recwr
, psindx
);
3680 _bfd_vms_output_counted (recwr
, symbol
->name
);
3682 _bfd_vms_output_end_subrec (recwr
);
3685 _bfd_vms_output_alignment (recwr
, 8);
3686 _bfd_vms_output_end (abfd
, recwr
);
3691 /* Write object header for bfd abfd. Return FALSE on error. */
3694 _bfd_vms_write_ehdr (bfd
*abfd
)
3697 unsigned int symnum
;
3698 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3700 vms_debug2 ((2, "vms_write_ehdr (%p)\n", abfd
));
3702 _bfd_vms_output_alignment (recwr
, 2);
3704 _bfd_vms_write_emh (abfd
);
3705 _bfd_vms_write_lmn (abfd
, "GNU AS");
3708 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3709 _bfd_vms_output_short (recwr
, EMH__C_SRC
);
3711 for (symnum
= 0; symnum
< abfd
->symcount
; symnum
++)
3713 symbol
= abfd
->outsymbols
[symnum
];
3715 if (symbol
->flags
& BSF_FILE
)
3717 _bfd_vms_output_dump (recwr
, (unsigned char *) symbol
->name
,
3718 (int) strlen (symbol
->name
));
3723 if (symnum
== abfd
->symcount
)
3724 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("noname"));
3726 _bfd_vms_output_end (abfd
, recwr
);
3729 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3730 _bfd_vms_output_short (recwr
, EMH__C_TTL
);
3731 _bfd_vms_output_dump (recwr
, (unsigned char *) STRING_COMMA_LEN ("TTL"));
3732 _bfd_vms_output_end (abfd
, recwr
);
3735 _bfd_vms_output_begin (recwr
, EOBJ__C_EMH
);
3736 _bfd_vms_output_short (recwr
, EMH__C_CPR
);
3737 _bfd_vms_output_dump (recwr
,
3738 (unsigned char *)"GNU BFD ported by Klaus Kämpf 1994-1996",
3740 _bfd_vms_output_end (abfd
, recwr
);
3745 /* Part 4.6, relocations. */
3748 /* WRITE ETIR SECTION
3750 This is still under construction and therefore not documented. */
3752 /* Close the etir/etbt record. */
3755 end_etir_record (bfd
* abfd
)
3757 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3759 _bfd_vms_output_end (abfd
, recwr
);
3763 start_etir_or_etbt_record (bfd
*abfd
, asection
*section
, bfd_vma offset
)
3765 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3767 if (section
->flags
& SEC_DEBUGGING
)
3769 _bfd_vms_output_begin (recwr
, EOBJ__C_ETBT
);
3773 /* Push start offset. */
3774 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
3775 _bfd_vms_output_long (recwr
, (unsigned long) 0);
3776 _bfd_vms_output_end_subrec (recwr
);
3779 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_DFLOC
);
3780 _bfd_vms_output_end_subrec (recwr
);
3785 _bfd_vms_output_begin (recwr
, EOBJ__C_ETIR
);
3789 /* Push start offset. */
3790 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
3791 _bfd_vms_output_long (recwr
, (unsigned long) section
->target_index
);
3792 _bfd_vms_output_quad (recwr
, offset
);
3793 _bfd_vms_output_end_subrec (recwr
);
3795 /* Start = pop (). */
3796 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_CTL_SETRB
);
3797 _bfd_vms_output_end_subrec (recwr
);
3802 /* Output a STO_IMM command for SSIZE bytes of data from CPR at virtual
3803 address VADDR in section specified by SEC_INDEX and NAME. */
3806 sto_imm (bfd
*abfd
, asection
*section
,
3807 bfd_size_type ssize
, unsigned char *cptr
, bfd_vma vaddr
)
3810 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3813 _bfd_vms_debug (8, "sto_imm %d bytes\n", (int) ssize
);
3814 _bfd_hexdump (9, cptr
, (int) ssize
, (int) vaddr
);
3819 /* Try all the rest. */
3822 if (_bfd_vms_output_check (recwr
, size
) < 0)
3824 /* Doesn't fit, split ! */
3825 end_etir_record (abfd
);
3827 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3829 size
= _bfd_vms_output_check (recwr
, 0); /* get max size */
3830 if (size
> ssize
) /* more than what's left ? */
3834 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_IMM
);
3835 _bfd_vms_output_long (recwr
, (unsigned long) (size
));
3836 _bfd_vms_output_dump (recwr
, cptr
, size
);
3837 _bfd_vms_output_end_subrec (recwr
);
3840 _bfd_vms_debug (10, "dumped %d bytes\n", (int) size
);
3841 _bfd_hexdump (10, cptr
, (int) size
, (int) vaddr
);
3851 etir_output_check (bfd
*abfd
, asection
*section
, bfd_vma vaddr
, int checklen
)
3853 if (_bfd_vms_output_check (&PRIV (recwr
), checklen
) < 0)
3855 /* Not enough room in this record. Close it and open a new one. */
3856 end_etir_record (abfd
);
3857 start_etir_or_etbt_record (abfd
, section
, vaddr
);
3861 /* Return whether RELOC must be deferred till the end. */
3864 defer_reloc_p (arelent
*reloc
)
3866 switch (reloc
->howto
->type
)
3879 /* Write section contents for bfd abfd. Return FALSE on error. */
3882 _bfd_vms_write_etir (bfd
* abfd
, int objtype ATTRIBUTE_UNUSED
)
3885 struct vms_rec_wr
*recwr
= &PRIV (recwr
);
3887 vms_debug2 ((2, "vms_write_tir (%p, %d)\n", abfd
, objtype
));
3889 _bfd_vms_output_alignment (recwr
, 4);
3891 PRIV (vms_linkage_index
) = 0;
3893 for (section
= abfd
->sections
; section
; section
= section
->next
)
3895 vms_debug2 ((4, "writing %d. section '%s' (%d bytes)\n",
3896 section
->target_index
, section
->name
, (int) (section
->size
)));
3898 if (!(section
->flags
& SEC_HAS_CONTENTS
)
3899 || bfd_is_com_section (section
))
3902 if (!section
->contents
)
3904 bfd_set_error (bfd_error_no_contents
);
3908 start_etir_or_etbt_record (abfd
, section
, 0);
3910 if (section
->flags
& SEC_RELOC
)
3912 bfd_vma curr_addr
= 0;
3913 unsigned char *curr_data
= section
->contents
;
3915 int pass2_needed
= 0;
3916 int pass2_in_progress
= 0;
3919 if (section
->reloc_count
== 0)
3921 (_("SEC_RELOC with no relocs in section %pA"), section
);
3926 int i
= section
->reloc_count
;
3927 arelent
**rptr
= section
->orelocation
;
3928 _bfd_vms_debug (4, "%d relocations:\n", i
);
3931 _bfd_vms_debug (4, "sym %s in sec %s, value %08lx, "
3932 "addr %08lx, off %08lx, len %d: %s\n",
3933 (*(*rptr
)->sym_ptr_ptr
)->name
,
3934 (*(*rptr
)->sym_ptr_ptr
)->section
->name
,
3935 (long) (*(*rptr
)->sym_ptr_ptr
)->value
,
3936 (unsigned long)(*rptr
)->address
,
3937 (unsigned long)(*rptr
)->addend
,
3938 bfd_get_reloc_size ((*rptr
)->howto
),
3939 ( *rptr
)->howto
->name
);
3946 for (irel
= 0; irel
< section
->reloc_count
; irel
++)
3948 struct evax_private_udata_struct
*udata
;
3949 arelent
*rptr
= section
->orelocation
[irel
];
3950 bfd_vma addr
= rptr
->address
;
3951 asymbol
*sym
= *rptr
->sym_ptr_ptr
;
3952 asection
*sec
= sym
->section
;
3953 bfd_boolean defer
= defer_reloc_p (rptr
);
3956 if (pass2_in_progress
)
3958 /* Non-deferred relocs have already been output. */
3964 /* Deferred relocs must be output at the very end. */
3971 /* Regular relocs are intertwined with binary data. */
3972 if (curr_addr
> addr
)
3973 _bfd_error_handler (_("size error in section %pA"),
3975 size
= addr
- curr_addr
;
3976 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
3981 size
= bfd_get_reloc_size (rptr
->howto
);
3983 switch (rptr
->howto
->type
)
3985 case ALPHA_R_IGNORE
:
3988 case ALPHA_R_REFLONG
:
3989 if (bfd_is_und_section (sym
->section
))
3991 bfd_vma addend
= rptr
->addend
;
3992 slen
= strlen ((char *) sym
->name
);
3993 etir_output_check (abfd
, section
, curr_addr
, slen
);
3996 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
3997 _bfd_vms_output_counted (recwr
, sym
->name
);
3998 _bfd_vms_output_end_subrec (recwr
);
3999 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
4000 _bfd_vms_output_long (recwr
, (unsigned long) addend
);
4001 _bfd_vms_output_end_subrec (recwr
);
4002 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
4003 _bfd_vms_output_end_subrec (recwr
);
4004 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4005 _bfd_vms_output_end_subrec (recwr
);
4009 _bfd_vms_output_begin_subrec
4010 (recwr
, ETIR__C_STO_GBL_LW
);
4011 _bfd_vms_output_counted (recwr
, sym
->name
);
4012 _bfd_vms_output_end_subrec (recwr
);
4015 else if (bfd_is_abs_section (sym
->section
))
4017 etir_output_check (abfd
, section
, curr_addr
, 16);
4018 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_LW
);
4019 _bfd_vms_output_long (recwr
, (unsigned long) sym
->value
);
4020 _bfd_vms_output_end_subrec (recwr
);
4021 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4022 _bfd_vms_output_end_subrec (recwr
);
4026 etir_output_check (abfd
, section
, curr_addr
, 32);
4027 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
4028 _bfd_vms_output_long (recwr
,
4029 (unsigned long) sec
->target_index
);
4030 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
4031 _bfd_vms_output_end_subrec (recwr
);
4032 /* ??? Table B-8 of the OpenVMS Linker Utilily Manual
4033 says that we should have a ETIR__C_STO_OFF here.
4034 But the relocation would not be BFD_RELOC_32 then.
4035 This case is very likely unreachable. */
4036 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_LW
);
4037 _bfd_vms_output_end_subrec (recwr
);
4041 case ALPHA_R_REFQUAD
:
4042 if (bfd_is_und_section (sym
->section
))
4044 bfd_vma addend
= rptr
->addend
;
4045 slen
= strlen ((char *) sym
->name
);
4046 etir_output_check (abfd
, section
, curr_addr
, slen
);
4049 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_GBL
);
4050 _bfd_vms_output_counted (recwr
, sym
->name
);
4051 _bfd_vms_output_end_subrec (recwr
);
4052 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
4053 _bfd_vms_output_quad (recwr
, addend
);
4054 _bfd_vms_output_end_subrec (recwr
);
4055 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_OPR_ADD
);
4056 _bfd_vms_output_end_subrec (recwr
);
4057 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
4058 _bfd_vms_output_end_subrec (recwr
);
4062 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_GBL
);
4063 _bfd_vms_output_counted (recwr
, sym
->name
);
4064 _bfd_vms_output_end_subrec (recwr
);
4067 else if (bfd_is_abs_section (sym
->section
))
4069 etir_output_check (abfd
, section
, curr_addr
, 16);
4070 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_QW
);
4071 _bfd_vms_output_quad (recwr
, sym
->value
);
4072 _bfd_vms_output_end_subrec (recwr
);
4073 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_QW
);
4074 _bfd_vms_output_end_subrec (recwr
);
4078 etir_output_check (abfd
, section
, curr_addr
, 32);
4079 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STA_PQ
);
4080 _bfd_vms_output_long (recwr
,
4081 (unsigned long) sec
->target_index
);
4082 _bfd_vms_output_quad (recwr
, rptr
->addend
+ sym
->value
);
4083 _bfd_vms_output_end_subrec (recwr
);
4084 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_OFF
);
4085 _bfd_vms_output_end_subrec (recwr
);
4090 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
4093 case ALPHA_R_LINKAGE
:
4095 etir_output_check (abfd
, section
, curr_addr
, 64);
4096 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LP_PSB
);
4097 _bfd_vms_output_long
4098 (recwr
, (unsigned long) rptr
->addend
);
4099 if (rptr
->addend
> PRIV (vms_linkage_index
))
4100 PRIV (vms_linkage_index
) = rptr
->addend
;
4101 _bfd_vms_output_counted (recwr
, sym
->name
);
4102 _bfd_vms_output_byte (recwr
, 0);
4103 _bfd_vms_output_end_subrec (recwr
);
4106 case ALPHA_R_CODEADDR
:
4107 slen
= strlen ((char *) sym
->name
);
4108 etir_output_check (abfd
, section
, curr_addr
, slen
);
4109 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STO_CA
);
4110 _bfd_vms_output_counted (recwr
, sym
->name
);
4111 _bfd_vms_output_end_subrec (recwr
);
4116 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4117 etir_output_check (abfd
, section
, curr_addr
,
4118 32 + 1 + strlen (udata
->origname
));
4119 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_NOP_GBL
);
4120 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
4121 _bfd_vms_output_long
4122 (recwr
, (unsigned long) section
->target_index
);
4123 _bfd_vms_output_quad (recwr
, rptr
->address
);
4124 _bfd_vms_output_long (recwr
, (unsigned long) 0x47ff041f);
4125 _bfd_vms_output_long
4126 (recwr
, (unsigned long) section
->target_index
);
4127 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4128 _bfd_vms_output_counted (recwr
, udata
->origname
);
4129 _bfd_vms_output_end_subrec (recwr
);
4133 _bfd_error_handler (_("spurious ALPHA_R_BSR reloc"));
4138 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4139 etir_output_check (abfd
, section
, curr_addr
,
4140 32 + 1 + strlen (udata
->origname
));
4141 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_LDA_GBL
);
4142 _bfd_vms_output_long
4143 (recwr
, (unsigned long) udata
->lkindex
+ 1);
4144 _bfd_vms_output_long
4145 (recwr
, (unsigned long) section
->target_index
);
4146 _bfd_vms_output_quad (recwr
, rptr
->address
);
4147 _bfd_vms_output_long (recwr
, (unsigned long) 0x237B0000);
4148 _bfd_vms_output_long
4149 (recwr
, (unsigned long) udata
->bsym
->section
->target_index
);
4150 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4151 _bfd_vms_output_counted (recwr
, udata
->origname
);
4152 _bfd_vms_output_end_subrec (recwr
);
4157 = (struct evax_private_udata_struct
*) rptr
->sym_ptr_ptr
;
4158 etir_output_check (abfd
, section
, curr_addr
,
4159 32 + 1 + strlen (udata
->origname
));
4160 _bfd_vms_output_begin_subrec (recwr
, ETIR__C_STC_BOH_GBL
);
4161 _bfd_vms_output_long (recwr
, (unsigned long) udata
->lkindex
);
4162 _bfd_vms_output_long
4163 (recwr
, (unsigned long) section
->target_index
);
4164 _bfd_vms_output_quad (recwr
, rptr
->address
);
4165 _bfd_vms_output_long (recwr
, (unsigned long) 0xD3400000);
4166 _bfd_vms_output_long
4167 (recwr
, (unsigned long) section
->target_index
);
4168 _bfd_vms_output_quad (recwr
, rptr
->addend
);
4169 _bfd_vms_output_counted (recwr
, udata
->origname
);
4170 _bfd_vms_output_end_subrec (recwr
);
4174 _bfd_error_handler (_("unhandled relocation %s"),
4181 } /* End of relocs loop. */
4183 if (!pass2_in_progress
)
4185 /* Output rest of section. */
4186 if (curr_addr
> section
->size
)
4188 _bfd_error_handler (_("size error in section %pA"), section
);
4191 size
= section
->size
- curr_addr
;
4192 sto_imm (abfd
, section
, size
, curr_data
, curr_addr
);
4198 pass2_in_progress
= 1;
4204 else /* (section->flags & SEC_RELOC) */
4205 sto_imm (abfd
, section
, section
->size
, section
->contents
, 0);
4207 end_etir_record (abfd
);
4210 _bfd_vms_output_alignment (recwr
, 2);
4214 /* Write cached information into a file being written, at bfd_close. */
4217 alpha_vms_write_object_contents (bfd
*abfd
)
4219 vms_debug2 ((1, "vms_write_object_contents (%p)\n", abfd
));
4221 if (abfd
->flags
& (EXEC_P
| DYNAMIC
))
4223 return alpha_vms_write_exec (abfd
);
4227 if (abfd
->section_count
> 0) /* we have sections */
4229 if (!_bfd_vms_write_ehdr (abfd
))
4231 if (!_bfd_vms_write_egsd (abfd
))
4233 if (!_bfd_vms_write_etir (abfd
, EOBJ__C_ETIR
))
4235 if (!_bfd_vms_write_eeom (abfd
))
4242 /* Debug stuff: nearest line. */
4244 #define SET_MODULE_PARSED(m) \
4245 do { if ((m)->name == NULL) (m)->name = ""; } while (0)
4246 #define IS_MODULE_PARSED(m) ((m)->name != NULL)
4248 /* Build a new module for the specified BFD. */
4250 static struct module
*
4251 new_module (bfd
*abfd
)
4253 struct module
*module
4254 = (struct module
*) bfd_zalloc (abfd
, sizeof (struct module
));
4255 module
->file_table_count
= 16; /* Arbitrary. */
4257 = bfd_malloc (module
->file_table_count
* sizeof (struct fileinfo
));
4261 /* Parse debug info for a module and internalize it. */
4264 parse_module (bfd
*abfd
, struct module
*module
, unsigned char *ptr
,
4267 unsigned char *maxptr
= ptr
+ length
;
4268 unsigned char *src_ptr
, *pcl_ptr
;
4269 unsigned int prev_linum
= 0, curr_linenum
= 0;
4270 bfd_vma prev_pc
= 0, curr_pc
= 0;
4271 struct srecinfo
*curr_srec
, *srec
;
4272 struct lineinfo
*curr_line
, *line
;
4273 struct funcinfo
*funcinfo
;
4275 /* Initialize tables with zero element. */
4276 curr_srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4277 module
->srec_table
= curr_srec
;
4279 curr_line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4280 module
->line_table
= curr_line
;
4282 while (length
== -1 || ptr
< maxptr
)
4284 /* The first byte is not counted in the recorded length. */
4285 int rec_length
= bfd_getl16 (ptr
) + 1;
4286 int rec_type
= bfd_getl16 (ptr
+ 2);
4288 vms_debug2 ((2, "DST record: leng %d, type %d\n", rec_length
, rec_type
));
4290 if (length
== -1 && rec_type
== DST__K_MODEND
)
4297 = _bfd_vms_save_counted_string (abfd
, ptr
+ DST_S_B_MODBEG_NAME
,
4298 maxptr
- (ptr
+ DST_S_B_MODBEG_NAME
));
4305 vms_debug2 ((3, "module: %s\n", module
->name
));
4312 funcinfo
= (struct funcinfo
*)
4313 bfd_zalloc (abfd
, sizeof (struct funcinfo
));
4315 = _bfd_vms_save_counted_string (abfd
, ptr
+ DST_S_B_RTNBEG_NAME
,
4316 maxptr
- (ptr
+ DST_S_B_RTNBEG_NAME
));
4317 funcinfo
->low
= bfd_getl32 (ptr
+ DST_S_L_RTNBEG_ADDRESS
);
4318 funcinfo
->next
= module
->func_table
;
4319 module
->func_table
= funcinfo
;
4321 vms_debug2 ((3, "routine: %s at 0x%lx\n",
4322 funcinfo
->name
, (unsigned long) funcinfo
->low
));
4326 module
->func_table
->high
= module
->func_table
->low
4327 + bfd_getl32 (ptr
+ DST_S_L_RTNEND_SIZE
) - 1;
4329 if (module
->func_table
->high
> module
->high
)
4330 module
->high
= module
->func_table
->high
;
4332 vms_debug2 ((3, "end routine\n"));
4336 vms_debug2 ((3, "prologue\n"));
4340 vms_debug2 ((3, "epilog\n"));
4344 vms_debug2 ((3, "block\n"));
4348 vms_debug2 ((3, "end block\n"));
4352 src_ptr
= ptr
+ DST_S_C_SOURCE_HEADER_SIZE
;
4354 vms_debug2 ((3, "source info\n"));
4356 while (src_ptr
< ptr
+ rec_length
)
4358 int cmd
= src_ptr
[0], cmd_length
, data
;
4362 case DST__K_SRC_DECLFILE
:
4365 = bfd_getl16 (src_ptr
+ DST_S_W_SRC_DF_FILEID
);
4366 char *filename
= _bfd_vms_save_counted_string
4368 src_ptr
+ DST_S_B_SRC_DF_FILENAME
,
4369 ptr
+ rec_length
- (src_ptr
+ DST_S_B_SRC_DF_FILENAME
));
4371 while (fileid
>= module
->file_table_count
)
4373 module
->file_table_count
*= 2;
4375 = bfd_realloc_or_free (module
->file_table
,
4376 module
->file_table_count
4377 * sizeof (struct fileinfo
));
4378 if (module
->file_table
== NULL
)
4382 module
->file_table
[fileid
].name
= filename
;
4383 module
->file_table
[fileid
].srec
= 1;
4384 cmd_length
= src_ptr
[DST_S_B_SRC_DF_LENGTH
] + 2;
4385 vms_debug2 ((4, "DST_S_C_SRC_DECLFILE: %d, %s\n",
4386 fileid
, module
->file_table
[fileid
].name
));
4390 case DST__K_SRC_DEFLINES_B
:
4391 /* Perform the association and set the next higher index
4393 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4394 srec
= (struct srecinfo
*)
4395 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4396 srec
->line
= curr_srec
->line
+ data
;
4397 srec
->srec
= curr_srec
->srec
+ data
;
4398 srec
->sfile
= curr_srec
->sfile
;
4399 curr_srec
->next
= srec
;
4402 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_B: %d\n", data
));
4405 case DST__K_SRC_DEFLINES_W
:
4406 /* Perform the association and set the next higher index
4408 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4409 srec
= (struct srecinfo
*)
4410 bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4411 srec
->line
= curr_srec
->line
+ data
;
4412 srec
->srec
= curr_srec
->srec
+ data
,
4413 srec
->sfile
= curr_srec
->sfile
;
4414 curr_srec
->next
= srec
;
4417 vms_debug2 ((4, "DST_S_C_SRC_DEFLINES_W: %d\n", data
));
4420 case DST__K_SRC_INCRLNUM_B
:
4421 data
= src_ptr
[DST_S_B_SRC_UNSBYTE
];
4422 curr_srec
->line
+= data
;
4424 vms_debug2 ((4, "DST_S_C_SRC_INCRLNUM_B: %d\n", data
));
4427 case DST__K_SRC_SETFILE
:
4428 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4429 curr_srec
->sfile
= data
;
4430 curr_srec
->srec
= module
->file_table
[data
].srec
;
4432 vms_debug2 ((4, "DST_S_C_SRC_SETFILE: %d\n", data
));
4435 case DST__K_SRC_SETLNUM_L
:
4436 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4437 curr_srec
->line
= data
;
4439 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_L: %d\n", data
));
4442 case DST__K_SRC_SETLNUM_W
:
4443 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4444 curr_srec
->line
= data
;
4446 vms_debug2 ((4, "DST_S_C_SRC_SETLNUM_W: %d\n", data
));
4449 case DST__K_SRC_SETREC_L
:
4450 data
= bfd_getl32 (src_ptr
+ DST_S_L_SRC_UNSLONG
);
4451 curr_srec
->srec
= data
;
4452 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4454 vms_debug2 ((4, "DST_S_C_SRC_SETREC_L: %d\n", data
));
4457 case DST__K_SRC_SETREC_W
:
4458 data
= bfd_getl16 (src_ptr
+ DST_S_W_SRC_UNSWORD
);
4459 curr_srec
->srec
= data
;
4460 module
->file_table
[curr_srec
->sfile
].srec
= data
;
4462 vms_debug2 ((4, "DST_S_C_SRC_SETREC_W: %d\n", data
));
4465 case DST__K_SRC_FORMFEED
:
4467 vms_debug2 ((4, "DST_S_C_SRC_FORMFEED\n"));
4471 _bfd_error_handler (_("unknown source command %d"),
4477 src_ptr
+= cmd_length
;
4481 case DST__K_LINE_NUM
:
4482 pcl_ptr
= ptr
+ DST_S_C_LINE_NUM_HEADER_SIZE
;
4484 vms_debug2 ((3, "line info\n"));
4486 while (pcl_ptr
< ptr
+ rec_length
)
4488 /* The command byte is signed so we must sign-extend it. */
4489 int cmd
= ((signed char *)pcl_ptr
)[0], cmd_length
, data
;
4493 case DST__K_DELTA_PC_W
:
4494 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4498 vms_debug2 ((4, "DST__K_DELTA_PC_W: %d\n", data
));
4501 case DST__K_DELTA_PC_L
:
4502 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4506 vms_debug2 ((4, "DST__K_DELTA_PC_L: %d\n", data
));
4509 case DST__K_INCR_LINUM
:
4510 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4511 curr_linenum
+= data
;
4513 vms_debug2 ((4, "DST__K_INCR_LINUM: %d\n", data
));
4516 case DST__K_INCR_LINUM_W
:
4517 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4518 curr_linenum
+= data
;
4520 vms_debug2 ((4, "DST__K_INCR_LINUM_W: %d\n", data
));
4523 case DST__K_INCR_LINUM_L
:
4524 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4525 curr_linenum
+= data
;
4527 vms_debug2 ((4, "DST__K_INCR_LINUM_L: %d\n", data
));
4530 case DST__K_SET_LINUM_INCR
:
4532 (_("%s not implemented"), "DST__K_SET_LINUM_INCR");
4536 case DST__K_SET_LINUM_INCR_W
:
4538 (_("%s not implemented"), "DST__K_SET_LINUM_INCR_W");
4542 case DST__K_RESET_LINUM_INCR
:
4544 (_("%s not implemented"), "DST__K_RESET_LINUM_INCR");
4548 case DST__K_BEG_STMT_MODE
:
4550 (_("%s not implemented"), "DST__K_BEG_STMT_MODE");
4554 case DST__K_END_STMT_MODE
:
4556 (_("%s not implemented"), "DST__K_END_STMT_MODE");
4560 case DST__K_SET_LINUM_B
:
4561 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4562 curr_linenum
= data
;
4564 vms_debug2 ((4, "DST__K_SET_LINUM_B: %d\n", data
));
4567 case DST__K_SET_LINUM
:
4568 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4569 curr_linenum
= data
;
4571 vms_debug2 ((4, "DST__K_SET_LINE_NUM: %d\n", data
));
4574 case DST__K_SET_LINUM_L
:
4575 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4576 curr_linenum
= data
;
4578 vms_debug2 ((4, "DST__K_SET_LINUM_L: %d\n", data
));
4583 (_("%s not implemented"), "DST__K_SET_PC");
4587 case DST__K_SET_PC_W
:
4589 (_("%s not implemented"), "DST__K_SET_PC_W");
4593 case DST__K_SET_PC_L
:
4595 (_("%s not implemented"), "DST__K_SET_PC_L");
4599 case DST__K_SET_STMTNUM
:
4601 (_("%s not implemented"), "DST__K_SET_STMTNUM");
4606 data
= pcl_ptr
[DST_S_B_PCLINE_UNSBYTE
];
4609 vms_debug2 ((4, "DST__K_TERM: %d\n", data
));
4613 data
= bfd_getl16 (pcl_ptr
+ DST_S_W_PCLINE_UNSWORD
);
4616 vms_debug2 ((4, "DST__K_TERM_W: %d\n", data
));
4620 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4623 vms_debug2 ((4, "DST__K_TERM_L: %d\n", data
));
4626 case DST__K_SET_ABS_PC
:
4627 data
= bfd_getl32 (pcl_ptr
+ DST_S_L_PCLINE_UNSLONG
);
4630 vms_debug2 ((4, "DST__K_SET_ABS_PC: 0x%x\n", data
));
4639 vms_debug2 ((4, "bump pc to 0x%lx and line to %d\n",
4640 (unsigned long)curr_pc
, curr_linenum
));
4644 _bfd_error_handler (_("unknown line command %d"), cmd
);
4650 if ((curr_linenum
!= prev_linum
&& curr_pc
!= prev_pc
)
4652 || cmd
== DST__K_DELTA_PC_L
4653 || cmd
== DST__K_DELTA_PC_W
)
4655 line
= (struct lineinfo
*)
4656 bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4657 line
->address
= curr_pc
;
4658 line
->line
= curr_linenum
;
4660 curr_line
->next
= line
;
4663 prev_linum
= curr_linenum
;
4665 vms_debug2 ((4, "-> correlate pc 0x%lx with line %d\n",
4666 (unsigned long)curr_pc
, curr_linenum
));
4669 pcl_ptr
+= cmd_length
;
4673 case 0x17: /* Undocumented type used by DEC C to declare equates. */
4674 vms_debug2 ((3, "undocumented type 0x17\n"));
4678 vms_debug2 ((3, "ignoring record\n"));
4686 /* Finalize tables with EOL marker. */
4687 srec
= (struct srecinfo
*) bfd_zalloc (abfd
, sizeof (struct srecinfo
));
4688 srec
->line
= (unsigned int) -1;
4689 srec
->srec
= (unsigned int) -1;
4690 curr_srec
->next
= srec
;
4692 line
= (struct lineinfo
*) bfd_zalloc (abfd
, sizeof (struct lineinfo
));
4693 line
->line
= (unsigned int) -1;
4694 line
->address
= (bfd_vma
) -1;
4695 curr_line
->next
= line
;
4697 /* Advertise that this module has been parsed. This is needed
4698 because parsing can be either performed at module creation
4699 or deferred until debug info is consumed. */
4700 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 if (!parse_module (abfd
, module
, PRIV (dst_section
)->contents
, -1))
4787 /* Calculate and return the name of the source file and the line nearest
4788 to the wanted location in the specified module. */
4791 module_find_nearest_line (bfd
*abfd
, struct module
*module
, bfd_vma addr
,
4792 const char **file
, const char **func
,
4795 struct funcinfo
*funcinfo
;
4796 struct lineinfo
*lineinfo
;
4797 struct srecinfo
*srecinfo
;
4798 bfd_boolean ret
= FALSE
;
4800 /* Parse this module if that was not done at module creation. */
4801 if (! IS_MODULE_PARSED (module
))
4803 unsigned int size
= module
->size
;
4804 unsigned int modbeg
= PRIV (dst_section
)->filepos
+ module
->modbeg
;
4805 unsigned char *buffer
;
4807 if (bfd_seek (abfd
, modbeg
, SEEK_SET
) != 0
4808 || (buffer
= _bfd_malloc_and_read (abfd
, size
, size
)) == NULL
)
4810 bfd_set_error (bfd_error_no_debug_section
);
4814 ret
= parse_module (abfd
, module
, buffer
, size
);
4820 /* Find out the function (if any) that contains the address. */
4821 for (funcinfo
= module
->func_table
; funcinfo
; funcinfo
= funcinfo
->next
)
4822 if (addr
>= funcinfo
->low
&& addr
<= funcinfo
->high
)
4824 *func
= funcinfo
->name
;
4829 /* Find out the source file and the line nearest to the address. */
4830 for (lineinfo
= module
->line_table
; lineinfo
; lineinfo
= lineinfo
->next
)
4831 if (lineinfo
->next
&& addr
< lineinfo
->next
->address
)
4833 for (srecinfo
= module
->srec_table
; srecinfo
; srecinfo
= srecinfo
->next
)
4834 if (srecinfo
->next
&& lineinfo
->line
< srecinfo
->next
->line
)
4836 if (srecinfo
->sfile
> 0)
4838 *file
= module
->file_table
[srecinfo
->sfile
].name
;
4839 *line
= srecinfo
->srec
+ lineinfo
->line
- srecinfo
->line
;
4843 *file
= module
->name
;
4844 *line
= lineinfo
->line
;
4855 /* Provided a BFD, a section and an offset into the section, calculate and
4856 return the name of the source file and the line nearest to the wanted
4860 _bfd_vms_find_nearest_line (bfd
*abfd
,
4861 asymbol
**symbols ATTRIBUTE_UNUSED
,
4867 unsigned int *discriminator
)
4869 struct module
*module
;
4871 /* What address are we looking for? */
4872 bfd_vma addr
= section
->vma
+ offset
;
4880 /* We can't do anything if there is no DST (debug symbol table). */
4881 if (PRIV (dst_section
) == NULL
)
4884 /* Create the module list - if not already done. */
4885 if (PRIV (modules
) == NULL
)
4887 PRIV (modules
) = build_module_list (abfd
);
4888 if (PRIV (modules
) == NULL
)
4892 for (module
= PRIV (modules
); module
; module
= module
->next
)
4893 if (addr
>= module
->low
&& addr
<= module
->high
)
4894 return module_find_nearest_line (abfd
, module
, addr
, file
, func
, line
);
4899 /* Canonicalizations. */
4900 /* Set name, value, section and flags of SYM from E. */
4903 alpha_vms_convert_symbol (bfd
*abfd
, struct vms_symbol_entry
*e
, asymbol
*sym
)
4912 flags
= BSF_NO_FLAGS
;
4918 if (e
->flags
& EGSY__V_WEAK
)
4921 if (e
->flags
& EGSY__V_DEF
)
4923 /* Symbol definition. */
4924 flags
|= BSF_GLOBAL
;
4925 if (e
->flags
& EGSY__V_NORM
)
4926 flags
|= BSF_FUNCTION
;
4932 /* Symbol reference. */
4933 sec
= bfd_und_section_ptr
;
4938 /* A universal symbol is by definition global... */
4939 flags
|= BSF_GLOBAL
;
4941 /* ...and dynamic in shared libraries. */
4942 if (abfd
->flags
& DYNAMIC
)
4943 flags
|= BSF_DYNAMIC
;
4945 if (e
->flags
& EGSY__V_WEAK
)
4948 if (!(e
->flags
& EGSY__V_DEF
))
4951 if (e
->flags
& EGSY__V_NORM
)
4952 flags
|= BSF_FUNCTION
;
4955 /* sec = e->section; */
4956 sec
= bfd_abs_section_ptr
;
4971 /* Return the number of bytes required to store a vector of pointers
4972 to asymbols for all the symbols in the BFD abfd, including a
4973 terminal NULL pointer. If there are no symbols in the BFD,
4974 then return 0. If an error occurs, return -1. */
4977 alpha_vms_get_symtab_upper_bound (bfd
*abfd
)
4979 vms_debug2 ((1, "alpha_vms_get_symtab_upper_bound (%p), %d symbols\n",
4980 abfd
, PRIV (gsd_sym_count
)));
4982 return (PRIV (gsd_sym_count
) + 1) * sizeof (asymbol
*);
4985 /* Read the symbols from the BFD abfd, and fills in the vector
4986 location with pointers to the symbols and a trailing NULL.
4988 Return number of symbols read. */
4991 alpha_vms_canonicalize_symtab (bfd
*abfd
, asymbol
**symbols
)
4995 vms_debug2 ((1, "alpha_vms_canonicalize_symtab (%p, <ret>)\n", abfd
));
4997 if (PRIV (csymbols
) == NULL
)
4999 PRIV (csymbols
) = (asymbol
**) bfd_alloc
5000 (abfd
, PRIV (gsd_sym_count
) * sizeof (asymbol
*));
5002 /* Traverse table and fill symbols vector. */
5003 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5005 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
5008 sym
= bfd_make_empty_symbol (abfd
);
5009 if (sym
== NULL
|| !alpha_vms_convert_symbol (abfd
, e
, sym
))
5011 bfd_release (abfd
, PRIV (csymbols
));
5012 PRIV (csymbols
) = NULL
;
5016 PRIV (csymbols
)[i
] = sym
;
5020 if (symbols
!= NULL
)
5022 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5023 symbols
[i
] = PRIV (csymbols
)[i
];
5027 return PRIV (gsd_sym_count
);
5030 /* Read and convert relocations from ETIR. We do it once for all sections. */
5033 alpha_vms_slurp_relocs (bfd
*abfd
)
5037 vms_debug2 ((3, "alpha_vms_slurp_relocs\n"));
5039 /* We slurp relocs only once, for all sections. */
5040 if (PRIV (reloc_done
))
5042 PRIV (reloc_done
) = TRUE
;
5044 if (alpha_vms_canonicalize_symtab (abfd
, NULL
) < 0)
5047 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
5052 unsigned char *begin
;
5055 bfd_reloc_code_real_type reloc_code
;
5061 bfd_vma cur_address
;
5063 unsigned char *cur_sym
= NULL
;
5065 bfd_vma cur_addend
= 0;
5067 /* Skip non-ETIR records. */
5068 type
= _bfd_vms_get_object_record (abfd
);
5069 if (type
== EOBJ__C_EEOM
)
5071 if (type
!= EOBJ__C_ETIR
)
5074 begin
= PRIV (recrd
.rec
) + 4;
5075 end
= PRIV (recrd
.rec
) + PRIV (recrd
.rec_size
);
5077 for (ptr
= begin
; ptr
< end
; ptr
+= length
)
5081 cmd
= bfd_getl16 (ptr
);
5082 length
= bfd_getl16 (ptr
+ 2);
5084 cur_address
= vaddr
;
5086 vms_debug2 ((4, "alpha_vms_slurp_relocs: etir %s\n",
5087 _bfd_vms_etir_name (cmd
)));
5091 case ETIR__C_STA_GBL
: /* ALPHA_R_REFLONG und_section, step 1 */
5092 /* ALPHA_R_REFQUAD und_section, step 1 */
5097 case ETIR__C_STA_PQ
: /* ALPHA_R_REF{LONG|QUAD}, others part 1 */
5098 cur_psidx
= bfd_getl32 (ptr
+ 4);
5099 cur_addend
= bfd_getl64 (ptr
+ 8);
5103 case ETIR__C_CTL_SETRB
:
5104 if (prev_cmd
!= ETIR__C_STA_PQ
)
5107 /* xgettext:c-format */
5108 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (prev_cmd
),
5109 _bfd_vms_etir_name (cmd
));
5112 cur_psect
= cur_psidx
;
5118 case ETIR__C_STA_LW
: /* ALPHA_R_REFLONG abs_section, step 1 */
5119 /* ALPHA_R_REFLONG und_section, step 2 */
5122 if (prev_cmd
!= ETIR__C_STA_GBL
)
5125 /* xgettext:c-format */
5126 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
5127 _bfd_vms_etir_name (ETIR__C_STA_LW
));
5131 cur_addend
= bfd_getl32 (ptr
+ 4);
5135 case ETIR__C_STA_QW
: /* ALPHA_R_REFQUAD abs_section, step 1 */
5136 /* ALPHA_R_REFQUAD und_section, step 2 */
5137 if (prev_cmd
!= -1 && prev_cmd
!= ETIR__C_STA_GBL
)
5140 /* xgettext:c-format */
5141 (_("unknown reloc %s + %s"), _bfd_vms_etir_name (cmd
),
5142 _bfd_vms_etir_name (ETIR__C_STA_QW
));
5145 cur_addend
= bfd_getl64 (ptr
+ 4);
5149 case ETIR__C_STO_LW
: /* ALPHA_R_REFLONG und_section, step 4 */
5150 /* ALPHA_R_REFLONG abs_section, step 2 */
5151 /* ALPHA_R_REFLONG others, step 2 */
5152 if (prev_cmd
!= ETIR__C_OPR_ADD
5153 && prev_cmd
!= ETIR__C_STA_LW
5154 && prev_cmd
!= ETIR__C_STA_PQ
)
5156 /* xgettext:c-format */
5157 _bfd_error_handler (_("unknown reloc %s + %s"),
5158 _bfd_vms_etir_name (prev_cmd
),
5159 _bfd_vms_etir_name (ETIR__C_STO_LW
));
5162 reloc_code
= BFD_RELOC_32
;
5165 case ETIR__C_STO_QW
: /* ALPHA_R_REFQUAD und_section, step 4 */
5166 /* ALPHA_R_REFQUAD abs_section, step 2 */
5167 if (prev_cmd
!= ETIR__C_OPR_ADD
&& prev_cmd
!= ETIR__C_STA_QW
)
5169 /* xgettext:c-format */
5170 _bfd_error_handler (_("unknown reloc %s + %s"),
5171 _bfd_vms_etir_name (prev_cmd
),
5172 _bfd_vms_etir_name (ETIR__C_STO_QW
));
5175 reloc_code
= BFD_RELOC_64
;
5178 case ETIR__C_STO_OFF
: /* ALPHA_R_REFQUAD others, step 2 */
5179 if (prev_cmd
!= ETIR__C_STA_PQ
)
5181 /* xgettext:c-format */
5182 _bfd_error_handler (_("unknown reloc %s + %s"),
5183 _bfd_vms_etir_name (prev_cmd
),
5184 _bfd_vms_etir_name (ETIR__C_STO_OFF
));
5187 reloc_code
= BFD_RELOC_64
;
5190 case ETIR__C_OPR_ADD
: /* ALPHA_R_REFLONG und_section, step 3 */
5191 /* ALPHA_R_REFQUAD und_section, step 3 */
5192 if (prev_cmd
!= ETIR__C_STA_LW
&& prev_cmd
!= ETIR__C_STA_QW
)
5194 /* xgettext:c-format */
5195 _bfd_error_handler (_("unknown reloc %s + %s"),
5196 _bfd_vms_etir_name (prev_cmd
),
5197 _bfd_vms_etir_name (ETIR__C_OPR_ADD
));
5200 prev_cmd
= ETIR__C_OPR_ADD
;
5203 case ETIR__C_STO_CA
: /* ALPHA_R_CODEADDR */
5204 reloc_code
= BFD_RELOC_ALPHA_CODEADDR
;
5208 case ETIR__C_STO_GBL
: /* ALPHA_R_REFQUAD und_section */
5209 reloc_code
= BFD_RELOC_64
;
5213 case ETIR__C_STO_GBL_LW
: /* ALPHA_R_REFLONG und_section */
5214 reloc_code
= BFD_RELOC_32
;
5218 case ETIR__C_STC_LP_PSB
: /* ALPHA_R_LINKAGE */
5219 reloc_code
= BFD_RELOC_ALPHA_LINKAGE
;
5223 case ETIR__C_STC_NOP_GBL
: /* ALPHA_R_NOP */
5224 reloc_code
= BFD_RELOC_ALPHA_NOP
;
5227 case ETIR__C_STC_BSR_GBL
: /* ALPHA_R_BSR */
5228 reloc_code
= BFD_RELOC_ALPHA_BSR
;
5231 case ETIR__C_STC_LDA_GBL
: /* ALPHA_R_LDA */
5232 reloc_code
= BFD_RELOC_ALPHA_LDA
;
5235 case ETIR__C_STC_BOH_GBL
: /* ALPHA_R_BOH */
5236 reloc_code
= BFD_RELOC_ALPHA_BOH
;
5240 cur_sym
= ptr
+ 4 + 32;
5241 cur_address
= bfd_getl64 (ptr
+ 4 + 8);
5242 cur_addend
= bfd_getl64 (ptr
+ 4 + 24);
5245 case ETIR__C_STO_IMM
:
5246 vaddr
+= bfd_getl32 (ptr
+ 4);
5250 _bfd_error_handler (_("unknown reloc %s"),
5251 _bfd_vms_etir_name (cmd
));
5257 struct vms_section_data_struct
*vms_sec
;
5261 /* Get section to which the relocation applies. */
5262 if (cur_psect
< 0 || cur_psect
> (int)PRIV (section_count
))
5264 _bfd_error_handler (_("invalid section index in ETIR"));
5268 if (PRIV (sections
) == NULL
)
5270 sec
= PRIV (sections
)[cur_psect
];
5271 if (sec
== bfd_abs_section_ptr
)
5273 _bfd_error_handler (_("relocation for non-REL psect"));
5277 vms_sec
= vms_section_data (sec
);
5279 /* Allocate a reloc entry. */
5280 if (sec
->reloc_count
>= vms_sec
->reloc_max
)
5282 if (vms_sec
->reloc_max
== 0)
5284 vms_sec
->reloc_max
= 64;
5285 sec
->relocation
= bfd_zmalloc
5286 (vms_sec
->reloc_max
* sizeof (arelent
));
5290 vms_sec
->reloc_max
*= 2;
5291 sec
->relocation
= bfd_realloc_or_free
5292 (sec
->relocation
, vms_sec
->reloc_max
* sizeof (arelent
));
5293 if (sec
->relocation
== NULL
)
5297 reloc
= &sec
->relocation
[sec
->reloc_count
];
5300 reloc
->howto
= bfd_reloc_type_lookup (abfd
, reloc_code
);
5302 if (cur_sym
!= NULL
)
5305 unsigned int symlen
= *cur_sym
;
5308 /* Linear search. */
5313 for (j
= 0; j
< PRIV (gsd_sym_count
); j
++)
5314 if (PRIV (syms
)[j
]->namelen
== symlen
5315 && memcmp (PRIV (syms
)[j
]->name
, cur_sym
, symlen
) == 0)
5317 sym
= &PRIV (csymbols
)[j
];
5322 _bfd_error_handler (_("unknown symbol in command %s"),
5323 _bfd_vms_etir_name (cmd
));
5324 reloc
->sym_ptr_ptr
= NULL
;
5327 reloc
->sym_ptr_ptr
= sym
;
5329 else if (cur_psidx
>= 0)
5331 if (PRIV (sections
) == NULL
|| cur_psidx
>= (int) PRIV (section_count
))
5333 reloc
->sym_ptr_ptr
=
5334 PRIV (sections
)[cur_psidx
]->symbol_ptr_ptr
;
5337 reloc
->sym_ptr_ptr
= NULL
;
5339 reloc
->address
= cur_address
;
5340 reloc
->addend
= cur_addend
;
5342 if (reloc_code
== ALPHA_R_LINKAGE
)
5345 size
= bfd_get_reloc_size (reloc
->howto
);
5355 vms_debug2 ((3, "alpha_vms_slurp_relocs: result = TRUE\n"));
5360 /* Return the number of bytes required to store the relocation
5361 information associated with the given section. */
5364 alpha_vms_get_reloc_upper_bound (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*section
)
5366 alpha_vms_slurp_relocs (abfd
);
5368 return (section
->reloc_count
+ 1) * sizeof (arelent
*);
5371 /* Convert relocations from VMS (external) form into BFD internal
5372 form. Return the number of relocations. */
5375 alpha_vms_canonicalize_reloc (bfd
*abfd
, asection
*section
, arelent
**relptr
,
5376 asymbol
**symbols ATTRIBUTE_UNUSED
)
5381 if (!alpha_vms_slurp_relocs (abfd
))
5384 count
= section
->reloc_count
;
5385 tblptr
= section
->relocation
;
5388 *relptr
++ = tblptr
++;
5390 *relptr
= (arelent
*) NULL
;
5391 return section
->reloc_count
;
5394 /* Install a new set of internal relocs. */
5396 #define alpha_vms_set_reloc _bfd_generic_set_reloc
5399 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
5401 /* How to process the various reloc types. */
5403 static bfd_reloc_status_type
5404 reloc_nil (bfd
* abfd ATTRIBUTE_UNUSED
,
5405 arelent
*reloc ATTRIBUTE_UNUSED
,
5406 asymbol
*sym ATTRIBUTE_UNUSED
,
5407 void * data ATTRIBUTE_UNUSED
,
5408 asection
*sec ATTRIBUTE_UNUSED
,
5409 bfd
*output_bfd ATTRIBUTE_UNUSED
,
5410 char **error_message ATTRIBUTE_UNUSED
)
5413 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd
, output_bfd
);
5414 vms_debug (2, "In section %s, symbol %s\n",
5415 sec
->name
, sym
->name
);
5416 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
5417 reloc
->sym_ptr_ptr
[0]->name
,
5418 (unsigned long)reloc
->address
,
5419 (unsigned long)reloc
->addend
, reloc
->howto
->name
);
5420 vms_debug (2, "data at %p\n", data
);
5421 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
5424 return bfd_reloc_ok
;
5427 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
5428 from smaller values. Start with zero, widen, *then* decrement. */
5429 #define MINUS_ONE (((bfd_vma)0) - 1)
5431 static reloc_howto_type alpha_howto_table
[] =
5433 HOWTO (ALPHA_R_IGNORE
, /* Type. */
5434 0, /* Rightshift. */
5435 0, /* Size (0 = byte, 1 = short, 2 = long). */
5437 TRUE
, /* PC relative. */
5439 complain_overflow_dont
,/* Complain_on_overflow. */
5440 reloc_nil
, /* Special_function. */
5441 "IGNORE", /* Name. */
5442 TRUE
, /* Partial_inplace. */
5443 0, /* Source mask */
5445 TRUE
), /* PC rel offset. */
5447 /* A 64 bit reference to a symbol. */
5448 HOWTO (ALPHA_R_REFQUAD
, /* Type. */
5449 0, /* Rightshift. */
5450 4, /* Size (0 = byte, 1 = short, 2 = long). */
5452 FALSE
, /* PC relative. */
5454 complain_overflow_bitfield
, /* Complain_on_overflow. */
5455 reloc_nil
, /* Special_function. */
5456 "REFQUAD", /* Name. */
5457 TRUE
, /* Partial_inplace. */
5458 MINUS_ONE
, /* Source mask. */
5459 MINUS_ONE
, /* Dest mask. */
5460 FALSE
), /* PC rel offset. */
5462 /* A 21 bit branch. The native assembler generates these for
5463 branches within the text segment, and also fills in the PC
5464 relative offset in the instruction. */
5465 HOWTO (ALPHA_R_BRADDR
, /* Type. */
5466 2, /* Rightshift. */
5467 2, /* Size (0 = byte, 1 = short, 2 = long). */
5469 TRUE
, /* PC relative. */
5471 complain_overflow_signed
, /* Complain_on_overflow. */
5472 reloc_nil
, /* Special_function. */
5473 "BRADDR", /* Name. */
5474 TRUE
, /* Partial_inplace. */
5475 0x1fffff, /* Source mask. */
5476 0x1fffff, /* Dest mask. */
5477 FALSE
), /* PC rel offset. */
5479 /* A hint for a jump to a register. */
5480 HOWTO (ALPHA_R_HINT
, /* Type. */
5481 2, /* Rightshift. */
5482 1, /* Size (0 = byte, 1 = short, 2 = long). */
5484 TRUE
, /* PC relative. */
5486 complain_overflow_dont
,/* Complain_on_overflow. */
5487 reloc_nil
, /* Special_function. */
5489 TRUE
, /* Partial_inplace. */
5490 0x3fff, /* Source mask. */
5491 0x3fff, /* Dest mask. */
5492 FALSE
), /* PC rel offset. */
5494 /* 16 bit PC relative offset. */
5495 HOWTO (ALPHA_R_SREL16
, /* Type. */
5496 0, /* Rightshift. */
5497 1, /* Size (0 = byte, 1 = short, 2 = long). */
5499 TRUE
, /* PC relative. */
5501 complain_overflow_signed
, /* Complain_on_overflow. */
5502 reloc_nil
, /* Special_function. */
5503 "SREL16", /* Name. */
5504 TRUE
, /* Partial_inplace. */
5505 0xffff, /* Source mask. */
5506 0xffff, /* Dest mask. */
5507 FALSE
), /* PC rel offset. */
5509 /* 32 bit PC relative offset. */
5510 HOWTO (ALPHA_R_SREL32
, /* Type. */
5511 0, /* Rightshift. */
5512 2, /* Size (0 = byte, 1 = short, 2 = long). */
5514 TRUE
, /* PC relative. */
5516 complain_overflow_signed
, /* Complain_on_overflow. */
5517 reloc_nil
, /* Special_function. */
5518 "SREL32", /* Name. */
5519 TRUE
, /* Partial_inplace. */
5520 0xffffffff, /* Source mask. */
5521 0xffffffff, /* Dest mask. */
5522 FALSE
), /* PC rel offset. */
5524 /* A 64 bit PC relative offset. */
5525 HOWTO (ALPHA_R_SREL64
, /* Type. */
5526 0, /* Rightshift. */
5527 4, /* Size (0 = byte, 1 = short, 2 = long). */
5529 TRUE
, /* PC relative. */
5531 complain_overflow_signed
, /* Complain_on_overflow. */
5532 reloc_nil
, /* Special_function. */
5533 "SREL64", /* Name. */
5534 TRUE
, /* Partial_inplace. */
5535 MINUS_ONE
, /* Source mask. */
5536 MINUS_ONE
, /* Dest mask. */
5537 FALSE
), /* PC rel offset. */
5539 /* Push a value on the reloc evaluation stack. */
5540 HOWTO (ALPHA_R_OP_PUSH
, /* Type. */
5541 0, /* Rightshift. */
5542 0, /* Size (0 = byte, 1 = short, 2 = long). */
5544 FALSE
, /* PC relative. */
5546 complain_overflow_dont
,/* Complain_on_overflow. */
5547 reloc_nil
, /* Special_function. */
5548 "OP_PUSH", /* Name. */
5549 FALSE
, /* Partial_inplace. */
5550 0, /* Source mask. */
5552 FALSE
), /* PC rel offset. */
5554 /* Store the value from the stack at the given address. Store it in
5555 a bitfield of size r_size starting at bit position r_offset. */
5556 HOWTO (ALPHA_R_OP_STORE
, /* Type. */
5557 0, /* Rightshift. */
5558 4, /* Size (0 = byte, 1 = short, 2 = long). */
5560 FALSE
, /* PC relative. */
5562 complain_overflow_dont
,/* Complain_on_overflow. */
5563 reloc_nil
, /* Special_function. */
5564 "OP_STORE", /* Name. */
5565 FALSE
, /* Partial_inplace. */
5566 0, /* Source mask. */
5567 MINUS_ONE
, /* Dest mask. */
5568 FALSE
), /* PC rel offset. */
5570 /* Subtract the reloc address from the value on the top of the
5571 relocation stack. */
5572 HOWTO (ALPHA_R_OP_PSUB
, /* Type. */
5573 0, /* Rightshift. */
5574 0, /* Size (0 = byte, 1 = short, 2 = long). */
5576 FALSE
, /* PC relative. */
5578 complain_overflow_dont
,/* Complain_on_overflow. */
5579 reloc_nil
, /* Special_function. */
5580 "OP_PSUB", /* Name. */
5581 FALSE
, /* Partial_inplace. */
5582 0, /* Source mask. */
5584 FALSE
), /* PC rel offset. */
5586 /* Shift the value on the top of the relocation stack right by the
5588 HOWTO (ALPHA_R_OP_PRSHIFT
, /* Type. */
5589 0, /* Rightshift. */
5590 0, /* Size (0 = byte, 1 = short, 2 = long). */
5592 FALSE
, /* PC relative. */
5594 complain_overflow_dont
,/* Complain_on_overflow. */
5595 reloc_nil
, /* Special_function. */
5596 "OP_PRSHIFT", /* Name. */
5597 FALSE
, /* Partial_inplace. */
5598 0, /* Source mask. */
5600 FALSE
), /* PC rel offset. */
5602 /* Hack. Linkage is done by linker. */
5603 HOWTO (ALPHA_R_LINKAGE
, /* Type. */
5604 0, /* Rightshift. */
5605 0, /* Size (0 = byte, 1 = short, 2 = long). */
5607 FALSE
, /* PC relative. */
5609 complain_overflow_dont
,/* Complain_on_overflow. */
5610 reloc_nil
, /* Special_function. */
5611 "LINKAGE", /* Name. */
5612 FALSE
, /* Partial_inplace. */
5613 0, /* Source mask. */
5615 FALSE
), /* PC rel offset. */
5617 /* A 32 bit reference to a symbol. */
5618 HOWTO (ALPHA_R_REFLONG
, /* Type. */
5619 0, /* Rightshift. */
5620 2, /* Size (0 = byte, 1 = short, 2 = long). */
5622 FALSE
, /* PC relative. */
5624 complain_overflow_bitfield
, /* Complain_on_overflow. */
5625 reloc_nil
, /* Special_function. */
5626 "REFLONG", /* Name. */
5627 TRUE
, /* Partial_inplace. */
5628 0xffffffff, /* Source mask. */
5629 0xffffffff, /* Dest mask. */
5630 FALSE
), /* PC rel offset. */
5632 /* A 64 bit reference to a procedure, written as 32 bit value. */
5633 HOWTO (ALPHA_R_CODEADDR
, /* Type. */
5634 0, /* Rightshift. */
5635 4, /* Size (0 = byte, 1 = short, 2 = long). */
5637 FALSE
, /* PC relative. */
5639 complain_overflow_signed
,/* Complain_on_overflow. */
5640 reloc_nil
, /* Special_function. */
5641 "CODEADDR", /* Name. */
5642 FALSE
, /* Partial_inplace. */
5643 0xffffffff, /* Source mask. */
5644 0xffffffff, /* Dest mask. */
5645 FALSE
), /* PC rel offset. */
5647 HOWTO (ALPHA_R_NOP
, /* Type. */
5648 0, /* Rightshift. */
5649 3, /* Size (0 = byte, 1 = short, 2 = long). */
5651 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
5652 because the calculations for the 3 relocations are the same.
5653 See B.4.5.2 of the OpenVMS Linker Utility Manual. */
5654 TRUE
, /* PC relative. */
5656 complain_overflow_dont
,/* Complain_on_overflow. */
5657 reloc_nil
, /* Special_function. */
5659 FALSE
, /* Partial_inplace. */
5660 0xffffffff, /* Source mask. */
5661 0xffffffff, /* Dest mask. */
5662 FALSE
), /* PC rel offset. */
5664 HOWTO (ALPHA_R_BSR
, /* Type. */
5665 0, /* Rightshift. */
5666 3, /* Size (0 = byte, 1 = short, 2 = long). */
5668 TRUE
, /* PC relative. */
5670 complain_overflow_dont
,/* Complain_on_overflow. */
5671 reloc_nil
, /* Special_function. */
5673 FALSE
, /* Partial_inplace. */
5674 0xffffffff, /* Source mask. */
5675 0xffffffff, /* Dest mask. */
5676 FALSE
), /* PC rel offset. */
5678 HOWTO (ALPHA_R_LDA
, /* Type. */
5679 0, /* Rightshift. */
5680 3, /* Size (0 = byte, 1 = short, 2 = long). */
5682 FALSE
, /* PC relative. */
5684 complain_overflow_dont
,/* Complain_on_overflow. */
5685 reloc_nil
, /* Special_function. */
5687 FALSE
, /* Partial_inplace. */
5688 0xffffffff, /* Source mask. */
5689 0xffffffff, /* Dest mask. */
5690 FALSE
), /* PC rel offset. */
5692 HOWTO (ALPHA_R_BOH
, /* Type. */
5693 0, /* Rightshift. */
5694 3, /* Size (0 = byte, 1 = short, 2 = long, 3 = nil). */
5696 TRUE
, /* PC relative. */
5698 complain_overflow_dont
,/* Complain_on_overflow. */
5699 reloc_nil
, /* Special_function. */
5701 FALSE
, /* Partial_inplace. */
5702 0xffffffff, /* Source mask. */
5703 0xffffffff, /* Dest mask. */
5704 FALSE
), /* PC rel offset. */
5707 /* Return a pointer to a howto structure which, when invoked, will perform
5708 the relocation code on data from the architecture noted. */
5710 static reloc_howto_type
*
5711 alpha_vms_bfd_reloc_type_lookup (bfd
* abfd ATTRIBUTE_UNUSED
,
5712 bfd_reloc_code_real_type code
)
5716 vms_debug2 ((1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd
, code
));
5720 case BFD_RELOC_16
: alpha_type
= ALPHA_R_SREL16
; break;
5721 case BFD_RELOC_32
: alpha_type
= ALPHA_R_REFLONG
; break;
5722 case BFD_RELOC_64
: alpha_type
= ALPHA_R_REFQUAD
; break;
5723 case BFD_RELOC_CTOR
: alpha_type
= ALPHA_R_REFQUAD
; break;
5724 case BFD_RELOC_23_PCREL_S2
: alpha_type
= ALPHA_R_BRADDR
; break;
5725 case BFD_RELOC_ALPHA_HINT
: alpha_type
= ALPHA_R_HINT
; break;
5726 case BFD_RELOC_16_PCREL
: alpha_type
= ALPHA_R_SREL16
; break;
5727 case BFD_RELOC_32_PCREL
: alpha_type
= ALPHA_R_SREL32
; break;
5728 case BFD_RELOC_64_PCREL
: alpha_type
= ALPHA_R_SREL64
; break;
5729 case BFD_RELOC_ALPHA_LINKAGE
: alpha_type
= ALPHA_R_LINKAGE
; break;
5730 case BFD_RELOC_ALPHA_CODEADDR
: alpha_type
= ALPHA_R_CODEADDR
; break;
5731 case BFD_RELOC_ALPHA_NOP
: alpha_type
= ALPHA_R_NOP
; break;
5732 case BFD_RELOC_ALPHA_BSR
: alpha_type
= ALPHA_R_BSR
; break;
5733 case BFD_RELOC_ALPHA_LDA
: alpha_type
= ALPHA_R_LDA
; break;
5734 case BFD_RELOC_ALPHA_BOH
: alpha_type
= ALPHA_R_BOH
; break;
5736 _bfd_error_handler (_("reloc (%d) is *UNKNOWN*"), code
);
5739 vms_debug2 ((2, "reloc is %s\n", alpha_howto_table
[alpha_type
].name
));
5740 return & alpha_howto_table
[alpha_type
];
5743 static reloc_howto_type
*
5744 alpha_vms_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
5750 i
< sizeof (alpha_howto_table
) / sizeof (alpha_howto_table
[0]);
5752 if (alpha_howto_table
[i
].name
!= NULL
5753 && strcasecmp (alpha_howto_table
[i
].name
, r_name
) == 0)
5754 return &alpha_howto_table
[i
];
5760 alpha_vms_get_synthetic_symtab (bfd
*abfd
,
5761 long symcount ATTRIBUTE_UNUSED
,
5762 asymbol
**usyms ATTRIBUTE_UNUSED
,
5763 long dynsymcount ATTRIBUTE_UNUSED
,
5764 asymbol
**dynsyms ATTRIBUTE_UNUSED
,
5771 syms
= (asymbol
*) bfd_malloc (PRIV (norm_sym_count
) * sizeof (asymbol
));
5776 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
5778 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
5789 flags
= BSF_LOCAL
| BSF_SYNTHETIC
;
5796 if ((e
->flags
& EGSY__V_DEF
) && (e
->flags
& EGSY__V_NORM
))
5798 value
= e
->code_value
;
5799 sec
= e
->code_section
;
5810 sname
= bfd_alloc (abfd
, l
+ 5);
5813 memcpy (sname
, name
, l
);
5814 memcpy (sname
+ l
, "..en", 5);
5821 sym
->udata
.p
= NULL
;
5830 vms_time_to_str (unsigned char *buf
)
5832 time_t t
= vms_rawtime_to_time_t (buf
);
5833 char *res
= ctime (&t
);
5836 res
= "*invalid time*";
5843 evax_bfd_print_emh (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
5845 struct vms_emh_common
*emh
= (struct vms_emh_common
*)rec
;
5846 unsigned int subtype
;
5849 subtype
= (unsigned) bfd_getl16 (emh
->subtyp
);
5851 /* xgettext:c-format */
5852 fprintf (file
, _(" EMH %u (len=%u): "), subtype
, rec_len
);
5854 /* PR 21618: Check for invalid lengths. */
5855 if (rec_len
< sizeof (* emh
))
5857 fprintf (file
, _(" Error: The length is less than the length of an EMH record\n"));
5860 extra
= rec_len
- sizeof (struct vms_emh_common
);
5866 struct vms_emh_mhd
*mhd
= (struct vms_emh_mhd
*) rec
;
5868 const char * nextname
;
5869 const char * maxname
;
5871 /* PR 21840: Check for invalid lengths. */
5872 if (rec_len
< sizeof (* mhd
))
5874 fprintf (file
, _(" Error: The record length is less than the size of an EMH_MHD record\n"));
5877 fprintf (file
, _("Module header\n"));
5878 fprintf (file
, _(" structure level: %u\n"), mhd
->strlvl
);
5879 fprintf (file
, _(" max record size: %u\n"),
5880 (unsigned) bfd_getl32 (mhd
->recsiz
));
5881 name
= (char *)(mhd
+ 1);
5882 maxname
= (char *) rec
+ rec_len
;
5883 if (name
> maxname
- 2)
5885 fprintf (file
, _(" Error: The module name is missing\n"));
5888 nextname
= name
+ name
[0] + 1;
5889 if (nextname
>= maxname
)
5891 fprintf (file
, _(" Error: The module name is too long\n"));
5894 fprintf (file
, _(" module name : %.*s\n"), name
[0], name
+ 1);
5896 if (name
> maxname
- 2)
5898 fprintf (file
, _(" Error: The module version is missing\n"));
5901 nextname
= name
+ name
[0] + 1;
5902 if (nextname
>= maxname
)
5904 fprintf (file
, _(" Error: The module version is too long\n"));
5907 fprintf (file
, _(" module version : %.*s\n"), name
[0], name
+ 1);
5909 if ((maxname
- name
) < 17 && maxname
[-1] != 0)
5910 fprintf (file
, _(" Error: The compile date is truncated\n"));
5912 fprintf (file
, _(" compile date : %.17s\n"), name
);
5917 fprintf (file
, _("Language Processor Name\n"));
5918 fprintf (file
, _(" language name: %.*s\n"), extra
, (char *)(emh
+ 1));
5922 fprintf (file
, _("Source Files Header\n"));
5923 fprintf (file
, _(" file: %.*s\n"), extra
, (char *)(emh
+ 1));
5927 fprintf (file
, _("Title Text Header\n"));
5928 fprintf (file
, _(" title: %.*s\n"), extra
, (char *)(emh
+ 1));
5932 fprintf (file
, _("Copyright Header\n"));
5933 fprintf (file
, _(" copyright: %.*s\n"), extra
, (char *)(emh
+ 1));
5937 fprintf (file
, _("unhandled emh subtype %u\n"), subtype
);
5943 evax_bfd_print_eeom (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
5945 struct vms_eeom
*eeom
= (struct vms_eeom
*)rec
;
5947 fprintf (file
, _(" EEOM (len=%u):\n"), rec_len
);
5949 /* PR 21618: Check for invalid lengths. */
5950 if (rec_len
< sizeof (* eeom
))
5952 fprintf (file
, _(" Error: The length is less than the length of an EEOM record\n"));
5956 fprintf (file
, _(" number of cond linkage pairs: %u\n"),
5957 (unsigned)bfd_getl32 (eeom
->total_lps
));
5958 fprintf (file
, _(" completion code: %u\n"),
5959 (unsigned)bfd_getl16 (eeom
->comcod
));
5962 fprintf (file
, _(" transfer addr flags: 0x%02x\n"), eeom
->tfrflg
);
5963 fprintf (file
, _(" transfer addr psect: %u\n"),
5964 (unsigned)bfd_getl32 (eeom
->psindx
));
5965 fprintf (file
, _(" transfer address : 0x%08x\n"),
5966 (unsigned)bfd_getl32 (eeom
->tfradr
));
5971 exav_bfd_print_egsy_flags (unsigned int flags
, FILE *file
)
5973 if (flags
& EGSY__V_WEAK
)
5974 fputs (_(" WEAK"), file
);
5975 if (flags
& EGSY__V_DEF
)
5976 fputs (_(" DEF"), file
);
5977 if (flags
& EGSY__V_UNI
)
5978 fputs (_(" UNI"), file
);
5979 if (flags
& EGSY__V_REL
)
5980 fputs (_(" REL"), file
);
5981 if (flags
& EGSY__V_COMM
)
5982 fputs (_(" COMM"), file
);
5983 if (flags
& EGSY__V_VECEP
)
5984 fputs (_(" VECEP"), file
);
5985 if (flags
& EGSY__V_NORM
)
5986 fputs (_(" NORM"), file
);
5987 if (flags
& EGSY__V_QUAD_VAL
)
5988 fputs (_(" QVAL"), file
);
5992 evax_bfd_print_egsd_flags (FILE *file
, unsigned int flags
)
5994 if (flags
& EGPS__V_PIC
)
5995 fputs (_(" PIC"), file
);
5996 if (flags
& EGPS__V_LIB
)
5997 fputs (_(" LIB"), file
);
5998 if (flags
& EGPS__V_OVR
)
5999 fputs (_(" OVR"), file
);
6000 if (flags
& EGPS__V_REL
)
6001 fputs (_(" REL"), file
);
6002 if (flags
& EGPS__V_GBL
)
6003 fputs (_(" GBL"), file
);
6004 if (flags
& EGPS__V_SHR
)
6005 fputs (_(" SHR"), file
);
6006 if (flags
& EGPS__V_EXE
)
6007 fputs (_(" EXE"), file
);
6008 if (flags
& EGPS__V_RD
)
6009 fputs (_(" RD"), file
);
6010 if (flags
& EGPS__V_WRT
)
6011 fputs (_(" WRT"), file
);
6012 if (flags
& EGPS__V_VEC
)
6013 fputs (_(" VEC"), file
);
6014 if (flags
& EGPS__V_NOMOD
)
6015 fputs (_(" NOMOD"), file
);
6016 if (flags
& EGPS__V_COM
)
6017 fputs (_(" COM"), file
);
6018 if (flags
& EGPS__V_ALLOC_64BIT
)
6019 fputs (_(" 64B"), file
);
6023 evax_bfd_print_egsd (FILE *file
, unsigned char *rec
, unsigned int rec_len
)
6025 unsigned int off
= sizeof (struct vms_egsd
);
6028 fprintf (file
, _(" EGSD (len=%u):\n"), rec_len
);
6031 for (off
= sizeof (struct vms_egsd
); off
< rec_len
; )
6033 struct vms_egsd_entry
*e
= (struct vms_egsd_entry
*)(rec
+ off
);
6037 type
= (unsigned)bfd_getl16 (e
->gsdtyp
);
6038 len
= (unsigned)bfd_getl16 (e
->gsdsiz
);
6040 /* xgettext:c-format */
6041 fprintf (file
, _(" EGSD entry %2u (type: %u, len: %u): "),
6045 if (off
+ len
> rec_len
|| off
+ len
< off
)
6047 fprintf (file
, _(" Error: length larger than remaining space in record\n"));
6055 struct vms_egps
*egps
= (struct vms_egps
*)e
;
6056 unsigned int flags
= bfd_getl16 (egps
->flags
);
6059 fprintf (file
, _("PSC - Program section definition\n"));
6060 fprintf (file
, _(" alignment : 2**%u\n"), egps
->align
);
6061 fprintf (file
, _(" flags : 0x%04x"), flags
);
6062 evax_bfd_print_egsd_flags (file
, flags
);
6064 l
= bfd_getl32 (egps
->alloc
);
6065 fprintf (file
, _(" alloc (len): %u (0x%08x)\n"), l
, l
);
6066 fprintf (file
, _(" name : %.*s\n"),
6067 egps
->namlng
, egps
->name
);
6072 struct vms_esgps
*esgps
= (struct vms_esgps
*)e
;
6073 unsigned int flags
= bfd_getl16 (esgps
->flags
);
6076 fprintf (file
, _("SPSC - Shared Image Program section def\n"));
6077 fprintf (file
, _(" alignment : 2**%u\n"), esgps
->align
);
6078 fprintf (file
, _(" flags : 0x%04x"), flags
);
6079 evax_bfd_print_egsd_flags (file
, flags
);
6081 l
= bfd_getl32 (esgps
->alloc
);
6082 fprintf (file
, _(" alloc (len) : %u (0x%08x)\n"), l
, l
);
6083 fprintf (file
, _(" image offset : 0x%08x\n"),
6084 (unsigned int)bfd_getl32 (esgps
->base
));
6085 fprintf (file
, _(" symvec offset : 0x%08x\n"),
6086 (unsigned int)bfd_getl32 (esgps
->value
));
6087 fprintf (file
, _(" name : %.*s\n"),
6088 esgps
->namlng
, esgps
->name
);
6093 struct vms_egsy
*egsy
= (struct vms_egsy
*)e
;
6094 unsigned int flags
= bfd_getl16 (egsy
->flags
);
6096 if (flags
& EGSY__V_DEF
)
6098 struct vms_esdf
*esdf
= (struct vms_esdf
*)e
;
6100 fprintf (file
, _("SYM - Global symbol definition\n"));
6101 fprintf (file
, _(" flags: 0x%04x"), flags
);
6102 exav_bfd_print_egsy_flags (flags
, file
);
6104 fprintf (file
, _(" psect offset: 0x%08x\n"),
6105 (unsigned)bfd_getl32 (esdf
->value
));
6106 if (flags
& EGSY__V_NORM
)
6108 fprintf (file
, _(" code address: 0x%08x\n"),
6109 (unsigned)bfd_getl32 (esdf
->code_address
));
6110 fprintf (file
, _(" psect index for entry point : %u\n"),
6111 (unsigned)bfd_getl32 (esdf
->ca_psindx
));
6113 fprintf (file
, _(" psect index : %u\n"),
6114 (unsigned)bfd_getl32 (esdf
->psindx
));
6115 fprintf (file
, _(" name : %.*s\n"),
6116 esdf
->namlng
, esdf
->name
);
6120 struct vms_esrf
*esrf
= (struct vms_esrf
*)e
;
6122 fprintf (file
, _("SYM - Global symbol reference\n"));
6123 fprintf (file
, _(" name : %.*s\n"),
6124 esrf
->namlng
, esrf
->name
);
6130 struct vms_eidc
*eidc
= (struct vms_eidc
*)e
;
6131 unsigned int flags
= bfd_getl32 (eidc
->flags
);
6134 fprintf (file
, _("IDC - Ident Consistency check\n"));
6135 fprintf (file
, _(" flags : 0x%08x"), flags
);
6136 if (flags
& EIDC__V_BINIDENT
)
6137 fputs (" BINDENT", file
);
6139 fprintf (file
, _(" id match : %x\n"),
6140 (flags
>> EIDC__V_IDMATCH_SH
) & EIDC__V_IDMATCH_MASK
);
6141 fprintf (file
, _(" error severity: %x\n"),
6142 (flags
>> EIDC__V_ERRSEV_SH
) & EIDC__V_ERRSEV_MASK
);
6144 fprintf (file
, _(" entity name : %.*s\n"), p
[0], p
+ 1);
6146 fprintf (file
, _(" object name : %.*s\n"), p
[0], p
+ 1);
6148 if (flags
& EIDC__V_BINIDENT
)
6149 fprintf (file
, _(" binary ident : 0x%08x\n"),
6150 (unsigned)bfd_getl32 (p
+ 1));
6152 fprintf (file
, _(" ascii ident : %.*s\n"), p
[0], p
+ 1);
6157 struct vms_egst
*egst
= (struct vms_egst
*)e
;
6158 unsigned int flags
= bfd_getl16 (egst
->header
.flags
);
6160 fprintf (file
, _("SYMG - Universal symbol definition\n"));
6161 fprintf (file
, _(" flags: 0x%04x"), flags
);
6162 exav_bfd_print_egsy_flags (flags
, file
);
6164 fprintf (file
, _(" symbol vector offset: 0x%08x\n"),
6165 (unsigned)bfd_getl32 (egst
->value
));
6166 fprintf (file
, _(" entry point: 0x%08x\n"),
6167 (unsigned)bfd_getl32 (egst
->lp_1
));
6168 fprintf (file
, _(" proc descr : 0x%08x\n"),
6169 (unsigned)bfd_getl32 (egst
->lp_2
));
6170 fprintf (file
, _(" psect index: %u\n"),
6171 (unsigned)bfd_getl32 (egst
->psindx
));
6172 fprintf (file
, _(" name : %.*s\n"),
6173 egst
->namlng
, egst
->name
);
6178 struct vms_esdfv
*esdfv
= (struct vms_esdfv
*)e
;
6179 unsigned int flags
= bfd_getl16 (esdfv
->flags
);
6181 fprintf (file
, _("SYMV - Vectored symbol definition\n"));
6182 fprintf (file
, _(" flags: 0x%04x"), flags
);
6183 exav_bfd_print_egsy_flags (flags
, file
);
6185 fprintf (file
, _(" vector : 0x%08x\n"),
6186 (unsigned)bfd_getl32 (esdfv
->vector
));
6187 fprintf (file
, _(" psect offset: %u\n"),
6188 (unsigned)bfd_getl32 (esdfv
->value
));
6189 fprintf (file
, _(" psect index : %u\n"),
6190 (unsigned)bfd_getl32 (esdfv
->psindx
));
6191 fprintf (file
, _(" name : %.*s\n"),
6192 esdfv
->namlng
, esdfv
->name
);
6197 struct vms_esdfm
*esdfm
= (struct vms_esdfm
*)e
;
6198 unsigned int flags
= bfd_getl16 (esdfm
->flags
);
6200 fprintf (file
, _("SYMM - Global symbol definition with version\n"));
6201 fprintf (file
, _(" flags: 0x%04x"), flags
);
6202 exav_bfd_print_egsy_flags (flags
, file
);
6204 fprintf (file
, _(" version mask: 0x%08x\n"),
6205 (unsigned)bfd_getl32 (esdfm
->version_mask
));
6206 fprintf (file
, _(" psect offset: %u\n"),
6207 (unsigned)bfd_getl32 (esdfm
->value
));
6208 fprintf (file
, _(" psect index : %u\n"),
6209 (unsigned)bfd_getl32 (esdfm
->psindx
));
6210 fprintf (file
, _(" name : %.*s\n"),
6211 esdfm
->namlng
, esdfm
->name
);
6215 fprintf (file
, _("unhandled egsd entry type %u\n"), type
);
6223 evax_bfd_print_hex (FILE *file
, const char *pfx
,
6224 const unsigned char *buf
, unsigned int len
)
6230 for (i
= 0; i
< len
; i
++)
6234 fprintf (file
, " %02x", buf
[i
]);
6247 evax_bfd_print_etir_stc_ir (FILE *file
, const unsigned char *buf
, int is_ps
)
6249 /* xgettext:c-format */
6250 fprintf (file
, _(" linkage index: %u, replacement insn: 0x%08x\n"),
6251 (unsigned)bfd_getl32 (buf
),
6252 (unsigned)bfd_getl32 (buf
+ 16));
6253 /* xgettext:c-format */
6254 fprintf (file
, _(" psect idx 1: %u, offset 1: 0x%08x %08x\n"),
6255 (unsigned)bfd_getl32 (buf
+ 4),
6256 (unsigned)bfd_getl32 (buf
+ 12),
6257 (unsigned)bfd_getl32 (buf
+ 8));
6258 /* xgettext:c-format */
6259 fprintf (file
, _(" psect idx 2: %u, offset 2: 0x%08x %08x\n"),
6260 (unsigned)bfd_getl32 (buf
+ 20),
6261 (unsigned)bfd_getl32 (buf
+ 28),
6262 (unsigned)bfd_getl32 (buf
+ 24));
6264 /* xgettext:c-format */
6265 fprintf (file
, _(" psect idx 3: %u, offset 3: 0x%08x %08x\n"),
6266 (unsigned)bfd_getl32 (buf
+ 32),
6267 (unsigned)bfd_getl32 (buf
+ 40),
6268 (unsigned)bfd_getl32 (buf
+ 36));
6270 fprintf (file
, _(" global name: %.*s\n"), buf
[32], buf
+ 33);
6274 evax_bfd_print_etir (FILE *file
, const char *name
,
6275 unsigned char *rec
, unsigned int rec_len
)
6277 unsigned int off
= sizeof (struct vms_egsd
);
6278 unsigned int sec_len
= 0;
6280 /* xgettext:c-format */
6281 fprintf (file
, _(" %s (len=%u+%u):\n"), name
,
6282 (unsigned)(rec_len
- sizeof (struct vms_eobjrec
)),
6283 (unsigned)sizeof (struct vms_eobjrec
));
6285 for (off
= sizeof (struct vms_eobjrec
); off
< rec_len
; )
6287 struct vms_etir
*etir
= (struct vms_etir
*)(rec
+ off
);
6292 type
= bfd_getl16 (etir
->rectyp
);
6293 size
= bfd_getl16 (etir
->size
);
6294 buf
= rec
+ off
+ sizeof (struct vms_etir
);
6296 if (off
+ size
> rec_len
|| off
+ size
< off
)
6298 fprintf (file
, _(" Error: length larger than remaining space in record\n"));
6302 /* xgettext:c-format */
6303 fprintf (file
, _(" (type: %3u, size: 4+%3u): "), type
, size
- 4);
6306 case ETIR__C_STA_GBL
:
6307 fprintf (file
, _("STA_GBL (stack global) %.*s\n"),
6310 case ETIR__C_STA_LW
:
6311 fprintf (file
, _("STA_LW (stack longword) 0x%08x\n"),
6312 (unsigned)bfd_getl32 (buf
));
6314 case ETIR__C_STA_QW
:
6315 fprintf (file
, _("STA_QW (stack quadword) 0x%08x %08x\n"),
6316 (unsigned)bfd_getl32 (buf
+ 4),
6317 (unsigned)bfd_getl32 (buf
+ 0));
6319 case ETIR__C_STA_PQ
:
6320 fprintf (file
, _("STA_PQ (stack psect base + offset)\n"));
6321 /* xgettext:c-format */
6322 fprintf (file
, _(" psect: %u, offset: 0x%08x %08x\n"),
6323 (unsigned)bfd_getl32 (buf
+ 0),
6324 (unsigned)bfd_getl32 (buf
+ 8),
6325 (unsigned)bfd_getl32 (buf
+ 4));
6327 case ETIR__C_STA_LI
:
6328 fprintf (file
, _("STA_LI (stack literal)\n"));
6330 case ETIR__C_STA_MOD
:
6331 fprintf (file
, _("STA_MOD (stack module)\n"));
6333 case ETIR__C_STA_CKARG
:
6334 fprintf (file
, _("STA_CKARG (compare procedure argument)\n"));
6338 fprintf (file
, _("STO_B (store byte)\n"));
6341 fprintf (file
, _("STO_W (store word)\n"));
6343 case ETIR__C_STO_LW
:
6344 fprintf (file
, _("STO_LW (store longword)\n"));
6346 case ETIR__C_STO_QW
:
6347 fprintf (file
, _("STO_QW (store quadword)\n"));
6349 case ETIR__C_STO_IMMR
:
6351 unsigned int len
= bfd_getl32 (buf
);
6353 _("STO_IMMR (store immediate repeat) %u bytes\n"),
6355 evax_bfd_print_hex (file
, " ", buf
+ 4, len
);
6359 case ETIR__C_STO_GBL
:
6360 fprintf (file
, _("STO_GBL (store global) %.*s\n"),
6363 case ETIR__C_STO_CA
:
6364 fprintf (file
, _("STO_CA (store code address) %.*s\n"),
6367 case ETIR__C_STO_RB
:
6368 fprintf (file
, _("STO_RB (store relative branch)\n"));
6370 case ETIR__C_STO_AB
:
6371 fprintf (file
, _("STO_AB (store absolute branch)\n"));
6373 case ETIR__C_STO_OFF
:
6374 fprintf (file
, _("STO_OFF (store offset to psect)\n"));
6376 case ETIR__C_STO_IMM
:
6378 unsigned int len
= bfd_getl32 (buf
);
6380 _("STO_IMM (store immediate) %u bytes\n"),
6382 evax_bfd_print_hex (file
, " ", buf
+ 4, len
);
6386 case ETIR__C_STO_GBL_LW
:
6387 fprintf (file
, _("STO_GBL_LW (store global longword) %.*s\n"),
6390 case ETIR__C_STO_LP_PSB
:
6391 fprintf (file
, _("STO_OFF (store LP with procedure signature)\n"));
6393 case ETIR__C_STO_HINT_GBL
:
6394 fprintf (file
, _("STO_BR_GBL (store branch global) *todo*\n"));
6396 case ETIR__C_STO_HINT_PS
:
6397 fprintf (file
, _("STO_BR_PS (store branch psect + offset) *todo*\n"));
6400 case ETIR__C_OPR_NOP
:
6401 fprintf (file
, _("OPR_NOP (no-operation)\n"));
6403 case ETIR__C_OPR_ADD
:
6404 fprintf (file
, _("OPR_ADD (add)\n"));
6406 case ETIR__C_OPR_SUB
:
6407 fprintf (file
, _("OPR_SUB (subtract)\n"));
6409 case ETIR__C_OPR_MUL
:
6410 fprintf (file
, _("OPR_MUL (multiply)\n"));
6412 case ETIR__C_OPR_DIV
:
6413 fprintf (file
, _("OPR_DIV (divide)\n"));
6415 case ETIR__C_OPR_AND
:
6416 fprintf (file
, _("OPR_AND (logical and)\n"));
6418 case ETIR__C_OPR_IOR
:
6419 fprintf (file
, _("OPR_IOR (logical inclusive or)\n"));
6421 case ETIR__C_OPR_EOR
:
6422 fprintf (file
, _("OPR_EOR (logical exclusive or)\n"));
6424 case ETIR__C_OPR_NEG
:
6425 fprintf (file
, _("OPR_NEG (negate)\n"));
6427 case ETIR__C_OPR_COM
:
6428 fprintf (file
, _("OPR_COM (complement)\n"));
6430 case ETIR__C_OPR_INSV
:
6431 fprintf (file
, _("OPR_INSV (insert field)\n"));
6433 case ETIR__C_OPR_ASH
:
6434 fprintf (file
, _("OPR_ASH (arithmetic shift)\n"));
6436 case ETIR__C_OPR_USH
:
6437 fprintf (file
, _("OPR_USH (unsigned shift)\n"));
6439 case ETIR__C_OPR_ROT
:
6440 fprintf (file
, _("OPR_ROT (rotate)\n"));
6442 case ETIR__C_OPR_SEL
:
6443 fprintf (file
, _("OPR_SEL (select)\n"));
6445 case ETIR__C_OPR_REDEF
:
6446 fprintf (file
, _("OPR_REDEF (redefine symbol to curr location)\n"));
6448 case ETIR__C_OPR_DFLIT
:
6449 fprintf (file
, _("OPR_REDEF (define a literal)\n"));
6452 case ETIR__C_STC_LP
:
6453 fprintf (file
, _("STC_LP (store cond linkage pair)\n"));
6455 case ETIR__C_STC_LP_PSB
:
6457 _("STC_LP_PSB (store cond linkage pair + signature)\n"));
6458 /* xgettext:c-format */
6459 fprintf (file
, _(" linkage index: %u, procedure: %.*s\n"),
6460 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6461 buf
+= 4 + 1 + buf
[4];
6462 fprintf (file
, _(" signature: %.*s\n"), buf
[0], buf
+ 1);
6464 case ETIR__C_STC_GBL
:
6465 fprintf (file
, _("STC_GBL (store cond global)\n"));
6466 /* xgettext:c-format */
6467 fprintf (file
, _(" linkage index: %u, global: %.*s\n"),
6468 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6470 case ETIR__C_STC_GCA
:
6471 fprintf (file
, _("STC_GCA (store cond code address)\n"));
6472 /* xgettext:c-format */
6473 fprintf (file
, _(" linkage index: %u, procedure name: %.*s\n"),
6474 (unsigned)bfd_getl32 (buf
), buf
[4], buf
+ 5);
6476 case ETIR__C_STC_PS
:
6477 fprintf (file
, _("STC_PS (store cond psect + offset)\n"));
6479 /* xgettext:c-format */
6480 _(" linkage index: %u, psect: %u, offset: 0x%08x %08x\n"),
6481 (unsigned)bfd_getl32 (buf
),
6482 (unsigned)bfd_getl32 (buf
+ 4),
6483 (unsigned)bfd_getl32 (buf
+ 12),
6484 (unsigned)bfd_getl32 (buf
+ 8));
6486 case ETIR__C_STC_NOP_GBL
:
6487 fprintf (file
, _("STC_NOP_GBL (store cond NOP at global addr)\n"));
6488 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6490 case ETIR__C_STC_NOP_PS
:
6491 fprintf (file
, _("STC_NOP_PS (store cond NOP at psect + offset)\n"));
6492 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6494 case ETIR__C_STC_BSR_GBL
:
6495 fprintf (file
, _("STC_BSR_GBL (store cond BSR at global addr)\n"));
6496 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6498 case ETIR__C_STC_BSR_PS
:
6499 fprintf (file
, _("STC_BSR_PS (store cond BSR at psect + offset)\n"));
6500 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6502 case ETIR__C_STC_LDA_GBL
:
6503 fprintf (file
, _("STC_LDA_GBL (store cond LDA at global addr)\n"));
6504 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6506 case ETIR__C_STC_LDA_PS
:
6507 fprintf (file
, _("STC_LDA_PS (store cond LDA at psect + offset)\n"));
6508 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6510 case ETIR__C_STC_BOH_GBL
:
6511 fprintf (file
, _("STC_BOH_GBL (store cond BOH at global addr)\n"));
6512 evax_bfd_print_etir_stc_ir (file
, buf
, 0);
6514 case ETIR__C_STC_BOH_PS
:
6515 fprintf (file
, _("STC_BOH_PS (store cond BOH at psect + offset)\n"));
6516 evax_bfd_print_etir_stc_ir (file
, buf
, 1);
6518 case ETIR__C_STC_NBH_GBL
:
6520 _("STC_NBH_GBL (store cond or hint at global addr)\n"));
6522 case ETIR__C_STC_NBH_PS
:
6524 _("STC_NBH_PS (store cond or hint at psect + offset)\n"));
6527 case ETIR__C_CTL_SETRB
:
6528 fprintf (file
, _("CTL_SETRB (set relocation base)\n"));
6531 case ETIR__C_CTL_AUGRB
:
6533 unsigned int val
= bfd_getl32 (buf
);
6534 fprintf (file
, _("CTL_AUGRB (augment relocation base) %u\n"), val
);
6537 case ETIR__C_CTL_DFLOC
:
6538 fprintf (file
, _("CTL_DFLOC (define location)\n"));
6540 case ETIR__C_CTL_STLOC
:
6541 fprintf (file
, _("CTL_STLOC (set location)\n"));
6543 case ETIR__C_CTL_STKDL
:
6544 fprintf (file
, _("CTL_STKDL (stack defined location)\n"));
6547 fprintf (file
, _("*unhandled*\n"));
6555 evax_bfd_print_eobj (struct bfd
*abfd
, FILE *file
)
6557 bfd_boolean is_first
= TRUE
;
6558 bfd_boolean has_records
= FALSE
;
6562 unsigned int rec_len
;
6563 unsigned int pad_len
;
6565 unsigned int hdr_size
;
6570 unsigned char buf
[6];
6575 if (bfd_bread (buf
, sizeof (buf
), abfd
) != sizeof (buf
))
6577 fprintf (file
, _("cannot read GST record length\n"));
6580 rec_len
= bfd_getl16 (buf
+ 0);
6581 if (rec_len
== bfd_getl16 (buf
+ 4)
6582 && bfd_getl16 (buf
+ 2) == EOBJ__C_EMH
)
6584 /* The format is raw: record-size, type, record-size. */
6586 pad_len
= (rec_len
+ 1) & ~1U;
6589 else if (rec_len
== EOBJ__C_EMH
)
6591 has_records
= FALSE
;
6592 pad_len
= bfd_getl16 (buf
+ 2);
6598 fprintf (file
, _("cannot find EMH in first GST record\n"));
6601 rec
= bfd_malloc (pad_len
);
6602 memcpy (rec
, buf
+ sizeof (buf
) - hdr_size
, hdr_size
);
6606 unsigned int rec_len2
= 0;
6607 unsigned char hdr
[4];
6611 unsigned char buf_len
[2];
6613 if (bfd_bread (buf_len
, sizeof (buf_len
), abfd
)
6614 != sizeof (buf_len
))
6616 fprintf (file
, _("cannot read GST record length\n"));
6619 rec_len2
= (unsigned)bfd_getl16 (buf_len
);
6622 if (bfd_bread (hdr
, sizeof (hdr
), abfd
) != sizeof (hdr
))
6624 fprintf (file
, _("cannot read GST record header\n"));
6627 rec_len
= (unsigned)bfd_getl16 (hdr
+ 2);
6629 pad_len
= (rec_len
+ 1) & ~1U;
6632 rec
= bfd_malloc (pad_len
);
6633 memcpy (rec
, hdr
, sizeof (hdr
));
6634 hdr_size
= sizeof (hdr
);
6635 if (has_records
&& rec_len2
!= rec_len
)
6637 fprintf (file
, _(" corrupted GST\n"));
6642 if (bfd_bread (rec
+ hdr_size
, pad_len
- hdr_size
, abfd
)
6643 != pad_len
- hdr_size
)
6645 fprintf (file
, _("cannot read GST record\n"));
6649 type
= (unsigned)bfd_getl16 (rec
);
6654 evax_bfd_print_emh (file
, rec
, rec_len
);
6657 evax_bfd_print_egsd (file
, rec
, rec_len
);
6660 evax_bfd_print_eeom (file
, rec
, rec_len
);
6665 evax_bfd_print_etir (file
, "ETIR", rec
, rec_len
);
6668 evax_bfd_print_etir (file
, "EDBG", rec
, rec_len
);
6671 evax_bfd_print_etir (file
, "ETBT", rec
, rec_len
);
6674 fprintf (file
, _(" unhandled EOBJ record type %u\n"), type
);
6682 evax_bfd_print_relocation_records (FILE *file
, const unsigned char *rel
,
6683 unsigned int stride
)
6691 count
= bfd_getl32 (rel
+ 0);
6695 base
= bfd_getl32 (rel
+ 4);
6697 /* xgettext:c-format */
6698 fprintf (file
, _(" bitcount: %u, base addr: 0x%08x\n"),
6702 for (j
= 0; count
> 0; j
+= 4, count
-= 32)
6708 val
= bfd_getl32 (rel
);
6711 /* xgettext:c-format */
6712 fprintf (file
, _(" bitmap: 0x%08x (count: %u):\n"), val
, count
);
6714 for (k
= 0; k
< 32; k
++)
6715 if (val
& (1u << k
))
6719 fprintf (file
, _(" %08x"), base
+ (j
* 8 + k
) * stride
);
6734 evax_bfd_print_address_fixups (FILE *file
, const unsigned char *rel
)
6741 count
= bfd_getl32 (rel
+ 0);
6744 /* xgettext:c-format */
6745 fprintf (file
, _(" image %u (%u entries)\n"),
6746 (unsigned)bfd_getl32 (rel
+ 4), count
);
6748 for (j
= 0; j
< count
; j
++)
6750 /* xgettext:c-format */
6751 fprintf (file
, _(" offset: 0x%08x, val: 0x%08x\n"),
6752 (unsigned)bfd_getl32 (rel
+ 0),
6753 (unsigned)bfd_getl32 (rel
+ 4));
6760 evax_bfd_print_reference_fixups (FILE *file
, const unsigned char *rel
)
6769 count
= bfd_getl32 (rel
+ 0);
6772 /* xgettext:c-format */
6773 fprintf (file
, _(" image %u (%u entries), offsets:\n"),
6774 (unsigned)bfd_getl32 (rel
+ 4), count
);
6776 for (j
= 0; j
< count
; j
++)
6780 fprintf (file
, _(" 0x%08x"), (unsigned)bfd_getl32 (rel
));
6795 evax_bfd_print_indent (int indent
, FILE *file
)
6797 for (; indent
; indent
--)
6802 evax_bfd_get_dsc_name (unsigned int v
)
6806 case DSC__K_DTYPE_Z
:
6807 return "Z (Unspecified)";
6808 case DSC__K_DTYPE_V
:
6810 case DSC__K_DTYPE_BU
:
6811 return "BU (Byte logical)";
6812 case DSC__K_DTYPE_WU
:
6813 return "WU (Word logical)";
6814 case DSC__K_DTYPE_LU
:
6815 return "LU (Longword logical)";
6816 case DSC__K_DTYPE_QU
:
6817 return "QU (Quadword logical)";
6818 case DSC__K_DTYPE_B
:
6819 return "B (Byte integer)";
6820 case DSC__K_DTYPE_W
:
6821 return "W (Word integer)";
6822 case DSC__K_DTYPE_L
:
6823 return "L (Longword integer)";
6824 case DSC__K_DTYPE_Q
:
6825 return "Q (Quadword integer)";
6826 case DSC__K_DTYPE_F
:
6827 return "F (Single-precision floating)";
6828 case DSC__K_DTYPE_D
:
6829 return "D (Double-precision floating)";
6830 case DSC__K_DTYPE_FC
:
6831 return "FC (Complex)";
6832 case DSC__K_DTYPE_DC
:
6833 return "DC (Double-precision Complex)";
6834 case DSC__K_DTYPE_T
:
6835 return "T (ASCII text string)";
6836 case DSC__K_DTYPE_NU
:
6837 return "NU (Numeric string, unsigned)";
6838 case DSC__K_DTYPE_NL
:
6839 return "NL (Numeric string, left separate sign)";
6840 case DSC__K_DTYPE_NLO
:
6841 return "NLO (Numeric string, left overpunched sign)";
6842 case DSC__K_DTYPE_NR
:
6843 return "NR (Numeric string, right separate sign)";
6844 case DSC__K_DTYPE_NRO
:
6845 return "NRO (Numeric string, right overpunched sig)";
6846 case DSC__K_DTYPE_NZ
:
6847 return "NZ (Numeric string, zoned sign)";
6848 case DSC__K_DTYPE_P
:
6849 return "P (Packed decimal string)";
6850 case DSC__K_DTYPE_ZI
:
6851 return "ZI (Sequence of instructions)";
6852 case DSC__K_DTYPE_ZEM
:
6853 return "ZEM (Procedure entry mask)";
6854 case DSC__K_DTYPE_DSC
:
6855 return "DSC (Descriptor, used for arrays of dyn strings)";
6856 case DSC__K_DTYPE_OU
:
6857 return "OU (Octaword logical)";
6858 case DSC__K_DTYPE_O
:
6859 return "O (Octaword integer)";
6860 case DSC__K_DTYPE_G
:
6861 return "G (Double precision G floating, 64 bit)";
6862 case DSC__K_DTYPE_H
:
6863 return "H (Quadruple precision floating, 128 bit)";
6864 case DSC__K_DTYPE_GC
:
6865 return "GC (Double precision complex, G floating)";
6866 case DSC__K_DTYPE_HC
:
6867 return "HC (Quadruple precision complex, H floating)";
6868 case DSC__K_DTYPE_CIT
:
6869 return "CIT (COBOL intermediate temporary)";
6870 case DSC__K_DTYPE_BPV
:
6871 return "BPV (Bound Procedure Value)";
6872 case DSC__K_DTYPE_BLV
:
6873 return "BLV (Bound Label Value)";
6874 case DSC__K_DTYPE_VU
:
6875 return "VU (Bit Unaligned)";
6876 case DSC__K_DTYPE_ADT
:
6877 return "ADT (Absolute Date-Time)";
6878 case DSC__K_DTYPE_VT
:
6879 return "VT (Varying Text)";
6880 case DSC__K_DTYPE_T2
:
6881 return "T2 (16-bit char)";
6882 case DSC__K_DTYPE_VT2
:
6883 return "VT2 (16-bit varying char)";
6885 return "?? (unknown)";
6890 evax_bfd_print_desc (const unsigned char *buf
, int indent
, FILE *file
)
6892 unsigned char bclass
= buf
[3];
6893 unsigned char dtype
= buf
[2];
6894 unsigned int len
= (unsigned)bfd_getl16 (buf
);
6895 unsigned int pointer
= (unsigned)bfd_getl32 (buf
+ 4);
6897 evax_bfd_print_indent (indent
, file
);
6899 if (len
== 1 && pointer
== 0xffffffffUL
)
6902 fprintf (file
, _("64 bits *unhandled*\n"));
6906 /* xgettext:c-format */
6907 fprintf (file
, _("class: %u, dtype: %u, length: %u, pointer: 0x%08x\n"),
6908 bclass
, dtype
, len
, pointer
);
6911 case DSC__K_CLASS_NCA
:
6913 const struct vms_dsc_nca
*dsc
= (const void *)buf
;
6915 const unsigned char *b
;
6917 evax_bfd_print_indent (indent
, file
);
6918 fprintf (file
, _("non-contiguous array of %s\n"),
6919 evax_bfd_get_dsc_name (dsc
->dtype
));
6920 evax_bfd_print_indent (indent
+ 1, file
);
6922 /* xgettext:c-format */
6923 _("dimct: %u, aflags: 0x%02x, digits: %u, scale: %u\n"),
6924 dsc
->dimct
, dsc
->aflags
, dsc
->digits
, dsc
->scale
);
6925 evax_bfd_print_indent (indent
+ 1, file
);
6927 /* xgettext:c-format */
6928 _("arsize: %u, a0: 0x%08x\n"),
6929 (unsigned)bfd_getl32 (dsc
->arsize
),
6930 (unsigned)bfd_getl32 (dsc
->a0
));
6931 evax_bfd_print_indent (indent
+ 1, file
);
6932 fprintf (file
, _("Strides:\n"));
6933 b
= buf
+ sizeof (*dsc
);
6934 for (i
= 0; i
< dsc
->dimct
; i
++)
6936 evax_bfd_print_indent (indent
+ 2, file
);
6937 fprintf (file
, "[%u]: %u\n", i
+ 1,
6938 (unsigned)bfd_getl32 (b
));
6941 evax_bfd_print_indent (indent
+ 1, file
);
6942 fprintf (file
, _("Bounds:\n"));
6943 b
= buf
+ sizeof (*dsc
);
6944 for (i
= 0; i
< dsc
->dimct
; i
++)
6946 evax_bfd_print_indent (indent
+ 2, file
);
6947 /* xgettext:c-format */
6948 fprintf (file
, _("[%u]: Lower: %u, upper: %u\n"), i
+ 1,
6949 (unsigned)bfd_getl32 (b
+ 0),
6950 (unsigned)bfd_getl32 (b
+ 4));
6955 case DSC__K_CLASS_UBS
:
6957 const struct vms_dsc_ubs
*ubs
= (const void *)buf
;
6959 evax_bfd_print_indent (indent
, file
);
6960 fprintf (file
, _("unaligned bit-string of %s\n"),
6961 evax_bfd_get_dsc_name (ubs
->dtype
));
6962 evax_bfd_print_indent (indent
+ 1, file
);
6964 /* xgettext:c-format */
6965 _("base: %u, pos: %u\n"),
6966 (unsigned)bfd_getl32 (ubs
->base
),
6967 (unsigned)bfd_getl32 (ubs
->pos
));
6971 fprintf (file
, _("*unhandled*\n"));
6978 evax_bfd_print_valspec (const unsigned char *buf
, int indent
, FILE *file
)
6980 unsigned int vflags
= buf
[0];
6981 unsigned int value
= (unsigned)bfd_getl32 (buf
+ 1);
6982 unsigned int len
= 5;
6984 evax_bfd_print_indent (indent
, file
);
6985 /* xgettext:c-format */
6986 fprintf (file
, _("vflags: 0x%02x, value: 0x%08x "), vflags
, value
);
6991 case DST__K_VFLAGS_NOVAL
:
6992 fprintf (file
, _("(no value)\n"));
6994 case DST__K_VFLAGS_NOTACTIVE
:
6995 fprintf (file
, _("(not active)\n"));
6997 case DST__K_VFLAGS_UNALLOC
:
6998 fprintf (file
, _("(not allocated)\n"));
7000 case DST__K_VFLAGS_DSC
:
7001 fprintf (file
, _("(descriptor)\n"));
7002 evax_bfd_print_desc (buf
+ value
, indent
+ 1, file
);
7004 case DST__K_VFLAGS_TVS
:
7005 fprintf (file
, _("(trailing value)\n"));
7007 case DST__K_VS_FOLLOWS
:
7008 fprintf (file
, _("(value spec follows)\n"));
7010 case DST__K_VFLAGS_BITOFFS
:
7011 fprintf (file
, _("(at bit offset %u)\n"), value
);
7014 /* xgettext:c-format */
7015 fprintf (file
, _("(reg: %u, disp: %u, indir: %u, kind: "),
7016 (vflags
& DST__K_REGNUM_MASK
) >> DST__K_REGNUM_SHIFT
,
7017 vflags
& DST__K_DISP
? 1 : 0,
7018 vflags
& DST__K_INDIR
? 1 : 0);
7019 switch (vflags
& DST__K_VALKIND_MASK
)
7021 case DST__K_VALKIND_LITERAL
:
7022 fputs (_("literal"), file
);
7024 case DST__K_VALKIND_ADDR
:
7025 fputs (_("address"), file
);
7027 case DST__K_VALKIND_DESC
:
7028 fputs (_("desc"), file
);
7030 case DST__K_VALKIND_REG
:
7031 fputs (_("reg"), file
);
7034 fputs (")\n", file
);
7041 evax_bfd_print_typspec (const unsigned char *buf
, int indent
, FILE *file
)
7043 unsigned char kind
= buf
[2];
7044 unsigned int len
= (unsigned)bfd_getl16 (buf
);
7046 evax_bfd_print_indent (indent
, file
);
7047 /* xgettext:c-format */
7048 fprintf (file
, _("len: %2u, kind: %2u "), len
, kind
);
7052 case DST__K_TS_ATOM
:
7053 /* xgettext:c-format */
7054 fprintf (file
, _("atomic, type=0x%02x %s\n"),
7055 buf
[0], evax_bfd_get_dsc_name (buf
[0]));
7058 fprintf (file
, _("indirect, defined at 0x%08x\n"),
7059 (unsigned)bfd_getl32 (buf
));
7061 case DST__K_TS_TPTR
:
7062 fprintf (file
, _("typed pointer\n"));
7063 evax_bfd_print_typspec (buf
, indent
+ 1, file
);
7066 fprintf (file
, _("pointer\n"));
7068 case DST__K_TS_ARRAY
:
7070 const unsigned char *vs
;
7071 unsigned int vec_len
;
7074 fprintf (file
, _("array, dim: %u, bitmap: "), buf
[0]);
7075 vec_len
= (buf
[0] + 1 + 7) / 8;
7076 for (i
= 0; i
< vec_len
; i
++)
7077 fprintf (file
, " %02x", buf
[i
+ 1]);
7079 vs
= buf
+ 1 + vec_len
;
7080 evax_bfd_print_indent (indent
, file
);
7081 fprintf (file
, _("array descriptor:\n"));
7082 vs
+= evax_bfd_print_valspec (vs
, indent
+ 1, file
);
7083 for (i
= 0; i
< buf
[0] + 1U; i
++)
7084 if (buf
[1 + i
/ 8] & (1 << (i
% 8)))
7086 evax_bfd_print_indent (indent
, file
);
7088 fprintf (file
, _("type spec for element:\n"));
7090 fprintf (file
, _("type spec for subscript %u:\n"), i
);
7091 evax_bfd_print_typspec (vs
, indent
+ 1, file
);
7092 vs
+= bfd_getl16 (vs
);
7097 fprintf (file
, _("*unhandled*\n"));
7102 evax_bfd_print_dst (struct bfd
*abfd
, unsigned int dst_size
, FILE *file
)
7104 unsigned int off
= 0;
7105 unsigned int pc
= 0;
7106 unsigned int line
= 0;
7108 fprintf (file
, _("Debug symbol table:\n"));
7110 while (dst_size
> 0)
7112 struct vms_dst_header dsth
;
7117 if (bfd_bread (&dsth
, sizeof (dsth
), abfd
) != sizeof (dsth
))
7119 fprintf (file
, _("cannot read DST header\n"));
7122 len
= bfd_getl16 (dsth
.length
);
7123 type
= bfd_getl16 (dsth
.type
);
7124 /* xgettext:c-format */
7125 fprintf (file
, _(" type: %3u, len: %3u (at 0x%08x): "),
7135 len
-= sizeof (dsth
);
7136 buf
= _bfd_malloc_and_read (abfd
, len
, len
);
7139 fprintf (file
, _("cannot read DST symbol\n"));
7144 case DSC__K_DTYPE_V
:
7145 case DSC__K_DTYPE_BU
:
7146 case DSC__K_DTYPE_WU
:
7147 case DSC__K_DTYPE_LU
:
7148 case DSC__K_DTYPE_QU
:
7149 case DSC__K_DTYPE_B
:
7150 case DSC__K_DTYPE_W
:
7151 case DSC__K_DTYPE_L
:
7152 case DSC__K_DTYPE_Q
:
7153 case DSC__K_DTYPE_F
:
7154 case DSC__K_DTYPE_D
:
7155 case DSC__K_DTYPE_FC
:
7156 case DSC__K_DTYPE_DC
:
7157 case DSC__K_DTYPE_T
:
7158 case DSC__K_DTYPE_NU
:
7159 case DSC__K_DTYPE_NL
:
7160 case DSC__K_DTYPE_NLO
:
7161 case DSC__K_DTYPE_NR
:
7162 case DSC__K_DTYPE_NRO
:
7163 case DSC__K_DTYPE_NZ
:
7164 case DSC__K_DTYPE_P
:
7165 case DSC__K_DTYPE_ZI
:
7166 case DSC__K_DTYPE_ZEM
:
7167 case DSC__K_DTYPE_DSC
:
7168 case DSC__K_DTYPE_OU
:
7169 case DSC__K_DTYPE_O
:
7170 case DSC__K_DTYPE_G
:
7171 case DSC__K_DTYPE_H
:
7172 case DSC__K_DTYPE_GC
:
7173 case DSC__K_DTYPE_HC
:
7174 case DSC__K_DTYPE_CIT
:
7175 case DSC__K_DTYPE_BPV
:
7176 case DSC__K_DTYPE_BLV
:
7177 case DSC__K_DTYPE_VU
:
7178 case DSC__K_DTYPE_ADT
:
7179 case DSC__K_DTYPE_VT
:
7180 case DSC__K_DTYPE_T2
:
7181 case DSC__K_DTYPE_VT2
:
7182 fprintf (file
, _("standard data: %s\n"),
7183 evax_bfd_get_dsc_name (type
));
7184 evax_bfd_print_valspec (buf
, 4, file
);
7185 fprintf (file
, _(" name: %.*s\n"), buf
[5], buf
+ 6);
7189 struct vms_dst_modbeg
*dst
= (void *)buf
;
7190 const char *name
= (const char *)buf
+ sizeof (*dst
);
7192 fprintf (file
, _("modbeg\n"));
7193 /* xgettext:c-format */
7194 fprintf (file
, _(" flags: %d, language: %u, "
7195 "major: %u, minor: %u\n"),
7197 (unsigned)bfd_getl32 (dst
->language
),
7198 (unsigned)bfd_getl16 (dst
->major
),
7199 (unsigned)bfd_getl16 (dst
->minor
));
7200 fprintf (file
, _(" module name: %.*s\n"),
7202 name
+= name
[0] + 1;
7203 fprintf (file
, _(" compiler : %.*s\n"),
7208 fprintf (file
, _("modend\n"));
7212 struct vms_dst_rtnbeg
*dst
= (void *)buf
;
7213 const char *name
= (const char *)buf
+ sizeof (*dst
);
7215 fputs (_("rtnbeg\n"), file
);
7216 /* xgettext:c-format */
7217 fprintf (file
, _(" flags: %u, address: 0x%08x, "
7218 "pd-address: 0x%08x\n"),
7220 (unsigned)bfd_getl32 (dst
->address
),
7221 (unsigned)bfd_getl32 (dst
->pd_address
));
7222 fprintf (file
, _(" routine name: %.*s\n"),
7228 struct vms_dst_rtnend
*dst
= (void *)buf
;
7230 fprintf (file
, _("rtnend: size 0x%08x\n"),
7231 (unsigned)bfd_getl32 (dst
->size
));
7236 struct vms_dst_prolog
*dst
= (void *)buf
;
7238 fprintf (file
, _("prolog: bkpt address 0x%08x\n"),
7239 (unsigned)bfd_getl32 (dst
->bkpt_addr
));
7244 struct vms_dst_epilog
*dst
= (void *)buf
;
7246 /* xgettext:c-format */
7247 fprintf (file
, _("epilog: flags: %u, count: %u\n"),
7248 dst
->flags
, (unsigned)bfd_getl32 (dst
->count
));
7253 struct vms_dst_blkbeg
*dst
= (void *)buf
;
7254 const char *name
= (const char *)buf
+ sizeof (*dst
);
7256 /* xgettext:c-format */
7257 fprintf (file
, _("blkbeg: address: 0x%08x, name: %.*s\n"),
7258 (unsigned)bfd_getl32 (dst
->address
),
7264 struct vms_dst_blkend
*dst
= (void *)buf
;
7266 fprintf (file
, _("blkend: size: 0x%08x\n"),
7267 (unsigned)bfd_getl32 (dst
->size
));
7270 case DST__K_TYPSPEC
:
7272 fprintf (file
, _("typspec (len: %u)\n"), len
);
7273 fprintf (file
, _(" name: %.*s\n"), buf
[0], buf
+ 1);
7274 evax_bfd_print_typspec (buf
+ 1 + buf
[0], 5, file
);
7279 fprintf (file
, _("septyp, name: %.*s\n"), buf
[5], buf
+ 6);
7280 evax_bfd_print_valspec (buf
, 4, file
);
7285 struct vms_dst_recbeg
*recbeg
= (void *)buf
;
7286 const char *name
= (const char *)buf
+ sizeof (*recbeg
);
7288 fprintf (file
, _("recbeg: name: %.*s\n"), name
[0], name
+ 1);
7289 evax_bfd_print_valspec (buf
, 4, file
);
7290 fprintf (file
, _(" len: %u bits\n"),
7291 (unsigned)bfd_getl32 (name
+ 1 + name
[0]));
7295 fprintf (file
, _("recend\n"));
7297 case DST__K_ENUMBEG
:
7298 /* xgettext:c-format */
7299 fprintf (file
, _("enumbeg, len: %u, name: %.*s\n"),
7300 buf
[0], buf
[1], buf
+ 2);
7302 case DST__K_ENUMELT
:
7303 fprintf (file
, _("enumelt, name: %.*s\n"), buf
[5], buf
+ 6);
7304 evax_bfd_print_valspec (buf
, 4, file
);
7306 case DST__K_ENUMEND
:
7307 fprintf (file
, _("enumend\n"));
7311 struct vms_dst_label
*lab
= (void *)buf
;
7312 fprintf (file
, _("label, name: %.*s\n"),
7313 lab
->name
[0], lab
->name
+ 1);
7314 fprintf (file
, _(" address: 0x%08x\n"),
7315 (unsigned)bfd_getl32 (lab
->value
));
7318 case DST__K_DIS_RANGE
:
7320 unsigned int cnt
= bfd_getl32 (buf
);
7321 unsigned char *rng
= buf
+ 4;
7324 fprintf (file
, _("discontiguous range (nbr: %u)\n"), cnt
);
7325 for (i
= 0; i
< cnt
; i
++, rng
+= 8)
7326 /* xgettext:c-format */
7327 fprintf (file
, _(" address: 0x%08x, size: %u\n"),
7328 (unsigned)bfd_getl32 (rng
),
7329 (unsigned)bfd_getl32 (rng
+ 4));
7333 case DST__K_LINE_NUM
:
7335 unsigned char *buf_orig
= buf
;
7337 fprintf (file
, _("line num (len: %u)\n"), len
);
7342 unsigned char cmdlen
;
7352 case DST__K_DELTA_PC_W
:
7353 val
= bfd_getl16 (buf
+ 1);
7354 fprintf (file
, _("delta_pc_w %u\n"), val
);
7359 case DST__K_INCR_LINUM
:
7361 fprintf (file
, _("incr_linum(b): +%u\n"), val
);
7365 case DST__K_INCR_LINUM_W
:
7366 val
= bfd_getl16 (buf
+ 1);
7367 fprintf (file
, _("incr_linum_w: +%u\n"), val
);
7371 case DST__K_INCR_LINUM_L
:
7372 val
= bfd_getl32 (buf
+ 1);
7373 fprintf (file
, _("incr_linum_l: +%u\n"), val
);
7377 case DST__K_SET_LINUM
:
7378 line
= bfd_getl16 (buf
+ 1);
7379 fprintf (file
, _("set_line_num(w) %u\n"), line
);
7382 case DST__K_SET_LINUM_B
:
7384 fprintf (file
, _("set_line_num_b %u\n"), line
);
7387 case DST__K_SET_LINUM_L
:
7388 line
= bfd_getl32 (buf
+ 1);
7389 fprintf (file
, _("set_line_num_l %u\n"), line
);
7392 case DST__K_SET_ABS_PC
:
7393 pc
= bfd_getl32 (buf
+ 1);
7394 fprintf (file
, _("set_abs_pc: 0x%08x\n"), pc
);
7397 case DST__K_DELTA_PC_L
:
7398 fprintf (file
, _("delta_pc_l: +0x%08x\n"),
7399 (unsigned)bfd_getl32 (buf
+ 1));
7403 fprintf (file
, _("term(b): 0x%02x"), buf
[1]);
7405 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7409 val
= bfd_getl16 (buf
+ 1);
7410 fprintf (file
, _("term_w: 0x%04x"), val
);
7412 fprintf (file
, _(" pc: 0x%08x\n"), pc
);
7418 fprintf (file
, _("delta pc +%-4d"), -cmd
);
7419 line
++; /* FIXME: curr increment. */
7421 /* xgettext:c-format */
7422 fprintf (file
, _(" pc: 0x%08x line: %5u\n"),
7427 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
7440 unsigned char *buf_orig
= buf
;
7442 fprintf (file
, _("source (len: %u)\n"), len
);
7446 signed char cmd
= buf
[0];
7447 unsigned char cmdlen
= 0;
7451 case DST__K_SRC_DECLFILE
:
7453 struct vms_dst_src_decl_src
*src
= (void *)(buf
+ 1);
7456 /* xgettext:c-format */
7457 fprintf (file
, _(" declfile: len: %u, flags: %u, "
7459 src
->length
, src
->flags
,
7460 (unsigned)bfd_getl16 (src
->fileid
));
7461 /* xgettext:c-format */
7462 fprintf (file
, _(" rms: cdt: 0x%08x %08x, "
7463 "ebk: 0x%08x, ffb: 0x%04x, "
7465 (unsigned)bfd_getl32 (src
->rms_cdt
+ 4),
7466 (unsigned)bfd_getl32 (src
->rms_cdt
+ 0),
7467 (unsigned)bfd_getl32 (src
->rms_ebk
),
7468 (unsigned)bfd_getl16 (src
->rms_ffb
),
7470 name
= (const char *)buf
+ 1 + sizeof (*src
);
7471 fprintf (file
, _(" filename : %.*s\n"),
7473 name
+= name
[0] + 1;
7474 fprintf (file
, _(" module name: %.*s\n"),
7476 cmdlen
= 2 + src
->length
;
7479 case DST__K_SRC_SETFILE
:
7480 fprintf (file
, _(" setfile %u\n"),
7481 (unsigned)bfd_getl16 (buf
+ 1));
7484 case DST__K_SRC_SETREC_W
:
7485 fprintf (file
, _(" setrec %u\n"),
7486 (unsigned)bfd_getl16 (buf
+ 1));
7489 case DST__K_SRC_SETREC_L
:
7490 fprintf (file
, _(" setrec %u\n"),
7491 (unsigned)bfd_getl32 (buf
+ 1));
7494 case DST__K_SRC_SETLNUM_W
:
7495 fprintf (file
, _(" setlnum %u\n"),
7496 (unsigned)bfd_getl16 (buf
+ 1));
7499 case DST__K_SRC_SETLNUM_L
:
7500 fprintf (file
, _(" setlnum %u\n"),
7501 (unsigned)bfd_getl32 (buf
+ 1));
7504 case DST__K_SRC_DEFLINES_W
:
7505 fprintf (file
, _(" deflines %u\n"),
7506 (unsigned)bfd_getl16 (buf
+ 1));
7509 case DST__K_SRC_DEFLINES_B
:
7510 fprintf (file
, _(" deflines %u\n"), buf
[1]);
7513 case DST__K_SRC_FORMFEED
:
7514 fprintf (file
, _(" formfeed\n"));
7518 fprintf (file
, _(" *unhandled* cmd %u\n"), cmd
);
7530 fprintf (file
, _("*unhandled* dst type %u\n"), type
);
7538 evax_bfd_print_image (bfd
*abfd
, FILE *file
)
7540 struct vms_eihd eihd
;
7543 unsigned int eiha_off
;
7544 unsigned int eihi_off
;
7545 unsigned int eihs_off
;
7546 unsigned int eisd_off
;
7547 unsigned int eihef_off
= 0;
7548 unsigned int eihnp_off
= 0;
7549 unsigned int dmt_vbn
= 0;
7550 unsigned int dmt_size
= 0;
7551 unsigned int dst_vbn
= 0;
7552 unsigned int dst_size
= 0;
7553 unsigned int gst_vbn
= 0;
7554 unsigned int gst_size
= 0;
7555 unsigned int eiaf_vbn
= 0;
7556 unsigned int eiaf_size
= 0;
7557 unsigned int eihvn_off
;
7559 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
)
7560 || bfd_bread (&eihd
, sizeof (eihd
), abfd
) != sizeof (eihd
))
7562 fprintf (file
, _("cannot read EIHD\n"));
7565 /* xgettext:c-format */
7566 fprintf (file
, _("EIHD: (size: %u, nbr blocks: %u)\n"),
7567 (unsigned)bfd_getl32 (eihd
.size
),
7568 (unsigned)bfd_getl32 (eihd
.hdrblkcnt
));
7569 /* xgettext:c-format */
7570 fprintf (file
, _(" majorid: %u, minorid: %u\n"),
7571 (unsigned)bfd_getl32 (eihd
.majorid
),
7572 (unsigned)bfd_getl32 (eihd
.minorid
));
7574 val
= (unsigned)bfd_getl32 (eihd
.imgtype
);
7578 name
= _("executable");
7581 name
= _("linkable image");
7584 name
= _("unknown");
7587 /* xgettext:c-format */
7588 fprintf (file
, _(" image type: %u (%s)"), val
, name
);
7590 val
= (unsigned)bfd_getl32 (eihd
.subtype
);
7593 case EIHD__C_NATIVE
:
7600 name
= _("unknown");
7603 /* xgettext:c-format */
7604 fprintf (file
, _(", subtype: %u (%s)\n"), val
, name
);
7606 eisd_off
= bfd_getl32 (eihd
.isdoff
);
7607 eiha_off
= bfd_getl32 (eihd
.activoff
);
7608 eihi_off
= bfd_getl32 (eihd
.imgidoff
);
7609 eihs_off
= bfd_getl32 (eihd
.symdbgoff
);
7610 /* xgettext:c-format */
7611 fprintf (file
, _(" offsets: isd: %u, activ: %u, symdbg: %u, "
7612 "imgid: %u, patch: %u\n"),
7613 eisd_off
, eiha_off
, eihs_off
, eihi_off
,
7614 (unsigned)bfd_getl32 (eihd
.patchoff
));
7615 fprintf (file
, _(" fixup info rva: "));
7616 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.iafva
));
7617 fprintf (file
, _(", symbol vector rva: "));
7618 bfd_fprintf_vma (abfd
, file
, bfd_getl64 (eihd
.symvva
));
7619 eihvn_off
= bfd_getl32 (eihd
.version_array_off
);
7620 fprintf (file
, _("\n"
7621 " version array off: %u\n"),
7624 /* xgettext:c-format */
7625 _(" img I/O count: %u, nbr channels: %u, req pri: %08x%08x\n"),
7626 (unsigned)bfd_getl32 (eihd
.imgiocnt
),
7627 (unsigned)bfd_getl32 (eihd
.iochancnt
),
7628 (unsigned)bfd_getl32 (eihd
.privreqs
+ 4),
7629 (unsigned)bfd_getl32 (eihd
.privreqs
+ 0));
7630 val
= (unsigned)bfd_getl32 (eihd
.lnkflags
);
7631 fprintf (file
, _(" linker flags: %08x:"), val
);
7632 if (val
& EIHD__M_LNKDEBUG
)
7633 fprintf (file
, " LNKDEBUG");
7634 if (val
& EIHD__M_LNKNOTFR
)
7635 fprintf (file
, " LNKNOTFR");
7636 if (val
& EIHD__M_NOP0BUFS
)
7637 fprintf (file
, " NOP0BUFS");
7638 if (val
& EIHD__M_PICIMG
)
7639 fprintf (file
, " PICIMG");
7640 if (val
& EIHD__M_P0IMAGE
)
7641 fprintf (file
, " P0IMAGE");
7642 if (val
& EIHD__M_DBGDMT
)
7643 fprintf (file
, " DBGDMT");
7644 if (val
& EIHD__M_INISHR
)
7645 fprintf (file
, " INISHR");
7646 if (val
& EIHD__M_XLATED
)
7647 fprintf (file
, " XLATED");
7648 if (val
& EIHD__M_BIND_CODE_SEC
)
7649 fprintf (file
, " BIND_CODE_SEC");
7650 if (val
& EIHD__M_BIND_DATA_SEC
)
7651 fprintf (file
, " BIND_DATA_SEC");
7652 if (val
& EIHD__M_MKTHREADS
)
7653 fprintf (file
, " MKTHREADS");
7654 if (val
& EIHD__M_UPCALLS
)
7655 fprintf (file
, " UPCALLS");
7656 if (val
& EIHD__M_OMV_READY
)
7657 fprintf (file
, " OMV_READY");
7658 if (val
& EIHD__M_EXT_BIND_SECT
)
7659 fprintf (file
, " EXT_BIND_SECT");
7660 fprintf (file
, "\n");
7661 /* xgettext:c-format */
7662 fprintf (file
, _(" ident: 0x%08x, sysver: 0x%08x, "
7663 "match ctrl: %u, symvect_size: %u\n"),
7664 (unsigned)bfd_getl32 (eihd
.ident
),
7665 (unsigned)bfd_getl32 (eihd
.sysver
),
7667 (unsigned)bfd_getl32 (eihd
.symvect_size
));
7668 fprintf (file
, _(" BPAGE: %u"),
7669 (unsigned)bfd_getl32 (eihd
.virt_mem_block_size
));
7670 if (val
& (EIHD__M_OMV_READY
| EIHD__M_EXT_BIND_SECT
))
7672 eihef_off
= bfd_getl32 (eihd
.ext_fixup_off
);
7673 eihnp_off
= bfd_getl32 (eihd
.noopt_psect_off
);
7674 /* xgettext:c-format */
7675 fprintf (file
, _(", ext fixup offset: %u, no_opt psect off: %u"),
7676 eihef_off
, eihnp_off
);
7678 fprintf (file
, _(", alias: %u\n"), (unsigned)bfd_getl16 (eihd
.alias
));
7682 struct vms_eihvn eihvn
;
7686 fprintf (file
, _("system version array information:\n"));
7687 if (bfd_seek (abfd
, (file_ptr
) eihvn_off
, SEEK_SET
)
7688 || bfd_bread (&eihvn
, sizeof (eihvn
), abfd
) != sizeof (eihvn
))
7690 fprintf (file
, _("cannot read EIHVN header\n"));
7693 mask
= bfd_getl32 (eihvn
.subsystem_mask
);
7694 for (j
= 0; j
< 32; j
++)
7695 if (mask
& (1 << j
))
7697 struct vms_eihvn_subversion ver
;
7698 if (bfd_bread (&ver
, sizeof (ver
), abfd
) != sizeof (ver
))
7700 fprintf (file
, _("cannot read EIHVN version\n"));
7703 fprintf (file
, _(" %02u "), j
);
7706 case EIHVN__BASE_IMAGE_BIT
:
7707 fputs (_("BASE_IMAGE "), file
);
7709 case EIHVN__MEMORY_MANAGEMENT_BIT
:
7710 fputs (_("MEMORY_MANAGEMENT"), file
);
7713 fputs (_("IO "), file
);
7715 case EIHVN__FILES_VOLUMES_BIT
:
7716 fputs (_("FILES_VOLUMES "), file
);
7718 case EIHVN__PROCESS_SCHED_BIT
:
7719 fputs (_("PROCESS_SCHED "), file
);
7721 case EIHVN__SYSGEN_BIT
:
7722 fputs (_("SYSGEN "), file
);
7724 case EIHVN__CLUSTERS_LOCKMGR_BIT
:
7725 fputs (_("CLUSTERS_LOCKMGR "), file
);
7727 case EIHVN__LOGICAL_NAMES_BIT
:
7728 fputs (_("LOGICAL_NAMES "), file
);
7730 case EIHVN__SECURITY_BIT
:
7731 fputs (_("SECURITY "), file
);
7733 case EIHVN__IMAGE_ACTIVATOR_BIT
:
7734 fputs (_("IMAGE_ACTIVATOR "), file
);
7736 case EIHVN__NETWORKS_BIT
:
7737 fputs (_("NETWORKS "), file
);
7739 case EIHVN__COUNTERS_BIT
:
7740 fputs (_("COUNTERS "), file
);
7742 case EIHVN__STABLE_BIT
:
7743 fputs (_("STABLE "), file
);
7745 case EIHVN__MISC_BIT
:
7746 fputs (_("MISC "), file
);
7748 case EIHVN__CPU_BIT
:
7749 fputs (_("CPU "), file
);
7751 case EIHVN__VOLATILE_BIT
:
7752 fputs (_("VOLATILE "), file
);
7754 case EIHVN__SHELL_BIT
:
7755 fputs (_("SHELL "), file
);
7757 case EIHVN__POSIX_BIT
:
7758 fputs (_("POSIX "), file
);
7760 case EIHVN__MULTI_PROCESSING_BIT
:
7761 fputs (_("MULTI_PROCESSING "), file
);
7763 case EIHVN__GALAXY_BIT
:
7764 fputs (_("GALAXY "), file
);
7767 fputs (_("*unknown* "), file
);
7770 fprintf (file
, ": %u.%u\n",
7771 (unsigned)bfd_getl16 (ver
.major
),
7772 (unsigned)bfd_getl16 (ver
.minor
));
7778 struct vms_eiha eiha
;
7780 if (bfd_seek (abfd
, (file_ptr
) eiha_off
, SEEK_SET
)
7781 || bfd_bread (&eiha
, sizeof (eiha
), abfd
) != sizeof (eiha
))
7783 fprintf (file
, _("cannot read EIHA\n"));
7786 fprintf (file
, _("Image activation: (size=%u)\n"),
7787 (unsigned)bfd_getl32 (eiha
.size
));
7788 /* xgettext:c-format */
7789 fprintf (file
, _(" First address : 0x%08x 0x%08x\n"),
7790 (unsigned)bfd_getl32 (eiha
.tfradr1_h
),
7791 (unsigned)bfd_getl32 (eiha
.tfradr1
));
7792 /* xgettext:c-format */
7793 fprintf (file
, _(" Second address: 0x%08x 0x%08x\n"),
7794 (unsigned)bfd_getl32 (eiha
.tfradr2_h
),
7795 (unsigned)bfd_getl32 (eiha
.tfradr2
));
7796 /* xgettext:c-format */
7797 fprintf (file
, _(" Third address : 0x%08x 0x%08x\n"),
7798 (unsigned)bfd_getl32 (eiha
.tfradr3_h
),
7799 (unsigned)bfd_getl32 (eiha
.tfradr3
));
7800 /* xgettext:c-format */
7801 fprintf (file
, _(" Fourth address: 0x%08x 0x%08x\n"),
7802 (unsigned)bfd_getl32 (eiha
.tfradr4_h
),
7803 (unsigned)bfd_getl32 (eiha
.tfradr4
));
7804 /* xgettext:c-format */
7805 fprintf (file
, _(" Shared image : 0x%08x 0x%08x\n"),
7806 (unsigned)bfd_getl32 (eiha
.inishr_h
),
7807 (unsigned)bfd_getl32 (eiha
.inishr
));
7811 struct vms_eihi eihi
;
7813 if (bfd_seek (abfd
, (file_ptr
) eihi_off
, SEEK_SET
)
7814 || bfd_bread (&eihi
, sizeof (eihi
), abfd
) != sizeof (eihi
))
7816 fprintf (file
, _("cannot read EIHI\n"));
7819 /* xgettext:c-format */
7820 fprintf (file
, _("Image identification: (major: %u, minor: %u)\n"),
7821 (unsigned)bfd_getl32 (eihi
.majorid
),
7822 (unsigned)bfd_getl32 (eihi
.minorid
));
7823 fprintf (file
, _(" image name : %.*s\n"),
7824 eihi
.imgnam
[0], eihi
.imgnam
+ 1);
7825 fprintf (file
, _(" link time : %s\n"),
7826 vms_time_to_str (eihi
.linktime
));
7827 fprintf (file
, _(" image ident : %.*s\n"),
7828 eihi
.imgid
[0], eihi
.imgid
+ 1);
7829 fprintf (file
, _(" linker ident : %.*s\n"),
7830 eihi
.linkid
[0], eihi
.linkid
+ 1);
7831 fprintf (file
, _(" image build ident: %.*s\n"),
7832 eihi
.imgbid
[0], eihi
.imgbid
+ 1);
7836 struct vms_eihs eihs
;
7838 if (bfd_seek (abfd
, (file_ptr
) eihs_off
, SEEK_SET
)
7839 || bfd_bread (&eihs
, sizeof (eihs
), abfd
) != sizeof (eihs
))
7841 fprintf (file
, _("cannot read EIHS\n"));
7844 /* xgettext:c-format */
7845 fprintf (file
, _("Image symbol & debug table: (major: %u, minor: %u)\n"),
7846 (unsigned)bfd_getl32 (eihs
.majorid
),
7847 (unsigned)bfd_getl32 (eihs
.minorid
));
7848 dst_vbn
= bfd_getl32 (eihs
.dstvbn
);
7849 dst_size
= bfd_getl32 (eihs
.dstsize
);
7850 /* xgettext:c-format */
7851 fprintf (file
, _(" debug symbol table : vbn: %u, size: %u (0x%x)\n"),
7852 dst_vbn
, dst_size
, dst_size
);
7853 gst_vbn
= bfd_getl32 (eihs
.gstvbn
);
7854 gst_size
= bfd_getl32 (eihs
.gstsize
);
7855 /* xgettext:c-format */
7856 fprintf (file
, _(" global symbol table: vbn: %u, records: %u\n"),
7858 dmt_vbn
= bfd_getl32 (eihs
.dmtvbn
);
7859 dmt_size
= bfd_getl32 (eihs
.dmtsize
);
7860 /* xgettext:c-format */
7861 fprintf (file
, _(" debug module table : vbn: %u, size: %u\n"),
7864 while (eisd_off
!= 0)
7866 struct vms_eisd eisd
;
7871 if (bfd_seek (abfd
, (file_ptr
) eisd_off
, SEEK_SET
)
7872 || bfd_bread (&eisd
, sizeof (eisd
), abfd
) != sizeof (eisd
))
7874 fprintf (file
, _("cannot read EISD\n"));
7877 len
= (unsigned)bfd_getl32 (eisd
.eisdsize
);
7878 if (len
!= (unsigned)-1)
7882 eisd_off
= (eisd_off
+ VMS_BLOCK_SIZE
) & ~(VMS_BLOCK_SIZE
- 1);
7884 /* xgettext:c-format */
7885 fprintf (file
, _("Image section descriptor: (major: %u, minor: %u, "
7886 "size: %u, offset: %u)\n"),
7887 (unsigned)bfd_getl32 (eisd
.majorid
),
7888 (unsigned)bfd_getl32 (eisd
.minorid
),
7892 /* xgettext:c-format */
7893 fprintf (file
, _(" section: base: 0x%08x%08x size: 0x%08x\n"),
7894 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 4),
7895 (unsigned)bfd_getl32 (eisd
.virt_addr
+ 0),
7896 (unsigned)bfd_getl32 (eisd
.secsize
));
7897 val
= (unsigned)bfd_getl32 (eisd
.flags
);
7898 fprintf (file
, _(" flags: 0x%04x"), val
);
7899 if (val
& EISD__M_GBL
)
7900 fprintf (file
, " GBL");
7901 if (val
& EISD__M_CRF
)
7902 fprintf (file
, " CRF");
7903 if (val
& EISD__M_DZRO
)
7904 fprintf (file
, " DZRO");
7905 if (val
& EISD__M_WRT
)
7906 fprintf (file
, " WRT");
7907 if (val
& EISD__M_INITALCODE
)
7908 fprintf (file
, " INITALCODE");
7909 if (val
& EISD__M_BASED
)
7910 fprintf (file
, " BASED");
7911 if (val
& EISD__M_FIXUPVEC
)
7912 fprintf (file
, " FIXUPVEC");
7913 if (val
& EISD__M_RESIDENT
)
7914 fprintf (file
, " RESIDENT");
7915 if (val
& EISD__M_VECTOR
)
7916 fprintf (file
, " VECTOR");
7917 if (val
& EISD__M_PROTECT
)
7918 fprintf (file
, " PROTECT");
7919 if (val
& EISD__M_LASTCLU
)
7920 fprintf (file
, " LASTCLU");
7921 if (val
& EISD__M_EXE
)
7922 fprintf (file
, " EXE");
7923 if (val
& EISD__M_NONSHRADR
)
7924 fprintf (file
, " NONSHRADR");
7925 if (val
& EISD__M_QUAD_LENGTH
)
7926 fprintf (file
, " QUAD_LENGTH");
7927 if (val
& EISD__M_ALLOC_64BIT
)
7928 fprintf (file
, " ALLOC_64BIT");
7929 fprintf (file
, "\n");
7930 if (val
& EISD__M_FIXUPVEC
)
7932 eiaf_vbn
= bfd_getl32 (eisd
.vbn
);
7933 eiaf_size
= bfd_getl32 (eisd
.secsize
);
7935 /* xgettext:c-format */
7936 fprintf (file
, _(" vbn: %u, pfc: %u, matchctl: %u type: %u ("),
7937 (unsigned)bfd_getl32 (eisd
.vbn
),
7938 eisd
.pfc
, eisd
.matchctl
, eisd
.type
);
7941 case EISD__K_NORMAL
:
7942 fputs (_("NORMAL"), file
);
7944 case EISD__K_SHRFXD
:
7945 fputs (_("SHRFXD"), file
);
7947 case EISD__K_PRVFXD
:
7948 fputs (_("PRVFXD"), file
);
7950 case EISD__K_SHRPIC
:
7951 fputs (_("SHRPIC"), file
);
7953 case EISD__K_PRVPIC
:
7954 fputs (_("PRVPIC"), file
);
7956 case EISD__K_USRSTACK
:
7957 fputs (_("USRSTACK"), file
);
7960 fputs (_("*unknown*"), file
);
7963 fputs (_(")\n"), file
);
7964 if (val
& EISD__M_GBL
)
7965 /* xgettext:c-format */
7966 fprintf (file
, _(" ident: 0x%08x, name: %.*s\n"),
7967 (unsigned)bfd_getl32 (eisd
.ident
),
7968 eisd
.gblnam
[0], eisd
.gblnam
+ 1);
7974 if (bfd_seek (abfd
, (file_ptr
) (dmt_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
7976 fprintf (file
, _("cannot read DMT\n"));
7980 fprintf (file
, _("Debug module table:\n"));
7982 while (dmt_size
> 0)
7984 struct vms_dmt_header dmth
;
7987 if (bfd_bread (&dmth
, sizeof (dmth
), abfd
) != sizeof (dmth
))
7989 fprintf (file
, _("cannot read DMT header\n"));
7992 count
= bfd_getl16 (dmth
.psect_count
);
7994 /* xgettext:c-format */
7995 _(" module offset: 0x%08x, size: 0x%08x, (%u psects)\n"),
7996 (unsigned)bfd_getl32 (dmth
.modbeg
),
7997 (unsigned)bfd_getl32 (dmth
.size
), count
);
7998 dmt_size
-= sizeof (dmth
);
8001 struct vms_dmt_psect dmtp
;
8003 if (bfd_bread (&dmtp
, sizeof (dmtp
), abfd
) != sizeof (dmtp
))
8005 fprintf (file
, _("cannot read DMT psect\n"));
8008 /* xgettext:c-format */
8009 fprintf (file
, _(" psect start: 0x%08x, length: %u\n"),
8010 (unsigned)bfd_getl32 (dmtp
.start
),
8011 (unsigned)bfd_getl32 (dmtp
.length
));
8013 dmt_size
-= sizeof (dmtp
);
8020 if (bfd_seek (abfd
, (file_ptr
) (dst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
8022 fprintf (file
, _("cannot read DST\n"));
8026 evax_bfd_print_dst (abfd
, dst_size
, file
);
8030 if (bfd_seek (abfd
, (file_ptr
) (gst_vbn
- 1) * VMS_BLOCK_SIZE
, SEEK_SET
))
8032 fprintf (file
, _("cannot read GST\n"));
8036 fprintf (file
, _("Global symbol table:\n"));
8037 evax_bfd_print_eobj (abfd
, file
);
8042 struct vms_eiaf
*eiaf
;
8043 unsigned int qrelfixoff
;
8044 unsigned int lrelfixoff
;
8045 unsigned int qdotadroff
;
8046 unsigned int ldotadroff
;
8047 unsigned int shrimgcnt
;
8048 unsigned int shlstoff
;
8049 unsigned int codeadroff
;
8050 unsigned int lpfixoff
;
8051 unsigned int chgprtoff
;
8052 file_ptr f_off
= (file_ptr
) (eiaf_vbn
- 1) * VMS_BLOCK_SIZE
;
8054 if (bfd_seek (abfd
, f_off
, SEEK_SET
) != 0
8055 || (buf
= _bfd_malloc_and_read (abfd
, eiaf_size
, eiaf_size
)) == NULL
)
8057 fprintf (file
, _("cannot read EIHA\n"));
8060 eiaf
= (struct vms_eiaf
*)buf
;
8062 /* xgettext:c-format */
8063 _("Image activator fixup: (major: %u, minor: %u)\n"),
8064 (unsigned)bfd_getl32 (eiaf
->majorid
),
8065 (unsigned)bfd_getl32 (eiaf
->minorid
));
8066 /* xgettext:c-format */
8067 fprintf (file
, _(" iaflink : 0x%08x %08x\n"),
8068 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 0),
8069 (unsigned)bfd_getl32 (eiaf
->iaflink
+ 4));
8070 /* xgettext:c-format */
8071 fprintf (file
, _(" fixuplnk: 0x%08x %08x\n"),
8072 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 0),
8073 (unsigned)bfd_getl32 (eiaf
->fixuplnk
+ 4));
8074 fprintf (file
, _(" size : %u\n"),
8075 (unsigned)bfd_getl32 (eiaf
->size
));
8076 fprintf (file
, _(" flags: 0x%08x\n"),
8077 (unsigned)bfd_getl32 (eiaf
->flags
));
8078 qrelfixoff
= bfd_getl32 (eiaf
->qrelfixoff
);
8079 lrelfixoff
= bfd_getl32 (eiaf
->lrelfixoff
);
8080 /* xgettext:c-format */
8081 fprintf (file
, _(" qrelfixoff: %5u, lrelfixoff: %5u\n"),
8082 qrelfixoff
, lrelfixoff
);
8083 qdotadroff
= bfd_getl32 (eiaf
->qdotadroff
);
8084 ldotadroff
= bfd_getl32 (eiaf
->ldotadroff
);
8085 /* xgettext:c-format */
8086 fprintf (file
, _(" qdotadroff: %5u, ldotadroff: %5u\n"),
8087 qdotadroff
, ldotadroff
);
8088 codeadroff
= bfd_getl32 (eiaf
->codeadroff
);
8089 lpfixoff
= bfd_getl32 (eiaf
->lpfixoff
);
8090 /* xgettext:c-format */
8091 fprintf (file
, _(" codeadroff: %5u, lpfixoff : %5u\n"),
8092 codeadroff
, lpfixoff
);
8093 chgprtoff
= bfd_getl32 (eiaf
->chgprtoff
);
8094 fprintf (file
, _(" chgprtoff : %5u\n"), chgprtoff
);
8095 shrimgcnt
= bfd_getl32 (eiaf
->shrimgcnt
);
8096 shlstoff
= bfd_getl32 (eiaf
->shlstoff
);
8097 /* xgettext:c-format */
8098 fprintf (file
, _(" shlstoff : %5u, shrimgcnt : %5u\n"),
8099 shlstoff
, shrimgcnt
);
8100 /* xgettext:c-format */
8101 fprintf (file
, _(" shlextra : %5u, permctx : %5u\n"),
8102 (unsigned)bfd_getl32 (eiaf
->shlextra
),
8103 (unsigned)bfd_getl32 (eiaf
->permctx
));
8104 fprintf (file
, _(" base_va : 0x%08x\n"),
8105 (unsigned)bfd_getl32 (eiaf
->base_va
));
8106 fprintf (file
, _(" lppsbfixoff: %5u\n"),
8107 (unsigned)bfd_getl32 (eiaf
->lppsbfixoff
));
8111 struct vms_shl
*shl
= (struct vms_shl
*)(buf
+ shlstoff
);
8114 fprintf (file
, _(" Shareable images:\n"));
8115 for (j
= 0; j
< shrimgcnt
; j
++, shl
++)
8118 /* xgettext:c-format */
8119 _(" %u: size: %u, flags: 0x%02x, name: %.*s\n"),
8120 j
, shl
->size
, shl
->flags
,
8121 shl
->imgnam
[0], shl
->imgnam
+ 1);
8124 if (qrelfixoff
!= 0)
8126 fprintf (file
, _(" quad-word relocation fixups:\n"));
8127 evax_bfd_print_relocation_records (file
, buf
+ qrelfixoff
, 8);
8129 if (lrelfixoff
!= 0)
8131 fprintf (file
, _(" long-word relocation fixups:\n"));
8132 evax_bfd_print_relocation_records (file
, buf
+ lrelfixoff
, 4);
8134 if (qdotadroff
!= 0)
8136 fprintf (file
, _(" quad-word .address reference fixups:\n"));
8137 evax_bfd_print_address_fixups (file
, buf
+ qdotadroff
);
8139 if (ldotadroff
!= 0)
8141 fprintf (file
, _(" long-word .address reference fixups:\n"));
8142 evax_bfd_print_address_fixups (file
, buf
+ ldotadroff
);
8144 if (codeadroff
!= 0)
8146 fprintf (file
, _(" Code Address Reference Fixups:\n"));
8147 evax_bfd_print_reference_fixups (file
, buf
+ codeadroff
);
8151 fprintf (file
, _(" Linkage Pairs Reference Fixups:\n"));
8152 evax_bfd_print_reference_fixups (file
, buf
+ lpfixoff
);
8156 unsigned int count
= (unsigned)bfd_getl32 (buf
+ chgprtoff
);
8157 struct vms_eicp
*eicp
= (struct vms_eicp
*)(buf
+ chgprtoff
+ 4);
8160 fprintf (file
, _(" Change Protection (%u entries):\n"), count
);
8161 for (j
= 0; j
< count
; j
++, eicp
++)
8163 unsigned int prot
= bfd_getl32 (eicp
->newprt
);
8165 /* xgettext:c-format */
8166 _(" base: 0x%08x %08x, size: 0x%08x, prot: 0x%08x "),
8167 (unsigned)bfd_getl32 (eicp
->baseva
+ 4),
8168 (unsigned)bfd_getl32 (eicp
->baseva
+ 0),
8169 (unsigned)bfd_getl32 (eicp
->size
),
8170 (unsigned)bfd_getl32 (eicp
->newprt
));
8174 fprintf (file
, "NA");
8176 case PRT__C_RESERVED
:
8177 fprintf (file
, "RES");
8180 fprintf (file
, "KW");
8183 fprintf (file
, "KR");
8186 fprintf (file
, "UW");
8189 fprintf (file
, "EW");
8192 fprintf (file
, "ERKW");
8195 fprintf (file
, "ER");
8198 fprintf (file
, "SW");
8201 fprintf (file
, "SREW");
8204 fprintf (file
, "SRKW");
8207 fprintf (file
, "SR");
8210 fprintf (file
, "URSW");
8213 fprintf (file
, "UREW");
8216 fprintf (file
, "URKW");
8219 fprintf (file
, "UR");
8233 vms_bfd_print_private_bfd_data (bfd
*abfd
, void *ptr
)
8235 FILE *file
= (FILE *)ptr
;
8237 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
8238 evax_bfd_print_image (abfd
, file
);
8241 if (bfd_seek (abfd
, 0, SEEK_SET
))
8243 evax_bfd_print_eobj (abfd
, file
);
8250 /* Slurp ETIR/EDBG/ETBT VMS object records. */
8253 alpha_vms_read_sections_content (bfd
*abfd
, struct bfd_link_info
*info
)
8255 asection
*cur_section
;
8256 file_ptr cur_offset
;
8257 asection
*dst_section
;
8258 file_ptr dst_offset
;
8260 if (bfd_seek (abfd
, 0, SEEK_SET
) != 0)
8266 dst_section
= PRIV (dst_section
);
8270 if (info
->strip
== strip_all
|| info
->strip
== strip_debugger
)
8272 /* Discard the DST section. */
8276 else if (dst_section
)
8278 dst_offset
= dst_section
->output_offset
;
8279 dst_section
= dst_section
->output_section
;
8288 type
= _bfd_vms_get_object_record (abfd
);
8291 vms_debug2 ((2, "next_record failed\n"));
8297 PRIV (image_section
) = cur_section
;
8298 PRIV (image_offset
) = cur_offset
;
8299 res
= _bfd_vms_slurp_etir (abfd
, info
);
8300 cur_section
= PRIV (image_section
);
8301 cur_offset
= PRIV (image_offset
);
8305 if (dst_section
== NULL
)
8307 PRIV (image_section
) = dst_section
;
8308 PRIV (image_offset
) = dst_offset
;
8309 res
= _bfd_vms_slurp_etir (abfd
, info
);
8310 dst_offset
= PRIV (image_offset
);
8319 vms_debug2 ((2, "slurp eobj type %d failed\n", type
));
8326 alpha_vms_sizeof_headers (bfd
*abfd ATTRIBUTE_UNUSED
,
8327 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8332 /* Add a linkage pair fixup at address SECT + OFFSET to SHLIB. */
8335 alpha_vms_add_fixup_lp (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
8337 struct alpha_vms_shlib_el
*sl
;
8338 asection
*sect
= PRIV2 (src
, image_section
);
8339 file_ptr offset
= PRIV2 (src
, image_offset
);
8342 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8343 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8344 sl
->has_fixups
= TRUE
;
8345 p
= VEC_APPEND (sl
->lp
, bfd_vma
);
8348 *p
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
8349 sect
->output_section
->flags
|= SEC_RELOC
;
8353 /* Add a code address fixup at address SECT + OFFSET to SHLIB. */
8356 alpha_vms_add_fixup_ca (struct bfd_link_info
*info
, bfd
*src
, bfd
*shlib
)
8358 struct alpha_vms_shlib_el
*sl
;
8359 asection
*sect
= PRIV2 (src
, image_section
);
8360 file_ptr offset
= PRIV2 (src
, image_offset
);
8363 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8364 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8365 sl
->has_fixups
= TRUE
;
8366 p
= VEC_APPEND (sl
->ca
, bfd_vma
);
8369 *p
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
8370 sect
->output_section
->flags
|= SEC_RELOC
;
8374 /* Add a quad word relocation fixup at address SECT + OFFSET to SHLIB. */
8377 alpha_vms_add_fixup_qr (struct bfd_link_info
*info
, bfd
*src
,
8378 bfd
*shlib
, bfd_vma vec
)
8380 struct alpha_vms_shlib_el
*sl
;
8381 struct alpha_vms_vma_ref
*r
;
8382 asection
*sect
= PRIV2 (src
, image_section
);
8383 file_ptr offset
= PRIV2 (src
, image_offset
);
8385 sl
= &VEC_EL (alpha_vms_link_hash (info
)->shrlibs
,
8386 struct alpha_vms_shlib_el
, PRIV2 (shlib
, shr_index
));
8387 sl
->has_fixups
= TRUE
;
8388 r
= VEC_APPEND (sl
->qr
, struct alpha_vms_vma_ref
);
8391 r
->vma
= sect
->output_section
->vma
+ sect
->output_offset
+ offset
;
8393 sect
->output_section
->flags
|= SEC_RELOC
;
8398 alpha_vms_add_fixup_lr (struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
8399 unsigned int shr ATTRIBUTE_UNUSED
,
8400 bfd_vma vec ATTRIBUTE_UNUSED
)
8402 /* Not yet supported. */
8406 /* Add relocation. FIXME: Not yet emitted. */
8409 alpha_vms_add_lw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8415 alpha_vms_add_qw_reloc (struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
8420 static struct bfd_hash_entry
*
8421 alpha_vms_link_hash_newfunc (struct bfd_hash_entry
*entry
,
8422 struct bfd_hash_table
*table
,
8425 struct alpha_vms_link_hash_entry
*ret
=
8426 (struct alpha_vms_link_hash_entry
*) entry
;
8428 /* Allocate the structure if it has not already been allocated by a
8431 ret
= ((struct alpha_vms_link_hash_entry
*)
8432 bfd_hash_allocate (table
,
8433 sizeof (struct alpha_vms_link_hash_entry
)));
8437 /* Call the allocation method of the superclass. */
8438 ret
= ((struct alpha_vms_link_hash_entry
*)
8439 _bfd_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
8444 return (struct bfd_hash_entry
*) ret
;
8448 alpha_vms_bfd_link_hash_table_free (bfd
*abfd
)
8450 struct alpha_vms_link_hash_table
*t
;
8453 t
= (struct alpha_vms_link_hash_table
*) abfd
->link
.hash
;
8454 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8456 struct alpha_vms_shlib_el
*shlib
;
8458 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8459 free (&VEC_EL (shlib
->ca
, bfd_vma
, 0));
8460 free (&VEC_EL (shlib
->lp
, bfd_vma
, 0));
8461 free (&VEC_EL (shlib
->qr
, struct alpha_vms_vma_ref
, 0));
8463 free (&VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, 0));
8465 _bfd_generic_link_hash_table_free (abfd
);
8468 /* Create an Alpha/VMS link hash table. */
8470 static struct bfd_link_hash_table
*
8471 alpha_vms_bfd_link_hash_table_create (bfd
*abfd
)
8473 struct alpha_vms_link_hash_table
*ret
;
8474 size_t amt
= sizeof (struct alpha_vms_link_hash_table
);
8476 ret
= (struct alpha_vms_link_hash_table
*) bfd_malloc (amt
);
8479 if (!_bfd_link_hash_table_init (&ret
->root
, abfd
,
8480 alpha_vms_link_hash_newfunc
,
8481 sizeof (struct alpha_vms_link_hash_entry
)))
8487 VEC_INIT (ret
->shrlibs
);
8489 ret
->root
.hash_table_free
= alpha_vms_bfd_link_hash_table_free
;
8495 alpha_vms_link_add_object_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8499 for (i
= 0; i
< PRIV (gsd_sym_count
); i
++)
8501 struct vms_symbol_entry
*e
= PRIV (syms
)[i
];
8502 struct alpha_vms_link_hash_entry
*h
;
8503 struct bfd_link_hash_entry
*h_root
;
8506 if (!alpha_vms_convert_symbol (abfd
, e
, &sym
))
8509 if ((e
->flags
& EGSY__V_DEF
) && abfd
->selective_search
)
8511 /* In selective_search mode, only add definition that are
8513 h
= (struct alpha_vms_link_hash_entry
*)bfd_link_hash_lookup
8514 (info
->hash
, sym
.name
, FALSE
, FALSE
, FALSE
);
8515 if (h
== NULL
|| h
->root
.type
!= bfd_link_hash_undefined
)
8521 h_root
= (struct bfd_link_hash_entry
*) h
;
8522 if (!_bfd_generic_link_add_one_symbol (info
, abfd
, sym
.name
, sym
.flags
,
8523 sym
.section
, sym
.value
, NULL
,
8524 FALSE
, FALSE
, &h_root
))
8526 h
= (struct alpha_vms_link_hash_entry
*) h_root
;
8528 if ((e
->flags
& EGSY__V_DEF
)
8530 && abfd
->xvec
== info
->output_bfd
->xvec
)
8534 if (abfd
->flags
& DYNAMIC
)
8536 struct alpha_vms_shlib_el
*shlib
;
8538 /* We do not want to include any of the sections in a dynamic
8539 object in the output file. See comment in elflink.c. */
8540 bfd_section_list_clear (abfd
);
8542 shlib
= VEC_APPEND (alpha_vms_link_hash (info
)->shrlibs
,
8543 struct alpha_vms_shlib_el
);
8547 VEC_INIT (shlib
->ca
);
8548 VEC_INIT (shlib
->lp
);
8549 VEC_INIT (shlib
->qr
);
8550 PRIV (shr_index
) = VEC_COUNT (alpha_vms_link_hash (info
)->shrlibs
) - 1;
8557 alpha_vms_link_add_archive_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8560 struct bfd_link_hash_entry
**pundef
;
8561 struct bfd_link_hash_entry
**next_pundef
;
8563 /* We only accept VMS libraries. */
8564 if (info
->output_bfd
->xvec
!= abfd
->xvec
)
8566 bfd_set_error (bfd_error_wrong_format
);
8570 /* The archive_pass field in the archive itself is used to
8571 initialize PASS, since we may search the same archive multiple
8573 pass
= ++abfd
->archive_pass
;
8575 /* Look through the list of undefined symbols. */
8576 for (pundef
= &info
->hash
->undefs
; *pundef
!= NULL
; pundef
= next_pundef
)
8578 struct bfd_link_hash_entry
*h
;
8584 next_pundef
= &(*pundef
)->u
.undef
.next
;
8586 /* When a symbol is defined, it is not necessarily removed from
8588 if (h
->type
!= bfd_link_hash_undefined
8589 && h
->type
!= bfd_link_hash_common
)
8591 /* Remove this entry from the list, for general cleanliness
8592 and because we are going to look through the list again
8593 if we search any more libraries. We can't remove the
8594 entry if it is the tail, because that would lose any
8595 entries we add to the list later on. */
8596 if (*pundef
!= info
->hash
->undefs_tail
)
8598 *pundef
= *next_pundef
;
8599 next_pundef
= pundef
;
8604 /* Look for this symbol in the archive hash table. */
8605 symidx
= _bfd_vms_lib_find_symbol (abfd
, h
->root
.string
);
8606 if (symidx
== BFD_NO_MORE_SYMBOLS
)
8608 /* Nothing in this slot. */
8612 element
= bfd_get_elt_at_index (abfd
, symidx
);
8613 if (element
== NULL
)
8616 if (element
->archive_pass
== -1 || element
->archive_pass
== pass
)
8618 /* Next symbol if this archive is wrong or already handled. */
8622 if (! bfd_check_format (element
, bfd_object
))
8624 element
->archive_pass
= -1;
8628 orig_element
= element
;
8629 if (bfd_is_thin_archive (abfd
))
8631 element
= _bfd_vms_lib_get_imagelib_file (element
);
8632 if (element
== NULL
|| !bfd_check_format (element
, bfd_object
))
8634 orig_element
->archive_pass
= -1;
8639 /* Unlike the generic linker, we know that this element provides
8640 a definition for an undefined symbol and we know that we want
8641 to include it. We don't need to check anything. */
8642 if (!(*info
->callbacks
8643 ->add_archive_element
) (info
, element
, h
->root
.string
, &element
))
8645 if (!alpha_vms_link_add_object_symbols (element
, info
))
8648 orig_element
->archive_pass
= pass
;
8655 alpha_vms_bfd_link_add_symbols (bfd
*abfd
, struct bfd_link_info
*info
)
8657 switch (bfd_get_format (abfd
))
8660 vms_debug2 ((2, "vms_link_add_symbols for object %s\n",
8662 return alpha_vms_link_add_object_symbols (abfd
, info
);
8665 vms_debug2 ((2, "vms_link_add_symbols for archive %s\n",
8667 return alpha_vms_link_add_archive_symbols (abfd
, info
);
8670 bfd_set_error (bfd_error_wrong_format
);
8676 alpha_vms_build_fixups (struct bfd_link_info
*info
)
8678 struct alpha_vms_link_hash_table
*t
= alpha_vms_link_hash (info
);
8679 unsigned char *content
;
8681 unsigned int sz
= 0;
8682 unsigned int lp_sz
= 0;
8683 unsigned int ca_sz
= 0;
8684 unsigned int qr_sz
= 0;
8685 unsigned int shrimg_cnt
= 0;
8686 unsigned int chgprt_num
= 0;
8687 unsigned int chgprt_sz
= 0;
8688 struct vms_eiaf
*eiaf
;
8692 /* Shared libraries. */
8693 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8695 struct alpha_vms_shlib_el
*shlib
;
8697 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8699 if (!shlib
->has_fixups
)
8704 if (VEC_COUNT (shlib
->ca
) > 0)
8706 /* Header + entries. */
8708 ca_sz
+= VEC_COUNT (shlib
->ca
) * 4;
8710 if (VEC_COUNT (shlib
->lp
) > 0)
8712 /* Header + entries. */
8714 lp_sz
+= VEC_COUNT (shlib
->lp
) * 4;
8716 if (VEC_COUNT (shlib
->qr
) > 0)
8718 /* Header + entries. */
8720 qr_sz
+= VEC_COUNT (shlib
->qr
) * 8;
8731 /* Finish now if there is no content. */
8732 if (ca_sz
+ lp_sz
+ qr_sz
== 0)
8735 /* Add an eicp entry for the fixup itself. */
8737 for (sec
= info
->output_bfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
8739 /* This isect could be made RO or EXE after relocations are applied. */
8740 if ((sec
->flags
& SEC_RELOC
) != 0
8741 && (sec
->flags
& (SEC_CODE
| SEC_READONLY
)) != 0)
8744 chgprt_sz
= 4 + chgprt_num
* sizeof (struct vms_eicp
);
8746 /* Allocate section content (round-up size) */
8747 sz
= sizeof (struct vms_eiaf
) + shrimg_cnt
* sizeof (struct vms_shl
)
8748 + ca_sz
+ lp_sz
+ qr_sz
+ chgprt_sz
;
8749 sz
= (sz
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1);
8750 content
= bfd_zalloc (info
->output_bfd
, sz
);
8751 if (content
== NULL
)
8754 sec
= alpha_vms_link_hash (info
)->fixup
;
8755 sec
->contents
= content
;
8758 eiaf
= (struct vms_eiaf
*)content
;
8759 off
= sizeof (struct vms_eiaf
);
8760 bfd_putl32 (0, eiaf
->majorid
);
8761 bfd_putl32 (0, eiaf
->minorid
);
8762 bfd_putl32 (0, eiaf
->iaflink
);
8763 bfd_putl32 (0, eiaf
->fixuplnk
);
8764 bfd_putl32 (sizeof (struct vms_eiaf
), eiaf
->size
);
8765 bfd_putl32 (0, eiaf
->flags
);
8766 bfd_putl32 (0, eiaf
->qrelfixoff
);
8767 bfd_putl32 (0, eiaf
->lrelfixoff
);
8768 bfd_putl32 (0, eiaf
->qdotadroff
);
8769 bfd_putl32 (0, eiaf
->ldotadroff
);
8770 bfd_putl32 (0, eiaf
->codeadroff
);
8771 bfd_putl32 (0, eiaf
->lpfixoff
);
8772 bfd_putl32 (0, eiaf
->chgprtoff
);
8773 bfd_putl32 (shrimg_cnt
? off
: 0, eiaf
->shlstoff
);
8774 bfd_putl32 (shrimg_cnt
, eiaf
->shrimgcnt
);
8775 bfd_putl32 (0, eiaf
->shlextra
);
8776 bfd_putl32 (0, eiaf
->permctx
);
8777 bfd_putl32 (0, eiaf
->base_va
);
8778 bfd_putl32 (0, eiaf
->lppsbfixoff
);
8785 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8787 struct alpha_vms_shlib_el
*shlib
;
8788 struct vms_shl
*shl
;
8790 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8792 if (!shlib
->has_fixups
)
8795 /* Renumber shared images. */
8796 PRIV2 (shlib
->abfd
, shr_index
) = shrimg_cnt
++;
8798 shl
= (struct vms_shl
*)(content
+ off
);
8799 bfd_putl32 (0, shl
->baseva
);
8800 bfd_putl32 (0, shl
->shlptr
);
8801 bfd_putl32 (0, shl
->ident
);
8802 bfd_putl32 (0, shl
->permctx
);
8803 shl
->size
= sizeof (struct vms_shl
);
8804 bfd_putl16 (0, shl
->fill_1
);
8806 bfd_putl32 (0, shl
->icb
);
8807 shl
->imgnam
[0] = strlen (PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
));
8808 memcpy (shl
->imgnam
+ 1, PRIV2 (shlib
->abfd
, hdr_data
.hdr_t_name
),
8811 off
+= sizeof (struct vms_shl
);
8817 bfd_putl32 (off
, eiaf
->codeadroff
);
8819 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8821 struct alpha_vms_shlib_el
*shlib
;
8824 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8826 if (VEC_COUNT (shlib
->ca
) == 0)
8829 bfd_putl32 (VEC_COUNT (shlib
->ca
), content
+ off
);
8830 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8833 for (j
= 0; j
< VEC_COUNT (shlib
->ca
); j
++)
8835 bfd_putl32 (VEC_EL (shlib
->ca
, bfd_vma
, j
) - t
->base_addr
,
8841 bfd_putl32 (0, content
+ off
);
8842 bfd_putl32 (0, content
+ off
+ 4);
8849 bfd_putl32 (off
, eiaf
->lpfixoff
);
8851 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8853 struct alpha_vms_shlib_el
*shlib
;
8856 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8858 if (VEC_COUNT (shlib
->lp
) == 0)
8861 bfd_putl32 (VEC_COUNT (shlib
->lp
), content
+ off
);
8862 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8865 for (j
= 0; j
< VEC_COUNT (shlib
->lp
); j
++)
8867 bfd_putl32 (VEC_EL (shlib
->lp
, bfd_vma
, j
) - t
->base_addr
,
8873 bfd_putl32 (0, content
+ off
);
8874 bfd_putl32 (0, content
+ off
+ 4);
8881 bfd_putl32 (off
, eiaf
->qdotadroff
);
8883 for (i
= 0; i
< VEC_COUNT (t
->shrlibs
); i
++)
8885 struct alpha_vms_shlib_el
*shlib
;
8888 shlib
= &VEC_EL (t
->shrlibs
, struct alpha_vms_shlib_el
, i
);
8890 if (VEC_COUNT (shlib
->qr
) == 0)
8893 bfd_putl32 (VEC_COUNT (shlib
->qr
), content
+ off
);
8894 bfd_putl32 (PRIV2 (shlib
->abfd
, shr_index
), content
+ off
+ 4);
8897 for (j
= 0; j
< VEC_COUNT (shlib
->qr
); j
++)
8899 struct alpha_vms_vma_ref
*r
;
8900 r
= &VEC_EL (shlib
->qr
, struct alpha_vms_vma_ref
, j
);
8901 bfd_putl32 (r
->vma
- t
->base_addr
, content
+ off
);
8902 bfd_putl32 (r
->ref
, content
+ off
+ 4);
8907 bfd_putl32 (0, content
+ off
);
8908 bfd_putl32 (0, content
+ off
+ 4);
8913 /* Write the change protection table. */
8914 bfd_putl32 (off
, eiaf
->chgprtoff
);
8915 bfd_putl32 (chgprt_num
, content
+ off
);
8918 for (sec
= info
->output_bfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
8920 struct vms_eicp
*eicp
;
8923 if ((sec
->flags
& SEC_LINKER_CREATED
) != 0 &&
8924 strcmp (sec
->name
, "$FIXUP$") == 0)
8926 else if ((sec
->flags
& SEC_RELOC
) != 0
8927 && (sec
->flags
& (SEC_CODE
| SEC_READONLY
)) != 0)
8932 eicp
= (struct vms_eicp
*)(content
+ off
);
8933 bfd_putl64 (sec
->vma
- t
->base_addr
, eicp
->baseva
);
8934 bfd_putl32 ((sec
->size
+ VMS_BLOCK_SIZE
- 1) & ~(VMS_BLOCK_SIZE
- 1),
8936 bfd_putl32 (prot
, eicp
->newprt
);
8937 off
+= sizeof (struct vms_eicp
);
8943 /* Called by bfd_hash_traverse to fill the symbol table.
8944 Return FALSE in case of failure. */
8947 alpha_vms_link_output_symbol (struct bfd_hash_entry
*bh
, void *infov
)
8949 struct bfd_link_hash_entry
*hc
= (struct bfd_link_hash_entry
*) bh
;
8950 struct bfd_link_info
*info
= (struct bfd_link_info
*)infov
;
8951 struct alpha_vms_link_hash_entry
*h
;
8952 struct vms_symbol_entry
*sym
;
8954 if (hc
->type
== bfd_link_hash_warning
)
8957 if (hc
->type
== bfd_link_hash_new
)
8960 h
= (struct alpha_vms_link_hash_entry
*) hc
;
8962 switch (h
->root
.type
)
8964 case bfd_link_hash_undefined
:
8966 case bfd_link_hash_new
:
8967 case bfd_link_hash_warning
:
8969 case bfd_link_hash_undefweak
:
8971 case bfd_link_hash_defined
:
8972 case bfd_link_hash_defweak
:
8974 asection
*sec
= h
->root
.u
.def
.section
;
8976 /* FIXME: this is certainly a symbol from a dynamic library. */
8977 if (bfd_is_abs_section (sec
))
8980 if (sec
->owner
->flags
& DYNAMIC
)
8984 case bfd_link_hash_common
:
8986 case bfd_link_hash_indirect
:
8990 /* Do not write not kept symbols. */
8991 if (info
->strip
== strip_some
8992 && bfd_hash_lookup (info
->keep_hash
, h
->root
.root
.string
,
8993 FALSE
, FALSE
) != NULL
)
8998 /* This symbol doesn't come from a VMS object. So we suppose it is
9000 int len
= strlen (h
->root
.root
.string
);
9002 sym
= (struct vms_symbol_entry
*)bfd_zalloc (info
->output_bfd
,
9003 sizeof (*sym
) + len
);
9007 memcpy (sym
->name
, h
->root
.root
.string
, len
);
9009 sym
->owner
= info
->output_bfd
;
9011 sym
->typ
= EGSD__C_SYMG
;
9013 sym
->flags
= EGSY__V_DEF
| EGSY__V_REL
;
9014 sym
->symbol_vector
= h
->root
.u
.def
.value
;
9015 sym
->section
= h
->root
.u
.def
.section
;
9016 sym
->value
= h
->root
.u
.def
.value
;
9021 if (!add_symbol_entry (info
->output_bfd
, sym
))
9028 alpha_vms_bfd_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
9031 struct bfd_link_order
*p
;
9039 if (bfd_link_relocatable (info
))
9041 /* FIXME: we do not yet support relocatable link. It is not obvious
9042 how to do it for debug infos. */
9043 (*info
->callbacks
->einfo
)(_("%P: relocatable link is not supported\n"));
9047 abfd
->outsymbols
= NULL
;
9050 /* Mark all sections which will be included in the output file. */
9051 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9052 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9053 if (p
->type
== bfd_indirect_link_order
)
9054 p
->u
.indirect
.section
->linker_mark
= TRUE
;
9057 /* Handle all the link order information for the sections. */
9058 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9060 printf ("For section %s (at 0x%08x, flags=0x%08x):\n",
9061 o
->name
, (unsigned)o
->vma
, (unsigned)o
->flags
);
9063 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9065 printf (" at 0x%08x - 0x%08x: ",
9066 (unsigned)p
->offset
, (unsigned)(p
->offset
+ p
->size
- 1));
9069 case bfd_section_reloc_link_order
:
9070 case bfd_symbol_reloc_link_order
:
9071 printf (" section/symbol reloc\n");
9073 case bfd_indirect_link_order
:
9074 printf (" section %s of %s\n",
9075 p
->u
.indirect
.section
->name
,
9076 p
->u
.indirect
.section
->owner
->filename
);
9078 case bfd_data_link_order
:
9079 printf (" explicit data\n");
9082 printf (" *unknown* type %u\n", p
->type
);
9089 /* Generate the symbol table. */
9090 BFD_ASSERT (PRIV (syms
) == NULL
);
9091 if (info
->strip
!= strip_all
)
9092 bfd_hash_traverse (&info
->hash
->table
, alpha_vms_link_output_symbol
, info
);
9094 /* Find the entry point. */
9095 if (bfd_get_start_address (abfd
) == 0)
9097 bfd
*startbfd
= NULL
;
9099 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9101 /* Consider only VMS object files. */
9102 if (sub
->xvec
!= abfd
->xvec
)
9105 if (!PRIV2 (sub
, eom_data
).eom_has_transfer
)
9107 if ((PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
) && startbfd
)
9109 if (startbfd
!= NULL
9110 && !(PRIV2 (sub
, eom_data
).eom_b_tfrflg
& EEOM__M_WKTFR
))
9112 (*info
->callbacks
->einfo
)
9113 /* xgettext:c-format */
9114 (_("%P: multiple entry points: in modules %pB and %pB\n"),
9123 unsigned int ps_idx
= PRIV2 (startbfd
, eom_data
).eom_l_psindx
;
9124 bfd_vma tfradr
= PRIV2 (startbfd
, eom_data
).eom_l_tfradr
;
9127 sec
= PRIV2 (startbfd
, sections
)[ps_idx
];
9129 bfd_set_start_address
9130 (abfd
, sec
->output_section
->vma
+ sec
->output_offset
+ tfradr
);
9134 /* Set transfer addresses. */
9137 struct bfd_link_hash_entry
*h
;
9140 PRIV (transfer_address
[i
++]) = 0xffffffff00000340ULL
; /* SYS$IMGACT */
9141 h
= bfd_link_hash_lookup (info
->hash
, "LIB$INITIALIZE", FALSE
, FALSE
, TRUE
);
9142 if (h
!= NULL
&& h
->type
== bfd_link_hash_defined
)
9143 PRIV (transfer_address
[i
++]) =
9144 alpha_vms_get_sym_value (h
->u
.def
.section
, h
->u
.def
.value
);
9145 PRIV (transfer_address
[i
++]) = bfd_get_start_address (abfd
);
9147 PRIV (transfer_address
[i
++]) = 0;
9150 /* Allocate contents.
9151 Also compute the virtual base address. */
9152 base_addr
= (bfd_vma
)-1;
9154 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9156 if (o
->flags
& SEC_HAS_CONTENTS
)
9158 o
->contents
= bfd_alloc (abfd
, o
->size
);
9159 if (o
->contents
== NULL
)
9162 if (o
->flags
& SEC_LOAD
)
9164 if (o
->vma
< base_addr
)
9166 if (o
->vma
+ o
->size
> last_addr
)
9167 last_addr
= o
->vma
+ o
->size
;
9169 /* Clear the RELOC flags. Currently we don't support incremental
9170 linking. We use the RELOC flag for computing the eicp entries. */
9171 o
->flags
&= ~SEC_RELOC
;
9174 /* Create the fixup section. */
9175 fixupsec
= bfd_make_section_anyway_with_flags
9176 (info
->output_bfd
, "$FIXUP$",
9177 SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
9178 if (fixupsec
== NULL
)
9180 last_addr
= (last_addr
+ 0xffff) & ~0xffff;
9181 fixupsec
->vma
= last_addr
;
9183 alpha_vms_link_hash (info
)->fixup
= fixupsec
;
9184 alpha_vms_link_hash (info
)->base_addr
= base_addr
;
9186 /* Create the DMT section, if necessary. */
9187 BFD_ASSERT (PRIV (dst_section
) == NULL
);
9188 dst
= bfd_get_section_by_name (abfd
, "$DST$");
9189 if (dst
!= NULL
&& dst
->size
== 0)
9193 PRIV (dst_section
) = dst
;
9194 dmt
= bfd_make_section_anyway_with_flags
9195 (info
->output_bfd
, "$DMT$",
9196 SEC_DEBUGGING
| SEC_HAS_CONTENTS
| SEC_LINKER_CREATED
);
9203 /* Read all sections from the inputs. */
9204 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9206 if (sub
->flags
& DYNAMIC
)
9208 alpha_vms_create_eisd_for_shared (abfd
, sub
);
9212 if (!alpha_vms_read_sections_content (sub
, info
))
9216 /* Handle all the link order information for the sections.
9217 Note: past this point, it is not possible to create new sections. */
9218 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
9220 for (p
= o
->map_head
.link_order
; p
!= NULL
; p
= p
->next
)
9224 case bfd_section_reloc_link_order
:
9225 case bfd_symbol_reloc_link_order
:
9228 case bfd_indirect_link_order
:
9232 if (! _bfd_default_link_order (abfd
, info
, o
, p
))
9239 /* Compute fixups. */
9240 if (!alpha_vms_build_fixups (info
))
9243 /* Compute the DMT. */
9247 unsigned char *contents
= NULL
;
9249 /* In pass 1, compute the size. In pass 2, write the DMT contents. */
9250 for (pass
= 0; pass
< 2; pass
++)
9252 unsigned int off
= 0;
9254 /* For each object file (ie for each module). */
9255 for (sub
= info
->input_bfds
; sub
!= NULL
; sub
= sub
->link
.next
)
9258 struct vms_dmt_header
*dmth
= NULL
;
9259 unsigned int psect_count
;
9261 /* Skip this module if it has no DST. */
9262 sub_dst
= PRIV2 (sub
, dst_section
);
9263 if (sub_dst
== NULL
|| sub_dst
->size
== 0)
9268 /* Write the header. */
9269 dmth
= (struct vms_dmt_header
*)(contents
+ off
);
9270 bfd_putl32 (sub_dst
->output_offset
, dmth
->modbeg
);
9271 bfd_putl32 (sub_dst
->size
, dmth
->size
);
9274 off
+= sizeof (struct vms_dmt_header
);
9277 /* For each section (ie for each psect). */
9278 for (o
= sub
->sections
; o
!= NULL
; o
= o
->next
)
9280 /* Only consider interesting sections. */
9281 if (!(o
->flags
& SEC_ALLOC
))
9283 if (o
->flags
& SEC_LINKER_CREATED
)
9288 /* Write an entry. */
9289 struct vms_dmt_psect
*dmtp
;
9291 dmtp
= (struct vms_dmt_psect
*)(contents
+ off
);
9292 bfd_putl32 (o
->output_offset
+ o
->output_section
->vma
,
9294 bfd_putl32 (o
->size
, dmtp
->length
);
9297 off
+= sizeof (struct vms_dmt_psect
);
9300 bfd_putl32 (psect_count
, dmth
->psect_count
);
9305 contents
= bfd_zalloc (info
->output_bfd
, off
);
9306 if (contents
== NULL
)
9308 dmt
->contents
= contents
;
9313 BFD_ASSERT (off
== dmt
->size
);
9321 /* Read the contents of a section.
9322 buf points to a buffer of buf_size bytes to be filled with
9323 section data (starting at offset into section) */
9326 alpha_vms_get_section_contents (bfd
*abfd
, asection
*section
,
9327 void *buf
, file_ptr offset
,
9328 bfd_size_type count
)
9332 /* Image are easy. */
9333 if (bfd_get_file_flags (abfd
) & (EXEC_P
| DYNAMIC
))
9334 return _bfd_generic_get_section_contents (abfd
, section
,
9335 buf
, offset
, count
);
9338 if (offset
+ count
< count
9339 || offset
+ count
> section
->size
)
9341 bfd_set_error (bfd_error_invalid_operation
);
9345 /* If the section is already in memory, just copy it. */
9346 if (section
->flags
& SEC_IN_MEMORY
)
9348 BFD_ASSERT (section
->contents
!= NULL
);
9349 memcpy (buf
, section
->contents
+ offset
, count
);
9352 if (section
->size
== 0)
9355 /* Alloc in memory and read ETIRs. */
9356 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
9358 BFD_ASSERT (sec
->contents
== NULL
);
9360 if (sec
->size
!= 0 && (sec
->flags
& SEC_HAS_CONTENTS
))
9362 sec
->contents
= bfd_alloc (abfd
, sec
->size
);
9363 if (sec
->contents
== NULL
)
9367 if (!alpha_vms_read_sections_content (abfd
, NULL
))
9369 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
9371 sec
->flags
|= SEC_IN_MEMORY
;
9372 memcpy (buf
, section
->contents
+ offset
, count
);
9377 /* Set the format of a file being written. */
9380 alpha_vms_mkobject (bfd
* abfd
)
9382 const bfd_arch_info_type
*arch
;
9384 vms_debug2 ((1, "alpha_vms_mkobject (%p)\n", abfd
));
9386 if (!vms_initialize (abfd
))
9389 PRIV (recwr
.buf
) = bfd_alloc (abfd
, MAX_OUTREC_SIZE
);
9390 if (PRIV (recwr
.buf
) == NULL
)
9393 arch
= bfd_scan_arch ("alpha");
9397 bfd_set_error (bfd_error_wrong_format
);
9401 abfd
->arch_info
= arch
;
9408 /* Called when the BFD is being closed to do any necessary cleanup. */
9411 vms_close_and_cleanup (bfd
* abfd
)
9413 vms_debug2 ((1, "vms_close_and_cleanup (%p)\n", abfd
));
9415 if (abfd
== NULL
|| abfd
->tdata
.any
== NULL
)
9418 if (abfd
->format
== bfd_object
)
9420 alpha_vms_free_private (abfd
);
9423 if (abfd
->direction
== write_direction
)
9425 /* Last step on VMS is to convert the file to variable record length
9427 if (!bfd_cache_close (abfd
))
9429 if (!_bfd_vms_convert_to_var_unix_filename (abfd
->filename
))
9435 return _bfd_generic_close_and_cleanup (abfd
);
9438 /* Called when a new section is created. */
9441 vms_new_section_hook (bfd
* abfd
, asection
*section
)
9445 vms_debug2 ((1, "vms_new_section_hook (%p, [%u]%s)\n",
9446 abfd
, section
->index
, section
->name
));
9448 if (!bfd_set_section_alignment (section
, 0))
9451 vms_debug2 ((7, "%u: %s\n", section
->index
, section
->name
));
9453 amt
= sizeof (struct vms_section_data_struct
);
9454 section
->used_by_bfd
= bfd_zalloc (abfd
, amt
);
9455 if (section
->used_by_bfd
== NULL
)
9458 /* Create the section symbol. */
9459 return _bfd_generic_new_section_hook (abfd
, section
);
9462 /* Part 4.5, symbols. */
9464 /* Print symbol to file according to how. how is one of
9465 bfd_print_symbol_name just print the name
9466 bfd_print_symbol_more print more (???)
9467 bfd_print_symbol_all print all we know, which is not much right now :-). */
9470 vms_print_symbol (bfd
* abfd
,
9473 bfd_print_symbol_type how
)
9475 vms_debug2 ((1, "vms_print_symbol (%p, %p, %p, %d)\n",
9476 abfd
, file
, symbol
, how
));
9480 case bfd_print_symbol_name
:
9481 case bfd_print_symbol_more
:
9482 fprintf ((FILE *)file
," %s", symbol
->name
);
9485 case bfd_print_symbol_all
:
9487 const char *section_name
= symbol
->section
->name
;
9489 bfd_print_symbol_vandf (abfd
, file
, symbol
);
9491 fprintf ((FILE *) file
," %-8s %s", section_name
, symbol
->name
);
9497 /* Return information about symbol in ret.
9499 fill type, value and name
9502 B bss segment symbol
9504 D data segment symbol
9506 t a static function symbol
9507 T text segment symbol
9512 vms_get_symbol_info (bfd
* abfd ATTRIBUTE_UNUSED
,
9518 vms_debug2 ((1, "vms_get_symbol_info (%p, %p, %p)\n", abfd
, symbol
, ret
));
9520 sec
= symbol
->section
;
9527 else if (bfd_is_com_section (sec
))
9529 else if (bfd_is_abs_section (sec
))
9531 else if (bfd_is_und_section (sec
))
9533 else if (bfd_is_ind_section (sec
))
9535 else if ((symbol
->flags
& BSF_FUNCTION
)
9536 || (bfd_section_flags (sec
) & SEC_CODE
))
9538 else if (bfd_section_flags (sec
) & SEC_DATA
)
9540 else if (bfd_section_flags (sec
) & SEC_ALLOC
)
9545 if (ret
->type
!= 'U')
9546 ret
->value
= symbol
->value
+ symbol
->section
->vma
;
9549 ret
->name
= symbol
->name
;
9552 /* Return TRUE if the given symbol sym in the BFD abfd is
9553 a compiler generated local label, else return FALSE. */
9556 vms_bfd_is_local_label_name (bfd
* abfd ATTRIBUTE_UNUSED
,
9559 return name
[0] == '$';
9562 /* Part 4.7, writing an object file. */
9564 /* Sets the contents of the section section in BFD abfd to the data starting
9565 in memory at LOCATION. The data is written to the output section starting
9566 at offset offset for count bytes.
9568 Normally TRUE is returned, else FALSE. Possible error returns are:
9569 o bfd_error_no_contents - The output section does not have the
9570 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
9571 o and some more too */
9574 _bfd_vms_set_section_contents (bfd
* abfd
,
9576 const void * location
,
9578 bfd_size_type count
)
9580 if (section
->contents
== NULL
)
9582 section
->contents
= bfd_alloc (abfd
, section
->size
);
9583 if (section
->contents
== NULL
)
9586 memcpy (section
->contents
+ offset
, location
, (size_t) count
);
9592 /* Set the architecture and machine type in BFD abfd to arch and mach.
9593 Find the correct pointer to a structure and insert it into the arch_info
9597 alpha_vms_set_arch_mach (bfd
*abfd
,
9598 enum bfd_architecture arch
, unsigned long mach
)
9600 if (arch
!= bfd_arch_alpha
9601 && arch
!= bfd_arch_unknown
)
9604 return bfd_default_set_arch_mach (abfd
, arch
, mach
);
9607 /* Set section VMS flags. Clear NO_FLAGS and set FLAGS. */
9610 bfd_vms_set_section_flags (bfd
*abfd ATTRIBUTE_UNUSED
,
9611 asection
*sec
, flagword no_flags
, flagword flags
)
9613 vms_section_data (sec
)->no_flags
= no_flags
;
9614 vms_section_data (sec
)->flags
= flags
;
9617 struct vms_private_data_struct
*
9618 bfd_vms_get_data (bfd
*abfd
)
9620 return (struct vms_private_data_struct
*)abfd
->tdata
.any
;
9623 #define vms_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
9624 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms
9625 #define vms_bfd_copy_link_hash_symbol_type \
9626 _bfd_generic_copy_link_hash_symbol_type
9627 #define vms_bfd_is_group_section bfd_generic_is_group_section
9628 #define vms_bfd_group_name bfd_generic_group_name
9629 #define vms_bfd_discard_group bfd_generic_discard_group
9630 #define vms_section_already_linked _bfd_generic_section_already_linked
9631 #define vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9632 #define vms_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
9633 #define vms_bfd_define_start_stop bfd_generic_define_start_stop
9634 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
9636 #define vms_bfd_copy_private_bfd_data _bfd_generic_bfd_copy_private_bfd_data
9637 #define vms_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
9638 #define vms_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
9639 #define vms_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
9640 #define vms_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
9641 #define vms_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
9643 /* Symbols table. */
9644 #define alpha_vms_make_empty_symbol _bfd_generic_make_empty_symbol
9645 #define alpha_vms_bfd_is_target_special_symbol _bfd_bool_bfd_asymbol_false
9646 #define alpha_vms_print_symbol vms_print_symbol
9647 #define alpha_vms_get_symbol_info vms_get_symbol_info
9648 #define alpha_vms_get_symbol_version_string \
9649 _bfd_nosymbols_get_symbol_version_string
9651 #define alpha_vms_read_minisymbols _bfd_generic_read_minisymbols
9652 #define alpha_vms_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
9653 #define alpha_vms_get_lineno _bfd_nosymbols_get_lineno
9654 #define alpha_vms_find_inliner_info _bfd_nosymbols_find_inliner_info
9655 #define alpha_vms_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
9656 #define alpha_vms_find_nearest_line _bfd_vms_find_nearest_line
9657 #define alpha_vms_find_line _bfd_nosymbols_find_line
9658 #define alpha_vms_bfd_is_local_label_name vms_bfd_is_local_label_name
9660 /* Generic table. */
9661 #define alpha_vms_close_and_cleanup vms_close_and_cleanup
9662 #define alpha_vms_bfd_free_cached_info vms_bfd_free_cached_info
9663 #define alpha_vms_new_section_hook vms_new_section_hook
9664 #define alpha_vms_set_section_contents _bfd_vms_set_section_contents
9665 #define alpha_vms_get_section_contents_in_window _bfd_generic_get_section_contents_in_window
9667 #define alpha_vms_bfd_get_relocated_section_contents \
9668 bfd_generic_get_relocated_section_contents
9670 #define alpha_vms_bfd_relax_section bfd_generic_relax_section
9671 #define alpha_vms_bfd_gc_sections bfd_generic_gc_sections
9672 #define alpha_vms_bfd_lookup_section_flags bfd_generic_lookup_section_flags
9673 #define alpha_vms_bfd_merge_sections bfd_generic_merge_sections
9674 #define alpha_vms_bfd_is_group_section bfd_generic_is_group_section
9675 #define alpha_vms_bfd_group_name bfd_generic_group_name
9676 #define alpha_vms_bfd_discard_group bfd_generic_discard_group
9677 #define alpha_vms_section_already_linked \
9678 _bfd_generic_section_already_linked
9680 #define alpha_vms_bfd_define_common_symbol bfd_generic_define_common_symbol
9681 #define alpha_vms_bfd_link_hide_symbol _bfd_generic_link_hide_symbol
9682 #define alpha_vms_bfd_define_start_stop bfd_generic_define_start_stop
9683 #define alpha_vms_bfd_link_just_syms _bfd_generic_link_just_syms
9684 #define alpha_vms_bfd_copy_link_hash_symbol_type \
9685 _bfd_generic_copy_link_hash_symbol_type
9687 #define alpha_vms_bfd_link_split_section _bfd_generic_link_split_section
9689 #define alpha_vms_get_dynamic_symtab_upper_bound \
9690 _bfd_nodynamic_get_dynamic_symtab_upper_bound
9691 #define alpha_vms_canonicalize_dynamic_symtab \
9692 _bfd_nodynamic_canonicalize_dynamic_symtab
9693 #define alpha_vms_get_dynamic_reloc_upper_bound \
9694 _bfd_nodynamic_get_dynamic_reloc_upper_bound
9695 #define alpha_vms_canonicalize_dynamic_reloc \
9696 _bfd_nodynamic_canonicalize_dynamic_reloc
9697 #define alpha_vms_bfd_link_check_relocs _bfd_generic_link_check_relocs
9699 const bfd_target alpha_vms_vec
=
9701 "vms-alpha", /* Name. */
9702 bfd_target_evax_flavour
,
9703 BFD_ENDIAN_LITTLE
, /* Data byte order is little. */
9704 BFD_ENDIAN_LITTLE
, /* Header byte order is little. */
9706 (HAS_RELOC
| EXEC_P
| HAS_LINENO
| HAS_DEBUG
| HAS_SYMS
| HAS_LOCALS
9707 | WP_TEXT
| D_PAGED
), /* Object flags. */
9708 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
9709 | SEC_READONLY
| SEC_CODE
| SEC_DATA
9710 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* Sect flags. */
9711 0, /* symbol_leading_char. */
9712 ' ', /* ar_pad_char. */
9713 15, /* ar_max_namelen. */
9714 0, /* match priority. */
9715 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
9716 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
9717 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
9718 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
9719 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
9720 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
9722 { /* bfd_check_format. */
9725 _bfd_vms_lib_alpha_archive_p
,
9728 { /* bfd_set_format. */
9729 _bfd_bool_bfd_false_error
,
9731 _bfd_vms_lib_alpha_mkarchive
,
9732 _bfd_bool_bfd_false_error
9734 { /* bfd_write_contents. */
9735 _bfd_bool_bfd_false_error
,
9736 alpha_vms_write_object_contents
,
9737 _bfd_vms_lib_write_archive_contents
,
9738 _bfd_bool_bfd_false_error
9741 BFD_JUMP_TABLE_GENERIC (alpha_vms
),
9742 BFD_JUMP_TABLE_COPY (vms
),
9743 BFD_JUMP_TABLE_CORE (_bfd_nocore
),
9744 BFD_JUMP_TABLE_ARCHIVE (_bfd_vms_lib
),
9745 BFD_JUMP_TABLE_SYMBOLS (alpha_vms
),
9746 BFD_JUMP_TABLE_RELOCS (alpha_vms
),
9747 BFD_JUMP_TABLE_WRITE (alpha_vms
),
9748 BFD_JUMP_TABLE_LINK (alpha_vms
),
9749 BFD_JUMP_TABLE_DYNAMIC (alpha_vms
),