【问题标题】:How to force a linker error on a specific section如何在特定部分强制链接器错误
【发布时间】:2014-01-19 21:20:37
【问题描述】:

我在 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 命令行标志(和构建过程)在我的控制之下。

是否有gccld 的命令行标志或其他可以强制错误的技巧?我在手册页中找不到任何相关内容。

我的后备解决方案是解析生成的可执行文件(例如,使用 objdump -x),如果 .custom 部分已生成最终可执行文件,则会失败并显示错误消息。

【问题讨论】:

    标签: linux gcc linker sections


    【解决方案1】:

    您可以使用链接描述文件丢弃.custom 部分中的所有符号:

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

    如果您真的想用错误来惩罚您的用户,而不是简单地丢弃符号,我想您可以改为使用链接器脚本ASSERT.custom 部分的大小为 0。我认为您但是,必须强制生成该部分才能使其正常工作。否则它会给您一个错误,即该部分不存在。

    【讨论】:

    • 感谢您的见解。我确实需要一个错误,以便用户知道他所要求的功能在此构建中不存在。
    猜你喜欢
    • 2015-04-26
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2011-08-18
    相关资源
    最近更新 更多