SIGSEGV в DSO, смешанный C / C ++ - PullRequest
       21

SIGSEGV в DSO, смешанный C / C ++

1 голос
/ 15 февраля 2012

Я использую 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) или что-то еще?

1 Ответ

0 голосов
/ 29 октября 2015

При вызове из Пролога вы не можете выбросить какие-либо исключения в ядро ​​Пролога. Интерфейс C ++ будет перехватывать PlException и его подклассы и преобразовывать их в исключения Prolog. Все остальные исключения не должны выходить из вашей библиотеки.

Поскольку SWI Prolog - это LGPL, вы, вероятно, динамически ссылаетесь на него. Следовательно, вы должны убедиться, что все брошенные C ++ имеют видимость по умолчанию в системах ELF.

...