Infineon PSoC4 MAX项目链接器脚本引用__VECTOR_TABLE报未定义错误咨询
PSoC4 MAX 链接器脚本中
__VECTOR_TABLE未定义符号问题 问题背景
在基于Infineon PSoC4 MAX的项目中修改链接器脚本,尝试将ISR向量表明确放置到指定位置时,链接器提示__VECTOR_TABLE为未定义符号,但该符号已在对应型号的启动文件中定义。
启动文件相关代码
/*---------------------------------------------------------------------------- Exception / Interrupt Vector table *----------------------------------------------------------------------------*/ extern const cy_israddress __VECTOR_TABLE[CY_VECTOR_TABLE_SIZE]; const cy_israddress __VECTOR_TABLE[CY_VECTOR_TABLE_SIZE] __VECTOR_TABLE_ATTRIBUTE = { (cy_israddress)(&__INITIAL_SP), /* Initial Stack Pointer */ // 其余向量表项省略 };
链接器脚本相关代码
.text appl_start : { CREATE_OBJECT_SYMBOLS PROVIDE(__cy_interrupt_vector = __VECTOR_TABLE); }
错误信息
modustoolbox/tools_3.2/gcc/bin/../lib/gcc/arm-none-eabi/11.3.1/../../../../arm-none-eabi/bin/ld.exe:./bsps/TARGET_PSoC4_MAX/TOOLCHAIN_GCC_ARM/Application_linker.ld:142: undefined symbol `__VECTOR_TABLE' referenced in expression
问题分析与解决
这跟编译器内部保留符号无关,核心问题出在链接阶段的符号可见性或文件处理逻辑上:
- 链接顺序错误:链接器处理脚本时,包含
__VECTOR_TABLE定义的启动文件目标(比如startup_psoc4max.o)还未被纳入链接输入列表。需确认启动文件已正确添加到项目的编译/链接列表中,且在链接器脚本之前被处理。 - 段属性冲突:
__VECTOR_TABLE_ATTRIBUTE是编译器属性宏,作用是将向量表放到特定段(比如.isr_vector)。如果你的链接器脚本.text appl_start段未包含这个特定段,链接器就无法识别__VECTOR_TABLE符号。可查看该宏的定义(通常在器件头文件中),确认对应的段名,然后在链接器脚本中显式包含该段。 - 符号引用时机不当:
CREATE_OBJECT_SYMBOLS仅为已输入的目标文件创建符号,若启动文件未提前输入,此时引用__VECTOR_TABLE必然报错。更稳妥的方式是直接定位向量表所在段,而非引用符号,示例如下:
.isr_vector : { PROVIDE(__cy_interrupt_vector = .); *(__VECTOR_TABLE) } > FLASH
内容的提问来源于stack exchange,提问作者nobby
相关产品推荐
相关产品推荐

