5
我使用GCC-ARM-Embedded和FreeRTOS。 FreeRTOS具有功能vTaskSwitchContext()
,仅用于某些 内联汇编程序代码。防止GCC LTO删除功能
问题是:当我使用LTO时,GCC不考虑内联汇编代码,并认为该函数未被使用,因此将其删除。链接器然后失败,因为inline汇编程序代码中的函数调用无法解析。
我会申请__attribute__((used))
但我不想触摸FreeRTOS代码(它是由STM32CubeMX生成的)。
我试图把这个在我的代码,但实际上GCC是足够聪明,不会允许这样的工作:
if(false)
vTaskSwitchContext();
是否有某种方式来告诉GCC在不同的源文件,或通过参数,即这个功能不应该被删除?
例
// file1.c
void vTaskSwitchContext(void)
{
...
}
// file2.c
void xPortPendSVHandler(void)
{
__asm volatile
(
...
" isb \n"
" bl vTaskSwitchContext \n"
" mov r0, #0 \n"
...
);
}
我想知道这是怎么发生的。链接器会看到对象文件及其外部引用。从C代码或内联汇编引用符号应该没有关系。 –
@undur_gongor:一般而言,LTO会改变很多事情并可能导致意外。 “链接器”实际上不会看到目标文件和外部引用,而是链接器充当编译器后端的前端,然后链接编译器后端的结果。 –