使用arm-none-eabi-gcc 4.8从链接脚本变量初始化16位字节变量

时间:2014-01-27 07:47:44

标签: c++ gcc arm

我正在尝试从链接脚本中获取值,并将其分配给使用类中的位域声明的变量。该类的实例是使用 section (“。data.kinfo”)属性声明的,因此该类包含在elf文件的kinfo部分中。但是,使用arm-none-eabi-gcc 4.8构建的elf文件不包含kinfo部分中的那个vaule。

源代码:

extern word_t _kinfo_descriptor;
class kinfo_t
{
    public:
        word_t size : 16; 
        word_t info_desc : 16; 
};
kinfo_t kinfo __attribute__((__section__(".data.kinfo"))) = { 
    0x1, (word_t)&_kinfo_descriptor,
};

链接脚本:

.kinfo . : 
{   
    *(.data.kinfo)
} > ram 
_kinfo_descriptor = 0x8200;

kinfo部分:

Disassembly of section .kinfo:

f0021000 <kinfo>:
f0021000:   00000000

我在kinfo部分展示了'f0021000:82000001',但结果只是'00000000'。但是,当我使用1)常量值而不是extern _kinfo_descriptor变量或2)32位变量而不是16位位域时,在这两种情况下,该值被分配给kinfo段而没有任何问题。

例如,根据案例1,

源代码:

extern word_t _kinfo_descriptor;
class kinfo_t
{
    public:
        word_t size : 16; 
        word_t info_desc : 16; 
};
kinfo_t kinfo __attribute__((__section__(".data.kinfo"))) = { 
    0x1, 0x8200,
};

kinfo部分:

Disassembly of section .kinfo:

f0021000 <kinfo>:
f0021000:   82000001

根据案例2,

源代码:

extern word_t _kinfo_descriptor;
class kinfo_t
{
    public:
        word_t size;
        word_t info_desc;
};
kinfo_t kinfo __attribute__((__section__(".data.kinfo"))) = {
    0x1, (word_t)&_kinfo_descriptor,
};

kinfo sectoin:

Disassembly of section .kinfo:

f0021000 <kinfo>:
f0021000:   00000001
f0021004:   00008200

所以我想知道,是否不可能将链接脚本中声明的变量分配给使用16位bitfield声明的另一个变量?只有在我使用32位变量或常数值时才可以接受吗?正如我所提到的,当前我正在使用来自LINARO的arm-none-eabi-gcc 4.8。

提前致谢

0 个答案:

没有答案