是否可以将gcc中的.weakreference的解析延迟到链接时间?(GCC)
如果要为一组中断向量声明.weakreference,例如:是否可以将gcc中的.weakreference的解析延迟到链接时间?(GCC),c,gcc,assembly,arm,firmware,C,Gcc,Assembly,Arm,Firmware,如果要为一组中断向量声明.weakreference,例如: .weakreference ISR_SPI_HANDLER, defaultExceptionHandler 在startup.S文件或某些framework include中,它非常有用,但如果随后在main.c文件中将ISR_SPI_处理程序声明为函数,则startup.S中的ISR_SPI_处理程序仍然解析为defaultExceptionHandler,因为.weakreference仅在本地范围内工作(术语?预链接)。但
.weakreference ISR_SPI_HANDLER, defaultExceptionHandler
在startup.S文件或某些framework include中,它非常有用,但如果随后在main.c文件中将ISR_SPI_处理程序声明为函数,则startup.S中的ISR_SPI_处理程序仍然解析为defaultExceptionHandler,因为.weakreference仅在本地范围内工作(术语?预链接)。但是,.weak的功能与预期相同,允许您使用main.c中的定义“覆盖”定义,但如果不这样做,您将始终解析为0x00,这显然不如解析为默认向量
如何克服这个问题?不要在汇编程序中使用
.weakref
。相反,只需使用ISR\u SPI\u处理程序
作为外部接口。汇编器自然希望优化PC到已知位置的相对跳跃。您正在与此进行斗争,其他人将希望调用defaultExceptionHandler
而是使用
或者,在一个文件中使用
.weakref
和defaultExceptionHandler
声明拆分startup.S,另一个文件使用/调用ISR\u SPI\u HANDLER
新解决方案:
显然,您可以使用
.weak NAME
将其作为外部符号,然后使用.set NAME VALUE
为其指定不同于0x0的默认值。哇,这正是我需要的。我不知道我可以在链接器文件中使用这个术语。不过,我不确定你的备选方案。请将你的备选方案作为单独的答案发布,而不是作为问题的一部分。
.text : {
*(.text);
ISR_SPI_HANDLER = DEFINED(ISR_SPI_HANDLER) ? ISR_SPI_HANDLER : defaultExceptionHandler;
…
}