|
@@ -546,6 +546,16 @@ interface
|
|
property Size: QWord read GetSize;
|
|
property Size: QWord read GetSize;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+ { TNewExeEntryTable }
|
|
|
|
+
|
|
|
|
+ TNewExeEntryTable = class
|
|
|
|
+ private
|
|
|
|
+ function GetSize: QWord;
|
|
|
|
+ public
|
|
|
|
+ procedure WriteTo(aWriter: TObjectWriter);
|
|
|
|
+ property Size: QWord read GetSize;
|
|
|
|
+ end;
|
|
|
|
+
|
|
{ These are fake "meta sections" used by the linker script. The actual
|
|
{ These are fake "meta sections" used by the linker script. The actual
|
|
NewExe sections are segments, limited to 64kb, which means there can be
|
|
NewExe sections are segments, limited to 64kb, which means there can be
|
|
multiple code segments, etc. These are created manually as object
|
|
multiple code segments, etc. These are created manually as object
|
|
@@ -604,6 +614,7 @@ interface
|
|
FResidentNameTable: TNewExeResidentNameTable;
|
|
FResidentNameTable: TNewExeResidentNameTable;
|
|
FModuleReferenceTable: TNewExeModuleReferenceTable;
|
|
FModuleReferenceTable: TNewExeModuleReferenceTable;
|
|
FImportedNameTable: TNewExeImportedNameTable;
|
|
FImportedNameTable: TNewExeImportedNameTable;
|
|
|
|
+ FEntryTable: TNewExeEntryTable;
|
|
procedure AddImportSymbol(const libname,symname,symmangledname:TCmdStr;OrdNr: longint;isvar:boolean);
|
|
procedure AddImportSymbol(const libname,symname,symmangledname:TCmdStr;OrdNr: longint;isvar:boolean);
|
|
procedure AddImportLibrariesExtractedFromObjectModules;
|
|
procedure AddImportLibrariesExtractedFromObjectModules;
|
|
procedure AddNewExeSection;
|
|
procedure AddNewExeSection;
|
|
@@ -615,6 +626,7 @@ interface
|
|
property ResidentNameTable: TNewExeResidentNameTable read FResidentNameTable;
|
|
property ResidentNameTable: TNewExeResidentNameTable read FResidentNameTable;
|
|
property ModuleReferenceTable: TNewExeModuleReferenceTable read FModuleReferenceTable;
|
|
property ModuleReferenceTable: TNewExeModuleReferenceTable read FModuleReferenceTable;
|
|
property ImportedNameTable: TNewExeImportedNameTable read FImportedNameTable;
|
|
property ImportedNameTable: TNewExeImportedNameTable read FImportedNameTable;
|
|
|
|
+ property EntryTable: TNewExeEntryTable read FEntryTable;
|
|
protected
|
|
protected
|
|
procedure DoRelocationFixup(objsec:TObjSection);override;
|
|
procedure DoRelocationFixup(objsec:TObjSection);override;
|
|
procedure Order_ObjSectionList(ObjSectionList : TFPObjectList;const aPattern:string);override;
|
|
procedure Order_ObjSectionList(ObjSectionList : TFPObjectList;const aPattern:string);override;
|
|
@@ -3877,6 +3889,21 @@ cleanup:
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+{****************************************************************************
|
|
|
|
+ TNewExeEntryTable
|
|
|
|
+****************************************************************************}
|
|
|
|
+
|
|
|
|
+ function TNewExeEntryTable.GetSize: QWord;
|
|
|
|
+ begin
|
|
|
|
+ { todo: implement }
|
|
|
|
+ Result:=0;
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ procedure TNewExeEntryTable.WriteTo(aWriter: TObjectWriter);
|
|
|
|
+ begin
|
|
|
|
+ { todo: implement }
|
|
|
|
+ end;
|
|
|
|
+
|
|
{****************************************************************************
|
|
{****************************************************************************
|
|
TNewExeSection
|
|
TNewExeSection
|
|
****************************************************************************}
|
|
****************************************************************************}
|
|
@@ -4045,6 +4072,7 @@ cleanup:
|
|
Header.ModuleReferenceTableEntriesCount:=ModuleReferenceTable.Count;
|
|
Header.ModuleReferenceTableEntriesCount:=ModuleReferenceTable.Count;
|
|
Header.ImportedNameTableStart:=Header.ModuleReferenceTableStart+ModuleReferenceTable.Size;
|
|
Header.ImportedNameTableStart:=Header.ModuleReferenceTableStart+ModuleReferenceTable.Size;
|
|
Header.EntryTableOffset:=Header.ImportedNameTableStart+ImportedNameTable.Size;
|
|
Header.EntryTableOffset:=Header.ImportedNameTableStart+ImportedNameTable.Size;
|
|
|
|
+ Header.EntryTableLength:=EntryTable.Size;
|
|
|
|
|
|
Header.WriteTo(FWriter);
|
|
Header.WriteTo(FWriter);
|
|
|
|
|
|
@@ -4055,6 +4083,7 @@ cleanup:
|
|
ResidentNameTable.WriteTo(FWriter);
|
|
ResidentNameTable.WriteTo(FWriter);
|
|
ModuleReferenceTable.WriteTo(FWriter,ImportedNameTable);
|
|
ModuleReferenceTable.WriteTo(FWriter,ImportedNameTable);
|
|
ImportedNameTable.WriteTo(FWriter);
|
|
ImportedNameTable.WriteTo(FWriter);
|
|
|
|
+ EntryTable.WriteTo(FWriter);
|
|
|
|
|
|
{ todo: write the rest of the file as well }
|
|
{ todo: write the rest of the file as well }
|
|
|
|
|
|
@@ -4134,10 +4163,12 @@ cleanup:
|
|
FResidentNameTable:=TNewExeResidentNameTable.Create;
|
|
FResidentNameTable:=TNewExeResidentNameTable.Create;
|
|
FModuleReferenceTable:=TNewExeModuleReferenceTable.Create;
|
|
FModuleReferenceTable:=TNewExeModuleReferenceTable.Create;
|
|
FImportedNameTable:=TNewExeImportedNameTable.Create;
|
|
FImportedNameTable:=TNewExeImportedNameTable.Create;
|
|
|
|
+ FEntryTable:=TNewExeEntryTable.Create;
|
|
end;
|
|
end;
|
|
|
|
|
|
destructor TNewExeOutput.destroy;
|
|
destructor TNewExeOutput.destroy;
|
|
begin
|
|
begin
|
|
|
|
+ FEntryTable.Free;
|
|
FImportedNameTable.Free;
|
|
FImportedNameTable.Free;
|
|
FModuleReferenceTable.Free;
|
|
FModuleReferenceTable.Free;
|
|
FResidentNameTable.Free;
|
|
FResidentNameTable.Free;
|