|
@@ -40,10 +40,6 @@ implementation
|
|
cgutils,cgbase,cgobj,cpuinfo,ogbase;
|
|
cgutils,cgbase,cgobj,cpuinfo,ogbase;
|
|
|
|
|
|
type
|
|
type
|
|
- timportlibdarwin=class(timportlib)
|
|
|
|
- procedure generatelib;override;
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
timportlibbsd=class(timportlib)
|
|
timportlibbsd=class(timportlib)
|
|
procedure generatelib;override;
|
|
procedure generatelib;override;
|
|
end;
|
|
end;
|
|
@@ -51,11 +47,6 @@ implementation
|
|
texportlibbsd=class(texportlibunix)
|
|
texportlibbsd=class(texportlibunix)
|
|
end;
|
|
end;
|
|
|
|
|
|
- texportlibdarwin=class(texportlibbsd)
|
|
|
|
- procedure setinitname(list: TAsmList; const s: string); override;
|
|
|
|
- procedure setfininame(list: TAsmList; const s: string); override;
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
tlinkerbsd=class(texternallinker)
|
|
tlinkerbsd=class(texternallinker)
|
|
private
|
|
private
|
|
LdSupportsNoResponseFile : boolean;
|
|
LdSupportsNoResponseFile : boolean;
|
|
@@ -64,8 +55,6 @@ implementation
|
|
ReOrder : Boolean;
|
|
ReOrder : Boolean;
|
|
linklibc : boolean;
|
|
linklibc : boolean;
|
|
Function WriteResponseFile(isdll:boolean) : Boolean;
|
|
Function WriteResponseFile(isdll:boolean) : Boolean;
|
|
- function GetDarwinCrt1ObjName(isdll: boolean): TCmdStr;
|
|
|
|
- Function GetDarwinPrtobjName(isdll: boolean): TCmdStr;
|
|
|
|
public
|
|
public
|
|
constructor Create;override;
|
|
constructor Create;override;
|
|
procedure SetDefaultInfo;override;
|
|
procedure SetDefaultInfo;override;
|
|
@@ -98,33 +87,6 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-{*****************************************************************************
|
|
|
|
- TIMPORTLIBDARWIN
|
|
|
|
-*****************************************************************************}
|
|
|
|
-
|
|
|
|
- procedure timportlibdarwin.generatelib;
|
|
|
|
- begin
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-{*****************************************************************************
|
|
|
|
- TEXPORTLIBDARWIN
|
|
|
|
-*****************************************************************************}
|
|
|
|
-
|
|
|
|
- procedure texportlibdarwin.setinitname(list: TAsmList; const s: string);
|
|
|
|
- begin
|
|
|
|
- new_section(list,sec_init_func,'',sizeof(pint));
|
|
|
|
- list.concat(Tai_const.Createname(s,0));
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- procedure texportlibdarwin.setfininame(list: TAsmList; const s: string);
|
|
|
|
- begin
|
|
|
|
- new_section(list,sec_term_func,'',sizeof(pint));
|
|
|
|
- list.concat(Tai_const.Createname(s,0));
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
{*****************************************************************************
|
|
{*****************************************************************************
|
|
TIMPORTLIBBSD
|
|
TIMPORTLIBBSD
|
|
*****************************************************************************}
|
|
*****************************************************************************}
|
|
@@ -150,10 +112,7 @@ Constructor TLinkerBSD.Create;
|
|
begin
|
|
begin
|
|
Inherited Create;
|
|
Inherited Create;
|
|
if not Dontlinkstdlibpath Then
|
|
if not Dontlinkstdlibpath Then
|
|
- if target_info.system in systems_darwin then
|
|
|
|
- { Mac OS X doesn't have a /lib }
|
|
|
|
- LibrarySearchPath.AddLibraryPath(sysrootpath,'=/usr/lib',true)
|
|
|
|
- else if target_info.system in systems_openbsd then
|
|
|
|
|
|
+ if target_info.system in systems_openbsd then
|
|
LibrarySearchPath.AddLibraryPath(sysrootpath,'=/usr/lib;=$OPENBSD_X11BASE/lib;=$OPENBSD_LOCALBASE/lib',true)
|
|
LibrarySearchPath.AddLibraryPath(sysrootpath,'=/usr/lib;=$OPENBSD_X11BASE/lib;=$OPENBSD_LOCALBASE/lib',true)
|
|
else
|
|
else
|
|
LibrarySearchPath.AddLibraryPath(sysrootpath,'=/lib;=/usr/lib;=/usr/X11R6/lib',true);
|
|
LibrarySearchPath.AddLibraryPath(sysrootpath,'=/lib;=/usr/lib;=/usr/X11R6/lib',true);
|
|
@@ -175,49 +134,15 @@ begin
|
|
begin
|
|
begin
|
|
if LdSupportsNoResponseFile then
|
|
if LdSupportsNoResponseFile then
|
|
begin
|
|
begin
|
|
- if not(target_info.system in systems_darwin) then
|
|
|
|
- begin
|
|
|
|
- ExeCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -L. -o $EXE $CATRES $FILELIST';
|
|
|
|
- DllCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $MAP -shared -L. -o $EXE $CATRES $FILELIST'
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
-{$ifndef cpu64bitaddr}
|
|
|
|
- { Set the size of the page at address zero to 64kb, so nothing
|
|
|
|
- is loaded below that address. This avoids problems with the
|
|
|
|
- strange Windows-compatible resource handling that assumes
|
|
|
|
- that addresses below 64kb do not exist.
|
|
|
|
-
|
|
|
|
- On 64bit systems, page zero is 4GB by default, so no problems
|
|
|
|
- there.
|
|
|
|
- }
|
|
|
|
- { In case of valgrind, don't do that, because it cannot deal with
|
|
|
|
- a custom pagezero size -- in general, this should not cause any
|
|
|
|
- problems because the resources are added at the end and most
|
|
|
|
- programs with problems that require Valgrind will have more
|
|
|
|
- than 60KB of data (first 4KB of address space is always invalid)
|
|
|
|
- }
|
|
|
|
- ExeCmd[1]:=LdProgram+' $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
|
|
|
|
- if not(cs_gdb_valgrind in current_settings.globalswitches) then
|
|
|
|
- ExeCmd[1]:=ExeCmd[1]+' -pagezero_size 0x10000';
|
|
|
|
-{$else ndef cpu64bitaddr}
|
|
|
|
- ExeCmd[1]:=LdProgram+' $PRTOBJ $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST';
|
|
|
|
-{$endif ndef cpu64bitaddr}
|
|
|
|
- if (apptype<>app_bundle) then
|
|
|
|
- DllCmd[1]:=LdProgram+' $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP -dynamic -dylib -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
|
|
|
|
- else
|
|
|
|
- DllCmd[1]:=LdProgram+' $PRTOBJ $TARGET $EMUL $OPT $GCSECTIONS $MAP -dynamic -bundle -multiply_defined suppress -L. -o $EXE $CATRES $FILELIST'
|
|
|
|
- end
|
|
|
|
|
|
+ ExeCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $LTO $ORDERSYMS -L. -o $EXE $CATRES $FILELIST';
|
|
|
|
+ DllCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $MAP $LTO $ORDERSYMS -shared -L. -o $EXE $CATRES $FILELIST'
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
- ExeCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP -L. -o $EXE $RES';
|
|
|
|
- DllCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $INIT $FINI $SONAME $MAP -shared -L. -o $EXE $RES';
|
|
|
|
|
|
+ ExeCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $DYNLINK $STATIC $GCSECTIONS $STRIP $MAP $ORDERSYMS -L. -o $EXE $RES';
|
|
|
|
+ DllCmd[1]:=LdProgram+' $TARGET $EMUL $OPT $INIT $FINI $SONAME $MAP $ORDERSYMS -shared -L. -o $EXE $RES';
|
|
end;
|
|
end;
|
|
- if not(target_info.system in systems_darwin) then
|
|
|
|
- DllCmd[2]:='strip --strip-unneeded $EXE'
|
|
|
|
- else
|
|
|
|
- DllCmd[2]:='strip -x $EXE';
|
|
|
|
|
|
+ DllCmd[2]:='strip --strip-unneeded $EXE';
|
|
{ OpenBSD seems to use a wrong dynamic linker by default }
|
|
{ OpenBSD seems to use a wrong dynamic linker by default }
|
|
if target_info.system in systems_openbsd then
|
|
if target_info.system in systems_openbsd then
|
|
DynamicLinker:='/usr/libexec/ld.so'
|
|
DynamicLinker:='/usr/libexec/ld.so'
|
|
@@ -234,26 +159,18 @@ procedure TLinkerBSD.LoadPredefinedLibraryOrder;
|
|
// put your linkorder/linkalias overrides here.
|
|
// put your linkorder/linkalias overrides here.
|
|
// Note: assumes only called when reordering/aliasing is used.
|
|
// Note: assumes only called when reordering/aliasing is used.
|
|
Begin
|
|
Begin
|
|
- if not(target_info.system in systems_darwin) then
|
|
|
|
- begin
|
|
|
|
- if (target_info.system =system_i386_freebsd) and
|
|
|
|
- not (cs_link_no_default_lib_order in current_settings.globalswitches) Then
|
|
|
|
- Begin
|
|
|
|
- LinkLibraryOrder.add('gcc','',15);
|
|
|
|
- LinkLibraryOrder.add('c','',50); // c and c_p mutual. excl?
|
|
|
|
- LinkLibraryOrder.add('c_p','',55);
|
|
|
|
- LinkLibraryOrder.add('pthread','',75); // pthread and c_r should be mutually exclusive
|
|
|
|
- LinkLibraryOrder.add('c_r','',76);
|
|
|
|
- LinkLibraryOrder.add('kvm','',80); // must be before ncurses
|
|
|
|
- if (cs_link_pthread in current_settings.globalswitches) Then // convert libpthread to libc_r.
|
|
|
|
- LinkLibraryAliases.add('pthread','c_r');
|
|
|
|
- end;
|
|
|
|
- end
|
|
|
|
-else
|
|
|
|
- begin
|
|
|
|
- LinkLibraryOrder.add('gcc','',15);
|
|
|
|
- LinkLibraryOrder.add('c','',50);
|
|
|
|
- end;
|
|
|
|
|
|
+ if (target_info.system =system_i386_freebsd) and
|
|
|
|
+ not (cs_link_no_default_lib_order in current_settings.globalswitches) Then
|
|
|
|
+ Begin
|
|
|
|
+ LinkLibraryOrder.add('gcc','',15);
|
|
|
|
+ LinkLibraryOrder.add('c','',50); // c and c_p mutual. excl?
|
|
|
|
+ LinkLibraryOrder.add('c_p','',55);
|
|
|
|
+ LinkLibraryOrder.add('pthread','',75); // pthread and c_r should be mutually exclusive
|
|
|
|
+ LinkLibraryOrder.add('c_r','',76);
|
|
|
|
+ LinkLibraryOrder.add('kvm','',80); // must be before ncurses
|
|
|
|
+ if (cs_link_pthread in current_settings.globalswitches) Then // convert libpthread to libc_r.
|
|
|
|
+ LinkLibraryAliases.add('pthread','c_r');
|
|
|
|
+ end;
|
|
End;
|
|
End;
|
|
|
|
|
|
|
|
|
|
@@ -264,210 +181,50 @@ var
|
|
si_cprt,
|
|
si_cprt,
|
|
si_gprt : string[80];
|
|
si_gprt : string[80];
|
|
begin
|
|
begin
|
|
- if target_info.system in systems_darwin then
|
|
|
|
|
|
+ linklibc:=ModulesLinkToLibc;
|
|
|
|
+ if current_module.islibrary and
|
|
|
|
+ (target_info.system in systems_bsd) then
|
|
begin
|
|
begin
|
|
- { for darwin: always link dynamically against libc }
|
|
|
|
- linklibc := true;
|
|
|
|
- reorder:=reorderentries;
|
|
|
|
- prtobj:='';
|
|
|
|
- SysInitUnit:='sysinit';
|
|
|
|
|
|
+ prtobj:='dllprt0';
|
|
|
|
+ cprtobj:='dllprt0';
|
|
|
|
+ gprtobj:='dllprt0';
|
|
|
|
+ SysInitUnit:='si_dll';
|
|
|
|
+ si_cprt:='si_dll';
|
|
|
|
+ si_gprt:='si_dll';
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
- linklibc:=ModulesLinkToLibc;
|
|
|
|
- if current_module.islibrary and
|
|
|
|
- (target_info.system in systems_bsd) then
|
|
|
|
- begin
|
|
|
|
- prtobj:='dllprt0';
|
|
|
|
- cprtobj:='dllprt0';
|
|
|
|
- gprtobj:='dllprt0';
|
|
|
|
- SysInitUnit:='si_dll';
|
|
|
|
- si_cprt:='si_dll';
|
|
|
|
- si_gprt:='si_dll';
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- prtobj:='prt0';
|
|
|
|
- cprtobj:='cprt0';
|
|
|
|
- gprtobj:='gprt0';
|
|
|
|
- SysInitUnit:='si_prc';
|
|
|
|
- si_cprt:='si_c';
|
|
|
|
- si_gprt:='si_g';
|
|
|
|
- end;
|
|
|
|
- // this one is a bit complex.
|
|
|
|
- // Only reorder for now if -XL or -XO params are given
|
|
|
|
- // or when -Xf.
|
|
|
|
- reorder:= linklibc and
|
|
|
|
- (
|
|
|
|
- ReorderEntries
|
|
|
|
- or
|
|
|
|
- (cs_link_pthread in current_settings.globalswitches));
|
|
|
|
- if cs_profile in current_settings.moduleswitches then
|
|
|
|
- begin
|
|
|
|
- prtobj:=gprtobj;
|
|
|
|
- SysInitUnit:=si_gprt;
|
|
|
|
- AddSharedLibrary('c');
|
|
|
|
- LibrarySuffix:='p';
|
|
|
|
- linklibc:=true;
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- if linklibc then
|
|
|
|
- begin
|
|
|
|
- prtobj:=cprtobj;
|
|
|
|
- SysInitUnit:=si_cprt;
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
|
|
+ prtobj:='prt0';
|
|
|
|
+ cprtobj:='cprt0';
|
|
|
|
+ gprtobj:='gprt0';
|
|
|
|
+ SysInitUnit:='si_prc';
|
|
|
|
+ si_cprt:='si_c';
|
|
|
|
+ si_gprt:='si_g';
|
|
end;
|
|
end;
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-function TLinkerBSD.GetDarwinCrt1ObjName(isdll: boolean): TCmdStr;
|
|
|
|
-begin
|
|
|
|
- if not isdll then
|
|
|
|
- begin
|
|
|
|
- if not(cs_profile in current_settings.moduleswitches) then
|
|
|
|
- begin
|
|
|
|
- case target_info.system of
|
|
|
|
- system_powerpc_darwin,
|
|
|
|
- system_powerpc64_darwin,
|
|
|
|
- system_i386_darwin,
|
|
|
|
- system_x86_64_darwin:
|
|
|
|
- begin
|
|
|
|
- { 10.8 and later: no crt1.* }
|
|
|
|
- if CompareVersionStrings(MacOSXVersionMin,'10.8')>=0 then
|
|
|
|
- exit('');
|
|
|
|
- { x86: crt1.10.6.o -> crt1.10.5.o -> crt1.o }
|
|
|
|
- { others: crt1.10.5 -> crt1.o }
|
|
|
|
- if (target_info.system in [system_i386_darwin,system_x86_64_darwin]) and
|
|
|
|
- (CompareVersionStrings(MacOSXVersionMin,'10.6')>=0) then
|
|
|
|
- exit('crt1.10.6.o');
|
|
|
|
- if CompareVersionStrings(MacOSXVersionMin,'10.5')>=0 then
|
|
|
|
- exit('crt1.10.5.o');
|
|
|
|
- end;
|
|
|
|
- system_arm_darwin:
|
|
|
|
- begin
|
|
|
|
- { iOS:
|
|
|
|
- iOS 6 and later: nothing
|
|
|
|
- iOS 3.1 - 5.x: crt1.3.1.o
|
|
|
|
- pre-iOS 3.1: crt1.o
|
|
|
|
- }
|
|
|
|
- if (CompareVersionStrings(iPhoneOSVersionMin,'6.0')>=0) then
|
|
|
|
- exit('');
|
|
|
|
- if (CompareVersionStrings(iPhoneOSVersionMin,'3.1')>=0) then
|
|
|
|
- exit('crt1.3.1.o');
|
|
|
|
- end;
|
|
|
|
- system_i386_iphonesim,
|
|
|
|
- system_x86_64_iphonesim:
|
|
|
|
- begin
|
|
|
|
- { "recent versions" must not use anything (https://github.com/llvm-mirror/clang/commit/e6d04f3d152a22077022cf9287d4c538a0918ab0 )
|
|
|
|
- What those recent versions could be, is anyone's guess. It
|
|
|
|
- still seems to work with 8.1 and no longer with 8.3, so use
|
|
|
|
- 8.1 as a cut-off point }
|
|
|
|
- if (CompareVersionStrings(iPhoneOSVersionMin,'8.1')>0) then
|
|
|
|
- exit('');
|
|
|
|
- end;
|
|
|
|
- system_aarch64_darwin:
|
|
|
|
- { never anything }
|
|
|
|
- exit('');
|
|
|
|
- end;
|
|
|
|
- { nothing special -> default }
|
|
|
|
- result:='crt1.o';
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- result:='gcrt1.o';
|
|
|
|
- { 10.8 and later: tell the linker to use 'start' instead of "_main"
|
|
|
|
- as entry point }
|
|
|
|
- if CompareVersionStrings(MacOSXVersionMin,'10.8')>=0 then
|
|
|
|
- Info.ExeCmd[1]:=Info.ExeCmd[1]+' -no_new_main';
|
|
|
|
- end;
|
|
|
|
- end
|
|
|
|
|
|
+ // this one is a bit complex.
|
|
|
|
+ // Only reorder for now if -XL or -XO params are given
|
|
|
|
+ // or when -Xf.
|
|
|
|
+ reorder:= linklibc and
|
|
|
|
+ (
|
|
|
|
+ ReorderEntries
|
|
|
|
+ or
|
|
|
|
+ (cs_link_pthread in current_settings.globalswitches));
|
|
|
|
+ if cs_profile in current_settings.moduleswitches then
|
|
|
|
+ begin
|
|
|
|
+ prtobj:=gprtobj;
|
|
|
|
+ SysInitUnit:=si_gprt;
|
|
|
|
+ AddSharedLibrary('c');
|
|
|
|
+ LibrarySuffix:='p';
|
|
|
|
+ linklibc:=true;
|
|
|
|
+ end
|
|
else
|
|
else
|
|
- begin
|
|
|
|
- if (apptype=app_bundle) then
|
|
|
|
- begin
|
|
|
|
- case target_info.system of
|
|
|
|
- system_powerpc_darwin,
|
|
|
|
- system_powerpc64_darwin,
|
|
|
|
- system_i386_darwin,
|
|
|
|
- system_x86_64_darwin:
|
|
|
|
- begin
|
|
|
|
- { < 10.6: bundle1.o
|
|
|
|
- >= 10.6: nothing }
|
|
|
|
- if CompareVersionStrings(MacOSXVersionMin,'10.6')>=0 then
|
|
|
|
- exit('');
|
|
|
|
- end;
|
|
|
|
- system_arm_darwin,
|
|
|
|
- system_aarch64_darwin:
|
|
|
|
- begin
|
|
|
|
- { iOS: < 3.1: bundle1.o
|
|
|
|
- >= 3.1: nothing }
|
|
|
|
- if (CompareVersionStrings(iPhoneOSVersionMin,'3.1')>=0) then
|
|
|
|
- exit('');
|
|
|
|
- end;
|
|
|
|
- system_i386_iphonesim,
|
|
|
|
- system_x86_64_iphonesim:
|
|
|
|
- begin
|
|
|
|
- { see rule for crt1.o }
|
|
|
|
- if (CompareVersionStrings(iPhoneOSVersionMin,'8.1')>0) then
|
|
|
|
- exit('');
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
- result:='bundle1.o';
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- case target_info.system of
|
|
|
|
- system_powerpc_darwin,
|
|
|
|
- system_powerpc64_darwin,
|
|
|
|
- system_i386_darwin,
|
|
|
|
- system_x86_64_darwin:
|
|
|
|
- begin
|
|
|
|
- { >= 10.6: nothing
|
|
|
|
- = 10.5: dylib1.10.5.o
|
|
|
|
- < 10.5: dylib1.o
|
|
|
|
- }
|
|
|
|
- if CompareVersionStrings(MacOSXVersionMin,'10.6')>=0 then
|
|
|
|
- exit('');
|
|
|
|
- if CompareVersionStrings(MacOSXVersionMin,'10.5')>=0 then
|
|
|
|
- exit('dylib1.10.5.o');
|
|
|
|
- end;
|
|
|
|
- system_arm_darwin,
|
|
|
|
- system_aarch64_darwin:
|
|
|
|
- begin
|
|
|
|
- { iOS: < 3.1: dylib1.o
|
|
|
|
- >= 3.1: nothing }
|
|
|
|
- if (CompareVersionStrings(iPhoneOSVersionMin,'3.1')>=0) then
|
|
|
|
- exit('');
|
|
|
|
- end;
|
|
|
|
- system_i386_iphonesim,
|
|
|
|
- system_x86_64_iphonesim:
|
|
|
|
- begin
|
|
|
|
- { see rule for crt1.o }
|
|
|
|
- if (CompareVersionStrings(iPhoneOSVersionMin,'8.1')>0) then
|
|
|
|
- exit('');
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
- result:='dylib1.o';
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
-end;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-Function TLinkerBSD.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);
|
|
|
|
|
|
+ begin
|
|
|
|
+ if linklibc then
|
|
|
|
+ begin
|
|
|
|
+ prtobj:=cprtobj;
|
|
|
|
+ SysInitUnit:=si_cprt;
|
|
|
|
+ end;
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -480,29 +237,14 @@ Var
|
|
s,s1,s2 : TCmdStr;
|
|
s,s1,s2 : TCmdStr;
|
|
linkdynamic : boolean;
|
|
linkdynamic : boolean;
|
|
Fl1,Fl2 : Boolean;
|
|
Fl1,Fl2 : Boolean;
|
|
- IsDarwin : Boolean;
|
|
|
|
|
|
|
|
begin
|
|
begin
|
|
WriteResponseFile:=False;
|
|
WriteResponseFile:=False;
|
|
ReOrder:=False;
|
|
ReOrder:=False;
|
|
linkdynamic:=False;
|
|
linkdynamic:=False;
|
|
- IsDarwin:=target_info.system in systems_darwin;
|
|
|
|
-{ set special options for some targets }
|
|
|
|
- if not IsDarwin Then
|
|
|
|
- begin
|
|
|
|
- linkdynamic:=not(SharedLibFiles.empty);
|
|
|
|
- // after this point addition of shared libs not allowed.
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
-{$ifdef MACOSX104ORHIGHER}
|
|
|
|
- { not sure what this is for, but gcc always links against it }
|
|
|
|
- if not(cs_profile in current_settings.moduleswitches) then
|
|
|
|
- AddSharedLibrary('SystemStubs')
|
|
|
|
- else
|
|
|
|
- AddSharedLibrary('SystemStubs_profile');
|
|
|
|
-{$endif MACOSX104ORHIGHER}
|
|
|
|
- end;
|
|
|
|
|
|
+ { set special options for some targets }
|
|
|
|
+ linkdynamic:=not(SharedLibFiles.empty);
|
|
|
|
+ // after this point addition of shared libs not allowed.
|
|
|
|
|
|
if reorder Then
|
|
if reorder Then
|
|
ExpandAndApplyOrder(SharedLibFiles);
|
|
ExpandAndApplyOrder(SharedLibFiles);
|
|
@@ -510,47 +252,6 @@ begin
|
|
{ Open link.res file }
|
|
{ Open link.res file }
|
|
LinkRes:=TLinkRes.Create(outputexedir+Info.ResName,not LdSupportsNoResponseFile);
|
|
LinkRes:=TLinkRes.Create(outputexedir+Info.ResName,not LdSupportsNoResponseFile);
|
|
|
|
|
|
- if (target_info.system in systems_darwin) and
|
|
|
|
- (sysrootpath<>'') then
|
|
|
|
- begin
|
|
|
|
- LinkRes.Add('-syslibroot');
|
|
|
|
- LinkRes.Add(sysrootpath);
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
- if (target_info.system in systems_darwin) then
|
|
|
|
- begin
|
|
|
|
- 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_darwin:
|
|
|
|
- { current versions of the linker require the sub-architecture type
|
|
|
|
- to be specified }
|
|
|
|
- LinkRes.Add(lower(cputypestr[current_settings.cputype]));
|
|
|
|
- system_aarch64_darwin:
|
|
|
|
- LinkRes.Add('arm64');
|
|
|
|
- else
|
|
|
|
- internalerror(2014121801);
|
|
|
|
- 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;
|
|
|
|
- end;
|
|
|
|
{ Write path to search libraries }
|
|
{ Write path to search libraries }
|
|
HPath:=TCmdStrListItem(current_module.locallibrarysearchpath.First);
|
|
HPath:=TCmdStrListItem(current_module.locallibrarysearchpath.First);
|
|
while assigned(HPath) do
|
|
while assigned(HPath) do
|
|
@@ -571,22 +272,6 @@ begin
|
|
HPath:=TCmdStrListItem(HPath.Next);
|
|
HPath:=TCmdStrListItem(HPath.Next);
|
|
end;
|
|
end;
|
|
|
|
|
|
- if (target_info.system in systems_darwin) then
|
|
|
|
- begin
|
|
|
|
- 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;
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
{ force local symbol resolution (i.e., inside the shared }
|
|
{ force local symbol resolution (i.e., inside the shared }
|
|
{ library itself) for all non-exorted symbols, otherwise }
|
|
{ library itself) for all non-exorted symbols, otherwise }
|
|
{ several RTL symbols of FPC-compiled shared libraries }
|
|
{ several RTL symbols of FPC-compiled shared libraries }
|
|
@@ -616,8 +301,7 @@ begin
|
|
if not (target_info.system in systems_internal_sysinit) and (prtobj<>'') then
|
|
if not (target_info.system in systems_internal_sysinit) and (prtobj<>'') then
|
|
LinkRes.AddFileName(FindObjectFile(prtobj,'',false));
|
|
LinkRes.AddFileName(FindObjectFile(prtobj,'',false));
|
|
{ try to add crti and crtbegin if linking to C }
|
|
{ try to add crti and crtbegin if linking to C }
|
|
- if linklibc and
|
|
|
|
- not IsDarwin Then
|
|
|
|
|
|
+ if linklibc then
|
|
begin
|
|
begin
|
|
if librarysearchpath.FindFile('crti.o',false,s) then
|
|
if librarysearchpath.FindFile('crti.o',false,s) then
|
|
LinkRes.AddFileName(s);
|
|
LinkRes.AddFileName(s);
|
|
@@ -638,34 +322,15 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
{ main objectfiles }
|
|
{ main objectfiles }
|
|
-
|
|
|
|
- if (target_info.system in systems_darwin) then
|
|
|
|
- begin
|
|
|
|
- FilesList:=TLinkRes.Create(outputexedir+'linkfiles.res',false);
|
|
|
|
- while not ObjectFiles.Empty do
|
|
|
|
- begin
|
|
|
|
- s:=ObjectFiles.GetFirst;
|
|
|
|
- if s<>'' then
|
|
|
|
- begin
|
|
|
|
- s:=TargetFixFileName(s);
|
|
|
|
- FilesList.Add(s);
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
- FilesList.writetodisk;
|
|
|
|
- FilesList.Free;
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- while not ObjectFiles.Empty do
|
|
|
|
- begin
|
|
|
|
- s:=ObjectFiles.GetFirst;
|
|
|
|
- if s<>'' then
|
|
|
|
- if LdSupportsNoResponseFile then
|
|
|
|
- LinkRes.AddFileName(s)
|
|
|
|
- else
|
|
|
|
- LinkRes.AddFileName(maybequoted(s));
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
|
|
+ while not ObjectFiles.Empty do
|
|
|
|
+ begin
|
|
|
|
+ s:=ObjectFiles.GetFirst;
|
|
|
|
+ if s<>'' then
|
|
|
|
+ if LdSupportsNoResponseFile then
|
|
|
|
+ LinkRes.AddFileName(s)
|
|
|
|
+ else
|
|
|
|
+ LinkRes.AddFileName(maybequoted(s));
|
|
|
|
+ end;
|
|
|
|
|
|
if not LdSupportsNoResponseFile then
|
|
if not LdSupportsNoResponseFile then
|
|
LinkRes.Add(')');
|
|
LinkRes.Add(')');
|
|
@@ -729,17 +394,8 @@ begin
|
|
LinkRes.Add(')');
|
|
LinkRes.Add(')');
|
|
end;
|
|
end;
|
|
|
|
|
|
- { frameworks for Darwin }
|
|
|
|
- if IsDarwin then
|
|
|
|
- while not FrameworkFiles.empty do
|
|
|
|
- begin
|
|
|
|
- LinkRes.Add('-framework');
|
|
|
|
- LinkRes.Add(FrameworkFiles.GetFirst);
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
{ objects which must be at the end }
|
|
{ objects which must be at the end }
|
|
- if linklibc and
|
|
|
|
- not IsDarwin Then
|
|
|
|
|
|
+ if linklibc then
|
|
begin
|
|
begin
|
|
if ((cs_create_pic in current_settings.moduleswitches) and
|
|
if ((cs_create_pic in current_settings.moduleswitches) and
|
|
not (target_info.system in systems_openbsd)) or
|
|
not (target_info.system in systems_openbsd)) or
|
|
@@ -774,8 +430,7 @@ var
|
|
mapstr,
|
|
mapstr,
|
|
targetstr,
|
|
targetstr,
|
|
emulstr,
|
|
emulstr,
|
|
- extdbgbinstr,
|
|
|
|
- extdbgcmdstr: TCmdStr;
|
|
|
|
|
|
+ ordersymfile: TCmdStr;
|
|
linkscript: TAsmScript;
|
|
linkscript: TAsmScript;
|
|
DynLinkStr : string[60];
|
|
DynLinkStr : string[60];
|
|
GCSectionsStr,
|
|
GCSectionsStr,
|
|
@@ -820,20 +475,13 @@ begin
|
|
StaticStr:='-static';
|
|
StaticStr:='-static';
|
|
end;
|
|
end;
|
|
if (cs_link_strip in current_settings.globalswitches) then
|
|
if (cs_link_strip in current_settings.globalswitches) then
|
|
- if (target_info.system in systems_darwin) then
|
|
|
|
- StripStr:='-x'
|
|
|
|
- else
|
|
|
|
- StripStr:='-s';
|
|
|
|
|
|
+ StripStr:='-s';
|
|
|
|
|
|
if (cs_link_smart in current_settings.globalswitches) and
|
|
if (cs_link_smart in current_settings.globalswitches) and
|
|
(tf_smartlink_sections in target_info.flags) then
|
|
(tf_smartlink_sections in target_info.flags) then
|
|
- if not(target_info.system in systems_darwin) then
|
|
|
|
- GCSectionsStr:='--gc-sections'
|
|
|
|
- else
|
|
|
|
- GCSectionsStr:='-dead_strip -no_dead_strip_inits_and_terms';
|
|
|
|
|
|
+ GCSectionsStr:='--gc-sections';
|
|
|
|
|
|
- if(not(target_info.system in systems_darwin) and
|
|
|
|
- (cs_profile in current_settings.moduleswitches)) or
|
|
|
|
|
|
+ if(cs_profile in current_settings.moduleswitches) or
|
|
((Info.DynamicLinker<>'') and
|
|
((Info.DynamicLinker<>'') and
|
|
((not SharedLibFiles.Empty) or
|
|
((not SharedLibFiles.Empty) or
|
|
(target_info.system in systems_openbsd))) then
|
|
(target_info.system in systems_openbsd))) then
|
|
@@ -841,10 +489,7 @@ begin
|
|
|
|
|
|
if CShared Then
|
|
if CShared Then
|
|
begin
|
|
begin
|
|
- if not(target_info.system in systems_darwin) then
|
|
|
|
- DynLinKStr:=DynLinkStr+' --shared'
|
|
|
|
- else
|
|
|
|
- DynLinKStr:=DynLinkStr+' -dynamic'; // one dash!
|
|
|
|
|
|
+ DynLinKStr:=DynLinkStr+' --shared'
|
|
end;
|
|
end;
|
|
|
|
|
|
{ Use -nopie on OpenBSD if PIC support is turned off }
|
|
{ Use -nopie on OpenBSD if PIC support is turned off }
|
|
@@ -859,6 +504,9 @@ begin
|
|
{ Write used files and libraries }
|
|
{ Write used files and libraries }
|
|
WriteResponseFile(false);
|
|
WriteResponseFile(false);
|
|
|
|
|
|
|
|
+{ Write symbol order file }
|
|
|
|
+ ordersymfile:=WriteSymbolOrderFile;
|
|
|
|
+
|
|
{ Call linker }
|
|
{ Call linker }
|
|
SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr);
|
|
SplitBinCmd(Info.ExeCmd[1],binstr,cmdstr);
|
|
Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
|
|
Replace(cmdstr,'$EXE',maybequoted(current_module.exefilename));
|
|
@@ -868,37 +516,24 @@ begin
|
|
Replace(cmdstr,'$MAP',mapstr);
|
|
Replace(cmdstr,'$MAP',mapstr);
|
|
Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
|
|
Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
|
|
Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
|
|
Replace(cmdstr,'$RES',maybequoted(outputexedir+Info.ResName));
|
|
- if (target_info.system in systems_darwin) then
|
|
|
|
- Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+'linkfiles.res'))
|
|
|
|
|
|
+ if ordersymfile<>'' then
|
|
|
|
+ Replace(cmdstr,'$ORDERSYMS','--symbol-ordering-file '+maybequoted(ordersymfile))
|
|
else
|
|
else
|
|
- Replace(cmdstr,'$FILELIST','');
|
|
|
|
|
|
+ Replace(cmdstr,'$ORDERSYMS','');
|
|
|
|
+
|
|
|
|
+ Replace(cmdstr,'$FILELIST','');
|
|
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,'$DYNLINK',DynLinkStr);
|
|
- if (target_info.system in systems_darwin) then
|
|
|
|
- Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(false));
|
|
|
|
BinStr:=FindUtil(utilsprefix+BinStr);
|
|
BinStr:=FindUtil(utilsprefix+BinStr);
|
|
|
|
|
|
- { create dsym file? }
|
|
|
|
- extdbgbinstr:='';
|
|
|
|
- extdbgcmdstr:='';
|
|
|
|
- if (target_info.system in systems_darwin) and
|
|
|
|
- (target_dbg.id in [dbg_dwarf2,dbg_dwarf3]) and
|
|
|
|
- (cs_link_separate_dbg_file in current_settings.globalswitches) then
|
|
|
|
- begin
|
|
|
|
- extdbgbinstr:=FindUtil(utilsprefix+'dsymutil');
|
|
|
|
- extdbgcmdstr:=maybequoted(current_module.exefilename);
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
if (LdSupportsNoResponseFile) and
|
|
if (LdSupportsNoResponseFile) and
|
|
not(cs_link_nolink in current_settings.globalswitches) then
|
|
not(cs_link_nolink in current_settings.globalswitches) then
|
|
begin
|
|
begin
|
|
{ we have to use a script to use the IFS hack }
|
|
{ we have to use a script to use the IFS hack }
|
|
linkscript:=GenerateScript(outputexedir+'ppaslink');
|
|
linkscript:=GenerateScript(outputexedir+'ppaslink');
|
|
linkscript.AddLinkCommand(BinStr,CmdStr,'');
|
|
linkscript.AddLinkCommand(BinStr,CmdStr,'');
|
|
- if (extdbgcmdstr<>'') then
|
|
|
|
- linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
|
|
|
|
linkscript.WriteToDisk;
|
|
linkscript.WriteToDisk;
|
|
BinStr:=linkscript.fn;
|
|
BinStr:=linkscript.fn;
|
|
if not path_absolute(BinStr) then
|
|
if not path_absolute(BinStr) then
|
|
@@ -911,22 +546,18 @@ begin
|
|
|
|
|
|
useshell:=not (tf_no_backquote_support in source_info.flags);
|
|
useshell:=not (tf_no_backquote_support in source_info.flags);
|
|
success:=DoExec(BinStr,CmdStr,true,LdSupportsNoResponseFile or useshell);
|
|
success:=DoExec(BinStr,CmdStr,true,LdSupportsNoResponseFile or useshell);
|
|
- if (success and
|
|
|
|
- (extdbgbinstr<>'') and
|
|
|
|
- (cs_link_nolink in current_settings.globalswitches)) then
|
|
|
|
- success:=DoExec(extdbgbinstr,extdbgcmdstr,false,LdSupportsNoResponseFile);
|
|
|
|
|
|
|
|
{ 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
|
|
begin
|
|
begin
|
|
DeleteFile(outputexedir+Info.ResName);
|
|
DeleteFile(outputexedir+Info.ResName);
|
|
|
|
+ if ordersymfile<>'' then
|
|
|
|
+ DeleteFile(ordersymfile);
|
|
if LdSupportsNoResponseFile Then
|
|
if LdSupportsNoResponseFile Then
|
|
begin
|
|
begin
|
|
DeleteFile(linkscript.fn);
|
|
DeleteFile(linkscript.fn);
|
|
linkscript.free
|
|
linkscript.free
|
|
end;
|
|
end;
|
|
- if target_info.system in systems_darwin then
|
|
|
|
- DeleteFile(outputexedir+'linkfiles.res');
|
|
|
|
end;
|
|
end;
|
|
|
|
|
|
MakeExecutable:=success; { otherwise a recursive call to link method }
|
|
MakeExecutable:=success; { otherwise a recursive call to link method }
|
|
@@ -942,10 +573,9 @@ var
|
|
binstr,
|
|
binstr,
|
|
cmdstr,
|
|
cmdstr,
|
|
mapstr,
|
|
mapstr,
|
|
|
|
+ ordersymfile,
|
|
targetstr,
|
|
targetstr,
|
|
- emulstr,
|
|
|
|
- extdbgbinstr,
|
|
|
|
- extdbgcmdstr : TCmdStr;
|
|
|
|
|
|
+ emulstr : TCmdStr;
|
|
GCSectionsStr : string[63];
|
|
GCSectionsStr : string[63];
|
|
exportedsyms: text;
|
|
exportedsyms: text;
|
|
success : boolean;
|
|
success : boolean;
|
|
@@ -960,13 +590,14 @@ begin
|
|
{ Write used files and libraries }
|
|
{ Write used files and libraries }
|
|
WriteResponseFile(true);
|
|
WriteResponseFile(true);
|
|
|
|
|
|
|
|
+{ Write symbol order file }
|
|
|
|
+ ordersymfile:=WriteSymbolOrderFile;
|
|
|
|
+
|
|
if (cs_link_smart in current_settings.globalswitches) and
|
|
if (cs_link_smart in current_settings.globalswitches) and
|
|
(tf_smartlink_sections in target_info.flags) then
|
|
(tf_smartlink_sections in target_info.flags) then
|
|
- if not(target_info.system in systems_darwin) then
|
|
|
|
{ disabled because not tested
|
|
{ disabled because not tested
|
|
GCSectionsStr:='--gc-sections' }
|
|
GCSectionsStr:='--gc-sections' }
|
|
- else
|
|
|
|
- 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'));
|
|
@@ -991,63 +622,30 @@ begin
|
|
|
|
|
|
{ Call linker }
|
|
{ Call linker }
|
|
SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
|
|
SplitBinCmd(Info.DllCmd[1],binstr,cmdstr);
|
|
-{$ifndef darwin}
|
|
|
|
Replace(cmdstr,'$EXE',maybequoted(current_module.sharedlibfilename));
|
|
Replace(cmdstr,'$EXE',maybequoted(current_module.sharedlibfilename));
|
|
-{$else darwin}
|
|
|
|
- Replace(cmdstr,'$EXE',maybequoted(ExpandFileName(current_module.sharedlibfilename)));
|
|
|
|
-{$endif darwin}
|
|
|
|
Replace(cmdstr,'$OPT',Info.ExtraOptions);
|
|
Replace(cmdstr,'$OPT',Info.ExtraOptions);
|
|
Replace(cmdstr,'$TARGET',targetstr);
|
|
Replace(cmdstr,'$TARGET',targetstr);
|
|
Replace(cmdstr,'$EMUL',EmulStr);
|
|
Replace(cmdstr,'$EMUL',EmulStr);
|
|
Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
|
|
Replace(cmdstr,'$CATRES',CatFileContent(outputexedir+Info.ResName));
|
|
- if (target_info.system in systems_darwin) then
|
|
|
|
- Replace(cmdstr,'$FILELIST','-filelist '+maybequoted(outputexedir+'linkfiles.res'))
|
|
|
|
- else
|
|
|
|
- Replace(cmdstr,'$FILELIST','');
|
|
|
|
|
|
+ Replace(cmdstr,'$FILELIST','');
|
|
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,'$SONAME',SoNameStr);
|
|
Replace(cmdstr,'$MAP',mapstr);
|
|
Replace(cmdstr,'$MAP',mapstr);
|
|
- if (target_info.system in systems_darwin) then
|
|
|
|
- Replace(cmdstr,'$PRTOBJ',GetDarwinPrtobjName(true));
|
|
|
|
|
|
+ if ordersymfile<>'' then
|
|
|
|
+ Replace(cmdstr,'$ORDERSYMS','--symbol-ordering-file '+maybequoted(ordersymfile))
|
|
|
|
+ else
|
|
|
|
+ Replace(cmdstr,'$ORDERSYMS','');
|
|
BinStr:=FindUtil(utilsprefix+BinStr);
|
|
BinStr:=FindUtil(utilsprefix+BinStr);
|
|
|
|
|
|
- { create dsym file? }
|
|
|
|
- extdbgbinstr:='';
|
|
|
|
- extdbgcmdstr:='';
|
|
|
|
- if (target_info.system in systems_darwin) and
|
|
|
|
- (target_dbg.id in [dbg_dwarf2,dbg_dwarf3]) and
|
|
|
|
- (cs_link_separate_dbg_file in current_settings.globalswitches) then
|
|
|
|
- begin
|
|
|
|
- extdbgbinstr:=FindUtil(utilsprefix+'dsymutil');
|
|
|
|
- extdbgcmdstr:=maybequoted(current_module.sharedlibfilename);
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
- if (target_info.system in systems_darwin) then
|
|
|
|
- begin
|
|
|
|
- { exported symbols for darwin }
|
|
|
|
- if not texportlibunix(exportlib).exportedsymnames.empty then
|
|
|
|
- begin
|
|
|
|
- assign(exportedsyms,outputexedir+'linksyms.fpc');
|
|
|
|
- rewrite(exportedsyms);
|
|
|
|
- repeat
|
|
|
|
- writeln(exportedsyms,texportlibunix(exportlib).exportedsymnames.getfirst);
|
|
|
|
- until texportlibunix(exportlib).exportedsymnames.empty;
|
|
|
|
- close(exportedsyms);
|
|
|
|
- cmdstr:=cmdstr+' -exported_symbols_list '+maybequoted(outputexedir)+'linksyms.fpc';
|
|
|
|
- end;
|
|
|
|
- end;
|
|
|
|
-
|
|
|
|
if (LdSupportsNoResponseFile) and
|
|
if (LdSupportsNoResponseFile) and
|
|
not(cs_link_nolink in current_settings.globalswitches) then
|
|
not(cs_link_nolink in current_settings.globalswitches) then
|
|
begin
|
|
begin
|
|
{ we have to use a script to use the IFS hack }
|
|
{ we have to use a script to use the IFS hack }
|
|
linkscript:=GenerateScript(outputexedir+'ppaslink');
|
|
linkscript:=GenerateScript(outputexedir+'ppaslink');
|
|
linkscript.AddLinkCommand(BinStr,CmdStr,'');
|
|
linkscript.AddLinkCommand(BinStr,CmdStr,'');
|
|
- if (extdbgbinstr<>'') then
|
|
|
|
- linkscript.AddLinkCommand(extdbgbinstr,extdbgcmdstr,'');
|
|
|
|
linkscript.WriteToDisk;
|
|
linkscript.WriteToDisk;
|
|
BinStr:=linkscript.fn;
|
|
BinStr:=linkscript.fn;
|
|
if not path_absolute(BinStr) then
|
|
if not path_absolute(BinStr) then
|
|
@@ -1059,10 +657,6 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
success:=DoExec(BinStr,cmdstr,true,LdSupportsNoResponseFile);
|
|
success:=DoExec(BinStr,cmdstr,true,LdSupportsNoResponseFile);
|
|
- if (success and
|
|
|
|
- (extdbgbinstr<>'') and
|
|
|
|
- (cs_link_nolink in current_settings.globalswitches)) then
|
|
|
|
- success:=DoExec(extdbgbinstr,extdbgcmdstr,false,LdSupportsNoResponseFile);
|
|
|
|
|
|
|
|
{ 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
|
|
@@ -1076,16 +670,13 @@ begin
|
|
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
|
|
|
|
+ DeleteFile(ordersymfile);
|
|
if LdSupportsNoResponseFile Then
|
|
if LdSupportsNoResponseFile Then
|
|
begin
|
|
begin
|
|
DeleteFile(linkscript.fn);
|
|
DeleteFile(linkscript.fn);
|
|
linkscript.free
|
|
linkscript.free
|
|
end;
|
|
end;
|
|
- if (target_info.system in systems_darwin) then
|
|
|
|
- begin
|
|
|
|
- DeleteFile(outputexedir+'linksyms.fpc');
|
|
|
|
- DeleteFile(outputexedir+'linkfiles.res');
|
|
|
|
- end;
|
|
|
|
end;
|
|
end;
|
|
|
|
|
|
MakeSharedLibrary:=success; { otherwise a recursive call to link method }
|
|
MakeSharedLibrary:=success; { otherwise a recursive call to link method }
|
|
@@ -1111,13 +702,6 @@ initialization
|
|
RegisterImport(system_x86_64_netbsd,timportlibbsd);
|
|
RegisterImport(system_x86_64_netbsd,timportlibbsd);
|
|
RegisterExport(system_x86_64_netbsd,texportlibbsd);
|
|
RegisterExport(system_x86_64_netbsd,texportlibbsd);
|
|
RegisterTarget(system_x86_64_netbsd_info);
|
|
RegisterTarget(system_x86_64_netbsd_info);
|
|
-
|
|
|
|
- RegisterImport(system_x86_64_darwin,timportlibdarwin);
|
|
|
|
- RegisterExport(system_x86_64_darwin,texportlibdarwin);
|
|
|
|
- RegisterTarget(system_x86_64_darwin_info);
|
|
|
|
- RegisterImport(system_x86_64_iphonesim,timportlibdarwin);
|
|
|
|
- RegisterExport(system_x86_64_iphonesim,texportlibdarwin);
|
|
|
|
- RegisterTarget(system_x86_64_iphonesim_info);
|
|
|
|
{$endif}
|
|
{$endif}
|
|
{$ifdef i386}
|
|
{$ifdef i386}
|
|
RegisterImport(system_i386_freebsd,timportlibbsd);
|
|
RegisterImport(system_i386_freebsd,timportlibbsd);
|
|
@@ -1129,12 +713,6 @@ initialization
|
|
RegisterImport(system_i386_openbsd,timportlibbsd);
|
|
RegisterImport(system_i386_openbsd,timportlibbsd);
|
|
RegisterExport(system_i386_openbsd,texportlibbsd);
|
|
RegisterExport(system_i386_openbsd,texportlibbsd);
|
|
RegisterTarget(system_i386_openbsd_info);
|
|
RegisterTarget(system_i386_openbsd_info);
|
|
- RegisterImport(system_i386_darwin,timportlibdarwin);
|
|
|
|
- RegisterExport(system_i386_darwin,texportlibdarwin);
|
|
|
|
- RegisterTarget(system_i386_darwin_info);
|
|
|
|
- RegisterImport(system_i386_iphonesim,timportlibdarwin);
|
|
|
|
- RegisterExport(system_i386_iphonesim,texportlibdarwin);
|
|
|
|
- RegisterTarget(system_i386_iphonesim_info);
|
|
|
|
{$endif i386}
|
|
{$endif i386}
|
|
{$ifdef m68k}
|
|
{$ifdef m68k}
|
|
RegisterImport(system_m68k_netbsd,timportlibbsd);
|
|
RegisterImport(system_m68k_netbsd,timportlibbsd);
|
|
@@ -1142,34 +720,15 @@ initialization
|
|
RegisterTarget(system_m68k_netbsd_info);
|
|
RegisterTarget(system_m68k_netbsd_info);
|
|
{$endif m68k}
|
|
{$endif m68k}
|
|
{$ifdef powerpc}
|
|
{$ifdef powerpc}
|
|
- RegisterImport(system_powerpc_darwin,timportlibdarwin);
|
|
|
|
- RegisterExport(system_powerpc_darwin,texportlibdarwin);
|
|
|
|
- RegisterTarget(system_powerpc_darwin_info);
|
|
|
|
-
|
|
|
|
RegisterImport(system_powerpc_netbsd,timportlibbsd);
|
|
RegisterImport(system_powerpc_netbsd,timportlibbsd);
|
|
RegisterExport(system_powerpc_netbsd,texportlibbsd);
|
|
RegisterExport(system_powerpc_netbsd,texportlibbsd);
|
|
RegisterTarget(system_powerpc_netbsd_info);
|
|
RegisterTarget(system_powerpc_netbsd_info);
|
|
{$endif powerpc}
|
|
{$endif powerpc}
|
|
-{$ifdef powerpc64}
|
|
|
|
- RegisterImport(system_powerpc64_darwin,timportlibdarwin);
|
|
|
|
- RegisterExport(system_powerpc64_darwin,texportlibdarwin);
|
|
|
|
- RegisterTarget(system_powerpc64_darwin_info);
|
|
|
|
-{$endif powerpc64}
|
|
|
|
{$ifdef arm}
|
|
{$ifdef arm}
|
|
- RegisterImport(system_arm_darwin,timportlibdarwin);
|
|
|
|
- RegisterExport(system_arm_darwin,texportlibdarwin);
|
|
|
|
- RegisterTarget(system_arm_darwin_info);
|
|
|
|
-
|
|
|
|
RegisterImport(system_arm_netbsd,timportlibbsd);
|
|
RegisterImport(system_arm_netbsd,timportlibbsd);
|
|
RegisterExport(system_arm_netbsd,texportlibbsd);
|
|
RegisterExport(system_arm_netbsd,texportlibbsd);
|
|
RegisterTarget(system_arm_netbsd_info);
|
|
RegisterTarget(system_arm_netbsd_info);
|
|
{$endif arm}
|
|
{$endif arm}
|
|
-{$ifdef aarch64}
|
|
|
|
- RegisterImport(system_aarch64_darwin,timportlibdarwin);
|
|
|
|
- RegisterExport(system_aarch64_darwin,texportlibdarwin);
|
|
|
|
- RegisterTarget(system_aarch64_darwin_info);
|
|
|
|
-{$endif aarch64}
|
|
|
|
|
|
|
|
RegisterRes(res_elf_info,TWinLikeResourceFile);
|
|
RegisterRes(res_elf_info,TWinLikeResourceFile);
|
|
- RegisterRes(res_macho_info,TWinLikeResourceFile);
|
|
|
|
end.
|
|
end.
|