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 4 Free Software Foundation, Inc. 5 6 Written by Klaus K"ampf (kkaempf@rmi.de) 7 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 2 of the License, or 11 (at your option) any later version. 12 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. 17 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 21 22 #include "bfd.h" 23 #include "sysdep.h" 24 #include "bfdlink.h" 25 #include "libbfd.h" 26 27 #include "vms.h" 28 29 static bfd_boolean vms_initialize 30 PARAMS ((bfd *)); 31 static unsigned int priv_section_count; 32 static bfd_boolean fill_section_ptr 33 PARAMS ((struct bfd_hash_entry *, PTR)); 34 static bfd_boolean vms_fixup_sections 35 PARAMS ((bfd *)); 36 static bfd_boolean copy_symbols 37 PARAMS ((struct bfd_hash_entry *, PTR)); 38 static bfd_reloc_status_type reloc_nil 39 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **)); 40 static const struct bfd_target *vms_object_p 41 PARAMS ((bfd *abfd)); 42 static const struct bfd_target *vms_archive_p 43 PARAMS ((bfd *abfd)); 44 static bfd_boolean vms_mkobject 45 PARAMS ((bfd *abfd)); 46 static bfd_boolean vms_write_object_contents 47 PARAMS ((bfd *abfd)); 48 static bfd_boolean vms_close_and_cleanup 49 PARAMS ((bfd *abfd)); 50 static bfd_boolean vms_bfd_free_cached_info 51 PARAMS ((bfd *abfd)); 52 static bfd_boolean vms_new_section_hook 53 PARAMS ((bfd *abfd, asection *section)); 54 static bfd_boolean vms_get_section_contents 55 PARAMS ((bfd *abfd, asection *section, PTR x1, file_ptr x2, 56 bfd_size_type x3)); 57 static bfd_boolean vms_get_section_contents_in_window 58 PARAMS ((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 61 PARAMS ((bfd *src, bfd *dest)); 62 static bfd_boolean vms_bfd_copy_private_section_data 63 PARAMS ((bfd *srcbfd, asection *srcsec, bfd *dstbfd, asection *dstsec)); 64 static bfd_boolean vms_bfd_copy_private_symbol_data 65 PARAMS ((bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym)); 66 static bfd_boolean vms_bfd_print_private_bfd_data 67 PARAMS ((bfd *abfd, void *file)); 68 static char *vms_core_file_failing_command 69 PARAMS ((bfd *abfd)); 70 static int vms_core_file_failing_signal 71 PARAMS ((bfd *abfd)); 72 static bfd_boolean vms_core_file_matches_executable_p 73 PARAMS ((bfd *abfd, bfd *bbfd)); 74 static bfd_boolean vms_slurp_armap 75 PARAMS ((bfd *abfd)); 76 static bfd_boolean vms_slurp_extended_name_table 77 PARAMS ((bfd *abfd)); 78 static bfd_boolean vms_construct_extended_name_table 79 PARAMS ((bfd *abfd, char **tabloc, bfd_size_type *tablen, 80 const char **name)); 81 static void vms_truncate_arname 82 PARAMS ((bfd *abfd, const char *pathname, char *arhdr)); 83 static bfd_boolean vms_write_armap 84 PARAMS ((bfd *arch, unsigned int elength, struct orl *map, 85 unsigned int orl_count, int stridx)); 86 static PTR vms_read_ar_hdr 87 PARAMS ((bfd *abfd)); 88 static bfd *vms_get_elt_at_index 89 PARAMS ((bfd *abfd, symindex index)); 90 static bfd *vms_openr_next_archived_file 91 PARAMS ((bfd *arch, bfd *prev)); 92 static bfd_boolean vms_update_armap_timestamp 93 PARAMS ((bfd *abfd)); 94 static int vms_generic_stat_arch_elt 95 PARAMS ((bfd *, struct stat *)); 96 static long vms_get_symtab_upper_bound 97 PARAMS ((bfd *abfd)); 98 static long vms_canonicalize_symtab 99 PARAMS ((bfd *abfd, asymbol **symbols)); 100 static void vms_print_symbol 101 PARAMS ((bfd *abfd, PTR file, asymbol *symbol, bfd_print_symbol_type how)); 102 static void vms_get_symbol_info 103 PARAMS ((bfd *abfd, asymbol *symbol, symbol_info *ret)); 104 static bfd_boolean vms_bfd_is_local_label_name 105 PARAMS ((bfd *abfd, const char *)); 106 static alent *vms_get_lineno 107 PARAMS ((bfd *abfd, asymbol *symbol)); 108 static bfd_boolean vms_find_nearest_line 109 PARAMS ((bfd *abfd, asection *section, asymbol **symbols, bfd_vma offset, 110 const char **file, const char **func, unsigned int *line)); 111 static asymbol *vms_bfd_make_debug_symbol 112 PARAMS ((bfd *abfd, void *ptr, unsigned long size)); 113 static long vms_read_minisymbols 114 PARAMS ((bfd *abfd, bfd_boolean dynamic, PTR *minisymsp, 115 unsigned int *sizep)); 116 static asymbol *vms_minisymbol_to_symbol 117 PARAMS ((bfd *abfd, bfd_boolean dynamic, const PTR minisym, asymbol *sym)); 118 static long vms_get_reloc_upper_bound 119 PARAMS ((bfd *abfd, asection *sect)); 120 static long vms_canonicalize_reloc 121 PARAMS ((bfd *abfd, asection *srcsec, arelent **location, 122 asymbol **symbols)); 123 static const struct reloc_howto_struct *vms_bfd_reloc_type_lookup 124 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); 125 static bfd_boolean vms_set_arch_mach 126 PARAMS ((bfd *abfd, enum bfd_architecture arch, unsigned long mach)); 127 static bfd_boolean vms_set_section_contents 128 PARAMS ((bfd *abfd, asection *section, const PTR location, file_ptr offset, 129 bfd_size_type count)); 130 static int vms_sizeof_headers 131 PARAMS ((bfd *abfd, bfd_boolean reloc)); 132 static bfd_byte *vms_bfd_get_relocated_section_contents 133 PARAMS ((bfd *abfd, struct bfd_link_info *link_info, 134 struct bfd_link_order *link_order, bfd_byte *data, 135 bfd_boolean relocatable, asymbol **symbols)); 136 static bfd_boolean vms_bfd_relax_section 137 PARAMS ((bfd *abfd, asection *section, struct bfd_link_info *link_info, 138 bfd_boolean *again)); 139 static bfd_boolean vms_bfd_gc_sections 140 PARAMS ((bfd *abfd, struct bfd_link_info *link_info)); 141 static bfd_boolean vms_bfd_merge_sections 142 PARAMS ((bfd *abfd, struct bfd_link_info *link_info)); 143 static struct bfd_link_hash_table *vms_bfd_link_hash_table_create 144 PARAMS ((bfd *abfd)); 145 static void vms_bfd_link_hash_table_free 146 PARAMS ((struct bfd_link_hash_table *hash)); 147 static bfd_boolean vms_bfd_link_add_symbols 148 PARAMS ((bfd *abfd, struct bfd_link_info *link_info)); 149 static bfd_boolean vms_bfd_final_link 150 PARAMS ((bfd *abfd, struct bfd_link_info *link_info)); 151 static bfd_boolean vms_bfd_link_split_section 152 PARAMS ((bfd *abfd, asection *section)); 153 static long vms_get_dynamic_symtab_upper_bound 154 PARAMS ((bfd *abfd)); 155 static long vms_canonicalize_dynamic_symtab 156 PARAMS ((bfd *abfd, asymbol **symbols)); 157 static long vms_get_dynamic_reloc_upper_bound 158 PARAMS ((bfd *abfd)); 159 static long vms_canonicalize_dynamic_reloc 160 PARAMS ((bfd *abfd, arelent **arel, asymbol **symbols)); 161 static bfd_boolean vms_bfd_merge_private_bfd_data 162 PARAMS ((bfd *ibfd, bfd *obfd)); 163 static bfd_boolean vms_bfd_set_private_flags 164 PARAMS ((bfd *abfd, flagword flags)); 165 166 #define vms_make_empty_symbol _bfd_generic_make_empty_symbol 167 #define vms_bfd_link_just_syms _bfd_generic_link_just_syms 168 #define vms_bfd_discard_group bfd_generic_discard_group 169 170 /*===========================================================================*/ 171 172 const bfd_target vms_alpha_vec = 173 { 174 "vms-alpha", /* name */ 175 bfd_target_evax_flavour, 176 BFD_ENDIAN_LITTLE, /* data byte order is little */ 177 BFD_ENDIAN_LITTLE, /* header byte order is little */ 178 179 (HAS_RELOC | HAS_SYMS 180 | WP_TEXT | D_PAGED), /* object flags */ 181 (SEC_ALLOC | SEC_LOAD | SEC_RELOC 182 | SEC_READONLY | SEC_CODE | SEC_DATA 183 | SEC_HAS_CONTENTS | SEC_IN_MEMORY), /* sect flags */ 184 0, /* symbol_leading_char */ 185 ' ', /* ar_pad_char */ 186 15, /* ar_max_namelen */ 187 bfd_getl64, bfd_getl_signed_64, bfd_putl64, 188 bfd_getl32, bfd_getl_signed_32, bfd_putl32, 189 bfd_getl16, bfd_getl_signed_16, bfd_putl16, 190 bfd_getl64, bfd_getl_signed_64, bfd_putl64, 191 bfd_getl32, bfd_getl_signed_32, bfd_putl32, 192 bfd_getl16, bfd_getl_signed_16, bfd_putl16, 193 194 {_bfd_dummy_target, vms_object_p, /* bfd_check_format */ 195 vms_archive_p, _bfd_dummy_target}, 196 {bfd_false, vms_mkobject, /* bfd_set_format */ 197 _bfd_generic_mkarchive, bfd_false}, 198 {bfd_false, vms_write_object_contents, /* bfd_write_contents */ 199 _bfd_write_archive_contents, bfd_false}, 200 201 BFD_JUMP_TABLE_GENERIC (vms), 202 BFD_JUMP_TABLE_COPY (vms), 203 BFD_JUMP_TABLE_CORE (vms), 204 BFD_JUMP_TABLE_ARCHIVE (vms), 205 BFD_JUMP_TABLE_SYMBOLS (vms), 206 BFD_JUMP_TABLE_RELOCS (vms), 207 BFD_JUMP_TABLE_WRITE (vms), 208 BFD_JUMP_TABLE_LINK (vms), 209 BFD_JUMP_TABLE_DYNAMIC (vms), 210 211 NULL, 212 213 (PTR) 0 214 }; 215 216 const bfd_target vms_vax_vec = 217 { 218 "vms-vax", /* name */ 219 bfd_target_ovax_flavour, 220 BFD_ENDIAN_LITTLE, /* data byte order is little */ 221 BFD_ENDIAN_LITTLE, /* header byte order is little */ 222 223 (HAS_RELOC | HAS_SYMS /* object flags */ 224 | WP_TEXT | D_PAGED 225 | HAS_LINENO | HAS_DEBUG | HAS_LOCALS), 226 227 (SEC_ALLOC | SEC_LOAD | SEC_RELOC 228 | SEC_READONLY | SEC_CODE | SEC_DATA 229 | SEC_HAS_CONTENTS | SEC_IN_MEMORY), /* sect flags */ 230 0, /* symbol_leading_char */ 231 ' ', /* ar_pad_char */ 232 15, /* ar_max_namelen */ 233 bfd_getl64, bfd_getl_signed_64, bfd_putl64, 234 bfd_getl32, bfd_getl_signed_32, bfd_putl32, 235 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */ 236 bfd_getl64, bfd_getl_signed_64, bfd_putl64, 237 bfd_getl32, bfd_getl_signed_32, bfd_putl32, 238 bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */ 239 240 {_bfd_dummy_target, vms_object_p, /* bfd_check_format */ 241 vms_archive_p, _bfd_dummy_target}, 242 {bfd_false, vms_mkobject, /* bfd_set_format */ 243 _bfd_generic_mkarchive, bfd_false}, 244 {bfd_false, vms_write_object_contents, /* bfd_write_contents */ 245 _bfd_write_archive_contents, bfd_false}, 246 247 BFD_JUMP_TABLE_GENERIC (vms), 248 BFD_JUMP_TABLE_COPY (vms), 249 BFD_JUMP_TABLE_CORE (vms), 250 BFD_JUMP_TABLE_ARCHIVE (vms), 251 BFD_JUMP_TABLE_SYMBOLS (vms), 252 BFD_JUMP_TABLE_RELOCS (vms), 253 BFD_JUMP_TABLE_WRITE (vms), 254 BFD_JUMP_TABLE_LINK (vms), 255 BFD_JUMP_TABLE_DYNAMIC (vms), 256 257 NULL, 258 259 (PTR) 0 260 }; 261 262 /*===========================================================================*/ 263 264 /* Initialize private data */ 265 266 static bfd_boolean 267 vms_initialize (abfd) 268 bfd *abfd; 269 { 270 int i; 271 bfd_size_type amt; 272 273 bfd_set_start_address (abfd, (bfd_vma) -1); 274 275 amt = sizeof (struct vms_private_data_struct); 276 abfd->tdata.any = (struct vms_private_data_struct*) bfd_alloc (abfd, amt); 277 if (abfd->tdata.any == 0) 278 return FALSE; 279 280 #ifdef __ALPHA 281 PRIV (is_vax) = 0; 282 #else 283 PRIV (is_vax) = 1; 284 #endif 285 PRIV (vms_buf) = 0; 286 PRIV (buf_size) = 0; 287 PRIV (rec_length) = 0; 288 PRIV (file_format) = FF_UNKNOWN; 289 PRIV (fixup_done) = FALSE; 290 PRIV (sections) = NULL; 291 292 amt = sizeof (struct stack_struct) * STACKSIZE; 293 PRIV (stack) = (struct stack_struct *) bfd_alloc (abfd, amt); 294 if (PRIV (stack) == 0) 295 goto error_ret1; 296 PRIV (stackptr) = 0; 297 298 amt = sizeof (struct bfd_hash_table); 299 PRIV (vms_symbol_table) = (struct bfd_hash_table *) bfd_alloc (abfd, amt); 300 if (PRIV (vms_symbol_table) == 0) 301 goto error_ret1; 302 303 if (!bfd_hash_table_init (PRIV (vms_symbol_table), _bfd_vms_hash_newfunc)) 304 goto error_ret1; 305 306 amt = sizeof (struct location_struct) * LOCATION_SAVE_SIZE; 307 PRIV (location_stack) = (struct location_struct *) bfd_alloc (abfd, amt); 308 if (PRIV (location_stack) == 0) 309 goto error_ret2; 310 311 for (i = 0; i < VMS_SECTION_COUNT; i++) 312 PRIV (vms_section_table)[i] = NULL; 313 314 amt = MAX_OUTREC_SIZE; 315 PRIV (output_buf) = (unsigned char *) bfd_alloc (abfd, amt); 316 if (PRIV (output_buf) == 0) 317 goto error_ret2; 318 319 PRIV (push_level) = 0; 320 PRIV (pushed_size) = 0; 321 PRIV (length_pos) = 2; 322 PRIV (output_size) = 0; 323 PRIV (output_alignment) = 1; 324 325 return TRUE; 326 327 error_ret2: 328 bfd_hash_table_free (PRIV (vms_symbol_table)); 329 error_ret1: 330 bfd_release (abfd, abfd->tdata.any); 331 abfd->tdata.any = 0; 332 return FALSE; 333 } 334 335 /* Fill symbol->section with section ptr 336 symbol->section is filled with the section index for defined symbols 337 during reading the GSD/EGSD section. But we need the pointer to the 338 bfd section later. 339 340 It has the correct value for referenced (undefined section) symbols 341 342 called from bfd_hash_traverse in vms_fixup_sections */ 343 344 static bfd_boolean 345 fill_section_ptr (entry, sections) 346 struct bfd_hash_entry *entry; 347 PTR sections; 348 { 349 asection *sec; 350 asymbol *sym; 351 352 sym = ((vms_symbol_entry *)entry)->symbol; 353 sec = sym->section; 354 355 #if VMS_DEBUG 356 vms_debug (6, "fill_section_ptr: sym %p, sec %p\n", sym, sec); 357 #endif 358 359 /* fill forward references (these contain section number, not section ptr). */ 360 361 if ((unsigned int) sec < priv_section_count) 362 { 363 sec = ((vms_symbol_entry *)entry)->symbol->section = 364 ((asection **)sections)[(int)sec]; 365 } 366 367 if (strcmp (sym->name, sec->name) == 0) 368 sym->flags |= BSF_SECTION_SYM; 369 370 return TRUE; 371 } 372 373 /* Fixup sections 374 set up all pointers and arrays, counters and sizes are fixed now 375 376 we build a private sections vector for easy access since sections 377 are always referenced by an index number. 378 379 alloc PRIV(sections) according to abfd->section_count 380 copy abfd->sections to PRIV(sections) */ 381 382 static bfd_boolean 383 vms_fixup_sections (abfd) 384 bfd *abfd; 385 { 386 if (PRIV (fixup_done)) 387 return TRUE; 388 389 /* 390 * traverse symbol table and fill in all section pointers 391 */ 392 393 /* can't provide section count as argument to fill_section_ptr(). */ 394 priv_section_count = PRIV (section_count); 395 bfd_hash_traverse (PRIV (vms_symbol_table), fill_section_ptr, 396 (PTR) (PRIV (sections))); 397 398 PRIV (fixup_done) = TRUE; 399 400 return TRUE; 401 } 402 403 /*===========================================================================*/ 404 405 /* Check the format for a file being read. 406 Return a (bfd_target *) if it's an object file or zero if not. */ 407 408 static const struct bfd_target * 409 vms_object_p (abfd) 410 bfd *abfd; 411 { 412 int err = 0; 413 int prev_type; 414 const struct bfd_target *target_vector = 0; 415 const bfd_arch_info_type *arch = 0; 416 PTR tdata_save = abfd->tdata.any; 417 bfd_vma saddr_save = bfd_get_start_address (abfd); 418 419 #if VMS_DEBUG 420 vms_debug (1, "vms_object_p(%p)\n", abfd); 421 #endif 422 423 if (!vms_initialize (abfd)) 424 goto error_ret; 425 426 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET)) 427 goto err_wrong_format; 428 429 prev_type = -1; 430 431 do 432 { 433 #if VMS_DEBUG 434 vms_debug (7, "reading at %08lx\n", bfd_tell(abfd)); 435 #endif 436 if (_bfd_vms_next_record (abfd) < 0) 437 { 438 #if VMS_DEBUG 439 vms_debug (2, "next_record failed\n"); 440 #endif 441 goto err_wrong_format; 442 } 443 444 if ((prev_type == EOBJ_S_C_EGSD) 445 && (PRIV (rec_type) != EOBJ_S_C_EGSD)) 446 { 447 if (! vms_fixup_sections (abfd)) 448 { 449 #if VMS_DEBUG 450 vms_debug (2, "vms_fixup_sections failed\n"); 451 #endif 452 goto err_wrong_format; 453 } 454 } 455 456 prev_type = PRIV (rec_type); 457 458 if (target_vector == 0) 459 { 460 if (prev_type <= OBJ_S_C_MAXRECTYP) 461 target_vector = &vms_vax_vec; 462 else 463 target_vector = &vms_alpha_vec; 464 } 465 466 switch (prev_type) 467 { 468 case OBJ_S_C_HDR: 469 case EOBJ_S_C_EMH: 470 err = _bfd_vms_slurp_hdr (abfd, prev_type); 471 break; 472 case OBJ_S_C_EOM: 473 case OBJ_S_C_EOMW: 474 case EOBJ_S_C_EEOM: 475 err = _bfd_vms_slurp_eom (abfd, prev_type); 476 break; 477 case OBJ_S_C_GSD: 478 case EOBJ_S_C_EGSD: 479 err = _bfd_vms_slurp_gsd (abfd, prev_type); 480 break; 481 case OBJ_S_C_TIR: 482 case EOBJ_S_C_ETIR: 483 err = _bfd_vms_slurp_tir (abfd, prev_type); 484 break; 485 case OBJ_S_C_DBG: 486 case EOBJ_S_C_EDBG: 487 err = _bfd_vms_slurp_dbg (abfd, prev_type); 488 break; 489 case OBJ_S_C_TBT: 490 case EOBJ_S_C_ETBT: 491 err = _bfd_vms_slurp_tbt (abfd, prev_type); 492 break; 493 case OBJ_S_C_LNK: 494 err = _bfd_vms_slurp_lnk (abfd, prev_type); 495 break; 496 default: 497 err = -1; 498 } 499 if (err != 0) 500 { 501 #if VMS_DEBUG 502 vms_debug (2, "slurp type %d failed with %d\n", prev_type, err); 503 #endif 504 goto err_wrong_format; 505 } 506 } 507 while ((prev_type != EOBJ_S_C_EEOM) && (prev_type != OBJ_S_C_EOM) && (prev_type != OBJ_S_C_EOMW)); 508 509 if (target_vector == &vms_vax_vec) 510 { 511 if (! vms_fixup_sections (abfd)) 512 { 513 #if VMS_DEBUG 514 vms_debug (2, "vms_fixup_sections failed\n"); 515 #endif 516 goto err_wrong_format; 517 } 518 519 /* set arch_info to vax */ 520 521 arch = bfd_scan_arch ("vax"); 522 PRIV (is_vax) = 1; 523 #if VMS_DEBUG 524 vms_debug (2, "arch is vax\n"); 525 #endif 526 } 527 else if (target_vector == &vms_alpha_vec) 528 { 529 /* set arch_info to alpha */ 530 531 arch = bfd_scan_arch ("alpha"); 532 PRIV (is_vax) = 0; 533 #if VMS_DEBUG 534 vms_debug (2, "arch is alpha\n"); 535 #endif 536 } 537 538 if (arch == 0) 539 { 540 #if VMS_DEBUG 541 vms_debug (2, "arch not found\n"); 542 #endif 543 goto err_wrong_format; 544 } 545 abfd->arch_info = arch; 546 547 return target_vector; 548 549 err_wrong_format: 550 bfd_set_error (bfd_error_wrong_format); 551 error_ret: 552 if (abfd->tdata.any != tdata_save && abfd->tdata.any != NULL) 553 bfd_release (abfd, abfd->tdata.any); 554 abfd->tdata.any = tdata_save; 555 bfd_set_start_address (abfd, saddr_save); 556 return NULL; 557 } 558 559 /* Check the format for a file being read. 560 Return a (bfd_target *) if it's an archive file or zero. */ 561 562 static const struct bfd_target * 563 vms_archive_p (abfd) 564 bfd *abfd ATTRIBUTE_UNUSED; 565 { 566 #if VMS_DEBUG 567 vms_debug (1, "vms_archive_p(%p)\n", abfd); 568 #endif 569 570 return 0; 571 } 572 573 /* Set the format of a file being written. */ 574 575 static bfd_boolean 576 vms_mkobject (abfd) 577 bfd *abfd; 578 { 579 #if VMS_DEBUG 580 vms_debug (1, "vms_mkobject(%p)\n", abfd); 581 #endif 582 583 if (!vms_initialize (abfd)) 584 return 0; 585 586 { 587 #ifdef __VAX 588 const bfd_arch_info_type *arch = bfd_scan_arch ("vax"); 589 #else 590 const bfd_arch_info_type *arch = bfd_scan_arch ("alpha"); 591 #endif 592 if (arch == 0) 593 { 594 bfd_set_error(bfd_error_wrong_format); 595 return 0; 596 } 597 abfd->arch_info = arch; 598 } 599 600 return TRUE; 601 } 602 603 /* Write cached information into a file being written, at bfd_close. */ 604 605 static bfd_boolean 606 vms_write_object_contents (abfd) 607 bfd *abfd; 608 { 609 #if VMS_DEBUG 610 vms_debug (1, "vms_write_object_contents(%p)\n", abfd); 611 #endif 612 613 if (abfd->section_count > 0) /* we have sections */ 614 { 615 if (PRIV (is_vax)) 616 { 617 if (_bfd_vms_write_hdr (abfd, OBJ_S_C_HDR) != 0) 618 return FALSE; 619 if (_bfd_vms_write_gsd (abfd, OBJ_S_C_GSD) != 0) 620 return FALSE; 621 if (_bfd_vms_write_tir (abfd, OBJ_S_C_TIR) != 0) 622 return FALSE; 623 if (_bfd_vms_write_tbt (abfd, OBJ_S_C_TBT) != 0) 624 return FALSE; 625 if (_bfd_vms_write_dbg (abfd, OBJ_S_C_DBG) != 0) 626 return FALSE; 627 if (abfd->section_count > 255) 628 { 629 if (_bfd_vms_write_eom (abfd, OBJ_S_C_EOMW) != 0) 630 return FALSE; 631 } 632 else 633 { 634 if (_bfd_vms_write_eom (abfd, OBJ_S_C_EOM) != 0) 635 return FALSE; 636 } 637 } 638 else 639 { 640 if (_bfd_vms_write_hdr (abfd, EOBJ_S_C_EMH) != 0) 641 return FALSE; 642 if (_bfd_vms_write_gsd (abfd, EOBJ_S_C_EGSD) != 0) 643 return FALSE; 644 if (_bfd_vms_write_tir (abfd, EOBJ_S_C_ETIR) != 0) 645 return FALSE; 646 if (_bfd_vms_write_tbt (abfd, EOBJ_S_C_ETBT) != 0) 647 return FALSE; 648 if (_bfd_vms_write_dbg (abfd, EOBJ_S_C_EDBG) != 0) 649 return FALSE; 650 if (_bfd_vms_write_eom (abfd, EOBJ_S_C_EEOM) != 0) 651 return FALSE; 652 } 653 } 654 return TRUE; 655 } 656 657 /*-- 4.1, generic -----------------------------------------------------------*/ 658 659 /* Called when the BFD is being closed to do any necessary cleanup. */ 660 661 static bfd_boolean 662 vms_close_and_cleanup (abfd) 663 bfd *abfd; 664 { 665 #if VMS_DEBUG 666 vms_debug (1, "vms_close_and_cleanup(%p)\n", abfd); 667 #endif 668 if (abfd == 0) 669 return TRUE; 670 671 if (PRIV (vms_buf) != NULL) 672 free (PRIV (vms_buf)); 673 674 if (PRIV (sections) != NULL) 675 free (PRIV (sections)); 676 677 if (PRIV (vms_symbol_table)) 678 bfd_hash_table_free (PRIV (vms_symbol_table)); 679 680 bfd_release (abfd, abfd->tdata.any); 681 abfd->tdata.any = NULL; 682 683 return TRUE; 684 } 685 686 /* Ask the BFD to free all cached information. */ 687 static bfd_boolean 688 vms_bfd_free_cached_info (abfd) 689 bfd *abfd ATTRIBUTE_UNUSED; 690 { 691 #if VMS_DEBUG 692 vms_debug (1, "vms_bfd_free_cached_info(%p)\n", abfd); 693 #endif 694 return TRUE; 695 } 696 697 /* Called when a new section is created. */ 698 699 static bfd_boolean 700 vms_new_section_hook (abfd, section) 701 bfd *abfd; 702 asection *section; 703 { 704 /* Count hasn't been incremented yet. */ 705 unsigned int section_count = abfd->section_count + 1; 706 707 #if VMS_DEBUG 708 vms_debug (1, "vms_new_section_hook (%p, [%d]%s), count %d\n", 709 abfd, section->index, section->name, section_count); 710 #endif 711 bfd_set_section_alignment (abfd, section, 4); 712 713 if (section_count > PRIV (section_count)) 714 { 715 bfd_size_type amt = section_count; 716 amt *= sizeof (asection *); 717 PRIV (sections) = (asection **) bfd_realloc (PRIV (sections), amt); 718 if (PRIV (sections) == 0) 719 return FALSE; 720 PRIV (section_count) = section_count; 721 } 722 #if VMS_DEBUG 723 vms_debug (6, "section_count: %d\n", PRIV (section_count)); 724 #endif 725 PRIV (sections)[section->index] = section; 726 #if VMS_DEBUG 727 vms_debug (7, "%d: %s\n", section->index, section->name); 728 #endif 729 730 return TRUE; 731 } 732 733 /* Read the contents of a section. 734 buf points to a buffer of buf_size bytes to be filled with 735 section data (starting at offset into section) */ 736 737 static bfd_boolean 738 vms_get_section_contents (abfd, section, buf, offset, buf_size) 739 bfd *abfd ATTRIBUTE_UNUSED; 740 asection *section ATTRIBUTE_UNUSED; 741 PTR buf ATTRIBUTE_UNUSED; 742 file_ptr offset ATTRIBUTE_UNUSED; 743 bfd_size_type buf_size ATTRIBUTE_UNUSED; 744 { 745 #if VMS_DEBUG 746 vms_debug (1, "vms_get_section_contents(%p, %s, %p, off %ld, size %d)\n", 747 abfd, section->name, buf, offset, (int)buf_size); 748 #endif 749 750 /* shouldn't be called, since all sections are IN_MEMORY */ 751 752 return FALSE; 753 } 754 755 /* Read the contents of a section. 756 buf points to a buffer of buf_size bytes to be filled with 757 section data (starting at offset into section) */ 758 759 static bfd_boolean 760 vms_get_section_contents_in_window (abfd, section, w, offset, count) 761 bfd *abfd ATTRIBUTE_UNUSED; 762 asection *section ATTRIBUTE_UNUSED; 763 bfd_window *w ATTRIBUTE_UNUSED; 764 file_ptr offset ATTRIBUTE_UNUSED; 765 bfd_size_type count ATTRIBUTE_UNUSED; 766 { 767 #if VMS_DEBUG 768 vms_debug (1, "vms_get_section_contents_in_window(%p, %s, %p, off %ld, count %d)\n", 769 abfd, section->name, w, offset, (int)count); 770 #endif 771 772 /* shouldn't be called, since all sections are IN_MEMORY */ 773 774 return FALSE; 775 } 776 777 /*-- Part 4.2, copy private data --------------------------------------------*/ 778 779 /* Called to copy BFD general private data from one object file 780 to another. */ 781 782 static bfd_boolean 783 vms_bfd_copy_private_bfd_data (src, dest) 784 bfd *src ATTRIBUTE_UNUSED; 785 bfd *dest ATTRIBUTE_UNUSED; 786 { 787 #if VMS_DEBUG 788 vms_debug (1, "vms_bfd_copy_private_bfd_data(%p, %p)\n", src, dest); 789 #endif 790 return TRUE; 791 } 792 793 /* Merge private BFD information from the BFD @var{ibfd} to the 794 the output file BFD @var{obfd} when linking. Return <<TRUE>> 795 on success, <<FALSE>> on error. Possible error returns are: 796 797 o <<bfd_error_no_memory>> - 798 Not enough memory exists to create private data for @var{obfd}. */ 799 800 static bfd_boolean 801 vms_bfd_merge_private_bfd_data (ibfd, obfd) 802 bfd *ibfd ATTRIBUTE_UNUSED; 803 bfd *obfd ATTRIBUTE_UNUSED; 804 { 805 #if VMS_DEBUG 806 vms_debug (1,"vms_bfd_merge_private_bfd_data(%p, %p)\n", ibfd, obfd); 807 #endif 808 return TRUE; 809 } 810 811 /* Set private BFD flag information in the BFD @var{abfd}. 812 Return <<TRUE>> on success, <<FALSE>> on error. Possible error 813 returns are: 814 815 o <<bfd_error_no_memory>> - 816 Not enough memory exists to create private data for @var{obfd}. */ 817 818 static bfd_boolean 819 vms_bfd_set_private_flags (abfd, flags) 820 bfd *abfd ATTRIBUTE_UNUSED; 821 flagword flags ATTRIBUTE_UNUSED; 822 { 823 #if VMS_DEBUG 824 vms_debug (1,"vms_bfd_set_private_flags(%p, %lx)\n", abfd, (long)flags); 825 #endif 826 return TRUE; 827 } 828 829 /* Called to copy BFD private section data from one object file 830 to another. */ 831 832 static bfd_boolean 833 vms_bfd_copy_private_section_data (srcbfd, srcsec, dstbfd, dstsec) 834 bfd *srcbfd ATTRIBUTE_UNUSED; 835 asection *srcsec ATTRIBUTE_UNUSED; 836 bfd *dstbfd ATTRIBUTE_UNUSED; 837 asection *dstsec ATTRIBUTE_UNUSED; 838 { 839 #if VMS_DEBUG 840 vms_debug (1, "vms_bfd_copy_private_section_data(%p, %s, %p, %s)\n", 841 srcbfd, srcsec->name, dstbfd, dstsec->name); 842 #endif 843 return TRUE; 844 } 845 846 /* Called to copy BFD private symbol data from one object file 847 to another. */ 848 849 static bfd_boolean 850 vms_bfd_copy_private_symbol_data (ibfd, isym, obfd, osym) 851 bfd *ibfd ATTRIBUTE_UNUSED; 852 asymbol *isym ATTRIBUTE_UNUSED; 853 bfd *obfd ATTRIBUTE_UNUSED; 854 asymbol *osym ATTRIBUTE_UNUSED; 855 { 856 #if VMS_DEBUG 857 vms_debug (1, "vms_bfd_copy_private_symbol_data(%p, %s, %p, %s)\n", 858 ibfd, isym->name, obfd, osym->name); 859 #endif 860 return TRUE; 861 } 862 863 /*-- Part 4.3, core file ----------------------------------------------------*/ 864 865 /* Return a read-only string explaining which program was running 866 when it failed and produced the core file abfd. */ 867 868 static char * 869 vms_core_file_failing_command (abfd) 870 bfd *abfd ATTRIBUTE_UNUSED; 871 { 872 #if VMS_DEBUG 873 vms_debug (1, "vms_core_file_failing_command(%p)\n", abfd); 874 #endif 875 return 0; 876 } 877 878 /* Returns the signal number which caused the core dump which 879 generated the file the BFD abfd is attached to. */ 880 881 static int 882 vms_core_file_failing_signal (abfd) 883 bfd *abfd ATTRIBUTE_UNUSED; 884 { 885 #if VMS_DEBUG 886 vms_debug (1, "vms_core_file_failing_signal(%p)\n", abfd); 887 #endif 888 return 0; 889 } 890 891 /* Return TRUE if the core file attached to core_bfd was generated 892 by a run of the executable file attached to exec_bfd, FALSE otherwise. */ 893 894 static bfd_boolean 895 vms_core_file_matches_executable_p (abfd, bbfd) 896 bfd *abfd ATTRIBUTE_UNUSED; 897 bfd *bbfd ATTRIBUTE_UNUSED; 898 { 899 #if VMS_DEBUG 900 vms_debug (1, "vms_core_file_matches_executable_p(%p, %p)\n", abfd, bbfd); 901 #endif 902 return FALSE; 903 } 904 905 /*-- Part 4.4, archive ------------------------------------------------------*/ 906 907 /* ??? do something with an archive map. 908 Return FALSE on error, TRUE otherwise. */ 909 910 static bfd_boolean 911 vms_slurp_armap (abfd) 912 bfd *abfd ATTRIBUTE_UNUSED; 913 { 914 #if VMS_DEBUG 915 vms_debug (1, "vms_slurp_armap(%p)\n", abfd); 916 #endif 917 return FALSE; 918 } 919 920 /* ??? do something with an extended name table. 921 Return FALSE on error, TRUE otherwise. */ 922 923 static bfd_boolean 924 vms_slurp_extended_name_table (abfd) 925 bfd *abfd ATTRIBUTE_UNUSED; 926 { 927 #if VMS_DEBUG 928 vms_debug (1, "vms_slurp_extended_name_table(%p)\n", abfd); 929 #endif 930 return FALSE; 931 } 932 933 /* ??? do something with an extended name table. 934 Return FALSE on error, TRUE otherwise. */ 935 936 static bfd_boolean 937 vms_construct_extended_name_table (abfd, tabloc, tablen, name) 938 bfd *abfd ATTRIBUTE_UNUSED; 939 char **tabloc ATTRIBUTE_UNUSED; 940 bfd_size_type *tablen ATTRIBUTE_UNUSED; 941 const char **name ATTRIBUTE_UNUSED; 942 { 943 #if VMS_DEBUG 944 vms_debug (1, "vms_construct_extended_name_table(%p)\n", abfd); 945 #endif 946 return FALSE; 947 } 948 949 /* Truncate the name of an archive to match system-dependent restrictions */ 950 951 static void 952 vms_truncate_arname (abfd, pathname, arhdr) 953 bfd *abfd ATTRIBUTE_UNUSED; 954 const char *pathname ATTRIBUTE_UNUSED; 955 char *arhdr ATTRIBUTE_UNUSED; 956 { 957 #if VMS_DEBUG 958 vms_debug (1, "vms_truncate_arname(%p, %s, %s)\n", abfd, pathname, arhdr); 959 #endif 960 return; 961 } 962 963 /* ??? write archive map */ 964 965 static bfd_boolean 966 vms_write_armap (arch, elength, map, orl_count, stridx) 967 bfd *arch ATTRIBUTE_UNUSED; 968 unsigned int elength ATTRIBUTE_UNUSED; 969 struct orl *map ATTRIBUTE_UNUSED; 970 unsigned int orl_count ATTRIBUTE_UNUSED; 971 int stridx ATTRIBUTE_UNUSED; 972 { 973 #if VMS_DEBUG 974 vms_debug (1, "vms_write_armap(%p, %d, %p, %d %d)\n", 975 arch, elength, map, orl_count, stridx); 976 #endif 977 return TRUE; 978 } 979 980 /* Read archive header ??? */ 981 982 static PTR 983 vms_read_ar_hdr (abfd) 984 bfd * abfd ATTRIBUTE_UNUSED; 985 { 986 #if VMS_DEBUG 987 vms_debug (1, "vms_read_ar_hdr(%p)\n", abfd); 988 #endif 989 return (PTR)0; 990 } 991 992 /* Provided a BFD, @var{archive}, containing an archive and NULL, open 993 an input BFD on the first contained element and returns that. 994 Subsequent calls should pass the archive and the previous return value 995 to return a created BFD to the next contained element. 996 NULL is returned when there are no more. */ 997 998 static bfd * 999 vms_openr_next_archived_file (arch, prev) 1000 bfd *arch ATTRIBUTE_UNUSED; 1001 bfd *prev ATTRIBUTE_UNUSED; 1002 { 1003 #if VMS_DEBUG 1004 vms_debug (1, "vms_openr_next_archived_file(%p, %p)\n", arch, prev); 1005 #endif 1006 return NULL; 1007 } 1008 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. */ 1011 1012 static bfd * 1013 vms_get_elt_at_index (abfd, index) 1014 bfd *abfd; 1015 symindex index; 1016 { 1017 #if VMS_DEBUG 1018 vms_debug (1, "vms_get_elt_at_index(%p, %p)\n", abfd, index); 1019 #endif 1020 return _bfd_generic_get_elt_at_index(abfd, index); 1021 } 1022 1023 /* ??? 1024 -> bfd_generic_stat_arch_elt */ 1025 1026 static int 1027 vms_generic_stat_arch_elt (abfd, st) 1028 bfd *abfd; 1029 struct stat *st; 1030 { 1031 #if VMS_DEBUG 1032 vms_debug (1, "vms_generic_stat_arch_elt(%p, %p)\n", abfd, st); 1033 #endif 1034 return bfd_generic_stat_arch_elt (abfd, st); 1035 } 1036 1037 /* This is a new function in bfd 2.5 */ 1038 1039 static bfd_boolean 1040 vms_update_armap_timestamp (abfd) 1041 bfd *abfd ATTRIBUTE_UNUSED; 1042 { 1043 #if VMS_DEBUG 1044 vms_debug (1, "vms_update_armap_timestamp(%p)\n", abfd); 1045 #endif 1046 return TRUE; 1047 } 1048 1049 /*-- Part 4.5, symbols --------------------------------------------------------*/ 1050 1051 /* Return the number of bytes required to store a vector of pointers 1052 to asymbols for all the symbols in the BFD abfd, including a 1053 terminal NULL pointer. If there are no symbols in the BFD, 1054 then return 0. If an error occurs, return -1. */ 1055 1056 static long 1057 vms_get_symtab_upper_bound (abfd) 1058 bfd *abfd; 1059 { 1060 #if VMS_DEBUG 1061 vms_debug (1, "vms_get_symtab_upper_bound(%p), %d symbols\n", abfd, PRIV (gsd_sym_count)); 1062 #endif 1063 return (PRIV (gsd_sym_count)+1) * sizeof (asymbol *); 1064 } 1065 1066 /* Copy symbols from hash table to symbol vector 1067 1068 called from bfd_hash_traverse in vms_canonicalize_symtab 1069 init counter to 0 if entry == 0 */ 1070 1071 static bfd_boolean 1072 copy_symbols (entry, arg) 1073 struct bfd_hash_entry *entry; 1074 PTR arg; 1075 { 1076 bfd *abfd = (bfd *) arg; 1077 1078 if (entry == NULL) /* init counter */ 1079 PRIV (symnum) = 0; 1080 else /* fill vector, inc counter */ 1081 PRIV (symcache)[PRIV (symnum)++] = ((vms_symbol_entry *)entry)->symbol; 1082 1083 return TRUE; 1084 } 1085 1086 /* Read the symbols from the BFD abfd, and fills in the vector 1087 location with pointers to the symbols and a trailing NULL. 1088 1089 return # of symbols read */ 1090 1091 static long 1092 vms_canonicalize_symtab (abfd, symbols) 1093 bfd *abfd; 1094 asymbol **symbols; 1095 { 1096 #if VMS_DEBUG 1097 vms_debug (1, "vms_canonicalize_symtab(%p, <ret>)\n", abfd); 1098 #endif 1099 1100 /* init counter */ 1101 (void)copy_symbols((struct bfd_hash_entry *)0, abfd); 1102 1103 /* traverse table and fill symbols vector */ 1104 1105 PRIV (symcache) = symbols; 1106 bfd_hash_traverse(PRIV (vms_symbol_table), copy_symbols, (PTR)abfd); 1107 1108 symbols[PRIV (gsd_sym_count)] = NULL; 1109 1110 return PRIV (gsd_sym_count); 1111 } 1112 1113 /* Print symbol to file according to how. how is one of 1114 bfd_print_symbol_name just print the name 1115 bfd_print_symbol_more print more (???) 1116 bfd_print_symbol_all print all we know, which is not much right now :-) */ 1117 1118 static void 1119 vms_print_symbol (abfd, file, symbol, how) 1120 bfd *abfd; 1121 PTR file; 1122 asymbol *symbol; 1123 bfd_print_symbol_type how; 1124 { 1125 #if VMS_DEBUG 1126 vms_debug (1, "vms_print_symbol(%p, %p, %p, %d)\n", abfd, file, symbol, how); 1127 #endif 1128 1129 switch (how) 1130 { 1131 case bfd_print_symbol_name: 1132 case bfd_print_symbol_more: 1133 fprintf ((FILE *)file," %s", symbol->name); 1134 break; 1135 1136 case bfd_print_symbol_all: 1137 { 1138 const char *section_name = symbol->section->name; 1139 1140 bfd_print_symbol_vandf (abfd, (PTR)file, symbol); 1141 1142 fprintf ((FILE *)file," %-8s %s", section_name, symbol->name); 1143 } 1144 break; 1145 } 1146 return; 1147 } 1148 1149 /* Return information about symbol in ret. 1150 1151 fill type, value and name 1152 type: 1153 A absolute 1154 B bss segment symbol 1155 C common symbol 1156 D data segment symbol 1157 f filename 1158 t a static function symbol 1159 T text segment symbol 1160 U undefined 1161 - debug */ 1162 1163 static void 1164 vms_get_symbol_info (abfd, symbol, ret) 1165 bfd *abfd ATTRIBUTE_UNUSED; 1166 asymbol *symbol; 1167 symbol_info *ret; 1168 { 1169 asection *sec; 1170 1171 #if VMS_DEBUG 1172 vms_debug (1, "vms_get_symbol_info(%p, %p, %p)\n", abfd, symbol, ret); 1173 #endif 1174 1175 sec = symbol->section; 1176 1177 if (ret == 0) 1178 return; 1179 1180 if (bfd_is_com_section (sec)) 1181 ret->type = 'C'; 1182 else if (bfd_is_abs_section (sec)) 1183 ret->type = 'A'; 1184 else if (bfd_is_und_section (sec)) 1185 ret->type = 'U'; 1186 else if (bfd_is_ind_section (sec)) 1187 ret->type = 'I'; 1188 else if (bfd_get_section_flags (abfd, sec) & SEC_CODE) 1189 ret->type = 'T'; 1190 else if (bfd_get_section_flags (abfd, sec) & SEC_DATA) 1191 ret->type = 'D'; 1192 else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC) 1193 ret->type = 'B'; 1194 else 1195 ret->type = '-'; 1196 1197 if (ret->type != 'U') 1198 ret->value = symbol->value + symbol->section->vma; 1199 else 1200 ret->value = 0; 1201 ret->name = symbol->name; 1202 1203 return; 1204 } 1205 1206 /* Return TRUE if the given symbol sym in the BFD abfd is 1207 a compiler generated local label, else return FALSE. */ 1208 1209 static bfd_boolean 1210 vms_bfd_is_local_label_name (abfd, name) 1211 bfd *abfd ATTRIBUTE_UNUSED; 1212 const char *name; 1213 { 1214 #if VMS_DEBUG 1215 vms_debug (1, "vms_bfd_is_local_label_name(%p, %s)\n", abfd, name); 1216 #endif 1217 return name[0] == '$'; 1218 } 1219 1220 /* Get source line number for symbol */ 1221 1222 static alent * 1223 vms_get_lineno (abfd, symbol) 1224 bfd *abfd ATTRIBUTE_UNUSED; 1225 asymbol *symbol ATTRIBUTE_UNUSED; 1226 { 1227 #if VMS_DEBUG 1228 vms_debug (1, "vms_get_lineno(%p, %p)\n", abfd, symbol); 1229 #endif 1230 return 0; 1231 } 1232 1233 /* Provided a BFD, a section and an offset into the section, calculate and 1234 return the name of the source file and the line nearest to the wanted 1235 location. */ 1236 1237 static bfd_boolean 1238 vms_find_nearest_line (abfd, section, symbols, offset, file, func, line) 1239 bfd *abfd ATTRIBUTE_UNUSED; 1240 asection *section ATTRIBUTE_UNUSED; 1241 asymbol **symbols ATTRIBUTE_UNUSED; 1242 bfd_vma offset ATTRIBUTE_UNUSED; 1243 const char **file ATTRIBUTE_UNUSED; 1244 const char **func ATTRIBUTE_UNUSED; 1245 unsigned int *line ATTRIBUTE_UNUSED; 1246 { 1247 #if VMS_DEBUG 1248 vms_debug (1, "vms_find_nearest_line(%p, %s, %p, %ld, <ret>, <ret>, <ret>)\n", 1249 abfd, section->name, symbols, (long int)offset); 1250 #endif 1251 return FALSE; 1252 } 1253 1254 /* Back-door to allow format-aware applications to create debug symbols 1255 while using BFD for everything else. Currently used by the assembler 1256 when creating COFF files. */ 1257 1258 static asymbol * 1259 vms_bfd_make_debug_symbol (abfd, ptr, size) 1260 bfd *abfd ATTRIBUTE_UNUSED; 1261 void *ptr ATTRIBUTE_UNUSED; 1262 unsigned long size ATTRIBUTE_UNUSED; 1263 { 1264 #if VMS_DEBUG 1265 vms_debug (1, "vms_bfd_make_debug_symbol(%p, %p, %ld)\n", abfd, ptr, size); 1266 #endif 1267 return 0; 1268 } 1269 1270 /* Read minisymbols. For minisymbols, we use the unmodified a.out 1271 symbols. The minisymbol_to_symbol function translates these into 1272 BFD asymbol structures. */ 1273 1274 static long 1275 vms_read_minisymbols (abfd, dynamic, minisymsp, sizep) 1276 bfd *abfd; 1277 bfd_boolean dynamic; 1278 PTR *minisymsp; 1279 unsigned int *sizep; 1280 { 1281 #if VMS_DEBUG 1282 vms_debug (1, "vms_read_minisymbols(%p, %d, %p, %d)\n", abfd, dynamic, minisymsp, *sizep); 1283 #endif 1284 return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep); 1285 } 1286 1287 /* Convert a minisymbol to a BFD asymbol. A minisymbol is just an 1288 unmodified a.out symbol. The SYM argument is a structure returned 1289 by bfd_make_empty_symbol, which we fill in here. */ 1290 1291 static asymbol * 1292 vms_minisymbol_to_symbol (abfd, dynamic, minisym, sym) 1293 bfd *abfd; 1294 bfd_boolean dynamic; 1295 const PTR minisym; 1296 asymbol *sym; 1297 { 1298 #if VMS_DEBUG 1299 vms_debug (1, "vms_minisymbol_to_symbol(%p, %d, %p, %p)\n", abfd, dynamic, minisym, sym); 1300 #endif 1301 return _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym); 1302 } 1303 1304 /*-- Part 4.6, relocations --------------------------------------------------*/ 1305 1306 /* Return the number of bytes required to store the relocation information 1307 associated with section sect attached to bfd abfd. 1308 If an error occurs, return -1. */ 1309 1310 static long 1311 vms_get_reloc_upper_bound (abfd, section) 1312 bfd *abfd ATTRIBUTE_UNUSED; 1313 asection *section ATTRIBUTE_UNUSED; 1314 { 1315 #if VMS_DEBUG 1316 vms_debug (1, "vms_get_reloc_upper_bound(%p, %s)\n", abfd, section->name); 1317 #endif 1318 return -1L; 1319 } 1320 1321 /* Call the back end associated with the open BFD abfd and translate the 1322 external form of the relocation information attached to sec into the 1323 internal canonical form. Place the table into memory at loc, which has 1324 been preallocated, usually by a call to bfd_get_reloc_upper_bound. 1325 Returns the number of relocs, or -1 on error. */ 1326 1327 static long 1328 vms_canonicalize_reloc (abfd, section, location, symbols) 1329 bfd *abfd ATTRIBUTE_UNUSED; 1330 asection *section ATTRIBUTE_UNUSED; 1331 arelent **location ATTRIBUTE_UNUSED; 1332 asymbol **symbols ATTRIBUTE_UNUSED; 1333 { 1334 #if VMS_DEBUG 1335 vms_debug (1, "vms_canonicalize_reloc(%p, %s, <ret>, <ret>)\n", abfd, section->name); 1336 #endif 1337 return FALSE; 1338 } 1339 1340 /*---------------------------------------------------------------------------*/ 1341 /* this is just copied from ecoff-alpha, needs to be fixed probably */ 1342 1343 /* How to process the various reloc types. */ 1344 1345 static bfd_reloc_status_type 1346 reloc_nil (abfd, reloc, sym, data, sec, output_bfd, error_message) 1347 bfd *abfd ATTRIBUTE_UNUSED; 1348 arelent *reloc ATTRIBUTE_UNUSED; 1349 asymbol *sym ATTRIBUTE_UNUSED; 1350 PTR data ATTRIBUTE_UNUSED; 1351 asection *sec ATTRIBUTE_UNUSED; 1352 bfd *output_bfd ATTRIBUTE_UNUSED; 1353 char **error_message ATTRIBUTE_UNUSED; 1354 { 1355 #if VMS_DEBUG 1356 vms_debug (1, "reloc_nil(abfd %p, output_bfd %p)\n", abfd, output_bfd); 1357 vms_debug (2, "In section %s, symbol %s\n", 1358 sec->name, sym->name); 1359 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n", 1360 reloc->sym_ptr_ptr[0]->name, 1361 (unsigned long)reloc->address, 1362 (unsigned long)reloc->addend, reloc->howto->name); 1363 vms_debug (2, "data at %p\n", data); 1364 /* _bfd_hexdump (2, data, bfd_get_reloc_size(reloc->howto),0); */ 1365 #endif 1366 1367 return bfd_reloc_ok; 1368 } 1369 1370 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value 1371 from smaller values. Start with zero, widen, *then* decrement. */ 1372 #define MINUS_ONE (((bfd_vma)0) - 1) 1373 1374 static reloc_howto_type alpha_howto_table[] = 1375 { 1376 HOWTO (ALPHA_R_IGNORE, /* type */ 1377 0, /* rightshift */ 1378 0, /* size (0 = byte, 1 = short, 2 = long) */ 1379 8, /* bitsize */ 1380 TRUE, /* pc_relative */ 1381 0, /* bitpos */ 1382 complain_overflow_dont, /* complain_on_overflow */ 1383 reloc_nil, /* special_function */ 1384 "IGNORE", /* name */ 1385 TRUE, /* partial_inplace */ 1386 0, /* src_mask */ 1387 0, /* dst_mask */ 1388 TRUE), /* pcrel_offset */ 1389 1390 /* A 64 bit reference to a symbol. */ 1391 HOWTO (ALPHA_R_REFQUAD, /* type */ 1392 0, /* rightshift */ 1393 4, /* size (0 = byte, 1 = short, 2 = long) */ 1394 64, /* bitsize */ 1395 FALSE, /* pc_relative */ 1396 0, /* bitpos */ 1397 complain_overflow_bitfield, /* complain_on_overflow */ 1398 reloc_nil, /* special_function */ 1399 "REFQUAD", /* name */ 1400 TRUE, /* partial_inplace */ 1401 MINUS_ONE, /* src_mask */ 1402 MINUS_ONE, /* dst_mask */ 1403 FALSE), /* pcrel_offset */ 1404 1405 /* A 21 bit branch. The native assembler generates these for 1406 branches within the text segment, and also fills in the PC 1407 relative offset in the instruction. */ 1408 HOWTO (ALPHA_R_BRADDR, /* type */ 1409 2, /* rightshift */ 1410 2, /* size (0 = byte, 1 = short, 2 = long) */ 1411 21, /* bitsize */ 1412 TRUE, /* pc_relative */ 1413 0, /* bitpos */ 1414 complain_overflow_signed, /* complain_on_overflow */ 1415 reloc_nil, /* special_function */ 1416 "BRADDR", /* name */ 1417 TRUE, /* partial_inplace */ 1418 0x1fffff, /* src_mask */ 1419 0x1fffff, /* dst_mask */ 1420 FALSE), /* pcrel_offset */ 1421 1422 /* A hint for a jump to a register. */ 1423 HOWTO (ALPHA_R_HINT, /* type */ 1424 2, /* rightshift */ 1425 1, /* size (0 = byte, 1 = short, 2 = long) */ 1426 14, /* bitsize */ 1427 TRUE, /* pc_relative */ 1428 0, /* bitpos */ 1429 complain_overflow_dont, /* complain_on_overflow */ 1430 reloc_nil, /* special_function */ 1431 "HINT", /* name */ 1432 TRUE, /* partial_inplace */ 1433 0x3fff, /* src_mask */ 1434 0x3fff, /* dst_mask */ 1435 FALSE), /* pcrel_offset */ 1436 1437 /* 16 bit PC relative offset. */ 1438 HOWTO (ALPHA_R_SREL16, /* type */ 1439 0, /* rightshift */ 1440 1, /* size (0 = byte, 1 = short, 2 = long) */ 1441 16, /* bitsize */ 1442 TRUE, /* pc_relative */ 1443 0, /* bitpos */ 1444 complain_overflow_signed, /* complain_on_overflow */ 1445 reloc_nil, /* special_function */ 1446 "SREL16", /* name */ 1447 TRUE, /* partial_inplace */ 1448 0xffff, /* src_mask */ 1449 0xffff, /* dst_mask */ 1450 FALSE), /* pcrel_offset */ 1451 1452 /* 32 bit PC relative offset. */ 1453 HOWTO (ALPHA_R_SREL32, /* type */ 1454 0, /* rightshift */ 1455 2, /* size (0 = byte, 1 = short, 2 = long) */ 1456 32, /* bitsize */ 1457 TRUE, /* pc_relative */ 1458 0, /* bitpos */ 1459 complain_overflow_signed, /* complain_on_overflow */ 1460 reloc_nil, /* special_function */ 1461 "SREL32", /* name */ 1462 TRUE, /* partial_inplace */ 1463 0xffffffff, /* src_mask */ 1464 0xffffffff, /* dst_mask */ 1465 FALSE), /* pcrel_offset */ 1466 1467 /* A 64 bit PC relative offset. */ 1468 HOWTO (ALPHA_R_SREL64, /* type */ 1469 0, /* rightshift */ 1470 4, /* size (0 = byte, 1 = short, 2 = long) */ 1471 64, /* bitsize */ 1472 TRUE, /* pc_relative */ 1473 0, /* bitpos */ 1474 complain_overflow_signed, /* complain_on_overflow */ 1475 reloc_nil, /* special_function */ 1476 "SREL64", /* name */ 1477 TRUE, /* partial_inplace */ 1478 MINUS_ONE, /* src_mask */ 1479 MINUS_ONE, /* dst_mask */ 1480 FALSE), /* pcrel_offset */ 1481 1482 /* Push a value on the reloc evaluation stack. */ 1483 HOWTO (ALPHA_R_OP_PUSH, /* type */ 1484 0, /* rightshift */ 1485 0, /* size (0 = byte, 1 = short, 2 = long) */ 1486 0, /* bitsize */ 1487 FALSE, /* pc_relative */ 1488 0, /* bitpos */ 1489 complain_overflow_dont, /* complain_on_overflow */ 1490 reloc_nil, /* special_function */ 1491 "OP_PUSH", /* name */ 1492 FALSE, /* partial_inplace */ 1493 0, /* src_mask */ 1494 0, /* dst_mask */ 1495 FALSE), /* pcrel_offset */ 1496 1497 /* Store the value from the stack at the given address. Store it in 1498 a bitfield of size r_size starting at bit position r_offset. */ 1499 HOWTO (ALPHA_R_OP_STORE, /* type */ 1500 0, /* rightshift */ 1501 4, /* size (0 = byte, 1 = short, 2 = long) */ 1502 64, /* bitsize */ 1503 FALSE, /* pc_relative */ 1504 0, /* bitpos */ 1505 complain_overflow_dont, /* complain_on_overflow */ 1506 reloc_nil, /* special_function */ 1507 "OP_STORE", /* name */ 1508 FALSE, /* partial_inplace */ 1509 0, /* src_mask */ 1510 MINUS_ONE, /* dst_mask */ 1511 FALSE), /* pcrel_offset */ 1512 1513 /* Subtract the reloc address from the value on the top of the 1514 relocation stack. */ 1515 HOWTO (ALPHA_R_OP_PSUB, /* type */ 1516 0, /* rightshift */ 1517 0, /* size (0 = byte, 1 = short, 2 = long) */ 1518 0, /* bitsize */ 1519 FALSE, /* pc_relative */ 1520 0, /* bitpos */ 1521 complain_overflow_dont, /* complain_on_overflow */ 1522 reloc_nil, /* special_function */ 1523 "OP_PSUB", /* name */ 1524 FALSE, /* partial_inplace */ 1525 0, /* src_mask */ 1526 0, /* dst_mask */ 1527 FALSE), /* pcrel_offset */ 1528 1529 /* Shift the value on the top of the relocation stack right by the 1530 given value. */ 1531 HOWTO (ALPHA_R_OP_PRSHIFT, /* type */ 1532 0, /* rightshift */ 1533 0, /* size (0 = byte, 1 = short, 2 = long) */ 1534 0, /* bitsize */ 1535 FALSE, /* pc_relative */ 1536 0, /* bitpos */ 1537 complain_overflow_dont, /* complain_on_overflow */ 1538 reloc_nil, /* special_function */ 1539 "OP_PRSHIFT", /* name */ 1540 FALSE, /* partial_inplace */ 1541 0, /* src_mask */ 1542 0, /* dst_mask */ 1543 FALSE), /* pcrel_offset */ 1544 1545 /* Hack. Linkage is done by linker. */ 1546 HOWTO (ALPHA_R_LINKAGE, /* type */ 1547 0, /* rightshift */ 1548 8, /* size (0 = byte, 1 = short, 2 = long) */ 1549 256, /* bitsize */ 1550 FALSE, /* pc_relative */ 1551 0, /* bitpos */ 1552 complain_overflow_dont, /* complain_on_overflow */ 1553 reloc_nil, /* special_function */ 1554 "LINKAGE", /* name */ 1555 FALSE, /* partial_inplace */ 1556 0, /* src_mask */ 1557 0, /* dst_mask */ 1558 FALSE), /* pcrel_offset */ 1559 1560 /* A 32 bit reference to a symbol. */ 1561 HOWTO (ALPHA_R_REFLONG, /* type */ 1562 0, /* rightshift */ 1563 2, /* size (0 = byte, 1 = short, 2 = long) */ 1564 32, /* bitsize */ 1565 FALSE, /* pc_relative */ 1566 0, /* bitpos */ 1567 complain_overflow_bitfield, /* complain_on_overflow */ 1568 reloc_nil, /* special_function */ 1569 "REFLONG", /* name */ 1570 TRUE, /* partial_inplace */ 1571 0xffffffff, /* src_mask */ 1572 0xffffffff, /* dst_mask */ 1573 FALSE), /* pcrel_offset */ 1574 1575 /* A 64 bit reference to a procedure, written as 32 bit value. */ 1576 HOWTO (ALPHA_R_CODEADDR, /* type */ 1577 0, /* rightshift */ 1578 4, /* size (0 = byte, 1 = short, 2 = long) */ 1579 64, /* bitsize */ 1580 FALSE, /* pc_relative */ 1581 0, /* bitpos */ 1582 complain_overflow_signed,/* complain_on_overflow */ 1583 reloc_nil, /* special_function */ 1584 "CODEADDR", /* name */ 1585 FALSE, /* partial_inplace */ 1586 0xffffffff, /* src_mask */ 1587 0xffffffff, /* dst_mask */ 1588 FALSE), /* pcrel_offset */ 1589 1590 }; 1591 1592 /* Return a pointer to a howto structure which, when invoked, will perform 1593 the relocation code on data from the architecture noted. */ 1594 1595 static const struct reloc_howto_struct * 1596 vms_bfd_reloc_type_lookup (abfd, code) 1597 bfd *abfd ATTRIBUTE_UNUSED; 1598 bfd_reloc_code_real_type code; 1599 { 1600 int alpha_type; 1601 1602 #if VMS_DEBUG 1603 vms_debug (1, "vms_bfd_reloc_type_lookup(%p, %d)\t", abfd, code); 1604 #endif 1605 1606 switch (code) 1607 { 1608 case BFD_RELOC_16: alpha_type = ALPHA_R_SREL16; break; 1609 case BFD_RELOC_32: alpha_type = ALPHA_R_REFLONG; break; 1610 case BFD_RELOC_64: alpha_type = ALPHA_R_REFQUAD; break; 1611 case BFD_RELOC_CTOR: alpha_type = ALPHA_R_REFQUAD; break; 1612 case BFD_RELOC_23_PCREL_S2: alpha_type = ALPHA_R_BRADDR; break; 1613 case BFD_RELOC_ALPHA_HINT: alpha_type = ALPHA_R_HINT; break; 1614 case BFD_RELOC_16_PCREL: alpha_type = ALPHA_R_SREL16; break; 1615 case BFD_RELOC_32_PCREL: alpha_type = ALPHA_R_SREL32; break; 1616 case BFD_RELOC_64_PCREL: alpha_type = ALPHA_R_SREL64; break; 1617 case BFD_RELOC_ALPHA_LINKAGE: alpha_type = ALPHA_R_LINKAGE; break; 1618 case BFD_RELOC_ALPHA_CODEADDR: alpha_type = ALPHA_R_CODEADDR; break; 1619 default: 1620 (*_bfd_error_handler) ("reloc (%d) is *UNKNOWN*", code); 1621 return (const struct reloc_howto_struct *) NULL; 1622 } 1623 #if VMS_DEBUG 1624 vms_debug (2, "reloc is %s\n", alpha_howto_table[alpha_type].name); 1625 #endif 1626 return &alpha_howto_table[alpha_type]; 1627 } 1628 1629 /*-- Part 4.7, writing an object file ---------------------------------------*/ 1630 1631 /* Set the architecture and machine type in BFD abfd to arch and mach. 1632 Find the correct pointer to a structure and insert it into the arch_info 1633 pointer. */ 1634 1635 static bfd_boolean 1636 vms_set_arch_mach (abfd, arch, mach) 1637 bfd *abfd; 1638 enum bfd_architecture arch ATTRIBUTE_UNUSED; 1639 unsigned long mach ATTRIBUTE_UNUSED; 1640 { 1641 #if VMS_DEBUG 1642 vms_debug (1, "vms_set_arch_mach(%p, %d, %ld)\n", abfd, arch, mach); 1643 #endif 1644 abfd->arch_info = bfd_scan_arch("alpha"); 1645 1646 return TRUE; 1647 } 1648 1649 /* Sets the contents of the section section in BFD abfd to the data starting 1650 in memory at data. The data is written to the output section starting at 1651 offset offset for count bytes. 1652 1653 Normally TRUE is returned, else FALSE. Possible error returns are: 1654 o bfd_error_no_contents - The output section does not have the 1655 SEC_HAS_CONTENTS attribute, so nothing can be written to it. 1656 o and some more too */ 1657 1658 static bfd_boolean 1659 vms_set_section_contents (abfd, section, location, offset, count) 1660 bfd *abfd; 1661 asection *section; 1662 const PTR location; 1663 file_ptr offset; 1664 bfd_size_type count; 1665 { 1666 #if VMS_DEBUG 1667 vms_debug (1, "vms_set_section_contents(%p, sec %s, loc %p, off %ld, count %d)\n", 1668 abfd, section->name, location, (long int)offset, (int)count); 1669 vms_debug (2, "secraw %d, seccooked %d\n", (int)section->_raw_size, (int)section->_cooked_size); 1670 #endif 1671 return _bfd_save_vms_section(abfd, section, location, offset, count); 1672 } 1673 1674 /*-- Part 4.8, linker -------------------------------------------------------*/ 1675 1676 /* Get the size of the section headers. */ 1677 1678 static int 1679 vms_sizeof_headers (abfd, reloc) 1680 bfd *abfd ATTRIBUTE_UNUSED; 1681 bfd_boolean reloc ATTRIBUTE_UNUSED; 1682 { 1683 #if VMS_DEBUG 1684 vms_debug (1, "vms_sizeof_headers(%p, %s)\n", abfd, (reloc)?"True":"False"); 1685 #endif 1686 return 0; 1687 } 1688 1689 /* Provides default handling of relocation effort for back ends 1690 which can't be bothered to do it efficiently. */ 1691 1692 static bfd_byte * 1693 vms_bfd_get_relocated_section_contents (abfd, link_info, link_order, data, 1694 relocatable, symbols) 1695 bfd *abfd ATTRIBUTE_UNUSED; 1696 struct bfd_link_info *link_info ATTRIBUTE_UNUSED; 1697 struct bfd_link_order *link_order ATTRIBUTE_UNUSED; 1698 bfd_byte *data ATTRIBUTE_UNUSED; 1699 bfd_boolean relocatable ATTRIBUTE_UNUSED; 1700 asymbol **symbols ATTRIBUTE_UNUSED; 1701 { 1702 #if VMS_DEBUG 1703 vms_debug (1, "vms_bfd_get_relocated_section_contents(%p, %p, %p, %p, %s, %p)\n", 1704 abfd, link_info, link_order, data, (relocatable)?"True":"False", symbols); 1705 #endif 1706 return 0; 1707 } 1708 1709 /* ??? */ 1710 1711 static bfd_boolean 1712 vms_bfd_relax_section (abfd, section, link_info, again) 1713 bfd *abfd ATTRIBUTE_UNUSED; 1714 asection *section ATTRIBUTE_UNUSED; 1715 struct bfd_link_info *link_info ATTRIBUTE_UNUSED; 1716 bfd_boolean *again ATTRIBUTE_UNUSED; 1717 { 1718 #if VMS_DEBUG 1719 vms_debug (1, "vms_bfd_relax_section(%p, %s, %p, <ret>)\n", 1720 abfd, section->name, link_info); 1721 #endif 1722 return TRUE; 1723 } 1724 1725 static bfd_boolean 1726 vms_bfd_gc_sections (abfd, link_info) 1727 bfd *abfd ATTRIBUTE_UNUSED; 1728 struct bfd_link_info *link_info ATTRIBUTE_UNUSED; 1729 { 1730 #if VMS_DEBUG 1731 vms_debug (1, "vms_bfd_gc_sections(%p, %p)\n", abfd, link_info); 1732 #endif 1733 return TRUE; 1734 } 1735 1736 static bfd_boolean 1737 vms_bfd_merge_sections (abfd, link_info) 1738 bfd *abfd ATTRIBUTE_UNUSED; 1739 struct bfd_link_info *link_info ATTRIBUTE_UNUSED; 1740 { 1741 #if VMS_DEBUG 1742 vms_debug (1, "vms_bfd_merge_sections(%p, %p)\n", abfd, link_info); 1743 #endif 1744 return TRUE; 1745 } 1746 1747 /* Create a hash table for the linker. Different backends store 1748 different information in this table. */ 1749 1750 static struct bfd_link_hash_table * 1751 vms_bfd_link_hash_table_create (abfd) 1752 bfd *abfd ATTRIBUTE_UNUSED; 1753 { 1754 #if VMS_DEBUG 1755 vms_debug (1, "vms_bfd_link_hash_table_create(%p)\n", abfd); 1756 #endif 1757 return 0; 1758 } 1759 1760 /* Free a linker hash table. */ 1761 1762 static void 1763 vms_bfd_link_hash_table_free (hash) 1764 struct bfd_link_hash_table *hash ATTRIBUTE_UNUSED; 1765 { 1766 #if VMS_DEBUG 1767 vms_debug (1, "vms_bfd_link_hash_table_free(%p)\n", abfd); 1768 #endif 1769 } 1770 1771 /* Add symbols from this object file into the hash table. */ 1772 1773 static bfd_boolean 1774 vms_bfd_link_add_symbols (abfd, link_info) 1775 bfd *abfd ATTRIBUTE_UNUSED; 1776 struct bfd_link_info *link_info ATTRIBUTE_UNUSED; 1777 { 1778 #if VMS_DEBUG 1779 vms_debug (1, "vms_bfd_link_add_symbols(%p, %p)\n", abfd, link_info); 1780 #endif 1781 return FALSE; 1782 } 1783 1784 /* Do a link based on the link_order structures attached to each 1785 section of the BFD. */ 1786 1787 static bfd_boolean 1788 vms_bfd_final_link (abfd, link_info) 1789 bfd *abfd ATTRIBUTE_UNUSED; 1790 struct bfd_link_info *link_info ATTRIBUTE_UNUSED; 1791 { 1792 #if VMS_DEBUG 1793 vms_debug (1, "vms_bfd_final_link(%p, %p)\n", abfd, link_info); 1794 #endif 1795 return TRUE; 1796 } 1797 1798 /* Should this section be split up into smaller pieces during linking. */ 1799 1800 static bfd_boolean 1801 vms_bfd_link_split_section (abfd, section) 1802 bfd *abfd ATTRIBUTE_UNUSED; 1803 asection *section ATTRIBUTE_UNUSED; 1804 { 1805 #if VMS_DEBUG 1806 vms_debug (1, "vms_bfd_link_split_section(%p, %s)\n", abfd, section->name); 1807 #endif 1808 return FALSE; 1809 } 1810 1811 /*-- Part 4.9, dynamic symbols and relocations ------------------------------*/ 1812 1813 /* Get the amount of memory required to hold the dynamic symbols. */ 1814 1815 static long 1816 vms_get_dynamic_symtab_upper_bound (abfd) 1817 bfd *abfd ATTRIBUTE_UNUSED; 1818 { 1819 #if VMS_DEBUG 1820 vms_debug (1, "vms_get_dynamic_symtab_upper_bound(%p)\n", abfd); 1821 #endif 1822 return 0; 1823 } 1824 1825 static bfd_boolean 1826 vms_bfd_print_private_bfd_data (abfd, file) 1827 bfd *abfd ATTRIBUTE_UNUSED; 1828 void *file ATTRIBUTE_UNUSED; 1829 { 1830 #if VMS_DEBUG 1831 vms_debug (1, "vms_bfd_print_private_bfd_data(%p)\n", abfd); 1832 #endif 1833 return 0; 1834 } 1835 1836 /* Read in the dynamic symbols. */ 1837 1838 static long 1839 vms_canonicalize_dynamic_symtab (abfd, symbols) 1840 bfd *abfd ATTRIBUTE_UNUSED; 1841 asymbol **symbols ATTRIBUTE_UNUSED; 1842 { 1843 #if VMS_DEBUG 1844 vms_debug (1, "vms_canonicalize_dynamic_symtab(%p, <ret>)\n", abfd); 1845 #endif 1846 return 0L; 1847 } 1848 1849 /* Get the amount of memory required to hold the dynamic relocs. */ 1850 1851 static long 1852 vms_get_dynamic_reloc_upper_bound (abfd) 1853 bfd *abfd ATTRIBUTE_UNUSED; 1854 { 1855 #if VMS_DEBUG 1856 vms_debug (1, "vms_get_dynamic_reloc_upper_bound(%p)\n", abfd); 1857 #endif 1858 return 0L; 1859 } 1860 1861 /* Read in the dynamic relocs. */ 1862 1863 static long 1864 vms_canonicalize_dynamic_reloc (abfd, arel, symbols) 1865 bfd *abfd ATTRIBUTE_UNUSED; 1866 arelent **arel ATTRIBUTE_UNUSED; 1867 asymbol **symbols ATTRIBUTE_UNUSED; 1868 { 1869 #if VMS_DEBUG 1870 vms_debug (1, "vms_canonicalize_dynamic_reloc(%p)\n", abfd); 1871 #endif 1872 return 0L; 1873 } 1874