void MakeSymAlias( char *name, size_t namelen, char *target, size_t targetlen ) /*****************************************************************************/ /* make a symbol table alias */ { symbol *sym; symbol *targ; if( namelen == targetlen && (*CmpRtn)( name, target, namelen ) == 0 ) { char *buff; buff = alloca( targetlen + 1 ); memcpy( buff, target, targetlen ); buff[ targetlen ] = '\0'; LnkMsg( WRN+MSG_CIRCULAR_ALIAS_FOUND, "s", buff ); return; // <--------- NOTE: premature return!!!! } sym = SymOp( ST_CREATE | ST_NOALIAS, name, namelen ); if( IS_SYM_ALIAS( sym ) ) { LnkMsg( WRN+MSG_MULTIPLE_ALIASES, "S", sym ); if( sym->info & SYM_FREE_ALIAS ) { _LnkFree( sym->p.alias ); } } else if( sym->info & SYM_DEFINED ) { return; // <--------- NOTE: premature return!!!! } sym->info |= SYM_FREE_ALIAS; /* * need to defined aliased symbol as well, so aliases in .obj files can be * hauled in from libraries */ targ = SymOp( ST_CREATE, target, targetlen ); SetSymAlias( sym, targ->name, targetlen ); }
symbol *SymOpNWPfx( sym_flags op, char *name, size_t length, char * prefix, size_t prefixLen ) /**********************************************************************************************/ { symbol *retsym = SymOp( op, name, length ); if( NULL == retsym ) return( NULL ); if( ( NULL != prefix ) && ( 0 != prefixLen ) || ( NULL != CmdFile->symprefix ) ) { char *pfxname = alloca( 255 + 1 ); /* max len of PString - used to be prefixLen+1 */ if( NULL == pfxname ) { LnkMsg( ERR+MSG_SYMBOL_NAME_TOO_LONG, "s", prefix ); return( NULL ); } if( prefix ) { memcpy( pfxname, prefix, prefixLen ); pfxname[ prefixLen] = '\0'; } else { strcpy( pfxname, CmdFile->symprefix ); } if( NULL == (retsym->prefix = AddStringStringTable( &PrefixStrings, pfxname )) ) { LnkMsg( ERR+MSG_INTERNAL, "s", "no memory for prefix symbol"); return( NULL ); } } return( retsym ); }
void ProcComdef( bool isstatic ) /*************************************/ { bool is32bit = isCOMDEF32(); char * sym_name; unsigned_8 sym_len; byte kind; unsigned_32 size; symbol * sym; extnode * ext; sym_flags flags; flags = ST_CREATE | ST_REFERENCE; if( isstatic ) { flags |= ST_STATIC; } while( ObjBuff < EOObjRec ) { sym_len = *ObjBuff++; sym_name = (char *)ObjBuff; ObjBuff += sym_len; SkipIdx(); kind = *ObjBuff++; size = GetLeaf(); if( kind == COMDEF_FAR ) { size *= GetLeaf(); } sym = SymOp( flags, sym_name, sym_len ); sym = MakeCommunalSym( sym, size, kind == COMDEF_FAR, is32bit ); ext = AllocNode( ExtNodes ); ext->entry = sym; ext->ovlref = 0; } }
symbol * MakeWeakExtdef( char *name, symbol *def ) /*******************************************************/ /* make a weak extdef */ { symbol * sym; sym = SymOp( ST_CREATE, name, strlen( name ) ); sym->e.def = def; SET_SYM_TYPE( sym, SYM_LINK_WEAK_REF ); return sym; }
void ProcLinsym( void ) /****************************/ { list_of_names * symname; symbol * sym; bool is32bit; unsigned sym_len; ObjBuff++; /* skip flags */ symname = FindName( GetIdx() ); sym_len = strlen( symname->name ); sym = SymOp( ST_FIND | ST_STATIC, symname->name, sym_len ); if( sym == NULL ) sym = SymOp( ST_FIND, symname->name, sym_len ); if( sym == NULL ) { BadObject(); return; } if( !IS_SYM_COMDAT(sym) ) return; is32bit = (ObjFormat & FMT_32BIT_REC) != 0; if( sym->mod == CurrMod && !(sym->info & SYM_DEAD) ) { DBIAddLines( sym->p.seg, ObjBuff, EOObjRec - ObjBuff, is32bit ); } }
void DataRef( symbol * sym ) /*********************************/ /* symbol referenced from data, so make sure it is included */ { if( (LinkState & HAVE_PPC_CODE) && (FmtData.type & MK_PE) ) { unsigned len = strlen( sym->name ) + 3; char *s = alloca( len ); s[ 0 ] = s[ 1 ] = '.'; strcpy( s + 2, sym->name ); sym = SymOp( ST_FIND, s, len - 1 ); } if( sym->info & SYM_DEFINED && !IS_SYM_IMPORTED( sym ) ) { RefSeg( sym->p.seg ); } sym->info |= SYM_DCE_REF; }
symbol *FindISymbol( char *name ) /*******************************/ { return( SymOp( ST_FIND | ST_REFERENCE, name, strlen( name ) ) ); }
symbol *RefISymbol( char *name ) /******************************/ { return( SymOp( ST_CREATE | ST_REFERENCE, name, strlen( name ) ) ); }
static orl_return ProcSymbol( orl_symbol_handle symhdl ) /******************************************************/ { orl_symbol_type type; char *name; orl_symbol_value value; orl_sec_handle sechdl; symbol *sym; size_t namelen; sym_flags symop; extnode *newnode; segnode *snode; bool isweak; orl_symbol_handle assocsymhdl; symbol *assocsym; orl_symbol_binding binding; sechdl = ORLSymbolGetSecHandle( symhdl ); snode = FindSegNode( sechdl ); type = ORLSymbolGetType( symhdl ); name = ORLSymbolGetName( symhdl ); if( type & ORL_SYM_TYPE_FILE ) { if( (CurrMod->modinfo & MOD_GOT_NAME) == 0 ) { CurrMod->modinfo |= MOD_GOT_NAME; _LnkFree( CurrMod->name ); CurrMod->name = AddStringStringTable( &PermStrings, name ); } return( ORL_OKAY ); } if( type & ORL_SYM_TYPE_DEBUG ) return( ORL_OKAY ); if( type & (ORL_SYM_TYPE_OBJECT|ORL_SYM_TYPE_FUNCTION) || (type & (ORL_SYM_TYPE_NOTYPE|ORL_SYM_TYPE_UNDEFINED) && name != NULL)) { namelen = strlen( name ); if( namelen == 0 ) { BadObject(); } if( CurrMod->modinfo & MOD_IMPORT_LIB ) { ImpProcSymbol( snode, type, name, namelen ); return( ORL_OKAY ); } newnode = AllocNode( ExtNodes ); newnode->handle = symhdl; binding = ORLSymbolGetBinding( symhdl ); symop = ST_CREATE; if( binding == ORL_SYM_BINDING_LOCAL ) { symop |= ST_STATIC | ST_NONUNIQUE; } if( (type & ORL_SYM_TYPE_UNDEFINED) && binding != ORL_SYM_BINDING_ALIAS ){ symop |= ST_REFERENCE; } else { symop |= ST_NOALIAS; } sym = SymOp( symop, name, namelen ); CheckIfTocSym( sym ); if( type & ORL_SYM_TYPE_COMMON ) { value = ORLSymbolGetValue( symhdl ); sym = MakeCommunalSym( sym, value.u._32[I64LO32], false, true ); } else if( type & ORL_SYM_TYPE_UNDEFINED ) { DefineReference( sym ); isweak = false; switch( binding ) { case ORL_SYM_BINDING_WEAK: isweak = true; case ORL_SYM_BINDING_ALIAS: case ORL_SYM_BINDING_LAZY: assocsymhdl = ORLSymbolGetAssociated( symhdl ); name = ORLSymbolGetName( assocsymhdl ); namelen = strlen(name); if( binding == ORL_SYM_BINDING_ALIAS ) { MakeSymAlias( sym->name, strlen(sym->name), name, namelen ); } else { assocsym = SymOp( ST_CREATE | ST_REFERENCE, name, namelen ); DefineLazyExtdef( sym, assocsym, isweak ); newnode->isweak = true; } } } else { newnode->isdefd = true; value = ORLSymbolGetValue( symhdl ); if( (type & ORL_SYM_TYPE_COMMON) && (type & ORL_SYM_TYPE_OBJECT) && sechdl == NULL) { sym = MakeCommunalSym( sym, value.u._32[I64LO32], false, true ); } else if( snode != NULL && snode->entry != NULL && snode->entry->iscdat ) { DefineComdatSym( snode, sym, value ); } else { sym->info |= SYM_DEFINED; DefineSymbol( sym, snode, value.u._32[I64LO32], 0 ); } } newnode->entry = sym; } else if( (type & ORL_SYM_TYPE_SECTION) && (type & ORL_SYM_CDAT_MASK) && snode != NULL && !(snode->info & SEG_DEAD) ) { snode->entry->select = (type & ORL_SYM_CDAT_MASK) >> ORL_SYM_CDAT_SHIFT; }