mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 02:49:21 +02:00
+ Darwin/AArch64 support in fcl-res
o disabled writing an addend for the "usedhandles" entry, since we already add a relocation for it (and while the result of this relocation overwrites the addend on previously supported Darwin targets, it gets added on AArch64 git-svn-id: trunk@29898 -
This commit is contained in:
parent
60dd2d1dd5
commit
7d7953b115
@ -48,6 +48,7 @@ const
|
|||||||
CPU_TYPE_I386 = 7;
|
CPU_TYPE_I386 = 7;
|
||||||
CPU_TYPE_X86_64 = CPU_TYPE_I386 or CPU_ARCH_ABI64;
|
CPU_TYPE_X86_64 = CPU_TYPE_I386 or CPU_ARCH_ABI64;
|
||||||
CPU_TYPE_ARM = 12;
|
CPU_TYPE_ARM = 12;
|
||||||
|
CPU_TYPE_ARM64 = CPU_TYPE_ARM or CPU_ARCH_ABI64;
|
||||||
CPU_TYPE_POWERPC = 18;
|
CPU_TYPE_POWERPC = 18;
|
||||||
CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC or CPU_ARCH_ABI64;
|
CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC or CPU_ARCH_ABI64;
|
||||||
|
|
||||||
@ -61,6 +62,8 @@ const
|
|||||||
CPU_SUBTYPE_ARM_V5TEJ = 7;
|
CPU_SUBTYPE_ARM_V5TEJ = 7;
|
||||||
CPU_SUBTYPE_ARM_XSCALE = 8;
|
CPU_SUBTYPE_ARM_XSCALE = 8;
|
||||||
CPU_SUBTYPE_ARM_V7 = 9;
|
CPU_SUBTYPE_ARM_V7 = 9;
|
||||||
|
CPU_SUBTYPE_ARM64_ALL = 0;
|
||||||
|
CPU_SUBTYPE_ARM64_V8 = 1;
|
||||||
|
|
||||||
//Mach-O object types
|
//Mach-O object types
|
||||||
MH_OBJECT = $1; // relocatable object file
|
MH_OBJECT = $1; // relocatable object file
|
||||||
@ -206,6 +209,9 @@ const
|
|||||||
// relocation types - ARM
|
// relocation types - ARM
|
||||||
ARM_RELOC_VANILLA = 0; // generic relocation
|
ARM_RELOC_VANILLA = 0; // generic relocation
|
||||||
|
|
||||||
|
// relocation types - AARCH64
|
||||||
|
ARM64_RELOC_UNSIGNED = 0; // for pointers
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -26,6 +26,9 @@
|
|||||||
{$IFDEF CPUX86_64}
|
{$IFDEF CPUX86_64}
|
||||||
fMachineType:=mmtx86_64;
|
fMachineType:=mmtx86_64;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
{$IFDEF CPUAARCH64}
|
||||||
|
fMachineType:=mmtarm64;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
fBits:=MACH_ERRBIT;
|
fBits:=MACH_ERRBIT;
|
||||||
{$IFDEF CPU32}
|
{$IFDEF CPU32}
|
||||||
|
@ -219,7 +219,8 @@ begin
|
|||||||
CPU_TYPE_X86_64 : fMachineType:=mmtx86_64;
|
CPU_TYPE_X86_64 : fMachineType:=mmtx86_64;
|
||||||
CPU_TYPE_POWERPC : fMachineType:=mmtpowerpc;
|
CPU_TYPE_POWERPC : fMachineType:=mmtpowerpc;
|
||||||
CPU_TYPE_POWERPC64 : fMachineType:=mmtpowerpc64;
|
CPU_TYPE_POWERPC64 : fMachineType:=mmtpowerpc64;
|
||||||
CPU_TYPE_ARM : fMachineType:=mmtarm
|
CPU_TYPE_ARM : fMachineType:=mmtarm;
|
||||||
|
CPU_TYPE_ARM64 : fMachineType:=mmtarm64
|
||||||
else exit;
|
else exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -34,7 +34,6 @@ type
|
|||||||
procedure AllocateSpaceForLoadCommands(aStream : TStream); override;
|
procedure AllocateSpaceForLoadCommands(aStream : TStream); override;
|
||||||
|
|
||||||
procedure FixLoadCommands(aStream : TStream; aResources : TResources); override;
|
procedure FixLoadCommands(aStream : TStream; aResources : TResources); override;
|
||||||
procedure FixResHeader(aStream : TStream); override;
|
|
||||||
public
|
public
|
||||||
constructor Create(aParent : TMachOResourceWriter; const aMachineType
|
constructor Create(aParent : TMachOResourceWriter; const aMachineType
|
||||||
: TMachOMachineType; const aSubMachineType: TMachoSubMachineType;
|
: TMachOMachineType; const aSubMachineType: TMachoSubMachineType;
|
||||||
@ -325,17 +324,6 @@ begin
|
|||||||
aStream.WriteBuffer(dysymcommand,sizeof(dysymcommand));
|
aStream.WriteBuffer(dysymcommand,sizeof(dysymcommand));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure _TMachOSubWriter_.FixResHeader(aStream : TStream);
|
|
||||||
var hdr : _TResHdr_;
|
|
||||||
begin
|
|
||||||
hdr.handles:=fDataCurOfs;
|
|
||||||
if fOppositeEndianess then
|
|
||||||
hdr.handles:=SwapEndian(hdr.handles);
|
|
||||||
aStream.Seek(sizeof(hdr.rootptr)+sizeof(hdr.count)+sizeof(hdr.usedhandles),
|
|
||||||
soFromCurrent);
|
|
||||||
aStream.WriteBuffer(hdr.handles,sizeof(hdr.handles));
|
|
||||||
end;
|
|
||||||
|
|
||||||
constructor _TMachOSubWriter_.Create(aParent : TMachOResourceWriter;
|
constructor _TMachOSubWriter_.Create(aParent : TMachOResourceWriter;
|
||||||
const aMachineType : TMachOMachineType; const aSubMachineType: TMachoSubMachineType; const aOppositeEndianess : boolean);
|
const aMachineType : TMachOMachineType; const aSubMachineType: TMachoSubMachineType; const aOppositeEndianess : boolean);
|
||||||
begin
|
begin
|
||||||
|
@ -20,12 +20,13 @@ unit machotypes;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
type
|
type
|
||||||
TMachOMachineType = (mmtpowerpc, mmtpowerpc64, mmti386, mmtx86_64, mmtarm);
|
TMachOMachineType = (mmtpowerpc, mmtpowerpc64, mmti386, mmtx86_64, mmtarm, mmtarm64);
|
||||||
TMachOSubMachineTypePowerPC = (msmppc_all);
|
TMachOSubMachineTypePowerPC = (msmppc_all);
|
||||||
TMachOSubMachineTypePowerPC64 = (msmppc64_all);
|
TMachOSubMachineTypePowerPC64 = (msmppc64_all);
|
||||||
TMachOSubMachineType386 = (msm386_all);
|
TMachOSubMachineType386 = (msm386_all);
|
||||||
TMachOSubMachineTypex64 = (msmx64_all);
|
TMachOSubMachineTypex64 = (msmx64_all);
|
||||||
TMachOSubMachineTypeArm = (msmarm_all,msmarm_v4t,msmarm_v6,msmarm_v5tej,msmarm_xscale,msmarm_v7);
|
TMachOSubMachineTypeArm = (msmarm_all,msmarm_v4t,msmarm_v6,msmarm_v5tej,msmarm_xscale,msmarm_v7);
|
||||||
|
TMachOSubMachineTypeAarch64 = (msmaarch64_all);
|
||||||
TSegSectName = array[0..15] of char;
|
TSegSectName = array[0..15] of char;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
@ -37,6 +37,7 @@ type
|
|||||||
msm386_all: (f386SubType: TMachOSubMachineType386);
|
msm386_all: (f386SubType: TMachOSubMachineType386);
|
||||||
msmx64_all: (fX64SubType: TMachOSubMachineTypex64);
|
msmx64_all: (fX64SubType: TMachOSubMachineTypex64);
|
||||||
mmtarm: (fArmSubType: TMachOSubMachineTypeArm);
|
mmtarm: (fArmSubType: TMachOSubMachineTypeArm);
|
||||||
|
mmtarm64: (fArm64SubType: TMachOSubMachineTypeAarch64);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TMachOResourceWriter = class(TAbstractResourceWriter)
|
TMachOResourceWriter = class(TAbstractResourceWriter)
|
||||||
@ -301,6 +302,11 @@ begin
|
|||||||
fRelocType:=ARM_RELOC_VANILLA;
|
fRelocType:=ARM_RELOC_VANILLA;
|
||||||
fRelocSize:=2;
|
fRelocSize:=2;
|
||||||
end;
|
end;
|
||||||
|
mmtarm64 : begin
|
||||||
|
fEndianess:=MACH_LITTLE_ENDIAN;
|
||||||
|
fRelocType:=ARM64_RELOC_UNSIGNED;
|
||||||
|
fRelocSize:=3;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
fOppositeEndianess:=aOppositeEndianess;
|
fOppositeEndianess:=aOppositeEndianess;
|
||||||
end;
|
end;
|
||||||
@ -491,6 +497,7 @@ const
|
|||||||
armsm2int: array[TMachOSubMachineTypeArm] of longint = (CPU_SUBTYPE_ARM_ALL,
|
armsm2int: array[TMachOSubMachineTypeArm] of longint = (CPU_SUBTYPE_ARM_ALL,
|
||||||
CPU_SUBTYPE_ARM_V4T,CPU_SUBTYPE_ARM_V6,CPU_SUBTYPE_ARM_V5TEJ,
|
CPU_SUBTYPE_ARM_V4T,CPU_SUBTYPE_ARM_V6,CPU_SUBTYPE_ARM_V5TEJ,
|
||||||
CPU_SUBTYPE_ARM_XSCALE,CPU_SUBTYPE_ARM_V7);
|
CPU_SUBTYPE_ARM_XSCALE,CPU_SUBTYPE_ARM_V7);
|
||||||
|
arm64sm2int: array[TMachOSubMachineTypeAarch64] of longint = (CPU_SUBTYPE_ARM64_ALL);
|
||||||
begin
|
begin
|
||||||
aStream.Position:=0;
|
aStream.Position:=0;
|
||||||
case fMachineType of
|
case fMachineType of
|
||||||
@ -519,6 +526,11 @@ begin
|
|||||||
fHeader.cputype:=CPU_TYPE_ARM;
|
fHeader.cputype:=CPU_TYPE_ARM;
|
||||||
fHeader.cpusubtype:=armsm2int[fSubMachineType.fArmSubType];
|
fHeader.cpusubtype:=armsm2int[fSubMachineType.fArmSubType];
|
||||||
end;
|
end;
|
||||||
|
mmtarm64 : begin
|
||||||
|
fHeader.magic:=MH_MAGIC_64;
|
||||||
|
fHeader.cputype:=CPU_TYPE_ARM64;
|
||||||
|
fHeader.cpusubtype:=arm64sm2int[fSubMachineType.fArm64SubType];
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
fHeader.filetype:=MH_OBJECT;
|
fHeader.filetype:=MH_OBJECT;
|
||||||
fHeader.ncmds:=3;
|
fHeader.ncmds:=3;
|
||||||
@ -559,7 +571,6 @@ begin
|
|||||||
WriteMachOStringTable(aStream);
|
WriteMachOStringTable(aStream);
|
||||||
FixHeader(aStream);
|
FixHeader(aStream);
|
||||||
FixLoadCommands(aStream,aResources);
|
FixLoadCommands(aStream,aResources);
|
||||||
FixResHeader(aStream);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TAbstractMachOSubWriter.Create(aParent : TMachOResourceWriter;
|
constructor TAbstractMachOSubWriter.Create(aParent : TMachOResourceWriter;
|
||||||
@ -602,6 +613,7 @@ begin
|
|||||||
mmti386 : begin fBits:=MACH_32BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
|
mmti386 : begin fBits:=MACH_32BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
|
||||||
mmtx86_64 : begin fBits:=MACH_64BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
|
mmtx86_64 : begin fBits:=MACH_64BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
|
||||||
mmtarm : begin fBits:=MACH_32BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
|
mmtarm : begin fBits:=MACH_32BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
|
||||||
|
mmtarm64 : begin fBits:=MACH_64BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
|
||||||
end;
|
end;
|
||||||
fMachineType:=aMachineType;
|
fMachineType:=aMachineType;
|
||||||
fOppositeEndianess:=fNativeEndianess<>fEndianess;
|
fOppositeEndianess:=fNativeEndianess<>fEndianess;
|
||||||
|
Loading…
Reference in New Issue
Block a user