Начать реализацию обработки исключений я решил в простенькой конструкции в коде:
try {
throw 1;
} catch (...) {
}
Но наткнулся на ошибку - undefined reference to `typeinfo for int'.
И вот возникла непонятная задача - как же мне описать typeinfo for int?
gcc очень загадочен. О существовании типа std::type_info он знает безо всяких дополнительных объявлений, что не мешает описать его локально. Но в gcc этот класс чисто базовый, констуктор у него защищен. На это можно было бы наверное наплевать и объявить все по своему, если бы в этом был смысл.
Но необходимый мне typeinfo должен иметь другой тип: __fundamental_type_info. И мне нужно проинициализировать его статически, для чего я долго изголялся с размещающими new в статическом буфере...
Стоит отметить что до сих пор линкер исправно ругался на отсутсвие typeinfo. Но после этого неожиданно начал ругаться на отсутвие 'vtable for __cxxabiv1::__pointer_type_info', странно.
Исследование модуля objdump'ом показало в нем наличие большого количества typeinfo. Стал выяснять - откуда они взялись. И вот ведь загадочный gcc...
Стоит вставить следующий код:
namespace __cxxabiv1 {
class __fundamental_type_info : public std::type_info
{
virtual ~__fundamental_type_info() { }
};
}
Как все необходимые фундаментальные typeinfo появляются как по волшебству. И с размещающим new я изголялся зря. :)
А с исключениями пока еще далеко не все понятно, разбираюсь.
3 коммент.:
Не смотря на то, что автор удалил свой комментарий, отвечу... Что все дело именно в том, что стандартные библиотеки в моем проекте не подключены. Там специально для этого стоит: -nostdinc -nostdlib -nostartfiles -nodefaultlibs
Поэтому и натыкаюсь на такие интересные проблемы. :)
Автор прочитал сообщение внимательно и понял, что библиотеки специально не подключены. Потому и удалил свой комментарий ;)
Отправить комментарий