【问题标题】:arm-none-eabi-ld: section .ARM.exidx overlaps section .dataarm-none-eabi-ld:.ARM.exidx 部分与 .data 部分重叠
【发布时间】:2015-06-11 10:44:53
【问题描述】:

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

  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

【问题讨论】:

  • 把它们放在.text;它们是常量数据 afaik,如果它们需要读/写,则将它们与.data 放在一起。你必须初始化它们,它们不像.bss,如果是,你需要NOLOAD。如果您不使用 C++ 异常或任何“C”语言堆栈跟踪内容,则可能不需要 idx 部分。但是,它们通常并不大,所以我会像上面一样保留它们。一些“C”库例程可能需要这些部分。
  • 我不确定我是否理解正确。但是将 '.ARM.exidx' 直接放在 .text 中会给我一个错误:arm-none-eabi-ld: .text has both ordered [.ARM.exidx' in /...../softfp/libgcc.a(_divdi3.o)] 和无序 [@987654335 @ 部分。 (但至少我有一个错误告诉我这些东西是从哪里来的 !!!!

标签: c gcc arm microcontroller texas-instruments


【解决方案1】:

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

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

编辑:

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

试试这个:

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

编辑2:

尝试在所有进入 flash 的部分之后放置一个标签,并将您的 .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

}

【讨论】:

  • 感谢您的回答。丢弃会删除错误消息。把它放在闪存中不会。目前我正在使用以下行移动 .data 部分:.data : AT(ADDR(.text) + SIZEOF(.text) + SIZEOF(.ARM.exidx)+2)。但我不知道我在做什么。而且我仍然必须在我目前没有的硬件上尝试它。你知道为什么 .ARM.exidx 部分首先存在吗?
  • (我对删除一些我不知道它的用途的东西感到有点不安......)
  • 尝试将所有 .text 部分放在链接描述文件的开头,添加标签,然后将 .data 部分放在那里。请参阅我的第二次编辑。
  • AFAIK .ARM.extab 和 .ARM.exidx 用于堆栈展开,因此不用于常规操作,但在处理 C++ 异常和调试程序时需要。但我不得不承认,我从来没有过多关注它们,因为我从来没有遇到过你描述的问题。
【解决方案2】:

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

【讨论】:

  • 对不起“-funwind-tables”而不是“-finwind-tables”
猜你喜欢
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多