if (SA_GET_FILE_FNAME_ZEROS (symbolP) == 0)
if (SA_GET_FILE_FNAME_ZEROS (symbolP) == 0 && SA_GET_FILE_FNAME_OFFSET (symbolP) != 0)
yank_symbols (){  symbolS *symbolP;  unsigned int symbol_number = 0;  unsigned int last_file_symno = 0;  struct filename_list *filename_list_scan = filename_list_head;  for (symbolP = symbol_rootP;       symbolP;       symbolP = symbolP ? symbol_next (symbolP) : symbol_rootP)    {      if (symbolP->sy_mri_common)	{	  if (S_GET_STORAGE_CLASS (symbolP) == C_EXT)	    as_bad ("%s: global symbols not supported in common sections",		    S_GET_NAME (symbolP));	  symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);	  continue;	}      if (!SF_GET_DEBUG (symbolP))	{	  /* Debug symbols do not need all this rubbish */	  symbolS *real_symbolP;	  /* L* and C_EFCN symbols never merge. */	  if (!SF_GET_LOCAL (symbolP)	      && S_GET_STORAGE_CLASS (symbolP) != C_LABEL	      && symbolP->sy_value.X_op == O_constant	      && (real_symbolP = symbol_find_base (S_GET_NAME (symbolP), DO_NOT_STRIP))	      && real_symbolP != symbolP)	    {	      /* FIXME-SOON: where do dups come from?		 Maybe tag references before definitions? xoxorich. */	      /* Move the debug data from the debug symbol to the		 real symbol. Do NOT do the oposite (i.e. move from		 real symbol to debug symbol and remove real symbol from the		 list.) Because some pointers refer to the real symbol		 whereas no pointers refer to the debug symbol. */	      c_symbol_merge (symbolP, real_symbolP);	      /* Replace the current symbol by the real one */	      /* The symbols will never be the last or the first		 because : 1st symbol is .file and 3 last symbols are		 .text, .data, .bss */	      symbol_remove (real_symbolP, &symbol_rootP, &symbol_lastP);	      symbol_insert (real_symbolP, symbolP, &symbol_rootP, &symbol_lastP);	      symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);	      symbolP = real_symbolP;	    }			/* if not local but dup'd */	  if (flag_readonly_data_in_text && (S_GET_SEGMENT (symbolP) == SEG_E1))	    {	      S_SET_SEGMENT (symbolP, SEG_E0);	    }			/* push data into text */	  resolve_symbol_value (symbolP);	  if (S_GET_STORAGE_CLASS (symbolP) == C_NULL)	    {	      if (!S_IS_DEFINED (symbolP) && !SF_GET_LOCAL (symbolP))		{		  S_SET_EXTERNAL (symbolP);		}	      else if (S_GET_SEGMENT (symbolP) == SEG_E0)		{		  S_SET_STORAGE_CLASS (symbolP, C_LABEL);		}	      else		{		  S_SET_STORAGE_CLASS (symbolP, C_STAT);		}	    }	  /* Mainly to speed up if not -g */	  if (SF_GET_PROCESS (symbolP))	    {	      /* Handle the nested blocks auxiliary info. */	      if (S_GET_STORAGE_CLASS (symbolP) == C_BLOCK)		{		  if (!strcmp (S_GET_NAME (symbolP), ".bb"))		    stack_push (block_stack, (char *) &symbolP);		  else		    {		/* .eb */		      register symbolS *begin_symbolP;		      begin_symbolP = *(symbolS **) stack_pop (block_stack);		      if (begin_symbolP == (symbolS *) 0)			as_warn ("mismatched .eb");		      else			SA_SET_SYM_ENDNDX (begin_symbolP, symbol_number + 2);		    }		}	      /* If we are able to identify the type of a function, and we	       are out of a function (last_functionP == 0) then, the	       function symbol will be associated with an auxiliary	       entry. */	      if (last_functionP == (symbolS *) 0 &&		  SF_GET_FUNCTION (symbolP))		{		  last_functionP = symbolP;		  if (S_GET_NUMBER_AUXILIARY (symbolP) < 1)		    {		      S_SET_NUMBER_AUXILIARY (symbolP, 1);		    }		/* make it at least 1 */		  /* Clobber possible stale .dim information. */#if 0		  /* Iffed out by steve - this fries the lnnoptr info too */		  bzero (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen,			 sizeof (symbolP->sy_symbol.ost_auxent[0].x_sym.x_fcnary.x_ary.x_dimen));#endif		}	      /* The C_FCN doesn't need any additional information.  I		 don't even know if this is needed for sdb. But the		 standard assembler generates it, so...  */	      if (S_GET_STORAGE_CLASS (symbolP) == C_EFCN)		{		  if (last_functionP == (symbolS *) 0)		    as_fatal ("C_EFCN symbol out of scope");		  SA_SET_SYM_FSIZE (last_functionP,				    (long) (S_GET_VALUE (symbolP) -					    S_GET_VALUE (last_functionP)));		  SA_SET_SYM_ENDNDX (last_functionP, symbol_number);		 last_functionP = (symbolS *) 0;		}	    }	}      else if (SF_GET_TAG (symbolP))	{	  /* First descriptor of a structure must point to	       the first slot after the structure description. */	  last_tagP = symbolP;	}      else if (S_GET_STORAGE_CLASS (symbolP) == C_EOS)	{	  /* +2 take in account the current symbol */	  SA_SET_SYM_ENDNDX (last_tagP, symbol_number + 2);	}      else if (S_GET_STORAGE_CLASS (symbolP) == C_FILE)	{	  /* If the filename was too long to fit in the	     auxent, put it in the string table */	  if (SA_GET_FILE_FNAME_ZEROS (symbolP) == 0)	    {	      SA_SET_FILE_FNAME_OFFSET (symbolP, string_byte_count);	      string_byte_count += strlen (filename_list_scan->filename) + 1;	      filename_list_scan = filename_list_scan->next;	    }	  if (S_GET_VALUE (symbolP))	    {	      S_SET_VALUE (symbolP, last_file_symno);	      last_file_symno = symbol_number;	    }			/* no one points at the first .file symbol */	}			/* if debug or tag or eos or file */      /* We must put the external symbols apart. The loader	 does not bomb if we do not. But the references in	 the endndx field for a .bb symbol are not corrected	 if an external symbol is removed between .bb and .be.	 I.e in the following case :	 [20] .bb endndx = 22	 [21] foo external	 [22] .be	 ld will move the symbol 21 to the end of the list but	 endndx will still be 22 instead of 21. */      if (SF_GET_LOCAL (symbolP))	{	  /* remove C_EFCN and LOCAL (L...) symbols */	  /* next pointer remains valid */	  symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);	}      else if (!S_IS_DEFINED (symbolP)	       && !S_IS_DEBUG (symbolP)	       && !SF_GET_STATICS (symbolP) &&	       S_GET_STORAGE_CLASS (symbolP) == C_EXT)	{			/* C_EXT && !SF_GET_FUNCTION(symbolP))  */	  /* if external, Remove from the list */	  symbolS *hold = symbol_previous (symbolP);	  symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);	  symbol_clear_list_pointers (symbolP);	  symbol_append (symbolP, symbol_extern_lastP, &symbol_externP, &symbol_extern_lastP);	  symbolP = hold;	}      else if (! S_IS_DEBUG (symbolP)	       && ! SF_GET_STATICS (symbolP)	       && ! SF_GET_FUNCTION (symbolP)	       && S_GET_STORAGE_CLASS (symbolP) == C_EXT)	{	  symbolS *hold = symbol_previous (symbolP);	  /* The O'Reilly COFF book says that defined global symbols             come at the end of the symbol table, just before             undefined global symbols.  */	  symbol_remove (symbolP, &symbol_rootP, &symbol_lastP);	  symbol_clear_list_pointers (symbolP);	  symbol_append (symbolP, symbol_global_lastP, &symbol_globalP,			 &symbol_global_lastP);	  symbolP = hold;	}      else	{	  if (SF_GET_STRING (symbolP))	    {	      symbolP->sy_name_offset = string_byte_count;	      string_byte_count += strlen (S_GET_NAME (symbolP)) + 1;	    }	  else	    {	      symbolP->sy_name_offset = 0;	    }			/* fix "long" names */	  symbolP->sy_number = symbol_number;	  symbol_number += 1 + S_GET_NUMBER_AUXILIARY (symbolP);	}			/* if local symbol */    }				/* traverse the symbol list */  return symbol_number;}