diff --git a/Source/Engine/Platform/Linux/LinuxPlatform.cpp b/Source/Engine/Platform/Linux/LinuxPlatform.cpp
index 13b61eb38..6308bb987 100644
--- a/Source/Engine/Platform/Linux/LinuxPlatform.cpp
+++ b/Source/Engine/Platform/Linux/LinuxPlatform.cpp
@@ -2140,7 +2140,12 @@ int32 LinuxPlatform::RunProcess(const StringView& cmdLine, const StringView& wor
void* LinuxPlatform::LoadLibrary(const Char* filename)
{
const StringAsANSI<> filenameANSI(filename);
- return dlopen(filenameANSI.Get(), RTLD_LAZY);
+ void* result = dlopen(filenameANSI.Get(), RTLD_LAZY | RTLD_LOCAL);
+ if (!result)
+ {
+ LOG(Error, "Failed to load {0} because {1}", filename, String(dlerror()));
+ }
+ return result;
}
void LinuxPlatform::FreeLibrary(void* handle)
diff --git a/Source/Tools/Flax.Build/Platforms/Linux/LinuxToolchain.cs b/Source/Tools/Flax.Build/Platforms/Linux/LinuxToolchain.cs
index 535b329b6..3c6c8ae1b 100644
--- a/Source/Tools/Flax.Build/Platforms/Linux/LinuxToolchain.cs
+++ b/Source/Tools/Flax.Build/Platforms/Linux/LinuxToolchain.cs
@@ -43,8 +43,22 @@ namespace Flax.Build.Platforms
{
base.SetupCompileCppFilesArgs(graph, options, args, outputPath);
+ // Hide all symbols by default
+ args.Add("-fvisibility-inlines-hidden");
+ args.Add("-fvisibility-ms-compat");
+
args.Add(string.Format("-target {0}", ArchitectureName));
args.Add(string.Format("--sysroot=\"{0}\"", ToolsetRoot.Replace('\\', '/')));
+
+ if (Architecture == TargetArchitecture.x64)
+ {
+ args.Add("-mssse3");
+ }
+
+ if (options.Target.OutputType == TargetOutputType.Library)
+ {
+ args.Add("-fPIC");
+ }
}
///
@@ -53,8 +67,6 @@ namespace Flax.Build.Platforms
base.SetupLinkFilesArgs(graph, options, args, outputFilePath);
args.Add("-Wl,-rpath,\"\\$ORIGIN\"");
-
- // Speed up build
//args.Add("-Wl,--as-needed");
args.Add("-Wl,--hash-style=gnu");
//args.Add("-Wl,--build-id");
@@ -62,7 +74,7 @@ namespace Flax.Build.Platforms
if (options.LinkEnv.Output == LinkerOutput.SharedLibrary)
{
args.Add("-shared");
- args.Add(string.Format("-soname=\"{0}\"", Path.GetFileNameWithoutExtension(outputFilePath)));
+ args.Add(string.Format("-Wl,-soname=\"{0}\"", Path.GetFileNameWithoutExtension(outputFilePath)));
}
args.Add(string.Format("-target {0}", ArchitectureName));
diff --git a/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs b/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs
index a6813c4bc..e9ab83ffa 100644
--- a/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs
+++ b/Source/Tools/Flax.Build/Platforms/Unix/UnixToolchain.cs
@@ -255,12 +255,8 @@ namespace Flax.Build.Platforms
var commonArgs = new List();
SetupCompileCppFilesArgs(graph, options, commonArgs, outputPath);
{
- // Don't link, only compile code
commonArgs.Add("-c");
-
commonArgs.Add("-pipe");
-
- // C++ compile flags
commonArgs.Add("-x");
commonArgs.Add("c++");
commonArgs.Add("-std=c++14");
@@ -280,25 +276,6 @@ namespace Flax.Build.Platforms
if (compileEnvironment.TreatWarningsAsErrors)
commonArgs.Add("-Wall -Werror");
- /*
- if (ShouldUseLibcxx(CompileEnvironment.Architecture))
- {
- commonArgs.Add("-nostdinc++");
- commonArgs.Add("-I" + "ThirdParty/Linux/LibCxx/include/");
- commonArgs.Add("-I" + "ThirdParty/Linux/LibCxx/include/c++/v1");
- }
- */
- /*
- if (Options.HasFlag(LinuxToolChainOptions.EnableAddressSanitizer))
- commonArgs.Add("-fsanitize=address");
-
- if (Options.HasFlag(LinuxToolChainOptions.EnableThreadSanitizer))
- commonArgs.Add("-fsanitize=thread");
-
- if (Options.HasFlag(LinuxToolChainOptions.EnableUndefinedBehaviorSanitizer))
- commonArgs.Add("-fsanitize=undefined");
- */
-
// TODO: compileEnvironment.IntrinsicFunctions
// TODO: compileEnvironment.FunctionLevelLinking
// TODO: compileEnvironment.FavorSizeOrSpeed
@@ -469,12 +446,18 @@ namespace Flax.Build.Platforms
foreach (var library in linkEnvironment.InputLibraries)
{
var dir = Path.GetDirectoryName(library);
+ var ext = Path.GetExtension(library);
if (string.IsNullOrEmpty(dir))
{
args.Add(string.Format("\"-l{0}\"", library));
}
- else if (library.EndsWith(".so"))
+ else if (string.IsNullOrEmpty(ext))
{
+ // Skip executable
+ }
+ else if (ext == ".so")
+ {
+ // Link against dynamic library
task.PrerequisiteFiles.Add(library);
libraryPaths.Add(dir);
args.Add(string.Format("\"-l{0}\"", GetLibName(library)));
@@ -488,12 +471,18 @@ namespace Flax.Build.Platforms
foreach (var library in options.Libraries)
{
var dir = Path.GetDirectoryName(library);
+ var ext = Path.GetExtension(library);
if (string.IsNullOrEmpty(dir))
{
args.Add(string.Format("\"-l{0}\"", library));
}
- else if (library.EndsWith(".so"))
+ else if (string.IsNullOrEmpty(ext))
{
+ // Skip executable
+ }
+ else if (ext == ".so")
+ {
+ // Link against dynamic library
task.PrerequisiteFiles.Add(library);
libraryPaths.Add(dir);
args.Add(string.Format("\"-l{0}\"", GetLibName(library)));