建立时的链接器符号算法计算出错误的结果

时间:2019-06-24 08:40:21

标签: gcc linker

我正在将GCC用于STM32微控制器应用程序,但遇到了一个奇怪的现象。我在闪存中有一个常量值表,其中包含来自链接器符号的地址。现在,我想添加另一个值,该值包含来自两个Linker符号的计算(在构建时),但似乎不起作用。

看起来像这样:

extern uint32_t _ls1;   // Linker symbol 1          
extern uint32_t _ls2;   // Linker symbol 2      
const volatile uint32_t table[4] =
{
    (uint32_t)(&_ls1),                    // 1. Correct value 
    (uint32_t)(&_ls2),                    // 2. Correct value 
    (uint32_t)(&_ls1) + 1,                // 3. Correct value 
    (uint32_t)(&_ls1) + (uint32_t)(&_ls2) // 4. Wrong value, always 0
}

表中的前三个值完全正确。
每当我在计算中放入两个(或多个)链接器符号时,结果均为0。不会给出错误或警告。

有任何想法吗?

1 个答案:

答案 0 :(得分:1)

您的链接描述文件中有问题。

我已经用自己的东西对其进行了测试(我现在正在使用STM32L476,gcc进行工作)

volatile const uint32_t test[] = {
        (uint32_t)&_edata,
        (uint32_t)&_sdata,
        (uint32_t)&_edata + 1,
        (uint32_t)&_edata + 2,
        (uint32_t)&_edata + (uint32_t)&_sdata,
};

(此表只能具有自动存储功能,否则将无法编译)

结果: enter image description here