⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 partial-stab.h

📁 早期freebsd实现
💻 H
📖 第 1 页 / 共 2 页
字号:
/* 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 + -