是否可以将gcc中的.weakreference的解析延迟到链接时间?(GCC)

是否可以将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,例如:

.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;
    …
  }