Changeset 217

Show
Ignore:
Timestamp:
07/15/06 11:41:49 (2 years ago)
Author:
pragma
Message:

OMF tweaks and improvements.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ddl/omf/OMFBinary.d

    r216 r217  
    4848    LString internalName; 
    4949    LString moduleName; 
    50     char[] entryName; 
     50    LString entryName; 
    5151    ushort entryOrdinal; 
    5252     
     
    5959                             
    6060        if(ordinalFlag == 0){ 
    61             LString entryName; 
    6261            ubyte peekbyte; 
    6362            reader.peek(peekbyte); 
     
    6867                reader.get(entryName); 
    6968            } 
     69            //debug debugLog("IMPDEF: uisng entry name: %s",cast(char[])entryName); 
    7070        } 
    7171        else{ 
    7272            assert(reader.hasMore()); 
    7373            reader.get(entryOrdinal); 
     74            //debug debugLog("IMPDEF: no entry name - using ordinal #%d",entryOrdinal); 
    7475        } 
    7576    } 
     
    7778 
    7879void parse(inout IMPDEF[] imps,OMFReader reader){ 
    79     IMPDEF imp;         
     80    IMPDEF imp; 
    8081    imp.parse(reader); 
    8182    imps ~= imp; 
     
    901902            OMFReader reader = thisRecord.getOMFReader(); 
    902903             
    903             debug debugLog("record: %X (%X) %s",thisRecord.recordType,thisRecord.type,recordNameLookup[thisRecord.recordType]); 
     904            //debug debugLog("record: %X (%X) %s",thisRecord.recordType,thisRecord.type,recordNameLookup[thisRecord.recordType]); 
    904905            debug thisRecord.doRecordChecksum(); 
    905906             
     
    10101011                } 
    10111012            default: 
    1012                 debug debugLog("unhandled extensionType: %0.2X",extensionType);                
     1013                //debug debugLog("unhandled extensionType: %0.2X",extensionType);              
    10131014            } 
    10141015            break; 
     
    10201021             
    10211022        default: 
    1022             debug debugLog("unhandled commentClass: %0.2X",commentClass);              
     1023            //debug debugLog("unhandled commentClass: %0.2X",commentClass);                
    10231024        } 
    10241025    } 
     
    10491050                char[] internal = internalName; 
    10501051                char[] mod = moduleName; 
    1051                 if(entryOrdinal == 0){ 
    1052                     result ~= sprint("  %d: %s in %s as %s\n",idx,internal,mod,entryName); 
     1052                if(entryName){ 
     1053                    result ~= sprint("  %d: %s in %s as %s\n",idx,internal,mod,cast(char[])entryName); 
    10531054                } 
    10541055                else{ 
  • trunk/ddl/omf/OMFLibrary.d

    r216 r217  
    123123        reader.get(flags); 
    124124         
    125         debug debugLog("Dictionary: %0.8X\n",dictionaryOffset); 
     125        //debug debugLog("Dictionary: %0.8X\n",dictionaryOffset); 
    126126         
    127127        uint pageSize = recordLength += 3; // adjusted for the first 3 bytes in the header 
    128128         
    129         debug debugLog("recordLength: %d bytes",recordLength); 
     129        //debug debugLog("recordLength: %d bytes",recordLength); 
    130130                 
    131131        // skip the padding and proceed to the first page boundary 
     
    135135        OMFModule mod; 
    136136        while(reader.hasMore()){ 
    137             debug debugLog("offset: %0.8X\n",reader.getPosition); 
     137            //debug debugLog("offset: %0.8X\n",reader.getPosition); 
    138138         
    139139            mod = new OMFModule(reader); 
     
    150150            ubyte next; 
    151151            reader.peek(next); 
    152             debug debugLog("next: %0.2X\n",next); 
     152            //debug debugLog("next: %0.2X\n",next); 
    153153            if(next == 0xF1) break;  
    154154        } 
  • trunk/ddl/omf/OMFModule.d

    r216 r217  
    3232 
    3333private import ddl.omf.OMFBinary; 
     34private import ddl.omf.DLLProvider; 
    3435 
    3536private import mango.io.model.IReader; 
     
    7677        char[] flag = null; 
    7778                 
    78         //TODO: fix me 
     79        //TODO: alter this to zero in on D namespaces and C/asm namespaces 
    7980        this.moduleName = binary.libraryName; 
    80         debugLog(moduleName); 
    81          
    82         //if(moduleName == "..\\core32\\read.asm") flag = "..\\core32\\read.asm"; 
    83         try{ 
     81        //debug debugLog(moduleName); 
     82         
    8483        // establish segment images and build the cross-reference 
    8584        segmentImages.length = binary.segments.length; 
     
    225224        } 
    226225         
    227         //TODO: impdefs  
    228         if(binary.impdefs.length > 0) flag = "impdef"; 
    229          
    230         //Fix the symbol listings by hacking off that first (empty) entry, while avoiding CoW. 
    231     } 
    232     catch(Exception e){ 
    233         flag = e.toString(); 
    234     } 
    235         if(flag != null){ 
    236             debugLog("\n** WARNING: problems in the following module!!**\n%s\n",flag); 
    237             debugLog(this.toString()); 
    238             throw(new Error("cannot finish")); 
    239         } 
    240      
     226        // build up enough room for the impdef references 
     227        uint zerospaceLength = segmentImages[0].data.length; 
     228        segmentImages[0].data.length = zerospaceLength + binary.impdefs.length * (void*).sizeof; 
     229        void* impSpace = segmentImages[0].data.ptr + zerospaceLength; 
     230         
     231        // impdefs add to the given symbol table 
     232        foreach(imp; binary.impdefs){ 
     233            //establish impdef address   
     234            void* impAddress; 
     235            if(imp.entryName){ 
     236                impAddress = DLLProvider.loadModuleSymbol(cast(char[])imp.moduleName,cast(char[])imp.entryName); 
     237            } 
     238            else{ 
     239                impAddress = DLLProvider.loadModuleSymbol(cast(char[])imp.moduleName,imp.entryOrdinal); 
     240            } 
     241             
     242            if(impAddress){ 
     243                symbols.length = symbols.length + 1; 
     244                ExportSymbolPtr sym = &(symbols[$-1]);               
     245                 
     246                sym.type = SymbolType.Strong; 
     247                sym.name = cast(char[])imp.internalName; 
     248                sym.address = impAddress; 
     249                symbolXref[sym.name] = sym; 
     250                 
     251                // establish impspace reference 
     252                symbols.length = symbols.length + 1; 
     253                sym = &(symbols[$-1]); 
     254                 
     255                *(cast(void**)impSpace) = impAddress; 
     256                             
     257                sym.type = SymbolType.Strong; 
     258                sym.name = "__imp_" ~ cast(char[])imp.internalName; 
     259                sym.address = impSpace; //TODO: point into impspace 
     260                symbolXref[sym.name] = sym; 
     261            } 
     262            else{ 
     263                //debug debugLog("Cannot load %s from %s",cast(char[])imp.internalName,cast(char[])imp.moduleName); 
     264                //debug debugLog("  %d %s",imp.entryOrdinal,cast(char[])imp.entryName); 
     265            } 
     266            impSpace += (void*).sizeof; 
     267        } 
    241268    } 
    242269