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/