Support arbitrary length fill patterns.
[deliverable/binutils-gdb.git] / bfd / vms.c
1 /* vms.c -- BFD back-end for VAX (openVMS/VAX) and
2 EVAX (openVMS/Alpha) files.
3 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002
4 Free Software Foundation, Inc.
5
6 Written by Klaus K"ampf (kkaempf@rmi.de)
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22 #include "bfd.h"
23 #include "sysdep.h"
24 #include "bfdlink.h"
25 #include "libbfd.h"
26
27 #include "vms.h"
28
29 static boolean vms_initialize PARAMS ((bfd *));
30 static unsigned int priv_section_count;
31 static boolean fill_section_ptr PARAMS ((struct bfd_hash_entry *, PTR));
32 static boolean vms_fixup_sections PARAMS ((bfd *));
33 static boolean copy_symbols PARAMS ((struct bfd_hash_entry *, PTR));
34 static bfd_reloc_status_type reloc_nil
35 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
36 static const struct bfd_target *vms_object_p PARAMS ((bfd *abfd));
37 static const struct bfd_target *vms_archive_p PARAMS ((bfd *abfd));
38 static boolean vms_mkobject PARAMS ((bfd *abfd));
39 static boolean vms_write_object_contents PARAMS ((bfd *abfd));
40 static boolean vms_close_and_cleanup PARAMS ((bfd *abfd));
41 static boolean vms_bfd_free_cached_info PARAMS ((bfd *abfd));
42 static boolean vms_new_section_hook PARAMS ((bfd *abfd, asection *section));
43 static boolean vms_get_section_contents
44 PARAMS ((bfd *abfd, asection *section, PTR x1, file_ptr x2,
45 bfd_size_type x3));
46 static boolean vms_get_section_contents_in_window
47 PARAMS ((bfd *abfd, asection *section, bfd_window *w, file_ptr offset,
48 bfd_size_type count));
49 static boolean vms_bfd_copy_private_bfd_data PARAMS ((bfd *src, bfd *dest));
50 static boolean vms_bfd_copy_private_section_data
51 PARAMS ((bfd *srcbfd, asection *srcsec, bfd *dstbfd, asection *dstsec));
52 static boolean vms_bfd_copy_private_symbol_data
53 PARAMS ((bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym));
54 static boolean vms_bfd_print_private_bfd_data
55 PARAMS ((bfd *abfd, void *file));
56 static char *vms_core_file_failing_command PARAMS ((bfd *abfd));
57 static int vms_core_file_failing_signal PARAMS ((bfd *abfd));
58 static boolean vms_core_file_matches_executable_p
59 PARAMS ((bfd *abfd, bfd *bbfd));
60 static boolean vms_slurp_armap PARAMS ((bfd *abfd));
61 static boolean vms_slurp_extended_name_table PARAMS ((bfd *abfd));
62 static boolean vms_construct_extended_name_table
63 PARAMS ((bfd *abfd, char **tabloc, bfd_size_type *tablen,
64 const char **name));
65 static void vms_truncate_arname
66 PARAMS ((bfd *abfd, const char *pathname, char *arhdr));
67 static boolean vms_write_armap
68 PARAMS ((bfd *arch, unsigned int elength, struct orl *map,
69 unsigned int orl_count, int stridx));
70 static PTR vms_read_ar_hdr PARAMS ((bfd *abfd));
71 static bfd *vms_get_elt_at_index PARAMS ((bfd *abfd, symindex index));
72 static bfd *vms_openr_next_archived_file PARAMS ((bfd *arch, bfd *prev));
73 static boolean vms_update_armap_timestamp PARAMS ((bfd *abfd));
74 static int vms_generic_stat_arch_elt PARAMS ((bfd *, struct stat *));
75 static long vms_get_symtab_upper_bound PARAMS ((bfd *abfd));
76 static long vms_get_symtab PARAMS ((bfd *abfd, asymbol **symbols));
77 static void vms_print_symbol
78 PARAMS ((bfd *abfd, PTR file, asymbol *symbol, bfd_print_symbol_type how));
79 static void vms_get_symbol_info
80 PARAMS ((bfd *abfd, asymbol *symbol, symbol_info *ret));
81 static boolean vms_bfd_is_local_label_name PARAMS ((bfd *abfd, const char *));
82 static alent *vms_get_lineno PARAMS ((bfd *abfd, asymbol *symbol));
83 static 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));
86 static asymbol *vms_bfd_make_debug_symbol
87 PARAMS ((bfd *abfd, void *ptr, unsigned long size));
88 static long vms_read_minisymbols
89 PARAMS ((bfd *abfd, boolean dynamic, PTR *minisymsp, unsigned int *sizep));
90 static asymbol *vms_minisymbol_to_symbol
91 PARAMS ((bfd *abfd, boolean dynamic, const PTR minisym, asymbol *sym));
92 static long vms_get_reloc_upper_bound PARAMS ((bfd *abfd, asection *sect));
93 static long vms_canonicalize_reloc
94 PARAMS ((bfd *abfd, asection *srcsec, arelent **location,
95 asymbol **symbols));
96 static const struct reloc_howto_struct *vms_bfd_reloc_type_lookup
97 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
98 static boolean vms_set_arch_mach
99 PARAMS ((bfd *abfd, enum bfd_architecture arch, unsigned long mach));
100 static boolean vms_set_section_contents
101 PARAMS ((bfd *abfd, asection *section, PTR location, file_ptr offset,
102 bfd_size_type count));
103 static int vms_sizeof_headers PARAMS ((bfd *abfd, boolean reloc));
104 static 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));
108 static boolean vms_bfd_relax_section
109 PARAMS ((bfd *abfd, asection *section, struct bfd_link_info *link_info,
110 boolean *again));
111 static boolean vms_bfd_gc_sections
112 PARAMS ((bfd *abfd, struct bfd_link_info *link_info));
113 static boolean vms_bfd_merge_sections
114 PARAMS ((bfd *abfd, struct bfd_link_info *link_info));
115 static struct bfd_link_hash_table *vms_bfd_link_hash_table_create
116 PARAMS ((bfd *abfd));
117 static boolean vms_bfd_link_add_symbols
118 PARAMS ((bfd *abfd, struct bfd_link_info *link_info));
119 static boolean vms_bfd_final_link
120 PARAMS ((bfd *abfd, struct bfd_link_info *link_info));
121 static boolean vms_bfd_link_split_section
122 PARAMS ((bfd *abfd, asection *section));
123 static long vms_get_dynamic_symtab_upper_bound PARAMS ((bfd *abfd));
124 static long vms_canonicalize_dynamic_symtab
125 PARAMS ((bfd *abfd, asymbol **symbols));
126 static long vms_get_dynamic_reloc_upper_bound PARAMS ((bfd *abfd));
127 static long vms_canonicalize_dynamic_reloc
128 PARAMS ((bfd *abfd, arelent **arel, asymbol **symbols));
129 static boolean vms_bfd_merge_private_bfd_data PARAMS ((bfd *ibfd, bfd *obfd));
130 static boolean vms_bfd_set_private_flags PARAMS ((bfd *abfd, flagword flags));
131
132 #define vms_make_empty_symbol _bfd_generic_make_empty_symbol
133 \f
134 /*===========================================================================*/
135
136 const bfd_target vms_alpha_vec =
137 {
138 "vms-alpha", /* name */
139 bfd_target_evax_flavour,
140 BFD_ENDIAN_LITTLE, /* data byte order is little */
141 BFD_ENDIAN_LITTLE, /* header byte order is little */
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
175 NULL,
176
177 (PTR) 0
178 };
179
180 const bfd_target vms_vax_vec =
181 {
182 "vms-vax", /* name */
183 bfd_target_ovax_flavour,
184 BFD_ENDIAN_LITTLE, /* data byte order is little */
185 BFD_ENDIAN_LITTLE, /* header byte order is little */
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
221 NULL,
222
223 (PTR) 0
224 };
225 \f
226 /*===========================================================================*/
227
228 /* Initialize private data */
229
230 static boolean
231 vms_initialize (abfd)
232 bfd *abfd;
233 {
234 int i;
235 bfd_size_type amt;
236
237 if (abfd->tdata.any != 0)
238 return true;
239
240 bfd_set_start_address (abfd, (bfd_vma) -1);
241
242 amt = sizeof (struct vms_private_data_struct);
243 abfd->tdata.any = (struct vms_private_data_struct*) bfd_malloc (amt);
244 if (abfd->tdata.any == 0)
245 return false;
246
247 #ifdef __ALPHA
248 PRIV (is_vax) = 0;
249 #else
250 PRIV (is_vax) = 1;
251 #endif
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
259 amt = sizeof (struct stack_struct) * STACKSIZE;
260 PRIV (stack) = (struct stack_struct *) bfd_malloc (amt);
261 if (PRIV (stack) == 0)
262 {
263 vms_init_no_mem1:
264 free (abfd->tdata.any);
265 abfd->tdata.any = 0;
266 return false;
267 }
268 PRIV (stackptr) = 0;
269
270 amt = sizeof (struct bfd_hash_table);
271 PRIV (vms_symbol_table) = (struct bfd_hash_table *) bfd_malloc (amt);
272 if (PRIV (vms_symbol_table) == 0)
273 {
274 vms_init_no_mem2:
275 free (PRIV (stack));
276 PRIV (stack) = 0;
277 goto vms_init_no_mem1;
278 }
279
280 if (!bfd_hash_table_init (PRIV (vms_symbol_table), _bfd_vms_hash_newfunc))
281 return false;
282
283 amt = sizeof (struct location_struct) * LOCATION_SAVE_SIZE;
284 PRIV (location_stack) = (struct location_struct *) bfd_malloc (amt);
285 if (PRIV (location_stack) == 0)
286 {
287 vms_init_no_mem3:
288 free (PRIV (vms_symbol_table));
289 PRIV (vms_symbol_table) = 0;
290 goto vms_init_no_mem2;
291 }
292
293 for (i = 0; i < VMS_SECTION_COUNT; i++)
294 PRIV (vms_section_table)[i] = NULL;
295
296 PRIV (output_buf) = (unsigned char *) malloc (MAX_OUTREC_SIZE);
297 if (PRIV (output_buf) == 0)
298 {
299 free (PRIV (location_stack));
300 PRIV (location_stack) = 0;
301 goto vms_init_no_mem3;
302 }
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;
308
309 return true;
310 }
311
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
321 static boolean
322 fill_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
338 if ((unsigned int) sec < priv_section_count)
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
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
359 static boolean
360 vms_fixup_sections (abfd)
361 bfd *abfd;
362 {
363 if (PRIV (fixup_done))
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(). */
371 priv_section_count = PRIV (section_count);
372 bfd_hash_traverse (PRIV (vms_symbol_table), fill_section_ptr,
373 (PTR) (PRIV (sections)));
374
375 PRIV (fixup_done) = true;
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
385 static const struct bfd_target *
386 vms_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
404 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET))
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
420 vms_debug (2, "next_record failed\n");
421 #endif
422 bfd_set_error (bfd_error_wrong_format);
423 return 0;
424 }
425
426 if ((prev_type == EOBJ_S_C_EGSD)
427 && (PRIV (rec_type) != EOBJ_S_C_EGSD))
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
439 prev_type = PRIV (rec_type);
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 */
505
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 */
515
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
536 /* Check the format for a file being read.
537 Return a (bfd_target *) if it's an archive file or zero. */
538
539 static const struct bfd_target *
540 vms_archive_p (abfd)
541 bfd *abfd ATTRIBUTE_UNUSED;
542 {
543 #if VMS_DEBUG
544 vms_debug (1, "vms_archive_p(%p)\n", abfd);
545 #endif
546
547 return 0;
548 }
549
550 /* Set the format of a file being written. */
551
552 static boolean
553 vms_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
583 /* Write cached information into a file being written, at bfd_close. */
584
585 static boolean
586 vms_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 {
595 if (PRIV (is_vax))
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
641 static boolean
642 vms_close_and_cleanup (abfd)
643 bfd *abfd;
644 {
645 asection *sec;
646 vms_section *es, *es1;
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
655 if (PRIV (vms_buf) != NULL)
656 {
657 free (PRIV (vms_buf));
658 PRIV (vms_buf) = NULL;
659 }
660 PRIV (buf_size) = 0;
661
662 if (PRIV (output_buf) != 0)
663 {
664 free (PRIV (output_buf));
665 PRIV (output_buf) = 0;
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
676 if (PRIV (sections) != NULL)
677 {
678 free (PRIV (sections));
679 PRIV (sections) = NULL;
680 }
681
682 if (PRIV (vms_symbol_table))
683 {
684 bfd_hash_table_free (PRIV (vms_symbol_table));
685 PRIV (vms_symbol_table) = 0;
686 }
687
688 if (PRIV (stack))
689 {
690 free (PRIV (stack));
691 PRIV (stack) = 0;
692 }
693
694 if (PRIV (location_stack))
695 {
696 free (PRIV (location_stack));
697 PRIV (location_stack) = 0;
698 }
699
700 for (i = 0; i < VMS_SECTION_COUNT; i++)
701 {
702 es = PRIV (vms_section_table)[i];
703 while (es != NULL)
704 {
705 es1 = es->next;
706 free (es);
707 es = es1;
708 }
709 PRIV (vms_section_table)[i] = NULL;
710 }
711
712 free (abfd->tdata.any);
713 abfd->tdata.any = NULL;
714
715 return true;
716 }
717
718 /* Ask the BFD to free all cached information. */
719 static boolean
720 vms_bfd_free_cached_info (abfd)
721 bfd *abfd ATTRIBUTE_UNUSED;
722 {
723 #if VMS_DEBUG
724 vms_debug (1, "vms_bfd_free_cached_info(%p)\n", abfd);
725 #endif
726 return true;
727 }
728
729 /* Called when a new section is created. */
730
731 static boolean
732 vms_new_section_hook (abfd, section)
733 bfd *abfd;
734 asection *section;
735 {
736 /* Count hasn't been incremented yet. */
737 unsigned int section_count = abfd->section_count + 1;
738
739 #if VMS_DEBUG
740 vms_debug (1, "vms_new_section_hook (%p, [%d]%s), count %d\n",
741 abfd, section->index, section->name, section_count);
742 #endif
743 bfd_set_section_alignment (abfd, section, 4);
744
745 if (section_count > PRIV (section_count))
746 {
747 bfd_size_type amt = section_count;
748 amt *= sizeof (asection *);
749 PRIV (sections) = (asection **) bfd_realloc (PRIV (sections), amt);
750 if (PRIV (sections) == 0)
751 return false;
752 PRIV (section_count) = section_count;
753 }
754 #if VMS_DEBUG
755 vms_debug (6, "section_count: %d\n", PRIV (section_count));
756 #endif
757 PRIV (sections)[section->index] = section;
758 #if VMS_DEBUG
759 vms_debug (7, "%d: %s\n", section->index, section->name);
760 #endif
761
762 return true;
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
769 static boolean
770 vms_get_section_contents (abfd, section, buf, offset, buf_size)
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;
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
791 static boolean
792 vms_get_section_contents_in_window (abfd, section, w, offset, count)
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;
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
814 static boolean
815 vms_bfd_copy_private_bfd_data (src, dest)
816 bfd *src ATTRIBUTE_UNUSED;
817 bfd *dest ATTRIBUTE_UNUSED;
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 /* 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
832 static boolean
833 vms_bfd_merge_private_bfd_data (ibfd, obfd)
834 bfd *ibfd ATTRIBUTE_UNUSED;
835 bfd *obfd ATTRIBUTE_UNUSED;
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
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
850 static boolean
851 vms_bfd_set_private_flags (abfd, flags)
852 bfd *abfd ATTRIBUTE_UNUSED;
853 flagword flags ATTRIBUTE_UNUSED;
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
861 /* Called to copy BFD private section data from one object file
862 to another. */
863
864 static boolean
865 vms_bfd_copy_private_section_data (srcbfd, srcsec, dstbfd, dstsec)
866 bfd *srcbfd ATTRIBUTE_UNUSED;
867 asection *srcsec ATTRIBUTE_UNUSED;
868 bfd *dstbfd ATTRIBUTE_UNUSED;
869 asection *dstsec ATTRIBUTE_UNUSED;
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
881 static boolean
882 vms_bfd_copy_private_symbol_data (ibfd, isym, obfd, osym)
883 bfd *ibfd ATTRIBUTE_UNUSED;
884 asymbol *isym ATTRIBUTE_UNUSED;
885 bfd *obfd ATTRIBUTE_UNUSED;
886 asymbol *osym ATTRIBUTE_UNUSED;
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
900 static char *
901 vms_core_file_failing_command (abfd)
902 bfd *abfd ATTRIBUTE_UNUSED;
903 {
904 #if VMS_DEBUG
905 vms_debug (1, "vms_core_file_failing_command(%p)\n", abfd);
906 #endif
907 return 0;
908 }
909
910 /* Returns the signal number which caused the core dump which
911 generated the file the BFD abfd is attached to. */
912
913 static int
914 vms_core_file_failing_signal (abfd)
915 bfd *abfd ATTRIBUTE_UNUSED;
916 {
917 #if VMS_DEBUG
918 vms_debug (1, "vms_core_file_failing_signal(%p)\n", abfd);
919 #endif
920 return 0;
921 }
922
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
926 static boolean
927 vms_core_file_matches_executable_p (abfd, bbfd)
928 bfd *abfd ATTRIBUTE_UNUSED;
929 bfd *bbfd ATTRIBUTE_UNUSED;
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
942 static boolean
943 vms_slurp_armap (abfd)
944 bfd *abfd ATTRIBUTE_UNUSED;
945 {
946 #if VMS_DEBUG
947 vms_debug (1, "vms_slurp_armap(%p)\n", abfd);
948 #endif
949 return false;
950 }
951
952 /* ??? do something with an extended name table.
953 Return false on error, true otherwise. */
954
955 static boolean
956 vms_slurp_extended_name_table (abfd)
957 bfd *abfd ATTRIBUTE_UNUSED;
958 {
959 #if VMS_DEBUG
960 vms_debug (1, "vms_slurp_extended_name_table(%p)\n", abfd);
961 #endif
962 return false;
963 }
964
965 /* ??? do something with an extended name table.
966 Return false on error, true otherwise. */
967
968 static boolean
969 vms_construct_extended_name_table (abfd, tabloc, tablen, name)
970 bfd *abfd ATTRIBUTE_UNUSED;
971 char **tabloc ATTRIBUTE_UNUSED;
972 bfd_size_type *tablen ATTRIBUTE_UNUSED;
973 const char **name ATTRIBUTE_UNUSED;
974 {
975 #if VMS_DEBUG
976 vms_debug (1, "vms_construct_extended_name_table(%p)\n", abfd);
977 #endif
978 return false;
979 }
980
981 /* Truncate the name of an archive to match system-dependent restrictions */
982
983 static void
984 vms_truncate_arname (abfd, pathname, arhdr)
985 bfd *abfd ATTRIBUTE_UNUSED;
986 const char *pathname ATTRIBUTE_UNUSED;
987 char *arhdr ATTRIBUTE_UNUSED;
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
995 /* ??? write archive map */
996
997 static boolean
998 vms_write_armap (arch, elength, map, orl_count, stridx)
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;
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
1014 static PTR
1015 vms_read_ar_hdr (abfd)
1016 bfd * abfd ATTRIBUTE_UNUSED;
1017 {
1018 #if VMS_DEBUG
1019 vms_debug (1, "vms_read_ar_hdr(%p)\n", abfd);
1020 #endif
1021 return (PTR)0;
1022 }
1023
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
1030 static bfd *
1031 vms_openr_next_archived_file (arch, prev)
1032 bfd *arch ATTRIBUTE_UNUSED;
1033 bfd *prev ATTRIBUTE_UNUSED;
1034 {
1035 #if VMS_DEBUG
1036 vms_debug (1, "vms_openr_next_archived_file(%p, %p)\n", arch, prev);
1037 #endif
1038 return NULL;
1039 }
1040
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
1044 static bfd *
1045 vms_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
1055 /* ???
1056 -> bfd_generic_stat_arch_elt */
1057
1058 static int
1059 vms_generic_stat_arch_elt (abfd, st)
1060 bfd *abfd;
1061 struct stat *st;
1062 {
1063 #if VMS_DEBUG
1064 vms_debug (1, "vms_generic_stat_arch_elt(%p, %p)\n", abfd, st);
1065 #endif
1066 return bfd_generic_stat_arch_elt (abfd, st);
1067 }
1068
1069 /* This is a new function in bfd 2.5 */
1070
1071 static boolean
1072 vms_update_armap_timestamp (abfd)
1073 bfd *abfd ATTRIBUTE_UNUSED;
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
1088 static long
1089 vms_get_symtab_upper_bound (abfd)
1090 bfd *abfd;
1091 {
1092 #if VMS_DEBUG
1093 vms_debug (1, "vms_get_symtab_upper_bound(%p), %d symbols\n", abfd, PRIV (gsd_sym_count));
1094 #endif
1095 return (PRIV (gsd_sym_count)+1) * sizeof (asymbol *);
1096 }
1097
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
1103 static boolean
1104 copy_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 */
1111 PRIV (symnum) = 0;
1112 else /* fill vector, inc counter */
1113 PRIV (symcache)[PRIV (symnum)++] = ((vms_symbol_entry *)entry)->symbol;
1114
1115 return true;
1116 }
1117
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
1123 static long
1124 vms_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
1137 PRIV (symcache) = symbols;
1138 bfd_hash_traverse(PRIV (vms_symbol_table), copy_symbols, (PTR)abfd);
1139
1140 symbols[PRIV (gsd_sym_count)] = NULL;
1141
1142 return PRIV (gsd_sym_count);
1143 }
1144
1145 /* Print symbol to file according to how. how is one of
1146 bfd_print_symbol_name just print the name
1147 bfd_print_symbol_more print more (???)
1148 bfd_print_symbol_all print all we know, which is not much right now :-) */
1149
1150 static void
1151 vms_print_symbol (abfd, file, symbol, how)
1152 bfd *abfd;
1153 PTR file;
1154 asymbol *symbol;
1155 bfd_print_symbol_type how;
1156 {
1157 #if VMS_DEBUG
1158 vms_debug (1, "vms_print_symbol(%p, %p, %p, %d)\n", abfd, file, symbol, how);
1159 #endif
1160
1161 switch (how)
1162 {
1163 case bfd_print_symbol_name:
1164 case bfd_print_symbol_more:
1165 fprintf ((FILE *)file," %s", symbol->name);
1166 break;
1167
1168 case bfd_print_symbol_all:
1169 {
1170 const char *section_name = symbol->section->name;
1171
1172 bfd_print_symbol_vandf (abfd, (PTR)file, symbol);
1173
1174 fprintf ((FILE *)file," %-8s %s", section_name, symbol->name);
1175 }
1176 break;
1177 }
1178 return;
1179 }
1180
1181 /* Return information about symbol in ret.
1182
1183 fill type, value and name
1184 type:
1185 A absolute
1186 B bss segment symbol
1187 C common symbol
1188 D data segment symbol
1189 f filename
1190 t a static function symbol
1191 T text segment symbol
1192 U undefined
1193 - debug */
1194
1195 static void
1196 vms_get_symbol_info (abfd, symbol, ret)
1197 bfd *abfd ATTRIBUTE_UNUSED;
1198 asymbol *symbol;
1199 symbol_info *ret;
1200 {
1201 asection *sec;
1202
1203 #if VMS_DEBUG
1204 vms_debug (1, "vms_get_symbol_info(%p, %p, %p)\n", abfd, symbol, ret);
1205 #endif
1206
1207 sec = symbol->section;
1208
1209 if (ret == 0)
1210 return;
1211
1212 if (bfd_is_com_section (sec))
1213 ret->type = 'C';
1214 else if (bfd_is_abs_section (sec))
1215 ret->type = 'A';
1216 else if (bfd_is_und_section (sec))
1217 ret->type = 'U';
1218 else if (bfd_is_ind_section (sec))
1219 ret->type = 'I';
1220 else if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
1221 ret->type = 'T';
1222 else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
1223 ret->type = 'D';
1224 else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
1225 ret->type = 'B';
1226 else
1227 ret->type = '-';
1228
1229 if (ret->type != 'U')
1230 ret->value = symbol->value + symbol->section->vma;
1231 else
1232 ret->value = 0;
1233 ret->name = symbol->name;
1234
1235 return;
1236 }
1237
1238 /* Return true if the given symbol sym in the BFD abfd is
1239 a compiler generated local label, else return false. */
1240
1241 static boolean
1242 vms_bfd_is_local_label_name (abfd, name)
1243 bfd *abfd ATTRIBUTE_UNUSED;
1244 const char *name;
1245 {
1246 #if VMS_DEBUG
1247 vms_debug (1, "vms_bfd_is_local_label_name(%p, %s)\n", abfd, name);
1248 #endif
1249 return name[0] == '$';
1250 }
1251
1252 /* Get source line number for symbol */
1253
1254 static alent *
1255 vms_get_lineno (abfd, symbol)
1256 bfd *abfd ATTRIBUTE_UNUSED;
1257 asymbol *symbol ATTRIBUTE_UNUSED;
1258 {
1259 #if VMS_DEBUG
1260 vms_debug (1, "vms_get_lineno(%p, %p)\n", abfd, symbol);
1261 #endif
1262 return 0;
1263 }
1264
1265 /* Provided a BFD, a section and an offset into the section, calculate and
1266 return the name of the source file and the line nearest to the wanted
1267 location. */
1268
1269 static boolean
1270 vms_find_nearest_line (abfd, section, symbols, offset, file, func, line)
1271 bfd *abfd ATTRIBUTE_UNUSED;
1272 asection *section ATTRIBUTE_UNUSED;
1273 asymbol **symbols ATTRIBUTE_UNUSED;
1274 bfd_vma offset ATTRIBUTE_UNUSED;
1275 const char **file ATTRIBUTE_UNUSED;
1276 const char **func ATTRIBUTE_UNUSED;
1277 unsigned int *line ATTRIBUTE_UNUSED;
1278 {
1279 #if VMS_DEBUG
1280 vms_debug (1, "vms_find_nearest_line(%p, %s, %p, %ld, <ret>, <ret>, <ret>)\n",
1281 abfd, section->name, symbols, (long int)offset);
1282 #endif
1283 return false;
1284 }
1285
1286 /* Back-door to allow format-aware applications to create debug symbols
1287 while using BFD for everything else. Currently used by the assembler
1288 when creating COFF files. */
1289
1290 static asymbol *
1291 vms_bfd_make_debug_symbol (abfd, ptr, size)
1292 bfd *abfd ATTRIBUTE_UNUSED;
1293 void *ptr ATTRIBUTE_UNUSED;
1294 unsigned long size ATTRIBUTE_UNUSED;
1295 {
1296 #if VMS_DEBUG
1297 vms_debug (1, "vms_bfd_make_debug_symbol(%p, %p, %ld)\n", abfd, ptr, size);
1298 #endif
1299 return 0;
1300 }
1301
1302 /* Read minisymbols. For minisymbols, we use the unmodified a.out
1303 symbols. The minisymbol_to_symbol function translates these into
1304 BFD asymbol structures. */
1305
1306 static long
1307 vms_read_minisymbols (abfd, dynamic, minisymsp, sizep)
1308 bfd *abfd;
1309 boolean dynamic;
1310 PTR *minisymsp;
1311 unsigned int *sizep;
1312 {
1313 #if VMS_DEBUG
1314 vms_debug (1, "vms_read_minisymbols(%p, %d, %p, %d)\n", abfd, dynamic, minisymsp, *sizep);
1315 #endif
1316 return _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep);
1317 }
1318
1319 /* Convert a minisymbol to a BFD asymbol. A minisymbol is just an
1320 unmodified a.out symbol. The SYM argument is a structure returned
1321 by bfd_make_empty_symbol, which we fill in here. */
1322
1323 static asymbol *
1324 vms_minisymbol_to_symbol (abfd, dynamic, minisym, sym)
1325 bfd *abfd;
1326 boolean dynamic;
1327 const PTR minisym;
1328 asymbol *sym;
1329 {
1330 #if VMS_DEBUG
1331 vms_debug (1, "vms_minisymbol_to_symbol(%p, %d, %p, %p)\n", abfd, dynamic, minisym, sym);
1332 #endif
1333 return _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym);
1334 }
1335
1336 /*-- Part 4.6, relocations --------------------------------------------------*/
1337
1338 /* Return the number of bytes required to store the relocation information
1339 associated with section sect attached to bfd abfd.
1340 If an error occurs, return -1. */
1341
1342 static long
1343 vms_get_reloc_upper_bound (abfd, section)
1344 bfd *abfd ATTRIBUTE_UNUSED;
1345 asection *section ATTRIBUTE_UNUSED;
1346 {
1347 #if VMS_DEBUG
1348 vms_debug (1, "vms_get_reloc_upper_bound(%p, %s)\n", abfd, section->name);
1349 #endif
1350 return -1L;
1351 }
1352
1353 /* Call the back end associated with the open BFD abfd and translate the
1354 external form of the relocation information attached to sec into the
1355 internal canonical form. Place the table into memory at loc, which has
1356 been preallocated, usually by a call to bfd_get_reloc_upper_bound.
1357 Returns the number of relocs, or -1 on error. */
1358
1359 static long
1360 vms_canonicalize_reloc (abfd, section, location, symbols)
1361 bfd *abfd ATTRIBUTE_UNUSED;
1362 asection *section ATTRIBUTE_UNUSED;
1363 arelent **location ATTRIBUTE_UNUSED;
1364 asymbol **symbols ATTRIBUTE_UNUSED;
1365 {
1366 #if VMS_DEBUG
1367 vms_debug (1, "vms_canonicalize_reloc(%p, %s, <ret>, <ret>)\n", abfd, section->name);
1368 #endif
1369 return false;
1370 }
1371
1372 /*---------------------------------------------------------------------------*/
1373 /* this is just copied from ecoff-alpha, needs to be fixed probably */
1374
1375 /* How to process the various reloc types. */
1376
1377 static bfd_reloc_status_type
1378 reloc_nil (abfd, reloc, sym, data, sec, output_bfd, error_message)
1379 bfd *abfd ATTRIBUTE_UNUSED;
1380 arelent *reloc ATTRIBUTE_UNUSED;
1381 asymbol *sym ATTRIBUTE_UNUSED;
1382 PTR data ATTRIBUTE_UNUSED;
1383 asection *sec ATTRIBUTE_UNUSED;
1384 bfd *output_bfd ATTRIBUTE_UNUSED;
1385 char **error_message ATTRIBUTE_UNUSED;
1386 {
1387 #if VMS_DEBUG
1388 vms_debug (1, "reloc_nil(abfd %p, output_bfd %p)\n", abfd, output_bfd);
1389 vms_debug (2, "In section %s, symbol %s\n",
1390 sec->name, sym->name);
1391 vms_debug (2, "reloc sym %s, addr %08lx, addend %08lx, reloc is a %s\n",
1392 reloc->sym_ptr_ptr[0]->name,
1393 (unsigned long)reloc->address,
1394 (unsigned long)reloc->addend, reloc->howto->name);
1395 vms_debug (2, "data at %p\n", data);
1396 /* _bfd_hexdump (2, data, bfd_get_reloc_size(reloc->howto),0); */
1397 #endif
1398
1399 return bfd_reloc_ok;
1400 }
1401
1402 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
1403 from smaller values. Start with zero, widen, *then* decrement. */
1404 #define MINUS_ONE (((bfd_vma)0) - 1)
1405
1406 static reloc_howto_type alpha_howto_table[] =
1407 {
1408 HOWTO (ALPHA_R_IGNORE, /* type */
1409 0, /* rightshift */
1410 0, /* size (0 = byte, 1 = short, 2 = long) */
1411 8, /* bitsize */
1412 true, /* pc_relative */
1413 0, /* bitpos */
1414 complain_overflow_dont, /* complain_on_overflow */
1415 reloc_nil, /* special_function */
1416 "IGNORE", /* name */
1417 true, /* partial_inplace */
1418 0, /* src_mask */
1419 0, /* dst_mask */
1420 true), /* pcrel_offset */
1421
1422 /* A 64 bit reference to a symbol. */
1423 HOWTO (ALPHA_R_REFQUAD, /* type */
1424 0, /* rightshift */
1425 4, /* size (0 = byte, 1 = short, 2 = long) */
1426 64, /* bitsize */
1427 false, /* pc_relative */
1428 0, /* bitpos */
1429 complain_overflow_bitfield, /* complain_on_overflow */
1430 reloc_nil, /* special_function */
1431 "REFQUAD", /* name */
1432 true, /* partial_inplace */
1433 MINUS_ONE, /* src_mask */
1434 MINUS_ONE, /* dst_mask */
1435 false), /* pcrel_offset */
1436
1437 /* A 21 bit branch. The native assembler generates these for
1438 branches within the text segment, and also fills in the PC
1439 relative offset in the instruction. */
1440 HOWTO (ALPHA_R_BRADDR, /* type */
1441 2, /* rightshift */
1442 2, /* size (0 = byte, 1 = short, 2 = long) */
1443 21, /* bitsize */
1444 true, /* pc_relative */
1445 0, /* bitpos */
1446 complain_overflow_signed, /* complain_on_overflow */
1447 reloc_nil, /* special_function */
1448 "BRADDR", /* name */
1449 true, /* partial_inplace */
1450 0x1fffff, /* src_mask */
1451 0x1fffff, /* dst_mask */
1452 false), /* pcrel_offset */
1453
1454 /* A hint for a jump to a register. */
1455 HOWTO (ALPHA_R_HINT, /* type */
1456 2, /* rightshift */
1457 1, /* size (0 = byte, 1 = short, 2 = long) */
1458 14, /* bitsize */
1459 true, /* pc_relative */
1460 0, /* bitpos */
1461 complain_overflow_dont, /* complain_on_overflow */
1462 reloc_nil, /* special_function */
1463 "HINT", /* name */
1464 true, /* partial_inplace */
1465 0x3fff, /* src_mask */
1466 0x3fff, /* dst_mask */
1467 false), /* pcrel_offset */
1468
1469 /* 16 bit PC relative offset. */
1470 HOWTO (ALPHA_R_SREL16, /* type */
1471 0, /* rightshift */
1472 1, /* size (0 = byte, 1 = short, 2 = long) */
1473 16, /* bitsize */
1474 true, /* pc_relative */
1475 0, /* bitpos */
1476 complain_overflow_signed, /* complain_on_overflow */
1477 reloc_nil, /* special_function */
1478 "SREL16", /* name */
1479 true, /* partial_inplace */
1480 0xffff, /* src_mask */
1481 0xffff, /* dst_mask */
1482 false), /* pcrel_offset */
1483
1484 /* 32 bit PC relative offset. */
1485 HOWTO (ALPHA_R_SREL32, /* type */
1486 0, /* rightshift */
1487 2, /* size (0 = byte, 1 = short, 2 = long) */
1488 32, /* bitsize */
1489 true, /* pc_relative */
1490 0, /* bitpos */
1491 complain_overflow_signed, /* complain_on_overflow */
1492 reloc_nil, /* special_function */
1493 "SREL32", /* name */
1494 true, /* partial_inplace */
1495 0xffffffff, /* src_mask */
1496 0xffffffff, /* dst_mask */
1497 false), /* pcrel_offset */
1498
1499 /* A 64 bit PC relative offset. */
1500 HOWTO (ALPHA_R_SREL64, /* type */
1501 0, /* rightshift */
1502 4, /* size (0 = byte, 1 = short, 2 = long) */
1503 64, /* bitsize */
1504 true, /* pc_relative */
1505 0, /* bitpos */
1506 complain_overflow_signed, /* complain_on_overflow */
1507 reloc_nil, /* special_function */
1508 "SREL64", /* name */
1509 true, /* partial_inplace */
1510 MINUS_ONE, /* src_mask */
1511 MINUS_ONE, /* dst_mask */
1512 false), /* pcrel_offset */
1513
1514 /* Push a value on the reloc evaluation stack. */
1515 HOWTO (ALPHA_R_OP_PUSH, /* type */
1516 0, /* rightshift */
1517 0, /* size (0 = byte, 1 = short, 2 = long) */
1518 0, /* bitsize */
1519 false, /* pc_relative */
1520 0, /* bitpos */
1521 complain_overflow_dont, /* complain_on_overflow */
1522 reloc_nil, /* special_function */
1523 "OP_PUSH", /* name */
1524 false, /* partial_inplace */
1525 0, /* src_mask */
1526 0, /* dst_mask */
1527 false), /* pcrel_offset */
1528
1529 /* Store the value from the stack at the given address. Store it in
1530 a bitfield of size r_size starting at bit position r_offset. */
1531 HOWTO (ALPHA_R_OP_STORE, /* type */
1532 0, /* rightshift */
1533 4, /* size (0 = byte, 1 = short, 2 = long) */
1534 64, /* bitsize */
1535 false, /* pc_relative */
1536 0, /* bitpos */
1537 complain_overflow_dont, /* complain_on_overflow */
1538 reloc_nil, /* special_function */
1539 "OP_STORE", /* name */
1540 false, /* partial_inplace */
1541 0, /* src_mask */
1542 MINUS_ONE, /* dst_mask */
1543 false), /* pcrel_offset */
1544
1545 /* Subtract the reloc address from the value on the top of the
1546 relocation stack. */
1547 HOWTO (ALPHA_R_OP_PSUB, /* type */
1548 0, /* rightshift */
1549 0, /* size (0 = byte, 1 = short, 2 = long) */
1550 0, /* bitsize */
1551 false, /* pc_relative */
1552 0, /* bitpos */
1553 complain_overflow_dont, /* complain_on_overflow */
1554 reloc_nil, /* special_function */
1555 "OP_PSUB", /* name */
1556 false, /* partial_inplace */
1557 0, /* src_mask */
1558 0, /* dst_mask */
1559 false), /* pcrel_offset */
1560
1561 /* Shift the value on the top of the relocation stack right by the
1562 given value. */
1563 HOWTO (ALPHA_R_OP_PRSHIFT, /* type */
1564 0, /* rightshift */
1565 0, /* size (0 = byte, 1 = short, 2 = long) */
1566 0, /* bitsize */
1567 false, /* pc_relative */
1568 0, /* bitpos */
1569 complain_overflow_dont, /* complain_on_overflow */
1570 reloc_nil, /* special_function */
1571 "OP_PRSHIFT", /* name */
1572 false, /* partial_inplace */
1573 0, /* src_mask */
1574 0, /* dst_mask */
1575 false), /* pcrel_offset */
1576
1577 /* Hack. Linkage is done by linker. */
1578 HOWTO (ALPHA_R_LINKAGE, /* type */
1579 0, /* rightshift */
1580 8, /* size (0 = byte, 1 = short, 2 = long) */
1581 256, /* bitsize */
1582 false, /* pc_relative */
1583 0, /* bitpos */
1584 complain_overflow_dont, /* complain_on_overflow */
1585 reloc_nil, /* special_function */
1586 "LINKAGE", /* name */
1587 false, /* partial_inplace */
1588 0, /* src_mask */
1589 0, /* dst_mask */
1590 false), /* pcrel_offset */
1591
1592 /* A 32 bit reference to a symbol. */
1593 HOWTO (ALPHA_R_REFLONG, /* type */
1594 0, /* rightshift */
1595 2, /* size (0 = byte, 1 = short, 2 = long) */
1596 32, /* bitsize */
1597 false, /* pc_relative */
1598 0, /* bitpos */
1599 complain_overflow_bitfield, /* complain_on_overflow */
1600 reloc_nil, /* special_function */
1601 "REFLONG", /* name */
1602 true, /* partial_inplace */
1603 0xffffffff, /* src_mask */
1604 0xffffffff, /* dst_mask */
1605 false), /* pcrel_offset */
1606
1607 /* A 64 bit reference to a procedure, written as 32 bit value. */
1608 HOWTO (ALPHA_R_CODEADDR, /* type */
1609 0, /* rightshift */
1610 4, /* size (0 = byte, 1 = short, 2 = long) */
1611 64, /* bitsize */
1612 false, /* pc_relative */
1613 0, /* bitpos */
1614 complain_overflow_signed,/* complain_on_overflow */
1615 reloc_nil, /* special_function */
1616 "CODEADDR", /* name */
1617 false, /* partial_inplace */
1618 0xffffffff, /* src_mask */
1619 0xffffffff, /* dst_mask */
1620 false), /* pcrel_offset */
1621
1622 };
1623
1624 /* Return a pointer to a howto structure which, when invoked, will perform
1625 the relocation code on data from the architecture noted. */
1626
1627 static const struct reloc_howto_struct *
1628 vms_bfd_reloc_type_lookup (abfd, code)
1629 bfd *abfd ATTRIBUTE_UNUSED;
1630 bfd_reloc_code_real_type code;
1631 {
1632 int alpha_type;
1633
1634 #if VMS_DEBUG
1635 vms_debug (1, "vms_bfd_reloc_type_lookup(%p, %d)\t", abfd, code);
1636 #endif
1637
1638 switch (code)
1639 {
1640 case BFD_RELOC_16: alpha_type = ALPHA_R_SREL16; break;
1641 case BFD_RELOC_32: alpha_type = ALPHA_R_REFLONG; break;
1642 case BFD_RELOC_64: alpha_type = ALPHA_R_REFQUAD; break;
1643 case BFD_RELOC_CTOR: alpha_type = ALPHA_R_REFQUAD; break;
1644 case BFD_RELOC_23_PCREL_S2: alpha_type = ALPHA_R_BRADDR; break;
1645 case BFD_RELOC_ALPHA_HINT: alpha_type = ALPHA_R_HINT; break;
1646 case BFD_RELOC_16_PCREL: alpha_type = ALPHA_R_SREL16; break;
1647 case BFD_RELOC_32_PCREL: alpha_type = ALPHA_R_SREL32; break;
1648 case BFD_RELOC_64_PCREL: alpha_type = ALPHA_R_SREL64; break;
1649 case BFD_RELOC_ALPHA_LINKAGE: alpha_type = ALPHA_R_LINKAGE; break;
1650 case BFD_RELOC_ALPHA_CODEADDR: alpha_type = ALPHA_R_CODEADDR; break;
1651 default:
1652 (*_bfd_error_handler) ("reloc (%d) is *UNKNOWN*", code);
1653 return (const struct reloc_howto_struct *) NULL;
1654 }
1655 #if VMS_DEBUG
1656 vms_debug (2, "reloc is %s\n", alpha_howto_table[alpha_type].name);
1657 #endif
1658 return &alpha_howto_table[alpha_type];
1659 }
1660
1661 /*-- Part 4.7, writing an object file ---------------------------------------*/
1662
1663 /* Set the architecture and machine type in BFD abfd to arch and mach.
1664 Find the correct pointer to a structure and insert it into the arch_info
1665 pointer. */
1666
1667 static boolean
1668 vms_set_arch_mach (abfd, arch, mach)
1669 bfd *abfd;
1670 enum bfd_architecture arch ATTRIBUTE_UNUSED;
1671 unsigned long mach ATTRIBUTE_UNUSED;
1672 {
1673 #if VMS_DEBUG
1674 vms_debug (1, "vms_set_arch_mach(%p, %d, %ld)\n", abfd, arch, mach);
1675 #endif
1676 abfd->arch_info = bfd_scan_arch("alpha");
1677
1678 return true;
1679 }
1680
1681 /* Sets the contents of the section section in BFD abfd to the data starting
1682 in memory at data. The data is written to the output section starting at
1683 offset offset for count bytes.
1684
1685 Normally true is returned, else false. Possible error returns are:
1686 o bfd_error_no_contents - The output section does not have the
1687 SEC_HAS_CONTENTS attribute, so nothing can be written to it.
1688 o and some more too */
1689
1690 static boolean
1691 vms_set_section_contents (abfd, section, location, offset, count)
1692 bfd *abfd;
1693 asection *section;
1694 PTR location;
1695 file_ptr offset;
1696 bfd_size_type count;
1697 {
1698 #if VMS_DEBUG
1699 vms_debug (1, "vms_set_section_contents(%p, sec %s, loc %p, off %ld, count %d)\n",
1700 abfd, section->name, location, (long int)offset, (int)count);
1701 vms_debug (2, "secraw %d, seccooked %d\n", (int)section->_raw_size, (int)section->_cooked_size);
1702 #endif
1703 return _bfd_save_vms_section(abfd, section, location, offset, count);
1704 }
1705
1706 /*-- Part 4.8, linker -------------------------------------------------------*/
1707
1708 /* Get the size of the section headers. */
1709
1710 static int
1711 vms_sizeof_headers (abfd, reloc)
1712 bfd *abfd ATTRIBUTE_UNUSED;
1713 boolean reloc ATTRIBUTE_UNUSED;
1714 {
1715 #if VMS_DEBUG
1716 vms_debug (1, "vms_sizeof_headers(%p, %s)\n", abfd, (reloc)?"True":"False");
1717 #endif
1718 return 0;
1719 }
1720
1721 /* Provides default handling of relocation effort for back ends
1722 which can't be bothered to do it efficiently. */
1723
1724 static bfd_byte *
1725 vms_bfd_get_relocated_section_contents (abfd, link_info, link_order, data,
1726 relocateable, symbols)
1727 bfd *abfd ATTRIBUTE_UNUSED;
1728 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
1729 struct bfd_link_order *link_order ATTRIBUTE_UNUSED;
1730 bfd_byte *data ATTRIBUTE_UNUSED;
1731 boolean relocateable ATTRIBUTE_UNUSED;
1732 asymbol **symbols ATTRIBUTE_UNUSED;
1733 {
1734 #if VMS_DEBUG
1735 vms_debug (1, "vms_bfd_get_relocated_section_contents(%p, %p, %p, %p, %s, %p)\n",
1736 abfd, link_info, link_order, data, (relocateable)?"True":"False", symbols);
1737 #endif
1738 return 0;
1739 }
1740
1741 /* ??? */
1742
1743 static boolean
1744 vms_bfd_relax_section (abfd, section, link_info, again)
1745 bfd *abfd ATTRIBUTE_UNUSED;
1746 asection *section ATTRIBUTE_UNUSED;
1747 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
1748 boolean *again ATTRIBUTE_UNUSED;
1749 {
1750 #if VMS_DEBUG
1751 vms_debug (1, "vms_bfd_relax_section(%p, %s, %p, <ret>)\n",
1752 abfd, section->name, link_info);
1753 #endif
1754 return true;
1755 }
1756
1757 static boolean
1758 vms_bfd_gc_sections (abfd, link_info)
1759 bfd *abfd ATTRIBUTE_UNUSED;
1760 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
1761 {
1762 #if VMS_DEBUG
1763 vms_debug (1, "vms_bfd_gc_sections(%p, %p)\n", abfd, link_info);
1764 #endif
1765 return true;
1766 }
1767
1768 static boolean
1769 vms_bfd_merge_sections (abfd, link_info)
1770 bfd *abfd ATTRIBUTE_UNUSED;
1771 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
1772 {
1773 #if VMS_DEBUG
1774 vms_debug (1, "vms_bfd_merge_sections(%p, %p)\n", abfd, link_info);
1775 #endif
1776 return true;
1777 }
1778
1779 /* Create a hash table for the linker. Different backends store
1780 different information in this table. */
1781
1782 static struct bfd_link_hash_table *
1783 vms_bfd_link_hash_table_create (abfd)
1784 bfd *abfd ATTRIBUTE_UNUSED;
1785 {
1786 #if VMS_DEBUG
1787 vms_debug (1, "vms_bfd_link_hash_table_create(%p)\n", abfd);
1788 #endif
1789 return 0;
1790 }
1791
1792 /* Add symbols from this object file into the hash table. */
1793
1794 static boolean
1795 vms_bfd_link_add_symbols (abfd, link_info)
1796 bfd *abfd ATTRIBUTE_UNUSED;
1797 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
1798 {
1799 #if VMS_DEBUG
1800 vms_debug (1, "vms_bfd_link_add_symbols(%p, %p)\n", abfd, link_info);
1801 #endif
1802 return false;
1803 }
1804
1805 /* Do a link based on the link_order structures attached to each
1806 section of the BFD. */
1807
1808 static boolean
1809 vms_bfd_final_link (abfd, link_info)
1810 bfd *abfd ATTRIBUTE_UNUSED;
1811 struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
1812 {
1813 #if VMS_DEBUG
1814 vms_debug (1, "vms_bfd_final_link(%p, %p)\n", abfd, link_info);
1815 #endif
1816 return true;
1817 }
1818
1819 /* Should this section be split up into smaller pieces during linking. */
1820
1821 static boolean
1822 vms_bfd_link_split_section (abfd, section)
1823 bfd *abfd ATTRIBUTE_UNUSED;
1824 asection *section ATTRIBUTE_UNUSED;
1825 {
1826 #if VMS_DEBUG
1827 vms_debug (1, "vms_bfd_link_split_section(%p, %s)\n", abfd, section->name);
1828 #endif
1829 return false;
1830 }
1831
1832 /*-- Part 4.9, dynamic symbols and relocations ------------------------------*/
1833
1834 /* Get the amount of memory required to hold the dynamic symbols. */
1835
1836 static long
1837 vms_get_dynamic_symtab_upper_bound (abfd)
1838 bfd *abfd ATTRIBUTE_UNUSED;
1839 {
1840 #if VMS_DEBUG
1841 vms_debug (1, "vms_get_dynamic_symtab_upper_bound(%p)\n", abfd);
1842 #endif
1843 return 0;
1844 }
1845
1846 static boolean
1847 vms_bfd_print_private_bfd_data (abfd, file)
1848 bfd *abfd ATTRIBUTE_UNUSED;
1849 void *file ATTRIBUTE_UNUSED;
1850 {
1851 #if VMS_DEBUG
1852 vms_debug (1, "vms_bfd_print_private_bfd_data(%p)\n", abfd);
1853 #endif
1854 return 0;
1855 }
1856
1857 /* Read in the dynamic symbols. */
1858
1859 static long
1860 vms_canonicalize_dynamic_symtab (abfd, symbols)
1861 bfd *abfd ATTRIBUTE_UNUSED;
1862 asymbol **symbols ATTRIBUTE_UNUSED;
1863 {
1864 #if VMS_DEBUG
1865 vms_debug (1, "vms_canonicalize_dynamic_symtab(%p, <ret>)\n", abfd);
1866 #endif
1867 return 0L;
1868 }
1869
1870 /* Get the amount of memory required to hold the dynamic relocs. */
1871
1872 static long
1873 vms_get_dynamic_reloc_upper_bound (abfd)
1874 bfd *abfd ATTRIBUTE_UNUSED;
1875 {
1876 #if VMS_DEBUG
1877 vms_debug (1, "vms_get_dynamic_reloc_upper_bound(%p)\n", abfd);
1878 #endif
1879 return 0L;
1880 }
1881
1882 /* Read in the dynamic relocs. */
1883
1884 static long
1885 vms_canonicalize_dynamic_reloc (abfd, arel, symbols)
1886 bfd *abfd ATTRIBUTE_UNUSED;
1887 arelent **arel ATTRIBUTE_UNUSED;
1888 asymbol **symbols ATTRIBUTE_UNUSED;
1889 {
1890 #if VMS_DEBUG
1891 vms_debug (1, "vms_canonicalize_dynamic_reloc(%p)\n", abfd);
1892 #endif
1893 return 0L;
1894 }
This page took 0.105686 seconds and 4 git commands to generate.