1 /* vms.c -- BFD back-end for VAX (openVMS/VAX) and
2 EVAX (openVMS/Alpha) files.
3 Copyright 1996, 97, 98, 99, 2000 Free Software Foundation, Inc.
5 Written by Klaus K"ampf (kkaempf@rmi.de)
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28 static boolean vms_initialize
PARAMS ((bfd
*));
29 static unsigned int priv_section_count
;
30 static boolean fill_section_ptr
PARAMS ((struct bfd_hash_entry
*, PTR
));
31 static boolean vms_fixup_sections
PARAMS ((bfd
*));
32 static boolean copy_symbols
PARAMS ((struct bfd_hash_entry
*, PTR
));
33 static bfd_reloc_status_type reloc_nil
34 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
35 static const struct bfd_target
*vms_object_p
PARAMS ((bfd
*abfd
));
36 static const struct bfd_target
*vms_archive_p
PARAMS ((bfd
*abfd
));
37 static boolean vms_mkobject
PARAMS ((bfd
*abfd
));
38 static boolean vms_write_object_contents
PARAMS ((bfd
*abfd
));
39 static boolean vms_close_and_cleanup
PARAMS ((bfd
*abfd
));
40 static boolean vms_bfd_free_cached_info
PARAMS ((bfd
*abfd
));
41 static boolean vms_new_section_hook
PARAMS ((bfd
*abfd
, asection
*section
));
42 static boolean vms_get_section_contents
43 PARAMS ((bfd
*abfd
, asection
*section
, PTR x1
, file_ptr x2
,
45 static boolean vms_get_section_contents_in_window
46 PARAMS ((bfd
*abfd
, asection
*section
, bfd_window
*w
, file_ptr offset
,
47 bfd_size_type count
));
48 static boolean vms_bfd_copy_private_bfd_data
PARAMS ((bfd
*src
, bfd
*dest
));
49 static boolean vms_bfd_copy_private_section_data
50 PARAMS ((bfd
*srcbfd
, asection
*srcsec
, bfd
*dstbfd
, asection
*dstsec
));
51 static boolean vms_bfd_copy_private_symbol_data
52 PARAMS ((bfd
*ibfd
, asymbol
*isym
, bfd
*obfd
, asymbol
*osym
));
53 static boolean vms_bfd_print_private_bfd_data
54 PARAMS ((bfd
*abfd
, void *file
));
55 static char *vms_core_file_failing_command
PARAMS ((bfd
*abfd
));
56 static int vms_core_file_failing_signal
PARAMS ((bfd
*abfd
));
57 static boolean vms_core_file_matches_executable_p
58 PARAMS ((bfd
*abfd
, bfd
*bbfd
));
59 static boolean vms_slurp_armap
PARAMS ((bfd
*abfd
));
60 static boolean vms_slurp_extended_name_table
PARAMS ((bfd
*abfd
));
61 static boolean vms_construct_extended_name_table
62 PARAMS ((bfd
*abfd
, char **tabloc
, bfd_size_type
*tablen
,
64 static void vms_truncate_arname
65 PARAMS ((bfd
*abfd
, CONST
char *pathname
, char *arhdr
));
66 static boolean vms_write_armap
67 PARAMS ((bfd
*arch
, unsigned int elength
, struct orl
*map
,
68 unsigned int orl_count
, int stridx
));
69 static PTR vms_read_ar_hdr
PARAMS ((bfd
*abfd
));
70 static bfd
*vms_get_elt_at_index
PARAMS ((bfd
*abfd
, symindex index
));
71 static bfd
*vms_openr_next_archived_file
PARAMS ((bfd
*arch
, bfd
*prev
));
72 static boolean vms_update_armap_timestamp
PARAMS ((bfd
*abfd
));
73 static int vms_generic_stat_arch_elt
PARAMS ((bfd
*abfd
, struct stat
*stat
));
74 static long vms_get_symtab_upper_bound
PARAMS ((bfd
*abfd
));
75 static long vms_get_symtab
PARAMS ((bfd
*abfd
, asymbol
**symbols
));
76 static void vms_print_symbol
77 PARAMS ((bfd
*abfd
, PTR file
, asymbol
*symbol
, bfd_print_symbol_type how
));
78 static void vms_get_symbol_info
79 PARAMS ((bfd
*abfd
, asymbol
*symbol
, symbol_info
*ret
));
80 static boolean vms_bfd_is_local_label_name
PARAMS ((bfd
*abfd
, const char *));
81 static alent
*vms_get_lineno
PARAMS ((bfd
*abfd
, asymbol
*symbol
));
82 static boolean vms_find_nearest_line
83 PARAMS ((bfd
*abfd
, asection
*section
, asymbol
**symbols
, bfd_vma offset
,
84 const char **file
, const char **func
, unsigned int *line
));
85 static asymbol
*vms_bfd_make_debug_symbol
86 PARAMS ((bfd
*abfd
, void *ptr
, unsigned long size
));
87 static long vms_read_minisymbols
88 PARAMS ((bfd
*abfd
, boolean dynamic
, PTR
*minisymsp
, unsigned int *sizep
));
89 static asymbol
*vms_minisymbol_to_symbol
90 PARAMS ((bfd
*abfd
, boolean dynamic
, const PTR minisym
, asymbol
*sym
));
91 static long vms_get_reloc_upper_bound
PARAMS ((bfd
*abfd
, asection
*sect
));
92 static long vms_canonicalize_reloc
93 PARAMS ((bfd
*abfd
, asection
*srcsec
, arelent
**location
,
95 static const struct reloc_howto_struct
*vms_bfd_reloc_type_lookup
96 PARAMS ((bfd
*abfd
, bfd_reloc_code_real_type code
));
97 static boolean vms_set_arch_mach
98 PARAMS ((bfd
*abfd
, enum bfd_architecture arch
, unsigned long mach
));
99 static boolean vms_set_section_contents
100 PARAMS ((bfd
*abfd
, asection
*section
, PTR location
, file_ptr offset
,
101 bfd_size_type count
));
102 static int vms_sizeof_headers
PARAMS ((bfd
*abfd
, boolean reloc
));
103 static bfd_byte
*vms_bfd_get_relocated_section_contents
104 PARAMS ((bfd
*abfd
, struct bfd_link_info
*link_info
,
105 struct bfd_link_order
*link_order
, bfd_byte
*data
,
106 boolean relocateable
, asymbol
**symbols
));
107 static boolean vms_bfd_relax_section
108 PARAMS ((bfd
*abfd
, asection
*section
, struct bfd_link_info
*link_info
,
110 static boolean vms_bfd_gc_sections
111 PARAMS ((bfd
*abfd
, struct bfd_link_info
*link_info
));
112 static struct bfd_link_hash_table
*vms_bfd_link_hash_table_create
113 PARAMS ((bfd
*abfd
));
114 static boolean vms_bfd_link_add_symbols
115 PARAMS ((bfd
*abfd
, struct bfd_link_info
*link_info
));
116 static boolean vms_bfd_final_link
117 PARAMS ((bfd
*abfd
, struct bfd_link_info
*link_info
));
118 static boolean vms_bfd_link_split_section
119 PARAMS ((bfd
*abfd
, asection
*section
));
120 static long vms_get_dynamic_symtab_upper_bound
PARAMS ((bfd
*abfd
));
121 static long vms_canonicalize_dynamic_symtab
122 PARAMS ((bfd
*abfd
, asymbol
**symbols
));
123 static long vms_get_dynamic_reloc_upper_bound
PARAMS ((bfd
*abfd
));
124 static long vms_canonicalize_dynamic_reloc
125 PARAMS ((bfd
*abfd
, arelent
**arel
, asymbol
**symbols
));
126 static boolean vms_bfd_merge_private_bfd_data
PARAMS ((bfd
*ibfd
, bfd
*obfd
));
127 static boolean vms_bfd_set_private_flags
PARAMS ((bfd
*abfd
, flagword flags
));
129 #define vms_make_empty_symbol _bfd_vms_make_empty_symbol
131 /*===========================================================================*/
133 const bfd_target vms_alpha_vec
=
135 "vms-alpha", /* name */
136 bfd_target_evax_flavour
,
137 BFD_ENDIAN_LITTLE
, /* data byte order is little */
138 BFD_ENDIAN_LITTLE
, /* header byte order is little */
140 (HAS_RELOC
| HAS_SYMS
141 | WP_TEXT
| D_PAGED
), /* object flags */
142 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
143 | SEC_READONLY
| SEC_CODE
| SEC_DATA
144 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* sect flags */
145 0, /* symbol_leading_char */
146 ' ', /* ar_pad_char */
147 15, /* ar_max_namelen */
148 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
149 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
150 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
151 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
152 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
153 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
,
155 {_bfd_dummy_target
, vms_object_p
, /* bfd_check_format */
156 vms_archive_p
, _bfd_dummy_target
},
157 {bfd_false
, vms_mkobject
, /* bfd_set_format */
158 _bfd_generic_mkarchive
, bfd_false
},
159 {bfd_false
, vms_write_object_contents
, /* bfd_write_contents */
160 _bfd_write_archive_contents
, bfd_false
},
162 BFD_JUMP_TABLE_GENERIC (vms
),
163 BFD_JUMP_TABLE_COPY (vms
),
164 BFD_JUMP_TABLE_CORE (vms
),
165 BFD_JUMP_TABLE_ARCHIVE (vms
),
166 BFD_JUMP_TABLE_SYMBOLS (vms
),
167 BFD_JUMP_TABLE_RELOCS (vms
),
168 BFD_JUMP_TABLE_WRITE (vms
),
169 BFD_JUMP_TABLE_LINK (vms
),
170 BFD_JUMP_TABLE_DYNAMIC (vms
),
177 const bfd_target vms_vax_vec
=
179 "vms-vax", /* name */
180 bfd_target_ovax_flavour
,
181 BFD_ENDIAN_LITTLE
, /* data byte order is little */
182 BFD_ENDIAN_LITTLE
, /* header byte order is little */
184 (HAS_RELOC
| HAS_SYMS
/* object flags */
186 | HAS_LINENO
| HAS_DEBUG
| HAS_LOCALS
),
188 (SEC_ALLOC
| SEC_LOAD
| SEC_RELOC
189 | SEC_READONLY
| SEC_CODE
| SEC_DATA
190 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
), /* sect flags */
191 0, /* symbol_leading_char */
192 ' ', /* ar_pad_char */
193 15, /* ar_max_namelen */
194 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
195 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
196 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* data */
197 bfd_getl64
, bfd_getl_signed_64
, bfd_putl64
,
198 bfd_getl32
, bfd_getl_signed_32
, bfd_putl32
,
199 bfd_getl16
, bfd_getl_signed_16
, bfd_putl16
, /* hdrs */
201 {_bfd_dummy_target
, vms_object_p
, /* bfd_check_format */
202 vms_archive_p
, _bfd_dummy_target
},
203 {bfd_false
, vms_mkobject
, /* bfd_set_format */
204 _bfd_generic_mkarchive
, bfd_false
},
205 {bfd_false
, vms_write_object_contents
, /* bfd_write_contents */
206 _bfd_write_archive_contents
, bfd_false
},
208 BFD_JUMP_TABLE_GENERIC (vms
),
209 BFD_JUMP_TABLE_COPY (vms
),
210 BFD_JUMP_TABLE_CORE (vms
),
211 BFD_JUMP_TABLE_ARCHIVE (vms
),
212 BFD_JUMP_TABLE_SYMBOLS (vms
),
213 BFD_JUMP_TABLE_RELOCS (vms
),
214 BFD_JUMP_TABLE_WRITE (vms
),
215 BFD_JUMP_TABLE_LINK (vms
),
216 BFD_JUMP_TABLE_DYNAMIC (vms
),
223 /*===========================================================================*/
225 /* Initialize private data */
228 vms_initialize (abfd
)
233 if (abfd
->tdata
.any
!= 0)
236 bfd_set_start_address (abfd
, (bfd_vma
)-1);
238 abfd
->tdata
.any
= ((struct vms_private_data_struct
*)
239 bfd_malloc (sizeof (struct vms_private_data_struct
)));
240 if (abfd
->tdata
.any
== 0)
250 PRIV(rec_length
) = 0;
251 PRIV(file_format
) = FF_UNKNOWN
;
252 PRIV(fixup_done
) = false;
253 PRIV(sections
) = NULL
;
255 PRIV(stack
) = ((struct stack_struct
*)
256 bfd_malloc (sizeof (struct stack_struct
) * STACKSIZE
));
257 if (PRIV(stack
) == 0)
260 free (abfd
->tdata
.any
);
266 PRIV(vms_symbol_table
) = ((struct bfd_hash_table
*)
267 bfd_malloc (sizeof (struct bfd_hash_table
)));
268 if (PRIV(vms_symbol_table
) == 0)
273 goto vms_init_no_mem1
;
276 if (!bfd_hash_table_init (PRIV(vms_symbol_table
), _bfd_vms_hash_newfunc
))
279 PRIV(location_stack
) = ((struct location_struct
*)
280 bfd_malloc (sizeof (struct location_struct
)
281 * LOCATION_SAVE_SIZE
));
282 if (PRIV(location_stack
) == 0)
285 free (PRIV(vms_symbol_table
));
286 PRIV(vms_symbol_table
) = 0;
287 goto vms_init_no_mem2
;
290 for (i
= 0; i
< VMS_SECTION_COUNT
; i
++)
291 PRIV(vms_section_table
)[i
] = NULL
;
293 PRIV(output_buf
) = (unsigned char *) malloc (MAX_OUTREC_SIZE
);
294 if (PRIV(output_buf
) == 0)
296 free (PRIV(location_stack
));
297 PRIV(location_stack
) = 0;
298 goto vms_init_no_mem3
;
300 PRIV(push_level
) = 0;
301 PRIV(pushed_size
) = 0;
302 PRIV(length_pos
) = 2;
303 PRIV(output_size
) = 0;
304 PRIV(output_alignment
) = 1;
309 /* Fill symbol->section with section ptr
310 symbol->section is filled with the section index for defined symbols
311 during reading the GSD/EGSD section. But we need the pointer to the
314 It has the correct value for referenced (undefined section) symbols
316 called from bfd_hash_traverse in vms_fixup_sections */
319 fill_section_ptr (entry
, sections
)
320 struct bfd_hash_entry
*entry
;
326 sym
= ((vms_symbol_entry
*)entry
)->symbol
;
330 vms_debug (6, "fill_section_ptr: sym %p, sec %p\n", sym
, sec
);
333 /* fill forward references (these contain section number, not section ptr). */
335 if ((unsigned int) sec
< priv_section_count
)
337 sec
= ((vms_symbol_entry
*)entry
)->symbol
->section
=
338 ((asection
**)sections
)[(int)sec
];
341 if (strcmp (sym
->name
, sec
->name
) == 0)
342 sym
->flags
|= BSF_SECTION_SYM
;
348 set up all pointers and arrays, counters and sizes are fixed now
350 we build a private sections vector for easy access since sections
351 are always referenced by an index number.
353 alloc PRIV(sections) according to abfd->section_count
354 copy abfd->sections to PRIV(sections) */
357 vms_fixup_sections (abfd
)
360 if (PRIV(fixup_done
))
364 * traverse symbol table and fill in all section pointers
367 /* can't provide section count as argument to fill_section_ptr(). */
368 priv_section_count
= PRIV(section_count
);
369 bfd_hash_traverse (PRIV(vms_symbol_table
), fill_section_ptr
,
370 (PTR
) (PRIV(sections
)));
372 PRIV(fixup_done
) = true;
377 /*===========================================================================*/
379 /* Check the format for a file being read.
380 Return a (bfd_target *) if it's an object file or zero if not. */
382 static const struct bfd_target
*
388 const struct bfd_target
*target_vector
= 0;
389 const bfd_arch_info_type
*arch
= 0;
392 vms_debug (1, "vms_object_p(%p)\n", abfd
);
395 if (!vms_initialize (abfd
))
397 fprintf (stderr
, "vms_initialize () failed !!\n");
401 if (bfd_seek (abfd
, 0L, SEEK_SET
))
403 bfd_set_error (bfd_error_file_truncated
);
412 vms_debug (7, "reading at %08lx\n", bfd_tell(abfd
));
414 if (_bfd_vms_next_record (abfd
) < 0)
417 vms_debug (2, "next_record failed\n");
419 bfd_set_error (bfd_error_wrong_format
);
423 if ((prev_type
== EOBJ_S_C_EGSD
)
424 && (PRIV(rec_type
) != EOBJ_S_C_EGSD
))
426 if (vms_fixup_sections (abfd
) == false)
429 vms_debug (2, "vms_fixup_sections failed\n");
431 bfd_set_error (bfd_error_wrong_format
);
436 prev_type
= PRIV(rec_type
);
438 if (target_vector
== 0)
440 if (prev_type
<= OBJ_S_C_MAXRECTYP
)
441 target_vector
= &vms_vax_vec
;
443 target_vector
= &vms_alpha_vec
;
450 err
= _bfd_vms_slurp_hdr (abfd
, prev_type
);
455 err
= _bfd_vms_slurp_eom (abfd
, prev_type
);
459 err
= _bfd_vms_slurp_gsd (abfd
, prev_type
);
463 err
= _bfd_vms_slurp_tir (abfd
, prev_type
);
467 err
= _bfd_vms_slurp_dbg (abfd
, prev_type
);
471 err
= _bfd_vms_slurp_tbt (abfd
, prev_type
);
474 err
= _bfd_vms_slurp_lnk (abfd
, prev_type
);
482 vms_debug (2, "slurp type %d failed with %d\n", prev_type
, err
);
484 bfd_set_error (bfd_error_wrong_format
);
488 while ((prev_type
!= EOBJ_S_C_EEOM
) && (prev_type
!= OBJ_S_C_EOM
) && (prev_type
!= OBJ_S_C_EOMW
));
490 if (target_vector
== &vms_vax_vec
)
492 if (vms_fixup_sections (abfd
) == false)
495 vms_debug (2, "vms_fixup_sections failed\n");
497 bfd_set_error (bfd_error_wrong_format
);
501 /* set arch_info to vax */
503 arch
= bfd_scan_arch ("vax");
506 vms_debug (2, "arch is vax\n");
509 else if (target_vector
== &vms_alpha_vec
)
511 /* set arch_info to alpha */
513 arch
= bfd_scan_arch ("alpha");
516 vms_debug (2, "arch is alpha\n");
523 vms_debug (2, "arch not found\n");
525 bfd_set_error (bfd_error_wrong_format
);
528 abfd
->arch_info
= arch
;
530 return target_vector
;
533 /* Check the format for a file being read.
534 Return a (bfd_target *) if it's an archive file or zero. */
536 static const struct bfd_target
*
538 bfd
*abfd ATTRIBUTE_UNUSED
;
541 vms_debug (1, "vms_archive_p(%p)\n", abfd
);
547 /* Set the format of a file being written. */
554 vms_debug (1, "vms_mkobject(%p)\n", abfd
);
557 if (!vms_initialize (abfd
))
559 fprintf (stderr
, "vms_initialize () failed !!\n");
565 const bfd_arch_info_type
*arch
= bfd_scan_arch ("vax");
567 const bfd_arch_info_type
*arch
= bfd_scan_arch ("alpha");
571 bfd_set_error(bfd_error_wrong_format
);
574 abfd
->arch_info
= arch
;
580 /* Write cached information into a file being written, at bfd_close. */
583 vms_write_object_contents (abfd
)
587 vms_debug (1, "vms_write_object_contents(%p)\n", abfd
);
590 if (abfd
->section_count
> 0) /* we have sections */
594 if (_bfd_vms_write_hdr (abfd
, OBJ_S_C_HDR
) != 0)
596 if (_bfd_vms_write_gsd (abfd
, OBJ_S_C_GSD
) != 0)
598 if (_bfd_vms_write_tir (abfd
, OBJ_S_C_TIR
) != 0)
600 if (_bfd_vms_write_tbt (abfd
, OBJ_S_C_TBT
) != 0)
602 if (_bfd_vms_write_dbg (abfd
, OBJ_S_C_DBG
) != 0)
604 if (abfd
->section_count
> 255)
606 if (_bfd_vms_write_eom (abfd
, OBJ_S_C_EOMW
) != 0)
611 if (_bfd_vms_write_eom (abfd
, OBJ_S_C_EOM
) != 0)
617 if (_bfd_vms_write_hdr (abfd
, EOBJ_S_C_EMH
) != 0)
619 if (_bfd_vms_write_gsd (abfd
, EOBJ_S_C_EGSD
) != 0)
621 if (_bfd_vms_write_tir (abfd
, EOBJ_S_C_ETIR
) != 0)
623 if (_bfd_vms_write_tbt (abfd
, EOBJ_S_C_ETBT
) != 0)
625 if (_bfd_vms_write_dbg (abfd
, EOBJ_S_C_EDBG
) != 0)
627 if (_bfd_vms_write_eom (abfd
, EOBJ_S_C_EEOM
) != 0)
634 /*-- 4.1, generic -----------------------------------------------------------*/
636 /* Called when the BFD is being closed to do any necessary cleanup. */
639 vms_close_and_cleanup (abfd
)
643 vms_section
*es
, *es1
;
647 vms_debug (1, "vms_close_and_cleanup(%p)\n", abfd
);
652 if (PRIV(vms_buf
) != NULL
)
654 free (PRIV(vms_buf
));
655 PRIV(vms_buf
) = NULL
;
659 if (PRIV(output_buf
) != 0)
661 free (PRIV(output_buf
));
662 PRIV(output_buf
) = 0;
665 sec
= abfd
->sections
;
669 free (sec
->contents
);
673 if (PRIV(sections
) != NULL
)
675 free (PRIV(sections
));
676 PRIV(sections
) = NULL
;
679 if (PRIV(vms_symbol_table
))
681 bfd_hash_table_free (PRIV(vms_symbol_table
));
682 PRIV(vms_symbol_table
) = 0;
691 if (PRIV(location_stack
))
693 free (PRIV(location_stack
));
694 PRIV(location_stack
) = 0;
697 for (i
= 0; i
< VMS_SECTION_COUNT
; i
++)
699 es
= PRIV(vms_section_table
)[i
];
706 PRIV(vms_section_table
)[i
] = NULL
;
709 free (abfd
->tdata
.any
);
710 abfd
->tdata
.any
= NULL
;
715 /* Ask the BFD to free all cached information. */
717 vms_bfd_free_cached_info (abfd
)
718 bfd
*abfd ATTRIBUTE_UNUSED
;
721 vms_debug (1, "vms_bfd_free_cached_info(%p)\n", abfd
);
726 /* Called when a new section is created. */
729 vms_new_section_hook (abfd
, section
)
734 vms_debug (1, "vms_new_section_hook (%p, [%d]%s), count %d\n", abfd
, section
->index
, section
->name
, abfd
->section_count
);
736 bfd_set_section_alignment(abfd
, section
, 4);
738 if (abfd
->section_count
> PRIV(section_count
))
740 PRIV(sections
) = ((asection
**)
741 bfd_realloc (PRIV(sections
), abfd
->section_count
* sizeof (asection
*)));
742 if (PRIV(sections
) == 0)
744 PRIV(section_count
) = abfd
->section_count
;
747 vms_debug (6, "section_count: %d\n", PRIV(section_count
));
749 PRIV(sections
)[section
->index
] = section
;
751 vms_debug (7, "%d: %s\n", section
->index
, section
->name
);
757 /* Read the contents of a section.
758 buf points to a buffer of buf_size bytes to be filled with
759 section data (starting at offset into section) */
762 vms_get_section_contents (abfd
, section
, buf
, offset
, buf_size
)
763 bfd
*abfd ATTRIBUTE_UNUSED
;
764 asection
*section ATTRIBUTE_UNUSED
;
765 PTR buf ATTRIBUTE_UNUSED
;
766 file_ptr offset ATTRIBUTE_UNUSED
;
767 bfd_size_type buf_size ATTRIBUTE_UNUSED
;
770 vms_debug (1, "vms_get_section_contents(%p, %s, %p, off %ld, size %d)\n",
771 abfd
, section
->name
, buf
, offset
, (int)buf_size
);
774 /* shouldn't be called, since all sections are IN_MEMORY */
779 /* Read the contents of a section.
780 buf points to a buffer of buf_size bytes to be filled with
781 section data (starting at offset into section) */
784 vms_get_section_contents_in_window (abfd
, section
, w
, offset
, count
)
785 bfd
*abfd ATTRIBUTE_UNUSED
;
786 asection
*section ATTRIBUTE_UNUSED
;
787 bfd_window
*w ATTRIBUTE_UNUSED
;
788 file_ptr offset ATTRIBUTE_UNUSED
;
789 bfd_size_type count ATTRIBUTE_UNUSED
;
792 vms_debug (1, "vms_get_section_contents_in_window(%p, %s, %p, off %ld, count %d)\n",
793 abfd
, section
->name
, w
, offset
, (int)count
);
796 /* shouldn't be called, since all sections are IN_MEMORY */
801 /*-- Part 4.2, copy private data --------------------------------------------*/
803 /* Called to copy BFD general private data from one object file
807 vms_bfd_copy_private_bfd_data (src
, dest
)
808 bfd
*src ATTRIBUTE_UNUSED
;
809 bfd
*dest ATTRIBUTE_UNUSED
;
812 vms_debug (1, "vms_bfd_copy_private_bfd_data(%p, %p)\n", src
, dest
);
817 /* Merge private BFD information from the BFD @var{ibfd} to the
818 the output file BFD @var{obfd} when linking. Return <<true>>
819 on success, <<false>> on error. Possible error returns are:
821 o <<bfd_error_no_memory>> -
822 Not enough memory exists to create private data for @var{obfd}. */
825 vms_bfd_merge_private_bfd_data (ibfd
, obfd
)
826 bfd
*ibfd ATTRIBUTE_UNUSED
;
827 bfd
*obfd ATTRIBUTE_UNUSED
;
830 vms_debug (1,"vms_bfd_merge_private_bfd_data(%p, %p)\n", ibfd
, obfd
);
835 /* Set private BFD flag information in the BFD @var{abfd}.
836 Return <<true>> on success, <<false>> on error. Possible error
839 o <<bfd_error_no_memory>> -
840 Not enough memory exists to create private data for @var{obfd}. */
843 vms_bfd_set_private_flags (abfd
, flags
)
844 bfd
*abfd ATTRIBUTE_UNUSED
;
845 flagword flags ATTRIBUTE_UNUSED
;
848 vms_debug (1,"vms_bfd_set_private_flags(%p, %lx)\n", abfd
, (long)flags
);
853 /* Called to copy BFD private section data from one object file
857 vms_bfd_copy_private_section_data (srcbfd
, srcsec
, dstbfd
, dstsec
)
858 bfd
*srcbfd ATTRIBUTE_UNUSED
;
859 asection
*srcsec ATTRIBUTE_UNUSED
;
860 bfd
*dstbfd ATTRIBUTE_UNUSED
;
861 asection
*dstsec ATTRIBUTE_UNUSED
;
864 vms_debug (1, "vms_bfd_copy_private_section_data(%p, %s, %p, %s)\n",
865 srcbfd
, srcsec
->name
, dstbfd
, dstsec
->name
);
870 /* Called to copy BFD private symbol data from one object file
874 vms_bfd_copy_private_symbol_data (ibfd
, isym
, obfd
, osym
)
875 bfd
*ibfd ATTRIBUTE_UNUSED
;
876 asymbol
*isym ATTRIBUTE_UNUSED
;
877 bfd
*obfd ATTRIBUTE_UNUSED
;
878 asymbol
*osym ATTRIBUTE_UNUSED
;
881 vms_debug (1, "vms_bfd_copy_private_symbol_data(%p, %s, %p, %s)\n",
882 ibfd
, isym
->name
, obfd
, osym
->name
);
887 /*-- Part 4.3, core file ----------------------------------------------------*/
889 /* Return a read-only string explaining which program was running
890 when it failed and produced the core file abfd. */
893 vms_core_file_failing_command (abfd
)
894 bfd
*abfd ATTRIBUTE_UNUSED
;
897 vms_debug (1, "vms_core_file_failing_command(%p)\n", abfd
);
902 /* Returns the signal number which caused the core dump which
903 generated the file the BFD abfd is attached to. */
906 vms_core_file_failing_signal (abfd
)
907 bfd
*abfd ATTRIBUTE_UNUSED
;
910 vms_debug (1, "vms_core_file_failing_signal(%p)\n", abfd
);
915 /* Return true if the core file attached to core_bfd was generated
916 by a run of the executable file attached to exec_bfd, false otherwise. */
919 vms_core_file_matches_executable_p (abfd
, bbfd
)
920 bfd
*abfd ATTRIBUTE_UNUSED
;
921 bfd
*bbfd ATTRIBUTE_UNUSED
;
924 vms_debug (1, "vms_core_file_matches_executable_p(%p, %p)\n", abfd
, bbfd
);
929 /*-- Part 4.4, archive ------------------------------------------------------*/
931 /* ??? do something with an archive map.
932 Return false on error, true otherwise. */
935 vms_slurp_armap (abfd
)
936 bfd
*abfd ATTRIBUTE_UNUSED
;
939 vms_debug (1, "vms_slurp_armap(%p)\n", abfd
);
944 /* ??? do something with an extended name table.
945 Return false on error, true otherwise. */
948 vms_slurp_extended_name_table (abfd
)
949 bfd
*abfd ATTRIBUTE_UNUSED
;
952 vms_debug (1, "vms_slurp_extended_name_table(%p)\n", abfd
);
957 /* ??? do something with an extended name table.
958 Return false on error, true otherwise. */
961 vms_construct_extended_name_table (abfd
, tabloc
, tablen
, name
)
962 bfd
*abfd ATTRIBUTE_UNUSED
;
963 char **tabloc ATTRIBUTE_UNUSED
;
964 bfd_size_type
*tablen ATTRIBUTE_UNUSED
;
965 const char **name ATTRIBUTE_UNUSED
;
968 vms_debug (1, "vms_construct_extended_name_table(%p)\n", abfd
);
973 /* Truncate the name of an archive to match system-dependent restrictions */
976 vms_truncate_arname (abfd
, pathname
, arhdr
)
977 bfd
*abfd ATTRIBUTE_UNUSED
;
978 CONST
char *pathname ATTRIBUTE_UNUSED
;
979 char *arhdr ATTRIBUTE_UNUSED
;
982 vms_debug (1, "vms_truncate_arname(%p, %s, %s)\n", abfd
, pathname
, arhdr
);
987 /* ??? write archive map */
990 vms_write_armap (arch
, elength
, map
, orl_count
, stridx
)
991 bfd
*arch ATTRIBUTE_UNUSED
;
992 unsigned int elength ATTRIBUTE_UNUSED
;
993 struct orl
*map ATTRIBUTE_UNUSED
;
994 unsigned int orl_count ATTRIBUTE_UNUSED
;
995 int stridx ATTRIBUTE_UNUSED
;
998 vms_debug (1, "vms_write_armap(%p, %d, %p, %d %d)\n",
999 arch
, elength
, map
, orl_count
, stridx
);
1004 /* Read archive header ??? */
1007 vms_read_ar_hdr (abfd
)
1008 bfd
* abfd ATTRIBUTE_UNUSED
;
1011 vms_debug (1, "vms_read_ar_hdr(%p)\n", abfd
);
1016 /* Provided a BFD, @var{archive}, containing an archive and NULL, open
1017 an input BFD on the first contained element and returns that.
1018 Subsequent calls should pass the archive and the previous return value
1019 to return a created BFD to the next contained element.
1020 NULL is returned when there are no more. */
1023 vms_openr_next_archived_file (arch
, prev
)
1024 bfd
*arch ATTRIBUTE_UNUSED
;
1025 bfd
*prev ATTRIBUTE_UNUSED
;
1028 vms_debug (1, "vms_openr_next_archived_file(%p, %p)\n", arch
, prev
);
1033 /* Return the BFD which is referenced by the symbol in ABFD indexed by
1034 INDEX. INDEX should have been returned by bfd_get_next_mapent. */
1037 vms_get_elt_at_index (abfd
, index
)
1042 vms_debug (1, "vms_get_elt_at_index(%p, %p)\n", abfd
, index
);
1044 return _bfd_generic_get_elt_at_index(abfd
, index
);
1048 -> bfd_generic_stat_arch_elt */
1051 vms_generic_stat_arch_elt (abfd
, stat
)
1056 vms_debug (1, "vms_generic_stat_arch_elt(%p, %p)\n", abfd
, stat
);
1058 return bfd_generic_stat_arch_elt(abfd
, stat
);
1061 /* This is a new function in bfd 2.5 */
1064 vms_update_armap_timestamp (abfd
)
1065 bfd
*abfd ATTRIBUTE_UNUSED
;
1068 vms_debug (1, "vms_update_armap_timestamp(%p)\n", abfd
);
1073 /*-- Part 4.5, symbols --------------------------------------------------------*/
1075 /* Return the number of bytes required to store a vector of pointers
1076 to asymbols for all the symbols in the BFD abfd, including a
1077 terminal NULL pointer. If there are no symbols in the BFD,
1078 then return 0. If an error occurs, return -1. */
1081 vms_get_symtab_upper_bound (abfd
)
1085 vms_debug (1, "vms_get_symtab_upper_bound(%p), %d symbols\n", abfd
, PRIV(gsd_sym_count
));
1087 return (PRIV(gsd_sym_count
)+1) * sizeof (asymbol
*);
1090 /* Copy symbols from hash table to symbol vector
1092 called from bfd_hash_traverse in vms_get_symtab
1093 init counter to 0 if entry == 0 */
1096 copy_symbols (entry
, arg
)
1097 struct bfd_hash_entry
*entry
;
1100 bfd
*abfd
= (bfd
*) arg
;
1102 if (entry
== NULL
) /* init counter */
1104 else /* fill vector, inc counter */
1105 PRIV(symcache
)[PRIV(symnum
)++] = ((vms_symbol_entry
*)entry
)->symbol
;
1110 /* Read the symbols from the BFD abfd, and fills in the vector
1111 location with pointers to the symbols and a trailing NULL.
1113 return # of symbols read */
1116 vms_get_symtab (abfd
, symbols
)
1121 vms_debug (1, "vms_get_symtab(%p, <ret>)\n", abfd
);
1125 (void)copy_symbols((struct bfd_hash_entry
*)0, abfd
);
1127 /* traverse table and fill symbols vector */
1129 PRIV(symcache
) = symbols
;
1130 bfd_hash_traverse(PRIV(vms_symbol_table
), copy_symbols
, (PTR
)abfd
);
1132 symbols
[PRIV(gsd_sym_count
)] = NULL
;
1134 return PRIV(gsd_sym_count
);
1137 /* Create a new asymbol structure for the BFD abfd and return a pointer
1139 This routine is necessary because each back end has private information
1140 surrounding the asymbol. Building your own asymbol and pointing to it
1141 will not create the private information, and will cause problems later on. */
1144 _bfd_vms_make_empty_symbol (abfd
)
1147 asymbol
*symbol
= (asymbol
*)bfd_zalloc(abfd
, sizeof (asymbol
));
1150 vms_debug (1, "_bfd_vms_make_empty_symbol(%p)\n", abfd
);
1155 bfd_set_error (bfd_error_no_memory
);
1158 symbol
->the_bfd
= abfd
;
1163 /* Print symbol to file according to how. how is one of
1164 bfd_print_symbol_name just print the name
1165 bfd_print_symbol_more print more (???)
1166 bfd_print_symbol_all print all we know, which is not much right now :-) */
1169 vms_print_symbol (abfd
, file
, symbol
, how
)
1170 bfd
*abfd ATTRIBUTE_UNUSED
;
1173 bfd_print_symbol_type how
;
1176 vms_debug (1, "vms_print_symbol(%p, %p, %p, %d)\n", abfd
, file
, symbol
, how
);
1181 case bfd_print_symbol_name
:
1182 case bfd_print_symbol_more
:
1183 fprintf ((FILE *)file
," %s", symbol
->name
);
1188 case bfd_print_symbol_all
:
1190 CONST
char *section_name
= symbol
->section
->name
;
1192 bfd_print_symbol_vandf((PTR
)file
,symbol
);
1194 fprintf ((FILE *)file
," %-8s %s", section_name
, symbol
->name
);
1201 /* Return information about symbol in ret.
1203 fill type, value and name
1206 B bss segment symbol
1208 D data segment symbol
1210 t a static function symbol
1211 T text segment symbol
1216 vms_get_symbol_info (abfd
, symbol
, ret
)
1217 bfd
*abfd ATTRIBUTE_UNUSED
;
1224 vms_debug (1, "vms_get_symbol_info(%p, %p, %p)\n", abfd
, symbol
, ret
);
1227 sec
= symbol
->section
;
1232 if (bfd_is_com_section (sec
))
1234 else if (bfd_is_abs_section (sec
))
1236 else if (bfd_is_und_section (sec
))
1238 else if (bfd_is_ind_section (sec
))
1240 else if (bfd_get_section_flags (abfd
, sec
) & SEC_CODE
)
1242 else if (bfd_get_section_flags (abfd
, sec
) & SEC_DATA
)
1244 else if (bfd_get_section_flags (abfd
, sec
) & SEC_ALLOC
)
1249 if (ret
->type
!= 'U')
1250 ret
->value
= symbol
->value
+ symbol
->section
->vma
;
1253 ret
->name
= symbol
->name
;
1258 /* Return true if the given symbol sym in the BFD abfd is
1259 a compiler generated local label, else return false. */
1262 vms_bfd_is_local_label_name (abfd
, name
)
1263 bfd
*abfd ATTRIBUTE_UNUSED
;
1267 vms_debug (1, "vms_bfd_is_local_label_name(%p, %s)\n", abfd
, name
);
1269 return name
[0] == '$';
1272 /* Get source line number for symbol */
1275 vms_get_lineno (abfd
, symbol
)
1276 bfd
*abfd ATTRIBUTE_UNUSED
;
1277 asymbol
*symbol ATTRIBUTE_UNUSED
;
1280 vms_debug (1, "vms_get_lineno(%p, %p)\n", abfd
, symbol
);
1285 /* Provided a BFD, a section and an offset into the section, calculate and
1286 return the name of the source file and the line nearest to the wanted
1290 vms_find_nearest_line (abfd
, section
, symbols
, offset
, file
, func
, line
)
1291 bfd
*abfd ATTRIBUTE_UNUSED
;
1292 asection
*section ATTRIBUTE_UNUSED
;
1293 asymbol
**symbols ATTRIBUTE_UNUSED
;
1294 bfd_vma offset ATTRIBUTE_UNUSED
;
1295 CONST
char **file ATTRIBUTE_UNUSED
;
1296 CONST
char **func ATTRIBUTE_UNUSED
;
1297 unsigned int *line ATTRIBUTE_UNUSED
;
1300 vms_debug (1, "vms_find_nearest_line(%p, %s, %p, %ld, <ret>, <ret>, <ret>)\n",
1301 abfd
, section
->name
, symbols
, (long int)offset
);
1306 /* Back-door to allow format-aware applications to create debug symbols
1307 while using BFD for everything else. Currently used by the assembler
1308 when creating COFF files. */
1311 vms_bfd_make_debug_symbol (abfd
, ptr
, size
)
1312 bfd
*abfd ATTRIBUTE_UNUSED
;
1313 void *ptr ATTRIBUTE_UNUSED
;
1314 unsigned long size ATTRIBUTE_UNUSED
;
1317 vms_debug (1, "vms_bfd_make_debug_symbol(%p, %p, %ld)\n", abfd
, ptr
, size
);
1322 /* Read minisymbols. For minisymbols, we use the unmodified a.out
1323 symbols. The minisymbol_to_symbol function translates these into
1324 BFD asymbol structures. */
1327 vms_read_minisymbols (abfd
, dynamic
, minisymsp
, sizep
)
1331 unsigned int *sizep
;
1334 vms_debug (1, "vms_read_minisymbols(%p, %d, %p, %d)\n", abfd
, dynamic
, minisymsp
, *sizep
);
1336 return _bfd_generic_read_minisymbols (abfd
, dynamic
, minisymsp
, sizep
);
1339 /* Convert a minisymbol to a BFD asymbol. A minisymbol is just an
1340 unmodified a.out symbol. The SYM argument is a structure returned
1341 by bfd_make_empty_symbol, which we fill in here. */
1344 vms_minisymbol_to_symbol (abfd
, dynamic
, minisym
, sym
)
1351 vms_debug (1, "vms_minisymbol_to_symbol(%p, %d, %p, %p)\n", abfd
, dynamic
, minisym
, sym
);
1353 return _bfd_generic_minisymbol_to_symbol (abfd
, dynamic
, minisym
, sym
);
1356 /*-- Part 4.6, relocations --------------------------------------------------*/
1358 /* Return the number of bytes required to store the relocation information
1359 associated with section sect attached to bfd abfd.
1360 If an error occurs, return -1. */
1363 vms_get_reloc_upper_bound (abfd
, section
)
1364 bfd
*abfd ATTRIBUTE_UNUSED
;
1365 asection
*section ATTRIBUTE_UNUSED
;
1368 vms_debug (1, "vms_get_reloc_upper_bound(%p, %s)\n", abfd
, section
->name
);
1373 /* Call the back end associated with the open BFD abfd and translate the
1374 external form of the relocation information attached to sec into the
1375 internal canonical form. Place the table into memory at loc, which has
1376 been preallocated, usually by a call to bfd_get_reloc_upper_bound.
1377 Returns the number of relocs, or -1 on error. */
1380 vms_canonicalize_reloc (abfd
, section
, location
, symbols
)
1381 bfd
*abfd ATTRIBUTE_UNUSED
;
1382 asection
*section ATTRIBUTE_UNUSED
;
1383 arelent
**location ATTRIBUTE_UNUSED
;
1384 asymbol
**symbols ATTRIBUTE_UNUSED
;
1387 vms_debug (1, "vms_canonicalize_reloc(%p, %s, <ret>, <ret>)\n", abfd
, section
->name
);
1392 /*---------------------------------------------------------------------------*/
1393 /* this is just copied from ecoff-alpha, needs to be fixed probably */
1395 /* How to process the various reloc types. */
1397 static bfd_reloc_status_type
1398 reloc_nil (abfd
, reloc
, sym
, data
, sec
, output_bfd
, error_message
)
1399 bfd
*abfd ATTRIBUTE_UNUSED
;
1400 arelent
*reloc ATTRIBUTE_UNUSED
;
1401 asymbol
*sym ATTRIBUTE_UNUSED
;
1402 PTR data ATTRIBUTE_UNUSED
;
1403 asection
*sec ATTRIBUTE_UNUSED
;
1404 bfd
*output_bfd ATTRIBUTE_UNUSED
;
1405 char **error_message ATTRIBUTE_UNUSED
;
1408 vms_debug (1, "reloc_nil(abfd %p, output_bfd %p)\n", abfd
, output_bfd
);
1409 vms_debug (2, "In section %s, symbol %s\n",
1410 sec
->name
, sym
->name
);
1411 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
1412 reloc
->sym_ptr_ptr
[0]->name
,
1413 (unsigned long)reloc
->address
,
1414 (unsigned long)reloc
->addend
, reloc
->howto
->name
);
1415 vms_debug (2, "data at %p\n", data
);
1416 /* _bfd_hexdump (2, data, bfd_get_reloc_size(reloc->howto),0); */
1419 return bfd_reloc_ok
;
1422 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
1423 from smaller values. Start with zero, widen, *then* decrement. */
1424 #define MINUS_ONE (((bfd_vma)0) - 1)
1426 static reloc_howto_type alpha_howto_table
[] =
1428 HOWTO (ALPHA_R_IGNORE
, /* type */
1430 0, /* size (0 = byte, 1 = short, 2 = long) */
1432 true, /* pc_relative */
1434 complain_overflow_dont
, /* complain_on_overflow */
1435 reloc_nil
, /* special_function */
1436 "IGNORE", /* name */
1437 true, /* partial_inplace */
1440 true), /* pcrel_offset */
1442 /* A 64 bit reference to a symbol. */
1443 HOWTO (ALPHA_R_REFQUAD
, /* type */
1445 4, /* size (0 = byte, 1 = short, 2 = long) */
1447 false, /* pc_relative */
1449 complain_overflow_bitfield
, /* complain_on_overflow */
1450 reloc_nil
, /* special_function */
1451 "REFQUAD", /* name */
1452 true, /* partial_inplace */
1453 MINUS_ONE
, /* src_mask */
1454 MINUS_ONE
, /* dst_mask */
1455 false), /* pcrel_offset */
1457 /* A 21 bit branch. The native assembler generates these for
1458 branches within the text segment, and also fills in the PC
1459 relative offset in the instruction. */
1460 HOWTO (ALPHA_R_BRADDR
, /* type */
1462 2, /* size (0 = byte, 1 = short, 2 = long) */
1464 true, /* pc_relative */
1466 complain_overflow_signed
, /* complain_on_overflow */
1467 reloc_nil
, /* special_function */
1468 "BRADDR", /* name */
1469 true, /* partial_inplace */
1470 0x1fffff, /* src_mask */
1471 0x1fffff, /* dst_mask */
1472 false), /* pcrel_offset */
1474 /* A hint for a jump to a register. */
1475 HOWTO (ALPHA_R_HINT
, /* type */
1477 1, /* size (0 = byte, 1 = short, 2 = long) */
1479 true, /* pc_relative */
1481 complain_overflow_dont
, /* complain_on_overflow */
1482 reloc_nil
, /* special_function */
1484 true, /* partial_inplace */
1485 0x3fff, /* src_mask */
1486 0x3fff, /* dst_mask */
1487 false), /* pcrel_offset */
1489 /* 16 bit PC relative offset. */
1490 HOWTO (ALPHA_R_SREL16
, /* type */
1492 1, /* size (0 = byte, 1 = short, 2 = long) */
1494 true, /* pc_relative */
1496 complain_overflow_signed
, /* complain_on_overflow */
1497 reloc_nil
, /* special_function */
1498 "SREL16", /* name */
1499 true, /* partial_inplace */
1500 0xffff, /* src_mask */
1501 0xffff, /* dst_mask */
1502 false), /* pcrel_offset */
1504 /* 32 bit PC relative offset. */
1505 HOWTO (ALPHA_R_SREL32
, /* type */
1507 2, /* size (0 = byte, 1 = short, 2 = long) */
1509 true, /* pc_relative */
1511 complain_overflow_signed
, /* complain_on_overflow */
1512 reloc_nil
, /* special_function */
1513 "SREL32", /* name */
1514 true, /* partial_inplace */
1515 0xffffffff, /* src_mask */
1516 0xffffffff, /* dst_mask */
1517 false), /* pcrel_offset */
1519 /* A 64 bit PC relative offset. */
1520 HOWTO (ALPHA_R_SREL64
, /* type */
1522 4, /* size (0 = byte, 1 = short, 2 = long) */
1524 true, /* pc_relative */
1526 complain_overflow_signed
, /* complain_on_overflow */
1527 reloc_nil
, /* special_function */
1528 "SREL64", /* name */
1529 true, /* partial_inplace */
1530 MINUS_ONE
, /* src_mask */
1531 MINUS_ONE
, /* dst_mask */
1532 false), /* pcrel_offset */
1534 /* Push a value on the reloc evaluation stack. */
1535 HOWTO (ALPHA_R_OP_PUSH
, /* type */
1537 0, /* size (0 = byte, 1 = short, 2 = long) */
1539 false, /* pc_relative */
1541 complain_overflow_dont
, /* complain_on_overflow */
1542 reloc_nil
, /* special_function */
1543 "OP_PUSH", /* name */
1544 false, /* partial_inplace */
1547 false), /* pcrel_offset */
1549 /* Store the value from the stack at the given address. Store it in
1550 a bitfield of size r_size starting at bit position r_offset. */
1551 HOWTO (ALPHA_R_OP_STORE
, /* type */
1553 4, /* size (0 = byte, 1 = short, 2 = long) */
1555 false, /* pc_relative */
1557 complain_overflow_dont
, /* complain_on_overflow */
1558 reloc_nil
, /* special_function */
1559 "OP_STORE", /* name */
1560 false, /* partial_inplace */
1562 MINUS_ONE
, /* dst_mask */
1563 false), /* pcrel_offset */
1565 /* Subtract the reloc address from the value on the top of the
1566 relocation stack. */
1567 HOWTO (ALPHA_R_OP_PSUB
, /* type */
1569 0, /* size (0 = byte, 1 = short, 2 = long) */
1571 false, /* pc_relative */
1573 complain_overflow_dont
, /* complain_on_overflow */
1574 reloc_nil
, /* special_function */
1575 "OP_PSUB", /* name */
1576 false, /* partial_inplace */
1579 false), /* pcrel_offset */
1581 /* Shift the value on the top of the relocation stack right by the
1583 HOWTO (ALPHA_R_OP_PRSHIFT
, /* type */
1585 0, /* size (0 = byte, 1 = short, 2 = long) */
1587 false, /* pc_relative */
1589 complain_overflow_dont
, /* complain_on_overflow */
1590 reloc_nil
, /* special_function */
1591 "OP_PRSHIFT", /* name */
1592 false, /* partial_inplace */
1595 false), /* pcrel_offset */
1597 /* Hack. Linkage is done by linker. */
1598 HOWTO (ALPHA_R_LINKAGE
, /* type */
1600 8, /* size (0 = byte, 1 = short, 2 = long) */
1602 false, /* pc_relative */
1604 complain_overflow_dont
, /* complain_on_overflow */
1605 reloc_nil
, /* special_function */
1606 "LINKAGE", /* name */
1607 false, /* partial_inplace */
1610 false), /* pcrel_offset */
1612 /* A 32 bit reference to a symbol. */
1613 HOWTO (ALPHA_R_REFLONG
, /* type */
1615 2, /* size (0 = byte, 1 = short, 2 = long) */
1617 false, /* pc_relative */
1619 complain_overflow_bitfield
, /* complain_on_overflow */
1620 reloc_nil
, /* special_function */
1621 "REFLONG", /* name */
1622 true, /* partial_inplace */
1623 0xffffffff, /* src_mask */
1624 0xffffffff, /* dst_mask */
1625 false), /* pcrel_offset */
1627 /* A 64 bit reference to a procedure, written as 32 bit value. */
1628 HOWTO (ALPHA_R_CODEADDR
, /* type */
1630 4, /* size (0 = byte, 1 = short, 2 = long) */
1632 false, /* pc_relative */
1634 complain_overflow_signed
,/* complain_on_overflow */
1635 reloc_nil
, /* special_function */
1636 "CODEADDR", /* name */
1637 false, /* partial_inplace */
1638 0xffffffff, /* src_mask */
1639 0xffffffff, /* dst_mask */
1640 false), /* pcrel_offset */
1644 /* Return a pointer to a howto structure which, when invoked, will perform
1645 the relocation code on data from the architecture noted. */
1647 static const struct reloc_howto_struct
*
1648 vms_bfd_reloc_type_lookup (abfd
, code
)
1649 bfd
*abfd ATTRIBUTE_UNUSED
;
1650 bfd_reloc_code_real_type code
;
1655 vms_debug (1, "vms_bfd_reloc_type_lookup(%p, %d)\t", abfd
, code
);
1660 case BFD_RELOC_16
: alpha_type
= ALPHA_R_SREL16
; break;
1661 case BFD_RELOC_32
: alpha_type
= ALPHA_R_REFLONG
; break;
1662 case BFD_RELOC_64
: alpha_type
= ALPHA_R_REFQUAD
; break;
1663 case BFD_RELOC_CTOR
: alpha_type
= ALPHA_R_REFQUAD
; break;
1664 case BFD_RELOC_23_PCREL_S2
: alpha_type
= ALPHA_R_BRADDR
; break;
1665 case BFD_RELOC_ALPHA_HINT
: alpha_type
= ALPHA_R_HINT
; break;
1666 case BFD_RELOC_16_PCREL
: alpha_type
= ALPHA_R_SREL16
; break;
1667 case BFD_RELOC_32_PCREL
: alpha_type
= ALPHA_R_SREL32
; break;
1668 case BFD_RELOC_64_PCREL
: alpha_type
= ALPHA_R_SREL64
; break;
1669 case BFD_RELOC_ALPHA_LINKAGE
: alpha_type
= ALPHA_R_LINKAGE
; break;
1670 case BFD_RELOC_ALPHA_CODEADDR
: alpha_type
= ALPHA_R_CODEADDR
; break;
1672 (*_bfd_error_handler
) ("reloc (%d) is *UNKNOWN*", code
);
1673 return (const struct reloc_howto_struct
*) NULL
;
1676 vms_debug (2, "reloc is %s\n", alpha_howto_table
[alpha_type
].name
);
1678 return &alpha_howto_table
[alpha_type
];
1681 /*-- Part 4.7, writing an object file ---------------------------------------*/
1683 /* Set the architecture and machine type in BFD abfd to arch and mach.
1684 Find the correct pointer to a structure and insert it into the arch_info
1688 vms_set_arch_mach (abfd
, arch
, mach
)
1690 enum bfd_architecture arch ATTRIBUTE_UNUSED
;
1691 unsigned long mach ATTRIBUTE_UNUSED
;
1694 vms_debug (1, "vms_set_arch_mach(%p, %d, %ld)\n", abfd
, arch
, mach
);
1696 abfd
->arch_info
= bfd_scan_arch("alpha");
1701 /* Sets the contents of the section section in BFD abfd to the data starting
1702 in memory at data. The data is written to the output section starting at
1703 offset offset for count bytes.
1705 Normally true is returned, else false. Possible error returns are:
1706 o bfd_error_no_contents - The output section does not have the
1707 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
1708 o and some more too */
1711 vms_set_section_contents (abfd
, section
, location
, offset
, count
)
1716 bfd_size_type count
;
1719 vms_debug (1, "vms_set_section_contents(%p, sec %s, loc %p, off %ld, count %d)\n",
1720 abfd
, section
->name
, location
, (long int)offset
, (int)count
);
1721 vms_debug (2, "secraw %d, seccooked %d\n", (int)section
->_raw_size
, (int)section
->_cooked_size
);
1723 return _bfd_save_vms_section(abfd
, section
, location
, offset
, count
);
1726 /*-- Part 4.8, linker -------------------------------------------------------*/
1728 /* Get the size of the section headers. */
1731 vms_sizeof_headers (abfd
, reloc
)
1732 bfd
*abfd ATTRIBUTE_UNUSED
;
1733 boolean reloc ATTRIBUTE_UNUSED
;
1736 vms_debug (1, "vms_sizeof_headers(%p, %s)\n", abfd
, (reloc
)?"True":"False");
1741 /* Provides default handling of relocation effort for back ends
1742 which can't be bothered to do it efficiently. */
1745 vms_bfd_get_relocated_section_contents (abfd
, link_info
, link_order
, data
,
1746 relocateable
, symbols
)
1747 bfd
*abfd ATTRIBUTE_UNUSED
;
1748 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1749 struct bfd_link_order
*link_order ATTRIBUTE_UNUSED
;
1750 bfd_byte
*data ATTRIBUTE_UNUSED
;
1751 boolean relocateable ATTRIBUTE_UNUSED
;
1752 asymbol
**symbols ATTRIBUTE_UNUSED
;
1755 vms_debug (1, "vms_bfd_get_relocated_section_contents(%p, %p, %p, %p, %s, %p)\n",
1756 abfd
, link_info
, link_order
, data
, (relocateable
)?"True":"False", symbols
);
1764 vms_bfd_relax_section (abfd
, section
, link_info
, again
)
1765 bfd
*abfd ATTRIBUTE_UNUSED
;
1766 asection
*section ATTRIBUTE_UNUSED
;
1767 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1768 boolean
*again ATTRIBUTE_UNUSED
;
1771 vms_debug (1, "vms_bfd_relax_section(%p, %s, %p, <ret>)\n",
1772 abfd
, section
->name
, link_info
);
1778 vms_bfd_gc_sections (abfd
, link_info
)
1779 bfd
*abfd ATTRIBUTE_UNUSED
;
1780 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1783 vms_debug (1, "vms_bfd_gc_sections(%p, %p)\n", abfd
, link_info
);
1788 /* Create a hash table for the linker. Different backends store
1789 different information in this table. */
1791 static struct bfd_link_hash_table
*
1792 vms_bfd_link_hash_table_create (abfd
)
1793 bfd
*abfd ATTRIBUTE_UNUSED
;
1796 vms_debug (1, "vms_bfd_link_hash_table_create(%p)\n", abfd
);
1801 /* Add symbols from this object file into the hash table. */
1804 vms_bfd_link_add_symbols (abfd
, link_info
)
1805 bfd
*abfd ATTRIBUTE_UNUSED
;
1806 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1809 vms_debug (1, "vms_bfd_link_add_symbols(%p, %p)\n", abfd
, link_info
);
1814 /* Do a link based on the link_order structures attached to each
1815 section of the BFD. */
1818 vms_bfd_final_link (abfd
, link_info
)
1819 bfd
*abfd ATTRIBUTE_UNUSED
;
1820 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
;
1823 vms_debug (1, "vms_bfd_final_link(%p, %p)\n", abfd
, link_info
);
1828 /* Should this section be split up into smaller pieces during linking. */
1831 vms_bfd_link_split_section (abfd
, section
)
1832 bfd
*abfd ATTRIBUTE_UNUSED
;
1833 asection
*section ATTRIBUTE_UNUSED
;
1836 vms_debug (1, "vms_bfd_link_split_section(%p, %s)\n", abfd
, section
->name
);
1841 /*-- Part 4.9, dynamic symbols and relocations ------------------------------*/
1843 /* Get the amount of memory required to hold the dynamic symbols. */
1846 vms_get_dynamic_symtab_upper_bound (abfd
)
1847 bfd
*abfd ATTRIBUTE_UNUSED
;
1850 vms_debug (1, "vms_get_dynamic_symtab_upper_bound(%p)\n", abfd
);
1856 vms_bfd_print_private_bfd_data (abfd
, file
)
1857 bfd
*abfd ATTRIBUTE_UNUSED
;
1858 void *file ATTRIBUTE_UNUSED
;
1861 vms_debug (1, "vms_bfd_print_private_bfd_data(%p)\n", abfd
);
1866 /* Read in the dynamic symbols. */
1869 vms_canonicalize_dynamic_symtab (abfd
, symbols
)
1870 bfd
*abfd ATTRIBUTE_UNUSED
;
1871 asymbol
**symbols ATTRIBUTE_UNUSED
;
1874 vms_debug (1, "vms_canonicalize_dynamic_symtab(%p, <ret>)\n", abfd
);
1879 /* Get the amount of memory required to hold the dynamic relocs. */
1882 vms_get_dynamic_reloc_upper_bound (abfd
)
1883 bfd
*abfd ATTRIBUTE_UNUSED
;
1886 vms_debug (1, "vms_get_dynamic_reloc_upper_bound(%p)\n", abfd
);
1891 /* Read in the dynamic relocs. */
1894 vms_canonicalize_dynamic_reloc (abfd
, arel
, symbols
)
1895 bfd
*abfd ATTRIBUTE_UNUSED
;
1896 arelent
**arel ATTRIBUTE_UNUSED
;
1897 asymbol
**symbols ATTRIBUTE_UNUSED
;
1900 vms_debug (1, "vms_canonicalize_dynamic_reloc(%p)\n", abfd
);