是否可以延迟解析 gcc-as 中的 .weakreference 直到 link 时间? (海湾合作委员会)

Is it possible to delay resolving a .weakreference in gcc-as until link time? (GCC)

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

.weakreference ISR_SPI_HANDLER, defaultExceptionHandler

在 startup.S 文件或某些框架包含中,它非常有用,除非您随后将 ISR_SPI_HANDLER 声明为 [=32 中的函数=] 文件,startup.S 中的 ISR_SPI_HANDLER 仍然解析为 defaultExceptionHandler 因为 .weakreference 仅适用于本地范围(术语?预链接)。但是,.weak 可以按预期运行,并允许您使用 main.c 中的定义 "override" 定义,但如果不这样做,您将始终解析为 0x00,这显然不如解析为默认向量。

我该如何克服这个问题?

不要在汇编器中使用.weakref。而只是使用 ISR_SPI_HANDLER 作为外部。汇编器自然希望优化 PC 相对跳转到已知位置。您正在与此作斗争,其他人会想要拨打 defaultExceptionHandler

改为使用the linker,

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

或者,将 startup.S 与一个文件中的 .weakrefdefaultExceptionHandler 声明分开,另一个是 using/calling ISR_SPI_HANDLER.

新解决方案:

显然,您可以使用 .weak NAME 使其成为外部符号,然后使用 .set NAME VALUE 为其赋予与 0x0

不同的默认值