是否可以延迟解析 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 与一个文件中的 .weakref
和 defaultExceptionHandler
声明分开,另一个是 using/calling ISR_SPI_HANDLER
.
新解决方案:
显然,您可以使用 .weak NAME
使其成为外部符号,然后使用 .set NAME VALUE
为其赋予与 0x0
不同的默认值
如果要为一组中断向量声明.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 与一个文件中的 .weakref
和 defaultExceptionHandler
声明分开,另一个是 using/calling ISR_SPI_HANDLER
.
新解决方案:
显然,您可以使用 .weak NAME
使其成为外部符号,然后使用 .set NAME VALUE
为其赋予与 0x0