Skip to content

macrologist/sbcl-librarian

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

62 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sbcl-librarian

An opinionated interface for creating C- and Python-compatible shared libraries in Common Lisp with SBCL. Requires SBCL version >2.1.10.

Building the libcalc example

You can build the example library using the Makefile in the examples/libcalc directory, which produces a header file, a source file, and a core file

You can compile the example like so with:

export SBCL_SRC=~/.roswell/src/sbcl-2.2.4

cd examples/libcalc
make

./example

which creates a shared library and executable using the functions defined in the example system, assuming you have libsbcl.so in a ${SBCL_SRC}/src/runtime/.

The file add-on.lisp in the example/libcalc directory shows how to add new API symbols at link time - the final artifact should be relinked into the final executable either by static or dynamic linkage - things work better on Windows with static linkage. add-on.fasl should be loaded explicitly via the C function lisp_load or the Lisp function lisp-load at runtime.

If you don't have libsbcl.so, make will try to build it for you by calling make-shared-library.sh at ${SBCL_SRC} directory.

Gotcha on Intel macOS

On Intel macOS you MUST specify -pagezero_size 0x100000 when linking the final executable, otherwise SBCL will fail to mmap its static space into the address 0x5000000. This is because Mac decides to make page zero take up a whole 4GB (!), which prevents access to the 32-bit address space. (Ostensibly to prevent null pointer or other such bad (truncated?) pointer dereferences.)

Runtime notes

The SBCL runtime includes a garbage collector and memory allocator.

Process resources SBCL uses:

  • Signal handlers into the process for things like keyboard interrupts (can be turned off). On some platforms this may also entail a stop-the-world GC signal.
  • File descriptors like standard input and output.
  • A fixed address space somewhere in memory. On x86 (32-bit and 64-bit) this needs to be a fixed address space under 4 GB. This is so the compiler can generate manifest literal addresses in machine code on some platforms, as well as to compute stable hashes of certain constants like NIL.

About

Dynamic library delivery tools for SBCL.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Common Lisp 90.7%
  • Python 5.5%
  • Makefile 3.2%
  • C 0.6%