libobs: Fix duplicate symbol resolution for obs plugins

By default duplicate non-static symbols loaded by dynamic libraries are
de-duplicated by the dynamic library loader. This can lead to issues
with statically linked libraries inside obs plugins if the symbols
share their signature: Whichever plugin is loaded first gets to "set"
the symbol (which can become problematic especially for C++ template
functions).

Using RTLD_LOCAL ensures that all symbols are hidden and can only be
explicitly loaded using dlsym() which avoids this issue.

Unfortunately due to the way scripting works in obs-studio, Python
still needs to be loaded with RTLD_GLOBAL, hence the branch in the fix.
This commit is contained in:
PatTheMav
2023-09-23 16:31:14 -07:00
committed by Lain
parent 2308414bcc
commit aaca2b6e73
+7 -1
View File
@@ -83,7 +83,13 @@ void *os_dlopen(const char *path)
dstr_cat(&dylib_name, ".so");
#ifdef __APPLE__
void *res = dlopen(dylib_name.array, RTLD_LAZY | RTLD_FIRST);
int dlopen_flags = RTLD_LAZY | RTLD_FIRST;
if (dstr_find(&dylib_name, "Python")) {
dlopen_flags = dlopen_flags | RTLD_GLOBAL;
} else {
dlopen_flags = dlopen_flags | RTLD_LOCAL;
}
void *res = dlopen(dylib_name.array, dlopen_flags);
#else
void *res = dlopen(dylib_name.array, RTLD_LAZY);
#endif