GCC 链接器意外地向后移动位置计数器

GCC Linker unexpectedly moves location counter backwards

提问人:Pierwiastek 提问时间:5/24/2022 更新时间:5/24/2022 访问量:363

问:

我正在开发新的 RTEMS BSP,并且正在修改链接器脚本

我修改了这个链接器脚本文件

    .rwbarrier : ALIGN_WITH_INPUT {
        . = ALIGN (bsp_section_rwbarrier_align);
    } > REGION_DATA AT > REGION_DATA

    .vector : ALIGN_WITH_INPUT {
        bsp_section_vector_begin = .;
        . = . + DEFINED (bsp_vector_table_in_start_section) ? 0 : bsp_vector_table_size;
        bsp_section_vector_end = .;
    } > REGION_VECTOR AT > REGION_VECTOR

假设我们需要将 .vector 部分放在某个内存区域的中间,因此我们需要将符号与 128 对齐,所以我添加了这一行:bsp_section_vector_begin

    .vector : ALIGN_WITH_INPUT {
        . = ALIGN(128);
        bsp_section_vector_begin = .;

现在我收到这个错误:

[build] linkcmds.base:xxx cannot move location counter backwards (from 0000000060022380 to 0000000060022370)

它直接指向这条线

. = . + DEFINED (bsp_vector_table_in_start_section) ? 0 : bsp_vector_table_size;

但是当将这一行更改为:

. = . + bsp_vector_table_size;

没有错误,链接器已满足,并且系统异常正在工作。

我的问题是:这样的表达方式怎么可能:

. = . + DEFINED (bsp_vector_table_in_start_section) ? 0 : bsp_vector_table_size;

以这种方式评估它试图向后移动位置计数器?我确信是正数,我的实验证实了这一点。 也有效。这种压抑有什么问题?bsp_vector_table_size. = . + 0

链接 链接器错误 ld

评论


答: 暂无答案