2016-07-15 53 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(); 
}