реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Размер кода вырастает на ~50 КБ при добавлении простого класса, GCC от Codesourcery, C++, newlib
imiron13
сообщение Nov 29 2012, 12:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 22-02-09
Из: Минск
Пользователь №: 45 206



Недавно перешел на 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. только давайте без холиваров, использовать или нет С++ в эмбеддед и т.д. У каждого свои подходы.
Прикрепленный файл  demo3_lpc2106_map.txt ( 107.21 килобайт ) Кол-во скачиваний: 328

Прикрепленный файл  demo3_lpc2106_with_classes_map.txt ( 300.99 килобайт ) Кол-во скачиваний: 429
Go to the top of the page
 
+Quote Post
Aaron
сообщение Nov 29 2012, 12:55
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



не те файлы прикладываете. в мейкфайле добавьте:
CXXFLAGS += -fno-exceptions -fno-rtti
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 29 2012, 13:11
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Попробуйте добавить к своему проекту файл вот из этого сообщения. Должно помочь.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
imiron13
сообщение Nov 29 2012, 14:56
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 22-02-09
Из: Минск
Пользователь №: 45 206



Цитата(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;
то собирается, работает и размер кода в порядке. Это корректно?

Большое спасибо за помощь. Без этого форума было бы очень трудно стартануть.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Nov 29 2012, 16:33
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(imiron13 @ Nov 29 2012, 20:56) *
если __dso_handle описать как extern:
extern void * __dso_handle;
то собирается, работает и размер кода в порядке. Это корректно?

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
MBR
сообщение Dec 4 2012, 05:36
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Попробуйте при линковке добавить ключ -lstdc++

Если я правильно понимаю, линкеру нужно явно указывать, что компилируются плюсы. Стандартные либы у gcc очень тяжелые, с этим ничего не сделаешь. Newlib не сильно лучше.
Go to the top of the page
 
+Quote Post
klen
сообщение Dec 4 2012, 08:52
Сообщение #7


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



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

если хотите можем опять опыты с демострацией результатов провести но япро эту шнягу и как боротся с еей уже писал тут.
Go to the top of the page
 
+Quote Post
imiron13
сообщение Dec 7 2012, 15:05
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 22-02-09
Из: Минск
Пользователь №: 45 206



Цитата(MBR @ Dec 4 2012, 08:36) *
Попробуйте при линковке добавить ключ -lstdc++

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

Совет тов. Антохи помог. Тут на самом деле это уже много раз обсуждали. Спасибо всем за советы.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 23:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016