systems.pas 19 KB

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