This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5994:部分链接+静态变量+数据段:使用 Mitto Systems Limited - MSP430-gcc 9.3.1.11 进行无效重定位

Guru**** 2905440 points

Other Parts Discussed in Thread: MSP430FR5994

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1572565/msp430fr5994-partial-linking-static-variables-data-sections-invalid-relocations-with-mitto-systems-limited---msp430-gcc-9-3-1-11

器件型号:MSP430-GCC-OPENSOURCE
Thread 中讨论的其他器件:MSP430FR5994

工具/软件:

为简单起见、考虑以下代码片段、名为`x.c`:


#include <stdint.h>

static int src_local_a;
static int src_local_b;

int funct(int a,int b)
{
src_local_a = b + src_local_a;
src_local_b = src_local_b + 2*a;
return (3*src_local_a + src_local_b);
}

如果使用`m sp430-elf-gcc -Fdata-SECTIONS`进行编译、然后使用`m sp430-elf-ld -r|--relocatable`进行部分链接、则合并两个.bss 段 (.bss.src_local_a 和.bss.src_local_b ) 后的最终重定位会在输出对象中产生无效重定位:

根据`reí a adelf`á:

Relocation section '.rela.text' at offset 0x188 contains 4 entries:
Offset Info Type Sym.Value Sym. Name + Addend
00000002 0000020f R_MSP430X_ABS16 00000000 .bss + 0
00000006 0000020f R_MSP430X_ABS16 00000000 .bss + 0
0000000c 0000020f R_MSP430X_ABS16 00000000 .bss + 0
00000012 0000020f R_MSP430X_ABS16 00000000 .bss + 0

当然、程序/代码并没有执行应有的操作、因为 src_local_a 和 src_local_b 都被读取/写入到地址[0]加上 bss 偏移。 此外、编译后的目标/文本代码不包含加数 (+2):

00000000 <funct>:
   0:   1d 52 00 00     add     &0x0000,r13     ;0x0000
   4:   82 4d 00 00     mov     r13,    &0x0000 ;
   8:   5c 02           rlam    #1,     r12     ;
   a:   1e 42 00 00     mov     &0x0000,r14     ;0x0000
   e:   0e 5c           add     r12,    r14     ;
  10:   82 4e 00 00     mov     r14,    &0x0000 ;
  14:   0c 4d           mov     r13,    r12     ;
  16:   5c 02           rlam    #1,     r12     ;
  18:   0c 5d           add     r13,    r12     ;
  1a:   0c 5e           add     r14,    r12     ;
  1c:   10 01           reta                    ;

上述代码片段使用另一个 GCC 工具链(如 ARM)进行测试。 其中、重定位表不包含加数(如上所示)、但偏移量包含在目标/文本代码中。 这里不存在 Rela 条目的加数、编译后的对象/文本代码中也不存在加数。

如果省略了变量的“静态“声明或省略了-Fdata-sections、则可以重定位。 如果省略` tatic `s、则加数将按预期显示在 Rela 条目中:  

Relocation section '.rela.text' at offset 0x188 contains 4 entries:
 Offset     Info    Type            Sym.Value  Sym. Name + Addend
00000002  0000020f R_MSP430X_ABS16   00000000   .bss + 2
00000006  0000020f R_MSP430X_ABS16   00000000   .bss + 2
0000000c  0000020f R_MSP430X_ABS16   00000000   .bss + 0
00000012  0000020f R_MSP430X_ABS16   00000000   .bss + 0

或者、如果省略了-fdata-sections、则 Rela 条目会引用变量名称而不是合并的 bss 段+偏移量:  

Relocation section '.rela.text' at offset 0x188 contains 4 entries:
 Offset     Info    Type            Sym.Value  Sym. Name + Addend
00000002  0000070f R_MSP430X_ABS16   00000002   src_local_a + 0
00000006  0000070f R_MSP430X_ABS16   00000002   src_local_a + 0
0000000c  0000090f R_MSP430X_ABS16   00000000   src_local_b + 0
00000012  0000090f R_MSP430X_ABS16   00000000   src_local_b + 0

