Спасибо за разъяснение, но это проблему не решило.
Я поправил Makefile, правда не совсем так, как вы указали:
Код
CFLAGS += -ffunction-sections -fdata-sections # to remove dead code, if any, at link time
LDFLAGS += -Wl,--gc-sections #remove dead code ("garbage collection")
я исправил на:
Код
CFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections
в соответствии с "GNAT User’s Guide For gcc version 4.2.2"
Цитата
7.3.2 Compilation options
The operation of eliminating the unused code and data from the final executable is directly
performed by the linker.
In order to do this, it has to work with objects compiled with the following options:
‘-ffunction-sections’ ‘-fdata-sections’. These options are usable with C and Ada
files. They will place respectively each function or data in a separate section in the resulting
object file.
Once the objects and static libraries are created with these options, the linker can perform
the dead code elimination. You can do this by setting the ‘-Wl,--gc-sections’
option to gcc command or in the ‘-largs’ section of gnatmake. This will create the final
executable, without including the code and data determined as never accessed.
Note that objects compiled without the ‘-ffunction-sections’ and ‘-fdata-sections’
options can still be linked with the executable. However, no dead code elimination will be
performed on those objects (they will be linked as is).
The GNAT static library is now compiled with -ffunction-sections and -fdata-sections.
This allows you to eliminate the unused code of the GNAT library from your executable.
После этого линкер начал требовать прописывания секции для каждой функции и глобальной переменной. После срочного изучения основ написания скриптов для линкера родились следующие строки:
Код
.text : /* collect all sections that should go into FLASH after startup */
{
/* *(.text) /* all .text sections (code) */
*(.text.main)
*(.text.USART0_setup)
*(.text.uart0_putc)
*(.text.Usart_c_irq_handler)
*(.text.LowLevelInit)
*(.text.blinker)
...
Проэкт начал компилиться без ошибок.
Но не все так хорошо:
1) "правильно" компилятся только __inline функции, остальные же по-прежнему компилятся всегда и при удалении их вызова сами они никуда из итогового кода не исчезают.
2) линкер требует прописывания секций так же для функций находящихся в хидере icpsr.h (кроме __inline функций), даже если они не вызывались.
3) а если у меня в проэкте около сотни различных функций наберется? Это ж сколько писанины в разных файлах.

А еще глобальные переменные...
Все вышеизложенное наталкивает на мысль, что решение должно быть гораздо проще.
К тому же, в первоначальном варианте, до вышеописанной правки, для эксперемента я сделал __inline все функции в файле icpsr.h, таким образом получилось два почти одинаковых файла icpsr.h и libAT91SAM7S256.h. Различие было лишь в количестве содержащихся функций. Затем я подключал эти хидеры в соседних строках одного си-файла и вызывал по одной функции из каждого файла тоже в соседних строках, при этом из файла libAT91SAM7S256.h компилировалась только вызываемая функция, а из icpsr.h все по отдельности + еще раз вызываемая на этот раз в нужном месте. Глаза поломал, но разницу между файлами (кроме количества содержащихся функций) не увидел.
В чем может быть причина?
Да и файл libAT91SAM7S256.h поначалу тоже компилился весь, но в какой-то момент во время танцев с бубном заработал как надо, и при последующей правке всяких мелочей содержимого и проб вариантов для поиска причины, работать не перестал.