📄 partial-stab.h
字号:
/* Shared code to pre-read a stab (dbx-style), when building a psymtab. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992 Free Software Foundation, Inc.This file is part of GDB.This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *//* The following need to be defined: SET_NAMESTRING() --Set namestring to name of symbol. CUR_SYMBOL_TYPE --Type code of current symbol. CUR_SYMBOL_VALUE --Value field of current symbol. May be adjusted here. *//* End of macro definitions, now let's handle them symbols! */ switch (CUR_SYMBOL_TYPE) { char *p; /* * Standard, external, non-debugger, symbols */ case N_TEXT | N_EXT: case N_NBTEXT | N_EXT: CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); goto record_it; case N_DATA | N_EXT: case N_NBDATA | N_EXT: CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA); goto record_it; case N_BSS | N_EXT: case N_NBBSS | N_EXT: case N_SETV | N_EXT: /* FIXME, is this in BSS? */ CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_BSS); goto record_it; case N_ABS | N_EXT: record_it:#ifdef DBXREAD_ONLY SET_NAMESTRING(); bss_ext_symbol: record_minimal_symbol (namestring, CUR_SYMBOL_VALUE, CUR_SYMBOL_TYPE, objfile); /* Always */#endif /* DBXREAD_ONLY */ continue; /* Standard, local, non-debugger, symbols */ case N_NBTEXT: /* We need to be able to deal with both N_FN or N_TEXT, because we have no way of knowing whether the sys-supplied ld or GNU ld was used to make the executable. Sequents throw in another wrinkle -- they renumbered N_FN. */ case N_FN: case N_FN_SEQ: case N_TEXT:#ifdef DBXREAD_ONLY CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT); SET_NAMESTRING(); if ((namestring[0] == '-' && namestring[1] == 'l') || (namestring [(nsl = strlen (namestring)) - 1] == 'o' && namestring [nsl - 2] == '.')#ifdef GDB_TARGET_IS_HPPA /* some cooperation from gcc to get around ld stupidity */ || (namestring[0] == 'e' && !strcmp (namestring, "end_file."))#endif ) {#ifndef GDB_TARGET_IS_HPPA if (objfile -> ei.entry_point < CUR_SYMBOL_VALUE && objfile -> ei.entry_point >= last_o_file_start) { objfile -> ei.entry_file_lowpc = last_o_file_start; objfile -> ei.entry_file_highpc = CUR_SYMBOL_VALUE; }#endif if (past_first_source_file && pst /* The gould NP1 uses low values for .o and -l symbols which are not the address. */ && CUR_SYMBOL_VALUE >= pst->textlow) { END_PSYMTAB (pst, psymtab_include_list, includes_used, symnum * symbol_size, CUR_SYMBOL_VALUE, dependency_list, dependencies_used); pst = (struct partial_symtab *) 0; includes_used = 0; dependencies_used = 0; } else past_first_source_file = 1; last_o_file_start = CUR_SYMBOL_VALUE; }#endif /* DBXREAD_ONLY */ continue; case N_DATA:#ifdef DBXREAD_ONLY CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA); SET_NAMESTRING (); /* Check for __DYNAMIC, which is used by Sun shared libraries. Record it even if it's local, not global, so we can find it. Same with virtual function tables, both global and static. */ if ((namestring[8] == 'C' && (strcmp ("__DYNAMIC", namestring) == 0)) || VTBL_PREFIX_P ((namestring+HASH_OFFSET))) { record_minimal_symbol (namestring, CUR_SYMBOL_VALUE, CUR_SYMBOL_TYPE, objfile); /* Always */ }#endif /* DBXREAD_ONLY */ continue; case N_UNDF | N_EXT:#ifdef DBXREAD_ONLY if (CUR_SYMBOL_VALUE != 0) { /* This is a "Fortran COMMON" symbol. See if the target environment knows where it has been relocated to. */ CORE_ADDR reladdr; SET_NAMESTRING(); if (target_lookup_symbol (namestring, &reladdr)) { continue; /* Error in lookup; ignore symbol for now. */ } CUR_SYMBOL_TYPE ^= (N_BSS^N_UNDF); /* Define it as a bss-symbol */ CUR_SYMBOL_VALUE = reladdr; goto bss_ext_symbol; }#endif /* DBXREAD_ONLY */ continue; /* Just undefined, not COMMON */ case N_UNDF:#ifdef DBXREAD_ONLY if (processing_acc_compilation && bufp->n_strx == 1) { /* Deal with relative offsets in the string table used in ELF+STAB under Solaris. If we want to use the n_strx field, which contains the name of the file, we must adjust file_string_table_offset *before* calling SET_NAMESTRING(). */ past_first_source_file = 1; file_string_table_offset = next_file_string_table_offset; next_file_string_table_offset = file_string_table_offset + bufp->n_value; if (next_file_string_table_offset < file_string_table_offset) error ("string table offset backs up at %d", symnum); /* FIXME -- replace error() with complaint. */ continue; }#endif /* DBXREAD_ONLY */ continue; /* Lots of symbol types we can just ignore. */ case N_ABS: case N_BSS: case N_NBDATA: case N_NBBSS: continue; /* Keep going . . .*/ /* * Special symbol types for GNU */ case N_INDR: case N_INDR | N_EXT: case N_SETA: case N_SETA | N_EXT: case N_SETT: case N_SETT | N_EXT: case N_SETD: case N_SETD | N_EXT: case N_SETB: case N_SETB | N_EXT: case N_SETV: continue; /* * Debugger symbols */ case N_SO: { unsigned long valu = CUR_SYMBOL_VALUE; static int prev_so_symnum = -10; static int first_so_symnum; char *p; past_first_source_file = 1; if (prev_so_symnum != symnum - 1) { /* Here if prev stab wasn't N_SO */ first_so_symnum = symnum; if (pst) { END_PSYMTAB (pst, psymtab_include_list, includes_used, symnum * symbol_size, valu, dependency_list, dependencies_used); pst = (struct partial_symtab *) 0; includes_used = 0; dependencies_used = 0; } } prev_so_symnum = symnum; /* End the current partial symtab and start a new one */ SET_NAMESTRING(); valu += ANOFFSET (section_offsets, SECT_OFF_TEXT); /* Some compilers (including gcc) emit a pair of initial N_SOs. The first one is a directory name; the second the file name. If pst exists, is empty, and has a filename ending in '/', we assume the previous N_SO was a directory name. */ p = strrchr (namestring, '/'); if (p && *(p+1) == '\000') continue; /* Simply ignore directory name SOs */ /* Some other compilers (C++ ones in particular) emit useless SOs for non-existant .c files. We ignore all subsequent SOs that immediately follow the first. */ if (!pst) pst = START_PSYMTAB (objfile, section_offsets, namestring, valu, first_so_symnum * symbol_size, objfile -> global_psymbols.next, objfile -> static_psymbols.next); continue; } case N_BINCL:#ifdef DBXREAD_ONLY /* Add this bincl to the bincl_list for future EXCLs. No need to save the string; it'll be around until read_dbx_symtab function returns */ SET_NAMESTRING(); add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE); /* Mark down an include file in the current psymtab */ psymtab_include_list[includes_used++] = namestring; if (includes_used >= includes_allocated) { char **orig = psymtab_include_list; psymtab_include_list = (char **) alloca ((includes_allocated *= 2) * sizeof (char *)); memcpy ((PTR)psymtab_include_list, (PTR)orig, includes_used * sizeof (char *)); }#endif /* DBXREAD_ONLY */ continue; case N_SOL: /* Mark down an include file in the current psymtab */ SET_NAMESTRING(); /* In C++, one may expect the same filename to come round many times, when code is coming alternately from the main file and from inline functions in other files. So I check to see if this is a file we've seen before -- either the main source file, or a previously included file. This seems to be a lot of time to be spending on N_SOL, but things like "break c-exp.y:435" need to work (I suppose the psymtab_include_list could be hashed or put in a binary tree, if profiling shows this is a major hog). */ if (pst && !strcmp (namestring, pst->filename)) continue; { register int i; for (i = 0; i < includes_used; i++) if (!strcmp (namestring, psymtab_include_list[i])) { i = -1; break; } if (i == -1) continue; } psymtab_include_list[includes_used++] = namestring; if (includes_used >= includes_allocated) { char **orig = psymtab_include_list; psymtab_include_list = (char **) alloca ((includes_allocated *= 2) * sizeof (char *)); memcpy ((PTR)psymtab_include_list, (PTR)orig, includes_used * sizeof (char *)); } continue; case N_LSYM: /* Typedef or automatic variable. */ case N_STSYM: /* Data seg var -- static */ case N_LCSYM: /* BSS " */ case N_ROSYM: /* Read-only data seg var -- static. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -