Я столкнулся со странной проблемой, связанной с исключениями, создаваемыми через границы DSO.
Когда код скомпилирован для встроенной платы linux с arm-none-linux-gnueabi-g ++, исключения не могут быть перехвачены, если скомпилирован с помощью обычного компилятора gcc из ubuntu, все работает нормально: (*
Для уточнения:
У нас есть три компонента:
один исполняемый файл, который загружает DSO через dlopen (), dlsym () ..
один файл DSO (libMod2.so), содержащий класс MOD2, который выбрасывает самоопределенное исключение EException
(выводится из std :: runtime_error) при вызове throwException ()
один файл DSO (libtest.so), содержащий класс MOD1, который получает указатель на класс MOD2 и вызывает MOD2 :: throwException ().
void MOD1::setMod2(IMOD2* mod2){
cout << "Calling mod2 throwException()" << endl;
try{
mod2->throwException();
}catch(EException& e){
cout << "Got you!" << endl << e.what() << endl;
}catch (...){
cout << "slippery shit..." << endl;
}
}
Проблема теперь в том, что Исключение не может быть перехвачено первым обработчиком исключений на целевой руке.
Я думаю, что проблема возникает при связывании:
A nm -C
в DSO показывает некоторые различия при поиске исключений EException.
TARGET:
toterhaa@develop-TT:/var/lib/tftpboot$ /opt/freescale/usr/local/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/arm-none-linux-gnueabi-g++ --version
arm-none-linux-gnueabi-g++ (4.4.4_09.06.2010) 4.4.4
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOS
toterhaa@develop-TT:/var/lib/tftpboot$ nm -C libtest.so | grep EEx
00009ef0 V typeinfo for EException
000017f4 V typeinfo name for EException
Ubuntu:
toterhaa@develop-TT:/nfs$ g++ --version
g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
toterhaa@develop-TT:/nfs$ nm -C libtest.so | grep EEx
0000303c d DW.ref._ZTI10EException
00002edc V typeinfo for EException
00001373 V typeinfo name for EException
DSO, созданный с помощью Ubuntu GCC, имеет дополнительный символ DW.ref._ZTI10EException
. Я думаю, что решение состоит в том, чтобы ввести этот символ также в руку DSO, но как?
Кто-нибудь знает эту проблему?