mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-19 11:39:33 +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_X86_64 = CPU_TYPE_I386 or CPU_ARCH_ABI64;
|
||||
CPU_TYPE_ARM = 12;
|
||||
CPU_TYPE_ARM64 = CPU_TYPE_ARM or CPU_ARCH_ABI64;
|
||||
CPU_TYPE_POWERPC = 18;
|
||||
CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC or CPU_ARCH_ABI64;
|
||||
|
||||
@ -61,6 +62,8 @@ const
|
||||
CPU_SUBTYPE_ARM_V5TEJ = 7;
|
||||
CPU_SUBTYPE_ARM_XSCALE = 8;
|
||||
CPU_SUBTYPE_ARM_V7 = 9;
|
||||
CPU_SUBTYPE_ARM64_ALL = 0;
|
||||
CPU_SUBTYPE_ARM64_V8 = 1;
|
||||
|
||||
//Mach-O object types
|
||||
MH_OBJECT = $1; // relocatable object file
|
||||
@ -206,6 +209,9 @@ const
|
||||
// relocation types - ARM
|
||||
ARM_RELOC_VANILLA = 0; // generic relocation
|
||||
|
||||
// relocation types - AARCH64
|
||||
ARM64_RELOC_UNSIGNED = 0; // for pointers
|
||||
|
||||
implementation
|
||||
|
||||
end.
|
||||
|
@ -26,6 +26,9 @@
|
||||
{$IFDEF CPUX86_64}
|
||||
fMachineType:=mmtx86_64;
|
||||
{$ENDIF}
|
||||
{$IFDEF CPUAARCH64}
|
||||
fMachineType:=mmtarm64;
|
||||
{$ENDIF}
|
||||
|
||||
fBits:=MACH_ERRBIT;
|
||||
{$IFDEF CPU32}
|
||||
|
@ -219,7 +219,8 @@ begin
|
||||
CPU_TYPE_X86_64 : fMachineType:=mmtx86_64;
|
||||
CPU_TYPE_POWERPC : fMachineType:=mmtpowerpc;
|
||||
CPU_TYPE_POWERPC64 : fMachineType:=mmtpowerpc64;
|
||||
CPU_TYPE_ARM : fMachineType:=mmtarm
|
||||
CPU_TYPE_ARM : fMachineType:=mmtarm;
|
||||
CPU_TYPE_ARM64 : fMachineType:=mmtarm64
|
||||
else exit;
|
||||
end;
|
||||
|
||||
|
@ -34,7 +34,6 @@ type
|
||||
procedure AllocateSpaceForLoadCommands(aStream : TStream); override;
|
||||
|
||||
procedure FixLoadCommands(aStream : TStream; aResources : TResources); override;
|
||||
procedure FixResHeader(aStream : TStream); override;
|
||||
public
|
||||
constructor Create(aParent : TMachOResourceWriter; const aMachineType
|
||||
: TMachOMachineType; const aSubMachineType: TMachoSubMachineType;
|
||||
@ -325,17 +324,6 @@ begin
|
||||
aStream.WriteBuffer(dysymcommand,sizeof(dysymcommand));
|
||||
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;
|
||||
const aMachineType : TMachOMachineType; const aSubMachineType: TMachoSubMachineType; const aOppositeEndianess : boolean);
|
||||
begin
|
||||
|
@ -20,12 +20,13 @@ unit machotypes;
|
||||
interface
|
||||
|
||||
type
|
||||
TMachOMachineType = (mmtpowerpc, mmtpowerpc64, mmti386, mmtx86_64, mmtarm);
|
||||
TMachOMachineType = (mmtpowerpc, mmtpowerpc64, mmti386, mmtx86_64, mmtarm, mmtarm64);
|
||||
TMachOSubMachineTypePowerPC = (msmppc_all);
|
||||
TMachOSubMachineTypePowerPC64 = (msmppc64_all);
|
||||
TMachOSubMachineType386 = (msm386_all);
|
||||
TMachOSubMachineTypex64 = (msmx64_all);
|
||||
TMachOSubMachineTypeArm = (msmarm_all,msmarm_v4t,msmarm_v6,msmarm_v5tej,msmarm_xscale,msmarm_v7);
|
||||
TMachOSubMachineTypeAarch64 = (msmaarch64_all);
|
||||
TSegSectName = array[0..15] of char;
|
||||
|
||||
type
|
||||
|
@ -37,6 +37,7 @@ type
|
||||
msm386_all: (f386SubType: TMachOSubMachineType386);
|
||||
msmx64_all: (fX64SubType: TMachOSubMachineTypex64);
|
||||
mmtarm: (fArmSubType: TMachOSubMachineTypeArm);
|
||||
mmtarm64: (fArm64SubType: TMachOSubMachineTypeAarch64);
|
||||
end;
|
||||
|
||||
TMachOResourceWriter = class(TAbstractResourceWriter)
|
||||
@ -301,6 +302,11 @@ begin
|
||||
fRelocType:=ARM_RELOC_VANILLA;
|
||||
fRelocSize:=2;
|
||||
end;
|
||||
mmtarm64 : begin
|
||||
fEndianess:=MACH_LITTLE_ENDIAN;
|
||||
fRelocType:=ARM64_RELOC_UNSIGNED;
|
||||
fRelocSize:=3;
|
||||
end;
|
||||
end;
|
||||
fOppositeEndianess:=aOppositeEndianess;
|
||||
end;
|
||||
@ -491,6 +497,7 @@ const
|
||||
armsm2int: array[TMachOSubMachineTypeArm] of longint = (CPU_SUBTYPE_ARM_ALL,
|
||||
CPU_SUBTYPE_ARM_V4T,CPU_SUBTYPE_ARM_V6,CPU_SUBTYPE_ARM_V5TEJ,
|
||||
CPU_SUBTYPE_ARM_XSCALE,CPU_SUBTYPE_ARM_V7);
|
||||
arm64sm2int: array[TMachOSubMachineTypeAarch64] of longint = (CPU_SUBTYPE_ARM64_ALL);
|
||||
begin
|
||||
aStream.Position:=0;
|
||||
case fMachineType of
|
||||
@ -519,6 +526,11 @@ begin
|
||||
fHeader.cputype:=CPU_TYPE_ARM;
|
||||
fHeader.cpusubtype:=armsm2int[fSubMachineType.fArmSubType];
|
||||
end;
|
||||
mmtarm64 : begin
|
||||
fHeader.magic:=MH_MAGIC_64;
|
||||
fHeader.cputype:=CPU_TYPE_ARM64;
|
||||
fHeader.cpusubtype:=arm64sm2int[fSubMachineType.fArm64SubType];
|
||||
end;
|
||||
end;
|
||||
fHeader.filetype:=MH_OBJECT;
|
||||
fHeader.ncmds:=3;
|
||||
@ -559,7 +571,6 @@ begin
|
||||
WriteMachOStringTable(aStream);
|
||||
FixHeader(aStream);
|
||||
FixLoadCommands(aStream,aResources);
|
||||
FixResHeader(aStream);
|
||||
end;
|
||||
|
||||
constructor TAbstractMachOSubWriter.Create(aParent : TMachOResourceWriter;
|
||||
@ -602,6 +613,7 @@ begin
|
||||
mmti386 : begin fBits:=MACH_32BIT; 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;
|
||||
mmtarm64 : begin fBits:=MACH_64BIT; fEndianess:=MACH_LITTLE_ENDIAN; end;
|
||||
end;
|
||||
fMachineType:=aMachineType;
|
||||
fOppositeEndianess:=fNativeEndianess<>fEndianess;
|
||||
|
Loading…
Reference in New Issue
Block a user