Уже достало мучится с этим Гринхилсом.
Существует достаточно большой проект для MIPS написаный на С. Изначально писался под компилятор GNU sde toolchain, соответственно были написаны скрипты компилятору и линкеру. Все нормально компилируется и линкуется. Но встала необходимость (рассматривается возможность на самом деле) перейти на другой компилятор, например МУЛЬТИ (под МИПС больше ничем особо не пахнет).
И вот вроде бы перенес все настроики компилятора, все вроде бы компилится, дело за малым - линковка . И вот тут проблему никак не удается решить. Создаю свой файл дириктив линкеру, прописываю там области памяти и секции (то как он парсит этотт файл - отдельная история ):
Код
CONSTANTS
{
FLAS_BASE = 0xBFC00000
;
FLASH_OFFSET = 0x4000
;
RAM_BASE = 0xA0000000
;
SCRATCHPAD_BASE = 0xBC000000
;
}
MEMORY
{
flash : ORIGIN = FLAS_BASE + FLASH_OFFSET , LENGTH = 10M
ram : ORIGIN = RAM_BASE , LENGTH = 10M
scratch : ORIGIN = SCRATCHPAD_BASE , LENGTH = 10M
}
SECTIONS
{
.code : {
init.o ( .text )
* ( .text )
* ( .rodata )
* ( .rel.dyn )
* ( .eh_frame )
} > flash
.initial_dataf ROM ( .initial_data ) : {
* ( .data )
* ( .lit8 )
* ( .lit4 )
* ( .sdata )
} > .
.uninitial_dataf ROM ( .uninitial_data ) : {
* ( .sbss )
* ( .scommon )
* ( .bss )
* ( COMMON )
} > .
.isramf ROM ( .isram ) : {
* ( .isram )
} > .
.ROM.free_space ROM ( .free_space ) : > .
end = .;
.initial_data : > ram
.uninitial_data : > .
.free_space : > .
.isram : > scratch
}
{
FLAS_BASE = 0xBFC00000
;
FLASH_OFFSET = 0x4000
;
RAM_BASE = 0xA0000000
;
SCRATCHPAD_BASE = 0xBC000000
;
}
MEMORY
{
flash : ORIGIN = FLAS_BASE + FLASH_OFFSET , LENGTH = 10M
ram : ORIGIN = RAM_BASE , LENGTH = 10M
scratch : ORIGIN = SCRATCHPAD_BASE , LENGTH = 10M
}
SECTIONS
{
.code : {
init.o ( .text )
* ( .text )
* ( .rodata )
* ( .rel.dyn )
* ( .eh_frame )
} > flash
.initial_dataf ROM ( .initial_data ) : {
* ( .data )
* ( .lit8 )
* ( .lit4 )
* ( .sdata )
} > .
.uninitial_dataf ROM ( .uninitial_data ) : {
* ( .sbss )
* ( .scommon )
* ( .bss )
* ( COMMON )
} > .
.isramf ROM ( .isram ) : {
* ( .isram )
} > .
.ROM.free_space ROM ( .free_space ) : > .
end = .;
.initial_data : > ram
.uninitial_data : > .
.free_space : > .
.isram : > scratch
}
Ставлю в настройках проекта [Linker Command File]= мой файл. Типа теперь он должен использовать ТОЛЬКО МОИ секции, но линкер упорно продолжает видеть также свой дефолтовый файл standalone_ram.ld . И пишет, что одна из моих секций перекрывается с одной из секций в его файле.
Код
SECTIONS
{
.zdata ABS : > zero_memory
.zbss ABS : > .
.rozdata ABS : > .
.text : > dram_memory
.syscall : > .
.secinfo : > .
.fixaddr : > .
.fixtype : > .
.robase ALIGN(8) : > .
.rodata : > .
.sdabase ALIGN(8) : > .
.sdata : > .
.sbss : > .
.rosdata : > .
.data : > .
.profile : > .
.bss : > .
.heap ALIGN(8) PAD(heap_reserve) : > .
.stack ALIGN(8) PAD(stack_reserve) : > .
{
.zdata ABS : > zero_memory
.zbss ABS : > .
.rozdata ABS : > .
.text : > dram_memory
.syscall : > .
.secinfo : > .
.fixaddr : > .
.fixtype : > .
.robase ALIGN(8) : > .
.rodata : > .
.sdabase ALIGN(8) : > .
.sdata : > .
.sbss : > .
.rosdata : > .
.data : > .
.profile : > .
.bss : > .
.heap ALIGN(8) PAD(heap_reserve) : > .
.stack ALIGN(8) PAD(stack_reserve) : > .
Причем то что он продолжает как то использовать свой файл - тоочно, так как если его открытьь и закоментить (как то изменить) то он начинает выдавать адекватные ошибки по этому поводу. Почему он упорно не хочет отказыватся от своего файла.
Второе. Я вообще хотел бы на выходе получить бинарник. Для этого я так понимаю надо поставить опцию Binary Code Generation но сразу при построении проекта среда говорит, что для МИПСа я этого сделатьь не могу, почему??? Может эта опция не о том? Для х86 - тоже самое. Если без этой опции скомпилить сэмпл, то ниче похожего на бинарник нету, только объектные файлы.