i_linux.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. {
  2. Copyright (c) 1998-2002 by Peter Vreman
  3. This unit implements support information structures for linux
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. ****************************************************************************
  16. }
  17. { This unit implements support information structures for linux. }
  18. unit i_linux;
  19. interface
  20. uses
  21. systems;
  22. const
  23. res_elf32_info : tresinfo =
  24. (
  25. id : res_elf;
  26. resbin : 'fpcres';
  27. rescmd : '-o $OBJ -i $RES'
  28. );
  29. res_elf64_info : tresinfo =
  30. (
  31. id : res_elf;
  32. resbin : 'fpcres';
  33. rescmd : '-o $OBJ -i $RES'
  34. );
  35. system_i386_linux_info : tsysteminfo =
  36. (
  37. system : system_i386_LINUX;
  38. name : 'Linux for i386';
  39. shortname : 'Linux';
  40. flags : [tf_needs_symbol_size,tf_pic_uses_got{,tf_smartlink_sections},
  41. {$ifdef segment_threadvars}
  42. tf_section_threadvars,
  43. {$endif segment_threadvars}
  44. tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
  45. cpu : cpu_i386;
  46. unit_env : 'LINUXUNITS';
  47. extradefines : 'UNIX;HASUNIX';
  48. exeext : '';
  49. defext : '.def';
  50. scriptext : '.sh';
  51. smartext : '.sl';
  52. unitext : '.ppu';
  53. unitlibext : '.ppl';
  54. asmext : '.s';
  55. objext : '.o';
  56. resext : '.res';
  57. resobjext : '.or';
  58. sharedlibext : '.so';
  59. staticlibext : '.a';
  60. staticlibprefix : 'libp';
  61. sharedlibprefix : 'lib';
  62. sharedClibext : '.so';
  63. staticClibext : '.a';
  64. staticClibprefix : 'lib';
  65. sharedClibprefix : 'lib';
  66. Cprefix : '';
  67. newline : #10;
  68. dirsep : '/';
  69. assem : as_i386_elf32;
  70. assemextern : as_gas;
  71. link : nil;
  72. linkextern : nil;
  73. ar : ar_gnu_ar;
  74. res : res_elf;
  75. dbg : dbg_stabs;
  76. script : script_unix;
  77. endian : endian_little;
  78. alignment :
  79. (
  80. procalign : 16;
  81. loopalign : 4;
  82. jumpalign : 0;
  83. constalignmin : 0;
  84. constalignmax : 8;
  85. varalignmin : 0;
  86. varalignmax : 16;
  87. localalignmin : 4;
  88. localalignmax : 8;
  89. recordalignmin : 0;
  90. recordalignmax : 16;
  91. maxCrecordalign : 4
  92. );
  93. first_parm_offset : 8;
  94. stacksize : 262144;
  95. abi : abi_default
  96. );
  97. system_x86_6432_linux_info : tsysteminfo =
  98. (
  99. system : system_x86_6432_LINUX;
  100. name : 'Linux for x64_6432';
  101. shortname : 'Linux6432';
  102. flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses,tf_pic_uses_got{,tf_smartlink_sections}];
  103. cpu : cpu_x86_64;
  104. unit_env : 'LINUXUNITS';
  105. extradefines : 'UNIX;HASUNIX';
  106. exeext : '';
  107. defext : '.def';
  108. scriptext : '.sh';
  109. smartext : '.sl';
  110. unitext : '.ppu';
  111. unitlibext : '.ppl';
  112. asmext : '.s';
  113. objext : '.o';
  114. resext : '.res';
  115. resobjext : '.or';
  116. sharedlibext : '.so';
  117. staticlibext : '.a';
  118. staticlibprefix : 'libp';
  119. sharedlibprefix : 'lib';
  120. sharedClibext : '.so';
  121. staticClibext : '.a';
  122. staticClibprefix : 'lib';
  123. sharedClibprefix : 'lib';
  124. Cprefix : '';
  125. newline : #10;
  126. dirsep : '/';
  127. assem : as_i386_elf32;
  128. assemextern : as_gas;
  129. link : nil;
  130. linkextern : nil;
  131. ar : ar_gnu_ar;
  132. res : res_none;
  133. dbg : dbg_stabs;
  134. script : script_unix;
  135. endian : endian_little;
  136. alignment :
  137. (
  138. procalign : 16;
  139. loopalign : 4;
  140. jumpalign : 0;
  141. constalignmin : 0;
  142. constalignmax : 16;
  143. varalignmin : 0;
  144. varalignmax : 16;
  145. localalignmin : 4;
  146. localalignmax : 8;
  147. recordalignmin : 0;
  148. recordalignmax : 16;
  149. maxCrecordalign : 4
  150. );
  151. first_parm_offset : 8;
  152. stacksize : 262144;
  153. abi : abi_default
  154. );
  155. system_m68k_linux_info : tsysteminfo =
  156. (
  157. system : system_m68k_linux;
  158. name : 'Linux for m68k';
  159. shortname : 'Linux';
  160. flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
  161. cpu : cpu_m68k;
  162. unit_env : 'LINUXUNITS';
  163. extradefines : 'UNIX;HASUNIX';
  164. exeext : '';
  165. defext : '';
  166. scriptext : '.sh';
  167. smartext : '.sl';
  168. unitext : '.ppu';
  169. unitlibext : '.ppl';
  170. asmext : '.s';
  171. objext : '.o';
  172. resext : '.res';
  173. resobjext : '.or';
  174. sharedlibext : '.so';
  175. staticlibext : '.a';
  176. staticlibprefix : 'libp';
  177. sharedlibprefix : 'lib';
  178. sharedClibext : '.so';
  179. staticClibext : '.a';
  180. staticClibprefix : 'lib';
  181. sharedClibprefix : 'lib';
  182. Cprefix : '';
  183. newline : #10;
  184. dirsep : '/';
  185. assem : as_gas;
  186. assemextern : as_gas;
  187. link : nil;
  188. linkextern : nil;
  189. ar : ar_gnu_ar;
  190. res : res_none;
  191. dbg : dbg_stabs;
  192. script : script_unix;
  193. endian : endian_big;
  194. alignment :
  195. (
  196. procalign : 4;
  197. loopalign : 4;
  198. jumpalign : 0;
  199. constalignmin : 0;
  200. constalignmax : 4;
  201. varalignmin : 0;
  202. varalignmax : 4;
  203. localalignmin : 4;
  204. localalignmax : 4;
  205. recordalignmin : 0;
  206. recordalignmax : 2;
  207. maxCrecordalign : 4
  208. );
  209. first_parm_offset : 8;
  210. stacksize : 32*1024*1024;
  211. abi : abi_default
  212. );
  213. system_powerpc_linux_info : tsysteminfo =
  214. (
  215. system : system_powerpc_LINUX;
  216. name : 'Linux for PowerPC';
  217. shortname : 'Linux';
  218. flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
  219. cpu : cpu_powerpc;
  220. unit_env : '';
  221. extradefines : 'UNIX;HASUNIX';
  222. exeext : '';
  223. defext : '.def';
  224. scriptext : '.sh';
  225. smartext : '.sl';
  226. unitext : '.ppu';
  227. unitlibext : '.ppl';
  228. asmext : '.s';
  229. objext : '.o';
  230. resext : '.res';
  231. resobjext : '.or';
  232. sharedlibext : '.so';
  233. staticlibext : '.a';
  234. staticlibprefix : 'libp';
  235. sharedlibprefix : 'lib';
  236. sharedClibext : '.so';
  237. staticClibext : '.a';
  238. staticClibprefix : 'lib';
  239. sharedClibprefix : 'lib';
  240. Cprefix : '';
  241. newline : #10;
  242. dirsep : '/';
  243. assem : as_gas;
  244. assemextern : as_gas;
  245. link : nil;
  246. linkextern : nil;
  247. ar : ar_gnu_ar;
  248. res : res_none;
  249. dbg : dbg_stabs;
  250. script : script_unix;
  251. endian : endian_big;
  252. alignment :
  253. (
  254. procalign : 4;
  255. loopalign : 4;
  256. jumpalign : 0;
  257. constalignmin : 0;
  258. constalignmax : 4;
  259. varalignmin : 0;
  260. varalignmax : 4;
  261. localalignmin : 4;
  262. localalignmax : 4;
  263. recordalignmin : 0;
  264. recordalignmax : 4;
  265. maxCrecordalign : 8
  266. );
  267. first_parm_offset : 8;
  268. stacksize : 32*1024*1024;
  269. abi : abi_powerpc_sysv;
  270. );
  271. system_powerpc64_linux_info : tsysteminfo =
  272. (
  273. system : system_powerpc64_LINUX;
  274. name : 'Linux for PowerPC64';
  275. shortname : 'Linux';
  276. flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
  277. cpu : cpu_powerpc64;
  278. unit_env : '';
  279. extradefines : 'UNIX;HASUNIX';
  280. exeext : '';
  281. defext : '.def';
  282. scriptext : '.sh';
  283. smartext : '.sl';
  284. unitext : '.ppu';
  285. unitlibext : '.ppl';
  286. asmext : '.s';
  287. objext : '.o';
  288. resext : '.res';
  289. resobjext : '.or';
  290. sharedlibext : '.so';
  291. staticlibext : '.a';
  292. staticlibprefix : 'libp';
  293. sharedlibprefix : 'lib';
  294. sharedClibext : '.so';
  295. staticClibext : '.a';
  296. staticClibprefix : 'lib';
  297. sharedClibprefix : 'lib';
  298. Cprefix : '';
  299. newline : #10;
  300. dirsep : '/';
  301. assem : as_gas;
  302. assemextern : as_gas;
  303. link : nil;
  304. linkextern : nil;
  305. ar : ar_gnu_ar;
  306. res : res_none;
  307. dbg : dbg_stabs;
  308. script : script_unix;
  309. endian : endian_big;
  310. alignment :
  311. (
  312. procalign : 8;
  313. loopalign : 4;
  314. jumpalign : 0;
  315. constalignmin : 0;
  316. constalignmax : 8;
  317. varalignmin : 0;
  318. varalignmax : 8;
  319. localalignmin : 4;
  320. localalignmax : 8;
  321. recordalignmin : 0;
  322. recordalignmax : 8;
  323. maxCrecordalign : 8
  324. );
  325. first_parm_offset : 8;
  326. stacksize : 10*1024*1024;
  327. abi : abi_default
  328. );
  329. system_alpha_linux_info : tsysteminfo =
  330. (
  331. system : system_alpha_LINUX;
  332. name : 'Linux for Alpha';
  333. shortname : 'Linux';
  334. flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
  335. cpu : cpu_alpha;
  336. unit_env : 'LINUXUNITS';
  337. extradefines : 'UNIX;HASUNIX';
  338. exeext : '';
  339. defext : '.def';
  340. scriptext : '.sh';
  341. smartext : '.sl';
  342. unitext : '.ppu';
  343. unitlibext : '.ppl';
  344. asmext : '.s';
  345. objext : '.o';
  346. resext : '.res';
  347. resobjext : '.or';
  348. sharedlibext : '.so';
  349. staticlibext : '.a';
  350. staticlibprefix : 'libp';
  351. sharedlibprefix : 'lib';
  352. sharedClibext : '.so';
  353. staticClibext : '.a';
  354. staticClibprefix : 'lib';
  355. sharedClibprefix : 'lib';
  356. Cprefix : '';
  357. newline : #10;
  358. dirsep : '/';
  359. assem : as_gas;
  360. assemextern : as_gas;
  361. link : nil;
  362. linkextern : nil;
  363. ar : ar_gnu_ar;
  364. res : res_none;
  365. dbg : dbg_stabs;
  366. script : script_unix;
  367. endian : endian_little;
  368. alignment :
  369. (
  370. procalign : 4;
  371. loopalign : 4;
  372. jumpalign : 0;
  373. constalignmin : 0;
  374. constalignmax : 4;
  375. varalignmin : 0;
  376. varalignmax : 4;
  377. localalignmin : 4;
  378. localalignmax : 4;
  379. recordalignmin : 0;
  380. recordalignmax : 2;
  381. maxCrecordalign : 4
  382. );
  383. first_parm_offset : 8;
  384. stacksize : 32*1024*1024;
  385. abi : abi_default
  386. );
  387. system_x86_64_linux_info : tsysteminfo =
  388. (
  389. system : system_x86_64_LINUX;
  390. name : 'Linux for x86-64';
  391. shortname : 'Linux';
  392. flags : [tf_needs_symbol_size,tf_needs_dwarf_cfi,
  393. tf_library_needs_pic,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
  394. cpu : cpu_x86_64;
  395. unit_env : 'LINUXUNITS';
  396. extradefines : 'UNIX;HASUNIX';
  397. exeext : '';
  398. defext : '.def';
  399. scriptext : '.sh';
  400. smartext : '.sl';
  401. unitext : '.ppu';
  402. unitlibext : '.ppl';
  403. asmext : '.s';
  404. objext : '.o';
  405. resext : '.res';
  406. resobjext : '.or';
  407. sharedlibext : '.so';
  408. staticlibext : '.a';
  409. staticlibprefix : 'libp';
  410. sharedlibprefix : 'lib';
  411. sharedClibext : '.so';
  412. staticClibext : '.a';
  413. staticClibprefix : 'lib';
  414. sharedClibprefix : 'lib';
  415. Cprefix : '';
  416. newline : #10;
  417. dirsep : '/';
  418. assem : as_gas;
  419. assemextern : as_gas;
  420. link : nil;
  421. linkextern : nil;
  422. ar : ar_gnu_ar;
  423. res : res_none;
  424. dbg : dbg_stabs;
  425. script : script_unix;
  426. endian : endian_little;
  427. alignment :
  428. (
  429. procalign : 8;
  430. loopalign : 4;
  431. jumpalign : 0;
  432. constalignmin : 0;
  433. constalignmax : 8;
  434. varalignmin : 0;
  435. varalignmax : 16;
  436. localalignmin : 4;
  437. localalignmax : 16;
  438. recordalignmin : 0;
  439. recordalignmax : 16;
  440. maxCrecordalign : 8
  441. );
  442. first_parm_offset : 16;
  443. stacksize : 256*1024;
  444. abi : abi_default
  445. );
  446. system_sparc_linux_info : tsysteminfo =
  447. (
  448. system : system_SPARC_Linux;
  449. name : 'Linux for SPARC';
  450. shortname : 'Linux';
  451. flags : [tf_needs_symbol_size,tf_library_needs_pic,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
  452. cpu : cpu_SPARC;
  453. unit_env : 'LINUXUNITS';
  454. extradefines : 'UNIX;HASUNIX';
  455. exeext : '';
  456. defext : '.def';
  457. scriptext : '.sh';
  458. smartext : '.sl';
  459. unitext : '.ppu';
  460. unitlibext : '.ppl';
  461. asmext : '.s';
  462. objext : '.o';
  463. resext : '.res';
  464. resobjext : '.or';
  465. sharedlibext : '.so';
  466. staticlibext : '.a';
  467. staticlibprefix : 'libp';
  468. sharedlibprefix : 'lib';
  469. sharedClibext : '.so';
  470. staticClibext : '.a';
  471. staticClibprefix : 'lib';
  472. sharedClibprefix : 'lib';
  473. Cprefix : '';
  474. newline : #10;
  475. dirsep : '/';
  476. assem : as_gas;
  477. assemextern : as_gas;
  478. link : nil;
  479. linkextern : nil;
  480. ar : ar_gnu_ar;
  481. res : res_none;
  482. dbg : dbg_stabs;
  483. script : script_unix;
  484. endian : endian_big;
  485. alignment :
  486. (
  487. procalign : 4;
  488. loopalign : 4;
  489. jumpalign : 0;
  490. constalignmin : 0;
  491. constalignmax : 8;
  492. varalignmin : 0;
  493. varalignmax : 8;
  494. localalignmin : 4;
  495. localalignmax : 8;
  496. recordalignmin : 0;
  497. recordalignmax : 8;
  498. maxCrecordalign : 8
  499. );
  500. first_parm_offset : 92;
  501. stacksize : 262144;
  502. abi : abi_default
  503. );
  504. system_arm_linux_info : tsysteminfo =
  505. (
  506. system : system_arm_Linux;
  507. name : 'Linux for ARM';
  508. shortname : 'Linux';
  509. flags : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,tf_use_function_relative_addresses];
  510. cpu : cpu_arm;
  511. unit_env : 'LINUXUNITS';
  512. extradefines : 'UNIX;HASUNIX';
  513. exeext : '';
  514. defext : '.def';
  515. scriptext : '.sh';
  516. smartext : '.sl';
  517. unitext : '.ppu';
  518. unitlibext : '.ppl';
  519. asmext : '.s';
  520. objext : '.o';
  521. resext : '.res';
  522. resobjext : '.or';
  523. sharedlibext : '.so';
  524. staticlibext : '.a';
  525. staticlibprefix : 'libp';
  526. sharedlibprefix : 'lib';
  527. sharedClibext : '.so';
  528. staticClibext : '.a';
  529. staticClibprefix : 'lib';
  530. sharedClibprefix : 'lib';
  531. Cprefix : '';
  532. newline : #10;
  533. dirsep : '/';
  534. assem : as_gas;
  535. assemextern : as_gas;
  536. link : nil;
  537. linkextern : nil;
  538. ar : ar_gnu_ar;
  539. res : res_none;
  540. dbg : dbg_stabs;
  541. script : script_unix;
  542. endian : endian_little;
  543. alignment :
  544. (
  545. procalign : 4;
  546. loopalign : 4;
  547. jumpalign : 0;
  548. constalignmin : 0;
  549. constalignmax : 4;
  550. varalignmin : 0;
  551. varalignmax : 4;
  552. localalignmin : 4;
  553. localalignmax : 8;
  554. recordalignmin : 0;
  555. recordalignmax : 4;
  556. maxCrecordalign : 4
  557. );
  558. first_parm_offset : 8;
  559. stacksize : 262144;
  560. abi : abi_default
  561. );
  562. implementation
  563. initialization
  564. {$ifdef CPU86}
  565. {$ifdef linux}
  566. { some FreeBSD versions define linux as well }
  567. {$ifndef FreeBSD}
  568. set_source_info(system_i386_linux_info);
  569. {$endif FreeBSD}
  570. {$endif}
  571. {$endif CPU86}
  572. {$ifdef CPU68}
  573. {$ifdef linux}
  574. set_source_info(system_m68k_linux_info);
  575. {$endif linux}
  576. {$endif CPU68}
  577. {$ifdef CPUX86_64}
  578. {$ifdef linux}
  579. set_source_info(system_x86_64_linux_info);
  580. {$endif linux}
  581. {$endif CPUX86_64}
  582. {$ifdef CPUALPHA}
  583. {$ifdef linux}
  584. set_source_info(system_alpha_linux_info);
  585. {$endif linux}
  586. {$endif CPUALPHA}
  587. {$ifdef CPUSPARC}
  588. {$ifdef linux}
  589. set_source_info(system_sparc_linux_info);
  590. {$endif linux}
  591. {$endif CPUSPARC}
  592. {$ifdef CPUPOWERPC32}
  593. {$ifdef linux}
  594. set_source_info(system_powerpc_linux_info);
  595. {$endif linux}
  596. {$endif CPUPOWERPC32}
  597. {$ifdef CPUPOWERPC64}
  598. {$ifdef linux}
  599. set_source_info(system_powerpc64_linux_info);
  600. {$endif linux}
  601. {$endif CPUPOWERPC64}
  602. {$ifdef CPUARM}
  603. {$ifdef linux}
  604. set_source_info(system_arm_linux_info);
  605. {$endif linux}
  606. {$endif CPUARM}
  607. end.