powerpc-unknown-eabi rom relocation

Doug Evans devans@cygnus.com
Thu Sep 3 15:39:00 GMT 1998


   Date: Wed, 2 Sep 1998 20:51:00 -0700 (PDT)
   From: Vaughan Hillman <hillman_97@yahoo.com>

   Ive got a cross compiler for the powerpc-eabi 
   hosted on under sunos.  I am trying to build
   a rom image that when loaded to the bootprom will move its data
   sections to ram.  I have compiled all source files with
   -mrelocatable-lib (not sure if this flag directly relates to what Im
   trying to accomplish).  For testing purposes I have been trying to
   relocate the .sdata section by using the following line in my linker
   file.

   .sdata 0x10000 : AT (0x50000) { *(*.sdata) }

   My understanding of what this line means is the following.  .sdata
   will be put at address 0x10000 in 
   the rom image but all references to this area (by code) will point to
   address offset 0x50000.  My code would then be responsible for copying
   this data from rom address to 0x10000 out to ram address 0x50000.

You've got it backwards.  0x50000 is the "load address".

   I have sifted through all the documentation for the linker file and
   gcc options at the Cygnus site and still seem to be stuck.

Did you read this snippet from ld.info [appended at the end]

   Is the -mrelocatable-lib flag supposed to be helping
   me with relocating this section?

I'm not a powerpc person so I can't help you there.

-- snip --
`AT ( LDADR )'
     The expression LDADR that follows the `AT' keyword specifies the
     load address of the section.  The default (if you do not use the
     `AT' keyword) is to make the load address the same as the
     relocation address.  This feature is designed to make it easy to
     build a ROM image.  For example, this `SECTIONS' definition
     creates two output sections: one called `.text', which starts at
     `0x1000', and one called `.mdata', which is loaded at the end of
     the `.text' section even though its relocation address is
     `0x2000'.  The symbol `_data' is defined with the value `0x2000':

          SECTIONS
            {
            .text 0x1000 : { *(.text) _etext = . ; }
            .mdata 0x2000 :
              AT ( ADDR(.text) + SIZEOF ( .text ) )
              { _data = . ; *(.data); _edata = . ;  }
            .bss 0x3000 :
              { _bstart = . ;  *(.bss) *(COMMON) ; _bend = . ;}
          }

     The run-time initialization code (for C programs, usually `crt0')
     for use with a ROM generated this way has to include something like
     the following, to copy the initialized data from the ROM image to
     its runtime address:

          char *src = _etext;
          char *dst = _data;
          
          /* ROM has data at end of text; copy it. */
          while (dst < _edata) {
            *dst++ = *src++;
          }
          
          /* Zero bss */
          for (dst = _bstart; dst< _bend; dst++)
            *dst = 0;



More information about the crossgcc mailing list