[education/rkward/releases/0.8.1] rkward/rbackend: Also preload libgio

Thomas Friedrichsmeier null at kde.org
Sat Apr 19 17:24:15 BST 2025


Git commit 06715253483b77bff68b867b1f44aeda88912161 by Thomas Friedrichsmeier.
Committed on 19/04/2025 at 16:23.
Pushed by tfry into branch 'releases/0.8.1'.

Also preload libgio

M  +14   -12   rkward/rbackend/rkrbackend_dlopen.cpp

https://invent.kde.org/education/rkward/-/commit/06715253483b77bff68b867b1f44aeda88912161

diff --git a/rkward/rbackend/rkrbackend_dlopen.cpp b/rkward/rbackend/rkrbackend_dlopen.cpp
index 63c72e6f9..e00c0bbd1 100644
--- a/rkward/rbackend/rkrbackend_dlopen.cpp
+++ b/rkward/rbackend/rkrbackend_dlopen.cpp
@@ -60,12 +60,16 @@ auto loadlib(const char* name) {
 }
 
 #if !(defined(Win32) || defined(__APPLE__))
+// some systems appear to lack symlinks, so we try several names for some libs
+auto loadLibWithAltNames(const char *name1, const char* name2, int flags) {
+	auto ret = dlopen(name1, flags);
+	if (ret) return ret;
+	return dlopen(name2, flags);
+}
+
 auto loadGlib(unsigned int *version) {
 	*version = 0;
-	auto glib = dlopen("libglib-2.0.so", RTLD_LAZY | RTLD_LOCAL);
-	if (!glib) {
-		glib = dlopen("libglib-2.0.so.0", RTLD_LAZY | RTLD_LOCAL); // some systems appear to lack the link
-	}
+	auto glib = loadLibWithAltNames("libglib-2.0.so", "libglib-2.0.so.0", RTLD_LAZY | RTLD_LOCAL);
 	if (glib) {
 		dlerror();
 		auto glib_verp = static_cast<unsigned int *>(resolve_symb(glib, "glib_minor_version")); // Major version is always "2"
@@ -91,11 +95,10 @@ void preloadBetterGlib(const char *cd_to) {
 	}
 	auto glib2 = loadGlib(&glib2_ver);
 	if (glib1_ver < glib2_ver) {
-		// For good measure, we'll also load the matching libgobject lib, if present).
-		// (libgobject links against libglib, but does not provide runtime version information!)
-		if (!dlopen("libgobject-2.0.so", RTLD_LAZY | RTLD_LOCAL)) {
-			dlopen("libgobject-2.0.so.0", RTLD_LAZY | RTLD_LOCAL);
-		}
+		// For good measure, we'll also try loading some matching glibs, if present, assuming, they'll be of a matching version.
+		// (libgobject and friends link against libglib, but do not provide runtime version information!)
+		loadLibWithAltNames("libgobject-2.0.so", "libgobject-2.0.so.0", RTLD_LAZY | RTLD_LOCAL);
+		loadLibWithAltNames("libgio-2.0.so", "libgio-2.0.so.0", RTLD_LAZY | RTLD_LOCAL);
 	}
 	std::filesystem::current_path(cd);
 
@@ -103,9 +106,8 @@ void preloadBetterGlib(const char *cd_to) {
 		dlclose(glib2);
 		loadGlib(&glib1_ver);
 		// see above
-		if (!dlopen("libgobject-2.0.so", RTLD_LAZY | RTLD_LOCAL)) {
-			dlopen("libgobject-2.0.so.0", RTLD_LAZY | RTLD_LOCAL);
-		}
+		loadLibWithAltNames("libgobject-2.0.so", "libgobject-2.0.so.0", RTLD_LAZY | RTLD_LOCAL);
+		loadLibWithAltNames("libgio-2.0.so", "libgio-2.0.so.0", RTLD_LAZY | RTLD_LOCAL);
 	}
 }
 #endif


More information about the rkward-tracker mailing list