arm-none-eabi-ld: раздел .ARM.exidx перекрывает раздел .data

Я разрабатываю проект, используя микроконтроллер TI Tiva (TM4C123GH6PM), TivaWare (был StellarisWare) и GCC 4.8.2 (-14ubuntu1+6) в Linux.

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

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

Я немного погуглил, но ничего не нашел, похоже, не помогает.

  1. Я нашел этот вопрос, который относится к той же теме, но я не выполняю трассировку стека: Когда используется .ARM.exidx

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

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

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

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

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

выдает эту ошибку. пока

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

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

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

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

.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

person Scheintod    schedule 11.06.2015    source источник
comment
Поместите их с помощью .text; они представляют собой постоянные данные, если их нужно читать/записывать, то поместите их с помощью .data. Вы должны их инициализировать, они не похожи на .bss и вам нужно NOLOAD, если они были. Вам могут не понадобиться разделы idx, если вы не используете исключения C++ или какие-либо средства трассировки стека языка C. Тем не менее, они обычно не большие, поэтому я бы оставил их, как указано выше. Эти разделы могут потребоваться для некоторых библиотечных подпрограмм C.   -  person artless noise    schedule 11.06.2015
comment
Я не уверен, правильно ли я вас понял. Но помещение '.ARM.exidx' непосредственно в .text дает мне ошибку: arm-none-eabi-ld: .text has both ordered [.ARM.exidx' в /...../softfp/libgcc.a(_divdi3.o)] и неупорядоченные [.rodata.str1.1' in ../TivaWare/utils/ustdlib.o] разделы. (Но, по крайней мере, у меня есть ошибка, говорящая мне, откуда эти вещи берутся !!!!)   -  person Scheintod    schedule 11.06.2015


Ответы (2)


Вы пытались просто отказаться от соответствующего раздела вывода?

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

Изменить:

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

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

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

Изменить2:

Попробуйте поставить метку после всех разделов, которые идут во флеш, и поместить туда свой раздел .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

}
person lkamp    schedule 11.06.2015
comment
Танки за ваш ответ. Отмена удаляет сообщение об ошибке. Помещение его во флэш-память не делает. В настоящее время я играю с перемещением раздела .data с помощью этой строки: .data : AT(ADDR(.text) + SIZEOF(.text) + SIZEOF(.ARM.exidx)+2). Но я не уверен, что знаю, что делаю. И мне все еще нужно попробовать это на оборудовании, которого у меня сейчас нет с собой. Знаете ли вы, почему раздел .ARM.exidx вообще существует? - person Scheintod; 11.06.2015
comment
(и мне немного неловко удалять что-то, для чего я не знаю, для чего это нужно...) - person Scheintod; 11.06.2015
comment
Попробуйте поместить все разделы .text в начало скрипта компоновщика, добавьте метку, а затем поместите туда свой раздел .data. Смотрите мою вторую правку. - person lkamp; 11.06.2015
comment
AFAIK .ARM.extab и .ARM.exidx используются для раскручивания стека, поэтому он не используется в обычной работе, но необходим для обработки исключений C++ и при отладке вашей программы. Но я должен признать, что никогда не обращал на них особого внимания, так как у меня никогда не было проблем, которые вы описываете. - person lkamp; 11.06.2015

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

person Ning Lian    schedule 11.08.2015
comment
извините "-funwind-tables" вместо -finwind-tables - person Ning Lian; 11.08.2015