Browse Source

- removed unused leftovers from old t_bsd code
* no longer execute the linker via a shell script, but directly

git-svn-id: trunk@49046 -

Jonas Maebe 4 years ago
parent
commit
7a0c6ab591
2 changed files with 186 additions and 215 deletions
  1. 1 1
      compiler/link.pas
  2. 185 214
      compiler/systems/t_darwin.pas

+ 1 - 1
compiler/link.pas

@@ -662,7 +662,7 @@ Implementation
         if (OrderedSymbols.Empty) or
         if (OrderedSymbols.Empty) or
            not(tf_supports_symbolorderfile in target_info.flags) then
            not(tf_supports_symbolorderfile in target_info.flags) then
           exit;
           exit;
-        symfile:=TScript.Create(outputexedir+'symbol_order.fpc');
+        symfile:=TScript.Create(outputexedir+UniqueName('symbol_order')+'.fpc');
         item:=TCmdStrListItem(OrderedSymbols.First);
         item:=TCmdStrListItem(OrderedSymbols.First);
         while assigned(item) do
         while assigned(item) do
           begin
           begin

+ 185 - 214
compiler/systems/t_darwin.pas

@@ -51,11 +51,15 @@ implementation
 
 
     tlinkerdarwin=class(texternallinker)
     tlinkerdarwin=class(texternallinker)
     private
     private
-      LinkFilesFileName,
       LinkSymsFileName   : TCmdStr;
       LinkSymsFileName   : TCmdStr;
-      Function  WriteResponseFile(isdll:boolean) : Boolean;
+      function WriteFileList: TCmdStr;
       function GetDarwinCrt1ObjName(isdll: boolean): TCmdStr;
       function GetDarwinCrt1ObjName(isdll: boolean): TCmdStr;
       Function GetDarwinPrtobjName(isdll: boolean): TCmdStr;
       Function GetDarwinPrtobjName(isdll: boolean): TCmdStr;
+      function GetLinkArch: TCmdStr;
+      function GetLinkVersion: TCmdStr;
+      function GetSysroot: TCmdStr;
+      function GetLibSearchPath: TCmdStr;
+      function GetLibraries: TCmdStr;
     public
     public
       constructor Create;override;
       constructor Create;override;
       procedure SetDefaultInfo;override;
       procedure SetDefaultInfo;override;
@@ -123,16 +127,16 @@ implementation
              programs with problems that require Valgrind will have more
              programs with problems that require Valgrind will have more
              than 60KB of data (first 4KB of address space is always invalid)
              than 60KB of data (first 4KB of address space is always invalid)
            }
            }
-           ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+           ExeCmd[1]:='ld $PRTOBJ $TARGET $OPT $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -L. -o $EXE $ARCH $VERSION $SYSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES';
            if not(cs_gdb_valgrind in current_settings.globalswitches) then
            if not(cs_gdb_valgrind in current_settings.globalswitches) then
              ExeCmd[1]:=ExeCmd[1]+' -pagezero_size 0x10000';
              ExeCmd[1]:=ExeCmd[1]+' -pagezero_size 0x10000';
   {$else ndef cpu64bitaddr}
   {$else ndef cpu64bitaddr}
-           ExeCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+           ExeCmd[1]:='ld $PRTOBJ $TARGET $OPT $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -L. -o $EXE $ARCH $VERSION $SYSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES';
   {$endif ndef cpu64bitaddr}
   {$endif ndef cpu64bitaddr}
            if (apptype<>app_bundle) then
            if (apptype<>app_bundle) then
-             DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -dylib -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
+             DllCmd[1]:='ld $PRTOBJ $TARGET $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -dylib -L. -o $EXE $ARCH $VERSION $SYSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES'
            else
            else
-             DllCmd[1]:='ld $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -bundle -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
+             DllCmd[1]:='ld $PRTOBJ $TARGET $OPT $GCSECTIONS $MAP $LTO $ORDERSYMS -dynamic -bundle -L. -o $EXE $ARCH $VERSION $SYRSROOT $LIBSEARCHPATH $FILELIST $LIBRARIES';
            DllCmd[2]:='strip -x $EXE';
            DllCmd[2]:='strip -x $EXE';
            DynamicLinker:='';
            DynamicLinker:='';
          end;
          end;
