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. */
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. */
46 vms_initialize (bfd
* abfd
)
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
)
59 PRIV (is_vax
) = FALSE
;
63 PRIV (vms_buf
) = NULL
;
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
)
76 amt
= sizeof (struct bfd_hash_table
);
77 PRIV (vms_symbol_table
) = bfd_alloc (abfd
, amt
);
78 if (PRIV (vms_symbol_table
) == NULL
)
81 if (!bfd_hash_table_init (PRIV (vms_symbol_table
), _bfd_vms_hash_newfunc
,
82 sizeof (vms_symbol_entry
)))
85 amt
= sizeof (struct location_struct
) * LOCATION_SAVE_SIZE
;
86 PRIV (location_stack
) = bfd_alloc (abfd
, amt
);
87 if (PRIV (location_stack
) == NULL
)
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
)
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;
107 bfd_hash_table_free (PRIV (vms_symbol_table
));
109 bfd_release (abfd
, abfd
->tdata
.any
);
110 abfd
->tdata
.any
= NULL
;
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
119 It has the correct value for referenced (undefined section) symbols
121 called from bfd_hash_traverse in vms_fixup_sections. */
124 fill_section_ptr (struct bfd_hash_entry
* entry
, void * sections
)
129 sym
= ((vms_symbol_entry
*) entry
)->symbol
;
133 vms_debug (6, "fill_section_ptr: sym %p, sec %p\n", sym
, sec
);
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
;
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). */
157 vms_fixup_sections (bfd
* abfd
)
159 if (PRIV (fixup_done
))
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
;
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
)
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
);
187 vms_debug (1, "vms_object_p (%p)\n", abfd
);
190 if (!vms_initialize (abfd
))
193 if (bfd_seek (abfd
, (file_ptr
) 0, SEEK_SET
))
194 goto err_wrong_format
;
201 vms_debug (7, "reading at %08lx\n", bfd_tell (abfd
));
203 if (_bfd_vms_next_record (abfd
) < 0)
206 vms_debug (2, "next_record failed\n");
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
))
217 vms_debug (2, "vms_fixup_sections failed\n");
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
;
230 target_vector
= & vms_alpha_vec
;
237 err
= _bfd_vms_slurp_hdr (abfd
, prev_type
);
242 err
= _bfd_vms_slurp_eom (abfd
, prev_type
);
246 err
= _bfd_vms_slurp_gsd (abfd
, prev_type
);
250 err
= _bfd_vms_slurp_tir (abfd
, prev_type
);
254 err
= _bfd_vms_slurp_dbg (abfd
, prev_type
);
258 err
= _bfd_vms_slurp_tbt (abfd
, prev_type
);
261 err
= _bfd_vms_slurp_lnk (abfd
, prev_type
);
269 vms_debug (2, "slurp type %d failed with %d\n", prev_type
, err
);
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
))
281 vms_debug (2, "vms_fixup_sections failed\n");
283 goto err_wrong_format
;
286 /* Set arch_info to vax. */
288 arch
= bfd_scan_arch ("vax");
289 PRIV (is_vax
) = TRUE
;
291 vms_debug (2, "arch is vax\n");
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
;
301 vms_debug (2, "arch is alpha\n");
308 vms_debug (2, "arch not found\n");
310 goto err_wrong_format
;
312 abfd
->arch_info
= arch
;
314 return target_vector
;
317 bfd_set_error (bfd_error_wrong_format
);
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
);
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
)
333 vms_debug (1, "vms_archive_p (%p)\n", abfd
);
339 /* Set the format of a file being written. */
342 vms_mkobject (bfd
* abfd
)
345 vms_debug (1, "vms_mkobject (%p)\n", abfd
);
348 if (!vms_initialize (abfd
))
353 const bfd_arch_info_type
*arch
= bfd_scan_arch ("vax");
355 const bfd_arch_info_type
*arch
= bfd_scan_arch ("alpha");
359 bfd_set_error (bfd_error_wrong_format
);
362 abfd
->arch_info
= arch
;
368 /* Write cached information into a file being written, at bfd_close. */
371 vms_write_object_contents (bfd
* abfd
)
374 vms_debug (1, "vms_write_object_contents (%p)\n", abfd
);
377 if (abfd
->section_count
> 0) /* we have sections */
381 if (_bfd_vms_write_hdr (abfd
, OBJ_S_C_HDR
) != 0)
383 if (_bfd_vms_write_gsd (abfd
, OBJ_S_C_GSD
) != 0)
385 if (_bfd_vms_write_tir (abfd
, OBJ_S_C_TIR
) != 0)
387 if (_bfd_vms_write_tbt (abfd
, OBJ_S_C_TBT
) != 0)
389 if (_bfd_vms_write_dbg (abfd
, OBJ_S_C_DBG
) != 0)
391 if (abfd
->section_count
> 255)
393 if (_bfd_vms_write_eom (abfd
, OBJ_S_C_EOMW
) != 0)
398 if (_bfd_vms_write_eom (abfd
, OBJ_S_C_EOM
) != 0)
404 if (_bfd_vms_write_hdr (abfd
, EOBJ_S_C_EMH
) != 0)
406 if (_bfd_vms_write_gsd (abfd
, EOBJ_S_C_EGSD
) != 0)
408 if (_bfd_vms_write_tir (abfd
, EOBJ_S_C_ETIR
) != 0)
410 if (_bfd_vms_write_tbt (abfd
, EOBJ_S_C_ETBT
) != 0)
412 if (_bfd_vms_write_dbg (abfd
, EOBJ_S_C_EDBG
) != 0)
414 if (_bfd_vms_write_eom (abfd
, EOBJ_S_C_EEOM
) != 0)
423 /* Called when the BFD is being closed to do any necessary cleanup. */
426 vms_close_and_cleanup (bfd
* abfd
)
429 vms_debug (1, "vms_close_and_cleanup (%p)\n", abfd
);
432 || abfd
->tdata
.any
== NULL
)
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
;
450 /* Ask the BFD to free all cached information. */
453 vms_bfd_free_cached_info (bfd
* abfd ATTRIBUTE_UNUSED
)
456 vms_debug (1, "vms_bfd_free_cached_info (%p)\n", abfd
);
461 /* Called when a new section is created. */
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;
470 vms_debug (1, "vms_new_section_hook (%p, [%d]%s), count %d\n",
471 abfd
, section
->index
, section
->name
, section_count
);
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
)
482 PRIV (section_count
) = section_count
;
485 vms_debug (6, "section_count: %d\n", PRIV (section_count
));
487 PRIV (sections
)[section
->index
] = section
;
489 vms_debug (7, "%d: %s\n", section
->index
, section
->name
);
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) */
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
)
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
);
511 /* Shouldn't be called, since all sections are IN_MEMORY. */
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). */
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
)
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
);
531 /* Shouldn't be called, since all sections are IN_MEMORY. */
535 /* Part 4.2, copy private data. */
537 /* Called to copy BFD general private data from one object file
541 vms_bfd_copy_private_bfd_data (bfd
*src ATTRIBUTE_UNUSED
,
542 bfd
*dest ATTRIBUTE_UNUSED
)
545 vms_debug (1, "vms_bfd_copy_private_bfd_data (%p, %p)\n", src
, dest
);
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}. */
558 vms_bfd_merge_private_bfd_data (bfd
* ibfd ATTRIBUTE_UNUSED
,
559 bfd
* obfd ATTRIBUTE_UNUSED
)
562 vms_debug (1,"vms_bfd_merge_private_bfd_data (%p, %p)\n", ibfd
, obfd
);
567 /* Set private BFD flag information in the BFD @var{abfd}.
568 Return <<TRUE>> on success, <<FALSE>> on error. Possible error
571 o <<bfd_error_no_memory>> -
572 Not enough memory exists to create private data for @var{obfd}. */
575 vms_bfd_set_private_flags (bfd
* abfd ATTRIBUTE_UNUSED
,
576 flagword flags ATTRIBUTE_UNUSED
)
579 vms_debug (1,"vms_bfd_set_private_flags (%p, %lx)\n", abfd
, (long)flags
);
584 /* Called to copy BFD private section data from one object file
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
)
594 vms_debug (1, "vms_bfd_copy_private_section_data (%p, %s, %p, %s)\n",
595 srcbfd
, srcsec
->name
, dstbfd
, dstsec
->name
);
600 /* Called to copy BFD private symbol data from one object file
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
)
610 vms_debug (1, "vms_bfd_copy_private_symbol_data (%p, %s, %p, %s)\n",
611 ibfd
, isym
->name
, obfd
, osym
->name
);
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. */
622 vms_core_file_failing_command (bfd
* abfd ATTRIBUTE_UNUSED
)
625 vms_debug (1, "vms_core_file_failing_command (%p)\n", abfd
);
630 /* Returns the signal number which caused the core dump which
631 generated the file the BFD abfd is attached to. */
634 vms_core_file_failing_signal (bfd
* abfd ATTRIBUTE_UNUSED
)
637 vms_debug (1, "vms_core_file_failing_signal (%p)\n", abfd
);
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. */
646 vms_core_file_matches_executable_p (bfd
* abfd ATTRIBUTE_UNUSED
,
647 bfd
*bbfd ATTRIBUTE_UNUSED
)
650 vms_debug (1, "vms_core_file_matches_executable_p (%p, %p)\n", abfd
, bbfd
);
655 /* Part 4.4, archive. */
657 /* ??? do something with an archive map.
658 Return FALSE on error, TRUE otherwise. */
661 vms_slurp_armap (bfd
* abfd ATTRIBUTE_UNUSED
)
664 vms_debug (1, "vms_slurp_armap (%p)\n", abfd
);
669 /* ??? do something with an extended name table.
670 Return FALSE on error, TRUE otherwise. */
673 vms_slurp_extended_name_table (bfd
* abfd ATTRIBUTE_UNUSED
)
676 vms_debug (1, "vms_slurp_extended_name_table (%p)\n", abfd
);
681 /* ??? do something with an extended name table.
682 Return FALSE on error, TRUE otherwise. */
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
)
691 vms_debug (1, "vms_construct_extended_name_table (%p)\n", abfd
);
696 /* Truncate the name of an archive to match system-dependent restrictions. */
699 vms_truncate_arname (bfd
* abfd ATTRIBUTE_UNUSED
,
700 const char *pathname ATTRIBUTE_UNUSED
,
701 char *arhdr ATTRIBUTE_UNUSED
)
704 vms_debug (1, "vms_truncate_arname (%p, %s, %s)\n", abfd
, pathname
, arhdr
);
709 /* ??? write archive map. */
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
)
719 vms_debug (1, "vms_write_armap (%p, %d, %p, %d %d)\n",
720 arch
, elength
, map
, orl_count
, stridx
);
725 /* Read archive header ??? */
728 vms_read_ar_hdr (bfd
* abfd ATTRIBUTE_UNUSED
)
731 vms_debug (1, "vms_read_ar_hdr (%p)\n", abfd
);
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. */
743 vms_openr_next_archived_file (bfd
*arch ATTRIBUTE_UNUSED
,
744 bfd
*prev ATTRIBUTE_UNUSED
)
747 vms_debug (1, "vms_openr_next_archived_file (%p, %p)\n", arch
, prev
);
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. */
756 vms_get_elt_at_index (bfd
* abfd
, symindex index
)
759 vms_debug (1, "vms_get_elt_at_index (%p, %p)\n", abfd
, index
);
761 return _bfd_generic_get_elt_at_index (abfd
, index
);
765 -> bfd_generic_stat_arch_elt. */
768 vms_generic_stat_arch_elt (bfd
* abfd
, struct stat
*st
)
771 vms_debug (1, "vms_generic_stat_arch_elt (%p, %p)\n", abfd
, st
);
773 return bfd_generic_stat_arch_elt (abfd
, st
);
776 /* This is a new function in bfd 2.5. */
779 vms_update_armap_timestamp (bfd
* abfd ATTRIBUTE_UNUSED
)
782 vms_debug (1, "vms_update_armap_timestamp (%p)\n", abfd
);
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. */
795 vms_get_symtab_upper_bound (bfd
* abfd
)
798 vms_debug (1, "vms_get_symtab_upper_bound (%p), %d symbols\n", abfd
, PRIV (gsd_sym_count
));
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. */
809 copy_symbols (struct bfd_hash_entry
*entry
, void * arg
)
811 bfd
* abfd
= (bfd
*) arg
;
813 if (entry
== NULL
) /* Init counter. */
815 else /* Fill vector, inc counter. */
816 PRIV (symcache
)[PRIV (symnum
)++] = ((vms_symbol_entry
*)entry
)->symbol
;
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. */
827 vms_canonicalize_symtab (bfd
* abfd
, asymbol
**symbols
)
830 vms_debug (1, "vms_canonicalize_symtab (%p, <ret>)\n", abfd
);
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 :-). */
851 vms_print_symbol (bfd
* abfd
,
854 bfd_print_symbol_type how
)
857 vms_debug (1, "vms_print_symbol (%p, %p, %p, %d)\n", abfd
, file
, symbol
, how
);
862 case bfd_print_symbol_name
:
863 case bfd_print_symbol_more
:
864 fprintf ((FILE *)file
," %s", symbol
->name
);
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
);
879 /* Return information about symbol in ret.
881 fill type, value and name
886 D data segment symbol
888 t a static function symbol
889 T text segment symbol
894 vms_get_symbol_info (bfd
* abfd ATTRIBUTE_UNUSED
,
901 vms_debug (1, "vms_get_symbol_info (%p, %p, %p)\n", abfd
, symbol
, ret
);
904 sec
= symbol
->section
;
909 if (bfd_is_com_section (sec
))
911 else if (bfd_is_abs_section (sec
))
913 else if (bfd_is_und_section (sec
))
915 else if (bfd_is_ind_section (sec
))
917 else if (bfd_get_section_flags (abfd
, sec
) & SEC_CODE
)
919 else if (bfd_get_section_flags (abfd
, sec
) & SEC_DATA
)
921 else if (bfd_get_section_flags (abfd
, sec
) & SEC_ALLOC
)
926 if (ret
->type
!= 'U')
927 ret
->value
= symbol
->value
+ symbol
->section
->vma
;
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. */
937 vms_bfd_is_local_label_name (bfd
* abfd ATTRIBUTE_UNUSED
,
941 vms_debug (1, "vms_bfd_is_local_label_name (%p, %s)\n", abfd
, name
);
943 return name
[0] == '$';
946 /* Get source line number for symbol. */
949 vms_get_lineno (bfd
* abfd ATTRIBUTE_UNUSED
,
950 asymbol
*symbol ATTRIBUTE_UNUSED
)
953 vms_debug (1, "vms_get_lineno (%p, %p)\n", abfd
, symbol
);
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
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
)
972 vms_debug (1, "vms_find_nearest_line (%p, %s, %p, %ld, <ret>, <ret>, <ret>)\n",
973 abfd
, section
->name
, symbols
, (long int)offset
);
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
)
985 vms_debug (1, "vms_find_inliner_info (%p, <ret>, <ret>, <ret>)\n",
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. */
996 vms_bfd_make_debug_symbol (bfd
* abfd ATTRIBUTE_UNUSED
,
997 void *ptr ATTRIBUTE_UNUSED
,
998 unsigned long size ATTRIBUTE_UNUSED
)
1001 vms_debug (1, "vms_bfd_make_debug_symbol (%p, %p, %ld)\n", abfd
, ptr
, size
);
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. */
1011 vms_read_minisymbols (bfd
* abfd
,
1012 bfd_boolean dynamic
,
1014 unsigned int *sizep
)
1017 vms_debug (1, "vms_read_minisymbols (%p, %d, %p, %d)\n", abfd
, dynamic
, minisymsp
, *sizep
);
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. */
1027 vms_minisymbol_to_symbol (bfd
* abfd
,
1028 bfd_boolean dynamic
,
1029 const void * minisym
,
1033 vms_debug (1, "vms_minisymbol_to_symbol (%p, %d, %p, %p)\n", abfd
, dynamic
, minisym
, sym
);
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. */
1045 vms_get_reloc_upper_bound (bfd
* abfd ATTRIBUTE_UNUSED
,
1046 asection
*section ATTRIBUTE_UNUSED
)
1049 vms_debug (1, "vms_get_reloc_upper_bound (%p, %s)\n", abfd
, section
->name
);
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. */
1061 vms_canonicalize_reloc (bfd
* abfd ATTRIBUTE_UNUSED
,
1062 asection
*section ATTRIBUTE_UNUSED
,
1063 arelent
**location ATTRIBUTE_UNUSED
,
1064 asymbol
**symbols ATTRIBUTE_UNUSED
)
1067 vms_debug (1, "vms_canonicalize_reloc (%p, %s, <ret>, <ret>)\n", abfd
, section
->name
);
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
)
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); */
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). */
1110 TRUE
, /* PC relative. */
1112 complain_overflow_dont
,/* Complain_on_overflow. */
1113 reloc_nil
, /* Special_function. */
1114 "IGNORE", /* Name. */
1115 TRUE
, /* Partial_inplace. */
1116 0, /* Source 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). */
1125 FALSE
, /* PC relative. */
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). */
1142 TRUE
, /* PC relative. */
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). */
1157 TRUE
, /* PC relative. */
1159 complain_overflow_dont
,/* Complain_on_overflow. */
1160 reloc_nil
, /* Special_function. */
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). */
1172 TRUE
, /* PC relative. */
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). */
1187 TRUE
, /* PC relative. */
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). */
1202 TRUE
, /* PC relative. */
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). */
1217 FALSE
, /* PC relative. */
1219 complain_overflow_dont
,/* Complain_on_overflow. */
1220 reloc_nil
, /* Special_function. */
1221 "OP_PUSH", /* Name. */
1222 FALSE
, /* Partial_inplace. */
1223 0, /* Source 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). */
1233 FALSE
, /* PC relative. */
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). */
1249 FALSE
, /* PC relative. */
1251 complain_overflow_dont
,/* Complain_on_overflow. */
1252 reloc_nil
, /* Special_function. */
1253 "OP_PSUB", /* Name. */
1254 FALSE
, /* Partial_inplace. */
1255 0, /* Source mask. */
1257 FALSE
), /* PC rel offset. */
1259 /* Shift the value on the top of the relocation stack right by the
1261 HOWTO (ALPHA_R_OP_PRSHIFT
, /* Type. */
1262 0, /* Rightshift. */
1263 0, /* Size (0 = byte, 1 = short, 2 = long). */
1265 FALSE
, /* PC relative. */
1267 complain_overflow_dont
,/* Complain_on_overflow. */
1268 reloc_nil
, /* Special_function. */
1269 "OP_PRSHIFT", /* Name. */
1270 FALSE
, /* Partial_inplace. */
1271 0, /* Source 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). */
1280 FALSE
, /* PC relative. */
1282 complain_overflow_dont
,/* Complain_on_overflow. */
1283 reloc_nil
, /* Special_function. */
1284 "LINKAGE", /* Name. */
1285 FALSE
, /* Partial_inplace. */
1286 0, /* Source 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). */
1295 FALSE
, /* PC relative. */
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). */
1310 FALSE
, /* PC relative. */
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
)
1332 vms_debug (1, "vms_bfd_reloc_type_lookup (%p, %d)\t", abfd
, 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;
1349 (*_bfd_error_handler
) ("reloc (%d) is *UNKNOWN*", code
);
1353 vms_debug (2, "reloc is %s\n", alpha_howto_table
[alpha_type
].name
);
1355 return & alpha_howto_table
[alpha_type
];
1358 static reloc_howto_type
*
1359 vms_bfd_reloc_name_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1365 i
< sizeof (alpha_howto_table
) / sizeof (alpha_howto_table
[0]);
1367 if (alpha_howto_table
[i
].name
!= NULL
1368 && strcasecmp (alpha_howto_table
[i
].name
, r_name
) == 0)
1369 return &alpha_howto_table
[i
];
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
1381 vms_set_arch_mach (bfd
* abfd
,
1382 enum bfd_architecture arch ATTRIBUTE_UNUSED
,
1383 unsigned long mach ATTRIBUTE_UNUSED
)
1386 vms_debug (1, "vms_set_arch_mach (%p, %d, %ld)\n", abfd
, arch
, mach
);
1388 abfd
->arch_info
= bfd_scan_arch ("alpha");
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 */
1403 vms_set_section_contents (bfd
* abfd
,
1405 const void * location
,
1407 bfd_size_type count
)
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
);
1414 return _bfd_save_vms_section (abfd
, section
, location
, offset
, count
);
1417 /* Part 4.8, linker. */
1419 /* Get the size of the section headers. */
1422 vms_sizeof_headers (bfd
* abfd ATTRIBUTE_UNUSED
,
1423 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1426 vms_debug (1, "vms_sizeof_headers (%p, %s)\n", abfd
, (reloc
)?"True":"False");
1431 /* Provides default handling of relocation effort for back ends
1432 which can't be bothered to do it efficiently. */
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
)
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
);
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
)
1458 vms_debug (1, "vms_bfd_relax_section (%p, %s, %p, <ret>)\n",
1459 abfd
, section
->name
, link_info
);
1465 vms_bfd_gc_sections (bfd
* abfd ATTRIBUTE_UNUSED
,
1466 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
)
1469 vms_debug (1, "vms_bfd_gc_sections (%p, %p)\n", abfd
, link_info
);
1475 vms_bfd_merge_sections (bfd
* abfd ATTRIBUTE_UNUSED
,
1476 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
)
1479 vms_debug (1, "vms_bfd_merge_sections (%p, %p)\n", abfd
, link_info
);
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
)
1491 vms_debug (1, "vms_bfd_link_hash_table_create (%p)\n", abfd
);
1496 /* Free a linker hash table. */
1499 vms_bfd_link_hash_table_free (struct bfd_link_hash_table
*hash ATTRIBUTE_UNUSED
)
1502 vms_debug (1, "vms_bfd_link_hash_table_free (%p)\n", abfd
);
1506 /* Add symbols from this object file into the hash table. */
1509 vms_bfd_link_add_symbols (bfd
* abfd ATTRIBUTE_UNUSED
,
1510 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
)
1513 vms_debug (1, "vms_bfd_link_add_symbols (%p, %p)\n", abfd
, link_info
);
1518 /* Do a link based on the link_order structures attached to each
1519 section of the BFD. */
1522 vms_bfd_final_link (bfd
* abfd ATTRIBUTE_UNUSED
,
1523 struct bfd_link_info
*link_info ATTRIBUTE_UNUSED
)
1526 vms_debug (1, "vms_bfd_final_link (%p, %p)\n", abfd
, link_info
);
1531 /* Should this section be split up into smaller pieces during linking. */
1534 vms_bfd_link_split_section (bfd
* abfd ATTRIBUTE_UNUSED
,
1535 asection
*section ATTRIBUTE_UNUSED
)
1538 vms_debug (1, "vms_bfd_link_split_section (%p, %s)\n", abfd
, section
->name
);
1543 /* Part 4.9, dynamic symbols and relocations. */
1545 /* Get the amount of memory required to hold the dynamic symbols. */
1548 vms_get_dynamic_symtab_upper_bound (bfd
* abfd ATTRIBUTE_UNUSED
)
1551 vms_debug (1, "vms_get_dynamic_symtab_upper_bound (%p)\n", abfd
);
1557 vms_bfd_print_private_bfd_data (bfd
* abfd ATTRIBUTE_UNUSED
,
1558 void *file ATTRIBUTE_UNUSED
)
1561 vms_debug (1, "vms_bfd_print_private_bfd_data (%p)\n", abfd
);
1566 /* Read in the dynamic symbols. */
1569 vms_canonicalize_dynamic_symtab (bfd
* abfd ATTRIBUTE_UNUSED
,
1570 asymbol
**symbols ATTRIBUTE_UNUSED
)
1573 vms_debug (1, "vms_canonicalize_dynamic_symtab (%p, <ret>)\n", abfd
);
1578 /* Get the amount of memory required to hold the dynamic relocs. */
1581 vms_get_dynamic_reloc_upper_bound (bfd
* abfd ATTRIBUTE_UNUSED
)
1584 vms_debug (1, "vms_get_dynamic_reloc_upper_bound (%p)\n", abfd
);
1589 /* Read in the dynamic relocs. */
1592 vms_canonicalize_dynamic_reloc (bfd
* abfd ATTRIBUTE_UNUSED
,
1593 arelent
**arel ATTRIBUTE_UNUSED
,
1594 asymbol
**symbols ATTRIBUTE_UNUSED
)
1597 vms_debug (1, "vms_canonicalize_dynamic_reloc (%p)\n", abfd
);
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
),
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. */
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
),