Browse Source

Fix crash on Linux by `DllImport`ing correct version of libdl (#1764)

* DllImport correct version of libdl

* Fix macOS
pull/1765/head
Pixelstorm 2 years ago committed by GitHub
parent
commit
25d6325b13
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 66
      src/Runtime/SymbolResolver.cs

66
src/Runtime/SymbolResolver.cs

@ -35,13 +35,30 @@ namespace CppSharp @@ -35,13 +35,30 @@ namespace CppSharp
static SymbolResolver()
{
switch (Environment.OSVersion.Platform)
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
case PlatformID.Unix:
case PlatformID.MacOSX:
loadImage = dlopen;
resolveSymbol = dlsym;
formats = new[] {
loadImage = LoadLibrary;
resolveSymbol = GetProcAddress;
formats = new[] { "{0}", "{0}.dll" };
}
else
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
loadImage = dlopen_linux;
resolveSymbol = dlsym_linux;
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
loadImage = dlopen_macos;
resolveSymbol = dlsym_macos;
}
else
{
throw new NotImplementedException();
}
formats = new[] {
"{0}",
"{0}.so",
"{0}.dylib",
@ -49,12 +66,6 @@ namespace CppSharp @@ -49,12 +66,6 @@ namespace CppSharp
"lib{0}.dylib",
"{0}.bundle"
};
break;
default:
loadImage = LoadLibrary;
resolveSymbol = GetProcAddress;
formats = new[] { "{0}", "{0}.dll" };
break;
}
}
@ -113,16 +124,35 @@ namespace CppSharp @@ -113,16 +124,35 @@ namespace CppSharp
private const int RTLD_LAZY = 0x1;
static IntPtr dlopen(string path)
#region LINUX
static IntPtr dlopen_linux(string path)
{
return dlopen(path, RTLD_LAZY);
return dlopen_linux(path, RTLD_LAZY);
}
[DllImport("dl", CharSet = CharSet.Ansi)]
static extern IntPtr dlopen(string path, int flags);
[DllImport("dl.so.2", EntryPoint = "dlopen", CharSet = CharSet.Ansi)]
static extern IntPtr dlopen_linux(string path, int flags);
[DllImport("dl", CharSet = CharSet.Ansi)]
static extern IntPtr dlsym(IntPtr handle, string symbol);
[DllImport("dl.so.2", EntryPoint = "dlsym", CharSet = CharSet.Ansi)]
static extern IntPtr dlsym_linux(IntPtr handle, string symbol);
#endregion
#region MACOS
static IntPtr dlopen_macos(string path)
{
return dlopen_macos(path, RTLD_LAZY);
}
[DllImport("dl", EntryPoint = "dlopen", CharSet = CharSet.Ansi)]
static extern IntPtr dlopen_macos(string path, int flags);
[DllImport("dl", EntryPoint = "dlsym", CharSet = CharSet.Ansi)]
static extern IntPtr dlsym_macos(IntPtr handle, string symbol);
#endregion
#endregion

Loading…
Cancel
Save