@@ -298,106 +302,152 @@ implementation
       end;
       end;
 
 
 
 
-    Function tlinkerdarwin.GetDarwinPrtobjName(isdll: boolean): TCmdStr;
-    var
-      startupfile: TCmdStr;
-    begin
-      result:='';
+    function tlinkerdarwin.GetDarwinPrtobjName(isdll: boolean): TCmdStr;
+      var
+        startupfile: TCmdStr;
+      begin
+        result:='';
 
 
-      startupfile:=GetDarwinCrt1ObjName(isdll);
-      if startupfile<>'' then
-        begin
-         if not librarysearchpath.FindFile(startupfile,false,result) then
-           result:='/usr/lib/'+startupfile;
-        end;
-      result:=maybequoted(result);
-    end;
+        startupfile:=GetDarwinCrt1ObjName(isdll);
+        if startupfile<>'' then
+          begin
+           if not librarysearchpath.FindFile(startupfile,false,result) then
+             result:='/usr/lib/'+startupfile;
+          end;
+        result:=maybequoted(result);
+      end;
 
 
 
 
-    Function tlinkerdarwin.WriteResponseFile(isdll:boolean) : Boolean;
-    Var
-      linkres      : TLinkRes;
-      FilesList    : TLinkRes;
-      i            : longint;
-      HPath        : TCmdStrListItem;
-      s            : TCmdStr;
-    begin
-      WriteResponseFile:=False;
-      if ReOrderEntries Then
-         ExpandAndApplyOrder(SharedLibFiles);
+    function tlinkerdarwin.GetLinkArch: TCmdStr;
+      begin
+        case target_info.system of
+          system_powerpc_darwin:
+            result:='-arch ppc';
+          system_i386_darwin,
+          system_i386_iphonesim:
+            result:='-arch i386';
+          system_powerpc64_darwin:
+            result:='-arch ppc64';
+          system_x86_64_darwin,
+          system_x86_64_iphonesim:
+            result:='-arch x86_64';
+          system_arm_ios:
+            { current versions of the linker require the sub-architecture type
+              to be specified }
+            result:='-arch '+lower(cputypestr[current_settings.cputype]);
+          system_aarch64_ios,
+          system_aarch64_darwin:
+            result:='-arch arm64';
+          else
+            internalerror(2014121801);
+        end;
+      end;
 
 
-      { Open link.res file }
-      LinkRes:=TLinkRes.Create(outputexedir+Info.ResName,false);
 
 
-      if sysrootpath<>'' then
-        begin
-          LinkRes.Add('-syslibroot');
-          LinkRes.Add(sysrootpath);
-        end;
+    function tlinkerdarwin.GetLinkVersion: TCmdStr;
+      begin
+        if MacOSXVersionMin<>'' then
+          begin
+            result:='-macosx_version_min '+MacOSXVersionMin;
+          end
+        else if iPhoneOSVersionMin<>'' then
+          begin
+            result:='-iphoneos_version_min '+iPhoneOSVersionMin;
+          end
+        else
+          begin
+            result:='';
+          end;
+      end;
+
 
 
-      LinkRes.Add('-arch');
-      case target_info.system of
-        system_powerpc_darwin:
-          LinkRes.Add('ppc');
-        system_i386_darwin,
-        system_i386_iphonesim:
-          LinkRes.Add('i386');
-        system_powerpc64_darwin:
-          LinkRes.Add('ppc64');
-        system_x86_64_darwin,
-        system_x86_64_iphonesim:
-          LinkRes.Add('x86_64');
-        system_arm_ios:
-          { current versions of the linker require the sub-architecture type
-            to be specified }
-          LinkRes.Add(lower(cputypestr[current_settings.cputype]));
-        system_aarch64_ios,
-        system_aarch64_darwin:
-          LinkRes.Add('arm64');
+    function tlinkerdarwin.GetSysroot: TCmdStr;
+      begin
+        if sysrootpath<>'' then
+          begin
+            result:='-syslibroot '+maybequoted(sysrootpath);
+          end
         else
         else
