dlhandle: prevent libs from using each other's symbols (#977)

use RTLD_LOCAL so that symbols are *only* exposed via dlsym

without this all symbols exported by the libs are available for symbol
resolution, resulting in different lib versions potentially resolving
*each other's* symbols, causing incredibly cursed behavior such as
https://gist.github.com/apage43/085c1ff69f6dd05387793ebc301840f6
This commit is contained in:
Aaron Miller 2023-06-13 11:52:11 -07:00 committed by GitHub
parent f71d8efc71
commit c4319d2c8e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -18,7 +18,7 @@ public:
}; };
Dlhandle() : chandle(nullptr) {} Dlhandle() : chandle(nullptr) {}
Dlhandle(const std::string& fpath, int flags = RTLD_LAZY) { Dlhandle(const std::string& fpath, int flags = RTLD_LAZY | RTLD_LOCAL) {
chandle = dlopen(fpath.c_str(), flags); chandle = dlopen(fpath.c_str(), flags);
if (!chandle) { if (!chandle) {
throw Exception("dlopen(\""+fpath+"\"): "+dlerror()); throw Exception("dlopen(\""+fpath+"\"): "+dlerror());