static bool CheckFlags( orl_file_handle filehdl ) /***********************************************/ { orl_machine_type machtype; stateflag typemask; stateflag test; orl_file_flags flags; machtype = ORLFileGetMachineType( filehdl ); switch( machtype ) { case ORL_MACHINE_TYPE_I386: typemask = HAVE_I86_CODE; break; case ORL_MACHINE_TYPE_AMD64: typemask = HAVE_X64_CODE; break; case ORL_MACHINE_TYPE_ALPHA: typemask = HAVE_ALPHA_CODE; break; case ORL_MACHINE_TYPE_PPC601: typemask = HAVE_PPC_CODE; break; case ORL_MACHINE_TYPE_R3000: typemask = HAVE_MIPS_CODE; break; case ORL_MACHINE_TYPE_NONE: typemask = 0; break; default: typemask = HAVE_MACHTYPE_MASK; // trigger the error break; } test = (typemask | LinkState) & HAVE_MACHTYPE_MASK; test &= test - 1; // turn off one bit if( test != 0 ) { // multiple bits were turned on. LnkMsg( WRN+MSG_MACHTYPE_DIFFERENT, "s", CurrMod->f.source->file->name); } else { LinkState |= typemask; } if( ORLFileGetType( filehdl ) != ORL_FILE_TYPE_OBJECT ) { BadObject(); return( false ); } flags = ORLFileGetFlags( filehdl ); #if 0 if( flags & ORL_FILE_FLAG_BIG_ENDIAN ) { // MS lies about this. LnkMsg( ERR+LOC+MSG_NO_BIG_ENDIAN, NULL ); return( false ); } #endif if( flags & ORL_FILE_FLAG_64BIT_MACHINE ) { Set64BitMode(); } else if( flags & ORL_FILE_FLAG_16BIT_MACHINE ) { Set16BitMode(); } else { Set32BitMode(); } return( true ); }
void DBIP1Source( byte *buff, byte *endbuff ) /*******************************************/ { byte major; byte minor; major = *buff++; minor = *buff++; if( endbuff <= buff ) { BadObject(); return; } ObjFormat |= FMT_DEBUG_COMENT; if( LinkFlags & OLD_DBI_FLAG ) { ODBIP1Source( major, minor, (char *)buff, endbuff - buff ); } }
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 ); } }
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; }