-          internalerror(2014121801);
+          begin
+            result:='';
+          end;
       end;
       end;
-      if MacOSXVersionMin<>'' then
-        begin
-          LinkRes.Add('-macosx_version_min');
-          LinkRes.Add(MacOSXVersionMin);
-        end
-      else if iPhoneOSVersionMin<>'' then
-        begin
-          LinkRes.Add('-iphoneos_version_min');
-          LinkRes.Add(iPhoneOSVersionMin);
-        end;
 
 
-      { Write path to search libraries }
-      HPath:=TCmdStrListItem(current_module.locallibrarysearchpath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-L'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
-      HPath:=TCmdStrListItem(LibrarySearchPath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-L'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
 
 
-      HPath:=TCmdStrListItem(current_module.localframeworksearchpath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-F'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
-      HPath:=TCmdStrListItem(FrameworkSearchPath.First);
-      while assigned(HPath) do
-       begin
-         LinkRes.Add('-F'+HPath.Str);
-         HPath:=TCmdStrListItem(HPath.Next);
-       end;
+    function tlinkerdarwin.GetLibSearchPath: TCmdStr;
+      var
+        HPath: TCmdStrListItem;
+      begin
+        result:='';
+        HPath:=TCmdStrListItem(current_module.locallibrarysearchpath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-L'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+        HPath:=TCmdStrListItem(LibrarySearchPath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-L'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+
+        HPath:=TCmdStrListItem(current_module.localframeworksearchpath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-F'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+        HPath:=TCmdStrListItem(FrameworkSearchPath.First);
+        while assigned(HPath) do
+         begin
+           result:=result+' '+maybequoted('-F'+HPath.Str);
+           HPath:=TCmdStrListItem(HPath.Next);
+         end;
+      end;
+
+
+    function tlinkerdarwin.GetLibraries: TCmdStr;
+      var
+        s: TCmdStr;
+        i: longint;
+      begin
+        result:='';
+        while not SharedLibFiles.Empty do
+          begin
+            s:=SharedLibFiles.GetFirst;
+            if (s<>'c') or ReOrderEntries then
+              begin
+                i:=Pos(target_info.sharedlibext,s);
+                if i>0 then
+                  Delete(s,i,length(s));
+                result:=result+' '+maybequoted('-l'+s);
+              end;
+           { be sure that libc is the last lib }
+           if not ReOrderEntries then
+             begin
+               result:=result+' -lc'
+             end;
+         end;
+
+        while not FrameworkFiles.empty do
+          begin
+            result:=result+' -framework '+maybequoted(FrameworkFiles.GetFirst);
+          end;
+      end;
 
 
-      { main objectfiles }
-      LinkFilesFileName:=UniqueName('linkfiles')+'.res';
-      FilesList:=TLinkRes.Create(outputexedir+LinkFilesFileName,false);
+
+    Function tlinkerdarwin.WriteFileList: TCmdStr;
+    Var
+      FilesList    : TScript;
+      s            : TCmdStr;
+    begin
+      if ReOrderEntries Then
+         ExpandAndApplyOrder(SharedLibFiles);
+
+      { main objectfiles and static libraries: in filelist file to avoid overflowing command line limit }
+      result:=UniqueName(outputexedir+'linkfiles')+'.res';
+      FilesList:=TScript.Create(result);
       while not ObjectFiles.Empty do
       while not ObjectFiles.Empty do
         begin
         begin
           s:=ObjectFiles.GetFirst;
           s:=ObjectFiles.GetFirst;
@@ -406,46 +456,15 @@ implementation
               s:=TargetFixFileName(s);
               s:=TargetFixFileName(s);
               FilesList.Add(s);
               FilesList.Add(s);
             end;
             end;
-        end;
-      FilesList.writetodisk;
-      FilesList.Free;
-
-      { Write staticlibraries }
-      while not StaticLibFiles.Empty do
-        begin
-          S:=StaticLibFiles.GetFirst;
-          LinkRes.AddFileName(s)
-        end;
-
-      { Write sharedlibraries like -l<lib> }
-      while not SharedLibFiles.Empty do
-        begin
-          S:=SharedLibFiles.GetFirst;
-          if (s<>'c') or ReOrderEntries then
+          { Write staticlibraries }
+          while not StaticLibFiles.Empty do
             begin
             begin
-              i:=Pos(target_info.sharedlibext,S);
-              if i>0 then
-                Delete(S,i,255);
-              LinkRes.Add('-l'+s);
+              s:=StaticLibFiles.GetFirst;
+              FilesList.Add(s)
             end;
             end;
-         { be sure that libc is the last lib }
-         if not ReOrderEntries then
-           begin
-             LinkRes.Add('-lc')
-           end;
-       end;
-
-      while not FrameworkFiles.empty do
-        begin
-          LinkRes.Add('-framework');
-          LinkRes.Add(FrameworkFiles.GetFirst);
         end;
         end;
-
-    { Write and Close response }
-      linkres.writetodisk;
-      linkres.Free;
-
-      WriteResponseFile:=True;
+      FilesList.writetodisk;
+      FilesList.Free;
     end;
     end;
 
 
 
 
@@ -455,16 +474,14 @@ implementation
       cmdstr,
       cmdstr,
       mapstr,
       mapstr,
       targetstr,
       targetstr,
-      emulstr,
       extdbgbinstr,
       extdbgbinstr,
       extdbgcmdstr,
       extdbgcmdstr,
       ltostr,
       ltostr,
-      ordersymfile: TCmdStr;
-      linkscript: TAsmScript;
-      DynLinkStr : string[60];
+      ordersymfile,
+      linkfiles: TCmdStr;
       GCSectionsStr,
       GCSectionsStr,
       StaticStr,
       StaticStr,
-      StripStr   : string[63];
+      StripStr   : TCmdStr;
       success : boolean;
       success : boolean;
     begin
     begin
       if not(cs_link_nolink in current_settings.globalswitches) then
       if not(cs_link_nolink in current_settings.globalswitches) then
@@ -473,13 +490,11 @@ implementation
     { Create some replacements }
     { Create some replacements }
       StaticStr:='';
       StaticStr:='';
       StripStr:='';
       StripStr:='';
-      DynLinkStr:='';
       GCSectionsStr:='';
       GCSectionsStr:='';
-      linkscript:=nil;
       mapstr:='';
       mapstr:='';
       targetstr:='';
       targetstr:='';
-      emulstr:='';
       ltostr:='';
       ltostr:='';
+
       if (cs_link_map in current_settings.globalswitches) then
       if (cs_link_map in current_settings.globalswitches) then
         mapstr:='-map '+maybequoted(ChangeFileExt(current_module.exefilename,'.map'));
         mapstr:='-map '+maybequoted(ChangeFileExt(current_module.exefilename,'.map'));
 
 
@@ -491,11 +506,6 @@ implementation
       if (cs_link_smart in current_settings.globalswitches) then
       if (cs_link_smart in current_settings.globalswitches) then
         GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
         GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
 
 
-      if CShared Then
-       begin
-         DynLinKStr:=DynLinkStr+' -dynamic'; // one dash!
-       end;
-
       { add custom LTO library if using custom clang }
       { add custom LTO library if using custom clang }
       if (cs_lto in current_settings.moduleswitches) and
       if (cs_lto in current_settings.moduleswitches) and
          not(cs_link_on_target in current_settings.globalswitches) and
          not(cs_link_on_target in current_settings.globalswitches) and
@@ -505,10 +515,10 @@ implementation
           ltostr:='-lto_library '+maybequoted(utilsdirectory+'/../lib/libLTO.dylib');
           ltostr:='-lto_library '+maybequoted(utilsdirectory+'/../lib/libLTO.dylib');
         end;
         end;
 
 
-    { Write used files and libraries }
-      WriteResponseFile(false);
+      { Write list of files to link }
+      linkfiles:=WriteFileList;
 
 
-    { Write symbol order file }
+      { Write symbol order file }
       ordersymfile:=WriteSymbolOrderFile;
       ordersymfile:=WriteSymbolOrderFile;
 
 
     { Call linker }
     { Call linker }
@@ -516,9 +526,7 @@ implementation
       Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
       Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
       Replace(cmdstr,'$OPT',Info.ExtraOptions);
       Replace(cmdstr,'$OPT',Info.ExtraOptions);
       Replace(cmdstr,'$TARGET',targetstr);
       Replace(cmdstr,'$TARGET',targetstr);
-      Replace(cmdstr,'$EMUL',EmulStr);
       Replace(cmdstr,'$MAP',mapstr);
       Replace(cmdstr,'$MAP',mapstr);
-      Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
       Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
       Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
       Replace(cmdstr,'$LTO',ltostr);
       Replace(cmdstr,'$LTO',ltostr);
       if ordersymfile<>'' then
       if ordersymfile<>'' then
@@ -526,12 +534,16 @@ implementation
       else
       else
         Replace(cmdstr,'$ORDERSYMS','');
         Replace(cmdstr,'$ORDERSYMS','');
 
 
-      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+LinkFilesFileName));
       Replace(cmdstr,'$STATIC',StaticStr);
       Replace(cmdstr,'$STATIC',StaticStr);
       Replace(cmdstr,'$STRIP',StripStr);
       Replace(cmdstr,'$STRIP',StripStr);
       Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
       Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
-      Replace(cmdstr,'$DYNLINK',DynLinkStr);
       Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(false));
       Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(false));
+      Replace(cmdstr,'$ARCH', GetLinkArch);
+      Replace(cmdstr,'$VERSION',GetLinkVersion);
+      Replace(cmdstr,'$SYSROOT',GetSysroot);
+      Replace(cmdstr,'$LIBSEARCHPATH',GetLibSearchPath);
+      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(linkfiles));
+      Replace(cmdstr,'$LIBRARIES',GetLibraries);
       BinStr:=FindUtil(utilsprefix+BinStr);
       BinStr:=FindUtil(utilsprefix+BinStr);
 
 
       { create dsym file? }
       { create dsym file? }
