1 /* vms.c -- BFD back-end for VAX (openVMS/VAX) and
2 EVAX (openVMS/Alpha) files.
3 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002
4 Free Software Foundation, Inc.
6 Written by Klaus K"ampf (kkaempf@rmi.de)
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
29 static boolean vms_initialize
PARAMS ((bfd
*));
30 static unsigned int priv_section_count
;
31 static boolean fill_section_ptr
PARAMS ((struct bfd_hash_entry
*, PTR
));
32 static boolean vms_fixup_sections
PARAMS ((bfd
*));
33 static boolean copy_symbols
PARAMS ((struct bfd_hash_entry
*, PTR
));
34 static bfd_reloc_status_type reloc_nil
35 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
36 static const struct bfd_target
*vms_object_p
PARAMS ((bfd
*abfd
));
37 static const struct bfd_target
*vms_archive_p
PARAMS ((bfd
*abfd
));
38 static boolean vms_mkobject
PARAMS ((bfd
*abfd
));
39 static boolean vms_write_object_contents
PARAMS ((bfd
*abfd
));
40 static boolean vms_close_and_cleanup
PARAMS ((bfd
*abfd
));
41 static boolean vms_bfd_free_cached_info
PARAMS ((bfd
*abfd
));
42 static boolean vms_new_section_hook
PARAMS ((bfd
*abfd
, asection
*section
));
43 static boolean vms_get_section_contents
44 PARAMS ((bfd
*abfd
, asection
*section
, PTR x1
, file_ptr x2
,
46 static boolean vms_get_section_contents_in_window
47 PARAMS ((bfd
*abfd
, asection
*section
, bfd_window
*w
, file_ptr offset
,
48 bfd_size_type count
));
49 static boolean vms_bfd_copy_private_bfd_data
PARAMS ((bfd
*src
, bfd
*dest
));
50 static boolean vms_bfd_copy_private_section_data
51 PARAMS ((bfd
*srcbfd
, asection
*srcsec
, bfd
*dstbfd
, asection
*dstsec
));
52 static boolean vms_bfd_copy_private_symbol_data
53 PARAMS ((bfd
*ibfd
, asymbol
*isym
, bfd
*obfd
, asymbol
*osym
));
54 static boolean vms_bfd_print_private_bfd_data
55 PARAMS ((bfd
*abfd
, void *file
));
56 static char *vms_core_file_failing_command
PARAMS ((bfd
*abfd
));
57 static int vms_core_file_failing_signal
PARAMS ((bfd
*abfd
));
58 static boolean vms_core_file_matches_executable_p
59 PARAMS ((bfd
*abfd
, bfd
*bbfd
));
60 static boolean vms_slurp_armap
PARAMS ((bfd
*abfd
));
61 static boolean vms_slurp_extended_name_table
PARAMS ((bfd
*abfd
));
62 static boolean vms_construct_extended_name_table
63 PARAMS ((bfd
*abfd
, char **tabloc
, bfd_size_type
*tablen
,
65 static void vms_truncate_arname
66 PARAMS ((bfd
*abfd
, const char *pathname
, char *arhdr
));
67 static boolean vms_write_armap
68 PARAMS ((bfd
*arch
, unsigned int elength
, struct orl
*map
,
69 unsigned int orl_count
, int stridx
));
70 static PTR vms_read_ar_hdr
PARAMS ((bfd
*abfd
));
71 static bfd
*vms_get_elt_at_index
PARAMS ((bfd
*abfd
, symindex index
));
72 static bfd
*vms_openr_next_archived_file
PARAMS ((bfd
*arch
, bfd
*prev
));
73 static boolean vms_update_armap_timestamp
PARAMS ((bfd
*abfd
));
74 static int vms_generic_stat_arch_elt
PARAMS ((bfd
*, struct stat
*));
75 static long vms_get_symtab_upper_bound
PARAMS ((bfd
*abfd
));
76 static long vms_get_symtab
PARAMS ((bfd
*abfd
, asymbol
**symbols
));
77 static void vms_print_symbol
78 PARAMS ((bfd
*abfd
, PTR file
, asymbol
*symbol
, bfd_print_symbol_type how
));
79 static void vms_get_symbol_info
80 PARAMS ((bfd
*abfd
, asymbol
*symbol
, symbol_info
*ret
));
81 static boolean vms_bfd_is_local_label_name
PARAMS ((bfd
*abfd
, const char *));
82 static alent
*vms_get_lineno
PARAMS ((bfd
*abfd
, asymbol
*symbol
));
83 static boolean vms_find_nearest_line
84 PARAMS ((bfd
*abfd
, asection
*section
, asymbol
**symbols
, bfd_vma offset
,
85 const char **file
, const char **func
, unsigned int *line
));
86 static asymbol
*vms_bfd_make_debug_symbol
87 PARAMS ((bfd
*abfd
, void *ptr
, unsigned long size
));
88 static long vms_read_minisymbols
89 PARAMS ((bfd
*abfd
, boolean dynamic
, PTR
*minisymsp
, unsigned int *sizep
));
90 static asymbol
*vms_minisymbol_to_symbol
91 PARAMS ((bfd
*abfd
, boolean dynamic
, const PTR minisym
, asymbol
*sym
));
92 static long vms_get_reloc_upper_bound
PARAMS ((bfd
*abfd
, asection
*sect
));
93 static long vms_canonicalize_reloc
94 PARAMS ((bfd
*abfd
, asection
*srcsec
, arelent
**location
,
96 static const struct reloc_howto_struct
*vms_bfd_reloc_type_lookup
97 PARAMS ((bfd
*abfd
, bfd_reloc_code_real_type code
));
98 static boolean vms_set_arch_mach
99 PARAMS ((bfd
*abfd
, enum bfd_architecture arch
, unsigned long mach
));
100 static boolean vms_set_section_contents
101 PARAMS ((bfd
*abfd
, asection
*section
, PTR location
, file_ptr offset
,
102 bfd_size_type count
));
103 static int vms_sizeof_headers
PARAMS ((bfd
*abfd
, boolean reloc
));
104 static bfd_byte
*vms_bfd_get_relocated_section_contents
105 PARAMS ((bfd
*abfd
, struct bfd_link_info
*link_info
,
106 struct bfd_link_order
*link_order
, bfd_byte
*data
,
107 boolean relocateable
, asymbol
**symbols
));
108 static boolean vms_bfd_relax_section
109 PARAMS ((bfd
*abfd
, asection
*section
, struct bfd_link_info
*link_info
,
111 static boolean vms_bfd_gc_sections
112 PARAMS ((bfd
*abfd
, struct bfd_link_info
*link_info
));
113 static boolean vms_bfd_merge_sections
114 PARAMS ((bfd
*abfd
, struct bfd_link_info
*link_info
));
115 static struct bfd_link_hash_table
*vms_bfd_link_hash_table_create
116 PARAMS ((bfd
*abfd
));
117 static void vms_bfd_link_hash_table_free
118 PARAMS ((struct bfd_link_hash_table
*hash
));
119 static boolean vms_bfd_link_add_symbols
120 PARAMS ((bfd
*abfd
, struct bfd_link_info
*link_info
));
121 static boolean vms_bfd_final_link
122 PARAMS ((bfd
*abfd
, struct bfd_link_info
*link_info
));
123 static boolean vms_bfd_link_split_section
124 PARAMS ((bfd
*abfd
, asection
*section
));
125 static long vms_get_dynamic_symtab_upper_bound
PARAMS ((bfd
*abfd
));
126 static long vms_canonicalize_dynamic_symtab
127 PARAMS ((bfd
*abfd
, asymbol
**symbols
));
128 static long vms_get_dynamic_reloc_upper_bound
PARAMS ((bfd
*abfd
));
129 static long vms_canonicalize_dynamic_reloc
130 PARAMS ((bfd
*abfd
, arelent
**arel
, asymbol
**symbols
));
131 static boolean vms_bfd_merge_private_bfd_data
PARAMS ((bfd
*ibfd
, bfd
*obfd
));
132 static boolean vms_bfd_set_private_flags
PARAMS ((bfd
*abfd
, flagword flags
));
134 #define vms_make_empty_symbol _bfd_generic_make_empty_symbol
136 /*===========================================================================*/
138 const bfd_target vms_alpha_vec
=
140 "vms-alpha", /* name */
141 bfd_target_evax_flavour
,
142 BFD_ENDIAN_LITTLE
, /* data byte order is little */
143 BFD_ENDIAN_LITTLE
, /* header byte order is little */
145 (HAS_RELOC
| HAS_SYMS
146 | WP_TEXT
| D_PAGED
), /* object flags */
147 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
148 | SEC_READONLY
| SEC_CODE
| SEC_DATA
149 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* sect flags */
150 0, /* symbol_leading_char */
151 ' ', /* ar_pad_char */
152 15, /* ar_max_namelen */
153 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
154 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
155 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
156 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
157 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
158 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
160 {_bfd_dummy_target
, vms_object_p
, /* bfd_check_format */
161 vms_archive_p
, _bfd_dummy_target
},
162 {bfd_false
, vms_mkobject
, /* bfd_set_format */
163 _bfd_generic_mkarchive
, bfd_false
},
164 {bfd_false
, vms_write_object_contents
, /* bfd_write_contents */
165 _bfd_write_archive_contents
, bfd_false
},
167 BFD_JUMP_TABLE_GENERIC (vms
),
168 BFD_JUMP_TABLE_COPY (vms
),
169 BFD_JUMP_TABLE_CORE (vms
),
170 BFD_JUMP_TABLE_ARCHIVE (vms
),
171 BFD_JUMP_TABLE_SYMBOLS (vms
),
172 BFD_JUMP_TABLE_RELOCS (vms
),
173 BFD_JUMP_TABLE_WRITE (vms
),
174 BFD_JUMP_TABLE_LINK (vms
),
175 BFD_JUMP_TABLE_DYNAMIC (vms
),
182 const bfd_target vms_vax_vec
=
184 "vms-vax", /* name */
185 bfd_target_ovax_flavour
,
186 BFD_ENDIAN_LITTLE
, /* data byte order is little */
187 BFD_ENDIAN_LITTLE
, /* header byte order is little */
189 (HAS_RELOC
| HAS_SYMS
/* object flags */
191 | HAS_LINENO
| HAS_DEBUG
| HAS_LOCALS
),
193 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
194 | SEC_READONLY
| SEC_CODE
| SEC_DATA
195 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* sect flags */
196 0, /* symbol_leading_char */
197 ' ', /* ar_pad_char */
198 15, /* ar_max_namelen */
199 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
200 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
201 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* data */
202 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
203 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
204 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* hdrs */
206 {_bfd_dummy_target
, vms_object_p
, /* bfd_check_format */
207 vms_archive_p
, _bfd_dummy_target
},
208 {bfd_false
, vms_mkobject
, /* bfd_set_format */
209 _bfd_generic_mkarchive
, bfd_false
},
210 {bfd_false
, vms_write_object_contents
, /* bfd_write_contents */
211 _bfd_write_archive_contents
, bfd_false
},
213 BFD_JUMP_TABLE_GENERIC (vms
),
214 BFD_JUMP_TABLE_COPY (vms
),
215 BFD_JUMP_TABLE_CORE (vms
),
216 BFD_JUMP_TABLE_ARCHIVE (vms
),
217 BFD_JUMP_TABLE_SYMBOLS (vms
),
218 BFD_JUMP_TABLE_RELOCS (vms
),
219 BFD_JUMP_TABLE_WRITE (vms
),
220 BFD_JUMP_TABLE_LINK (vms
),
221 BFD_JUMP_TABLE_DYNAMIC (vms
),
228 /*===========================================================================*/
230 /* Initialize private data */
233 vms_initialize (abfd
)
239 if (abfd
->tdata
.any
!= 0)
242 bfd_set_start_address (abfd
, (bfd_vma
) -1);
244 amt
= sizeof (struct vms_private_data_struct
);
245 abfd
->tdata
.any
= (struct vms_private_data_struct
*) bfd_malloc (amt
);
246 if (abfd
->tdata
.any
== 0)
256 PRIV (rec_length
) = 0;
257 PRIV (file_format
) = FF_UNKNOWN
;
258 PRIV (fixup_done
) = false;
259 PRIV (sections
) = NULL
;
261 amt
= sizeof (struct stack_struct
) * STACKSIZE
;
262 PRIV (stack
) = (struct stack_struct
*) bfd_malloc (amt
);
263 if (PRIV (stack
) == 0)
266 free (abfd
->tdata
.any
);
272 amt
= sizeof (struct bfd_hash_table
);
273 PRIV (vms_symbol_table
) = (struct bfd_hash_table
*) bfd_malloc (amt
);
274 if (PRIV (vms_symbol_table
) == 0)
279 goto vms_init_no_mem1
;
282 if (!bfd_hash_table_init (PRIV (vms_symbol_table
), _bfd_vms_hash_newfunc
))
285 amt
= sizeof (struct location_struct
) * LOCATION_SAVE_SIZE
;
286 PRIV (location_stack
) = (struct location_struct
*) bfd_malloc (amt
);
287 if (PRIV (location_stack
) == 0)
290 free (PRIV (vms_symbol_table
));
291 PRIV (vms_symbol_table
) = 0;
292 goto vms_init_no_mem2
;
295 for (i
= 0; i
< VMS_SECTION_COUNT
; i
++)
296 PRIV (vms_section_table
)[i
] = NULL
;
298 PRIV (output_buf
) = (unsigned char *) malloc (MAX_OUTREC_SIZE
);
299 if (PRIV (output_buf
) == 0)
301 free (PRIV (location_stack
));
302 PRIV (location_stack
) = 0;
303 goto vms_init_no_mem3
;
305 PRIV (push_level
) = 0;
306 PRIV (pushed_size
) = 0;
307 PRIV (length_pos
) = 2;
308 PRIV (output_size
) = 0;
309 PRIV (output_alignment
) = 1;
314 /* Fill symbol->section with section ptr
315 symbol->section is filled with the section index for defined symbols
316 during reading the GSD/EGSD section. But we need the pointer to the
319 It has the correct value for referenced (undefined section) symbols
321 called from bfd_hash_traverse in vms_fixup_sections */
324 fill_section_ptr (entry
, sections
)
325 struct bfd_hash_entry
*entry
;
331 sym
= ((vms_symbol_entry
*)entry
)->symbol
;
335 vms_debug (6, "fill_section_ptr: sym %p, sec %p\n", sym
, sec
);
338 /* fill forward references (these contain section number, not section ptr). */
340 if ((unsigned int) sec
< priv_section_count
)
342 sec
= ((vms_symbol_entry
*)entry
)->symbol
->section
=
343 ((asection
**)sections
)[(int)sec
];
346 if (strcmp (sym
->name
, sec
->name
) == 0)
347 sym
->flags
|= BSF_SECTION_SYM
;
353 set up all pointers and arrays, counters and sizes are fixed now
355 we build a private sections vector for easy access since sections
356 are always referenced by an index number.
358 alloc PRIV(sections) according to abfd->section_count
359 copy abfd->sections to PRIV(sections) */
362 vms_fixup_sections (abfd
)
365 if (PRIV (fixup_done
))
369 * traverse symbol table and fill in all section pointers
372 /* can't provide section count as argument to fill_section_ptr(). */
373 priv_section_count
= PRIV (section_count
);
374 bfd_hash_traverse (PRIV (vms_symbol_table
), fill_section_ptr
,
375 (PTR
) (PRIV (sections
)));
377 PRIV (fixup_done
) = true;
382 /*===========================================================================*/
384 /* Check the format for a file being read.
385 Return a (bfd_target *) if it's an object file or zero if not. */
387 static const struct bfd_target
*
393 const struct bfd_target
*target_vector
= 0;
394 const bfd_arch_info_type
*arch
= 0;
397 vms_debug (1, "vms_object_p(%p)\n", abfd
);
400 if (!vms_initialize (abfd
))
402 fprintf (stderr
, "vms_initialize () failed !!\n");
406 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
))
408 bfd_set_error (bfd_error_file_truncated
);
417 vms_debug (7, "reading at %08lx\n", bfd_tell(abfd
));
419 if (_bfd_vms_next_record (abfd
) < 0)
422 vms_debug (2, "next_record failed\n");
424 bfd_set_error (bfd_error_wrong_format
);
428 if ((prev_type
== EOBJ_S_C_EGSD
)
429 && (PRIV (rec_type
) != EOBJ_S_C_EGSD
))
431 if (vms_fixup_sections (abfd
) == false)
434 vms_debug (2, "vms_fixup_sections failed\n");
436 bfd_set_error (bfd_error_wrong_format
);
441 prev_type
= PRIV (rec_type
);
443 if (target_vector
== 0)
445 if (prev_type
<= OBJ_S_C_MAXRECTYP
)
446 target_vector
= &vms_vax_vec
;
448 target_vector
= &vms_alpha_vec
;
455 err
= _bfd_vms_slurp_hdr (abfd
, prev_type
);
460 err
= _bfd_vms_slurp_eom (abfd
, prev_type
);
464 err
= _bfd_vms_slurp_gsd (abfd
, prev_type
);
468 err
= _bfd_vms_slurp_tir (abfd
, prev_type
);
472 err
= _bfd_vms_slurp_dbg (abfd
, prev_type
);
476 err
= _bfd_vms_slurp_tbt (abfd
, prev_type
);
479 err
= _bfd_vms_slurp_lnk (abfd
, prev_type
);
487 vms_debug (2, "slurp type %d failed with %d\n", prev_type
, err
);
489 bfd_set_error (bfd_error_wrong_format
);
493 while ((prev_type
!= EOBJ_S_C_EEOM
) && (prev_type
!= OBJ_S_C_EOM
) && (prev_type
!= OBJ_S_C_EOMW
));
495 if (target_vector
== &vms_vax_vec
)
497 if (vms_fixup_sections (abfd
) == false)
500 vms_debug (2, "vms_fixup_sections failed\n");
502 bfd_set_error (bfd_error_wrong_format
);
506 /* set arch_info to vax */
508 arch
= bfd_scan_arch ("vax");
511 vms_debug (2, "arch is vax\n");
514 else if (target_vector
== &vms_alpha_vec
)
516 /* set arch_info to alpha */
518 arch
= bfd_scan_arch ("alpha");
521 vms_debug (2, "arch is alpha\n");
528 vms_debug (2, "arch not found\n");
530 bfd_set_error (bfd_error_wrong_format
);
533 abfd
->arch_info
= arch
;
535 return target_vector
;
538 /* Check the format for a file being read.
539 Return a (bfd_target *) if it's an archive file or zero. */
541 static const struct bfd_target
*
543 bfd
*abfd ATTRIBUTE_UNUSED
;
546 vms_debug (1, "vms_archive_p(%p)\n", abfd
);
552 /* Set the format of a file being written. */
559 vms_debug (1, "vms_mkobject(%p)\n", abfd
);
562 if (!vms_initialize (abfd
))
564 fprintf (stderr
, "vms_initialize () failed !!\n");
570 const bfd_arch_info_type
*arch
= bfd_scan_arch ("vax");
572 const bfd_arch_info_type
*arch
= bfd_scan_arch ("alpha");
576 bfd_set_error(bfd_error_wrong_format
);
579 abfd
->arch_info
= arch
;
585 /* Write cached information into a file being written, at bfd_close. */
588 vms_write_object_contents (abfd
)
592 vms_debug (1, "vms_write_object_contents(%p)\n", abfd
);
595 if (abfd
->section_count
> 0) /* we have sections */
599 if (_bfd_vms_write_hdr (abfd
, OBJ_S_C_HDR
) != 0)
601 if (_bfd_vms_write_gsd (abfd
, OBJ_S_C_GSD
) != 0)
603 if (_bfd_vms_write_tir (abfd
, OBJ_S_C_TIR
) != 0)
605 if (_bfd_vms_write_tbt (abfd
, OBJ_S_C_TBT
) != 0)
607 if (_bfd_vms_write_dbg (abfd
, OBJ_S_C_DBG
) != 0)
609 if (abfd
->section_count
> 255)
611 if (_bfd_vms_write_eom (abfd
, OBJ_S_C_EOMW
) != 0)
616 if (_bfd_vms_write_eom (abfd
, OBJ_S_C_EOM
) != 0)
622 if (_bfd_vms_write_hdr (abfd
, EOBJ_S_C_EMH
) != 0)
624 if (_bfd_vms_write_gsd (abfd
, EOBJ_S_C_EGSD
) != 0)
626 if (_bfd_vms_write_tir (abfd
, EOBJ_S_C_ETIR
) != 0)
628 if (_bfd_vms_write_tbt (abfd
, EOBJ_S_C_ETBT
) != 0)
630 if (_bfd_vms_write_dbg (abfd
, EOBJ_S_C_EDBG
) != 0)
632 if (_bfd_vms_write_eom (abfd
, EOBJ_S_C_EEOM
) != 0)
639 /*-- 4.1, generic -----------------------------------------------------------*/
641 /* Called when the BFD is being closed to do any necessary cleanup. */
644 vms_close_and_cleanup (abfd
)
648 vms_section
*es
, *es1
;
652 vms_debug (1, "vms_close_and_cleanup(%p)\n", abfd
);
657 if (PRIV (vms_buf
) != NULL
)
659 free (PRIV (vms_buf
));
660 PRIV (vms_buf
) = NULL
;
664 if (PRIV (output_buf
) != 0)
666 free (PRIV (output_buf
));
667 PRIV (output_buf
) = 0;
670 sec
= abfd
->sections
;
674 free (sec
->contents
);
678 if (PRIV (sections
) != NULL
)
680 free (PRIV (sections
));
681 PRIV (sections
) = NULL
;
684 if (PRIV (vms_symbol_table
))
686 bfd_hash_table_free (PRIV (vms_symbol_table
));
687 PRIV (vms_symbol_table
) = 0;
696 if (PRIV (location_stack
))
698 free (PRIV (location_stack
));
699 PRIV (location_stack
) = 0;
702 for (i
= 0; i
< VMS_SECTION_COUNT
; i
++)
704 es
= PRIV (vms_section_table
)[i
];
711 PRIV (vms_section_table
)[i
] = NULL
;
714 free (abfd
->tdata
.any
);
715 abfd
->tdata
.any
= NULL
;
720 /* Ask the BFD to free all cached information. */
722 vms_bfd_free_cached_info (abfd
)
723 bfd
*abfd ATTRIBUTE_UNUSED
;
726 vms_debug (1, "vms_bfd_free_cached_info(%p)\n", abfd
);
731 /* Called when a new section is created. */
734 vms_new_section_hook (abfd
, section
)
738 /* Count hasn't been incremented yet. */
739 unsigned int section_count
= abfd
->section_count
+ 1;
742 vms_debug (1, "vms_new_section_hook (%p, [%d]%s), count %d\n",
743 abfd
, section
->index
, section
->name
, section_count
);
745 bfd_set_section_alignment (abfd
, section
, 4);
747 if (section_count
> PRIV (section_count
))
749 bfd_size_type amt
= section_count
;
750 amt
*= sizeof (asection
*);
751 PRIV (sections
) = (asection
**) bfd_realloc (PRIV (sections
), amt
);
752 if (PRIV (sections
) == 0)
754 PRIV (section_count
) = section_count
;
757 vms_debug (6, "section_count: %d\n", PRIV (section_count
));
759 PRIV (sections
)[section
->index
] = section
;
761 vms_debug (7, "%d: %s\n", section
->index
, section
->name
);
767 /* Read the contents of a section.
768 buf points to a buffer of buf_size bytes to be filled with
769 section data (starting at offset into section) */
772 vms_get_section_contents (abfd
, section
, buf
, offset
, buf_size
)
773 bfd
*abfd ATTRIBUTE_UNUSED
;
774 asection
*section ATTRIBUTE_UNUSED
;
775 PTR buf ATTRIBUTE_UNUSED
;
776 file_ptr offset ATTRIBUTE_UNUSED
;
777 bfd_size_type buf_size ATTRIBUTE_UNUSED
;
780 vms_debug (1, "vms_get_section_contents(%p, %s, %p, off %ld, size %d)\n",
781 abfd
, section
->name
, buf
, offset
, (int)buf_size
);
784 /* shouldn't be called, since all sections are IN_MEMORY */
789 /* Read the contents of a section.
790 buf points to a buffer of buf_size bytes to be filled with
791 section data (starting at offset into section) */
794 vms_get_section_contents_in_window (abfd
, section
, w
, offset
, count
)
795 bfd
*abfd ATTRIBUTE_UNUSED
;
796 asection
*section ATTRIBUTE_UNUSED
;
797 bfd_window
*w ATTRIBUTE_UNUSED
;
798 file_ptr offset ATTRIBUTE_UNUSED
;
799 bfd_size_type count ATTRIBUTE_UNUSED
;
802 vms_debug (1, "vms_get_section_contents_in_window(%p, %s, %p, off %ld, count %d)\n",
803 abfd
, section
->name
, w
, offset
, (int)count
);
806 /* shouldn't be called, since all sections are IN_MEMORY */
811 /*-- Part 4.2, copy private data --------------------------------------------*/
813 /* Called to copy BFD general private data from one object file
817 vms_bfd_copy_private_bfd_data (src
, dest
)
818 bfd
*src ATTRIBUTE_UNUSED
;
819 bfd
*dest ATTRIBUTE_UNUSED
;
822 vms_debug (1, "vms_bfd_copy_private_bfd_data(%p, %p)\n", src
, dest
);
827 /* Merge private BFD information from the BFD @var{ibfd} to the
828 the output file BFD @var{obfd} when linking. Return <<true>>
829 on success, <<false>> on error. Possible error returns are:
831 o <<bfd_error_no_memory>> -
832 Not enough memory exists to create private data for @var{obfd}. */
835 vms_bfd_merge_private_bfd_data (ibfd
, obfd
)
836 bfd
*ibfd ATTRIBUTE_UNUSED
;
837 bfd
*obfd ATTRIBUTE_UNUSED
;
840 vms_debug (1,"vms_bfd_merge_private_bfd_data(%p, %p)\n", ibfd
, obfd
);
845 /* Set private BFD flag information in the BFD @var{abfd}.
846 Return <<true>> on success, <<false>> on error. Possible error
849 o <<bfd_error_no_memory>> -
850 Not enough memory exists to create private data for @var{obfd}. */
853 vms_bfd_set_private_flags (abfd
, flags
)
854 bfd
*abfd ATTRIBUTE_UNUSED
;
855 flagword flags ATTRIBUTE_UNUSED
;
858 vms_debug (1,"vms_bfd_set_private_flags(%p, %lx)\n", abfd
, (long)flags
);
863 /* Called to copy BFD private section data from one object file
867 vms_bfd_copy_private_section_data (srcbfd
, srcsec
, dstbfd
, dstsec
)
868 bfd
*srcbfd ATTRIBUTE_UNUSED
;
869 asection
*srcsec ATTRIBUTE_UNUSED
;
870 bfd
*dstbfd ATTRIBUTE_UNUSED
;
871 asection
*dstsec ATTRIBUTE_UNUSED
;
874 vms_debug (1, "vms_bfd_copy_private_section_data(%p, %s, %p, %s)\n",
875 srcbfd
, srcsec
->name
, dstbfd
, dstsec
->name
);
880 /* Called to copy BFD private symbol data from one object file
884 vms_bfd_copy_private_symbol_data (ibfd
, isym
, obfd
, osym
)
885 bfd
*ibfd ATTRIBUTE_UNUSED
;
886 asymbol
*isym ATTRIBUTE_UNUSED
;
887 bfd
*obfd ATTRIBUTE_UNUSED
;
888 asymbol
*osym ATTRIBUTE_UNUSED
;
891 vms_debug (1, "vms_bfd_copy_private_symbol_data(%p, %s, %p, %s)\n",
892 ibfd
, isym
->name
, obfd
, osym
->name
);
897 /*-- Part 4.3, core file ----------------------------------------------------*/
899 /* Return a read-only string explaining which program was running
900 when it failed and produced the core file abfd. */
903 vms_core_file_failing_command (abfd
)
904 bfd
*abfd ATTRIBUTE_UNUSED
;
907 vms_debug (1, "vms_core_file_failing_command(%p)\n", abfd
);
912 /* Returns the signal number which caused the core dump which
913 generated the file the BFD abfd is attached to. */
916 vms_core_file_failing_signal (abfd
)
917 bfd
*abfd ATTRIBUTE_UNUSED
;
920 vms_debug (1, "vms_core_file_failing_signal(%p)\n", abfd
);
925 /* Return true if the core file attached to core_bfd was generated
926 by a run of the executable file attached to exec_bfd, false otherwise. */
929 vms_core_file_matches_executable_p (abfd
, bbfd
)
930 bfd
*abfd ATTRIBUTE_UNUSED
;
931 bfd
*bbfd ATTRIBUTE_UNUSED
;
934 vms_debug (1, "vms_core_file_matches_executable_p(%p, %p)\n", abfd
, bbfd
);
939 /*-- Part 4.4, archive ------------------------------------------------------*/
941 /* ??? do something with an archive map.
942 Return false on error, true otherwise. */
945 vms_slurp_armap (abfd
)
946 bfd
*abfd ATTRIBUTE_UNUSED
;
949 vms_debug (1, "vms_slurp_armap(%p)\n", abfd
);
954 /* ??? do something with an extended name table.
955 Return false on error, true otherwise. */
958 vms_slurp_extended_name_table (abfd
)
959 bfd
*abfd ATTRIBUTE_UNUSED
;
962 vms_debug (1, "vms_slurp_extended_name_table(%p)\n", abfd
);
967 /* ??? do something with an extended name table.
968 Return false on error, true otherwise. */
971 vms_construct_extended_name_table (abfd
, tabloc
, tablen
, name
)
972 bfd
*abfd ATTRIBUTE_UNUSED
;
973 char **tabloc ATTRIBUTE_UNUSED
;
974 bfd_size_type
*tablen ATTRIBUTE_UNUSED
;
975 const char **name ATTRIBUTE_UNUSED
;
978 vms_debug (1, "vms_construct_extended_name_table(%p)\n", abfd
);
983 /* Truncate the name of an archive to match system-dependent restrictions */
986 vms_truncate_arname (abfd
, pathname
, arhdr
)
987 bfd
*abfd ATTRIBUTE_UNUSED
;
988 const char *pathname ATTRIBUTE_UNUSED
;
989 char *arhdr ATTRIBUTE_UNUSED
;
992 vms_debug (1, "vms_truncate_arname(%p, %s, %s)\n", abfd
, pathname
, arhdr
);
997 /* ??? write archive map */
1000 vms_write_armap (arch
, elength
, map
, orl_count
, stridx
)
1001 bfd
*arch ATTRIBUTE_UNUSED
;
1002 unsigned int elength ATTRIBUTE_UNUSED
;
1003 struct orl
*map ATTRIBUTE_UNUSED
;
1004 unsigned int orl_count ATTRIBUTE_UNUSED
;
1005 int stridx ATTRIBUTE_UNUSED
;
1008 vms_debug (1, "vms_write_armap(%p, %d, %p, %d %d)\n",
1009 arch
, elength
, map
, orl_count
, stridx
);
1014 /* Read archive header ??? */
1017 vms_read_ar_hdr (abfd
)
1018 bfd
* abfd ATTRIBUTE_UNUSED
;
1021 vms_debug (1, "vms_read_ar_hdr(%p)\n", abfd
);
1026 /* Provided a BFD, @var{archive}, containing an archive and NULL, open
1027 an input BFD on the first contained element and returns that.
1028 Subsequent calls should pass the archive and the previous return value
1029 to return a created BFD to the next contained element.
1030 NULL is returned when there are no more. */
1033 vms_openr_next_archived_file (arch
, prev
)
1034 bfd
*arch ATTRIBUTE_UNUSED
;
1035 bfd
*prev ATTRIBUTE_UNUSED
;
1038 vms_debug (1, "vms_openr_next_archived_file(%p, %p)\n", arch
, prev
);
1043 /* Return the BFD which is referenced by the symbol in ABFD indexed by
1044 INDEX. INDEX should have been returned by bfd_get_next_mapent. */
1047 vms_get_elt_at_index (abfd
, index
)
1052 vms_debug (1, "vms_get_elt_at_index(%p, %p)\n", abfd
, index
);
1054 return _bfd_generic_get_elt_at_index(abfd
, index
);
1058 -> bfd_generic_stat_arch_elt */
1061 vms_generic_stat_arch_elt (abfd
, st
)
1066 vms_debug (1, "vms_generic_stat_arch_elt(%p, %p)\n", abfd
, st
);
1068 return bfd_generic_stat_arch_elt (abfd
, st
);
1071 /* This is a new function in bfd 2.5 */
1074 vms_update_armap_timestamp (abfd
)
1075 bfd
*abfd ATTRIBUTE_UNUSED
;
1078 vms_debug (1, "vms_update_armap_timestamp(%p)\n", abfd
);
1083 /*-- Part 4.5, symbols --------------------------------------------------------*/
1085 /* Return the number of bytes required to store a vector of pointers
1086 to asymbols for all the symbols in the BFD abfd, including a
1087 terminal NULL pointer. If there are no symbols in the BFD,
1088 then return 0. If an error occurs, return -1. */
1091 vms_get_symtab_upper_bound (abfd
)
1095 vms_debug (1, "vms_get_symtab_upper_bound(%p), %d symbols\n", abfd
, PRIV (gsd_sym_count
));
1097 return (PRIV (gsd_sym_count
)+1) * sizeof (asymbol
*);
1100 /* Copy symbols from hash table to symbol vector
1102 called from bfd_hash_traverse in vms_get_symtab
1103 init counter to 0 if entry == 0 */
1106 copy_symbols (entry
, arg
)
1107 struct bfd_hash_entry
*entry
;
1110 bfd
*abfd
= (bfd
*) arg
;
1112 if (entry
== NULL
) /* init counter */
1114 else /* fill vector, inc counter */
1115 PRIV (symcache
)[PRIV (symnum
)++] = ((vms_symbol_entry
*)entry
)->symbol
;
1120 /* Read the symbols from the BFD abfd, and fills in the vector
1121 location with pointers to the symbols and a trailing NULL.
1123 return # of symbols read */
1126 vms_get_symtab (abfd
, symbols
)
1131 vms_debug (1, "vms_get_symtab(%p, <ret>)\n", abfd
);
1135 (void)copy_symbols((struct bfd_hash_entry
*)0, abfd
);
1137 /* traverse table and fill symbols vector */
1139 PRIV (symcache
) = symbols
;
1140 bfd_hash_traverse(PRIV (vms_symbol_table
), copy_symbols
, (PTR
)abfd
);
1142 symbols
[PRIV (gsd_sym_count
)] = NULL
;
1144 return PRIV (gsd_sym_count
);
1147 /* Print symbol to file according to how. how is one of
1148 bfd_print_symbol_name just print the name
1149 bfd_print_symbol_more print more (???)
1150 bfd_print_symbol_all print all we know, which is not much right now :-) */
1153 vms_print_symbol (abfd
, file
, symbol
, how
)
1157 bfd_print_symbol_type how
;
1160 vms_debug (1, "vms_print_symbol(%p, %p, %p, %d)\n", abfd
, file
, symbol
, how
);
1165 case bfd_print_symbol_name
:
1166 case bfd_print_symbol_more
:
1167 fprintf ((FILE *)file
," %s", symbol
->name
);
1170 case bfd_print_symbol_all
:
1172 const char *section_name
= symbol
->section
->name
;
1174 bfd_print_symbol_vandf (abfd
, (PTR
)file
, symbol
);
1176 fprintf ((FILE *)file
," %-8s %s", section_name
, symbol
->name
);
1183 /* Return information about symbol in ret.
1185 fill type, value and name
1188 B bss segment symbol
1190 D data segment symbol
1192 t a static function symbol
1193 T text segment symbol
1198 vms_get_symbol_info (abfd
, symbol
, ret
)
1199 bfd
*abfd ATTRIBUTE_UNUSED
;
1206 vms_debug (1, "vms_get_symbol_info(%p, %p, %p)\n", abfd
, symbol
, ret
);
1209 sec
= symbol
->section
;
1214 if (bfd_is_com_section (sec
))
1216 else if (bfd_is_abs_section (sec
))
1218 else if (bfd_is_und_section (sec
))
1220 else if (bfd_is_ind_section (sec
))
1222 else if (bfd_get_section_flags (abfd
, sec
) & SEC_CODE
)
1224 else if (bfd_get_section_flags (abfd
, sec
) & SEC_DATA
)
1226 else if (bfd_get_section_flags (abfd
, sec
) & SEC_ALLOC
)
1231 if (ret
->type
!= 'U')
1232 ret
->value
= symbol
->value
+ symbol
->section
->vma
;
1235 ret
->name
= symbol
->name
;
1240 /* Return true if the given symbol sym in the BFD abfd is
1241 a compiler generated local label, else return false. */
1244 vms_bfd_is_local_label_name (abfd
, name
)
1245 bfd
*abfd ATTRIBUTE_UNUSED
;
1249 vms_debug (1, "vms_bfd_is_local_label_name(%p, %s)\n", abfd
, name
);
1251 return name
[0] == '$';
1254 /* Get source line number for symbol */
1257 vms_get_lineno (abfd
, symbol
)
1258 bfd
*abfd ATTRIBUTE_UNUSED
;
1259 asymbol
*symbol ATTRIBUTE_UNUSED
;
1262 vms_debug (1, "vms_get_lineno(%p, %p)\n", abfd
, symbol
);
1267 /* Provided a BFD, a section and an offset into the section, calculate and
1268 return the name of the source file and the line nearest to the wanted
1272 vms_find_nearest_line (abfd
, section
, symbols
, offset
, file
, func
, line
)
1273 bfd
*abfd ATTRIBUTE_UNUSED
;
1274 asection
*section ATTRIBUTE_UNUSED
;
1275 asymbol
**symbols ATTRIBUTE_UNUSED
;
1276 bfd_vma offset ATTRIBUTE_UNUSED
;
1277 const char **file ATTRIBUTE_UNUSED
;
1278 const char **func ATTRIBUTE_UNUSED
;
1279 unsigned int *line ATTRIBUTE_UNUSED
;
1282 vms_debug (1, "vms_find_nearest_line(%p, %s, %p, %ld, <ret>, <ret>, <ret>)\n",
1283 abfd
, section
->name
, symbols
, (long int)offset
);
1288 /* Back-door to allow format-aware applications to create debug symbols
1289 while using BFD for everything else. Currently used by the assembler
1290 when creating COFF files. */
1293 vms_bfd_make_debug_symbol (abfd
, ptr
, size
)
1294 bfd
*abfd ATTRIBUTE_UNUSED
;
1295 void *ptr ATTRIBUTE_UNUSED
;
1296 unsigned long size ATTRIBUTE_UNUSED
;
1299 vms_debug (1, "vms_bfd_make_debug_symbol(%p, %p, %ld)\n", abfd
, ptr
, size
);
1304 /* Read minisymbols. For minisymbols, we use the unmodified a.out
1305 symbols. The minisymbol_to_symbol function translates these into
1306 BFD asymbol structures. */
1309 vms_read_minisymbols (abfd
, dynamic
, minisymsp
, sizep
)
1313 unsigned int *sizep
;
1316 vms_debug (1, "vms_read_minisymbols(%p, %d, %p, %d)\n", abfd
, dynamic
, minisymsp
, *sizep
);
1318 return _bfd_generic_read_minisymbols (abfd
, dynamic
, minisymsp
, sizep
);
1321 /* Convert a minisymbol to a BFD asymbol. A minisymbol is just an
1322 unmodified a.out symbol. The SYM argument is a structure returned
1323 by bfd_make_empty_symbol, which we fill in here. */
1326 vms_minisymbol_to_symbol (abfd
, dynamic
, minisym
, sym
)
1333 vms_debug (1, "vms_minisymbol_to_symbol(%p, %d, %p, %p)\n", abfd
, dynamic
, minisym
, sym
);
1335 return _bfd_generic_minisymbol_to_symbol (abfd
, dynamic
, minisym
, sym
);
1338 /*-- Part 4.6, relocations --------------------------------------------------*/
1340 /* Return the number of bytes required to store the relocation information
1341 associated with section sect attached to bfd abfd.
1342 If an error occurs, return -1. */
1345 vms_get_reloc_upper_bound (abfd
, section
)
1346 bfd
*abfd ATTRIBUTE_UNUSED
;
1347 asection
*section ATTRIBUTE_UNUSED
;
1350 vms_debug (1, "vms_get_reloc_upper_bound(%p, %s)\n", abfd
, section
->name
);
1355 /* Call the back end associated with the open BFD abfd and translate the
1356 external form of the relocation information attached to sec into the
1357 internal canonical form. Place the table into memory at loc, which has
1358 been preallocated, usually by a call to bfd_get_reloc_upper_bound.
1359 Returns the number of relocs, or -1 on error. */
1362 vms_canonicalize_reloc (abfd
, section
, location
, symbols
)
1363 bfd
*abfd ATTRIBUTE_UNUSED
;
1364 asection
*section ATTRIBUTE_UNUSED
;
1365 arelent
**location ATTRIBUTE_UNUSED
;
1366 asymbol
**symbols ATTRIBUTE_UNUSED
;
1369 vms_debug (1, "vms_canonicalize_reloc(%p, %s, <ret>, <ret>)\n", abfd
, section
->name
);
1374 /*---------------------------------------------------------------------------*/
1375 /* this is just copied from ecoff-alpha, needs to be fixed probably */
1377 /* How to process the various reloc types. */
1379 static bfd_reloc_status_type
1380 reloc_nil (abfd
, reloc
, sym
, data
, sec
, output_bfd
, error_message
)
1381 bfd
*abfd ATTRIBUTE_UNUSED
;
1382 arelent
*reloc ATTRIBUTE_UNUSED
;
1383 asymbol
*sym ATTRIBUTE_UNUSED
;
1384 PTR data ATTRIBUTE_UNUSED
;
1385 asection
*sec ATTRIBUTE_UNUSED
;
1386 bfd
*output_bfd ATTRIBUTE_UNUSED
;
1387 char **error_message ATTRIBUTE_UNUSED
;
1390 vms_debug (1, "reloc_nil(abfd %p, output_bfd %p)\n", abfd
, output_bfd
);
1391 vms_debug (2, "In section %s, symbol %s\n",
1392 sec
->name
, sym
->name
);
1393 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
1394 reloc
->sym_ptr_ptr
[0]->name
,
1395 (unsigned long)reloc
->address
,
1396 (unsigned long)reloc
->addend
, reloc
->howto
->name
);
1397 vms_debug (2, "data at %p\n", data
);
1398 /* _bfd_hexdump (2, data, bfd_get_reloc_size(reloc->howto),0); */
1401 return bfd_reloc_ok
;
1404 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
1405 from smaller values. Start with zero, widen, *then* decrement. */
1406 #define MINUS_ONE (((bfd_vma)0) - 1)
1408 static reloc_howto_type alpha_howto_table
[] =
1410 HOWTO (ALPHA_R_IGNORE
, /* type */
1412 0, /* size (0 = byte, 1 = short, 2 = long) */
1414 true, /* pc_relative */
1416 complain_overflow_dont
, /* complain_on_overflow */
1417 reloc_nil
, /* special_function */
1418 "IGNORE", /* name */
1419 true, /* partial_inplace */
1422 true), /* pcrel_offset */
1424 /* A 64 bit reference to a symbol. */
1425 HOWTO (ALPHA_R_REFQUAD
, /* type */
1427 4, /* size (0 = byte, 1 = short, 2 = long) */
1429 false, /* pc_relative */
1431 complain_overflow_bitfield
, /* complain_on_overflow */
1432 reloc_nil
, /* special_function */
1433 "REFQUAD", /* name */
1434 true, /* partial_inplace */
1435 MINUS_ONE
, /* src_mask */
1436 MINUS_ONE
, /* dst_mask */
1437 false), /* pcrel_offset */
1439 /* A 21 bit branch. The native assembler generates these for
1440 branches within the text segment, and also fills in the PC
1441 relative offset in the instruction. */
1442 HOWTO (ALPHA_R_BRADDR
, /* type */
1444 2, /* size (0 = byte, 1 = short, 2 = long) */
1446 true, /* pc_relative */
1448 complain_overflow_signed
, /* complain_on_overflow */
1449 reloc_nil
, /* special_function */
1450 "BRADDR", /* name */
1451 true, /* partial_inplace */
1452 0x1fffff, /* src_mask */
1453 0x1fffff, /* dst_mask */
1454 false), /* pcrel_offset */
1456 /* A hint for a jump to a register. */
1457 HOWTO (ALPHA_R_HINT
, /* type */
1459 1, /* size (0 = byte, 1 = short, 2 = long) */
1461 true, /* pc_relative */
1463 complain_overflow_dont
, /* complain_on_overflow */
1464 reloc_nil
, /* special_function */
1466 true, /* partial_inplace */
1467 0x3fff, /* src_mask */
1468 0x3fff, /* dst_mask */
1469 false), /* pcrel_offset */
1471 /* 16 bit PC relative offset. */
1472 HOWTO (ALPHA_R_SREL16
, /* type */
1474 1, /* size (0 = byte, 1 = short, 2 = long) */
1476 true, /* pc_relative */
1478 complain_overflow_signed
, /* complain_on_overflow */
1479 reloc_nil
, /* special_function */
1480 "SREL16", /* name */
1481 true, /* partial_inplace */
1482 0xffff, /* src_mask */
1483 0xffff, /* dst_mask */
1484 false), /* pcrel_offset */
1486 /* 32 bit PC relative offset. */
1487 HOWTO (ALPHA_R_SREL32
, /* type */
1489 2, /* size (0 = byte, 1 = short, 2 = long) */
1491 true, /* pc_relative */
1493 complain_overflow_signed
, /* complain_on_overflow */
1494 reloc_nil
, /* special_function */
1495 "SREL32", /* name */
1496 true, /* partial_inplace */
1497 0xffffffff, /* src_mask */
1498 0xffffffff, /* dst_mask */
1499 false), /* pcrel_offset */
1501 /* A 64 bit PC relative offset. */
1502 HOWTO (ALPHA_R_SREL64
, /* type */
1504 4, /* size (0 = byte, 1 = short, 2 = long) */
1506 true, /* pc_relative */
1508 complain_overflow_signed
, /* complain_on_overflow */
1509 reloc_nil
, /* special_function */
1510 "SREL64", /* name */
1511 true, /* partial_inplace */
1512 MINUS_ONE
, /* src_mask */
1513 MINUS_ONE
, /* dst_mask */
1514 false), /* pcrel_offset */
1516 /* Push a value on the reloc evaluation stack. */
1517 HOWTO (ALPHA_R_OP_PUSH
, /* type */
1519 0, /* size (0 = byte, 1 = short, 2 = long) */
1521 false, /* pc_relative */
1523 complain_overflow_dont
, /* complain_on_overflow */
1524 reloc_nil
, /* special_function */
1525 "OP_PUSH", /* name */
1526 false, /* partial_inplace */
1529 false), /* pcrel_offset */
1531 /* Store the value from the stack at the given address. Store it in
1532 a bitfield of size r_size starting at bit position r_offset. */
1533 HOWTO (ALPHA_R_OP_STORE
, /* type */
1535 4, /* size (0 = byte, 1 = short, 2 = long) */
1537 false, /* pc_relative */
1539 complain_overflow_dont
, /* complain_on_overflow */
1540 reloc_nil
, /* special_function */
1541 "OP_STORE", /* name */
1542 false, /* partial_inplace */
1544 MINUS_ONE
, /* dst_mask */
1545 false), /* pcrel_offset */
1547 /* Subtract the reloc address from the value on the top of the
1548 relocation stack. */
1549 HOWTO (ALPHA_R_OP_PSUB
, /* type */
1551 0, /* size (0 = byte, 1 = short, 2 = long) */
1553 false, /* pc_relative */
1555 complain_overflow_dont
, /* complain_on_overflow */
1556 reloc_nil
, /* special_function */
1557 "OP_PSUB", /* name */
1558 false, /* partial_inplace */
1561 false), /* pcrel_offset */
1563 /* Shift the value on the top of the relocation stack right by the
1565 HOWTO (ALPHA_R_OP_PRSHIFT
, /* type */
1567 0, /* size (0 = byte, 1 = short, 2 = long) */
1569 false, /* pc_relative */
1571 complain_overflow_dont
, /* complain_on_overflow */
1572 reloc_nil
, /* special_function */
1573 "OP_PRSHIFT", /* name */
1574 false, /* partial_inplace */
1577 false), /* pcrel_offset */
1579 /* Hack. Linkage is done by linker. */
1580 HOWTO (ALPHA_R_LINKAGE
, /* type */
1582 8, /* size (0 = byte, 1 = short, 2 = long) */
1584 false, /* pc_relative */
1586 complain_overflow_dont
, /* complain_on_overflow */
1587 reloc_nil
, /* special_function */
1588 "LINKAGE", /* name */
1589 false, /* partial_inplace */
1592 false), /* pcrel_offset */
1594 /* A 32 bit reference to a symbol. */
1595 HOWTO (ALPHA_R_REFLONG
, /* type */
1597 2, /* size (0 = byte, 1 = short, 2 = long) */
1599 false, /* pc_relative */
1601 complain_overflow_bitfield
, /* complain_on_overflow */
1602 reloc_nil
, /* special_function */
1603 "REFLONG", /* name */
1604 true, /* partial_inplace */
1605 0xffffffff, /* src_mask */
1606 0xffffffff, /* dst_mask */
1607 false), /* pcrel_offset */
1609 /* A 64 bit reference to a procedure, written as 32 bit value. */
1610 HOWTO (ALPHA_R_CODEADDR
, /* type */
1612 4, /* size (0 = byte, 1 = short, 2 = long) */
1614 false, /* pc_relative */
1616 complain_overflow_signed
,/* complain_on_overflow */
1617 reloc_nil
, /* special_function */
1618 "CODEADDR", /* name */
1619 false, /* partial_inplace */
1620 0xffffffff, /* src_mask */
1621 0xffffffff, /* dst_mask */
1622 false), /* pcrel_offset */
1626 /* Return a pointer to a howto structure which, when invoked, will perform
1627 the relocation code on data from the architecture noted. */
1629 static const struct reloc_howto_struct
*
1630 vms_bfd_reloc_type_lookup (abfd
, code
)
1631 bfd
*abfd ATTRIBUTE_UNUSED
;
1632 bfd_reloc_code_real_type code
;
1637 vms_debug (1, "vms_bfd_reloc_type_lookup(%p, %d)\t", abfd
, code
);
1642 case BFD_RELOC_16
: alpha_type
= ALPHA_R_SREL16
; break;
1643 case BFD_RELOC_32
: alpha_type
= ALPHA_R_REFLONG
; break;
1644 case BFD_RELOC_64
: alpha_type
= ALPHA_R_REFQUAD
; break;
1645 case BFD_RELOC_CTOR
: alpha_type
= ALPHA_R_REFQUAD
; break;
1646 case BFD_RELOC_23_PCREL_S2
: alpha_type
= ALPHA_R_BRADDR
; break;
1647 case BFD_RELOC_ALPHA_HINT
: alpha_type
= ALPHA_R_HINT
; break;
1648 case BFD_RELOC_16_PCREL
: alpha_type
= ALPHA_R_SREL16
; break;
1649 case BFD_RELOC_32_PCREL
: alpha_type
= ALPHA_R_SREL32
; break;
1650 case BFD_RELOC_64_PCREL
: alpha_type
= ALPHA_R_SREL64
; break;
1651 case BFD_RELOC_ALPHA_LINKAGE
: alpha_type
= ALPHA_R_LINKAGE
; break;
1652 case BFD_RELOC_ALPHA_CODEADDR
: alpha_type
= ALPHA_R_CODEADDR
; break;
1654 (*_bfd_error_handler
) ("reloc (%d) is *UNKNOWN*", code
);
1655 return (const struct reloc_howto_struct
*) NULL
;
1658 vms_debug (2, "reloc is %s\n", alpha_howto_table
[alpha_type
].name
);
1660 return &alpha_howto_table
[alpha_type
];
1663 /*-- Part 4.7, writing an object file ---------------------------------------*/
1665 /* Set the architecture and machine type in BFD abfd to arch and mach.
1666 Find the correct pointer to a structure and insert it into the arch_info
1670 vms_set_arch_mach (abfd
, arch
, mach
)
1672 enum bfd_architecture arch ATTRIBUTE_UNUSED
;
1673 unsigned long mach ATTRIBUTE_UNUSED
;
1676 vms_debug (1, "vms_set_arch_mach(%p, %d, %ld)\n", abfd
, arch
, mach
);
1678 abfd
->arch_info
= bfd_scan_arch("alpha");
1683 /* Sets the contents of the section section in BFD abfd to the data starting
1684 in memory at data. The data is written to the output section starting at
1685 offset offset for count bytes.
1687 Normally true is returned, else false. Possible error returns are:
1688 o bfd_error_no_contents - The output section does not have the
1689 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
1690 o and some more too */
1693 vms_set_section_contents (abfd
, section
, location
, offset
, count
)
1698 bfd_size_type count
;
1701 vms_debug (1, "vms_set_section_contents(%p, sec %s, loc %p, off %ld, count %d)\n",
1702 abfd
, section
->name
, location
, (long int)offset
, (int)count
);
1703 vms_debug (2, "secraw %d, seccooked %d\n", (int)section
->_raw_size
, (int)section
->_cooked_size
);
1705 return _bfd_save_vms_section(abfd
, section
, location
, offset
, count
);
1708 /*-- Part 4.8, linker -------------------------------------------------------*/
1710 /* Get the size of the section headers. */
1713 vms_sizeof_headers (abfd
, reloc
)
1714 bfd
*abfd ATTRIBUTE_UNUSED
;
1715 boolean reloc ATTRIBUTE_UNUSED
;
1718 vms_debug (1, "vms_sizeof_headers(%p, %s)\n", abfd
, (reloc
)?"True":"False");
1723 /* Provides default handling of relocation effort for back ends
1724 which can't be bothered to do it efficiently. */
1727 vms_bfd_get_relocated_section_contents (abfd
, link_info
, link_order
, data
,
1728 relocateable
, symbols
)
1729 bfd
*abfd ATTRIBUTE_UNUSED
;
1730 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1731 struct bfd_link_order
*link_order ATTRIBUTE_UNUSED
;
1732 bfd_byte
*data ATTRIBUTE_UNUSED
;
1733 boolean relocateable ATTRIBUTE_UNUSED
;
1734 asymbol
**symbols ATTRIBUTE_UNUSED
;
1737 vms_debug (1, "vms_bfd_get_relocated_section_contents(%p, %p, %p, %p, %s, %p)\n",
1738 abfd
, link_info
, link_order
, data
, (relocateable
)?"True":"False", symbols
);
1746 vms_bfd_relax_section (abfd
, section
, link_info
, again
)
1747 bfd
*abfd ATTRIBUTE_UNUSED
;
1748 asection
*section ATTRIBUTE_UNUSED
;
1749 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1750 boolean
*again ATTRIBUTE_UNUSED
;
1753 vms_debug (1, "vms_bfd_relax_section(%p, %s, %p, <ret>)\n",
1754 abfd
, section
->name
, link_info
);
1760 vms_bfd_gc_sections (abfd
, link_info
)
1761 bfd
*abfd ATTRIBUTE_UNUSED
;
1762 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1765 vms_debug (1, "vms_bfd_gc_sections(%p, %p)\n", abfd
, link_info
);
1771 vms_bfd_merge_sections (abfd
, link_info
)
1772 bfd
*abfd ATTRIBUTE_UNUSED
;
1773 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1776 vms_debug (1, "vms_bfd_merge_sections(%p, %p)\n", abfd
, link_info
);
1781 /* Create a hash table for the linker. Different backends store
1782 different information in this table. */
1784 static struct bfd_link_hash_table
*
1785 vms_bfd_link_hash_table_create (abfd
)
1786 bfd
*abfd ATTRIBUTE_UNUSED
;
1789 vms_debug (1, "vms_bfd_link_hash_table_create(%p)\n", abfd
);
1794 /* Free a linker hash table. */
1797 vms_bfd_link_hash_table_free (hash
)
1798 struct bfd_link_hash_table
*hash ATTRIBUTE_UNUSED
;
1801 vms_debug (1, "vms_bfd_link_hash_table_free(%p)\n", abfd
);
1805 /* Add symbols from this object file into the hash table. */
1808 vms_bfd_link_add_symbols (abfd
, link_info
)
1809 bfd
*abfd ATTRIBUTE_UNUSED
;
1810 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1813 vms_debug (1, "vms_bfd_link_add_symbols(%p, %p)\n", abfd
, link_info
);
1818 /* Do a link based on the link_order structures attached to each
1819 section of the BFD. */
1822 vms_bfd_final_link (abfd
, link_info
)
1823 bfd
*abfd ATTRIBUTE_UNUSED
;
1824 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1827 vms_debug (1, "vms_bfd_final_link(%p, %p)\n", abfd
, link_info
);
1832 /* Should this section be split up into smaller pieces during linking. */
1835 vms_bfd_link_split_section (abfd
, section
)
1836 bfd
*abfd ATTRIBUTE_UNUSED
;
1837 asection
*section ATTRIBUTE_UNUSED
;
1840 vms_debug (1, "vms_bfd_link_split_section(%p, %s)\n", abfd
, section
->name
);
1845 /*-- Part 4.9, dynamic symbols and relocations ------------------------------*/
1847 /* Get the amount of memory required to hold the dynamic symbols. */
1850 vms_get_dynamic_symtab_upper_bound (abfd
)
1851 bfd
*abfd ATTRIBUTE_UNUSED
;
1854 vms_debug (1, "vms_get_dynamic_symtab_upper_bound(%p)\n", abfd
);
1860 vms_bfd_print_private_bfd_data (abfd
, file
)
1861 bfd
*abfd ATTRIBUTE_UNUSED
;
1862 void *file ATTRIBUTE_UNUSED
;
1865 vms_debug (1, "vms_bfd_print_private_bfd_data(%p)\n", abfd
);
1870 /* Read in the dynamic symbols. */
1873 vms_canonicalize_dynamic_symtab (abfd
, symbols
)
1874 bfd
*abfd ATTRIBUTE_UNUSED
;
1875 asymbol
**symbols ATTRIBUTE_UNUSED
;
1878 vms_debug (1, "vms_canonicalize_dynamic_symtab(%p, <ret>)\n", abfd
);
1883 /* Get the amount of memory required to hold the dynamic relocs. */
1886 vms_get_dynamic_reloc_upper_bound (abfd
)
1887 bfd
*abfd ATTRIBUTE_UNUSED
;
1890 vms_debug (1, "vms_get_dynamic_reloc_upper_bound(%p)\n", abfd
);
1895 /* Read in the dynamic relocs. */
1898 vms_canonicalize_dynamic_reloc (abfd
, arel
, symbols
)
1899 bfd
*abfd ATTRIBUTE_UNUSED
;
1900 arelent
**arel ATTRIBUTE_UNUSED
;
1901 asymbol
**symbols ATTRIBUTE_UNUSED
;
1904 vms_debug (1, "vms_canonicalize_dynamic_reloc(%p)\n", abfd
);