|
@@ -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
|