@@ -544,28 +556,11 @@ implementation
           extdbgcmdstr:=maybequoted(current_module.exefilename);
           extdbgcmdstr:=maybequoted(current_module.exefilename);
         end;
         end;
 
 
-      if not(cs_link_nolink in current_settings.globalswitches) then
-        begin
-          { we have to use a script to use the IFS hack }
-          linkscript:=GenerateScript(outputexedir+'ppaslink');
-          linkscript.AddLinkCommand(BinStr,CmdStr,'');
-          if (extdbgcmdstr<>'') then
-            linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
-          linkscript.WriteToDisk;
-          BinStr:=linkscript.fn;
-          if not path_absolute(BinStr) then
-            if cs_link_on_target in current_settings.globalswitches then
-              BinStr:='.'+target_info.dirsep+BinStr
-            else
-              BinStr:='.'+source_info.dirsep+BinStr;
-          CmdStr:='';
-        end;
-
-      success:=DoExec(BinStr,CmdStr,true,true);
+      success:=DoExec(BinStr,CmdStr,true,false);
       if (success and
       if (success and
           (extdbgbinstr<>'') and
           (extdbgbinstr<>'') and
           (cs_link_nolink in current_settings.globalswitches)) then
           (cs_link_nolink in current_settings.globalswitches)) then
