t_bsd.pas 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Peter Vreman (original Linux)
  4. (c) 2000 by Marco van de Voort (FreeBSD mods)
  5. This unit implements support import,export,link routines
  6. for the (i386)FreeBSD target
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or
  10. (at your option) any later version.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU General Public License for more details.
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. ****************************************************************************
  19. }
  20. unit t_bsd;
  21. {$i fpcdefs.inc}
  22. interface
  23. implementation
  24. uses
  25. {$ifdef gdb}
  26. gdb,
  27. {$endif gdb}
  28. cutils,cclasses,
  29. verbose,systems,globtype,globals,
  30. symconst,script,
  31. fmodule,aasmbase,aasmtai,aasmcpu,cpubase,symsym,symdef,
  32. import,export,link,i_bsd,
  33. cgutils,cgbase,cgobj,cpuinfo;
  34. type
  35. tdarwinimported_item = class(timported_item)
  36. procdef : tprocdef;
  37. end;
  38. timportlibdarwin=class(timportlib)
  39. procedure preparelib(const s:string);override;
  40. procedure importprocedure(aprocdef:tprocdef;const module:string;index:longint;const name:string);override;
  41. procedure importvariable(vs:tglobalvarsym;const name,module:string);override;
  42. procedure generatelib;override;
  43. procedure generatesmartlib;override;
  44. end;
  45. timportlibbsd=class(timportlib)
  46. procedure preparelib(const s:string);override;
  47. procedure importprocedure(aprocdef:tprocdef;const module:string;index:longint;const name:string);override;
  48. procedure importvariable(vs:tglobalvarsym;const name,module:string);override;
  49. procedure generatelib;override;
  50. end;
  51. texportlibbsd=class(texportlib)
  52. procedure preparelib(const s : string);override;
  53. procedure exportprocedure(hp : texported_item);override;
  54. procedure exportvar(hp : texported_item);override;
  55. procedure generatelib;override;
  56. end;
  57. tlinkerbsd=class(texternallinker)
  58. private
  59. LdSupportsNoResponseFile : boolean;
  60. LibrarySuffix : Char;
  61. Function WriteResponseFile(isdll:boolean) : Boolean;
  62. public
  63. constructor Create;override;
  64. procedure SetDefaultInfo;override;
  65. function MakeExecutable:boolean;override;
  66. function MakeSharedLibrary:boolean;override;
  67. end;
  68. {*****************************************************************************
  69. TIMPORTLIBDARWIN
  70. *****************************************************************************}
  71. procedure timportlibdarwin.preparelib(const s : string);
  72. begin
  73. if not(assigned(importssection)) then
  74. importssection:=TAAsmoutput.create;
  75. end;
  76. procedure timportlibdarwin.importprocedure(aprocdef:tprocdef;const module : string;index : longint;const name : string);
  77. begin
  78. { insert sharedlibrary }
  79. { current_module.linkothersharedlibs.add(SplitName(module),link_allways); }
  80. { force the mangledname }
  81. if assigned(aprocdef) then
  82. begin
  83. if (aprocdef.proccalloption in [pocall_cdecl,pocall_cppdecl]) then
  84. aprocdef.setmangledname(target_info.Cprefix+name)
  85. else
  86. aprocdef.setmangledname(name);
  87. end;
  88. end;
  89. procedure timportlibdarwin.importvariable(vs:tglobalvarsym;const name,module:string);
  90. begin
  91. { insert sharedlibrary }
  92. { current_module.linkothersharedlibs.add(SplitName(module),link_allways); }
  93. { the rest is handled in the nppcld.pas tppcloadnode }
  94. vs.set_mangledname(name);
  95. end;
  96. procedure timportlibdarwin.generatesmartlib;
  97. begin
  98. generatelib;
  99. end;
  100. procedure timportlibdarwin.generatelib;
  101. begin
  102. end;
  103. {*****************************************************************************
  104. TIMPORTLIBBSD
  105. *****************************************************************************}
  106. procedure timportlibbsd.preparelib(const s : string);
  107. begin
  108. end;
  109. procedure timportlibbsd.importprocedure(aprocdef:tprocdef;const module:string;index:longint;const name:string);
  110. begin
  111. { insert sharedlibrary }
  112. current_module.linkothersharedlibs.add(SplitName(module),link_allways);
  113. { do nothing with the procedure, only set the mangledname }
  114. { if name<>'' then
  115. begin
  116. aprocdef.setmangledname(name);
  117. end
  118. else
  119. message(parser_e_empty_import_name);
  120. }
  121. end;
  122. procedure timportlibbsd.importvariable(vs:tglobalvarsym;const name,module:string);
  123. begin
  124. { insert sharedlibrary }
  125. current_module.linkothersharedlibs.add(SplitName(module),link_allways);
  126. { reset the mangledname and turn off the dll_var option }
  127. vs.set_mangledname(name);
  128. exclude(vs.varoptions,vo_is_dll_var);
  129. end;
  130. procedure timportlibbsd.generatelib;
  131. begin
  132. end;
  133. {*****************************************************************************
  134. TEXPORTLIBBSD
  135. *****************************************************************************}
  136. procedure texportlibbsd.preparelib(const s:string);
  137. begin
  138. end;
  139. procedure texportlibbsd.exportprocedure(hp : texported_item);
  140. var
  141. hp2 : texported_item;
  142. begin
  143. { first test the index value }
  144. if (hp.options and eo_index)<>0 then
  145. begin
  146. Message1(parser_e_no_export_with_index_for_target,'freebsd');
  147. exit;
  148. end;
  149. { now place in correct order }
  150. hp2:=texported_item(current_module._exports.first);
  151. while assigned(hp2) and
  152. (hp.name^>hp2.name^) do
  153. hp2:=texported_item(hp2.next);
  154. { insert hp there !! }
  155. if assigned(hp2) and (hp2.name^=hp.name^) then
  156. begin
  157. { this is not allowed !! }
  158. Message1(parser_e_export_name_double,hp.name^);
  159. exit;
  160. end;
  161. if hp2=texported_item(current_module._exports.first) then
  162. current_module._exports.concat(hp)
  163. else if assigned(hp2) then
  164. begin
  165. hp.next:=hp2;
  166. hp.previous:=hp2.previous;
  167. if assigned(hp2.previous) then
  168. hp2.previous.next:=hp;
  169. hp2.previous:=hp;
  170. end
  171. else
  172. current_module._exports.concat(hp);
  173. end;
  174. procedure texportlibbsd.exportvar(hp : texported_item);
  175. begin
  176. hp.is_var:=true;
  177. exportprocedure(hp);
  178. end;
  179. procedure texportlibbsd.generatelib;
  180. var
  181. hp2 : texported_item;
  182. begin
  183. hp2:=texported_item(current_module._exports.first);
  184. while assigned(hp2) do
  185. begin
  186. if (not hp2.is_var) and
  187. (hp2.sym.typ=procsym) then
  188. begin
  189. { the manglednames can already be the same when the procedure
  190. is declared with cdecl }
  191. if tprocsym(hp2.sym).first_procdef.mangledname<>hp2.name^ then
  192. begin
  193. {$ifdef i386}
  194. { place jump in codesegment }
  195. codesegment.concat(Tai_align.Create_op(4,$90));
  196. codeSegment.concat(Tai_symbol.Createname_global(hp2.name^,AT_FUNCTION,0));
  197. codeSegment.concat(Taicpu.Op_sym(A_JMP,S_NO,objectlibrary.newasmsymbol(tprocsym(hp2.sym).first_procdef.mangledname,AB_EXTERNAL,AT_FUNCTION)));
  198. codeSegment.concat(Tai_symbol_end.Createname(hp2.name^));
  199. {$endif i386}
  200. end;
  201. end
  202. else
  203. Message1(parser_e_no_export_of_variables_for_target,'freebsd');
  204. hp2:=texported_item(hp2.next);
  205. end;
  206. end;
  207. {*****************************************************************************
  208. TLINKERLINUX
  209. *****************************************************************************}
  210. Constructor TLinkerBSD.Create;
  211. begin
  212. Inherited Create;
  213. if not Dontlinkstdlibpath Then
  214. if (target_info.system <> system_powerpc_darwin) then
  215. LibrarySearchPath.AddPath('/lib;/usr/lib;/usr/X11R6/lib',true)
  216. else
  217. { Mac OS X doesn't have a /lib }
  218. LibrarySearchPath.AddPath('/usr/lib',true)
  219. end;
  220. procedure TLinkerBSD.SetDefaultInfo;
  221. {
  222. This will also detect which libc version will be used
  223. }
  224. begin
  225. LibrarySuffix:=' ';
  226. LdSupportsNoResponseFile := (target_info.system in [system_m68k_netbsd,system_powerpc_darwin]);
  227. with Info do
  228. begin
  229. if LdSupportsNoResponseFile then
  230. begin
  231. ExeCmd[1]:='ld $OPT $DYNLINK $STATIC $STRIP -L. -o $EXE `cat $RES`';
  232. end
  233. else
  234. ExeCmd[1]:='ld $OPT $DYNLINK $STATIC $STRIP -L. -o $EXE $RES';
  235. DllCmd[1]:='ld $OPT -shared -L. -o $EXE $RES';
  236. DllCmd[2]:='strip --strip-unneeded $EXE';
  237. { first try glibc2 }
  238. {$ifdef GLIBC2} {Keep linux code in place. FBSD might go to a different
  239. glibc too once}
  240. DynamicLinker:='/lib/ld-linux.so.2';
  241. if FileExists(DynamicLinker) then
  242. begin
  243. Glibc2:=true;
  244. { Check for 2.0 files, else use the glibc 2.1 stub }
  245. if FileExists('/lib/ld-2.0.*') then
  246. Glibc21:=false
  247. else
  248. Glibc21:=true;
  249. end
  250. else
  251. DynamicLinker:='/lib/ld-linux.so.1';
  252. {$else}
  253. DynamicLinker:='';
  254. {$endif}
  255. end;
  256. end;
  257. Function TLinkerBSD.WriteResponseFile(isdll:boolean) : Boolean;
  258. Var
  259. linkres : TLinkRes;
  260. i : longint;
  261. cprtobj,
  262. gprtobj,
  263. prtobj : string[80];
  264. HPath : TStringListItem;
  265. s,s1,s2 : string;
  266. linkpthread,
  267. linkdynamic,
  268. linklibc : boolean;
  269. Fl1,Fl2 : Boolean;
  270. begin
  271. WriteResponseFile:=False;
  272. { set special options for some targets }
  273. if target_info.system <> system_powerpc_darwin then
  274. begin
  275. linkdynamic:=not(SharedLibFiles.empty);
  276. linklibc:=(SharedLibFiles.Find('c')<>nil);
  277. linkpthread:=(SharedLibFiles.Find('pthread')<>nil);
  278. if (target_info.system =system_i386_freebsd) and linkpthread Then
  279. Begin
  280. if not (cs_link_pthread in aktglobalswitches) Then
  281. begin
  282. {delete pthreads from list, in this case it is in libc_r}
  283. SharedLibFiles.Remove(SharedLibFiles.Find('pthread').str);
  284. LibrarySuffix:='r';
  285. end;
  286. End;
  287. prtobj:='prt0';
  288. cprtobj:='cprt0';
  289. gprtobj:='gprt0';
  290. if cs_profile in aktmoduleswitches then
  291. begin
  292. prtobj:=gprtobj;
  293. AddSharedLibrary('c');
  294. LibrarySuffix:='p';
  295. linklibc:=true;
  296. end
  297. else
  298. begin
  299. if linklibc then
  300. prtobj:=cprtobj;
  301. end;
  302. end
  303. else
  304. begin
  305. { for darwin: always link dynamically against libc }
  306. linklibc := true;
  307. if not(cs_profile in aktmoduleswitches) then
  308. prtobj:='/usr/lib/crt1.o'
  309. else
  310. prtobj:='/usr/lib/gcrt1.o';
  311. end;
  312. { Open link.res file }
  313. LinkRes:=TLinkRes.Create(outputexedir+Info.ResName);
  314. { Write path to search libraries }
  315. HPath:=TStringListItem(current_module.locallibrarysearchpath.First);
  316. while assigned(HPath) do
  317. begin
  318. if LdSupportsNoResponseFile then
  319. LinkRes.Add('-L'+HPath.Str)
  320. else
  321. LinkRes.Add('SEARCH_DIR('+HPath.Str+')');
  322. HPath:=TStringListItem(HPath.Next);
  323. end;
  324. HPath:=TStringListItem(LibrarySearchPath.First);
  325. while assigned(HPath) do
  326. begin
  327. if LdSupportsNoResponseFile then
  328. LinkRes.Add('-L'+HPath.Str)
  329. else
  330. LinkRes.Add('SEARCH_DIR('+HPath.Str+')');
  331. HPath:=TStringListItem(HPath.Next);
  332. end;
  333. if not LdSupportsNoResponseFile then
  334. LinkRes.Add('INPUT(');
  335. { add objectfiles, start with prt0 always }
  336. if prtobj<>'' then
  337. LinkRes.AddFileName(FindObjectFile(prtobj,'',false));
  338. { try to add crti and crtbegin if linking to C }
  339. if linklibc and
  340. (target_info.system <> system_powerpc_darwin) then
  341. begin
  342. if librarysearchpath.FindFile('crtbegin.o',s) then
  343. LinkRes.AddFileName(s);
  344. if librarysearchpath.FindFile('crti.o',s) then
  345. LinkRes.AddFileName(s);
  346. end;
  347. { main objectfiles }
  348. while not ObjectFiles.Empty do
  349. begin
  350. s:=ObjectFiles.GetFirst;
  351. if s<>'' then
  352. LinkRes.AddFileName(s);
  353. end;
  354. if not LdSupportsNoResponseFile then
  355. LinkRes.Add(')');
  356. { Write staticlibraries }
  357. if not StaticLibFiles.Empty then
  358. begin
  359. if not LdSupportsNoResponseFile then
  360. LinkRes.Add('GROUP(');
  361. While not StaticLibFiles.Empty do
  362. begin
  363. S:=StaticLibFiles.GetFirst;
  364. LinkRes.AddFileName(s)
  365. end;
  366. if not LdSupportsNoResponseFile then
  367. LinkRes.Add(')');
  368. end;
  369. { Write sharedlibraries like -l<lib>, also add the needed dynamic linker
  370. here to be sure that it gets linked this is needed for glibc2 systems (PFV) }
  371. if not SharedLibFiles.Empty then
  372. begin
  373. if not LdSupportsNoResponseFile then
  374. LinkRes.Add('INPUT(');
  375. While not SharedLibFiles.Empty do
  376. begin
  377. S:=SharedLibFiles.GetFirst;
  378. if s<>'c' then
  379. begin
  380. i:=Pos(target_info.sharedlibext,S);
  381. if i>0 then
  382. Delete(S,i,255);
  383. LinkRes.Add('-l'+s);
  384. end
  385. else
  386. begin
  387. linklibc:=true;
  388. linkdynamic:=false; { libc will include the ld-linux for us }
  389. end;
  390. end;
  391. { be sure that libc is the last lib }
  392. if linklibc then
  393. Begin
  394. If LibrarySuffix=' ' Then
  395. LinkRes.Add('-lc')
  396. else
  397. LinkRes.Add('-lc_'+LibrarySuffix);
  398. If LibrarySuffix='r' Then
  399. LinkRes.Add('-lc');
  400. end;
  401. { when we have -static for the linker the we also need libgcc }
  402. if (cs_link_staticflag in aktglobalswitches) then
  403. LinkRes.Add('-lgcc');
  404. if linkdynamic and (Info.DynamicLinker<>'') then
  405. LinkRes.AddFileName(Info.DynamicLinker);
  406. if not LdSupportsNoResponseFile then
  407. LinkRes.Add(')');
  408. end;
  409. { objects which must be at the end }
  410. if linklibc and
  411. (target_info.system <> system_powerpc_darwin) then
  412. begin
  413. Fl1:=librarysearchpath.FindFile('crtend.o',s1);
  414. Fl2:=librarysearchpath.FindFile('crtn.o',s2);
  415. if Fl1 or Fl2 then
  416. begin
  417. LinkRes.Add('INPUT(');
  418. If Fl1 Then
  419. LinkRes.AddFileName(s1);
  420. If Fl2 Then
  421. LinkRes.AddFileName(s2);
  422. LinkRes.Add(')');
  423. end;
  424. end;
  425. { Write and Close response }
  426. linkres.writetodisk;
  427. linkres.Free;
  428. WriteResponseFile:=True;
  429. end;
  430. function TLinkerBSD.MakeExecutable:boolean;
  431. var
  432. binstr : String;
  433. cmdstr : TCmdStr;
  434. success : boolean;
  435. DynLinkStr : string[60];
  436. StaticStr,
  437. StripStr : string[40];
  438. begin
  439. if not(cs_link_extern in aktglobalswitches) then
  440. Message1(exec_i_linking,current_module.exefilename^);
  441. { Create some replacements }
  442. StaticStr:='';
  443. StripStr:='';
  444. DynLinkStr:='';
  445. if (cs_link_staticflag in aktglobalswitches) then
  446. begin
  447. if (target_info.system=system_m68k_netbsd) and
  448. ((cs_link_on_target in aktglobalswitches) or
  449. (target_info.system=source_info.system)) then
  450. StaticStr:='-Bstatic'
  451. else
  452. StaticStr:='-static';
  453. end;
  454. if (cs_link_strip in aktglobalswitches) then
  455. if (target_info.system <> system_powerpc_darwin) then
  456. StripStr:='-s'
  457. else
  458. StripStr:='-x';
  459. If (cs_profile in aktmoduleswitches) or
  460. ((Info.DynamicLinker<>'') and (not SharedLibFiles.Empty)) then
  461. DynLinkStr:='-dynamic-linker='+Info.DynamicLinker;
  462. if CShared Then
  463. DynLinKStr:=DynLinkStr+' --shared';
  464. { Write used files and libraries }
  465. WriteResponseFile(false);
  466. { Call linker }
  467. SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr);
  468. Replace(cmdstr,'$EXE',current_module.exefilename^);
  469. Replace(cmdstr,'$OPT',Info.ExtraOptions);
  470. Replace(cmdstr,'$RES',outputexedir+Info.ResName);
  471. Replace(cmdstr,'$STATIC',StaticStr);
  472. Replace(cmdstr,'$STRIP',StripStr);
  473. Replace(cmdstr,'$DYNLINK',DynLinkStr);
  474. success:=DoExec(FindUtil(utilsprefix+BinStr),CmdStr,true,LdSupportsNoResponseFile);
  475. { Remove ReponseFile }
  476. if (success) and not(cs_link_extern in aktglobalswitches) then
  477. RemoveFile(outputexedir+Info.ResName);
  478. MakeExecutable:=success; { otherwise a recursive call to link method }
  479. end;
  480. Function TLinkerBSD.MakeSharedLibrary:boolean;
  481. var
  482. binstr : String;
  483. cmdstr : TCmdStr;
  484. success : boolean;
  485. begin
  486. MakeSharedLibrary:=false;
  487. if not(cs_link_extern in aktglobalswitches) then
  488. Message1(exec_i_linking,current_module.sharedlibfilename^);
  489. { Write used files and libraries }
  490. WriteResponseFile(true);
  491. { Call linker }
  492. SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
  493. Replace(cmdstr,'$EXE',current_module.sharedlibfilename^);
  494. Replace(cmdstr,'$OPT',Info.ExtraOptions);
  495. Replace(cmdstr,'$RES',outputexedir+Info.ResName);
  496. success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,true,false);
  497. { Strip the library ? }
  498. if success and (cs_link_strip in aktglobalswitches) then
  499. begin
  500. SplitBinCmd(Info.DllCmd[2],binstr,cmdstr);
  501. Replace(cmdstr,'$EXE',current_module.sharedlibfilename^);
  502. success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,true,false);
  503. end;
  504. { Remove ReponseFile }
  505. if (success) and not(cs_link_extern in aktglobalswitches) then
  506. RemoveFile(outputexedir+Info.ResName);
  507. MakeSharedLibrary:=success; { otherwise a recursive call to link method }
  508. end;
  509. {*****************************************************************************
  510. Initialize
  511. *****************************************************************************}
  512. initialization
  513. {$ifdef x86_64}
  514. RegisterExternalLinker(system_x86_64_FreeBSD_info,TLinkerBSD);
  515. RegisterImport(system_x86_64_freebsd,timportlibbsd);
  516. RegisterExport(system_x86_64_freebsd,texportlibbsd);
  517. RegisterTarget(system_x86_64_freebsd_info);
  518. {$endif}
  519. {$ifdef i386}
  520. RegisterExternalLinker(system_i386_FreeBSD_info,TLinkerBSD);
  521. RegisterExternalLinker(system_i386_NetBSD_info,TLinkerBSD);
  522. RegisterExternalLinker(system_i386_OpenBSD_info,TLinkerBSD);
  523. RegisterImport(system_i386_freebsd,timportlibbsd);
  524. RegisterExport(system_i386_freebsd,texportlibbsd);
  525. RegisterTarget(system_i386_freebsd_info);
  526. RegisterImport(system_i386_netbsd,timportlibbsd);
  527. RegisterExport(system_i386_netbsd,texportlibbsd);
  528. RegisterTarget(system_i386_netbsd_info);
  529. RegisterImport(system_i386_openbsd,timportlibbsd);
  530. RegisterExport(system_i386_openbsd,texportlibbsd);
  531. RegisterTarget(system_i386_openbsd_info);
  532. {$endif i386}
  533. {$ifdef m68k}
  534. // RegisterExternalLinker(system_m68k_FreeBSD_info,TLinkerBSD);
  535. RegisterExternalLinker(system_m68k_NetBSD_info,TLinkerBSD);
  536. RegisterImport(system_m68k_netbsd,timportlibbsd);
  537. RegisterExport(system_m68k_netbsd,texportlibbsd);
  538. RegisterTarget(system_m68k_netbsd_info);
  539. {$endif m68k}
  540. {$ifdef powerpc}
  541. // RegisterExternalLinker(system_m68k_FreeBSD_info,TLinkerBSD);
  542. RegisterExternalLinker(system_powerpc_darwin_info,TLinkerBSD);
  543. RegisterImport(system_powerpc_darwin,timportlibdarwin);
  544. RegisterExport(system_powerpc_darwin,texportlibbsd);
  545. RegisterTarget(system_powerpc_darwin_info);
  546. RegisterExternalLinker(system_powerpc_netbsd_info,TLinkerBSD);
  547. RegisterImport(system_powerpc_netbsd,timportlibbsd);
  548. RegisterExport(system_powerpc_netbsd,texportlibbsd);
  549. RegisterTarget(system_powerpc_netbsd_info);
  550. {$endif powerpc}
  551. end.
  552. {
  553. $Log$
  554. Revision 1.25 2004-11-19 14:21:44 marco
  555. * cycle fix.
  556. Revision 1.24 2004/11/08 22:09:59 peter
  557. * tvarsym splitted
  558. Revision 1.23 2004/10/25 15:38:41 peter
  559. * heap and heapsize removed
  560. * checkpointer fixes
  561. Revision 1.22 2004/10/14 18:16:17 mazen
  562. * USE_SYSUTILS merged successfully : cycles with and without defines
  563. * Need to be optimized in performance
  564. Revision 1.21 2004/09/22 15:25:14 mazen
  565. * Fix error committing : previous version must be in branch USE_SYSUTILS
  566. Revision 1.19 2004/06/20 08:55:32 florian
  567. * logs truncated
  568. Revision 1.18 2004/06/16 20:07:11 florian
  569. * dwarf branch merged
  570. Revision 1.17 2004/06/08 17:14:49 jonas
  571. * use -x instead of -s for stripping under Mac OS X (-s strips too much
  572. sometimes)
  573. Revision 1.16 2004/06/02 07:03:49 jonas
  574. - disabled automatic adding of libraries from "external lib name 'xxx'"
  575. for now (until we have proper framework support)
  576. Revision 1.15 2004/05/31 18:08:41 jonas
  577. * changed calling of external procedures to be the same as under gcc
  578. (don't worry about all the generated stubs, they're optimized away
  579. by the linker)
  580. -> side effect: no need anymore to use special declarations for
  581. external C functions under Darwin compared to other platforms
  582. (it's still necessary for variables though)
  583. Revision 1.14.2.7 2004/05/18 19:30:28 marco
  584. * duplicate entry removed
  585. }