On my Debian system, `dynamic-link' often fails to load shared libraries: Loading using a versioned soname never works:
scheme@(guile-user)> (dynamic-link "libGL.so.1") ERROR: In procedure dynamic-link: ERROR: In procedure dynamic-link: file: "libGL.so.1", message: "file not found" Loading without a library extension doesn't work unless the corresponding *-dev package is installed: scheme@(guile-user)> (dynamic-link "libGL") ERROR: In procedure dynamic-link: ERROR: In procedure dynamic-link: file: "libGL", message: "file not found" It is supposed to work with or without the extension, however because of limitations in the underlying lt_dlopenext function in libtool, neither works. The first doesn't work because contrary to its documentation, lt_dlopenext doesn't always try loading the bare filename first, without appending an extention. The second doesn't work because the versioned soname extension (.so.1) isn't among the ones that lt_dlopenext tries to append. It does try the unversioned extension (.so), but in Debian the unversioned symlink is only available when the corresponding *-dev package is installed. Here is a related libtool bug report: https://debbugs.gnu.org/8976 Note that there are arguably two distinct issues: (1) lt_dlopenext not trying the bare filename in all cases (2) lt_dlopenext not trying versioned soname extensions. Obviously one way to address this would be to fix these two issues in lt_dlopenext in libtool. Alternatively, the (system foreign) module in guile could provide a simple low-level wrapper around lt_dlopen, and possibly implement the higher level functionality of `dynamic-link' (additional search paths, guessing extensions etc.) in scheme.