1 /* vms.c -- BFD back-end for VAX (openVMS/VAX) and
2 EVAX (openVMS/Alpha) files.
3 Copyright 1996, 1997, 1998 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 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
=
136 "vms-alpha", /* name */
137 bfd_target_evax_flavour
,
138 false, /* data byte order is little */
139 false, /* 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
),
176 const bfd_target vms_vax_vec
=
179 "vms-vax", /* name */
180 bfd_target_ovax_flavour
,
181 false, /* data byte order is little */
182 false, /* 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
),
221 /*===========================================================================*/
223 /* Initialize private data */
226 vms_initialize (abfd
)
231 if (abfd
->tdata
.any
!= 0)
234 bfd_set_start_address (abfd
, (bfd_vma
)-1);
236 abfd
->tdata
.any
= ((struct vms_private_data_struct
*)
237 bfd_malloc (sizeof (struct vms_private_data_struct
)));
238 if (abfd
->tdata
.any
== 0)
248 PRIV(rec_length
) = 0;
249 PRIV(file_format
) = FF_UNKNOWN
;
250 PRIV(fixup_done
) = false;
251 PRIV(sections
) = NULL
;
253 PRIV(stack
) = ((struct stack_struct
*)
254 bfd_malloc (sizeof (struct stack_struct
) * STACKSIZE
));
255 if (PRIV(stack
) == 0)
258 free (abfd
->tdata
.any
);
264 PRIV(vms_symbol_table
) = ((struct bfd_hash_table
*)
265 bfd_malloc (sizeof (struct bfd_hash_table
)));
266 if (PRIV(vms_symbol_table
) == 0)
271 goto vms_init_no_mem1
;
274 if (!bfd_hash_table_init (PRIV(vms_symbol_table
), _bfd_vms_hash_newfunc
))
277 PRIV(location_stack
) = ((struct location_struct
*)
278 bfd_malloc (sizeof (struct location_struct
)
279 * LOCATION_SAVE_SIZE
));
280 if (PRIV(location_stack
) == 0)
283 free (PRIV(vms_symbol_table
));
284 PRIV(vms_symbol_table
) = 0;
285 goto vms_init_no_mem2
;
288 for (i
= 0; i
< VMS_SECTION_COUNT
; i
++)
289 PRIV(vms_section_table
)[i
] = NULL
;
291 PRIV(output_buf
) = (unsigned char *) malloc (MAX_OUTREC_SIZE
);
292 if (PRIV(output_buf
) == 0)
294 free (PRIV(location_stack
));
295 PRIV(location_stack
) = 0;
296 goto vms_init_no_mem3
;
298 PRIV(push_level
) = 0;
299 PRIV(pushed_size
) = 0;
300 PRIV(length_pos
) = 2;
301 PRIV(output_size
) = 0;
302 PRIV(output_alignment
) = 1;
308 /* Fill symbol->section with section ptr
309 symbol->section is filled with the section index for defined symbols
310 during reading the GSD/EGSD section. But we need the pointer to the
313 It has the correct value for referenced (undefined section) symbols
315 called from bfd_hash_traverse in vms_fixup_sections */
318 fill_section_ptr (entry
, sections
)
319 struct bfd_hash_entry
*entry
;
325 sym
= ((vms_symbol_entry
*)entry
)->symbol
;
329 vms_debug (6, "fill_section_ptr: sym %p, sec %p\n", sym
, sec
);
332 /* fill forward references (these contain section number, not section ptr). */
334 if ((int)sec
< priv_section_count
)
336 sec
= ((vms_symbol_entry
*)entry
)->symbol
->section
=
337 ((asection
**)sections
)[(int)sec
];
340 if (strcmp (sym
->name
, sec
->name
) == 0)
341 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
)
362 if (PRIV(fixup_done
))
366 * traverse symbol table and fill in all section pointers
369 /* can't provide section count as argument to fill_section_ptr(). */
370 priv_section_count
= PRIV(section_count
);
371 bfd_hash_traverse (PRIV(vms_symbol_table
), fill_section_ptr
,
372 (PTR
)(PRIV(sections
)));
374 PRIV(fixup_done
) = true;
379 /*===========================================================================*/
381 /* Check the format for a file being read.
382 Return a (bfd_target *) if it's an object file or zero if not. */
384 static const struct bfd_target
*
390 const struct bfd_target
*target_vector
= 0;
391 const bfd_arch_info_type
*arch
= 0;
394 vms_debug (1, "vms_object_p(%p)\n", abfd
);
397 if (!vms_initialize (abfd
))
399 fprintf (stderr
, "vms_initialize () failed !!\n");
403 if (bfd_seek (abfd
, 0L, SEEK_SET
))
405 bfd_set_error (bfd_error_file_truncated
);
414 vms_debug (7, "reading at %08lx\n", bfd_tell(abfd
));
416 if (_bfd_vms_next_record (abfd
) < 0)
419 vms_debug (2, "next_record failed\n");
421 bfd_set_error (bfd_error_wrong_format
);
425 if ((prev_type
== EOBJ_S_C_EGSD
)
426 && (PRIV(rec_type
) != EOBJ_S_C_EGSD
))
428 if (vms_fixup_sections (abfd
) == false)
431 vms_debug (2, "vms_fixup_sections failed\n");
433 bfd_set_error (bfd_error_wrong_format
);
438 prev_type
= PRIV(rec_type
);
440 if (target_vector
== 0)
442 if (prev_type
<= OBJ_S_C_MAXRECTYP
)
443 target_vector
= &vms_vax_vec
;
445 target_vector
= &vms_alpha_vec
;
452 err
= _bfd_vms_slurp_hdr (abfd
, prev_type
);
457 err
= _bfd_vms_slurp_eom (abfd
, prev_type
);
461 err
= _bfd_vms_slurp_gsd (abfd
, prev_type
);
465 err
= _bfd_vms_slurp_tir (abfd
, prev_type
);
469 err
= _bfd_vms_slurp_dbg (abfd
, prev_type
);
473 err
= _bfd_vms_slurp_tbt (abfd
, prev_type
);
476 err
= _bfd_vms_slurp_lnk (abfd
, prev_type
);
484 vms_debug (2, "slurp type %d failed with %d\n", prev_type
, err
);
486 bfd_set_error (bfd_error_wrong_format
);
490 while ((prev_type
!= EOBJ_S_C_EEOM
) && (prev_type
!= OBJ_S_C_EOM
) && (prev_type
!= OBJ_S_C_EOMW
));
492 if (target_vector
== &vms_vax_vec
)
494 if (vms_fixup_sections (abfd
) == false)
497 vms_debug (2, "vms_fixup_sections failed\n");
499 bfd_set_error (bfd_error_wrong_format
);
503 /* set arch_info to vax */
505 arch
= bfd_scan_arch ("vax");
508 vms_debug (2, "arch is vax\n");
511 else if (target_vector
== &vms_alpha_vec
)
513 /* set arch_info to alpha */
515 arch
= bfd_scan_arch ("alpha");
518 vms_debug (2, "arch is alpha\n");
525 vms_debug (2, "arch not found\n");
527 bfd_set_error (bfd_error_wrong_format
);
530 abfd
->arch_info
= arch
;
532 return target_vector
;
536 /* Check the format for a file being read.
537 Return a (bfd_target *) if it's an archive file or zero. */
539 static const struct bfd_target
*
544 vms_debug (1, "vms_archive_p(%p)\n", abfd
);
551 /* Set the format of a file being written. */
558 vms_debug (1, "vms_mkobject(%p)\n", abfd
);
561 if (!vms_initialize (abfd
))
563 fprintf (stderr
, "vms_initialize () failed !!\n");
569 const bfd_arch_info_type
*arch
= bfd_scan_arch ("vax");
571 const bfd_arch_info_type
*arch
= bfd_scan_arch ("alpha");
575 bfd_set_error(bfd_error_wrong_format
);
578 abfd
->arch_info
= arch
;
585 /* Write cached information into a file being written, at bfd_close. */
588 vms_write_object_contents (abfd
)
592 vms_debug (1, "vms_write_object_contents(%p)\n", abfd
);
595 if (abfd
->section_count
> 0) /* we have sections */
599 if (_bfd_vms_write_hdr (abfd
, OBJ_S_C_HDR
) != 0)
601 if (_bfd_vms_write_gsd (abfd
, OBJ_S_C_GSD
) != 0)
603 if (_bfd_vms_write_tir (abfd
, OBJ_S_C_TIR
) != 0)
605 if (_bfd_vms_write_tbt (abfd
, OBJ_S_C_TBT
) != 0)
607 if (_bfd_vms_write_dbg (abfd
, OBJ_S_C_DBG
) != 0)
609 if (abfd
->section_count
> 255)
611 if (_bfd_vms_write_eom (abfd
, OBJ_S_C_EOMW
) != 0)
616 if (_bfd_vms_write_eom (abfd
, OBJ_S_C_EOM
) != 0)
622 if (_bfd_vms_write_hdr (abfd
, EOBJ_S_C_EMH
) != 0)
624 if (_bfd_vms_write_gsd (abfd
, EOBJ_S_C_EGSD
) != 0)
626 if (_bfd_vms_write_tir (abfd
, EOBJ_S_C_ETIR
) != 0)
628 if (_bfd_vms_write_tbt (abfd
, EOBJ_S_C_ETBT
) != 0)
630 if (_bfd_vms_write_dbg (abfd
, EOBJ_S_C_EDBG
) != 0)
632 if (_bfd_vms_write_eom (abfd
, EOBJ_S_C_EEOM
) != 0)
639 /*-- 4.1, generic -----------------------------------------------------------*/
641 /* Called when the BFD is being closed to do any necessary cleanup. */
644 vms_close_and_cleanup (abfd
)
648 vms_section
*es
, *es1
;
653 vms_debug (1, "vms_close_and_cleanup(%p)\n", abfd
);
658 if (PRIV(vms_buf
) != NULL
)
660 free (PRIV(vms_buf
));
661 PRIV(vms_buf
) = NULL
;
665 if (PRIV(output_buf
) != 0)
667 free (PRIV(output_buf
));
668 PRIV(output_buf
) = 0;
671 sec
= abfd
->sections
;
675 free (sec
->contents
);
679 if (PRIV(sections
) != NULL
)
681 free (PRIV(sections
));
682 PRIV(sections
) = NULL
;
685 if (PRIV(vms_symbol_table
))
687 bfd_hash_table_free (PRIV(vms_symbol_table
));
688 PRIV(vms_symbol_table
) = 0;
697 if (PRIV(location_stack
))
699 free (PRIV(location_stack
));
700 PRIV(location_stack
) = 0;
703 for (i
= 0; i
< VMS_SECTION_COUNT
; i
++)
705 es
= PRIV(vms_section_table
)[i
];
712 PRIV(vms_section_table
)[i
] = NULL
;
715 free (abfd
->tdata
.any
);
716 abfd
->tdata
.any
= NULL
;
722 /* Ask the BFD to free all cached information. */
724 vms_bfd_free_cached_info (abfd
)
728 vms_debug (1, "vms_bfd_free_cached_info(%p)\n", abfd
);
734 /* Called when a new section is created. */
737 vms_new_section_hook (abfd
, section
)
742 vms_debug (1, "vms_new_section_hook (%p, [%d]%s), count %d\n", abfd
, section
->index
, section
->name
, abfd
->section_count
);
744 bfd_set_section_alignment(abfd
, section
, 4);
746 if (abfd
->section_count
> PRIV(section_count
))
748 PRIV(sections
) = ((asection
**)
749 bfd_realloc (PRIV(sections
), abfd
->section_count
* sizeof (asection
*)));
750 if (PRIV(sections
) == 0)
752 PRIV(section_count
) = abfd
->section_count
;
755 vms_debug (6, "section_count: %d\n", PRIV(section_count
));
757 PRIV(sections
)[section
->index
] = section
;
759 vms_debug (7, "%d: %s\n", section
->index
, section
->name
);
766 /* Read the contents of a section.
767 buf points to a buffer of buf_size bytes to be filled with
768 section data (starting at offset into section) */
771 vms_get_section_contents (abfd
, section
, buf
, offset
, buf_size
)
776 bfd_size_type buf_size
;
779 vms_debug (1, "vms_get_section_contents(%p, %s, %p, off %ld, size %d)\n",
780 abfd
, section
->name
, buf
, offset
, (int)buf_size
);
783 /* shouldn't be called, since all sections are IN_MEMORY */
788 /* Read the contents of a section.
789 buf points to a buffer of buf_size bytes to be filled with
790 section data (starting at offset into section) */
793 vms_get_section_contents_in_window (abfd
, section
, w
, offset
, count
)
801 vms_debug (1, "vms_get_section_contents_in_window(%p, %s, %p, off %ld, count %d)\n",
802 abfd
, section
->name
, w
, offset
, (int)count
);
805 /* shouldn't be called, since all sections are IN_MEMORY */
810 /*-- Part 4.2, copy private data --------------------------------------------*/
812 /* Called to copy BFD general private data from one object file
816 vms_bfd_copy_private_bfd_data (src
, dest
)
821 vms_debug (1, "vms_bfd_copy_private_bfd_data(%p, %p)\n", src
, dest
);
827 /* Merge private BFD information from the BFD @var{ibfd} to the
828 the output file BFD @var{obfd} when linking. Return <<true>>
829 on success, <<false>> on error. Possible error returns are:
831 o <<bfd_error_no_memory>> -
832 Not enough memory exists to create private data for @var{obfd}. */
835 vms_bfd_merge_private_bfd_data (ibfd
, obfd
)
840 vms_debug (1,"vms_bfd_merge_private_bfd_data(%p, %p)\n", ibfd
, obfd
);
846 /* Set private BFD flag information in the BFD @var{abfd}.
847 Return <<true>> on success, <<false>> on error. Possible error
850 o <<bfd_error_no_memory>> -
851 Not enough memory exists to create private data for @var{obfd}. */
854 vms_bfd_set_private_flags (abfd
, flags
)
859 vms_debug (1,"vms_bfd_set_private_flags(%p, %lx)\n", abfd
, (long)flags
);
865 /* Called to copy BFD private section data from one object file
869 vms_bfd_copy_private_section_data (srcbfd
, srcsec
, dstbfd
, dstsec
)
876 vms_debug (1, "vms_bfd_copy_private_section_data(%p, %s, %p, %s)\n",
877 srcbfd
, srcsec
->name
, dstbfd
, dstsec
->name
);
882 /* Called to copy BFD private symbol data from one object file
886 vms_bfd_copy_private_symbol_data (ibfd
, isym
, obfd
, osym
)
893 vms_debug (1, "vms_bfd_copy_private_symbol_data(%p, %s, %p, %s)\n",
894 ibfd
, isym
->name
, obfd
, osym
->name
);
899 /*-- Part 4.3, core file ----------------------------------------------------*/
901 /* Return a read-only string explaining which program was running
902 when it failed and produced the core file abfd. */
905 vms_core_file_failing_command (abfd
)
909 vms_debug (1, "vms_core_file_failing_command(%p)\n", abfd
);
915 /* Returns the signal number which caused the core dump which
916 generated the file the BFD abfd is attached to. */
919 vms_core_file_failing_signal (abfd
)
923 vms_debug (1, "vms_core_file_failing_signal(%p)\n", abfd
);
929 /* Return true if the core file attached to core_bfd was generated
930 by a run of the executable file attached to exec_bfd, false otherwise. */
933 vms_core_file_matches_executable_p (abfd
, bbfd
)
938 vms_debug (1, "vms_core_file_matches_executable_p(%p, %p)\n", abfd
, bbfd
);
943 /*-- Part 4.4, archive ------------------------------------------------------*/
945 /* ??? do something with an archive map.
946 Return false on error, true otherwise. */
949 vms_slurp_armap (abfd
)
953 vms_debug (1, "vms_slurp_armap(%p)\n", abfd
);
959 /* ??? do something with an extended name table.
960 Return false on error, true otherwise. */
963 vms_slurp_extended_name_table (abfd
)
967 vms_debug (1, "vms_slurp_extended_name_table(%p)\n", abfd
);
973 /* ??? do something with an extended name table.
974 Return false on error, true otherwise. */
977 vms_construct_extended_name_table (abfd
, tabloc
, tablen
, name
)
980 bfd_size_type
*tablen
;
984 vms_debug (1, "vms_construct_extended_name_table(%p)\n", abfd
);
990 /* Truncate the name of an archive to match system-dependent restrictions */
993 vms_truncate_arname (abfd
, pathname
, arhdr
)
995 CONST
char *pathname
;
999 vms_debug (1, "vms_truncate_arname(%p, %s, %s)\n", abfd
, pathname
, arhdr
);
1005 /* ??? write archive map */
1008 vms_write_armap (arch
, elength
, map
, orl_count
, stridx
)
1010 unsigned int elength
;
1012 unsigned int orl_count
;
1016 vms_debug (1, "vms_write_armap(%p, %d, %p, %d %d)\n",
1017 arch
, elength
, map
, orl_count
, stridx
);
1022 /* Read archive header ??? */
1025 vms_read_ar_hdr (abfd
)
1029 vms_debug (1, "vms_read_ar_hdr(%p)\n", abfd
);
1035 /* Provided a BFD, @var{archive}, containing an archive and NULL, open
1036 an input BFD on the first contained element and returns that.
1037 Subsequent calls should pass the archive and the previous return value
1038 to return a created BFD to the next contained element.
1039 NULL is returned when there are no more. */
1042 vms_openr_next_archived_file (arch
, prev
)
1047 vms_debug (1, "vms_openr_next_archived_file(%p, %p)\n", arch
, prev
);
1053 /* Return the BFD which is referenced by the symbol in ABFD indexed by
1054 INDEX. INDEX should have been returned by bfd_get_next_mapent. */
1057 vms_get_elt_at_index (abfd
, index
)
1062 vms_debug (1, "vms_get_elt_at_index(%p, %p)\n", abfd
, index
);
1064 return _bfd_generic_get_elt_at_index(abfd
, index
);
1069 -> bfd_generic_stat_arch_elt */
1072 vms_generic_stat_arch_elt (abfd
, stat
)
1077 vms_debug (1, "vms_generic_stat_arch_elt(%p, %p)\n", abfd
, stat
);
1079 return bfd_generic_stat_arch_elt(abfd
, stat
);
1083 /* This is a new function in bfd 2.5 */
1086 vms_update_armap_timestamp (abfd
)
1090 vms_debug (1, "vms_update_armap_timestamp(%p)\n", abfd
);
1095 /*-- Part 4.5, symbols --------------------------------------------------------*/
1097 /* Return the number of bytes required to store a vector of pointers
1098 to asymbols for all the symbols in the BFD abfd, including a
1099 terminal NULL pointer. If there are no symbols in the BFD,
1100 then return 0. If an error occurs, return -1. */
1103 vms_get_symtab_upper_bound (abfd
)
1107 vms_debug (1, "vms_get_symtab_upper_bound(%p), %d symbols\n", abfd
, PRIV(gsd_sym_count
));
1109 return (PRIV(gsd_sym_count
)+1) * sizeof(asymbol
*);
1113 /* Copy symbols from hash table to symbol vector
1115 called from bfd_hash_traverse in vms_get_symtab
1116 init counter to 0 if entry == 0 */
1119 copy_symbols (entry
, arg
)
1120 struct bfd_hash_entry
*entry
;
1123 bfd
*abfd
= (bfd
*) arg
;
1125 if (entry
== NULL
) /* init counter */
1127 else /* fill vector, inc counter */
1128 PRIV(symcache
)[PRIV(symnum
)++] = ((vms_symbol_entry
*)entry
)->symbol
;
1134 /* Read the symbols from the BFD abfd, and fills in the vector
1135 location with pointers to the symbols and a trailing NULL.
1137 return # of symbols read */
1140 vms_get_symtab (abfd
, symbols
)
1145 vms_debug (1, "vms_get_symtab(%p, <ret>)\n", abfd
);
1149 (void)copy_symbols((struct bfd_hash_entry
*)0, abfd
);
1151 /* traverse table and fill symbols vector */
1153 PRIV(symcache
) = symbols
;
1154 bfd_hash_traverse(PRIV(vms_symbol_table
), copy_symbols
, (PTR
)abfd
);
1156 symbols
[PRIV(gsd_sym_count
)] = NULL
;
1158 return PRIV(gsd_sym_count
);
1162 /* Create a new asymbol structure for the BFD abfd and return a pointer
1164 This routine is necessary because each back end has private information
1165 surrounding the asymbol. Building your own asymbol and pointing to it
1166 will not create the private information, and will cause problems later on. */
1169 _bfd_vms_make_empty_symbol (abfd
)
1172 asymbol
*symbol
= (asymbol
*)bfd_zalloc(abfd
, sizeof(asymbol
));
1175 vms_debug (1, "_bfd_vms_make_empty_symbol(%p)\n", abfd
);
1180 bfd_set_error (bfd_error_no_memory
);
1183 symbol
->the_bfd
= abfd
;
1189 /* Print symbol to file according to how. how is one of
1190 bfd_print_symbol_name just print the name
1191 bfd_print_symbol_more print more (???)
1192 bfd_print_symbol_all print all we know, which is not much right now :-) */
1195 vms_print_symbol (abfd
, file
, symbol
, how
)
1199 bfd_print_symbol_type how
;
1202 vms_debug (1, "vms_print_symbol(%p, %p, %p, %d)\n", abfd
, file
, symbol
, how
);
1207 case bfd_print_symbol_name
:
1208 case bfd_print_symbol_more
:
1209 fprintf((FILE *)file
," %s", symbol
->name
);
1214 case bfd_print_symbol_all
:
1216 CONST
char *section_name
= symbol
->section
->name
;
1218 bfd_print_symbol_vandf((PTR
)file
,symbol
);
1220 fprintf((FILE *)file
," %-8s %s", section_name
, symbol
->name
);
1228 /* Return information about symbol in ret.
1230 fill type, value and name
1233 B bss segment symbol
1235 D data segment symbol
1237 t a static function symbol
1238 T text segment symbol
1243 vms_get_symbol_info (abfd
, symbol
, ret
)
1251 vms_debug (1, "vms_get_symbol_info(%p, %p, %p)\n", abfd
, symbol
, ret
);
1254 sec
= symbol
->section
;
1259 if (bfd_is_com_section (sec
))
1261 else if (bfd_is_abs_section (sec
))
1263 else if (bfd_is_und_section (sec
))
1265 else if (bfd_is_ind_section (sec
))
1267 else if (bfd_get_section_flags (abfd
, sec
) & SEC_CODE
)
1269 else if (bfd_get_section_flags (abfd
, sec
) & SEC_DATA
)
1271 else if (bfd_get_section_flags (abfd
, sec
) & SEC_ALLOC
)
1276 if (ret
->type
!= 'U')
1277 ret
->value
= symbol
->value
+ symbol
->section
->vma
;
1280 ret
->name
= symbol
->name
;
1286 /* Return true if the given symbol sym in the BFD abfd is
1287 a compiler generated local label, else return false. */
1290 vms_bfd_is_local_label_name (abfd
, name
)
1295 vms_debug (1, "vms_bfd_is_local_label_name(%p, %s)\n", abfd
, name
);
1297 return name
[0] == '$';
1301 /* Get source line number for symbol */
1304 vms_get_lineno (abfd
, symbol
)
1309 vms_debug (1, "vms_get_lineno(%p, %p)\n", abfd
, symbol
);
1315 /* Provided a BFD, a section and an offset into the section, calculate and
1316 return the name of the source file and the line nearest to the wanted
1320 vms_find_nearest_line (abfd
, section
, symbols
, offset
, file
, func
, line
)
1330 vms_debug (1, "vms_find_nearest_line(%p, %s, %p, %ld, <ret>, <ret>, <ret>)\n",
1331 abfd
, section
->name
, symbols
, (long int)offset
);
1337 /* Back-door to allow format-aware applications to create debug symbols
1338 while using BFD for everything else. Currently used by the assembler
1339 when creating COFF files. */
1342 vms_bfd_make_debug_symbol (abfd
, ptr
, size
)
1348 vms_debug (1, "vms_bfd_make_debug_symbol(%p, %p, %ld)\n", abfd
, ptr
, size
);
1354 /* Read minisymbols. For minisymbols, we use the unmodified a.out
1355 symbols. The minisymbol_to_symbol function translates these into
1356 BFD asymbol structures. */
1359 vms_read_minisymbols (abfd
, dynamic
, minisymsp
, sizep
)
1363 unsigned int *sizep
;
1366 vms_debug (1, "vms_read_minisymbols(%p, %d, %p, %d)\n", abfd
, dynamic
, minisymsp
, *sizep
);
1368 return _bfd_generic_read_minisymbols (abfd
, dynamic
, minisymsp
, sizep
);
1371 /* Convert a minisymbol to a BFD asymbol. A minisymbol is just an
1372 unmodified a.out symbol. The SYM argument is a structure returned
1373 by bfd_make_empty_symbol, which we fill in here. */
1376 vms_minisymbol_to_symbol (abfd
, dynamic
, minisym
, sym
)
1383 vms_debug (1, "vms_minisymbol_to_symbol(%p, %d, %p, %p)\n", abfd
, dynamic
, minisym
, sym
);
1385 return _bfd_generic_minisymbol_to_symbol (abfd
, dynamic
, minisym
, sym
);
1388 /*-- Part 4.6, relocations --------------------------------------------------*/
1390 /* Return the number of bytes required to store the relocation information
1391 associated with section sect attached to bfd abfd.
1392 If an error occurs, return -1. */
1395 vms_get_reloc_upper_bound (abfd
, section
)
1400 vms_debug (1, "vms_get_reloc_upper_bound(%p, %s)\n", abfd
, section
->name
);
1406 /* Call the back end associated with the open BFD abfd and translate the
1407 external form of the relocation information attached to sec into the
1408 internal canonical form. Place the table into memory at loc, which has
1409 been preallocated, usually by a call to bfd_get_reloc_upper_bound.
1410 Returns the number of relocs, or -1 on error. */
1413 vms_canonicalize_reloc (abfd
, section
, location
, symbols
)
1420 vms_debug (1, "vms_canonicalize_reloc(%p, %s, <ret>, <ret>)\n", abfd
, section
->name
);
1425 /*---------------------------------------------------------------------------*/
1426 /* this is just copied from ecoff-alpha, needs to be fixed probably */
1428 /* How to process the various reloc types. */
1430 static bfd_reloc_status_type
1431 reloc_nil (abfd
, reloc
, sym
, data
, sec
, output_bfd
, error_message
)
1438 char **error_message
;
1441 vms_debug (1, "reloc_nil(abfd %p, output_bfd %p)\n", abfd
, output_bfd
);
1442 vms_debug (2, "In section %s, symbol %s\n",
1443 sec
->name
, sym
->name
);
1444 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
1445 reloc
->sym_ptr_ptr
[0]->name
,
1446 (unsigned long)reloc
->address
,
1447 (unsigned long)reloc
->addend
, reloc
->howto
->name
);
1448 vms_debug (2, "data at %p\n", data
);
1449 /* _bfd_hexdump (2, data, bfd_get_reloc_size(reloc->howto),0); */
1452 return bfd_reloc_ok
;
1455 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
1456 from smaller values. Start with zero, widen, *then* decrement. */
1457 #define MINUS_ONE (((bfd_vma)0) - 1)
1459 static reloc_howto_type alpha_howto_table
[] =
1461 HOWTO (ALPHA_R_IGNORE
, /* type */
1463 0, /* size (0 = byte, 1 = short, 2 = long) */
1465 true, /* pc_relative */
1467 complain_overflow_dont
, /* complain_on_overflow */
1468 reloc_nil
, /* special_function */
1469 "IGNORE", /* name */
1470 true, /* partial_inplace */
1473 true), /* pcrel_offset */
1475 /* A 64 bit reference to a symbol. */
1476 HOWTO (ALPHA_R_REFQUAD
, /* type */
1478 4, /* size (0 = byte, 1 = short, 2 = long) */
1480 false, /* pc_relative */
1482 complain_overflow_bitfield
, /* complain_on_overflow */
1483 reloc_nil
, /* special_function */
1484 "REFQUAD", /* name */
1485 true, /* partial_inplace */
1486 MINUS_ONE
, /* src_mask */
1487 MINUS_ONE
, /* dst_mask */
1488 false), /* pcrel_offset */
1490 /* A 21 bit branch. The native assembler generates these for
1491 branches within the text segment, and also fills in the PC
1492 relative offset in the instruction. */
1493 HOWTO (ALPHA_R_BRADDR
, /* type */
1495 2, /* size (0 = byte, 1 = short, 2 = long) */
1497 true, /* pc_relative */
1499 complain_overflow_signed
, /* complain_on_overflow */
1500 reloc_nil
, /* special_function */
1501 "BRADDR", /* name */
1502 true, /* partial_inplace */
1503 0x1fffff, /* src_mask */
1504 0x1fffff, /* dst_mask */
1505 false), /* pcrel_offset */
1507 /* A hint for a jump to a register. */
1508 HOWTO (ALPHA_R_HINT
, /* type */
1510 1, /* size (0 = byte, 1 = short, 2 = long) */
1512 true, /* pc_relative */
1514 complain_overflow_dont
, /* complain_on_overflow */
1515 reloc_nil
, /* special_function */
1517 true, /* partial_inplace */
1518 0x3fff, /* src_mask */
1519 0x3fff, /* dst_mask */
1520 false), /* pcrel_offset */
1522 /* 16 bit PC relative offset. */
1523 HOWTO (ALPHA_R_SREL16
, /* type */
1525 1, /* size (0 = byte, 1 = short, 2 = long) */
1527 true, /* pc_relative */
1529 complain_overflow_signed
, /* complain_on_overflow */
1530 reloc_nil
, /* special_function */
1531 "SREL16", /* name */
1532 true, /* partial_inplace */
1533 0xffff, /* src_mask */
1534 0xffff, /* dst_mask */
1535 false), /* pcrel_offset */
1537 /* 32 bit PC relative offset. */
1538 HOWTO (ALPHA_R_SREL32
, /* type */
1540 2, /* size (0 = byte, 1 = short, 2 = long) */
1542 true, /* pc_relative */
1544 complain_overflow_signed
, /* complain_on_overflow */
1545 reloc_nil
, /* special_function */
1546 "SREL32", /* name */
1547 true, /* partial_inplace */
1548 0xffffffff, /* src_mask */
1549 0xffffffff, /* dst_mask */
1550 false), /* pcrel_offset */
1552 /* A 64 bit PC relative offset. */
1553 HOWTO (ALPHA_R_SREL64
, /* type */
1555 4, /* size (0 = byte, 1 = short, 2 = long) */
1557 true, /* pc_relative */
1559 complain_overflow_signed
, /* complain_on_overflow */
1560 reloc_nil
, /* special_function */
1561 "SREL64", /* name */
1562 true, /* partial_inplace */
1563 MINUS_ONE
, /* src_mask */
1564 MINUS_ONE
, /* dst_mask */
1565 false), /* pcrel_offset */
1567 /* Push a value on the reloc evaluation stack. */
1568 HOWTO (ALPHA_R_OP_PUSH
, /* type */
1570 0, /* size (0 = byte, 1 = short, 2 = long) */
1572 false, /* pc_relative */
1574 complain_overflow_dont
, /* complain_on_overflow */
1575 reloc_nil
, /* special_function */
1576 "OP_PUSH", /* name */
1577 false, /* partial_inplace */
1580 false), /* pcrel_offset */
1582 /* Store the value from the stack at the given address. Store it in
1583 a bitfield of size r_size starting at bit position r_offset. */
1584 HOWTO (ALPHA_R_OP_STORE
, /* type */
1586 4, /* size (0 = byte, 1 = short, 2 = long) */
1588 false, /* pc_relative */
1590 complain_overflow_dont
, /* complain_on_overflow */
1591 reloc_nil
, /* special_function */
1592 "OP_STORE", /* name */
1593 false, /* partial_inplace */
1595 MINUS_ONE
, /* dst_mask */
1596 false), /* pcrel_offset */
1598 /* Subtract the reloc address from the value on the top of the
1599 relocation stack. */
1600 HOWTO (ALPHA_R_OP_PSUB
, /* type */
1602 0, /* size (0 = byte, 1 = short, 2 = long) */
1604 false, /* pc_relative */
1606 complain_overflow_dont
, /* complain_on_overflow */
1607 reloc_nil
, /* special_function */
1608 "OP_PSUB", /* name */
1609 false, /* partial_inplace */
1612 false), /* pcrel_offset */
1614 /* Shift the value on the top of the relocation stack right by the
1616 HOWTO (ALPHA_R_OP_PRSHIFT
, /* type */
1618 0, /* size (0 = byte, 1 = short, 2 = long) */
1620 false, /* pc_relative */
1622 complain_overflow_dont
, /* complain_on_overflow */
1623 reloc_nil
, /* special_function */
1624 "OP_PRSHIFT", /* name */
1625 false, /* partial_inplace */
1628 false), /* pcrel_offset */
1630 /* Hack. Linkage is done by linker. */
1631 HOWTO (ALPHA_R_LINKAGE
, /* type */
1633 8, /* size (0 = byte, 1 = short, 2 = long) */
1635 false, /* pc_relative */
1637 complain_overflow_dont
, /* complain_on_overflow */
1638 reloc_nil
, /* special_function */
1639 "LINKAGE", /* name */
1640 false, /* partial_inplace */
1643 false), /* pcrel_offset */
1645 /* A 32 bit reference to a symbol. */
1646 HOWTO (ALPHA_R_REFLONG
, /* type */
1648 2, /* size (0 = byte, 1 = short, 2 = long) */
1650 false, /* pc_relative */
1652 complain_overflow_bitfield
, /* complain_on_overflow */
1653 reloc_nil
, /* special_function */
1654 "REFLONG", /* name */
1655 true, /* partial_inplace */
1656 0xffffffff, /* src_mask */
1657 0xffffffff, /* dst_mask */
1658 false), /* pcrel_offset */
1660 /* A 64 bit reference to a procedure, written as 32 bit value. */
1661 HOWTO (ALPHA_R_CODEADDR
, /* type */
1663 4, /* size (0 = byte, 1 = short, 2 = long) */
1665 false, /* pc_relative */
1667 complain_overflow_signed
,/* complain_on_overflow */
1668 reloc_nil
, /* special_function */
1669 "CODEADDR", /* name */
1670 false, /* partial_inplace */
1671 0xffffffff, /* src_mask */
1672 0xffffffff, /* dst_mask */
1673 false), /* pcrel_offset */
1677 /* Return a pointer to a howto structure which, when invoked, will perform
1678 the relocation code on data from the architecture noted. */
1680 static const struct reloc_howto_struct
*
1681 vms_bfd_reloc_type_lookup (abfd
, code
)
1683 bfd_reloc_code_real_type code
;
1688 vms_debug (1, "vms_bfd_reloc_type_lookup(%p, %d)\t", abfd
, code
);
1693 case BFD_RELOC_16
: alpha_type
= ALPHA_R_SREL16
; break;
1694 case BFD_RELOC_32
: alpha_type
= ALPHA_R_REFLONG
; break;
1695 case BFD_RELOC_64
: alpha_type
= ALPHA_R_REFQUAD
; break;
1696 case BFD_RELOC_CTOR
: alpha_type
= ALPHA_R_REFQUAD
; break;
1697 case BFD_RELOC_23_PCREL_S2
: alpha_type
= ALPHA_R_BRADDR
; break;
1698 case BFD_RELOC_ALPHA_HINT
: alpha_type
= ALPHA_R_HINT
; break;
1699 case BFD_RELOC_16_PCREL
: alpha_type
= ALPHA_R_SREL16
; break;
1700 case BFD_RELOC_32_PCREL
: alpha_type
= ALPHA_R_SREL32
; break;
1701 case BFD_RELOC_64_PCREL
: alpha_type
= ALPHA_R_SREL64
; break;
1702 case BFD_RELOC_ALPHA_LINKAGE
: alpha_type
= ALPHA_R_LINKAGE
; break;
1703 case BFD_RELOC_ALPHA_CODEADDR
: alpha_type
= ALPHA_R_CODEADDR
; break;
1705 (*_bfd_error_handler
) ("reloc (%d) is *UNKNOWN*", code
);
1706 return (const struct reloc_howto_struct
*) NULL
;
1709 vms_debug (2, "reloc is %s\n", alpha_howto_table
[alpha_type
].name
);
1711 return &alpha_howto_table
[alpha_type
];
1715 /*-- Part 4.7, writing an object file ---------------------------------------*/
1717 /* Set the architecture and machine type in BFD abfd to arch and mach.
1718 Find the correct pointer to a structure and insert it into the arch_info
1722 vms_set_arch_mach (abfd
, arch
, mach
)
1724 enum bfd_architecture arch
;
1728 vms_debug (1, "vms_set_arch_mach(%p, %d, %ld)\n", abfd
, arch
, mach
);
1730 abfd
->arch_info
= bfd_scan_arch("alpha");
1736 /* Sets the contents of the section section in BFD abfd to the data starting
1737 in memory at data. The data is written to the output section starting at
1738 offset offset for count bytes.
1740 Normally true is returned, else false. Possible error returns are:
1741 o bfd_error_no_contents - The output section does not have the
1742 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
1743 o and some more too */
1746 vms_set_section_contents (abfd
, section
, location
, offset
, count
)
1751 bfd_size_type count
;
1754 vms_debug (1, "vms_set_section_contents(%p, sec %s, loc %p, off %ld, count %d)\n",
1755 abfd
, section
->name
, location
, (long int)offset
, (int)count
);
1756 vms_debug (2, "secraw %d, seccooked %d\n", (int)section
->_raw_size
, (int)section
->_cooked_size
);
1758 return _bfd_save_vms_section(abfd
, section
, location
, offset
, count
);
1762 /*-- Part 4.8, linker -------------------------------------------------------*/
1764 /* Get the size of the section headers. */
1767 vms_sizeof_headers (abfd
, reloc
)
1772 vms_debug (1, "vms_sizeof_headers(%p, %s)\n", abfd
, (reloc
)?"True":"False");
1778 /* Provides default handling of relocation effort for back ends
1779 which can't be bothered to do it efficiently. */
1782 vms_bfd_get_relocated_section_contents (abfd
, link_info
, link_order
, data
,
1783 relocateable
, symbols
)
1785 struct bfd_link_info
*link_info
;
1786 struct bfd_link_order
*link_order
;
1788 boolean relocateable
;
1792 vms_debug (1, "vms_bfd_get_relocated_section_contents(%p, %p, %p, %p, %s, %p)\n",
1793 abfd
, link_info
, link_order
, data
, (relocateable
)?"True":"False", symbols
);
1802 vms_bfd_relax_section (abfd
, section
, link_info
, again
)
1805 struct bfd_link_info
*link_info
;
1809 vms_debug (1, "vms_bfd_relax_section(%p, %s, %p, <ret>)\n",
1810 abfd
, section
->name
, link_info
);
1816 vms_bfd_gc_sections (abfd
, link_info
)
1818 struct bfd_link_info
*link_info
;
1821 vms_debug (1, "vms_bfd_gc_sections(%p, %p)\n", abfd
, link_info
);
1827 /* Create a hash table for the linker. Different backends store
1828 different information in this table. */
1830 static struct bfd_link_hash_table
*
1831 vms_bfd_link_hash_table_create (abfd
)
1835 vms_debug (1, "vms_bfd_link_hash_table_create(%p)\n", abfd
);
1841 /* Add symbols from this object file into the hash table. */
1844 vms_bfd_link_add_symbols (abfd
, link_info
)
1846 struct bfd_link_info
*link_info
;
1849 vms_debug (1, "vms_bfd_link_add_symbols(%p, %p)\n", abfd
, link_info
);
1855 /* Do a link based on the link_order structures attached to each
1856 section of the BFD. */
1859 vms_bfd_final_link (abfd
, link_info
)
1861 struct bfd_link_info
*link_info
;
1864 vms_debug (1, "vms_bfd_final_link(%p, %p)\n", abfd
, link_info
);
1869 /* Should this section be split up into smaller pieces during linking. */
1872 vms_bfd_link_split_section (abfd
, section
)
1877 vms_debug (1, "vms_bfd_link_split_section(%p, %s)\n", abfd
, section
->name
);
1882 /*-- Part 4.9, dynamic symbols and relocations ------------------------------*/
1884 /* Get the amount of memory required to hold the dynamic symbols. */
1887 vms_get_dynamic_symtab_upper_bound (abfd
)
1891 vms_debug (1, "vms_get_dynamic_symtab_upper_bound(%p)\n", abfd
);
1897 vms_bfd_print_private_bfd_data (abfd
, file
)
1902 vms_debug (1, "vms_bfd_print_private_bfd_data(%p)\n", abfd
);
1908 /* Read in the dynamic symbols. */
1911 vms_canonicalize_dynamic_symtab (abfd
, symbols
)
1916 vms_debug (1, "vms_canonicalize_dynamic_symtab(%p, <ret>)\n", abfd
);
1922 /* Get the amount of memory required to hold the dynamic relocs. */
1925 vms_get_dynamic_reloc_upper_bound (abfd
)
1929 vms_debug (1, "vms_get_dynamic_reloc_upper_bound(%p)\n", abfd
);
1935 /* Read in the dynamic relocs. */
1938 vms_canonicalize_dynamic_reloc (abfd
, arel
, symbols
)
1944 vms_debug (1, "vms_canonicalize_dynamic_reloc(%p)\n", abfd
);