2016-07-15 107 views
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" 
    ... 
    ); 
} 
+0

我想知道这是怎么发生的。链接器会看到对象文件及其外部引用。从C代码或内联汇编引用符号应该没有关系。 –

+0

@undur_gongor:一般而言,LTO会改变很多事情并可能导致意外。 “链接器”实际上不会看到目标文件和外部引用,而是链​​接器充当编译器后端的前端,然后链接编译器后端的结果。 –

回答

6

尝试调用从其中被标记used单独的功能的功能。

void dummyFunction(void) __attribute__((used)); 

// Never called. 
void dummyFunction(void) { 
    vTaskSwitchContext(); 
}