应用多个 __attribute__ 时地图文件中缺少变量

Variable missing from map file when multiple __attribute__ applied

将 "C" ARM Cortex M3 项目从 IAR Embedded workbench 移植到 GCC,使用 Windows 上 https://launchpad.net/gcc-arm-embedded 的 arm-none-eabi 工具链平台。

有一个全局变量提供了 table 个可重新分配的中断向量,需要使用特定的对齐方式进行定位,并且不需要从 "C" 启动时初始化,这在 IAR 中代码是通过使用 IAR 特定指令将其强制到硬编码内存位置来实现的,如下所示(请注意,变量不需要 需要 被强制到任何特定位置,重要的是对齐)

#pragma location=ADDR_VECTOR_TABLE
static __no_init isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];

我试图通过在我的链接描述文件中定义一个名为“.noinit”的 RAM 部分并使用 __attribute__ 指令将我的变量放在“.noinit”部分中来在 GCC 代码中实现相同的目的(因此它不会默认为“.bss”)并强制对齐如下:

static __attribute__((section (".noinit"), aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];

然而,尽管构建似乎已经完成,但在生成的映射文件中没有 vector_table 的迹象(不是在能够将二进制文件加载到瞄准并尝试一下)。

有趣的是,两个 __attribute__ 指令中的任何一个在单独使用时似乎都能按预期工作,

static __attribute__((section (".noinit")) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];

导致vector_table出现在映射文件的“.noinit”部分,而

static __attribute__((aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL]; 

导致 vector_table 出现在“.bss”部分,并符合请求的对齐方式。

尝试如下分别指定两个指令:

static __attribute__((section (".noinit"))) __attribute__((aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];

但这没什么区别。

有什么想法吗?

运行 objdump -x 并且 vector_table 无论如何都存在于目标文件中。我看到的差异似乎与 vector_table 是否声明为静态有关。当放置在“.bss”部分时 vector_table 被地图文件中的名称引用,即使是静态的。当放在“.noinit”中时,它仅在 not 声明为静态时才会被提及,但是为它保留的 space(标有它来自的编译单元的名称)无论如何都在那里.
是的,所以结果没有实际问题,我只是对静力学的地图文件表示感到困惑,这取决于它们被放置在哪个段。 – Richard Lang