2015-06-11 1 views
2

Я разрабатываю проект с использованием микроконтроллера TI Tiva (TM4C123GH6PM), TivaWare (был StellarisWare) и GCC 4.8.2 (-14ubuntu1 + 6) в Linux.arm-none-eabi-ld: раздел .ARM.exidx перекрывает раздел .data

Хотя ссылки я начал получать эти сообщения об ошибке:

arm-none-eabi-ld: section .ARM.exidx loaded at [00000000000027d8,00000000000027df] overlaps section .data loaded at [00000000000027d7,00000000000027d8] 

я сделал некоторое погуглите, но я ничего не нашел, кажется, чтобы помочь.

  1. Я нашел этот вопрос, который находится на одной и ту же тему, но я не делаю какой-либо stacktracing: When is .ARM.exidx is used

  2. Кажется, этот раздел в основном используются при отладке C++ кода. Но я не использую C++ ...

  3. Я попытался сбрасывать все мои объектные файлы с помощью -h, чтобы показать включенные разделы. Единственным файлом, содержащим ARM.exidx, является libgcc.a.

  4. Ошибка появляется без видимого patten (по крайней мере, что я мог найти).

Например, в main.c:

while(1){ 
    debug_getc() 
    uartA_getc() 
} 

производит эту ошибку. в то время как

while(1){ 
    debug_getc(); 
    //uartA_getc(); 
} 

while(1){ 
    debug_getc(); 
    //uartA_getc(); 
} 

