+ 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:
Jonas Maebe 2015-02-23 22:51:47 +00:00
parent 60dd2d1dd5
commit 7d7953b115
6 changed files with 26 additions and 15 deletions

View File

@ -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.

View File

@ -26,6 +26,9 @@
{$IFDEF CPUX86_64}
fMachineType:=mmtx86_64;
{$ENDIF}
{$IFDEF CPUAARCH64}
fMachineType:=mmtarm64;
{$ENDIF}
fBits:=MACH_ERRBIT;
{$IFDEF CPU32}

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;