diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index c0b10036b7baf97e43a5b940132a9764e778c246..e9c8f2d27c0b4a8a0e212cc07fcf79a6df5cb2ed 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -1922,6 +1922,7 @@ static void canvas_stdlib(t_canvasenvironment *e, char *stdlib)
     }
 }
 
+extern t_symbol *class_loadsym;     /* name under which an extern is invoked */
 
 void canvas_declare(t_canvas *x, t_symbol *s, int argc, t_atom *argv)
 {
@@ -1948,7 +1949,13 @@ void canvas_declare(t_canvas *x, t_symbol *s, int argc, t_atom *argv)
         }
         else if ((argc > i+1) && !strcmp(flag, "-lib"))
         {
-            sys_load_lib(x, atom_getsymbolarg(i+1, argc, argv)->s_name);
+            /* set class_loadsym in case we're loading a library by
+               absolute or namespace-prefixed path. Not sure yet
+               exactly how stdlib works so I haven't touched that
+               one... */
+            class_loadsym = atom_getsymbolarg(i+1, argc, argv);
+            sys_load_lib(x, class_loadsym->s_name);
+            class_loadsym = NULL;
             i++;
         }
         else if ((argc > i+1) && !strcmp(flag, "-stdlib"))
diff --git a/pd/src/m_class.c b/pd/src/m_class.c
index 54cfa965d54aef6e730e40c478d066be22ca08ca..062746561e65b8cc56bf580fddbd64bc912f8a9e 100644
--- a/pd/src/m_class.c
+++ b/pd/src/m_class.c
@@ -26,7 +26,7 @@
 #define snprintf sprintf_s
 #endif
 
-static t_symbol *class_loadsym;     /* name under which an extern is invoked */
+t_symbol *class_loadsym;     /* name under which an extern is invoked */
 static void pd_defaultfloat(t_pd *x, t_float f);
 static void pd_defaultblob(t_pd *x, t_blob *st); /* MP20061226 blob type */
 static void pd_defaultlist(t_pd *x, t_symbol *s, int argc, t_atom *argv);