V850, linker script problem

Torsten Mohr tmohr@s.netic.de
Wed May 3 19:17:00 GMT 2006


Hi,

thank you all for the hints so far, but until now i still
have the problem with the linker script.

I tried to cut down the project as much as possible to only
reflect the strange behaviour and not much more.

In the linker script v850.x i put .data to ROM to copy it into
RAM at startup.  This results in the mapfile:

From linker Script:
  .data :
  {
    *(.data)
    *(.data.*)
    *(.gnu.linkonce.d*)
    CONSTRUCTORS
  } > ram AT > rom


From map file:

.data           0x03ffe000        0x0 load address 0x00000678
 *(.data)
 *(.data.*)
 *(.gnu.linkonce.d*)

I expected the same for .tdata and even more for .sdata as this
one has only one entry, but i get:


From linker script:
  .tdata ALIGN(4) :
  {
	*(.tbyte)
	*(.tcommon_byte)
	*(.tdata)
	*(.tbss)
	*(.tcommon)
  } >ram AT>rom

  __ep = ADDR(.tdata);


  .sdata ALIGN (4) :
  {
	*(.sdata)
  } >ram AT > rom
  __gp = ADDR(.sdata) + 0x8000;


From map file:

.tdata          0x00000678        0x0 load address 0x00000678
 *(.tbyte)
 *(.tcommon_byte)
 *(.tdata)
 *(.tbss)
 *(.tcommon)
                0x00000678                __ep = ADDR (.tdata)

.sdata          0x00000678        0x0 load address 0x00000678
 *(.sdata)
                0x00008678                __gp = (ADDR (.sdata) + 0x8000)

At linking i get:
v850e-unknown-elf-ld -o hw2.elf \
        -Map=hw2.map \
        -Tv850.x \
        -nostdlib \
        main.o vectors.o
v850e-unknown-elf-ld: address 0x678 of hw2.elf \
section .tdata is not within region ram

v850e-unknown-elf-ld: address 0x678 of hw2.elf \
section .sdata is not within region ram


I don't know why the address of .tdata and .sdata is set to its
_load_ address and not to an address in RAM.  For .data it
worked as expected.

Of course i can send the sources, the ELF file and any other
data that are needed to this list.

For reference i attach the linker script and the two short source
files to the end of this mail.


Best regards,
Torsten.

v850.x
OUTPUT_FORMAT("elf32-v850", "elf32-v850", "elf32-v850")
OUTPUT_ARCH(v850)
ENTRY(_start)
SEARCH_DIR(.);
EXTERN(__ctbp __ep __gp);

MEMORY
{
  vect(rx)  : org = 0x00000000, len = 0x640
  rom(rx)   : org = 0x00000640, len = 512k
  ram(rwx)  : org = 0x03ffe000, len = 15k
  stack(rw) : org = 0x03fffc00, len = 1k
}

SECTIONS
{
  .vect :
  {
    *(.vect)
  } >vect

  .zdata :
  {
	*(.zdata)
	*(.zbss)
	*(reszdata)
	*(.zcommon)
  } >ram

  .rozdata ALIGN (4) :
  {
	*(.rozdata)
	*(romzdata)
	*(romzbss)
  } >rom


  .text :
  {
    *(.text)
    *(.text.*)
    *(.gnu.warning)
    *(.gnu.linkonce.t*)
  } > rom
  _etext = .;
  PROVIDE (etext = .);

  .call_table_data ALIGN (4) :
  {
    *(.call_table_data)
  } > rom = 0xff
  __ctbp = ADDR(.call_table_data);

  .call_table_text :
  {
    *(.call_table_text)
  } > rom

  .data :
  {
    *(.data)
    *(.data.*)
    *(.gnu.linkonce.d*)
    CONSTRUCTORS
  } > ram AT > rom
  .data1	: { *(.data1) } > rom

  .gcc_except_table : { *(.gcc_except_table) } >rom
  .got		: { *(.got.plt) *(.got) } >rom

  .dynamic	: {
    *(.dynamic)
    . = ALIGN(2);
    PROVIDE(__romdatastart = .); /* IF_ROCOPY */
  } >rom


  .tdata ALIGN(4) :
  {
	*(.tbyte)
	*(.tcommon_byte)
	*(.tdata)
	*(.tbss)
	*(.tcommon)
  } > ram AT > rom

  __ep = ADDR(.tdata);


  .sdata ALIGN (4) :
  {
	*(.sdata)
  } > ram AT > rom
  __gp = ADDR(.sdata) + 0x8000;

  .rosdata ALIGN (4) :
  {
	*(.rosdata)
  } >rom

  .sbss :
  {
	__sbss_start = .;
	*(.sbss)
	*(.scommon)
  } >ram
  _edata  = DEFINED (__sbss_start) ? __sbss_start : . ;
  PROVIDE (edata = _edata);
  .bss       :
  {
	__bss_start = DEFINED (__sbss_start) ? __sbss_start : . ;
	__real_bss_start = . ;
	*(.dynbss)
	*(.bss)
	*(COMMON)
  } >ram
  _end = . ;
  PROVIDE (end = .);

  .comment 0		: { *(.comment) }

  .stack :
  {
	__stack = .;
	*(.stack)
  } >stack
}



vectors.S:
.global _start
.global _main
        
        .section .vect,"ax",@progbits

.offset 0x00
        jr      _start



_start:
        jr      _main



main.c:
int main(int argc, char** argv) {
  volatile int i;
  volatile unsigned char p;


  while(1) {
    p++;
    for(i = 0; i < 1000; i++);
  }

  return 0;
}



More information about the Binutils mailing list