Обработка исключений в компиляторе gcc в AIX

#aix

#aix

Вопрос:

Я использую компиляторы AIX 7.1 и gcc 8.3. Я вижу, что генерируемые исключения не перехватываются, если я создаю с флагом -Wl,-G. В приведенном ниже коде, если я не использую флаг -Wl,-G, я вижу «catch int». С этим флагом программные ядра.

 void foo()
{
 try {
   throw 1;
 } catch(intamp;) {
   std::cout << “catch int” << std::endl;
 }
}

int main()
{
 foo();
}
  

Я предполагаю, что обработка исключений отключена по умолчанию и должна быть включена с помощью какого-либо флага компилятора. Есть ли у кого-нибудь еще опыт работы с этим? Пожалуйста, обратите внимание, что это специфично для платформы AIX.

Вот как я создаю. Весь код находится в 1 файле.

голый-08 $ g -Wl,-G 1.cc

голый -08 $ ./a.out

завершение вызывается после создания экземпляра IOT-ловушки ‘int’ / прерывания (сброс ядра)

голый-08 $ g -Wl,-G -lsupc 1.cc

голый -08 $ ./a.out

завершение, вызываемое после создания экземпляра ‘int’, завершается рекурсивно IOT / прерыванием ловушки (сброс ядра)

Без опции -G я получаю ошибку привязки, показанную ниже (не в игрушечной программе выше, а в моем реальном коде).

ld: 0711-317 ОШИБКА: Неопределенный символ: .std::basic_istream >::seekg (длинный длинный, std::_Ios_Seekdir) ld: 0711-317 ОШИБКА: Неопределенный символ: .sqrtf ld: 0711-317 ОШИБКА: Неопределенный символ: std::basic_streambuf >::seekoff (длинный длинный, std::_Ios_Seekdir, std: :_Ios_Openmode)

Кто-нибудь видел это? Я нахожусь в трудном положении. Используйте опцию -G, чтобы избавиться от вышеупомянутой ошибки связывания, но с этой опцией обработка исключений C не работает.

Комментарии:

1. Попробуйте добавить -lsupc в linkage.

2. Добавление supc было одной из первых вещей, которые я попробовал, не помогло. Я поставил точку останова в __cxa_throw, и, похоже, что мы сталкиваемся с ошибкой разматывания, которая заставляет ее вызывать std::terminate.

3. Пожалуйста, отредактируйте свой исходный пост и опишите, как вы связали общий объект и основной исполняемый файл. Я думаю, вам следует использовать -lsupc в обоих случаях.

4. Почему вы используете option при создании исполняемого файла -G ? Он предназначен для использования при создании общих объектов.

Ответ №1:

Не используйте опцию -G . Если вы хотите использовать какую-либо специфичную для AIX опцию, используйте -brtl :

 g   -Wl,-brtl -o AmarnathShanbhag AmarnathShanbhag.cc amp;amp; ./AmarnathShanbhag
catch int