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