X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fvms-misc.c;h=b871a5d3ae0142f80c65e8a839e5a21167a4eba8;hb=b5f79c764c4d8fa336c92946eec8e2d8f4e9bffd;hp=89d39dbd31967d297181212295204c35845c0915;hpb=0007625f8feb55101b057b611d495edf81c0259a;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/vms-misc.c b/bfd/vms-misc.c index 89d39dbd31..b871a5d3ae 100644 --- a/bfd/vms-misc.c +++ b/bfd/vms-misc.c @@ -1,6 +1,7 @@ /* vms-misc.c -- Miscellaneous functions for VAX (openVMS/VAX) and EVAX (openVMS/Alpha) files. - Copyright 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 + Free Software Foundation, Inc. Written by Klaus K"ampf (kkaempf@rmi.de) @@ -29,6 +30,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "vms.h" +static vms_section *add_new_contents PARAMS ((bfd *, sec_ptr)); +static int hash_string PARAMS ((const char *)); +static asymbol *new_symbol PARAMS ((bfd *, char *)); + /*-----------------------------------------------------------------------------*/ #if VMS_DEBUG /* debug functions */ @@ -166,7 +171,6 @@ _bfd_hexdump (level, ptr, size, offset) return; } #endif - /* hash functions @@ -210,7 +214,6 @@ _bfd_vms_hash_newfunc (entry, table, string) return (struct bfd_hash_entry *)ret; } - /* object file input functions */ @@ -287,19 +290,19 @@ _bfd_vms_get_record (abfd) on VAX there's no length information in the record so start with OBJ_S_C_MAXRECSIZ */ - if (PRIV(buf_size) == 0) + if (PRIV (buf_size) == 0) { - if (PRIV(is_vax)) + if (PRIV (is_vax)) { - PRIV(vms_buf) = (unsigned char *) malloc (OBJ_S_C_MAXRECSIZ); - PRIV(buf_size) = OBJ_S_C_MAXRECSIZ; - PRIV(file_format) = FF_VAX; + PRIV (vms_buf) = (unsigned char *) malloc (OBJ_S_C_MAXRECSIZ); + PRIV (buf_size) = OBJ_S_C_MAXRECSIZ; + PRIV (file_format) = FF_VAX; } else - PRIV(vms_buf) = (unsigned char *) malloc (6); + PRIV (vms_buf) = (unsigned char *) malloc (6); } - vms_buf = PRIV(vms_buf); + vms_buf = PRIV (vms_buf); if (vms_buf == 0) { @@ -307,7 +310,7 @@ _bfd_vms_get_record (abfd) return -1; } - switch (PRIV(file_format)) + switch (PRIV (file_format)) { case FF_UNKNOWN: case FF_FOREIGN: @@ -331,7 +334,7 @@ _bfd_vms_get_record (abfd) if (bfd_tell (abfd) & 1) { - if (bfd_read (PRIV(vms_buf), 1, 1, abfd) != 1) + if (bfd_bread (PRIV (vms_buf), (bfd_size_type) 1, abfd) != 1) { bfd_set_error (bfd_error_file_truncated); return 0; @@ -341,7 +344,7 @@ _bfd_vms_get_record (abfd) /* read the record header on Alpha. */ if ((test_len != 0) - && (bfd_read (PRIV(vms_buf), 1, test_len, abfd) + && (bfd_bread (PRIV (vms_buf), (bfd_size_type) test_len, abfd) != (bfd_size_type) test_len)) { bfd_set_error (bfd_error_file_truncated); @@ -350,39 +353,40 @@ _bfd_vms_get_record (abfd) /* check file format on first call */ - if (PRIV(file_format) == FF_UNKNOWN) + if (PRIV (file_format) == FF_UNKNOWN) { /* record length repeats ? */ if ( (vms_buf[0] == vms_buf[4]) && (vms_buf[1] == vms_buf[5])) { - PRIV(file_format) = FF_FOREIGN; /* Y: foreign environment */ + PRIV (file_format) = FF_FOREIGN; /* Y: foreign environment */ test_start = 2; } else { - PRIV(file_format) = FF_NATIVE; /* N: native environment */ + PRIV (file_format) = FF_NATIVE; /* N: native environment */ test_start = 0; } } - if (PRIV(is_vax)) + if (PRIV (is_vax)) { - PRIV(rec_length) = bfd_read (vms_buf, 1, PRIV(buf_size), abfd); - if (PRIV(rec_length) <= 0) + PRIV (rec_length) = bfd_bread (vms_buf, (bfd_size_type) PRIV (buf_size), + abfd); + if (PRIV (rec_length) <= 0) { bfd_set_error (bfd_error_file_truncated); return 0; } - PRIV(vms_rec) = vms_buf; + PRIV (vms_rec) = vms_buf; } else /* Alpha */ { /* extract vms record length */ _bfd_vms_get_header_values (abfd, vms_buf+test_start, NULL, - &PRIV(rec_length)); + &PRIV (rec_length)); - if (PRIV(rec_length) <= 0) + if (PRIV (rec_length) <= 0) { bfd_set_error (bfd_error_file_truncated); return 0; @@ -390,7 +394,7 @@ _bfd_vms_get_record (abfd) /* that's what the linker manual says */ - if (PRIV(rec_length) > EOBJ_S_C_MAXRECSIZ) + if (PRIV (rec_length) > EOBJ_S_C_MAXRECSIZ) { bfd_set_error (bfd_error_file_truncated); return 0; @@ -398,39 +402,40 @@ _bfd_vms_get_record (abfd) /* adjust the buffer */ - if (PRIV(rec_length) > PRIV(buf_size)) + if (PRIV (rec_length) > PRIV (buf_size)) { - PRIV(vms_buf) = (unsigned char *) realloc (vms_buf, PRIV(rec_length)); - vms_buf = PRIV(vms_buf); + PRIV (vms_buf) = ((unsigned char *) + realloc (vms_buf, (size_t) PRIV (rec_length))); + vms_buf = PRIV (vms_buf); if (vms_buf == 0) { bfd_set_error (bfd_error_no_memory); return -1; } - PRIV(buf_size) = PRIV(rec_length); + PRIV (buf_size) = PRIV (rec_length); } /* read the remaining record */ - remaining = PRIV(rec_length) - test_len + test_start; + remaining = PRIV (rec_length) - test_len + test_start; #if VMS_DEBUG - vms_debug (10, "bfd_read remaining %d\n", remaining); + vms_debug (10, "bfd_bread remaining %d\n", remaining); #endif - if (bfd_read (vms_buf + test_len, 1, remaining, abfd) != + if (bfd_bread (vms_buf + test_len, (bfd_size_type) remaining, abfd) != (bfd_size_type) remaining) { bfd_set_error (bfd_error_file_truncated); return 0; } - PRIV(vms_rec) = vms_buf + test_start; + PRIV (vms_rec) = vms_buf + test_start; } #if VMS_DEBUG - vms_debug (11, "bfd_read rec_length %d\n", PRIV(rec_length)); + vms_debug (11, "bfd_bread rec_length %d\n", PRIV (rec_length)); #endif - return PRIV(rec_length); + return PRIV (rec_length); } /* get next vms record from file @@ -442,12 +447,12 @@ _bfd_vms_next_record (abfd) { #if VMS_DEBUG vms_debug (8, "_bfd_vms_next_record (len %d, size %d)\n", - PRIV(rec_length), PRIV(rec_size)); + PRIV (rec_length), PRIV (rec_size)); #endif - if (PRIV(rec_length) > 0) + if (PRIV (rec_length) > 0) { - PRIV(vms_rec) += PRIV(rec_size); + PRIV (vms_rec) += PRIV (rec_size); } else { @@ -455,31 +460,30 @@ _bfd_vms_next_record (abfd) return -1; } - if (!PRIV(vms_rec) || !PRIV(vms_buf) - || PRIV(vms_rec) >= (PRIV(vms_buf) + PRIV(buf_size))) + if (!PRIV (vms_rec) || !PRIV (vms_buf) + || PRIV (vms_rec) >= (PRIV (vms_buf) + PRIV (buf_size))) return -1; - if (PRIV(is_vax)) + if (PRIV (is_vax)) { - PRIV(rec_type) = *(PRIV(vms_rec)); - PRIV(rec_size) = PRIV(rec_length); + PRIV (rec_type) = *(PRIV (vms_rec)); + PRIV (rec_size) = PRIV (rec_length); } else { - _bfd_vms_get_header_values (abfd, PRIV(vms_rec), &PRIV(rec_type), - &PRIV(rec_size)); + _bfd_vms_get_header_values (abfd, PRIV (vms_rec), &PRIV (rec_type), + &PRIV (rec_size)); } - PRIV(rec_length) -= PRIV(rec_size); + PRIV (rec_length) -= PRIV (rec_size); #if VMS_DEBUG vms_debug (8, "_bfd_vms_next_record: rec %p, size %d, length %d, type %d\n", - PRIV(vms_rec), PRIV(rec_size), PRIV(rec_length), - PRIV(rec_type)); + PRIV (vms_rec), PRIV (rec_size), PRIV (rec_length), + PRIV (rec_type)); #endif - return PRIV(rec_type); + return PRIV (rec_type); } - /* Copy sized string (string with fixed length) to new allocated area size is string length (size of record) */ @@ -489,11 +493,11 @@ _bfd_vms_save_sized_string (str, size) unsigned char *str; int size; { - char *newstr = bfd_malloc (size + 1); + char *newstr = bfd_malloc ((bfd_size_type) size + 1); if (newstr == NULL) return 0; - strncpy (newstr, (char *)str, size); + strncpy (newstr, (char *) str, (size_t) size); newstr[size] = 0; return newstr; @@ -510,7 +514,6 @@ _bfd_vms_save_counted_string (ptr) return _bfd_vms_save_sized_string (ptr, len); } - /* stack routines for vms ETIR commands */ @@ -525,19 +528,19 @@ _bfd_vms_push (abfd, val, psect) static int last_psect; #if VMS_DEBUG - vms_debug (4, "\n", val, psect, PRIV(stackptr)); + vms_debug (4, "\n", val, psect, PRIV (stackptr)); #endif if (psect >= 0) last_psect = psect; - PRIV(stack[PRIV(stackptr)]).value = val; - PRIV(stack[PRIV(stackptr)]).psect = last_psect; - PRIV(stackptr)++; - if (PRIV(stackptr) >= STACKSIZE) + PRIV (stack[PRIV (stackptr)]).value = val; + PRIV (stack[PRIV (stackptr)]).psect = last_psect; + PRIV (stackptr)++; + if (PRIV (stackptr) >= STACKSIZE) { bfd_set_error (bfd_error_bad_value); - (*_bfd_error_handler) (_("Stack overflow (%d) in _bfd_vms_push"), PRIV(stackptr)); + (*_bfd_error_handler) (_("Stack overflow (%d) in _bfd_vms_push"), PRIV (stackptr)); exit (1); } return; @@ -552,24 +555,23 @@ _bfd_vms_pop (abfd, psect) { uquad value; - if (PRIV(stackptr) == 0) + if (PRIV (stackptr) == 0) { bfd_set_error (bfd_error_bad_value); (*_bfd_error_handler) (_("Stack underflow in _bfd_vms_pop")); exit (1); } - PRIV(stackptr)--; - value = PRIV(stack[PRIV(stackptr)]).value; - if ((psect != NULL) && (PRIV(stack[PRIV(stackptr)]).psect >= 0)) - *psect = PRIV(stack[PRIV(stackptr)]).psect; + PRIV (stackptr)--; + value = PRIV (stack[PRIV (stackptr)]).value; + if ((psect != NULL) && (PRIV (stack[PRIV (stackptr)]).psect >= 0)) + *psect = PRIV (stack[PRIV (stackptr)]).psect; #if VMS_DEBUG - vms_debug (4, "\n", value, PRIV(stack[PRIV(stackptr)]).psect); + vms_debug (4, "\n", value, PRIV (stack[PRIV (stackptr)]).psect); #endif return value; } - /* object file output functions */ @@ -587,20 +589,20 @@ add_new_contents (abfd, section) { vms_section *sptr, *newptr; - sptr = PRIV(vms_section_table)[section->index]; + sptr = PRIV (vms_section_table)[section->index]; if (sptr != NULL) return sptr; - newptr = (vms_section *) bfd_malloc (sizeof (vms_section)); + newptr = (vms_section *) bfd_malloc ((bfd_size_type) sizeof (vms_section)); if (newptr == (vms_section *) NULL) return NULL; - newptr->contents = (unsigned char *) bfd_alloc (abfd, (int)section->_raw_size); - if (newptr->contents == (unsigned char *)NULL) + newptr->contents = (unsigned char *) bfd_alloc (abfd, section->_raw_size); + if (newptr->contents == (unsigned char *) NULL) return NULL; newptr->offset = 0; newptr->size = section->_raw_size; newptr->next = 0; - PRIV(vms_section_table)[section->index] = newptr; + PRIV (vms_section_table)[section->index] = newptr; return newptr; } @@ -644,9 +646,8 @@ _bfd_get_vms_section (abfd, index) bfd_set_error (bfd_error_nonrepresentable_section); return NULL; } - return PRIV(vms_section_table)[index]; + return PRIV (vms_section_table)[index]; } - /* Object output routines */ @@ -666,22 +667,22 @@ _bfd_vms_output_begin (abfd, rectype, rechead) rechead); #endif - _bfd_vms_output_short (abfd,rectype); + _bfd_vms_output_short (abfd, (unsigned int) rectype); /* save current output position to fill in lenght later */ - if (PRIV(push_level) > 0) - PRIV(length_pos) = PRIV(output_size); + if (PRIV (push_level) > 0) + PRIV (length_pos) = PRIV (output_size); #if VMS_DEBUG vms_debug (6, "_bfd_vms_output_begin: length_pos = %d\n", - PRIV(length_pos)); + PRIV (length_pos)); #endif - _bfd_vms_output_short (abfd,0); /* placeholder for length */ + _bfd_vms_output_short (abfd, 0); /* placeholder for length */ if (rechead != -1) - _bfd_vms_output_short (abfd,rechead); + _bfd_vms_output_short (abfd, (unsigned int) rechead); return; } @@ -697,7 +698,7 @@ _bfd_vms_output_alignment (abfd, alignto) vms_debug (6, "_bfd_vms_output_alignment(%d)\n", alignto); #endif - PRIV(output_alignment) = alignto; + PRIV (output_alignment) = alignto; return; } @@ -708,11 +709,11 @@ _bfd_vms_output_push (abfd) bfd *abfd; { #if VMS_DEBUG - vms_debug (6, "vms_output_push(pushed_size = %d)\n", PRIV(output_size)); + vms_debug (6, "vms_output_push(pushed_size = %d)\n", PRIV (output_size)); #endif - PRIV(push_level)++; - PRIV(pushed_size) = PRIV(output_size); + PRIV (push_level)++; + PRIV (pushed_size) = PRIV (output_size); return; } @@ -723,18 +724,18 @@ _bfd_vms_output_pop (abfd) bfd *abfd; { #if VMS_DEBUG - vms_debug (6, "vms_output_pop(pushed_size = %d)\n", PRIV(pushed_size)); + vms_debug (6, "vms_output_pop(pushed_size = %d)\n", PRIV (pushed_size)); #endif _bfd_vms_output_flush (abfd); - PRIV(length_pos) = 2; + PRIV (length_pos) = 2; #if VMS_DEBUG - vms_debug (6, "vms_output_pop: length_pos = %d\n", PRIV(length_pos)); + vms_debug (6, "vms_output_pop: length_pos = %d\n", PRIV (length_pos)); #endif - PRIV(pushed_size) = 0; - PRIV(push_level)--; + PRIV (pushed_size) = 0; + PRIV (push_level)--; return; } @@ -744,24 +745,24 @@ void _bfd_vms_output_flush (abfd) bfd *abfd; { - int real_size = PRIV(output_size); + int real_size = PRIV (output_size); int aligncount; int length; #if VMS_DEBUG vms_debug (6, "_bfd_vms_output_flush(real_size = %d, pushed_size %d at lenpos %d)\n", - real_size, PRIV(pushed_size), PRIV(length_pos)); + real_size, PRIV (pushed_size), PRIV (length_pos)); #endif - if (PRIV(push_level) > 0) - length = real_size - PRIV(pushed_size); + if (PRIV (push_level) > 0) + length = real_size - PRIV (pushed_size); else length = real_size; if (length == 0) return; - aligncount = (PRIV(output_alignment) - - (length % PRIV(output_alignment))) % PRIV(output_alignment); + aligncount = (PRIV (output_alignment) + - (length % PRIV (output_alignment))) % PRIV (output_alignment); #if VMS_DEBUG vms_debug (6, "align: adding %d bytes\n", aligncount); @@ -769,34 +770,35 @@ _bfd_vms_output_flush (abfd) while (aligncount-- > 0) { - PRIV(output_buf)[real_size++] = 0; + PRIV (output_buf)[real_size++] = 0; #if 0 /* this is why I *love* vms: inconsistency :-} alignment is added to the subrecord length but not to the record length */ - if (PRIV(push_level) > 0) + if (PRIV (push_level) > 0) #endif length++; } /* put length to buffer */ - PRIV(output_size) = PRIV(length_pos); - _bfd_vms_output_short (abfd, (unsigned int)length); + PRIV (output_size) = PRIV (length_pos); + _bfd_vms_output_short (abfd, (unsigned int) length); - if (PRIV(push_level) == 0) + if (PRIV (push_level) == 0) { #ifndef VMS /* write length first, see FF_FOREIGN in the input routines */ - fwrite (PRIV(output_buf)+2, 2, 1, (FILE *)abfd->iostream); + fwrite (PRIV (output_buf) + 2, 2, 1, (FILE *) abfd->iostream); #endif - fwrite (PRIV(output_buf), real_size, 1, (FILE *)abfd->iostream); + fwrite (PRIV (output_buf), (size_t) real_size, 1, + (FILE *) abfd->iostream); - PRIV(output_size) = 0; + PRIV (output_size) = 0; } else { - PRIV(output_size) = real_size; - PRIV(pushed_size) = PRIV(output_size); + PRIV (output_size) = real_size; + PRIV (pushed_size) = PRIV (output_size); } return; @@ -830,7 +832,7 @@ _bfd_vms_output_check (abfd, size) vms_debug (6, "_bfd_vms_output_check(%d)\n", size); #endif - return (MAX_OUTREC_SIZE - (PRIV(output_size) + size + MIN_OUTREC_LUFT)); + return (MAX_OUTREC_SIZE - (PRIV (output_size) + size + MIN_OUTREC_LUFT)); } /* Output byte (8 bit) value */ @@ -844,8 +846,8 @@ _bfd_vms_output_byte (abfd, value) vms_debug (6, "_bfd_vms_output_byte(%02x)\n", value); #endif - bfd_put_8 (abfd, value & 0xff, PRIV(output_buf) + PRIV(output_size)); - PRIV(output_size) += 1; + bfd_put_8 (abfd, value & 0xff, PRIV (output_buf) + PRIV (output_size)); + PRIV (output_size) += 1; return; } @@ -860,8 +862,9 @@ _bfd_vms_output_short (abfd, value) vms_debug (6, "_bfd_vms_output_short (%04x)\n", value); #endif - bfd_put_16 (abfd, value & 0xffff, PRIV(output_buf) + PRIV(output_size)); - PRIV(output_size) += 2; + bfd_put_16 (abfd, (bfd_vma) value & 0xffff, + PRIV (output_buf) + PRIV (output_size)); + PRIV (output_size) += 2; return; } @@ -876,8 +879,8 @@ _bfd_vms_output_long (abfd, value) vms_debug (6, "_bfd_vms_output_long (%08lx)\n", value); #endif - bfd_put_32 (abfd, value, PRIV(output_buf) + PRIV(output_size)); - PRIV(output_size) += 4; + bfd_put_32 (abfd, (bfd_vma) value, PRIV (output_buf) + PRIV (output_size)); + PRIV (output_size) += 4; return; } @@ -892,8 +895,8 @@ _bfd_vms_output_quad (abfd, value) vms_debug (6, "_bfd_vms_output_quad(%016lx)\n", value); #endif - bfd_put_64(abfd, value, PRIV(output_buf) + PRIV(output_size)); - PRIV(output_size) += 8; + bfd_put_64(abfd, value, PRIV (output_buf) + PRIV (output_size)); + PRIV (output_size) += 8; return; } @@ -921,7 +924,7 @@ int len; (*_bfd_error_handler) (_("_bfd_vms_output_counted called with too many bytes")); return; } - _bfd_vms_output_byte (abfd, len & 0xff); + _bfd_vms_output_byte (abfd, (unsigned int) len & 0xff); _bfd_vms_output_dump (abfd, (unsigned char *)value, len); } @@ -940,8 +943,8 @@ _bfd_vms_output_dump (abfd, data, length) if (length == 0) return; - memcpy (PRIV(output_buf) + PRIV(output_size), data, length); - PRIV(output_size) += length; + memcpy (PRIV (output_buf) + PRIV (output_size), data, (size_t) length); + PRIV (output_size) += length; return; } @@ -960,8 +963,8 @@ _bfd_vms_output_fill (abfd, value, count) if (count == 0) return; - memset (PRIV(output_buf) + PRIV(output_size), value, count); - PRIV(output_size) += count; + memset (PRIV (output_buf) + PRIV (output_size), value, (size_t) count); + PRIV (output_size) += count; return; } @@ -1026,18 +1029,18 @@ _bfd_vms_length_hash_symbol (abfd, in, maxlen) } else { - if (PRIV(flag_hash_long_names)) + if (PRIV (flag_hash_long_names)) i = maxlen-9; else i = maxlen; } - strncpy (out, in, i); + strncpy (out, in, (size_t) i); in += i; out += i; if ((in_len > maxlen) - && PRIV(flag_hash_long_names)) + && PRIV (flag_hash_long_names)) sprintf (out, "_%08lx", result); else *out = 0; @@ -1047,8 +1050,8 @@ _bfd_vms_length_hash_symbol (abfd, in, maxlen) #endif if (in_len > maxlen - && PRIV(flag_hash_long_names) - && PRIV(flag_show_after_trunc)) + && PRIV (flag_hash_long_names) + && PRIV (flag_show_after_trunc)) printf (_("Symbol %s replaced by %s\n"), old_name, new_name); return outbuf; @@ -1067,7 +1070,7 @@ new_symbol (abfd, name) _bfd_vms_debug (7, "new_symbol %s\n", name); #endif - symbol = _bfd_vms_make_empty_symbol (abfd); + symbol = bfd_make_empty_symbol (abfd); if (symbol == 0) return symbol; symbol->name = name; @@ -1090,13 +1093,13 @@ _bfd_vms_enter_symbol (abfd, name) #endif entry = (vms_symbol_entry *) - bfd_hash_lookup (PRIV(vms_symbol_table), name, false, false); + bfd_hash_lookup (PRIV (vms_symbol_table), name, false, false); if (entry == 0) { #if VMS_DEBUG _bfd_vms_debug (8, "creating hash entry for %s\n", name); #endif - entry = (vms_symbol_entry *)bfd_hash_lookup (PRIV(vms_symbol_table), name, true, false); + entry = (vms_symbol_entry *)bfd_hash_lookup (PRIV (vms_symbol_table), name, true, false); if (entry != 0) { asymbol *symbol; @@ -1104,7 +1107,7 @@ _bfd_vms_enter_symbol (abfd, name) if (symbol != 0) { entry->symbol = symbol; - PRIV(gsd_sym_count)++; + PRIV (gsd_sym_count)++; abfd->symcount++; } else