link.pas 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  1. {
  2. $Id$
  3. Copyright (c) 1998 by the FPC development team
  4. This unit handles the linker and binder calls for programs and
  5. libraries
  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 link;
  20. Interface
  21. { Needed for LFN support in path to the executable }
  22. {$ifdef GO32V2}
  23. {$define ALWAYSSHELL}
  24. {$endif}
  25. uses cobjects,files;
  26. Type
  27. TLinker = Object
  28. Glibc2,
  29. Glibc21,
  30. LinkToC, { Should we link to the C libs? }
  31. Strip : Boolean; { Strip symbols ? }
  32. ObjectFiles,
  33. SharedLibFiles,
  34. StaticLibFiles : TStringContainer;
  35. LibrarySearchPath, { Search path for libraries }
  36. LinkOptions : string; { Additional options to the linker }
  37. DynamicLinker : String[80]; { What Dynamic linker ? }
  38. LinkResName : String[32]; { Name of response file }
  39. { Methods }
  40. Constructor Init;
  41. Destructor Done;
  42. procedure AddModuleFiles(hp:pmodule);
  43. function FindObjectFile(s : string) : string;
  44. function FindLibraryFile(s:string;const ext:string) : string;
  45. Procedure AddObject(const S : String);
  46. Procedure AddStaticLibrary(const S : String);
  47. Procedure AddSharedLibrary(S : String);
  48. Function FindLinker:String; { Find linker, sets Name }
  49. Function DoExec(const command,para:string;info,useshell:boolean):boolean;
  50. Function WriteResponseFile:Boolean;
  51. Function MakeExecutable:boolean;
  52. Procedure MakeStaticLibrary(filescnt:longint);
  53. Procedure MakeSharedLibrary;
  54. end;
  55. PLinker=^TLinker;
  56. Var
  57. Linker : TLinker;
  58. Implementation
  59. uses
  60. {$ifdef Delphi}
  61. dmisc,
  62. {$endif Delphi}
  63. globtype,systems,
  64. script,globals,verbose
  65. {$ifdef i386}
  66. ,win_targ
  67. {$endif}
  68. {$ifdef linux}
  69. ,linux
  70. {$endif}
  71. ,dos
  72. ;
  73. {$ifndef linux}
  74. Procedure Shell(const command:string);
  75. { This is already defined in the linux.ppu for linux, need for the *
  76. expansion under linux }
  77. var
  78. comspec : string;
  79. begin
  80. comspec:=getenv('COMSPEC');
  81. Exec(comspec,' /C '+command);
  82. end;
  83. {$endif}
  84. Constructor TLinker.Init;
  85. begin
  86. ObjectFiles.Init_no_double;
  87. SharedLibFiles.Init_no_double;
  88. StaticLibFiles.Init_no_double;
  89. LinkToC:=False;
  90. Glibc2:=false;
  91. Glibc21:=false;
  92. Strip:=false;
  93. LinkOptions:='';
  94. {$ifdef linux}
  95. { first try glibc2 }
  96. DynamicLinker:='/lib/ld-linux.so.2';
  97. if FileExists(DynamicLinker) then
  98. begin
  99. Glibc2:=true;
  100. { also glibc 2.1 / 2.1.1 ? }
  101. if FileExists('/lib/ld-2.1.so') or
  102. FileExists('/lib/ld-2.1.1.so') then
  103. Glibc21:=true;
  104. end
  105. else
  106. DynamicLinker:='/lib/ld-linux.so.1';
  107. LibrarySearchPath:='/lib;/usr/lib;/usr/X11R6/lib';
  108. {$else}
  109. DynamicLinker:='';
  110. LibrarySearchPath:='';
  111. {$endif}
  112. LinkResName:='link.res';
  113. end;
  114. Destructor TLinker.Done;
  115. begin
  116. ObjectFiles.Done;
  117. SharedLibFiles.Done;
  118. StaticLibFiles.Done;
  119. end;
  120. procedure TLinker.AddModuleFiles(hp:pmodule);
  121. begin
  122. with hp^ do
  123. begin
  124. while not linkunitfiles.empty do
  125. AddObject(linkunitfiles.Get);
  126. while not linkofiles.empty do
  127. AddObject(linkofiles.Get);
  128. while not linksharedlibs.empty do
  129. AddSharedLibrary(linksharedlibs.Get);
  130. while not linkstaticlibs.empty do
  131. AddStaticLibrary(linkstaticlibs.Get);
  132. end;
  133. end;
  134. var
  135. LastLDBin : string;
  136. Function TLinker.FindLinker:string;
  137. var
  138. ldfound : boolean;
  139. begin
  140. if LastLDBin='' then
  141. begin
  142. if utilsdirectory<>'' then
  143. begin
  144. LastLDBin:=Search(target_link.linkbin+source_os.exeext,
  145. utilsdirectory,ldfound)+target_link.linkbin+source_os.exeext;
  146. end
  147. else
  148. LastLDBin:=FindExe(target_link.linkbin,ldfound);
  149. if (not ldfound) and not(cs_link_extern in aktglobalswitches) then
  150. begin
  151. Message1(exec_w_linker_not_found,LastLDBin);
  152. aktglobalswitches:=aktglobalswitches+[cs_link_extern];
  153. end;
  154. if ldfound then
  155. Message1(exec_t_using_linker,LastLDBin);
  156. end;
  157. FindLinker:=LastLDBin;
  158. end;
  159. { searches an object file }
  160. function TLinker.FindObjectFile(s:string) : string;
  161. var
  162. found : boolean;
  163. begin
  164. if pos('.',s)=0 then
  165. s:=s+target_info.objext;
  166. s:=FixFileName(s);
  167. if FileExists(s) then
  168. begin
  169. Findobjectfile:=s;
  170. exit;
  171. end;
  172. { find object file
  173. 1. cwd
  174. 2. unit search path
  175. 3. local object path
  176. 4. global object path
  177. 5. exepath }
  178. found:=false;
  179. findobjectfile:=search(s,'.',found)+s;
  180. if (not found) then
  181. findobjectfile:=search(s,unitsearchpath,found)+s;
  182. if (not found) and assigned(current_module^.localobjectsearchpath) then
  183. findobjectfile:=search(s,current_module^.localobjectsearchpath^,found)+s;
  184. if (not found) then
  185. findobjectfile:=search(s,objectsearchpath,found)+s;
  186. if (not found) then
  187. findobjectfile:=search(s,exepath,found)+s;
  188. if not(cs_link_extern in aktglobalswitches) and (not found) then
  189. Message1(exec_w_objfile_not_found,s);
  190. end;
  191. { searches an library file }
  192. function TLinker.FindLibraryFile(s:string;const ext:string) : string;
  193. var
  194. found : boolean;
  195. begin
  196. if pos('.',s)=0 then
  197. s:=s+ext;
  198. if FileExists(s) then
  199. begin
  200. FindLibraryFile:=s;
  201. exit;
  202. end;
  203. { find libary
  204. 1. cwd
  205. 2. local libary dir
  206. 3. global libary dir
  207. 4. exe path of the compiler }
  208. found:=false;
  209. findlibraryfile:=search(s,'.',found)+s;
  210. if (not found) and assigned(current_module^.locallibrarysearchpath) then
  211. findlibraryfile:=search(s,current_module^.locallibrarysearchpath^,found)+s;
  212. if (not found) then
  213. findlibraryfile:=search(s,librarysearchpath,found)+s;
  214. if (not found) then
  215. findlibraryfile:=search(s,exepath,found)+s;
  216. if not(cs_link_extern in aktglobalswitches) and (not found) then
  217. Message1(exec_w_libfile_not_found,s);
  218. end;
  219. Procedure TLinker.AddObject(const S : String);
  220. begin
  221. ObjectFiles.Insert(FindObjectFile(s));
  222. end;
  223. Procedure TLinker.AddSharedLibrary(S:String);
  224. begin
  225. { remove prefix 'lib' }
  226. if Copy(s,1,length(target_os.libprefix))=target_os.libprefix then
  227. Delete(s,1,length(target_os.libprefix));
  228. { remove extension if any }
  229. if Copy(s,length(s)-length(target_os.sharedlibext)+1,length(target_os.sharedlibext))=target_os.sharedlibext then
  230. Delete(s,length(s)-length(target_os.sharedlibext)+1,length(target_os.sharedlibext)+1);
  231. { ready to be inserted }
  232. SharedLibFiles.Insert (S);
  233. end;
  234. Procedure TLinker.AddStaticLibrary(const S:String);
  235. begin
  236. StaticLibFiles.Insert(FindLibraryFile(s,target_os.staticlibext));
  237. end;
  238. Function TLinker.DoExec(const command,para:string;info,useshell:boolean):boolean;
  239. begin
  240. DoExec:=true;
  241. if not(cs_link_extern in aktglobalswitches) then
  242. begin
  243. swapvectors;
  244. {$ifdef ALWAYSSHELL}
  245. shell(command+' '+para);
  246. {$else}
  247. if useshell then
  248. shell(command+' '+para)
  249. else
  250. exec(command,para);
  251. {$endif}
  252. swapvectors;
  253. if (doserror<>0) then
  254. begin
  255. Message(exec_w_cant_call_linker);
  256. aktglobalswitches:=aktglobalswitches+[cs_link_extern];
  257. DoExec:=false;
  258. end
  259. else
  260. if (dosexitcode<>0) then
  261. begin
  262. Message(exec_w_error_while_linking);
  263. aktglobalswitches:=aktglobalswitches+[cs_link_extern];
  264. DoExec:=false;
  265. end;
  266. end;
  267. { Update asmres when externmode is set }
  268. if cs_link_extern in aktglobalswitches then
  269. begin
  270. if info then
  271. AsmRes.AddLinkCommand(Command,Para,current_module^.exefilename^)
  272. else
  273. AsmRes.AddLinkCommand(Command,Para,'');
  274. end;
  275. end;
  276. Function TLinker.WriteResponseFile : Boolean;
  277. Var
  278. LinkResponse : Text;
  279. i : longint;
  280. cprtobj,
  281. gprtobj,
  282. prtobj : string[80];
  283. s,s2 : string;
  284. found,linux_link_c,
  285. linklibc : boolean;
  286. procedure WriteRes(const s:string);
  287. begin
  288. if s<>'' then
  289. WriteLn(Linkresponse,s);
  290. end;
  291. procedure WriteResFileName(const s:string);
  292. begin
  293. if s<>'' then
  294. begin
  295. if not(s[1] in ['a'..'z','A'..'Z','/','\','.']) then
  296. Write(Linkresponse,'.',DirSep);
  297. WriteLn(Linkresponse,s);
  298. end;
  299. end;
  300. begin
  301. WriteResponseFile:=False;
  302. linux_link_c:=false;
  303. { set special options for some targets }
  304. linklibc:=SharedLibFiles.Find('c');
  305. prtobj:='prt0';
  306. cprtobj:='cprt0';
  307. gprtobj:='gprt0';
  308. if glibc21 then
  309. begin
  310. cprtobj:='cprt21';
  311. gprtobj:='gprt21';
  312. end;
  313. case target_info.target of
  314. target_m68k_Palmos,
  315. target_i386_Win32 :
  316. begin
  317. if DLLsource then
  318. prtobj:='wdllprt0'
  319. else
  320. prtobj:='wprt0';
  321. end;
  322. target_m68k_linux,
  323. target_i386_linux :
  324. begin
  325. if cs_profile in aktmoduleswitches then
  326. begin
  327. prtobj:=gprtobj;
  328. if not glibc2 then
  329. AddSharedLibrary('gmon');
  330. AddSharedLibrary('c');
  331. linklibc:=true;
  332. end
  333. else
  334. begin
  335. if linklibc then
  336. prtobj:=cprtobj;
  337. end;
  338. if linklibc then
  339. linux_link_c:=true;
  340. end;
  341. end;
  342. { Fix command line options }
  343. If not SharedLibFiles.Empty then
  344. LinkOptions:='-dynamic-linker='+DynamicLinker+' '+LinkOptions;
  345. if Strip and not(cs_debuginfo in aktmoduleswitches) and
  346. not (Target_Link.StripBind) then
  347. LinkOptions:=LinkOptions+' '+target_link.stripopt;
  348. { Open linkresponse and write header }
  349. assign(linkresponse,current_module^.outpath^+LinkResName);
  350. {$I-}
  351. rewrite(linkresponse);
  352. {$I+}
  353. if ioresult<>0 then
  354. exit;
  355. { Write library searchpath }
  356. if assigned(current_module^.locallibrarysearchpath) then
  357. begin
  358. S2:=current_module^.locallibrarysearchpath^;
  359. Repeat
  360. i:=Pos(';',S2);
  361. If i=0 then
  362. i:=255;
  363. S:=Copy(S2,1,i-1);
  364. If S<>'' then
  365. WriteRes(target_link.libpathprefix+s+target_link.libpathsuffix);
  366. Delete (S2,1,i);
  367. until S2='';
  368. end;
  369. S2:=LibrarySearchPath;
  370. Repeat
  371. i:=Pos(';',S2);
  372. If i=0 then
  373. i:=255;
  374. S:=Copy(S2,1,i-1);
  375. If S<>'' then
  376. WriteRes(target_link.libpathprefix+s+target_link.libpathsuffix);
  377. Delete (S2,1,i);
  378. until S2='';
  379. WriteRes(target_link.inputstart);
  380. { add objectfiles, start with prt0 always }
  381. if prtobj<>'' then
  382. WriteResFileName(FindObjectFile(prtobj));
  383. { try to add crti and crtbegin, they are normally not required, but
  384. adding can sometimes be usefull }
  385. if linux_link_c then
  386. begin
  387. s:=search('crtbegin.o',librarysearchpath,found)+'crtbegin.o';
  388. if found then
  389. WriteResFileName(s);
  390. s:=search('crti.o',librarysearchpath,found)+'crti.o';
  391. if found then
  392. WriteResFileName(s);
  393. end;
  394. while not ObjectFiles.Empty do
  395. begin
  396. s:=ObjectFiles.Get;
  397. if s<>'' then
  398. WriteResFileName(s);
  399. end;
  400. if linux_link_c then
  401. begin
  402. s:=search('crtend.o',librarysearchpath,found)+'crtend.o';
  403. if found then
  404. WriteResFileName(s);
  405. s:=search('crtn.o',librarysearchpath,found)+'crtn.o';
  406. if found then
  407. WriteResFileName(s);
  408. end;
  409. { Write sharedlibraries like -l<lib> }
  410. While not SharedLibFiles.Empty do
  411. begin
  412. S:=SharedLibFiles.Get;
  413. if s<>'c' then
  414. begin
  415. i:=Pos(target_os.sharedlibext,S);
  416. if i>0 then
  417. Delete(S,i,255);
  418. WriteRes(target_link.libprefix+s);
  419. end
  420. else
  421. linklibc:=true;
  422. end;
  423. { be sure that libc is the last lib }
  424. { arghhhh this is wrong for DJGPP !!!
  425. DJGPP need gcc after c lib (umod...) (PM) }
  426. if linklibc then
  427. WriteRes(target_link.libprefix+'c');
  428. { add libgcc after ! }
  429. if linklibc and (target_info.target=target_i386_go32v2) then
  430. WriteRes(target_link.libprefix+'gcc');
  431. WriteRes(target_link.inputend);
  432. { Write staticlibraries }
  433. if not StaticLibFiles.Empty then
  434. begin
  435. WriteRes(target_link.GroupStart);
  436. While not StaticLibFiles.Empty do
  437. begin
  438. S:=StaticLibFiles.Get;
  439. WriteResFileName(s)
  440. end;
  441. WriteRes(target_link.GroupEnd);
  442. end;
  443. { Close response }
  444. close(linkresponse);
  445. WriteResponseFile:=True;
  446. end;
  447. function TLinker.MakeExecutable:boolean;
  448. var
  449. bindbin : string[80];
  450. bindfound : boolean;
  451. s : string;
  452. success : boolean;
  453. ii : longint;
  454. begin
  455. {$ifdef linux}
  456. if LinkToC then
  457. begin
  458. AddObject('/usr/lib/crt0.o');
  459. AddObject('lprt');
  460. AddStaticLibrary('libc.a');
  461. AddStaticLibrary('libgcc.a');
  462. end;
  463. {$endif Linux}
  464. { Write used files and libraries }
  465. WriteResponseFile;
  466. { Call linker }
  467. if not(cs_link_extern in aktglobalswitches) then
  468. Message1(exec_i_linking,current_module^.exefilename^);
  469. s:=target_link.linkcmd;
  470. if DLLsource then
  471. Replace(s,'$EXE',current_module^.sharedlibfilename^)
  472. else
  473. Replace(s,'$EXE',current_module^.exefilename^);
  474. Replace(s,'$OPT',LinkOptions);
  475. Replace(s,'$RES',current_module^.outpath^+LinkResName);
  476. success:=DoExec(FindLinker,s,true,false);
  477. {Bind}
  478. if (target_link.bindbin[1]<>'') and
  479. ((target_info.target<>target_i386_win32) or bind_win32_dll) then
  480. for ii:=1 to target_link.binders do
  481. begin
  482. s:=target_link.bindcmd[ii];
  483. Replace(s,'$OPT',LinkOptions);
  484. Replace(s,'$RES',current_module^.outpath^+LinkResName);
  485. if DLLsource then
  486. Replace(s,'$EXE',current_module^.sharedlibfilename^)
  487. else
  488. Replace(s,'$EXE',current_module^.exefilename^);
  489. {Size of the heap when an EMX program runs in OS/2.}
  490. Replace(s,'$HEAPMB',tostr((maxheapsize+1048575) shr 20));
  491. {Size of the stack when an EMX program runs in OS/2.}
  492. Replace(s,'$STACKKB',tostr((stacksize+1023) shr 10));
  493. {When an EMX program runs in DOS, the heap and stack share the
  494. same memory pool. The heap grows upwards, the stack grows downwards.}
  495. Replace(s,'$DOSHEAPKB',tostr((stacksize+maxheapsize+1023) shr 10));
  496. if Strip and Target_Link.StripBind then
  497. Replace (S, '$STRIP', Target_Link.StripOpt) else
  498. Replace (S, '$STRIP', '');
  499. if utilsdirectory<>'' then
  500. begin
  501. bindbin:=Search(target_link.bindbin[ii]+source_os.exeext,
  502. utilsdirectory,bindfound)+target_link.bindbin[ii]+source_os.exeext;
  503. end
  504. else
  505. bindbin:=FindExe(target_link.bindbin[ii],bindfound);
  506. if (not bindfound) and not (cs_link_extern in aktglobalswitches) then
  507. begin
  508. Message1(exec_w_binder_not_found,bindbin);
  509. aktglobalswitches:=aktglobalswitches+[cs_link_extern];
  510. end;
  511. DoExec(bindbin,s,false,false);
  512. end;
  513. { Post processor executable }
  514. {$ifdef i386}
  515. if (target_info.target=target_i386_Win32) and success and
  516. not(cs_link_extern in aktglobalswitches) then
  517. if DLLsource then
  518. win_targ.postprocessexecutable(current_module^.sharedlibfilename^)
  519. else
  520. win_targ.postprocessexecutable(current_module^.exefilename^);
  521. {$endif}
  522. {Remove ReponseFile}
  523. if (success) and not(cs_link_extern in aktglobalswitches) then
  524. RemoveFile(current_module^.outpath^+LinkResName);
  525. MakeExecutable:=success; { otherwise a recursive call to link method }
  526. end;
  527. Procedure TLinker.MakeStaticLibrary(filescnt:longint);
  528. {
  529. FilesCnt holds the amount of .o files created, if filescnt=0 then
  530. no smartlinking is used
  531. }
  532. var
  533. smartpath,
  534. s,
  535. arbin : string;
  536. arfound : boolean;
  537. cnt : longint;
  538. begin
  539. smartpath:=current_module^.path^+FixPath(FixFileName(current_module^.modulename^)+target_info.smartext,false);
  540. { find ar binary }
  541. if utilsdirectory<>'' then
  542. begin
  543. arbin:=Search(target_ar.arbin+source_os.exeext,
  544. utilsdirectory,arfound)+target_ar.arbin+source_os.exeext;
  545. end
  546. else
  547. arbin:=FindExe(target_ar.arbin,arfound);
  548. if (not arfound) and not(cs_link_extern in aktglobalswitches) then
  549. begin
  550. Message(exec_w_ar_not_found);
  551. aktglobalswitches:=aktglobalswitches+[cs_link_extern];
  552. end;
  553. s:=target_ar.arcmd;
  554. Replace(s,'$LIB',current_module^.staticlibfilename^);
  555. if filescnt=0 then
  556. Replace(s,'$FILES',current_module^.objfilename^)
  557. else
  558. Replace(s,'$FILES',FixFileName(smartpath+current_module^.asmprefix^+'*'+target_info.objext));
  559. DoExec(arbin,s,false,true);
  560. { Clean up }
  561. if not(cs_asm_leave in aktglobalswitches) then
  562. if not(cs_link_extern in aktglobalswitches) then
  563. begin
  564. if filescnt=0 then
  565. RemoveFile(current_module^.objfilename^)
  566. else
  567. begin
  568. for cnt:=1 to filescnt do
  569. if not RemoveFile(FixFileName(smartpath+current_module^.asmprefix^+tostr(cnt)+target_info.objext)) then
  570. RemoveFile(FixFileName(smartpath+current_module^.asmprefix^+'e'+tostr(cnt)+target_info.objext));
  571. RemoveDir(smartpath);
  572. end;
  573. end
  574. else
  575. begin
  576. if filescnt=0 then
  577. AsmRes.AddDeleteCommand(current_module^.objfilename^)
  578. else
  579. begin
  580. AsmRes.AddDeleteCommand(smartpath+current_module^.asmprefix^+'*'+target_info.objext);
  581. AsmRes.Add('rmdir '+smartpath);
  582. end;
  583. end;
  584. end;
  585. Procedure TLinker.MakeSharedLibrary;
  586. var
  587. s : string;
  588. begin
  589. s:=' -shared -o $LIB $FILES';
  590. Replace(s,'$LIB',current_module^.sharedlibfilename^);
  591. Replace(s,'$FILES',current_module^.objfilename^);
  592. if DoExec(FindLinker,s,false,false) then
  593. RemoveFile(current_module^.objfilename^);
  594. end;
  595. end.
  596. {
  597. $Log$
  598. Revision 1.56 1999-06-18 09:55:30 peter
  599. * merged
  600. Revision 1.55 1999/06/15 13:57:31 peter
  601. * merged
  602. Revision 1.54.2.2 1999/06/18 09:51:55 peter
  603. * always use shell() for go32v2 to support LFN
  604. Revision 1.54.2.1 1999/06/15 13:51:56 peter
  605. * also check ld-2.1.so for glibc 2.1, previous was only for 2.1.1
  606. Revision 1.54 1999/06/02 13:25:35 hajny
  607. * fixed stripping symbols for OS/2
  608. Revision 1.53 1999/05/04 21:44:44 florian
  609. * changes to compile it with Delphi 4.0
  610. Revision 1.52 1999/05/03 21:30:30 peter
  611. + glibc 2.1
  612. Revision 1.51 1999/04/28 23:42:33 pierre
  613. * removing of temporary directory with -s option
  614. Revision 1.50 1999/04/25 14:31:48 daniel
  615. * Bug fixed in linking: compiling files on another drive than the one you
  616. currently use you is done correctly.
  617. Revision 1.49 1999/03/25 16:55:30 peter
  618. + unitpath,librarypath,includepath,objectpath directives
  619. Revision 1.48 1999/03/23 16:22:43 peter
  620. * crtbegin/crtend only added if found
  621. Revision 1.47 1999/02/05 16:45:47 michael
  622. + Fixed gluing of options
  623. Revision 1.46 1999/02/05 08:54:26 pierre
  624. + linkofiles splitted inot linkofiles and linkunitfiles
  625. because linkofiles must be stored with directory
  626. to enabled linking of different objects with same name
  627. in a different directory
  628. Revision 1.45 1999/01/29 10:33:07 peter
  629. * objectsearchpath is now also searched if an object is not found
  630. Revision 1.44 1999/01/27 13:07:58 pierre
  631. * problem related with libc : go32v2 and linux differences
  632. Revision 1.43 1999/01/25 15:02:13 peter
  633. * link libc always as last
  634. Revision 1.42 1998/12/11 00:03:19 peter
  635. + globtype,tokens,version unit splitted from globals
  636. Revision 1.41 1998/12/01 23:39:46 pierre
  637. * postprocessexec for win32 changed
  638. Revision 1.40 1998/12/01 12:51:20 peter
  639. * fixed placing of ppas.sh and link.res when using -FE
  640. Revision 1.39 1998/11/30 13:26:23 pierre
  641. * the code for ordering the exported procs/vars was buggy
  642. + added -WB to force binding (Ozerski way of creating DLL)
  643. this is off by default as direct writing of .edata section seems
  644. OK
  645. Revision 1.38 1998/11/30 09:43:13 pierre
  646. * some range check bugs fixed (still not working !)
  647. + added DLL writing support for win32 (also accepts variables)
  648. + TempAnsi for code that could be used for Temporary ansi strings
  649. handling
  650. Revision 1.37 1998/10/26 22:23:31 peter
  651. + fixpath() has an extra option to allow a ./ as path
  652. Revision 1.36 1998/10/22 15:18:44 florian
  653. + switch -vx for win32 added
  654. Revision 1.35 1998/10/19 18:06:23 peter
  655. * use no_double
  656. Revision 1.34 1998/10/16 13:37:18 florian
  657. + switch -FD added to specify the path for utilities
  658. Revision 1.33 1998/10/14 13:38:22 peter
  659. * fixed path with staticlib/objects in ppufiles
  660. Revision 1.32 1998/10/14 11:03:55 daniel
  661. * Forgot to dereference a pointer.
  662. Revision 1.31 1998/10/14 11:01:21 daniel
  663. * Staticlibfilename no longer not include a path. Correction when calling
  664. ar.
  665. Revision 1.30 1998/10/13 13:10:18 peter
  666. * new style for m68k/i386 infos and enums
  667. Revision 1.29 1998/10/13 08:19:34 pierre
  668. + source_os is now set correctly for cross-processor compilers
  669. (tos contains all target_infos and
  670. we use CPU86 and CPU68 conditionnals to
  671. get the source operating system
  672. this only works if you do not undefine
  673. the source target !!)
  674. * several cg68k memory leaks fixed
  675. + started to change the code so that it should be possible to have
  676. a complete compiler (both for m68k and i386 !!)
  677. Revision 1.28 1998/10/08 23:28:56 peter
  678. * -vu shows unit info, -vt shows tried/used files
  679. Revision 1.27 1998/10/06 17:16:52 pierre
  680. * some memory leaks fixed (thanks to Peter for heaptrc !)
  681. Revision 1.26 1998/09/29 15:23:05 peter
  682. * remove also the end files for smartlinking
  683. Revision 1.25 1998/09/10 15:25:31 daniel
  684. + Added maxheapsize.
  685. * Corrected semi-bug in calling the assembler and the linker
  686. Revision 1.24 1998/09/07 18:32:45 peter
  687. * fixed for m68k
  688. Revision 1.23 1998/09/03 17:39:04 florian
  689. + better code for type conversation longint/dword to real type
  690. Revision 1.22 1998/09/01 09:01:00 peter
  691. + glibc2 support
  692. Revision 1.21 1998/08/31 12:26:26 peter
  693. * m68k and palmos updates from surebugfixes
  694. Revision 1.20 1998/08/19 10:06:14 peter
  695. * fixed filenames and removedir which supports slash at the end
  696. Revision 1.19 1998/08/17 09:17:47 peter
  697. * static/shared linking updates
  698. Revision 1.18 1998/08/14 21:56:34 peter
  699. * setting the outputfile using -o works now to create static libs
  700. Revision 1.17 1998/08/14 18:16:08 peter
  701. * return after a failed call will now add it to ppas
  702. Revision 1.16 1998/08/12 19:28:15 peter
  703. * better libc support
  704. Revision 1.15 1998/08/10 14:50:02 peter
  705. + localswitches, moduleswitches, globalswitches splitting
  706. Revision 1.14 1998/06/17 14:10:13 peter
  707. * small os2 fixes
  708. * fixed interdependent units with newppu (remake3 under linux works now)
  709. Revision 1.13 1998/06/08 22:59:46 peter
  710. * smartlinking works for win32
  711. * some defines to exclude some compiler parts
  712. Revision 1.12 1998/06/04 23:51:44 peter
  713. * m68k compiles
  714. + .def file creation moved to gendef.pas so it could also be used
  715. for win32
  716. Revision 1.11 1998/05/27 00:20:31 peter
  717. * some scanner optimizes
  718. * automaticly aout2exe for go32v1
  719. * fixed dynamiclinker option which was added at the wrong place
  720. Revision 1.10 1998/05/22 12:32:47 peter
  721. * fixed -L on the commandline, Dos commandline is only 128 bytes
  722. Revision 1.9 1998/05/12 10:46:59 peter
  723. * moved printstatus to verb_def
  724. + V_Normal which is between V_Error and V_Warning and doesn't have a
  725. prefix like error: warning: and is included in V_Default
  726. * fixed some messages
  727. * first time parameter scan is only for -v and -T
  728. - removed old style messages
  729. Revision 1.8 1998/05/11 13:07:54 peter
  730. + $ifdef NEWPPU for the new ppuformat
  731. + $define GDB not longer required
  732. * removed all warnings and stripped some log comments
  733. * no findfirst/findnext anymore to remove smartlink *.o files
  734. Revision 1.7 1998/05/08 09:21:20 michael
  735. * Added missing -Fl message to messages file.
  736. * Corrected mangling of file names when doing Linklib
  737. * -Fl now actually WORKS.
  738. * Librarysearchpath is now a field in linker object.
  739. Revision 1.6 1998/05/06 09:26:49 peter
  740. * fixed ld call with shell
  741. Revision 1.4 1998/05/04 17:54:25 peter
  742. + smartlinking works (only case jumptable left todo)
  743. * redesign of systems.pas to support assemblers and linkers
  744. + Unitname is now also in the PPU-file, increased version to 14
  745. Revision 1.3 1998/04/16 10:54:30 daniel
  746. * Fixed linking for OS/2.
  747. }