Код
CodeSourcery arm-2011.09-69-arm-none-eabi
section size addr
.isr_vector 0x10c 0x8000000
.text 0x37d4 0x800010c
.ARM.exidx 0x8 0x80038e0
.data 0xf8 0x20000000
.bss 0xb0c 0x200000f8
._usrstack 0x100 0x20000c04
Linaro gcc-arm-none-eabi-4_6-2012q1-20120316
section size addr
.isr_vector 0x10c 0x8000000
.text 0x380c 0x800010c
.ARM.exidx 0x8 0x8003918
.data 0x434 0x20000000
.bss 0xb0c 0x20000434
._usrstack 0x100 0x20000f40
section size addr
.isr_vector 0x10c 0x8000000
.text 0x37d4 0x800010c
.ARM.exidx 0x8 0x80038e0
.data 0xf8 0x20000000
.bss 0xb0c 0x200000f8
._usrstack 0x100 0x20000c04
Linaro gcc-arm-none-eabi-4_6-2012q1-20120316
section size addr
.isr_vector 0x10c 0x8000000
.text 0x380c 0x800010c
.ARM.exidx 0x8 0x8003918
.data 0x434 0x20000000
.bss 0xb0c 0x20000434
._usrstack 0x100 0x20000f40
Сразу обратил внимание на раздувание секции .data. Расследование показало, что это из-за массива impure_data. Почти килобайт отъело! Код не раздулся, а даже уменьшился, если учесть, что там лежат данные инициализации для всё того же impure_data.
На линаро вразумительного ответа не получил, обещали в версии 4.7 к концу года поправить. Гугление показало, что это недостаток newlib и ключами компиляции\сборки проекта делу не помочь. Похоже, что не все могут нормально библиотеку собрать, чтобы ею можно было пользоваться для контроллеров с маленькой оперативкой.
Должен сказать, что массив impure_data присутствует в обоих случаях (у меня всего одна однобайтовая обнуляемая в стартапе переменная, остальное - impure_data), но с CodeSourcery ещё можно как то жить. Результат же Linaro ни в какие ворота не лезет.
На Linaro польстился на будущее из-за наличия у них полных библиотек с аппаратной плавучкой.
Кто-нибудь сталкивался с проблемой этого пресловутого массива и как избежать его появления?