Changeset 217
- Timestamp:
- 07/15/06 11:41:49 (2 years ago)
- Files:
-
- trunk/ddl/omf/OMFBinary.d (modified) (8 diffs)
- trunk/ddl/omf/OMFLibrary.d (modified) (3 diffs)
- trunk/ddl/omf/OMFModule.d (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ddl/omf/OMFBinary.d
r216 r217 48 48 LString internalName; 49 49 LString moduleName; 50 char[]entryName;50 LString entryName; 51 51 ushort entryOrdinal; 52 52 … … 59 59 60 60 if(ordinalFlag == 0){ 61 LString entryName;62 61 ubyte peekbyte; 63 62 reader.peek(peekbyte); … … 68 67 reader.get(entryName); 69 68 } 69 //debug debugLog("IMPDEF: uisng entry name: %s",cast(char[])entryName); 70 70 } 71 71 else{ 72 72 assert(reader.hasMore()); 73 73 reader.get(entryOrdinal); 74 //debug debugLog("IMPDEF: no entry name - using ordinal #%d",entryOrdinal); 74 75 } 75 76 } … … 77 78 78 79 void parse(inout IMPDEF[] imps,OMFReader reader){ 79 IMPDEF imp; 80 IMPDEF imp; 80 81 imp.parse(reader); 81 82 imps ~= imp; … … 901 902 OMFReader reader = thisRecord.getOMFReader(); 902 903 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]); 904 905 debug thisRecord.doRecordChecksum(); 905 906 … … 1010 1011 } 1011 1012 default: 1012 debug debugLog("unhandled extensionType: %0.2X",extensionType);1013 //debug debugLog("unhandled extensionType: %0.2X",extensionType); 1013 1014 } 1014 1015 break; … … 1020 1021 1021 1022 default: 1022 debug debugLog("unhandled commentClass: %0.2X",commentClass);1023 //debug debugLog("unhandled commentClass: %0.2X",commentClass); 1023 1024 } 1024 1025 } … … 1049 1050 char[] internal = internalName; 1050 1051 char[] mod = moduleName; 1051 if(entry Ordinal == 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); 1053 1054 } 1054 1055 else{ trunk/ddl/omf/OMFLibrary.d
r216 r217 123 123 reader.get(flags); 124 124 125 debug debugLog("Dictionary: %0.8X\n",dictionaryOffset);125 //debug debugLog("Dictionary: %0.8X\n",dictionaryOffset); 126 126 127 127 uint pageSize = recordLength += 3; // adjusted for the first 3 bytes in the header 128 128 129 debug debugLog("recordLength: %d bytes",recordLength);129 //debug debugLog("recordLength: %d bytes",recordLength); 130 130 131 131 // skip the padding and proceed to the first page boundary … … 135 135 OMFModule mod; 136 136 while(reader.hasMore()){ 137 debug debugLog("offset: %0.8X\n",reader.getPosition);137 //debug debugLog("offset: %0.8X\n",reader.getPosition); 138 138 139 139 mod = new OMFModule(reader); … … 150 150 ubyte next; 151 151 reader.peek(next); 152 debug debugLog("next: %0.2X\n",next);152 //debug debugLog("next: %0.2X\n",next); 153 153 if(next == 0xF1) break; 154 154 } trunk/ddl/omf/OMFModule.d
r216 r217 32 32 33 33 private import ddl.omf.OMFBinary; 34 private import ddl.omf.DLLProvider; 34 35 35 36 private import mango.io.model.IReader; … … 76 77 char[] flag = null; 77 78 78 //TODO: fix me79 //TODO: alter this to zero in on D namespaces and C/asm namespaces 79 80 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 84 83 // establish segment images and build the cross-reference 85 84 segmentImages.length = binary.segments.length; … … 225 224 } 226 225 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 } 241 268 } 242 269