нет. (Обе функции в своем собственном файле объект, но делать вещи похожи. Эта ошибка не ограничивается эти два. I'v столкнулся с этим на некоторых других местах тоже.)

Я пытался добавить

.ARM.exidx :      
{         
    *(.ARM.exidx*) 
    *(.gnu.linkonce.armexidx.*) 
} > SRAM       

к моему сценарию компоновщика. Теперь сообщение об ошибке исчезло, но я получаю странные сбои.

Так может кто-нибудь сказать мне, что происходит? У меня такое чувство, что есть что-то принципиально неправильное, но я не могу понять, что это такое.

** ======= ССЫЛКА =============== **:

linkerscript.ld:

MEMORY 
{ 
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000 
    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000 
} 

SECTIONS 
{ 
    .text : 
    { 
     _text = .; 
     KEEP(*(.isr_vector)) 
     *(.text*) 
     *(.rodata*) 
     _etext = .; 
    } > FLASH 

    .data : AT(ADDR(.text) + SIZEOF(.text)) 
    { 
     _data = .; 
     *(vtable) 
     *(.data*) 
     _edata = .; 
    } > SRAM 

    .bss : 
    { 
     _bss = .; 
     *(.bss*) 
     *(COMMON) 
     _ebss = .; 
    } > SRAM 

/* 
    .ARM.exidx : 
    { 
     *(.ARM.exidx*) 
     *(.gnu.linkonce.armexidx.*) 
    } > SRAM 
*/ 
} 

Команды, используемые для строительства: (отрывок)

arm-none-eabi-gcc -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -ffunction-sections -fdata-sections -std=gnu99 -Wall -pedantic -DPART_TM4C123GH6PM -c -Os -DTARGET_IS_TM4C129_RA1 -I. -I../tivalib -I../TivaWare -Dgcc -o../tivalib/weather/wind.o ../tivalib/weather/wind.c 

arm-none-eabi-ld -T weatherlight.ld \ 
      --entry ResetISR \ 
      --gc-sections \ 
      -o weatherlight.axf weatherlight.o startup_gcc.o pwmA.o pwmB.o ../tivalib/board.o ../tivalib/debug.o ../tivalib/uartA.o ../tivalib/calc.o ../tivalib/rgb.o ../tivalib/color.o ../tivalib/data/data_sin.o ../tivalib/data/data_gamma.o ../tivalib/net/rgb/gen/solid.o ../tivalib/net/rgb/filter/filter_scale_gamma.o ../tivalib/net/rgb/filter/filter_white_balance.o ../tivalib/net/rgb/filter/filter_darken.o ../tivalib/net/rgb/filter/filter_lighten.o ../tivalib/net/val/gen/slider.o ../tivalib/net/val/gen/value_sin.o ../tivalib/net/val/gen/value_noise.o ../tivalib/net/val/gen/value_weightedsin.o ../tivalib/net/val/filter/value_filter_delay.o ../tivalib/net/val/filter/value_filter_scale_down.o ../tivalib/net/val/mixer/value_mixer.o ../tivalib/net/rgb/mixer/mixer.o ../tivalib/weather/sunny.o ../tivalib/weather/rainy.o ../tivalib/weather/cloudy.o ../tivalib/weather/wind.o ../TivaWare/utils/ustdlib.o \ 
      ../TivaWare/driverlib/gcc/libdriver.a \ 
      /usr/lib/gcc/arm-none-eabi/4.8.2/../../../arm-none-eabi/lib/armv7e-m/softfp/libm.a \ 
      /usr/lib/gcc/arm-none-eabi/4.8.2/../../../arm-none-eabi/lib/armv7e-m/softfp/libc.a \ 
      /usr/lib/gcc/arm-none-eabi/4.8.2/armv7e-m/softfp/libgcc.a 
+0

Поместите их с '.text'; они являются постоянными данными afaik, если их нужно читать/писать, а затем помещать их в '.data'. Вы должны инициализировать их, они не похожи на '.bss', и вам нужно« NOLOAD », если бы они были. Вам могут не понадобиться разделы * idx *, если вы не используете исключения C++ или какие-либо элементы трассировки языка «C». Однако они обычно не большие, поэтому я буду держать их как указано выше. Некоторым библиотечным подпрограммам «C» могут потребоваться эти разделы. –

+0

Я не уверен, правильно ли я вас понимаю. Но вставка «.ARM.exidx» непосредственно в '.text' дает мне ошибку:' arm-none-eabi-ld: .text имеет и упорядоченное ['.ARM.exidx 'в /...../softfp/ libgcc.a (_divdi3.o)] и неупорядоченных ['.rodata.str1.1 'в ../ TivaWare/utils/ustdlib.o]' секциях. (Но, по крайней мере, у меня есть ошибка, говорящая мне, где эти вещи происходят от ** !!!! **) – Scheintod

ответ

2

вы пытались просто выбросить соответствующую выходную секцию?

/DISCARD/ : 
{ 
    *(.ARM.exidx*) 
    *(.gnu.linkonce.armexidx.*) 
} 

Edit:

Я посмотрел на одном из моих проектов ARM и я поместил разделы в вспышку.

Попробуйте это:

.ARM.exidx : 
{ 
    *(.ARM.exidx*) 
    *(.gnu.linkonce.armexidx.*) 
} >FLASH 

edit2:

Попробуйте поставить метку после всех разделов, которые идут в вспышку и поставить .data раздел там:

SECTIONS 
{ 
.text : 
{ 
    _text = .; 
    KEEP(*(.isr_vector)) 
    *(.text*) 
    *(.rodata*) 
    _etext = .; 
} > FLASH 

.ARM.exidx : 
{ 
    *(.ARM.exidx*) 
    *(.gnu.linkonce.armexidx.*) 
} > FLASH 

_begin_data = .; 

.data : AT (_begin_data) 
{ 
    _data = .; 
    *(vtable) 
    *(.data*) 
    _edata = .; 
} > SRAM 

.bss : 
{ 
    _bss = .; 
    *(.bss*) 
    *(COMMON) 
    _ebss = .; 
} > SRAM 

} 
+0

Танки для вашего ответа. Отмена удаления сообщения об ошибке. Поставить его во вспышку нет. В настоящее время я играю с перемещением раздела .data с этой строкой: .data: AT (ADDR (.text) + SIZEOF (.text) + SIZEOF (.ARM.exidx) +2). Но я не уверен, что знаю, что делаю. И я все еще должен попробовать это на аппаратном обеспечении, которого у меня сейчас нет со мной. Вы знаете, почему в первую очередь находится раздел .ARM.exidx? – Scheintod

+0

(и я чувствую себя немного неловко с удалением чего-то, чего я не знаю, для чего это ...) – Scheintod

+0

Попробуйте поместить все разделы .text в начале сценария компоновщика, добавить ярлык и затем поместить его. раздел данных. См. Мое второе редактирование. – lkamp

0

I добавила опцию -funwind-tables в COMPILE_OPTS в Makefile, и теперь при компиляции нет ошибки.

+0

извините "-funwind-tables" вместо "-finwind-tables" –