machotypes.pp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2008 by Giulio Bernardi
  4. Types used by Mach-O resource reader and writer
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {$IFNDEF FPC_DOTTEDUNITS}
  12. unit machotypes;
  13. {$ENDIF FPC_DOTTEDUNITS}
  14. {$MODE OBJFPC}
  15. interface
  16. {$IFDEF FPC_DOTTEDUNITS}
  17. uses
  18. System.CTypes;
  19. {$ELSE FPC_DOTTEDUNITS}
  20. uses
  21. ctypes;
  22. {$ENDIF FPC_DOTTEDUNITS}
  23. {$packrecords c}
  24. type
  25. TMachOMachineType = (mmtpowerpc, mmtpowerpc64, mmti386, mmtx86_64, mmtarm, mmtarm64);
  26. TMachOSubMachineTypePowerPC = (msmppc_all, msmppc_7400, msmppc_7450, msmppc_970);
  27. TMachOSubMachineTypePowerPC64 = (msmppc64_all);
  28. TMachOSubMachineType386 = (msm386_all);
  29. TMachOSubMachineTypex64 = (msmx64_all, msmx64_haswell);
  30. TMachOSubMachineTypeArm = (msmarm_all,msmarm_v4t,msmarm_v6,msmarm_v5tej,msmarm_xscale,msmarm_v7);
  31. TMachOSubMachineTypeAarch64 = (msmaarch64_all, msmaarch64_v8, msmaarch64_e);
  32. TSegSectName = array[0..15] of AnsiChar;
  33. TMachOSubMachineType = record
  34. case TMachOMachineType of
  35. mmtpowerpc: (fPpcSubType: TMachOSubMachineTypePowerPC);
  36. mmtpowerpc64: (fPpc64SubType: TMachOSubMachineTypePowerPC64);
  37. mmti386: (f386SubType: TMachOSubMachineType386);
  38. mmtx86_64: (fX64SubType: TMachOSubMachineTypex64);
  39. mmtarm: (fArmSubType: TMachOSubMachineTypeArm);
  40. mmtarm64: (fArm64SubType: TMachOSubMachineTypeAarch64);
  41. end;
  42. tmach_integer = cint;
  43. tmach_cpu_type = tmach_integer;
  44. tmach_cpu_subtype = tmach_integer;
  45. tmach_cpu_threadtype = tmach_integer;
  46. tmach_vm_prot = cint;
  47. type
  48. TMachFatHdr = record
  49. magic: cuint32;
  50. nfatarch: cuint32;
  51. end;
  52. TMachFarArch = record
  53. cputype: tmach_cpu_type;
  54. cpusubtype: tmach_cpu_subtype;
  55. offset: cuint32;
  56. size: cuint32;
  57. align: cuint32;
  58. end;
  59. TMachHdr = record
  60. magic: cuint32;
  61. cputype: tmach_cpu_type;
  62. cpusubtype: tmach_cpu_subtype;
  63. filetype: cuint32;
  64. ncmds: cuint32;
  65. sizeofcmds: cuint32;
  66. flags: cuint32;
  67. {$IFDEF CPU64}
  68. reserved: cuint32;
  69. {$ENDIF}
  70. end;
  71. TLoadCommand = record
  72. cmd: cuint32;
  73. cmdsize: cuint32;
  74. end;
  75. //note: all commands don't include first two longwords
  76. TSegmentCommand32 = record
  77. name : TSegSectName;
  78. vmaddr : cuint32;
  79. vmsize : cuint32;
  80. fileoff : cuint32;
  81. filesize : cuint32;
  82. maxprot : tmach_vm_prot;
  83. initprot : tmach_vm_prot;
  84. nsects : cuint32;
  85. flags : cuint32;
  86. end;
  87. TSegmentCommand64 = record
  88. name : TSegSectName;
  89. vmaddr : cuint64;
  90. vmsize : cuint64;
  91. fileoff : cuint64;
  92. filesize : cuint64;
  93. maxprot : tmach_vm_prot;
  94. initprot : tmach_vm_prot;
  95. nsects : cuint32;
  96. flags : cuint32;
  97. end;
  98. TSection32 = record
  99. sectname : TSegSectName;
  100. segname : TSegSectName;
  101. addr : cuint32;
  102. size : cuint32;
  103. offset : cuint32;
  104. align : cuint32;
  105. reloff : cuint32;
  106. nreloc : cuint32;
  107. flags : cuint32;
  108. reserved1 : cuint32;
  109. reserved2 : cuint32;
  110. end;
  111. TSection64 = record
  112. sectname : TSegSectName;
  113. segname : TSegSectName;
  114. addr : cuint64;
  115. size : cuint64;
  116. offset : cuint32;
  117. align : cuint32;
  118. reloff : cuint32;
  119. nreloc : cuint32;
  120. flags : cuint32;
  121. reserved1 : cuint32;
  122. reserved2 : longword;
  123. reserved3 : cuint32;
  124. end;
  125. TSymtabCommand = record
  126. symoff : cuint32;
  127. nsyms : cuint32;
  128. stroff : cuint32;
  129. strsize : cuint32;
  130. end;
  131. TDySymtabCommand = record
  132. ilocalsym : cuint32;
  133. nlocalsym : cuint32;
  134. iextdefsym : cuint32;
  135. nextdefsym : cuint32;
  136. iundefsym : cuint32;
  137. nundefsym : cuint32;
  138. tocoff : cuint32;
  139. ntoc : cuint32;
  140. modtaboff : cuint32;
  141. nmodtab : cuint32;
  142. extrefsymoff : cuint32;
  143. nextrefsyms : cuint32;
  144. indirectsymoff : cuint32;
  145. nindirectsyms : cuint32;
  146. extreloff : cuint32;
  147. nextrel : cuint32;
  148. locreloff : cuint32;
  149. nlocrel : cuint32;
  150. end;
  151. TNList32 = record
  152. strx : cuint32;
  153. _type : cuint8;
  154. sect : cuint8;
  155. desc : cuint16;
  156. value : cuint32;
  157. end;
  158. PNList32 = ^TNList32;
  159. TNList64 = record
  160. strx : cuint32;
  161. _type : cuint8;
  162. sect : cuint8;
  163. desc : cuint16;
  164. value : cuint64;
  165. end;
  166. PNList64 = ^TNList64;
  167. TRelocationInfo = record
  168. address : cuint32;
  169. flags : cuint32;
  170. end;
  171. PRelocationInfo = ^TRelocationInfo;
  172. TMachOSubMachineTypeCompatible = (smc_incompatible, smc_compatible, smc_exact);
  173. function MachOMachineTypesToPas(mach: tmach_cpu_type; sub: tmach_cpu_subtype; out machPas: TMachOMachineType; out subPas: TMachOSubMachineType): boolean;
  174. function MachOSubMachineTypesEqual(mach: TMachOMachineType; const wantedSubType, fileSubType: TMachOSubMachineType): TMachOSubMachineTypeCompatible;
  175. implementation
  176. {$IFDEF FPC_DOTTEDUNITS}
  177. uses
  178. System.Resources.Macho.Consts;
  179. {$ELSE FPC_DOTTEDUNITS}
  180. uses
  181. machoconsts;
  182. {$ENDIF FPC_DOTTEDUNITS}
  183. function MachOMachineTypesToPas(mach: tmach_cpu_type; sub: tmach_cpu_subtype; out machPas: TMachOMachineType; out subPas: TMachOSubMachineType): boolean;
  184. begin
  185. result:=true;
  186. case mach of
  187. CPU_TYPE_POWERPC:
  188. begin
  189. machpas:=mmtpowerpc;
  190. case sub and not(CPU_SUBTYPE_MASK) of
  191. CPU_SUBTYPE_POWERPC_7400:
  192. subPas.fPpcSubType:=msmppc_7400;
  193. CPU_SUBTYPE_POWERPC_7450:
  194. subPas.fPpcSubType:=msmppc_7450;
  195. CPU_SUBTYPE_POWERPC_970:
  196. subPas.fPpcSubType:=msmppc_970;
  197. else
  198. subPas.fPpcSubType:=msmppc_all;
  199. end;
  200. exit;
  201. end;
  202. CPU_TYPE_POWERPC64:
  203. begin
  204. machpas:=mmtpowerpc64;
  205. subPas.fPpc64SubType:=msmppc64_all;
  206. exit;
  207. end;
  208. CPU_TYPE_I386:
  209. begin
  210. machpas:=mmti386;
  211. subPas.f386SubType:=msm386_all;
  212. exit;
  213. end;
  214. CPU_TYPE_X86_64:
  215. begin
  216. machpas:=mmtx86_64;
  217. case sub and not(CPU_SUBTYPE_MASK) of
  218. CPU_SUBTYPE_X86_64_H:
  219. subPas.fX64SubType:=msmx64_haswell;
  220. else
  221. subPas.fX64SubType:=msmx64_all;
  222. end;
  223. exit;
  224. end;
  225. CPU_TYPE_ARM:
  226. begin
  227. machpas:=mmtarm;
  228. subPas.fArmSubType:=msmarm_all;
  229. exit;
  230. end;
  231. CPU_TYPE_ARM64 :
  232. begin
  233. machpas:=mmtarm64;
  234. case sub and not(CPU_SUBTYPE_MASK) of
  235. CPU_SUBTYPE_ARM64_V8:
  236. subPas.fArm64SubType:=msmaarch64_v8;
  237. CPU_SUBTYPE_ARM64E:
  238. subPas.fArm64SubType:=msmaarch64_e;
  239. else
  240. subPas.fArm64SubType:=msmaarch64_all;
  241. end;
  242. exit;
  243. end;
  244. end;
  245. result:=false;
  246. end;
  247. function MachOSubMachineTypesEqual(mach: TMachOMachineType; const wantedSubType, fileSubType: TMachOSubMachineType): TMachOSubMachineTypeCompatible;
  248. begin
  249. result:=smc_incompatible;
  250. case mach of
  251. mmtpowerpc:
  252. begin
  253. if wantedSubType.fPpcSubType=fileSubType.fPpcSubType then
  254. exit(smc_exact)
  255. else if wantedSubType.fPpcSubType>fileSubType.fPpcSubType then
  256. exit(smc_compatible);
  257. end;
  258. mmtpowerpc64:
  259. begin
  260. if wantedSubType.fPpc64SubType=fileSubType.fPpc64SubType then
  261. exit(smc_exact)
  262. end;
  263. mmti386:
  264. begin
  265. if wantedSubType.f386SubType=fileSubType.f386SubType then
  266. exit(smc_exact)
  267. end;
  268. mmtx86_64:
  269. begin
  270. if wantedSubType.fX64SubType=fileSubType.fX64SubType then
  271. exit(smc_exact)
  272. else if wantedSubType.fX64SubType>fileSubType.fX64SubType then
  273. exit(smc_compatible);
  274. end;
  275. mmtarm:
  276. begin
  277. if wantedSubType.fArmSubType=fileSubType.fArmSubType then
  278. exit(smc_exact)
  279. else if wantedSubType.fArmSubType>fileSubType.fArmSubType then
  280. exit(smc_compatible);
  281. end;
  282. mmtarm64:
  283. begin
  284. if wantedSubType.fArm64SubType=fileSubType.fArm64SubType then
  285. exit(smc_exact)
  286. else if (wantedSubType.fArm64SubType in [msmaarch64_all,msmaarch64_v8]) = (fileSubType.fArm64SubType in [msmaarch64_all,msmaarch64_v8]) then
  287. exit(smc_exact)
  288. // msmaarch64_e means pointer authentication etc which are different from plain ARMv8 code
  289. end;
  290. end;
  291. end;
  292. end.