-        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,true);
+        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,false);
 
 
     { Remove ReponseFile }
     { Remove ReponseFile }
       if (success) and not(cs_link_nolink in current_settings.globalswitches) then
       if (success) and not(cs_link_nolink in current_settings.globalswitches) then
@@ -573,9 +568,7 @@ implementation
          DeleteFile(outputexedir+Info.ResName);
          DeleteFile(outputexedir+Info.ResName);
          if ordersymfile<>'' then
          if ordersymfile<>'' then
            DeleteFile(ordersymfile);
            DeleteFile(ordersymfile);
-         DeleteFile(linkscript.fn);
-         linkscript.free;
-         DeleteFile(outputexedir+LinkFilesFileName);
+         DeleteFile(linkfiles);
        end;
        end;
 
 
       MakeExecutable:=success;   { otherwise a recursive call to link method }
       MakeExecutable:=success;   { otherwise a recursive call to link method }
@@ -586,18 +579,16 @@ implementation
     var
     var
       InitStr,
       InitStr,
       FiniStr,
       FiniStr,
-      SoNameStr : string[80];
-      linkscript: TAsmScript;
       binstr,
       binstr,
       cmdstr,
       cmdstr,
       mapstr,
       mapstr,
       ltostr,
       ltostr,
       ordersymfile,
       ordersymfile,
       targetstr,
       targetstr,
