链接器:将除两个以外的所有功能移动到特定的内存区域

问题描述 投票:4回答:1

我正在为PIC32MX微控制器开发固件。程序存储器应分为三部分:

  • 第1节:中断服务程序和主要功能(startup_region
  • 第2节:剩余程序存储器的50%(program1
  • 第3节:剩余程序存储器的50%(program2

固件仅存储在第2节或第3节中。另一个保留用于将来的更新。这样,活动区域可以安全地覆盖另一个区域以存储更新。配置位被翻转,第0部分的main()函数现在在重新启动时跳至另一个程序。

因此,我需要链接器将除isrmain之外的所有功能放入第1节中,并将所有其他内容放入第2节中。第3节必须完全留空,因为将来可能会被覆盖。

我已经尝试通过修改默认的链接程序脚本来实现,但是我没有成功。

linkerscript.ld:

/* [...] */
INCLUDE procdefs.gld
/* [...] */
SECTIONS
{
  /* [...] */
  .text :
  {
    /* isr() and main() should be at the very first locations in program memory */
    *(.text.isr)
    *(.text.main)
    /* [...] */
    . = ALIGN(4) ;
  } >kseg0_program_mem

  .program1 :
  {
    *(*.text)
  } >program1

  /* [...] */
}

procdefs.gld:

/* [...] */
MEMORY
{
  kseg0_program_mem     (rx)  : ORIGIN = 0x9D000000, LENGTH = 0x10000
  startup_region        (rx)  : ORIGIN = 0x9D000000, LENGTH = 0x01000
  program1              (rx)  : ORIGIN = 0x9D002000, LENGTH = 0x07000
  program2              (rx)  : ORIGIN = 0x9D009000, LENGTH = 0x07000
  kseg0_boot_mem              : ORIGIN = 0x9FC00490, LENGTH = 0x970
  /* [...] */
}
/* [...] */

这将导致以下结果:

[isr()main()是应该在的位置(0x9D00000是程序闪存开始处的KSEG0虚拟地址]

.text           0x9d000000       0x94
 *(.text.isr)
 .text.isr      0x9d000000       0x60 build/default/production/main.o
                0x9d000000                isr
 *(.text.main)
 .text.main     0x9d000060       0x34 build/default/production/main.o
                0x9d000060                main

program1区域已正确放置,并且大多数目标文件均已正确列出(但是请注意,main.o再次列出-它已被使用。]]

.program1       0x9d002000      0xc44
 *(*.text)
 .text          0x9d002000        0x0 /opt/microchip/xc32/v2.10/bin/bin/../../lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib/./proc/32MX330F064H/crt0_mips32r2.o
 .text          0x9d002000        0x0 /opt/microchip/xc32/v2.10/bin/bin/../../lib/gcc/pic32mx/4.8.3/../../../../pic32mx/lib/debug-exception-return.o
 .text          0x9d002000        0x0 build/default/production/main.o
 .text          0x9d002000        0x0 build/default/production/commands.o
 /* [...] */
 .text          0x9d002000        0x0 build/default/production/micro-ecc/uECC.o

但是,某些功能位于该区域之外:

.text.uECC_verify
                0x9d000b04      0x7c0
 .text.uECC_verify
                0x9d000b04      0x7c0 build/default/production/micro-ecc/uECC.o
                0x9d000b04                uECC_verify

.text.vli_mmod_fast_secp256r1
                0x9d0012c4      0x520
 .text.vli_mmod_fast_secp256r1
                0x9d0012c4      0x520 build/default/production/micro-ecc/uECC.o

我不明白为什么会这样。

我的问题是:

  • 如何强制链接程序将所有功能(mainisr除外)放入program1
  • 如何禁止链接程序将任何内容放入program2,使其保持空闲状态。
  • 我正在使用-ffunction-segments开关编译软件,以便每个功能都有其自己的段。

原始链接描述文件还包含此可疑外观:

/* Code Sections - Note that input sections *(.text) and *(.text.*)
   are not mapped here. Starting in C32 v2.00, the best-fit allocator
   locates them, so that .text may flow around absolute sections
   as needed.
*/

我正在为PIC32MX微控制器开发固件。程序存储器应分为三部分:第1节:中断服务程序和主函数(startup_region)第2节:50%...

c linker binutils linker-scripts
1个回答
0
投票

目标文件main.o与函数的内存段.tex.main不同。如果此目标文件产生其他一些文本段,它们将被放置在其他位置。这就是您在地图文件中看到的内容。

© www.soinside.com 2019 - 2024. All rights reserved.