1

我的链接器脚本有问题。.data2、.nonsharedram 和 .bss 部分具有错误的 LMA。它们应该放置在 FLASH 中,而是放置在 SHARED1 和 SHARED2 区域中。

链接器脚本:

MEMORY
{
  FLASH      : org =  0x100000, len = 1M
  NON_SHARED : org =     0x100, len = 0x4600
  STACK      : org =    0x4700, len = 0x900
  BOOTPROG   : org =    0x8080, len = 0x1D80
  SHARED1    : org =   0x10000, len = 0x3000
  SHARED2    : org =   0x18000, len = 0x4000
  LATCH      : org =   0x40000, len = 2
  DSPCODE    : org = 0x1030000, len = 0x4000
  EXTRAM     : org =  0x200000, len = 1M
}

SECTIONS
{
  .cstack 0x4700 (NOLOAD) : {
    __STACK_START = .;
    . = . + 0x800;
    _STACK_END = . -4;
  } >STACK
  .istack 0x4F00 (NOLOAD) : {
    __ISTACK_START = .;
    . = . + 0x100;
    _ISTACK_END = . -4;
  } >STACK
  .bootprog        0x8080 (NOLOAD) : { *(.bootprog); }      >BOOTPROG
  .bmcdataram     0x10000 (NOLOAD) : { *(.bmcdataram); }    >SHARED1
  .dspdataram     0x102C0 (NOLOAD) : { *(.dspdataram); }    >SHARED1
  .pwron_ctrl     0x12000 (NOLOAD) : { *(.pwron_ctrl); }    >SHARED1
  .dspstack       0x12F00 (NOLOAD) : { *(.dspstack); }      >SHARED1
  .dsp2dataram    0x18000 (NOLOAD) : { *(.dsp2dataram); }   >SHARED2
  .output_latch   0x40000 (NOLOAD) : { *(.output_latch); }  >LATCH
  .dspcoderam   0x1030000 (NOLOAD) : { *(.dspcoderam); }    >DSPCODE
  .promst 0x100000 : 
    {
      *(.promst)
    } >FLASH
  .version 0x100100 :
    { 
      *(.version) 
    } >FLASH
  .cstart 0x100200 : 
    { 
      *(.cstart) 
    } >FLASH
  .rodata ALIGN(0x2) : AT (ADDR (.cstart) + SIZEOF (.cstart))
      { *(.rodata*) ; 
    } >FLASH
  .text : AT (ADDR (.rodata) + SIZEOF (.rodata))
    { 
      *(.text); 
      *(.ctors); 
      *(.dtors); 
      *(.eh_frame); 
      *(.jcr); 
    } >FLASH
  .init ALIGN(0x2) : AT (ADDR (.text) + SIZEOF (.text))
    { 
      *(.init*) ; 
    } >FLASH
  .fini ALIGN(0x2) : AT (ADDR (.init) + SIZEOF (.init))
    { 
      *(.fini*) ; 
    } >FLASH
  .data 0x12004 : AT (ADDR (.fini) + SIZEOF (.fini))
    {
      _datas = . ;
      *(EXCLUDE_FILE (*lib_a-impure.o *lib_a-mallocr.o) .data); 
      _datae = . ;
    } >SHARED1
  .data2 0x19000 : AT (ADDR (.data) + SIZEOF (.data))
    { 
      _data2s = . ;
      *lib_a-impure.o(.data); 
      *lib_a-mallocr.o(.data);
      _data2e = . ;
    } >SHARED2
  .nonsharedram 0x100 : AT (ADDR (.data2) + SIZEOF (.data2))
    { 
      _nonsharedrams = . ;
      *(.nonsharedram);
      _nonsharedrame = . ;
    } >NON_SHARED
  .bss 0x200000 : AT (ADDR (.data2) + SIZEOF (.data2))
    { 
      _bsss = . ;
      *(.bss); 
      *(COMMON); 
      _bsse = . ;
    } >EXTRAM
}

来自 objdump:

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .cstack       00000800  00004700  00004700  000fbf70  2**0
                  CONTENTS
  1 .istack       00000100  00004f00  00004f00  000fc770  2**0
                  CONTENTS
  2 .bootprog     00001d7f  00008080  00008080  000001d4  2**1
                  ALLOC
  3 .bmcdataram   00000210  00010000  00010000  000001d4  2**0
                  ALLOC
  4 .dspdataram   00001d40  000102c0  000102c0  000001d4  2**1
                  ALLOC
  5 .pwron_ctrl   00000004  00012000  00012000  000001d4  2**2
                  ALLOC
  6 .dsp2dataram  00001000  00018000  00018000  000009a8  2**1
                  ALLOC
  7 .output_latch 00000002  00040000  00040000  00000aac  2**1
                  ALLOC
  8 .dspcoderam   00004000  01030000  01030000  000fbf70  2**1
                  ALLOC
  9 .promst       00000056  00100000  00100000  00000aac  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 10 .version      00000015  00100100  00100100  00000b02  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 11 .cstart       00000042  00100200  00100200  00000b18  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 12 .rodata       0009af26  00100242  00100242  00000b5a  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 13 .text         0005fb00  0019b168  0019b168  0009ba80  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 14 .init         0000000c  001fac68  001fac68  000fb580  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 15 .fini         00000008  001fac74  001fac74  000fb58c  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 16 .data         000009dc  00012004  001fac7c  000fb594  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 17 .data2        000007d4  00019000  000129e0  000001d4  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 18 .nonsharedram 00000104  00000100  000197d4  000009a8  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 19 .bss          0001e6f4  00200000  000197d4  00000aac  2**2
                  ALLOC
 20 .comment      0000004b  00000000  00000000  000fc870  2**0
                  CONTENTS, READONLY
 21 .debug_frame  00015a84  00000000  00000000  000fc8bc  2**2
                  CONTENTS, READONLY, DEBUGGING
 22 .debug_abbrev 00006fe7  00000000  00000000  00112340  2**0
                  CONTENTS, READONLY, DEBUGGING
 23 .debug_info   00025b72  00000000  00000000  00119327  2**0
                  CONTENTS, READONLY, DEBUGGING
 24 .debug_line   00008f7a  00000000  00000000  0013ee99  2**0
                  CONTENTS, READONLY, DEBUGGING
 25 .debug_loc    0001db0a  00000000  00000000  00147e13  2**0
                  CONTENTS, READONLY, DEBUGGING
 26 .debug_pubnames 00000e8c  00000000  00000000  0016591d  2**0
                  CONTENTS, READONLY, DEBUGGING
 27 .debug_pubtypes 00003612  00000000  00000000  001667a9  2**0
                  CONTENTS, READONLY, DEBUGGING
 28 .debug_aranges 000008c0  00000000  00000000  00169dbb  2**0
                  CONTENTS, READONLY, DEBUGGING
 29 .debug_str    0000297e  00000000  00000000  0016a67b  2**0
                  CONTENTS, READONLY, DEBUGGING
 30 .debug_ranges 00000648  00000000  00000000  0016cff9  2**0
                  CONTENTS, READONLY, DEBUGGING
4

1 回答 1

1

发现我应该使用:

AT (LOADADDR (.nonsharedram) + SIZEOF (.nonsharedram))

代替

AT (ADDR (.nonsharedram) + SIZEOF (.nonsharedram))
于 2013-08-28T19:23:45.110 回答