Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Размер кода вырастает на ~50 КБ при добавлении простого класса
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
imiron13
Недавно перешел на GCC (ARM Sourcery G++ Lite, newlib). Есть некоторые сложности после использования коммерческого, более простого для пользователя тулчейна.

Сейчас обкатываю на небольшой С++ программе. Размер кода: 17536 байт. Но при добавлении класса с наследованием и виртуальными функциями размер кода возрастает до 64880 байт.

CODE
class a {
virtual void fun() = 0;
};
class b : public a {
virtual void fun() { }
};
b obj1;

Судя по .map-файлу добавляется куча кода из libstdc++. Что там может быть? В map-файле часто встречается слово "exception". Может ли добавляться код для поддержки исключений (собираю с флагом -fno-exceptions)?

Как можно исключить добавление этого кода? Буду благодарен за любые советы, наводки.

P.S. только давайте без холиваров, использовать или нет С++ в эмбеддед и т.д. У каждого свои подходы.
Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
Aaron
не те файлы прикладываете. в мейкфайле добавьте:
CXXFLAGS += -fno-exceptions -fno-rtti
AHTOXA
Попробуйте добавить к своему проекту файл вот из этого сообщения. Должно помочь.
imiron13
Цитата(Aaron @ Nov 29 2012, 15:55) *
не те файлы прикладываете. в мейкфайле добавьте:
CXXFLAGS += -fno-exceptions -fno-rtti

Мейкфайлы генерятся автоматически эклипсом. Флаги -fno-exceptions -fno-rtti указаны и добавляются при вызове g++, вроде с этим все норм.

Цитата(AHTOXA @ Nov 29 2012, 16:11) *
Попробуйте добавить к своему проекту файл вот из этого сообщения. Должно помочь.

добавил, линкер выдает:
../sys.o: In function `__cxa_guard_acquire':
D:\work\arm_eclipse_projects\demo3-lpc2106\Debug/../sys.c:15: multiple definition of `__dso_handle'
d:/soft/codesourceryg/bin/../lib/gcc/arm-none-eabi/4.3.3/crtbegin.o:(.data+0x0): first defined here#46;./lib/gcc/arm-none-eabi/4.3.3/crtbegin.o:(.data+0x0): first defined here

если __dso_handle описать как extern:
extern void * __dso_handle;
то собирается, работает и размер кода в порядке. Это корректно?

Большое спасибо за помощь. Без этого форума было бы очень трудно стартануть.
AHTOXA
Цитата(imiron13 @ Nov 29 2012, 20:56) *
если __dso_handle описать как extern:
extern void * __dso_handle;
то собирается, работает и размер кода в порядке. Это корректно?

Ну если работает, то наверное корректно sm.gif
Это же просто трюк, который не даёт компилятору использовать исключения при обработке виртуальных функций.
MBR
Попробуйте при линковке добавить ключ -lstdc++

Если я правильно понимаю, линкеру нужно явно указывать, что компилируются плюсы. Стандартные либы у gcc очень тяжелые, с этим ничего не сделаешь. Newlib не сильно лучше.
klen
ну мы тут уже все это проходили до молеулярного состава..... вроде.
1. есть тонкости с компиллером, не только с ключами и своим кодом.
2. просто ключами начисто выключить эксепшены нельза - нужен финту шами который в моей сборке сделан, например при делении uint64_t эксепшены по умолчанию доликовываются - так по стандарту положено даже если С код!!! в своей сборке я исключил такое поведение линкера при сборке libgcc.a
3. сами классы тут нипричем даже с виртуальными функциями и тд. это всего лиш продвинутые структуры.

если хотите можем опять опыты с демострацией результатов провести но япро эту шнягу и как боротся с еей уже писал тут.
imiron13
Цитата(MBR @ Dec 4 2012, 08:36) *
Попробуйте при линковке добавить ключ -lstdc++

Если я правильно понимаю, линкеру нужно явно указывать, что компилируются плюсы. Стандартные либы у gcc очень тяжелые, с этим ничего не сделаешь. Newlib не сильно лучше.

Совет тов. Антохи помог. Тут на самом деле это уже много раз обсуждали. Спасибо всем за советы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.