t_linux.pas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Peter Vreman
  4. This unit implements support import,export,link routines
  5. for the (i386) Linux target
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 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 t_linux;
  20. {$i fpcdefs.inc}
  21. interface
  22. uses
  23. symsym,
  24. import,export,link;
  25. type
  26. timportliblinux=class(timportlib)
  27. procedure preparelib(const s:string);override;
  28. procedure importprocedure(const func,module:string;index:longint;const name:string);override;
  29. procedure importvariable(vs:tvarsym;const name,module:string);override;
  30. procedure generatelib;override;
  31. end;
  32. texportliblinux=class(texportlib)
  33. procedure preparelib(const s : string);override;
  34. procedure exportprocedure(hp : texported_item);override;
  35. procedure exportvar(hp : texported_item);override;
  36. procedure generatelib;override;
  37. end;
  38. tlinkerlinux=class(texternallinker)
  39. private
  40. Glibc2,
  41. Glibc21 : boolean;
  42. Function WriteResponseFile(isdll:boolean) : Boolean;
  43. public
  44. constructor Create;override;
  45. procedure SetDefaultInfo;override;
  46. function MakeExecutable:boolean;override;
  47. function MakeSharedLibrary:boolean;override;
  48. end;
  49. implementation
  50. uses
  51. cutils,cclasses,
  52. verbose,systems,globtype,globals,
  53. symconst,script,
  54. fmodule,dos
  55. {$ifdef i386}
  56. ,aasmbase,aasmtai,aasmcpu,cpubase
  57. {$endif i386}
  58. ,i_linux
  59. ;
  60. {*****************************************************************************
  61. TIMPORTLIBLINUX
  62. *****************************************************************************}
  63. procedure timportliblinux.preparelib(const s : string);
  64. begin
  65. end;
  66. procedure timportliblinux.importprocedure(const func,module : string;index : longint;const name : string);
  67. begin
  68. { insert sharedlibrary }
  69. current_module.linkothersharedlibs.add(SplitName(module),link_allways);
  70. { do nothing with the procedure, only set the mangledname }
  71. if name<>'' then
  72. begin
  73. aktprocdef.setmangledname(name);
  74. end
  75. else
  76. message(parser_e_empty_import_name);
  77. end;
  78. procedure timportliblinux.importvariable(vs:tvarsym;const name,module:string);
  79. begin
  80. { insert sharedlibrary }
  81. current_module.linkothersharedlibs.add(SplitName(module),link_allways);
  82. { reset the mangledname and turn off the dll_var option }
  83. vs.set_mangledname(name);
  84. exclude(vs.varoptions,vo_is_dll_var);
  85. end;
  86. procedure timportliblinux.generatelib;
  87. begin
  88. end;
  89. {*****************************************************************************
  90. TEXPORTLIBLINUX
  91. *****************************************************************************}
  92. procedure texportliblinux.preparelib(const s:string);
  93. begin
  94. end;
  95. procedure texportliblinux.exportprocedure(hp : texported_item);
  96. var
  97. hp2 : texported_item;
  98. begin
  99. { first test the index value }
  100. if (hp.options and eo_index)<>0 then
  101. begin
  102. Message1(parser_e_no_export_with_index_for_target,'linux');
  103. exit;
  104. end;
  105. { now place in correct order }
  106. hp2:=texported_item(current_module._exports.first);
  107. while assigned(hp2) and
  108. (hp.name^>hp2.name^) do
  109. hp2:=texported_item(hp2.next);
  110. { insert hp there !! }
  111. if assigned(hp2) and (hp2.name^=hp.name^) then
  112. begin
  113. { this is not allowed !! }
  114. Message1(parser_e_export_name_double,hp.name^);
  115. exit;
  116. end;
  117. if hp2=texported_item(current_module._exports.first) then
  118. current_module._exports.concat(hp)
  119. else if assigned(hp2) then
  120. begin
  121. hp.next:=hp2;
  122. hp.previous:=hp2.previous;
  123. if assigned(hp2.previous) then
  124. hp2.previous.next:=hp;
  125. hp2.previous:=hp;
  126. end
  127. else
  128. current_module._exports.concat(hp);
  129. end;
  130. procedure texportliblinux.exportvar(hp : texported_item);
  131. begin
  132. hp.is_var:=true;
  133. exportprocedure(hp);
  134. end;
  135. procedure texportliblinux.generatelib;
  136. var
  137. hp2 : texported_item;
  138. begin
  139. hp2:=texported_item(current_module._exports.first);
  140. while assigned(hp2) do
  141. begin
  142. if (not hp2.is_var) and
  143. (hp2.sym.typ=procsym) then
  144. begin
  145. { the manglednames can already be the same when the procedure
  146. is declared with cdecl }
  147. if tprocsym(hp2.sym).first_procdef.mangledname<>hp2.name^ then
  148. begin
  149. {$ifdef i386}
  150. { place jump in codesegment }
  151. codesegment.concat(Tai_align.Create_op(4,$90));
  152. codeSegment.concat(Tai_symbol.Createname_global(hp2.name^,0));
  153. codeSegment.concat(Taicpu.Op_sym(A_JMP,S_NO,objectlibrary.newasmsymbol(tprocsym(hp2.sym).first_procdef.mangledname)));
  154. codeSegment.concat(Tai_symbol_end.Createname(hp2.name^));
  155. {$endif i386}
  156. end;
  157. end
  158. else
  159. Message1(parser_e_no_export_of_variables_for_target,'linux');
  160. hp2:=texported_item(hp2.next);
  161. end;
  162. end;
  163. {*****************************************************************************
  164. TLINKERLINUX
  165. *****************************************************************************}
  166. Constructor TLinkerLinux.Create;
  167. begin
  168. Inherited Create;
  169. LibrarySearchPath.AddPath('/lib;/usr/lib;/usr/X11R6/lib',true);
  170. end;
  171. procedure TLinkerLinux.SetDefaultInfo;
  172. {
  173. This will also detect which libc version will be used
  174. }
  175. {$ifdef m68k}
  176. var
  177. St : SearchRec;
  178. {$endif m68k}
  179. begin
  180. Glibc2:=false;
  181. Glibc21:=false;
  182. with Info do
  183. begin
  184. ExeCmd[1]:='ld $OPT $DYNLINK $STATIC $STRIP -L. -o $EXE $RES';
  185. DllCmd[1]:='ld $OPT $INIT $FINI $SONAME -shared -L. -o $EXE $RES';
  186. DllCmd[2]:='strip --strip-unneeded $EXE';
  187. {$ifdef m68k}
  188. Glibc2:=true;
  189. FindFirst('/lib/ld*',AnyFile,st);
  190. while DosError=0 do
  191. begin
  192. if copy(st.name,1,5)='ld-2.' then
  193. begin
  194. DynamicLinker:='/lib/'+St.name;
  195. Glibc21:=st.name[6]<>'0';
  196. break;
  197. end;
  198. FindNext(St);
  199. end;
  200. FindClose(St);
  201. {$else m68k}
  202. { first try glibc2 }
  203. DynamicLinker:='/lib/ld-linux.so.2';
  204. if FileExists(DynamicLinker) then
  205. begin
  206. Glibc2:=true;
  207. { Check for 2.0 files, else use the glibc 2.1 stub }
  208. if FileExists('/lib/ld-2.0.*') then
  209. Glibc21:=false
  210. else
  211. Glibc21:=true;
  212. end
  213. else
  214. DynamicLinker:='/lib/ld-linux.so.1';
  215. {$endif m68k}
  216. end;
  217. end;
  218. Function TLinkerLinux.WriteResponseFile(isdll:boolean) : Boolean;
  219. Var
  220. linkres : TLinkRes;
  221. i : longint;
  222. cprtobj,
  223. gprtobj,
  224. prtobj : string[80];
  225. HPath : TStringListItem;
  226. s,s1,s2 : string;
  227. found1,
  228. found2,
  229. linkdynamic,
  230. linklibc : boolean;
  231. begin
  232. WriteResponseFile:=False;
  233. { set special options for some targets }
  234. linkdynamic:=not(SharedLibFiles.empty);
  235. linklibc:=(SharedLibFiles.Find('c')<>nil);
  236. if isdll then
  237. begin
  238. prtobj:='dllprt0';
  239. cprtobj:='dllprt0';
  240. gprtobj:='dllprt0';
  241. end
  242. else
  243. begin
  244. prtobj:='prt0';
  245. cprtobj:='cprt0';
  246. gprtobj:='gprt0';
  247. if glibc21 then
  248. begin
  249. cprtobj:='cprt21';
  250. gprtobj:='gprt21';
  251. end;
  252. end;
  253. if cs_profile in aktmoduleswitches then
  254. begin
  255. prtobj:=gprtobj;
  256. if not glibc2 then
  257. AddSharedLibrary('gmon');
  258. AddSharedLibrary('c');
  259. linklibc:=true;
  260. end
  261. else
  262. begin
  263. if linklibc then
  264. prtobj:=cprtobj;
  265. end;
  266. { Open link.res file }
  267. LinkRes:=TLinkRes.Create(outputexedir+Info.ResName);
  268. { Write path to search libraries }
  269. HPath:=TStringListItem(current_module.locallibrarysearchpath.First);
  270. while assigned(HPath) do
  271. begin
  272. LinkRes.Add('SEARCH_DIR('+HPath.Str+')');
  273. HPath:=TStringListItem(HPath.Next);
  274. end;
  275. HPath:=TStringListItem(LibrarySearchPath.First);
  276. while assigned(HPath) do
  277. begin
  278. LinkRes.Add('SEARCH_DIR('+HPath.Str+')');
  279. HPath:=TStringListItem(HPath.Next);
  280. end;
  281. LinkRes.Add('INPUT(');
  282. { add objectfiles, start with prt0 always }
  283. if prtobj<>'' then
  284. LinkRes.AddFileName(FindObjectFile(prtobj,''));
  285. { try to add crti and crtbegin if linking to C }
  286. if linklibc then
  287. begin
  288. if librarysearchpath.FindFile('crtbegin.o',s) then
  289. LinkRes.AddFileName(s);
  290. if librarysearchpath.FindFile('crti.o',s) then
  291. LinkRes.AddFileName(s);
  292. end;
  293. { main objectfiles }
  294. while not ObjectFiles.Empty do
  295. begin
  296. s:=ObjectFiles.GetFirst;
  297. if s<>'' then
  298. LinkRes.AddFileName(s);
  299. end;
  300. LinkRes.Add(')');
  301. { Write staticlibraries }
  302. if not StaticLibFiles.Empty then
  303. begin
  304. LinkRes.Add('GROUP(');
  305. While not StaticLibFiles.Empty do
  306. begin
  307. S:=StaticLibFiles.GetFirst;
  308. LinkRes.AddFileName(s)
  309. end;
  310. LinkRes.Add(')');
  311. end;
  312. { Write sharedlibraries like -l<lib>, also add the needed dynamic linker
  313. here to be sure that it gets linked this is needed for glibc2 systems (PFV) }
  314. if not SharedLibFiles.Empty then
  315. begin
  316. LinkRes.Add('INPUT(');
  317. While not SharedLibFiles.Empty do
  318. begin
  319. S:=SharedLibFiles.GetFirst;
  320. if s<>'c' then
  321. begin
  322. i:=Pos(target_info.sharedlibext,S);
  323. if i>0 then
  324. Delete(S,i,255);
  325. LinkRes.Add('-l'+s);
  326. end
  327. else
  328. begin
  329. linklibc:=true;
  330. linkdynamic:=false; { libc will include the ld-linux for us }
  331. end;
  332. end;
  333. { be sure that libc is the last lib }
  334. if linklibc then
  335. LinkRes.Add('-lc');
  336. { when we have -static for the linker the we also need libgcc }
  337. if (cs_link_staticflag in aktglobalswitches) then
  338. LinkRes.Add('-lgcc');
  339. if linkdynamic and (Info.DynamicLinker<>'') then
  340. LinkRes.AddFileName(Info.DynamicLinker);
  341. LinkRes.Add(')');
  342. end;
  343. { objects which must be at the end }
  344. if linklibc then
  345. begin
  346. found1:=librarysearchpath.FindFile('crtend.o',s1);
  347. found2:=librarysearchpath.FindFile('crtn.o',s2);
  348. if found1 or found2 then
  349. begin
  350. LinkRes.Add('INPUT(');
  351. if found1 then
  352. LinkRes.AddFileName(s1);
  353. if found2 then
  354. LinkRes.AddFileName(s2);
  355. LinkRes.Add(')');
  356. end;
  357. end;
  358. { Write and Close response }
  359. linkres.writetodisk;
  360. linkres.Free;
  361. WriteResponseFile:=True;
  362. end;
  363. function TLinkerLinux.MakeExecutable:boolean;
  364. var
  365. binstr,
  366. cmdstr : string;
  367. success : boolean;
  368. DynLinkStr : string[60];
  369. StaticStr,
  370. StripStr : string[40];
  371. begin
  372. if not(cs_link_extern in aktglobalswitches) then
  373. Message1(exec_i_linking,current_module.exefilename^);
  374. { Create some replacements }
  375. StaticStr:='';
  376. StripStr:='';
  377. DynLinkStr:='';
  378. if (cs_link_staticflag in aktglobalswitches) then
  379. StaticStr:='-static';
  380. if (cs_link_strip in aktglobalswitches) then
  381. StripStr:='-s';
  382. If (cs_profile in aktmoduleswitches) or
  383. ((Info.DynamicLinker<>'') and (not SharedLibFiles.Empty)) then
  384. DynLinkStr:='-dynamic-linker='+Info.DynamicLinker;
  385. { Write used files and libraries }
  386. WriteResponseFile(false);
  387. { Call linker }
  388. SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr);
  389. Replace(cmdstr,'$EXE',current_module.exefilename^);
  390. Replace(cmdstr,'$OPT',Info.ExtraOptions);
  391. Replace(cmdstr,'$RES',outputexedir+Info.ResName);
  392. Replace(cmdstr,'$STATIC',StaticStr);
  393. Replace(cmdstr,'$STRIP',StripStr);
  394. Replace(cmdstr,'$DYNLINK',DynLinkStr);
  395. success:=DoExec(FindUtil(BinStr),CmdStr,true,false);
  396. { Remove ReponseFile }
  397. if (success) and not(cs_link_extern in aktglobalswitches) then
  398. RemoveFile(outputexedir+Info.ResName);
  399. MakeExecutable:=success; { otherwise a recursive call to link method }
  400. end;
  401. Function TLinkerLinux.MakeSharedLibrary:boolean;
  402. var
  403. InitStr,
  404. FiniStr,
  405. SoNameStr : string[80];
  406. binstr,
  407. cmdstr : string;
  408. success : boolean;
  409. begin
  410. MakeSharedLibrary:=false;
  411. if not(cs_link_extern in aktglobalswitches) then
  412. Message1(exec_i_linking,current_module.sharedlibfilename^);
  413. { Write used files and libraries }
  414. WriteResponseFile(true);
  415. { Create some replacements }
  416. InitStr:='-init FPC_LIB_START';
  417. FiniStr:='-fini FPC_LIB_EXIT';
  418. SoNameStr:='-soname '+SplitFileName(current_module.sharedlibfilename^);
  419. { Call linker }
  420. SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
  421. Replace(cmdstr,'$EXE',current_module.sharedlibfilename^);
  422. Replace(cmdstr,'$OPT',Info.ExtraOptions);
  423. Replace(cmdstr,'$RES',outputexedir+Info.ResName);
  424. Replace(cmdstr,'$INIT',InitStr);
  425. Replace(cmdstr,'$FINI',FiniStr);
  426. Replace(cmdstr,'$SONAME',SoNameStr);
  427. success:=DoExec(FindUtil(binstr),cmdstr,true,false);
  428. { Strip the library ? }
  429. if success and (cs_link_strip in aktglobalswitches) then
  430. begin
  431. SplitBinCmd(Info.DllCmd[2],binstr,cmdstr);
  432. Replace(cmdstr,'$EXE',current_module.sharedlibfilename^);
  433. success:=DoExec(FindUtil(binstr),cmdstr,true,false);
  434. end;
  435. { Remove ReponseFile }
  436. if (success) and not(cs_link_extern in aktglobalswitches) then
  437. RemoveFile(outputexedir+Info.ResName);
  438. MakeSharedLibrary:=success; { otherwise a recursive call to link method }
  439. end;
  440. {*****************************************************************************
  441. Initialize
  442. *****************************************************************************}
  443. initialization
  444. {$ifdef i386}
  445. RegisterExternalLinker(system_i386_linux_info,TLinkerLinux);
  446. RegisterImport(system_i386_linux,timportliblinux);
  447. RegisterExport(system_i386_linux,texportliblinux);
  448. RegisterTarget(system_i386_linux_info);
  449. {$endif i386}
  450. {$ifdef m68k}
  451. RegisterExternalLinker(system_m68k_linux_info,TLinkerLinux);
  452. RegisterImport(system_m68k_linux,timportliblinux);
  453. RegisterExport(system_m68k_linux,texportliblinux);
  454. RegisterTarget(system_m68k_linux_info);
  455. {$endif m68k}
  456. {$ifdef powerpc}
  457. RegisterExternalLinker(system_powerpc_linux_info,TLinkerLinux);
  458. RegisterImport(system_powerpc_linux,timportliblinux);
  459. RegisterExport(system_powerpc_linux,texportliblinux);
  460. RegisterTarget(system_powerpc_linux_info);
  461. {$endif powerpc}
  462. {$ifdef alpha}
  463. RegisterExternalLinker(system_alpha_linux_info,TLinkerLinux);
  464. RegisterImport(system_alpha_linux,timportliblinux);
  465. RegisterExport(system_alpha_linux,texportliblinux);
  466. RegisterTarget(system_alpha_linux_info);
  467. {$endif alpha}
  468. {$ifdef x86_64}
  469. RegisterExternalLinker(system_x86_64_linux_info,TLinkerLinux);
  470. RegisterImport(system_x86_64_linux,timportliblinux);
  471. RegisterExport(system_x86_64_linux,texportliblinux);
  472. RegisterTarget(system_x86_64_linux_info);
  473. {$endif x86_64}
  474. {$ifdef SPARC}
  475. RegisterExternalLinker(system_sparc_linux_info,TLinkerLinux);
  476. RegisterImport(system_SPARC_linux,timportliblinux);
  477. RegisterExport(system_SPARC_linux,texportliblinux);
  478. RegisterTarget(system_SPARC_linux_info);
  479. {$endif SPARC}
  480. end.
  481. {
  482. $Log$
  483. Revision 1.4 2002-11-17 16:32:04 carl
  484. * memory optimization (3-4%) : cleanup of tai fields,
  485. cleanup of tdef and tsym fields.
  486. * make it work for m68k
  487. Revision 1.3 2002/11/15 01:59:02 peter
  488. * merged changes from 1.0.7 up to 04-11
  489. - -V option for generating bug report tracing
  490. - more tracing for option parsing
  491. - errors for cdecl and high()
  492. - win32 import stabs
  493. - win32 records<=8 are returned in eax:edx (turned off by default)
  494. - heaptrc update
  495. - more info for temp management in .s file with EXTDEBUG
  496. Revision 1.2 2002/09/09 17:34:17 peter
  497. * tdicationary.replace added to replace and item in a dictionary. This
  498. is only allowed for the same name
  499. * varsyms are inserted in symtable before the types are parsed. This
  500. fixes the long standing "var longint : longint" bug
  501. - consume_idlist and idstringlist removed. The loops are inserted
  502. at the callers place and uses the symtable for duplicate id checking
  503. Revision 1.1 2002/09/06 15:03:51 carl
  504. * moved files to systems directory
  505. Revision 1.33 2002/09/03 16:26:28 daniel
  506. * Make Tprocdef.defs protected
  507. Revision 1.32 2002/08/12 15:08:44 carl
  508. + stab register indexes for powerpc (moved from gdb to cpubase)
  509. + tprocessor enumeration moved to cpuinfo
  510. + linker in target_info is now a class
  511. * many many updates for m68k (will soon start to compile)
  512. - removed some ifdef or correct them for correct cpu
  513. Revision 1.31 2002/08/11 14:32:32 peter
  514. * renamed current_library to objectlibrary
  515. Revision 1.30 2002/08/11 13:24:19 peter
  516. * saving of asmsymbols in ppu supported
  517. * asmsymbollist global is removed and moved into a new class
  518. tasmlibrarydata that will hold the info of a .a file which
  519. corresponds with a single module. Added librarydata to tmodule
  520. to keep the library info stored for the module. In the future the
  521. objectfiles will also be stored to the tasmlibrarydata class
  522. * all getlabel/newasmsymbol and friends are moved to the new class
  523. Revision 1.29 2002/07/26 21:15:46 florian
  524. * rewrote the system handling
  525. Revision 1.28 2002/07/04 20:43:02 florian
  526. * first x86-64 patches
  527. Revision 1.27 2002/07/01 18:46:35 peter
  528. * internal linker
  529. * reorganized aasm layer
  530. Revision 1.26 2002/05/18 13:34:26 peter
  531. * readded missing revisions
  532. Revision 1.25 2002/05/16 19:46:53 carl
  533. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  534. + try to fix temp allocation (still in ifdef)
  535. + generic constructor calls
  536. + start of tassembler / tmodulebase class cleanup
  537. Revision 1.22 2002/05/06 19:46:36 carl
  538. + added more patches from Mazen for SPARC port
  539. Revision 1.21 2002/04/22 18:19:22 carl
  540. - remove use_bound_instruction field
  541. Revision 1.20 2002/04/20 21:43:18 carl
  542. * fix stack size for some targets
  543. + add offset to parameters from frame pointer info.
  544. - remove some unused stuff
  545. Revision 1.19 2002/04/19 15:46:05 peter
  546. * mangledname rewrite, tprocdef.mangledname is now created dynamicly
  547. in most cases and not written to the ppu
  548. * add mangeledname_prefix() routine to generate the prefix of
  549. manglednames depending on the current procedure, object and module
  550. * removed static procprefix since the mangledname is now build only
  551. on demand from tprocdef.mangledname
  552. Revision 1.18 2002/04/15 19:44:23 peter
  553. * fixed stackcheck that would be called recursively when a stack
  554. error was found
  555. * generic changeregsize(reg,size) for i386 register resizing
  556. * removed some more routines from cga unit
  557. * fixed returnvalue handling
  558. * fixed default stacksize of linux and go32v2, 8kb was a bit small :-)
  559. Revision 1.17 2002/04/15 19:16:57 carl
  560. - remove size_of_pointer field
  561. Revision 1.16 2002/01/29 21:27:34 peter
  562. * default alignment changed to 4 bytes for locals and static const,var
  563. Revision 1.15 2002/01/09 07:38:37 michael
  564. + Patch from Peter for library imports
  565. }