Changeset 229
- Timestamp:
- 08/03/06 13:52:39 (2 years ago)
- Files:
-
- trunk/ddl/omf/OMFBinary.d (modified) (10 diffs)
- trunk/ddl/omf/OMFModule.d (modified) (4 diffs)
- trunk/test/linktest2.d (modified) (3 diffs)
- trunk/utils/ddlinfo_bn.d (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ddl/omf/OMFBinary.d
r227 r229 121 121 } 122 122 123 void parse(inout EXTDEF[] externs, OMFReader reader){123 void parse(inout EXTDEF[] externs,inout LString[] externNames,OMFReader reader){ 124 124 while(reader.hasMore()){ 125 125 EXTDEF extdef; 126 126 extdef.parse(reader); 127 externs ~= extdef; 127 externs ~= extdef; 128 129 externNames ~= extdef.name; 128 130 } 129 131 } … … 663 665 } 664 666 665 void parse(inout COMDEF[] commonDefinitions, OMFReader reader){667 void parse(inout COMDEF[] commonDefinitions,inout LString[] externNames,OMFReader reader){ 666 668 while(reader.hasMore()){ 667 669 COMDEF def; 668 670 def.parse(reader); 669 671 commonDefinitions ~= def; 672 externNames ~= def.communalName; 670 673 } 671 674 } … … 686 689 } 687 690 688 void parse(inout CEXTDEF[] commonExterns, OMFReader reader){691 void parse(inout CEXTDEF[] commonExterns,inout LString[] externNames,LString[] names,OMFReader reader){ 689 692 while(reader.hasMore()){ 690 693 CEXTDEF def; 691 694 def.parse(reader); 692 695 commonExterns ~= def; 696 externNames ~= names[def.nameIndex]; 693 697 } 694 698 } … … 862 866 LString libraryName; 863 867 LString[] names; 868 LString[] externNames; 864 869 865 870 // comment sub data … … 905 910 names.length = names.length+1; 906 911 externs.length = externs.length+1; 912 externNames.length = externNames.length+1; 907 913 908 914 while(mainReader.hasMore()){ … … 929 935 930 936 case 0x8C: //EXTDEF 931 .parse(externs, reader);937 .parse(externs,externNames,reader); 932 938 break; 933 939 … … 965 971 966 972 case 0xB0: //COMDEF 967 .parse(communalDefinitions, reader);973 .parse(communalDefinitions,externNames,reader); 968 974 break; 969 975 970 976 case 0xBC: //CEXTDEF 971 .parse(communalExterns, reader);977 .parse(communalExterns,externNames,names,reader); 972 978 break; 973 979 … … 1045 1051 1046 1052 public char[] toString(){ 1047 char[] getExternName(uint index){1048 uint workingIndex = index;1049 if(workingIndex < communalExterns.length){1050 return cast(char[])names[communalExterns[workingIndex].nameIndex];1051 }1052 workingIndex -= communalExterns.length;1053 if(workingIndex < externs.length){1054 return cast(char[])externs[workingIndex].name;1055 }1056 workingIndex -= externs.length;1057 if(workingIndex < communalDefinitions.length){1058 return cast(char[])communalDefinitions[workingIndex].communalName;1059 }1060 }1061 1062 1053 char[] result = ""; 1063 1054 ExtSprintClass sprint = new ExtSprintClass(1024); … … 1088 1079 foreach(idx,weak; weakExterns){ 1089 1080 with(weak){ 1090 char[] defaultName = getExternName(resolutionIndex);1091 char[] weakName = getExternName(weakIndex);1081 char[] defaultName = externNames[resolutionIndex]; 1082 char[] weakName = externNames[weakIndex]; 1092 1083 uint externsLength = externs.length; 1093 1084 uint cextedfsLength = communalExterns.length; … … 1153 1144 1154 1145 if(isExternStyleFixup){ 1155 targetName = "extern: " ~ getExternName(targetIndex);1146 targetName = "extern: " ~ cast(char[])externNames[targetIndex]; 1156 1147 } 1157 1148 else{ trunk/ddl/omf/OMFModule.d
r227 r229 47 47 48 48 struct Fixup{ 49 uint targetIndex;50 49 bool isExternStyleFixup; 51 50 bool isSegmentRelative; 51 uint targetSegmentIndex; 52 ExportSymbolPtr targetSymbol; 52 53 ExportSymbolPtr destSymbol; 53 54 uint destSymbolOffset; … … 106 107 // get the fixup value 107 108 if(isExternStyleFixup){ 108 auto sym = &(symbols[targetIndex-1]); 109 if(sym.type != SymbolType.Strong){ 109 if(targetSymbol.type != SymbolType.Strong){ 110 110 remainingFixups ~= fix; 111 111 continue; 112 112 } 113 fixupValue = cast(uint)( sym.address);113 fixupValue = cast(uint)(targetSymbol.address); 114 114 } 115 115 else{ 116 fixupValue = cast(uint)(segmentImages[target Index].data.ptr);116 fixupValue = cast(uint)(segmentImages[targetSegmentIndex].data.ptr); 117 117 } 118 118 debug debugLog("fixup dest [%0.8X] (%0.8X) = fixupValue [%0.8X] rel:%d",destAddress,*cast(uint*)destAddress,fixupValue,cast(uint)isSegmentRelative); … … 393 393 newFix.isSegmentRelative = fix.isSegmentRelative; 394 394 newFix.isExternStyleFixup = fix.isExternStyleFixup; 395 newFix.targetIndex = fix.targetIndex;396 395 newFix.destSymbolOffset = 0; 397 396 newFix.destSymbol = null; 398 397 newFix.destSegmentAddress = null; 398 399 // resolve the target to a symbol or segment index, dependeing on the fixup style 400 if(fix.isExternStyleFixup){ 401 newFix.targetSymbol = symbolXref[cast(char[])binary.externNames[fix.targetIndex]]; 402 } 403 else{ 404 newFix.targetSegmentIndex = fix.targetIndex; 405 } 399 406 400 407 if(fix.destNameIndex > 0){ … … 452 459 453 460 if(isExternStyleFixup){ 454 result ~= sprint(" | %s [%0.8X]", symbols[targetIndex-1].name,symbols[targetIndex-1].address);461 result ~= sprint(" | %s [%0.8X]",targetSymbol.name,targetSymbol.address); 455 462 } 456 463 else{ 457 result ~= sprint(" | segment #%d [%0.8X]",target Index,segmentImages[targetIndex].data.ptr);464 result ~= sprint(" | segment #%d [%0.8X]",targetSegmentIndex,segmentImages[targetSegmentIndex].data.ptr); 458 465 } 459 466 result ~= "\n"; trunk/test/linktest2.d
r228 r229 72 72 auto testLibrary = linker.loadAndLink("test\\testmodule.obj"); 73 73 74 /*74 75 75 //direct invocation of linked ctor 76 76 auto testCtor = testLibrary.getCtor!(ITestClass,"test.testmodule.TestClass")(); … … 80 80 81 81 // exception test from module function 82 auto exceptionTest = testLibrary.getDExport!(void function(),"test.testmodule.exceptionTest 2")();82 auto exceptionTest = testLibrary.getDExport!(void function(),"test.testmodule.exceptionTest")(); 83 83 try{ 84 84 exceptionTest(); … … 86 86 Stdout.println("Exception Test Passed. %s",e.toString()); 87 87 } 88 */88 89 89 90 90 void* exceptionTestAddr = testLibrary.getSymbol("_D4test10testmodule14exceptionTest2FZv").address; trunk/utils/ddlinfo_bn.d
r224 r229 2 2 // This file is automatically maintained by the BUILD utility, 3 3 // Please refrain from manually editing it. 4 long auto_build_number = 7 13;4 long auto_build_number = 727;
