Привет. У меня в sbcl под DragonFlyBSD (на обоих архитектурах x86 и x86_64) странный баг при компиляции iolib.
В src/syscalls/ffi-functions-unix.lisp подключается самодельная библиотека автора iolib - libfixposix:
;; FIXME: move this into an ASDF operation
(eval-when (:compile-toplevel :load-toplevel :execute)
(define-foreign-library libfixposix
(t (:default "libfixposix")))
(use-foreign-library libfixposix))
Когда я делаю так:
(trace sb-alien::dlopen)
(asdf:load-system :iolib)
получаю такую ошибку: http://pastebin.com/LSJ2s8MG
Кусок из thr_init.c:
/*
* Set up the thread stack.
*
* Create a red zone below the main stack. All other stacks
* are constrained to a maximum size by the parameters
* passed to mmap(), but this stack is only limited by
* resource limits, so this stack needs an explicitly mapped
* red zone to protect the thread stack that is just beyond.
*/
if (mmap(_usrstack - _thr_stack_initial -
_thr_guard_default, _thr_guard_default,
0, MAP_ANON | MAP_TRYFIXED, -1, 0) == MAP_FAILED) {
PANIC("Cannot allocate red zone for initial thread");
}
Беспокоит эта строчка из LDB: CSP = 0x800fd4ae8. По этому адресу (где-то с 0x800000000) в драгонфлае размещаются shared libraries. Самое обидное что /proc/sbcl_pid/map вообще пуст.
Ошибка повторяется в 100% случаев, но если выйти и повторить компиляцию (без удаления накомпилированного), то всё будет OK. Тот же результат даст удаление ненужного eval-when.
В FreeBSD ошибки нет, хотя адресное пространство делится так же, но, внезапно:
if (mmap(_usrstack - _thr_stack_initial -
_thr_guard_default, _thr_guard_default, 0, MAP_ANON,
-1, 0) == MAP_FAILED)
PANIC("Cannot allocate red zone for initial thread");
Нет MAP_FIXED, а значит нет гарантии, что гард стека создался правильно, не?
В gdb, подключенному к sbcl я вижу бектрейс только с момента, как получил SIGABRT из _thread_init и вошел в handler. Можно ли как-то переключить контекст на то, что было до вызова я не нашел.
В общем, господа телепаты, предлагайте, что мне можно тут делать кроме как вдоль