* elf32-ppc.c (ppc_elf_relax_section): Correct conditions under
[binutils.git] / bfd / vms.c
blob5bb60af9708e69deb946115022265b0b160a5836
1 /* vms.c -- BFD back-end for VAX (openVMS/VAX) and
2 EVAX (openVMS/Alpha) files.
3 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
6 Main file.
8 Written by Klaus K"ampf (kkaempf@rmi.de)
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
25 #ifdef VMS
26 #include <rms.h>
27 #include <starlet.h>
28 #define RME$C_SETRFM 0x00000001
29 #include <unistd.h>
30 #endif
32 #include "sysdep.h"
33 #include "bfd.h"
34 #include "bfdlink.h"
35 #include "libbfd.h"
37 #include "vms.h"
39 static bfd_boolean vms_initialize (bfd *);
40 static bfd_boolean fill_section_ptr (struct bfd_hash_entry *, PTR);
41 static bfd_boolean vms_fixup_sections (bfd *);
42 static bfd_boolean copy_symbols (struct bfd_hash_entry *, PTR);
43 static bfd_reloc_status_type reloc_nil (bfd *, arelent *, asymbol *, PTR,
44 asection *, bfd *, char **);
45 static int vms_slurp_module (bfd *abfd);
46 static int vms_slurp_image (bfd *abfd);
47 static const struct bfd_target *vms_object_p (bfd *abfd);
48 static const struct bfd_target *vms_archive_p (bfd *abfd);
49 static bfd_boolean vms_mkobject (bfd *abfd);
50 static bfd_boolean vms_write_object_contents (bfd *abfd);
51 static void free_reloc_stream (bfd *abfd, asection *section, void *data);
52 static bfd_boolean vms_close_and_cleanup (bfd *abfd);
53 static bfd_boolean vms_bfd_free_cached_info (bfd *abfd);
54 static bfd_boolean vms_new_section_hook (bfd *abfd, asection *section);
55 static bfd_boolean vms_get_section_contents
56 (bfd *abfd, asection *section, PTR x1, file_ptr x2, bfd_size_type x3);
57 static bfd_boolean vms_get_section_contents_in_window
58 (bfd *abfd, asection *section, bfd_window *w, file_ptr offset,
59 bfd_size_type count);
60 static bfd_boolean vms_bfd_copy_private_bfd_data (bfd *src, bfd *dest);
61 static bfd_boolean vms_bfd_copy_private_section_data
62 (bfd *srcbfd, asection *srcsec, bfd *dstbfd, asection *dstsec);
63 static bfd_boolean vms_bfd_copy_private_symbol_data
64 (bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym);
65 static bfd_boolean vms_bfd_print_private_bfd_data (bfd *abfd, void *file);
66 static char *vms_core_file_failing_command (bfd *abfd);
67 static int vms_core_file_failing_signal (bfd *abfd);
68 static bfd_boolean vms_core_file_matches_executable_p (bfd *abfd, bfd *bbfd);
69 static bfd_boolean vms_slurp_armap (bfd *abfd);
70 static bfd_boolean vms_slurp_extended_name_table (bfd *abfd);
71 static bfd_boolean vms_construct_extended_name_table
72 (bfd *abfd, char **tabloc, bfd_size_type *tablen, const char **name);
73 static void vms_truncate_arname (bfd *abfd, const char *pathname, char *arhdr);
74 static bfd_boolean vms_write_armap
75 (bfd *arch, unsigned int elen, struct orl *map, unsigned int cnt, int idx);
76 static PTR vms_read_ar_hdr (bfd *abfd);
77 static bfd *vms_get_elt_at_index (bfd *abfd, symindex index);
78 static bfd *vms_openr_next_archived_file (bfd *arch, bfd *prev);
79 static bfd_boolean vms_update_armap_timestamp (bfd *abfd);
80 static int vms_generic_stat_arch_elt (bfd *, struct stat *);
81 static long vms_get_symtab_upper_bound (bfd *abfd);
82 static long vms_canonicalize_symtab (bfd *abfd, asymbol **symbols);
83 static void vms_print_symbol (bfd *abfd, PTR file, asymbol *symbol,
84 bfd_print_symbol_type how);
85 static void vms_get_symbol_info (bfd *abfd, asymbol *symbol, symbol_info *ret);
86 static bfd_boolean vms_bfd_is_local_label_name (bfd *abfd, const char *);
87 static alent *vms_get_lineno (bfd *abfd, asymbol *symbol);
88 static bfd_boolean vms_find_nearest_line
89 (bfd *abfd, asection *section, asymbol **symbols, bfd_vma offset,
90 const char **file, const char **func, unsigned int *line);
91 static asymbol *vms_bfd_make_debug_symbol (bfd *abfd, void *ptr,
92 unsigned long size);
93 static long vms_read_minisymbols (bfd *abfd, bfd_boolean dynamic,
94 PTR *minisymsp, unsigned int *sizep);
95 static asymbol *vms_minisymbol_to_symbol
96 (bfd *abfd, bfd_boolean dynamic, const PTR minisym, asymbol *sym);
97 static void alloc_reloc_stream (bfd *abfd, asection *section,
98 void *alloc_error);
99 static bfd_boolean vms_slurp_reloc_table (bfd *abfd, asection *section,
100 asymbol **symbols);
101 static long vms_get_reloc_upper_bound (bfd *abfd, asection *sect);
102 static long vms_canonicalize_reloc (bfd *abfd, asection *srcsec,
103 arelent **location, asymbol **symbols);
104 static const struct reloc_howto_struct *vms_bfd_reloc_type_lookup
105 (bfd *abfd, bfd_reloc_code_real_type code);
106 static bfd_boolean vms_set_arch_mach
107 (bfd *abfd, enum bfd_architecture arch, unsigned long mach);
108 static bfd_boolean vms_set_section_contents
109 (bfd *abfd, asection *section, const PTR location, file_ptr offset,
110 bfd_size_type count);
111 static int vms_sizeof_headers (bfd *abfd,
112 struct bfd_link_info *info ATTRIBUTE_UNUSED);
113 static bfd_byte *vms_bfd_get_relocated_section_contents
114 (bfd *abfd, struct bfd_link_info *link_info,
115 struct bfd_link_order *link_order, bfd_byte *data,
116 bfd_boolean relocatable, asymbol **symbols);
117 static bfd_boolean vms_bfd_relax_section
118 (bfd *abfd, asection *section, struct bfd_link_info *link_info,
119 bfd_boolean *again);
120 static bfd_boolean vms_bfd_gc_sections
121 (bfd *abfd, struct bfd_link_info *link_info);
122 static bfd_boolean vms_bfd_merge_sections
123 (bfd *abfd, struct bfd_link_info *link_info);
124 static struct bfd_link_hash_table *vms_bfd_link_hash_table_create (bfd *abfd);
125 static void vms_bfd_link_hash_table_free (struct bfd_link_hash_table *hash);
126 static bfd_boolean vms_bfd_link_add_symbols
127 (bfd *abfd, struct bfd_link_info *link_info);
128 static bfd_boolean vms_bfd_final_link (bfd *abfd,
129 struct bfd_link_info *link_info);
130 static bfd_boolean vms_bfd_link_split_section (bfd *abfd, asection *section);
131 static long vms_get_dynamic_symtab_upper_bound (bfd *abfd);
132 static long vms_canonicalize_dynamic_symtab (bfd *abfd, asymbol **symbols);
133 static long vms_get_dynamic_reloc_upper_bound (bfd *abfd);
134 static long vms_canonicalize_dynamic_reloc
135 (bfd *abfd, arelent **arel, asymbol **symbols);
136 static bfd_boolean vms_bfd_merge_private_bfd_data (bfd *ibfd, bfd *obfd);
137 static bfd_boolean vms_bfd_set_private_flags (bfd *abfd, flagword flags);
139 #define vms_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
140 #define vms_make_empty_symbol _bfd_generic_make_empty_symbol
141 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms
142 #define vms_bfd_is_group_section bfd_generic_is_group_section
143 #define vms_bfd_discard_group bfd_generic_discard_group
144 #define vms_section_already_linked _bfd_generic_section_already_linked
145 #define vms_bfd_define_common_symbol bfd_generic_define_common_symbol
146 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
147 #define vms_get_synthetic_symtab _bfd_nodynamic_get_synthetic_symtab
150 #ifdef VMS_DEBUG
151 /* Cause debug info to be emitted for the structure. */
152 struct vms_private_data_struct _vms_private_data_struct_dummy;
153 struct vms_section_data_struct _vms_section_data_struct_dummy;
154 #endif
156 extern const bfd_target vms_vax_vec;
157 extern const bfd_target vms_alpha_vec;
159 /* Initialize private data */
160 static bfd_boolean
161 vms_initialize (bfd * abfd)
163 bfd_size_type amt;
165 bfd_set_start_address (abfd, (bfd_vma) -1);
167 amt = sizeof (struct vms_private_data_struct);
168 abfd->tdata.any = bfd_zalloc (abfd, amt);
169 if (abfd->tdata.any == NULL)
170 return FALSE;
172 if (bfd_get_flavour (abfd) == bfd_target_ovax_flavour)
173 PRIV (is_vax) = TRUE;
175 PRIV (file_format) = FF_UNKNOWN;
177 amt = sizeof (struct stack_struct) * STACKSIZE;
178 PRIV (stack) = bfd_alloc (abfd, amt);
179 if (PRIV (stack) == NULL)
180 goto error_ret1;
182 amt = sizeof (struct bfd_hash_table);
183 PRIV (vms_symbol_table) = bfd_alloc (abfd, amt);
184 if (PRIV (vms_symbol_table) == NULL)
185 goto error_ret1;
187 if (!bfd_hash_table_init (PRIV (vms_symbol_table), _bfd_vms_hash_newfunc,
188 sizeof (vms_symbol_entry)))
189 goto error_ret1;
191 amt = MAX_OUTREC_SIZE;
192 PRIV (output_buf) = bfd_alloc (abfd, amt);
193 if (PRIV (output_buf) == NULL)
194 goto error_ret2;
196 PRIV (length_pos) = 2;
198 return TRUE;
200 error_ret2:
201 bfd_hash_table_free (PRIV (vms_symbol_table));
202 error_ret1:
203 bfd_release (abfd, abfd->tdata.any);
204 abfd->tdata.any = NULL;
205 return FALSE;
208 struct pair
210 unsigned int section_count;
211 asection **sections;
214 /* Fill symbol->section with section pointer.
216 symbol->section is filled with the section index for defined symbols
217 during reading the GSD/EGSD section. But we need the pointer to the
218 bfd section later.
220 It has the correct value for referenced (undefined section) symbols.
222 Called from bfd_hash_traverse in vms_fixup_sections. */
224 static bfd_boolean
225 fill_section_ptr (struct bfd_hash_entry *entry, void *sections)
227 asymbol *sym = ((vms_symbol_entry *)entry)->symbol;
228 struct pair *data = (struct pair *)sections;
229 unsigned long sec = (unsigned long)sym->section;
231 #if VMS_DEBUG
232 vms_debug (6, "fill_section_ptr: sym %p, sec %p\n", sym, sec);
233 #endif
235 if (sec < data->section_count)
237 sym->section = data->sections[sec];
239 if (strcmp (sym->name, sym->section->name) == 0)
240 sym->flags |= BSF_SECTION_SYM;
242 else if (sec == (unsigned long)-1)
243 sym->section = &bfd_und_section;
245 return TRUE;
248 /* Fixup section pointers in symbols. */
249 static bfd_boolean
250 vms_fixup_sections (bfd * abfd)
252 struct pair data;
254 if (PRIV (fixup_done))
255 return TRUE;
257 data.section_count = PRIV (section_count);
258 data.sections = PRIV (sections);
259 bfd_hash_traverse (PRIV (vms_symbol_table), fill_section_ptr, &data);
261 PRIV (fixup_done) = TRUE;
262 return TRUE;
265 /* Slurp an ordered set of VMS object records. */
267 _bfd_vms_slurp_object_records (bfd * abfd)
269 int err, new_type, type = -1;
273 #if VMS_DEBUG
274 vms_debug (7, "reading at %08lx\n", bfd_tell (abfd));
275 #endif
276 new_type = _bfd_vms_get_object_record (abfd);
277 if (new_type < 0)
279 #if VMS_DEBUG
280 vms_debug (2, "next_record failed\n");
281 #endif
282 return -1;
285 if (type == EOBJ_S_C_EGSD && new_type != EOBJ_S_C_EGSD)
287 if (! vms_fixup_sections (abfd))
289 #if VMS_DEBUG
290 vms_debug (2, "vms_fixup_sections failed\n");
291 #endif
292 return -1;
296 type = new_type;
298 switch (type)
300 case OBJ_S_C_HDR:
301 case EOBJ_S_C_EMH:
302 err = _bfd_vms_slurp_hdr (abfd, type);
303 break;
304 case OBJ_S_C_EOM:
305 case OBJ_S_C_EOMW:
306 case EOBJ_S_C_EEOM:
307 err = _bfd_vms_slurp_eom (abfd, type);
308 break;
309 case OBJ_S_C_GSD:
310 case EOBJ_S_C_EGSD:
311 err = _bfd_vms_slurp_gsd (abfd, type);
312 break;
313 case OBJ_S_C_TIR:
314 case EOBJ_S_C_ETIR:
315 err = _bfd_vms_slurp_tir (abfd, type);
316 break;
317 case OBJ_S_C_DBG:
318 case EOBJ_S_C_EDBG:
319 err = _bfd_vms_slurp_dbg (abfd, type);
320 PRIV (dst_ptr_end) = PRIV (image_ptr);
321 break;
322 case OBJ_S_C_TBT:
323 case EOBJ_S_C_ETBT:
324 err = _bfd_vms_slurp_tbt (abfd, type);
325 PRIV (dst_ptr_end) = PRIV (image_ptr);
326 break;
327 case OBJ_S_C_LNK:
328 err = _bfd_vms_slurp_lnk (abfd, type);
329 break;
330 default:
331 err = -1;
333 if (err != 0)
335 #if VMS_DEBUG
336 vms_debug (2, "slurp type %d failed with %d\n", type, err);
337 #endif
338 return err;
341 while (type != EOBJ_S_C_EEOM && type != OBJ_S_C_EOM && type != OBJ_S_C_EOMW);
343 return 0;
346 /* Slurp a VMS module and return an error status. */
348 static int
349 vms_slurp_module (bfd *abfd)
351 int type, err;
353 if (PRIV (is_vax))
354 type = PRIV (vms_rec)[0];
355 else
356 type = bfd_getl16 (PRIV (vms_rec));
358 err = _bfd_vms_slurp_hdr (abfd, type);
359 if (err != 0)
361 bfd_set_error (bfd_error_wrong_format);
362 return err;
365 return _bfd_vms_slurp_object_records (abfd);
368 /* Slurp a VMS image and return an error status. */
370 static int
371 vms_slurp_image (bfd *abfd)
373 unsigned int isd_offset, ihs_offset;
374 int err;
376 err = _bfd_vms_slurp_ihd (abfd, &isd_offset, &ihs_offset);
377 if (err != 0)
379 bfd_set_error (bfd_error_wrong_format);
380 return err;
383 err = _bfd_vms_slurp_isd (abfd, isd_offset);
384 if (err != 0)
386 bfd_set_error (bfd_error_wrong_format);
387 return err;
390 return _bfd_vms_slurp_ihs (abfd, ihs_offset);
393 /* Check the format for a file being read.
394 Return a (bfd_target *) if it's an object file or zero if not. */
396 static const struct bfd_target *
397 vms_object_p (bfd *abfd)
399 const struct bfd_target *target_vector;
400 const bfd_arch_info_type *arch;
401 PTR tdata_save = abfd->tdata.any;
402 bfd_vma saddr_save = bfd_get_start_address (abfd);
403 int err = 0;
405 #if VMS_DEBUG
406 vms_debug (1, "vms_object_p(%p)\n", abfd);
407 #endif
409 if (!vms_initialize (abfd))
410 goto error_ret;
412 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET))
413 goto err_wrong_format;
415 switch (_bfd_vms_get_first_record (abfd))
417 case FT_UNKNOWN:
418 default:
419 err = -1;
420 break;
422 case FT_MODULE:
423 err = vms_slurp_module (abfd);
424 break;
426 case FT_IMAGE:
427 err = vms_slurp_image (abfd);
428 break;
431 if (err != 0)
432 goto err_wrong_format;
434 if (PRIV (is_vax))
436 if (! vms_fixup_sections (abfd))
438 #if VMS_DEBUG
439 vms_debug (2, "vms_fixup_sections failed\n");
440 #endif
441 goto err_wrong_format;
444 target_vector = &vms_vax_vec;
445 arch = bfd_scan_arch ("vax");
447 #if VMS_DEBUG
448 vms_debug (2, "arch is vax\n");
449 #endif
451 else
453 /* Set arch_info to alpha. */
454 target_vector = &vms_alpha_vec;
455 arch = bfd_scan_arch ("alpha");
456 #if VMS_DEBUG
457 vms_debug (2, "arch is alpha\n");
458 #endif
461 abfd->arch_info = arch;
462 return target_vector;
464 err_wrong_format:
465 bfd_set_error (bfd_error_wrong_format);
467 error_ret:
468 if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
469 bfd_release (abfd, abfd->tdata.any);
470 abfd->tdata.any = tdata_save;
471 bfd_set_start_address (abfd, saddr_save);
472 return NULL;
475 /* Check the format for a file being read.
476 Return a (bfd_target *) if it's an archive file or zero. */
478 static const struct bfd_target *
479 vms_archive_p (bfd * abfd ATTRIBUTE_UNUSED)
481 #if VMS_DEBUG
482 vms_debug (1, "vms_archive_p (%p)\n", abfd);
483 #endif
485 return NULL;
488 /* Set the format of a file being written. */
490 static bfd_boolean
491 vms_mkobject (bfd * abfd)
493 const bfd_arch_info_type *arch;
495 #if VMS_DEBUG
496 vms_debug (1, "vms_mkobject (%p)\n", abfd);
497 #endif
499 if (!vms_initialize (abfd))
500 return FALSE;
502 if (PRIV (is_vax))
503 arch = bfd_scan_arch ("vax");
504 else
505 arch = bfd_scan_arch ("alpha");
507 if (arch == 0)
509 bfd_set_error(bfd_error_wrong_format);
510 return FALSE;
513 abfd->arch_info = arch;
514 return TRUE;
517 /* Write cached information into a file being written, at bfd_close. */
519 static bfd_boolean
520 vms_write_object_contents (bfd * abfd)
522 #if VMS_DEBUG
523 vms_debug (1, "vms_write_object_contents (%p)\n", abfd);
524 #endif
526 if (abfd->section_count > 0) /* we have sections */
528 if (PRIV (is_vax))
530 if (_bfd_vms_write_hdr (abfd, OBJ_S_C_HDR) != 0)
531 return FALSE;
532 if (_bfd_vms_write_gsd (abfd, OBJ_S_C_GSD) != 0)
533 return FALSE;
534 if (_bfd_vms_write_tir (abfd, OBJ_S_C_TIR) != 0)
535 return FALSE;
536 if (_bfd_vms_write_tbt (abfd, OBJ_S_C_TBT) != 0)
537 return FALSE;
538 if (_bfd_vms_write_dbg (abfd, OBJ_S_C_DBG) != 0)
539 return FALSE;
540 if (abfd->section_count > 255)
542 if (_bfd_vms_write_eom (abfd, OBJ_S_C_EOMW) != 0)
543 return FALSE;
545 else
547 if (_bfd_vms_write_eom (abfd, OBJ_S_C_EOM) != 0)
548 return FALSE;
551 else
553 if (_bfd_vms_write_hdr (abfd, EOBJ_S_C_EMH) != 0)
554 return FALSE;
555 if (_bfd_vms_write_gsd (abfd, EOBJ_S_C_EGSD) != 0)
556 return FALSE;
557 if (_bfd_vms_write_tir (abfd, EOBJ_S_C_ETIR) != 0)
558 return FALSE;
559 if (_bfd_vms_write_tbt (abfd, EOBJ_S_C_ETBT) != 0)
560 return FALSE;
561 if (_bfd_vms_write_dbg (abfd, EOBJ_S_C_EDBG) != 0)
562 return FALSE;
563 if (_bfd_vms_write_eom (abfd, EOBJ_S_C_EEOM) != 0)
564 return FALSE;
567 return TRUE;
570 /* 4.1, generic. */
572 /* Free the reloc buffer for the specified section. */
574 static void
575 free_reloc_stream (bfd *abfd ATTRIBUTE_UNUSED, asection *section,
576 void *data ATTRIBUTE_UNUSED)
578 if (vms_section_data (section)->reloc_stream)
579 free (vms_section_data (section)->reloc_stream);
582 #ifdef VMS
583 /* Convert the file to variable record length format. This is done
584 using undocumented system call sys$modify().
585 Pure VMS version. */
587 static void
588 vms_convert_to_var (char *vms_filename)
590 struct FAB fab = cc$rms_fab;
592 fab.fab$l_fna = vms_filename;
593 fab.fab$b_fns = strlen (vms_filename);
594 fab.fab$b_fac = FAB$M_PUT;
595 fab.fab$l_fop = FAB$M_ESC;
596 fab.fab$l_ctx = RME$C_SETRFM;
598 sys$open (&fab);
600 fab.fab$b_rfm = FAB$C_VAR;
602 sys$modify (&fab);
603 sys$close (&fab);
606 static int
607 vms_convert_to_var_1 (char *filename, int type)
609 if (type != DECC$K_FILE)
610 return FALSE;
611 vms_convert_to_var (filename);
612 return TRUE;
615 /* Convert the file to variable record length format. This is done
616 using undocumented system call sys$modify().
617 Unix filename version. */
619 static int
620 vms_convert_to_var_unix_filename (const char *unix_filename)
622 if (decc$to_vms (unix_filename, &vms_convert_to_var_1, 0, 1) != 1)
623 return FALSE;
624 return TRUE;
626 #endif /* VMS */
628 /* Called when the BFD is being closed to do any necessary cleanup. */
630 static bfd_boolean
631 vms_close_and_cleanup (bfd * abfd)
633 #if VMS_DEBUG
634 vms_debug (1, "vms_close_and_cleanup (%p)\n", abfd);
635 #endif
636 if (abfd == NULL || abfd->tdata.any == NULL)
637 return TRUE;
639 if (PRIV (vms_buf) != NULL)
640 free (PRIV (vms_buf));
642 if (PRIV (sections) != NULL)
643 free (PRIV (sections));
645 if (PRIV (vms_symbol_table))
646 bfd_hash_table_free (PRIV (vms_symbol_table));
648 bfd_map_over_sections (abfd, free_reloc_stream, NULL);
650 bfd_release (abfd, abfd->tdata.any);
651 abfd->tdata.any = NULL;
653 #ifdef VMS
654 if (abfd->direction == write_direction)
656 /* Last step on VMS is to convert the file to variable record length
657 format. */
658 if (bfd_cache_close (abfd) != TRUE)
659 return FALSE;
660 if (vms_convert_to_var_unix_filename (abfd->filename) != TRUE)
661 return FALSE;
663 #endif
665 return TRUE;
668 /* Ask the BFD to free all cached information. */
670 static bfd_boolean
671 vms_bfd_free_cached_info (bfd * abfd ATTRIBUTE_UNUSED)
673 #if VMS_DEBUG
674 vms_debug (1, "vms_bfd_free_cached_info (%p)\n", abfd);
675 #endif
676 return TRUE;
679 /* Called when a new section is created. */
681 static bfd_boolean
682 vms_new_section_hook (bfd * abfd, asection *section)
684 bfd_size_type amt;
686 /* Count hasn't been incremented yet. */
687 unsigned int section_count = abfd->section_count + 1;
689 #if VMS_DEBUG
690 vms_debug (1, "vms_new_section_hook (%p, [%d]%s), count %d\n",
691 abfd, section->index, section->name, section_count);
692 #endif
694 bfd_set_section_alignment (abfd, section, 0);
696 if (section_count > PRIV (section_count))
698 bfd_size_type amt = section_count;
699 amt *= sizeof (asection *);
700 PRIV (sections) = bfd_realloc_or_free (PRIV (sections), amt);
701 if (PRIV (sections) == NULL)
702 return FALSE;
703 PRIV (section_count) = section_count;
706 #if VMS_DEBUG
707 vms_debug (6, "section_count: %d\n", PRIV (section_count));
708 #endif
710 PRIV (sections)[section->index] = section;
712 #if VMS_DEBUG
713 vms_debug (7, "%d: %s\n", section->index, section->name);
714 #endif
716 amt = sizeof (struct vms_section_data_struct);
717 section->used_by_bfd = (PTR) bfd_zalloc (abfd, amt);
718 if (section->used_by_bfd == NULL)
719 return FALSE;
721 return _bfd_generic_new_section_hook (abfd, section);
724 /* Read the contents of a section.
725 buf points to a buffer of buf_size bytes to be filled with
726 section data (starting at offset into section) */
728 static bfd_boolean
729 vms_get_section_contents (bfd * abfd ATTRIBUTE_UNUSED,
730 asection *section ATTRIBUTE_UNUSED,
731 void * buf ATTRIBUTE_UNUSED,
732 file_ptr offset ATTRIBUTE_UNUSED,
733 bfd_size_type buf_size ATTRIBUTE_UNUSED)
735 bfd_size_type size = section->size;
737 #if VMS_DEBUG
738 vms_debug (1, "vms_get_section_contents (%p, %s, %p, off %ld, size %d)\n",
739 abfd, section->name, buf, offset, (int)buf_size);
740 #endif
742 if (section->contents)
743 abort ();
745 section->contents = (unsigned char *) bfd_malloc (size);
747 if (section->contents == NULL)
749 bfd_set_error (bfd_error_no_memory);
750 return FALSE;
753 if (bfd_seek (abfd, section->filepos, SEEK_SET))
755 bfd_set_error (bfd_error_file_truncated);
756 return FALSE;
759 if (bfd_bread (section->contents, size, abfd) != size)
761 bfd_set_error (bfd_error_file_truncated);
762 return FALSE;
765 section->flags |= SEC_IN_MEMORY;
767 if (buf)
768 memcpy (buf, section->contents + offset, (size_t) buf_size);
770 return TRUE;
773 /* Read the contents of a section.
774 buf points to a buffer of buf_size bytes to be filled with
775 section data (starting at offset into section). */
777 static bfd_boolean
778 vms_get_section_contents_in_window (bfd * abfd ATTRIBUTE_UNUSED,
779 asection *section ATTRIBUTE_UNUSED,
780 bfd_window *w ATTRIBUTE_UNUSED,
781 file_ptr offset ATTRIBUTE_UNUSED,
782 bfd_size_type count ATTRIBUTE_UNUSED)
784 #if VMS_DEBUG
785 vms_debug (1, "vms_get_section_contents_in_window (%p, %s, %p, off %ld, count %d)\n",
786 abfd, section->name, w, offset, (int)count);
787 #endif
789 /* Shouldn't be called, since all sections are IN_MEMORY. */
790 return FALSE;
793 /* Part 4.2, copy private data. */
795 /* Called to copy BFD general private data from one object file
796 to another. */
798 static bfd_boolean
799 vms_bfd_copy_private_bfd_data (bfd *src ATTRIBUTE_UNUSED,
800 bfd *dest ATTRIBUTE_UNUSED)
802 #if VMS_DEBUG
803 vms_debug (1, "vms_bfd_copy_private_bfd_data (%p, %p)\n", src, dest);
804 #endif
805 return TRUE;
808 /* Merge private BFD information from the BFD @var{ibfd} to the
809 the output file BFD @var{obfd} when linking. Return <<TRUE>>
810 on success, <<FALSE>> on error. Possible error returns are:
812 o <<bfd_error_no_memory>> -
813 Not enough memory exists to create private data for @var{obfd}. */
815 static bfd_boolean
816 vms_bfd_merge_private_bfd_data (bfd * ibfd ATTRIBUTE_UNUSED,
817 bfd * obfd ATTRIBUTE_UNUSED)
819 #if VMS_DEBUG
820 vms_debug (1,"vms_bfd_merge_private_bfd_data (%p, %p)\n", ibfd, obfd);
821 #endif
822 return TRUE;
825 /* Set private BFD flag information in the BFD @var{abfd}.
826 Return <<TRUE>> on success, <<FALSE>> on error. Possible error
827 returns are:
829 o <<bfd_error_no_memory>> -
830 Not enough memory exists to create private data for @var{obfd}. */
832 static bfd_boolean
833 vms_bfd_set_private_flags (bfd * abfd ATTRIBUTE_UNUSED,
834 flagword flags ATTRIBUTE_UNUSED)
836 #if VMS_DEBUG
837 vms_debug (1,"vms_bfd_set_private_flags (%p, %lx)\n", abfd, (long)flags);
838 #endif
839 return TRUE;
842 /* Called to copy BFD private section data from one object file
843 to another. */
845 static bfd_boolean
846 vms_bfd_copy_private_section_data (bfd *srcbfd ATTRIBUTE_UNUSED,
847 asection *srcsec ATTRIBUTE_UNUSED,
848 bfd *dstbfd ATTRIBUTE_UNUSED,
849 asection *dstsec ATTRIBUTE_UNUSED)
851 #if VMS_DEBUG
852 vms_debug (1, "vms_bfd_copy_private_section_data (%p, %s, %p, %s)\n",
853 srcbfd, srcsec->name, dstbfd, dstsec->name);
854 #endif
855 return TRUE;
858 /* Called to copy BFD private symbol data from one object file
859 to another. */
861 static bfd_boolean
862 vms_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
863 asymbol *isym ATTRIBUTE_UNUSED,
864 bfd *obfd ATTRIBUTE_UNUSED,
865 asymbol *osym ATTRIBUTE_UNUSED)
867 #if VMS_DEBUG
868 vms_debug (1, "vms_bfd_copy_private_symbol_data (%p, %s, %p, %s)\n",
869 ibfd, isym->name, obfd, osym->name);
870 #endif
871 return TRUE;
874 /* Part 4.3, core file. */
876 /* Return a read-only string explaining which program was running
877 when it failed and produced the core file abfd. */
879 static char *
880 vms_core_file_failing_command (bfd * abfd ATTRIBUTE_UNUSED)
882 #if VMS_DEBUG
883 vms_debug (1, "vms_core_file_failing_command (%p)\n", abfd);
884 #endif
885 return NULL;
888 /* Returns the signal number which caused the core dump which
889 generated the file the BFD abfd is attached to. */
891 static int
892 vms_core_file_failing_signal (bfd * abfd ATTRIBUTE_UNUSED)
894 #if VMS_DEBUG
895 vms_debug (1, "vms_core_file_failing_signal (%p)\n", abfd);
896 #endif
897 return 0;
900 /* Return TRUE if the core file attached to core_bfd was generated
901 by a run of the executable file attached to exec_bfd, FALSE otherwise. */
903 static bfd_boolean
904 vms_core_file_matches_executable_p (bfd * abfd ATTRIBUTE_UNUSED,
905 bfd *bbfd ATTRIBUTE_UNUSED)
907 #if VMS_DEBUG
908 vms_debug (1, "vms_core_file_matches_executable_p (%p, %p)\n", abfd, bbfd);
909 #endif
910 return FALSE;
913 /* Part 4.4, archive. */
915 /* ??? do something with an archive map.
916 Return FALSE on error, TRUE otherwise. */
918 static bfd_boolean
919 vms_slurp_armap (bfd * abfd ATTRIBUTE_UNUSED)
921 #if VMS_DEBUG
922 vms_debug (1, "vms_slurp_armap (%p)\n", abfd);
923 #endif
924 return FALSE;
927 /* ??? do something with an extended name table.
928 Return FALSE on error, TRUE otherwise. */
930 static bfd_boolean
931 vms_slurp_extended_name_table (bfd * abfd ATTRIBUTE_UNUSED)
933 #if VMS_DEBUG
934 vms_debug (1, "vms_slurp_extended_name_table (%p)\n", abfd);
935 #endif
936 return FALSE;
939 /* ??? do something with an extended name table.
940 Return FALSE on error, TRUE otherwise. */
942 static bfd_boolean
943 vms_construct_extended_name_table (bfd * abfd ATTRIBUTE_UNUSED,
944 char **tabloc ATTRIBUTE_UNUSED,
945 bfd_size_type *tablen ATTRIBUTE_UNUSED,
946 const char **name ATTRIBUTE_UNUSED)
948 #if VMS_DEBUG
949 vms_debug (1, "vms_construct_extended_name_table (%p)\n", abfd);
950 #endif
951 return FALSE;
954 /* Truncate the name of an archive to match system-dependent restrictions. */
956 static void
957 vms_truncate_arname (bfd * abfd ATTRIBUTE_UNUSED,
958 const char *pathname ATTRIBUTE_UNUSED,
959 char *arhdr ATTRIBUTE_UNUSED)
961 #if VMS_DEBUG
962 vms_debug (1, "vms_truncate_arname (%p, %s, %s)\n", abfd, pathname, arhdr);
963 #endif
966 /* ??? write archive map. */
968 static bfd_boolean
969 vms_write_armap (bfd *arch ATTRIBUTE_UNUSED,
970 unsigned int elength ATTRIBUTE_UNUSED,
971 struct orl *map ATTRIBUTE_UNUSED,
972 unsigned int orl_count ATTRIBUTE_UNUSED,
973 int stridx ATTRIBUTE_UNUSED)
975 #if VMS_DEBUG
976 vms_debug (1, "vms_write_armap (%p, %d, %p, %d %d)\n",
977 arch, elength, map, orl_count, stridx);
978 #endif
979 return TRUE;
982 /* Read archive header ??? */
984 static void *
985 vms_read_ar_hdr (bfd * abfd ATTRIBUTE_UNUSED)
987 #if VMS_DEBUG
988 vms_debug (1, "vms_read_ar_hdr (%p)\n", abfd);
989 #endif
990 return NULL;
993 /* Provided a BFD, @var{archive}, containing an archive and NULL, open
994 an input BFD on the first contained element and returns that.
995 Subsequent calls should pass the archive and the previous return value
996 to return a created BFD to the next contained element.
997 NULL is returned when there are no more. */
999 static bfd *
1000 vms_openr_next_archived_file (bfd *arch ATTRIBUTE_UNUSED,
1001 bfd *prev ATTRIBUTE_UNUSED)
1003 #if VMS_DEBUG
1004 vms_debug (1, "vms_openr_next_archived_file (%p, %p)\n", arch, prev);
1005 #endif
1006 return NULL;
1009 /* Return the BFD which is referenced by the symbol in ABFD indexed by
1010 INDEX. INDEX should have been returned by bfd_get_next_mapent. */
1012 static bfd *
1013 vms_get_elt_at_index (bfd * abfd, symindex index)
1015 #if VMS_DEBUG
1016 vms_debug (1, "vms_get_elt_at_index (%p, %p)\n", abfd, index);
1017 #endif
1018 return _bfd_generic_get_elt_at_index (abfd, index);
1021 /* ???
1022 -> bfd_generic_stat_arch_elt. */
1024 static int
1025 vms_generic_stat_arch_elt (bfd * abfd, struct stat *st)
1027 #if VMS_DEBUG
1028 vms_debug (1, "vms_generic_stat_arch_elt (%p, %p)\n", abfd, st);
1029 #endif
1030 return bfd_generic_stat_arch_elt (abfd, st);
1033 /* This is a new function in bfd 2.5. */
1035 static bfd_boolean
1036 vms_update_armap_timestamp (bfd * abfd ATTRIBUTE_UNUSED)
1038 #if VMS_DEBUG
1039 vms_debug (1, "vms_update_armap_timestamp (%p)\n", abfd);
1040 #endif
1041 return TRUE;
1044 /* Part 4.5, symbols. */
1046 /* Return the number of bytes required to store a vector of pointers
1047 to asymbols for all the symbols in the BFD abfd, including a
1048 terminal NULL pointer. If there are no symbols in the BFD,
1049 then return 0. If an error occurs, return -1. */
1051 static long
1052 vms_get_symtab_upper_bound (bfd * abfd)
1054 #if VMS_DEBUG
1055 vms_debug (1, "vms_get_symtab_upper_bound (%p), %d symbols\n", abfd, PRIV (gsd_sym_count));
1056 #endif
1057 return (PRIV (gsd_sym_count) + 1) * sizeof (asymbol *);
1060 /* Copy symbols from hash table to symbol vector
1062 called from bfd_hash_traverse in vms_canonicalize_symtab
1063 init counter to 0 if entry == 0. */
1065 static bfd_boolean
1066 copy_symbols (struct bfd_hash_entry *entry, void * arg)
1068 bfd * abfd = (bfd *) arg;
1070 if (entry == NULL) /* Init counter. */
1071 PRIV (symnum) = 0;
1072 else /* Fill vector, inc counter. */
1073 PRIV (symcache)[PRIV (symnum)++] = ((vms_symbol_entry *)entry)->symbol;
1075 return TRUE;
1078 /* Read the symbols from the BFD abfd, and fills in the vector
1079 location with pointers to the symbols and a trailing NULL.
1081 Return number of symbols read. */
1083 static long
1084 vms_canonicalize_symtab (bfd * abfd, asymbol **symbols)
1086 #if VMS_DEBUG
1087 vms_debug (1, "vms_canonicalize_symtab (%p, <ret>)\n", abfd);
1088 #endif
1090 /* Init counter. */
1091 copy_symbols (NULL, abfd);
1093 /* Traverse table and fill symbols vector. */
1094 PRIV (symcache) = symbols;
1095 bfd_hash_traverse (PRIV (vms_symbol_table), copy_symbols, abfd);
1097 symbols[PRIV (gsd_sym_count)] = NULL;
1099 return PRIV (gsd_sym_count);
1102 /* Print symbol to file according to how. how is one of
1103 bfd_print_symbol_name just print the name
1104 bfd_print_symbol_more print more (???)
1105 bfd_print_symbol_all print all we know, which is not much right now :-). */
1107 static void
1108 vms_print_symbol (bfd * abfd,
1109 void * file,
1110 asymbol *symbol,
1111 bfd_print_symbol_type how)
1113 #if VMS_DEBUG
1114 vms_debug (1, "vms_print_symbol (%p, %p, %p, %d)\n", abfd, file, symbol, how);
1115 #endif
1117 switch (how)
1119 case bfd_print_symbol_name:
1120 case bfd_print_symbol_more:
1121 fprintf ((FILE *)file," %s", symbol->name);
1122 break;
1124 case bfd_print_symbol_all:
1126 const char *section_name = symbol->section->name;
1128 bfd_print_symbol_vandf (abfd, file, symbol);
1130 fprintf ((FILE *) file," %-8s %s", section_name, symbol->name);
1132 break;
1136 /* Return information about symbol in ret.
1138 fill type, value and name
1139 type:
1140 A absolute
1141 B bss segment symbol
1142 C common symbol
1143 D data segment symbol
1144 f filename
1145 t a static function symbol
1146 T text segment symbol
1147 U undefined
1148 - debug. */
1150 static void
1151 vms_get_symbol_info (bfd * abfd ATTRIBUTE_UNUSED,
1152 asymbol *symbol,
1153 symbol_info *ret)
1155 asection *sec;
1157 #if VMS_DEBUG
1158 vms_debug (1, "vms_get_symbol_info (%p, %p, %p)\n", abfd, symbol, ret);
1159 #endif
1161 sec = symbol->section;
1163 if (ret == NULL)
1164 return;
1166 if (sec == 0)
1167 ret->type = 'U';
1168 else if (bfd_is_com_section (sec))
1169 ret->type = 'C';
1170 else if (bfd_is_abs_section (sec))
1171 ret->type = 'A';
1172 else if (bfd_is_und_section (sec))
1173 ret->type = 'U';
1174 else if (bfd_is_ind_section (sec))
1175 ret->type = 'I';
1176 else if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
1177 ret->type = 'T';
1178 else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
1179 ret->type = 'D';
1180 else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
1181 ret->type = 'B';
1182 else
1183 ret->type = '-';
1185 if (ret->type != 'U')
1186 ret->value = symbol->value + symbol->section->vma;
1187 else
1188 ret->value = 0;
1189 ret->name = symbol->name;
1192 /* Return TRUE if the given symbol sym in the BFD abfd is
1193 a compiler generated local label, else return FALSE. */
1195 static bfd_boolean
1196 vms_bfd_is_local_label_name (bfd * abfd ATTRIBUTE_UNUSED,
1197 const char *name)
1199 #if VMS_DEBUG
1200 vms_debug (1, "vms_bfd_is_local_label_name (%p, %s)\n", abfd, name);
1201 #endif
1202 return name[0] == '$';
1205 /* Get source line number for symbol. */
1207 static alent *
1208 vms_get_lineno (bfd * abfd ATTRIBUTE_UNUSED,
1209 asymbol *symbol ATTRIBUTE_UNUSED)
1211 #if VMS_DEBUG
1212 vms_debug (1, "vms_get_lineno (%p, %p)\n", abfd, symbol);
1213 #endif
1214 return NULL;
1217 /* Provided a BFD, a section and an offset into the section, calculate and
1218 return the name of the source file and the line nearest to the wanted
1219 location. */
1221 static bfd_boolean
1222 vms_find_nearest_line (bfd * abfd ATTRIBUTE_UNUSED,
1223 asection *section ATTRIBUTE_UNUSED,
1224 asymbol **symbols ATTRIBUTE_UNUSED,
1225 bfd_vma offset ATTRIBUTE_UNUSED,
1226 const char **file ATTRIBUTE_UNUSED,
1227 const char **func ATTRIBUTE_UNUSED,
1228 unsigned int *line ATTRIBUTE_UNUSED)
1230 #if VMS_DEBUG
1231 vms_debug (1, "vms_find_nearest_line (%p, %s, %p, %ld, <ret>, <ret>, <ret>)\n",
1232 abfd, section->name, symbols, (long int)offset);
1233 #endif
1234 return _bfd_vms_find_nearest_dst_line (abfd, section, symbols, offset, file, func, line);
1237 static bfd_boolean
1238 vms_find_inliner_info (bfd * abfd ATTRIBUTE_UNUSED,
1239 const char **file ATTRIBUTE_UNUSED,
1240 const char **func ATTRIBUTE_UNUSED,
1241 unsigned int *line ATTRIBUTE_UNUSED)
1243 #if VMS_DEBUG
1244 vms_debug (1, "vms_find_inliner_info (%p, <ret>, <ret>, <ret>)\n",
1245 abfd);
1246 #endif
1247 return FALSE;
1250 /* Back-door to allow format-aware applications to create debug symbols
1251 while using BFD for everything else. Currently used by the assembler
1252 when creating COFF files. */
1254 static asymbol *
1255 vms_bfd_make_debug_symbol (bfd * abfd ATTRIBUTE_UNUSED,
1256 void *ptr ATTRIBUTE_UNUSED,
1257 unsigned long size ATTRIBUTE_UNUSED)
1259 #if VMS_DEBUG
1260 vms_debug (1, "vms_bfd_make_debug_symbol (%p, %p, %ld)\n", abfd, ptr, size);
1261 #endif
1262 return NULL;
1265 /* Read minisymbols. For minisymbols, we use the unmodified a.out
1266 symbols. The minisymbol_to_symbol function translates these into
1267 BFD asymbol structures. */
1269 static long
1270 vms_read_minisymbols (bfd * abfd,
1271 bfd_boolean dynamic,
1272 void * *minisymsp,
1273 unsigned int *sizep)
1275 #if VMS_DEBUG
1276 vms_debug (1, "vms_read_minisymbols (%p, %d, %p, %d)\n", abfd, dynamic, minisymsp, *sizep);
1277 #endif
1278 return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
1281 /* Convert a minisymbol to a BFD asymbol. A minisymbol is just an
1282 unmodified a.out symbol. The SYM argument is a structure returned
1283 by bfd_make_empty_symbol, which we fill in here. */
1285 static asymbol *
1286 vms_minisymbol_to_symbol (bfd * abfd,
1287 bfd_boolean dynamic,
1288 const void * minisym,
1289 asymbol *sym)
1291 #if VMS_DEBUG
1292 vms_debug (1, "vms_minisymbol_to_symbol (%p, %d, %p, %p)\n", abfd, dynamic, minisym, sym);
1293 #endif
1294 return _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym);
1297 /* Part 4.6, relocations. */
1299 /* Allocate the reloc buffer for the specified section. */
1301 static void
1302 alloc_reloc_stream (bfd *abfd ATTRIBUTE_UNUSED, asection *section,
1303 void *alloc_error)
1305 unsigned char *ptr;
1307 /* If there were no relocations, there is nothing to do. */
1308 if (section->reloc_count == 0)
1309 return;
1311 ptr = bfd_malloc (vms_section_data (section)->reloc_size);
1312 if (ptr == NULL)
1314 *(bfd_boolean *)alloc_error = TRUE;
1315 return;
1318 vms_section_data (section)->reloc_stream = ptr;
1321 /* Read in the relocs for the specified section and internalize them.
1323 The implementation is loosely based on the SOM code and made up
1324 of 3 distinct phases:
1326 1. When the VMS object is opened and parsed, the number and the size
1327 of the relocations are computed for all sections. This makes it
1328 possible to know upfront both which sections have no relocs and
1329 the size of the reloc buffers for the other sections, at virtually
1330 no cost for consumers that don't care about relocs at all.
1332 2. When vms_slurp_reloc_table is invoked for the first time on a section
1333 with relocs, the object is traversed and all the reloc information
1334 is saved in per-section reloc buffers. It would be very inefficient
1335 to scan the whole file on each invocation, so we slurp for all the
1336 sections at once.
1338 3. On subsequent invocations of vms_slurp_reloc_table, the relocs for the
1339 specified section are fetched from the buffer, decoded and internalized.
1340 The buffer is then freed since the internalized relocs are attached to
1341 the section, turning additional invocations of vms_slurp_reloc_table
1342 on the same section into no-ops.
1344 Since VMS objects have very few sections, it could be profitable to merge
1345 phase #2 and phase #3, i.e. to decode and internalize the relocs for all
1346 the sections at once. The current implementation is more elegant. */
1348 static bfd_boolean
1349 vms_slurp_reloc_table (bfd *abfd, asection *section, asymbol **symbols)
1351 arelent *internal_relocs;
1352 bfd_size_type amt;
1353 int err;
1355 /* If there were no relocations, there is nothing to do. */
1356 if (section->reloc_count == 0)
1357 return TRUE;
1359 /* Return saved information about the relocations if it is available. */
1360 if (section->relocation != NULL)
1361 return TRUE;
1363 /* If the relocation stream has not been slurped, do it now. */
1364 if (vms_section_data (section)->reloc_stream == NULL)
1366 bfd_boolean alloc_error = FALSE;
1367 int type;
1369 /* Size the reloc buffer for each section. */
1370 bfd_map_over_sections (abfd, alloc_reloc_stream, &alloc_error);
1371 if (alloc_error)
1372 return FALSE;
1374 if (bfd_seek (abfd, 0, SEEK_SET) != 0)
1375 return FALSE;
1377 /* Reset section pointer. */
1378 PRIV (image_section) = NULL;
1382 type = _bfd_vms_get_object_record (abfd);
1383 if (type != EOBJ_S_C_ETIR
1384 && type != EOBJ_S_C_EDBG
1385 && type != EOBJ_S_C_ETBT)
1386 continue;
1387 err = _bfd_vms_slurp_relocs (abfd);
1388 if (err != 0)
1390 #if VMS_DEBUG
1391 vms_debug (2, "slurp relocs failed with %d\n", err);
1392 #endif
1393 return FALSE;
1396 while (type != EOBJ_S_C_EEOM);
1399 amt = section->reloc_count * sizeof (arelent);
1400 internal_relocs = (arelent *) bfd_zalloc (abfd, amt);
1401 if (internal_relocs == NULL)
1402 return FALSE;
1404 /* Decode and internalize the relocations. */
1405 err = _bfd_vms_decode_relocs (abfd, internal_relocs, section, symbols);
1406 if (err != 0)
1408 #if VMS_DEBUG
1409 vms_debug (2, "decode relocs failed with %d\n", err);
1410 #endif
1411 return FALSE;
1414 /* We're done with the external relocations. Free them. */
1415 free (vms_section_data (section)->reloc_stream);
1416 vms_section_data (section)->reloc_stream = NULL;
1418 /* Save our results and return success. */
1419 section->relocation = internal_relocs;
1420 return TRUE;
1423 /* Return the number of bytes required to store the relocation
1424 information associated with the given section. */
1426 static long
1427 vms_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *section)
1429 return (section->reloc_count + 1) * sizeof (arelent *);
1432 /* Convert relocations from VMS (external) form into BFD internal
1433 form. Return the number of relocations. */
1435 static long
1436 vms_canonicalize_reloc (bfd *abfd, asection *section, arelent **relptr,
1437 asymbol **symbols)
1439 arelent *tblptr;
1440 int count;
1442 if (! vms_slurp_reloc_table (abfd, section, symbols))
1443 return -1;
1445 count = section->reloc_count;
1446 tblptr = section->relocation;
1448 while (count--)
1449 *relptr++ = tblptr++;
1451 *relptr = (arelent *) NULL;
1452 return section->reloc_count;
1455 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
1457 /* How to process the various reloc types. */
1459 static bfd_reloc_status_type
1460 reloc_nil (bfd * abfd ATTRIBUTE_UNUSED,
1461 arelent *reloc ATTRIBUTE_UNUSED,
1462 asymbol *sym ATTRIBUTE_UNUSED,
1463 void * data ATTRIBUTE_UNUSED,
1464 asection *sec ATTRIBUTE_UNUSED,
1465 bfd *output_bfd ATTRIBUTE_UNUSED,
1466 char **error_message ATTRIBUTE_UNUSED)
1468 #if VMS_DEBUG
1469 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd, output_bfd);
1470 vms_debug (2, "In section %s, symbol %s\n",
1471 sec->name, sym->name);
1472 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
1473 reloc->sym_ptr_ptr[0]->name,
1474 (unsigned long)reloc->address,
1475 (unsigned long)reloc->addend, reloc->howto->name);
1476 vms_debug (2, "data at %p\n", data);
1477 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
1478 #endif
1480 return bfd_reloc_ok;
1483 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
1484 from smaller values. Start with zero, widen, *then* decrement. */
1485 #define MINUS_ONE (((bfd_vma)0) - 1)
1487 static reloc_howto_type alpha_howto_table[] =
1489 HOWTO (ALPHA_R_IGNORE, /* Type. */
1490 0, /* Rightshift. */
1491 0, /* Size (0 = byte, 1 = short, 2 = long). */
1492 8, /* Bitsize. */
1493 TRUE, /* PC relative. */
1494 0, /* Bitpos. */
1495 complain_overflow_dont,/* Complain_on_overflow. */
1496 reloc_nil, /* Special_function. */
1497 "IGNORE", /* Name. */
1498 TRUE, /* Partial_inplace. */
1499 0, /* Source mask */
1500 0, /* Dest mask. */
1501 TRUE), /* PC rel offset. */
1503 /* A 64 bit reference to a symbol. */
1504 HOWTO (ALPHA_R_REFQUAD, /* Type. */
1505 0, /* Rightshift. */
1506 4, /* Size (0 = byte, 1 = short, 2 = long). */
1507 64, /* Bitsize. */
1508 FALSE, /* PC relative. */
1509 0, /* Bitpos. */
1510 complain_overflow_bitfield, /* Complain_on_overflow. */
1511 reloc_nil, /* Special_function. */
1512 "REFQUAD", /* Name. */
1513 TRUE, /* Partial_inplace. */
1514 MINUS_ONE, /* Source mask. */
1515 MINUS_ONE, /* Dest mask. */
1516 FALSE), /* PC rel offset. */
1518 /* A 21 bit branch. The native assembler generates these for
1519 branches within the text segment, and also fills in the PC
1520 relative offset in the instruction. */
1521 HOWTO (ALPHA_R_BRADDR, /* Type. */
1522 2, /* Rightshift. */
1523 2, /* Size (0 = byte, 1 = short, 2 = long). */
1524 21, /* Bitsize. */
1525 TRUE, /* PC relative. */
1526 0, /* Bitpos. */
1527 complain_overflow_signed, /* Complain_on_overflow. */
1528 reloc_nil, /* Special_function. */
1529 "BRADDR", /* Name. */
1530 TRUE, /* Partial_inplace. */
1531 0x1fffff, /* Source mask. */
1532 0x1fffff, /* Dest mask. */
1533 FALSE), /* PC rel offset. */
1535 /* A hint for a jump to a register. */
1536 HOWTO (ALPHA_R_HINT, /* Type. */
1537 2, /* Rightshift. */
1538 1, /* Size (0 = byte, 1 = short, 2 = long). */
1539 14, /* Bitsize. */
1540 TRUE, /* PC relative. */
1541 0, /* Bitpos. */
1542 complain_overflow_dont,/* Complain_on_overflow. */
1543 reloc_nil, /* Special_function. */
1544 "HINT", /* Name. */
1545 TRUE, /* Partial_inplace. */
1546 0x3fff, /* Source mask. */
1547 0x3fff, /* Dest mask. */
1548 FALSE), /* PC rel offset. */
1550 /* 16 bit PC relative offset. */
1551 HOWTO (ALPHA_R_SREL16, /* Type. */
1552 0, /* Rightshift. */
1553 1, /* Size (0 = byte, 1 = short, 2 = long). */
1554 16, /* Bitsize. */
1555 TRUE, /* PC relative. */
1556 0, /* Bitpos. */
1557 complain_overflow_signed, /* Complain_on_overflow. */
1558 reloc_nil, /* Special_function. */
1559 "SREL16", /* Name. */
1560 TRUE, /* Partial_inplace. */
1561 0xffff, /* Source mask. */
1562 0xffff, /* Dest mask. */
1563 FALSE), /* PC rel offset. */
1565 /* 32 bit PC relative offset. */
1566 HOWTO (ALPHA_R_SREL32, /* Type. */
1567 0, /* Rightshift. */
1568 2, /* Size (0 = byte, 1 = short, 2 = long). */
1569 32, /* Bitsize. */
1570 TRUE, /* PC relative. */
1571 0, /* Bitpos. */
1572 complain_overflow_signed, /* Complain_on_overflow. */
1573 reloc_nil, /* Special_function. */
1574 "SREL32", /* Name. */
1575 TRUE, /* Partial_inplace. */
1576 0xffffffff, /* Source mask. */
1577 0xffffffff, /* Dest mask. */
1578 FALSE), /* PC rel offset. */
1580 /* A 64 bit PC relative offset. */
1581 HOWTO (ALPHA_R_SREL64, /* Type. */
1582 0, /* Rightshift. */
1583 4, /* Size (0 = byte, 1 = short, 2 = long). */
1584 64, /* Bitsize. */
1585 TRUE, /* PC relative. */
1586 0, /* Bitpos. */
1587 complain_overflow_signed, /* Complain_on_overflow. */
1588 reloc_nil, /* Special_function. */
1589 "SREL64", /* Name. */
1590 TRUE, /* Partial_inplace. */
1591 MINUS_ONE, /* Source mask. */
1592 MINUS_ONE, /* Dest mask. */
1593 FALSE), /* PC rel offset. */
1595 /* Push a value on the reloc evaluation stack. */
1596 HOWTO (ALPHA_R_OP_PUSH, /* Type. */
1597 0, /* Rightshift. */
1598 0, /* Size (0 = byte, 1 = short, 2 = long). */
1599 0, /* Bitsize. */
1600 FALSE, /* PC relative. */
1601 0, /* Bitpos. */
1602 complain_overflow_dont,/* Complain_on_overflow. */
1603 reloc_nil, /* Special_function. */
1604 "OP_PUSH", /* Name. */
1605 FALSE, /* Partial_inplace. */
1606 0, /* Source mask. */
1607 0, /* Dest mask. */
1608 FALSE), /* PC rel offset. */
1610 /* Store the value from the stack at the given address. Store it in
1611 a bitfield of size r_size starting at bit position r_offset. */
1612 HOWTO (ALPHA_R_OP_STORE, /* Type. */
1613 0, /* Rightshift. */
1614 4, /* Size (0 = byte, 1 = short, 2 = long). */
1615 64, /* Bitsize. */
1616 FALSE, /* PC relative. */
1617 0, /* Bitpos. */
1618 complain_overflow_dont,/* Complain_on_overflow. */
1619 reloc_nil, /* Special_function. */
1620 "OP_STORE", /* Name. */
1621 FALSE, /* Partial_inplace. */
1622 0, /* Source mask. */
1623 MINUS_ONE, /* Dest mask. */
1624 FALSE), /* PC rel offset. */
1626 /* Subtract the reloc address from the value on the top of the
1627 relocation stack. */
1628 HOWTO (ALPHA_R_OP_PSUB, /* Type. */
1629 0, /* Rightshift. */
1630 0, /* Size (0 = byte, 1 = short, 2 = long). */
1631 0, /* Bitsize. */
1632 FALSE, /* PC relative. */
1633 0, /* Bitpos. */
1634 complain_overflow_dont,/* Complain_on_overflow. */
1635 reloc_nil, /* Special_function. */
1636 "OP_PSUB", /* Name. */
1637 FALSE, /* Partial_inplace. */
1638 0, /* Source mask. */
1639 0, /* Dest mask. */
1640 FALSE), /* PC rel offset. */
1642 /* Shift the value on the top of the relocation stack right by the
1643 given value. */
1644 HOWTO (ALPHA_R_OP_PRSHIFT, /* Type. */
1645 0, /* Rightshift. */
1646 0, /* Size (0 = byte, 1 = short, 2 = long). */
1647 0, /* Bitsize. */
1648 FALSE, /* PC relative. */
1649 0, /* Bitpos. */
1650 complain_overflow_dont,/* Complain_on_overflow. */
1651 reloc_nil, /* Special_function. */
1652 "OP_PRSHIFT", /* Name. */
1653 FALSE, /* Partial_inplace. */
1654 0, /* Source mask. */
1655 0, /* Dest mask. */
1656 FALSE), /* PC rel offset. */
1658 /* Hack. Linkage is done by linker. */
1659 HOWTO (ALPHA_R_LINKAGE, /* Type. */
1660 0, /* Rightshift. */
1661 8, /* Size (0 = byte, 1 = short, 2 = long). */
1662 256, /* Bitsize. */
1663 FALSE, /* PC relative. */
1664 0, /* Bitpos. */
1665 complain_overflow_dont,/* Complain_on_overflow. */
1666 reloc_nil, /* Special_function. */
1667 "LINKAGE", /* Name. */
1668 FALSE, /* Partial_inplace. */
1669 0, /* Source mask. */
1670 0, /* Dest mask. */
1671 FALSE), /* PC rel offset. */
1673 /* A 32 bit reference to a symbol. */
1674 HOWTO (ALPHA_R_REFLONG, /* Type. */
1675 0, /* Rightshift. */
1676 2, /* Size (0 = byte, 1 = short, 2 = long). */
1677 32, /* Bitsize. */
1678 FALSE, /* PC relative. */
1679 0, /* Bitpos. */
1680 complain_overflow_bitfield, /* Complain_on_overflow. */
1681 reloc_nil, /* Special_function. */
1682 "REFLONG", /* Name. */
1683 TRUE, /* Partial_inplace. */
1684 0xffffffff, /* Source mask. */
1685 0xffffffff, /* Dest mask. */
1686 FALSE), /* PC rel offset. */
1688 /* A 64 bit reference to a procedure, written as 32 bit value. */
1689 HOWTO (ALPHA_R_CODEADDR, /* Type. */
1690 0, /* Rightshift. */
1691 4, /* Size (0 = byte, 1 = short, 2 = long). */
1692 64, /* Bitsize. */
1693 FALSE, /* PC relative. */
1694 0, /* Bitpos. */
1695 complain_overflow_signed,/* Complain_on_overflow. */
1696 reloc_nil, /* Special_function. */
1697 "CODEADDR", /* Name. */
1698 FALSE, /* Partial_inplace. */
1699 0xffffffff, /* Source mask. */
1700 0xffffffff, /* Dest mask. */
1701 FALSE), /* PC rel offset. */
1703 HOWTO (ALPHA_R_NOP, /* Type. */
1704 0, /* Rightshift. */
1705 3, /* Size (0 = byte, 1 = short, 2 = long). */
1706 0, /* Bitsize. */
1707 /* The following value must match that of ALPHA_R_BSR/ALPHA_R_BOH
1708 because the calculations for the 3 relocations are the same.
1709 See B.4.5.2 of the OpenVMS Linker Utility Manual. */
1710 TRUE, /* PC relative. */
1711 0, /* Bitpos. */
1712 complain_overflow_dont,/* Complain_on_overflow. */
1713 reloc_nil, /* Special_function. */
1714 "NOP", /* Name. */
1715 FALSE, /* Partial_inplace. */
1716 0xffffffff, /* Source mask. */
1717 0xffffffff, /* Dest mask. */
1718 FALSE), /* PC rel offset. */
1720 HOWTO (ALPHA_R_BSR, /* Type. */
1721 0, /* Rightshift. */
1722 3, /* Size (0 = byte, 1 = short, 2 = long). */
1723 0, /* Bitsize. */
1724 TRUE, /* PC relative. */
1725 0, /* Bitpos. */
1726 complain_overflow_dont,/* Complain_on_overflow. */
1727 reloc_nil, /* Special_function. */
1728 "BSR", /* Name. */
1729 FALSE, /* Partial_inplace. */
1730 0xffffffff, /* Source mask. */
1731 0xffffffff, /* Dest mask. */
1732 FALSE), /* PC rel offset. */
1734 HOWTO (ALPHA_R_LDA, /* Type. */
1735 0, /* Rightshift. */
1736 3, /* Size (0 = byte, 1 = short, 2 = long). */
1737 0, /* Bitsize. */
1738 FALSE, /* PC relative. */
1739 0, /* Bitpos. */
1740 complain_overflow_dont,/* Complain_on_overflow. */
1741 reloc_nil, /* Special_function. */
1742 "LDA", /* Name. */
1743 FALSE, /* Partial_inplace. */
1744 0xffffffff, /* Source mask. */
1745 0xffffffff, /* Dest mask. */
1746 FALSE), /* PC rel offset. */
1748 HOWTO (ALPHA_R_BOH, /* Type. */
1749 0, /* Rightshift. */
1750 3, /* Size (0 = byte, 1 = short, 2 = long, 3 = nil). */
1751 0, /* Bitsize. */
1752 TRUE, /* PC relative. */
1753 0, /* Bitpos. */
1754 complain_overflow_dont,/* Complain_on_overflow. */
1755 reloc_nil, /* Special_function. */
1756 "BOH", /* Name. */
1757 FALSE, /* Partial_inplace. */
1758 0xffffffff, /* Source mask. */
1759 0xffffffff, /* Dest mask. */
1760 FALSE), /* PC rel offset. */
1763 /* Return a pointer to a howto structure which, when invoked, will perform
1764 the relocation code on data from the architecture noted. */
1766 static const struct reloc_howto_struct *
1767 vms_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
1768 bfd_reloc_code_real_type code)
1770 int alpha_type;
1772 #if VMS_DEBUG
1773 vms_debug (1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd, code);
1774 #endif
1776 switch (code)
1778 case BFD_RELOC_16: alpha_type = ALPHA_R_SREL16; break;
1779 case BFD_RELOC_32: alpha_type = ALPHA_R_REFLONG; break;
1780 case BFD_RELOC_64: alpha_type = ALPHA_R_REFQUAD; break;
1781 case BFD_RELOC_CTOR: alpha_type = ALPHA_R_REFQUAD; break;
1782 case BFD_RELOC_23_PCREL_S2: alpha_type = ALPHA_R_BRADDR; break;
1783 case BFD_RELOC_ALPHA_HINT: alpha_type = ALPHA_R_HINT; break;
1784 case BFD_RELOC_16_PCREL: alpha_type = ALPHA_R_SREL16; break;
1785 case BFD_RELOC_32_PCREL: alpha_type = ALPHA_R_SREL32; break;
1786 case BFD_RELOC_64_PCREL: alpha_type = ALPHA_R_SREL64; break;
1787 case BFD_RELOC_ALPHA_LINKAGE: alpha_type = ALPHA_R_LINKAGE; break;
1788 case BFD_RELOC_ALPHA_CODEADDR: alpha_type = ALPHA_R_CODEADDR; break;
1789 case BFD_RELOC_ALPHA_NOP: alpha_type = ALPHA_R_NOP; break;
1790 case BFD_RELOC_ALPHA_BSR: alpha_type = ALPHA_R_BSR; break;
1791 case BFD_RELOC_ALPHA_LDA: alpha_type = ALPHA_R_LDA; break;
1792 case BFD_RELOC_ALPHA_BOH: alpha_type = ALPHA_R_BOH; break;
1793 default:
1794 (*_bfd_error_handler) ("reloc (%d) is *UNKNOWN*", code);
1795 return NULL;
1797 #if VMS_DEBUG
1798 vms_debug (2, "reloc is %s\n", alpha_howto_table[alpha_type].name);
1799 #endif
1800 return & alpha_howto_table[alpha_type];
1803 static reloc_howto_type *
1804 vms_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1805 const char *r_name)
1807 unsigned int i;
1809 for (i = 0;
1810 i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
1811 i++)
1812 if (alpha_howto_table[i].name != NULL
1813 && strcasecmp (alpha_howto_table[i].name, r_name) == 0)
1814 return &alpha_howto_table[i];
1816 return NULL;
1819 /* Part 4.7, writing an object file. */
1821 /* Set the architecture and machine type in BFD abfd to arch and mach.
1822 Find the correct pointer to a structure and insert it into the arch_info
1823 pointer. */
1825 static bfd_boolean
1826 vms_set_arch_mach (bfd * abfd,
1827 enum bfd_architecture arch ATTRIBUTE_UNUSED,
1828 unsigned long mach ATTRIBUTE_UNUSED)
1830 #if VMS_DEBUG
1831 vms_debug (1, "vms_set_arch_mach (%p, %d, %ld)\n", abfd, arch, mach);
1832 #endif
1834 if (arch != bfd_arch_alpha
1835 && arch != bfd_arch_vax
1836 && arch != bfd_arch_unknown)
1837 return FALSE;
1839 return bfd_default_set_arch_mach (abfd, arch, mach);
1842 /* Sets the contents of the section section in BFD abfd to the data starting
1843 in memory at LOCATION. The data is written to the output section starting
1844 at offset offset for count bytes.
1846 Normally TRUE is returned, else FALSE. Possible error returns are:
1847 o bfd_error_no_contents - The output section does not have the
1848 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
1849 o and some more too */
1851 static bfd_boolean
1852 vms_set_section_contents (bfd * abfd,
1853 asection *section,
1854 const void * location,
1855 file_ptr offset,
1856 bfd_size_type count)
1858 #if VMS_DEBUG
1859 vms_debug (1, "vms_set_section_contents (%p, sec %s, loc %p, off %ld, count %d)\n",
1860 abfd, section->name, location, (long int)offset, (int)count);
1861 vms_debug (2, "size %d\n", (int) section->size);
1862 #endif
1863 if (count == (bfd_size_type)0)
1864 return TRUE;
1866 if (section->contents == NULL)
1867 section->contents = bfd_alloc (abfd, section->size);
1868 if (section->contents == NULL)
1869 return FALSE;
1871 memcpy (section->contents + offset, location, (size_t) count);
1872 return TRUE;
1875 /* Part 4.8, linker. */
1877 /* Get the size of the section headers. */
1879 static int
1880 vms_sizeof_headers (bfd * abfd ATTRIBUTE_UNUSED,
1881 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1883 #if VMS_DEBUG
1884 vms_debug (1, "vms_sizeof_headers (%p, %s)\n", abfd, (reloc)?"True":"False");
1885 #endif
1886 return 0;
1889 /* Provides default handling of relocation effort for back ends
1890 which can't be bothered to do it efficiently. */
1892 static bfd_byte *
1893 vms_bfd_get_relocated_section_contents (bfd * abfd ATTRIBUTE_UNUSED,
1894 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
1895 struct bfd_link_order *link_order ATTRIBUTE_UNUSED,
1896 bfd_byte *data ATTRIBUTE_UNUSED,
1897 bfd_boolean relocatable ATTRIBUTE_UNUSED,
1898 asymbol **symbols ATTRIBUTE_UNUSED)
1900 #if VMS_DEBUG
1901 vms_debug (1, "vms_bfd_get_relocated_section_contents (%p, %p, %p, %p, %s, %p)\n",
1902 abfd, link_info, link_order, data, (relocatable)?"True":"False", symbols);
1903 #endif
1904 return NULL;
1907 /* ??? */
1909 static bfd_boolean
1910 vms_bfd_relax_section (bfd * abfd ATTRIBUTE_UNUSED,
1911 asection *section ATTRIBUTE_UNUSED,
1912 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
1913 bfd_boolean *again ATTRIBUTE_UNUSED)
1915 if (link_info->relocatable)
1916 (*link_info->callbacks->einfo)
1917 (_("%P%F: --relax and -r may not be used together\n"));
1919 #if VMS_DEBUG
1920 vms_debug (1, "vms_bfd_relax_section (%p, %s, %p, <ret>)\n",
1921 abfd, section->name, link_info);
1922 #endif
1923 return TRUE;
1926 static bfd_boolean
1927 vms_bfd_gc_sections (bfd * abfd ATTRIBUTE_UNUSED,
1928 struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1930 #if VMS_DEBUG
1931 vms_debug (1, "vms_bfd_gc_sections (%p, %p)\n", abfd, link_info);
1932 #endif
1933 return TRUE;
1936 static bfd_boolean
1937 vms_bfd_merge_sections (bfd * abfd ATTRIBUTE_UNUSED,
1938 struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1940 #if VMS_DEBUG
1941 vms_debug (1, "vms_bfd_merge_sections (%p, %p)\n", abfd, link_info);
1942 #endif
1943 return TRUE;
1946 /* Create a hash table for the linker. Different backends store
1947 different information in this table. */
1949 static struct bfd_link_hash_table *
1950 vms_bfd_link_hash_table_create (bfd * abfd ATTRIBUTE_UNUSED)
1952 #if VMS_DEBUG
1953 vms_debug (1, "vms_bfd_link_hash_table_create (%p)\n", abfd);
1954 #endif
1955 return NULL;
1958 /* Free a linker hash table. */
1960 static void
1961 vms_bfd_link_hash_table_free (struct bfd_link_hash_table *hash ATTRIBUTE_UNUSED)
1963 #if VMS_DEBUG
1964 vms_debug (1, "vms_bfd_link_hash_table_free (%p)\n", abfd);
1965 #endif
1968 /* Add symbols from this object file into the hash table. */
1970 static bfd_boolean
1971 vms_bfd_link_add_symbols (bfd * abfd ATTRIBUTE_UNUSED,
1972 struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1974 #if VMS_DEBUG
1975 vms_debug (1, "vms_bfd_link_add_symbols (%p, %p)\n", abfd, link_info);
1976 #endif
1977 return FALSE;
1980 /* Do a link based on the link_order structures attached to each
1981 section of the BFD. */
1983 static bfd_boolean
1984 vms_bfd_final_link (bfd * abfd ATTRIBUTE_UNUSED,
1985 struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1987 #if VMS_DEBUG
1988 vms_debug (1, "vms_bfd_final_link (%p, %p)\n", abfd, link_info);
1989 #endif
1990 return TRUE;
1993 /* Should this section be split up into smaller pieces during linking. */
1995 static bfd_boolean
1996 vms_bfd_link_split_section (bfd * abfd ATTRIBUTE_UNUSED,
1997 asection *section ATTRIBUTE_UNUSED)
1999 #if VMS_DEBUG
2000 vms_debug (1, "vms_bfd_link_split_section (%p, %s)\n", abfd, section->name);
2001 #endif
2002 return FALSE;
2005 /* Part 4.9, dynamic symbols and relocations. */
2007 /* Get the amount of memory required to hold the dynamic symbols. */
2009 static long
2010 vms_get_dynamic_symtab_upper_bound (bfd * abfd ATTRIBUTE_UNUSED)
2012 #if VMS_DEBUG
2013 vms_debug (1, "vms_get_dynamic_symtab_upper_bound (%p)\n", abfd);
2014 #endif
2015 return 0L;
2018 static bfd_boolean
2019 vms_bfd_print_private_bfd_data (bfd * abfd ATTRIBUTE_UNUSED,
2020 void *file ATTRIBUTE_UNUSED)
2022 #if VMS_DEBUG
2023 vms_debug (1, "vms_bfd_print_private_bfd_data (%p)\n", abfd);
2024 #endif
2025 return FALSE;
2028 /* Read in the dynamic symbols. */
2030 static long
2031 vms_canonicalize_dynamic_symtab (bfd * abfd ATTRIBUTE_UNUSED,
2032 asymbol **symbols ATTRIBUTE_UNUSED)
2034 #if VMS_DEBUG
2035 vms_debug (1, "vms_canonicalize_dynamic_symtab (%p, <ret>)\n", abfd);
2036 #endif
2037 return 0L;
2040 /* Get the amount of memory required to hold the dynamic relocs. */
2042 static long
2043 vms_get_dynamic_reloc_upper_bound (bfd * abfd ATTRIBUTE_UNUSED)
2045 #if VMS_DEBUG
2046 vms_debug (1, "vms_get_dynamic_reloc_upper_bound (%p)\n", abfd);
2047 #endif
2048 return 0L;
2051 /* Read in the dynamic relocs. */
2053 static long
2054 vms_canonicalize_dynamic_reloc (bfd * abfd ATTRIBUTE_UNUSED,
2055 arelent **arel ATTRIBUTE_UNUSED,
2056 asymbol **symbols ATTRIBUTE_UNUSED)
2058 #if VMS_DEBUG
2059 vms_debug (1, "vms_canonicalize_dynamic_reloc (%p)\n", abfd);
2060 #endif
2061 return 0L;
2064 const bfd_target vms_alpha_vec =
2066 "vms-alpha", /* Name. */
2067 bfd_target_evax_flavour,
2068 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
2069 BFD_ENDIAN_LITTLE, /* Header byte order is little. */
2071 (HAS_RELOC | EXEC_P | HAS_LINENO | HAS_DEBUG | HAS_SYMS | HAS_LOCALS
2072 | WP_TEXT | D_PAGED), /* Object flags. */
2073 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
2074 | SEC_READONLY | SEC_CODE | SEC_DATA
2075 | SEC_HAS_CONTENTS | SEC_IN_MEMORY), /* Sect flags. */
2076 0, /* symbol_leading_char. */
2077 ' ', /* ar_pad_char. */
2078 15, /* ar_max_namelen. */
2079 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2080 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2081 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
2082 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2083 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2084 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
2086 {_bfd_dummy_target, vms_object_p, /* bfd_check_format. */
2087 vms_archive_p, _bfd_dummy_target},
2088 {bfd_false, vms_mkobject, /* bfd_set_format. */
2089 _bfd_generic_mkarchive, bfd_false},
2090 {bfd_false, vms_write_object_contents, /* bfd_write_contents. */
2091 _bfd_write_archive_contents, bfd_false},
2093 BFD_JUMP_TABLE_GENERIC (vms),
2094 BFD_JUMP_TABLE_COPY (vms),
2095 BFD_JUMP_TABLE_CORE (vms),
2096 BFD_JUMP_TABLE_ARCHIVE (vms),
2097 BFD_JUMP_TABLE_SYMBOLS (vms),
2098 BFD_JUMP_TABLE_RELOCS (vms),
2099 BFD_JUMP_TABLE_WRITE (vms),
2100 BFD_JUMP_TABLE_LINK (vms),
2101 BFD_JUMP_TABLE_DYNAMIC (vms),
2103 NULL,
2105 (PTR) 0
2108 const bfd_target vms_vax_vec =
2110 "vms-vax", /* Name. */
2111 bfd_target_ovax_flavour,
2112 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
2113 BFD_ENDIAN_LITTLE, /* Header byte order is little. */
2115 (HAS_RELOC | HAS_SYMS /* Object flags. */
2116 | WP_TEXT | D_PAGED
2117 | HAS_LINENO | HAS_DEBUG | HAS_LOCALS),
2119 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
2120 | SEC_READONLY | SEC_CODE | SEC_DATA
2121 | SEC_HAS_CONTENTS | SEC_IN_MEMORY), /* Sect flags. */
2122 0, /* symbol_leading_char */
2123 ' ', /* ar_pad_char */
2124 15, /* ar_max_namelen */
2125 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2126 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2127 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data. */
2128 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
2129 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
2130 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Hdrs. */
2132 {_bfd_dummy_target, vms_object_p, /* bfd_check_format. */
2133 vms_archive_p, _bfd_dummy_target},
2134 {bfd_false, vms_mkobject, /* bfd_set_format. */
2135 _bfd_generic_mkarchive, bfd_false},
2136 {bfd_false, vms_write_object_contents, /* bfd_write_contents. */
2137 _bfd_write_archive_contents, bfd_false},
2139 BFD_JUMP_TABLE_GENERIC (vms),
2140 BFD_JUMP_TABLE_COPY (vms),
2141 BFD_JUMP_TABLE_CORE (vms),
2142 BFD_JUMP_TABLE_ARCHIVE (vms),
2143 BFD_JUMP_TABLE_SYMBOLS (vms),
2144 BFD_JUMP_TABLE_RELOCS (vms),
2145 BFD_JUMP_TABLE_WRITE (vms),
2146 BFD_JUMP_TABLE_LINK (vms),
2147 BFD_JUMP_TABLE_DYNAMIC (vms),
2149 NULL,
2151 (PTR) 0