2014-01-19 46 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

相关问题