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會改變很多事情並可能導致意外。 「鏈接器」實際上不會看到目標文件和外部引用,而是鏈接器充當編譯器後端的前端,然後鏈接編譯器後端的結果。 –