bfd/
[binutils.git] / bfd / vms.c
blob1944c1ee06736cc6c032ebc81b2d16e5cb417616
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 Free Software Foundation, Inc.
6 Written by Klaus K"ampf (kkaempf@rmi.de)
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
23 #include "sysdep.h"
24 #include "bfd.h"
25 #include "bfdlink.h"
26 #include "libbfd.h"
28 #include "vms.h"
30 #define vms_bfd_is_target_special_symbol ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
31 #define vms_make_empty_symbol _bfd_generic_make_empty_symbol
32 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms
33 #define vms_bfd_is_group_section bfd_generic_is_group_section
34 #define vms_bfd_discard_group bfd_generic_discard_group
35 #define vms_section_already_linked _bfd_generic_section_already_linked
36 #define vms_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
37 #define vms_get_synthetic_symtab _bfd_nodynamic_get_synthetic_symtab
39 static unsigned int priv_section_count;
40 extern const bfd_target vms_vax_vec;
41 extern const bfd_target vms_alpha_vec;
43 /* Initialize private data. */
45 static bfd_boolean
46 vms_initialize (bfd * abfd)
48 int i;
49 bfd_size_type amt;
51 bfd_set_start_address (abfd, (bfd_vma) -1);
53 amt = sizeof (struct vms_private_data_struct);
54 abfd->tdata.any = bfd_alloc (abfd, amt);
55 if (abfd->tdata.any == NULL)
56 return FALSE;
58 #ifdef __ALPHA
59 PRIV (is_vax) = FALSE;
60 #else
61 PRIV (is_vax) = TRUE;
62 #endif
63 PRIV (vms_buf) = NULL;
64 PRIV (buf_size) = 0;
65 PRIV (rec_length) = 0;
66 PRIV (file_format) = FF_UNKNOWN;
67 PRIV (fixup_done) = FALSE;
68 PRIV (sections) = NULL;
70 amt = sizeof (struct stack_struct) * STACKSIZE;
71 PRIV (stack) = bfd_alloc (abfd, amt);
72 if (PRIV (stack) == NULL)
73 goto error_ret1;
74 PRIV (stackptr) = 0;
76 amt = sizeof (struct bfd_hash_table);
77 PRIV (vms_symbol_table) = bfd_alloc (abfd, amt);
78 if (PRIV (vms_symbol_table) == NULL)
79 goto error_ret1;
81 if (!bfd_hash_table_init (PRIV (vms_symbol_table), _bfd_vms_hash_newfunc,
82 sizeof (vms_symbol_entry)))
83 goto error_ret1;
85 amt = sizeof (struct location_struct) * LOCATION_SAVE_SIZE;
86 PRIV (location_stack) = bfd_alloc (abfd, amt);
87 if (PRIV (location_stack) == NULL)
88 goto error_ret2;
90 for (i = 0; i < VMS_SECTION_COUNT; i++)
91 PRIV (vms_section_table)[i] = NULL;
93 amt = MAX_OUTREC_SIZE;
94 PRIV (output_buf) = bfd_alloc (abfd, amt);
95 if (PRIV (output_buf) == NULL)
96 goto error_ret2;
98 PRIV (push_level) = 0;
99 PRIV (pushed_size) = 0;
100 PRIV (length_pos) = 2;
101 PRIV (output_size) = 0;
102 PRIV (output_alignment) = 1;
104 return TRUE;
106 error_ret2:
107 bfd_hash_table_free (PRIV (vms_symbol_table));
108 error_ret1:
109 bfd_release (abfd, abfd->tdata.any);
110 abfd->tdata.any = NULL;
111 return FALSE;
114 /* Fill symbol->section with section ptr
115 symbol->section is filled with the section index for defined symbols
116 during reading the GSD/EGSD section. But we need the pointer to the
117 bfd section later.
119 It has the correct value for referenced (undefined section) symbols
121 called from bfd_hash_traverse in vms_fixup_sections. */
123 static bfd_boolean
124 fill_section_ptr (struct bfd_hash_entry * entry, void * sections)
126 asection *sec;
127 asymbol *sym;
129 sym = ((vms_symbol_entry *) entry)->symbol;
130 sec = sym->section;
132 #if VMS_DEBUG
133 vms_debug (6, "fill_section_ptr: sym %p, sec %p\n", sym, sec);
134 #endif
136 /* Fill forward references (these contain section number, not section ptr). */
137 if ((unsigned int) (size_t) sec < priv_section_count)
138 sec = ((vms_symbol_entry *) entry)->symbol->section =
139 ((asection **) sections)[(unsigned int) (size_t) sec];
141 if (strcmp (sym->name, sec->name) == 0)
142 sym->flags |= BSF_SECTION_SYM;
144 return TRUE;
147 /* Fixup sections
148 set up all pointers and arrays, counters and sizes are fixed now
150 we build a private sections vector for easy access since sections
151 are always referenced by an index number.
153 alloc PRIV(sections) according to abfd->section_count
154 copy abfd->sections to PRIV(sections). */
156 static bfd_boolean
157 vms_fixup_sections (bfd * abfd)
159 if (PRIV (fixup_done))
160 return TRUE;
162 /* Traverse symbol table and fill in all section pointers. */
164 /* Can't provide section count as argument to fill_section_ptr(). */
165 priv_section_count = PRIV (section_count);
166 bfd_hash_traverse (PRIV (vms_symbol_table), fill_section_ptr, (PRIV (sections)));
168 PRIV (fixup_done) = TRUE;
170 return TRUE;
173 /* Check the format for a file being read.
174 Return a (bfd_target *) if it's an object file or zero if not. */
176 static const struct bfd_target *
177 vms_object_p (bfd * abfd)
179 int err = 0;
180 int prev_type;
181 const struct bfd_target *target_vector = NULL;
182 const bfd_arch_info_type *arch = NULL;
183 void * tdata_save = abfd->tdata.any;
184 bfd_vma saddr_save = bfd_get_start_address (abfd);
186 #if VMS_DEBUG
187 vms_debug (1, "vms_object_p (%p)\n", abfd);
188 #endif
190 if (!vms_initialize (abfd))
191 goto error_ret;
193 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET))
194 goto err_wrong_format;
196 prev_type = -1;
200 #if VMS_DEBUG
201 vms_debug (7, "reading at %08lx\n", bfd_tell (abfd));
202 #endif
203 if (_bfd_vms_next_record (abfd) < 0)
205 #if VMS_DEBUG
206 vms_debug (2, "next_record failed\n");
207 #endif
208 goto err_wrong_format;
211 if ((prev_type == EOBJ_S_C_EGSD)
212 && (PRIV (rec_type) != EOBJ_S_C_EGSD))
214 if (! vms_fixup_sections (abfd))
216 #if VMS_DEBUG
217 vms_debug (2, "vms_fixup_sections failed\n");
218 #endif
219 goto err_wrong_format;
223 prev_type = PRIV (rec_type);
225 if (target_vector == NULL)
227 if (prev_type <= OBJ_S_C_MAXRECTYP)
228 target_vector = & vms_vax_vec;
229 else
230 target_vector = & vms_alpha_vec;
233 switch (prev_type)
235 case OBJ_S_C_HDR:
236 case EOBJ_S_C_EMH:
237 err = _bfd_vms_slurp_hdr (abfd, prev_type);
238 break;
239 case OBJ_S_C_EOM:
240 case OBJ_S_C_EOMW:
241 case EOBJ_S_C_EEOM:
242 err = _bfd_vms_slurp_eom (abfd, prev_type);
243 break;
244 case OBJ_S_C_GSD:
245 case EOBJ_S_C_EGSD:
246 err = _bfd_vms_slurp_gsd (abfd, prev_type);
247 break;
248 case OBJ_S_C_TIR:
249 case EOBJ_S_C_ETIR:
250 err = _bfd_vms_slurp_tir (abfd, prev_type);
251 break;
252 case OBJ_S_C_DBG:
253 case EOBJ_S_C_EDBG:
254 err = _bfd_vms_slurp_dbg (abfd, prev_type);
255 break;
256 case OBJ_S_C_TBT:
257 case EOBJ_S_C_ETBT:
258 err = _bfd_vms_slurp_tbt (abfd, prev_type);
259 break;
260 case OBJ_S_C_LNK:
261 err = _bfd_vms_slurp_lnk (abfd, prev_type);
262 break;
263 default:
264 err = -1;
266 if (err != 0)
268 #if VMS_DEBUG
269 vms_debug (2, "slurp type %d failed with %d\n", prev_type, err);
270 #endif
271 goto err_wrong_format;
274 while ((prev_type != EOBJ_S_C_EEOM) && (prev_type != OBJ_S_C_EOM) && (prev_type != OBJ_S_C_EOMW));
276 if (target_vector == & vms_vax_vec)
278 if (! vms_fixup_sections (abfd))
280 #if VMS_DEBUG
281 vms_debug (2, "vms_fixup_sections failed\n");
282 #endif
283 goto err_wrong_format;
286 /* Set arch_info to vax. */
288 arch = bfd_scan_arch ("vax");
289 PRIV (is_vax) = TRUE;
290 #if VMS_DEBUG
291 vms_debug (2, "arch is vax\n");
292 #endif
294 else if (target_vector == & vms_alpha_vec)
296 /* Set arch_info to alpha. */
298 arch = bfd_scan_arch ("alpha");
299 PRIV (is_vax) = FALSE;
300 #if VMS_DEBUG
301 vms_debug (2, "arch is alpha\n");
302 #endif
305 if (arch == NULL)
307 #if VMS_DEBUG
308 vms_debug (2, "arch not found\n");
309 #endif
310 goto err_wrong_format;
312 abfd->arch_info = arch;
314 return target_vector;
316 err_wrong_format:
317 bfd_set_error (bfd_error_wrong_format);
318 error_ret:
319 if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL)
320 bfd_release (abfd, abfd->tdata.any);
321 abfd->tdata.any = tdata_save;
322 bfd_set_start_address (abfd, saddr_save);
323 return NULL;
326 /* Check the format for a file being read.
327 Return a (bfd_target *) if it's an archive file or zero. */
329 static const struct bfd_target *
330 vms_archive_p (bfd * abfd ATTRIBUTE_UNUSED)
332 #if VMS_DEBUG
333 vms_debug (1, "vms_archive_p (%p)\n", abfd);
334 #endif
336 return NULL;
339 /* Set the format of a file being written. */
341 static bfd_boolean
342 vms_mkobject (bfd * abfd)
344 #if VMS_DEBUG
345 vms_debug (1, "vms_mkobject (%p)\n", abfd);
346 #endif
348 if (!vms_initialize (abfd))
349 return FALSE;
352 #ifdef __VAX
353 const bfd_arch_info_type *arch = bfd_scan_arch ("vax");
354 #else
355 const bfd_arch_info_type *arch = bfd_scan_arch ("alpha");
356 #endif
357 if (arch == NULL)
359 bfd_set_error (bfd_error_wrong_format);
360 return FALSE;
362 abfd->arch_info = arch;
365 return TRUE;
368 /* Write cached information into a file being written, at bfd_close. */
370 static bfd_boolean
371 vms_write_object_contents (bfd * abfd)
373 #if VMS_DEBUG
374 vms_debug (1, "vms_write_object_contents (%p)\n", abfd);
375 #endif
377 if (abfd->section_count > 0) /* we have sections */
379 if (PRIV (is_vax))
381 if (_bfd_vms_write_hdr (abfd, OBJ_S_C_HDR) != 0)
382 return FALSE;
383 if (_bfd_vms_write_gsd (abfd, OBJ_S_C_GSD) != 0)
384 return FALSE;
385 if (_bfd_vms_write_tir (abfd, OBJ_S_C_TIR) != 0)
386 return FALSE;
387 if (_bfd_vms_write_tbt (abfd, OBJ_S_C_TBT) != 0)
388 return FALSE;
389 if (_bfd_vms_write_dbg (abfd, OBJ_S_C_DBG) != 0)
390 return FALSE;
391 if (abfd->section_count > 255)
393 if (_bfd_vms_write_eom (abfd, OBJ_S_C_EOMW) != 0)
394 return FALSE;
396 else
398 if (_bfd_vms_write_eom (abfd, OBJ_S_C_EOM) != 0)
399 return FALSE;
402 else
404 if (_bfd_vms_write_hdr (abfd, EOBJ_S_C_EMH) != 0)
405 return FALSE;
406 if (_bfd_vms_write_gsd (abfd, EOBJ_S_C_EGSD) != 0)
407 return FALSE;
408 if (_bfd_vms_write_tir (abfd, EOBJ_S_C_ETIR) != 0)
409 return FALSE;
410 if (_bfd_vms_write_tbt (abfd, EOBJ_S_C_ETBT) != 0)
411 return FALSE;
412 if (_bfd_vms_write_dbg (abfd, EOBJ_S_C_EDBG) != 0)
413 return FALSE;
414 if (_bfd_vms_write_eom (abfd, EOBJ_S_C_EEOM) != 0)
415 return FALSE;
418 return TRUE;
421 /* 4.1, generic. */
423 /* Called when the BFD is being closed to do any necessary cleanup. */
425 static bfd_boolean
426 vms_close_and_cleanup (bfd * abfd)
428 #if VMS_DEBUG
429 vms_debug (1, "vms_close_and_cleanup (%p)\n", abfd);
430 #endif
431 if (abfd == NULL
432 || abfd->tdata.any == NULL)
433 return TRUE;
435 if (PRIV (vms_buf) != NULL)
436 free (PRIV (vms_buf));
438 if (PRIV (sections) != NULL)
439 free (PRIV (sections));
441 if (PRIV (vms_symbol_table))
442 bfd_hash_table_free (PRIV (vms_symbol_table));
444 bfd_release (abfd, abfd->tdata.any);
445 abfd->tdata.any = NULL;
447 return TRUE;
450 /* Ask the BFD to free all cached information. */
452 static bfd_boolean
453 vms_bfd_free_cached_info (bfd * abfd ATTRIBUTE_UNUSED)
455 #if VMS_DEBUG
456 vms_debug (1, "vms_bfd_free_cached_info (%p)\n", abfd);
457 #endif
458 return TRUE;
461 /* Called when a new section is created. */
463 static bfd_boolean
464 vms_new_section_hook (bfd * abfd, asection *section)
466 /* Count hasn't been incremented yet. */
467 unsigned int section_count = abfd->section_count + 1;
469 #if VMS_DEBUG
470 vms_debug (1, "vms_new_section_hook (%p, [%d]%s), count %d\n",
471 abfd, section->index, section->name, section_count);
472 #endif
473 bfd_set_section_alignment (abfd, section, 4);
475 if (section_count > PRIV (section_count))
477 bfd_size_type amt = section_count;
478 amt *= sizeof (asection *);
479 PRIV (sections) = bfd_realloc_or_free (PRIV (sections), amt);
480 if (PRIV (sections) == NULL)
481 return FALSE;
482 PRIV (section_count) = section_count;
484 #if VMS_DEBUG
485 vms_debug (6, "section_count: %d\n", PRIV (section_count));
486 #endif
487 PRIV (sections)[section->index] = section;
488 #if VMS_DEBUG
489 vms_debug (7, "%d: %s\n", section->index, section->name);
490 #endif
492 return _bfd_generic_new_section_hook (abfd, section);
495 /* Read the contents of a section.
496 buf points to a buffer of buf_size bytes to be filled with
497 section data (starting at offset into section) */
499 static bfd_boolean
500 vms_get_section_contents (bfd * abfd ATTRIBUTE_UNUSED,
501 asection *section ATTRIBUTE_UNUSED,
502 void * buf ATTRIBUTE_UNUSED,
503 file_ptr offset ATTRIBUTE_UNUSED,
504 bfd_size_type buf_size ATTRIBUTE_UNUSED)
506 #if VMS_DEBUG
507 vms_debug (1, "vms_get_section_contents (%p, %s, %p, off %ld, size %d)\n",
508 abfd, section->name, buf, offset, (int)buf_size);
509 #endif
511 /* Shouldn't be called, since all sections are IN_MEMORY. */
512 return FALSE;
515 /* Read the contents of a section.
516 buf points to a buffer of buf_size bytes to be filled with
517 section data (starting at offset into section). */
519 static bfd_boolean
520 vms_get_section_contents_in_window (bfd * abfd ATTRIBUTE_UNUSED,
521 asection *section ATTRIBUTE_UNUSED,
522 bfd_window *w ATTRIBUTE_UNUSED,
523 file_ptr offset ATTRIBUTE_UNUSED,
524 bfd_size_type count ATTRIBUTE_UNUSED)
526 #if VMS_DEBUG
527 vms_debug (1, "vms_get_section_contents_in_window (%p, %s, %p, off %ld, count %d)\n",
528 abfd, section->name, w, offset, (int)count);
529 #endif
531 /* Shouldn't be called, since all sections are IN_MEMORY. */
532 return FALSE;
535 /* Part 4.2, copy private data. */
537 /* Called to copy BFD general private data from one object file
538 to another. */
540 static bfd_boolean
541 vms_bfd_copy_private_bfd_data (bfd *src ATTRIBUTE_UNUSED,
542 bfd *dest ATTRIBUTE_UNUSED)
544 #if VMS_DEBUG
545 vms_debug (1, "vms_bfd_copy_private_bfd_data (%p, %p)\n", src, dest);
546 #endif
547 return TRUE;
550 /* Merge private BFD information from the BFD @var{ibfd} to the
551 the output file BFD @var{obfd} when linking. Return <<TRUE>>
552 on success, <<FALSE>> on error. Possible error returns are:
554 o <<bfd_error_no_memory>> -
555 Not enough memory exists to create private data for @var{obfd}. */
557 static bfd_boolean
558 vms_bfd_merge_private_bfd_data (bfd * ibfd ATTRIBUTE_UNUSED,
559 bfd * obfd ATTRIBUTE_UNUSED)
561 #if VMS_DEBUG
562 vms_debug (1,"vms_bfd_merge_private_bfd_data (%p, %p)\n", ibfd, obfd);
563 #endif
564 return TRUE;
567 /* Set private BFD flag information in the BFD @var{abfd}.
568 Return <<TRUE>> on success, <<FALSE>> on error. Possible error
569 returns are:
571 o <<bfd_error_no_memory>> -
572 Not enough memory exists to create private data for @var{obfd}. */
574 static bfd_boolean
575 vms_bfd_set_private_flags (bfd * abfd ATTRIBUTE_UNUSED,
576 flagword flags ATTRIBUTE_UNUSED)
578 #if VMS_DEBUG
579 vms_debug (1,"vms_bfd_set_private_flags (%p, %lx)\n", abfd, (long)flags);
580 #endif
581 return TRUE;
584 /* Called to copy BFD private section data from one object file
585 to another. */
587 static bfd_boolean
588 vms_bfd_copy_private_section_data (bfd *srcbfd ATTRIBUTE_UNUSED,
589 asection *srcsec ATTRIBUTE_UNUSED,
590 bfd *dstbfd ATTRIBUTE_UNUSED,
591 asection *dstsec ATTRIBUTE_UNUSED)
593 #if VMS_DEBUG
594 vms_debug (1, "vms_bfd_copy_private_section_data (%p, %s, %p, %s)\n",
595 srcbfd, srcsec->name, dstbfd, dstsec->name);
596 #endif
597 return TRUE;
600 /* Called to copy BFD private symbol data from one object file
601 to another. */
603 static bfd_boolean
604 vms_bfd_copy_private_symbol_data (bfd *ibfd ATTRIBUTE_UNUSED,
605 asymbol *isym ATTRIBUTE_UNUSED,
606 bfd *obfd ATTRIBUTE_UNUSED,
607 asymbol *osym ATTRIBUTE_UNUSED)
609 #if VMS_DEBUG
610 vms_debug (1, "vms_bfd_copy_private_symbol_data (%p, %s, %p, %s)\n",
611 ibfd, isym->name, obfd, osym->name);
612 #endif
613 return TRUE;
616 /* Part 4.3, core file. */
618 /* Return a read-only string explaining which program was running
619 when it failed and produced the core file abfd. */
621 static char *
622 vms_core_file_failing_command (bfd * abfd ATTRIBUTE_UNUSED)
624 #if VMS_DEBUG
625 vms_debug (1, "vms_core_file_failing_command (%p)\n", abfd);
626 #endif
627 return NULL;
630 /* Returns the signal number which caused the core dump which
631 generated the file the BFD abfd is attached to. */
633 static int
634 vms_core_file_failing_signal (bfd * abfd ATTRIBUTE_UNUSED)
636 #if VMS_DEBUG
637 vms_debug (1, "vms_core_file_failing_signal (%p)\n", abfd);
638 #endif
639 return 0;
642 /* Return TRUE if the core file attached to core_bfd was generated
643 by a run of the executable file attached to exec_bfd, FALSE otherwise. */
645 static bfd_boolean
646 vms_core_file_matches_executable_p (bfd * abfd ATTRIBUTE_UNUSED,
647 bfd *bbfd ATTRIBUTE_UNUSED)
649 #if VMS_DEBUG
650 vms_debug (1, "vms_core_file_matches_executable_p (%p, %p)\n", abfd, bbfd);
651 #endif
652 return FALSE;
655 /* Part 4.4, archive. */
657 /* ??? do something with an archive map.
658 Return FALSE on error, TRUE otherwise. */
660 static bfd_boolean
661 vms_slurp_armap (bfd * abfd ATTRIBUTE_UNUSED)
663 #if VMS_DEBUG
664 vms_debug (1, "vms_slurp_armap (%p)\n", abfd);
665 #endif
666 return FALSE;
669 /* ??? do something with an extended name table.
670 Return FALSE on error, TRUE otherwise. */
672 static bfd_boolean
673 vms_slurp_extended_name_table (bfd * abfd ATTRIBUTE_UNUSED)
675 #if VMS_DEBUG
676 vms_debug (1, "vms_slurp_extended_name_table (%p)\n", abfd);
677 #endif
678 return FALSE;
681 /* ??? do something with an extended name table.
682 Return FALSE on error, TRUE otherwise. */
684 static bfd_boolean
685 vms_construct_extended_name_table (bfd * abfd ATTRIBUTE_UNUSED,
686 char **tabloc ATTRIBUTE_UNUSED,
687 bfd_size_type *tablen ATTRIBUTE_UNUSED,
688 const char **name ATTRIBUTE_UNUSED)
690 #if VMS_DEBUG
691 vms_debug (1, "vms_construct_extended_name_table (%p)\n", abfd);
692 #endif
693 return FALSE;
696 /* Truncate the name of an archive to match system-dependent restrictions. */
698 static void
699 vms_truncate_arname (bfd * abfd ATTRIBUTE_UNUSED,
700 const char *pathname ATTRIBUTE_UNUSED,
701 char *arhdr ATTRIBUTE_UNUSED)
703 #if VMS_DEBUG
704 vms_debug (1, "vms_truncate_arname (%p, %s, %s)\n", abfd, pathname, arhdr);
705 #endif
706 return;
709 /* ??? write archive map. */
711 static bfd_boolean
712 vms_write_armap (bfd *arch ATTRIBUTE_UNUSED,
713 unsigned int elength ATTRIBUTE_UNUSED,
714 struct orl *map ATTRIBUTE_UNUSED,
715 unsigned int orl_count ATTRIBUTE_UNUSED,
716 int stridx ATTRIBUTE_UNUSED)
718 #if VMS_DEBUG
719 vms_debug (1, "vms_write_armap (%p, %d, %p, %d %d)\n",
720 arch, elength, map, orl_count, stridx);
721 #endif
722 return TRUE;
725 /* Read archive header ??? */
727 static void *
728 vms_read_ar_hdr (bfd * abfd ATTRIBUTE_UNUSED)
730 #if VMS_DEBUG
731 vms_debug (1, "vms_read_ar_hdr (%p)\n", abfd);
732 #endif
733 return NULL;
736 /* Provided a BFD, @var{archive}, containing an archive and NULL, open
737 an input BFD on the first contained element and returns that.
738 Subsequent calls should pass the archive and the previous return value
739 to return a created BFD to the next contained element.
740 NULL is returned when there are no more. */
742 static bfd *
743 vms_openr_next_archived_file (bfd *arch ATTRIBUTE_UNUSED,
744 bfd *prev ATTRIBUTE_UNUSED)
746 #if VMS_DEBUG
747 vms_debug (1, "vms_openr_next_archived_file (%p, %p)\n", arch, prev);
748 #endif
749 return NULL;
752 /* Return the BFD which is referenced by the symbol in ABFD indexed by
753 INDEX. INDEX should have been returned by bfd_get_next_mapent. */
755 static bfd *
756 vms_get_elt_at_index (bfd * abfd, symindex index)
758 #if VMS_DEBUG
759 vms_debug (1, "vms_get_elt_at_index (%p, %p)\n", abfd, index);
760 #endif
761 return _bfd_generic_get_elt_at_index (abfd, index);
764 /* ???
765 -> bfd_generic_stat_arch_elt. */
767 static int
768 vms_generic_stat_arch_elt (bfd * abfd, struct stat *st)
770 #if VMS_DEBUG
771 vms_debug (1, "vms_generic_stat_arch_elt (%p, %p)\n", abfd, st);
772 #endif
773 return bfd_generic_stat_arch_elt (abfd, st);
776 /* This is a new function in bfd 2.5. */
778 static bfd_boolean
779 vms_update_armap_timestamp (bfd * abfd ATTRIBUTE_UNUSED)
781 #if VMS_DEBUG
782 vms_debug (1, "vms_update_armap_timestamp (%p)\n", abfd);
783 #endif
784 return TRUE;
787 /* Part 4.5, symbols. */
789 /* Return the number of bytes required to store a vector of pointers
790 to asymbols for all the symbols in the BFD abfd, including a
791 terminal NULL pointer. If there are no symbols in the BFD,
792 then return 0. If an error occurs, return -1. */
794 static long
795 vms_get_symtab_upper_bound (bfd * abfd)
797 #if VMS_DEBUG
798 vms_debug (1, "vms_get_symtab_upper_bound (%p), %d symbols\n", abfd, PRIV (gsd_sym_count));
799 #endif
800 return (PRIV (gsd_sym_count) + 1) * sizeof (asymbol *);
803 /* Copy symbols from hash table to symbol vector
805 called from bfd_hash_traverse in vms_canonicalize_symtab
806 init counter to 0 if entry == 0. */
808 static bfd_boolean
809 copy_symbols (struct bfd_hash_entry *entry, void * arg)
811 bfd * abfd = (bfd *) arg;
813 if (entry == NULL) /* Init counter. */
814 PRIV (symnum) = 0;
815 else /* Fill vector, inc counter. */
816 PRIV (symcache)[PRIV (symnum)++] = ((vms_symbol_entry *)entry)->symbol;
818 return TRUE;
821 /* Read the symbols from the BFD abfd, and fills in the vector
822 location with pointers to the symbols and a trailing NULL.
824 Return number of symbols read. */
826 static long
827 vms_canonicalize_symtab (bfd * abfd, asymbol **symbols)
829 #if VMS_DEBUG
830 vms_debug (1, "vms_canonicalize_symtab (%p, <ret>)\n", abfd);
831 #endif
833 /* Init counter. */
834 copy_symbols (NULL, abfd);
836 /* Traverse table and fill symbols vector. */
837 PRIV (symcache) = symbols;
838 bfd_hash_traverse (PRIV (vms_symbol_table), copy_symbols, abfd);
840 symbols[PRIV (gsd_sym_count)] = NULL;
842 return PRIV (gsd_sym_count);
845 /* Print symbol to file according to how. how is one of
846 bfd_print_symbol_name just print the name
847 bfd_print_symbol_more print more (???)
848 bfd_print_symbol_all print all we know, which is not much right now :-). */
850 static void
851 vms_print_symbol (bfd * abfd,
852 void * file,
853 asymbol *symbol,
854 bfd_print_symbol_type how)
856 #if VMS_DEBUG
857 vms_debug (1, "vms_print_symbol (%p, %p, %p, %d)\n", abfd, file, symbol, how);
858 #endif
860 switch (how)
862 case bfd_print_symbol_name:
863 case bfd_print_symbol_more:
864 fprintf ((FILE *)file," %s", symbol->name);
865 break;
867 case bfd_print_symbol_all:
869 const char *section_name = symbol->section->name;
871 bfd_print_symbol_vandf (abfd, file, symbol);
873 fprintf ((FILE *) file," %-8s %s", section_name, symbol->name);
875 break;
879 /* Return information about symbol in ret.
881 fill type, value and name
882 type:
883 A absolute
884 B bss segment symbol
885 C common symbol
886 D data segment symbol
887 f filename
888 t a static function symbol
889 T text segment symbol
890 U undefined
891 - debug. */
893 static void
894 vms_get_symbol_info (bfd * abfd ATTRIBUTE_UNUSED,
895 asymbol *symbol,
896 symbol_info *ret)
898 asection *sec;
900 #if VMS_DEBUG
901 vms_debug (1, "vms_get_symbol_info (%p, %p, %p)\n", abfd, symbol, ret);
902 #endif
904 sec = symbol->section;
906 if (ret == NULL)
907 return;
909 if (bfd_is_com_section (sec))
910 ret->type = 'C';
911 else if (bfd_is_abs_section (sec))
912 ret->type = 'A';
913 else if (bfd_is_und_section (sec))
914 ret->type = 'U';
915 else if (bfd_is_ind_section (sec))
916 ret->type = 'I';
917 else if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
918 ret->type = 'T';
919 else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
920 ret->type = 'D';
921 else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
922 ret->type = 'B';
923 else
924 ret->type = '-';
926 if (ret->type != 'U')
927 ret->value = symbol->value + symbol->section->vma;
928 else
929 ret->value = 0;
930 ret->name = symbol->name;
933 /* Return TRUE if the given symbol sym in the BFD abfd is
934 a compiler generated local label, else return FALSE. */
936 static bfd_boolean
937 vms_bfd_is_local_label_name (bfd * abfd ATTRIBUTE_UNUSED,
938 const char *name)
940 #if VMS_DEBUG
941 vms_debug (1, "vms_bfd_is_local_label_name (%p, %s)\n", abfd, name);
942 #endif
943 return name[0] == '$';
946 /* Get source line number for symbol. */
948 static alent *
949 vms_get_lineno (bfd * abfd ATTRIBUTE_UNUSED,
950 asymbol *symbol ATTRIBUTE_UNUSED)
952 #if VMS_DEBUG
953 vms_debug (1, "vms_get_lineno (%p, %p)\n", abfd, symbol);
954 #endif
955 return NULL;
958 /* Provided a BFD, a section and an offset into the section, calculate and
959 return the name of the source file and the line nearest to the wanted
960 location. */
962 static bfd_boolean
963 vms_find_nearest_line (bfd * abfd ATTRIBUTE_UNUSED,
964 asection *section ATTRIBUTE_UNUSED,
965 asymbol **symbols ATTRIBUTE_UNUSED,
966 bfd_vma offset ATTRIBUTE_UNUSED,
967 const char **file ATTRIBUTE_UNUSED,
968 const char **func ATTRIBUTE_UNUSED,
969 unsigned int *line ATTRIBUTE_UNUSED)
971 #if VMS_DEBUG
972 vms_debug (1, "vms_find_nearest_line (%p, %s, %p, %ld, <ret>, <ret>, <ret>)\n",
973 abfd, section->name, symbols, (long int)offset);
974 #endif
975 return FALSE;
978 static bfd_boolean
979 vms_find_inliner_info (bfd * abfd ATTRIBUTE_UNUSED,
980 const char **file ATTRIBUTE_UNUSED,
981 const char **func ATTRIBUTE_UNUSED,
982 unsigned int *line ATTRIBUTE_UNUSED)
984 #if VMS_DEBUG
985 vms_debug (1, "vms_find_inliner_info (%p, <ret>, <ret>, <ret>)\n",
986 abfd);
987 #endif
988 return FALSE;
991 /* Back-door to allow format-aware applications to create debug symbols
992 while using BFD for everything else. Currently used by the assembler
993 when creating COFF files. */
995 static asymbol *
996 vms_bfd_make_debug_symbol (bfd * abfd ATTRIBUTE_UNUSED,
997 void *ptr ATTRIBUTE_UNUSED,
998 unsigned long size ATTRIBUTE_UNUSED)
1000 #if VMS_DEBUG
1001 vms_debug (1, "vms_bfd_make_debug_symbol (%p, %p, %ld)\n", abfd, ptr, size);
1002 #endif
1003 return NULL;
1006 /* Read minisymbols. For minisymbols, we use the unmodified a.out
1007 symbols. The minisymbol_to_symbol function translates these into
1008 BFD asymbol structures. */
1010 static long
1011 vms_read_minisymbols (bfd * abfd,
1012 bfd_boolean dynamic,
1013 void * *minisymsp,
1014 unsigned int *sizep)
1016 #if VMS_DEBUG
1017 vms_debug (1, "vms_read_minisymbols (%p, %d, %p, %d)\n", abfd, dynamic, minisymsp, *sizep);
1018 #endif
1019 return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
1022 /* Convert a minisymbol to a BFD asymbol. A minisymbol is just an
1023 unmodified a.out symbol. The SYM argument is a structure returned
1024 by bfd_make_empty_symbol, which we fill in here. */
1026 static asymbol *
1027 vms_minisymbol_to_symbol (bfd * abfd,
1028 bfd_boolean dynamic,
1029 const void * minisym,
1030 asymbol *sym)
1032 #if VMS_DEBUG
1033 vms_debug (1, "vms_minisymbol_to_symbol (%p, %d, %p, %p)\n", abfd, dynamic, minisym, sym);
1034 #endif
1035 return _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym);
1038 /* Part 4.6, relocations. */
1040 /* Return the number of bytes required to store the relocation information
1041 associated with section sect attached to bfd abfd.
1042 If an error occurs, return -1. */
1044 static long
1045 vms_get_reloc_upper_bound (bfd * abfd ATTRIBUTE_UNUSED,
1046 asection *section ATTRIBUTE_UNUSED)
1048 #if VMS_DEBUG
1049 vms_debug (1, "vms_get_reloc_upper_bound (%p, %s)\n", abfd, section->name);
1050 #endif
1051 return -1L;
1054 /* Call the back end associated with the open BFD abfd and translate the
1055 external form of the relocation information attached to sec into the
1056 internal canonical form. Place the table into memory at loc, which has
1057 been preallocated, usually by a call to bfd_get_reloc_upper_bound.
1058 Returns the number of relocs, or -1 on error. */
1060 static long
1061 vms_canonicalize_reloc (bfd * abfd ATTRIBUTE_UNUSED,
1062 asection *section ATTRIBUTE_UNUSED,
1063 arelent **location ATTRIBUTE_UNUSED,
1064 asymbol **symbols ATTRIBUTE_UNUSED)
1066 #if VMS_DEBUG
1067 vms_debug (1, "vms_canonicalize_reloc (%p, %s, <ret>, <ret>)\n", abfd, section->name);
1068 #endif
1069 return FALSE;
1072 /* This is just copied from ecoff-alpha, needs to be fixed probably. */
1074 /* How to process the various reloc types. */
1076 static bfd_reloc_status_type
1077 reloc_nil (bfd * abfd ATTRIBUTE_UNUSED,
1078 arelent *reloc ATTRIBUTE_UNUSED,
1079 asymbol *sym ATTRIBUTE_UNUSED,
1080 void * data ATTRIBUTE_UNUSED,
1081 asection *sec ATTRIBUTE_UNUSED,
1082 bfd *output_bfd ATTRIBUTE_UNUSED,
1083 char **error_message ATTRIBUTE_UNUSED)
1085 #if VMS_DEBUG
1086 vms_debug (1, "reloc_nil (abfd %p, output_bfd %p)\n", abfd, output_bfd);
1087 vms_debug (2, "In section %s, symbol %s\n",
1088 sec->name, sym->name);
1089 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
1090 reloc->sym_ptr_ptr[0]->name,
1091 (unsigned long)reloc->address,
1092 (unsigned long)reloc->addend, reloc->howto->name);
1093 vms_debug (2, "data at %p\n", data);
1094 /* _bfd_hexdump (2, data, bfd_get_reloc_size (reloc->howto), 0); */
1095 #endif
1097 return bfd_reloc_ok;
1100 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
1101 from smaller values. Start with zero, widen, *then* decrement. */
1102 #define MINUS_ONE (((bfd_vma)0) - 1)
1104 static reloc_howto_type alpha_howto_table[] =
1106 HOWTO (ALPHA_R_IGNORE, /* Type. */
1107 0, /* Rightshift. */
1108 0, /* Size (0 = byte, 1 = short, 2 = long). */
1109 8, /* Bitsize. */
1110 TRUE, /* PC relative. */
1111 0, /* Bitpos. */
1112 complain_overflow_dont,/* Complain_on_overflow. */
1113 reloc_nil, /* Special_function. */
1114 "IGNORE", /* Name. */
1115 TRUE, /* Partial_inplace. */
1116 0, /* Source mask */
1117 0, /* Dest mask. */
1118 TRUE), /* PC rel offset. */
1120 /* A 64 bit reference to a symbol. */
1121 HOWTO (ALPHA_R_REFQUAD, /* Type. */
1122 0, /* Rightshift. */
1123 4, /* Size (0 = byte, 1 = short, 2 = long). */
1124 64, /* Bitsize. */
1125 FALSE, /* PC relative. */
1126 0, /* Bitpos. */
1127 complain_overflow_bitfield, /* Complain_on_overflow. */
1128 reloc_nil, /* Special_function. */
1129 "REFQUAD", /* Name. */
1130 TRUE, /* Partial_inplace. */
1131 MINUS_ONE, /* Source mask. */
1132 MINUS_ONE, /* Dest mask. */
1133 FALSE), /* PC rel offset. */
1135 /* A 21 bit branch. The native assembler generates these for
1136 branches within the text segment, and also fills in the PC
1137 relative offset in the instruction. */
1138 HOWTO (ALPHA_R_BRADDR, /* Type. */
1139 2, /* Rightshift. */
1140 2, /* Size (0 = byte, 1 = short, 2 = long). */
1141 21, /* Bitsize. */
1142 TRUE, /* PC relative. */
1143 0, /* Bitpos. */
1144 complain_overflow_signed, /* Complain_on_overflow. */
1145 reloc_nil, /* Special_function. */
1146 "BRADDR", /* Name. */
1147 TRUE, /* Partial_inplace. */
1148 0x1fffff, /* Source mask. */
1149 0x1fffff, /* Dest mask. */
1150 FALSE), /* PC rel offset. */
1152 /* A hint for a jump to a register. */
1153 HOWTO (ALPHA_R_HINT, /* Type. */
1154 2, /* Rightshift. */
1155 1, /* Size (0 = byte, 1 = short, 2 = long). */
1156 14, /* Bitsize. */
1157 TRUE, /* PC relative. */
1158 0, /* Bitpos. */
1159 complain_overflow_dont,/* Complain_on_overflow. */
1160 reloc_nil, /* Special_function. */
1161 "HINT", /* Name. */
1162 TRUE, /* Partial_inplace. */
1163 0x3fff, /* Source mask. */
1164 0x3fff, /* Dest mask. */
1165 FALSE), /* PC rel offset. */
1167 /* 16 bit PC relative offset. */
1168 HOWTO (ALPHA_R_SREL16, /* Type. */
1169 0, /* Rightshift. */
1170 1, /* Size (0 = byte, 1 = short, 2 = long). */
1171 16, /* Bitsize. */
1172 TRUE, /* PC relative. */
1173 0, /* Bitpos. */
1174 complain_overflow_signed, /* Complain_on_overflow. */
1175 reloc_nil, /* Special_function. */
1176 "SREL16", /* Name. */
1177 TRUE, /* Partial_inplace. */
1178 0xffff, /* Source mask. */
1179 0xffff, /* Dest mask. */
1180 FALSE), /* PC rel offset. */
1182 /* 32 bit PC relative offset. */
1183 HOWTO (ALPHA_R_SREL32, /* Type. */
1184 0, /* Rightshift. */
1185 2, /* Size (0 = byte, 1 = short, 2 = long). */
1186 32, /* Bitsize. */
1187 TRUE, /* PC relative. */
1188 0, /* Bitpos. */
1189 complain_overflow_signed, /* Complain_on_overflow. */
1190 reloc_nil, /* Special_function. */
1191 "SREL32", /* Name. */
1192 TRUE, /* Partial_inplace. */
1193 0xffffffff, /* Source mask. */
1194 0xffffffff, /* Dest mask. */
1195 FALSE), /* PC rel offset. */
1197 /* A 64 bit PC relative offset. */
1198 HOWTO (ALPHA_R_SREL64, /* Type. */
1199 0, /* Rightshift. */
1200 4, /* Size (0 = byte, 1 = short, 2 = long). */
1201 64, /* Bitsize. */
1202 TRUE, /* PC relative. */
1203 0, /* Bitpos. */
1204 complain_overflow_signed, /* Complain_on_overflow. */
1205 reloc_nil, /* Special_function. */
1206 "SREL64", /* Name. */
1207 TRUE, /* Partial_inplace. */
1208 MINUS_ONE, /* Source mask. */
1209 MINUS_ONE, /* Dest mask. */
1210 FALSE), /* PC rel offset. */
1212 /* Push a value on the reloc evaluation stack. */
1213 HOWTO (ALPHA_R_OP_PUSH, /* Type. */
1214 0, /* Rightshift. */
1215 0, /* Size (0 = byte, 1 = short, 2 = long). */
1216 0, /* Bitsize. */
1217 FALSE, /* PC relative. */
1218 0, /* Bitpos. */
1219 complain_overflow_dont,/* Complain_on_overflow. */
1220 reloc_nil, /* Special_function. */
1221 "OP_PUSH", /* Name. */
1222 FALSE, /* Partial_inplace. */
1223 0, /* Source mask. */
1224 0, /* Dest mask. */
1225 FALSE), /* PC rel offset. */
1227 /* Store the value from the stack at the given address. Store it in
1228 a bitfield of size r_size starting at bit position r_offset. */
1229 HOWTO (ALPHA_R_OP_STORE, /* Type. */
1230 0, /* Rightshift. */
1231 4, /* Size (0 = byte, 1 = short, 2 = long). */
1232 64, /* Bitsize. */
1233 FALSE, /* PC relative. */
1234 0, /* Bitpos. */
1235 complain_overflow_dont,/* Complain_on_overflow. */
1236 reloc_nil, /* Special_function. */
1237 "OP_STORE", /* Name. */
1238 FALSE, /* Partial_inplace. */
1239 0, /* Source mask. */
1240 MINUS_ONE, /* Dest mask. */
1241 FALSE), /* PC rel offset. */
1243 /* Subtract the reloc address from the value on the top of the
1244 relocation stack. */
1245 HOWTO (ALPHA_R_OP_PSUB, /* Type. */
1246 0, /* Rightshift. */
1247 0, /* Size (0 = byte, 1 = short, 2 = long). */
1248 0, /* Bitsize. */
1249 FALSE, /* PC relative. */
1250 0, /* Bitpos. */
1251 complain_overflow_dont,/* Complain_on_overflow. */
1252 reloc_nil, /* Special_function. */
1253 "OP_PSUB", /* Name. */
1254 FALSE, /* Partial_inplace. */
1255 0, /* Source mask. */
1256 0, /* Dest mask. */
1257 FALSE), /* PC rel offset. */
1259 /* Shift the value on the top of the relocation stack right by the
1260 given value. */
1261 HOWTO (ALPHA_R_OP_PRSHIFT, /* Type. */
1262 0, /* Rightshift. */
1263 0, /* Size (0 = byte, 1 = short, 2 = long). */
1264 0, /* Bitsize. */
1265 FALSE, /* PC relative. */
1266 0, /* Bitpos. */
1267 complain_overflow_dont,/* Complain_on_overflow. */
1268 reloc_nil, /* Special_function. */
1269 "OP_PRSHIFT", /* Name. */
1270 FALSE, /* Partial_inplace. */
1271 0, /* Source mask. */
1272 0, /* Dest mask. */
1273 FALSE), /* PC rel offset. */
1275 /* Hack. Linkage is done by linker. */
1276 HOWTO (ALPHA_R_LINKAGE, /* Type. */
1277 0, /* Rightshift. */
1278 8, /* Size (0 = byte, 1 = short, 2 = long). */
1279 256, /* Bitsize. */
1280 FALSE, /* PC relative. */
1281 0, /* Bitpos. */
1282 complain_overflow_dont,/* Complain_on_overflow. */
1283 reloc_nil, /* Special_function. */
1284 "LINKAGE", /* Name. */
1285 FALSE, /* Partial_inplace. */
1286 0, /* Source mask. */
1287 0, /* Dest mask. */
1288 FALSE), /* PC rel offset. */
1290 /* A 32 bit reference to a symbol. */
1291 HOWTO (ALPHA_R_REFLONG, /* Type. */
1292 0, /* Rightshift. */
1293 2, /* Size (0 = byte, 1 = short, 2 = long). */
1294 32, /* Bitsize. */
1295 FALSE, /* PC relative. */
1296 0, /* Bitpos. */
1297 complain_overflow_bitfield, /* Complain_on_overflow. */
1298 reloc_nil, /* Special_function. */
1299 "REFLONG", /* Name. */
1300 TRUE, /* Partial_inplace. */
1301 0xffffffff, /* Source mask. */
1302 0xffffffff, /* Dest mask. */
1303 FALSE), /* PC rel offset. */
1305 /* A 64 bit reference to a procedure, written as 32 bit value. */
1306 HOWTO (ALPHA_R_CODEADDR, /* Type. */
1307 0, /* Rightshift. */
1308 4, /* Size (0 = byte, 1 = short, 2 = long). */
1309 64, /* Bitsize. */
1310 FALSE, /* PC relative. */
1311 0, /* Bitpos. */
1312 complain_overflow_signed,/* Complain_on_overflow. */
1313 reloc_nil, /* Special_function. */
1314 "CODEADDR", /* Name. */
1315 FALSE, /* Partial_inplace. */
1316 0xffffffff, /* Source mask. */
1317 0xffffffff, /* Dest mask. */
1318 FALSE), /* PC rel offset. */
1322 /* Return a pointer to a howto structure which, when invoked, will perform
1323 the relocation code on data from the architecture noted. */
1325 static const struct reloc_howto_struct *
1326 vms_bfd_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED,
1327 bfd_reloc_code_real_type code)
1329 int alpha_type;
1331 #if VMS_DEBUG
1332 vms_debug (1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd, code);
1333 #endif
1335 switch (code)
1337 case BFD_RELOC_16: alpha_type = ALPHA_R_SREL16; break;
1338 case BFD_RELOC_32: alpha_type = ALPHA_R_REFLONG; break;
1339 case BFD_RELOC_64: alpha_type = ALPHA_R_REFQUAD; break;
1340 case BFD_RELOC_CTOR: alpha_type = ALPHA_R_REFQUAD; break;
1341 case BFD_RELOC_23_PCREL_S2: alpha_type = ALPHA_R_BRADDR; break;
1342 case BFD_RELOC_ALPHA_HINT: alpha_type = ALPHA_R_HINT; break;
1343 case BFD_RELOC_16_PCREL: alpha_type = ALPHA_R_SREL16; break;
1344 case BFD_RELOC_32_PCREL: alpha_type = ALPHA_R_SREL32; break;
1345 case BFD_RELOC_64_PCREL: alpha_type = ALPHA_R_SREL64; break;
1346 case BFD_RELOC_ALPHA_LINKAGE: alpha_type = ALPHA_R_LINKAGE; break;
1347 case BFD_RELOC_ALPHA_CODEADDR: alpha_type = ALPHA_R_CODEADDR; break;
1348 default:
1349 (*_bfd_error_handler) ("reloc (%d) is *UNKNOWN*", code);
1350 return NULL;
1352 #if VMS_DEBUG
1353 vms_debug (2, "reloc is %s\n", alpha_howto_table[alpha_type].name);
1354 #endif
1355 return & alpha_howto_table[alpha_type];
1358 static reloc_howto_type *
1359 vms_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1360 const char *r_name)
1362 unsigned int i;
1364 for (i = 0;
1365 i < sizeof (alpha_howto_table) / sizeof (alpha_howto_table[0]);
1366 i++)
1367 if (alpha_howto_table[i].name != NULL
1368 && strcasecmp (alpha_howto_table[i].name, r_name) == 0)
1369 return &alpha_howto_table[i];
1371 return NULL;
1374 /* Part 4.7, writing an object file. */
1376 /* Set the architecture and machine type in BFD abfd to arch and mach.
1377 Find the correct pointer to a structure and insert it into the arch_info
1378 pointer. */
1380 static bfd_boolean
1381 vms_set_arch_mach (bfd * abfd,
1382 enum bfd_architecture arch ATTRIBUTE_UNUSED,
1383 unsigned long mach ATTRIBUTE_UNUSED)
1385 #if VMS_DEBUG
1386 vms_debug (1, "vms_set_arch_mach (%p, %d, %ld)\n", abfd, arch, mach);
1387 #endif
1388 abfd->arch_info = bfd_scan_arch ("alpha");
1390 return TRUE;
1393 /* Sets the contents of the section section in BFD abfd to the data starting
1394 in memory at data. The data is written to the output section starting at
1395 offset offset for count bytes.
1397 Normally TRUE is returned, else FALSE. Possible error returns are:
1398 o bfd_error_no_contents - The output section does not have the
1399 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
1400 o and some more too */
1402 static bfd_boolean
1403 vms_set_section_contents (bfd * abfd,
1404 asection *section,
1405 const void * location,
1406 file_ptr offset,
1407 bfd_size_type count)
1409 #if VMS_DEBUG
1410 vms_debug (1, "vms_set_section_contents (%p, sec %s, loc %p, off %ld, count %d)\n",
1411 abfd, section->name, location, (long int)offset, (int)count);
1412 vms_debug (2, "size %d\n", (int) section->size);
1413 #endif
1414 return _bfd_save_vms_section (abfd, section, location, offset, count);
1417 /* Part 4.8, linker. */
1419 /* Get the size of the section headers. */
1421 static int
1422 vms_sizeof_headers (bfd * abfd ATTRIBUTE_UNUSED,
1423 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1425 #if VMS_DEBUG
1426 vms_debug (1, "vms_sizeof_headers (%p, %s)\n", abfd, (reloc)?"True":"False");
1427 #endif
1428 return 0;
1431 /* Provides default handling of relocation effort for back ends
1432 which can't be bothered to do it efficiently. */
1434 static bfd_byte *
1435 vms_bfd_get_relocated_section_contents (bfd * abfd ATTRIBUTE_UNUSED,
1436 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
1437 struct bfd_link_order *link_order ATTRIBUTE_UNUSED,
1438 bfd_byte *data ATTRIBUTE_UNUSED,
1439 bfd_boolean relocatable ATTRIBUTE_UNUSED,
1440 asymbol **symbols ATTRIBUTE_UNUSED)
1442 #if VMS_DEBUG
1443 vms_debug (1, "vms_bfd_get_relocated_section_contents (%p, %p, %p, %p, %s, %p)\n",
1444 abfd, link_info, link_order, data, (relocatable)?"True":"False", symbols);
1445 #endif
1446 return NULL;
1449 /* ??? */
1451 static bfd_boolean
1452 vms_bfd_relax_section (bfd * abfd ATTRIBUTE_UNUSED,
1453 asection *section ATTRIBUTE_UNUSED,
1454 struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
1455 bfd_boolean *again ATTRIBUTE_UNUSED)
1457 #if VMS_DEBUG
1458 vms_debug (1, "vms_bfd_relax_section (%p, %s, %p, <ret>)\n",
1459 abfd, section->name, link_info);
1460 #endif
1461 return TRUE;
1464 static bfd_boolean
1465 vms_bfd_gc_sections (bfd * abfd ATTRIBUTE_UNUSED,
1466 struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1468 #if VMS_DEBUG
1469 vms_debug (1, "vms_bfd_gc_sections (%p, %p)\n", abfd, link_info);
1470 #endif
1471 return TRUE;
1474 static bfd_boolean
1475 vms_bfd_merge_sections (bfd * abfd ATTRIBUTE_UNUSED,
1476 struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1478 #if VMS_DEBUG
1479 vms_debug (1, "vms_bfd_merge_sections (%p, %p)\n", abfd, link_info);
1480 #endif
1481 return TRUE;
1484 /* Create a hash table for the linker. Different backends store
1485 different information in this table. */
1487 static struct bfd_link_hash_table *
1488 vms_bfd_link_hash_table_create (bfd * abfd ATTRIBUTE_UNUSED)
1490 #if VMS_DEBUG
1491 vms_debug (1, "vms_bfd_link_hash_table_create (%p)\n", abfd);
1492 #endif
1493 return NULL;
1496 /* Free a linker hash table. */
1498 static void
1499 vms_bfd_link_hash_table_free (struct bfd_link_hash_table *hash ATTRIBUTE_UNUSED)
1501 #if VMS_DEBUG
1502 vms_debug (1, "vms_bfd_link_hash_table_free (%p)\n", abfd);
1503 #endif
1506 /* Add symbols from this object file into the hash table. */
1508 static bfd_boolean
1509 vms_bfd_link_add_symbols (bfd * abfd ATTRIBUTE_UNUSED,
1510 struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1512 #if VMS_DEBUG
1513 vms_debug (1, "vms_bfd_link_add_symbols (%p, %p)\n", abfd, link_info);
1514 #endif
1515 return FALSE;
1518 /* Do a link based on the link_order structures attached to each
1519 section of the BFD. */
1521 static bfd_boolean
1522 vms_bfd_final_link (bfd * abfd ATTRIBUTE_UNUSED,
1523 struct bfd_link_info *link_info ATTRIBUTE_UNUSED)
1525 #if VMS_DEBUG
1526 vms_debug (1, "vms_bfd_final_link (%p, %p)\n", abfd, link_info);
1527 #endif
1528 return TRUE;
1531 /* Should this section be split up into smaller pieces during linking. */
1533 static bfd_boolean
1534 vms_bfd_link_split_section (bfd * abfd ATTRIBUTE_UNUSED,
1535 asection *section ATTRIBUTE_UNUSED)
1537 #if VMS_DEBUG
1538 vms_debug (1, "vms_bfd_link_split_section (%p, %s)\n", abfd, section->name);
1539 #endif
1540 return FALSE;
1543 /* Part 4.9, dynamic symbols and relocations. */
1545 /* Get the amount of memory required to hold the dynamic symbols. */
1547 static long
1548 vms_get_dynamic_symtab_upper_bound (bfd * abfd ATTRIBUTE_UNUSED)
1550 #if VMS_DEBUG
1551 vms_debug (1, "vms_get_dynamic_symtab_upper_bound (%p)\n", abfd);
1552 #endif
1553 return 0;
1556 static bfd_boolean
1557 vms_bfd_print_private_bfd_data (bfd * abfd ATTRIBUTE_UNUSED,
1558 void *file ATTRIBUTE_UNUSED)
1560 #if VMS_DEBUG
1561 vms_debug (1, "vms_bfd_print_private_bfd_data (%p)\n", abfd);
1562 #endif
1563 return FALSE;
1566 /* Read in the dynamic symbols. */
1568 static long
1569 vms_canonicalize_dynamic_symtab (bfd * abfd ATTRIBUTE_UNUSED,
1570 asymbol **symbols ATTRIBUTE_UNUSED)
1572 #if VMS_DEBUG
1573 vms_debug (1, "vms_canonicalize_dynamic_symtab (%p, <ret>)\n", abfd);
1574 #endif
1575 return 0L;
1578 /* Get the amount of memory required to hold the dynamic relocs. */
1580 static long
1581 vms_get_dynamic_reloc_upper_bound (bfd * abfd ATTRIBUTE_UNUSED)
1583 #if VMS_DEBUG
1584 vms_debug (1, "vms_get_dynamic_reloc_upper_bound (%p)\n", abfd);
1585 #endif
1586 return 0L;
1589 /* Read in the dynamic relocs. */
1591 static long
1592 vms_canonicalize_dynamic_reloc (bfd * abfd ATTRIBUTE_UNUSED,
1593 arelent **arel ATTRIBUTE_UNUSED,
1594 asymbol **symbols ATTRIBUTE_UNUSED)
1596 #if VMS_DEBUG
1597 vms_debug (1, "vms_canonicalize_dynamic_reloc (%p)\n", abfd);
1598 #endif
1599 return 0L;
1602 const bfd_target vms_alpha_vec =
1604 "vms-alpha", /* Name. */
1605 bfd_target_evax_flavour,
1606 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
1607 BFD_ENDIAN_LITTLE, /* Header byte order is little. */
1609 (HAS_RELOC | HAS_SYMS
1610 | WP_TEXT | D_PAGED), /* Object flags. */
1611 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
1612 | SEC_READONLY | SEC_CODE | SEC_DATA
1613 | SEC_HAS_CONTENTS | SEC_IN_MEMORY), /* Sect flags. */
1614 0, /* Symbol_leading_char. */
1615 ' ', /* AR_pad_char. */
1616 15, /* AR_max_namelen. */
1617 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
1618 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
1619 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
1620 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
1621 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
1622 bfd_getl16, bfd_getl_signed_16, bfd_putl16,
1624 {_bfd_dummy_target, vms_object_p, /* bfd_check_format. */
1625 vms_archive_p, _bfd_dummy_target},
1626 {bfd_false, vms_mkobject, /* bfd_set_format. */
1627 _bfd_generic_mkarchive, bfd_false},
1628 {bfd_false, vms_write_object_contents, /* bfd_write_contents. */
1629 _bfd_write_archive_contents, bfd_false},
1631 BFD_JUMP_TABLE_GENERIC (vms),
1632 BFD_JUMP_TABLE_COPY (vms),
1633 BFD_JUMP_TABLE_CORE (vms),
1634 BFD_JUMP_TABLE_ARCHIVE (vms),
1635 BFD_JUMP_TABLE_SYMBOLS (vms),
1636 BFD_JUMP_TABLE_RELOCS (vms),
1637 BFD_JUMP_TABLE_WRITE (vms),
1638 BFD_JUMP_TABLE_LINK (vms),
1639 BFD_JUMP_TABLE_DYNAMIC (vms),
1641 NULL,
1643 NULL
1646 const bfd_target vms_vax_vec =
1648 "vms-vax", /* Name. */
1649 bfd_target_ovax_flavour,
1650 BFD_ENDIAN_LITTLE, /* Data byte order is little. */
1651 BFD_ENDIAN_LITTLE, /* Header byte order is little. */
1653 (HAS_RELOC | HAS_SYMS /* Object flags. */
1654 | WP_TEXT | D_PAGED
1655 | HAS_LINENO | HAS_DEBUG | HAS_LOCALS),
1657 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
1658 | SEC_READONLY | SEC_CODE | SEC_DATA
1659 | SEC_HAS_CONTENTS | SEC_IN_MEMORY), /* Sect flags. */
1660 0, /* Symbol_leading_char. */
1661 ' ', /* AR_pad_char. */
1662 15, /* AR_max_namelen. */
1663 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
1664 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
1665 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Data. */
1666 bfd_getl64, bfd_getl_signed_64, bfd_putl64,
1667 bfd_getl32, bfd_getl_signed_32, bfd_putl32,
1668 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* Headers. */
1670 {_bfd_dummy_target, vms_object_p, /* bfd_check_format. */
1671 vms_archive_p, _bfd_dummy_target},
1672 {bfd_false, vms_mkobject, /* bfd_set_format. */
1673 _bfd_generic_mkarchive, bfd_false},
1674 {bfd_false, vms_write_object_contents, /* bfd_write_contents. */
1675 _bfd_write_archive_contents, bfd_false},
1677 BFD_JUMP_TABLE_GENERIC (vms),
1678 BFD_JUMP_TABLE_COPY (vms),
1679 BFD_JUMP_TABLE_CORE (vms),
1680 BFD_JUMP_TABLE_ARCHIVE (vms),
1681 BFD_JUMP_TABLE_SYMBOLS (vms),
1682 BFD_JUMP_TABLE_RELOCS (vms),
1683 BFD_JUMP_TABLE_WRITE (vms),
1684 BFD_JUMP_TABLE_LINK (vms),
1685 BFD_JUMP_TABLE_DYNAMIC (vms),
1687 NULL,
1689 NULL