Непостижимые исключения C ++ (Shared libs, arm-linux-gnueabi-g ++) - PullRequest
2 голосов
/ 19 августа 2011

Я столкнулся со странной проблемой, связанной с исключениями, создаваемыми через границы 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, но как?

Кто-нибудь знает эту проблему?

1 Ответ

1 голос
/ 22 августа 2011

Проблема решена!

Проблема не связана с линкером, она была проще, намного проще.

Я решил ее, добавив RTLD_GLOBAL к вызову dlopen ().Кажется, что стандартный gcc в моей установке ubuntu устанавливает это по умолчанию, и компилятор для цели arm использует RTLD_LOCAL по умолчанию.

...