davidt@ttidca.tti.com (David Terlinden / Boris the 1st) (07/19/89)
I believe the following changes should be made to 3.2 "gdb". Since the changes are minor, I am not trying to give exact patches which may be applied, but boxed suggested corrections are given. Originally I was working on a much older version of "gdb", but I've checked the 3.2 sources by eye to see if the same corrections seem to be necessary. coffread.c read_section_header() Add an additional parameter for the optional header size. In the case of relocatable files, the optional header is not present, and the optional header size as given in the file header is 0. By allowing optional header size to vary, "gdb" may be used to passively examing ".o" files (disassemble functions, etc.). process_coff_symbol() Do not put structure tags of the form ".xfake" in the symbol table. Fake symbols are generated by compiler for certain anonymous structures, but it is not desirable to have "gdb" use these symbols when printing things. Do something like this: ========================================================================= |#define FAKE "\.[0-9][0-9]*fake" |extern char *re_comp(); |extern int re_exec(); | | case C_STRTAG: | case C_UNTAG: | case C_ENTAG: | (void)re_comp (FAKE); | /* | * It would be more effecient to do the "re_comp()" once and for | * all in some ancestor function, but this may be unsafe if other | * regular expressions are being used elsewhere. | */ | SYMBOL_CLASS (sym) = LOC_TYPEDEF; | SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE; | if ( | TYPE_NAME (SYMBOL_TYPE (sym)) == 0 | && re_exec (SYMBOL_NAME (sym)) == 0 | && (TYPE_FLAGS (SYMBOL_TYPE (sym)) & TYPE_FLAG_PERM) == 0 | ) | TYPE_NAME (SYMBOL_TYPE (sym)) | = concat ("", | (cs->c_sclass == C_ENTAG | ? "enum " | : (cs->c_sclass == C_STRTAG | ? "struct " : "union ")), | SYMBOL_NAME (sym)); | add_symbol_to_list (sym, &file_symbols); | break; ========================================================================= read_setcion_hdr() This function should return the number of the section read. Certain weird COFF ``executables'', e.g. our OS, do not have text section as section 1. These may still be examined passively by "gdb" if "gdb" knows where the text section really is. Use a global "text_section_number" for this purpose. ========================================================================= |/* | * return section number if found or -1 if not | */ |read_section_hdr (chan, section_name, section_hdr, nsects, opthdrsize) | register int chan; | register char *section_name; | SCNHDR *section_hdr; | register int nsects; | int opthdrsize; /* size of optional header, can be 0 */ |{ | register int i; | | if (lseek (chan, (long)(FILHSZ + opthdrsize) , 0) < 0) | return -1; | | for (i = 1; i <= nsects; i++) | { | if (myread (chan, (char *)section_hdr, SCNHSZ) < 0) | return -1; | if (strncmp (section_hdr->s_name, section_name, 8) == 0) | return i; | } | return -1; |} ========================================================================= symbol_file_command() Set "text_section_number". ========================================================================= | if ( (tmp=read_section_hdr (desc, _TEXT, &text_hdr, num_sections, | file_hdr.f_opthdr)) < 0) | { | text_section_number = 0; /* bad */ | error ("\"%s\": can't read text section header", name); | } | else | text_section_number = tmp; /* good, normally is 1 */ ========================================================================= read_coff_symtab() Use "text_section_number" in case "C_EXT". ========================================================================= | case C_EXT: | if (cs->c_secnum == N_ABS && strcmp (cs->c_name, _ETEXT) == 0) | { | end_of_text_addr = cs->c_value; | } | if (cs->c_type == T_NULL) | { | if (cs->c_secnum <= 0 || cs->c_secnum == text_section_number) | /* | * N_DEBUG, N_ABS, N_UNDEF, or text section | */ | { | record_misc_function (cs->c_name, cs->c_value); | break; | } | else | cs->c_type = T_INT; | } | (void) process_coff_symbol (cs, &main_aux); | break; | | |static int text_section_number; /* the section number of the COFF text | section -- This is usually 1 but | need not be */ ========================================================================= symbol_file_command() Take out this line which is totally wrong: "make_cleanup (free_current_contents, &name);" You can't free a stack variable, and the '&' is wrong also. decode_base_type() Allow "T_NULL" so as to handle, for example, functions returning "void" or pointers to such functions. ========================================================================= | case T_NULL: | /* We used to say "shouldn't show up here", but functions returning | type void will get to here. */ | return builtin_type_void; ========================================================================= *-dep.c exec_file_command() For COFF, only use information from section headers. Avoid use of optional header, which is not always present. source.c print_source_lines() Subtract 1 from "nlines" in error message, since "nlines" is deliberately one too many. ========================================================================= | if (line < 1 || line >= s->nlines) | { | close (desc); | error ("Line number out of range; %s has %d lines.", | s->filename, s->nlines-1); /* "nlines" is purposely 1 too many */ | } ========================================================================= values.c modify_field() Reject values too big to fit in the field in question. Other- wise adjoining fields may be corrupted. ========================================================================= | if (fieldval & ~((1<<bitsize)-1)) | error ("Set will not be done. New value %d won't fit in %d bit(s).", | fieldval, bitsize); ========================================================================= ------------D. Terlinden, TTI 3100 Ocean Park Blvd, Sta. Monica CA 90405 (213) 450-9111, x3124