+ 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_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.

View File

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

View File

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

View File

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

View File

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

View File

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