-      emulstr,
       extdbgbinstr,
       extdbgbinstr,
-      extdbgcmdstr  : TCmdStr;
-      GCSectionsStr : string[63];
+      extdbgcmdstr,
+      linkfiles,
+      GCSectionsStr : TCmdStr;
       exportedsyms: text;
       exportedsyms: text;
       success : boolean;
       success : boolean;
     begin
     begin
@@ -605,21 +596,20 @@ implementation
       GCSectionsStr:='';
       GCSectionsStr:='';
       mapstr:='';
       mapstr:='';
       ltostr:='';
       ltostr:='';
-      linkscript:=nil;
       if not(cs_link_nolink in current_settings.globalswitches) then
       if not(cs_link_nolink in current_settings.globalswitches) then
        Message1(exec_i_linking,current_module.sharedlibfilename);
        Message1(exec_i_linking,current_module.sharedlibfilename);
 
 
-    { Write used files and libraries }
-      WriteResponseFile(true);
+      { Write list of files to link }
+      linkfiles:=WriteFileList;
 
 
-    { Write symbol order file }
+      { Write symbol order file }
       ordersymfile:=WriteSymbolOrderFile;
       ordersymfile:=WriteSymbolOrderFile;
 
 
       if (cs_link_smart in current_settings.globalswitches) then
       if (cs_link_smart in current_settings.globalswitches) then
         GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
         GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
 
 
       if (cs_link_map in current_settings.globalswitches) then
       if (cs_link_map in current_settings.globalswitches) then
-        mapstr:='-Map '+maybequoted(ChangeFileExt(current_module.sharedlibfilename,'.map'));
+        mapstr:='-map '+maybequoted(ChangeFileExt(current_module.sharedlibfilename,'.map'));
 
 
       { add custom LTO library if using custom clang }
       { add custom LTO library if using custom clang }
       if (cs_lto in current_settings.moduleswitches) and
       if (cs_lto in current_settings.moduleswitches) and
@@ -631,25 +621,19 @@ implementation
         end;
         end;
 
 
       targetstr:='';
       targetstr:='';
-      emulstr:='';
 
 
       InitStr:='-init FPC_LIB_START';
       InitStr:='-init FPC_LIB_START';
       FiniStr:='-fini FPC_LIB_EXIT';
       FiniStr:='-fini FPC_LIB_EXIT';
-      SoNameStr:='-soname '+ExtractFileName(current_module.sharedlibfilename);
 
 
       { Call linker }
       { Call linker }
       SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
       SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
       Replace(cmdstr,'$EXE',maybequoted(ExpandFileName(current_module.sharedlibfilename)));
       Replace(cmdstr,'$EXE',maybequoted(ExpandFileName(current_module.sharedlibfilename)));
       Replace(cmdstr,'$OPT',Info.ExtraOptions);
       Replace(cmdstr,'$OPT',Info.ExtraOptions);
       Replace(cmdstr,'$TARGET',targetstr);
       Replace(cmdstr,'$TARGET',targetstr);
-      Replace(cmdstr,'$EMUL',EmulStr);
-      Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
-      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+LinkFilesFileName));
       Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
       Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
       Replace(cmdstr,'$INIT',InitStr);
       Replace(cmdstr,'$INIT',InitStr);
       Replace(cmdstr,'$FINI',FiniStr);
       Replace(cmdstr,'$FINI',FiniStr);
       Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
       Replace(cmdstr,'$GCSECTIONS',GCSectionsStr);
-      Replace(cmdstr,'$SONAME',SoNameStr);
       Replace(cmdstr,'$MAP',mapstr);
       Replace(cmdstr,'$MAP',mapstr);
       Replace(cmdstr,'$LTO',ltostr);
       Replace(cmdstr,'$LTO',ltostr);
       if ordersymfile<>'' then
       if ordersymfile<>'' then
