【发布时间】: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]
我已经做了很多谷歌搜索,但我发现似乎没有任何帮助。
我发现了这个关于同一主题的问题,但我没有进行任何堆栈跟踪: When is .ARM.exidx is used
看来这部分主要用于调试C++代码。但我没有使用 C++ ...
我尝试使用
-h转储我的所有目标文件以显示包含的部分。唯一包含 ARM.exidx 的文件是 libgcc.a。错误出现时没有明显的规律(至少我能找到)。
例如在 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