1 /* vms.c -- BFD back-end for VAX (openVMS/VAX) and
2 EVAX (openVMS/Alpha) files.
3 Copyright 1996, 1997, 1998, 1999, 2000, 2001
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
*abfd
, struct stat
*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 struct bfd_link_hash_table
*vms_bfd_link_hash_table_create
114 PARAMS ((bfd
*abfd
));
115 static boolean vms_bfd_link_add_symbols
116 PARAMS ((bfd
*abfd
, struct bfd_link_info
*link_info
));
117 static boolean vms_bfd_final_link
118 PARAMS ((bfd
*abfd
, struct bfd_link_info
*link_info
));
119 static boolean vms_bfd_link_split_section
120 PARAMS ((bfd
*abfd
, asection
*section
));
121 static long vms_get_dynamic_symtab_upper_bound
PARAMS ((bfd
*abfd
));
122 static long vms_canonicalize_dynamic_symtab
123 PARAMS ((bfd
*abfd
, asymbol
**symbols
));
124 static long vms_get_dynamic_reloc_upper_bound
PARAMS ((bfd
*abfd
));
125 static long vms_canonicalize_dynamic_reloc
126 PARAMS ((bfd
*abfd
, arelent
**arel
, asymbol
**symbols
));
127 static boolean vms_bfd_merge_private_bfd_data
PARAMS ((bfd
*ibfd
, bfd
*obfd
));
128 static boolean vms_bfd_set_private_flags
PARAMS ((bfd
*abfd
, flagword flags
));
130 #define vms_make_empty_symbol _bfd_vms_make_empty_symbol
132 /*===========================================================================*/
134 const bfd_target vms_alpha_vec
=
136 "vms-alpha", /* name */
137 bfd_target_evax_flavour
,
138 BFD_ENDIAN_LITTLE
, /* data byte order is little */
139 BFD_ENDIAN_LITTLE
, /* header byte order is little */
141 (HAS_RELOC
| HAS_SYMS
142 | WP_TEXT
| D_PAGED
), /* object flags */
143 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
144 | SEC_READONLY
| SEC_CODE
| SEC_DATA
145 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* sect flags */
146 0, /* symbol_leading_char */
147 ' ', /* ar_pad_char */
148 15, /* ar_max_namelen */
149 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
150 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
151 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
152 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
153 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
154 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
156 {_bfd_dummy_target
, vms_object_p
, /* bfd_check_format */
157 vms_archive_p
, _bfd_dummy_target
},
158 {bfd_false
, vms_mkobject
, /* bfd_set_format */
159 _bfd_generic_mkarchive
, bfd_false
},
160 {bfd_false
, vms_write_object_contents
, /* bfd_write_contents */
161 _bfd_write_archive_contents
, bfd_false
},
163 BFD_JUMP_TABLE_GENERIC (vms
),
164 BFD_JUMP_TABLE_COPY (vms
),
165 BFD_JUMP_TABLE_CORE (vms
),
166 BFD_JUMP_TABLE_ARCHIVE (vms
),
167 BFD_JUMP_TABLE_SYMBOLS (vms
),
168 BFD_JUMP_TABLE_RELOCS (vms
),
169 BFD_JUMP_TABLE_WRITE (vms
),
170 BFD_JUMP_TABLE_LINK (vms
),
171 BFD_JUMP_TABLE_DYNAMIC (vms
),
178 const bfd_target vms_vax_vec
=
180 "vms-vax", /* name */
181 bfd_target_ovax_flavour
,
182 BFD_ENDIAN_LITTLE
, /* data byte order is little */
183 BFD_ENDIAN_LITTLE
, /* header byte order is little */
185 (HAS_RELOC
| HAS_SYMS
/* object flags */
187 | HAS_LINENO
| HAS_DEBUG
| HAS_LOCALS
),
189 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
190 | SEC_READONLY
| SEC_CODE
| SEC_DATA
191 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* sect flags */
192 0, /* symbol_leading_char */
193 ' ', /* ar_pad_char */
194 15, /* ar_max_namelen */
195 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
196 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
197 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* data */
198 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
199 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
200 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* hdrs */
202 {_bfd_dummy_target
, vms_object_p
, /* bfd_check_format */
203 vms_archive_p
, _bfd_dummy_target
},
204 {bfd_false
, vms_mkobject
, /* bfd_set_format */
205 _bfd_generic_mkarchive
, bfd_false
},
206 {bfd_false
, vms_write_object_contents
, /* bfd_write_contents */
207 _bfd_write_archive_contents
, bfd_false
},
209 BFD_JUMP_TABLE_GENERIC (vms
),
210 BFD_JUMP_TABLE_COPY (vms
),
211 BFD_JUMP_TABLE_CORE (vms
),
212 BFD_JUMP_TABLE_ARCHIVE (vms
),
213 BFD_JUMP_TABLE_SYMBOLS (vms
),
214 BFD_JUMP_TABLE_RELOCS (vms
),
215 BFD_JUMP_TABLE_WRITE (vms
),
216 BFD_JUMP_TABLE_LINK (vms
),
217 BFD_JUMP_TABLE_DYNAMIC (vms
),
224 /*===========================================================================*/
226 /* Initialize private data */
229 vms_initialize (abfd
)
234 if (abfd
->tdata
.any
!= 0)
237 bfd_set_start_address (abfd
, (bfd_vma
)-1);
239 abfd
->tdata
.any
= ((struct vms_private_data_struct
*)
240 bfd_malloc (sizeof (struct vms_private_data_struct
)));
241 if (abfd
->tdata
.any
== 0)
251 PRIV (rec_length
) = 0;
252 PRIV (file_format
) = FF_UNKNOWN
;
253 PRIV (fixup_done
) = false;
254 PRIV (sections
) = NULL
;
256 PRIV (stack
) = ((struct stack_struct
*)
257 bfd_malloc (sizeof (struct stack_struct
) * STACKSIZE
));
258 if (PRIV (stack
) == 0)
261 free (abfd
->tdata
.any
);
267 PRIV (vms_symbol_table
) = ((struct bfd_hash_table
*)
268 bfd_malloc (sizeof (struct bfd_hash_table
)));
269 if (PRIV (vms_symbol_table
) == 0)
274 goto vms_init_no_mem1
;
277 if (!bfd_hash_table_init (PRIV (vms_symbol_table
), _bfd_vms_hash_newfunc
))
280 PRIV (location_stack
) = ((struct location_struct
*)
281 bfd_malloc (sizeof (struct location_struct
)
282 * LOCATION_SAVE_SIZE
));
283 if (PRIV (location_stack
) == 0)
286 free (PRIV (vms_symbol_table
));
287 PRIV (vms_symbol_table
) = 0;
288 goto vms_init_no_mem2
;
291 for (i
= 0; i
< VMS_SECTION_COUNT
; i
++)
292 PRIV (vms_section_table
)[i
] = NULL
;
294 PRIV (output_buf
) = (unsigned char *) malloc (MAX_OUTREC_SIZE
);
295 if (PRIV (output_buf
) == 0)
297 free (PRIV (location_stack
));
298 PRIV (location_stack
) = 0;
299 goto vms_init_no_mem3
;
301 PRIV (push_level
) = 0;
302 PRIV (pushed_size
) = 0;
303 PRIV (length_pos
) = 2;
304 PRIV (output_size
) = 0;
305 PRIV (output_alignment
) = 1;
310 /* Fill symbol->section with section ptr
311 symbol->section is filled with the section index for defined symbols
312 during reading the GSD/EGSD section. But we need the pointer to the
315 It has the correct value for referenced (undefined section) symbols
317 called from bfd_hash_traverse in vms_fixup_sections */
320 fill_section_ptr (entry
, sections
)
321 struct bfd_hash_entry
*entry
;
327 sym
= ((vms_symbol_entry
*)entry
)->symbol
;
331 vms_debug (6, "fill_section_ptr: sym %p, sec %p\n", sym
, sec
);
334 /* fill forward references (these contain section number, not section ptr). */
336 if ((unsigned int) sec
< priv_section_count
)
338 sec
= ((vms_symbol_entry
*)entry
)->symbol
->section
=
339 ((asection
**)sections
)[(int)sec
];
342 if (strcmp (sym
->name
, sec
->name
) == 0)
343 sym
->flags
|= BSF_SECTION_SYM
;
349 set up all pointers and arrays, counters and sizes are fixed now
351 we build a private sections vector for easy access since sections
352 are always referenced by an index number.
354 alloc PRIV(sections) according to abfd->section_count
355 copy abfd->sections to PRIV(sections) */
358 vms_fixup_sections (abfd
)
361 if (PRIV (fixup_done
))
365 * traverse symbol table and fill in all section pointers
368 /* can't provide section count as argument to fill_section_ptr(). */
369 priv_section_count
= PRIV (section_count
);
370 bfd_hash_traverse (PRIV (vms_symbol_table
), fill_section_ptr
,
371 (PTR
) (PRIV (sections
)));
373 PRIV (fixup_done
) = true;
378 /*===========================================================================*/
380 /* Check the format for a file being read.
381 Return a (bfd_target *) if it's an object file or zero if not. */
383 static const struct bfd_target
*
389 const struct bfd_target
*target_vector
= 0;
390 const bfd_arch_info_type
*arch
= 0;
393 vms_debug (1, "vms_object_p(%p)\n", abfd
);
396 if (!vms_initialize (abfd
))
398 fprintf (stderr
, "vms_initialize () failed !!\n");
402 if (bfd_seek (abfd
, 0L, SEEK_SET
))
404 bfd_set_error (bfd_error_file_truncated
);
413 vms_debug (7, "reading at %08lx\n", bfd_tell(abfd
));
415 if (_bfd_vms_next_record (abfd
) < 0)
418 vms_debug (2, "next_record failed\n");
420 bfd_set_error (bfd_error_wrong_format
);
424 if ((prev_type
== EOBJ_S_C_EGSD
)
425 && (PRIV (rec_type
) != EOBJ_S_C_EGSD
))
427 if (vms_fixup_sections (abfd
) == false)
430 vms_debug (2, "vms_fixup_sections failed\n");
432 bfd_set_error (bfd_error_wrong_format
);
437 prev_type
= PRIV (rec_type
);
439 if (target_vector
== 0)
441 if (prev_type
<= OBJ_S_C_MAXRECTYP
)
442 target_vector
= &vms_vax_vec
;
444 target_vector
= &vms_alpha_vec
;
451 err
= _bfd_vms_slurp_hdr (abfd
, prev_type
);
456 err
= _bfd_vms_slurp_eom (abfd
, prev_type
);
460 err
= _bfd_vms_slurp_gsd (abfd
, prev_type
);
464 err
= _bfd_vms_slurp_tir (abfd
, prev_type
);
468 err
= _bfd_vms_slurp_dbg (abfd
, prev_type
);
472 err
= _bfd_vms_slurp_tbt (abfd
, prev_type
);
475 err
= _bfd_vms_slurp_lnk (abfd
, prev_type
);
483 vms_debug (2, "slurp type %d failed with %d\n", prev_type
, err
);
485 bfd_set_error (bfd_error_wrong_format
);
489 while ((prev_type
!= EOBJ_S_C_EEOM
) && (prev_type
!= OBJ_S_C_EOM
) && (prev_type
!= OBJ_S_C_EOMW
));
491 if (target_vector
== &vms_vax_vec
)
493 if (vms_fixup_sections (abfd
) == false)
496 vms_debug (2, "vms_fixup_sections failed\n");
498 bfd_set_error (bfd_error_wrong_format
);
502 /* set arch_info to vax */
504 arch
= bfd_scan_arch ("vax");
507 vms_debug (2, "arch is vax\n");
510 else if (target_vector
== &vms_alpha_vec
)
512 /* set arch_info to alpha */
514 arch
= bfd_scan_arch ("alpha");
517 vms_debug (2, "arch is alpha\n");
524 vms_debug (2, "arch not found\n");
526 bfd_set_error (bfd_error_wrong_format
);
529 abfd
->arch_info
= arch
;
531 return target_vector
;
534 /* Check the format for a file being read.
535 Return a (bfd_target *) if it's an archive file or zero. */
537 static const struct bfd_target
*
539 bfd
*abfd ATTRIBUTE_UNUSED
;
542 vms_debug (1, "vms_archive_p(%p)\n", abfd
);
548 /* Set the format of a file being written. */
555 vms_debug (1, "vms_mkobject(%p)\n", abfd
);
558 if (!vms_initialize (abfd
))
560 fprintf (stderr
, "vms_initialize () failed !!\n");
566 const bfd_arch_info_type
*arch
= bfd_scan_arch ("vax");
568 const bfd_arch_info_type
*arch
= bfd_scan_arch ("alpha");
572 bfd_set_error(bfd_error_wrong_format
);
575 abfd
->arch_info
= arch
;
581 /* Write cached information into a file being written, at bfd_close. */
584 vms_write_object_contents (abfd
)
588 vms_debug (1, "vms_write_object_contents(%p)\n", abfd
);
591 if (abfd
->section_count
> 0) /* we have sections */
595 if (_bfd_vms_write_hdr (abfd
, OBJ_S_C_HDR
) != 0)
597 if (_bfd_vms_write_gsd (abfd
, OBJ_S_C_GSD
) != 0)
599 if (_bfd_vms_write_tir (abfd
, OBJ_S_C_TIR
) != 0)
601 if (_bfd_vms_write_tbt (abfd
, OBJ_S_C_TBT
) != 0)
603 if (_bfd_vms_write_dbg (abfd
, OBJ_S_C_DBG
) != 0)
605 if (abfd
->section_count
> 255)
607 if (_bfd_vms_write_eom (abfd
, OBJ_S_C_EOMW
) != 0)
612 if (_bfd_vms_write_eom (abfd
, OBJ_S_C_EOM
) != 0)
618 if (_bfd_vms_write_hdr (abfd
, EOBJ_S_C_EMH
) != 0)
620 if (_bfd_vms_write_gsd (abfd
, EOBJ_S_C_EGSD
) != 0)
622 if (_bfd_vms_write_tir (abfd
, EOBJ_S_C_ETIR
) != 0)
624 if (_bfd_vms_write_tbt (abfd
, EOBJ_S_C_ETBT
) != 0)
626 if (_bfd_vms_write_dbg (abfd
, EOBJ_S_C_EDBG
) != 0)
628 if (_bfd_vms_write_eom (abfd
, EOBJ_S_C_EEOM
) != 0)
635 /*-- 4.1, generic -----------------------------------------------------------*/
637 /* Called when the BFD is being closed to do any necessary cleanup. */
640 vms_close_and_cleanup (abfd
)
644 vms_section
*es
, *es1
;
648 vms_debug (1, "vms_close_and_cleanup(%p)\n", abfd
);
653 if (PRIV (vms_buf
) != NULL
)
655 free (PRIV (vms_buf
));
656 PRIV (vms_buf
) = NULL
;
660 if (PRIV (output_buf
) != 0)
662 free (PRIV (output_buf
));
663 PRIV (output_buf
) = 0;
666 sec
= abfd
->sections
;
670 free (sec
->contents
);
674 if (PRIV (sections
) != NULL
)
676 free (PRIV (sections
));
677 PRIV (sections
) = NULL
;
680 if (PRIV (vms_symbol_table
))
682 bfd_hash_table_free (PRIV (vms_symbol_table
));
683 PRIV (vms_symbol_table
) = 0;
692 if (PRIV (location_stack
))
694 free (PRIV (location_stack
));
695 PRIV (location_stack
) = 0;
698 for (i
= 0; i
< VMS_SECTION_COUNT
; i
++)
700 es
= PRIV (vms_section_table
)[i
];
707 PRIV (vms_section_table
)[i
] = NULL
;
710 free (abfd
->tdata
.any
);
711 abfd
->tdata
.any
= NULL
;
716 /* Ask the BFD to free all cached information. */
718 vms_bfd_free_cached_info (abfd
)
719 bfd
*abfd ATTRIBUTE_UNUSED
;
722 vms_debug (1, "vms_bfd_free_cached_info(%p)\n", abfd
);
727 /* Called when a new section is created. */
730 vms_new_section_hook (abfd
, section
)
735 vms_debug (1, "vms_new_section_hook (%p, [%d]%s), count %d\n", abfd
, section
->index
, section
->name
, abfd
->section_count
);
737 bfd_set_section_alignment(abfd
, section
, 4);
739 if (abfd
->section_count
> PRIV (section_count
))
741 PRIV (sections
) = ((asection
**)
742 bfd_realloc (PRIV (sections
), abfd
->section_count
* sizeof (asection
*)));
743 if (PRIV (sections
) == 0)
745 PRIV (section_count
) = abfd
->section_count
;
748 vms_debug (6, "section_count: %d\n", PRIV (section_count
));
750 PRIV (sections
)[section
->index
] = section
;
752 vms_debug (7, "%d: %s\n", section
->index
, section
->name
);
758 /* Read the contents of a section.
759 buf points to a buffer of buf_size bytes to be filled with
760 section data (starting at offset into section) */
763 vms_get_section_contents (abfd
, section
, buf
, offset
, buf_size
)
764 bfd
*abfd ATTRIBUTE_UNUSED
;
765 asection
*section ATTRIBUTE_UNUSED
;
766 PTR buf ATTRIBUTE_UNUSED
;
767 file_ptr offset ATTRIBUTE_UNUSED
;
768 bfd_size_type buf_size ATTRIBUTE_UNUSED
;
771 vms_debug (1, "vms_get_section_contents(%p, %s, %p, off %ld, size %d)\n",
772 abfd
, section
->name
, buf
, offset
, (int)buf_size
);
775 /* shouldn't be called, since all sections are IN_MEMORY */
780 /* Read the contents of a section.
781 buf points to a buffer of buf_size bytes to be filled with
782 section data (starting at offset into section) */
785 vms_get_section_contents_in_window (abfd
, section
, w
, offset
, count
)
786 bfd
*abfd ATTRIBUTE_UNUSED
;
787 asection
*section ATTRIBUTE_UNUSED
;
788 bfd_window
*w ATTRIBUTE_UNUSED
;
789 file_ptr offset ATTRIBUTE_UNUSED
;
790 bfd_size_type count ATTRIBUTE_UNUSED
;
793 vms_debug (1, "vms_get_section_contents_in_window(%p, %s, %p, off %ld, count %d)\n",
794 abfd
, section
->name
, w
, offset
, (int)count
);
797 /* shouldn't be called, since all sections are IN_MEMORY */
802 /*-- Part 4.2, copy private data --------------------------------------------*/
804 /* Called to copy BFD general private data from one object file
808 vms_bfd_copy_private_bfd_data (src
, dest
)
809 bfd
*src ATTRIBUTE_UNUSED
;
810 bfd
*dest ATTRIBUTE_UNUSED
;
813 vms_debug (1, "vms_bfd_copy_private_bfd_data(%p, %p)\n", src
, dest
);
818 /* Merge private BFD information from the BFD @var{ibfd} to the
819 the output file BFD @var{obfd} when linking. Return <<true>>
820 on success, <<false>> on error. Possible error returns are:
822 o <<bfd_error_no_memory>> -
823 Not enough memory exists to create private data for @var{obfd}. */
826 vms_bfd_merge_private_bfd_data (ibfd
, obfd
)
827 bfd
*ibfd ATTRIBUTE_UNUSED
;
828 bfd
*obfd ATTRIBUTE_UNUSED
;
831 vms_debug (1,"vms_bfd_merge_private_bfd_data(%p, %p)\n", ibfd
, obfd
);
836 /* Set private BFD flag information in the BFD @var{abfd}.
837 Return <<true>> on success, <<false>> on error. Possible error
840 o <<bfd_error_no_memory>> -
841 Not enough memory exists to create private data for @var{obfd}. */
844 vms_bfd_set_private_flags (abfd
, flags
)
845 bfd
*abfd ATTRIBUTE_UNUSED
;
846 flagword flags ATTRIBUTE_UNUSED
;
849 vms_debug (1,"vms_bfd_set_private_flags(%p, %lx)\n", abfd
, (long)flags
);
854 /* Called to copy BFD private section data from one object file
858 vms_bfd_copy_private_section_data (srcbfd
, srcsec
, dstbfd
, dstsec
)
859 bfd
*srcbfd ATTRIBUTE_UNUSED
;
860 asection
*srcsec ATTRIBUTE_UNUSED
;
861 bfd
*dstbfd ATTRIBUTE_UNUSED
;
862 asection
*dstsec ATTRIBUTE_UNUSED
;
865 vms_debug (1, "vms_bfd_copy_private_section_data(%p, %s, %p, %s)\n",
866 srcbfd
, srcsec
->name
, dstbfd
, dstsec
->name
);
871 /* Called to copy BFD private symbol data from one object file
875 vms_bfd_copy_private_symbol_data (ibfd
, isym
, obfd
, osym
)
876 bfd
*ibfd ATTRIBUTE_UNUSED
;
877 asymbol
*isym ATTRIBUTE_UNUSED
;
878 bfd
*obfd ATTRIBUTE_UNUSED
;
879 asymbol
*osym ATTRIBUTE_UNUSED
;
882 vms_debug (1, "vms_bfd_copy_private_symbol_data(%p, %s, %p, %s)\n",
883 ibfd
, isym
->name
, obfd
, osym
->name
);
888 /*-- Part 4.3, core file ----------------------------------------------------*/
890 /* Return a read-only string explaining which program was running
891 when it failed and produced the core file abfd. */
894 vms_core_file_failing_command (abfd
)
895 bfd
*abfd ATTRIBUTE_UNUSED
;
898 vms_debug (1, "vms_core_file_failing_command(%p)\n", abfd
);
903 /* Returns the signal number which caused the core dump which
904 generated the file the BFD abfd is attached to. */
907 vms_core_file_failing_signal (abfd
)
908 bfd
*abfd ATTRIBUTE_UNUSED
;
911 vms_debug (1, "vms_core_file_failing_signal(%p)\n", abfd
);
916 /* Return true if the core file attached to core_bfd was generated
917 by a run of the executable file attached to exec_bfd, false otherwise. */
920 vms_core_file_matches_executable_p (abfd
, bbfd
)
921 bfd
*abfd ATTRIBUTE_UNUSED
;
922 bfd
*bbfd ATTRIBUTE_UNUSED
;
925 vms_debug (1, "vms_core_file_matches_executable_p(%p, %p)\n", abfd
, bbfd
);
930 /*-- Part 4.4, archive ------------------------------------------------------*/
932 /* ??? do something with an archive map.
933 Return false on error, true otherwise. */
936 vms_slurp_armap (abfd
)
937 bfd
*abfd ATTRIBUTE_UNUSED
;
940 vms_debug (1, "vms_slurp_armap(%p)\n", abfd
);
945 /* ??? do something with an extended name table.
946 Return false on error, true otherwise. */
949 vms_slurp_extended_name_table (abfd
)
950 bfd
*abfd ATTRIBUTE_UNUSED
;
953 vms_debug (1, "vms_slurp_extended_name_table(%p)\n", abfd
);
958 /* ??? do something with an extended name table.
959 Return false on error, true otherwise. */
962 vms_construct_extended_name_table (abfd
, tabloc
, tablen
, name
)
963 bfd
*abfd ATTRIBUTE_UNUSED
;
964 char **tabloc ATTRIBUTE_UNUSED
;
965 bfd_size_type
*tablen ATTRIBUTE_UNUSED
;
966 const char **name ATTRIBUTE_UNUSED
;
969 vms_debug (1, "vms_construct_extended_name_table(%p)\n", abfd
);
974 /* Truncate the name of an archive to match system-dependent restrictions */
977 vms_truncate_arname (abfd
, pathname
, arhdr
)
978 bfd
*abfd ATTRIBUTE_UNUSED
;
979 CONST
char *pathname ATTRIBUTE_UNUSED
;
980 char *arhdr ATTRIBUTE_UNUSED
;
983 vms_debug (1, "vms_truncate_arname(%p, %s, %s)\n", abfd
, pathname
, arhdr
);
988 /* ??? write archive map */
991 vms_write_armap (arch
, elength
, map
, orl_count
, stridx
)
992 bfd
*arch ATTRIBUTE_UNUSED
;
993 unsigned int elength ATTRIBUTE_UNUSED
;
994 struct orl
*map ATTRIBUTE_UNUSED
;
995 unsigned int orl_count ATTRIBUTE_UNUSED
;
996 int stridx ATTRIBUTE_UNUSED
;
999 vms_debug (1, "vms_write_armap(%p, %d, %p, %d %d)\n",
1000 arch
, elength
, map
, orl_count
, stridx
);
1005 /* Read archive header ??? */
1008 vms_read_ar_hdr (abfd
)
1009 bfd
* abfd ATTRIBUTE_UNUSED
;
1012 vms_debug (1, "vms_read_ar_hdr(%p)\n", abfd
);
1017 /* Provided a BFD, @var{archive}, containing an archive and NULL, open
1018 an input BFD on the first contained element and returns that.
1019 Subsequent calls should pass the archive and the previous return value
1020 to return a created BFD to the next contained element.
1021 NULL is returned when there are no more. */
1024 vms_openr_next_archived_file (arch
, prev
)
1025 bfd
*arch ATTRIBUTE_UNUSED
;
1026 bfd
*prev ATTRIBUTE_UNUSED
;
1029 vms_debug (1, "vms_openr_next_archived_file(%p, %p)\n", arch
, prev
);
1034 /* Return the BFD which is referenced by the symbol in ABFD indexed by
1035 INDEX. INDEX should have been returned by bfd_get_next_mapent. */
1038 vms_get_elt_at_index (abfd
, index
)
1043 vms_debug (1, "vms_get_elt_at_index(%p, %p)\n", abfd
, index
);
1045 return _bfd_generic_get_elt_at_index(abfd
, index
);
1049 -> bfd_generic_stat_arch_elt */
1052 vms_generic_stat_arch_elt (abfd
, stat
)
1057 vms_debug (1, "vms_generic_stat_arch_elt(%p, %p)\n", abfd
, stat
);
1059 return bfd_generic_stat_arch_elt(abfd
, stat
);
1062 /* This is a new function in bfd 2.5 */
1065 vms_update_armap_timestamp (abfd
)
1066 bfd
*abfd ATTRIBUTE_UNUSED
;
1069 vms_debug (1, "vms_update_armap_timestamp(%p)\n", abfd
);
1074 /*-- Part 4.5, symbols --------------------------------------------------------*/
1076 /* Return the number of bytes required to store a vector of pointers
1077 to asymbols for all the symbols in the BFD abfd, including a
1078 terminal NULL pointer. If there are no symbols in the BFD,
1079 then return 0. If an error occurs, return -1. */
1082 vms_get_symtab_upper_bound (abfd
)
1086 vms_debug (1, "vms_get_symtab_upper_bound(%p), %d symbols\n", abfd
, PRIV (gsd_sym_count
));
1088 return (PRIV (gsd_sym_count
)+1) * sizeof (asymbol
*);
1091 /* Copy symbols from hash table to symbol vector
1093 called from bfd_hash_traverse in vms_get_symtab
1094 init counter to 0 if entry == 0 */
1097 copy_symbols (entry
, arg
)
1098 struct bfd_hash_entry
*entry
;
1101 bfd
*abfd
= (bfd
*) arg
;
1103 if (entry
== NULL
) /* init counter */
1105 else /* fill vector, inc counter */
1106 PRIV (symcache
)[PRIV (symnum
)++] = ((vms_symbol_entry
*)entry
)->symbol
;
1111 /* Read the symbols from the BFD abfd, and fills in the vector
1112 location with pointers to the symbols and a trailing NULL.
1114 return # of symbols read */
1117 vms_get_symtab (abfd
, symbols
)
1122 vms_debug (1, "vms_get_symtab(%p, <ret>)\n", abfd
);
1126 (void)copy_symbols((struct bfd_hash_entry
*)0, abfd
);
1128 /* traverse table and fill symbols vector */
1130 PRIV (symcache
) = symbols
;
1131 bfd_hash_traverse(PRIV (vms_symbol_table
), copy_symbols
, (PTR
)abfd
);
1133 symbols
[PRIV (gsd_sym_count
)] = NULL
;
1135 return PRIV (gsd_sym_count
);
1138 /* Create a new asymbol structure for the BFD abfd and return a pointer
1140 This routine is necessary because each back end has private information
1141 surrounding the asymbol. Building your own asymbol and pointing to it
1142 will not create the private information, and will cause problems later on. */
1145 _bfd_vms_make_empty_symbol (abfd
)
1148 asymbol
*symbol
= (asymbol
*)bfd_zalloc(abfd
, sizeof (asymbol
));
1151 vms_debug (1, "_bfd_vms_make_empty_symbol(%p)\n", abfd
);
1156 bfd_set_error (bfd_error_no_memory
);
1159 symbol
->the_bfd
= abfd
;
1164 /* Print symbol to file according to how. how is one of
1165 bfd_print_symbol_name just print the name
1166 bfd_print_symbol_more print more (???)
1167 bfd_print_symbol_all print all we know, which is not much right now :-) */
1170 vms_print_symbol (abfd
, file
, symbol
, how
)
1171 bfd
*abfd ATTRIBUTE_UNUSED
;
1174 bfd_print_symbol_type how
;
1177 vms_debug (1, "vms_print_symbol(%p, %p, %p, %d)\n", abfd
, file
, symbol
, how
);
1182 case bfd_print_symbol_name
:
1183 case bfd_print_symbol_more
:
1184 fprintf ((FILE *)file
," %s", symbol
->name
);
1187 case bfd_print_symbol_all
:
1189 CONST
char *section_name
= symbol
->section
->name
;
1191 bfd_print_symbol_vandf((PTR
)file
,symbol
);
1193 fprintf ((FILE *)file
," %-8s %s", section_name
, symbol
->name
);
1200 /* Return information about symbol in ret.
1202 fill type, value and name
1205 B bss segment symbol
1207 D data segment symbol
1209 t a static function symbol
1210 T text segment symbol
1215 vms_get_symbol_info (abfd
, symbol
, ret
)
1216 bfd
*abfd ATTRIBUTE_UNUSED
;
1223 vms_debug (1, "vms_get_symbol_info(%p, %p, %p)\n", abfd
, symbol
, ret
);
1226 sec
= symbol
->section
;
1231 if (bfd_is_com_section (sec
))
1233 else if (bfd_is_abs_section (sec
))
1235 else if (bfd_is_und_section (sec
))
1237 else if (bfd_is_ind_section (sec
))
1239 else if (bfd_get_section_flags (abfd
, sec
) & SEC_CODE
)
1241 else if (bfd_get_section_flags (abfd
, sec
) & SEC_DATA
)
1243 else if (bfd_get_section_flags (abfd
, sec
) & SEC_ALLOC
)
1248 if (ret
->type
!= 'U')
1249 ret
->value
= symbol
->value
+ symbol
->section
->vma
;
1252 ret
->name
= symbol
->name
;
1257 /* Return true if the given symbol sym in the BFD abfd is
1258 a compiler generated local label, else return false. */
1261 vms_bfd_is_local_label_name (abfd
, name
)
1262 bfd
*abfd ATTRIBUTE_UNUSED
;
1266 vms_debug (1, "vms_bfd_is_local_label_name(%p, %s)\n", abfd
, name
);
1268 return name
[0] == '$';
1271 /* Get source line number for symbol */
1274 vms_get_lineno (abfd
, symbol
)
1275 bfd
*abfd ATTRIBUTE_UNUSED
;
1276 asymbol
*symbol ATTRIBUTE_UNUSED
;
1279 vms_debug (1, "vms_get_lineno(%p, %p)\n", abfd
, symbol
);
1284 /* Provided a BFD, a section and an offset into the section, calculate and
1285 return the name of the source file and the line nearest to the wanted
1289 vms_find_nearest_line (abfd
, section
, symbols
, offset
, file
, func
, line
)
1290 bfd
*abfd ATTRIBUTE_UNUSED
;
1291 asection
*section ATTRIBUTE_UNUSED
;
1292 asymbol
**symbols ATTRIBUTE_UNUSED
;
1293 bfd_vma offset ATTRIBUTE_UNUSED
;
1294 CONST
char **file ATTRIBUTE_UNUSED
;
1295 CONST
char **func ATTRIBUTE_UNUSED
;
1296 unsigned int *line ATTRIBUTE_UNUSED
;
1299 vms_debug (1, "vms_find_nearest_line(%p, %s, %p, %ld, <ret>, <ret>, <ret>)\n",
1300 abfd
, section
->name
, symbols
, (long int)offset
);
1305 /* Back-door to allow format-aware applications to create debug symbols
1306 while using BFD for everything else. Currently used by the assembler
1307 when creating COFF files. */
1310 vms_bfd_make_debug_symbol (abfd
, ptr
, size
)
1311 bfd
*abfd ATTRIBUTE_UNUSED
;
1312 void *ptr ATTRIBUTE_UNUSED
;
1313 unsigned long size ATTRIBUTE_UNUSED
;
1316 vms_debug (1, "vms_bfd_make_debug_symbol(%p, %p, %ld)\n", abfd
, ptr
, size
);
1321 /* Read minisymbols. For minisymbols, we use the unmodified a.out
1322 symbols. The minisymbol_to_symbol function translates these into
1323 BFD asymbol structures. */
1326 vms_read_minisymbols (abfd
, dynamic
, minisymsp
, sizep
)
1330 unsigned int *sizep
;
1333 vms_debug (1, "vms_read_minisymbols(%p, %d, %p, %d)\n", abfd
, dynamic
, minisymsp
, *sizep
);
1335 return _bfd_generic_read_minisymbols (abfd
, dynamic
, minisymsp
, sizep
);
1338 /* Convert a minisymbol to a BFD asymbol. A minisymbol is just an
1339 unmodified a.out symbol. The SYM argument is a structure returned
1340 by bfd_make_empty_symbol, which we fill in here. */
1343 vms_minisymbol_to_symbol (abfd
, dynamic
, minisym
, sym
)
1350 vms_debug (1, "vms_minisymbol_to_symbol(%p, %d, %p, %p)\n", abfd
, dynamic
, minisym
, sym
);
1352 return _bfd_generic_minisymbol_to_symbol (abfd
, dynamic
, minisym
, sym
);
1355 /*-- Part 4.6, relocations --------------------------------------------------*/
1357 /* Return the number of bytes required to store the relocation information
1358 associated with section sect attached to bfd abfd.
1359 If an error occurs, return -1. */
1362 vms_get_reloc_upper_bound (abfd
, section
)
1363 bfd
*abfd ATTRIBUTE_UNUSED
;
1364 asection
*section ATTRIBUTE_UNUSED
;
1367 vms_debug (1, "vms_get_reloc_upper_bound(%p, %s)\n", abfd
, section
->name
);
1372 /* Call the back end associated with the open BFD abfd and translate the
1373 external form of the relocation information attached to sec into the
1374 internal canonical form. Place the table into memory at loc, which has
1375 been preallocated, usually by a call to bfd_get_reloc_upper_bound.
1376 Returns the number of relocs, or -1 on error. */
1379 vms_canonicalize_reloc (abfd
, section
, location
, symbols
)
1380 bfd
*abfd ATTRIBUTE_UNUSED
;
1381 asection
*section ATTRIBUTE_UNUSED
;
1382 arelent
**location ATTRIBUTE_UNUSED
;
1383 asymbol
**symbols ATTRIBUTE_UNUSED
;
1386 vms_debug (1, "vms_canonicalize_reloc(%p, %s, <ret>, <ret>)\n", abfd
, section
->name
);
1391 /*---------------------------------------------------------------------------*/
1392 /* this is just copied from ecoff-alpha, needs to be fixed probably */
1394 /* How to process the various reloc types. */
1396 static bfd_reloc_status_type
1397 reloc_nil (abfd
, reloc
, sym
, data
, sec
, output_bfd
, error_message
)
1398 bfd
*abfd ATTRIBUTE_UNUSED
;
1399 arelent
*reloc ATTRIBUTE_UNUSED
;
1400 asymbol
*sym ATTRIBUTE_UNUSED
;
1401 PTR data ATTRIBUTE_UNUSED
;
1402 asection
*sec ATTRIBUTE_UNUSED
;
1403 bfd
*output_bfd ATTRIBUTE_UNUSED
;
1404 char **error_message ATTRIBUTE_UNUSED
;
1407 vms_debug (1, "reloc_nil(abfd %p, output_bfd %p)\n", abfd
, output_bfd
);
1408 vms_debug (2, "In section %s, symbol %s\n",
1409 sec
->name
, sym
->name
);
1410 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
1411 reloc
->sym_ptr_ptr
[0]->name
,
1412 (unsigned long)reloc
->address
,
1413 (unsigned long)reloc
->addend
, reloc
->howto
->name
);
1414 vms_debug (2, "data at %p\n", data
);
1415 /* _bfd_hexdump (2, data, bfd_get_reloc_size(reloc->howto),0); */
1418 return bfd_reloc_ok
;
1421 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
1422 from smaller values. Start with zero, widen, *then* decrement. */
1423 #define MINUS_ONE (((bfd_vma)0) - 1)
1425 static reloc_howto_type alpha_howto_table
[] =
1427 HOWTO (ALPHA_R_IGNORE
, /* type */
1429 0, /* size (0 = byte, 1 = short, 2 = long) */
1431 true, /* pc_relative */
1433 complain_overflow_dont
, /* complain_on_overflow */
1434 reloc_nil
, /* special_function */
1435 "IGNORE", /* name */
1436 true, /* partial_inplace */
1439 true), /* pcrel_offset */
1441 /* A 64 bit reference to a symbol. */
1442 HOWTO (ALPHA_R_REFQUAD
, /* type */
1444 4, /* size (0 = byte, 1 = short, 2 = long) */
1446 false, /* pc_relative */
1448 complain_overflow_bitfield
, /* complain_on_overflow */
1449 reloc_nil
, /* special_function */
1450 "REFQUAD", /* name */
1451 true, /* partial_inplace */
1452 MINUS_ONE
, /* src_mask */
1453 MINUS_ONE
, /* dst_mask */
1454 false), /* pcrel_offset */
1456 /* A 21 bit branch. The native assembler generates these for
1457 branches within the text segment, and also fills in the PC
1458 relative offset in the instruction. */
1459 HOWTO (ALPHA_R_BRADDR
, /* type */
1461 2, /* size (0 = byte, 1 = short, 2 = long) */
1463 true, /* pc_relative */
1465 complain_overflow_signed
, /* complain_on_overflow */
1466 reloc_nil
, /* special_function */
1467 "BRADDR", /* name */
1468 true, /* partial_inplace */
1469 0x1fffff, /* src_mask */
1470 0x1fffff, /* dst_mask */
1471 false), /* pcrel_offset */
1473 /* A hint for a jump to a register. */
1474 HOWTO (ALPHA_R_HINT
, /* type */
1476 1, /* size (0 = byte, 1 = short, 2 = long) */
1478 true, /* pc_relative */
1480 complain_overflow_dont
, /* complain_on_overflow */
1481 reloc_nil
, /* special_function */
1483 true, /* partial_inplace */
1484 0x3fff, /* src_mask */
1485 0x3fff, /* dst_mask */
1486 false), /* pcrel_offset */
1488 /* 16 bit PC relative offset. */
1489 HOWTO (ALPHA_R_SREL16
, /* type */
1491 1, /* size (0 = byte, 1 = short, 2 = long) */
1493 true, /* pc_relative */
1495 complain_overflow_signed
, /* complain_on_overflow */
1496 reloc_nil
, /* special_function */
1497 "SREL16", /* name */
1498 true, /* partial_inplace */
1499 0xffff, /* src_mask */
1500 0xffff, /* dst_mask */
1501 false), /* pcrel_offset */
1503 /* 32 bit PC relative offset. */
1504 HOWTO (ALPHA_R_SREL32
, /* type */
1506 2, /* size (0 = byte, 1 = short, 2 = long) */
1508 true, /* pc_relative */
1510 complain_overflow_signed
, /* complain_on_overflow */
1511 reloc_nil
, /* special_function */
1512 "SREL32", /* name */
1513 true, /* partial_inplace */
1514 0xffffffff, /* src_mask */
1515 0xffffffff, /* dst_mask */
1516 false), /* pcrel_offset */
1518 /* A 64 bit PC relative offset. */
1519 HOWTO (ALPHA_R_SREL64
, /* type */
1521 4, /* size (0 = byte, 1 = short, 2 = long) */
1523 true, /* pc_relative */
1525 complain_overflow_signed
, /* complain_on_overflow */
1526 reloc_nil
, /* special_function */
1527 "SREL64", /* name */
1528 true, /* partial_inplace */
1529 MINUS_ONE
, /* src_mask */
1530 MINUS_ONE
, /* dst_mask */
1531 false), /* pcrel_offset */
1533 /* Push a value on the reloc evaluation stack. */
1534 HOWTO (ALPHA_R_OP_PUSH
, /* type */
1536 0, /* size (0 = byte, 1 = short, 2 = long) */
1538 false, /* pc_relative */
1540 complain_overflow_dont
, /* complain_on_overflow */
1541 reloc_nil
, /* special_function */
1542 "OP_PUSH", /* name */
1543 false, /* partial_inplace */
1546 false), /* pcrel_offset */
1548 /* Store the value from the stack at the given address. Store it in
1549 a bitfield of size r_size starting at bit position r_offset. */
1550 HOWTO (ALPHA_R_OP_STORE
, /* type */
1552 4, /* size (0 = byte, 1 = short, 2 = long) */
1554 false, /* pc_relative */
1556 complain_overflow_dont
, /* complain_on_overflow */
1557 reloc_nil
, /* special_function */
1558 "OP_STORE", /* name */
1559 false, /* partial_inplace */
1561 MINUS_ONE
, /* dst_mask */
1562 false), /* pcrel_offset */
1564 /* Subtract the reloc address from the value on the top of the
1565 relocation stack. */
1566 HOWTO (ALPHA_R_OP_PSUB
, /* type */
1568 0, /* size (0 = byte, 1 = short, 2 = long) */
1570 false, /* pc_relative */
1572 complain_overflow_dont
, /* complain_on_overflow */
1573 reloc_nil
, /* special_function */
1574 "OP_PSUB", /* name */
1575 false, /* partial_inplace */
1578 false), /* pcrel_offset */
1580 /* Shift the value on the top of the relocation stack right by the
1582 HOWTO (ALPHA_R_OP_PRSHIFT
, /* type */
1584 0, /* size (0 = byte, 1 = short, 2 = long) */
1586 false, /* pc_relative */
1588 complain_overflow_dont
, /* complain_on_overflow */
1589 reloc_nil
, /* special_function */
1590 "OP_PRSHIFT", /* name */
1591 false, /* partial_inplace */
1594 false), /* pcrel_offset */
1596 /* Hack. Linkage is done by linker. */
1597 HOWTO (ALPHA_R_LINKAGE
, /* type */
1599 8, /* size (0 = byte, 1 = short, 2 = long) */
1601 false, /* pc_relative */
1603 complain_overflow_dont
, /* complain_on_overflow */
1604 reloc_nil
, /* special_function */
1605 "LINKAGE", /* name */
1606 false, /* partial_inplace */
1609 false), /* pcrel_offset */
1611 /* A 32 bit reference to a symbol. */
1612 HOWTO (ALPHA_R_REFLONG
, /* type */
1614 2, /* size (0 = byte, 1 = short, 2 = long) */
1616 false, /* pc_relative */
1618 complain_overflow_bitfield
, /* complain_on_overflow */
1619 reloc_nil
, /* special_function */
1620 "REFLONG", /* name */
1621 true, /* partial_inplace */
1622 0xffffffff, /* src_mask */
1623 0xffffffff, /* dst_mask */
1624 false), /* pcrel_offset */
1626 /* A 64 bit reference to a procedure, written as 32 bit value. */
1627 HOWTO (ALPHA_R_CODEADDR
, /* type */
1629 4, /* size (0 = byte, 1 = short, 2 = long) */
1631 false, /* pc_relative */
1633 complain_overflow_signed
,/* complain_on_overflow */
1634 reloc_nil
, /* special_function */
1635 "CODEADDR", /* name */
1636 false, /* partial_inplace */
1637 0xffffffff, /* src_mask */
1638 0xffffffff, /* dst_mask */
1639 false), /* pcrel_offset */
1643 /* Return a pointer to a howto structure which, when invoked, will perform
1644 the relocation code on data from the architecture noted. */
1646 static const struct reloc_howto_struct
*
1647 vms_bfd_reloc_type_lookup (abfd
, code
)
1648 bfd
*abfd ATTRIBUTE_UNUSED
;
1649 bfd_reloc_code_real_type code
;
1654 vms_debug (1, "vms_bfd_reloc_type_lookup(%p, %d)\t", abfd
, code
);
1659 case BFD_RELOC_16
: alpha_type
= ALPHA_R_SREL16
; break;
1660 case BFD_RELOC_32
: alpha_type
= ALPHA_R_REFLONG
; break;
1661 case BFD_RELOC_64
: alpha_type
= ALPHA_R_REFQUAD
; break;
1662 case BFD_RELOC_CTOR
: alpha_type
= ALPHA_R_REFQUAD
; break;
1663 case BFD_RELOC_23_PCREL_S2
: alpha_type
= ALPHA_R_BRADDR
; break;
1664 case BFD_RELOC_ALPHA_HINT
: alpha_type
= ALPHA_R_HINT
; break;
1665 case BFD_RELOC_16_PCREL
: alpha_type
= ALPHA_R_SREL16
; break;
1666 case BFD_RELOC_32_PCREL
: alpha_type
= ALPHA_R_SREL32
; break;
1667 case BFD_RELOC_64_PCREL
: alpha_type
= ALPHA_R_SREL64
; break;
1668 case BFD_RELOC_ALPHA_LINKAGE
: alpha_type
= ALPHA_R_LINKAGE
; break;
1669 case BFD_RELOC_ALPHA_CODEADDR
: alpha_type
= ALPHA_R_CODEADDR
; break;
1671 (*_bfd_error_handler
) ("reloc (%d) is *UNKNOWN*", code
);
1672 return (const struct reloc_howto_struct
*) NULL
;
1675 vms_debug (2, "reloc is %s\n", alpha_howto_table
[alpha_type
].name
);
1677 return &alpha_howto_table
[alpha_type
];
1680 /*-- Part 4.7, writing an object file ---------------------------------------*/
1682 /* Set the architecture and machine type in BFD abfd to arch and mach.
1683 Find the correct pointer to a structure and insert it into the arch_info
1687 vms_set_arch_mach (abfd
, arch
, mach
)
1689 enum bfd_architecture arch ATTRIBUTE_UNUSED
;
1690 unsigned long mach ATTRIBUTE_UNUSED
;
1693 vms_debug (1, "vms_set_arch_mach(%p, %d, %ld)\n", abfd
, arch
, mach
);
1695 abfd
->arch_info
= bfd_scan_arch("alpha");
1700 /* Sets the contents of the section section in BFD abfd to the data starting
1701 in memory at data. The data is written to the output section starting at
1702 offset offset for count bytes.
1704 Normally true is returned, else false. Possible error returns are:
1705 o bfd_error_no_contents - The output section does not have the
1706 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
1707 o and some more too */
1710 vms_set_section_contents (abfd
, section
, location
, offset
, count
)
1715 bfd_size_type count
;
1718 vms_debug (1, "vms_set_section_contents(%p, sec %s, loc %p, off %ld, count %d)\n",
1719 abfd
, section
->name
, location
, (long int)offset
, (int)count
);
1720 vms_debug (2, "secraw %d, seccooked %d\n", (int)section
->_raw_size
, (int)section
->_cooked_size
);
1722 return _bfd_save_vms_section(abfd
, section
, location
, offset
, count
);
1725 /*-- Part 4.8, linker -------------------------------------------------------*/
1727 /* Get the size of the section headers. */
1730 vms_sizeof_headers (abfd
, reloc
)
1731 bfd
*abfd ATTRIBUTE_UNUSED
;
1732 boolean reloc ATTRIBUTE_UNUSED
;
1735 vms_debug (1, "vms_sizeof_headers(%p, %s)\n", abfd
, (reloc
)?"True":"False");
1740 /* Provides default handling of relocation effort for back ends
1741 which can't be bothered to do it efficiently. */
1744 vms_bfd_get_relocated_section_contents (abfd
, link_info
, link_order
, data
,
1745 relocateable
, symbols
)
1746 bfd
*abfd ATTRIBUTE_UNUSED
;
1747 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1748 struct bfd_link_order
*link_order ATTRIBUTE_UNUSED
;
1749 bfd_byte
*data ATTRIBUTE_UNUSED
;
1750 boolean relocateable ATTRIBUTE_UNUSED
;
1751 asymbol
**symbols ATTRIBUTE_UNUSED
;
1754 vms_debug (1, "vms_bfd_get_relocated_section_contents(%p, %p, %p, %p, %s, %p)\n",
1755 abfd
, link_info
, link_order
, data
, (relocateable
)?"True":"False", symbols
);
1763 vms_bfd_relax_section (abfd
, section
, link_info
, again
)
1764 bfd
*abfd ATTRIBUTE_UNUSED
;
1765 asection
*section ATTRIBUTE_UNUSED
;
1766 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1767 boolean
*again ATTRIBUTE_UNUSED
;
1770 vms_debug (1, "vms_bfd_relax_section(%p, %s, %p, <ret>)\n",
1771 abfd
, section
->name
, link_info
);
1777 vms_bfd_gc_sections (abfd
, link_info
)
1778 bfd
*abfd ATTRIBUTE_UNUSED
;
1779 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1782 vms_debug (1, "vms_bfd_gc_sections(%p, %p)\n", abfd
, link_info
);
1787 /* Create a hash table for the linker. Different backends store
1788 different information in this table. */
1790 static struct bfd_link_hash_table
*
1791 vms_bfd_link_hash_table_create (abfd
)
1792 bfd
*abfd ATTRIBUTE_UNUSED
;
1795 vms_debug (1, "vms_bfd_link_hash_table_create(%p)\n", abfd
);
1800 /* Add symbols from this object file into the hash table. */
1803 vms_bfd_link_add_symbols (abfd
, link_info
)
1804 bfd
*abfd ATTRIBUTE_UNUSED
;
1805 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1808 vms_debug (1, "vms_bfd_link_add_symbols(%p, %p)\n", abfd
, link_info
);
1813 /* Do a link based on the link_order structures attached to each
1814 section of the BFD. */
1817 vms_bfd_final_link (abfd
, link_info
)
1818 bfd
*abfd ATTRIBUTE_UNUSED
;
1819 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1822 vms_debug (1, "vms_bfd_final_link(%p, %p)\n", abfd
, link_info
);
1827 /* Should this section be split up into smaller pieces during linking. */
1830 vms_bfd_link_split_section (abfd
, section
)
1831 bfd
*abfd ATTRIBUTE_UNUSED
;
1832 asection
*section ATTRIBUTE_UNUSED
;
1835 vms_debug (1, "vms_bfd_link_split_section(%p, %s)\n", abfd
, section
->name
);
1840 /*-- Part 4.9, dynamic symbols and relocations ------------------------------*/
1842 /* Get the amount of memory required to hold the dynamic symbols. */
1845 vms_get_dynamic_symtab_upper_bound (abfd
)
1846 bfd
*abfd ATTRIBUTE_UNUSED
;
1849 vms_debug (1, "vms_get_dynamic_symtab_upper_bound(%p)\n", abfd
);
1855 vms_bfd_print_private_bfd_data (abfd
, file
)
1856 bfd
*abfd ATTRIBUTE_UNUSED
;
1857 void *file ATTRIBUTE_UNUSED
;
1860 vms_debug (1, "vms_bfd_print_private_bfd_data(%p)\n", abfd
);
1865 /* Read in the dynamic symbols. */
1868 vms_canonicalize_dynamic_symtab (abfd
, symbols
)
1869 bfd
*abfd ATTRIBUTE_UNUSED
;
1870 asymbol
**symbols ATTRIBUTE_UNUSED
;
1873 vms_debug (1, "vms_canonicalize_dynamic_symtab(%p, <ret>)\n", abfd
);
1878 /* Get the amount of memory required to hold the dynamic relocs. */
1881 vms_get_dynamic_reloc_upper_bound (abfd
)
1882 bfd
*abfd ATTRIBUTE_UNUSED
;
1885 vms_debug (1, "vms_get_dynamic_reloc_upper_bound(%p)\n", abfd
);
1890 /* Read in the dynamic relocs. */
1893 vms_canonicalize_dynamic_reloc (abfd
, arel
, symbols
)
1894 bfd
*abfd ATTRIBUTE_UNUSED
;
1895 arelent
**arel ATTRIBUTE_UNUSED
;
1896 asymbol
**symbols ATTRIBUTE_UNUSED
;
1899 vms_debug (1, "vms_canonicalize_dynamic_reloc(%p)\n", abfd
);