我在 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")))
的代码不在我的控制之下(所以我不能简单地用 #error
替换它在 .c
文件中),但是 gcc
和 ld
命令行标志(以及构建过程)在我的控制之下。
gcc
或 ld
是否有命令行标志或其他一些可以强制错误的技巧?我在手册页中找不到任何相关内容。
我的后备解决方案是解析生成的可执行文件(例如使用 objdump -x
),如果 .custom
部分已到达最终可执行文件。
最佳答案
您可以使用链接描述文件丢弃 .custom
部分中的所有符号:
SECTIONS
{
/DISCARD/ : { *(.custom) }
}
如果你真的想用一个错误来惩罚你的用户,而不是简单地丢弃符号,我想你可以改为使用链接描述文件 ASSERT
,它的大小为 .custom
部分是 0。不过,我认为您必须强制生成该部分才能使其正常工作。否则,它会给您一个该部分不存在的错误。
关于linux - 如何在特定部分强制出现链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21222827/