2017-05-25 44 views
0

我試圖想出一種防止函數被內聯的可移植方法。我在這個old answer中找到了我的解決方案,其中有一條評論「它可能並不總是有效」。防止函數內聯可移植

void (*foo_ptr)() = foo; 
foo_ptr(); 

我的功能就是增加一個臨時的,目的是控制用於驗證的PC(行使一些微量的硬件),我不關心周圍的代碼 - 只是流可能會保持工作當我在10年的時間裏回到這個時候(用新的工具鏈)。我寧願不使用屬性或嵌入式彙編器(我已經需要支持3個工具鏈,並且我有一些出現現在可以工作)。

我在想,通過volatile傳遞地址會給我更多的保護。這是必要的,還是有什麼不太醜我可以使用?

+0

嘗試是「便攜式」和「目的是控制PC進行驗證」似乎自相矛盾。我不知道有一種便攜式方式來檢查電腦;這將始終取決於某個工具鏈。幾乎所有的工具鏈都有防止內聯的方法(例如'__attribute __((__ noinline __))'或者gcc)。 – ensc

+0

我有硬件監控PC - 我需要鍛鍊硬件(不測試它)。 –

+1

將它放在一個單獨的文件(編譯單元)中,將其編譯爲對象(或庫),並將生成的對象鏈接到「主」程序。 – wildplasser

回答

3

完全避免函數「內聯」的最簡單方法是將函數放在單獨的源文件中,並在鏈接時將該函數放入可執行文件中,而不是在編譯時。

這裏是單向的:

header_1.h 的#ifndef HEADER_1_H 的#define HEADER_1_H

void foo(void); 

#endif // HEADER_1_H 

source_1.c

... 
void foo() 
{ 
    // do something 
} 

source_2.c

#include "header_1.h" 

int main(void) 
{ 
    foo(); 
} 

然後使用以下編譯/鏈接報表

gcc -c ... source_1.c -o source_1.o 
gcc -c ... source_2.c -o source_2.o 
gcc source_1.o source_2.o -o source