diff --git a/compiler/ogomf.pas b/compiler/ogomf.pas index 57dc9dfd4c..edbdee4c74 100644 --- a/compiler/ogomf.pas +++ b/compiler/ogomf.pas @@ -644,6 +644,8 @@ interface procedure AddNewExeSection; function WriteNewExe:boolean; procedure FillImportedNameAndModuleReferenceTable; + function GetHighestExportSymbolOrdinal: Word; + procedure AssignOrdinalsToAllExportSymbols; property Header: TNewExeHeader read FHeader; property CurrExeMetaSec: TNewExeMetaSection read FCurrExeMetaSec write FCurrExeMetaSec; property ResourceTable: TNewExeResourceTable read FResourceTable; @@ -4110,6 +4112,9 @@ cleanup: var i: Integer; begin + { all exported symbols must have an ordinal } + AssignOrdinalsToAllExportSymbols; + { the first entry in the resident-name table is the module name } TNewExeResidentNameTableEntry.Create(ResidentNameTable,ExtractModuleName(current_module.exefilename),0); @@ -4184,6 +4189,51 @@ cleanup: end; end; + function TNewExeOutput.GetHighestExportSymbolOrdinal: Word; + var + i, j: Integer; + ObjData: TOmfObjData; + sym: TOmfObjExportedSymbol; + begin + Result:=0; + for i:=0 to ObjDataList.Count-1 do + begin + ObjData:=TOmfObjData(ObjDataList[i]); + for j:=0 to ObjData.ExportedSymbolList.Count-1 do + begin + sym:=TOmfObjExportedSymbol(ObjData.ExportedSymbolList[j]); + if sym.ExportByOrdinal then + Result:=Max(Result,sym.ExportOrdinal); + end; + end; + end; + + procedure TNewExeOutput.AssignOrdinalsToAllExportSymbols; + var + NextOrdinal: LongInt; + i, j: Integer; + ObjData: TOmfObjData; + sym: TOmfObjExportedSymbol; + begin + NextOrdinal:=GetHighestExportSymbolOrdinal+1; + for i:=0 to ObjDataList.Count-1 do + begin + ObjData:=TOmfObjData(ObjDataList[i]); + for j:=0 to ObjData.ExportedSymbolList.Count-1 do + begin + sym:=TOmfObjExportedSymbol(ObjData.ExportedSymbolList[j]); + if not sym.ExportByOrdinal then + begin + if NextOrdinal>High(Word) then + internalerror(2019081001); + sym.ExportByOrdinal:=True; + sym.ExportOrdinal:=NextOrdinal; + Inc(NextOrdinal); + end; + end; + end; + end; + procedure TNewExeOutput.DoRelocationFixup(objsec: TObjSection); begin {todo}