задача забавная... вообщем мысли примерно следующие. :) такого я никогда сам не делал, потому есс-но всё ИМХО
1) можно попытаться скопировать секции, если есть objcopy
выглядеть должно примерно так:
gcc ... file.c
objcopy --rename-section .text=.data file.o
2) можно написать свой сценарий линкера, или поправить существующий
сценарий выглядит примерно так:
SECTION
{
.=0x0100000l;
.text :
{
*(.text)
}
.=0x80000000;
.data :
{
*(.data)
}
.bss :
{
*(.bss)
}
}
где
- .text-секция содержит код программы
- .data-секция содержит инициализированные данные;
- .bss-секция содержит инициализированные данные;
соответственно можно подсунуть нужный диапазон адресов и, я думаю, линкер затолкает всё как надо.
запуск линкера примерно такой
ld -T tra-la-la.start obj1.o obj2.o obj3.o my_great_program
где
tra-la-la.start - сценарий линкера
obj1.o obj2.o obj3.o -объектные файлы, которых наплодил компилятор
my_great_program -выходная программа
да, у меня по тексту в фигурных скобках стоит например *(.data)
* -значит для всех имен объектников, можно на самом деле указывать явно имя, тогда для разных объектников линкер может действовать по разному.
сценарий может быть другого вида, например:
MEMORY
{
rom (rx) : ORIGIN 0x00000000 LENGTH 512k
ram (rwx) : ORIGIN 0x00010000 LENGTH 512k
}
SECTION
{
.text rom :
{
*(.text)
}
.data :
{
_StartOfData=.;
*(.data)
_EndOfData=.;
}
.bss :
{
*(.bss)
}
_StackLocation=0x80000000;
}
но смысл в принципе я думаю понятен :).
Вот собственно всё что удалось нарыть по этому вопросу :).