Возникла проблема: в библиотеке, написанной на C++ не обрабатываются исключения. Не обрабатываются по причине указания линкеру ld опций:
-nostartfiles
или
-nostdlibs
Эти опции необходимы для сборки, так как библиотека содержит функции
_init и _fini. Если не указывать эти опции, получим ошибку типа "multiple definition". Если указывать, то либа собирается, но исключения не перехватываются - сразу вызывается abort. Пример ниже:
-----------------------------------------------------------------------
//файл ex_dll.cpp
#include <stdio.h>
extern "C"
void _init()
{
}
extern "C"
void _fini()
{
}
void test()
{
try
{
throw 10;
}
catch(...)
{
printf("Exception Catched in %s %d\n",__FILE__,__LINE__);
}
}
-----------------------------------------------------------------------
//файл ex_test.cpp:
#include <stdio.h>
void main()
{
test();
}
-----------------------------------------------------------------------
//файл makefile:
CC = g++
PROG = test
$(PROG):libex_dll.so
$(CC) -L./ -lex_dll -fexceptions -fpic -g3 -o $(PROG) ex_test.cpp
strip $(PROG)
libex_dll.so:
$(CC) -shared -fexceptions -nostdlib -g3 -o libex_dll.so ex_dll.cpp
#-fpic -fexceptions -nostartfiles
clean:
rm -f *.o *.exe *.so $(PROG)
-----------------------------------------------------------------------
Суть примерно такая. Реальное приложения, естессно, посложнее, но приведенный пример точно отражает суть проблемы. Буду очень благодарен, если кто - то поможет енту проблему решить.
На всякий случай : OS: Linux (k 2.4.12); gcc 2.95.3 (хотя, похоже, это проблема компилера и линкера - под Solaris 7 была та же история).