OSDev http://osdev.su/ |
|
Инициализация глобальных объектов C++ http://osdev.su/viewtopic.php?f=5&t=880 |
Страница 1 из 2 |
Автор: | Mirmik [ 28 мар 2014, 23:22 ] |
Заголовок сообщения: | Инициализация глобальных объектов C++ |
Спасите меня! ![]() Никак не могу разобраться с инициализацией глобальных объектов на C++. Есть класс... Сложный, хитрый, с полями и виртуальными функциями. Если объявлять его экземпляр локальным объектом, всё замечательно работает. Если глобальным, то разумеется ничего не работает, ибо непроинициализирован. Вопрос. Как инициализировать глобальные объекты? Платформа ARM, компиляция идёт с nostartfiles, поэтому возникает такой вопрос. |
Автор: | Himik [ 29 мар 2014, 20:31 ] |
Заголовок сообщения: | Re: Инициализация глобальных объектов C++ |
Из-за параметра nostartfiles объект не может про-инициализироваться на запуске. Можно попробовать специально вызывать функцию инициализации объекта из основной процедуры модуля. |
Автор: | Mirmik [ 29 мар 2014, 20:59 ] |
Заголовок сообщения: | Re: Инициализация глобальных объектов C++ |
Это я и так знаю ![]() Какую функцию надо вызывать? Есть же она где-то, функция инициализации глобальных объектов, и как-то называется... А вот как?... |
Автор: | Himik [ 29 мар 2014, 21:06 ] |
Заголовок сообщения: | Re: Инициализация глобальных объектов C++ |
Я не знаю. Посмотри карту объектов, которая генерируется линковщиком, может и найдёшь расположение конструктора объекта. Но не факт, что это поможет. Функция инициализации глобальных объектов расположена в отключённом блоке стартовых процедур, её в модуле просто нет. |
Автор: | Mirmik [ 29 мар 2014, 21:09 ] |
Заголовок сообщения: | Re: Инициализация глобальных объектов C++ |
Ах вот как... А как она называлась? Не может такого быть, чтобы её нельзя было включить. |
Автор: | Himik [ 29 мар 2014, 21:17 ] |
Заголовок сообщения: | Re: Инициализация глобальных объектов C++ |
Процедуры находятся в библиотечных объектниках crti.o crtn.o crt1.o crtbegin.o Попробуй дизассемблировать, может чего найдёшь. Лучше в класс добавить свою процедуру инициализации, и вызывать её. |
Автор: | Mirmik [ 29 мар 2014, 22:21 ] |
Заголовок сообщения: | Re: Инициализация глобальных объектов C++ |
Конструктор глобальных объектов вроде есть... Называется он __static_initialization_and_destruction_0 Во всяком случае похож. Надо еще понять как его вызвать. Попытка вызова влоб даёт ошибку сегментации. 0_о. Инициализация - хорошо, но не хотелось бы... Все же не зря конструкторы придумали... |
Автор: | Himik [ 29 мар 2014, 22:42 ] |
Заголовок сообщения: | Re: Инициализация глобальных объектов C++ |
Лучше прилинкуй файлы crt1.o (содержит точку входа _start) и crti.o, они содержат только код инициализации и ничего лишнего. |
Автор: | Mirmik [ 29 мар 2014, 22:48 ] |
Заголовок сообщения: | Re: Инициализация глобальных объектов C++ |
... Там есть функция инит... Но она какая-то странная и не помогает... Функции __do_global_ctors_aux почему-то нету... Хотя есть функция __do_global_dtors_aux. Мне в общем-то не нужно их линковать... Они каким-то образом сами линкуются. Вероятно вместе с stdlib. В общем, я чего-то там явно недопонимаю.. |
Автор: | Himik [ 29 мар 2014, 22:50 ] |
Заголовок сообщения: | Re: Инициализация глобальных объектов C++ |
Тогда тебе наверно crtbegin.o нужен. В любом случае, размер ты не сэкономишь. Нет смысла отключать линковку процедуры инициализации, а потом линковать её вручную. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |