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

iezvtpos  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(146)

如果要为一组中断向量声明 .weakreference,例如:

.weakreference ISR_SPI_HANDLER, defaultExceptionHandler

在startup.S文件或某些框架include中,它非常有用,除非您随后在main.c文件中将 ISR_SPI_HANDLER 声明为函数,startup.S中的 ISR_SPI_HANDLER 仍然解析为 defaultExceptionHandler,因为.weakreference 仅在本地范围内工作但是,.weak 的功能与预期的一样,它允许您用main. c中的定义“覆盖”该定义,但如果您不这样做,您将始终解析为0x00,这显然不如解析为默认向量。
我该如何克服这一点?

isr3a4wc

isr3a4wc1#

不要在汇编器中使用.weakref。相反,只使用ISR_SPI_HANDLER作为外部变量。汇编器自然希望优化到已知位置的PC相对跳转。您正在与此斗争,其他人将希望调用defaultExceptionHandler
而不是使用链接器,

.text : {
    *(.text);
    ISR_SPI_HANDLER = DEFINED(ISR_SPI_HANDLER) ? ISR_SPI_HANDLER : defaultExceptionHandler;
    …
  }

或者,将 startup.S.weak.setdefaultExceptionHandler声明拆分为一个文件和另一个使用/调用ISR_SPI_HANDLER的文件。
但是,.weak的功能与预期的一样,并且允许您使用main.c中的定义“覆盖”该定义,但是如果您不这样做,您将始终解析为0x 00,这显然不如解析为默认向量。
典型的情况是在同一个文件中定义一个函数并使用.weak。也就是说,你需要在定义例程的地方使用.weak(但另一个目标文件可能会覆盖它)。要实现这一点并将defaultExceptionHandler用于其他用途,

.weak ISR_SPI_HANDLER
   .set ISR_SPI_HANDLER, defaultExceptionHandler

对于ARM Thumb代码,您可能需要.thumb_set来代替。我相信这是您想要的效果。
为什么是.weakref?我认为这更适合机器生成的代码,比如编译器会生成的代码。

kt06eoxx

kt06eoxx2#

新解决方案:

显然,您可以使用.weak NAME将其设置为外部符号,然后使用.set NAME VALUE将其设置为不同于0x0的默认值

相关问题