Pārlūkot izejas kodu

+ darwin/arm support for fcl-res and fpcres

git-svn-id: trunk@13071 -
Jonas Maebe 16 gadi atpakaļ
vecāks
revīzija
fe65ee6058

+ 4 - 1
packages/fcl-res/src/machoconsts.pp

@@ -47,7 +47,7 @@ const
   CPU_TYPE_ANY       = -1;
   CPU_TYPE_I386      = 7;
   CPU_TYPE_X86_64    = CPU_TYPE_I386 or CPU_ARCH_ABI64;
-//  CPU_TYPE_ARM       = 12;
+  CPU_TYPE_ARM       = 12;
   CPU_TYPE_POWERPC   = 18;
   CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC or CPU_ARCH_ABI64;
 
@@ -55,6 +55,7 @@ const
   CPU_SUBTYPE_I386_ALL    = 3;
   CPU_SUBTYPE_X86_64_ALL  = CPU_SUBTYPE_I386_ALL;
   CPU_SUBTYPE_POWERPC_ALL = 0;
+  CPU_SUBTYPE_ARM_ALL     = 0;
 
   //Mach-O object types
   MH_OBJECT      = $1;            // relocatable object file
@@ -197,6 +198,8 @@ const
   //relocation types - x86_64
   X86_64_RELOC_UNSIGNED = 0;  // for absolute addresses
 
+  // relocation types - ARM
+  ARM_RELOC_VANILLA = 0; // generic relocation
 
 implementation
 

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

@@ -218,7 +218,8 @@ begin
     CPU_TYPE_I386      : fMachineType:=mmti386;
     CPU_TYPE_X86_64    : fMachineType:=mmtx86_64;
     CPU_TYPE_POWERPC   : fMachineType:=mmtpowerpc;
-    CPU_TYPE_POWERPC64 : fMachineType:=mmtpowerpc64
+    CPU_TYPE_POWERPC64 : fMachineType:=mmtpowerpc64;
+    CPU_TYPE_ARM       : fMachineType:=mmtarm
     else exit;
   end;
   

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

@@ -20,7 +20,7 @@ unit machotypes;
 interface
 
 type
-  TMachOMachineType = (mmtpowerpc, mmtpowerpc64, mmti386, mmtx86_64);
+  TMachOMachineType = (mmtpowerpc, mmtpowerpc64, mmti386, mmtx86_64, mmtarm);
   TSegSectName = array[0..15] of char;
 
 type

+ 11 - 0
packages/fcl-res/src/machowriter.pp

@@ -282,6 +282,11 @@ begin
                      fRelocType:=X86_64_RELOC_UNSIGNED;
                      fRelocSize:=3;
                    end;
+    mmtarm      : begin
+                     fEndianess:=MACH_LITTLE_ENDIAN;
+                     fRelocType:=ARM_RELOC_VANILLA;
+                     fRelocSize:=2;
+                   end;
   end;
   fOppositeEndianess:=aOppositeEndianess;
 end;
@@ -487,6 +492,11 @@ begin
                      fHeader.cputype:=CPU_TYPE_X86_64;
                      fHeader.cpusubtype:=CPU_SUBTYPE_X86_64_ALL;
                    end;
+    mmtarm      : begin
+                     fHeader.magic:=MH_MAGIC;
+                     fHeader.cputype:=CPU_TYPE_ARM;
+                     fHeader.cpusubtype:=CPU_SUBTYPE_ARM_ALL;
+                   end;
   end;
   fHeader.filetype:=MH_OBJECT;
   fHeader.ncmds:=3;
@@ -568,6 +578,7 @@ begin
     mmtpowerpc64 : begin fBits:=MACH_64BIT; fEndianess:=MACH_BIG_ENDIAN; end;
     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;
   end;
   fMachineType:=aMachineType;
   fOppositeEndianess:=fNativeEndianess<>fEndianess;

+ 1 - 0
utils/fpcres/fpcres.pas

@@ -263,6 +263,7 @@ begin
     mtx86_64 : Result.MachineType:=mmtx86_64;
     mtppc : Result.MachineType:=mmtpowerpc;
     mtppc64 : Result.MachineType:=mmtpowerpc64;
+    mtarm : Result.MachineType:=mmtarm;
   end;
 end;
 

+ 2 - 2
utils/fpcres/target.pas

@@ -58,7 +58,7 @@ var
     (name : 'x86_64';       formats : [ofElf, ofCoff, ofMachO]), //mtx86_64
     (name : 'powerpc';      formats : [ofElf, ofMachO]),         //mtppc
     (name : 'powerpc64';    formats : [ofElf, ofMachO]),         //mtppc64
-    (name : 'arm';          formats : [ofElf, ofCoff]),          //mtarm
+    (name : 'arm';          formats : [ofElf, ofCoff, ofMachO]), //mtarm
     (name : 'armeb';        formats : [ofElf]),                  //mtarmeb
     (name : 'm68k';         formats : [ofElf]),                  //mtm68k
     (name : 'sparc';        formats : [ofElf]),                  //mtsparc
@@ -78,7 +78,7 @@ var
                                                      mtia64]),
     (name : 'coff';     ext : '.o';      machines : [mti386,mtx86_64,mtarm]),
     (name : 'mach-o';   ext : '.or';     machines : [mti386,mtx86_64,mtppc,
-                                                     mtppc64]),
+                                                     mtppc64,mtarm]),
     (name : 'external'; ext : '.fpcres'; machines : [mtBigEndian,mtLittleEndian])
   );