当然、该计划的工作原理也是一样的。 rodata 段也是如此(即具有额外的“const"声明“声明且声明且不写入变量)。 此外、-Fdata-sections + static 变量在直接链接到最终 elf 时提供良好的重定位、即跳过此部分链接阶段(当然,还有包含 main() 和其他必要部分的附加对象)。

GCC/LD 的完整命令行参数是:

msp430-elf-gcc -D__MSP430FR5994__ -mmcu=MSP430FR5994 -D__LARGE_DATA_MODEL__ -D__LARGE__ -mlarge -mcode-region=upper -Os -c x.c
msp430-elf-ld -r -T ./test.ld --gc-sections --entry funct -o x-partial.o x.o

链接器脚本 (./test.ld) 为:

ENTRY(init)

SECTIONS
{

 .text :
  {     *(.upper.text.* .upper.text .lower.text.* .lower.text .text.* .text)
  }


 .bss :
  {     *(.bss.* .upper.bss.* .lower.bss.* .upper.bss .lower.bss .bss)
  }

 .rodata :
  {     *(.rodata.* .upper.rodata.* .lower.rodata.* .upper.rodata .lower.rodata .rodata)
  }

 .data :
  {     *(.data.* .upper.data.* .lower.data.* .upper.data .lower.data .data)
  }

}

由于它是 TI 网页上发布的最新 MSP430-elf-gcc 工具链、因此问题是:如何报告此问题以及如何解决此问题? 可以看到、从 ELF 文件的分析中可以看出错误的行为、但当然、如果需要、可以在实际硬件上复制错误的行为(如在 MSP430FR5994 Launchpad 上)。 如果需要、我可以提供完整的示例。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于 ld 选项-r 会进行部分链接并且您需要完成作业、因此这似乎不是一个问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、这是部分链接。 南 如果我这样做:

    x.c => x.o => x-partive.o => x-partive.o + main.o -> main.elf => main.hex =>硬件

     我使用上述组合(bss 上的静态变量并且*。c =>*。o 编译是通过-Fdata-sections 完成的)、则 main.hex 不能正常工作、因为所有变量都位于.bss +零偏移量。  

    如果我在全局变量或-Fdata-sections 之前关闭` tatic `s声明、则以上方法可行。 当然、

    x.c => x.o => x.o + main.o -> main.elf => main.hex =>硬件

    也可在 x.o 和-Fdata-sections 中很好地与静态全局变量配合使用。  这里的问题是重定位加数信息仅在 x-partive.o 中丢失(请参阅上文)。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何报告此问题以及如何解决此问题?

    GCC 有自己的错误报告系统。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,只是问因为它是 GCC-9 和 GCC 错误报告页面说,我应该尝试最新的分支报告(即 GCC-14 或 15 现在). 而且、当我在此处下载此软件包时、可能还有另一个特定的补丁... 不知道。  

    `m /获取从最新稳定的 GCC 分支构建的` sp430-elf-gcc 吗?

    此外、如果有 需要报告的内容、下载页面 (www.ti.com/.../MSP430-GCC-OPENSOURCE 会直接指向此论坛... 这就是为什么我在这里报告了这个问题:)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以为任何目标构建 GCC。 (有很多)我很久没有尝试过。

    将“-j"选项“选项与 make 一同使用以加快构建过程。 请务必先阅读该选项的手册页。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    即使使用 msp430-elf-gcc 15.2(即最新的稳定错误)、该错误似乎也存在。 一种兔子洞,但在这种情况下,它确实可以直接报告给 GCC。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     可重现性最低的示例: https://szofi.net/apal/tmp/gcc/partial_linker_bug.tgz。 脚本创建的 8 个*。disasm 文件应相同(与 ARM 和 RISC-V 相同)、但第 8 个文件(编号#7、main7.disasm)存在差异、且 disasm 之间的差异清楚地表明问题可追溯到部分链接对象中不正确的 RELA 条目。 TI MSP430-GCC 和最新 (15.2) GCC 也相同。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     LD 是 binutils 的一部分、因此您应该真正参考该版本、而不是 GCC。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    啊、是的。 2.34(TI MSP430-GCC 库存)和 2.45(最新版本)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    报告地址: sourceware.org/.../show_bug.cgi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    转发给编译器团队以查看任何注释。

    B.R.

    Sal