OSDev

для всех
Текущее время: 06 май 2024, 22:19

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 28 мар 2014, 23:22 
Аватара пользователя

Зарегистрирован: 20 мар 2014, 12:53
Сообщения: 45
Спасите меня! :(
Никак не могу разобраться с инициализацией глобальных объектов на C++.

Есть класс... Сложный, хитрый, с полями и виртуальными функциями.

Если объявлять его экземпляр локальным объектом, всё замечательно работает.
Если глобальным, то разумеется ничего не работает, ибо непроинициализирован.

Вопрос. Как инициализировать глобальные объекты?


Платформа ARM, компиляция идёт с nostartfiles, поэтому возникает такой вопрос.

_________________
http://osdev.ru/viewtopic.php?f=4&t=893 - GenOS


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 мар 2014, 20:31 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Из-за параметра nostartfiles объект не может про-инициализироваться на запуске. Можно попробовать специально вызывать функцию инициализации объекта из основной процедуры модуля.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 мар 2014, 20:59 
Аватара пользователя

Зарегистрирован: 20 мар 2014, 12:53
Сообщения: 45
Это я и так знаю :)...


Какую функцию надо вызывать? Есть же она где-то, функция инициализации глобальных объектов, и как-то называется... А вот как?...

_________________
http://osdev.ru/viewtopic.php?f=4&t=893 - GenOS


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 мар 2014, 21:06 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Я не знаю. Посмотри карту объектов, которая генерируется линковщиком, может и найдёшь расположение конструктора объекта. Но не факт, что это поможет.

Функция инициализации глобальных объектов расположена в отключённом блоке стартовых процедур, её в модуле просто нет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 мар 2014, 21:09 
Аватара пользователя

Зарегистрирован: 20 мар 2014, 12:53
Сообщения: 45
Ах вот как... А как она называлась?
Не может такого быть, чтобы её нельзя было включить.

_________________
http://osdev.ru/viewtopic.php?f=4&t=893 - GenOS


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 мар 2014, 21:17 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Процедуры находятся в библиотечных объектниках
crti.o
crtn.o
crt1.o
crtbegin.o
Попробуй дизассемблировать, может чего найдёшь.

Лучше в класс добавить свою процедуру инициализации, и вызывать её.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 мар 2014, 22:21 
Аватара пользователя

Зарегистрирован: 20 мар 2014, 12:53
Сообщения: 45
Конструктор глобальных объектов вроде есть... Называется он

__static_initialization_and_destruction_0

Во всяком случае похож.
Надо еще понять как его вызвать.
Попытка вызова влоб даёт ошибку сегментации. 0_о.

Инициализация - хорошо, но не хотелось бы... Все же не зря конструкторы придумали...

_________________
http://osdev.ru/viewtopic.php?f=4&t=893 - GenOS


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 мар 2014, 22:42 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Лучше прилинкуй файлы crt1.o (содержит точку входа _start) и crti.o, они содержат только код инициализации и ничего лишнего.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 мар 2014, 22:48 
Аватара пользователя

Зарегистрирован: 20 мар 2014, 12:53
Сообщения: 45
... Там есть функция инит... Но она какая-то странная и не помогает...

Функции __do_global_ctors_aux почему-то нету...
Хотя есть функция __do_global_dtors_aux.

Мне в общем-то не нужно их линковать... Они каким-то образом сами линкуются. Вероятно вместе с stdlib.

В общем, я чего-то там явно недопонимаю..

_________________
http://osdev.ru/viewtopic.php?f=4&t=893 - GenOS


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 мар 2014, 22:50 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Тогда тебе наверно crtbegin.o нужен. В любом случае, размер ты не сэкономишь. Нет смысла отключать линковку процедуры инициализации, а потом линковать её вручную.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB