【发布时间】:2016-11-18 06:51:28
【问题描述】:
我使用 GCC-ARM-Embedded 和 FreeRTOS。
FreeRTOS 具有 vTaskSwitchContext() 功能,仅在某些情况下使用
内联汇编代码。
问题是:当我使用 LTO 时,GCC 不考虑内联汇编代码并认为该函数没有被使用,因此将其删除。然后链接器失败,因为内联汇编代码中的函数调用无法解析。
我会申请__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 改变了很多事情,通常会引起意外。 “链接器”实际上并不查看目标文件和外部引用,而是链接器充当编译器后端的前端,然后将编译器后端的结果链接起来。