LINUX.ORG.RU

Странный баг в sbcl(?) при dlopen

 ,


0

2

Привет. У меня в 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");
	}
MAP_TRYFIXED значит, что если эти адреса уже отображены, то возвращаем ошибку.

Беспокоит эта строчка из 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. Можно ли как-то переключить контекст на то, что было до вызова я не нашел.

В общем, господа телепаты, предлагайте, что мне можно тут делать кроме как вдоль

Ещё интересно, где у sbcl control stack? То что не через !gencgc-space-setup устанавливается - это понятно. Там, судя по всему, readonly, static и куча.

AVC_Verehrer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.