浏览代码

* fix cross-compiling from i386/linux

git-svn-id: trunk@5186 -
micha 19 年之前
父节点
当前提交
12e8645889
共有 4 个文件被更改,包括 26 次插入67 次删除
  1. 0 3
      compiler/fpcdefs.inc
  2. 2 0
      compiler/globals.pas
  3. 5 5
      compiler/pmodules.pas
  4. 19 59
      compiler/systems/t_linux.pas

+ 0 - 3
compiler/fpcdefs.inc

@@ -45,9 +45,6 @@
   {$define SUPPORT_MMX}
   {$define cpumm}
   {$define fewintregisters}
-  {$ifdef linux}
-    {$define has_internal_sysinit}
-  {$endif}
 {$endif i386}
 
 {$ifdef x86_64}

+ 2 - 0
compiler/globals.pas

@@ -68,6 +68,8 @@ interface
        macmodeswitches : tmodeswitches=
          [m_mac,m_all,m_result,m_cvar_support,m_mac_procvar];
 
+       internal_sysinit_systems = [system_i386_linux];
+
        { maximum nesting of routines }
        maxnesting = 32;
 

+ 5 - 5
compiler/pmodules.pas

@@ -1395,12 +1395,12 @@ implementation
          { do we need to add the variants unit? }
          maybeloadvariantsunit;
 
-{$ifdef has_internal_sysinit}
          linker.initsysinitunitname;
-
-         { add start/halt unit }
-         AddUnit('si_'+linker.sysinitunit);
-{$endif}         
+         if target_info.system in internal_sysinit_systems then
+         begin
+           { add start/halt unit }
+           AddUnit('si_'+linker.sysinitunit);
+         end;
 
 {$ifdef arm}
          { Insert .pdata section for arm-wince.

+ 19 - 59
compiler/systems/t_linux.pas

@@ -45,17 +45,16 @@ interface
     tlinkerlinux=class(texternallinker)
     private
       libctype:(libc5,glibc2,glibc21,uclibc);
-{$ifdef has_internal_sysinit}      
+      cprtobj,
+      gprtobj,
+      prtobj  : string[80];
       reorder : boolean;
       linklibc: boolean;
-{$endif}      
       Function  WriteResponseFile(isdll:boolean) : Boolean;
     public
       constructor Create;override;
       procedure SetDefaultInfo;override;
-{$ifdef has_internal_sysinit}      
       procedure InitSysInitUnitName;override;
-{$endif}      
       function  MakeExecutable:boolean;override;
       function  MakeSharedLibrary:boolean;override;
       function  postprocessexecutable(const fn : string;isdll:boolean):boolean;
@@ -314,8 +313,6 @@ Begin
          end;
 End;
 
-{$ifdef has_internal_sysinit}      
-
 Procedure TLinkerLinux.InitSysInitUnitName;
 var
   csysinitunit,
@@ -335,51 +332,56 @@ begin
      sysinitunit:='dll';
      csysinitunit:='dll';
      gsysinitunit:='dll';
+     prtobj:='dllprt0';
+     cprtobj:='dllprt0';
+     gprtobj:='dllprt0';
    end
   else
    begin
+     prtobj:='prt0';
      sysinitunit:='prc';
      case libctype of
        glibc21:
          begin
+           cprtobj:='cprt21';
+           gprtobj:='gprt21';
            csysinitunit:='c21';
            gsysinitunit:='c21g';
          end;
        uclibc:
          begin
+           cprtobj:='ucprt0';
+           gprtobj:='ugprt0';
            csysinitunit:='uc';
            gsysinitunit:='ucg';
          end
        else
+         cprtobj:='cprt0';
+         gprtobj:='gprt0';
          csysinitunit:='c';
          gsysinitunit:='g';
      end;
    end;
   if cs_profile in current_settings.moduleswitches then
    begin
+     prtobj:=gprtobj;
      sysinitunit:=gsysinitunit;
      linklibc:=true;
    end
   else
    begin
      if linklibc then
-      sysinitunit:=csysinitunit;
+      begin
+       prtobj:=cprtobj;
+       sysinitunit:=csysinitunit;
+      end;
    end;
 end;
 
-{$endif}
-
 Function TLinkerLinux.WriteResponseFile(isdll:boolean) : Boolean;
 Var
   linkres      : TLinkRes;
   i            : longint;
-{$ifndef has_internal_sysinit}  
-  cprtobj,
-  gprtobj,
-  prtobj       : string[80];
-  reorder,
-  linklibc     : boolean;
-{$endif}
   HPath        : TStringListItem;
   s,s1,s2      : string;
   found1,
@@ -387,51 +389,11 @@ Var
 begin
   result:=False;
 { set special options for some targets }
-{$ifndef has_internal_sysinit}
-  linklibc:=(SharedLibFiles.Find('c')<>nil);
-  reorder := linklibc and ReOrderEntries;
-  if isdll then
-   begin
-     prtobj:='dllprt0';
-     cprtobj:='dllprt0';
-     gprtobj:='dllprt0';
-   end
-  else
-   begin
-     prtobj:='prt0';
-     case libctype of
-       glibc21:
-         begin
-           cprtobj:='cprt21';
-           gprtobj:='gprt21';
-         end;
-       uclibc:
-         begin
-           cprtobj:='ucprt0';
-           gprtobj:='ugprt0';
-         end
-       else
-         cprtobj:='cprt0';
-         gprtobj:='gprt0';
-     end;
-   end;
-{$endif}   
   if cs_profile in current_settings.moduleswitches then
    begin
-{$ifndef has_internal_sysinit}
-     prtobj:=gprtobj;
-{$endif}     
      if not(libctype in [glibc2,glibc21]) then
        AddSharedLibrary('gmon');
      AddSharedLibrary('c');
-     linklibc:=true;
-   end
-  else
-   begin
-{$ifndef has_internal_sysinit}   
-     if linklibc then
-      prtobj:=cprtobj;
-{$endif}     
    end;
 
   { Open link.res file }
@@ -453,11 +415,9 @@ begin
        end;
 
       StartSection('INPUT(');
-{$ifndef has_internal_sysinit}
       { add objectfiles, start with prt0 always }
-      if prtobj<>'' then
+      if not (target_info.system in internal_sysinit_systems) and (prtobj<>'') then
        AddFileName(maybequoted(FindObjectFile(prtobj,'',false)));
-{$endif}
       { try to add crti and crtbegin if linking to C }
       if linklibc then
        begin