C - 无臂-EABI-LD:部分 .ARM.exidx 与 .data 部分重叠



我正在Linux上使用TI Tiva微控制器(TM4C123GH6PM),TivaWare(StellarisWare)和GCC 4.8.2(-14ubuntu1 + 6)开发一个项目。

链接时,我开始收到以下错误消息:

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

我已经做了相当多的谷歌搜索,但我发现似乎没有任何帮助。

  1. 我发现了这个问题,它与同一主题有关,但我不进行任何堆栈跟踪:何时是 。使用 ARM.exidx

  2. 似乎本节主要用于调试C++代码。但我没有使用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

您是否尝试过丢弃相关的输出部分?

/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
}

我在 Makefile 的COMPILE_OPTS添加了 -funwind-tables 选项,现在编译时没有错误。

最新更新