GCC для ARM и размер переменных

Feb 21, 2005 5 Replies

Hello, All!



Работаю я с Rowley Crossstutio, (gcc испльзуется в ней в качестве компилятора) и вдруг мне перестало хватать ОЗУ, хотя, по моим оценкам, до этого еще должно быть далеко. Стал я смотреть в чем дело и ужаснулся. Сделал маленький тестовый фрагмент и прошу его прокоментировать, особенно тех, кто использует gcc. Опишу, что я делаю: ================ тестовый файл ===================== unsigned char uc; unsigned short us; unsigned long ul;



int main() { return 0; } ====================================================



===== так я его компилирую - линкую ================ gcc -nostdlib -march=armv4t -mlittle-endian -S test.c gcc -nostdlib -march=armv4t -mlittle-endian -c test.c ld -nostdlib -e0 --omagic -EL -Tldscript.tmp -o test.elf -M test.o ====================================================



============= смотрю test.s ======================== ... .comm uc, 1, 8 .comm us, 2, 16 .comm ul, 4, 32 ... ====================================================



Проблема в том, что третья цифра, судя по htlp-у, это выравнивание символа в _байтах_, а здесь, похоже, на "в битах". Но линкер тоже считает, что в байтах:



============== это результат работы линкера ======= ... COMMON 0x40000360 0x29 test.o 0x0 (size before relaxing) 0x40000360 us 0x40000380 ul 0x40000388 uc ... ====================================================



gcc version 3.3.3



И главный вопрос: "Что делать?"



With best regards, Leha Bishletov. E-mail: snipped-for-privacy@rol.ru



Привет, Alex! Вы писали to Leha Bishletov on Mon, 21 Feb 2005 15:38:59 +0300:

LB>> gcc version 3.3.3 AM> Обнови gcc. 3.4.1 генерит вот такое:

А где ты его берешь, готовый под Win?

With best regards, Leha Bishletov. E-mail: snipped-for-privacy@rol.ru

Hello Leha.

21 Feb 05 12:37, you wrote to all:

LB> Проблема в том, что третья цифра, судя по htlp-у, это выравнивание LB> символа в _байтах_, а здесь, похоже, на "в битах". Hо линкер тоже LB> считает, что в байтах:

Посмотрел в своем проекте - да, действительно, есть такая жопа. А я и не обратил внимания.

LB> И главный вопрос: "Что делать?"

Исправить макрос: ASM_OUTPUT_ALIGNED_COMMON в файле gcc/config/arm/elf.h по аналогу, как в других архитектурах (напрмер M68K). И перекомпилировать.

Еще можно попробовать gcc-3.4.2 В нем этого макроса нет вообще. А значит, и глюки, наверное, тоже.

Alexey

Привет Leha!

21 Feb 05 12:37, Leha Bishletov писал All:

LB> ============= смотрю test.s ======================== LB> ... LB> .comm uc, 1, 8 LB> .comm us, 2, 16 LB> .comm ul, 4, 32 LB> ... LB> ====================================================

LB> gcc version 3.3.3

Обнови gcc. 3.4.1 генерит вот такое:

=================================================== .comm uc,1,1 .comm us,2,2 .comm ul,4,4 ===================================================

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Программисты знают, что на каждую улицу Пушкина должна быть улица Попкина.

Привет Leha!

21 Feb 05 15:10, Leha Bishletov писал Alex Mogilnikov:

LB>>> gcc version 3.3.3 AM>> Обнови gcc. 3.4.1 генерит вот такое:

LB> А где ты его берешь, готовый

ftp://gcc.gnu.org/pub/gcc/releases/gcc-3.4.1/

LB> под Win?

А он под что соберешь, под то и будет.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Чудо-йогурт Био. Чемпион среди какао.

Hello!

Leha Bishletov писал:

[...]

Неправильное выравнивание в Crossstutio действительно имеет место быть. Я борюсь с этой гадостью принудительным заданием секции данных например так (для 16-битных переменнеых): volatile unsigned short wAdcRawData[5] __attribute__ ((aligned(2), section(".data16")));

При этом нужно создать соответствующую секцию в .xml файле линковки и определить значение Alignment.

Атрибут aligned для стандартной секции данных НЕ ДЕЙСТВУЕТ (видимо баг), поэтому обязательно нужно задавать свою секцию данных.

Еще можно абсолютно все переменные объединить в одну структуру - внутри структур данные распределяются правильно.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required