C 应用多个属性时映射文件中缺少变量

C 应用多个属性时映射文件中缺少变量,c,gcc,arm,C,Gcc,Arm,使用Windows平台上的ARM none eabi工具链,将“C”ARM Cortex M3项目从IAR Embedded workbench移植到GCC 有一个全局变量提供了一个可重新分配的中断向量表,这些中断向量需要以特定的对齐方式定位,并且不需要从“C”启动进行初始化,在IAR代码中,通过使用IAR特定的指令将其强制到硬编码的内存位置来实现,如下所示(请注意,变量不需要强制到任何特定位置,重要的是对齐方式) 我试图在GCC代码中实现这一点,方法是在链接器脚本中定义一个名为“.noinit

使用Windows平台上的ARM none eabi工具链,将“C”ARM Cortex M3项目从IAR Embedded workbench移植到GCC

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

我试图在GCC代码中实现这一点,方法是在链接器脚本中定义一个名为“.noinit”的RAM部分,并使用_属性_指令将我的变量放置在“.noinit”部分(因此它不会默认为“.bss”)中,并强制对齐,如下所示:

static __attribute__((section (".noinit"), aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];
static __attribute__((section (".noinit"))) __attribute__((aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];
然而,尽管构建看起来已经完成,但在生成的映射文件中没有向量_表的迹象(还不能将二进制文件加载到目标上并进行尝试)

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

static __attribute__((section (".noinit")) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];
结果矢量_表出现在地图文件的“.noinit”部分,而

static __attribute__((aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL]; 
结果显示在“.bss”部分的矢量_表中,并显示请求的对齐方式

尝试按如下方式分别指定这两个指令:

static __attribute__((section (".noinit"), aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];
static __attribute__((section (".noinit"))) __attribute__((aligned(0x100))) isr_ptr_t vector_table[INTERRUPT_SOURCE_TOTAL];
但这没什么区别


有什么想法吗?

运行objdump-x和
vector\u table
都会出现在对象文件中。我看到的区别似乎与
vector\u table
是否声明为静态有关。当放置在“.bss”中时节
vector\u table
在地图文件中以名称引用,即使在静态时也是如此。当放置在“.noinit”中时,仅在未声明为静态时才会提及它,但是为它保留的空间(标记有它来自的编译单元的名称)无论如何都存在。

是的,所以事实证明没有实际问题,我只是被静态数据的地图文件表示法搞糊涂了,这取决于它们被放置在哪个段中。Richard Lang运行了objdump-x,并且不管怎样,向量表都存在于对象文件中。我看到的差异似乎与是否
vector_table
声明为静态或非静态。当放置在.bss“部分时,即使是静态的,vector_table也会从映射文件中通过名称引用。当放置在.noinit中时,仅在未声明为静态时才会提到它,但是为它保留的空间(标记有它来自的编译单元的名称)无论如何都存在。

是的,所以事实证明没有什么实际问题,我只是被静态数据的地图文件表示法弄糊涂了,这取决于它们被放置在哪个段中。Richard Lang

我认为这与你的问题无关,但似乎你在第一个
\uuuu属性中缺少了一个结束参数((.noinit)部分)
。你到底在使用什么GCC?我刚刚用GCC 4.8.3在x86_64上进行了尝试,没有发现任何问题:我在
objdump-x
的输出中看到了
vector_table
,并且它在
中。noinit
即使我添加了对齐属性(即对齐属性似乎没有任何变化)您可以考虑只将对齐属性关闭,直到您可以测试整个事件。否则,使用最新的ARM NOE EABI GCC,这是非常接近4.93.没有检查ObjDIP,只是查看链接器映射文件,将尝试它。gardless。我看到的差异似乎与
向量表
是否声明为静态有关。当放置在.bss“部分时,
向量表
即使是静态的,也会从映射文件中按名称引用。当放置在.noinit中时,只有在未声明为静态时才会提到它,但是为它保留了空间(标记了它来自的编译单元的名称)不管它在哪里。那么您的问题现在解决了吗…还是没有解决?对不起,我不完全清楚。我认为这与您的问题无关,但似乎您在第一个
\u属性中缺少了一个结束部分(“.noinit”))
。你到底在使用什么GCC?我刚刚用GCC 4.8.3在x86_64上进行了尝试,没有发现任何问题:我在
objdump-x
的输出中看到了
vector_table
,并且它在
中。noinit
即使我添加了对齐属性(即对齐属性似乎没有任何变化)您可以考虑只将对齐属性关闭,直到您可以测试整个事件。否则,使用最新的ARM NOE EABI GCC,这是非常接近4.93.没有检查ObjDIP,只是查看链接器映射文件,将尝试它。gardless。我看到的差异似乎与
向量表
是否声明为静态有关。当放置在.bss“部分时,
向量表
即使是静态的,也会从映射文件中按名称引用。当放置在.noinit中时,只有在未声明为静态时才会提到它,但是为它保留了空间(标记了它来自的编译单元的名称)不管怎样都有。那么您的问题现在解决了吗…还是没有?对不起,我不太清楚。