2014-01-19 65 views
0

我在Linux上使用GCC和GNU Binutils來編譯和鏈接i386 Linux的代碼。我想禁止名爲.custom的部分,所以我想下面的失敗,編譯錯誤或鏈接錯誤:如何在特定的部分強制鏈接器錯誤

__attribute__((section(".custom"))) int foo() { return 42; } 
int main(void) { return 0; } 

,但是這一次應該像往常一樣成功:

__attribute__((section(".other"))) int foo() { return 42; } 
int main(void) { return 0; } 

代碼__attribute__((section(".custom")))不在我的控制之下(所以我不能簡單地用.c文件中的#error替換它),但命令行標誌(和構建過程)在我的控制之下。

是否有一個命令行標誌gccld或其他一些可以強制錯誤的技巧?我無法在手冊頁中找到任何相關內容。

我的備用解決方案是解析生成的可執行文件(例如使用objdump -x),並且如果.custom部分將其轉換爲最終可執行文件,則會失敗並顯示錯誤消息。

回答

2

您可以使用連接器腳本丟棄在.custom部分的所有符號:

SECTIONS 
{ 
    /DISCARD/ : { *(.custom) } 
} 

如果你真的想用一個錯誤來懲罰你的用戶,而不是簡單地丟棄的符號,我想你可以代替有鏈接腳本ASSERT.custom部分的大小爲0.我認爲你必須強制生成該部分的工作,但..否則它會給你一個錯誤,該部分沒有存在。

+0

感謝您的見解。我確實需要一個錯誤,以便用戶知道他所要求的功能在此版本中不存在。 – pts

相關問題