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

 
 
> Размер кода вырастает на ~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
 
Start new topic
Ответов
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
imiron13
сообщение Nov 29 2012, 14:56
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #4


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

Группа: Свой
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 02:34
Рейтинг@Mail.ru


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