|
|
  |
свежак KGP win32/arm/avr/mips/m68k, GNU tools chain |
|
|
|
Jul 21 2009, 19:07
|

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

|
Обнаружил непорядок с arm-kgp-elf (c++). При использовании pure virtual функций Код class foo { virtual void bar() =0; видимо подключается обработка exceptions, несмотря на флаг -fno-exceptions. В результате тянется malloc, который ругается на неопределённый символ end в _sbrk при линковке. Хотелось бы этого избежать  Пока вышел из положения, объявив функции пустыми: Код class foo { virtual void bar() {} Но, может, я что-то упустил из виду?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 22 2009, 03:58
|

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

|
Цитата(AHTOXA @ Jul 21 2009, 23:07)  Обнаружил непорядок с arm-kgp-elf (c++). При использовании pure virtual функций Код class foo { virtual void bar() =0; видимо подключается обработка exceptions, несмотря на флаг -fno-exceptions. В результате тянется malloc, который ругается на неопределённый символ end в _sbrk при линковке. Хотелось бы этого избежать  Пока вышел из положения, объявив функции пустыми: Код class foo { virtual void bar() {} Но, может, я что-то упустил из виду? а что стандарт говорит по этому поводу? нада смотреть. скорее всего можно закомпилять libstdc++ так чтобы вообще исключений не использовались. у меня в проектке есть virtual void bar() =0, и все линкуется. new и delete переопределены с использованием собственых malloc и free (свой менеждер кучи) в любом случае спасибо. -fno-exception уменьшило размер .text в 2! раза  век учись - дураком помреш,
|
|
|
|
|
Jul 22 2009, 06:57
|

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

|
Цитата(klen @ Jul 22 2009, 09:58)  а что стандарт говорит по этому поводу? Сомневаюсь, что там это есть. Как должна реагировать программа при вызове чисто виртуальной функции? Видимо в arm-gcc решили это через какой-то специальный эксепшн. Наверное это не считается обычным exception-ом, и поэтому не регулируется флагом -fno-exceptions. Само по себе это неважно, мне не нравится что тянется malloc. Кто его знает, сколько оно там отожрёт хипа  В msp-gcc использование pure virtual не тянет за собой malloc. Надо проверить на avr-gcc... Цитата нада смотреть. скорее всего можно закомпилять libstdc++ так чтобы вообще исключений не использовались. Даже не знаю, надо ли это... Думаю, что правильнее сделать, чтобы флаг -fno-exceptions действовал более чётко  Цитата в любом случае спасибо. -fno-exception уменьшило размер .text в 2! раза 
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jul 22 2009, 10:40
|

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

|
Цитата(AHTOXA @ Jul 22 2009, 10:57)  Сомневаюсь, что там это есть. Как должна реагировать программа при вызове чисто виртуальной функции? Видимо в arm-gcc решили это через какой-то специальный эксепшн. Наверное это не считается обычным exception-ом, и поэтому не регулируется флагом -fno-exceptions. Само по себе это неважно, мне не нравится что тянется malloc. Кто его знает, сколько оно там отожрёт хипа  В msp-gcc использование pure virtual не тянет за собой malloc. Надо проверить на avr-gcc... Даже не знаю, надо ли это... Думаю, что правильнее сделать, чтобы флаг -fno-exceptions действовал более чётко  что то я вообще сомневаюсь что для arm-elf вообще механизм эксепшенов реализован, так .. хвосты.. нада изучать вопрос и ковырятся...
|
|
|
|
|
Jul 22 2009, 14:17
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(klen @ Jul 22 2009, 15:40)  что то я вообще сомневаюсь что для arm-elf вообще механизм эксепшенов реализован, так .. хвосты.. Оп-па... А что такое там с исключениями? А то я ими довольно широко пользуюсь, до сих пор на неприятности не нарывался... Считаете, на них нельзя так смело полагаться?
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Jul 23 2009, 07:55
|

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

|
Цитата(alx2 @ Jul 22 2009, 18:17)  Оп-па... А что такое там с исключениями? А то я ими довольно широко пользуюсь, до сих пор на неприятности не нарывался... Считаете, на них нельзя так смело полагаться? а у Вас все работает?  поделитесь опытом, как это происходит. я довольно смутно представляю как работает С++ в плане исключений применительно к мелким контролерам. поэтому и написал что "неуверен...", нада было написать "незнаю" 2_AHTOXA и должна вроде.. виртуальные функции работают, тут все ок. я имел ввиду только исключения! VMT как и положено в классах кладется по нулевому смещению, в классе потомке выбирается адресс из нее и все работает, у меня так обертка к задачам FreeRTOS сделана., функцияя кода задачи чисто виртуальная в базовом классе. А вот исключения дело темное! например происходит обращение к NULL или вообще за диапазоном адресации какойнить шины - ядро генерит чтото типа bus abort а дальше то че? Вот тут видимо в обработчике и нада руками приуручивать механизм обработки исключений(библиотечные вызовы ) к конкретному механизму их генерации (аппаратные прервыания по косякам с памятью например). для "не сильно мелких процов" типа ARM720... далее, хде есть MMU, Linux, и тд как я думаю эта прикрутка уже сделано в ядре линуха так как ядро и реализация libc конфигуртся под конкретный проц! я хрюнделем хорошо перерыд ядро линуха и uLibc когда делал девас на Тионе c EP9312, там видать в исходниках все это, и как системные вызовы прикручены к железке и тд. для armv4 armv7 такого нет, может есть? и все работает как у alx2??? мне очень иньтересно  короче говоря я так это понимаю, если не прав то поправте. в студию приглашаются специалисты по внутренней реализации C++ и отдельно к микрофону alx2, расказать как у него работают С++ исключения и собсно на чем?
|
|
|
|
|
Jul 23 2009, 11:35
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(klen @ Jul 23 2009, 12:55)  а у Вас все работает?  поделитесь опытом, как это происходит. Да, работает. throw исключение кидает, catch его ловит. Все в соответствии с правилами языка...
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Sep 1 2009, 18:04
|

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

|
Цитата(AHTOXA @ Jul 23 2009, 15:18)  Непонятно только, почему при упоминании чисто виртуальных функций подтягивается malloc? Посмотрел более предметно. Подтягивается не только malloc, подтягиваются-таки и исключения, как я и предполагал. От банальной замены Код virtual void putch(char ch) { (void)ch; } на Код virtual void putch(char ch) = 0; мой 14-килобайтный проект подрос до 66К  Подтягивается некая __cxa_pure_virtual, за ней write и std::terminate(). А уж из std::terminate() - кранты, _Unwind_SjLj_Register, __cxa_begin_catch, __cxa_end_catch и вся остальная кампания, вплоть до RTTI  Сдаётся мне, что это всё-таки баг, ибо флаг -fno-exceptions запрещает исключения. ЗЫ. Получается, всё же есть возможность создать экземпляр класса с чисто виртуальной функцией?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Sep 2 2009, 11:40
|

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

|
Цитата(AHTOXA @ Sep 1 2009, 22:04)  Посмотрел более предметно. Подтягивается не только malloc, подтягиваются-таки и исключения, как я и предполагал. От банальной замены Код virtual void putch(char ch) { (void)ch; } на Код virtual void putch(char ch) = 0; мой 14-килобайтный проект подрос до 66К  Подтягивается некая __cxa_pure_virtual, за ней write и std::terminate(). А уж из std::terminate() - кранты, _Unwind_SjLj_Register, __cxa_begin_catch, __cxa_end_catch и вся остальная кампания, вплоть до RTTI  Сдаётся мне, что это всё-таки баг, ибо флаг -fno-exceptions запрещает исключения. ЗЫ. Получается, всё же есть возможность создать экземпляр класса с чисто виртуальной функцией? зато работают исключения (которые нам нах ненужны на контроллерах) будет время залезу внутрь и посмотрю че происходит по fno-exceptions, во всяком случае после прересборки мои проекы на 600% ужались. про malloc в эксепшенах мне уже просветили. как минимум исключение пытаеся дернуть память чтоб сообщение(или контекст исключения) создать которое передается обработчику. нахер все это нада вырубать. ктонить объяснит? есть ситуации когда без исключений не написать кода?
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|