@@ -657,6 +641,12 @@ implementation
       else
       else
         Replace(cmdstr,'$ORDERSYMS','');
         Replace(cmdstr,'$ORDERSYMS','');
       Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(true));
       Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(true));
+      Replace(cmdstr,'$ARCH', GetLinkArch);
+      Replace(cmdstr,'$VERSION',GetLinkVersion);
+      Replace(cmdstr,'$SYSROOT',GetSysroot);
+      Replace(cmdstr,'$LIBSEARCHPATH',GetLibSearchPath);
+      Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(linkfiles));
+      Replace(cmdstr,'$LIBRARIES',GetLibraries);
       BinStr:=FindUtil(utilsprefix+BinStr);
       BinStr:=FindUtil(utilsprefix+BinStr);
 
 
       { create dsym file? }
       { create dsym file? }
@@ -679,31 +669,14 @@ implementation
             writeln(exportedsyms,texportlibunix(exportlib).exportedsymnames.getfirst);
             writeln(exportedsyms,texportlibunix(exportlib).exportedsymnames.getfirst);
           until texportlibunix(exportlib).exportedsymnames.empty;
           until texportlibunix(exportlib).exportedsymnames.empty;
           close(exportedsyms);
           close(exportedsyms);
-          cmdstr:=cmdstr+' -exported_symbols_list '+maybequoted(outputexedir)+LinkSymsFileName;
+          cmdstr:=cmdstr+' -exported_symbols_list '+maybequoted(outputexedir+LinkSymsFileName);
         end;
         end;
 
 
-      if not(cs_link_nolink in current_settings.globalswitches) then
-        begin
-          { we have to use a script to use the IFS hack }
-          linkscript:=GenerateScript(outputexedir+'ppaslink');
-          linkscript.AddLinkCommand(BinStr,CmdStr,'');
-          if (extdbgbinstr<>'') then
-            linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
-          linkscript.WriteToDisk;
-          BinStr:=linkscript.fn;
-          if not path_absolute(BinStr) then
-            if cs_link_on_target in current_settings.globalswitches then
-              BinStr:='.'+target_info.dirsep+BinStr
-            else
-              BinStr:='.'+source_info.dirsep+BinStr;
-          CmdStr:='';
-        end;
-
-      success:=DoExec(BinStr,cmdstr,true,true);
+      success:=DoExec(BinStr,cmdstr,true,false);
       if (success and
       if (success and
           (extdbgbinstr<>'') and
           (extdbgbinstr<>'') and
           (cs_link_nolink in current_settings.globalswitches)) then
           (cs_link_nolink in current_settings.globalswitches)) then
-        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,true);
+        success:=DoExec(extdbgbinstr,extdbgcmdstr,false,false);
 
 
     { Strip the library ? }
     { Strip the library ? }
       if success and (cs_link_strip in current_settings.globalswitches) then
       if success and (cs_link_strip in current_settings.globalswitches) then
@@ -713,17 +686,15 @@ implementation
          success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,false,false);
          success:=DoExec(FindUtil(utilsprefix+binstr),cmdstr,false,false);
        end;
        end;
 
 
-    { Remove ReponseFile }
+    { Remove temporary files }
       if (success) and not(cs_link_nolink in current_settings.globalswitches) then
       if (success) and not(cs_link_nolink in current_settings.globalswitches) then
         begin
         begin
           DeleteFile(outputexedir+Info.ResName);
           DeleteFile(outputexedir+Info.ResName);
           if ordersymfile<>'' then
           if ordersymfile<>'' then
             DeleteFile(ordersymfile);
             DeleteFile(ordersymfile);
-          DeleteFile(linkscript.fn);
-          linkscript.free;
            if LinkSymsFileName<>'' then
            if LinkSymsFileName<>'' then
              DeleteFile(outputexedir+LinkSymsFileName);
              DeleteFile(outputexedir+LinkSymsFileName);
-           DeleteFile(outputexedir+LinkFilesFileName);
+           DeleteFile(linkfiles);
         end;
         end;
 
 
       MakeSharedLibrary:=success;   { otherwise a recursive call to link method }
       MakeSharedLibrary:=success;   { otherwise a recursive call to link method }