Browse Source

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

Jonas Maebe 10 years ago
parent
commit
7d7953b115

+ 6 - 0
packages/fcl-res/src/machoconsts.pp

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

+ 3 - 0
packages/fcl-res/src/machodefaulttarget.inc

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

+ 2 - 1
packages/fcl-res/src/machoreader.pp

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

+ 0 - 12
packages/fcl-res/src/machosubwriter.inc

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

+ 2 - 1
packages/fcl-res/src/machotypes.pp

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

+ 13 - 1
packages/fcl-res/src/machowriter.pp

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