Gcc 链接器符号算法在生成时计算错误的结果

Gcc 链接器符号算法在生成时计算错误的结果,gcc,linker,Gcc,Linker,我在使用GCC开发STM32微控制器应用程序时,遇到了一个奇怪的现象。我在flash中有一个包含链接器符号地址的常量值表。现在我想添加另一个值,该值包含在构建时从两个链接器符号进行的计算,但它似乎不起作用。 看起来是这样的: extern uint32_t _ls1; // Linker symbol 1 extern uint32_t _ls2; // Linker symbol 2 const volatile uint32_t table[4] =

我在使用GCC开发STM32微控制器应用程序时,遇到了一个奇怪的现象。我在flash中有一个包含链接器符号地址的常量值表。现在我想添加另一个值,该值包含在构建时从两个链接器符号进行的计算,但它似乎不起作用。 看起来是这样的:

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。没有给出错误或警告。
有什么想法吗

您的链接器脚本有问题

我已经用我的东西测试过了,我现在用的是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,
};
此表只能自动存储,否则将无法编译

结果是:

uint32\U t和\U ls1+uint32\U t和\U ls2是否溢出?&_ls1和&_ls2表达式的值是什么?没有给出错误或警告。-您是否使用-Wall-Wextra进行编译?两个链接器符号-您能否提示如何从链接器导出这些变量?您是否尝试使用uint64\t或无符号长类型进行计算?如何检查结果值是否正确?您能否创建一个最小的可复制示例?包括整个链接器、主函数、includes、编译器等?>uint32\u t&\u ls1+uint32\u t&\u ls2是否溢出?没关系,我尝试什么样的计算加、减、异或等等,结果总是0。谢谢。我检查了您的示例,但它在我的系统上不起作用。结果再次为零。一定有什么地方出了问题……正如我所写的,这个例子来自真实的项目。一切正常。