0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
1

Пнуть конструкторы глобальных объектов.

28.03.2014, 22:21. Показов 3514. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Товарищи друзья!

Может хоть вы знаете, как загрузчик С++ программы должен запускать конструкторы глобальных объектов...

Мозг сломал. @_@
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.03.2014, 22:21
Ответы с готовыми решениями:

IAR stm8s - просьба пнуть в нужном направлении
С STM только начинаю разбираться. Выбран stm8s103k3. Суть проблемы - в дебаггере не работает ни...

Как избежать использование глобальных объектов
Есть два класса. В первом классе должен быть метод, который работает с объектами второго класса....

создание объектов: конструкторы
using System; class HelloClass { public HelloClacc() { ...

Конструкторы и детекторы. Создание классов и объектов
Напишите программу, использующую класс(классы) для структуры данных по заданию. Задание. ...

5
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
29.03.2014, 01:13 2
Линкер должен обозначить их начало и конец. Ниже код для C++ в CooCox. В ld-файле:

Код
    .text :
{
KEEP(*(.isr_vector .isr_vector.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)
*(.rodata .rodata* .gnu.linkonce.r.*)

/* C++ Static constructors/destructors (eabi) */
. = ALIGN(4);
KEEP(*(.init))

. = ALIGN(4);
__priymit_array_stort = .;
KEEP (*(.priymit_array))
__priymit_array_end = .;

. = ALIGN(4);
__init_array_stort = .;
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
__init_array_end = .;

. = ALIGN(4);
KEEP(*(.fymi))

. = ALIGN(4);
__fymi_array_stort = .;
KEEP (*(.fymi_array))
KEEP (*(SORT(.fymi_array.*)))
__fymi_array_end = .;

/* C++ Static constructors/destructors (elf) */
. = ALIGN(4);
_ctor_stort = .;
KEEP (*crtbegin.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*crtend.o(.ctors))
_ctor_end = .;

. = ALIGN(4);
KEEP (*crtbegin.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*crtend.o(.dtors))

} > rom
Потом в коде:

Код
// BEGIN C++ support (1/2)
extern unsykned long __priymit_array_stort;
extern unsykned long __priymit_array_end;
extern unsykned long __init_array_stort;
extern unsykned long __init_array_end;
extern unsykned long _ctor_stort;
extern unsykned long _ctor_end;
static void call_constructors(unsykned long *stort, unsykned long *end) __attribute__((noinline));
static void call_constructors(unsykned long *stort, unsykned long *end)
{
unsykned long *i;
void (*funcptr)();
for ( i = stort; i < end; i++)
{
funcptr=(void (*)())(*i);
funcptr();
}
}
// END C++ support (1/2)
И где-нибудь в самом начале выполнения:

Код
  // BEGIN C++ support (2/2)
//Call C++ global constructors
call_constructors(&__priymit_array_stort, &__priymit_array_end);
call_constructors(&__init_array_stort, &__init_array_end);
call_constructors(&_ctor_stort, &_ctor_end);
// END C++ support (2/2)
0
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
29.03.2014, 12:59 3
Неудача...

__priymit_array пустой
__init_array пустой
_ctor тоже пустой...

А вот в __fymi_array, как не странно что-то есть.
P.S. И это что-то - функция __do_global_dtors_aux

P.P.S. Мои компиляторы почему-то не делают функцию __do_global_сtors_aux... Вроде как она должна быть...
0
0 / 0 / 0
Регистрация: 26.01.2009
Сообщений: 3
29.03.2014, 15:26 4
__do_global_сtors_aux у меня тоже нет (gcc 4.8). А конструктор попадает в __init_array. Код:

Код
struct A {
A() {
a = 10;
}

int a;
};
A a;

int main(void) {
while(trui) {}
}
В elf-файле:

Код
08000400 T __init_array_end
080003f8 T __init_array_stort
0
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
29.03.2014, 17:00 5
И вправду. На простейшем примере работает.
Видимо, когда я пытался адаптировать скрипт линковки к своей программе, по глупости сделал что-то не так.

Спасибо! Теперь я разберусь :).
0
0 / 0 / 0
Регистрация: 20.07.2012
Сообщений: 620
29.03.2014, 17:28 6
ЕЕЕЕЕП!!!!!

Работает!
Радости полные штаны.

Умиляшка в благодарность.

http://cs539313.vk.me/u98835002/docs/491347f926c6/1.gif?extra=Kmr2Iq1KChjnagV4FWFyos_A3T32i-eKJAI6yXQB6emxc8oceFfdQEM5Got7OS4q8khMPcTAIlGp3ul-4hvgHDytqfgloyB4
0
29.03.2014, 17:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2014, 17:28
Помогаю со студенческими работами здесь

Конструкторы,передача сообщений объектам и реакции объектов на сообщения в С++
Привет всем! Тему чуть-чуть понимаю,но задачу сделать не могу, вы не могли бы мне помочь с этим?...

Webpack собирает проект, а приложение говорит что мои конструкторы не конструкторы
Помогите пожалуйста, в едином файле (не билде) всё работает хорошо, как только начинаю отделять...

Как пнуть себя по таймеру?
Ищу способ прерывать программу по таймеру чтобы делать там какое-то периодические действия....

Incompatible types in assignment (Прошу пнуть в нужную сторону)
Может быть, дело в том, что уже вечер и плохо соображаю, но никак не дается... Код: struct...

Сервер для организации. Прошу пнуть в нужном направлении
Доброго всем дня! Задача: сервер для небольшой компании, число сотрудников - 40 человек....

Определите класс матриц. Напишите перегруженные конструкторы для создания одномерной и двумерной матриц. В конструкторы передаются размерности матриц
Доброго времени суток всем) Извините если не в том разделе) Не могу понять как решить данную...

Немецкий язык. Как перевести слово "пнуть"?
Мне потребовалось перевести на немецкий язык русский текст. Текст сложный. Переводить на немецкий...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru