systems.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729
  1. {
  2. $Id$
  3. Copyright (C) 1998-2000 by Florian Klaempfl
  4. This unit contains information about the target systems supported
  5. (these are not processor specific)
  6. This progsam is free software; you can redistribute it and/or modify
  7. iu under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 3 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the Free Software
  16. Foundation, Inc., 675 Mass Ave, Cambridge- MA 02139, USA.
  17. ****************************************************************************
  18. }
  19. unit systems;
  20. {$i defines.inc}
  21. interface
  22. type
  23. tendian = (endian_little,endian_big);
  24. ttargetcpu=(no_cpu
  25. ,i386,m68k,alpha,powerpc
  26. );
  27. tprocessors = (no_processor
  28. ,Class386,ClassP5,ClassP6
  29. ,MC68000,MC68100,MC68020
  30. );
  31. tsection=(sec_none,
  32. sec_code,sec_data,sec_bss,
  33. sec_idata2,sec_idata4,sec_idata5,sec_idata6,sec_idata7,sec_edata,
  34. sec_stab,sec_stabstr
  35. );
  36. tasmmode= (asmmode_none
  37. ,asmmode_i386_direct,asmmode_i386_att,asmmode_i386_intel
  38. ,asmmode_m68k_mot
  39. ,asmmode_alpha_direct
  40. ,asmmode_powerpc_direct
  41. );
  42. ttarget = (target_none,
  43. target_i386_GO32V1,target_i386_GO32V2,target_i386_linux,
  44. target_i386_OS2,target_i386_Win32,target_i386_freebsd,
  45. target_i386_Netware,target_i386_sunos,target_i386_beos,
  46. target_i386_NetBsd,
  47. target_m68k_Amiga,target_m68k_Atari,target_m68k_Mac,
  48. target_m68k_linux,target_m68k_PalmOS,target_m68k_NetBsd,
  49. target_alpha_linux,
  50. target_powerpc_linux,target_powerpc_macos
  51. );
  52. tasm = (as_none
  53. ,as_i386_as,as_i386_asbsd,as_i386_as_aout,as_i386_asw,
  54. as_i386_nasmcoff,as_i386_nasmwin32,
  55. as_i386_nasmelf,as_i386_nasmobj,
  56. as_i386_tasm,as_i386_masm,
  57. as_i386_dbg,as_i386_coff,as_i386_pecoff,as_i386_elf32
  58. ,as_m68k_as,as_m68k_gas,as_m68k_mit,as_m68k_mot,
  59. as_m68k_mpw,as_m68k_palm
  60. ,as_alpha_as
  61. ,as_powerpc_as,as_powerpc_mpw
  62. );
  63. tld = (ld_none,
  64. ld_i386_GO32V1,ld_i386_GO32V2,ld_i386_linux,
  65. ld_i386_OS2,ld_i386_Win32,ld_i386_freebsd,
  66. ld_i386_Netware,ld_i386_sunos,ld_i386_beos,
  67. ld_m68k_Amiga,ld_m68k_Atari,ld_m68k_Mac,
  68. ld_m68k_linux,ld_m68k_PalmOS,ld_m68k_freebsd,
  69. ld_alpha_linux,
  70. ld_powerpc_linux,ld_powerpc_macos
  71. );
  72. tar = (ar_none
  73. ,ar_gnu_ar,ar_gnu_arw
  74. );
  75. tres = (res_none
  76. ,res_gnu_windres,res_emxbind
  77. );
  78. tscript = (script_none
  79. ,script_dos,script_unix,script_amiga
  80. );
  81. {*****************************************************************************
  82. Structures
  83. *****************************************************************************}
  84. type
  85. palignmentinfo = ^talignmentinfo;
  86. talignmentinfo = packed record
  87. procalign,
  88. loopalign,
  89. jumpalign,
  90. constalignmin,
  91. constalignmax,
  92. varalignmin,
  93. varalignmax,
  94. localalignmin,
  95. localalignmax,
  96. paraalign,
  97. recordalignmin,
  98. recordalignmax,
  99. maxCrecordalign : longint;
  100. end;
  101. pasminfo = ^tasminfo;
  102. tasminfo = packed record
  103. id : tasm;
  104. idtxt : string[9];
  105. asmbin : string[8];
  106. asmcmd : string[50];
  107. supported_target : ttarget;
  108. outputbinary,
  109. allowdirect,
  110. externals,
  111. needar,
  112. labelprefix_only_inside_procedure : boolean;
  113. labelprefix : string[3];
  114. comment : string[2];
  115. secnames : array[tsection] of string[20];
  116. end;
  117. parinfo = ^tarinfo;
  118. tarinfo = packed record
  119. id : tar;
  120. arcmd : string[50];
  121. end;
  122. presinfo = ^tresinfo;
  123. tresinfo = packed record
  124. id : tres;
  125. resbin : string[8];
  126. rescmd : string[50];
  127. end;
  128. ttargetflags = (tf_none,
  129. tf_under_development,tf_supports_stack_checking,
  130. tf_need_export,tf_needs_isconsole
  131. {$ifdef m68k}
  132. ,tf_code_small,tf_static_a5_based
  133. {$endif m68k}
  134. );
  135. ptargetinfo = ^ttargetinfo;
  136. ttargetinfo = packed record
  137. target : ttarget;
  138. name : string[30];
  139. shortname : string[9];
  140. flags : set of ttargetflags;
  141. cpu : ttargetcpu;
  142. unit_env : string[12];
  143. extradefines : string[40];
  144. sharedlibext : string[10];
  145. staticlibext,
  146. sourceext,
  147. pasext,
  148. exeext,
  149. defext,
  150. scriptext,
  151. smartext,
  152. unitext,
  153. unitlibext,
  154. asmext,
  155. objext,
  156. resext,
  157. resobjext : string[4];
  158. staticlibprefix : string[4];
  159. sharedlibprefix : string[4];
  160. Cprefix : string[2];
  161. newline : string[2];
  162. assem : tasm;
  163. assemextern : tasm; { external assembler, used by -a }
  164. link : tld;
  165. linkextern : tld; { external linker, used by -s }
  166. ar : tar;
  167. res : tres;
  168. script : tscript;
  169. endian : tendian;
  170. alignment : talignmentinfo;
  171. size_of_pointer : byte;
  172. size_of_longint : byte;
  173. heapsize,
  174. maxheapsize,
  175. stacksize : longint;
  176. DllScanSupported : boolean;
  177. use_bound_instruction : boolean;
  178. use_function_relative_addresses : boolean;
  179. end;
  180. pasmmodeinfo = ^tasmmodeinfo;
  181. tasmmodeinfo = packed record
  182. id : tasmmode;
  183. idtxt : string[8];
  184. end;
  185. const
  186. { alias for supported_target field in tasminfo }
  187. target_any = target_none;
  188. var
  189. targetinfos : array[ttarget] of ptargetinfo;
  190. asminfos : array[tasm] of pasminfo;
  191. arinfos : array[tar] of parinfo;
  192. resinfos : array[tres] of presinfo;
  193. asmmodeinfos : array[tasmmode] of pasmmodeinfo;
  194. source_info : ttargetinfo;
  195. target_cpu : ttargetcpu;
  196. target_info : ttargetinfo;
  197. target_asm : tasminfo;
  198. target_ar : tarinfo;
  199. target_res : tresinfo;
  200. target_path : string[12]; { for rtl/<X>/,fcl/<X>/, etc. }
  201. function set_target(t:ttarget):boolean;
  202. function set_target_asm(t:tasm):boolean;
  203. function set_target_ar(t:tar):boolean;
  204. function set_target_res(t:tres):boolean;
  205. function set_target_by_string(const s : string) : boolean;
  206. function set_target_asm_by_string(const s : string) : boolean;
  207. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  208. procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
  209. procedure RegisterTarget(const r:ttargetinfo);
  210. procedure RegisterAsmMode(const r:tasmmodeinfo);
  211. procedure RegisterRes(const r:tresinfo);
  212. procedure RegisterAr(const r:tarinfo);
  213. procedure InitSystems;
  214. implementation
  215. uses
  216. cutils;
  217. {****************************************************************************
  218. Target setting
  219. ****************************************************************************}
  220. function set_target(t:ttarget):boolean;
  221. begin
  222. set_target:=false;
  223. if assigned(targetinfos[t]) then
  224. begin
  225. target_info:=targetinfos[t]^;
  226. set_target_asm(target_info.assem);
  227. set_target_ar(target_info.ar);
  228. set_target_res(target_info.res);
  229. target_path:=lower(target_info.shortname);
  230. target_cpu:=target_info.cpu;
  231. set_target:=true;
  232. exit;
  233. end;
  234. end;
  235. function set_target_asm(t:tasm):boolean;
  236. begin
  237. set_target_asm:=false;
  238. if assigned(asminfos[t]) then
  239. begin
  240. target_asm:=asminfos[t]^;
  241. set_target_asm:=true;
  242. exit;
  243. end;
  244. end;
  245. function set_target_ar(t:tar):boolean;
  246. begin
  247. set_target_ar:=false;
  248. if assigned(arinfos[t]) then
  249. begin
  250. target_ar:=arinfos[t]^;
  251. set_target_ar:=true;
  252. exit;
  253. end;
  254. end;
  255. function set_target_res(t:tres):boolean;
  256. begin
  257. set_target_res:=false;
  258. if assigned(resinfos[t]) then
  259. begin
  260. target_res:=resinfos[t]^;
  261. set_target_res:=true;
  262. exit;
  263. end;
  264. end;
  265. function set_target_by_string(const s : string) : boolean;
  266. var
  267. hs : string;
  268. t : ttarget;
  269. begin
  270. set_target_by_string:=false;
  271. { this should be case insensitive !! PM }
  272. hs:=upper(s);
  273. for t:=low(ttarget) to high(ttarget) do
  274. if assigned(targetinfos[t]) and
  275. (upper(targetinfos[t]^.shortname)=hs) then
  276. begin
  277. set_target_by_string:=set_target(t);
  278. exit;
  279. end;
  280. end;
  281. function set_target_asm_by_string(const s : string) : boolean;
  282. var
  283. hs : string;
  284. t : tasm;
  285. begin
  286. set_target_asm_by_string:=false;
  287. { this should be case insensitive !! PM }
  288. hs:=upper(s);
  289. for t:=low(tasm) to high(tasm) do
  290. if assigned(asminfos[t]) and
  291. (asminfos[t]^.idtxt=hs) then
  292. begin
  293. set_target_asm_by_string:=set_target_asm(t);
  294. exit;
  295. end;
  296. end;
  297. function set_asmmode_by_string(const s:string;var t:tasmmode):boolean;
  298. var
  299. hs : string;
  300. ht : tasmmode;
  301. begin
  302. set_asmmode_by_string:=false;
  303. { this should be case insensitive !! PM }
  304. hs:=upper(s);
  305. for ht:=low(tasmmode) to high(tasmmode) do
  306. if assigned(asmmodeinfos[ht]) and
  307. (asmmodeinfos[ht]^.idtxt=hs) then
  308. begin
  309. t:=asmmodeinfos[ht]^.id;
  310. set_asmmode_by_string:=true;
  311. end;
  312. end;
  313. procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
  314. begin
  315. with d do
  316. begin
  317. { general update rules:
  318. minimum: if higher then update
  319. maximum: if lower then update or if undefined then update }
  320. if s.procalign>procalign then
  321. procalign:=s.procalign;
  322. if s.loopalign>loopalign then
  323. loopalign:=s.loopalign;
  324. if s.jumpalign>jumpalign then
  325. jumpalign:=s.jumpalign;
  326. if s.constalignmin>constalignmin then
  327. constalignmin:=s.constalignmin;
  328. if (constalignmax=0) or (s.constalignmax<constalignmax) then
  329. constalignmax:=s.constalignmax;
  330. if s.varalignmin>varalignmin then
  331. varalignmin:=s.varalignmin;
  332. if (varalignmax=0) or (s.varalignmax<varalignmax) then
  333. varalignmax:=s.varalignmax;
  334. if s.localalignmin>localalignmin then
  335. localalignmin:=s.localalignmin;
  336. if (localalignmax=0) or (s.localalignmax<localalignmax) then
  337. localalignmax:=s.localalignmax;
  338. if s.paraalign>paraalign then
  339. paraalign:=s.paraalign;
  340. if s.recordalignmin>recordalignmin then
  341. recordalignmin:=s.recordalignmin;
  342. if (recordalignmax=0) or (s.recordalignmax<recordalignmax) then
  343. recordalignmax:=s.recordalignmax;
  344. if (maxCrecordalign=0) or (s.maxCrecordalign<maxCrecordalign) then
  345. maxCrecordalign:=s.maxCrecordalign;
  346. end;
  347. end;
  348. {****************************************************************************
  349. Target registration
  350. ****************************************************************************}
  351. procedure RegisterTarget(const r:ttargetinfo);
  352. var
  353. t : ttarget;
  354. begin
  355. t:=r.target;
  356. if assigned(targetinfos[t]) then
  357. writeln('Warning: Target is already registered!')
  358. else
  359. Getmem(targetinfos[t],sizeof(ttargetinfo));
  360. targetinfos[t]^:=r;
  361. end;
  362. procedure RegisterAsmmode(const r:tasmmodeinfo);
  363. var
  364. t : tasmmode;
  365. begin
  366. t:=r.id;
  367. if assigned(asmmodeinfos[t]) then
  368. writeln('Warning: Asmmode is already registered!')
  369. else
  370. Getmem(asmmodeinfos[t],sizeof(tasmmodeinfo));
  371. asmmodeinfos[t]^:=r;
  372. end;
  373. procedure RegisterRes(const r:tresinfo);
  374. var
  375. t : tres;
  376. begin
  377. t:=r.id;
  378. if assigned(resinfos[t]) then
  379. writeln('Warning: resourcecompiler is already registered!')
  380. else
  381. Getmem(resinfos[t],sizeof(tresinfo));
  382. resinfos[t]^:=r;
  383. end;
  384. procedure RegisterAr(const r:tarinfo);
  385. var
  386. t : tar;
  387. begin
  388. t:=r.id;
  389. if assigned(arinfos[t]) then
  390. writeln('Warning: ar is already registered!')
  391. else
  392. Getmem(arinfos[t],sizeof(tarinfo));
  393. arinfos[t]^:=r;
  394. end;
  395. procedure DeregisterInfos;
  396. var
  397. assem : tasm;
  398. target : ttarget;
  399. ar : tar;
  400. asmmode : tasmmode;
  401. res : tres;
  402. begin
  403. for target:=low(ttarget) to high(ttarget) do
  404. if assigned(targetinfos[target]) then
  405. begin
  406. freemem(targetinfos[target],sizeof(ttargetinfo));
  407. targetinfos[target]:=nil;
  408. end;
  409. for assem:=low(tasm) to high(tasm) do
  410. if assigned(asminfos[assem]) then
  411. begin
  412. freemem(asminfos[assem],sizeof(tasminfo));
  413. asminfos[assem]:=nil;
  414. end;
  415. for ar:=low(tar) to high(tar) do
  416. if assigned(arinfos[ar]) then
  417. begin
  418. freemem(arinfos[ar],sizeof(tarinfo));
  419. arinfos[ar]:=nil;
  420. end;
  421. for res:=low(tres) to high(tres) do
  422. if assigned(resinfos[res]) then
  423. begin
  424. freemem(resinfos[res],sizeof(tresinfo));
  425. resinfos[res]:=nil;
  426. end;
  427. for asmmode:=low(tasmmode) to high(tasmmode) do
  428. if assigned(asmmodeinfos[asmmode]) then
  429. begin
  430. freemem(asmmodeinfos[asmmode],sizeof(tasmmodeinfo));
  431. asmmodeinfos[asmmode]:=nil;
  432. end;
  433. end;
  434. {****************************************************************************
  435. Initialization of default target
  436. ****************************************************************************}
  437. procedure default_target(t:ttarget);
  438. begin
  439. set_target(t);
  440. if source_info.name='' then
  441. source_info:=target_info;
  442. end;
  443. procedure set_source(t:ttarget);
  444. begin
  445. { can't use message() here (PFV) }
  446. if source_info.name<>'' then
  447. Writeln('Warning: Source OS Redefined!');
  448. if assigned(targetinfos[t]) then
  449. source_info:=targetinfos[t]^
  450. else
  451. Writeln('Warning: Source OS Not Supported!');
  452. end;
  453. procedure InitSystems;
  454. begin
  455. { first get source OS }
  456. source_info.name:='';
  457. { please note then we use cpu86 and cpu68 here on purpose !! }
  458. {$ifdef cpu86}
  459. {$ifdef GO32V1}
  460. set_source(target_i386_GO32V1);
  461. {$else}
  462. {$ifdef GO32V2}
  463. set_source(target_i386_GO32V2);
  464. {$else}
  465. {$ifdef OS2}
  466. set_source(target_i386_OS2);
  467. if (target_Mode = osDOS) or (target_Mode = osDPMI) then
  468. source_info.scriptext := '.bat';
  469. { OS/2 via EMX can be run under DOS as well }
  470. {$else}
  471. {$ifdef WIN32}
  472. set_source(target_i386_WIN32);
  473. {$else}
  474. {$Ifdef BSD}
  475. set_source(target_i386_FreeBSD);
  476. {$else}
  477. {$ifdef sunos}
  478. set_source(target_i386_sunos);
  479. {$else}
  480. { Must be the last as some freebsd also
  481. defined linux }
  482. {$ifdef Linux}
  483. set_source(target_i386_LINUX);
  484. {$endif linux}
  485. {$endif sunos}
  486. {$endif bsd}
  487. {$endif win32}
  488. {$endif os2}
  489. {$endif go32v2}
  490. {$endif go32v1}
  491. {$endif cpu86}
  492. {$ifdef cpu68}
  493. {$ifdef AMIGA}
  494. set_source(target_m68k_Amiga);
  495. {$else}
  496. {$ifdef ATARI}
  497. set_source(target_m68k_Atari);
  498. {$else}
  499. {$ifdef MACOS}
  500. set_source(target_m68k_MAC);
  501. {$else}
  502. {$ifdef LINUX}
  503. set_source(target_m68k_linux);
  504. {$endif linux}
  505. {$endif macos}
  506. {$endif atari}
  507. {$endif amiga}
  508. {$endif cpu68}
  509. { Now default target !! }
  510. {$ifdef i386}
  511. {$ifdef GO32V1}
  512. default_target(target_i386_GO32V1);
  513. {$else}
  514. {$ifdef GO32V2}
  515. default_target(target_i386_GO32V2);
  516. {$else}
  517. {$ifdef OS2}
  518. default_target(target_i386_OS2);
  519. {$else}
  520. {$ifdef unix}
  521. {$ifdef BSD}
  522. default_target(target_i386_FreeBSD);
  523. {$else}
  524. default_target(target_i386_LINUX);
  525. {$endif}
  526. {$else}
  527. {$ifdef WIN32}
  528. default_target(target_i386_WIN32);
  529. {$else}
  530. default_target(target_i386_GO32V2);
  531. {$endif win32}
  532. {$endif linux}
  533. {$endif os2}
  534. {$endif go32v2}
  535. {$endif go32v1}
  536. {$endif i386}
  537. {$ifdef m68k}
  538. {$ifdef AMIGA}
  539. default_target(target_m68k_Amiga);
  540. {$else}
  541. {$ifdef ATARI}
  542. default_target(target_m68k_Atari);
  543. {$else}
  544. {$ifdef MACOS}
  545. default_target(target_m68k_Mac);
  546. {$else}
  547. {$ifdef LINUX}
  548. default_target(target_m68k_linux);
  549. {$else}
  550. default_target(target_m68k_Amiga);
  551. {$endif linux}
  552. {$endif macos}
  553. {$endif atari}
  554. {$endif amiga}
  555. {$endif m68k}
  556. {$ifdef alpha}
  557. default_target(target_alpha_linux);
  558. {$endif alpha}
  559. {$ifdef powerpc}
  560. default_target(target_powerpc_linux);
  561. {$endif powerpc}
  562. end;
  563. initialization
  564. finalization
  565. DeregisterInfos;
  566. end.
  567. {
  568. $Log$
  569. Revision 1.25 2001-08-30 20:57:10 peter
  570. * asbsd merged
  571. Revision 1.24 2001/08/19 11:22:24 peter
  572. * palmos support from v10 merged
  573. Revision 1.23 2001/08/12 17:57:07 peter
  574. * under development flag for targets
  575. Revision 1.22 2001/08/07 18:47:13 peter
  576. * merged netbsd start
  577. * profile for win32
  578. Revision 1.21 2001/07/01 20:16:18 peter
  579. * alignmentinfo record added
  580. * -Oa argument supports more alignment settings that can be specified
  581. per type: PROC,LOOP,VARMIN,VARMAX,CONSTMIN,CONSTMAX,RECORDMIN
  582. RECORDMAX,LOCALMIN,LOCALMAX. It is possible to set the mimimum
  583. required alignment and the maximum usefull alignment. The final
  584. alignment will be choosen per variable size dependent on these
  585. settings
  586. Revision 1.20 2001/06/19 14:43:31 marco
  587. * Fixed ifdef linux bug
  588. Revision 1.19 2001/06/03 20:21:08 peter
  589. * Kylix fixes, mostly case names of units
  590. Revision 1.18 2001/06/03 15:15:31 peter
  591. * dllprt0 stub for linux shared libs
  592. * pass -init and -fini for linux shared libs
  593. * libprefix splitted into staticlibprefix and sharedlibprefix
  594. Revision 1.17 2001/06/02 19:21:45 peter
  595. * extradefines field added to target_info, so that targets don't
  596. need to put code in options.pas for it
  597. Revision 1.16 2001/04/18 22:02:00 peter
  598. * registration of targets and assemblers
  599. Revision 1.15 2001/03/06 18:28:02 peter
  600. * patch from Pavel with a new and much faster DLL Scanner for
  601. automatic importing so $linklib works for DLLs. Thanks Pavel!
  602. Revision 1.14 2001/02/26 19:44:55 peter
  603. * merged generic m68k updates from fixes branch
  604. Revision 1.13 2001/02/20 21:36:40 peter
  605. * tasm/masm fixes merged
  606. Revision 1.12 2001/01/06 20:15:43 peter
  607. * merged libp library prefix
  608. Revision 1.11 2000/10/15 09:08:58 peter
  609. * use System for the systemunit instead of target dependent
  610. Revision 1.10 2000/09/24 21:12:41 hajny
  611. * OS/2 stack alignment corrected + default stack increased
  612. Revision 1.9 2000/09/24 15:06:30 peter
  613. * use defines.inc
  614. Revision 1.8 2000/09/20 10:49:39 marco
  615. * Set writer to elf. (Only a prob for smart with -OG3p3r)
  616. Revision 1.7 2000/09/16 12:22:52 peter
  617. * freebsd support merged
  618. Revision 1.6 2000/09/11 17:00:23 florian
  619. + first implementation of Netware Module support, thanks to
  620. Armin Diehl ([email protected]) for providing the patches
  621. Revision 1.5 2000/08/12 19:14:59 peter
  622. * ELF writer works now also with -g
  623. * ELF writer is default again for linux
  624. Revision 1.4 2000/07/14 21:29:38 michael
  625. * Back to external assembler till peter fixes gdb
  626. Revision 1.3 2000/07/13 12:08:28 michael
  627. + patched to 1.1.0 with former 1.09patch from peter
  628. Revision 1.2 2000/07/13 11:32:50 michael
  629. + removed logs
  630. }