mod_entry *SearchLib( file_list *lib, char *name ) /********************************************************/ /* Search the specified library file for the specified name & make a module */ { mod_entry *obj; unsigned long pos; unsigned long dummy; bool retval; pos = 0; if( lib->u.dict == NULL ) { if( CheckLibraryType( lib, &pos, TRUE ) == -1 ) return( NULL ); if( !(lib->status & STAT_IS_LIB) ) { BadLibrary( lib ); return( NULL ); } } if( lib->status & STAT_OMF_LIB ) { retval = OMFSearchExtLib( lib, name, &pos ); } else { retval = ARSearchExtLib( lib, name, &pos ); } if( !retval ) return( NULL ); /* update lib struct since we found desired object file */ obj = NewModEntry(); obj->name = IdentifyObject( lib, &pos, &dummy ); obj->location = pos; obj->f.source = lib; obj->modtime = lib->file->modtime; obj->modinfo = (lib->status & DBI_MASK) | (ObjFormat & FMT_OBJ_FMT_MASK); return( obj ); }
static void DoPass1( mod_entry *next, file_list *list ) /*****************************************************/ /* do pass 1 on the object file */ { member_list *member; char *membname; unsigned long loc; unsigned long size; unsigned reclength; bool lastmod; bool ignoreobj; loc = 0; lastmod = FALSE; if( CacheOpen( list ) ) { reclength = CheckLibraryType( list, &loc, FALSE ); for( ;; ) { /* there may be more than 1 object module in a file */ member = NULL; ignoreobj = FALSE; if( EndOfLib( list, loc ) ) break; membname = IdentifyObject( list, &loc, &size ); if( list->status & STAT_IS_LIB ) { if( (list->status & STAT_HAS_MEMBER) && list->u.member != NULL ) { member = FindMember( list, membname ); if( member == NULL ) { ignoreobj = TRUE; } else if( list->u.member == NULL ) { lastmod = TRUE; } } } if( ignoreobj ) { _LnkFree( membname ); if( size != 0 ) { loc += size; } else { SkipFile( list, &loc ); } } else { if( next == NULL ) { next = NewModEntry(); } next->n.next_mod = NULL; next->f.source = list; next->modtime = next->f.source->file->modtime; next->modinfo |= ObjFormat & FMT_OBJ_FMT_MASK; if( member != NULL ) { next->modinfo |= member->flags; _LnkFree( member ); } if( !(list->status & STAT_HAS_MEMBER) ) { next->modinfo |= list->status & DBI_MASK; if( list->status & STAT_LAST_SEG ) { next->modinfo |= MOD_LAST_SEG; } } AddToModList( next ); next->location = loc; if( membname == NULL ) { membname = ChkStrDup( list->file->name ); } next->name = membname; loc = ObjPass1(); if( list->status & STAT_TRACE_SYMS ) { TraceSymList( CurrMod->publist ); } next = NULL; } ObjFormat = 0; if( list->status & STAT_IS_LIB ) { // skip padding. loc += CalcAlign( loc, reclength ); } else if( !IS_FMT_OMF( CurrMod->modinfo ) ) { break; // can only concat omf. } if( lastmod || CacheEnd( list, loc ) ) { break; } } if( list->u.member != NULL ) { LnkMsg( ERR+MSG_CANT_FIND_MEMBER, "12", list->file->name, list->u.member->name ); } CacheClose( list, 1 ); } CheckStop(); }