arm-none-eabi-ld:section .ARM.exidx重叠部分.data

时间:2015-06-11 10:44:53

标签: c gcc arm microcontroller texas-instruments

我正在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. 我发现这个问题属于同一主题,但我没有做任何堆栈跟踪: When is .ARM.exidx is used

  2. 本节似乎主要用于调试C ++代码。但我没有使用C ++ ......

  3. 我尝试使用-h转储所有目标文件,以显示所包含的部分。包含ARM.exidx的唯一文件是libgcc.a。

  4. 错误出现时没有明显的模式(至少我能找到)。

  5. 例如在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
    

2 个答案:

答案 0 :(得分:2)

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

int main()

修改

我已经查看过我的一个ARM项目,并且已将这些部分放入闪存中。

试试这个:

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

<强> EDIT2:

尝试在进入flash的所有部分之后放置一个标签并将.data部分放在那里:

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

答案 1 :(得分:1)

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