Цитата(vv40in @ Aug 15 2008, 18:05)

всем доброго здоровья!
И вам!
Цитата
я никогда не программировал prom-ы. а оказалось, что тут дело серьезное!

Чтобы понять это нужно обладать способностью к телепатии. К сожалению я ею не владею

.
Итак, попробую догадаться.
Вы имеете пример (для какого процессора?), без использования ОС, на С, предназначенный для загрузки в ОЗУ. И хотите перекомпилировать его для флеш и прошить.
Я угадал?
Цитата
у меня в исходниках на С есть некий статический буфер (неконстантный).
при сборке с использованием прилагающимся к компилятору ld-скриптом (если оставить в нём ram) получается бинарник (после objcopy) длиной аж 1Гб

! начале, как положено - код, а статические даннные помещены в конец - в ram.
я выкинул ram из ld-скрипта. получился бинарник соответствующего размера. только, боюсь, что придется повозиться с пересылкой static-data в ram (если вообще будет работать

).
и еще. у меня и нет никакого start-up кода и никакими библиотеками не пользуюсь. может дело еще в этом ?
вопрос: а как это делается , т.е. как сообще автоматизируется сборка и перенос static-data в ram?
Потому как в Вашем вопросе мало конкретной информации придется начать издалека.
1. Компилятор (кстати какой? предполагаю gcc) из каждого *.c файла сделает *.o файл.
2. Линкер (предполагаю ld) возмет эти *.o файлы и, в соответствии со скриптом, разместит их содержимое в памяти. Получим *.elf файл.
3. objcopy возмет этот *.elf файл, и перепишет секции .text (собственно код) и .data (инициализируемые переменные) в другой файл - *.bin. Этот файл является копией
всего адресного пространства процессора. Если у Вас ARM то это 4G. Естественно, если Ваша программа "умещается" в 1G то размер будет 1G.
Естественно Вам это не подходит

.
В таком случае нужно
1. Переписать скрипт линкера так, чтобы секция .data в выходном бинарике размещалась сразу за секцией .text.
2. Написать в стартап файле - это асм - кусочек, который
при каждом включении питания перенесет секцию .data из флеш в ОЗУ, на то место где ее ожидает программа.
Если у Вас ARM то поищите в этой ветке и соседней про ARM, такие вопросы уже встречались и там можно найти примеры.
Пока будете тренироваться, воспользуйтесь objdump, readelf для просмотра заголовков секций. Там указаны LMA и VMA.
LMA - Load memory address Адрес памяти,
куда прошивать эту секцию
VMA - Virtual memory address. Адрес памяти, где эта секция должнабыть
во время выполнения программы.
Перенос данных из LMA в VMA - это задача стартап кода.
Еще полезно смотреть дизассемблер objdump -SD prg.elf > prg.dump
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.