Я использую SWI-Prolog интерфейс на иностранном языке для C ++, пытаясь интегрировать какой-то другой ресурс.
В основном это работает, но любая попытка вызвать исключение приводит кSIGSEGV.Исключения обычно используются при проверке пользовательских параметров и, следовательно, являются фундаментальной частью интерфейса.
Я компилирую SWI-Prolog из исходного кода (с помощью прилагаемого скрипта), а флаги CXX
-c -O2 -gdwarf-2 -g3 -Wall -pthread -fPIC
Я использую те же флаги для компиляции моего кода C ++, который собран в .so, динамически загружается в SWI-Prolog (я думаю, через dlopen).
Проверка стека(через GDB) после того, как SEGV показывает IP в <+36>, внутри __cxa_allocate_exception.Вероятно, __cxa_get_globals @ plt не доступен.
Dump of assembler code for function __cxa_allocate_exception:
0x00007ffff1d80220 <+0>: push %r12
0x00007ffff1d80222 <+2>: lea 0x80(%rdi),%r12
0x00007ffff1d80229 <+9>: push %rbp
0x00007ffff1d8022a <+10>: mov %r12,%rdi
0x00007ffff1d8022d <+13>: push %rbx
0x00007ffff1d8022e <+14>: callq 0x7ffff1d1de30 <malloc@plt>
0x00007ffff1d80233 <+19>: test %rax,%rax
0x00007ffff1d80236 <+22>: mov %rax,%rbx
0x00007ffff1d80239 <+25>: je 0x7ffff1d802d8 <__cxa_allocate_exception+184>
0x00007ffff1d8023f <+31>: callq 0x7ffff1d1efc0 <__cxa_get_globals@plt>
0x00007ffff1d80244 <+36>: addl $0x1,0x8(%rax)
0x00007ffff1d80248 <+40>: test $0x1,%bl
0x00007ffff1d8024b <+43>: mov %rbx,%rdi
0x00007ffff1d8024e <+46>: mov $0x80,%edx
0x00007ffff1d80253 <+51>: jne 0x7ffff1d803d0 <__cxa_allocate_exception+432>
0x00007ffff1d80259 <+57>: test $0x2,%dil
Только для ресурса Мне удалось найти подходящие утверждения
Требуется исключениепоиск типа info
, и это может иметь смысл для SIGSEGV.
Но я не могу сейчас продолжить.Конечно, я надеюсь на какой-нибудь волшебный флаг CXX или LD.Или я должен украсить точки входа в мою библиотеку (я знаком с Windows declspec (s), я широко использовал их для создания библиотек расширений MFC) или что-то еще?