diff -up src/sage/env.py.orig src/sage/env.py --- src/sage/env.py.orig 2019-01-14 17:16:02.000000000 -0700 +++ src/sage/env.py 2019-02-07 16:11:38.887417503 -0700 @@ -164,7 +164,7 @@ _add_variable_or_fallback('CONWAY_POLYNO _add_variable_or_fallback('GRAPHS_DATA_DIR', opj('$SAGE_SHARE','graphs')) _add_variable_or_fallback('ELLCURVE_DATA_DIR',opj('$SAGE_SHARE','ellcurves')) _add_variable_or_fallback('POLYTOPE_DATA_DIR',opj('$SAGE_SHARE','reflexive_polytopes')) -_add_variable_or_fallback('GAP_ROOT_DIR', opj('$SAGE_SHARE','gap')) +_add_variable_or_fallback('GAP_ROOT_DIR', opj('/usr','lib','gap')) _add_variable_or_fallback('THEBE_DIR', opj('$SAGE_SHARE','thebe')) _add_variable_or_fallback('COMBINATORIAL_DESIGN_DATA_DIR', opj('$SAGE_SHARE', 'combinatorial_designs')) _add_variable_or_fallback('CREMONA_MINI_DATA_DIR', opj('$SAGE_SHARE', 'cremona')) diff -up src/sage/libs/gap/util.pyx.orig src/sage/libs/gap/util.pyx --- src/sage/libs/gap/util.pyx.orig 2019-01-14 17:16:03.000000000 -0700 +++ src/sage/libs/gap/util.pyx 2019-02-07 16:13:52.658939819 -0700 @@ -18,6 +18,7 @@ import os import signal import warnings +from posix.dlfcn cimport dlopen, dlclose, RTLD_NOW, RTLD_GLOBAL from libc.string cimport strcpy, strlen from cpython.exc cimport PyErr_SetObject, PyErr_Occurred, PyErr_Fetch @@ -181,7 +182,7 @@ def gap_root(): sage: from sage.libs.gap.util import gap_root sage: gap_root() # random output - '/home/vbraun/opt/sage-5.3.rc0/local/gap/latest' + '/usr/lib/gap' """ if os.path.exists(sage.env.GAP_ROOT_DIR): return sage.env.GAP_ROOT_DIR @@ -259,6 +260,18 @@ cdef initialize(): global _gap_is_initialized, environ if _gap_is_initialized: return + # Hack to ensure that all symbols provided by libgap are loaded into the + # global symbol table + # Note: we could use RTLD_NOLOAD and avoid the subsequent dlclose() but + # this isn't portable + cdef void* handle + handle = dlopen("libgap.so", RTLD_NOW | RTLD_GLOBAL) + if handle == NULL: + raise RuntimeError( + "Could not dlopen() libgap.so even though it should already " + "be loaded!") + dlclose(handle) + # Define argv and environ variables, which we will pass in to # initialize GAP. Note that we must pass define the memory pool # size!