2014-02-11 3 views
5

Я создал компоновщика памяти сценарий и сохранил его как memory.ld в Eclipse IDE: Project: свойства: GCC линкера: разное: Я добавил -М -T memory.ldКак решить ошибку в скрипте компоновщика?

memory.ld:

MEMORY 
{ 
     ram (rw) : ORIGIN = 0x4000000 , LENGTH = 2M 
} 

SECTIONS 
{ 
    RAM : { *(.myvarloc) 

} > ram } 

В моей программе гр: Я сделал глобальное объявление как:

__attribute__ ((section(".myvarloc"))) 

uint8 measurements [30]; 

ОШИБКИ:

/usr/bin/ld: FEBRUARY section `.text' will not fit in region `ram' 
/usr/bin/ld: region `ram' overflowed by 20018 bytes 
/usr/lib/i386-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init': 
(.text+0x2b): undefined reference to `__init_array_end' 
/usr/lib/i386-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init': 
(.text+0x31): undefined reference to `__init_array_start' 
/usr/lib/i386-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init': 
(.text+0x57): undefined reference to `__init_array_start' 
/usr/bin/ld: FEBRUARY: hidden symbol `__init_array_end' isn't defined 
/usr/bin/ld: final link failed: Bad value 
collect2: error: ld returned 1 exit status 
+0

Ошибка связана с переполнением '.text' /' ram' not' .myvarloc'. – anishsane

+2

Ваш сценарий компоновщика, вероятно, должен рассказать компоновщику, что делать с остальной частью кода/данных и т. Д., А не только, что делать с секцией .myvarloc – nos

+0

Большое спасибо за ответ. Не могли бы вы привести мне пример? – user3252048

ответ

1

В зависимости от используемого вами компилятора (GCC?) И процессора, для которого вы компилируете (x86?), Компилятор будет генерировать несколько ссылок на сегменты в объектных файлах. Наиболее распространенными являются .text для сегментов кода, .data для инициализированных данных и .bss для неинициализированных данных. Вы можете видеть, какие сегменты генерирует ваш компилятор, используя утилиту nm в ваших объектных файлах.
Я предполагаю, что пока вы не предоставили свой собственный сценарий компоновщика, среда предоставила некоторый сценарий по умолчанию автоматически и/или неявно. Но теперь, когда вы решили «сворачивать свои собственные», вы должны сами заботиться обо всех деталях.

Я не могу проверить детали, но вы могли бы начать со следующими РАЗДЕЛАМИ:

SECTIONS 
{ 
    .bss : { *(.myvarloc) } 
    .bss : { *(.bss) } 
    .data : { *(.data) } 
    .text : { *(.text) } 
} 

я не уверен, если это точный синтаксис вашего GCC линкер (он мало зависит от версии), но вы можете найти более подробную информацию в the manual.

Смежные вопросы