gcc 链接器:KEEP 不保留该部分

gcc linker: KEEP is not keeping the section

提问人:personal_cloud 提问时间:11/12/2023 最后编辑:personal_cloud 更新时间:11/12/2023 访问量:25

问:

我正在使用 MAX32660 SDK 中的链接器脚本,其中包括以下内容:

SECTIONS {
    .text :
    {
        _text = .;
        KEEP(*(.isr_vector))
        *(.text*)    /* program code */
        *(.rodata*)  /* read-only data: "const" */

        KEEP(*(.init))
        KEEP(*(.fini))

        /* C++ Exception handling */
        KEEP(*(.eh_frame*))
        _etext = .;
    } > FLASH

该部分在以下程序集代码中定义:isr_vector

    .section .isr_vector
    .align 2
    .globl __isr_vector
__isr_vector:
    .long    __StackTop            /* Top of Stack */
    .long    Reset_Handler         /* Reset Handler */

其中初始化内存,设置设备配置,并调用。Reset_Handlermain()

不幸的是,在某些情况下(例如,没有导入 SDK 函数),除非我包含链接器选项,否则整个程序都会被优化(二进制文件大小为 0)。为什么需要此选项?这不是多余的吗,因为我已经有了?main()-u__isr_vectorKEEP(*(.isr_vector))

(我不确定是仅适用于部分还是也用于符号......我也试过了,但我仍然需要。KEEPKEEP(*(.isr_vector*))KEEP(*(.isr_vector.*))-u__isr_vector

GCC 链接器

评论

0赞 emacs drives me nuts 11/13/2023
当你有帮助吗?.section .isr_vector,"a",@progbits
0赞 personal_cloud 11/13/2023
@emacs不幸的是,GNU 汇编程序拒绝了逗号语法。
0赞 emacs drives me nuts 11/14/2023
这应该是 GNU 汇编程序和 ELF 目标的有效语法。不过,这取决于目标。如果对汇编程序有特殊意义,则使用其他一些字符。你可以找到我组装一个小的C程序,并查看文件。向 C 文件添加全局变量。@@-S -fdata-sections*.s

答: 暂无答案