#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