diff options
author | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-02-23 22:51:47 +0000 |
---|---|---|
committer | jonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2015-02-23 22:51:47 +0000 |
commit | b9bb43ee9aee76a80a3bc83f763fb08296e9e8c5 (patch) | |
tree | 2f393aa5240626ccff2ba8e1eb2f72c8a2b73600 /packages/fcl-res | |
parent | 0eabf27bb31a7b0a7bdbe4451c27fd4be9b9f0c6 (diff) | |
download | fpc-b9bb43ee9aee76a80a3bc83f763fb08296e9e8c5.tar.gz |
+ 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: http://svn.freepascal.org/svn/fpc/trunk@29898 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fcl-res')
-rw-r--r-- | packages/fcl-res/src/machoconsts.pp | 6 | ||||
-rw-r--r-- | packages/fcl-res/src/machodefaulttarget.inc | 3 | ||||
-rw-r--r-- | packages/fcl-res/src/machoreader.pp | 3 | ||||
-rw-r--r-- | packages/fcl-res/src/machosubwriter.inc | 12 | ||||
-rw-r--r-- | packages/fcl-res/src/machotypes.pp | 3 | ||||
-rw-r--r-- | packages/fcl-res/src/machowriter.pp | 14 |
6 files changed, 26 insertions, 15 deletions
diff --git a/packages/fcl-res/src/machoconsts.pp b/packages/fcl-res/src/machoconsts.pp index 7c99421c82..af7d27a95a 100644 --- a/packages/fcl-res/src/machoconsts.pp +++ b/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. diff --git a/packages/fcl-res/src/machodefaulttarget.inc b/packages/fcl-res/src/machodefaulttarget.inc index d33ca97b04..e3b180b4cd 100644 --- a/packages/fcl-res/src/machodefaulttarget.inc +++ b/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} diff --git a/packages/fcl-res/src/machoreader.pp b/packages/fcl-res/src/machoreader.pp index 17f28e33be..7ebd608fff 100644 --- a/packages/fcl-res/src/machoreader.pp +++ b/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; diff --git a/packages/fcl-res/src/machosubwriter.inc b/packages/fcl-res/src/machosubwriter.inc index bb1194f0ab..f379e29a52 100644 --- a/packages/fcl-res/src/machosubwriter.inc +++ b/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 diff --git a/packages/fcl-res/src/machotypes.pp b/packages/fcl-res/src/machotypes.pp index ec5288d60c..59da2fbb19 100644 --- a/packages/fcl-res/src/machotypes.pp +++ b/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 diff --git a/packages/fcl-res/src/machowriter.pp b/packages/fcl-res/src/machowriter.pp index 3b7946b1d0..2420006e07 100644 --- a/packages/fcl-res/src/machowriter.pp +++ b/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; |