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